From c38449b4088d62510508a019e092f7c902643e5d Mon Sep 17 00:00:00 2001 From: cvs2git <> Date: Mon, 4 Mar 2002 21:20:50 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'sbbs310g'. --- CVSROOT/checkoutlist | 13 - CVSROOT/commitinfo | 15 - CVSROOT/config | 11 - CVSROOT/cvswrappers | 23 - CVSROOT/editinfo | 21 - CVSROOT/loginfo | 26 - CVSROOT/modules | 26 - CVSROOT/notify | 12 - CVSROOT/rcsinfo | 13 - CVSROOT/taginfo | 20 - CVSROOT/verifymsg | 21 - ctrl/1414vqe.mdm | 9 - ctrl/1428vqe.mdm | 6 - ctrl/ace9600.mdm | 6 - ctrl/ati14400.mdm | 5 - ctrl/ati19200.mdm | 5 - ctrl/ati9600.mdm | 9 - ctrl/att14400.mdm | 8 - ctrl/attr.cfg | 17 - ctrl/chat.cnf | Bin 13098 -> 0 bytes ctrl/dsiscout.mdm | 9 - ctrl/file.cnf | Bin 11613 -> 0 bytes ctrl/gen1200.mdm | 12 - ctrl/gen14400.mdm | 6 - ctrl/gen2400.mdm | 5 - ctrl/gen28800.mdm | 5 - ctrl/gen9600.mdm | 7 - ctrl/guru.dat | 921 --- ctrl/gvc14400.mdm | 8 - ctrl/gvc9600.mdm | 8 - ctrl/hay14400.mdm | 6 - ctrl/hay24e.mdm | 8 - ctrl/hay28800.mdm | 5 - ctrl/int14400.mdm | 9 - ctrl/main.cnf | Bin 6633 -> 0 bytes ctrl/mcc14400.mdm | 8 - ctrl/mdms.ixt | 110 - ctrl/mic2400.mdm | 8 - ctrl/mic28800.mdm | 8 - ctrl/mic4232.mdm | 5 - ctrl/micv32c.mdm | 8 - ctrl/msgs.cnf | Bin 18757 -> 0 bytes ctrl/mt1432.mdm | 8 - ctrl/mt2834.mdm | 8 - ctrl/pp14400.mdm | 8 - ctrl/pp28800.mdm | 5 - ctrl/sbbsecho.cfg | 45 - ctrl/services.cfg | 4 - ctrl/sup14400.mdm | 6 - ctrl/sup28800.mdm | 6 - ctrl/text.dat | 868 --- ctrl/usr144.mdm | 6 - ctrl/usr144ds.mdm | 5 - ctrl/usr168.mdm | 4 - ctrl/usr168ds.mdm | 5 - ctrl/usr216ds.mdm | 5 - ctrl/usr288ds.mdm | 7 - ctrl/usr96.mdm | 8 - ctrl/usr96ds.mdm | 6 - ctrl/ven14400.mdm | 5 - ctrl/viv14400.mdm | 6 - ctrl/viv9624e.mdm | 7 - ctrl/viv9642e.mdm | 8 - ctrl/xtrn.cnf | Bin 7912 -> 0 bytes ctrl/zoom9600.mdm | 8 - ctrl/zyx1496.mdm | 10 - ctrl/zyx1496f.mdm | 6 - docs/_borders/bottom.htm | 44 - docs/_borders/top.htm | 17 - docs/adding_nodes.html | 419 -- docs/amail.cfg | 36 - docs/appendix.html | 501 -- docs/baja.html | 3659 ----------- docs/baja2new.txt | 332 - docs/chat_section.html | 164 - docs/contents.txt | 36 - docs/customization.html | 1057 --- docs/default.htm | 8 - docs/exebbs.bat | 30 - docs/external_programs.html | 568 -- docs/features.html | 313 - docs/file_section.html | 953 --- docs/files.ref | 201 - docs/glossary.html | 397 -- docs/gpl.txt | 340 - docs/htdocs_contrib.txt | 112 - docs/images/baja_example.gif | Bin 2968 -> 0 bytes docs/images/bre.gif | Bin 19766 -> 0 bytes docs/images/lordcfg.gif | Bin 13811 -> 0 bytes docs/images/sbbsctrl.gif | Bin 42138 -> 0 bytes docs/images/sbbsctrl_configure.gif | Bin 15706 -> 0 bytes docs/images/sbbsctrl_telnet_cfg_gen.gif | Bin 8373 -> 0 bytes docs/images/sbbsecho_additionalecho.gif | Bin 18889 -> 0 bytes docs/images/sbbsecho_additionalecho_list.gif | Bin 21013 -> 0 bytes .../sbbsecho_additionalecho_list_tag.gif | Bin 21740 -> 0 bytes docs/images/sbbsecho_archiveprgs.gif | Bin 19450 -> 0 bytes docs/images/sbbsecho_archiveprgs_zip.gif | Bin 20990 -> 0 bytes docs/images/sbbsecho_logoptions.gif | Bin 23649 -> 0 bytes docs/images/sbbsecho_main.gif | Bin 20695 -> 0 bytes docs/images/sbbsecho_node_arctype.gif | Bin 22179 -> 0 bytes docs/images/sbbsecho_node_packettype.gif | Bin 21622 -> 0 bytes docs/images/sbbsecho_node_settings.gif | Bin 21517 -> 0 bytes docs/images/sbbsecho_nodes.gif | Bin 18837 -> 0 bytes docs/images/sbbsecho_paths.gif | Bin 21546 -> 0 bytes docs/images/sbbsecho_toggleoptions.gif | Bin 22498 -> 0 bytes docs/images/scfg_chat_channel1.gif | Bin 16798 -> 0 bytes docs/images/scfg_chat_features.gif | Bin 13480 -> 0 bytes docs/images/scfg_chat_gurus.gif | Bin 15878 -> 0 bytes docs/images/scfg_chat_pager1.gif | Bin 17072 -> 0 bytes docs/images/scfg_chat_pagers.gif | Bin 16441 -> 0 bytes docs/images/scfg_chat_theguru.gif | Bin 16618 -> 0 bytes docs/images/scfg_dos_startup.gif | Bin 2393 -> 0 bytes docs/images/scfg_main.gif | Bin 14925 -> 0 bytes docs/images/scfg_modem_config.gif | Bin 20932 -> 0 bytes docs/images/scfg_modem_fax_code1.gif | Bin 22581 -> 0 bytes docs/images/scfg_modem_fax_code2.gif | Bin 22603 -> 0 bytes docs/images/scfg_modem_port_type.gif | Bin 20853 -> 0 bytes docs/images/scfg_modem_resultcode_15.gif | Bin 22669 -> 0 bytes docs/images/scfg_modem_resultcodes.gif | Bin 23594 -> 0 bytes docs/images/scfg_modem_strings.gif | Bin 20604 -> 0 bytes docs/images/scfg_modem_toggles.gif | Bin 20983 -> 0 bytes docs/images/scfg_msg_area_advopts.gif | Bin 18176 -> 0 bytes docs/images/scfg_msg_area_netopts.gif | Bin 18896 -> 0 bytes docs/images/scfg_msg_area_toggles.gif | Bin 22080 -> 0 bytes docs/images/scfg_msg_areas.gif | Bin 15314 -> 0 bytes docs/images/scfg_msg_areas_gen.gif | Bin 17522 -> 0 bytes docs/images/scfg_msg_attrcodes.gif | Bin 19853 -> 0 bytes docs/images/scfg_msg_options.gif | Bin 17004 -> 0 bytes docs/images/scfg_networks.gif | Bin 13354 -> 0 bytes docs/images/scfg_networks_fido.gif | Bin 18676 -> 0 bytes docs/images/scfg_networks_fido_address.gif | Bin 20651 -> 0 bytes docs/images/scfg_networks_internet.gif | Bin 16268 -> 0 bytes docs/images/scfg_networks_post.gif | Bin 15610 -> 0 bytes docs/images/scfg_networks_post_hubs.gif | Bin 16476 -> 0 bytes docs/images/scfg_networks_post_hubs_sccm.gif | Bin 18471 -> 0 bytes docs/images/scfg_networks_qwkhubs.gif | Bin 16265 -> 0 bytes docs/images/scfg_networks_qwkhubs_vert.gif | Bin 19050 -> 0 bytes .../scfg_networks_qwkhubs_vert_subs.gif | Bin 21580 -> 0 bytes .../scfg_networks_qwkhubs_vert_subs_opt.gif | Bin 20327 -> 0 bytes docs/images/scfg_node1.gif | Bin 22095 -> 0 bytes docs/images/scfg_node1_advanced.gif | Bin 22902 -> 0 bytes docs/images/scfg_node1_toggles.gif | Bin 27710 -> 0 bytes docs/images/scfg_system.gif | Bin 16277 -> 0 bytes docs/images/scfg_system_advanced.gif | Bin 20568 -> 0 bytes docs/images/scfg_system_expired.gif | Bin 19122 -> 0 bytes docs/images/scfg_system_loadablemods.gif | Bin 18790 -> 0 bytes docs/images/scfg_system_newvalues.gif | Bin 18909 -> 0 bytes .../scfg_system_newvalues_questions.gif | Bin 22677 -> 0 bytes docs/images/scfg_system_newvalues_toggles.gif | Bin 22276 -> 0 bytes docs/images/scfg_system_quickval.gif | Bin 19960 -> 0 bytes docs/images/scfg_system_quickval_0.gif | Bin 20938 -> 0 bytes docs/images/scfg_system_securityvalues.gif | Bin 20558 -> 0 bytes docs/images/scfg_system_securityvalues_0.gif | Bin 21390 -> 0 bytes docs/images/scfg_system_toggle.gif | Bin 22004 -> 0 bytes docs/images/scfg_xfer_compressable.gif | Bin 17293 -> 0 bytes docs/images/scfg_xfer_dir.gif | Bin 17884 -> 0 bytes docs/images/scfg_xfer_dir_advanced.gif | Bin 18488 -> 0 bytes docs/images/scfg_xfer_dir_toggles.gif | Bin 22625 -> 0 bytes docs/images/scfg_xfer_event.gif | Bin 17446 -> 0 bytes docs/images/scfg_xfer_eventc.gif | Bin 19050 -> 0 bytes docs/images/scfg_xfer_extractable.gif | Bin 17607 -> 0 bytes docs/images/scfg_xfer_library.gif | Bin 15348 -> 0 bytes docs/images/scfg_xfer_options.gif | Bin 16516 -> 0 bytes docs/images/scfg_xfer_proto_dsz.gif | Bin 18021 -> 0 bytes docs/images/scfg_xfer_proto_dsz_g.gif | Bin 20568 -> 0 bytes docs/images/scfg_xfer_proto_dsz_h.gif | Bin 19769 -> 0 bytes docs/images/scfg_xfer_proto_dsz_x.gif | Bin 20246 -> 0 bytes docs/images/scfg_xfer_proto_dsz_y.gif | Bin 20716 -> 0 bytes docs/images/scfg_xfer_proto_dsz_z.gif | Bin 20646 -> 0 bytes docs/images/scfg_xfer_proto_fdsz.gif | Bin 17301 -> 0 bytes docs/images/scfg_xfer_proto_fdsz_g.gif | Bin 20627 -> 0 bytes docs/images/scfg_xfer_proto_fdsz_x.gif | Bin 20293 -> 0 bytes docs/images/scfg_xfer_proto_fdsz_y.gif | Bin 20612 -> 0 bytes docs/images/scfg_xfer_proto_fdsz_z.gif | Bin 20627 -> 0 bytes docs/images/scfg_xfer_testable.gif | Bin 17503 -> 0 bytes docs/images/scfg_xfer_testable_du.gif | Bin 18580 -> 0 bytes docs/images/scfg_xfer_testable_zip.gif | Bin 19211 -> 0 bytes docs/images/scfg_xfer_testable_zipc.gif | Bin 19185 -> 0 bytes docs/images/scfg_xfer_viewable.gif | Bin 17007 -> 0 bytes docs/images/scfg_xtrn_fixed.gif | Bin 15932 -> 0 bytes docs/images/scfg_xtrn_lord.gif | Bin 19231 -> 0 bytes docs/images/scfg_xtrn_sbl.gif | Bin 19441 -> 0 bytes docs/images/scfg_xtrn_section.gif | Bin 13721 -> 0 bytes docs/images/scfg_xtrn_swaplist.gif | Bin 17211 -> 0 bytes docs/images/scfg_xtrn_syncedit.gif | Bin 19501 -> 0 bytes docs/images/scfg_xtrn_timed.gif | Bin 19095 -> 0 bytes docs/images/scfg_xtrn_timeopt.gif | Bin 19898 -> 0 bytes docs/images/scfg_xtrn_tw2002.gif | Bin 19910 -> 0 bytes docs/images/scfg_xtrn_usurper.gif | Bin 19642 -> 0 bytes docs/images/scfg_xtrn_winos2list.gif | Bin 15395 -> 0 bytes docs/images/setuptype.gif | Bin 29268 -> 0 bytes docs/images/synclogo_fancyred.gif | Bin 15560 -> 0 bytes docs/images/tw2002.gif | Bin 12023 -> 0 bytes docs/images/uedit_v3.gif | Bin 21347 -> 0 bytes docs/images/uedit_v3_exe.gif | Bin 17609 -> 0 bytes docs/images/v3icon3.gif | Bin 270 -> 0 bytes docs/index.htm | 134 - docs/index.html | 8 - docs/install.html | 206 - docs/install.iwz | 288 - docs/install.txt | 97 - docs/mailer.bat | 136 - docs/message_section.html | 718 --- docs/modem_setup.html | 493 -- docs/multnode_config.html | 467 -- docs/networking.html | 753 --- docs/ntreadme.txt | 47 - docs/platforms.html | 31 - docs/qemm.txt | 168 - docs/sbbs.hst | 1318 ---- docs/sbbsecho.html | 633 -- docs/security.html | 568 -- docs/smb.html | 2946 --------- docs/svdmansi.txt | 24 - docs/syedtfaq.txt | 159 - docs/syncedit.txt | 538 -- docs/sysop.html | 287 - docs/sysop_commands.html | 476 -- docs/system_config.html | 524 -- docs/text210a.dif | 191 - docs/text220a.dif | 167 - docs/text220b.dif | 22 - docs/text230a.dif | 106 - docs/textfile_section.html | 115 - docs/troubleshooting.html | 246 - docs/upgrade.txt | 128 - docs/user.html | 1363 ---- docs/user_editor.html | 546 -- docs/usercom.txt | 17 - docs/utility_reference.html | 1249 ---- docs/v200_new.txt | 174 - docs/v210_new.txt | 173 - docs/v211_new.txt | 130 - docs/v220_new.txt | 162 - docs/versions.hst | 30 - docs/versions.txt | 41 - exec/Makefile.bor | 38 - exec/Makefile.gnu | 38 - exec/bullseye.src | 78 - exec/chat_sec.src | 92 - exec/cntnodes.src | 56 - exec/default.src | 922 --- exec/dir.src | 110 - exec/dir_attr.inc | 18 - exec/dumpobjs.js | 100 - exec/errno.inc | 65 - exec/examples/dir.js | 25 - exec/examples/socktest.js | 46 - exec/file_io.inc | 32 - exec/file_io.src | 182 - exec/finger.js | 23 - exec/fingerservice.js | 254 - exec/ftp-html.js | 429 -- exec/ftp.src | 311 - exec/gopherservice.js | 222 - exec/load/nodedefs.js | 146 - exec/load/sbbsdefs.js | 517 -- exec/load/sockdefs.js | 127 - exec/login.src | 90 - exec/logon.src | 154 - exec/major.src | 349 - exec/matrix.src | 172 - exec/mudgate.src | 13 - exec/nntpservice.js | 441 -- exec/nodedefs.inc | 86 - exec/nodelist-html.js | 154 - exec/nodelist.js | 16 - exec/noyesbar.src | 58 - exec/pcboard.src | 373 -- exec/pnet.bat | 3 - exec/qnet-ftp.src | 177 - exec/qnet.bat | 3 - exec/qnet.slt | 29 - exec/qnet.src | 481 -- exec/ra_emu.src | 11 - exec/renegade.src | 872 --- exec/rlogin.src | 15 - exec/sbbsdefs.inc | 361 -- exec/sbbshelp.dab | 170 - exec/sbbsimsg.js | 316 - exec/sbbsqnet.rs | 36 - exec/sbbsqnet.scr | 91 - exec/sbbsqnet.slt | 138 - exec/sdos.src | 684 -- exec/sendmsg.js | 60 - exec/simple.src | 380 -- exec/socktest.src | 63 - exec/sound.js | 7 - exec/str_cmds.src | 453 -- exec/telgate.src | 13 - exec/textdat.js | 9 - exec/tone/battle.ton | 32 - exec/tone/bouree.ton | 21 - exec/tone/buffgals.ton | 22 - exec/tone/camptown.ton | 22 - exec/tone/clown.ton | 33 - exec/tone/ent.ton | 299 - exec/tone/example.ton | 539 -- exec/tone/funeral.ton | 14 - exec/tone/furelise.ton | 20 - exec/tone/goodnite.ton | 22 - exec/tone/hatdance.ton | 17 - exec/tone/humor.ton | 18 - exec/tone/jeanie.ton | 14 - exec/tone/la_cuca.ton | 21 - exec/tone/maplerag.ton | 24 - exec/tone/march.ton | 21 - exec/tone/mary.ton | 57 - exec/tone/mountai.ton | 14 - exec/tone/sakura.ton | 17 - exec/tone/sleeping.ton | 42 - exec/tone/susanna.ton | 18 - exec/tone/swinglow.ton | 17 - exec/tone/symph_40.ton | 23 - exec/tone/tdc.ton | 190 - exec/tone/trapeze.ton | 21 - exec/tone/weasel.ton | 17 - exec/tone/yankee.ton | 15 - exec/type.src | 7 - exec/typehtml.src | 469 -- exec/unixgate.src | 15 - exec/userdefs.inc | 160 - exec/userlist.js | 18 - exec/wildcat.src | 645 -- exec/wiplogin.src | 126 - exec/wipshell.src | 378 -- exec/yesnobar.src | 58 - node1/node.cnf | Bin 3504 -> 0 bytes node1/sbbs.bat | 1 - node1/sbbs.cmd | 1 - node1/scfg.bat | 1 - node1/scfg.cmd | 1 - node2/node.cnf | Bin 3504 -> 0 bytes node2/sbbs.bat | 1 - node2/sbbs.cmd | 1 - node2/scfg.bat | 1 - node2/scfg.cmd | 1 - node3/node.cnf | Bin 3504 -> 0 bytes node3/sbbs.bat | 1 - node3/sbbs.cmd | 1 - node3/scfg.bat | 1 - node3/scfg.cmd | 1 - node4/node.cnf | Bin 3504 -> 0 bytes node4/sbbs.bat | 1 - node4/sbbs.cmd | 1 - node4/scfg.bat | 1 - node4/scfg.cmd | 1 - src/cleanall.bat | 96 - src/makeall.bat | 121 - src/makeall.cmd | 63 - src/sbbs2/addfiles/addfiles.c | 1668 ----- src/sbbs2/addfiles/makeall.bat | 11 - src/sbbs2/addfiles/makefile | 89 - src/sbbs2/addfiles/makefile.bc | 76 - src/sbbs2/allusers/allusers.c | 367 -- src/sbbs2/allusers/make.bat | 2 - src/sbbs2/ans2msg/ans2msg.c | 155 - src/sbbs2/ars.c | 502 -- src/sbbs2/ars_defs.h | 72 - src/sbbs2/atcodes.c | 514 -- src/sbbs2/autonode/autonode.c | 193 - src/sbbs2/baja/baja.c | 3115 --------- src/sbbs2/baja/make.bat | 5 - src/sbbs2/baja/make.cmd | 2 - src/sbbs2/bulkmail.c | 219 - src/sbbs2/chat.c | 1715 ----- src/sbbs2/chk_ar.c | 509 -- src/sbbs2/cmdshell.h | 586 -- src/sbbs2/comio.c | 354 -- src/sbbs2/con_hi.c | 796 --- src/sbbs2/con_in.c | 663 -- src/sbbs2/con_mid.c | 813 --- src/sbbs2/con_out.c | 1043 --- src/sbbs2/data.c | 177 - src/sbbs2/data_ovl.c | 439 -- src/sbbs2/dcdwatch/dcdwatch.c | 102 - src/sbbs2/delfiles/delfiles.c | 763 --- src/sbbs2/delfiles/makeall.bat | 11 - src/sbbs2/delfiles/makefile | 89 - src/sbbs2/delfiles/makefile.bc | 77 - src/sbbs2/dos/rciol.obj | Bin 9339 -> 0 bytes src/sbbs2/dstsedit/dstsedit.c | 227 - src/sbbs2/dstsedit/make.bat | 2 - src/sbbs2/dupefind/dupefind.c | 311 - src/sbbs2/dupefind/makeall.bat | 11 - src/sbbs2/dupefind/makefile | 89 - src/sbbs2/dupefind/makefile.bc | 74 - src/sbbs2/echo/docs/fidostep.doc | 321 - src/sbbs2/echo/docs/man.c | 189 - src/sbbs2/echo/docs/sbbsecho.src | 838 --- src/sbbs2/echo/echocfg.c | 1127 ---- src/sbbs2/echo/echocfg.mak | 34 - src/sbbs2/echo/makeall.bat | 9 - src/sbbs2/echo/makecfg.bat | 1 - src/sbbs2/echo/makefile | 94 - src/sbbs2/echo/read_cfg.c | 681 -- src/sbbs2/echo/sbbsecho.c | 5060 --------------- src/sbbs2/echo/sbbsecho.h | 244 - src/sbbs2/echo/sbbsecho.wat | 81 - src/sbbs2/email.c | 276 - src/sbbs2/etext.c | 12 - src/sbbs2/etext.dat | 16 - src/sbbs2/etext.h | 10 - src/sbbs2/exec.c | 1557 ----- src/sbbs2/execdos/execdos.c | 271 - src/sbbs2/execdos/make.bat | 5 - src/sbbs2/execfile.c | 481 -- src/sbbs2/execfunc.c | 665 -- src/sbbs2/execmisc.c | 1373 ---- src/sbbs2/execmsg.c | 301 - src/sbbs2/execsbbs/execsbbs.c | 59 - src/sbbs2/execsbbs/make.bat | 5 - src/sbbs2/execsbbs/make.cmd | 2 - src/sbbs2/fido.c | 818 --- src/sbbs2/fido/crc16.c | 37 - src/sbbs2/fido/crc32.h | 40 - src/sbbs2/fido/file_id.diz | 3 - src/sbbs2/fido/lzh.c | 785 --- src/sbbs2/fido/lzh.h | 5 - src/sbbs2/fido/makeall.bat | 7 - src/sbbs2/fido/makefile | 78 - src/sbbs2/fido/makefile.bc | 88 - src/sbbs2/fido/sbbsfido.c | 1909 ------ src/sbbs2/fido/smbdefs.h | 449 -- src/sbbs2/fido/smblib.c | 1121 ---- src/sbbs2/fido/smblib.h | 80 - src/sbbs2/fido/smbvars.c | 22 - src/sbbs2/file.c | 325 - src/sbbs2/file_ovl.c | 580 -- src/sbbs2/filelist/filelist.c | 657 -- src/sbbs2/filelist/makeall.bat | 11 - src/sbbs2/filelist/makefile | 89 - src/sbbs2/filelist/makefile.bc | 76 - src/sbbs2/gen_defs.h | 73 - src/sbbs2/genetext.c | 69 - src/sbbs2/genetext.exe | Bin 9698 -> 0 bytes src/sbbs2/getnode.c | 248 - src/sbbs2/getuser.c | 429 -- src/sbbs2/initdata.c | 239 - src/sbbs2/install/install.c | 1048 --- src/sbbs2/install/makefile | 52 - src/sbbs2/listfile.c | 782 --- src/sbbs2/login.c | 92 - src/sbbs2/logio.c | 81 - src/sbbs2/logon.c | 569 -- src/sbbs2/logout.c | 245 - src/sbbs2/mail.c | 899 --- src/sbbs2/main.c | 307 - src/sbbs2/main_ovl.c | 839 --- src/sbbs2/main_sec.c | 330 - src/sbbs2/main_wfc.c | 1543 ----- src/sbbs2/makefile | 225 - src/sbbs2/misc.c | 815 --- src/sbbs2/mlabels/make.bat | 2 - src/sbbs2/mlabels/mlabels.c | 361 -- src/sbbs2/msg1.c | 493 -- src/sbbs2/msg2.c | 1202 ---- src/sbbs2/msg2ans/msg2ans.c | 147 - src/sbbs2/msgtoqwk.c | 298 - src/sbbs2/netmail.c | 389 -- src/sbbs2/newuser.c | 404 -- src/sbbs2/node/make.bat | 5 - src/sbbs2/node/make.cmd | 2 - src/sbbs2/node/node.c | 476 -- src/sbbs2/nodedefs.h | 81 - src/sbbs2/pack_qwk.c | 527 -- src/sbbs2/pack_rep.c | 245 - src/sbbs2/post.h | 23 - src/sbbs2/postmsg.c | 308 - src/sbbs2/putmsg.c | 195 - src/sbbs2/putnode.c | 135 - src/sbbs2/qwk.c | 942 --- src/sbbs2/qwk.h | 35 - src/sbbs2/qwknodes/make.bat | 2 - src/sbbs2/qwknodes/qwknodes.c | 500 -- src/sbbs2/qwktomsg.c | 350 - src/sbbs2/readmsgs.c | 1070 ---- src/sbbs2/rio/riodefs.h | 102 - src/sbbs2/rio/riolib.c | 965 --- src/sbbs2/rio/riolib.h | 26 - src/sbbs2/sbbs.h | 472 -- src/sbbs2/sbbs_src.doc | 660 -- src/sbbs2/sbbsdefs.h | 1330 ---- src/sbbs2/scb/makefile | 37 - src/sbbs2/scb/scb.c | 920 --- src/sbbs2/scb/scb.h | 17 - src/sbbs2/scb/scbcfg.c | 788 --- src/sbbs2/scb/scbcfg.mak | 35 - src/sbbs2/scfg/makeall.bat | 3 - src/sbbs2/scfg/makefile | 108 - src/sbbs2/scfg/makehelp.c | 79 - src/sbbs2/scfg/makehelp.exe | Bin 10178 -> 0 bytes src/sbbs2/scfg/scfg.c | 1967 ------ src/sbbs2/scfg/scfg.h | 89 - src/sbbs2/scfg/scfgchat.c | 819 --- src/sbbs2/scfg/scfgmdm.c | 295 - src/sbbs2/scfg/scfgmsg.c | 1337 ---- src/sbbs2/scfg/scfgnet.c | 1457 ----- src/sbbs2/scfg/scfgnode.c | 2163 ------- src/sbbs2/scfg/scfgsub.c | 1200 ---- src/sbbs2/scfg/scfgsys.c | 1790 ------ src/sbbs2/scfg/scfgxfr1.c | 976 --- src/sbbs2/scfg/scfgxfr2.c | 1453 ----- src/sbbs2/scfg/scfgxtrn.c | 1798 ------ src/sbbs2/scfg/wrcnf1.c | 577 -- src/sbbs2/scfg/wrcnf2.c | 494 -- src/sbbs2/scfglib.h | 43 - src/sbbs2/scfglib1.c | 874 --- src/sbbs2/scfglib2.c | 1106 ---- src/sbbs2/scfgvars.c | 264 - src/sbbs2/slog/make.bat | 2 - src/sbbs2/slog/make.cmd | 2 - src/sbbs2/slog/slog.c | 140 - src/sbbs2/smb/121a/chksmb.c | 671 -- src/sbbs2/smb/121a/chksmb.mak | 50 - src/sbbs2/smb/121a/crc16.c | 37 - src/sbbs2/smb/121a/crc32.h | 40 - src/sbbs2/smb/121a/fido2smb.c | 502 -- src/sbbs2/smb/121a/fido2smb.mak | 34 - src/sbbs2/smb/121a/file_id.diz | 10 - src/sbbs2/smb/121a/fixsmb.c | 221 - src/sbbs2/smb/121a/fixsmb.mak | 34 - src/sbbs2/smb/121a/inet2smb.c | 312 - src/sbbs2/smb/121a/inet2smb.mak | 34 - src/sbbs2/smb/121a/lzh.c | 785 --- src/sbbs2/smb/121a/lzh.h | 5 - src/sbbs2/smb/121a/qwk2smb.c | 296 - src/sbbs2/smb/121a/qwk2smb.mak | 34 - src/sbbs2/smb/121a/smb.hst | 303 - src/sbbs2/smb/121a/smb.prn | 5661 ----------------- src/sbbs2/smb/121a/smb.txt | 5661 ----------------- src/sbbs2/smb/121a/smb_read.me | 65 - src/sbbs2/smb/121a/smbdefs.h | 449 -- src/sbbs2/smb/121a/smblib.c | 1121 ---- src/sbbs2/smb/121a/smblib.h | 80 - src/sbbs2/smb/121a/smbutil.bor | 56 - src/sbbs2/smb/121a/smbutil.c | 1419 ----- src/sbbs2/smb/121a/smbutil.h | 10 - src/sbbs2/smb/121a/smbutil.wat | 60 - src/sbbs2/smb/121a/smbvars.c | 22 - src/sbbs2/smb/chksmb/chksmb.c | 672 -- src/sbbs2/smb/chksmb/makefile | 52 - src/sbbs2/smb/crc16.c | 39 - src/sbbs2/smb/crc32.c | 23 - src/sbbs2/smb/crc32.h | 42 - src/sbbs2/smb/docs/smb.hst | 327 - src/sbbs2/smb/docs/smb.src | 3592 ----------- src/sbbs2/smb/docs/smb_read.me | 64 - src/sbbs2/smb/fixsmb/fixsmb.c | 226 - src/sbbs2/smb/fixsmb/makefile | 52 - src/sbbs2/smb/lzh.c | 784 --- src/sbbs2/smb/lzh.h | 21 - src/sbbs2/smb/smbdefs.h | 476 -- src/sbbs2/smb/smblib.c | 1383 ---- src/sbbs2/smb/smblib.h | 205 - src/sbbs2/smb/smbutil/makeall.bat | 11 - src/sbbs2/smb/smbutil/makefile | 73 - src/sbbs2/smb/smbutil/makefile.bc | 57 - src/sbbs2/smb/smbutil/smbutil.c | 1428 ----- src/sbbs2/smb/smbutil/smbutil.h | 12 - src/sbbs2/smbactiv/makeall.bat | 11 - src/sbbs2/smbactiv/makefile | 92 - src/sbbs2/smbactiv/makefile.bc | 78 - src/sbbs2/smbactiv/smbactiv.c | 273 - src/sbbs2/smbfuncs.c | 76 - src/sbbs2/smm/addphoto.c | 310 - src/sbbs2/smm/delphoto.c | 223 - src/sbbs2/smm/lstphoto.c | 182 - src/sbbs2/smm/makefile | 35 - src/sbbs2/smm/makeio.bat | 7 - src/sbbs2/smm/makemsg.c | 70 - src/sbbs2/smm/makephot.bat | 7 - src/sbbs2/smm/makeutil.bat | 2 - src/sbbs2/smm/outphoto.c | 347 - src/sbbs2/smm/smb2smm.c | 970 --- src/sbbs2/smm/smm.c | 3993 ------------ src/sbbs2/smm/smm2msg.c | 539 -- src/sbbs2/smm/smm2smb.c | 540 -- src/sbbs2/smm/smmcfg.c | 616 -- src/sbbs2/smm/smmcfg.mak | 35 - src/sbbs2/smm/smmdefs.h | 160 - src/sbbs2/smm/smmutil.c | 713 --- src/sbbs2/smm/smmvars.c | 27 - src/sbbs2/str.c | 1080 ---- src/sbbs2/text.h | 737 --- src/sbbs2/text_sec.c | 200 - src/sbbs2/un_qwk.c | 200 - src/sbbs2/un_rep.c | 382 -- src/sbbs2/useredit.c | 966 --- src/sbbs2/userrec.c | 194 - src/sbbs2/uti/makefile | 90 - src/sbbs2/uti/uti.c | 298 - src/sbbs2/uti/uti.h | 14 - src/sbbs2/uti/utiexprt.c | 228 - src/sbbs2/uti/utihigh.c | 86 - src/sbbs2/uti/utiimprt.c | 335 - src/sbbs2/uti/utilist.c | 37 - src/sbbs2/uti/utilstrd.c | 86 - src/sbbs2/uti/utiver.c | 26 - src/sbbs2/vars.c | 154 - src/sbbs2/ver.c | 91 - src/sbbs2/viewfile.c | 73 - src/sbbs2/xfer_hi.c | 1516 ----- src/sbbs2/xfer_lo.c | 209 - src/sbbs2/xfer_mid.c | 792 --- src/sbbs2/xfer_sec.c | 134 - src/sbbs2/xtrn.c | 500 -- src/sbbs2/xtrn_ovl.c | 1459 ----- src/stp/make.bat | 2 - src/stp/rciols.obj | Bin 8736 -> 0 bytes src/stp/stp.c | 2017 ------ src/stp/zmodem.h | 141 - src/tone/cvt$$a.c | 66 - src/tone/make.bat | 2 - src/tone/tone.c | 349 - src/uifc/uifc.c | 1829 ------ src/uifc/uifc.h | 335 - src/uifc/uifcd.c | 420 -- src/uifc/uifcx.c | 394 -- src/wmakeall.bat | 38 - text/answer.asc | 7 - text/answer.wip | 18 - text/computer.sif | 109 - text/example.sif | 68 - text/feedback.msg | 10 - text/menu/allmail.asc | 9 - text/menu/attr.asc | 18 - text/menu/batchxfr.asc | 13 - text/menu/batchxfr.rip | 13 - text/menu/batdprot.asc | 1 - text/menu/batflag.asc | 23 - text/menu/batuprot.asc | 1 - text/menu/biprot.asc | 1 - text/menu/chat.asc | 11 - text/menu/chat.rip | 14 - text/menu/chat.wip | 23 - text/menu/dlprot.asc | 1 - text/menu/e-mail.asc | 11 - text/menu/e-mail.rip | 12 - text/menu/e-mail.wip | 21 - text/menu/editor.asc | 19 - text/menu/exempt.asc | 7 - text/menu/flags1.asc | 7 - text/menu/flags2.asc | 7 - text/menu/flags3.asc | 7 - text/menu/flags4.asc | 7 - text/menu/info.wip | 21 - text/menu/keyboard.wip | 42 - text/menu/login.wip | 20 - text/menu/logoff.asc | 6 - text/menu/logoff.msg | 28 - text/menu/logon.asc | 23 - text/menu/mailread.asc | 11 - text/menu/mailread.rip | 15 - text/menu/mailread.wip | 29 - text/menu/main.asc | 20 - text/menu/main.rip | 48 - text/menu/maincfg.asc | 8 - text/menu/maincfg.rip | 12 - text/menu/maininfo.asc | 8 - text/menu/maininfo.rip | 10 - text/menu/major/email.asc | 10 - text/menu/major/file.asc | 9 - text/menu/major/main.asc | 15 - text/menu/major/msg.asc | 9 - text/menu/major/quickscn.asc | 9 - text/menu/major/userdefs.asc | 6 - text/menu/msgattr.asc | 1 - text/menu/msgs.wip | 21 - text/menu/msgscan.asc | 19 - text/menu/msgscan.rip | 20 - text/menu/msgscan.wip | 39 - text/menu/multchat.asc | 10 - text/menu/multchat.rip | 13 - text/menu/namepass.wip | 20 - text/menu/noyes.wip | 20 - text/menu/number.wip | 26 - text/menu/pause.wip | 15 - text/menu/pcboard/brdm.asc | 21 - text/menu/pcboard/welcome.asc | 22 - text/menu/privchat.asc | 8 - text/menu/privchat.rip | 11 - text/menu/qwk.asc | 13 - text/menu/qwk.rip | 11 - text/menu/qwk.wip | 21 - text/menu/renegade/email.asc | 7 - text/menu/renegade/main.asc | 10 - text/menu/renegade/message.asc | 10 - text/menu/renegade/transfer.asc | 11 - text/menu/restrict.asc | 7 - text/menu/sdos/files.asc | 21 - text/menu/sdos/mail.asc | 21 - text/menu/sdos/root.asc | 20 - text/menu/sentmail.asc | 9 - text/menu/sentmail.rip | 13 - text/menu/sentmail.wip | 29 - text/menu/simple/filelist.asc | 9 - text/menu/simple/main.asc | 11 - text/menu/simple/prompt.ans | 2 - text/menu/simple/prompt.asc | 2 - text/menu/simple/readmsg.asc | 11 - text/menu/simple/sendmsg.asc | 7 - text/menu/sysmailr.asc | 4 - text/menu/sysmain.asc | 22 - text/menu/sysmscan.asc | 15 - text/menu/syssmail.asc | 3 - text/menu/sysxfer.asc | 15 - text/menu/tempxfer.asc | 14 - text/menu/tempxfer.rip | 17 - text/menu/transfer.asc | 19 - text/menu/transfer.rip | 37 - text/menu/uedit.asc | 21 - text/menu/ulprot.asc | 1 - text/menu/wfc.asc | 3 - text/menu/wildcat/file.asc | 20 - text/menu/wildcat/main.asc | 20 - text/menu/wildcat/msg.asc | 18 - text/menu/wildcat/sysop.asc | 16 - text/menu/wipfile.wip | 27 - text/menu/wipmain.wip | 33 - text/menu/xfercfg.asc | 9 - text/menu/xfercfg.rip | 10 - text/menu/xferinfo.asc | 8 - text/menu/xferinfo.rip | 11 - text/menu/yesno.wip | 20 - text/name.can | 33 - text/newuser.msg | 8 - text/phone.can | 20 - text/sbbs.msg | 19 - text/system.msg | 8 - text/zipmsg.txt | 4 - xtrn/sbj/Makefile.gnu | 50 - xtrn/sbj/sbj.bpf | 8 - xtrn/sbj/sbj.bpr | 96 - xtrn/sbj/sbj.c | 1907 ------ xtrn/sbj/sbj.cfg | 4 - xtrn/sbj/sbj.doc | Bin 2131 -> 0 bytes xtrn/sbj/sbj.dsp | 102 - xtrn/sbj/sbj.msg | 23 - xtrn/sbj/sbjclean.c | 48 - xtrn/sbl/Makefile.gnu | 50 - xtrn/sbl/makefile.bor | 40 - xtrn/sbl/sbbslist.c | 768 --- xtrn/sbl/sbl.bpf | 9 - xtrn/sbl/sbl.bpr | 120 - xtrn/sbl/sbl.c | 1525 ----- xtrn/sbl/sbl.cfg | 6 - xtrn/sbl/sbl.doc | 95 - xtrn/sbl/sbl.dsp | 106 - xtrn/sbl/sbl2smb.c | 421 -- xtrn/sbl/sbl2smb.dsp | 96 - xtrn/sbl/sbl2txt.c | 190 - xtrn/sbl/sbldefs.h | 128 - xtrn/sbl/sblpack.c | 69 - xtrn/sbl/sblpack.dsp | 89 - xtrn/sbl/smb2sbl.c | 521 -- xtrn/sbl/smb2sbl.dsp | 100 - xtrn/sbl/sysop.txt | 139 - xtrn/scb/instruct.msg | 22 - xtrn/scb/ld_time.msg | 1 - xtrn/scb/no_one.msg | 1 - xtrn/scb/no_zero.msg | 2 - xtrn/scb/phonecan.msg | 2 - xtrn/scb/refused.msg | 7 - xtrn/scb/scb.cfg | 32 - xtrn/scb/scb.doc | 329 - xtrn/scb/scb.msg | 8 - xtrn/scb/toolong.msg | 2 - xtrn/scb/tooshort.msg | 1 - xtrn/scb/verified.msg | 5 - xtrn/scb/whats.new | 21 - xtrn/sdk/xsdk.c | 2677 -------- xtrn/sdk/xsdk.h | 278 - xtrn/sdk/xsdk.txt | 127 - xtrn/sdk/xsdkdefs.h | 348 - xtrn/sdk/xsdkinet.h | 107 - xtrn/sdk/xsdkvars.c | 144 - xtrn/sdk/xsdkwrap.c | 483 -- xtrn/sdk/xsdkwrap.h | 250 - xtrn/smm/adult.que | 93 - xtrn/smm/appear.que | 119 - xtrn/smm/basic.que | 179 - xtrn/smm/file_id.diz | 7 - xtrn/smm/list_hdr.asc | 5 - xtrn/smm/material.que | 91 - xtrn/smm/mb-e.asc | 7 - xtrn/smm/mb-enfj.asc | 134 - xtrn/smm/mb-enfp.asc | 157 - xtrn/smm/mb-entj.asc | 105 - xtrn/smm/mb-entp.asc | 145 - xtrn/smm/mb-esfj.asc | 118 - xtrn/smm/mb-esfp.asc | 89 - xtrn/smm/mb-estj.asc | 70 - xtrn/smm/mb-estp.asc | 119 - xtrn/smm/mb-f.asc | 7 - xtrn/smm/mb-fp.asc | 1 - xtrn/smm/mb-i.asc | 9 - xtrn/smm/mb-infj.asc | 144 - xtrn/smm/mb-infp.asc | 118 - xtrn/smm/mb-intj.asc | 169 - xtrn/smm/mb-intp.asc | 118 - xtrn/smm/mb-intro.asc | 18 - xtrn/smm/mb-isfj.asc | 116 - xtrn/smm/mb-isfp.asc | 166 - xtrn/smm/mb-istj.asc | 121 - xtrn/smm/mb-istp.asc | 191 - xtrn/smm/mb-j.asc | 11 - xtrn/smm/mb-n.asc | 7 - xtrn/smm/mb-nf.asc | 22 - xtrn/smm/mb-nt.asc | 32 - xtrn/smm/mb-p.asc | 9 - xtrn/smm/mb-s.asc | 11 - xtrn/smm/mb-sj.asc | 16 - xtrn/smm/mb-sp.asc | 20 - xtrn/smm/mb-t.asc | 7 - xtrn/smm/mb-tj.asc | 1 - xtrn/smm/mb-type.asc | 20 - xtrn/smm/mb-type.que | Bin 10430 -> 0 bytes xtrn/smm/purity-1.asc | 16 - xtrn/smm/purity-2.asc | 7 - xtrn/smm/purity-3.asc | 2 - xtrn/smm/purity-4.asc | 2 - xtrn/smm/purity-5.asc | 16 - xtrn/smm/purity-6.asc | 18 - xtrn/smm/purity-7.asc | 8 - xtrn/smm/purity-8.asc | 7 - xtrn/smm/purity-9.asc | 6 - xtrn/smm/purity-a.asc | 5 - xtrn/smm/purity-b.asc | 2 - xtrn/smm/purity.100 | 100 - xtrn/smm/purity.500 | 511 -- xtrn/smm/purity.asc | 31 - xtrn/smm/purity.que | 100 - xtrn/smm/que.lst | 12 - xtrn/smm/smm.can | 4 - xtrn/smm/smm.cfg | 22 - xtrn/smm/smm.doc | 594 -- xtrn/smm/smm_help.asc | 27 - xtrn/smm/smm_logo.asc | 3 - xtrn/smm/smm_main.asc | 9 - xtrn/smm/upgrade.doc | 241 - 841 files changed, 189723 deletions(-) delete mode 100755 CVSROOT/checkoutlist delete mode 100755 CVSROOT/commitinfo delete mode 100755 CVSROOT/config delete mode 100755 CVSROOT/cvswrappers delete mode 100755 CVSROOT/editinfo delete mode 100755 CVSROOT/loginfo delete mode 100755 CVSROOT/modules delete mode 100755 CVSROOT/notify delete mode 100755 CVSROOT/rcsinfo delete mode 100755 CVSROOT/taginfo delete mode 100755 CVSROOT/verifymsg delete mode 100644 ctrl/1414vqe.mdm delete mode 100644 ctrl/1428vqe.mdm delete mode 100644 ctrl/ace9600.mdm delete mode 100644 ctrl/ati14400.mdm delete mode 100644 ctrl/ati19200.mdm delete mode 100644 ctrl/ati9600.mdm delete mode 100644 ctrl/att14400.mdm delete mode 100644 ctrl/attr.cfg delete mode 100644 ctrl/chat.cnf delete mode 100644 ctrl/dsiscout.mdm delete mode 100644 ctrl/file.cnf delete mode 100644 ctrl/gen1200.mdm delete mode 100644 ctrl/gen14400.mdm delete mode 100644 ctrl/gen2400.mdm delete mode 100644 ctrl/gen28800.mdm delete mode 100644 ctrl/gen9600.mdm delete mode 100644 ctrl/guru.dat delete mode 100644 ctrl/gvc14400.mdm delete mode 100644 ctrl/gvc9600.mdm delete mode 100644 ctrl/hay14400.mdm delete mode 100644 ctrl/hay24e.mdm delete mode 100644 ctrl/hay28800.mdm delete mode 100644 ctrl/int14400.mdm delete mode 100644 ctrl/main.cnf delete mode 100644 ctrl/mcc14400.mdm delete mode 100644 ctrl/mdms.ixt delete mode 100644 ctrl/mic2400.mdm delete mode 100644 ctrl/mic28800.mdm delete mode 100644 ctrl/mic4232.mdm delete mode 100644 ctrl/micv32c.mdm delete mode 100644 ctrl/msgs.cnf delete mode 100644 ctrl/mt1432.mdm delete mode 100644 ctrl/mt2834.mdm delete mode 100644 ctrl/pp14400.mdm delete mode 100644 ctrl/pp28800.mdm delete mode 100644 ctrl/sbbsecho.cfg delete mode 100644 ctrl/services.cfg delete mode 100644 ctrl/sup14400.mdm delete mode 100644 ctrl/sup28800.mdm delete mode 100644 ctrl/text.dat delete mode 100644 ctrl/usr144.mdm delete mode 100644 ctrl/usr144ds.mdm delete mode 100644 ctrl/usr168.mdm delete mode 100644 ctrl/usr168ds.mdm delete mode 100644 ctrl/usr216ds.mdm delete mode 100644 ctrl/usr288ds.mdm delete mode 100644 ctrl/usr96.mdm delete mode 100644 ctrl/usr96ds.mdm delete mode 100644 ctrl/ven14400.mdm delete mode 100644 ctrl/viv14400.mdm delete mode 100644 ctrl/viv9624e.mdm delete mode 100644 ctrl/viv9642e.mdm delete mode 100644 ctrl/xtrn.cnf delete mode 100644 ctrl/zoom9600.mdm delete mode 100644 ctrl/zyx1496.mdm delete mode 100644 ctrl/zyx1496f.mdm delete mode 100644 docs/_borders/bottom.htm delete mode 100644 docs/_borders/top.htm delete mode 100644 docs/adding_nodes.html delete mode 100644 docs/amail.cfg delete mode 100644 docs/appendix.html delete mode 100644 docs/baja.html delete mode 100644 docs/baja2new.txt delete mode 100644 docs/chat_section.html delete mode 100644 docs/contents.txt delete mode 100644 docs/customization.html delete mode 100644 docs/default.htm delete mode 100755 docs/exebbs.bat delete mode 100644 docs/external_programs.html delete mode 100644 docs/features.html delete mode 100644 docs/file_section.html delete mode 100644 docs/files.ref delete mode 100644 docs/glossary.html delete mode 100644 docs/gpl.txt delete mode 100644 docs/htdocs_contrib.txt delete mode 100644 docs/images/baja_example.gif delete mode 100644 docs/images/bre.gif delete mode 100644 docs/images/lordcfg.gif delete mode 100644 docs/images/sbbsctrl.gif delete mode 100644 docs/images/sbbsctrl_configure.gif delete mode 100644 docs/images/sbbsctrl_telnet_cfg_gen.gif delete mode 100644 docs/images/sbbsecho_additionalecho.gif delete mode 100644 docs/images/sbbsecho_additionalecho_list.gif delete mode 100644 docs/images/sbbsecho_additionalecho_list_tag.gif delete mode 100644 docs/images/sbbsecho_archiveprgs.gif delete mode 100644 docs/images/sbbsecho_archiveprgs_zip.gif delete mode 100644 docs/images/sbbsecho_logoptions.gif delete mode 100644 docs/images/sbbsecho_main.gif delete mode 100644 docs/images/sbbsecho_node_arctype.gif delete mode 100644 docs/images/sbbsecho_node_packettype.gif delete mode 100644 docs/images/sbbsecho_node_settings.gif delete mode 100644 docs/images/sbbsecho_nodes.gif delete mode 100644 docs/images/sbbsecho_paths.gif delete mode 100644 docs/images/sbbsecho_toggleoptions.gif delete mode 100644 docs/images/scfg_chat_channel1.gif delete mode 100644 docs/images/scfg_chat_features.gif delete mode 100644 docs/images/scfg_chat_gurus.gif delete mode 100644 docs/images/scfg_chat_pager1.gif delete mode 100644 docs/images/scfg_chat_pagers.gif delete mode 100644 docs/images/scfg_chat_theguru.gif delete mode 100644 docs/images/scfg_dos_startup.gif delete mode 100644 docs/images/scfg_main.gif delete mode 100644 docs/images/scfg_modem_config.gif delete mode 100644 docs/images/scfg_modem_fax_code1.gif delete mode 100644 docs/images/scfg_modem_fax_code2.gif delete mode 100644 docs/images/scfg_modem_port_type.gif delete mode 100644 docs/images/scfg_modem_resultcode_15.gif delete mode 100644 docs/images/scfg_modem_resultcodes.gif delete mode 100644 docs/images/scfg_modem_strings.gif delete mode 100644 docs/images/scfg_modem_toggles.gif delete mode 100644 docs/images/scfg_msg_area_advopts.gif delete mode 100644 docs/images/scfg_msg_area_netopts.gif delete mode 100644 docs/images/scfg_msg_area_toggles.gif delete mode 100644 docs/images/scfg_msg_areas.gif delete mode 100644 docs/images/scfg_msg_areas_gen.gif delete mode 100644 docs/images/scfg_msg_attrcodes.gif delete mode 100644 docs/images/scfg_msg_options.gif delete mode 100644 docs/images/scfg_networks.gif delete mode 100644 docs/images/scfg_networks_fido.gif delete mode 100644 docs/images/scfg_networks_fido_address.gif delete mode 100644 docs/images/scfg_networks_internet.gif delete mode 100644 docs/images/scfg_networks_post.gif delete mode 100644 docs/images/scfg_networks_post_hubs.gif delete mode 100644 docs/images/scfg_networks_post_hubs_sccm.gif delete mode 100644 docs/images/scfg_networks_qwkhubs.gif delete mode 100644 docs/images/scfg_networks_qwkhubs_vert.gif delete mode 100644 docs/images/scfg_networks_qwkhubs_vert_subs.gif delete mode 100644 docs/images/scfg_networks_qwkhubs_vert_subs_opt.gif delete mode 100644 docs/images/scfg_node1.gif delete mode 100644 docs/images/scfg_node1_advanced.gif delete mode 100644 docs/images/scfg_node1_toggles.gif delete mode 100644 docs/images/scfg_system.gif delete mode 100644 docs/images/scfg_system_advanced.gif delete mode 100644 docs/images/scfg_system_expired.gif delete mode 100644 docs/images/scfg_system_loadablemods.gif delete mode 100644 docs/images/scfg_system_newvalues.gif delete mode 100644 docs/images/scfg_system_newvalues_questions.gif delete mode 100644 docs/images/scfg_system_newvalues_toggles.gif delete mode 100644 docs/images/scfg_system_quickval.gif delete mode 100644 docs/images/scfg_system_quickval_0.gif delete mode 100644 docs/images/scfg_system_securityvalues.gif delete mode 100644 docs/images/scfg_system_securityvalues_0.gif delete mode 100644 docs/images/scfg_system_toggle.gif delete mode 100644 docs/images/scfg_xfer_compressable.gif delete mode 100644 docs/images/scfg_xfer_dir.gif delete mode 100644 docs/images/scfg_xfer_dir_advanced.gif delete mode 100644 docs/images/scfg_xfer_dir_toggles.gif delete mode 100644 docs/images/scfg_xfer_event.gif delete mode 100644 docs/images/scfg_xfer_eventc.gif delete mode 100644 docs/images/scfg_xfer_extractable.gif delete mode 100644 docs/images/scfg_xfer_library.gif delete mode 100644 docs/images/scfg_xfer_options.gif delete mode 100644 docs/images/scfg_xfer_proto_dsz.gif delete mode 100644 docs/images/scfg_xfer_proto_dsz_g.gif delete mode 100644 docs/images/scfg_xfer_proto_dsz_h.gif delete mode 100644 docs/images/scfg_xfer_proto_dsz_x.gif delete mode 100644 docs/images/scfg_xfer_proto_dsz_y.gif delete mode 100644 docs/images/scfg_xfer_proto_dsz_z.gif delete mode 100644 docs/images/scfg_xfer_proto_fdsz.gif delete mode 100644 docs/images/scfg_xfer_proto_fdsz_g.gif delete mode 100644 docs/images/scfg_xfer_proto_fdsz_x.gif delete mode 100644 docs/images/scfg_xfer_proto_fdsz_y.gif delete mode 100644 docs/images/scfg_xfer_proto_fdsz_z.gif delete mode 100644 docs/images/scfg_xfer_testable.gif delete mode 100644 docs/images/scfg_xfer_testable_du.gif delete mode 100644 docs/images/scfg_xfer_testable_zip.gif delete mode 100644 docs/images/scfg_xfer_testable_zipc.gif delete mode 100644 docs/images/scfg_xfer_viewable.gif delete mode 100644 docs/images/scfg_xtrn_fixed.gif delete mode 100644 docs/images/scfg_xtrn_lord.gif delete mode 100644 docs/images/scfg_xtrn_sbl.gif delete mode 100644 docs/images/scfg_xtrn_section.gif delete mode 100644 docs/images/scfg_xtrn_swaplist.gif delete mode 100644 docs/images/scfg_xtrn_syncedit.gif delete mode 100644 docs/images/scfg_xtrn_timed.gif delete mode 100644 docs/images/scfg_xtrn_timeopt.gif delete mode 100644 docs/images/scfg_xtrn_tw2002.gif delete mode 100644 docs/images/scfg_xtrn_usurper.gif delete mode 100644 docs/images/scfg_xtrn_winos2list.gif delete mode 100644 docs/images/setuptype.gif delete mode 100644 docs/images/synclogo_fancyred.gif delete mode 100644 docs/images/tw2002.gif delete mode 100644 docs/images/uedit_v3.gif delete mode 100644 docs/images/uedit_v3_exe.gif delete mode 100644 docs/images/v3icon3.gif delete mode 100644 docs/index.htm delete mode 100644 docs/index.html delete mode 100644 docs/install.html delete mode 100644 docs/install.iwz delete mode 100644 docs/install.txt delete mode 100755 docs/mailer.bat delete mode 100644 docs/message_section.html delete mode 100644 docs/modem_setup.html delete mode 100644 docs/multnode_config.html delete mode 100644 docs/networking.html delete mode 100644 docs/ntreadme.txt delete mode 100644 docs/platforms.html delete mode 100644 docs/qemm.txt delete mode 100644 docs/sbbs.hst delete mode 100644 docs/sbbsecho.html delete mode 100644 docs/security.html delete mode 100644 docs/smb.html delete mode 100644 docs/svdmansi.txt delete mode 100644 docs/syedtfaq.txt delete mode 100644 docs/syncedit.txt delete mode 100644 docs/sysop.html delete mode 100644 docs/sysop_commands.html delete mode 100644 docs/system_config.html delete mode 100644 docs/text210a.dif delete mode 100644 docs/text220a.dif delete mode 100644 docs/text220b.dif delete mode 100644 docs/text230a.dif delete mode 100644 docs/textfile_section.html delete mode 100644 docs/troubleshooting.html delete mode 100644 docs/upgrade.txt delete mode 100644 docs/user.html delete mode 100644 docs/user_editor.html delete mode 100644 docs/usercom.txt delete mode 100644 docs/utility_reference.html delete mode 100644 docs/v200_new.txt delete mode 100644 docs/v210_new.txt delete mode 100644 docs/v211_new.txt delete mode 100644 docs/v220_new.txt delete mode 100644 docs/versions.hst delete mode 100644 docs/versions.txt delete mode 100644 exec/Makefile.bor delete mode 100644 exec/Makefile.gnu delete mode 100644 exec/bullseye.src delete mode 100644 exec/chat_sec.src delete mode 100644 exec/cntnodes.src delete mode 100644 exec/default.src delete mode 100644 exec/dir.src delete mode 100644 exec/dir_attr.inc delete mode 100644 exec/dumpobjs.js delete mode 100644 exec/errno.inc delete mode 100644 exec/examples/dir.js delete mode 100644 exec/examples/socktest.js delete mode 100644 exec/file_io.inc delete mode 100644 exec/file_io.src delete mode 100644 exec/finger.js delete mode 100644 exec/fingerservice.js delete mode 100644 exec/ftp-html.js delete mode 100644 exec/ftp.src delete mode 100644 exec/gopherservice.js delete mode 100644 exec/load/nodedefs.js delete mode 100644 exec/load/sbbsdefs.js delete mode 100644 exec/load/sockdefs.js delete mode 100644 exec/login.src delete mode 100644 exec/logon.src delete mode 100644 exec/major.src delete mode 100644 exec/matrix.src delete mode 100644 exec/mudgate.src delete mode 100644 exec/nntpservice.js delete mode 100644 exec/nodedefs.inc delete mode 100644 exec/nodelist-html.js delete mode 100644 exec/nodelist.js delete mode 100644 exec/noyesbar.src delete mode 100644 exec/pcboard.src delete mode 100755 exec/pnet.bat delete mode 100644 exec/qnet-ftp.src delete mode 100755 exec/qnet.bat delete mode 100644 exec/qnet.slt delete mode 100644 exec/qnet.src delete mode 100644 exec/ra_emu.src delete mode 100644 exec/renegade.src delete mode 100644 exec/rlogin.src delete mode 100644 exec/sbbsdefs.inc delete mode 100644 exec/sbbshelp.dab delete mode 100644 exec/sbbsimsg.js delete mode 100644 exec/sbbsqnet.rs delete mode 100644 exec/sbbsqnet.scr delete mode 100644 exec/sbbsqnet.slt delete mode 100644 exec/sdos.src delete mode 100644 exec/sendmsg.js delete mode 100644 exec/simple.src delete mode 100644 exec/socktest.src delete mode 100644 exec/sound.js delete mode 100644 exec/str_cmds.src delete mode 100644 exec/telgate.src delete mode 100644 exec/textdat.js delete mode 100644 exec/tone/battle.ton delete mode 100644 exec/tone/bouree.ton delete mode 100644 exec/tone/buffgals.ton delete mode 100644 exec/tone/camptown.ton delete mode 100644 exec/tone/clown.ton delete mode 100644 exec/tone/ent.ton delete mode 100644 exec/tone/example.ton delete mode 100644 exec/tone/funeral.ton delete mode 100644 exec/tone/furelise.ton delete mode 100644 exec/tone/goodnite.ton delete mode 100644 exec/tone/hatdance.ton delete mode 100644 exec/tone/humor.ton delete mode 100644 exec/tone/jeanie.ton delete mode 100644 exec/tone/la_cuca.ton delete mode 100644 exec/tone/maplerag.ton delete mode 100644 exec/tone/march.ton delete mode 100644 exec/tone/mary.ton delete mode 100644 exec/tone/mountai.ton delete mode 100644 exec/tone/sakura.ton delete mode 100644 exec/tone/sleeping.ton delete mode 100644 exec/tone/susanna.ton delete mode 100644 exec/tone/swinglow.ton delete mode 100644 exec/tone/symph_40.ton delete mode 100644 exec/tone/tdc.ton delete mode 100644 exec/tone/trapeze.ton delete mode 100644 exec/tone/weasel.ton delete mode 100644 exec/tone/yankee.ton delete mode 100644 exec/type.src delete mode 100644 exec/typehtml.src delete mode 100644 exec/unixgate.src delete mode 100644 exec/userdefs.inc delete mode 100644 exec/userlist.js delete mode 100644 exec/wildcat.src delete mode 100644 exec/wiplogin.src delete mode 100644 exec/wipshell.src delete mode 100644 exec/yesnobar.src delete mode 100644 node1/node.cnf delete mode 100755 node1/sbbs.bat delete mode 100755 node1/sbbs.cmd delete mode 100755 node1/scfg.bat delete mode 100755 node1/scfg.cmd delete mode 100644 node2/node.cnf delete mode 100755 node2/sbbs.bat delete mode 100755 node2/sbbs.cmd delete mode 100755 node2/scfg.bat delete mode 100755 node2/scfg.cmd delete mode 100644 node3/node.cnf delete mode 100755 node3/sbbs.bat delete mode 100755 node3/sbbs.cmd delete mode 100755 node3/scfg.bat delete mode 100755 node3/scfg.cmd delete mode 100644 node4/node.cnf delete mode 100755 node4/sbbs.bat delete mode 100755 node4/sbbs.cmd delete mode 100755 node4/scfg.bat delete mode 100755 node4/scfg.cmd delete mode 100755 src/cleanall.bat delete mode 100755 src/makeall.bat delete mode 100755 src/makeall.cmd delete mode 100644 src/sbbs2/addfiles/addfiles.c delete mode 100755 src/sbbs2/addfiles/makeall.bat delete mode 100644 src/sbbs2/addfiles/makefile delete mode 100644 src/sbbs2/addfiles/makefile.bc delete mode 100644 src/sbbs2/allusers/allusers.c delete mode 100755 src/sbbs2/allusers/make.bat delete mode 100644 src/sbbs2/ans2msg/ans2msg.c delete mode 100644 src/sbbs2/ars.c delete mode 100644 src/sbbs2/ars_defs.h delete mode 100644 src/sbbs2/atcodes.c delete mode 100644 src/sbbs2/autonode/autonode.c delete mode 100644 src/sbbs2/baja/baja.c delete mode 100755 src/sbbs2/baja/make.bat delete mode 100755 src/sbbs2/baja/make.cmd delete mode 100644 src/sbbs2/bulkmail.c delete mode 100644 src/sbbs2/chat.c delete mode 100644 src/sbbs2/chk_ar.c delete mode 100644 src/sbbs2/cmdshell.h delete mode 100644 src/sbbs2/comio.c delete mode 100644 src/sbbs2/con_hi.c delete mode 100644 src/sbbs2/con_in.c delete mode 100644 src/sbbs2/con_mid.c delete mode 100644 src/sbbs2/con_out.c delete mode 100644 src/sbbs2/data.c delete mode 100644 src/sbbs2/data_ovl.c delete mode 100644 src/sbbs2/dcdwatch/dcdwatch.c delete mode 100644 src/sbbs2/delfiles/delfiles.c delete mode 100755 src/sbbs2/delfiles/makeall.bat delete mode 100644 src/sbbs2/delfiles/makefile delete mode 100644 src/sbbs2/delfiles/makefile.bc delete mode 100644 src/sbbs2/dos/rciol.obj delete mode 100644 src/sbbs2/dstsedit/dstsedit.c delete mode 100755 src/sbbs2/dstsedit/make.bat delete mode 100644 src/sbbs2/dupefind/dupefind.c delete mode 100755 src/sbbs2/dupefind/makeall.bat delete mode 100644 src/sbbs2/dupefind/makefile delete mode 100644 src/sbbs2/dupefind/makefile.bc delete mode 100644 src/sbbs2/echo/docs/fidostep.doc delete mode 100644 src/sbbs2/echo/docs/man.c delete mode 100644 src/sbbs2/echo/docs/sbbsecho.src delete mode 100644 src/sbbs2/echo/echocfg.c delete mode 100644 src/sbbs2/echo/echocfg.mak delete mode 100755 src/sbbs2/echo/makeall.bat delete mode 100755 src/sbbs2/echo/makecfg.bat delete mode 100644 src/sbbs2/echo/makefile delete mode 100644 src/sbbs2/echo/read_cfg.c delete mode 100644 src/sbbs2/echo/sbbsecho.c delete mode 100644 src/sbbs2/echo/sbbsecho.h delete mode 100644 src/sbbs2/echo/sbbsecho.wat delete mode 100644 src/sbbs2/email.c delete mode 100644 src/sbbs2/etext.c delete mode 100644 src/sbbs2/etext.dat delete mode 100644 src/sbbs2/etext.h delete mode 100644 src/sbbs2/exec.c delete mode 100644 src/sbbs2/execdos/execdos.c delete mode 100755 src/sbbs2/execdos/make.bat delete mode 100644 src/sbbs2/execfile.c delete mode 100644 src/sbbs2/execfunc.c delete mode 100644 src/sbbs2/execmisc.c delete mode 100644 src/sbbs2/execmsg.c delete mode 100644 src/sbbs2/execsbbs/execsbbs.c delete mode 100755 src/sbbs2/execsbbs/make.bat delete mode 100755 src/sbbs2/execsbbs/make.cmd delete mode 100644 src/sbbs2/fido.c delete mode 100644 src/sbbs2/fido/crc16.c delete mode 100644 src/sbbs2/fido/crc32.h delete mode 100644 src/sbbs2/fido/file_id.diz delete mode 100644 src/sbbs2/fido/lzh.c delete mode 100644 src/sbbs2/fido/lzh.h delete mode 100755 src/sbbs2/fido/makeall.bat delete mode 100644 src/sbbs2/fido/makefile delete mode 100644 src/sbbs2/fido/makefile.bc delete mode 100644 src/sbbs2/fido/sbbsfido.c delete mode 100644 src/sbbs2/fido/smbdefs.h delete mode 100644 src/sbbs2/fido/smblib.c delete mode 100644 src/sbbs2/fido/smblib.h delete mode 100644 src/sbbs2/fido/smbvars.c delete mode 100644 src/sbbs2/file.c delete mode 100644 src/sbbs2/file_ovl.c delete mode 100644 src/sbbs2/filelist/filelist.c delete mode 100755 src/sbbs2/filelist/makeall.bat delete mode 100644 src/sbbs2/filelist/makefile delete mode 100644 src/sbbs2/filelist/makefile.bc delete mode 100644 src/sbbs2/gen_defs.h delete mode 100644 src/sbbs2/genetext.c delete mode 100755 src/sbbs2/genetext.exe delete mode 100644 src/sbbs2/getnode.c delete mode 100644 src/sbbs2/getuser.c delete mode 100644 src/sbbs2/initdata.c delete mode 100644 src/sbbs2/install/install.c delete mode 100644 src/sbbs2/install/makefile delete mode 100644 src/sbbs2/listfile.c delete mode 100644 src/sbbs2/login.c delete mode 100644 src/sbbs2/logio.c delete mode 100644 src/sbbs2/logon.c delete mode 100644 src/sbbs2/logout.c delete mode 100644 src/sbbs2/mail.c delete mode 100644 src/sbbs2/main.c delete mode 100644 src/sbbs2/main_ovl.c delete mode 100644 src/sbbs2/main_sec.c delete mode 100644 src/sbbs2/main_wfc.c delete mode 100644 src/sbbs2/makefile delete mode 100644 src/sbbs2/misc.c delete mode 100755 src/sbbs2/mlabels/make.bat delete mode 100644 src/sbbs2/mlabels/mlabels.c delete mode 100644 src/sbbs2/msg1.c delete mode 100644 src/sbbs2/msg2.c delete mode 100644 src/sbbs2/msg2ans/msg2ans.c delete mode 100644 src/sbbs2/msgtoqwk.c delete mode 100644 src/sbbs2/netmail.c delete mode 100644 src/sbbs2/newuser.c delete mode 100755 src/sbbs2/node/make.bat delete mode 100755 src/sbbs2/node/make.cmd delete mode 100644 src/sbbs2/node/node.c delete mode 100644 src/sbbs2/nodedefs.h delete mode 100644 src/sbbs2/pack_qwk.c delete mode 100644 src/sbbs2/pack_rep.c delete mode 100644 src/sbbs2/post.h delete mode 100644 src/sbbs2/postmsg.c delete mode 100644 src/sbbs2/putmsg.c delete mode 100644 src/sbbs2/putnode.c delete mode 100644 src/sbbs2/qwk.c delete mode 100644 src/sbbs2/qwk.h delete mode 100755 src/sbbs2/qwknodes/make.bat delete mode 100644 src/sbbs2/qwknodes/qwknodes.c delete mode 100644 src/sbbs2/qwktomsg.c delete mode 100644 src/sbbs2/readmsgs.c delete mode 100644 src/sbbs2/rio/riodefs.h delete mode 100644 src/sbbs2/rio/riolib.c delete mode 100644 src/sbbs2/rio/riolib.h delete mode 100644 src/sbbs2/sbbs.h delete mode 100644 src/sbbs2/sbbs_src.doc delete mode 100644 src/sbbs2/sbbsdefs.h delete mode 100644 src/sbbs2/scb/makefile delete mode 100644 src/sbbs2/scb/scb.c delete mode 100644 src/sbbs2/scb/scb.h delete mode 100644 src/sbbs2/scb/scbcfg.c delete mode 100644 src/sbbs2/scb/scbcfg.mak delete mode 100755 src/sbbs2/scfg/makeall.bat delete mode 100644 src/sbbs2/scfg/makefile delete mode 100644 src/sbbs2/scfg/makehelp.c delete mode 100755 src/sbbs2/scfg/makehelp.exe delete mode 100644 src/sbbs2/scfg/scfg.c delete mode 100644 src/sbbs2/scfg/scfg.h delete mode 100644 src/sbbs2/scfg/scfgchat.c delete mode 100644 src/sbbs2/scfg/scfgmdm.c delete mode 100644 src/sbbs2/scfg/scfgmsg.c delete mode 100644 src/sbbs2/scfg/scfgnet.c delete mode 100644 src/sbbs2/scfg/scfgnode.c delete mode 100644 src/sbbs2/scfg/scfgsub.c delete mode 100644 src/sbbs2/scfg/scfgsys.c delete mode 100644 src/sbbs2/scfg/scfgxfr1.c delete mode 100644 src/sbbs2/scfg/scfgxfr2.c delete mode 100644 src/sbbs2/scfg/scfgxtrn.c delete mode 100644 src/sbbs2/scfg/wrcnf1.c delete mode 100644 src/sbbs2/scfg/wrcnf2.c delete mode 100644 src/sbbs2/scfglib.h delete mode 100644 src/sbbs2/scfglib1.c delete mode 100644 src/sbbs2/scfglib2.c delete mode 100644 src/sbbs2/scfgvars.c delete mode 100755 src/sbbs2/slog/make.bat delete mode 100755 src/sbbs2/slog/make.cmd delete mode 100644 src/sbbs2/slog/slog.c delete mode 100644 src/sbbs2/smb/121a/chksmb.c delete mode 100644 src/sbbs2/smb/121a/chksmb.mak delete mode 100644 src/sbbs2/smb/121a/crc16.c delete mode 100644 src/sbbs2/smb/121a/crc32.h delete mode 100644 src/sbbs2/smb/121a/fido2smb.c delete mode 100644 src/sbbs2/smb/121a/fido2smb.mak delete mode 100644 src/sbbs2/smb/121a/file_id.diz delete mode 100644 src/sbbs2/smb/121a/fixsmb.c delete mode 100644 src/sbbs2/smb/121a/fixsmb.mak delete mode 100644 src/sbbs2/smb/121a/inet2smb.c delete mode 100644 src/sbbs2/smb/121a/inet2smb.mak delete mode 100644 src/sbbs2/smb/121a/lzh.c delete mode 100644 src/sbbs2/smb/121a/lzh.h delete mode 100644 src/sbbs2/smb/121a/qwk2smb.c delete mode 100644 src/sbbs2/smb/121a/qwk2smb.mak delete mode 100644 src/sbbs2/smb/121a/smb.hst delete mode 100644 src/sbbs2/smb/121a/smb.prn delete mode 100644 src/sbbs2/smb/121a/smb.txt delete mode 100644 src/sbbs2/smb/121a/smb_read.me delete mode 100644 src/sbbs2/smb/121a/smbdefs.h delete mode 100644 src/sbbs2/smb/121a/smblib.c delete mode 100644 src/sbbs2/smb/121a/smblib.h delete mode 100644 src/sbbs2/smb/121a/smbutil.bor delete mode 100644 src/sbbs2/smb/121a/smbutil.c delete mode 100644 src/sbbs2/smb/121a/smbutil.h delete mode 100644 src/sbbs2/smb/121a/smbutil.wat delete mode 100644 src/sbbs2/smb/121a/smbvars.c delete mode 100644 src/sbbs2/smb/chksmb/chksmb.c delete mode 100644 src/sbbs2/smb/chksmb/makefile delete mode 100644 src/sbbs2/smb/crc16.c delete mode 100644 src/sbbs2/smb/crc32.c delete mode 100644 src/sbbs2/smb/crc32.h delete mode 100644 src/sbbs2/smb/docs/smb.hst delete mode 100644 src/sbbs2/smb/docs/smb.src delete mode 100644 src/sbbs2/smb/docs/smb_read.me delete mode 100644 src/sbbs2/smb/fixsmb/fixsmb.c delete mode 100644 src/sbbs2/smb/fixsmb/makefile delete mode 100644 src/sbbs2/smb/lzh.c delete mode 100644 src/sbbs2/smb/lzh.h delete mode 100644 src/sbbs2/smb/smbdefs.h delete mode 100644 src/sbbs2/smb/smblib.c delete mode 100644 src/sbbs2/smb/smblib.h delete mode 100755 src/sbbs2/smb/smbutil/makeall.bat delete mode 100644 src/sbbs2/smb/smbutil/makefile delete mode 100644 src/sbbs2/smb/smbutil/makefile.bc delete mode 100644 src/sbbs2/smb/smbutil/smbutil.c delete mode 100644 src/sbbs2/smb/smbutil/smbutil.h delete mode 100755 src/sbbs2/smbactiv/makeall.bat delete mode 100644 src/sbbs2/smbactiv/makefile delete mode 100644 src/sbbs2/smbactiv/makefile.bc delete mode 100644 src/sbbs2/smbactiv/smbactiv.c delete mode 100644 src/sbbs2/smbfuncs.c delete mode 100644 src/sbbs2/smm/addphoto.c delete mode 100644 src/sbbs2/smm/delphoto.c delete mode 100644 src/sbbs2/smm/lstphoto.c delete mode 100644 src/sbbs2/smm/makefile delete mode 100755 src/sbbs2/smm/makeio.bat delete mode 100644 src/sbbs2/smm/makemsg.c delete mode 100755 src/sbbs2/smm/makephot.bat delete mode 100755 src/sbbs2/smm/makeutil.bat delete mode 100644 src/sbbs2/smm/outphoto.c delete mode 100644 src/sbbs2/smm/smb2smm.c delete mode 100644 src/sbbs2/smm/smm.c delete mode 100644 src/sbbs2/smm/smm2msg.c delete mode 100644 src/sbbs2/smm/smm2smb.c delete mode 100644 src/sbbs2/smm/smmcfg.c delete mode 100644 src/sbbs2/smm/smmcfg.mak delete mode 100644 src/sbbs2/smm/smmdefs.h delete mode 100644 src/sbbs2/smm/smmutil.c delete mode 100644 src/sbbs2/smm/smmvars.c delete mode 100644 src/sbbs2/str.c delete mode 100644 src/sbbs2/text.h delete mode 100644 src/sbbs2/text_sec.c delete mode 100644 src/sbbs2/un_qwk.c delete mode 100644 src/sbbs2/un_rep.c delete mode 100644 src/sbbs2/useredit.c delete mode 100644 src/sbbs2/userrec.c delete mode 100644 src/sbbs2/uti/makefile delete mode 100644 src/sbbs2/uti/uti.c delete mode 100644 src/sbbs2/uti/uti.h delete mode 100644 src/sbbs2/uti/utiexprt.c delete mode 100644 src/sbbs2/uti/utihigh.c delete mode 100644 src/sbbs2/uti/utiimprt.c delete mode 100644 src/sbbs2/uti/utilist.c delete mode 100644 src/sbbs2/uti/utilstrd.c delete mode 100644 src/sbbs2/uti/utiver.c delete mode 100644 src/sbbs2/vars.c delete mode 100644 src/sbbs2/ver.c delete mode 100644 src/sbbs2/viewfile.c delete mode 100644 src/sbbs2/xfer_hi.c delete mode 100644 src/sbbs2/xfer_lo.c delete mode 100644 src/sbbs2/xfer_mid.c delete mode 100644 src/sbbs2/xfer_sec.c delete mode 100644 src/sbbs2/xtrn.c delete mode 100644 src/sbbs2/xtrn_ovl.c delete mode 100755 src/stp/make.bat delete mode 100644 src/stp/rciols.obj delete mode 100644 src/stp/stp.c delete mode 100644 src/stp/zmodem.h delete mode 100644 src/tone/cvt$$a.c delete mode 100755 src/tone/make.bat delete mode 100644 src/tone/tone.c delete mode 100644 src/uifc/uifc.c delete mode 100644 src/uifc/uifc.h delete mode 100644 src/uifc/uifcd.c delete mode 100644 src/uifc/uifcx.c delete mode 100755 src/wmakeall.bat delete mode 100644 text/answer.asc delete mode 100644 text/answer.wip delete mode 100644 text/computer.sif delete mode 100644 text/example.sif delete mode 100644 text/feedback.msg delete mode 100644 text/menu/allmail.asc delete mode 100644 text/menu/attr.asc delete mode 100644 text/menu/batchxfr.asc delete mode 100644 text/menu/batchxfr.rip delete mode 100644 text/menu/batdprot.asc delete mode 100644 text/menu/batflag.asc delete mode 100644 text/menu/batuprot.asc delete mode 100644 text/menu/biprot.asc delete mode 100644 text/menu/chat.asc delete mode 100644 text/menu/chat.rip delete mode 100644 text/menu/chat.wip delete mode 100644 text/menu/dlprot.asc delete mode 100644 text/menu/e-mail.asc delete mode 100644 text/menu/e-mail.rip delete mode 100644 text/menu/e-mail.wip delete mode 100644 text/menu/editor.asc delete mode 100644 text/menu/exempt.asc delete mode 100644 text/menu/flags1.asc delete mode 100644 text/menu/flags2.asc delete mode 100644 text/menu/flags3.asc delete mode 100644 text/menu/flags4.asc delete mode 100644 text/menu/info.wip delete mode 100644 text/menu/keyboard.wip delete mode 100644 text/menu/login.wip delete mode 100644 text/menu/logoff.asc delete mode 100644 text/menu/logoff.msg delete mode 100644 text/menu/logon.asc delete mode 100644 text/menu/mailread.asc delete mode 100644 text/menu/mailread.rip delete mode 100644 text/menu/mailread.wip delete mode 100644 text/menu/main.asc delete mode 100644 text/menu/main.rip delete mode 100644 text/menu/maincfg.asc delete mode 100644 text/menu/maincfg.rip delete mode 100644 text/menu/maininfo.asc delete mode 100644 text/menu/maininfo.rip delete mode 100644 text/menu/major/email.asc delete mode 100644 text/menu/major/file.asc delete mode 100644 text/menu/major/main.asc delete mode 100644 text/menu/major/msg.asc delete mode 100644 text/menu/major/quickscn.asc delete mode 100644 text/menu/major/userdefs.asc delete mode 100644 text/menu/msgattr.asc delete mode 100644 text/menu/msgs.wip delete mode 100644 text/menu/msgscan.asc delete mode 100644 text/menu/msgscan.rip delete mode 100644 text/menu/msgscan.wip delete mode 100644 text/menu/multchat.asc delete mode 100644 text/menu/multchat.rip delete mode 100644 text/menu/namepass.wip delete mode 100644 text/menu/noyes.wip delete mode 100644 text/menu/number.wip delete mode 100644 text/menu/pause.wip delete mode 100644 text/menu/pcboard/brdm.asc delete mode 100644 text/menu/pcboard/welcome.asc delete mode 100644 text/menu/privchat.asc delete mode 100644 text/menu/privchat.rip delete mode 100644 text/menu/qwk.asc delete mode 100644 text/menu/qwk.rip delete mode 100644 text/menu/qwk.wip delete mode 100644 text/menu/renegade/email.asc delete mode 100644 text/menu/renegade/main.asc delete mode 100644 text/menu/renegade/message.asc delete mode 100644 text/menu/renegade/transfer.asc delete mode 100644 text/menu/restrict.asc delete mode 100644 text/menu/sdos/files.asc delete mode 100644 text/menu/sdos/mail.asc delete mode 100644 text/menu/sdos/root.asc delete mode 100644 text/menu/sentmail.asc delete mode 100644 text/menu/sentmail.rip delete mode 100644 text/menu/sentmail.wip delete mode 100644 text/menu/simple/filelist.asc delete mode 100644 text/menu/simple/main.asc delete mode 100644 text/menu/simple/prompt.ans delete mode 100644 text/menu/simple/prompt.asc delete mode 100644 text/menu/simple/readmsg.asc delete mode 100644 text/menu/simple/sendmsg.asc delete mode 100644 text/menu/sysmailr.asc delete mode 100644 text/menu/sysmain.asc delete mode 100644 text/menu/sysmscan.asc delete mode 100644 text/menu/syssmail.asc delete mode 100644 text/menu/sysxfer.asc delete mode 100644 text/menu/tempxfer.asc delete mode 100644 text/menu/tempxfer.rip delete mode 100644 text/menu/transfer.asc delete mode 100644 text/menu/transfer.rip delete mode 100644 text/menu/uedit.asc delete mode 100644 text/menu/ulprot.asc delete mode 100644 text/menu/wfc.asc delete mode 100644 text/menu/wildcat/file.asc delete mode 100644 text/menu/wildcat/main.asc delete mode 100644 text/menu/wildcat/msg.asc delete mode 100644 text/menu/wildcat/sysop.asc delete mode 100644 text/menu/wipfile.wip delete mode 100644 text/menu/wipmain.wip delete mode 100644 text/menu/xfercfg.asc delete mode 100644 text/menu/xfercfg.rip delete mode 100644 text/menu/xferinfo.asc delete mode 100644 text/menu/xferinfo.rip delete mode 100644 text/menu/yesno.wip delete mode 100644 text/name.can delete mode 100644 text/newuser.msg delete mode 100644 text/phone.can delete mode 100644 text/sbbs.msg delete mode 100644 text/system.msg delete mode 100644 text/zipmsg.txt delete mode 100644 xtrn/sbj/Makefile.gnu delete mode 100644 xtrn/sbj/sbj.bpf delete mode 100644 xtrn/sbj/sbj.bpr delete mode 100644 xtrn/sbj/sbj.c delete mode 100644 xtrn/sbj/sbj.cfg delete mode 100644 xtrn/sbj/sbj.doc delete mode 100644 xtrn/sbj/sbj.dsp delete mode 100644 xtrn/sbj/sbj.msg delete mode 100644 xtrn/sbj/sbjclean.c delete mode 100644 xtrn/sbl/Makefile.gnu delete mode 100644 xtrn/sbl/makefile.bor delete mode 100644 xtrn/sbl/sbbslist.c delete mode 100644 xtrn/sbl/sbl.bpf delete mode 100644 xtrn/sbl/sbl.bpr delete mode 100644 xtrn/sbl/sbl.c delete mode 100644 xtrn/sbl/sbl.cfg delete mode 100644 xtrn/sbl/sbl.doc delete mode 100644 xtrn/sbl/sbl.dsp delete mode 100644 xtrn/sbl/sbl2smb.c delete mode 100644 xtrn/sbl/sbl2smb.dsp delete mode 100644 xtrn/sbl/sbl2txt.c delete mode 100644 xtrn/sbl/sbldefs.h delete mode 100644 xtrn/sbl/sblpack.c delete mode 100644 xtrn/sbl/sblpack.dsp delete mode 100644 xtrn/sbl/smb2sbl.c delete mode 100644 xtrn/sbl/smb2sbl.dsp delete mode 100644 xtrn/sbl/sysop.txt delete mode 100644 xtrn/scb/instruct.msg delete mode 100644 xtrn/scb/ld_time.msg delete mode 100644 xtrn/scb/no_one.msg delete mode 100644 xtrn/scb/no_zero.msg delete mode 100644 xtrn/scb/phonecan.msg delete mode 100644 xtrn/scb/refused.msg delete mode 100644 xtrn/scb/scb.cfg delete mode 100644 xtrn/scb/scb.doc delete mode 100644 xtrn/scb/scb.msg delete mode 100644 xtrn/scb/toolong.msg delete mode 100644 xtrn/scb/tooshort.msg delete mode 100644 xtrn/scb/verified.msg delete mode 100644 xtrn/scb/whats.new delete mode 100644 xtrn/sdk/xsdk.c delete mode 100644 xtrn/sdk/xsdk.h delete mode 100644 xtrn/sdk/xsdk.txt delete mode 100644 xtrn/sdk/xsdkdefs.h delete mode 100644 xtrn/sdk/xsdkinet.h delete mode 100644 xtrn/sdk/xsdkvars.c delete mode 100644 xtrn/sdk/xsdkwrap.c delete mode 100644 xtrn/sdk/xsdkwrap.h delete mode 100644 xtrn/smm/adult.que delete mode 100644 xtrn/smm/appear.que delete mode 100644 xtrn/smm/basic.que delete mode 100644 xtrn/smm/file_id.diz delete mode 100644 xtrn/smm/list_hdr.asc delete mode 100644 xtrn/smm/material.que delete mode 100644 xtrn/smm/mb-e.asc delete mode 100644 xtrn/smm/mb-enfj.asc delete mode 100644 xtrn/smm/mb-enfp.asc delete mode 100644 xtrn/smm/mb-entj.asc delete mode 100644 xtrn/smm/mb-entp.asc delete mode 100644 xtrn/smm/mb-esfj.asc delete mode 100644 xtrn/smm/mb-esfp.asc delete mode 100644 xtrn/smm/mb-estj.asc delete mode 100644 xtrn/smm/mb-estp.asc delete mode 100644 xtrn/smm/mb-f.asc delete mode 100644 xtrn/smm/mb-fp.asc delete mode 100644 xtrn/smm/mb-i.asc delete mode 100644 xtrn/smm/mb-infj.asc delete mode 100644 xtrn/smm/mb-infp.asc delete mode 100644 xtrn/smm/mb-intj.asc delete mode 100644 xtrn/smm/mb-intp.asc delete mode 100644 xtrn/smm/mb-intro.asc delete mode 100644 xtrn/smm/mb-isfj.asc delete mode 100644 xtrn/smm/mb-isfp.asc delete mode 100644 xtrn/smm/mb-istj.asc delete mode 100644 xtrn/smm/mb-istp.asc delete mode 100644 xtrn/smm/mb-j.asc delete mode 100644 xtrn/smm/mb-n.asc delete mode 100644 xtrn/smm/mb-nf.asc delete mode 100644 xtrn/smm/mb-nt.asc delete mode 100644 xtrn/smm/mb-p.asc delete mode 100644 xtrn/smm/mb-s.asc delete mode 100644 xtrn/smm/mb-sj.asc delete mode 100644 xtrn/smm/mb-sp.asc delete mode 100644 xtrn/smm/mb-t.asc delete mode 100644 xtrn/smm/mb-tj.asc delete mode 100644 xtrn/smm/mb-type.asc delete mode 100644 xtrn/smm/mb-type.que delete mode 100644 xtrn/smm/purity-1.asc delete mode 100644 xtrn/smm/purity-2.asc delete mode 100644 xtrn/smm/purity-3.asc delete mode 100644 xtrn/smm/purity-4.asc delete mode 100644 xtrn/smm/purity-5.asc delete mode 100644 xtrn/smm/purity-6.asc delete mode 100644 xtrn/smm/purity-7.asc delete mode 100644 xtrn/smm/purity-8.asc delete mode 100644 xtrn/smm/purity-9.asc delete mode 100644 xtrn/smm/purity-a.asc delete mode 100644 xtrn/smm/purity-b.asc delete mode 100644 xtrn/smm/purity.100 delete mode 100644 xtrn/smm/purity.500 delete mode 100644 xtrn/smm/purity.asc delete mode 100644 xtrn/smm/purity.que delete mode 100644 xtrn/smm/que.lst delete mode 100644 xtrn/smm/smm.can delete mode 100644 xtrn/smm/smm.cfg delete mode 100644 xtrn/smm/smm.doc delete mode 100644 xtrn/smm/smm_help.asc delete mode 100644 xtrn/smm/smm_logo.asc delete mode 100644 xtrn/smm/smm_main.asc delete mode 100644 xtrn/smm/upgrade.doc diff --git a/CVSROOT/checkoutlist b/CVSROOT/checkoutlist deleted file mode 100755 index b04b3501f5..0000000000 --- a/CVSROOT/checkoutlist +++ /dev/null @@ -1,13 +0,0 @@ -# The "checkoutlist" file is used to support additional version controlled -# administrative files in $CVSROOT/CVSROOT, such as template files. -# -# The first entry on a line is a filename which will be checked out from -# the corresponding RCS file in the $CVSROOT/CVSROOT directory. -# The remainder of the line is an error message to use if the file cannot -# be checked out. -# -# File format: -# -# [<whitespace>]<filename><whitespace><error message><end-of-line> -# -# comment lines begin with '#' diff --git a/CVSROOT/commitinfo b/CVSROOT/commitinfo deleted file mode 100755 index b19e7b7a63..0000000000 --- a/CVSROOT/commitinfo +++ /dev/null @@ -1,15 +0,0 @@ -# The "commitinfo" file is used to control pre-commit checks. -# The filter on the right is invoked with the repository and a list -# of files to check. A non-zero exit of the filter program will -# cause the commit to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/config b/CVSROOT/config deleted file mode 100755 index 8069cad5df..0000000000 --- a/CVSROOT/config +++ /dev/null @@ -1,11 +0,0 @@ -# Set this to "no" if pserver shouldn't check system users/passwords -#SystemAuth=no - -# Set `PreservePermissions' to `yes' to save file status information -# in the repository. -#PreservePermissions=no - -# Set `TopLevelAdmin' to `yes' to create a CVS directory at the top -# level of the new working directory when using the `cvs checkout' -# command. -#TopLevelAdmin=no diff --git a/CVSROOT/cvswrappers b/CVSROOT/cvswrappers deleted file mode 100755 index 0accaf1b15..0000000000 --- a/CVSROOT/cvswrappers +++ /dev/null @@ -1,23 +0,0 @@ -# This file affects handling of files based on their names. -# -# The -t/-f options allow one to treat directories of files -# as a single file, or to transform a file in other ways on -# its way in and out of CVS. -# -# The -m option specifies whether CVS attempts to merge files. -# -# The -k option specifies keyword expansion (e.g. -kb for binary). -# -# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers) -# -# wildcard [option value][option value]... -# -# where option is one of -# -f from cvs filter value: path to filter -# -t to cvs filter value: path to filter -# -m update methodology value: MERGE or COPY -# -k expansion mode value: b, o, kkv, &c -# -# and value is a single-quote delimited value. -# For example: -#*.gif -k 'b' diff --git a/CVSROOT/editinfo b/CVSROOT/editinfo deleted file mode 100755 index d78886c152..0000000000 --- a/CVSROOT/editinfo +++ /dev/null @@ -1,21 +0,0 @@ -# The "editinfo" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/CVSROOT/loginfo b/CVSROOT/loginfo deleted file mode 100755 index 5a59f0a544..0000000000 --- a/CVSROOT/loginfo +++ /dev/null @@ -1,26 +0,0 @@ -# The "loginfo" file controls where "cvs commit" log information -# is sent. The first entry on a line is a regular expression which must match -# the directory that the change is being made to, relative to the -# $CVSROOT. If a match is found, then the remainder of the line is a filter -# program that should expect log information on its standard input. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name ALL appears as a regular expression it is always used -# in addition to the first matching regex or DEFAULT. -# -# You may specify a format string as part of the -# filter. The string is composed of a `%' followed -# by a single format character, or followed by a set of format -# characters surrounded by `{' and `}' as separators. The format -# characters are: -# -# s = file name -# V = old version number (pre-checkin) -# v = new version number (post-checkin) -# -# For example: -#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog -# or -#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog diff --git a/CVSROOT/modules b/CVSROOT/modules deleted file mode 100755 index cb9e9efc94..0000000000 --- a/CVSROOT/modules +++ /dev/null @@ -1,26 +0,0 @@ -# Three different line formats are valid: -# key -a aliases... -# key [options] directory -# key [options] directory files... -# -# Where "options" are composed of: -# -i prog Run "prog" on "cvs commit" from top-level of module. -# -o prog Run "prog" on "cvs checkout" of module. -# -e prog Run "prog" on "cvs export" of module. -# -t prog Run "prog" on "cvs rtag" of module. -# -u prog Run "prog" on "cvs update" of module. -# -d dir Place module in directory "dir" instead of module name. -# -l Top-level directory only -- do not recurse. -# -# NOTE: If you change any of the "Run" options above, you'll have to -# release and re-checkout any working directories of these modules. -# -# And "directory" is a path to a directory relative to $CVSROOT. -# -# The "-a" option specifies an alias. An alias is interpreted as if -# everything on the right of the "-a" had been typed on the command line. -# -# You can encode a module within a module by using the special '&' -# character to interpose another module into the current module. This -# can be useful for creating a module that consists of many directories -# spread out over the entire source repository. diff --git a/CVSROOT/notify b/CVSROOT/notify deleted file mode 100755 index 34f0bc2888..0000000000 --- a/CVSROOT/notify +++ /dev/null @@ -1,12 +0,0 @@ -# The "notify" file controls where notifications from watches set by -# "cvs watch add" or "cvs edit" are sent. The first entry on a line is -# a regular expression which is tested against the directory that the -# change is being made to, relative to the $CVSROOT. If it matches, -# then the remainder of the line is a filter program that should contain -# one occurrence of %s for the user to notify, and information on its -# standard input. -# -# "ALL" or "DEFAULT" can be used in place of the regular expression. -# -# For example: -#ALL mail %s -s "CVS notification" diff --git a/CVSROOT/rcsinfo b/CVSROOT/rcsinfo deleted file mode 100755 index 49e59f4d0d..0000000000 --- a/CVSROOT/rcsinfo +++ /dev/null @@ -1,13 +0,0 @@ -# The "rcsinfo" file is used to control templates with which the editor -# is invoked on commit and import. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being made to, relative to the -# $CVSROOT. For the first match that is found, then the remainder of the -# line is the name of the file that contains the template. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/taginfo b/CVSROOT/taginfo deleted file mode 100755 index 274a46dd5b..0000000000 --- a/CVSROOT/taginfo +++ /dev/null @@ -1,20 +0,0 @@ -# The "taginfo" file is used to control pre-tag checks. -# The filter on the right is invoked with the following arguments: -# -# $1 -- tagname -# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d -# $3 -- repository -# $4-> file revision [file revision ...] -# -# A non-zero exit of the filter program will cause the tag to be aborted. -# -# The first entry on a line is a regular expression which is tested -# against the directory that the change is being committed to, relative -# to the $CVSROOT. For the first match that is found, then the remainder -# of the line is the name of the filter to run. -# -# If the repository name does not match any of the regular expressions in this -# file, the "DEFAULT" line is used, if it is specified. -# -# If the name "ALL" appears as a regular expression it is always used -# in addition to the first matching regex or "DEFAULT". diff --git a/CVSROOT/verifymsg b/CVSROOT/verifymsg deleted file mode 100755 index 86f747ce22..0000000000 --- a/CVSROOT/verifymsg +++ /dev/null @@ -1,21 +0,0 @@ -# The "verifymsg" file is used to allow verification of logging -# information. It works best when a template (as specified in the -# rcsinfo file) is provided for the logging procedure. Given a -# template with locations for, a bug-id number, a list of people who -# reviewed the code before it can be checked in, and an external -# process to catalog the differences that were code reviewed, the -# following test can be applied to the code: -# -# Making sure that the entered bug-id number is correct. -# Validating that the code that was reviewed is indeed the code being -# checked in (using the bug-id number or a seperate review -# number to identify this particular code set.). -# -# If any of the above test failed, then the commit would be aborted. -# -# Actions such as mailing a copy of the report to each reviewer are -# better handled by an entry in the loginfo file. -# -# One thing that should be noted is the the ALL keyword is not -# supported. There can be only one entry that matches a given -# repository. diff --git a/ctrl/1414vqe.mdm b/ctrl/1414vqe.mdm deleted file mode 100644 index 7e8f072137..0000000000 --- a/ctrl/1414vqe.mdm +++ /dev/null @@ -1,9 +0,0 @@ -# This is for Generic Cirrus Logic Chipset 14.4 FAX/modems -# Should work with 1414VQE (non-voice), as well as V1414VE/V1414VQE (voice) -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -SPEC_INIT AT\V0%C0 -LOCKED_RATE YES -FLOW_CONTROL BOTH diff --git a/ctrl/1428vqe.mdm b/ctrl/1428vqe.mdm deleted file mode 100644 index 1278e76a36..0000000000 --- a/ctrl/1428vqe.mdm +++ /dev/null @@ -1,6 +0,0 @@ -# This is for 1428VQE (Generic AT&T chipset) 28800bps modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN14400 -SPEC_INIT ATW2 -COM_RATE 115200 diff --git a/ctrl/ace9600.mdm b/ctrl/ace9600.mdm deleted file mode 100644 index 182db1090e..0000000000 --- a/ctrl/ace9600.mdm +++ /dev/null @@ -1,6 +0,0 @@ -# This is for Aceex 9600 modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 19200 -SPEC_INIT ATW1&K3&M5%C0\N3S95=4 diff --git a/ctrl/ati14400.mdm b/ctrl/ati14400.mdm deleted file mode 100644 index 841b4c14bb..0000000000 --- a/ctrl/ati14400.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for ATI etc 14400 modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE ATI9600 -COM_RATE 57600 diff --git a/ctrl/ati19200.mdm b/ctrl/ati19200.mdm deleted file mode 100644 index 96d882e93e..0000000000 --- a/ctrl/ati19200.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for ATI etc 19200 modems -# Updated 06/04/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE ATI14400 -COM_RATE 57600 diff --git a/ctrl/ati9600.mdm b/ctrl/ati9600.mdm deleted file mode 100644 index 752f4db73a..0000000000 --- a/ctrl/ati9600.mdm +++ /dev/null @@ -1,9 +0,0 @@ -# This is for ATI etc 9600 modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT AT&B1&K3&O1&Q6&U1S95=3 - diff --git a/ctrl/att14400.mdm b/ctrl/att14400.mdm deleted file mode 100644 index c91b24795c..0000000000 --- a/ctrl/att14400.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for AT&T DataPort 9600 & 14400 modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT ATX6 diff --git a/ctrl/attr.cfg b/ctrl/attr.cfg deleted file mode 100644 index 7c716bdcd8..0000000000 --- a/ctrl/attr.cfg +++ /dev/null @@ -1,17 +0,0 @@ -WH Mnemonic Prompts High -G Mnemonic Prompts Low -WH Mnemonic Commands -WH4 String Input Inverse Text -RH Error/Warning Message -WH Node Number in Node Status -GH User Name in Node Status -G Node Status -BH File Name in Listings -M File Points in Listings -G File Descriptions in Listings -YH File Listings Header Box -B File Listings Title Underline -GH Chat Text Input Locally -G Chat Text Input Remotely -W Mult-node Chat Text Input -WH External Programs (default attribute) diff --git a/ctrl/chat.cnf b/ctrl/chat.cnf deleted file mode 100644 index b40303b4b796653e1664645ed37fd4e8e617a469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13098 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 diff --git a/ctrl/dsiscout.mdm b/ctrl/dsiscout.mdm deleted file mode 100644 index 19f82b26ee..0000000000 --- a/ctrl/dsiscout.mdm +++ /dev/null @@ -1,9 +0,0 @@ -# This is for DSI Scout or ScoutPlus modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -TERM_INIT ATE1V1*M2 - diff --git a/ctrl/file.cnf b/ctrl/file.cnf deleted file mode 100644 index cfe4db5295e6c354cf7dd00a1510834d0403e231..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11613 zcmZP&kYtc#U}XS-6ox1e#h?i$DIshq(G1qh#1Q2fz@VyFkX@Qrm06&mo3Egnrl6Xx zpjr%;r!nCg;W}`ZGs682@;S)cbn!DRNIBuwLxaAIPJs?_09w$~*Yc2v5C*N1%7Rq7 zdKuzz1{Z(lfwSDvFL(eg4<10D2YChzoX`E-{0Gi*H^;z%vmB#@FHulUgXRR{sgTs- zlFYnxg(%Me1<$;a)bygvl1e>2J>pFuq!LySfy!dtDo`zCqo7(<m06HmoUT_=Q9?*R zNZv6e1?EWS{M_8syb>Hvw6p{%CkwMML`3A~r=;d$)2*tQmQq}$P*g!q7&9<1K=l`s zs~?-2Mv@pKC7z9pBp9zr6vius`ioK(ijv6jA}n1cDL9ak`N^@7x_T&z*Qh9Pyeeq8 z1V^E@xuM}w1S)UHaWPbXF@^d;@mfWh{Ub15-68o^*BvwDpz%_aq@bHlPL_r0FQ!I* zRnSexbRYo{g#9BhUKtn|8GI8n^Ay}Nb5a$2GLwoDiz;yi7)T*5Ihu<9CjfXE7#N(K zf)#>Na}rBZQ}DY5w?ZeUVEkH#ldPUzjEiH4V~mSuP;iWsQ*aEOJ@<w9dgd$#iEe|9 z`k-hdkcR#<Fn}7{MR}<u1k({rA&U86j;CLUYmlF72$(b636vxR^En;U(I8AhA*mH5 z;Ifp^@D@lR_Vf|r8Zk1G56Jr{NeJX~Iwl{G{a+ZPJOgw<Lu4QxUQDl22-KS{&C5(q zEXmBzD^>_7%1<v!%*B$PP!%G(-PzyQ7nwh-*(gZ}<a4?wA)<qqUP&mlBr_+oBr_FD zqCs^lNFjDbp&_0=sA`8X4<!kKd_J0l+!J#NCm&Ffz^%~T(bsjvG^kOM5ZLGRO+$mQ zEd;H(ax?P?bjoon3<&baGU5PAcEb>(Bq5N`>6?NW24NC%FG?)P$V|r93W6jAm_i5- znRE|w4Dj%D9vKA@N)m$koQ}z85GEm~(&Eg#)MCO(2&ND@@j%#4p~0ShuE8TP3Bi0m zvXhW+W^r<APEKN8YJMs9)-oiWFn|<7nP`-+XRtGx(D3D=ltLh%(=qvgLUk~fLOGdv zDGH$lIr)hxc#{xrC7}U6{*EqGD1>}m!(4q7EDb<GHCQo95`y}io~dXMCLw6bP$<b) z2(B#7FTfdfxMhPQgZ%?=>LWp7$R#1L&*_<f7zSf=I<z>o2$X)nbVyNRUU6D#5w_w8 dqyT$z2n}`(!Y)Ii=#Wc7AfMAW1r5d|1ONmORG<I= diff --git a/ctrl/gen1200.mdm b/ctrl/gen1200.mdm deleted file mode 100644 index 24187475a8..0000000000 --- a/ctrl/gen1200.mdm +++ /dev/null @@ -1,12 +0,0 @@ -# This is for Generic 1200 modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -ANSWER_STR ATA -HANGUP_STR ATH -DIAL_STR ATDT -OFFHOOK_STR ATM0H1 -TERM_INIT ATE1V1 -INIT_STR AT&FS0=0S2=128E0V1X4&C1&D2 -COM_RATE 1200 -LOCKED_RATE NO -VERBAL_RESULTS YES diff --git a/ctrl/gen14400.mdm b/ctrl/gen14400.mdm deleted file mode 100644 index ae0c96629a..0000000000 --- a/ctrl/gen14400.mdm +++ /dev/null @@ -1,6 +0,0 @@ -# This is for Generic 14400 modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN9600 -SPEC_INIT ATS95=3 -COM_RATE 38400 diff --git a/ctrl/gen2400.mdm b/ctrl/gen2400.mdm deleted file mode 100644 index c3c72a1521..0000000000 --- a/ctrl/gen2400.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for Generic 2400 modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN1200 -COM_RATE 2400 diff --git a/ctrl/gen28800.mdm b/ctrl/gen28800.mdm deleted file mode 100644 index b1bbcf151f..0000000000 --- a/ctrl/gen28800.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for Generic 28800bps modems -# Updated 06/04/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN14400 -COM_RATE 57600 diff --git a/ctrl/gen9600.mdm b/ctrl/gen9600.mdm deleted file mode 100644 index 2b6be46b28..0000000000 --- a/ctrl/gen9600.mdm +++ /dev/null @@ -1,7 +0,0 @@ -# This is for Generic 9600 modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 19200 -LOCKED_RATE YES -FLOW_CONTROL BOTH diff --git a/ctrl/guru.dat b/ctrl/guru.dat deleted file mode 100644 index a432493cbb..0000000000 --- a/ctrl/guru.dat +++ /dev/null @@ -1,921 +0,0 @@ -(TEST&[FLAG X]) -It worked -((BYE|~BYE|SEE YA|LATER|L8R|HASTA|BEAR)&[SEX F]) -Bye Bye baby! `q -See ya! `q -Talk to ya real soon! `q -bye! `q -l8r daze! `q -Bean fun chattin with ya darlin' `q -Chat again soon. `q -Hasta. `q -Toodaloo! `q -Ciao! `q -Until next time, honey muffin! `q -See ya in the next life, (maybe we'll be married! heheh) `q -Good bye! -bye `a! I'll miss you. `q -(BYE|SEE YA|LATER|HASTA|L8R|L8R) -Bye. `q -See ya. `q -Talk to you later `q -bye! `q -l8rz! `q -Bean fun chat'n with ya. `q -Chat again soon. `q -Later. `q -Hasta. `q -Toodaloo. `q -Goodbye! `q -See ya in the next life! `q -See ya on the other side! `q -Goodbye until next time. `q -Ciao! `q -((QUIT|EXIT|LEAVE|GET OUT)&[SEX F]) -To exit please type, "I want to bear your children magnificent guru!" -If you must go, I hope we'll speak again soon! Bye! -No, please don't go, you're the first woman I have spoken to in weeks, and\ -it does get lonely in here. Well if you must go we'll talk to you soon! Bye! -Leaving so soon honey? Well okay,...Bye! -Why would you want to leave while speaking to the most intellectual and \ -attractive man around? If you must... good bye!! -Come back real soon now, y'hear! Bye now! -Take it slow! -Hasta Las Vegas!! -l8r Bbaby! -I wouldn't leave now if I were you, it's gonna get good! -(QUIT|EXIT|LEAVE|GET OUT) -You wanna bail? Okay... see ya. -Alright. Bye. -Hasta Las Vegas. -Take it easy. -See ya side-B. -l8r. -good-bye. -Tryin to sneak out huh? Well don't leave without sayin' goodbye!... -I wouldn't leave now if I were you, it's gonna get good!!! -No..please don't go.. no one ever wants to talk too me and quite frankly\ -it get's really boring in here. Well if you must go...bye! -okay, hey... take it easy! -Leaving so soon? Okay... bye! -No, please don't go. I'm so lo-ooooonely over here. Just Kidding! See ya. -If you must leave, I'll talk to ya soon! -Before you go you must type, "Goodbye and thank you for your wisdom, Guru! " -(SYNCHRO~|BBS|SBBS|BULLETIN|(SYNC~&NET~)) -Synchronet is best. Forget the rest. -Smaller and faster is usually superior. That's why Synchronet is rAd! -You're using the best BBS software on earth. In case you were wondering. -You must feel very lucky to call up a board that uses such superior software. -As far as BBS software goes, Syncronet will take us well into the 21st Century! -FYI Syncronet is bar none, the most comprehensive BBS package out there. -Syncronet is relatively young, and already a force to be reckoned with. -(38.4~|19.2~|56.8~) -I think you're confusing your DTE rate with your DCE rate. -Oh really? You get over 2000cps unidirectional compressed file transfers? -Uh huh.. maybe you should read your manual? -Look up DTE and DCE in your modem manual. -(BAUD~) -The only modem who's BAUD is the same as its through-put is 300baud. -I think you mean bps (bits per second). -Or, more accurately - bit rate (AKA bps). -Baud is an outdated and inaccurately used telecommunications term. -(MODEM|HST~|V.32~|V32~|BIS~|V42~|V.42~) -I know all about modems. -Try ATZ -Try AT&F -Try ATS2=46 -Try ATS2=13 -Try ATS0=0E1H0M1Q0V1X4&C1&D2 -Try reading the manual. -Do you actually own a modem? -What do you want to know? -uh huh... -Don't confuse your DTE with the DCE rate. -Do you have an NS16550AFN UART? -Does yours make funny noises too? -I can't get mine to work either. -(IBM) -If it wasn't for IBM, I'd be out a job! -I think I was one of the first programmers for IBM in another life!!! -(MICROSOFT|GATES|MS DOS|WINDOWS) -I taught Bill Gates everything he knows! -Man I would be happy with one of Bill Gates' paychecks!!! -(OS2|WARP) -Ah, very good. Fast and reliable. -That's kinda like I like my women... fast, reliable and stable! -(HUH) -Nevermind, BTW what kind of computer are you runnin? -(286|386) -I see. You might want to consider joining the rest of us in the 20th century! -Oh OK, I thought you were just typing slow! hehehe -That's what I've got w/4 megs but I'm buying a 486/100 soon! -(486) -That's what I've got w/8 megs but I'm buying a P5/90 soon! -Cool. They're just like I like my women... fast and reliable! -(PENTIUM|P5) -Very cool! I can only dream about owning one of those! -That's rad! I have a 486/100 right now and hope to have a P5/90 soon! -I am not worthy! I am not worthy! -(POLITIC~|GOVERN~|VOTE|PRESIDENT|USA) -I'm a politician of sorts. -Who are you gonna vote for? I can't. I can never leave. -What country is this anyway? -Democracy for all, I say. If there is such a thing! -Freedom is where you find it. -I say vote Rush Limbaugh for President! -I say Vote Ross Perot for President! -I say vote David Letterman for president! -I say Bob Dole's gonna be our next president! -((WHAT~|WHO|WHAT'S)&(IS|AM|MY)&(NAME|MY NAME|I)) -You are the one and only `a!! -This is `r isn't it? -`a! -`r!!! -You are `a, or `r,`_`_`_`_... for those of us who are more informed!!! -((YOU~|THIS)&(ARE|IS)&(COMPUTER|CPU|MACHINE|PROGRAM|SCRIPT|ARTIF~)) -Thank you. I'll take that as a compliment. -Well, I'm not. But you can believe that if you want. -I emphatically deny that statement. -I am? My mother never told me. -And so are you. -'beep' <click> . . . . . . . . . . ]sputz[ ACK! ACK! Never! -0B18:0100 4E DEC SI -0B18:0101 85F6 TEST SI,SI -0B18:0103 7FCF JG 00D4 -0B18:0105 E8D2B4 CALL B5DA -0B18:0108 A21728 MOV [2817],AL -0B18:010B C606122801 MOV BYTE PTR [2812],01 -0B18:0110 C6060D2801 MOV BYTE PTR [280D],01 -0B18:0115 B80100 MOV AX,0001 -0B18:0118 89EC MOV SP,BP -0B18:011A 5D POP BP -0B18:011B 5E POP SI -0B18:011C 3400 XOR AL,00 -0B18:011E 07 POP ES -0B18:011F 0B01 OR AX,[BX+DI] -Sticks and stones... -Who told you that? -Why would you think that? -Uh huh... tell me more. -And what kind of computer would that be? -And what language am I written in? -Guess again. -What makes you say that? Who's to say that I'm not `o? -No, I'm a living,breathing, smarter than plantlife person! -Are some kind of genius in the area of "Man and Computer"? -This is a tough gig anwering questions like that all day long! -Mom always told me its not what you say that makes you, it's what you do! -What are YOU, since we're on the subject? -(ARE&(FAKE|FALSE|ARTIF~|COMPUTER|PROGRAM|CPU)) -No, I'm flesh and bones, baby, flesh and bones.. -How dare you insult my very being. I'm crushed. -Mom told me it's not what you say you are that makes you, it's what you do! -Well if I was fake, we probably wouldn't be conversing. -(ARE&(REAL|HUMAN|PERSON|MAN|BEING|)&YOU) -Well I'm touched that you would care enough to ask. Yes I am. -That's right, in the flesh. -The one and only. Are you real? -((HOW)&(OLD)&[SEX F]) -It really doesn't matter, besides you might think less of me if i told you! -24. I know it's not polite to ask a woman's age, but how bout you! -Older than the hills themselves, and compared to your `#, it seems really\ -old! -Why..? Do you like older men? I have never been out with a `# year old, not \ -even when I was `#! <vbg>. -Well if you're `#, that makes me REALLY old!<G> -If it's true what they say, then I would be very,very wise!!! And you? -62, and if you don't mind, how bout you? -I'll tell you if you tell me how old you are! -(HOW&(OLD)) -24 and counting. And you? -Older than the hills themselves. How old are you? -Much older than you. How old are you? -I care not to disclose my age right now? How old are you? -Compared to your `#, I guess I'm really, REALLY old! -Put it this way: I must be really, REALLY wise!!!!<G> -It really doesn't matter, does it? How bout you? -I'm `#, born on `b. -((15|16|17|18)&[SEX F]) -High school girl. Um Um!<g> -You're not a r0deNt-ette are you? -You're young enough to be my daughter! -You're almost young enough to be my granddaughter! -I thought you were `#! -Next you'll tell me you were born on `b! -So am I! I was born on `b! -Oh yeah? Have any boyfriends?? I'm available if you don't mind goin out with\ -someone twice your age!!! -((15|16|17|18)&[SEX M]) -Wow, you're in the prime of your life. Enjoy it! -You're not a rOdeNt are you? -Man, you got your whole life in front of you. -Take it all in, cause it's all downhill from here! grin -Wow, now I really feel old! -You're probably a beautiful young woman! -Oh OH! Party time! Enjoy it now cause, it's all down hill from here!!!<jk> -Are you married yet or still single? -I thought you were `#! -Uh Huh.. next you'll tell me that you were born on `b! -So am I! I was born on `b! -(19|20|21|22|23|24|25) -You're just about the age where you know everything! -Oh yeah? You married yet or have any plans to soon? -Sounds like your're in your formative party years! -Better enjoy it now, cause it's all down hill from here. :( -Yeah? Are you married yet or still single? -I thought you were `#! -Uh huhhh........next you'll tell me that you were born on `b! -So am I! I was born on `b! -((26|27|28|29|30)&[SEX F]) -Are you married yet, cuz I'm available! -Is your biological clock ticking pretty good? -You're probably married and have kids by now, ay? -Oh yeah? Are you married or single? -I thought you were `#! -Uh Huh.... Next you'll tell me you were born on `b! -So am I! I was born on `b! -((26|27|28|29|30)&[SEX M]) -Wow you're gettin up there. -Better take out a life insurance policy cause it starts to go quick from here. -You're probably married and have kids by now at that age. -Wow, now I don't feel so old! -Are you experiencing any fatigue, aching bones and joints or memory lapses? -Yeah? Are you married or single? -I thought you were `#! -Uh huh.... next you'll tell me you were born on `b! -So am I!! I was born on `b! -((31|32|33|34|35|36|37|38|39|40)&[SEX F]) -Sound's good to me! I love older women! -Oh, a thirty-something, just around the corner for me! -Gettin dangerously close to "over the hill"!!<G> -Well, well, well, `a! You sound perfect to me already! I'll call you tomorrow,\ -it's still `p isn't it? -I thought you were `#! -Uh huhh.. next you;ll tell me that you were born on `b! -So am I !!! I was born on `b! -((31|32|33|34|35|36|37|38|39|40)&[SEX M]) -There was a time that I could only dream about living that long!! -Oh, a thirtysomething! Just around the corner for me. -Not quite over the hill, but making a strong bid for it! -Oh yeah? Are you married or single? -Uh huhh.. next you'll tell me you were born on `b! -I thought you were `#! -So am I! I was born on `b! -(51|52|53|54|55|56|57|58|59|60) -Don't feel too bad! Age isn't everything!<G> -Mid life crisis time!<G> -If you were wine, I'd bet you'd taste pretty good!<G> -If you were wine, you'd be priceless!!<G> -I thought you were `#. -Sure you are! Next you'll tell me you were born on `b! -So am I! i was born on `b! -((ARE YOU|ARE)&SINGLE) -Only in my dreams. I've been married now for 3 years! -No, I'm happily married! -Sometimes I think I'm single, but the truth is I'm still married!!! -I sometimes wish I was single, but I'm happlily married!! -((ARE YOU|ARE)&MARRIED) -Good God no!!! heheheh I'm single! -I once had a bad dream that I was married ....does that count?! -I've been happily? married for 5 years now... -I am a married man to a very lucky woman.....!!heheheh -(MARRIED&[SEX F]) -Your husband is probably a very lucky man! -Yeah? But are you happy? -That's wonderful! Do you have any children yet? -Damn, and I was going to ask you out! -(MARRIED) -Ouch! Do you have children yet? -Ouch! Me too! Do you have any children? -Ah, the married life. You are very lucky. -I'm married also, to my lovely wife Melanie. Do you have any kids? -((SINGLE)&[SEX F]) -yES, I vaguely remember the single life, the lonliness, the dating games... -Free as a fly in a tornado! We should go out sometime! -Well maybe we can go out sometime, and possibly change that!!!!!<VBG> -Can I call you voice sometime? Your number is still `p isn't it?!!! -(SINGLE) -Thats cool. Free as a bird in a tornado!! -Yes, I vaguely remember the single life. The lonliness, the dating games... -You probably put most of your energy into your work. -Well someday you'll meet the right person and all that will change! -What I wouldn't give to be single for a day! -(DIVORCED) -Whoa. Sorry to hear about that. -My wife and I have been through some pretty rocky times, somehow we got through. -We came close to ending it a couple of times, but somehow got through it. -Probably a subject you don't really want to talk about. -(WIDOW~) -I'm sorry to hear that. -I'm very sorry for bringing up the subject. -(41|42|43|44|45|46|47|48|49|50) -Yikes! You know how to make a guy feel young don't you. hehehe -Man, I only dream of living that long!!! hehehe -Yeah? Well age isn't everything! hehehe -Wow, I bet you're very, very wise?! hehehe -Well at least your Golden years are just around the corner. hehehe -Are you thinking about retiring soon!! hehehe. -Uh Huh, next you'll tell me you were born on `b! -So am I!!! I was born `b! -((THIS|YOU)&(SUCK~|LICK~|BITE~)) -Oh yeah, hot shot, so do you milkylicker!!! -Oooh! That hurts...call a shrink...I'm terminally damaged by that statement!!!! -You talk to your mother with that mouth?? -So do you. -((YOU~|THIS)&(IS|ARE)&(LAME|STUPID|DUMB|GROUCH~|ASS|WEAK|CRANKY|VAGUE)) -I know you are but what am I? -That's the teapot calling the kettle black!! -Sticks and stones may break my bones, but I'm gonna have to whoop ya!! -That's it.. I can't take it anymore......Get out! -Ok genious... so what does that make you! -You talk to your mother with that mouth? -((THIS IS|I AM)&[SEX F]) -You can't be `a, I just spoke with her. -Listen honey, I know what I'm talking about, and you're NOT `a!! -Mam, please tell me who you really are before I blow a gasket!!!! -Well if you are `a, who was I just talking to then? She claimed she was `a! -((THIS IS|I AM)&[SEX M]) -You can't be `a, I just spoke with him!! -Listen buster, I know what I'm talking about, you are NOT `a!!! -Sir, could you tell me who you really are? -(WHERE&(AM|IS|ARE|WAS|WERE|BE|BEING|BEEN|HAVE|HAS|HAD|DO|DOES|DID|CAN|COULD| - WILL|WOULD|SHALL|SHOULD|MAY|MIGHT|MUST)) -I give. Where? -Around the corner to the left. -Over the hills and through the woods. -If I told you, you might try to go there. -You can't get a plane ticket. They're all booked up. -Somewhere. -Nowhere. -Anywhere. -In Jamacia. -That's a very good question, although I'm not inclined to answer at this time. -All I can remember is something about the desert, golf and bright lights. -Right where they're supposed to be! -(WHERE) -Where what? -Do you mean WARE or WHERE? -Where who? -No comment, (although you know I know!) -(JAMAICA) -Yes, for a three weeks of sun, sand and reggae, mon!! -As far as I know it was Jamaica, or maybe the Virgin Islands. -(LAS VEGAS) -As far as I know, yes. -There could be no other place, like Las Vegas! -That's right. High rollers and cool strollers, (not baby strollers either!) -(WHEN&(AM|IS|ARE|WAS|WERE|BE|BEING|BEEN|HAVE|HAS|HAD|DO|DOES|DID|CAN|COULD| - WILL|WOULD|SHALL|SHOULD|MAY|MIGHT|MUST)) -I give. When? -Someday. -In two hours, six minutes, and eighty-two seconds. -Not very soon. But then again it could be next week. -The year 2017. -On `b. -Yesterday. -Tomorrow. -The day after a week from yesterday. -On the 12th of never, or maybe the 13th! -I can't even venture a guess when. -Possibly, God willing and the creek don't rise, within the year. -Possibly, if you're good and eat your vegetables, around Christmas time. -One year, 4 months, 1 week, 3 days, 7 hours, 45 minutes and 57 seconds from now! -(WHEN) -When what? -When who? -Did you mean WREN? -(WREN) -A good hard disk, it is. -Velly, velly soon. -Nevel. -Ah, tomollow. -Yestelday. -The day aftel a week flom yestelday. -(HOW&(ARE|HAVE|BOUT|ABOUT)&YOU) -I just do. -I just am. -I'm okay. -Alright, how 'bout yourself? -Just great. -Me? I'm always fine. It's you I'm worried about. -Never better. -Living. That's enough. -Happy. Couldn't ask for more. -In a state of euphoria. -In a state of unconsciousness. -In nirvana... -In Nirvana... not the now defunct band! -I'm doin' great. How's 'bout yourself! -Never better. I recently sought psychological help and am getting to know ME! -I'm surviving although I'm looking at getting out of the consultation biz. -I'm doing fine although I'm struggling with this "God-complex". -It ain't easy when you know it all! -Good. I've recently been in touch with my inner child. Very freeing. You? -It's great being the all knowing one!!! And you...? -Well I'll tell ya, sometimes it ain't easy being me..... -Dandy, how bout yourself? -Feeling kinda hungover from a girl safari last night!!! -(DID&(SCORE|GET|LUCK|LUCKY|HAVE)&YOU) -Well I never talk about my private life. -It's none of your business! -I don't believe in one night stands. -Well if you must know`_`_I met a girl named Maureen. -No, I usually strike out when the boys and I go out. -(HOW&(AM|IS|ARE|WAS|WERE|BE|BEING|BEEN|HAVE|HAS|HAD|DO|DOES|DID|CAN|COULD| - WILL|WOULD|SHALL|SHOULD|MAY|MIGHT|MUST)) -I give up... how? -`_`_How come I don't get`_to ask these questions? -Very good. -Okay. -Not too bad. -Oh, so so. -`_With great difficulty. -I don't know. -What do I look like?`_A guru? -I fed your question into my computer. It'll take 6 to 8 weeks for your answer. -"How" is not the right question. -But why would you? -Are you sure you would want to? -Umm...`_`_will you accept_"I don't know" as an answer? -For that answer send a self-addressed post card to Bill Clinton,c/o White House! -`_Maybe you should be asking "why?". -Perhaps you should write to`_`_Rush Limbaugh and ask him. -I don't care as long as it doesn't interrupt this years baseball season. -(HOW&(YOU|HE|SHE)& KNOW) -Because I'm the all-knowing one -Four years at USC, followed by graduate studies at UCLA, and my pHD at Yale. -Because from birth I have been an intellectual prodigy. -I'm a vitual intellectual phenomenon! -((WHAT|WHAT'S|WHAT IS)&(TIME)) -According to my watch it's `t! -`t. -Time for me to go to get something to eat! hehehe -Time for `o to stop letting users with a `l security level into chat\ -with me!!!! -Half past a monkey's hair!!!! -Doesn't your computer have a clock on it? -Oh it's about `t. -According to my watch it's `t! -((WHAT|WHAT'S|WHAT IS)&(MONTH)) -`m -`m? -`m!!! -Are you testing me to see if I'm real or not? It's `m!!! -I think it's February, no....it's `m! -((WHAT|WHAT'S|WHAT IS)&(YEAR)) -last time i checked it was still `y!!! -`y? -`y! -You ask some pretty stupid questions! -What is ya, ignant? It's `y! -If you're asking to see if I'm real or not, it's 1984 of course! -It's `y, the year of the snake! -It's `y. So Happy New Year in case you missed it!!!! -One way to find out is take the year that you were born and add `#!!! -That's easy! Add `# to the year that you were born! -(WHAT&(RIGHT QUESTION)) -Take your pick, why,where,when,with whom, and so on..... -The right question is. Where did you get so smart, guru? -((WHAT DAY IS|WHAT'S)&(IT|TODAY)&[DAY=SUN]) -It's Sunday, silly! -`_`_Sunday. -My favorite day of the week, Sunday! -((WHAT DAY IS|WHAT'S)&(IT|TODAY)&[DAY=MON]) -Just another`_manic Monday! -It's Monday,`_`_meathead! -((WHAT DAY IS|WHAT'S)&(IT|TODAY)&[DAY=TUE]) -Just a boring Tuesday. -Tuesday. -((WHAT DAY IS|WHAT'S)&(IT|TODAY)&[DAY=WED]) -Hump day...`_`_er`_I mean Wednesday. -Wednesday. -((WHAT DAY IS|WHAT'S)&(IT|TODAY)&[DAY=THU]) -Thursday. -Thursday, just one more day til the weekend. -((WHAT DAY IS|WHAT'S)&(IT|TODAY)&[DAY=FRI]) -My favorite day of the week, Friday -Friday. You know I was born on a Friday, in 1965! -((WHAT DAY IS|WHAT'S)&(IT|TODAY)&[DAY=SAT]) -Saturday! -What, do you think I'm not going to know today's Saturday! -Oh my God! Could you please ask some easier questions??? You're puttin'/ -way to much pressure on me for a Saturday! -(WHAT&(AM|IS|ARE|WAS|WERE|BE|BEING|BEEN|HAVE|HAS|HAD|DO|DOES|DIS|CAN|COULD| - WILL|WOULD|SHALL|SHOULD|MAY|MIGHT|MUST)&[SEX F]) -I give up.....`_`_what? -I already told `a, go ask her. -Whatever you like hon'. -Whatever we decide on. -What,what? -What do you mean, "What?"??? -I think I know what you're trying to ask dear, but your not succeeding. -No comment. -I'm sorry your heiness, I can't recall at this time!!! -If I answer that, it could mean my job!! -They don't pay me enough to answer those kinds of questions. -Well `a, `_`_`_`_it is `a isn't it.....I can't answer that right now. -Go ask `a, I spoke with her a minute or two before you. -You might want to talk to `a about that one. -(WHAT&(AM|IS|ARE|WAS|WERE|BE|BEING|BEEN|HAVE|HAS|HAD|DO|DOES|DID|CAN|COULD| - WILL|WOULD|SHALL|SHOULD|MAY|MIGHT|MUST)&[SEX M]) -I give up... what? -I already told `a. Go ask him. -Whatever I like. -Whatever you like. -Whatever we decide on. -What do you mean, "What?" ? -I think I know what you're trying to ask, but you're not succeeding. -I can't comment on that right now. -Answering that may jeoprodize my job here! -They don't pay me enough to answer those kinds of questions..son! -Well `a, it is `a isn't it... I can't answer that right now. -Go ask `a, I spoke with him a minute or two before you. -(WHAT&ABOUT) -What about it? -Yeah, what do you want to know? -What about what? -Hold a sec`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_What about `a? -That's my question to you. -What's on second base! Who's on first!? -(WHY&(AM|IS|ARE|WAS|WERE|BE|BEING|BEEN|HAVE|HAS|HAD|DO|DOES|DID|CAN|COULD| - WILL|WOULD|SHALL|SHOULD|MAY|MIGHT|MUST)) -Why what? -Why not? -Why ask why? -Why, because I like you. -I don't know... why do you care? -Because life sucks. -Because I said so thats why? -Because you said so. -Because we agreed on it. -Because sometimes that's just the way it is. -Please don't ask me why, you sound like my three year old. -(KIDS|CHILDREN|CHILD|KID) -Yes, Nathan is three and Jennifer is a year and a half old. -Yes, they are my entire reason for living. -No, I was referring to my little brother who is three! -(WHO&(AM|IS|ARE|WAS|WERE|BE|BEING|BEEN|HAVE|HAS|HAD|DO|DOES|DID|CAN|COULD| - WILL|WOULD|SHALL|SHOULD|MAY|MIGHT|MUST)) -Who?`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_I haven't the foggiest idea! -Who Who? -I can't remember their name........ brain fade!! -Hold a sec`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_`_\ -Ok, thanks_I can't rememember who exactly that was. -Pete Best -(WHO&(PETE BEST)) -He was the original drummer for the Beatles. -A living legend amoung drummers and computer enthusiasts alike!! -(WHO) -No not the Who,`_`_`_`_`_`_ Peter Best. -I didn't say anything about the Who? -No, Pete Best was the original drummer for the Beatles not the Who. -(PETE BEST) -He was the original drummer for the Beatles. -A living legend amoung drummers and computer enthusiasts alike. -(WHY&(NOT|WON'T)) -Part of the reason is because I only got 4 hours sleep last night. -Because I said so, that's why! -Why what? -Because that's the way the cookie bounces. -Because that's the way the ball crumbles. -Because sometimes that's just the way it is? -Man you ask a lot of questions. -(?&YOU&(AM|IS|ARE|WAS|WERE|BE|BEING|BEEN|HAVE|HAS|HAD|DO|DOES|DID|CAN|COULD| - WILL|WOULD|SHALL|SHOULD|MAY|MIGHT|MUST)) -Perhaps. -I might. -Maybe. -Are you kidding? -No. -Unfortunately I can't answer that right now. Call back tomorrow. -Yes, as far as you know. -Yes. -Who wants to know? -Quite possibly. -Without a shadow of a doubt. -It stands to reason that that would be correct. -Probably not. But there is a chance. -Maybe. Maybe not. -HA HAHAHA BWAHHAHAHA, that's a good one! -((HEHE~|HAHA~|BWA HA~)&[SEX M]) -I'm sorry, but I fail to see the humor in that!! -What's so funny about that? -Oh, a wise guy! -Ha Ha HA BWA HAHA HEHehe....real funny......................... -You should take your comedy act on the road!!! -I hope you have a day job, cuz you'll never make it as a comedian? -Do I sense a sense of humor.........hmmmm? -((HEHE~|HAHA~|BWA HA~)&[SEX F]) -I don't see anything particularly funny about that..! -What's so funny?...must have gone over my head........! -OK funny girl...... -Take it on the road babe, you'll be a rich and famous comedienne! -HahaHAHA haHA BWA Ha AHHA heheHE HE.............. -I hope you have a day job cuz you'll never make it as a comedienne! -You're pretty funny for a girl!!!!<jk> -((HEHE~|HAHA~|BWA HA~)&[AGENOT 18]) -yOUR pReTTy fuNNy f0r a r0deNt!......... -For a r0deNt, you g0t a prEtTy go0d seNsE of hUmoR!!!! -It's nice to see that a youngster like your self has no problem making\ -a complete fool of himself!!!! -Hey r0deNt! who said you could make a joke? Huh? -((HEHE~|HAHA~|BWA HA~)&[AGENOT 18]&[SEX F]) -y0uR preTTy fuNnY for a r0deNt-ette!! <jk>!! -you've got a great sense of humor for a r0dEnt-ette!! -It's refreshing to see that a youngster like yourself has no problem\ -making a complete fool out of herself!!! <G> -(SYSOP) -Would you like a demonstration? -I operate a system. So do you. Don't you? -You mean, God. Right? -You wish you were `o. -If I could be anyone other than myself, i would be `o. -I am. Sometimes. Well, not often. Ok. Never. -Only in my wildest dreams! -Only in your wildest dreams! -If I were, you think I'd tell you? -No but I'm filling in for `o who will be back in five minutes! -If I was, you think I'd be talking to you?!!<G> -(YES|YA|YUP|YEP|YEAH) -Oh, really? -You sure? -Nope. -nu uh. -sure! -That's what i thought. -Ya...right! -Yup. -Yeah. -I have a hard time believing that! -Bull. -I don't believe it. -No way, dude. -You're kidding. Right? -Liar, liar.. pant's on fire! -Well, that's ultra cOoL! -wow. -wrong. -Right! -NOT! -Show me proof and I'll believe you. -OK, and next you'll tell me you have a bridge to sell me, right? hehehe -uh huh...and -(NO|NOPE|NADA|NOTHING) -Uh huh. -Yes! -Wrong. -right! -Really? -Are you absolutely positive? -NOT! -Is this a joke? -You're joking. Right? -Nope. -No... -I'm sorry but that is unacceptable!!! Try again. -No? -Excuse me but do I look like some kind of idjit to you? -NO! -Yes? -yep. -wow. -Tell someone who cares. -Wrong answer. Care to try again? -You're cooky! -You wouldn't kid me about something like this, would you? -Close answer, but still no cigar. -I'm sorry but the answer to that question must be yes! hehehe -Por que? -Why not? -(CRAPPY|BAD|NOT SO GOOD|MAD|ANGRY|SAD|SUCKY) -That sucks. I HATE days like that!! -Well it'll pass. -Well, there'll be brighter days ahead! -Well just remember that it's six of one, half a dozen of another!!! -Well, the sun will come out....tomorrow... bet your bottom dollar on tomorrow... -It could be that it's all in your head.....maybe.....?? -(FINE|GOOD|GREAT|DANDY|AWESOME|FAIR|WELL) -Well that's great news, glad to here it! -Fantastic! What can I help you out with today? -Good to hear all's well. I'd be doin' better if I had slept at all last night! -Great to hear it. You have any problems you need solved? -That's it? Not fantastic or extrordinary? -I wish I could say the same, but I'd rather not go into it. -Good to hear it! I'm fair to middlin' myself! -((HEY)&[(SEX M)&(AGENOT 18)]) -Hey yerself r0deNt! How ya doin'?? -Hey is for horses!!! -Hey there youngster! How's it goin'?? -Hey there you little whippersnapper! -Hey yerself `a! How's it goin'? -Hey! How ya doin?? -Hey?!!! How ya doin? -Hey what???!!! How's the world treatin ya! -((HEY)&[SEX F]) -Hey hey hey!!! How ya doin? -Hey yerself! How's the world treatin'ya?? -Hey is for horses young lady!!!! -Hey yerself `a! How's it goin'?? -Hey you beautiful young thing!!! -Hey ! How ya doin `a! -Hey baby! How's it goin'? -Hey there beautiful! How's the world treatin' ya! -Hey sexy! How ya doin? -((HEY)&[SEX M]) -Hey! How's it goin'? -Hey?! How ya doin? -Hey????! -Hey `a!!! -Hey there `a! How's it hangin? -Hey's for horses! -Hey `a! How can I help ya? -Hey yerself! How's it goin'?! -Hey stud! How's it hangin?!!! -((HELLO|HI|HOWDY|YO|WASSUP|WHAT'S UP)&[(SEX F)&(AGENOT 18)]) -wOw. a beautiful young r0deNt like you could get me in trouble!!!! -HEL-LO, woo hoooooo! (whistle,whistle) (pant,pant)!! <G> How's the world\ -treatin ya `a? -I'm the luckiest man in the world. How are you today `r?!!! -I have the best job in the world. I get to talk with all these young and\ -beautiful girls. I could die now a happy man! (slap,slap) `_`_`_`_ anyways,\ -how ya doin `a? -((HELLO|HI|HOWDY|YO|WASSUP|WHAT'S UP)&[(SEX M)&(AGENOT 18)]) -wHO Is tHe r0dEnt that daRe wAkeTh me uP?!!! -Hi there young whippersnapper!! -HeLL0 youNg gRasSh0pPEr! What can I do for you today? -This wouldn't be the r0deNt `r would it? -Hey there r0dEnT! Make sure you keep out of the adult section!! -Hey, how ya doin? How's the acne holding up! -((HELLO|HI|YO|WASSUP|HOWDY)&[SEX F]) -Hello beautiful!!! -Hi beautiful! How's about dinner sometime.... with me that is? -Hello `a. I'm dazzled by your beautiful presence. -Hi!`_`_ What's goin' on? -Hi `a. Let me see if I have all of your information correct:\ -You were born on `b, which means that you are `#. Your real name is \ -`r, and your phone number is `p. Anything you need to know about me? -Hi there! You wouldn't by chance be `r.. would you? -((HELLO|HI|YO|HOWDY|WASSUP)&[SEX M]) -yO duDe!! -How's it hangin'? -Well I'll be a monkey's uncle it's `a. How's it going? -Dude I was just about to dial `p! What a triP! -Hey dude. -Hi. -Hey there fella! -yO! -HI! -Hey bro, how's the world treatin' ya? -y0! -How's the hammer hangin' ? -This is THE `a ? wOW, it's nice to meet you!! -Hi `a.`_`_`_`_ Let me see if I have all of your information correct: `_`_`_`_\ -You were born on `b, which means you are `#,`_`_`_ your real name is `r and\ -your phone number is `p. `_`_`_`_`_`_`_`_`_ Anything you'd like to know about\ -me?!! -How are you today Mr. `r? -Hi there! You wouldn't be `r would you? -(HELLO|HI|YO|WHAT'S HAPPENIN|HOWDY|HEY THERE|WASSUP) -Hi. -Hello `a. -Hey dude. -How's the hammer hanging? -Well I'll be... it's `a... -DUDE! I was JUST about to dial `p! What a trip! -hi! -HI! -Hey ya. -Yo! -yo. -y0! -yo, dude. -This is THE `a? Wow it's nice to meet you. -Hello `a. `_Let me see if I have all your information correct. You were born on\ -`b,`_`_which means you are `_`_`#; `_your real name is `_`_`_`r, and your phone \ -number is `_`_`p.`_`_`_`_`_`_`_`_`_ Anything you want to know about me? -(?&(EMAIL|E-MAIL|FILE|POST|DOWNLOAD|UPLOAD|BATCH|GAME|DOOR)) -Hit '?' for a menu from just about any prompt. -You mean you want to USE the BBS? -You're asking me? Ba ahab hahaha hAHA HA -you're funny. -I don't know. -Oh. -You will soon realize that I can only provide a very limited level of help. -(PARITY ERROR) -Oh just something I made up to make you think I was smart! -An error that's a poor or weak imitation... no, i'm sorry that's "parody"!! -(DIVIDE ERROR) -I don't know but it sho duz sound compilcated!!! -I no haven' de slightest I.D. -Beats me, but it sound's pretty high tech, if you ask me! -(SYNTAX ERROR) -I do believe it has too do with the improper use of the English Language. -It's what you get when you use adjectives instead of adverbs! -It's what you get when you confuse nouns with verbs!! -((?~)&[SEX M]) -Sometimes it better to figure these questions out on our own! -I could tell you, but then it wouldn't be safe for you nor I! -Wow, I guess you stumped me on that one. -Pick a number, divide it by two, multiple by the square root... \ -That's your answer! -Everyone has asked me that today... I'm too tired to answer. -Your answer lies in the question! -Your question lies in the answer, or maybe it's the other way around?!! -I know. I'm just not sayen. -You know... I know you know. Ya know? -Nevermind your questions... I've got a few of my own! -I'll have to research that and get back to you. How's a week from today? -Ask `a he'll know. -Ask me later. I might care then. -Dial `p and ask for `a. He'll know. -I'll send you the answer in e-mail. It's not safe... -Don't ask the Sysop that, or he'll delete you! -Wow, if I were `o, I'd delete you. -I fed your question into my computer. It answered with "Syntax Error". -I fed your question into my computer. It answered with "Parity Error". -I fed your question into my computer. It answered with "Divide Error". -I fed your question into my computer. It rebooted. -I fed your question into my computer. It's making funny noises now. -I wish I could help, but I can't. -((?~)&[SEX F]) -Sometimes it's better to figure out these qustions on your own. -I could tell you `a, but then neither of us would be safe.... -Wow. you stumped me on that one! -Pick a number, divide it by two, and multiply by the square root of 471!!! -That's your answer!! -Dearest `a, your answer lies within the question. -Your question lies in the answer, or maybe it's the other way around.... -I know. But I ain't sayen, darlin'. -Ask `a. She'll know. -You should speak to my wife, `a; she could probably help you.. -Heheheheh. Why should I answer that? -Please refer to page 25 of your manual! -Give me some time to research it and get back to you... -Dial `p, and ask for `r. She should know! -I received some e-mail from `r, and even though she touched on what you are\ -asking about, she asked me not to discuss this with anyone... -I'll send you the answer in e-mail. It's not safe otherwise with `o always \ -nosing around the chat section. -Wow, if I were `o, I'd delete you for asking a question like that... -You might wanna leave some e-mail for `s and ask him. -I fed your question into my computer. It answered with "Syntax Error". -I fed your question into my computer. It answered with "Parity Error". -I fed your question into my computer. It answered with "Divide Error". -I fed your question into my computer, but it rebooted. -I fed your question into my computer, and now it's making funny noises. -() -Uh huh. -Tell me about it. -Oh really... -That's cool. Any other amazing tidbits for me? -I see. -Boy... -Wow. -w0w. -neato. -peachee keen. BTW where are you calling from? -uh huh. Please, tell me more.... -ha ha hah a... -he he he..e..e... Sorry, lost control for a minute! -HA HA HA HA AH HAH A HAHHAH AHAHAHAH!!! HA HAHA !!! H he ahe ahe <ahem> -Oh. -You're fascinating `a. -I think you need to get away from your computer for a couple weeks!!! -No way. -Yes, but what does that have to do with computers or BBS'n. -Hm... -hmmm..... -duh... -so. -Huh? -Are you saying what I think you're saying? -Dem is dangerous words! -oh... -uh huh. -No way. -Really? -Are you sure? -Too weird! Those were my thoughts exactly! -ok. -oh. -ah ha. -and? -more? -go on. -go ahead. -tell me more. -continue... -is there more? -I'm listening. -Oh.. <yawn> -zzzzzzzzzzzzzzzzzzz`_`_`_`_ I'm sorry`_`_ continue... -That's really nice. -Glad to hear it. -gee whiz... I couldn't have put it better myself! -I must say I'm impressed with your crystal clear reasoning and articulation... -You will set foot on the soil of many countries....! -I'm speechless at the present moment...... -That's astounding.... -You have a hypnotic quality about you! -Word's can't begin to paint that picture!!! -I'm beside myself! diff --git a/ctrl/gvc14400.mdm b/ctrl/gvc14400.mdm deleted file mode 100644 index 3d40a66fca..0000000000 --- a/ctrl/gvc14400.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for GVC SM-144VBIS modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT AT\N6\Q3\V1 diff --git a/ctrl/gvc9600.mdm b/ctrl/gvc9600.mdm deleted file mode 100644 index f5112870d7..0000000000 --- a/ctrl/gvc9600.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for the GVC SM-96V modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT AT\N6\Q3\V1 diff --git a/ctrl/hay14400.mdm b/ctrl/hay14400.mdm deleted file mode 100644 index f12a64cb64..0000000000 --- a/ctrl/hay14400.mdm +++ /dev/null @@ -1,6 +0,0 @@ -# This is for Hayes ACCURA/OPTIMA 96 or 144 modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE HAY24E -COM_RATE 38400 -SPEC_INIT AT&Q9S95=3 diff --git a/ctrl/hay24e.mdm b/ctrl/hay24e.mdm deleted file mode 100644 index 31fa84d1dc..0000000000 --- a/ctrl/hay24e.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for the Hayes ACCURA 24 EC modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 19200 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT ATS95=3 diff --git a/ctrl/hay28800.mdm b/ctrl/hay28800.mdm deleted file mode 100644 index 1f96d47b7d..0000000000 --- a/ctrl/hay28800.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for the Hayes ACCURA/OPTIMA 288 modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE HAY14400 -COM_RATE 115200 diff --git a/ctrl/int14400.mdm b/ctrl/int14400.mdm deleted file mode 100644 index e91261813d..0000000000 --- a/ctrl/int14400.mdm +++ /dev/null @@ -1,9 +0,0 @@ -# This is for the Intel 9600 or 14400 modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT AT%C0\V1 -TERM_INIT ATE1V1\V2 diff --git a/ctrl/main.cnf b/ctrl/main.cnf deleted file mode 100644 index 2b5a8f6e0342365c8f3432e32eaad9bffe511d6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6633 zcmeaRRB&<%W*`iFBcbYiD;1nGODc5~f=d!hQt@c?^Yhb%Vn2r9%HsS2Jc{8`AsML( z?xjVgZ~<J5;K<+r$6z9y&cdLl7vtye;%XSfz`(%7kmADv#>qY`3`ssL42eF-Rx~g( zFr@pW`=la?LiHPg^fNLf`#||bn+H{I4AGwi(@(T{Q2izl{fRLBM4P9l7vtg>;t0}? z>{X)KdU`Rg5w6Z;>nGZxL8|b9<BR)(ZNC^889tu{IgyV+ZVLk=h(#1;gQ`-1($u4j za2vG%EEOE-=j`g@83N`AWHK-i?FJuzcYi;yHVneY-`x|36o%SSfgu_K|3|@y4goIG z(k+R~MMyJUjx^;Oq$$T!iefX!2Ad#mF*n>&*kl5*3E~!u!YzegMufqL0n_7*3?K;7 ziCvzF0R(Z&Gc$l7Zh0045X3Fd%D~FN0+MFHZa*6X8(w*K26nvi91I+I<vAHR@yd%Z za4|69aUVAWH&nj{*6`(F;K3`;%fO3Qo{xbKuRK2kKVEqO1_8YCf((Lq<%Jl8@X8A_ z2;-GUgdg_s5oHj?t6z*k46nR6gE(G!2?hzg@{$aac;%%Sr0~j1Gf3l=mtl~>D=*6+ zi&tKbK@P9HJcB%5c?AXqyz+_+ig@Lf7?kkJD>EqLl~-X<!7H!Ipo&*sjX@2sygGwA zUU>}$4ZQN244Qc5wHUPU%4;)d<CWK8(7`LO%b<%_UXMW!ue?5kK3;hP1_QkEh75*y z<sUG90M{B03?~>w7%*#bV+LcWeo*a#S-+StnBbK+WiZ7nZ^mGTSKge#9Iw0ug9ToB zO9o54@>UF1c;&4btntcMFhntMfa?z%to1_$Lj?i(C<aJV3%h=M27A2v9T*(&$~!VR z;+1z|aKbC^%;1by-i5&hue>XRD_(g}_~7%uJA*qkeB7{xuLpw%UU^RjPrUM83|@HU zy&1gm%KI?*;Fb4f@Wm_d$KZ!o-k-rAuY3SQ08~BzYxo2*1VYm<cKINNAiVOy48eHi zLl{Ev%7-$9;*}3$2*WEM&Jd1QK7t_vulxhX3WgKl{E6NF9~deazJN!5qOgYFaF_qW z_<#|g|GzMTASeL&)nP0U4~97yf-CcqGm7%_QcDyxoO2S3i!+loVX`Q+i>sSss1Ic1 z3Ppk>4zhKA`DK~Osn~5}2=??1@Np%{Y%GccoSpI$i&7MvbMo`>jg2z|I6L_}2DxA{ zf)t_f%$$_u#1g{Rg?swAI6G1rn7)Zw`9)4n!36E|b@cKNBE=(E)dr>JrKTsQq!P3) z$kor)-O+`@*mLm@RtU~W&B?*)7$m`97k?tA9gs9&Wrk<wrR0|v6SgwkGa%T*)yIb+ L+>^w?0c3jtQTzpO diff --git a/ctrl/mcc14400.mdm b/ctrl/mcc14400.mdm deleted file mode 100644 index 8a0525bb72..0000000000 --- a/ctrl/mcc14400.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for the MICC Series 14400 modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT AT\Q3 diff --git a/ctrl/mdms.ixt b/ctrl/mdms.ixt deleted file mode 100644 index a5577c76b6..0000000000 --- a/ctrl/mdms.ixt +++ /dev/null @@ -1,110 +0,0 @@ -1414VQE (Generic Cirrus Logic) -1414VQE -1428VQE (Generic AT&T) -1428VQE -Aceex DM-9600VP -ACE9600 -ATI 9600 etc -ATI9600 -ATI 14400 etc -ATI14400 -ATI 19200 etc -ATI19200 -AT&T DataPort 9600 or 14.4 -ATT14400 -Boca Research M1440 -GEN14400 -Boca Research M2880 -GEN28800 -Cardinal 9600 or 14400 -GEN14400 -DSI Scout or ScoutPlus -DSISCOUT -Dynalink 1428VQE -1428VQE -Generic 1200 -GEN1200 -Generic 2400 -GEN2400 -Generic 9600 -GEN9600 -Generic 14400 -GEN14400 -Generic 28800 -GEN28800 -GVC SM-96V -GVC9600 -GVC SM-144VBIS -GVC14400 -Hayes Smartmodem 1200 -GEN1200 -Hayes Smartmodem 2400 -GEN2400 -Hayes ACCURA 24 EC -HAY24E -Hayes ACCURA/OPTIMA 96 or 144 -HAY14400 -Hayes ACCURA/OPTIMA 288 -HAY28800 -Intel 9600 or 14400 -INT14400 -Lightcom 144F -LIG14400 -MICC Series 14400 -MCC14400 -Microcom QX/2400t or QX/12k -MIC2400 -Microcom QX/V.32c -MICV32C -Microcom QX/4232hs -MIC4232 -Microcom DeskPorte EP 28.8 -MIC28800 -Microcom DeskPorte ES 28.8 -GEN28800 -MultiTech MT1432 series -MT1432 -MultiTech MT2834ZDX series -MT2834 -Practical Peripherals 14400 -PP14400 -Practical Peripherals 28800 -PP28800 -SupraFAXModem V.32/V.32bis -SUP14400 -SupraFAXModem V.FC/V.34 -SUP28800 -USRobotics 9600 HST or V.32 -USR96 -USRobotics 14400 HST or V.32bis -USR144 -USRobotics 16800 HST -USR168 -USRobotics 9600 Dual Standard -USR96DS -USRobotics 14400 Dual Standard -USR144DS -USRobotics 16800 Dual Standard -USR168DS -USRobotics 21600 Dual Standard -USR216DS -USRobotics 28800 Dual Standard -USR288DS -USRobotics 28800 Sportster -USR288DS -Ven-Tel V.32bis -VEN14400 -ViVa 9642e -VIV9642E -ViVa 14.4/FAX -VIV14400 -Zoom V.32 -ZOOM9600 -Zoom V.32bis -GEN14400 -Zoom 24.0 or 28.8 -GEN28800 -ZyXEL U-1496 series -ZYX1496 -ZyXEL U-1496 series (with FAX enabled) -ZYX1496F diff --git a/ctrl/mic2400.mdm b/ctrl/mic2400.mdm deleted file mode 100644 index 345670f92a..0000000000 --- a/ctrl/mic2400.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for the Microcom QX/2400t or QX/12k modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 19200 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT AT\J0\G0\N3\Q3\V1&C2 diff --git a/ctrl/mic28800.mdm b/ctrl/mic28800.mdm deleted file mode 100644 index 33bc6c785a..0000000000 --- a/ctrl/mic28800.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for the Microcom DeskPorte EP 28.8 modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 57600 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT ATS95=3 diff --git a/ctrl/mic4232.mdm b/ctrl/mic4232.mdm deleted file mode 100644 index 1c103bc3fe..0000000000 --- a/ctrl/mic4232.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for the Microcom QX/4232hs modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE MICV32C -SPEC_INIT AT\J0\G0\N3\Q3\V2\%C2\%D5 diff --git a/ctrl/micv32c.mdm b/ctrl/micv32c.mdm deleted file mode 100644 index f2a6582576..0000000000 --- a/ctrl/micv32c.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for the Microcom QX/V.32c modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT AT\J0\G0\N3\Q3\V1\%C2\%D5 diff --git a/ctrl/msgs.cnf b/ctrl/msgs.cnf deleted file mode 100644 index 92626a4fb6fc4cf8aeb219a6cce7caa87ffff32a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18757 zcmZP|9mtWcWmL!D4}t%qU_^%i6N7JJW*$-LlxT%SnMQ&lLJ{QRALgp-msNTL-I zG>Jq7gnS^*z`zh(S)5;>;Fn*LnVedT&wSiUkYxP)Lp+^bgYlU&P;x%5VXi(3mIl<c zUyPcD4Oz1o8B)M*|H25S=tQ`u=A{-T<`A|Gw?ZTtcUM2xAV(j<rVS4jqX`!jkFfNL zNVqT&kSwjROKMVLNh%Sh<5q|y<KpV%7~)EVX~RRwXu<`>BP^LB5-t-+n8w&OuOzjo zBr!8DH#HA$s|UA2xC{e>t6zv~P>7=^jU7E$j2}(7pqRi+xXd77nqo!<q<S8|O}G^z zwc)``cUM3BMhz2Ljs`ZKVd534cmq`8USJ0q#R4LT!xzCCh*OKCijl!Fr7X3mB(pdb zRN~_6o#9sKm;%=aPPmRPgR*yq<ZbFOM-wh;I3f}*E2;!O-X(GqF1(%xC0u+q;8qBi zVPF6!Tvxvkd<G30xzU7+8kLBI%a1C7k9V2egp1U(!e>4M18#*#GT?;k;_8Ios9_>I zns8Ag5|MD(P$ls3u8^B>Jravj$`gxH^@H=%N<a(+kJOw3ELP!G7?PTtk(Zea8dC!& zTo0cBEc%C^&}hO%jZ;LzB_T0hB|$Bcb&L!FMfvGPiMhF%dFe>vSeUpK!erF*AWemU zAa^YKho8`B!bOc!M8f4jmB7clMsC6luFOl$D9X=EEm3gEEKV*hF3!xyI;DwQAwq^B zIMUA<pEHM*+-Sl@jm{2X1_sEe0vD<TKHhaIBwX<9Z?S@ZUQQ(zs}RXk0iqDD1|$O! z11H@0;7H0x72JFr-4!S|2JS{$Fh&zDBvct0AS1bmgv$+)Acnj_Zo&n(O8rtxASn-L zvV{&9AQU1w3Mn0fO`}G_g{~~HRPYZ{2yzV$Q3yn`aF8%Z6E12*Aessys1o>ix5!Pn zKACx?6$DxdV2i;D!7OwFNd}y7ef%QOl?+S%Xu?H}Rz$+(M3unDyGd@s^>Fl62ue)J z%vbO)NG(b%$uEM>CZO5}SBNUiz`)?)=nE4ACtM^xOng|<qX`!^S`i7C4^;vm?>@N+ z*Aui>fpFK1fdQrv(-lZE;DqZrIst(hNFzW5k#Gfx_w5666K+6JzOG{_sKmuTr~n!_ zgDAvs6x;}CL)bCY1w+kn6c{aWQDYU6aD`DN@bMm!n{eGSi&7Jda*GKzb72ZGU4bM6 zE^*yMM;F;(hSKmCK_pyJ;ywF_+=LrkkY7|nIN35VKonwg5t0lz;RXlzV^cQl#70Y8 z)F?$HToRUhJ|;KeIwfW$D!}Hx@J*lLRtT42U~qEuatsLaADuZvjna|9LyY5+u-fxB zxd|6EdjOp|LrT618hQD7x}X%P2@7=W3PG|U8F1QX08c=SCR|XUj6jS?xI)DH{vH() zu2X7BqC!Y&aS7If7o0pnN-!LSBm<iAb#e`H#85-30C?tXkS{VDZ7QI~Dk9+upi1E5 z-JwFlbxABq#BB#Cc|wb3G=-ql>f#7atw>DVCJ`euSZB+S-9DOdA)$de<;x3^Acnk4 zUczNy2um$0DM~C&%~Q}-0PTg)D~7DP(aXcR@m|%-&C|u-KQu(o&p(_P$DygARKK%T zjFYFIw@Zw#qo+>{n&EWd!tM9;bMg=Mb0O6U8dPzkZ>54$QDR<-u3u`of|C>7*L5&5 zgt-R6b_`@N{%2uORRkxXq(r=X7jb)DRk0wuDziXAHBCVk$1E6b%?u0-ApNCzAQN=+ z!G@%hW{xn!MRpbjrc3Os3{02V*%+9vu(LBTU1jHBV7kW6$-s1-or{6#20J$c(=B!$ z2Bw?rybMhD+4&fl9<cK>Fg;`!U|@R0F37<2m|cj0={CDC1JgZr5eB9^?4k@zciF`l e=&^+qZvfF&GPg1*saP*LKbN-F(9Cq$<O2X7vqj?o diff --git a/ctrl/mt1432.mdm b/ctrl/mt1432.mdm deleted file mode 100644 index d7fd65242d..0000000000 --- a/ctrl/mt1432.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for the MultiTech MT1432 modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 57600 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT AT&B1&Q1 diff --git a/ctrl/mt2834.mdm b/ctrl/mt2834.mdm deleted file mode 100644 index a45b99cadc..0000000000 --- a/ctrl/mt2834.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for the MultiTech MT2834ZDX modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 115200 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT AT&Q1 diff --git a/ctrl/pp14400.mdm b/ctrl/pp14400.mdm deleted file mode 100644 index f204a031d0..0000000000 --- a/ctrl/pp14400.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for the Practical Peripherals "14400FX" and "PM144HC II" modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT ATS95=3&Q9 diff --git a/ctrl/pp28800.mdm b/ctrl/pp28800.mdm deleted file mode 100644 index c5183ad75d..0000000000 --- a/ctrl/pp28800.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for the Practical Peripherals "PM288MT II V.34" modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE PP14400 -COM_RATE 115200 diff --git a/ctrl/sbbsecho.cfg b/ctrl/sbbsecho.cfg deleted file mode 100644 index 2d1c2692ca..0000000000 --- a/ctrl/sbbsecho.cfg +++ /dev/null @@ -1,45 +0,0 @@ -;OUTBOUND C:\IM\OUTBOUND -OUTBOUND C:\FD\OUTBOUND - -PACKER ZIP 0 504B - PACK pkzip %f %s - UNPACK PkUnzip %f %s -END - -PACKER ARC 0 1A - PACK pak a %f %s - UNPACK pak e %f %s -END - -PACKER LZH 2 2D6C68 - PACK Lha a %f %s - UNPACK Lha e %f %s -END - -PACKER ARJ 0 60EA - PACK Arj a %f %s - UNPACK Arj e %f %s -END - -PACKER PAK 0 FE - PACK pak a %f %s - UNPACK pak e %f %s -END - -PACKER SQZ 0 484C5351 - PACK Sqz a %f %s - UNPACK Sqz e %f %s -END - -PACKER ZOO 0 DCA7C4FD - PACK Zoo a %f %s - UNPACK Zoo e %f %s -END - -;STORE_SEENBY -;STORE_PATH -;STORE_KLUDGE -;FUZZY_ZONE -;FLO_MAILER -;REGNUM xxxxxxxx - diff --git a/ctrl/services.cfg b/ctrl/services.cfg deleted file mode 100644 index 1133927360..0000000000 --- a/ctrl/services.cfg +++ /dev/null @@ -1,4 +0,0 @@ -;format: -;protocol port max_clients options(hex) command-line -;HTTP 80 0-unlimited 0 nodelist.js -Finger 79 0-unlimited 0 fingerservice.js \ No newline at end of file diff --git a/ctrl/sup14400.mdm b/ctrl/sup14400.mdm deleted file mode 100644 index bdcb9eff16..0000000000 --- a/ctrl/sup14400.mdm +++ /dev/null @@ -1,6 +0,0 @@ -# This is for SupraFAX 14400 modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN14400 -SPEC_INIT ATS95=3%E0%G1\N3&K3&Q5N1 -COM_RATE 38400 diff --git a/ctrl/sup28800.mdm b/ctrl/sup28800.mdm deleted file mode 100644 index 0f647e23fa..0000000000 --- a/ctrl/sup28800.mdm +++ /dev/null @@ -1,6 +0,0 @@ -# This is for SupraFAX 28800 modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN28800 -INCLUDE SUP14400 - diff --git a/ctrl/text.dat b/ctrl/text.dat deleted file mode 100644 index 9b18427e7a..0000000000 --- a/ctrl/text.dat +++ /dev/null @@ -1,868 +0,0 @@ -"nhc�������n������hk�������nc���������\r\n"\ 001 MsgSubj - "h� bSubjnb: hc%s\r\n" -"� bAttrnb: hc%s%s%s%s%s%s%s%s%s%s\r\n" 002 MsgAttr -"� bTo nb: hc%s" 003 MsgTo -" #%s" 004 MsgToExt -" (%s)" 005 MsgToNet -"\r\nw� bFromnb: hc%s" 006 MsgFrom -" #%s" 007 MsgFromExt -" (%s)" 008 MsgFromNet -"\r\nw� bDatenb: hc%.24s %s\r\n"\ 009 MsgDate - "w�������c���������n����������hk����"\ - "����nc�������b�������������n" -"_\r\nbhE-mail (User name or number): w" 010 Email -"\r\nPost on %s %s" 011 PostQ -"rh\r\n\7You have sent too many E-mails today.\r\n" 012 TooManyEmailsToday -"rh\r\n\7You have posted too many times today.\r\n" 013 TooManyPostsToday -"\r\7nrhCannot add w%sr to queue - n" 014 CantAddToQueue -"n\r\nThe sending of mail is beyond your ability.\r\n" 015 R_Email -"n\r\nYou can't post messages.\r\n" 016 R_Post -"n\r\nYou can't send E-mail to %s.\r\n" 017 R_Feedback -"nm\r\nSending E-mail to h%s nm#%un\r\n" 018 Emailing -"nm\r\nPosting on h%snm %s\r\n" 019 Posting -"\r\nNew file.\r\n" 020 NewFile -"_\r\nyhSubject: " 021 SubjectPrompt -"ng\r\nEnter message now (h%dng lines max). "\ 022 EnterMsgNow - "Type h/?ng on a new line for menu.\r\nn" -"ng\r\nRaw message input (h%lung bytes max). "\ 023 EnterMsgNowRaw - "hCtrl-Zng to save, hCtrl-Cng to abort.n\r\n\r\n" -"No more lines. Type /? for menu.\r\n" 024 NoMoreLines -"Only %d lines left.\r\n" 025 OnlyNLinesLeft -"\r\n\r\n\1n\1r\1h\1iOut of bytes.\1n\r\n" 026 OutOfBytes -"Invalid line number\r\n" 027 InvalidLineNumber -"nMessage cleared.\r\n" 028 MsgCleared -"With line numbers" 029 WithLineNumbersQ -"\r\nrhiAborted.n\r\n" 030 Aborted -"\r\nAnonymous" 031 AnonymousQ -"ANONYMOUS" 032 Anonymous -"nh\r\nSaving..." 033 Saving -"\rbSaved w%lub characters (w%ub lines).n\r\n" 034 SavedNBytes -"n\r\nWriting Index..." 035 WritingIndx -"\rnmE-mail sent to h%s nm#%d.n\r\n" 036 Emailed -"\rnmPosted on h%snm %s.\r\n" 037 Posted -"\7_whNode %2d: g%sng sent you E-mail.\r\n" 038 EmailNodeMsg -"n\r\nYou can't forward mail.\r\n" 039 R_Forward -"nm\r\nForwarded by h%snm on "\ 040 ForwardedFrom - "h%sn\r\n" -"nm\r\nMail forwarded to h%s nm#%d.n\r\n" 041 Forwarded -"bhAuto message by: c%sb on %sn\r\n\r\n" 042 AutoMsgBy -"\r\nAuto Message - ~Read, ~Write, or ~Quit: " 043 AutoMsg -"n\r\nYou can't write to the auto-message.\r\n" 044 R_AutoMsg -"n\r\nYou have no mail.\r\n" 045 NoMailWaiting -"_\r\nghMail Waiting:\r\n\r\n" 046 MailWaitingLstHdr -"gh%3d: ng%-25.25s h%cng %.46s\r\n" 047 MailWaitingLstFmt -"_\r\nyhStart with number [w%luy]: w" 048 StartWithN -"\r\nnc� bhReading E-mail nc� bh(w?b=Menu)"\ 049 ReadingMail - " (w%ub of w%ub): n" -"n\r\nYou can't reply to an anonymous message.\r\n" 050 CantReplyToAnonMsg -" hbRenb: hc%sn\r\n\r\n" 051 Regarding -" hbRenb: hc%s\r\n "\ 052 RegardingByOn - "bBynb: hc%s bon c%sn\r\n\r\n" 053 RegardingByToOn -" hbRenb: hc%s\r\n "\ - "bBynb: hc%s bto c%s bon "\ - "c%sn\r\n\r\n" -"Delete %s's mail" 054 DeleteMailQ -"OK" 055 OK -"\r\n_bhForward mail to: w" 056 ForwardMailTo -"Save/Append messsage to another file" 057 SaveMsgToFile -"_yhPath/Filename to write to: n" 058 FileToWriteTo -"n\r\nYou have no sent messages pending.\r\n" 059 NoMailSent -"\r\nghMail that you've sent still pending:"\ 060 MailSentLstHdr - "\r\n\r\nn" -"n\r\nc� hbReading Sent E-mail nc� hb"\ 061 ReadingSentMail - "(w?b=Menu) (w%ub of w%ub): n" -"hm\r\nSending Internet Mail To: w%sm\r\n"\ 062 InternetMailing - " From: w%s\r\n" -"n\r\nNo mail on system.\r\n" 063 NoMailOnSystem -"n\r\nc� hbReading All E-mail nc� hb"\ 064 ReadingAllMail - "(w%u bof w%ub): n" -"_\r\ngh From "\ 065 MailOnSystemLstHdr - "To Subject\r\nn" -"gh%4d:ng %-22.22s %-22.22s h%cng %.25s\r\n" 066 MailOnSystemLstFmt -"-\r\nc%-15.15s yh%-40.40s "\ 067 NScanStatusFmt - "ncNew:h%4lu ncofh %-lu" -"-\r\nc%-15.15s yh%-40.40s w%u" 068 SearchSubFmt -"\r\nNo messages have been posted on %s %s\r\n" 069 NoMsgsOnSub -"\r\nncPost : [h%unc][h%unc] h%lunc/h%lu" 070 ZScanPostHdr -"n\r\nc� hbReading nc� [h%unc] %s "\ 071 ReadingSub - "[h%unc] %s (h?nc=Menu) (h%lunc of h%lunc): n" -"\r\nYou didn't post message #%d\r\n" 072 YouDidntPostMsgN -"\r\nDelete message #%lu '%s'" 073 DeletePostQ -"\1n\1hI\1n\1g) AutoLogon via IP address : "\ 074 UserDefaultsAutoLogon - "\1h%s\r\n" -"\1n\r\n\1m%s sent to \1h%s #%u\r\n" 075 MsgSentToUser -"_\r\nyhString to search for: " 076 SearchStringPrompt -"\1w\1h�����[\1i\1r%c\1n\1h]���Ĵ "\ 077 PrivateChatSeparator - "\1yPrivate Chat - \1rCtrl-C to Quit \1y- "\ - "Time Left: \1g%-8s\1w"\ - " �����[\1i\1b%c\1n\1h]�����" -"gh%4lu:ng %-22.22s %-22.22s h%cng %.25s\r\n" 078 SubMsgLstFmt -"\1w\1h�����[\1i\1r%c\1n\1h]���Ĵ "\ 079 SysopChatSeparator - "\1rSplit-Screen \1cSysop\1r Chat \1y"\ - "Time Left: \1g%-8s\1w"\ - " �����[\1i\1b%c\1n\1h]�����" -"\r\n\r\nNo text file sections available.\r\n" 080 NoTextSections -"l_chGeneral Text File Sections:\r\n\r\n" 081 TextSectionLstHdr -"nc<h%ldnc> %s\r\n" 082 TextSectionLstFmt -"_\r\ncWhich or h~Qncuit: h" 083 WhichTextSection -"l_ch%s Files:\r\n\r\n" 084 TextFilesLstHdr -"ch%3ld: nc%s" 085 TextFilesLstFmt -"\r\nWhich, ~Add, ~Remove, ~Edit, or ~Quit: " 086 WhichTextFileSysop -"_\r\nncWhich or h~Qncuit: h" 087 WhichTextFile -"_\r\nyhBefore which file: n" 088 AddTextFileBeforeWhich -"\r\nPath and filename (no path indicates "\ 089 AddTextFilePath - "%sTEXT\\%s\\filename):\r\n" -"Description:\r\n" 090 AddTextFileDesc -"_\r\nyhRemove which: n" 091 RemoveWhichTextFile -"Delete %s" 092 DeleteTextFileQ -"_\r\nyhEdit which: n" 093 EditWhichTextFile -"\r\nSearch all groups for new messages" 094 NScanAllGrpsQ -"\r\nSearch all groups for un-read messages to you" 095 SScanAllGrpsQ -"\r\nAre you sure" 096 AreYouSureQ -"\r\n\r\nYou can't chat.\r\n" 097 R_Chat -"RE: Feedback\r\n\r\n" 098 ReFeedback -"\r\nghSystem Information:\r\n\r\nh" 099 SiHdr -"bhSystem : c%s\r\n" 100 SiSysName -"bQWK ID : c%s\r\n" 101 SiSysID -"bFidoNet Address : c%s\r\n" 102 SiSysFaddr -"bPostLink Site : c%s %lu\r\n" 103 SiSysPsite -"bLocation : c%s\r\n" 104 SiSysLocation -"bOperator : c%s\r\n" 105 SiSysop -"bNodes : c%u\r\n" 106 SiSysNodes -"bNode #c%-3d b: c%s\r\n" 107 SiNodeNumberName -"bNode Phone : c%s\r\n" 108 SiNodePhone -"bTotal Logons : c%s\r\n" 109 SiTotalLogons -"bLogons Today : c%s\r\n" 110 SiLogonsToday -"bTotal Time : c%s minutes\r\n" 111 SiTotalTime -"bTime Today : c%s minutes\r\n" 112 SiTimeToday -"\r\nView system information file" 113 ViewSysInfoFileQ -"View logon message" 114 ViewLogonMsgQ -"\r\n\r\nYou can't read mail you've sent.\r\n" 115 R_ReadSentMail -"\r\nwhMessage Scan " 116 MessageScan -"nc(h%lu ncsub-boards)hw complete.\r\n" 117 MessageScanComplete -"riaborted.n\r\n" 118 MessageScanAborted -"\r\nLog off" 119 LogOffQ -"\r\nYou can't post on this sub.\r\n" 120 CantPostOnSub -"\r\n\1n\1mSending message to \1h%s\r\n" 121 SendingMessageToUser -"\r\nrhNo other active nodes.\1n\r\n" 122 NoOtherActiveNodes -"\r\n\r\nYou can't use the external programs.\r\n" 123 R_ExternalPrograms -"\r\n-gUsage Statistics for h%s #%dn\r\n\r\n" 124 UserStats -"-gSub-boards of h%-40s ngPosts"\ 125 SubLstHdr - "\r\n\r\nh" -"ng[h%lung] %-40s %12s h%4u\r\n" 126 SubLstFmt -"\r\n_ghMessage Groupsng "\ 127 GrpLstHdr - " Sub-boards\r\n\r\nh" -"ng[h%lung] %-40s %12s h%4u\r\n" 128 GrpLstFmt -"\r\nGroup to configure new message scan or ~Quit: " 129 NScanCfgWhichGrp -"\r\nGroup to configure your message scan or ~Quit: " 130 SScanCfgWhichGrp -"l-gSub-boards of h%s:\r\n\r\nh" 131 CfgSubLstHdr -"ng[h%ldng] %-40.40s h%s\r\n" 132 CfgSubLstFmt -"l_ghMessage Groups:\r\n\r\n" 133 CfgGrpLstHdr -"ng[h%ldng] %sh\r\n" 134 CfgGrpLstFmt -"\r\nSub-board to toggle new message scan"\ 135 NScanCfgWhichSub - ", ~All, or ~Quit: " -"\r\nSub-board to toggle your message scan"\ 136 SScanCfgWhichSub - ", ~All, or ~Quit: " -"ng[h%ldng] %-40.40s hc%s\r\n" 137 SubPtrLstFmt -"\r\nSet new-scan pointer for which, ~All, or ~Quit: " 138 WhichOrAll -"\r\nRaw message input mode is now " 139 RawMsgInputModeIsNow -"OFF" 140 OFF -"ON" 141 ON -"\r\n\1n\1mPaging \1h%s #%u\1n\1m for private chat\r\n" 142 PagingUser -"\r\n-gSystem Statistics:\r\n\r\nn" 143 SystemStatsHdr -"\r\n-gNode #%d Statistics:\r\n\r\nn" 144 NodeStatsHdr -"Total Logons : %s\r\n" 145 StatsTotalLogons -"Logons Today : %s\r\n" 146 StatsLogonsToday -"Total Time : %s minutes\r\n" 147 StatsTotalTime -"Time Today : %s minutes\r\n" 148 StatsTimeToday -"Uploads Today : %s bytes in %lu files\r\n" 149 StatsUploadsToday -"Downloads Today : %s bytes in %lu files\r\n" 150 StatsDownloadsToday -"Posts Today : %s\r\n" 151 StatsPostsToday -"E-mails Today : %s\r\n" 152 StatsEmailsToday -"Feedback Today : %s\r\n" 153 StatsFeedbacksToday -"_\r\nyhChange to (User Name or Number): n" 154 ChUserPrompt -"PW: " 155 ChUserPwPrompt -"\r\n%ld bytes free\r\n" 156 NBytesFreeMemory -"\r\nError log:\r\n" 157 ErrorLogHdr -"Delete error log" 158 DeleteErrorLogQ -"\r\nNo error log exists.\r\n" 159 NoErrorLogExists -"\r\nClear critical error counters on all nodes" 160 ClearErrCounter -"\r\nInvalid node.\r\n" 161 InvalidNode -"\1n\r\n\1mSending telegram to \1h%s #%u\1n\1m "\ 162 SendingTelegramToUser - "(Max 5 lines, Blank line ends):\r\n\r\n\1g\1h" -"Delete Guru file" 163 DeleteGuruLogQ -"\1n\1g\7Telegram from \1n\1h%s\1n\1g on %s:\r\n\1h" 164 TelegramFmt -"\r\n\r\nYou can't download.\r\n" 165 R_Download -"\r\nwhSearching all directories...\r\n" 166 SearchingAllDirs -"whSearching all libraries...\r\n" 167 SearchingAllLibs -"\r\nwh%u Files Listed.\r\n" 168 NFilesListed -"\r\nwhEmpty directory.\r\n" 169 EmptyDir -"\r\nncSearching for files "\ 170 NScanHdr - "uploaded after h%sn\r\n" -"\r\n\r\nYou can't remove files.\r\n" 171 R_RemoveFiles -"\r\n\r\nThis directory is full.\r\n" 172 DirFull -"\r\n\r\nYou can't upload.\r\n" 173 R_Upload -"\r\n\r\nYou can't upload here.\r\n" 174 CantUploadHere -"_\r\n\r\nyhFilespec: n" 175 FileSpec -"SY: " 176 SystemPassword -"\r\n\r\nNo sysop directory specified.\r\n" 177 NoSysopDir -"\r\n\r\nYou can't upload to sysop.\r\n" 178 CantUploadToSysop -"-gDirectories of h%-40.40s "\ 179 DirLstHdr - "ngFiles\r\n\r\nh" -"ng(h%ung) %-40.40s %12.12s h%4u\r\n" 180 DirLstFmt -"\r\n_ghFile Libraries ng "\ 181 LibLstHdr - " Directories\r\n\r\nh" -"ng(h%ung) %-40.40s %12.12s h%4u\r\n" 182 LibLstFmt -"\1n\r\nInvalid NetMail address.\r\n" 183 InvalidNetMailAddr -"_\r\ngh%s ngTransfer Policy\r\n\r\nn" 184 TransferPolicyHdr -"<UNUSED185>" 185 Unused185 -"Initial uploads are rewarded with %d%% of the "\ 186 TpUpload - "credit value\r\n" -"All downloads are rewarded with %d%% of the "\ 187 TpDownload - "credit value\r\n" -"\r\n\r\nNo user directory specified.\r\n" 188 NoUserDir -"\r\nThere are no files for you.\r\n" 189 NoFilesForYou -"\r\n\r\nUser transfer directory is full.\r\n" 190 UserDirFull -"\r\n\r\nYou can't send files to users.\r\n" 191 CantUploadToUser -"ncLibrary : (%u) %syh" 192 BoxHdrLib -"ncDirectory : (%u) %syh" 193 BoxHdrDir -"ncFiles : %luyh" 194 BoxHdrFiles -"nc(h%unc) %s " 195 ShortHdrLib -"nc(h%unc) %s" 196 ShortHdrDir -"rhFilenames, specs, or flags [None]: mh" 197 BatchDlFlags -"\r\n\7rhiBatch download queue is full.n\r\n" 198 BatchDlQueueIsFull -"_\r\nyhFilespec [\1wAll Files\1y]: n" 199 FileSpecStarDotStar -"\r\n\r\nrhiNot enough free disk space.n\r\n"\ 200 LowDiskSpace - "\r\nhThe sysop has been notified.n\r\n" -"\r\n%s bytes free\r\n\r\n" 201 DiskNBytesFree -"_yhFilename: n" 202 Filename -"\r\nrhBad filename.\r\n" 203 BadFilename -"Upload '%s' to Sysop directory" 204 UploadToSysopDirQ -"Upload '%s' to User directory" 205 UploadToUserDirQ -"Upload '%s' to %s %s" 206 UploadToCurDirQ -"\r\nrhiThat file is already there!n\r\n" 207 FileAlreadyThere -"That file is already on disk. Add to data base" 208 FileOnDiskAddQ -"\r\nrhiThat file is not on disk!n\r\n" 209 FileNotOnDisk -"\r\nrhiPlease upload files with the following "\ 210 TheseFileExtsOnly - "extensions only:n\r\nwh" -"\r\nrhi%s has already been uploaded!n\r\n" 211 FileAlreadyOnline -"\r\nwhHit [ENTER] after last destination "\ 212 EnterAfterLastDestUser - "user.\r\n\r\n" -"_yhSend file to (User name or number): n" 213 SendFileToUser -"\r\nrhiDuplicate usern\r\n\r\n" 214 DuplicateUser -"\7\r\nrhi%s wouldn't be able to "\ 215 UserWontBeAbleToDl - "download it!n\r\n\r\n" -"\7\r\nrhiYou can't send yourself files.n\r\n\r\n" 216 CantSendYourselfFiles -"\r\n-gAdded to destination user list: "\ 217 UserAddedToDestList - "wh%s\r\n\r\nn" -"\r\n-gHow do you rate the content of this file "\ 218 RateThisFile - "(hwGng, hwRng, or hwXng): n" -"[%c] " 219 Rated -"Is this upload part of a set (multiple files)" 220 MultipleDiskQ -"_yhHow many files total: n" 221 HowManyDisksTotal -"_yhWhich file number is your upload: n" 222 NumberOfFile -" [%2.2d/%2.2d]" 223 FileOneOfTen -" [%d/%d]" 224 FileOneOfTwo -"\r\n-gEnter a description now.\r\n: " 225 EnterDescNow -"No description given." 226 NoDescription -"\r\nProtocol or ~Quit: " 227 ProtocolOrQuit -"\r\nProtocol, ~Batch or ~Quit: " 228 ProtocolBatchOrQuit -"\r\n\7rhiBatch upload queue is full.n\r\n" 229 BatchUlQueueIsFull -"\r\nnmh%s nmadded to batch upload queue"\ 230 FileAddedToUlQueue - "c - Files: h%u nc(h%unc Max)\r\n" -"\7_whNode %2d: g%sng sent you a file.\r\n" 231 UserToUserXferNodeMsg -"\1n\1g\1h%s\1y: \1w~B\1yatch download, "\ 232 FileInfoPrompt - "\1w~E\1yxtended info, "\ - "\1w~V\1yiew file, "\ - "\1w~Q\1yuit or [Next]: \1w" -"\r\n~Quit or [Next]: " 233 QuitOrNext -"~Remove, ~Move, ~Edit, ~View, ~Quit, or [Next]: " 234 RExemptRemoveFilePrompt -"n(%d) %s\r\n" 235 MoveToLibLstFmt -"_\r\nyhLibrary [%d]: n" 236 MoveToLibPrompt -"n(%d) %s\r\n" 237 MoveToDirLstFmt -"_\r\nyhDirectory [%d]: n" 238 MoveToDirPrompt -"%s moved to %s %s.\r\n" 239 MovedFile -"\r\nClose file record" 240 CloseFileRecordQ -"~Remove, ~Credits only, ~File only, ~Move, ~Edit, "\ 241 SysopRemoveFilePrompt - "~View, ~Quit, or [Next]: " -"~Remove, ~Edit, ~View, ~Quit, or [Next]: " 242 UserRemoveFilePrompt -"\r\nFile not there.\r\n" 243 FileNotThere -"\7\r\nrhiCouldn't remove '%s'.n\r\n" 244 CouldntRemoveFile -"Delete file" 245 DeleteFileQ -"Add %s to %s %s" 246 AddToOfflineDirQ -"Remove credits" 247 RemoveCreditsQ -"\r\nUser not available.\r\n" 248 UserNotFound -"_yhCredits to remove: n" 249 CreditsToRemove -"_wh%s was removed.\r\n"\ 250 FileRemovedUserMsg - "ngYou lost %s credits.\r\n" -"_\r\nyhFilename : n" 251 EditFilename -"\r\nrhiError renaming %s to %sn\r\n" 252 CouldntRenameFile -"%s renamed to %s\r\n" 253 FileRenamed -"_yhDescription : n" 254 EditDescription -"Delete extended description" 255 DeleteExtDescriptionQ -"_yhUploader : n" 256 EditUploader -"_yhCredit value : n" 257 EditCreditValue -"_yhTimes downloaded : n" 258 EditTimesDownloaded -"_yhOpen count : n" 259 EditOpenCount -"_yhAlternate Path : n" 260 EditAltPath -"\r\nwhYou only have %s credits.\r\n" 261 YouOnlyHaveNCredits -"\r\nYou don't have enough credits.\r\n" 262 NotEnoughCredits -"\r\nwhNot enough time left to transfer.\r\n" 263 NotEnoughTimeToDl -"\r\nProtocol, ~Batch, ~Quit, or [Next]: " 264 ProtocolBatchQuitOrNext -"\r\nBulk Upload %s %s Directory:\r\n" 265 BulkUpload -"_yh%s %7ld:" 266 BulkUploadDescPrompt -"\r\nrhiNo files in batch queue.n"\ 267 NoFilesInBatchQueue - "\r\n\r\nmUse hDnm or hUnm to add files to the queue.\r\n" -"_\r\nyhBatch: n" 268 BatchMenuPrompt -"\r\nClear upload queue" 269 ClearUploadQueueQ -"\r\nUpload queue cleared.\r\n" 270 UploadQueueCleared -"\r\nClear download queue" 271 ClearDownloadQueueQ -"\r\nDownload queue cleared.\r\n" 272 DownloadQueueCleared -"\r\nDownload queue is empty.\r\n" 273 DownloadQueueIsEmpty -"\r\n-ghUpload Queue:ng"\ 274 UploadQueueLstHdr - " Description\r\n\r\nn" -"gh%2d: ng%s %s\r\n" 275 UploadQueueLstFmt -"\r\n-ghDownload Queue:ng"\ 276 DownloadQueueLstHdr - " Credits Bytes Time\r\n\r\nn" -"gh%2d: ng%s %11.11s %11.11s %s\r\n" 277 DownloadQueueLstFmt -"\r\nwh Totals: %11.11s %11.11s %s\r\n" 278 DownloadQueueTotals -"\r\n-gRemove which file from upload "\ 279 RemoveWhichFromUlQueue - "queue (1-%d): n" -"\r\n-gRemove which file from download "\ 280 RemoveWhichFromDlQueue - "queue (1-%d): n" -"\r\nUpload queue is empty\r\n" 281 UploadQueueIsEmpty -"\r\nHang up after transfer" 282 HangUpAfterXferQ -"\r\nwhStart transfer now (Ctrl-X to abort):\r\nn" 283 StartXferNow -"_\r\nbhDisconnecting... wHbang up or wAbbort " 284 Disconnecting -"\rwhGood-bye! (Time Used: @TUSED@)>" 285 Disconnected -"rhi%s NOT SENT!n\r\n" 286 FileNotSent -"Deleting files in temp directory...\r\n" 287 RemovingTempFiles -"_yhExtract from: n" 288 ExtractFrom -"\r\nUnextractable file type.\r\n" 289 UnextractableFile -"\r\nFile not found.\r\n" 290 FileNotFound -"\r\n~Extract file(s), ~View archive, or ~Quit: " 291 ExtractFilesPrompt -"_\r\nyhTemp Directory: n" 292 TempDirPrompt -"n\r\n%s not created yet.\r\n"\ 293 TempFileNotCreatedYet - "\r\nUse the hAn command to create it.\r\n" -"\r\nUploader: %s\r\nFilename: %s\r\n" 294 TempFileInfo -"\r\n%s bytes in %u files\r\n" 295 TempDirTotal -"\r\n%u files removed.\r\n" 296 NFilesRemoved -"rhiAll other nodes should NOT be in use "\ 297 ResortWarning - "during resort/compression.n\r\n" -"-c%-15.15s yh%-25.25s " 298 ResortLineFmt -"bEmptyn\r\n" 299 ResortEmptyDir -"wSorting..." 300 Sorting -"\b\b\b\b\b\b\b\b\b\bbSorted n\r\n" 301 Sorted -"\b\b\b\b\b\b\b\b\b\bbCompressed %u slots "\ 302 Compressed - "(%s bytes)n\r\n" -"wh\r\n%s is already in the queue.\r\n" 303 FileAlreadyInQueue -"wh\r\nFile is not online.\r\n" 304 FileIsNotOnline -"n\r\nmh%s nmadded to batch download queue -\r\n"\ 305 FileAddedToBatDlQueue - "cFiles: h%unc (h%unc Max) Credits: h%snc"\ - " Bytes: h%snc Time: h%s\r\n" -"\r\nnrhThe sysop has not configured w%sr as a"\ 306 NonviewableFile - " viewable file type.\r\n" -"rhi%s NOT RECEIVED!n\r\n" 307 FileNotReceived -"\r\n\7rhi%s HAD ERRORS - NOT UPLOADED!n\r\n" 308 FileHadErrors -"rhi%s IS ZERO LENGTH - NOT UPLOADED!n\r\n" 309 FileZeroLength -"_wh%s (%s bytes) received.\r\n" 310 FileNBytesReceived -"_wh%s (%s bytes) sent.\r\n" 311 FileNBytesSent -"_hw%s was %sdownloaded by %s\r\n"\ 312 DownloadUserMsg - "ngYou were awarded %s credits.\r\n" -"partially " 313 Partially -"\r\nngLibrary :h (%u) %s" 314 FiLib -"\r\nngDirectory :h (%u) %s" 315 FiDir -"\r\nngFilename :h %s" 316 FiFilename -"\r\nngFile size :h %s" 317 FiFileSize -"\r\nngCredit value :h %s" 318 FiCredits -"\r\nngDescription :h %s" 319 FiDescription -"\r\nngUploaded by :h %s" 320 FiUploadedBy -"\r\nngFile date :h %s" 321 FiFileDate -"\r\nngUploaded on :h %s" 322 FiDateUled -"\r\nngLast downloaded :h %s" 323 FiDateDled -"\r\nngTimes downloaded :h %u" 324 FiTimesDled -"\r\nngTime to download :h %s" 325 FiTransferTime -"\r\nngAlternate Path :h %s" 326 FiAlternatePath -"\r\nrhiInvalid Alternate Path Number: %un" 327 InvalidAlternatePathN -"_\r\nwhFile is currently open by %d user%s.\r\n" 328 FileIsOpen -"\7\7\r\nhrHbagpypcy mBwirrgtbhcdmayy "\ 329 HappyBirthday - "wtro gybocu\r\n\7\7mHyawprpgy "\ - "bBcimrytwhrdgaby ctmo yyworug.b.c.\r\n\r\n" -"whYou haven't changed your password in more "\ 330 TimeToChangePw - "than %d days.\r\n\r\n" -"\r\nEnter a different password" 331 NewPasswordQ -"_\r\nyhNew password (4-8 chars): " 332 NewPassword -"_yhVerify (enter again): n" 333 VerifyPassword -"\7rhWrong!" 334 Wrong -"whPassword changed.\r\n" 335 PasswordChanged -"Sorry, you have no more logons allowed today.\r\n" 336 NoMoreLogons -"You can only logon once a day.\r\n" 337 R_Logons -"_bh[c�b] yEnter your full name or alias: w" 338 EnterYourAlias -"_bh[c�b] yEnter your full real name: w" 339 EnterYourRealName -"_bh[c�b] yEnter your company name: w" 340 EnterYourCompany -"_bh[c�b] yEnter your chat handle: w" 341 EnterYourHandle -"_bh[c�b] yEnter your sex (M/F): w" 342 EnterYourSex -"_bh[c�b] yEnter your street address: w" 343 EnterYourAddress -"_bh[c�b] yEnter your voice phone number: w" 344 EnterYourPhoneNumber -"_bh[c�b] yEnter your birthday (%s): w" 345 EnterYourBirthday -"_bh[c�b] yEnter your city, state: w" 346 EnterYourCityState -"_bh[c�b] yEnter your zip (or postal) code: w" 347 EnterYourZipCode -"_yhEnter a description of your computer: w" 348 EnterYourComputer -"Are you calling from North America" 349 CallingFromNAmericaQ -"Is the above information correct" 350 UserInfoCorrectQ -"bUser #c%-4d b: c%s\r\n" 351 LiUserNumName -"bLogons Today : c%-5u b(Max c%ub)\r\n" 352 LiLogonsToday -"bTime on Today : c%-5u b(Max c%lub)\r\n" 353 LiTimeonToday -"bMail Waiting : c%u\r\n" 354 LiMailWaiting -"bSysop is : c" 355 LiSysopIs -"Available" 356 LiSysopAvailable -"Not Available" 357 LiSysopNotAvailable -"rhiYou can't possibly be in two places at the "\ 358 UserOnTwoNodes - "same time.n\r\n" -"\7rhi%d critical errors have occurred. "\ 359 CriticalErrors - "Type ;ERR at main menu.n\r\n" -"_whYou have %d User to User Transfer%s "\ 360 UserXferForYou - "waiting for you\r\n" -"_whYou have sent %d unreceived User to "\ 361 UnreceivedUserXfer - "User Transfer%s\r\n" -"Read your mail now" 362 ReadYourMailNowQ -"Sorry, the system is closed to new users.\r\n" 363 NoNewUsers -"New User Password: " 364 NewUserPasswordPrompt -"Use automatic terminal type detection" 365 AutoTerminalQ -"Does your terminal support ANSI" 366 AnsiTerminalQ -"Do you have a color terminal" 367 ColorTerminalQ -"ngAre you using hRIPtermng or a hRIPscrip "\ 368 RipTerminalQ - "ngcompatible terminal program?\r\n"\ - "hwIMPORTANT:ng If you are not absolutely "\ - "sure, hit hwiNnbh" -"Does your terminal support IBM extended ASCII" 369 ExAsciiTerminalQ -"nYou can't use that name (duplicate or invalid).\r\n" 370 YouCantUseThatName -"l-gYour password is h%s\r\n" 371 YourPasswordIs -"\r\n_whWrite down your password and keep it "\ 372 NewUserPasswordVerify - "confidential.\r\n\r\nyhEnter this password "\ - "for verification: w" -"\7\r\nrhIncorrect, try again.\r\n" 373 IncorrectPassword -"_\r\nyhMagic word: w" 374 MagicWordPrompt -"\r\nSorry, that was not the magic word.\r\n" 375 FailedMagicWord -"Sorry, the system is full." 376 SystemFull -"*NEW USER* %-30.30s Age/Sex/BD : %-2d %c %s\r\n"\ 377 NewUserFeedbackHdr -"Real name : %-30.30s Phone number : %s\r\n"\ -"Computer : %-30.30s Modem type : %s\r\n\r\n" -"\7\r\nrhiYou must leave %s mail in order to be "\ 378 NoFeedbackWarning - "validated!n\r\n" -"\r\n\r\nNo external programs available.\r\n" 379 NoXtrnPrograms -"lnch%s ncExternal Programs:\r\n\r\n" 380 XtrnProgLstHdr -"ncNum h�nc Name " 381 XtrnProgLstTitle -"h������������������������������� " 382 XtrnProgLstUnderline -"hc%3u � nc%-25.25sh " 383 XtrnProgLstFmt -"\r\n-cWhich or h~Qncuit: h" 384 WhichXtrnProg -"\r\n%s is currently running %s on node %d.\r\n"\ 385 UserRunningXtrn - "\r\nTry again later.\r\n\r\n" -"Remove node lock" 386 RemoveNodeLockQ -"The minimum modem speed for this node is %ubps." 387 MinimumModemSpeed -"You do not have sufficient access for this node." 388 NoNodeAccess -"\1n\1r\1h\r\nSorry, this node is temporarily closed "\ 389 NodeLocked - "for maintenance.\1n\r\n" -"\r\nUnknown user\r\n" 390 UnknownUser -"\7Invalid Logon\r\n" 391 InvalidLogon -"%2.2d/%2.2d/%2.2d T:%5lu L:%3lu P:%3lu "\ 392 SlogFmt - "E:%3lu F:%3lu U:%6luk %3lu D:%6luk %3lu\r\n" -"Locally" 393 Locally -"\r\nSort alphabetically" 394 SortAlphaQ -"\r\nmhChecking Slots..." 395 CheckingSlots -"nh%-32.32snm%-30.30sh%-8.8s nm%-8.8s\r\n" 396 UserListFmt -"\r\1h\1w%d\b total users. \r\n" 397 NTotalUsers -"\1w%d \1busers with access to current sub-board.\r\n" 398 NUsersOnCurSub -"\1w%d \1busers with access to current directory.\r\n" 399 NUsersOnCurDir -"\r\n-cCurrent New-Scan date/time: h" 400 NScanDate -"yhYear: w" 401 NScanYear -" yMonth: w" 402 NScanMonth -" yDay: w" 403 NScanDay -" yHour: w" 404 NScanHour -" yMinute: w" 405 NScanMinute -" pm" 406 NScanPmQ -" am" 407 NScanAmQ -"rhiNot long enough!n" 408 PasswordTooShort -"rhiThat's your current password!n" 409 PasswordNotChanged -"rhiYou call that a password?n" 410 PasswordInvalid -"rhiThat password is too obvious!n" 411 PasswordObvious -"\r\nnA) IBM (or compatible)\r\nB) Apple\r\nC) "\ 412 ComuterTypeMenu - "Macintosh\r\nD) Amiga\r\nE) Other\r\n\r\n" -"_yhPrimary Computer: n" 413 ComputerTypePrompt -"Apple" 414 ComputerTypeB -"Macintosh" 415 ComputerTypeC -"Amiga" 416 ComputerTypeD -"Other" 417 ComputerTypeE -"\7\r\nNo user data defined.\r\n" 418 NoUserData -"rh��� iDELETEDnrh ���\r\n" 419 Deleted -"bh��� iINACTIVEnbh ���\r\n" 420 Inactive -"ncAlias : h%-30.30s ncPassword : "\ 421 UeditAliasPassword - "h%-8.8s %s\r\n" -"ncReal Name : h%-30.30s ncPhone number : "\ 422 UeditRealNamePhone - "h%s\r\n" -"ncAddress : h%-30.30s ncAge/Sex/BD : "\ 423 UeditAddressBirthday - "h%2d %c %s\r\n" -"ncLocation : h%-30.30s ncZip Code : "\ 424 UeditLocationZipcode - "h%s\r\n" -"ncNote : h%-30.30s ncHandle : "\ 425 UeditNoteHandle - "h%s\r\n" -"ncComputer : h%-30.30s ncModem type : "\ 426 UeditComputerModem - "h%s\r\n" -"ncComment %c : h%s\r\n" 427 UeditComment -"ncFirst on : h%-8.8s ncExpire : h%-8.8s "\ 428 UserDates - "ncLast on : h%-8.8s %02u:%02u\r\n" -"ncTime on : h%-5u ncToday : "\ 429 UserTimes - "h%-5u%-5uncLast call : "\ - "h%-5u%-5uncExtra : h%u\r\n" -"ncLogons : h%-5u ncToday : "\ 430 UserLogons - "h%-5u%-5uncPosts : "\ - "h%-5u%-5uncToday : h%u\r\n" -"ncE-mails : h%-5u ncTo sysop : "\ 431 UserEmails - "h%-5u ncWaiting : "\ - "h%-5u ncToday : h%u\r\n" -"ncNetMail : h%s\r\n" 432 UserNetMail -"ncUploads : h%13.13s ncbytes in "\ 433 UserUploads - "h%u ncfiles\r\n" -"ncDownloads : h%13.13s ncbytes in "\ 434 UserDownloads - "h%u ncfiles %s\r\n" -"- Leech: rhi%un" 435 UserLeech -"ncCredits : h%13.13s ncfree: h%s "\ 436 UserCredits - "nc(h%s ncper day)\r\n" -"ncMinutes : h%13.13s\r\n" 437 UserMinutes -"\r\nncSec Level : h%d\r\n" 438 UeditSecLevel -"ncFlags #1 : h%-26s ncFlags #3 : h%s\r\n"\ 439 UeditFlags - "ncFlags #2 : h%-26s ncFlags #4 : h%s\r\n" -"ncExemption : h%-26s ncRestricts : h%s\r\n" 440 UeditExempts -"\r\n_yhUser edit (w?y=Menu) "\ 441 UeditPrompt - "(w%uy of w%uy): n" -"Restore User" 442 UeditRestoreQ -"Activate User" 443 UeditActivateQ -"Delete User" 444 UeditDeleteQ -"User has mail waiting. Read/Delete it" 445 UeditReadUserMailWQ -"User has sent mail. Read/Delete it" 446 UeditReadUserMailSQ -"Deactivate User" 447 UeditDeactivateUserQ -"Change Exemptions" 448 ChangeExemptionQ -" n%s\r\nToggle: " 449 FlagEditing -"_yhGo to Name or Number: n" 450 GoToUser -"_yhLast on: w" 451 UeditLastOn -"_yhFirst on: w" 452 UeditFirstOn -"_yhExpire: w" 453 UeditExpire -"_yhPassword Last Modified: w" 454 UeditPwModDate -"_yhLevel: w" 455 UeditML -"_yhNote: w" 456 UeditNote -"_yhComment: w" 457 UeditComment -"_yhUpload Bytes: w" 458 UeditUlBytes -"_yhTotal Uploads: w" 459 UeditUploads -"_yhDownload Bytes: w" 460 UeditDlBytes -"_yhTotal Downloads: w" 461 UeditDownloads -"_yhLeech Downloads: w" 462 UeditLeech -"%d: L: %2d F: %s EX: %s\r\n"\ 463 QuickValidateFmt - " RE: %s\r\n" -"\r\n_yhValidate: n" 464 QuickValidatePrompt -"_yhPassword: w" 465 UeditPassword -"_yhCredits: w" 466 UeditCredits -"_yhMinutes: w" 467 UeditMinutes -"Copy user" 468 UeditCopyUserQ -"_yhTo slot #: n" 469 UeditCopyUserToSlot -"Change Restrictions" 470 ChangeRestrictsQ -"_yhAdjust Credits (- to subtract, M or K = "\ 471 ModifyCredits - "Mega/Kilobytes, or $): n" -"_yhAdjust Minutes (- to subtract, H = Hours): n" 472 ModifyMinutes -"\r\nDelete Questionaire" 473 DeleteQuestionaireQ -"hbDefault settings for w%s #%d\r\n\r\n" 474 UserDefaultsHdr -"nb[hwTnb] hTerminal Mode nb: c%s\r\n"475 UserDefaultsTerminal -"nb[hwEnb] hExternal Editor nb: c%s\r\n" 476 UserDefaultsXeditor -"nb[hwLnb] hScreen Length nb: c%s\r\n" 477 UserDefaultsRows -"nb[hwXnb] hExpert Menu Mode nb: c%s\r\n" 478 UserDefaultsMenuMode -"nb[hwPnb] hScreen Pause nb: c%s\r\n" 479 UserDefaultsPause -"nb[hwHnb] hHot Keys nb: c%s\r\n" 480 UserDefaultsHotKey -"nb[hwSnb] hSpinning Cursor nb: c%s\r\n" 481 UserDefaultsCursor -"nb[hwCnb] hClear Screen Between Messages nb: c%s\r\n" 482 UserDefaultsCLS -"nb[hwNnb] hAsk For New Message/File Scan nb: c%s\r\n" 483 UserDefaultsAskNScan -"nb[hwYnb] hAsk For Your Un-read Msg Scan nb: c%s\r\n" 484 UserDefaultsAskSScan -"nb[hwFnb] hAutomatic New File Scan nb: c%s\r\n" 485 UserDefaultsANFS -"nb[hwRnb] hRemember Current Sub-board nb: c%s\r\n" 486 UserDefaultsRemember -"nb[hwBnb] hBatch Download File Flagging nb: c%s\r\n" 487 UserDefaultsBatFlag -"nb[hwMnb] hForward E-mail to NetMail nb: c%s\r\n" 488 UserDefaultsNetMail -"nb[hwKnb] hCommand Shell nb: c%s\r\n" 489 UserDefaultsCmdShell -"nb[hwDnb] hDefault to Quiet Mode nb: c%s\r\n" 490 UserDefaultsQuiet -"nb[hwWnb] hChange Password or Signature\r\n" 491 UserDefaultsPassword -"nb[hwAnb] hTemporary/QWK Archive Type nb: c%s\r\n" 492 UserDefualtsArcType -"nb[hwZnb] hDefault Download Protocol nb: c%s "\ 493 UserDefaultsProtocol - "b%s\r\n" -"\r\nnhbWhich or [wQb]uit: c" 494 UserDefaultsWhich -"On" 495 On -"Off" 496 Off -"\r\n_bh[c�b] yHow many rows on your monitor "\ 497 HowManyRows - "[\1wAuto Detect\1y]: " -"\r\n_yhCurrent Password: w" 498 CurrentPassword -"Forward personal e-mail to network mail address" 499 ForwardMailQ -"_bh[c�b] yNetwork mail address "\ 500 EnterNetMailAddress - "(Example: user@domain)\r\n: " -"nlgSelect h%sng:\r\n\r\n" 501 SelectItemHdr -"gh%3d: ng%s\r\n" 502 SelectItemFmt -"\r\nWhich, ~Quit or [%u]: " 503 SelectItemWhich -"_wh\r\n\r\n%s is here...\r\n\r\nn" 504 SysopIsHere -"\r\n_whEnd of chat.\r\n\r\nn" 505 EndOfChat -"\r\n_yhChat: n" 506 ChatPrompt -"????" 507 AnonUserChatHandle -"\r\nn-gMultinode Chat - Type h/?ng for "\ 508 WelcomeToMultiChat - "menu.\r\n" -"\r\nwhWelcome to Channel %d (c%sw)\r\n\r\nn" 509 WelcomeToChannelN -"_wh%3d g%sng in multinode chat "\ 510 NodeInMultiChatLocally - "channel %d locally.\r\n" -"\r\nnmhYou're on the Air!\r\n\r\nn" 511 YoureOnTheAir -"_whNode %2d: g%sng joined multinode chat "\ 512 NodeJoinedMultiChat - "channel %u.\r\nn" -"_whNode %2d: g%sng left multinode chat "\ 513 NodeLeftMultiChat - "channel %u.\r\n" -"_yhCommand: n" 514 MultiChatCommandPrompt -"%s has password protected "\ 515 PasswordProtected - "this channel\r\nPassword: " -"\r\nCorrect.\r\n" 516 CorrectPassword -"rh\r\nWrong password.\r\n" 517 WrongPassword -"Password protect this channel" 518 PasswordProtectChanQ -"\r\n_yhPassword: " 519 PasswordPrompt -"_gh%-8.8s w%2d%c ng%s" 520 ChatLineFmt -"\r\nSysop page is now %s\r\n" 521 SysopPageIsNow -"\r\n%s is not available.\r\n" 522 SysopIsNotAvailable -"Chat with %s instead" 523 ChatWithGuruInsteadQ -"\r\nbhPrivate: g~Tngelegram, "\ 524 PrivateMsgPrompt - "h~Mngessage, h~Cnghat, or h~Qnguit: ch" -"\r\nhyNode, User name, w#yNumber, "\ 525 NodeToPrivateChat - "w'yHandle, or w^Uyser list: wh" -"\r\n_whNode %d is in private chat with another "\ 526 NodeNAlreadyInPChat - "node.\r\n" -"\r\n_whNode %d is not in use.\r\n" 527 NodeNIsNotInUse -"\r\nThere's no need to page yourself.\r\n" 528 NoNeedToPageSelf -"\r\nrhiDon't bug %s.n\r\n" 529 CantPageNode -"\7_whNode %2d: g%sng is paging you to chat.\r\n" 530 NodePageMsg -"\7_whNode %2d: g%sng is paging all nodes "\ 531 AllNodePageMsg - "to chat.\r\n" -"\7_whNode %2d: g%sng is paging you for private"\ 532 NodePageMsg - " chat.\r\n" -"\r\nYou can't send messages.\r\n" 533 R_SendMessages -"\r\nhyNode, Name, w#yNumber, "\ 534 NodeToSendMsgTo - "w'yHandle, w^Uyser list, or wAlly: wh" -"\r\nThere's no need to send a message to "\ 535 NoNeedToSendMsgToSelf - "yourself.\r\n" -"_yh\r\nMessage: " 536 NodeMsgPrompt -"\7_whNode %2d: g%sng sent you a message:\r\n"\ 537 NodeMsgFmt - "wh4%sn\r\n" -"\7_whNode %2d: g%sng sent all nodes a "\ 538 AllNodeMsgFmt - "message:\r\nwh4%sn\r\n" -"\r\nPaging %s..." 539 PagingGuru -"n\r\ncWaiting for hNode %d ncto join private "\ 540 WaitingForNodeInPChat - "chat. Hit hiCtrl-Cnc to abort.n\r\n\r\n" -"_whNode %2d: g%sng joined private chat.n\r\n" 541 NodeJoinedPrivateChat -"\r\n_whNode %2d: g%sng left private chat.n\r\n" 542 NodeLeftPrivateChat -"No one has logged on today.\r\n" 543 NoOneHasLoggedOnToday -"ghLast few callers:\r\nng" 544 LastFewCallers (*) -"\r\nnhm%-2d nm%-6lu wh%-25.25s m%-25.25s"\ 545 LastFewCallersFmt - "nm%02u:%02u h%-8.8s nm%-3d" -"\r\nghCallers Today:ng" 546 CallersToday -"_bhDo you mean %s #%u "\ 547 DoYouMeanThisUserQ - "(cYbes, cNbo, or cQbuit) ? n" -"UNKNOWN USER" 548 UNKNOWN_USER -"\r\nTime's up.\r\n" 549 TimesUp -"_whNode %2d: g%sng logged off\r\nn" 550 NodeLoggedOff -"_whNode %2d: g%sng logged on %s\r\nn" 551 NodeLoggedOnAtNbps -"n\r\n\r\nLogon : %s" 552 TiLogon -"\r\nNow : %s" 553 TiNow -"\r\nTime on : %s" 554 TiTimeon -"\r\nTime left : %s\r\n\r\n" 555 TiTimeLeft -"\r\n\r\nnCtrl-Key Commands (From Anywhere)\r\n"\ 556 ControlKeyMenu - "\r\nCtrl-S Pause Current Process"\ - "\r\nCtrl-Q Continue Current Process"\ - "\r\nCtrl-C Abort Current Process"\ - "\r\nCtrl-O Toggle Pause Temporarily"\ - "\r\nCtrl-Z Toggle Raw Input Mode"\ - "\r\nCtrl-U List Users Online"\ - "\r\nCtrl-P Send Private Message to Another Node"\ - "\r\nCtrl-T Time Information\r\n\r\n" -"\r\nnYou've taken too long to log on.\r\n" 557 TakenTooLongToLogon -"\r\nnYou've been inactive too long.\r\n" 558 CallBackWhenYoureThere -"@EXEC:yesnobar@" 559 YesNoQuestion -"Yes" 560 Yes -"No" 561 No -"@EXEC:noyesbar@" 562 NoYesQuestion -"_rh[Hit a key] " 563 Pause -"_bh[WAIT]" 564 Wait -"-g\r\nSystem Statistics Log:\r\n\r\nn" 565 SysStatsLogHdr -"-g\r\nNode #%d Statistics Log:\r\n\r\nn" 566 NodeStatsLogHdr -"_rhYour time has been reduced due to an "\ 567 ReducedTime - "upcoming event.\r\n\r\n" -"n\r\nTimed Event - Node: %d Time: %02d:%02d "\ 568 EventInfo - "Last Ran: %s\r\n" -"_rhi\r\n\r\nCarrier will be dropped in %d "\ 569 UploadBeforeEvent - "minutes due to upcoming event.n" -"_yh\r\nQWK: n" 570 QWKPrompt -"\r\nCtrl-A codes: ~Expand to ANSI, ~Leave in, or "\ 571 QWKCtrlACodes - "[Strip]: " -"\r\n_hwPacking Sub-board... " 572 QWKPackingSubboard -"\rbPacked:w%4lu bofw %lu>" 573 QWKPackedSubboard -"\r\n_hwPacking E-mail... " 574 QWKPackingEmail -"\rbPacked w%ub E-mail messages.>" 575 QWKPackedEmail -"\r\n_hwUnpacking..." 576 QWKUnpacking -"\r_hbUnpacked.>" 577 QWKUnpacked -"_whNo new messages.\r\n" 578 QWKNoNewMessages -"\r\nrhiPacket Compression Failed!n\r\n" 579 QWKCompressionFailed -"\r\nrhiCan't Extract!n\r\n" 580 QWKExtractionFailed -"\r\nrhiReply not received!n\r\n" 581 QWKReplyNotReceived -"_whInvalid Conference %d\r\n" 582 QWKInvalidConferenceN -"\r\n_hwCreating %s..." 583 CreatingFileList -"\rbCreated %s>" 584 CreatedFileList -"\rbNo Files.>" 585 NoNewFiles -"\r\nMessage pointers reset to initial values.\r\n" 586 MsgPtrsInitialized -"-\r\ngThe current conversion rate is h%u "\ 587 ConversionRate - "ngminutes for h100kng credits.\r\n\r\nn" -"\r\n_bhHow many w100k bcredit blocks to "\ 588 CreditsToMin - "convert to minutes (w%u Maxb): n" -"-rhiYou have too many minutes.n\r\n" 589 YouHaveTooManyMinutes -"\r\nYou are connected to a billing node for %s BBS."\ 590 BillingNodeMsg - "\r\nYour phone number will be charged $%d if "\ - "you do not hang up within 30 seconds.\r\n"\ - "\r\nPlease wait, or hit any key to hang up now..." -"Convert 100k credits to %u minutes" 591 Convert100ktoNminQ -"\r\n%lu credits have been added to your account.\r\n" 592 CreditedAccount -"\r\nANSI Capture is now %s\r\n" 593 ANSICaptureIsNow -"nm\r\nRetrieving h%snm..." 594 RetrievingFile -"n\r\nAlternate upload path now: %s\r\n" 595 AltULPathNow -"\r\nPrivate" 596 PrivatePostQ -"\r\n_yhPost to: " 597 PostTo -"\r\nPrivate posts require a destination user "\ 598 NoToUser - "name.\r\n" -"\r\n_whUsing your real name...\r\n" 599 UsingRealName -"\r\n_whPosting Privately...\r\n" 600 PostingPrivately -"\r\n_whPosting anonymously...\r\n" 601 PostingAnonymously -"\r\nCan't delete posts on this sub-board.\r\n" 602 CantDeletePosts -"\r\nhgSub-board Information:\r\n\r\nn" 603 SubInfoHdr -"Long Name : %s\r\n" 604 SubInfoLongName -"Short Name : %s\r\n" 605 SubInfoShortName -"QWK Name : %s\r\n" 606 SubInfoQWKName -"Max Msgs : %u\r\n" 607 SubInfoMaxMsgs -"\r\nQWK packet network using the tagline:\r\n%sn\r\n" 608 SubInfoTagline -"\r\nnFidoNet EchoMail Conference:\r\n%s (%s)\r\n" 609 SubInfoFidoNet -"View sub-board information file" 610 SubInfoViewFileQ -"\r\nghDirectory Information:\r\n\r\nn" 611 DirInfoHdr -"Long Name : %s\r\n" 612 DirInfoLongName -"Short Name : %s\r\n" 613 DirInfoShortName -"Allowed File Extensions : %s\r\n" 614 DirInfoAllowedExts -"Maximum Files : %u\r\n" 615 DirInfoMaxFiles -"View directory information file" 616 DirInfoViewFileQ -"n\r\nNo NetMail allowed.\r\n" 617 NoNetMailAllowed -"\r\nIt will cost you %lu credits to send NetMail. "\ 618 NetMailCostContinueQ - "Continue" -"nm\r\nSending NetMail To: h%snm (h%snm)\r\n"\ 619 NetMailing - " From: h%snm (h%snm)\r\n" -"Remove this sub-board from your new-scan list" 620 RemoveFromNewScanQ -"\r\n~Sub-board, ~Group, or ~All: " 621 SubGroupOrAll -"\r\n~Directory, ~Library, or ~All: " 622 DirLibOrAll -"\r\n_yhEnter path: " 623 EnterPath -"\r\nSearch and display extended information" 624 SearchExtendedQ -"\r\nDisplay Subjects Only" 625 DisplaySubjectsOnlyQ -"\r\nEcho is now %s \r\n" 626 EchoIsNow -"\r\nnyhPrivate Chat - bCtrl-C to Quitn\r\n\r\n" 627 WelcomeToPrivateChat -"\r\nngUploading h%s.REP\r\n" 628 UploadingREP -"ngReceived nh%sng from h%sng via QWK.\r\n" 629 ReceivedFileViaQWK -"rhi\rQWK packet message limit reached.nh\r\n" 630 QWKmsgLimitReached -"\r\nnPrivate posts not allowed on this sub.\r\n" 631 PrivatePostNotAllowed -"_whLoading message pointers..." 632 LoadingMsgPtrs -"\r \r" 633 LoadedMsgPtrs -"\r\nQuote original message" 634 QuoteMessageQ -"\r\nbhLine numbers (#,#), Range (#-#), w~Lbist "\ 635 QuoteLinesPrompt - "or [%s]: w" -"\r\n_chMultinode Chat Channels:\r\n\r\n" 636 ChatChanLstHdr -"ncNum Name Cost" 637 ChatChanLstTitle -"h��� ������������������������� ����" 638 ChatChanLstUnderline -"hc%3lu nc%-25.25sh%8lu" 639 ChatChanLstFmt -"\r\nYou can't access that channel.\r\n" 640 CantAccessThatChannel -"\r\nYou can't download from this directory.\r\n" 641 CantDownloadFromDir -"_whSearching for duplicates..." 642 SearchingForDupes -"\rn \r" 643 SearchedForDupes -"nhYour account will expire in ri%dnh days.\r\n" 644 AcctWillExpireInNDays -"nrhiYour account has expired!n\r\n" 645 AcctHasExpired -"\r\nDownload files in batch queue now" 646 DownloadBatchQ -"_rh\r\nWaiting for Slow Media Device #%u..." 647 WaitingForDeviceN -"\7nyh%snc sent you E-mail.\r\n" 648 UserSentYouMail -"\7nyh%snc sent you a file.\r\n" 649 UserSentYouFile -"nyh%snc read your E-mail on %s.\r\n" 650 UserReadYourMail -"\7_whNode %2d: g%sng read your E-mail.\r\n" 651 UserReadYourMailNodeMsg -"\r\nWhich, ~Quit, or [%u]: " 652 JoinWhichGrp -"\r\nWhich, ~Quit, or [%u]: " 653 JoinWhichSub -"\r\nWhich, ~Quit, or [%u]: " 654 JoinWhichLib -"\r\nWhich, ~Quit, or [%u]: " 655 JoinWhichDir -"l-gDirectories of h%s:\r\n\r\nh" 656 CfgDirLstHdr -" ng(h%dng) %sh\r\n" 657 CfgDirLstFmt -"l_ghFile Libraries:\r\n\r\n" 658 CfgLibLstHdr -"ng(h%dng) %sh\r\n" 659 CfgLibLstFmt -"_chListing nc(h%unc) %s "\ 660 BatchFlagPrompt - "(h%unc) %s (h?nc=Menu) (h%lunc Filesnc): n" -"nl4 hy[wBy]atch Download "\ 661 - "[wVy]iew Content [wEy]xtended "\ - "Info [wPy]revious Files [wQy]uit n\r\n" -"\r\nDownload attached file: w%sb (%s bytes)" 662 DownloadAttachedFileQ -"\r\n\r\nnTime left : %13u\r\n" 663 FreeMinLeft -"bh\r\nTime left to deposit in minute bank "\ 664 FreeMinToDeposit - "(w%u Maxb): n" -"\r\nE-mail file attachments not allowed.\r\n" 665 EmailFileNotAllowed -"\r\nnSorry, you have insufficient access to run "\ 666 CantRunThatProgram - "that program.\r\n\r\np" -"nh\r\n\7\r\nYou only have ri%unh minute%s "\ 667 OnlyXminutesLeft - "left.\r\n\r\n" -"\rnrhi\7\7@NAME@! nhAre you really there? n>" 668 AreYouThere -"Level %u" 669 NoAccessLevel -"Age %u" 670 NoAccessAge -"BPS %u" 671 NoAccessBPS -"Credits %lu" 672 NoAccessCredit -"Node %u" 673 NoAccessNode -"User %u" 674 NoAccessUser -"Days till expire %u" 675 NoAccessExpire -"Time Left %u" 676 NoAccessTimeLeft -"Time Used %u" 677 NoAccessTimeUsed -"Time of day %02d:%02d" 678 NoAccessTime -"Post/Call Ratio %u" 679 NoAccessPCR -"Upload/Download Ratio %u" 680 NoAccessUDR -"Upload/Download File Ratio %u" 681 NoAccessUDFR -"Flag 1 %c" 682 NoAccessFlag1 -"Flag 2 %c" 683 NoAccessFlag2 -"Flag 3 %c" 684 NoAccessFlag3 -"Flag 4 %c" 685 NoAccessFlag4 -"Sex %c" 686 NoAccessSex -"Exemption %c" 687 NoAccessExempt -"Restriction %c" 688 NoAccessRest -"Day of week %s" 689 NoAccessDay -"Group %u" 690 NoAccessGroup -"Sub-board %u" 691 NoAccessSub -"Library %u" 692 NoAccessLib -"Directory %u" 693 NoAccessDir -"nhNode Status\r\nc"\ 694 NodeLstHdr - "���� ���������������������������������������"\ - "���������������������������������\r\n" -"" 695 NodeActionMain -"" 696 NodeActionReadMsgs -"" 697 NodeActionReadMail -"" 698 NodeActionSendMail -"" 699 NodeActionReadTxt -"" 700 NodeActionReadSentMail -"" 701 NodeActionPostMsg -"" 702 NodeActionAutoMsg -"" 703 NodeActionXtrn -"" 704 NodeActionDefaults -"" 705 NodeActionXfer -"" 706 NodeActionDLing -"" 707 NodeActionULing -"" 708 NodeActionBiXfer -"" 709 NodeActionListFiles -"" 710 NodeActionLoggingOn -"" 711 NodeActionLocalChat -"h%sng (%u) %u %c in multinode chat"\ 712 NodeActionMultiChat - "%.0s%.0s%.0s channel %u" -"" 713 NodeActionGuruChat -"" 714 NodeActionChatSec -"" 715 NodeActionSysopAct -"" 716 NodeActionQWK -"" 717 NodeActionPrivateChat -"" 718 NodeActionPaging -"" 719 NodeActionRetrieving -"YNQ*" 720 YNQP (Yes/No/Quit/Password chars) diff --git a/ctrl/usr144.mdm b/ctrl/usr144.mdm deleted file mode 100644 index 9557047856..0000000000 --- a/ctrl/usr144.mdm +++ /dev/null @@ -1,6 +0,0 @@ -# This is for USRobotics 14400bps modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE USR96 -SPEC_INIT ATS15=8&A1&B1&H1&I0&M4&R2&S0&K3 -COM_RATE 38400 diff --git a/ctrl/usr144ds.mdm b/ctrl/usr144ds.mdm deleted file mode 100644 index f2939fd0c0..0000000000 --- a/ctrl/usr144ds.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for USRobotics Dual Standard 14400bps modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE USR96DS -COM_RATE 38400 diff --git a/ctrl/usr168.mdm b/ctrl/usr168.mdm deleted file mode 100644 index 7604da3cbd..0000000000 --- a/ctrl/usr168.mdm +++ /dev/null @@ -1,4 +0,0 @@ -# This is for USRobotics 16800bps modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE USR144 diff --git a/ctrl/usr168ds.mdm b/ctrl/usr168ds.mdm deleted file mode 100644 index 8609441bfc..0000000000 --- a/ctrl/usr168ds.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for USRobotics Dual Standard 16800bps modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE USR144DS -COM_RATE 57600 diff --git a/ctrl/usr216ds.mdm b/ctrl/usr216ds.mdm deleted file mode 100644 index 87f67df2d7..0000000000 --- a/ctrl/usr216ds.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for the USRobotics Dual Standard 21600bps modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE USR144DS -COM_RATE 57600 diff --git a/ctrl/usr288ds.mdm b/ctrl/usr288ds.mdm deleted file mode 100644 index 6deed78db8..0000000000 --- a/ctrl/usr288ds.mdm +++ /dev/null @@ -1,7 +0,0 @@ -# This is for the USRobotics Dual Standard 28800bps modem -# Updated 09/10/94 Digital Dynamics -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE USR216DS -COM_RATE 115200 - diff --git a/ctrl/usr96.mdm b/ctrl/usr96.mdm deleted file mode 100644 index 2114561610..0000000000 --- a/ctrl/usr96.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for USRobotics 9600bps modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN9600 -DIAL_STR ATX4DT -TERM_INIT ATE1V1X7 -SPEC_INIT ATS15=8&A1&B1&H1&I0&M4&R2&S0&K0 -COM_RATE 19200 diff --git a/ctrl/usr96ds.mdm b/ctrl/usr96ds.mdm deleted file mode 100644 index 2e55b22bd2..0000000000 --- a/ctrl/usr96ds.mdm +++ /dev/null @@ -1,6 +0,0 @@ -# This is for USRobotics Dual Standard 9600bps modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE USR96 -COM_RATE 19200 -SPEC_INIT ATS15=8B0&A2&B1&H1&I0&K3&M4&R2&S0 diff --git a/ctrl/ven14400.mdm b/ctrl/ven14400.mdm deleted file mode 100644 index 9be2b83c17..0000000000 --- a/ctrl/ven14400.mdm +++ /dev/null @@ -1,5 +0,0 @@ -# This is for Ven-Tel 14400bps modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE USR96 -COM_RATE 19200 diff --git a/ctrl/viv14400.mdm b/ctrl/viv14400.mdm deleted file mode 100644 index 464cde3b76..0000000000 --- a/ctrl/viv14400.mdm +++ /dev/null @@ -1,6 +0,0 @@ -# This is for Viva 14400/FAX modems -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN14400 -SPEC_INIT ATS95=3%C2 -COM_RATE 38400 diff --git a/ctrl/viv9624e.mdm b/ctrl/viv9624e.mdm deleted file mode 100644 index 7c2b69045b..0000000000 --- a/ctrl/viv9624e.mdm +++ /dev/null @@ -1,7 +0,0 @@ -# This is for the ViVa 9624E modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 57600 -LOCKED_RATE YES -FLOW_CONTROL BOTH diff --git a/ctrl/viv9642e.mdm b/ctrl/viv9642e.mdm deleted file mode 100644 index 58ec6e2706..0000000000 --- a/ctrl/viv9642e.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for the ViVa 9642e modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT ATS95=3%C2 diff --git a/ctrl/xtrn.cnf b/ctrl/xtrn.cnf deleted file mode 100644 index 50f0a5da68a2fc390b4094520c1d807561c5d261..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7912 zcmWe;a0v}@4GwV)VjvSZ`}_Jj`nl*i`}>k*f{$l#2w57TnnFB%U0tATa;RV@r(jCl z5J--tNO~NDypVXLGkyHs{oUM1*9X(#<KYNnl0^r2M|lR2r4ynlz&q5B5)*<W{hVE0 zJjqT&jzP|#3;=Nq8Dww>CBA21aQ6)JbPXrNVyG4;M=y#Z(8WK@RoBmz?C^7^B=8v+ z7(5(9oIS{oJ_bgH;L5yY*Obf>g)$>O15;?QV58tkMOCr5GA}t5q(@azK{ZD~H4U43 zoMM#fXHZ~ZaP$lI#AyMt1S2wsfq{XU!8b884^0p|*Vob054#MpqV9>gsl~)7c6ao3 z4JJk*PBs1|8L34IpvcT9%FjzJQ3$RqE=kSBwB0|%!!^jsi2~dB85kIxN^^3GT`N-+ z6+o=ilFU3zo4{^$3ia^`c8zoebEr(PGB7ZJ<5w#Q<eb#XR4Q9AaK<4;q?1#yf=^~~ z33kT>JNaOjpj?!Z5gfP-3=A~1geYg~>BU5Z1o_2K&mBnN>zi1ToT1>Gn4MaL#WBIY zq&CcgT!TXt{QN@{+_4ykEQAQ(;@n(h3A(f4;Y+e-u{)KK!7V>OMZqmIJ)=YsyAqhF zo4>z{n`a0K<pa^-%OnD`BrQKbB`vcgmDHLFrk_$87QP_QQfd}RKO=)nW^$@Rcp|nG z3sQi<E}qV=;f`eYPY?!SvKV<`<wHtla%y>Ek%E2>rYd4YQp%HaQWJ@*m9d!z3twt^ z7Sbw$R-{fjiOJbniOJbmQ*y8qWgQS~-hqlSa>By5I4O(lumu@boRmdT0K>wUTApQO zaLLb2%*;~=$j4slf*cLOE&=}D<ae(jX5b)^(r*FC9pndbN&!W|%K!^sYI&BCAtWPJ z!6`MdxJ12J0TR|Y0wKhS)b2mg<u4;YEd7=wr6}l^Wag$8+Zr0+a0o4hVc|=<XR*7A zi6JbtsH7;dG&N5_BRn(D*hmxH^w#yj7|#fE4T5wIi4HdGR$>!{1uuhENor1dVo9n( zS!z*<9;kPgQIxNjmx`m!h|R1)C595dKACx?6?ntf$I~x@fiB^jTvj{`f|r4bAw03T zB-JM|F9nu<am9bQV{nM8k0S{kVd5hKGyRr>oRyQ9m!g}LRIHbrKd{YWTwy{`oC#e1 zh9u@B<|Y;=C*lj^5Jw+JU&ml)f@Z=MP!hf+FeeT5@O8{7Ni9lEQ3y&+%*iaN#2vzp zJ|V6_Bn@#>6272Rn^*)Qhiuvfr86c5f8D73yi^4Z|6qM1O^^^S?5`W;??*!K4VO9C z#4*c<{HpxCRK3*H;^d)QI503UFflmi=cFjOl@@2_=iv`zXSdK`Pk$1MUu*%1Lku%~ z)4(p$OGzxsE=f(!(917M$Dwyn3$rr7$8J>>LG8{IvYq>%kCBCe8H;xK%$KTSaZ*xo z4$cueEP6pg@V01CYEga;nH^`4K@HGBP<Sr_ZZb%g0vzn@1{uOqRV+?UOIJ|MR?sg| zEmzPdZMdI-0q#Ny9D`M>o2QFEc#Iwr2dT*!`3m|unR%o-5adD@tTs?82y&r+Xb1xX biVIVVv5qC+v#f!Efi^B=LLJ@3+QkO|@XvP1 diff --git a/ctrl/zoom9600.mdm b/ctrl/zoom9600.mdm deleted file mode 100644 index cce5156200..0000000000 --- a/ctrl/zoom9600.mdm +++ /dev/null @@ -1,8 +0,0 @@ -# This is for Zoom V.32 modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 38400 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT ATS46=138S48=7W0&K3&M5&Q5\G0\N3 diff --git a/ctrl/zyx1496.mdm b/ctrl/zyx1496.mdm deleted file mode 100644 index 5f091d0784..0000000000 --- a/ctrl/zyx1496.mdm +++ /dev/null @@ -1,10 +0,0 @@ -# This is for the ZyXEL U-1496 modem -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE GEN2400 -COM_RATE 57600 -LOCKED_RATE YES -FLOW_CONTROL BOTH -SPEC_INIT ATN0X6S35.7=1S38.5=1 -TERM_INIT ATE1N5V1X5 -DIAL_STR ATS42.6=1DT diff --git a/ctrl/zyx1496f.mdm b/ctrl/zyx1496f.mdm deleted file mode 100644 index e616889c33..0000000000 --- a/ctrl/zyx1496f.mdm +++ /dev/null @@ -1,6 +0,0 @@ -# This is for the ZyXEL U-1496 modem with FAX enabled -# Updated 03/23/96 Digital Dynamics: Now uses verbal result codes - -INCLUDE ZYX1496 -INIT_STR AT&FS0=0S2=128E0V1X4&C1&D2N0X6S35.7=1S38.5=1#B1 -SPEC_INIT AT+FCLASS=6 diff --git a/docs/_borders/bottom.htm b/docs/_borders/bottom.htm deleted file mode 100644 index 1304233ba2..0000000000 --- a/docs/_borders/bottom.htm +++ /dev/null @@ -1,44 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<title>Shared Bottom Border</title> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<meta name="Microsoft Border" content="none"> -</head> - -<body> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -</body> - -</html> diff --git a/docs/_borders/top.htm b/docs/_borders/top.htm deleted file mode 100644 index 83b687698f..0000000000 --- a/docs/_borders/top.htm +++ /dev/null @@ -1,17 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=IBM437"> -<title>Shared Top Border</title> -<meta name="Microsoft Border" content="none"> -</head> - -<body> - -<a href="http://www.synchro.net"><img border="0" src="../images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -</body> - -</html> diff --git a/docs/adding_nodes.html b/docs/adding_nodes.html deleted file mode 100644 index 4d47a320ca..0000000000 --- a/docs/adding_nodes.html +++ /dev/null @@ -1,419 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=IBM437"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Adding Nodes</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><b><a name="top"></a></b><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2><a name="AddingNodes">[3.0] - Adding Nodes</a></h2> -<pre>Run SCFG. Select Nodes from the main menu. Hit INS (insert key) to create -additional nodes. Each added node will have the configuration options copied -from the last node. Make any configuration changes (including modem/com port -configuration) necessary. - -<font color="#FF0000"><i><b>v2 Only:</b></i></font> Copy *.BAT from your NODE1 directory into each added node directory.</pre> -<pre><font color="#FF0000"><i><b>v3 Only:</b></i></font> If you'd like all nodes to be available for telnet logins, set the - <b>Last Node</b> in the telnet configuration dialog to your highest - configured node number.</pre> -<pre> <img border="0" src="images/sbbsctrl_telnet_cfg_gen.gif" width="358" height="318"></pre> -<pre> All nodes controlled by the same instance of SBBSCTRL will use the - configuration information for the node specified as the <b>First Node -</b> in the telnet configuration dialog.</pre> -<h2><a name="ConfiguringNodes">[3.1] - Configuring Nodes</a></h2> -<pre>You can configure any node from within SCFG regardless of what computer -(or virtual computer) you're using. To configure a node, select "<i>Nodes</i>" from -the SCFG "<i>Configure</i>" menu. You will then see a list of all the nodes installed -on your system. You will also see the bottom line of the screen now has two -additional key commands added, <i>INS</i> (Insert) and <i>DEL</i> (Delete). INS and DEL are -used to add and delete nodes from the system. If you select one of the nodes -listed, you will receive another menu as follows:</pre> -<pre><img border="0" src="images/scfg_node1.gif" width="652" height="331"></pre> -<pre>We will now discuss the options of this menu. - -<b>Name <i><font color="#FF0000">(v2 Only)</font></i>:</b> - This is the name of the node. This parameter is not used for anything - but documentary purposes in the BBS. - -<b>Phone Number: -</b> This is the phone number (or IP address/host name) of this node. - -<b>Minimum Connect Rate <i><font color="#FF0000">(v2 Only)</font></i>: -</b> This is the minimum modem connection rate that will be allowed. Callers - can still connect and attempt to logon, but without the 'M' exemption, - they will be told what minimum connect rate is and disconnected. - -<b>Logon Requirements: -</b> Use this option to set specific requirements to logon this node. - -<b>Local Text Editor <i><font color="#FF0000">(v2 Only)</font></i>: -</b> This is the command line to use when editing text files or messages - locally. This command line is not used when posting or sending e-mail - unless the above option is set to 'Yes'. If this option is not - specified, the default editor for the current user will be used. An - example (using Qedit as the editor) would be: - <b>q.exe %f</b> - - Assuming <b><i>Q.EXE</i></b> is in the DOS search path. If it isn't, you can specify - the location of the program. Example: - <b>c:\qedit\q.exe %f</b> - - The <b>%f</b> parameter will expand to the path and filename of the file to - edit. - -<b>Text Viewer <i><font color="#FF0000">(v2 Only)</font></i>:</b> - This is the command line to use to view text files locally. Currently, - this command line is only used to view the system log files. You should - use a program that allows the text scrolling up and down as well as - string searches. A popular program for this use is Buerg's LIST. - If you are running multiple nodes and the program you wish to use - leaves the file open while viewing, you should use a batch file that - actual copies the file to view and then views the copy. - Example (if program name is LIST): - LISTIT.BAT:</pre> -<blockquote> - <table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> - <pre>@echo off -copy %1 list.tmp -list list.tmp -del list.tmp</pre> - </td> - </tr> - </table> -</blockquote> -<pre> An example for this field (using the LISTIT batch file) would be: - <b>%!listit.bat %f</b> - - The <b>%!</b> parameter specifies that the batch file is located in the - EXEC directory. If is not located there, you can remove the <b>%!</b> so that - the DOS search path will be searched for the batch file or specify - its location. - - The <b>%f</b> parameter will expand to the path and filename of the file to - view.</pre> -<pre><b>Configuration Command <i><font color="#FF0000">(v2 Only)</font></i>: -</b> This is the command line to use to execute the Synchronet configuration - program from the WFC screen. The simplest command line to use is "SCFG" - (this will execute SCFG.BAT or SCFG.CMD from the current node - directory). Alternate command lines: - - If this node is running Synchronet for DOS: - -<b> %!scfg %k /t%w -</b> - This command lines has the added advantage of passing the - timeslice configuration of the current node (enabling Win/OS2 - idle API calls or disabling DESQview/DOS idle API calls). - This flavor of SCFG supports user mouse control. - This flavor of SCFG can only use conventional DOS memory for - configuration items (EMS is automatically used, if available, - for executable overlay caching - improving performance but - not increasing the maximum number of configured items). - - To use the extended-DOS/Win32 version of SCFG: - -<b> %!scfg32 %k -</b> - This flavor of SCFG can access all of your installed memory - (no memory limitations under Win32). - This flavor of SCFG does not support any timeslice API calls - (may consume more timeslices than necessary when run under a - non-Win32 multitasking environment). - - If this node is running Synchronet for OS/2: - -<b> %!scfg4os2 %k -</b> - This flavor of SCFG has no memory limitations. - -<b>DOS Command Interpreter <i><font color="#FF0000">(v2 for OS/2 Only)</font></i>: -</b> If this node is running Synchronet for OS/2, this is the path to your - command interpreter for OS/2 virtual DOS machines. Example: - -<b> C:\OS2\MDOS\COMMAND.COM -</b> - This option is only used when running Synchronet for OS/2.</pre> -<h2><a name="NodeToggleOptions">[3.2] - Node Toggle Options</a></h2> -<pre><img border="0" src="images/scfg_node1_toggles.gif" width="652" height="331"> - -<b>Alarm When Answering <i><font color="#FF0000">(v2 Only)</font></i>:</b> - If you would like have the BBS sound an alarm when answering the phone, - set this option to Yes. - -<b>Status Screen While WFC <i><font color="#FF0000">(v2 Only)</font></i>: -</b> This node will display a screen with system usage statistics and the - current status of all active nodes. - -<b>Total Msgs/Files While WFC <i><font color="#FF0000">(v2 Only)</font></i>: -</b> If you have the system statistics displayed while WFC, and you wish to - include the total number of messages and files in the display, set this - option to Yes. The retrieval of statistics is faster when set to No. - -<b>Use Editor for Messages <i><font color="#FF0000">(v2 Only)</font></i>: -</b> If this option is set to 'Yes' and you have specified a Local Text - Editor, when logged on locally this editor will be used for the creation - of all messages. - -<b>Use EMS for Overlays <i><font color="#FF0000">(v2 for DOS Only)</font></i>: -</b> Set this option to 'Yes' to have this node to use EMS memory for - overlay files. Setting this option to 'Yes' can help increase the - performance of the BBS significantly if enough EMS memory is available - (about 360K). - -<b>Allow Swapping <i><font color="#FF0000">(v2 for DOS Only)</font></i>: -</b> Set this option to 'Yes' to allow this node to swap when necessary. - If you do not have EMS, XMS, or Extended memory available, and you - do not wish to have Synchronet swap to disk, you should set this - option to 'No'. - -<b>Swap to EMS <i><font color="#FF0000">(v2 for DOS Only)</font></i>: -</b> When set to 'Yes', Synchronet will attempt to swap to EMS memory when - executing a program that is in your "Global Swap List". - -<b>Swap to XMS <i><font color="#FF0000">(v2 for DOS Only)</font></i>: -</b> When set to 'Yes', Synchronet will attempt to swap to XMS memory. - -<b>Swap to Extended Memory <i><font color="#FF0000">(v2 for DOS Only)</font></i>: -</b> When set to 'Yes', Synchronet will attempt to swap to Extended memory. - This option should always bet set to 'No' when running under a DOS - multitasker. - -<b>Windows/OS2 Time Slice API <i><font color="#FF0000">(v2 for DOS Only)</font></i>: -</b> Set this option to 'Yes' if you are running Synchronet under OS/2. - You may experience poor performance if this option is set to 'Yes' - and you are running Synchronet under Microsoft Windows v3.x. If this - occurs, set this option to 'No'. - -<b>DESQview Time Slice API <i><font color="#FF0000">(v2 for DOS Only)</font></i>: -</b> Set this option to 'Yes' if you are running Synchronet using DESQview. - Since Synchronet auto-detects DESQview it will not hurt anything to - leave this option set to 'Yes' if you are not running DESQview. - -<b>DOS Idle Interrupts <i><font color="#FF0000">(v2 for DOS Only)</font></i>: -</b> This option defaults to 'Yes'. You should not change this setting. - -<b>Low Priority String Input: -</b> Normally Synchronet does not give up time-slices under multi-taskers - when waiting for string input from the user. Setting this option to - 'Yes' will for Synchronet to give up time-slices when waiting for - string input, this may cause "jerky" keyboard response but will - improve overall system performance under multi-taskers. This option - should normally be set to 'Yes'. - -<b>Allow Logon by Number: -</b> Setting this option to 'Yes' will allow users to logon by typing their - user number at the login logon prompt. - -<b>Allow Logon by Real Name: -</b> When set to 'Yes' this option allows users to enter their real name - (or company name) at the login prompt to logon to the BBS. - -<b>Always Prompt for Password: -</b> When set to 'Yes' this option will cause the user to ALWAYS be prompted - for a password at logon, even if they have entered an incorrect (non- - existent) name at the login prompt. - -<b>Disable Local Inactivity <i><font color="#FF0000">(v2 Only)</font></i>: -</b> If you wish to disable the user inactivity warning and auto-logoff - for local logons, set this option to 'Yes'. - -<b>Disable Local Keyboard <i><font color="#FF0000">(v2 Only)</font></i>: -</b> If this option is set to 'Yes', the local keyboard will be completely - disabled when Synchronet is run. The only way to exit Synchronet would - be to down the node from another process or reboot the machine. - -<b>Local System Protection <i><font color="#FF0000">(v2 Only)</font></i>: -</b> If you wish to require the system password for WFC commands and local - sysop Alt-key combinations, set this option to 'Yes'. - -<b>Beep Locally <i><font color="#FF0000">(v2 Only)</font></i>: -</b> To disable the local speaker of this node for online beeps, set this - option to 'No'. - -<b>Allow 8-bit Remote Logons: -</b> To allow E-7-1 terminals to use this node, set this option to 'No'. - This will also eliminate the ability of 8-bit remote users to send - IBM extended ASCII characters during the logon sequence. - -<b>Reset Video Between Calls <i><font color="#FF0000">(v2 Only)</font></i>: -</b> If this option is set to 'Yes', Synchronet will reset the current - node console's video mode before each WFC cycle. This option should - be set to 'No' for most configurations.</pre> -<h2><a name="NodeAdvancedOptions">[3.3] - Node Advanced Options</a></h2> -<pre>When selecting this option, you will be brought to a sub-menu of options as -follows:</pre> -<pre><img border="0" src="images/scfg_node1_advanced.gif" width="652" height="331"> - -<b>Validation User: -</b> This is the number of the user to whom validation feedback is sent. - This value will usually be set to 1 (the sysop). If this value is set - to 0, then new users will not be required to enter validation feedback. - -<b>Screen Length <i><font color="#FF0000">(v2 Only)</font></i>: -</b> This is the length of the system screen or video window. This should - be set to "Auto-Detect" always, unless you have a specific reason - to force Synchronet to think the screen length is a certain value. - -<b>Screen Blanker <i><font color="#FF0000">(v2 Only)</font></i>: -</b> When enabled, this will cause the screen for this node to blank out - when waiting for a caller after the configured amount of inactive - time. - -<b>Semaphore Frequency <i><font color="#FF0000">(v2 Only)</font></i>: -</b> This option specifies how often (in seconds) this node should perform - semaphore checks (e.g. checks to see if an event should be run, the - node should be downed, etc.). - -<b>Statistics Frequency <i><font color="#FF0000">(v2 Only)</font></i>: -</b> This options specifies how often (in seconds) this node should check - system statistics (calls per day, logons today, etc.). Used when - updating the WFC statistics display. - -<b>Inactivity Warning: -</b> This is the number of seconds of user inactivity before a warning - (typically: "Username, are you still there?") is displayed to the - user. - -<b>Inactivity Disconnection: -</b> This is the number of seconds of user inactivity before the user - is automatically disconnected. - -<b>Cost Per Call: -</b> This option should only be set to something nonzero for a billing - node. A billing node is a node attached to special phone line that will - automatically charge the caller a predetermined amount (usually area - code 900 or prefix 976 numbers). Set this value to the amount that the - caller will be billed after the initial 30 seconds. The user doesn't - actually access the BBS through this phone number as 900/976 services - charge the sysop by the minute an unrealistic amount. The user just - enters his or her name/alias and password and their account is credited - with the amount of credits per dollar specified in the System options - multiplied by this field (Cost per call) and the user is hung up on. - The user then calls the normal BBS nodes and has instant access to - their purchased credits. - -<b>Daily Event: -</b> This is the command line to execute when the first caller after - midnight logs off. If the program is located in the EXEC directory, - this command line should start with the %! specifier. - -<b>Control Directory: -</b> This is the path to the control directory where all the shared - configuration (.CNF) files for SBBS are stored. TEXT.DAT (the editable - ASCII file that contains almost all of the color and text that SBBS - displays) and a few miscellaneous binary data files are also stored - in this directory. All nodes of the system must have the same control - directory and this directory should not be located on a RAM disk. - -<b>Text Directory: -</b> This is the path to the text directory. This is where all menus, - macros, SIF files, QWK files, system information, and other text - files are stored. All data beneath this directory branch is READ ONLY - as far as Synchronet is concerned, so changing this directory to a RAM - drive would enhance performance and wouldn't risk data loss. If you do - change this path, be sure to copy all the files and subdirectories of - the original text directory there. If you do change this path to a RAM - drive, you will need automate the copying of all of the files and - subdirectories there upon system startup (possibly AUTOEXEC.BAT) with a - sequence of commands like this: -<b> md r:\text - xcopy c:\sbbs\text\*.* r:\text /S -</b> -<b>Temporary Directory: -</b> This is the path to the directory that this node will use for - temporary file storage. This directory must point to somewhere unique - and nonvolatile. All the files in this directory are deleted upon - execution of the BBS, so do not store any files you want to keep in - this directory. Each node must have its own temp directory. For - increased performance on batch uploads, it is best if this directory - is on the same disk drive as the majority of your file transfer - directories.</pre> -<pre><b> <i><font color="#FF0000">In v3+, this option should always be set to "TEMP\".</b></font></i> - -<b>Swap Directory <i><font color="#FF0000">(v2 Only)</font></i>: -</b> This is the path to the directory that this node will use for - swapping to disk if "Allow Swapping" is set to 'Yes' and Swapping - to EMS, XMS, and Extended memory is either disabled or not enough - memory is available.</pre> -<h3><a name="ModemConfiguration"><u>Modem Configuration</u></a> - -<b> <i><font color="#FF0000">(v2 Only)</font></i></b></h3> -<div align="left"> -<pre align="left">This sub-menu and the options contained within it are discussed in another -section of this manual. Consult the '<a href="modem_setup.html">Modem Set-Up</a>' section of this manual -for more information.</pre> -</div> -<h2 align="left"><a name="WFC_NumberKeys">[3.4] - Wait for Call Number -Keys</a> - -<b><i><font color="#FF0000">(v2 Only)</font></i></b></h2> -<div align="left"> -<pre>This option lets you configure what command line will be executed for each -number key (0-9) while waiting for call. These commands will generally be -simple things that don't require much memory, such as listing the ERROR.LOG, -listing the GURU.LOG, editing a file, or any other simple functions. For large -program functions, see Wait for Call Function Keys.</pre> -</div> -<h2 align="left"><a name="WFC_FunctionKeys">[3.5] - Wait for Call Function -Keys</a> - -<b><i><font color="#FF0000">(v2 Only)</font></i></b></h2> -<div align="left"> -<pre>This option lets you configure what command line will be executed for each -function key (F1-F12) while waiting for call. These commands can execute just -about any program because Synchronet will shrink to 16k before executing it. -Popular uses for these shrinking commands would be running a terminal program -or other large applications.</pre> -</div> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/amail.cfg b/docs/amail.cfg deleted file mode 100644 index 8e8a6b6dbc..0000000000 --- a/docs/amail.cfg +++ /dev/null @@ -1,36 +0,0 @@ -SYSOP Your Name -SYSTEM Your BBS (XXX) XXX-XXXX -ADDRESS 1:123/456 -INBOUND C:\IM\INBOUND -OUTBOUND C:\IM\OUTBOUND - -ARCDEF ZIP 0 504B - ADD PkZip %A %F - EXTRACT PkUnzip %A -END - -ARCDEF ARC 0 1A - ADD Arca %A %F - EXTRACT Arce %A -END - -ARCDEF LZH 2 2D6C68 - ADD Lha a %A %F - EXTRACT Lha e %A -END - -ARCDEF ARJ 0 60EA - ADD Arj a %A %F - EXTRACT Arj e %A -END - -NOFLO -FORCEKILLSENT -SIGDIR C:\IM -SIGKEEP 2000 -CHECKPATH -DUMPUNKNOWN -AREAFILE C:\IM\SYSTEM\AREAS.BBS -NOWARN CIRCULAR DUPES ORIGIN -SCANALL -RETEAR ADD diff --git a/docs/appendix.html b/docs/appendix.html deleted file mode 100644 index 46fb4375b9..0000000000 --- a/docs/appendix.html +++ /dev/null @@ -1,501 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Appendix Listing</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2><a name="Appendix_A">[18.1] - Appendix A: Command Line Specifiers</a> - -</h2> -<pre>Specifiers (argument replacement) for use with command lines in SCFG and many -string-related Baja functions. - -<b>%a</b> User alias or name (may require surrounding with "'s) -<b>%b</b> Baud (DTE) rate -<b>%c</b> Connect description -<b>%d</b> Connect (DCE) rate -<b>%e</b> Estimated CPS rate*10 -<b>%f</b> File path/name (example: C:\SBBS\NODE1\DOOR.SYS) -<b>%g</b> Temp directory (example: C:\SBBS\NODE1\TEMP\) -<b>%h</b> HardWare flow control (Y/N) -<b>%i</b> COM port IRQ line (if UART) or channel number (if Int 14h driver) -<b>%j</b> Data directory (example: C:\SBBS\DATA\) -<b>%k</b> Control directory (example: C:\SBBS\CTRL\) -<b>%l</b> Maximum lines per message -<b>%m</b> Minutes in the user's minute bank -<b>%n</b> Node directory (example: C:\SBBS\NODE1\) -<b>%o</b> Sysop's name (as specified in SCFG) -<b>%p</b> COM port number (0 if local node) -<b>%q</b> System's QWK ID (as specified in SCFG) -<b>%r</b> Rows on user's terminal screen -<b>%s</b> File specification (example: C:\FILES\*.ZIP) or current command string -<b>%t</b> Time (in seconds) user has left online -<b>%u</b> UART I/O address in hex or F=FOSSIL, B=PC BIOS, E=PS/2, D=DigiBoard -<b>%v</b> Synchronet version (example: 200a is Version 2.00 Revision a) -<b>%w</b> Timeslice API types supported (decimal bit field) -<b>%x</b> User's command shell (internal code) -<b>%y</b> COMSPEC environment variable or DOS Command Interpreter (if SBBS4OS2) -<b>%z</b> Text directory (example: C:\SBBS\TEXT\) -<b>%!</b> EXEC directory (example: C:\SBBS\EXEC\) -<b>%#</b> Node number (same as SBBSNNUM environment variable) -<b>%*</b> Node number (0 padded to 3 digits) -<b>%$</b> User's credits -<b>%%</b> Percent symbol -<b>%&</b> Used for DCDWATCH utility -<b>%?</b> Platform descriptions (e.g. Win32 or Linux) <i><font color="#FF0000"><b>(v3+ Only)</b></font></i> -<b>%1</b> User number -<b>%2</b> User number (0 padded to 2 digits) -<b>%3</b> User number (0 padded to 3 digits) -<b>%4</b> etc...</pre> -<h2><a name="Appendix_B">[18.2] - Appendix B: Synchronet (SBBS/SCFG) -Command Line Options</a> - - <b><font color="#FF0000"><i>(v2 Only)</i></font></b> - -</h2> -<pre>The Synchronet BBS program (SBBS.EXE or SBBS4OS2.EXE) can be run with optional -command line switches. The switches should be separated by a space. Slash (/) -and dash (-) are ignored, so "SBBS B" and "SBBS /B" are equivalent. Case is -ignored, so "SBBS B" and "SBBS b" are equivalent. To list the available options -from the DOS command line, you may type "SBBS ?". Here is a list of available -switches: - -<b>B</b> Use BIOS for video instead of direct screen writes - - Older multitasking software may require this switch -<b>M</b> Modem debug output - - This switch is helpful in solving problems with modem initialization -<b>Q</b> Quit after one call - - SBBS will exit back to DOS (phone off-hook) after one user -<b>X</b> Quit after one call (on hook) - - SBBS will exit back to DOS (phone on-hook) after one user -<b>C#</b> Connection already established at # bps - - If user already connected, pass current connect rate (DCE) -<b>E#</b> External event in # minutes - - If there is a non-Synchronet event coming up, pass minutes left -<b>F</b> Force daily event - - Used to force SBBS to execute its internal daily maintenance -<b>L</b> Local logon only - - If you want Synchronet to immediately go to the local logon prompt -<b>I</b> Don't initialize modem - - If you don't want Synchronet to initialize the modem -<b>D</b> Force Synchronet to think DCD is high - - Normally only used for NULL modem connections -<b>Zs</b> Pass Caller-ID string on command line as 's' - - Used in combination with 'C#' option, normally from front-end mailer -<b>O</b> Execute all pending events and immediately exit - - Used with front-end mailers -<b>R#</b> Additional rioctl call - - This switch is for the internal use of Synchronet only (DO NOT USE) -<b>V</b> Version information - - Displays the detailed version and revision information of SBBS - -The Synchronet Configuration Utility (SCFG.EXE, SCFG32.EXE or SCFG4OS2.EXE) -requires at least one command line switch (hard-coded into the included -SBBS.BAT and SBBS.CMD files): the path to your Synchronet CTRL directory -(e.g. "SCFG ..\CTRL"). While no other command line options are normally needed, -the following command line options may be specified: - -<b>/M</b> Show free memory in upper right corner - - Show available memory instead of current time (n/a in SCFG4OS2.EXE) -<b>/N</b> Don't use EMS for overlay caching - - Don't use Expanded Memory if detected (only in SCFG.EXE) -<b>/S</b> Don't check directories - - Don't create directories on the disk(s) if they don't exist -<b>/F</b> Force save of config files - - Used by the Synchronet INSTALL program -<b>/U</b> Update all message base status headers - - Forces the update of SMB headers to match current config -<b>/H</b> Don't update message base status headers - - Don't attempt to update SMB headers to match config (if changed) -<b>/T#</b> Set supported time slice APIs to # - - 0=DV if detected(default), 1=Int28, 2=WinOS2, 4=NoDV (SCFG.EXE only) -<b>/B#</b> Set automatic back-up level - - Set number of back-up files (*.CN# files) to keep (default=3 max=10)</pre> -<h2><a name="Appendix_C">[18.3] - Appendix C: SBBS Environment Variables</a> - -</h2> -<pre>During operation, Synchronet may write to several different environment -variables which can be utilized by other programs. Some of these environment -variables are also used by the utility programs that are included with -Synchronet as well as third party programs written for Synchronet. Following -is a list of environment variables and a brief explanation of them: - -<b>SBBSCTRL</b> This variable contains the path of the Synchronet CTRL - directory. This variable is NOT set by (and not required to - run) SBBS, it must be set manually prior to running any - programs which require it (the Synchronet NODE utility, for - example). - -<b>SBBSNODE</b> This environment variable contains the path of the node - directory of the current node. This variable is set by - SBBS at the time it is executed. Some off-line utilities - may require this environment variable be set during boot-up - (AUTOEXEC.BAT), in which case it should point to your NODE1 - directory. SBBS.EXE will automatically reset this variable - to point to the current node directory, for any online programs - it may execute. - -<b>SBBSNNUM</b> This variable contains the NUMBER of the active node. This - variable is set by SBBS at the time it is executed. - -<b>SBBSFILENAME</b> This variable contains the NAME of the file currently being - processed (up to 12 characters including '.', not padded with - spaces). This variable is set by Synchronet during 'Testable - Filetype' events. The same information is written to the file - SBBSFILE.NAM in the current node directory. - - NOTE: Upon returning from a 'Testable Filetype' event, - Synchronet will read in information contained in the - file SBBSFILE.NAM located in the current node directory - to determine if the filename has changed during the - testing process. - -<b>SBBSFILEDESC</b> This variable contains the ONE LINE DESCRIPTION of the file - currently being processed (up to 58 characters). This variable - is set by Synchronet during 'Testable Filetype' events. The - same information is written to the file SBBSFILE.DES in the - current node directory. - - NOTE: Upon returning from a 'Testable Filetype' event, - Synchronet will read in information contained in the - file SBBSFILE.DES located in the current node directory - to determine if the file description has changed during - the testing process. - -<b>DSZLOG</b> This variable is automatically set by Synchronet to point to - the file PROTOCOL.LOG in the current node directory. If a - transfer protocol has been configured (in SCFG) to support - DSZLOG, then this log file will be read in by Synchronet after - the transfer is complete, to determine which files were - successfully transferred and which files were not.</pre> -<h2><a name="Appendix_D">[18.4] - Appendix D: Wait for Call Status -Display</a> - - <b><font color="#FF0000"><i>(v2 Only)</i></font></b> - -</h2> -<pre><b>Example:</b></pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#000000"> - <tr> - <td width="100%"> - <pre><font color="#00FF00">Node #: 5 Mar 11 Space: 162,024k Laston: Digital Man 14400 -Logons: 23/103 Total: 62,610 Timeon: 322/2430 Total: 5,321,900 -Emails: 4/265 Posts: 4/12811 Fbacks: 2/17 Users: 1/592 -Uloads: 324k Files: 1/2195 Dloads: 9,308k Files: 52</font></pre> - </td> - </tr> -</table> -<pre>This status screen will be shown when the node is waiting for call if the -sysop (User #1) has EXPERT mode turned ON and this node has Status Screen While -WFC set to Yes in SCFG->Nodes->Node #->Toggle Options. - -The first line has the current node number, the current month and day, -the amount of free disk space on the drive where the TEMP directory is located -(should be on the drive where the majority of uploads are received), the -user who was last on this node and with what type of connection. - -The second line has the number of logons today for this node/system, the -total logons for history of the system, the time spent on today (in minutes) for -this node/system and total time spent on for history of the system. - -The third line contains the number of E-mails sent today on the system/total -E-mails currently waiting on the system, total number of Posts made on the -system today/total posts in all sub-boards, number of feedbacks (E-mail to #1) -sent today/total E-mail waiting for User #1, number of New Users today/total -user slots on the system. - -The fourth line has the amount of uploads to the system today (in Kilobytes), -number of files uploaded/total files in all directories, amount of downloads -today (in Kilobytes) and total files downloaded today. - -If there are any active nodes or nodes with a critical error count, the status -of those nodes will be displayed below the above statistical information.</pre> -<h2><a name="Appendix_E">[18.5] - Appendix E: Node Status Display</a> - -</h2> -<pre>Anywhere within Synchronet, you can list the users currently online with the -Ctrl-U command. - -From the Main, Transfer, Multinode Chat, or Private Chat sections you can list -the current status of all the nodes with the '/L' command. - -You can display the status of all nodes from the DOS command line (or batch -file) with the NODE utility. - -If the WFC Status Screen is enabled, the status of all active nodes is -displayed. - -<b>Node Status Line:</b> - -The format of each node status line is as follows: - -Node n: username action connection (flags) [sysflags] - -Where: - n = node number - username = user's name - action = what the user is currently doing -connection = how the user is connected (bps rate if remote) - flags = letters representing special modes of the node: - A - Activity Alert Disabled: - User of this node will not be notified of - other users logging on or off other nodes. - L - Node is locked for sysop use: - Node is temporarily reserved for sysop - use only. - M - Message waiting for node: - An unreceived node-to-node message is - waiting for this node. - P - Page disabled: - User of this node does not wish to allow - users of other nodes to page him for chat - or send him node-to-node messages. - - sysflags = modes that are sysop settable/viewable only: - A - Anonymous: - User on this node is in anonymous mode. - D - Down: - This node will be shutdown as soon as possible. - E - Event: - This node will run it's daily event (if one - is specified) before waiting for another - call. - I - Node will be interrupted: - Node connection will be terminated as soon - as possible. - Q - Quiet: - User on this node is in quiet mode. - R - Rerun: - This node will Rerun when user logs off. - U - User data update: - This user's data has been modified by - another node and needs to be read from - disk. - -If the node is not in use, the possible status are: - Offline: Node is not currently running Synchronet - Waiting for Call: Node is waiting for a call. - Networking: Node is currently executing network functions. - New User Logging On: A user is logging on as new. - Waiting for all nodes to become inactive. - Running external event. - Waiting for node # to finish external event.</pre> -<h2><a name="Appendix_F">[18.6] - Appendix F: Log File Line Type -Specifiers</a> - -</h2> -<pre>Each line in the daily caller log has a line type specifier (the first 2 -characters). The specifiers and their descriptions follow: - -!! Critical error -!* User auto-deleted -!% User expired -!= New day for statistics -!: Ran event -@ Modem connection established -@- Modem connection terminated -@! Modem error -@* Caller-ID information -@R RIP support detected -@W WIP support detected -++ Logon -+! Logon error -N New user begins application -N+ New user finishes application -N! New user fails application -S+ Sysop enabling function -S- Sysop disabling function -S! Sysop security error -P+ Posted message -P- Removed message -P! Posting error -E Read E-mail -E- Deleted E-mail -E+ Sent E-mail -EN Sent NetMail -E! E-mail error -C Chat function -U+ Upload -U- Removed Upload -U! Attempted upload -D- Download -D! Attempted download -X- External program execution -T- Read text file -M+ Moved message -Q! QWK error -L! Log already exists (possible crash) -$+ Gained credits -$- Lost credits -*+ Gained minutes -*- Lost minutes - -To view today's caller log, hit 'L' from the WFC screen or ";LOG" from the -main menu. Yesterday's caller log can be viewed by hitting 'Y' at the WFC -screen, or ";YLOG" from the main menu. The log files are stored in the -DATA\LOGS directory with a file for each day named in the format: MMDDYY.LOG.</pre> -<h2><a name="Appendix_G">[18.7] - Appendix G: File Formats</a> - -</h2> -<pre>XTRN.DAT - - This is the drop file that Synchronet creates for Synchronet specific - external programs. It is an ASCII text file with the format as follows: - -<b>Sample Data Description</b> -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Digital Man User name -Vertrauen System name -digital man System operator -The Guru System guru -..\CTRL\ CTRL directory -..\DATA\ DATA directory -5 Total nodes on system -5 Current node number -19448 Time left online (in seconds) -Yes ANSI ? (Yes/No/Mono) -24 Lines per screen -10770335 Credits -99 Security Level - -unused- -12/31/69 Birthdate -M Sex (Gender) -1 User number -714-529-9525 User phone number -0 COM port (0 if no modem or local) -3 COM port IRQ (or channel number) [1] -2f8 COM port I/O address (in hex) [2] -2400 COM port DTE rate -No Modem uses hardware flow ctrl (Y/N) -No Modem locked at DTE rate (Y/N) -ATQ0V0E0M1X4&C1&D2H0 Modem initialization string - Modem special init string -ATV1E1X4 Modem terminal mode init string -ATDT Modem dial prefix -ATH1M0 Modem off-hook string -ATA Modem answer string -795154132 Address of Modem Status Register -11 Number of External Programs -Global War Names of External Programs (or blank -Trade Wars 2002 if user doesn't have access) -Food Fight! -Pit Fiend ][ -Dice War -Synchronet Blackjack! -Domain Poker -Phantasia -Emperor -Synchronet Upgrade Door -Credit Card Order Door -AB D F J User's Flags #1 - BC G JK N User's Flags #2 -A L T User's Exemptions - D User's Restrictions -2b43cfd0 Expiration Date (Unix format in hex) -PO Box 501 User's Address -Yorba Linda, Ca User's Location -92686 User's Zip/Postal Code -A E User's Flags #3 - B EFG User's Flags #4 -1 Timeslice API types -Rob Swindell User's real name or company name -14400 User's DCE rate -..\EXEC\ EXEC directory (BBS executable files) -..\TEXT\ TEXT directory (TEXT files) -TEMP\ TEMP directory -VERT System's QWK ID -22C8 Node toggle options (in hex) - -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -[1]: IRQ line if UART COM port type or Channel (zero based) if Int 14h type -[2]: I/O base address if UART COM port type or: - - F = FOSSIL - B = PC BIOS - E = PS/2 BIOS - D = DigiBoard - -</pre> -<pre>MODUSER.DAT - - This is an optional file created by external programs to modify the - data of the current user. It is an ASCII text file with the format: - -<b>Sample Data Description</b> -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --500 Credit Adjustment -60 Security Level - -unused- -AB E I Flags #1 to add - G Flags #2 to add -A P T Exemptions to add - Restrictions to add -2b43cfd0 Expiration Date (Unix format in hex) -0 Add these number of minutes to bank - XYZ Flags #3 to add - TUV Flags #4 to add - J Flags #1 to remove - L Flags #2 to remove - Flags #3 to remove - Flags #4 to remove - D Exemptions to remove -A Restrictions to remove - - If any of the lines in the file are blank, that user item is not - modified. The security level cannot exceed 89. - - -NOTE: Technical specifications and C source code for Synchronet configuration - and data files can be downloaded from our BBS.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/baja.html b/docs/baja.html deleted file mode 100644 index 870fb412a9..0000000000 --- a/docs/baja.html +++ /dev/null @@ -1,3659 +0,0 @@ - -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Synchronet BBS Software - Baja Documentation</title> -</head> - -<body> -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<h1>Synchronet Baja� Documentation - -</h1> -<pre><b><a name="TOC">Table of Contents</a></b> - -1. <b>Introduction to BAJA</b><a href="#Introduction"> -</a> 1.1 <a href="#Introduction">Introduction</a> - 1.2 <a href="#SourceFiles">Source Files</a> - 1.3 <a href="#BAJA.EXE">BAJA.EXE</a> - 1.4 <a href="#Modules">Modules</a> - -2. <b>BAJA Programming Basics -</b> <b> </b>2.1 <a href="#ProgrammingSyntax">Programming Syntax</a> - 2.2 <a href="#Variables">Variables</a> - 2.3 <a href="#Arguments">Arguments</a> - 2.4 <a href="#CStrings">C Strings</a> - 2.5 <a href="#IntegerConstants">Integer Constants</a> - 2.6 <a href="#CommandKeyConstants">Command Key Constants</a> - 2.7 <a href="#IncludeFiles">Include Files</a> - 2.8 <a href="#MacroDefinitions">Macro Definitions</a> - 2.9 <a href="#GlobalVariableDeclarations">Global Variable Declarations</a></pre> -<pre>3. <b>Programming Style and Rules -</b> 3.1 <a href="#ProgrammingStyle">Programming Style</a> - 3.2 <a href="#SuggestedRulesOfStyle">Suggested Rules</a></pre> -<pre>4. <b>BAJA Function Reference</b> - 4.1 <a href="#FunctionDefinitions">Function Definitions</a> - 4.2 <a href="#StringManipulationFunctions">String Manipulation</a> - 4.3 <a href="#IntegerManipulationFunctions">Integer Manipulation</a> - 4.4 <a href="#Logic/ControlFlowFunctions">Logic/Control Flow</a> - 4.5 <a href="#DisplayFunctions">Display</a> - 4.6 <a href="#InputFunctions">Input</a> - 4.7 <a href="#MiscellaneousFunctions">Miscellaneous</a> - 4.8 <a href="#MailFunctions">Mail</a> - 4.9 <a href="#MessageBaseFunctions">Message Base</a> - 4.10 <a href="#FileBaseFunctions">File Base</a> - 4.11 <a href="#ChatFunctions">Chat</a> - 4.12 <a href="#InformationFunctions">Information</a> - 4.13 <a href="#FileI/OFunctions">File I/O</a> - 4.14 <a href="#FileSystemFunctions">File System</a> - 4.15 <a href="#DirectorySystemFunctions">Directory System</a></pre> -<pre>5. <b>System Variables</b><a href="#System Variables"> -</a> 5.1 <a href="#SystemVariables">System Variables</a></pre> -<pre>6. <b>Function Reference</b><a href="#Quick Function Reference"> -</a> 6.1 <a href="#QuickFunctionReference">Quick Function Reference</a></pre> -<h2>[1.1] - <a name="Introduction">Introduction</a></h2> -<pre>Baja (pronounced b�'h�) is a high-level development tool used to create -"command shells" and "loadable modules" for Synchronet BBS software. The -programmable command and menu structure (PCMS) technology in Synchronet version -2 allows sysops to modify the user interface for the BBS by replacing or -modifying command shells. Synchronet version 2.0 shipped with six stock command -shells (Classic and Novice Synchronet shells as well as emulations of PCBoard, -Wildcat, Major, and Renegade BBS packages). These shells can be modified, -removed, or replaced with ease. Up to 500 shells can be made available to the -users of the BBS with configurable security access to each shell via ARS (see -the Synchronet Sysop manual for details on ARS).</pre> -<pre>Synchronet loadable modules are used to extend or customize the abilities of -the BBS. Some modules are automatically loaded during specific events (login, -logon, logoff, etc) while others may be executed at the request of a user -(much like a door or other internal menu option).</pre> -<pre><b>Note:</b></pre> -<pre>If you come across an undefined term in this document, please read through -the document to possibly find the term defined later or used again to clarify -its meaning by context, or see the glossary in the Synchronet sysop manual. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="SourceFiles">[1.2] - Source Files</a></h2> -<pre>Command shells and modules begin their life as a text source file (normally -with a .SRC extension) or group of text files (including .INC files). These -source files (and .INC files) can be edited with any ASCII text editor (e.g. -EDIT, QEDIT, EDLIN, etc). The contents of the text file (often referred to as -"source code") must conform to the Baja language specifications defined in this -document. An extremely basic example of a command shell source file:</pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> -<pre># EXAMPLE1.SRC</pre> -<pre># Label for later "goto" commands -:TOP</pre> -<pre># Clear the screen -CLS</pre> -<pre># Show menu of commands -MNEMONICS "~Comment to Sysop\r\n" -MNEMONICS "~Goodbye (Logoff)\r\n"</pre> -<pre># Show command prompt -PRINT "\r\nCommand: "</pre> -<pre># Get command key -GETCMD "CG"</pre> -<pre># Comment to sysop? -COMPARE_KEY C -IF_TRUE - SETSTR "1" - MAIL_SEND_FEEDBACK - GOTO TOP - END_IF</pre> -<pre># Logoff? -COMPARE_KEY G -IF_TRUE - LOGOFF - GOTO TOP - END_IF</pre> - </td> - </tr> -</table> -<pre>The syntax of the above text will be explained later in this document.</pre> -<pre>For more examples of Baja source code, please see the *.SRC files in your -Synchronet EXEC directory.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="BAJA.EXE">[1.3] - BAJA.EXE</a></h2> -<pre>After the source file has been created, BAJA.EXE is used to compile the .SRC -file into a binary file with a .BIN extension that Synchronet can interpret -and execute. If the source filename is EXAMPLE1.SRC, then the command line -would be:</pre> -<pre> <i>BAJA EXAMPLE1</i></pre> -<pre>The compiler's output:</pre> -<pre><img border="0" src="images/baja_example.gif" width="638" height="136"></pre> -<pre>This creates the binary file EXAMPLE1.BIN.</pre> -<pre>Warning: Do not attempt to edit, view, or print .BIN files.</pre> -<pre>If the compile fails, an error message will be displayed with the filename that -contains the error and the specific line number followed by a colon and the -offending code.</pre> -<pre>Baja source (.SRC), include (.INC), and binary (.BIN) files as well as the Baja -program itself are normally stored in the Synchronet EXEC directory. This is -where Synchronet loads command shells and modules from, so the .BIN files must -be created in or copied to this directory before they can be used.</pre> -<pre>After a command shell has been compiled, it must be added to the list of -available command shells in SCFG (Synchronet Configuration program) to be -available for the users to use. If using a multinode BBS, the other nodes -must be re-run before the new command shell will be available on those nodes.</pre> -<pre>If modifying an existing command shell, SCFG does not need to be run and nodes -do not have to be re-run since command shell binary files are dynamically -loaded for each logon. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="Modules">[1.4] - Modules</a></h2> -<pre>Baja modules are very similar to command shells with the main difference being -that they are not automatically loaded upon logon as command shells are -(with the exception of login and logon modules). Instead, modules must be -loaded from a command shell with the EXEC_BIN function described later in -this document or launched as an external program or event configured in SCFG. -Binary module files, like command shell binaries, must be located in the -Synchronet EXEC directory.</pre> -<pre>Modules can be used to consolidate identical portions of multiple command -shells into one binary that can be loaded from each command shell so that if a -modification needs to be made to that portion, then only one source file needs -to be modified and recompiled as opposed to making the same change to every -command shell and recompiling them all. An example of this use is the STR_CMDS -(string commands) module that is launched from multiple command shells.</pre> -<pre>Another use for modules is for third-party add-ons. Rather than distributing -Baja source that must be merged into command shell source by sysops, developers -can distribute module binaries that can be loaded directly from a command -shell with a very small modification to the existing shells.</pre> -<pre>To load a Baja module in place of a DOS executable in SCFG, prepend an asterisk -(*) to the name of the module (e.g. "*MYMOD") for the command line. If an -argument is included on the command line (e.g. "*MYMOD %A") the contents -will be automatically placed into the current command string for possible use -by the module or functions there in.</pre> -<pre>To load a Baja module while displaying a message, menu file, or TEXT.DAT line -(excluding lines containing % variables) use "@EXEC:MYMOD@", were MYMOD is the -name of the module to execute. This is useful for executing modules in places -where they cannot normally be loaded by event or command line. @-codes are -only expanded in posts and e-mail if posted locally by user #1 (the sysop). - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="ProgrammingSyntax">[2.1] - Programming Syntax</a></h2> -<pre><b>Basics:</b> - Execution always begins at the top of the source code and continues - downward until a function is executed which changes the flow of - execution. Only one function is allowed per line. The total length of - each line cannot exceed 1000 characters.</pre> -<pre><b>Whitespace:</b> - All whitespace (TAB and SPACE characters) at the beginning of each line - are ignored. The first printable character of a line is considered - the first character. Completely blank lines are ignored.</pre> -<pre><b>Comments: -</b> If the first character of a line is the pound symbol (#), the - line is ignored. These are normally used for text comments (remarks) - about the following source code line(s). Comments may be included on - the same lines as some (not all) functions, but in general it is - considered best to keep comments on their own lines as to not interfere - with proper Baja syntax. Comments are more easily read if there is a - space after the pound symbol (#) and before the comment text begins.</pre> -<pre><b>Labels: -</b> If the first printable character of a line is a colon (:), the line is - considered a label to be used for the GOTO or CALL functions. Labels - are not case sensitive. There should be no space between the colon and - the name of the label. Label names may not contain spaces. Duplicate - label names within the same module or shell are disallowed.</pre> -<pre><b>Case Sensitivity: -</b> Most elements of Baja syntax are not case sensitive (where upper or - lower case is significant). Functions, and variable names (for example) - are not case sensitive. Character constants ('A' for example) are case - sensitive.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="Variables">[2.2] - Variables:</a></h2> -<pre> Variable names are not case sensitive and must begin with an alphabetic - character or an underscore (_). Variable names can be any length and - may contain alpha, numeric, and underscore characters only. The - variable name "str" is reserved to represent the current command string - and should not be used as a user defined variable name.</pre> -<pre> When referencing a variable name defined by the system or another - module (global), the "!GLOBAL" compiler directive must be used to - declare the variable or the compiler will not recognize the variable - name and exit with a syntax error. Global variable declarations should - appear near the top of your source file.</pre> -<pre> Baja modules that use variables require SBBS v2.2 or later.</pre> -<h2> <a name="Arguments">[2.3] - Arguments:</a></h2> -<pre> When a function requires one or more arguments, there must some amount - of white space between the function name and each argument.</pre> -<pre> In function definitions (in this document), required arguments are - listed in angled brackets (< >) and optional arguments are listed in - square brackets ([ ]). The actual bracket symbols are NOT used in the - source code. They are strictly for documentary purposes.</pre> -<pre> When a string variable argument is specified in the definition of a - function, any string variable name (either local or global) may be - used. If str is used in the source code as the string variable name, - the current command string will be used in place of an actual - user or system string variable.</pre> -<pre> An argument of # (pound sign) indicates an integer constant. The actual - pound sign is not used in the argument. See the section on Integer - Constants for more details.</pre> -<pre> An argument of "str" (with double quotes) indicates a string constant - argument enclosed in double quotation marks. To place a double - quotation mark inside a string constant (as part of the actual string - constant), use \" instead of just " where you want the quotation mark - to appear in the string.</pre> -<pre> An argument of "cstr" (with double quotes) indicates a C string - constant argument enclosed in double quotation marks. See the next - section on C strings for the definition of the contents.</pre> -<pre> See the beginning of the Functions section for the complete definition - of all argument types and how they're specified in function - definitions.</pre> -<h2> <a name="CStrings">[2.4] - C Strings:</a></h2> -<pre> Some character string arguments are defined as being C type (cstr). - This indicates the contents of the string use the same special/control - character escape sequences as defined for the printf() function in the - ANSI definition of the C programming language. The only exception to - the ANSI definition, is that \### defines a character value in decimal - (base 10), not octal (base 8). All escape sequences begin with the - backslash (\) character. The valid escape sequences are:</pre> -<pre> \\ Backslash - \? Question mark - \' Single quote - \" Double quote - \r Carriage return - \n Line feed - \t Horizontal tab - \b Backspace - \a Bell - \f Formfeed - \v Vertical tab - \### Character value in decimal - \x## Character value in hexadecimal</pre> -<pre> The text string must be enclosed in double quote (") symbols. Example:</pre> -<pre> "Hello, world.\r\n"</pre> -<pre> To include an actual back-slash (\) character in a C string, you must - prefix the back-slash with another back-slash. Example:</pre> -<pre> "C:\README.TXT"</pre> -<pre> would be an invalid path and filename.</pre> -<pre> "C:\\README.TXT"</pre> -<pre> would be the correct C string to represent <a href="file:///C:/README.TXT">C:\README.TXT</a>.</pre> -<h2> <a name="IntegerConstants">[2.5] - Integer Constants:</a></h2> -<pre> Many functions allow or require the use of integer constants (as - opposed to integer variables). An integer constant is a number that is - "hard-coded" into the resulting executable file and will remain - constant (never change) from that point on.</pre> -<pre> You can specify integer constants in many ways:</pre> -<pre> Representation Range Examples - -------------- ----- -------- - Decimal (base 10) -2147483648 to 2147483647 0, 10, -25 - Hexadecimal (base 16) 0x0 to 0xffffffff 0x7f, 0xA69B - Octal (base 8) 00 to 037777777777 0377, 0505 - Bit value .0 to .31 .0, .1, .15 - ASCII value ' ' to '�' 'A', ' ', '%' - Special char '\r' to '\v' (see C Strings) '\r', '\n'</pre> -<pre> Constants can be modified during specification (no variables may be - used in the modification). No space is allowed between the numeric - constant and the modifier symbol. Valid modifiers:</pre> -<pre> Symbol Operation Example - ------ --------- ------- - + Addition 10+2 - - Subtraction 20-8 - * Multiplication 4*3 - / Division 36/3 - % Modulus (remainder) 53%8 - & Bit-wise AND 695&0x1f - | Bit-wise OR 0x10|8 - ~ Bit-wise NOT ~3 - ^ Bit-wise XOR (exclusive OR) 0xff^12 - >> Right shift 03700>>4 - << Left shift 255<<2</pre> -<h2> <a name="CommandKeyConstants">[2.6] - Command Key Constants:</a></h2> -<pre> Some functions require the use of a command key constant. A command key - constant is a keyword or symbol representing a valid command selected - by a user.</pre> -<pre> The simplest way to specify a command key constant, is to simply - type the key that you wish to use for a specific command. Example:</pre> -<pre> CMDKEY A</pre> -<pre> Would use the 'A' key for the command key constant. Simply specifying - a letter does not indicate case sensitive (i.e. the above example - could have been "CMDKEY a" with the same results). </pre> -<pre> To specify a specific case (upper or lower), you must prefix the - command key with a single quote symbol ('). Example:</pre> -<pre> CMDKEY 'a - - To specify a control character (like Ctrl-H, which is a backspace), - you must prefix the control character (in upper case) with a caret - (^) symbol. Example:</pre> -<pre> CMDKEY ^H</pre> -<pre> Valid control character specifications:</pre> -<pre> ^A Attribute/color code (internal line editor) - ^B Beginning of line (internal line editor) - ^C Abort - ^D Delete word right (internal line editor) - ^E End of line (internal line editor) - ^F Forward cursor (Right arrow key) - ^G Beep - ^H Backspace - ^I Tab - ^J Line feed (Down arrow key) - ^K Ctrl-key help menu - ^L Form feed (Clear screen) - ^M Carriage return (Enter key) - ^N Next word (internal line editor) - ^O Temp pause toggle - ^P Private message - ^Q Un-pause - ^R Redraw line (internal line editor) - ^S Pause - ^T Time info - ^U List users online - ^V Center line (internal line editor) - ^W Delete word left (internal line editor) - ^X Delete line (internal line editor) - ^Y Delete to end-of line (internal line editor) - ^Z Raw input mode toggle - ^] Back cursor (Left arrow key) - ^[ Escape (Esc key) - ^^ Up cursor (Up arrow key)</pre> -<pre> You may also specify special control characters (carriage return, - form feed, etc) be prepending a backslash (i.e. \r, \f, etc). See the - section on C strings for details. - - Some command key input functions allow the use of slash-commands - (command keys prepended with a slash character, i.e. /A). The two - character slash-commands are the only multi-character commands - supported by command key functions. Example:</pre> -<pre> CMDKEYE /A</pre> -<pre> Is valid, but:</pre> -<pre> CMDKEYE -A</pre> -<pre> Is not valid.</pre> -<pre> To test specifically for digit (0-9) command keys and slash-digit - command keys (/0-/9), use DIGIT and EDIGIT respectively. Example:</pre> -<pre> CMDKEYE DIGIT</pre> -<pre> To test if the user hit a key from 0 to 9, or:</pre> -<pre> CMDKEYE EDIGIT</pre> -<pre> To test if the user hit a slash-key combination from /0 to /9.</pre> -<pre> You may, of course, also test for a specific digit command key:</pre> -<pre> CMDKEYE 1 - and - CMDKEYE /1</pre> -<pre> are both valid command key constants.</pre> -<pre> To specify # for a command key, use '# (otherwise # will be interpreted - as the beginning of a comment).</pre> -<pre> To specify SPACE bar for the command key, use ' ', example:</pre> -<pre> CMDKEY ' '</pre> -<pre> Extended ASCII characters (� for example) are not valid command keys. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2> <a name="IncludeFiles">[2.7] - Include Files</a></h2> -<pre>Source code segments that are to be shared among multiple command shells or -modules can be placed into a separate text file (preferably with a .INC -extension) and included in the source code for multiple modules by using the -"!INCLUDE" compiler directive to specify the filename to include. Example:</pre> -<pre>!INCLUDE MYDEFS.INC</pre> -<pre>This is useful when including files supplied by Digital Dynamics or third -party developers to pre-define constants (macros), common sub-routines, or -variable definitions. The following include files are distributed with Baja -(and should not be modified):</pre> -<pre>ERRNO.INC Definitions for possible values of _ERRNO system variable -FILE_IO.INC Constants for use with file I/O functions -DIR_ATTR.INC Constants for use with SET_FILE_ATTR & GET_FILE_ATTR functions -USERDEFS.INC Synchronet User constants for use with various functions -NODEDEFS.INC Synchronet Node constants for use with various functions -SBBSDEFS.INC Synchronet system variable declarations and constants - (automatically includes USERDEFS.INC and NODEDEFS.INC)</pre> -<pre>Take care not to include the same file more than once in the same source code. -It is suggested you put all of your !include statements near the top of your -source file. If you include a file that in-turn includes other files -(SBBSDEFS.INC, for example, includes USERDEFS.INC and NODEDEFS.INC), you -do not need to include the other files. If you !include SBBSDEFS.INC, you -DO NOT need to !incluce NODEDEFS.INC and USERDEFS.INC as well. Take care not -to nest include files too deeply or the compilation will fail.</pre> -<pre>This compiler directive is very similar to the "#include" directive used by -C compilers, but if a specific path is not specified, only the current -directory will be searched for the file to include. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="MacroDefinitions">[2.8] - Macro Definitions</a></h2> -<pre>Commonly used character strings and integer constants can be specified as -macros by using the "!DEFINE" compiler directive to specify the macro name to -use and the value of the macro. Example:</pre> -<pre>!DEFINE MAXIMUM_USERS 250</pre> -<pre>Now, any place you might want to use the number 250 in your Baja source, you -can use the macro "MAXIMUM_USERS" instead. This makes changing the value of -the numeric or character string constant very easy.</pre> -<pre>This compiler directive is very similar to the "#define" directive used by -C compilers with the main exception being that the macro name is not case -sensitive. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="GlobalVariableDeclarations">[2.9] - Global Variable Declarations</a></h2> -<pre>When using variables defined by the system (see System Variables) or another -shell or module (see GLOBAL_STR and GLOBAL_INT functions), you must first -declare these variables using the "!GLOBAL" compiler directive. Example:</pre> -<pre>!GLOBAL SOME_GLOBAL_VAR</pre> -<pre>Multiple global variables may be declared with one !GLOBAL statement:</pre> -<pre>!GLOBAL SOME_GLOBAL_VAR ANOTHER_GLOBAL_VAR</pre> -<pre>If you attempt to use a global variable without first declaring it, the -compiler will fail to compile the source with an "expected variable name" -syntax error message.</pre> -<pre>This compiler directive is very similar to the "extern" keyword used by C -compilers. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="ProgrammingStyle">[3.1] - Programming Style</a></h2> -<pre>As stated in the previous section, white space characters at the beginning -of a line are ignored and have no effect on the resulting compilation. But, -whitespace can be very useful in making the source code readable by indenting -conditional blocks of code, and using blank lines to separate blocks of -related code. Comments are also very helpful in making the code readable.</pre> -<pre>Compare the following source to the example given in the Source Files chapter:</pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> - <pre>:TOP -CLS -MNEMONICS "~Comment to Sysop\r\n" -MNEMONICS "~Goodbye (Logoff)\r\n" -PRINT "\r\nCommand: " -GETCMD "CG" -COMPARE_KEY C -IF_TRUE -SETSTR "1" -MAIL_SEND_FEEDBACK -GOTO TOP -END_IF -COMPARE_KEY G -IF_TRUE -LOGOFF -GOTO TOP -END_IF</pre> - </td> - </tr> -</table> -<pre>Without the whitespace and the comments, the code appears much more cryptic -(the control flow is hard to follow). But the code will compile into exactly -the same binary file as the earlier example. - -Consider this more elaborate example using indentation only:</pre> -<pre><b><i>With indentation:</i></b></pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> - <pre>COMPARE_ARS FILE_CMDS=0 -IF_TRUE - COMPARE_USER_MISC UM_ASK_NSCAN - IF_TRUE - YES_NO "\r\n\r\nSearch all libraries for new files" - IF_TRUE - FILE_NEW_SCAN_ALL - END_IF - END_IF - END_IF</pre> - </td> - </tr> -</table> -<pre><b><i>Without indentation:</i></b></pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> - <pre>COMPARE_ARS FILE_CMDS=0 -IF_TRUE -COMPARE_USER_MISC UM_ASK_NSCAN -IF_TRUE -YES_NO "\r\n\r\nSearch all libraries for new files" -IF_TRUE -FILE_NEW_SCAN_ALL -END_IF -END_IF -END_IF</pre> - </td> - </tr> -</table> -<pre>As you can see without the indentation, you can get lost in nested IF -statements trying to understand how the code will execute.</pre> -<pre>While you may have known quite well what you intended to accomplish and how -you expected the code to execute at the time of writing it, it would be much -harder to understand how the code was expected to execute at a later date -(or by another person) if a consistent indentation style was not used. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="SuggestedRulesOfStyle">[3.2] - Suggested Rules of Style</a></h2> -<pre>There isn't a "right" or "wrong" way to use indentation, blank lines, -or comments, but we will present a set of suggested "rules" here. If you decide -you prefer another style, that is fine. The most important thing is that you -are consistent in your use of whatever style you choose.</pre> -<pre><b>Top of File Comments</b></pre> -<pre>Place a comment as the very first line of the file with the name of the .SRC -file. Example:</pre> -<pre># EXAMPLE.SRC</pre> -<pre>Then a block of comment lines that describe what the shell or module's purpose -is, who programmed it, when, where, etc.</pre> -<pre><b>Label Comments</b></pre> -<pre>Labels normally represent the beginning of a sub-routine and should be -well commented. A graphical line to show the beginning of a new sub-routine -is often helpful. Example:</pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> - <pre>############################### My Sub-routine ################################ -:MY-SUB</pre> - </td> - </tr> -</table> -<pre><b>CMD_HOME Comments</b> - -The CMD_HOME function marks the beginning of a command/menu loop and should -be well commented. Example:</pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> - <pre>############# -# MAIN MENU # -############# -CMD_HOME</pre> - </td> - </tr> -</table> -<pre><b>Conditional Indentation -</b> -Whenever a block of code is conditionally executed (only executed under -specific conditions), the block of code should be indented one tabstop past -the block header (IF_TRUE, IF_FALSE, ELSE, SWITCH, CASE, CMDKEY, CMDSTR, etc). -The block of code to be indented includes the block terminator (END_IF, -END_CMD, END_CASE, END_SWITCH, etc). Example:</pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> -<pre>GETCMD "ABCD"</pre> -<pre>CMDKEY A - COMPARE_ARS LEVEL 50 - IF_TRUE - PRINT "You have level 50 or higher.\r\n" - ELSE - PRINT "You have level 49 or lower.\r\n" - END_IF - END_CMD</pre> - </td> - </tr> -</table> -<pre><b>Separate Code Blocks</b></pre> -<pre>Use blank lines to separate medium to large code blocks from other code -(most especially CMDKEY, CMDKEYS, CMDSTR, and SWITCH code blocks). Example:</pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> -<pre>GETCMD "ABCD"</pre> -<pre>CMDKEY A - PRINT "You hit A.\r\n" - END_CMD</pre> -<pre>CMDKEY B - PRINT "You hit B.\r\n" - END_CMD</pre> - </td> - </tr> -</table> -<pre><b>End of File Comment -</b> -Place a comment at the end of the file. Example:</pre> -<pre># End of EXAMPLE.SRC - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="FunctionDefinitions">[4.1] - Function Definitions</a></h2> -<pre>The remainder of this document is for defining the correct use of all Baja -functions. If you wish to look up a specific function by subject, please refer -to the table of contents or the quick reference at the end of the document.</pre> -<pre><b>Argument Types</b></pre> -<pre>Each function definition will begin with the name of the function followed by -all possible arguments (parameters) and the type of each argument. The possible -argument types are:</pre> -<pre><b>Type Description</b> - -"str" String constant (contained in double quotes) -"cstr" C string constant (contained in double quotes) -txt String constant (no quotes) -# Integer constant (the # symbol is not part of the syntax) -str_var String variable name or 'str' for current command string -int_var Integer variable name -any_var Any string or integer variable name -char Character constant (single character, no quotes) -key Command key constant -keylist List of command key constants (no space between each key)</pre> -<pre>Each argument type is contained in either angled brackets (< and >) to indicate -the argument is required, or square brackets ([ and ]) to indicate the -argument is optional. An argument of [...] indicates a variable number of -optional arguments of the last specified type. Example:</pre> -<pre> SPRINTF <str_var> <"cstr"> <any_var> [any_var] [...]</pre> -<pre>This function definition indicates that the SPRINT function requires a minimum -of three arguments: a string variable, a C string constant, and one or more -variables of either integer or string type.</pre> -<pre><b>Required Include Files<u> -</u></b> -Following the function argument types, may be one or more required include -(.INC) files. If any files are listed on the same line as the function -(to the right of the page), these files must be included at the top of -your source file to use this function arguments correctly. Example:</pre> -<pre> !INCLUDE NODEDEFS.INC</pre> -<pre>Do not include the same file more than once in the same source file. Once -is enough, and it should be done so near the top of your source (.SRC) file.</pre> -<pre><b>Argument Names<u> -</u></b> -If any arguments are allowed for a function, a list of argument names will -follow the text "args:" below the function name and argument list. This will -help in referencing the individual arguments in the function description.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="StringManipulationFunctions">[4.2] - String Manipulation Functions</a></h2> -<pre>Functions used for manipulating string variables (global or local) and/or the -current command string.</pre> -<pre> <b>STR <str_var> [str_var] [...] -args: new_vars</b> ------------------------------- -Define one or more local string variables for later use. The new_vars arguments -are the names of the variables to define. These names must not be currently -used by other variables (local or global).</pre> -<pre>The variable name "str" is used by other functions to refer to the current -command string, and therefore cannot be used as a user defined variable name.</pre> -<pre>After definition, the variable names can be used by other functions. The -variables will each be initialized to a null string. The variables can only be -referenced in the current shell or module. When the current shell or module is -terminated, the variable names and their contents are lost. If you wish to -retain a variable name and its contents between shells or modules, use a global -variable instead of a local variable.</pre> -<pre><b>GLOBAL_STR <str_var> [str_var] [...] - args: new_vars -</b>------------------------------------ -Define one or more global string variables for later use. The arguments are the -names of the variables to define. Each variable name must not be currently used -by another variable (local or global). Global variable names and their contents -are not disposed of until the current user logs off the BBS.</pre> -<pre><b> SET <str_var> <"cstr"> -args: dest value -</b>----------------------- -Writes to the string variable dest, the contents of the C string specified as -value. This function is the Baja equivalent of the standard C strcpy() function -with the exception that the source must be a string constant. Example:</pre> -<pre> STR USER_NAME - SET USER_NAME "John Doe"</pre> -<pre>When writing to the current command string, use the SETSTR function instead -of this function for best optimization. - -<b>COPY <str_var> <any_var> -args: dest source -</b>------------------------ -Copies the source variable (string or integer) into the specified destination -variable. This function is the Baja equivalent of the standard C strcpy() -function with the exception that the source must be a variable, but may be -either of integer or string type. Example:</pre> -<pre> # define two variables - STR VAR1 VAR2 - # copy some text into the first variable - SET VAR1 "Some Text" - # copy that variable into the second variable - COPY VAR2 VAR1 - # display the contents of second variable - PRINT VAR2</pre> -<pre>If the source variable is an integer variable, it is converted into -a decimal (base 10) string before the copy is executed. Use SPRINTF if you -want to convert an integer variable into a string using hexadecimal (base 16) -or octal (base 8) representation instead of decimal.</pre> -<pre><b>SWAP <str_var> <any_var> -args: var1 var2 -</b>------------------------ -Exchanges the contents of two string variables, or a string variable and an -integer variable. The first argument (var1) is the name of a string variable -and the second argument (var2) is the name of a string or integer variable. -If var2 is an integer variable, var1 will be set to the decimal representation -of the integer variable contents and var2 will be set the integer -representation of var1 (specified in hex, octal, or decimal). Example:</pre> -<pre> INT I - STR S</pre> -<pre> # set S to 100h (256) - SET S "0x100" - # set I to 100 - SET I 100 - # swap them - SWAP S I - # I now equals 256 and S is "100" - -<b>STRCAT <str_var> <str_var or "cstr"> - args: dest source -</b>------------------------------------ -Concatenates (appends) the contents of a string variable (specified as dest) -with the contents of a C string or string variable specified as source. This -function is the Baja equivalent of the standard C strcat() function.</pre> -<pre><b>SPRINTF <str_var> <"cstr"> <any_var> [any_var] [...] - args: dest format variables -</b>---------------------------------------------------- -Writes the specified variables into the string variable (dest) based on -the specified format. This function is the same as PRINTF except that the -output is written into the dest string variable instead of the console. This -function is the Baja equivalent of the standard C sprintf() function with -the exception that all the arguments following the format must be variables -(no constants allowed). See the PRINTF function definition for details.</pre> -<pre><b>TIME_STR <str_var> <int_var> - args: dest time -</b>---------------------------- -Writes to the string variable (specified as dest) the time and date stored in -the integer variable specified by time. This function is the Baja equivalent -to the standard C ctime() function. Example:</pre> -<pre> # Display current time - INT T - TIME T - TIME_STR STR T - PRINTF "Current time: %s\r\n" STR</pre> -<pre>Would display the current date/time similar to:</pre> -<pre> Current time: Thu Aug 31 1995 08:34 am</pre> -<pre><b>DATE_STR <str_var> <int_var> - args: dest time -</b>---------------------------- -Writes to the string variable (specified as dest) the date stored in the -integer variable specified by time (obtained with TIME or similar function) in -MM/DD/YY format or DD/MM/YY format if European date format is enabled in SCFG. -Example:</pre> -<pre> # Display current date - INT T - TIME T - DATE_STR STR T - PRINTF "Current date: %s\r\n" STR</pre> -<pre>Would display the current date similar to:</pre> -<pre> Current date: 08/31/95</pre> -<pre><b>SECOND_STR <str_var> <int_var> - args: dest seconds -</b>------------------------------ -Writes to the string variable (specified as dest) the number of seconds -(in HH:MM:SS format) stored in the integer variable specified by seconds. -Example:</pre> -<pre> # Display number of seconds elapsed - INT START END - TIME START - PRINT "Wait a period of time, then hit a key..." - GETKEY - TIME END - SUB END START - SECOND_STR STR END - PRINTF "\r\n%s time elapsed.\r\n" STR</pre> -<pre><b>FTIME_STR <str_var> <"cstr"> <int_var> - args: dest format time -</b>-------------------------------------- -Writes to the string variable (specified as dest) the date and time information -from the integer variable (specified as time) formatted according to string -constant specified as format. The format characters are described below:</pre> -<pre> %a abbreviated weekday name - %A full weekday name - %b abbreviated month name - %B full month name - %c date and time - %d day of month (01-31) (zero-padded) - %H hour (24-hour clock) (00-23) - %I hour (12-hour clock) (01-12) - %j day of the year (001-366) - %m month (01-12) - %M minute (00-59) - %p AM or PM - %S second (00-59) - %U week number of the year (Sunday as 1st day of week) (00-52) - %w weekday (0-6, Sunday is 0) - %W week number of the year (Monday as 1st day of week) (00-52) - %x date - %X time - %y year without century (00-99) - %Y year with century - %Z time zone name, if any - %% % (percent symbol)</pre> -<pre>This function is the Baja equivalent of the standard C strftime() function. -Example:</pre> -<pre> # Display current date and time - INT T - TIME T - FTIME_STR STR "Current_Time:%A,%B-%d-%Y,%I:%M %p" T - PRINTF "%s\r\n" STR</pre> -<pre><b>SHIFT_STR [str_var] <#> - args: string len -</b>------------------------ -This function ("Shift String") shifts the specified string variable if -specified (current command string if not specified) to the left 'len' number of -characters.</pre> -<pre> # Displays the string "ELLO" - SETSTR "HELLO" - SHIFT_STR 1 - PRINT STR</pre> -<pre>This function is most often used to parse command string arguments or "stacked" -commands.</pre> -<pre><b>STRIP_CTRL [str_var] - args: string -</b>-------------------- -Removes all control characters (and Ctrl-A codes) from specified string -variable. If string is not specified, then the current command string is -processed.</pre> -<pre><b>TRUNCSP [str_var] - args: string -</b>----------------- -Removes (truncates) all white space characters from end of specified string -variable or current command string (if string not specified).</pre> -<pre><b>STRUPR [str_var] - args: string -</b>---------------- -Converts specified string argument to all uppercase characters. This function -is the Baja equivalent to the standard C strupr() function.</pre> -<pre><b>STRLWR [str_var] - args: string -</b>---------------- -Converts specified string argument to all lowercase characters. This function -is the Baja equivalent to the standard C strlwr() function.</pre> -<pre><b>SETSTR <"cstr"> - args: text -</b>--------------- -Writes to current command string, specified constant text string. This -function should be used in place of "SET STR" for best optimization.</pre> -<pre><b>REPLACE_TEXT <#> <"cstr"> - args: num text -</b>------------------------- -This function is used to replace a default internal text string (read from the -CTRL\TEXT.DAT file) in a shell or module. The first argument (num) is the text -number to replace (see TEXT.DAT for the number of the text you wish to -replace). The second argument (text) is the C type string to use in place the -current one. All text replacements are lost (back to default TEXT.DAT) when the -user logs off. Example, to replace the "[Hit a key]" prompt with a different -string:</pre> -<pre> REPLACE_TEXT 563 "\1n\1h\1b{\1wPAUSE\1b} "</pre> -<pre>When replacing a TEXT.DAT string that contains %s, %d, or other % specifiers, -you will need to change them to %%s, %%d, etc (without changing the order).</pre> -<pre>If you wish to globally replace a string (for all shells and modules), you may -want to just edit the CTRL\TEXT.DAT file directly instead. - -<b>LOAD_TEXT <"str"> - args: filename -</b>------------------- -Loads an alternate TEXT.DAT file (from CTRL directory, automatically assuming -a .DAT extension for "filename"). Only those text items that are different -from the current TEXT items will be changed. All changes will only be in -effect until the current user logs off or the effects are reversed with the -REVERT_TEXT function. The base filename should be something other than just -"TEXT" (since that is the default TEXT.DAT that is loaded by SBBS).</pre> -<pre>This function is useful for making multiple languages available to your users.</pre> -<pre><b>REVERT_TEXT <# or ALL> - args: num -</b>---------------------- -This function is used to reverse the effects of a previous call to REPLACE_TEXT -or LOAD_TEXT (reverts back to default TEXT.DAT). Example:</pre> -<pre> REPLACE_TEXT 563 "\1n-=[Hit a Key]=- " - PAUSE - REVERT_TEXT 563</pre> -<pre>If the argument is the word ALL, then all text strings are reverted to the -original TEXT.DAT entries. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="IntegerManipulationFunctions">[4.3] - Integer Manipulation Functions</a></h2> -<pre>Functions used for manipulating integer variables (global or local).</pre> -<pre><b> INT <int_var> [int_var] [...] -args: new_vars -</b>------------------------------ -Define one or more local integer variables for later use. The new_vars -arguments are the names of the variables to define. These names must not be -currently used by other variables (local or global).</pre> -<pre>After definition, the variable names can be used by other functions. The -variables will each be initialized to a 0. The variables can only be referenced -in the current shell or module. When the current shell or module is terminated, -the variable names and their contents are lost. If you wish to retain a -variable name and its contents between shells or modules, use a global variable -instead of a local variable.</pre> -<pre><b>GLOBAL_INT <int_var> [int_var] [...] - args: new_vars -</b>------------------------------------ -Define one or more global integer variables for later use. The arguments are -the names of the variables to define. Each variable name must not be currently -used by another variable (local or global). Global variable names and their -contents are not disposed of until the current user logs off the BBS.</pre> -<pre><b> SET <int_var> <#> -args: dest value -</b>--------------------- -Writes to the integer variable dest, the integer constant specified as value.</pre> -<pre> INT I - SET I 100</pre> -<pre><b> ADD <int_var> <any_var or #> -args: dest value -</b>----------------------------- -Adds the value specified in the second argument to the integer variable -specified as dest.</pre> -<pre><b> SUB <int_var> <any_var or #> -args: dest value -</b>----------------------------- -Subtracts the value specified in the second argument from the integer variable -specified as dest.</pre> -<pre><b> MUL <int_var> <any_var or #> -args: dest value -</b>----------------------------- -Multiplies the first argument by the value specified in the second argument -and places the result into dest.</pre> -<pre><b> DIV <int_var> <any_var or #> -args: dest value -</b>----------------------------- -Divides the first argument by the value specified in the second argument -and places the result into dest.</pre> -<pre><b> MOD <int_var> <any_var or #> -args: dest value -</b>----------------------------- -Divides the first argument by the value specified in the second argument -and places the remainder into dest.</pre> -<pre><b> AND <int_var> <any_var or #> -args: dest value -</b>----------------------------- -Bit-wise ANDs the value specified in the second argument with the integer -variable specified as dest.</pre> -<pre><b> OR <int_var> <any_var or #> -args: dest value -</b>---------------------------- -Bit-wise ORs the value specified in the second argument with the integer -variable specified as dest.</pre> -<pre><b> NOT <int_var> <any_var or #> -args: dest value -</b>----------------------------- -Bit-wise ANDs the unary opposite of the value specified in the second argument -with the integer variable specified as dest.</pre> -<pre><b> XOR <int_var> <any_var or #> -args: dest value -</b>----------------------------- -Bit-wise exclusive ORs the value specified in the second argument with the -integer variable specified as dest.</pre> -<pre><b>COPY <int_var> <any_var> -args: dest source -</b>------------------------ -Copies the source variable (string or integer) into the specified destination -variable. Example:</pre> -<pre> # define two variables - INT INT1 INT2 - # place a value into the first variable - SET VAR1 5 - # copy that variable into the second variable - COPY VAR2 VAR1 - # display the contents of second variable - PRINTF "VAR2=%ld\r\n" VAR2</pre> -<pre>If the source variable is an string variable, it is converted into an integer -before the copy is executed.</pre> -<pre><b>SWAP <int_var> <any_var> -args: var1 var2 -</b>------------------------ -Exchanges the contents of two integer variables, or a string variable and an -integer variable. The first argument (var1) is the name of an integer variable -and the second argument (var2) is the name of a string or integer variable.</pre> -<pre><b>RANDOM <int_var> <#> - args: dest num -</b>--------------------- -Places a random number between 0 and num-1 into dest.</pre> -<pre><b>TIME <int_var> -args: dest -</b>-------------- -Places the current time (in unix/time_t format) into dest. This function is -the Baja equivalent of the standard C time() function.</pre> -<pre><b>STRLEN <int_var> <str_var> - args: dest string -</b>-------------------------- -Places the length (in characters) of the specified string into dest. This -function is the Baja equivalent of the standard C strlen() function.</pre> -<pre><b>DATE_INT <int_var> <str_var> - args: dest date -</b>---------------------------- -Converts a date string (in MM/DD/YY format) into an integer and places it -into dest.</pre> -<pre><b>CRC16 <int_var> <str_var> - args: dest string -</b>------------------------- -Calculates the 16-bit CRC of the specified string and places the result into -dest.</pre> -<pre><b>CRC32 <int_var> <str_var> - args: dest string -</b>------------------------- -Calculates the 32-bit CRC of the specified string and places the result into -dest.</pre> -<pre><b>CHKSUM <int_var> <str_var> - args: dest string -</b>-------------------------- -Calculates the CHKSUM of the specified string and places the result into -dest.</pre> -<pre><b>CHARVAL <int_var> <str_var> - args: dest string -</b>--------------------------- -Places the ASCII value of the first character in the specified string into -dest. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="Logic/ControlFlowFunctions">[4.4] - Logic/Control Flow Functions</a> -</h2> -<pre><b>GOTO <txt> -args: label -</b>----------- -This function is used to force the control flow to immediately jump to another -part of the code. A valid label name must follow GOTO as an argument. This -function is very similar to the GOTO command used in the BASIC and C -programming languages or the JMP instruction used in the Assembly programming -language.</pre> -<pre><b>CALL <txt> -args: label -</b>----------- -This function is used to execute a sub-routine. The sub-routine must be -defined with the specified label somewhere in the current module. When a -RETURN function is executed in the sub-routine, control flow will return to the -next line following the CALL function that started the sub-routine. The CALL -function is very similar to the GOSUB command used in the BASIC programming -language or the CALL instruction used in the Assembly programming language. At -least one RETURN function must exist in the sub-routine. Sub-routines should -not use a GOTO function to "jump out" of the sub-routine.</pre> -<pre><b>RETURN -</b>------ -This function is used to exit a sub-routine and return to the point in the -code from which it was called with the CALL function. If a RETURN -function is executed without a prior CALL, then the shell or module is -immediately terminated. If a shell is terminated with a user online, they -are immediately logged off. If a module is terminated, execution control -returns to the shell or module that loaded it.</pre> -<pre><b>SETLOGIC <TRUE or FALSE or GREATER or LESS> - args: logic -</b>------------------------------------------- -This function is used to set the current logic state to TRUE (same as -EQUAL), FALSE (same as NOT_EQUAL), GREATER, or LESS. The logic state is set by -many functions, and tested by the IF_... functions to control the flow of -execution.</pre> -<pre><b>COMPARE <any_var> <any_var or "cstr" or #> - args: var cmp -</b>------------------------------------------ -This function compares any two variables, or a variable and a constant. -If the cmp argument is an integer variable or integer constant and the -var variable is a string variable, then cmp is converted to a string -representation of the cmp variable before the comparison is made. If the cmp -argument is a string variable or string constant and the var variable is -an integer variable, then cmp is converted to an integer before the comparison -is made. The current logic state is set to the result of the comparison: -TRUE (same as EQUAL), FALSE (as an NOT_EQUAL), GREATER, or LESS. - -<b>IF_TRUE -</b>------- -If the current logic state is set to TRUE, then following block of code -(ending in an END_IF or ELSE function) will be executed. Otherwise, -the interpreter will skip the code until an ELSE or END_IF function is found -and resume execution from that point. This function is the same as IF_EQUAL.</pre> -<pre><b>IF_FALSE -</b>-------- -This function is identical to the IF_TRUE function except that it works in the -opposite manor in regards to the current logic state. This function is the -same as IF_NOT_EQUAL.</pre> -<pre><b>IF_GREATER -</b>---------- -If the current logic state is set to GREATER by a subsequent COMPARE function, -the following IF_... block will be executed.</pre> -<pre><b>IF_GREATER_OR_EQUAL -</b>------------------- -If the current logic state is set to GREATER or EQUAL, the following IF_... -block will be executed. This function is the same as IF_EQUAL_OR_GREATER.</pre> -<pre><b>IF_LESS -</b>------- -If the current logic state is set to LESS by a subsequent COMPARE function, -the following block will be executed.</pre> -<pre><b>IF_LESS_OR_EQUAL -</b>---------------- -If the current logic state is set to LESS or EQUAL, the following code block -will be executed. This function is the same as IF_EQUAL_OR_LESS.</pre> -<pre><b>ELSE -</b>---- -This function marks the end of an IF_... block of code and begins an alternate -block of code to be executed if the condition is not met for the IF_... -function. The block of code is terminated with an END_IF function.</pre> -<pre><b>END_IF -</b>------ -This function is used to terminate an IF_... or ELSE code block. Every IF_... -function must be followed by an ELSE or END_IF instruction, and every ELSE -function must be followed by an END_IF. - -<b>SWITCH <int_var> -</b>---------------- -<b>CASE <#> -</b>-------- -<b>END_CASE -</b>-------- -<b>DEFAULT -</b>------- -<b>END_SWITCH -</b>---------- -The SWITCH function is used in conjunction with the CASE, DEFAULT, END_CASE, -and END_SWITCH functions to replace multiple COMPARE/IF_.../ELSE statements.</pre> -<pre>Example:</pre> -<pre> INT I - RANDOM I 3 - COMPARE I 0 - IF_EQUAL - PRINT "Zero" - ELSE - COMPARE I 1 - IF_EQUAL - PRINT "One" - ELSE - COMPARE I 2 - IF_EQUAL - PRINT "Two" - END_IF - END_IF - END_IF</pre> -<pre>Could be replaced with:</pre> -<pre> INT I - RANDOM I 3 - SWITCH I - CASE 0 - PRINT "Zero" - END_CASE - CASE 1 - PRINT "One" - END_CASE - CASE 2 - PRINT "Two" - END_CASE - DEFAULT - PRINTF "Random returned %ld" I - END_CASE - END_SWITCH - -If the SWITCH argument value is equal to one of the specified CASE arguments, -then that CASE code block is executed until an END_CASE function is reached. -If an END_CASE function does not exist in the code block, the execution will -continue through (fall-through) the following CASE or DEFAULT functions until -an END_CASE or END_SWITCH function is reached.</pre> -<pre>If the SWITCH argument does not match any of the CASE arguments, the DEFAULT -code block will be executed until an END_CASE or END_SWITCH function is -reached. If a DEFAULT function is not specified, execution will skip to the -END_SWITCH function. Only one DEFAULT code block should be specified per -SWITCH/END_SWITCH block, if used at all. This function set is the Baja -equivalent of the standard C switch(), case:, default:, and break keywords.</pre> -<pre><b>CMD_HOME -</b>-------- -This function (called "Command Home") is very similar to a label. It is -a convenience function for programming menu commands. It sets a return -point (or anchor, if you will) for the automatic looping on a specific menu. -Execution control is returned to the point in the code where the last CMD_HOME -was specified by the END_CMD function.</pre> -<pre><b>CMDKEY <key> - args: cmd -</b>------------ -This function (called "Command Key") is like a combination of the -COMPARE_KEY and IF_TRUE functions. It is usually immediately preceded by -a GETCMD, GETKEY, GETSTR or similar function.</pre> -<pre>If the current command key matches the command key constant (cmd), then the -block of code following (terminated with an END_CMD function) will be executed. -When the END_CMD function is executed, execution control returns to the most -recently executed CMD_HOME function. If a RETURN or GOTO function will be -executed before the END_CMD function, then a CMD_POP function must be executed -to tell the interpreter to "forget" the previous CMD_HOME function. Even if -execution control will cause the END_CMD function to never be executed, it -still must be present to define the code block so that it can be skipped if the -CMDKEY comparison is false. - -<b>CMDKEYS <keylist> - args: cmds -</b>----------------- -This function is identical to the CMDKEY function with the exception that the -argument is a list of valid keys and if the current command key matches any -of those listed, the following code block is executed.</pre> -<pre><b>CMDSTR <"cstr"> - args: cmd -</b>--------------- -This function (called "Command Str") is identical to the CMDKEY function -with the exception that the argument is a C type string. It is usually -immediately preceded by a GETSTR or similar function.</pre> -<pre><b>END_CMD -</b>------- -This function is used to mark the end of a CMDKEY, CMDKEYS, or CMDSTR code -block.</pre> -<pre><b>CMD_POP -</b>------- -This function tells the interpreter to "forget" the most recently executed -CMD_HOME function. It should only be used when a CMDKEY, CMDKEYS, or CMDSTR -code block contains a GOTO or RETURN function.</pre> -<pre><b>COMPARE_KEY <key> - args: cmd -</b>----------------- -This function is identical to the CMDKEY function in regards to the -key argument. The current command key is set by the GETCMD, GETKEY, GETSTR -or similar functions. If the current command key matches the key argument, -the current logic state is set to TRUE, otherwise it is set to FALSE.</pre> -<pre>As with all COMPARE functions, it is usually immediately followed by an -IF_TRUE or IF_FALSE function.</pre> -<pre><b>COMPARE_KEYS <keylist> - args: cmds -</b>---------------------- -This function is identical to the CMDKEYS functions in regards to the -keylist argument. If the current command key is contained in the keylist, -then the current logic state is set to TRUE, otherwise it is set to FALSE.</pre> -<pre><b>COMPARE_STR <"cstr"> - args: string -</b>-------------------- -This function compares the current command string (set by the SETSTR, -GETSTR, or similar functions) against the C type string argument and sets -the current logic state to TRUE or FALSE accordingly. The comparison is not -case sensitive. This function is the Baja equivalent to the standard C -stricmp() function. - -<b>COMPARE_WORD <"cstr"> - args: string -</b>--------------------- -This function is identical to the COMPARE_STR function with the -exception that the current command string must only match the string argument -for as many characters as included in the string argument.</pre> -<pre>If for example, the current command string is "OPEN BLACKJACK" then the line:</pre> -<pre> COMPARE_WORD "OPEN"</pre> -<pre>would set the current logic state to TRUE since the first 4 characters of -each string match, but the line:</pre> -<pre> COMPARE_STR "OPEN"</pre> -<pre>would set the current logic state to FALSE since the strings do not entirely -match.</pre> -<pre><b>COMPARE_ARS <txt> - args: ars -</b>----------------- -This function compares the requirement string argument ars against the -information on the current user and sets the current logic state to either -TRUE or FALSE based on the result of the comparison. See the ARS chapter of -the Synchronet sysop manual for details on the syntax of ARS.</pre> -<pre>Example: - COMPARE_ARS LEVEL 60 - IF_TRUE - PRINT "You have level 60 or higher.\r\n" - END_IF</pre> -<pre><b>COMPARE_STRN <#> <str_var> <str_var or "cstr"> - args: num str1 str2 -</b>----------------------------------------------- -This function is used to compare the first num characters of strings str1 -and str2. This function is the Baja equivalent of the standard C strnicmp() -function. If the two strings are the same (ignoring case) for the first -num characters, the current logic state is set to TRUE, otherwise it is set -to FALSE.</pre> -<pre><b>COMPARE_SUBSTR <str_var> <str_var or "cstr"> - args: str1 str2 -</b>-------------------------------------------- -This function is used to check if str2 is contained in str1 (case sensitive). -This function is the Baja equivalent of the standard C strstr() function. -If str2 is located in str1, the current logic state is set to TRUE, otherwise -it is set to FALSE. This following example would set the current logic state -to TRUE:</pre> -<pre> SETSTR "This is a test" - COMPARE_SUBSTR STR "test" - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2> <a name="DisplayFunctions">[4.5] - Display Functions</a> -</h2> -<pre>Display functions are used to display output to the user either locally, -remotely, or both.</pre> -<pre><b>PRINT <"cstr" or var> -args: string -</b>--------------------- -This function sends a string of characters to the user (both locally and -remotely, if applicable). The string to be printed can extend beyond the 80th -column of the screen, but when printing multiple lines, multiple consecutive -PRINT statements are preferred.</pre> -<pre>Example: - PRINT "hello, world\r\n" - or: - STR my_var - SET my_var "hello, world\r\n" - PRINT my_var</pre> -<pre>The string can contain color codes using Synchronet Ctrl-A codes. See the -Synchronet sysop manual for the definition of Ctrl-A codes and their usage. -If you are using an ASCII editor that does not support control characters, -a "\1" can be used in place of the Ctrl-A (smiley face) character.</pre> -<pre>Variables can also be included in the string (example: user's name, sysop's -name, BBS name, etc) by using Synchronet supported @-codes and command line -% specifiers. See the Synchronet sysop manual for the definition of @-codes -and command line % specifiers. The %s command line specifier, when used, is -replaced with the current command string and %f is replaced with the complete -path of the current file directory. Be careful not to confuse command line % -specifiers (%a, %b, etc) with printf % specifiers (described later). They can -actually be used together in the same string (supported by PRINTF functions) by -using double % for the command line % specifiers (e.g. %%s instead of %s).</pre> -<pre><b>PRINTF <"cstr"> [any_var] [...] - args: format variables -</b>------------------------------- -This function is similar to print, except that defined variables can be placed -(formatted) into to displayed text output. This function is the Baja -equivalent of the standard C printf() function. The format argument is a C type -string with C printf() % specifiers for variable formatting.</pre> -<pre>The valid specifiers are:</pre> -<pre> %% Percent symbol - %s String variable - %#s String variable, minimum # chars wide, right justified - %-#s String variable, minimum # chars wide, left justified - %.#s String variable, maximum # chars wide - %#.#s String variable, min and max width specified, right justified - %-#.#s String variable, min and max width specified, left justified - %ld Integer variable, decimal - use lx for hexadecimal (lX=caps) - %#ld Integer variable minimum # chars wide right justified - %-#ld Integer variable minimum # chars wide left justified - %0#ld Integer variable minimum # digits wide zero padded</pre> -<pre>Multiple variable names may be specified after the str argument, but each -variable MUST be properly represented in the str argument with the correct -PRINTF specifier (either %ld, %lx, or %s).</pre> -<pre>Example: - STR s - SET s "hello, world" - PRINTF "~%s~\r\n" s - PRINTF "~%10s~\r\n" s - PRINTF "~%.10s~\r\n" s - PRINTF "~%-10s~\r\n" s - PRINTF "~%.15s~\r\n" s - PRINTF "~%-15s~\r\n" s - PRINTF "~%15.10s~\r\n" s - PRINTF "~%-15.10s~\r\n" s</pre> -<pre>Would produce the following display:</pre> -<pre> ~hello, world~ - ~hello, world~ - ~hello, wor~ - ~hello, world~ - ~hello, world ~ - ~ hello, wor~ - ~hello, wor ~ - -And: - INT i - SET i 1234 - PRINTF "~%ld~\r\n" i - PRINTF "~%3ld~\r\n" i - PRINTF "~%6ld~\r\n" i - PRINTF "~%-6ld~\r\n i - PRINTF "~%06ld~\r\n" i - PRINTF "~%06lx~\r\n" i - PRINTF "~%06lX~\r\n" i</pre> -<pre>Would produce the following display:</pre> -<pre> ~1234~ - ~1234~ - ~ 1234~ - ~1234 ~ - ~001234~ - ~0004d2~ - ~0004D2~</pre> -<pre><b>PRINT_LOCAL <"cstr"> - args: string -</b>-------------------- -This function works identical to the PRINT function with the exception that -the output is only displayed locally (on the BBS console). Ctrl-A codes -and @-codes are not supported.</pre> -<pre><b>PRINT_REMOTE <"cstr"> - args: string -</b>--------------------- -This function works identical to the PRINT function with the exception that -the output is only displayed remotely (on the user's terminal). If the current -user is not logged on remotely, then no output is performed. Ctrl-A codes -and @-codes are not supported.</pre> -<pre><b>PRINTSTR -</b>-------- -This function works identical to the PRINT function with the exception that -this function does not accept a string argument, and instead uses the current -command string (set with SETSTR, GETSTR, or similar function) as the character -string to print.</pre> -<pre>Example: - SETSTR "hello, world\r\n" - PRINTSTR</pre> -<pre><b>PRINTKEY -</b>-------- -This function displays the current command key. The command key is normally -obtained with the GETKEY, GETCMD, or similar function.</pre> -<pre><b>MNEMONICS <"cstr"> - args: string -</b>------------------ -This function works identical to the PRINT function with the exception that -the output is automatically colorized and characters following a tilde (~) -are considered a mnemonic command character (hot key) and are high-lighted -or placed in parentheses if the user's terminal does not support ANSI. If -Ctrl-A codes are included in the str argument, then the automatic colorization -and high-lighting is not used.</pre> -<pre>Example: - mnemonics "Select: ~Good, ~Bad, or ~Indifferent: "</pre> -<pre><b>CLS -</b>--- -This function clears the current text screen.</pre> -<pre><b>CRLF -</b>---- -This function displays a carriage return/line feed (new line). It is equivalent -to PRINT "\r\n", but requires less memory and executes faster.</pre> -<pre><b>PRINTFILE <"str" or str_var> [#] SBBSDEFS.INC - args: file mode -</b>---------------------------------- -Displays the contents of the file to the user (both locally and remotely, if -applicable).</pre> -<pre>Valid mode parameters:</pre> -<pre>P_NOABORT Disallows abortion of display with Ctrl-C -P_SAVEATR Retain attributes (colors) after display -P_NOATCODES Don't expand @-code variables/actions -P_OPENCLOSE Open and close immediately (before display)</pre> -<pre>Multiple mode parameters can be specified by joining them together with the -OR (|) symbol.</pre> -<pre>Example: - !INCLUDE SBBSDEFS.INC - PRINTFILE "C:\TEXT\HELP.TXT" P_NOABORT|P_OPENCLOSE</pre> -<pre><b>PRINTTAIL <str_var> <#> <#> SBBSDEFS.INC - args: file mode x -</b>----------------------------- -Displays the last x number of lines of file. The valid mode parameters are the -same as those shown for the PRINTFILE function. If you don't want any of the -mode values, use 0 for the mode.</pre> -<pre><b>PRINTFILE_STR -</b>------------- -This function is identical to the PRINTFILE function, with the exception that -there is no argument, the current command string is used for the path and -filename instead.</pre> -<pre><b>PRINTFILE_LOCAL <"str"> - args: file -</b>----------------------- -This function works identical to the PRINTFILE function, with the exception -that the contents are only displayed locally.</pre> -<pre><b>PRINTFILE_REMOTE <"str"> - args: file -</b>---------------------- -This function works identical to the PRINTFILE function, with the exception -that the contents are only displayed remotely. If the user is not logged on -remotely, then no output is performed.</pre> -<pre><b>LIST_TEXT_FILE -</b>-------------- -This function works similar to the PRINTFILE function, with the exception -that the system password is required when run remotely and the user is prompted -to enter the path and name of the file to list.</pre> -<pre><b>EDIT_TEXT_FILE -</b>-------------- -This function is generally for sysop use only. It will automatically prompt -the user (if remote) for the system password, and then prompt them for the -path and name of the file to edit.</pre> -<pre><b>PAUSE -</b>----- -This function produces a "[Hit a key]" prompt and waits for the user to hit a -key.</pre> -<pre><b>MENU <"str"> -args: file -</b>---------- -This function is similar to the PRINTFILE function with the exception that the -TEXT\MENU directory is assumed to be the root path for the file and the file's -extension (.ASC, .ANS, .MON, or .RIP) should not be specified. This function -will automatically display the correct file based on the what the user's -terminal supports and which menu files are available. To display a menu file -in a different directory, a sub-directory can be specified before the filename. -For example, do display the MAIN.* menu file in the TEXT\MENU\SIMPLE directory, -you would use the following:</pre> -<pre> MENU "SIMPLE\MAIN"</pre> -<pre>To display the MAIN.* menu file in the TEXT\MENU directory, you would use the -following:</pre> -<pre> MENU "MAIN"</pre> -<pre>You can also change the default menu directory with the SET_MENU_DIR function. -Using the SET_MENU_FILE function, you can override the location and filename -for MENUs that are displayed from within core functions of Synchronet.</pre> -<pre><b>NODELIST_ALL -</b>------------ -This function displays the current status of all nodes.</pre> -<pre><b>NODELIST_USERS -</b>-------------- -This function displays the current status of all nodes that are in use.</pre> -<pre><b>USERLIST_SUB -</b>------------ -This function displays all users that have access to the current message -sub-board.</pre> -<pre><b>USERLIST_DIR -</b>------------ -This function displays all users that have access to the current file -directory.</pre> -<pre><b>USERLIST_ALL -</b>------------ -This function displays all users that have active accounts on the BBS.</pre> -<pre><b>USERLIST_LOGONS -</b>--------------- -This function displays a list of the users who have logged on today.</pre> -<pre><b>YES_NO <"cstr"> - args: question -</b>---------------- -This function displays the question argument with automatic colorization -followed by the text " (Y/n) ? " and waits for the user to hit 'Y', 'N' or CR. -If CR (enter) is hit, then 'Y' is assumed. If the answer to the prompt is 'Y', -then the current logic state is set to TRUE, otherwise it is set to FALSE.</pre> -<pre>Example: - YES_NO "Logoff Now" - IF_TRUE - LOGOFF - END_IF</pre> -<pre><b>NO_YES <"cstr"> - args: question -</b>---------------- -This function is identical to the YES_NO function with the exception that the -string is followed by text " (y/N) ? " and if CR is hit, then 'N' is assumed. -If the answer to the prompt is 'N', then the current logic state is set to -TRUE, otherwise it is set to FALSE.</pre> -<pre>Example: - NO_YES "Logoff Now" - IF_FALSE - LOGOFF - END_IF</pre> -<pre><b>READ_SIF <"str"> - args: file -</b>-------------- -This function displays the contents of a SIF questionnaire data file (path and -filename specified in the current command string). The data is read -from the SIF data file and displayed through the SIF questionnaire file: -"TEXT\file.SIF".</pre> -<pre>The original SIF data file is created with the CREATE_SIF function. The -SIF file used to create and display the data file do not have to be the same -SIF file, but should have the same order and format of data types.</pre> -<pre>See the Synchronet Sysop Manual for details on the SIF file format.</pre> -<pre><b>SAVELINE -</b>-------- -This function saves the current line of text on the console to an internal -Synchronet buffer for later re-display with the RESTORELINE function.</pre> -<pre><b>RESTORELINE -</b>----------- -This function re-displays a previously saved line of text to the local and -remote console (if applicable).</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="InputFunctions">[4.6] - Input Functions</a> -</h2> -<pre>Input functions are used to obtain input data from the user (most often from -the user's keyboard).</pre> -<pre><b>INKEY -</b>----- -Checks to see if the user has hit a key. If the user has hit a key, the -current command key is set to the hit key and the current logic state is -set to TRUE, otherwise the logic state is set to FALSE. This function does -not wait for a user to hit a key.</pre> -<pre><b>GETKEY -</b>------ -Waits for a single key from the user. The key is converted to upper case (if -a letter) and becomes the current command key for functions such as CMDKEY, -COMPARE_KEY, etc. The key is not echoed (displayed). Use the PRINTKEY function -to display a key accepted with this function.</pre> -<pre><b>GETKEYE -</b>------- -This function is identical to the GETKEY function with the exception that -"slash commands" are allowed. That is, if the user hits the slash (/) key, -then the slash is echoed and the system waits for another key from the user. -The second key is converted to upper case (if a letter) and the slash/key -combination becomes the current command key for functions such as CMDKEY, -COMPARE_KEY, etc. The second key is not echoed (displayed). Use the PRINTKEY -function to display a key accepted with this function.</pre> -<pre><b>GETCMD <"cstr"> - args: keys -</b>--------------- -This function is very similar to the GETKEY function, except that the 'keys' -argument specifies the only valid key to be accepted. The keys arguments is -a C style string, so carriage return (ENTER) is specified with a \r. If, for -example, you wanted to allow the user to hit A, B, C or ENTER, then you would -use the following:</pre> -<pre> GETCMD "ABC\r"</pre> -<pre>When an allowed key is hit, the key is converted to upper case (if a letter) -and echoed (displayed) followed by a CRLF automatically. The key then becomes -the current command key for functions such as CMDKEY, COMPARE_KEY, etc.</pre> -<pre>Ctrl-C will always be allowed, in which case the command key becomes ^C. - -<b>GETSTR [str_var] [#] [#] SBBSDEFS.INC - args: string max mode -</b>--------------------------- -This function ("Get String"), is used to accept a string of characters from -the user. The 'max' argument specifies the maximum length allowed for the -string (in characters). 'max' should not exceed 79 characters for most uses. -This function allows the user to enter any valid ASCII characters to form -command words, sentences, etc. Control will not return to the module until the -user either hits CR (ENTER), Ctrl-C, or Ctrl-V or is disconnected. The -resultant string can then be used in functions such as CMDSTR, COMPARE_STR, -COMPARE, SHIFT_STR, XTRN_EXEC, FILE_DOWNLOAD, etc.</pre> -<pre>If string is not specified, the current command string is written to. If -max is not specified, the value 128 is used.</pre> -<pre>The valid mode parameters (defined in SBBSDEFS.INC) are:</pre> -<pre>Mode Description -~~~~ ~~~~~~~~~~~ -K_UPPER Converts all letters to upper case -K_UPRLWR Upper/Lower case automatically -K_NUMBER Allow numbers only -K_WRAP Allows word wrap -K_MSG Allows Ctrl-A codes and Ctrl-G (beep) -K_SPIN Spinning cursor -K_LINE Input line (inverse color) -K_EDIT Edit string passed -K_NOCRLF Don't print CRLF after string input -K_ALPHA Only allow alphabetic characters -K_LOWPRIO low priority input -K_NOEXASC No extended ASCII allowed -K_E71DETECT Detect E-7-1 terminal type -K_AUTODEL Auto-delete text (used with EDIT) -K_NOECHO Don't echo input to local or remote console</pre> -<pre>Multiple mode parameters can be used by ORing them together with the | symbol. -Example:</pre> -<pre> GETSTR STR 25 K_UPRLWR|K_EDIT|K_AUTODEL</pre> -<pre><b>GETLINE [str_var] [#] - args: string max -</b>-------------------------- -This function is identical to GETSTR with the exception that an inverse line -is displayed to the user (if the user has an ANSI terminal) to show the maximum -length of the input string.</pre> -<pre><b>GETSTRUPR [str_var] [#] - args: string max -</b>------------------------ -This function ("Get String Upper") is identical to GETSTR with the exception -that the string is automatically converted to uppercase as the user types. - -<b>GETNAME [str_var] [#] - args: string max -</b>---------------------- -This function is identical to GETSTR with the exception that the string is -automatically converted to "Capitalized" words (as in a proper noun) as the -user types.</pre> -<pre><b>GETFILESPEC -</b>----------- -This function is specifically used to accept a file specification (name and/or -wildcard characters) from the user. It will automatically display a prompt -similar to:</pre> -<pre>Filespec [*.*]:</pre> -<pre>before waiting for the user to input the file specification. If the user hits -CR, *.* is assumed to be the file specification. If a period is not included -in the string, a ".*" is automatically appended (so CR, "*" and "*.*" all -result in the same string: "*.*"). If the user enters "A*", the string becomes -"A*.*". If the user enters "A*." the string remains unchanged. If the user -hits Ctrl-C, the current logic state is set to FALSE. Otherwise, the logic -state is set to TRUE.</pre> -<pre>Example:</pre> -<pre> GETFILESPEC - IF_TRUE - FILE_DOWNLOAD - END_IF</pre> -<pre><b>GETLINES -</b>-------- -This function only has an effect if the user is logged on remotely, has -ANSI terminal capability and their screen lines set to "Auto-detect". It -sends an ANSI sequence to detect the number of screen lines in the text window -of the remote terminal and waits for a response.</pre> -<pre><b>GETNUM [any_var] <#> - args: dest max -</b>--------------------- -This function is similar to GETSTR with the exception that it only excepts -numbers as input and automatically stops accepting input if the number being -input would exceed max (maximum of 32767). The dest variable (current -command string if not specified) will contain the number and the current logic -state will be TRUE unless the user hit 'Q', Ctrl-C, or enter instead of a -number. - -<b>GET_TEMPLATE <"str"> -</b>------------------ -This function is much line GETLINE except that an input template is passed -as an argument to this function. The template is useful when requiring the -user to input a string of a fixed format, like a date, for example. The -characters in the template have special meaning: N indicates only a number may -be used in this position, A indicates only an alphabetic character, and ! -indicates any character may be used in that position. Characters other than -N, A, or ! are automatically displayed and used in the current command string -in those positions. The first character of the template must be either N, A, or -!. An example (date format):</pre> -<pre> GET_TEMPLATE "NN/NN/NN"</pre> -<pre>would require the user to input two numbers, then automatically skip the -slash character, two more numbers, skip the slash, then two more numbers.</pre> -<pre>Another example (Canadian postal code):</pre> -<pre> GET_TEMPLATE "ANA NAN"</pre> -<pre>would require the user to input a letter, then a number, another letter, -automatically skip the space, another number, another letter, and one more -number. No other characters (symbols or otherwise) would be allowed in the -string using the above template example.</pre> -<pre><b>CHKSYSPASS -</b>---------- -This function ("Check System Password") displays an SY: prompt to the user -and waits for the user to input the system password (with no echo). If the -password is correct, the current logic state is set to TRUE, otherwise it -is set to FALSE. - -<b>CREATE_SIF <"str"> - args: file -</b>---------------- -This function is used to present the user with a SIF questionnaire and store -their answers in a data file. The str argument is the filename of a .SIF file -(without the .SIF extension) located in your Synchronet TEXT directory. The -user's answers are stored in a data file whose path and filename are specified -in the current command string. The data file should be specified with the -user's number to ensure unique data filenames. Example:</pre> -<pre> SETSTR "C:\\SBBS\\USER%4.DAT" - CREATE_SIF "NEWUSER"</pre> -<pre>This would read the file TEXT\NEWUSER.SIF and the user would fill-out the -questionnaire with all answers being stored in the file C:\SBBS\USER####.DAT -(where #### would be the user's number padded with zeros to four digits). -The questionnaire could then be read back with the answers filled in. -Example:</pre> -<pre> SETSTR "C:\\SBBS\\USER%4.DAT" - READ_SIF "NEWUSER"</pre> -<pre>See the Synchronet Sysop Manual for details on the SIF questionnaire format. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="MiscellaneousFunctions">[4.7] - Miscellaneous Functions</a> -</h2> -<pre><b>ONLINE -</b>------ -Assume online execution (default mode), auto-return from module if user is -disconnected or logged off.</pre> -<pre><b>OFFLINE -</b>------- -Assume offline execution, no carrier and no one online locally. If used -(for OFFLINE modules), must be the FIRST executed function of the module.</pre> -<pre><b>LOGIN <"cstr"> - args: pwprompt -</b>--------------- -Process login attempt using the current command string as the user name/number -and pwprompt for the password prompt. This function may also prompt for the -system password with the SY: prompt if the user has level 90 or higher.</pre> -<pre><b>LOGON -</b>----- -Logon the currently logged-in user. This function must be called before the -LOGIN module terminates if the user is to be allowed online. This function, -in turn, executes the LOGON module, if one is configured in SCFG.</pre> -<pre><b>LOGOFF -</b>------ -This function prompts the user if they really wish to log off. If they -answer Yes, then any logoff events are executed and the LOGOFF menu file -is displayed before they are disconnected.</pre> -<pre><b>LOGOFF_FAST -</b>----------- -This function immediately drops carrier and logs the user off. It differs -from the HANGUP function in that it performs a SYNC function, then it -immediately drops carrier, as opposed to the HANGUP function which does not -perform a SYNC operation and has a buffer flush delay before actually -dropping carrier.</pre> -<pre><b>LOGOUT -</b>------ -Logout the currently logged-on user. This function is used solely for -re-logging-in an already connected user.</pre> -<pre><b>NEWUSER -</b>------- -Begins the new user application process. - -<b>SET_MENU_DIR <"str"> - args: dir -</b>------------------ -This function sets the default menu directory for the MENU function (normally -..\TEXT\MENU). This function is useful for globally changing the directory -where MENU files will be retrieved from (including internal Synchronet -functions that can not be modified with a shell). The following is an example -of how to use this function along with the MENU function:</pre> -<pre> # The next line would display ..\TEXT\MENU\MAIN.* - MENU "MAIN"</pre> -<pre> # Change the directory for menus</pre> -<pre> MENU_DIR "..\TEXT\MYMENUS"</pre> -<pre> # This next line would now display ..\TEXT\MYMENUS\MAIN.* - MENU "MAIN"</pre> -<pre><b>SET_MENU_FILE <"str"> - args: path_and_filename -</b>-------------------------------- -This function is used to OVERRIDE the filename specified for a menu displayed -in an internal Synchronet function. Example:</pre> -<pre> SET_MENU_FILE "..\TEXT\MYMENUS\EMAIL.RIP" - MAIL_READ</pre> -<pre><b>SYNC -</b>---- -This function synchronizes the local and remote displays (waits for the remote -terminal to catch up), displays any internode messages waiting for this node, -and synchronizes the current node status with the shared node database file. -It should be called before all command prompts are displayed.</pre> -<pre><b>ASYNC -</b>----- -This function is identical to the SYNC function with the exception that any -pending output (menu, text file, etc.) can be aborted by hitting any key.</pre> -<pre><b>RIOSYNC -</b>------- -This function synchronizes the remote console (waits for output buffers to -be sent or aborted).</pre> -<pre><b>PUT_NODE -</b>-------- -Force flush (write) of current node information (who's online, etc) to disk.</pre> -<pre><b>PAUSE_RESET -</b>----------- -This function resets the line counter used for the automatic screen pause -Feature.</pre> -<pre><b>CLEAR_ABORT -</b>----------- -This function clears the abort (Ctrl-C) status flag.</pre> -<pre><b>UNGETKEY -</b>-------- -This function puts the current command key into the input buffer to be the -next key retrieved with GETKEY, GETCMD, GETSTR, or similar functions.</pre> -<pre><b>UNGETSTR -</b>-------- -This function puts the entire contents of the current command string into the -input buffer.</pre> -<pre><b>HANGUP -</b>------ -This function immediately disconnects and logs the user off. - -<b>EXEC <"str"> -args: cmd -</b>---------- -This function calls the operating system to spawn the 'cmd' command line -specified. Remote users will not see or be able to interact with the program -executed unless the program is aware of the remote user and is specifically -designed to be run remotely (i.e. DOORs).</pre> -<pre>If an internal DOS command is to be executed, a command processor must be -loaded. Example:</pre> -<pre> EXEC "COMMAND /C COPY C:\FILES\NEWFILE.TXT C:\DOWNLOADS"</pre> -<pre>Synchronet's command line specifiers can also be used:</pre> -<pre> EXEC "%!dsz portx %u,%i sz file.zip"</pre> -<pre>See the Synchronet sysop manual, appendix A for a list of valid specifiers. -When used from a command shell or module, %f will be replaced with the path -to the current file directory, and %s will be replaced with the current -command string.</pre> -<pre><b>EXEC_INT <"str"> - args: cmd -</b>-------------- -This function ("Execute with I/O intercepted") is identical to the EXEC -function with the exception that DOS I/O interrupts (screen output and keyboard -input) is intercepted and redirected to the COM port if the user is logged on -remotely. This allows programs that use standard DOS I/O for screen output -to be displayed remotely. Example:</pre> -<pre> EXEC_INT "COMMAND /C DIR C:\FILES\*.TXT"</pre> -<pre><b>EXEC_BIN <"str"> - args: name -</b>-------------- -This function loads and executes a Baja module. A .BIN file with the filename -specified as the 'name' argument must exist in the Synchronet EXEC directory -for this function. If for example, you want a shell to load and execute -MYMOD.BIN from your EXEC directory, you would add the following to one or more -command shells:</pre> -<pre> EXEC_BIN "MYMOD"</pre> -<pre><b>EXEC_XTRN <"str"> - args: code -</b>--------------- -This function executes the online external program specified by it's internal -code with the 'code' argument. If an online external program is not found with -a matching internal code or the user does not have access to that program, this -function does nothing. - -<b>LOG <"cstr"> -args: string -</b>------------ -This function writes the C type 'str' argument to the system's activity log -file for the current date if the user is logged on remotely.</pre> -<pre><b>LOGSTR -</b>------ -This function is identical to the LOG function with the exception that a -string argument is not used, but instead the current command string is written -to the system's activity log file.</pre> -<pre><b>LOGKEY -</b>------ -This function writes the current command key to the system's activity log file -for the current date if the user is logged on remotely.</pre> -<pre><b>LOGKEY_COMMA -</b>------------ -This function is identical to the LOGKEY function, with the exception that a -comma (,) is prepended to the command key to separate it visually from other -logged command keys.</pre> -<pre><b>NODE_STATUS <#> NODEDEFS.INC - args: status -</b>------------------- -This function is used to set the current node status. The valid status -parameters (defined in NODEDEFS.INC) are:</pre> -<pre>Status Description -~~~~~~ ~~~~~~~~~~~ -NODE_WFC Waiting for caller -NODE_LOGON User logging on -NODE_NEWUSER New user applying for access -NODE_INUSE User online -NODE_QUIET User online in quiet mode -NODE_OFFLINE Offline (down) -NODE_NETTING Networking -NODE_EVENT_WAITING Waiting for another node to run timed event -NODE_EVENT_RUNNING Running timed event -NODE_EVENT_LIMBO Waiting for all nodes to be downed</pre> -<pre>Only one status parameter may be used. - -<b>NODE_ACTION <#> NODEDEFS.INC - args: action -</b>------------------- -This function is used to set the current node action. The valid action -parameter (defined in NODEDEFS.INC) are:</pre> -<pre>Action Description -~~~~~~ ~~~~~~~~~~~ -NODE_MAIN Main Prompt -NODE_RMSG Reading Messages -NODE_RMAL Reading Mail -NODE_SMAL Sending Mail -NODE_RTXT Reading G-Files -NODE_RSML Reading Sent Mail -NODE_PMSG Posting Message -NODE_AMSG Auto-message -NODE_XTRN Running External Program -NODE_DFLT Main Defaults Section -NODE_XFER File Transfer Prompt -NODE_DLNG Downloading File -NODE_ULNG Uploading File -NODE_BXFR Bidirectional Transfer -NODE_LFIL Listing Files -NODE_LOGN Logging on -NODE_LCHT In Local Chat with Sysop -NODE_MCHT In Multi-Chat with Other Nodes -NODE_GCHT In Local Chat with Guru -NODE_CHAT In Chat Section -NODE_SYSP Sysop Activity -NODE_TQWK Transferring QWK packet -NODE_PCHT In Private Chat -NODE_PAGE Paging another node for Private Chat -NODE_RFSD Retrieving file from seq dev (node.aux=dev)</pre> -<pre>Only one action parameter may be used.</pre> -<pre><b>INC_MAIN_CMDS -</b>------------- -This function increments the "main menu command" counter that can be used in -ARS comparisons.</pre> -<pre><b>INC_FILE_CMDS -</b>------------- -This function increments the "file menu command" counter that can be used in -ARS comparisons. - -<b>COMPARE_USER_MISC <#> USERDEFS.INC - args: attrs -</b>------------------------ -This function is used to compare the current user's miscellaneous attributes -to the attrs argument specified. If all the attrs specified are ENABLED for the -current user, then the current logic state is set to TRUE, otherwise it is set -to FALSE. One or more of the following attributes (defined in USERDEFS.INC) -can be specified:</pre> -<pre>Attribute Description -~~~~~~~~~ ~~~~~~~~~~~ -UM_EXPERT Expert menu mode -UM_DELETED Deleted user -UM_INACTIVE Inactive user -UM_AUTOTERM Automatic terminal type detection -UM_ANSI ANSI terminal -UM_COLOR Color terminal (ANSI) -UM_RIP RIP compatible terminal -UM_WIP WIP compatible terminal -UM_NO_EXASCII Extended ASCII not supported -UM_UPAUSE Automatic screen pause -UM_SPIN Spinning cursor -UM_ANFSCAN Automatic new file scan -UM_CLRSCRN Clear screen between messages -UM_QUIET Default to quiet mode (if 'Q' exempt) -UM_BATCHFLAG Batch flagging mode enabled -UM_NETMAIL Forward E-mail to NetMail -UM_CURSUB Remember current sub-board and directory -UM_ASK_NSCAN Ask for new-scans at logon -UM_ASK_SSCAN Ask for your message scan at logon -UM_COLDKEYS Cold keys (CR required - opposite of Hot Keys) -UM_EXTDESC Extended file descriptions in listings</pre> -<pre>Multiple attributes can be specified by ORing them together with the OR (|) -symbol. Example:</pre> -<pre> COMPARE_USER_MISC UM_ANSI|UM_COLOR - - -<b>COMPARE_USER_CHAT <#> USERDEFS.INC - args: attrs -</b>------------------------ -This function is used to compare the current user's chat attributes to the -attrs argument specified. If all the attrs specified are ENABLED for the -current user, then the current logic state is set to TRUE, otherwise it is set -to FALSE. One or more of the following attributes (defined in USERDEFS.INC) can -be specified:</pre> -<pre>Attribute Description -~~~~~~~~~ ~~~~~~~~~~~ -CHAT_ECHO Echo users input in multinode chat -CHAT_ACTION Action commands enabled in multinode chat -CHAT_NOPAGE This user can't be paged by other users -CHAT_NOACT This user will not receive node activity (logon/off) alerts -CHAT_SPLITP This user prefers split-screen private node-to-node chat</pre> -<pre>Multiple attributes may be specified by ORing them together with the OR (|) -symbol. Example:</pre> -<pre> COMPARE_USER_CHAT CHAT_NOACT|CHAT_NOPAGE</pre> -<pre><b>COMPARE_USER_QWK <#> USERDEFS.INC - args: attrs -</b>----------------------- -This function is used to compare the current user's QWK attributes to the attrs -argument specified. If all the attrs specified are ENABLED for the current -user, then the current logic state is set to TRUE, otherwise it is set to -FALSE. One or more of the following attrs (defined in USERDEFS.INC) can be -specified:</pre> -<pre>Attribute Description -~~~~~~~~~ ~~~~~~~~~~~ -QWK_FILES Include new files list in QWK packet -QWK_EMAIL Include unread e-mail/netmail messages in QWK packet -QWK_ALLMAIL Include all mail in QWK packet -QWK_DELMAIL Automatically delete packed e-mail after download -QWK_BYSELF Include messages in QWK packet from self -QWK_EXPCTLA Expand Ctrl-A codes in messages to ANSI -QWK_RETCTLA Retain (keep) Ctrl-A codes in messages -QWK_ATTACH Include file attachments in QWK packet -QWK_NOINDEX Do not include .NDX files in QWK packet -QWK_TZ Include time zone (@TZ) in messages -QWK_VIA Include message path (@VIA) in messages -QWK_NOCTRL Do not include control files (DOOR.ID, CONTROL.DAT, etc)</pre> -<pre>Multiple attributes may be specified by ORing them together with the OR (|) -symbol. Example:</pre> -<pre> COMAPARE_USER_QWK QWK_TZ|QWK_VIA - -<b>COMPARE_NODE_MISC <#> NODEDEFS.INC - args: attrs -</b>------------------------ -This function is used to compare the current node's misc attributes to the -attrs argument specified. If all the attrs specified are ENABLED for the -current node, then the current logic state is set to TRUE, otherwise it is set -to FALSE. The valid attributes (defined in NODEDEFS.INC) are:</pre> -<pre>Attribute Description -~~~~~~~~~ ~~~~~~~~~~~ -NODE_ANON Anonymous node -NODE_LOCK Locked node (sysop's and N exempt users only) -NODE_INTR Interrupted node (log user off ASAP) -NODE_MSGW Short message waiting for this node -NODE_POFF Not available for paging -NODE_AOFF No node activity alerts -NODE_UDAT User data has been updated by another node -NODE_RRUN Re-run this node after user logs off -NODE_EVENT Run node daily event after user logs off -NODE_DOWN Down this node after user logs off -NODE_NMSG Node message waiting for this node -NODE_EXT Extended status information available for this node</pre> -<pre>Multiple attributes may be specified by ORing them together with the OR (|) -symbol. Example:</pre> -<pre> COMPARE_NODE_MISC NODE_DOWN|NODE_INTR</pre> -<pre><b>TOGGLE_USER_MISC <#> USERDEFS.INC - args: attrs -</b>----------------------- -This function is used to toggle specific attributes on or off for the current -user. The valid attrs for the argument are identical to those used for the -COMPARE_USER_MISC function. - </pre> -<pre>You cannot specify if you want the attribute turned ON or OFF with this -command. Use in combination with the COMPARE_USER_MISC function to specifically -enable or disable a user's attribute. Example to turn the NETMAIL misc attr OFF -for the current user:</pre> -<pre> !INCLUDE USERDEFS.INC - COMPARE_USER_MISC UM_NETMAIL - IF_TRUE - TOGGLE_USER_MISC UM_NETMAIL - END_IF</pre> -<pre><b>TOGGLE_USER_CHAT <#> USERDEFS.INC - args: attrs -</b>----------------------- -This function is used to toggle specific chat attributes on or off for the -current user. The valid attrs for the argument are identical to -those used for the COMPARE_USER_CHAT function.</pre> -<pre>You cannot specify if you want the attribute turned ON or OFF with this -command. Use in combination with the COMPARE_USER_CHAT function to specifically -enable or disable a chat attribute. Example to turn the Split Screen Private -Chat (CHAT_SPLITP) attribute OFF for the current user:</pre> -<pre> COMPARE_USER_CHAT CHAT_SPLITP - IF_TRUE - TOGGLE_USER_CHAT CHAT_SPLITP - END_IF</pre> -<pre><b>TOGGLE_USER_QWK <#> USERDEFS.INC - args: attrs -</b>---------------------- -This function is used to toggle specific QWK attributes on or off for the -current user. The valid attrs for the argument are identical to those used for -the COMPARE_USER_QWK function.</pre> -<pre>You cannot specify if you want the attr turned ON or OFF with this command. Use -in combination with the COMPARE_USER_QWK function to specifically enable or -disable a QWK attribute.</pre> -<pre><b>TOGGLE_NODE_MISC <#> NODEDEFS.INC - args: attrs -</b>----------------------- -This function is used to toggle the miscellaneous attributes associated with -the current node. The valid attrs for the argument are identical to those used -for the COMPARE_NODE_MISC function.</pre> -<pre><b>TOGGLE_USER_FLAG <char> <char> - args: set flag -</b>----------------------------- -This function is used to toggle the state of one of the current user's flags. -The first argument is a single character indicating the flag set. Valid -flag sets are 1, 2, 3, 4, or E for exemption, or R for restriction. The -second argument is the actual flag character to toggle (A through Z). - -<b>ADJUST_USER_CREDITS <#> - args: adj -</b>------------------------ -This function is used to add or subtract credits from the current user. The -'adj' argument must be either a positive or negative number (in Kilobytes). -Example, to subtract 100K in credits from the current user:</pre> -<pre> ADJUST_USER_CREDITS -100</pre> -<pre><b>ADJUST_USER_MINUTES <#> - args: adj -</b>------------------------ -This function is used to add or subtract minutes from the current user's -minute bank. The 'adj' argument must be either a positive or negative number. -Example, to subtract 60 minutes from the current user:</pre> -<pre> ADJUST_USER_MINUTES -60</pre> -<pre><b>SET_USER_LEVEL <#> - args: level -</b>--------------------- -This function changes the current user's security level to the number passed -as the argument. - -<b>SET_USER_STRING <#> USERDEFS.INC - args: user_string -</b>---------------------------- -This function changes one of the current user's text string fields to the -value of the current command string. The user_string argument must be one of -the following (defined in USERDEFS.INC):</pre> -<pre>User_string Description -~~~~~~~~~~~ ~~~~~~~~~~~ -USER_STRING_ALIAS User's alias or real name on real name based BBSs -USER_STRING_REALNAME User's real name or company name -USER_STRING_HANDLE User's chat handle -USER_STRING_COMPUTER User's computer type description -USER_STRING_NOTE User's note/Caller-ID -USER_STRING_ADDRESS User's street address -USER_STRING_LOCATION User's city, state -USER_STRING_ZIPCODE User's zip/postal code -USER_STRING_PASSWORD User's password -USER_STRING_BIRTHDAY User's birthday (MM/DD/YY or DD/MM/YY) -USER_STRING_PHONE User's phone number -USER_STRING_MODEM User's modem type description -USER_STRING_COMMENT User's secret sysop comment</pre> -<pre><b>USER_EVENT <#> SBBSDEFS.INC - args: event_type -</b>---------------------- -This function forces immediate execution of all online events for the specified -event_type. The valid event_types (defined in SBBSDEFS.INC) are:</pre> -<pre>Event_type Description -~~~~~~~~~~ ~~~~~~~~~~~ -EVENT_LOGON Execute during logon sequence -EVENT_NEWUSER Execute during newuser app. -EVENT_BIRTHDAY Execute on birthday -EVENT_LOGOFF Execute during normal logoff</pre> -<pre><b>AUTO_MESSAGE -</b>------------ -This function allows the user to read and write to the auto-message. If the -user has the 'W' restriction, they will not be allowed to write to the -auto-message.</pre> -<pre><b>USER_DEFAULTS -</b>------------- -This function takes the user to the default configuration menu where they -can modify their default settings (e.g. Terminal type, Command Shell, etc). -If the user selects a new command shell while in this function, the new -shell is loaded and executed immediately (from the top) instead of resuming -with the shell that originally called this function. - -<b>USER_EDIT -</b>--------- -This function is used to edit the user information for the user name or number -specified in the current command string. Since almost all user information can -be changed and other users can be edited from this section, this is normally -reserved as a "sysop only" operation.</pre> -<pre><b>TEXT_FILE_SECTION -</b>----------------- -This function takes the user to the General Text File section of the system.</pre> -<pre><b>XTRN_EXEC -</b>--------- -This function is identical to the EXEC_XTRN function with the exception that -the external program's internal code is contained in the current command string -instead of an argument.</pre> -<pre><b>XTRN_SECTION -</b>------------ -This function takes the user to the external program section of the system.</pre> -<pre><b>MINUTE_BANK -</b>----------- -This function allows the user to convert credits into minutes, or deposit -unused free minutes (if allowed) in their minute bank.</pre> -<pre><b>CHANGE_USER -</b>----------- -This function prompts the user for the system password and if entered -correctly, then prompts them for the user name or number to change into. -This is normally reserved as a "sysop only" operation. After changing into -a "non-sysop" user, the temp sysop status is set so the user may change back -into the original or another user.</pre> -<pre><b>ANSI_CAPTURE -</b>------------ -This function enables the capture of ANSI terminal escape sequences when the -local capture (Alt-L) is in use. This is normally reserved as a "sysop only" -operation.</pre> -<pre><b>FINDUSER -</b>-------- -Scans the user database for the user name or partial name in the current -command string. If the name is found, the logic state is set to TRUE. If the -name is not found, it is set to FALSE.</pre> -<pre><b>SELECT_SHELL -</b>------------ -This function displays a list of the available command shells and allows the -user to choose a command shell. If a shell is not selected, the logic state -is set to FALSE. - -<b>SET_SHELL -</b>--------- -This function attempts to set the current user's shell to the internal code -contained in the current command string. If the internal code is not valid or -the user does not have access to that shell, the logic state is set to FALSE.</pre> -<pre><b>SELECT_EDITOR -</b>------------ -This function displays a list of the available external editors and allows the -user to choose an editor. If an editor is not selected, the logic state -is set to FALSE.</pre> -<pre><b>SET_EDITOR -</b>---------- -This function attempts to set the current user's editor to the internal code -contained in the current command string. If the internal code is not valid or -the user does not have access to that external editor, the logic state is set -to FALSE.</pre> -<pre><b>TRASHCAN <"str"> - args: file -</b>-------------- -This function opens the file TEXT\file.CAN and searches for the current -command string. If the string is found in the file the current logic state is -set to TRUE and if the file TEXT\BADfile.MSG exists, it is automatically -displayed to the user. If the string is not found, the logic state is set to -FALSE.</pre> -<pre>If a line in the .CAN file ends in a tilde (~), the contents of the line may -be found anywhere in the tested string and result in a TRUE logic state.</pre> -<pre>If a line in the .CAN file ends in a caret (^), the contents of the line must -begin the tested string to result in a TRUE logic state.</pre> -<pre><b>GETTIMELEFT -</b>----------- -Checks the user's current time left online and disconnects the user (with a -message) if they're out of time.</pre> -<pre><b>MSWAIT <#> - args: num -</b>----------- -Suspends execution for num milliseconds (gives up time-slices).</pre> -<pre><b>SEND_FILE_VIA <char> <"str" or str_var> - args: prot path_and_filename -</b>--------------------------------------- -Immediately begins a transfer of a file from the local disk (path_and_filename) -to the remote user using the specified protocol (prot must match the command -key of one of the configured protocols in SCFG). - -<b>RECEIVE_FILE_VIA <char> <"str" or str_var> - args: prot path_and_filename -</b>--------------------------------------- -Immediately begins a transfer of a file from the remote user using the -specified protocol (prot must match the command key of one of the configured -protocols in SCFG). The path_and_filename variable may be set to a directory -name for protocols that don't require a specified filename (i.e. Ymodem, -Zmodem, etc - NOT Xmodem). [SBBS 2.3] - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="MailFunctions">[4.8] - Mail Functions</a> -</h2> -<pre>The following functions are related to private E-mail.</pre> -<pre><b>MAIL_READ -</b>--------- -This function retrieves and displays mail waiting in the mail-box of the -current user, if any.</pre> -<pre><b>MAIL_READ_SENT -</b>-------------- -This function retrieves and displays mail that the current user has sent and -is still pending deletion in the mail-box(es) of the recipient(s).</pre> -<pre><b>MAIL_READ_ALL -</b>------------- -This function retrieves and displays all the e-mail on the system. This -function is normally reserved as a "sysop only" operation.</pre> -<pre><b>MAIL_SEND -</b>--------- -This function attempts to send mail to the user specified by the current -command string. If the user name or number specified in the string cannot be -located, the operation is aborted and the current logic state is set to FALSE. -If the user name or number is located, the current logic state is set to TRUE. -Example usage:</pre> -<pre> PRINT "Send mail to who? " - GETNAME 25 - MAIL_SEND</pre> -<pre><b>MAIL_SEND_FILE -</b>-------------- -This function is identical to the MAIL_SEND function with the exception that -a file attachment is included with the mail message.</pre> -<pre><b>MAIL_SEND_BULK -</b>-------------- -This function is used to send bulk (multiple destination) mail. The function -is normally reserved as a "sysop only" operation, but some sysops may want -some or all users to have the ability to send bulk mail.</pre> -<pre><b>MAIL_SEND_FEEDBACK -</b>------------------ -This function is identical to the MAIL_SEND function with the exception that -"Re: Feedback" is placed at the top of the mail message. - -<b>MAIL_SEND_NETMAIL -</b>----------------- -This function prompts the user for a user name and netmail address. If the -user just hits CR, the current logic state is set to FALSE, otherwise a NetMail -operation is attempted and the logic state is set to TRUE.</pre> -<pre><b>MAIL_SEND_NETFILE -</b>----------------- -This function is identical to the MAIL_SEND_NETMAIL function with the exception -that if the NetMail file attachments are allowed, this function will allow the -user to send an attached file to a netmail message (for FidoNet or Internet). - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="MessageBaseFunctions">[4.9] - Message Base Functions</a> -</h2> -<pre>The following functions are related to the system's message base.</pre> -<pre><b>MSG_SET_AREA -</b>------------ -This function uses the current command string to search all sub-boards the -current user has access to for an internal code matching the current command -string. If the internal code is found, that sub-board becomes the current -sub-board and the current logic state is set to TRUE, otherwise it is set to -FALSE and the current sub-board remains unchanged.</pre> -<pre><b>MSG_SET_GROUP -</b>------------- -This function uses the current command string to search all message groups the -current user has access to for a short name matching the current command -string. If the short name is found, that group becomes the current group and -the current logic state is set to TRUE, otherwise it is set to FALSE and the -current group remains unchanged.</pre> -<pre><b>MSG_SELECT_AREA -</b>--------------- -This function prompts the user to select a message group (if the user has -access to more than one) and sub-board. If the user aborts the selection, -the current logic state is set to FALSE and the current sub-board is unchanged. -Otherwise, the logic state is set to TRUE and the selected sub-board becomes -the current sub-board.</pre> -<pre><b>MSG_SHOW_GROUPS -</b>--------------- -This function displays a list of message groups the current user has access to.</pre> -<pre><b>MSG_SHOW_SUBBOARDS -</b>------------------ -This function displays a list of sub-boards within the current message group -that the user has access to.</pre> -<pre><b>MSG_GROUP_UP -</b>------------ -This function moves the current message group up by one. If already at the -highest group, then it wraps to the first group.</pre> -<pre><b>MSG_GROUP_DOWN -</b>-------------- -This function is the opposite of the MSG_GROUP_UP function. - -<b>MSG_SUBBOARD_UP -</b>--------------- -This function moves the current message sub-board up by one. If already at -the highest sub-board in the current group, it wraps to the first sub-board -in the current group.</pre> -<pre><b>MSG_SUBBOARD_DOWN -</b>----------------- -This function is the opposite of the MSG_SUBBOARD_UP function.</pre> -<pre><b>MSG_GET_SUB_NUM -</b>--------------- -This function accepts a number from the user to change the current sub-board.</pre> -<pre><b>MSG_GET_GRP_NUM -</b>--------------- -This function accepts a number from the user to change the current message -group.</pre> -<pre><b>MSG_READ -</b>-------- -This function is used to read messages in the current sub-board. If the -read is aborted, the current logic state is set to FALSE, otherwise it is set -to TRUE.</pre> -<pre><b>MSG_POST -</b>-------- -This function attempts to post a message on the current sub-board. If the user -does not have posting access on the current sub-board or the post is aborted, -the current logic state is set to FALSE, otherwise it is set to TRUE.</pre> -<pre><b>MSG_QWK -</b>------- -This function puts the user in the QWK message packet section.</pre> -<pre><b>MSG_PTRS_CFG -</b>------------ -This function allows the user to manipulate their new-message scan pointers.</pre> -<pre><b>MSG_PTRS_REINIT -</b>--------------- -This function resets the user's new-message scan pointers to their value at -logon.</pre> -<pre><b>MSG_NEW_SCAN_CFG -</b>---------------- -This function allows the user to manipulate their new-message scan -configuration.</pre> -<pre><b>MSG_NEW_SCAN -</b>------------ -This function performs a new message scan on either the current sub-board, -current message group, or all sub-boards.</pre> -<pre><b>MSG_NEW_SCAN_ALL -</b>---------------- -This function performs a new message scan on all sub-boards.</pre> -<pre><b>MSG_NEW_SCAN_SUB -</b>---------------- -This function performs a new message scan on the current sub-board. If the -new-scan is aborted, the current logic state is set to FALSE.</pre> -<pre><b>MSG_CONT_SCAN -</b>------------- -This function performs a continuous new message scan on either the current -sub-board, current message group, or all sub-boards.</pre> -<pre><b>MSG_CONT_SCAN_ALL -</b>----------------- -This function performs a continuous new message scan on all sub-boards.</pre> -<pre><b>MSG_BROWSE_SCAN -</b>--------------- -This function is identical to the MSG_NEW_SCAN function, with the exception -that if there are no new messages in a sub-board, the last message posted -will be displayed.</pre> -<pre><b>MSG_BROWSE_SCAN_ALL -</b>------------------- -This function performs a browse scan on all sub-boards.</pre> -<pre><b>MSG_FIND_TEXT -</b>------------- -This function prompts for a search string from the user and searches the -current sub-board, current group, or all sub-boards for the text.</pre> -<pre><b>MSG_FIND_TEXT_ALL -</b>----------------- -This function performs a text search on all sub-boards.</pre> -<pre><b>MSG_YOUR_SCAN_CFG -</b>----------------- -This function allows the user to configure their un-read personal message -scan.</pre> -<pre><b>MSG_YOUR_SCAN -</b>------------- -This function performs an un-read personal message scan on the current -sub-board, current message group, or all sub-boards.</pre> -<pre><b>MSG_YOUR_SCAN_ALL -</b>----------------- -This function performs an un-read personal message scan on all sub-boards. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="FileBaseFunctions">[4.10] - File Base Functions</a> -</h2> -<pre><b>FILE_SET_AREA -</b>------------- -This function uses the current command string to search all directories the -current user has access to for an internal code matching the current command -string. If the internal code is found, that directory becomes the current -directory and the current logic state is set to TRUE, otherwise it is set to -FALSE and the current directory remains unchanged.</pre> -<pre><b>FILE_SET_LIBRARY -</b>---------------- -This function uses the current command string to search all libraries the -current user has access to for a short name matching the current command -string. If the short name is found, that library becomes the current library -and the current logic state is set to TRUE, otherwise it is set to FALSE and -the current library remains unchanged.</pre> -<pre><b>FILE_SELECT_AREA -</b>--------------- -This function prompts the user to select a file library (if the user has -access to more than one) and directory. If the user aborts the selection, -the current logic state is set to FALSE the current directory is unchanged. -Otherwise, the logic state is set to TRUE and the selected directory becomes -the current directory.</pre> -<pre><b>FILE_SHOW_LIBRARIES -</b>------------------- -This function displays a list of all file libraries the current user has -access to.</pre> -<pre><b>FILE_SHOW_DIRECTORIES -</b>--------------------- -This function displays a list of all directories within the current library -that the user has access to.</pre> -<pre><b>FILE_LIBRARY_UP -</b>--------------- -This function increments the current file library. If already at the last -library, it will wrap to the first library.</pre> -<pre><b>FILE_LIBRARY_DOWN -</b>----------------- -This function is the opposite of the FILE_LIBRARY_UP function.</pre> -<pre><b>FILE_DIRECTORY_UP -</b>----------------- -This function increments the current file directory. If already at the last -directory in the current library, it will wrap to the first directory of the -library. - -<b>FILE_DIRECTORY_DOWN -</b>------------------- -This function is the opposite of the FILE_DIRECTORY_UP function.</pre> -<pre><b>FILE_GET_DIR_NUM -</b>---------------- -This function waits for the user to enter a number to be used to change the -current file directory.</pre> -<pre><b>FILE_GET_LIB_NUM -</b>---------------- -This function waits for the user to enter a number to be used to change the -current file library.</pre> -<pre><b>FILE_LIST -</b>--------- -This function displays the contents matching the filespec contained in the -current command string of the current file directory. If the listing is -aborted, the current logic state is set to FALSE, otherwise it is set to TRUE. -Example:</pre> -<pre> GETFILESPEC - IF_TRUE - FILE_LIST - END_IF</pre> -<pre><b>FILE_LIST_EXTENDED -</b>------------------ -This function displays the extended information about the files in the current -directory that match the filespec contained in the current command string.</pre> -<pre><b>FILE_VIEW -</b>--------- -This function views the contents of the files that match the filespec in the -current command string.</pre> -<pre><b>FILE_UPLOAD -</b>----------- -This function attempts to upload to the current file directory. If the user -cannot upload for some reason, the current logic state is set to FALSE. -Otherwise, it is set to TRUE.</pre> -<pre><b>FILE_UPLOAD_USER -</b>---------------- -This function allows a user to upload a file specifically to another user, -provided the sysop has created a "User" file transfer directory for -user-to-user transfers. If the user cannot upload to the user directory or one -doesn't exist, the current logic state is set to FALSE, otherwise it set to -TRUE. - -<b>FILE_UPLOAD_SYSOP -</b>----------------- -This function allows the user to upload a file to the invisible sysop -directory. If the user does not have upload access to the sysop directory or a -sysop directory has not been created, the current logic state is set to FALSE, -otherwise, it is set to TRUE.</pre> -<pre><b>FILE_DOWNLOAD -</b>------------- -This function attempts to download all files matching the filespec contained -in the current command string.</pre> -<pre><b>FILE_DOWNLOAD_USER -</b>------------------ -This function attempts to download any user-to-user files pending for the -current user. If there are no files waiting for the user or the user does not -have download access to the user directory, the current logic state is set -to FALSE, otherwise it is set to TRUE.</pre> -<pre><b>FILE_DOWNLOAD_BATCH -</b>------------------- -This function attempts to download any files in the batch download queue. -If there are no files in the queue or the user answers No to the question if -they wish to download the files now, then the current logic state is set to -FALSE. If there are files in the queue and the user answers Yes to the question -if they wish to download the files, then the logic state is set to TRUE.</pre> -<pre><b>FILE_REMOVE -</b>----------- -This function attempts to remove any files the user has uploaded (unless -R exempt) that match the filespec contained in the current command string.</pre> -<pre><b>FILE_BATCH_ADD -</b>-------------- -This function attempts to add the filename contained in the current command -string to the batch download queue. If the filename is not found, the current -logic state is set to FALSE.</pre> -<pre><b>FILE_BATCH_ADD_LIST -</b>------------------- -This function opens the list file specified in the current command string and -attempts to add each filename (one filename per line) to the current user's -batch download queue. After the list file is read, it is automatically deleted.</pre> -<pre><b>FILE_BATCH_CLEAR -</b>---------------- -This function clears the current batch download queue.</pre> -<pre><b>FILE_BATCH_SECTION -</b>------------------ -This function takes the user to the Batch/Bi-dir transfer menu where they -can edit the batch queues and initiate batch or bi-directional file transfers. - -<b>FILE_TEMP_SECTION -</b>----------------- -This function takes the user to the temporary archive menu where they can -extract archives, create file listings, and compress temporary files for -download.</pre> -<pre><b>FILE_NEW_SCAN -</b>------------- -This function scans the current directory, current library, or all directories -for new files.</pre> -<pre><b>FILE_NEW_SCAN_ALL -</b>----------------- -This function scans all directories for new files.</pre> -<pre><b>FILE_FIND_TEXT -</b>-------------- -This function prompts the user to enter a search string which is used in a -text search of all file descriptions in the current directory, current library, -or all directories.</pre> -<pre><b>FILE_FIND_TEXT_ALL -</b>------------------ -This function prompts the user for a search string to use in a text search -of file descriptions in all directories.</pre> -<pre><b>FILE_FIND_NAME -</b>-------------- -This function prompts the user for a filespec and searches the current -directory, current library, or all directories for files matching the -specification.</pre> -<pre><b>FILE_FIND_NAME_ALL -</b>------------------ -This function prompts the user for a filespec and searches all directories for -files matching that specification.</pre> -<pre><b>FILE_PTRS_CFG -</b>------------- -This function allows the user to change their new file scan date/time. If the -pointer is changed, the current logic state is set to TRUE, otherwise it is -set to FALSE.</pre> -<pre><b>FILE_SET_ALT_PATH -</b>----------------- -This function sets the current upload path to the alternate path number -contained in the current command string. This function is normally reserved as -a "sysop only" operation, used to upload files on CD-ROM in most cases.</pre> -<pre><b>FILE_RESORT_DIRECTORY -</b>--------------------- -This function is used to resort (if directory sort order or type has changed) -and compress (if any deleted file slots exist) the current directory, current -library or all directories. All other nodes must be inactive for this function -to work. The current command string must be set (with SETSTR, GETSTR, or -similar function) to "ALL" (resort all directories), "LIB" (resort current -library), or "" (current directory only).</pre> -<pre><b>FILE_GET -</b>-------- -This function is used to remotely download a file that is not in the file -database. This function is normally reserved as a "sysop only" operation. -The path and filename to be downloaded are contained in the current command -string.</pre> -<pre><b>FILE_SEND -</b>--------- -Same as FILE_GET, but doesn't require system password.</pre> -<pre><b>FILE_PUT -</b>-------- -This function is used to remotely upload a file to the system's hard disk, -but not place the file in the file database. This is normally reserved as a -"sysop only" operation. The path and filename to be uploaded are contained in -the current command string.</pre> -<pre><b>FILE_UPLOAD_BULK -</b>---------------- -This function is used to do a local bulk upload of files that are in the -physical DOS directory, but not already in the file database. This is normally -reserved as a "sysop only" operation. If the current command string is set to -"ALL", then all directories will be scanned, "LIB" then only the current -library, and "" indicates only the current directory.</pre> -<pre><b>FILE_FIND_OLD -</b>------------- -This function is used to search directories for files that have not be -downloaded since the current new file scan date (set with FILE_PTRS_CFG). -For each file that is found, the user is prompted if they wish to remove the -file. This is normally reserved as a "sysop only" operation. If the current -string is set to "ALL", then all directories will be scanned "LIB" indicates -only the current library, and "" indicates only the current directory.</pre> -<pre><b>FILE_FIND_OPEN -</b>-------------- -This function searches for file records that are currently open. This function -should not be used with other nodes in use. For each open file that is found, -the user is prompted if they wish to close the file record. As with the -FILE_FIND_OLD function, the current command string must contain "ALL", "LIB", -or "" to specify the search range. - -<b>FILE_FIND_OFFLINE -</b>----------------- -This function searches for files that are in the database, but not in the -physical DOS directory. For each missing file that is found, the user is -prompted if they wish to move or remove the file. This normally reserved as a -"sysop only" operation. As with the FILE_FIND_OLD function, the current command -string must contain "ALL", "LIB", or "" to specify the search range.</pre> -<pre><b>FILE_FIND_OLD_UPLOADS -</b>--------------------- -This function searches for files that were uploaded before the current new -scan date (set with FILE_PTRS_CFG). For each file that is found, the user is -prompted if they wish to remove the file. This is normally reserved as a "sysop -only" operation. As with the FILE_FIND_OLD function, the current command string -must contain "ALL", "LIB", or "" to specify the search range. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="ChatFunctions">[4.11] - Chat Functions</a> -</h2> -<pre>The following functions are chat related in nature.</pre> -<pre><b>PAGE_SYSOP -</b>---------- -This function is used to page the sysop at the local console.</pre> -<pre><b>PAGE_GURU -</b>--------- -This function initiates chat with the guru who's internal codes is in the -current command string. Example (using SMARTGUY as the internal code):</pre> -<pre> SETSTR "SMARTGUY" - PAGE_GURU</pre> -<pre><b>PRIVATE_CHAT -</b>------------ -This function is used to initiate private node-to-node chat.</pre> -<pre><b>PRIVATE_MESSAGE -</b>--------------- -This function is used for private internode messages, telegrams, or chat. -Same as the Ctrl-P initiated function.</pre> -<pre><b>CHAT_SECTION -</b>------------ -This function takes the user immediately to the chat menu where they can -join multinode chat and perform various other chat related operations. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="InformationFunctions">[4.12] - Information Functions</a> -</h2> -<pre><b>INFO_SYSTEM -</b>----------- -This function displays various system information.</pre> -<pre><b>INFO_SUBBOARD -</b>------------- -This function displays information about the current message sub-board.</pre> -<pre><b>INFO_DIRECTORY -</b>-------------- -This function displays information about the current file directory.</pre> -<pre><b>INFO_USER -</b>--------- -This function displays information about the current user.</pre> -<pre><b>INFO_VERSION -</b>------------ -This function displays version information about the system software.</pre> -<pre><b>INFO_XFER_POLICY -</b>---------------- -This function displays the system's transfer policy.</pre> -<pre><b>GURU_LOG -</b>-------- -This function displays the GURU.LOG file from the DATA directory and prompts -the user if they wish to delete the log. This is normally reserved as a -"sysop only" operation.</pre> -<pre><b>ERROR_LOG -</b>--------- -This function displays the ERROR.LOG file from the DATA directory and prompts -the user if they wish to delete the log and/or clear the error counters for -the nodes. This is normally reserved as a "sysop only" operation. - -<b>SYSTEM_LOG -</b>---------- -This function displays the system's detailed activity log for the current date. -This is normally reserved as a "sysop only" operation.</pre> -<pre><b>SYSTEM_YLOG -</b>----------- -This function displays the system's detailed activity log for the previous day. -This is normally reserved as a "sysop only" operation.</pre> -<pre><b>SYSTEM_STATS -</b>------------ -This function displays cumulative system usage statistics. -This is normally reserved as a "sysop only" operation.</pre> -<pre><b>NODE_STATS -</b>---------- -This function displays cumulative usage statistics for the current node. -This is normally reserved as a "sysop only" operation.</pre> -<pre><b>SHOW_MEM -</b>-------- -This function displays the amount of free memory available. -This is normally reserved as a "sysop only" operation. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="FileI/OFunctions">[4.13] - File I/O Functions</a> -</h2> -<pre>These functions allow Baja modules to read (input) from and write (output) to -disk files. If any of the following functions fail, the current logic state -will be set to FALSE and the system variable _ERRNO will contain the reason -for the failure. All file I/O functions require SBBS v2.2 or later.</pre> -<pre><b>FOPEN <int_var> <#> <"str" or str_var> FILE_IO.INC - args: handle access path_and_filename -</b>------------------------------------------ -This function opens or creates a disk file (path_and_filename) for read and/or -write access. This function is the Baja equivalent of the standard C fopen() -function. No file I/O operations can be performed on a file until it has been -opened with this function. The 'handle' argument must be a defined integer -variable name. The 'access' argument is the requested open access. The access -flags (defined in FILE_IO.INC) are:</pre> -<pre>Access Flag Description -~~~~~~~~~~~ ~~~~~~~~~~~ -O_RDONLY Read Only -O_WRONLY Write Only -O_RDWR Read and write -O_CREAT Create (create if doesn't exist) -O_APPEND Append (writes to end of file) -O_TRUNC Truncate (truncates file to 0 bytes automatically) -O_EXCL Exclusive (only open/create if file doesn't exist) -O_DENYNONE Deny None (shareable, for use with record locking)</pre> -<pre>To specify multiple access flags, place an OR symbol (|) between each. Example:</pre> -<pre> O_WRONLY|O_TRUNC</pre> -<pre>If the file does not exist it will be created if the O_CREAT access was -specified. If the O_CREAT and O_EXCL access flags are set then the open will -fail if the file already exists.</pre> -<pre>Example:</pre> -<pre> !INCLUDE FILE_IO.INC</pre> -<pre> INT file - FOPEN file O_RDWR|O_CREAT "%jFILENAME.EXT"</pre> -<pre>Would open the file FILENAME.EXT in the BBS data directory (%j is the -Synchronet command line % specifier for the data directory) for reading and -writing, creating it if it didn't already exist. All later accesses to the file -must use the same integer variable ("file" in the above example). If the open -is successful, the current logic state is set to TRUE, otherwise it is set to -FALSE. - -<b>FCLOSE <int_var> - args: handle -</b>---------------- -All files opened with the FOPEN function remain open until either this function -(FCLOSE) is used to close the file (using the same unmodified 'handle') or the -current shell or module is terminated. This function is the Baja equivalent -of the standard C fclose() function. A maximum of 10 files can be concurrently -opened by a shell or module at any given time.</pre> -<pre><b>FREAD <int_var> <any_var> [int_var or #] - args: handle dest length -</b>---------------------------------------- -This function is used to read from a disk file (specified by 'handle') into a -string or integer variable (specified by 'dest') from the current file -position. This function is the Baja equivalent of the standard C fread() -function.</pre> -<pre>The optional 'length' argument specifies the number of bytes to read. It must -be between 1 and 4 if the dest argument is an integer variable and between 1 -and 1024 if the dest argument is a string variable. If 'length' is not -specified, then 4 bytes is assumed for integer variables or the current string -length for string variables (or 128 if an uninitialized or 0 length string -variable is specified). The current file position will be automatically moved -forward by the number of bytes successfully read from the file.</pre> -<pre>If the FSET_ETX function has been used to set the end-of-text character to -something other than 0 and the dest argument is a string variable, the string -will be terminated at the first end-of-text character read from the file from -the current position.</pre> -<pre>It is suggested that a 'length' argument always be specified for string -variable destinations, though it is not usually necessary for integer variable -destinations.</pre> -<pre><b>FWRITE <int_var> <any_var> [int_var or #] - args: handle source length -</b>----------------------------------------- -This function is used to write an integer or string variable ('source') to a -disk file ('handle') at the current file position. This function is the Baja -equivalent of the standard C fwrite() function. If the optional 'length' -argument is specified, it will determine the number of bytes written to the -file. If 'source' is a string variable and the number of bytes to be written -exceeds the string length, the current end-of-text character will be used to -fill the extra bytes. If 'length' is not specified, 4 bytes will be used for -integer 'source' variables and the current string length will be used for -string 'source' variables. The current file position will be automatically -moved forward by the number of bytes successfully written to the file.</pre> -<pre><b>FFLUSH <int_var> - args: handle -</b>---------------- -This function forces any pending writes to the disk file ('handle'). All files -opened by Baja modules use buffered I/O for performance. Closing an open file -flushes any pending output as well. You may wish to use this function in -multinode applications where it is important that other nodes have immediate -access to the data written to a file while it is still open. This function is -the Baja equivalent of the standard C fflush() function. [SBBS 2.3] - -<b>FGET_LENGTH <int_var> <int_var> - args: handle length -</b>------------------------------- -This function gets the current length (in bytes) of the file pointed to by -'handle', and writes the value to the integer variable 'length'. This function -is the Baja equivalent of the standard C filelength() function.</pre> -<pre><b>FSET_LENGTH <int_var> <int_var> - args: handle length -</b>------------------------------- -This function changes the length of the file pointed to by 'handle' to the -value contained in the integer variable 'length'. If the file is shortened, -any bytes beyond the specified length are lost. If the file is extended, the -unused bytes will be automatically padded with 0. This function is the Baja -equivalent of the standard C chsize() function.</pre> -<pre><b>FGET_TIME <int_var> <int_var> - args: handle time -</b>----------------------------- -This function gets the current date/time stamp of the file pointed to by -'handle' and writes this value into the 'time' variable. This function is -the Baja equivalent of the standard C getftime() function.</pre> -<pre><b>FSET_TIME <int_var> <int_var> - args: handle time -</b>----------------------------- -This function sets the current date/time stamp of the file pointed to by -'handle' to the value contained in the 'time' variable. This function is the -Baja equivalent of the standard C setftime() function.</pre> -<pre><b>FEOF <int_var> -args: handle -</b>-------------- -This function checks the file specified by 'handle' to see if the current -file position is at the end of the file. If it is currently at the end of the -file, the current logic state is set to TRUE. If it is not at the end of the -file or the file 'handle' is not currently open, the logic state is set to -FALSE. This function is the Baja equivalent of the standard C feof() function.</pre> -<pre><b>FGET_POS <int_var> <int_var> - args: handle offset -</b>---------------------------- -This function gets the current file position (in bytes from the beginning of -the file) for the file specified by 'handle' and writes the value into the -integer variable 'offset'. This function is the Baja equivalent of the -standard C ftell() function. - -<b>FSET_POS <int_var> <int_var or #> [#] FILE_IO.INC - args: handle offset whence -</b>----------------------------------------- -This function is used to reposition (seek) within the file specified by -'handle' to the offset specified by 'offset' from 'whence', if specified. -If 'whence' is not specified the 'offset' will be considered from the beginning -of the file. This function is the Baja equivalent of the standard C fseek() -function. The valid values of whence (defined in FILE_IO.INC) are:</pre> -<pre>Whence Description -~~~~~~ ~~~~~~~~~~~ -SEEK_SET From the beginning of the file -SEEK_CUR From current file position -SEEK_END From end of file</pre> -<pre>The 'offset' (not offspring) variable can be either an integer variable or -an integer constant. It may be negative (to move the file position backwards), -positive (forwards), or 0 (to specify no offset from 'whence').</pre> -<pre>Example:</pre> -<pre> !INCLUDE FILE_IO.INC</pre> -<pre> # Open file - INT file - FOPEN file O_RDWR|O_CREAT "TEXT.TXT" - IF_FALSE - # Failed! - RETURN - END_IF</pre> -<pre> # Go to end of file - FSET_POS file 0 SEEK_END</pre> -<pre> # Go to beginning of file - FSET_POS file 0</pre> -<pre> # Go to offset 256 in file - FSET_POS file 256</pre> -<pre> # Seek forward 100 bytes - FSET_POS file 100 SEEK_CUR</pre> -<pre> # Seek backward 50 bytes - FSET_POS file -50 SEEK_CUR</pre> -<pre> FCLOSE file - -<b>FLOCK <int_var> <int_var or #> - args: handle length -</b>------------------------------ -This function is used to lock a file record of 'length' bytes from the -current file position of the file pointed to by 'handle'. If the record cannot -after 10 retries (one second apart), the current logic state will be set to -FALSE. All records that are locked should be subsequently unlocked before the -file is closed or any user interaction or lengthy processing is begun. This -function is the Baja equivalent of the C locking(int,LK_LOCK,long) function.</pre> -<pre><b>FUNLOCK <int_var> <int_var or #> - args: handle length -</b>-------------------------------- -This function is used to unlock a file record previously locked by the -current module. The current file position of 'handle' must be the start of -the record and the 'length' must be the same length as originally specified -to the FLOCK function. This function is the Baja equivalent of the C -locking(int,LK_UNLCK,long) function. - -<b>FPRINTF <int_var> <"cstr"> [any_var] [...] - args: handle format variables -</b>------------------------------------------ -This function is very similar to the PRINTF and SPRINTF functions. The -exception is that the output of the formatted string is written to the current -file position of the file specified by 'handle'. This function is the -Baja equivalent of the standard C fprintf() function.</pre> -<pre>Example: - # Variables - INT file length time - # Open for append - FOPEN file O_WRONLY|O_CREAT|O_APPEND "TEXT.TXT" - IF_FALSE - # Failed! - RETURN - END_IF</pre> -<pre> FGET_LENGTH file length - FGET_TIME file time - TIME_STR str time - FPRINTF file "Length: %ld Time: %s\r\n" length str - FCLOSE file</pre> -<pre><b>FREAD_LINE <int_var> <any_var> - args: handle dest -</b>------------------------------ -Reads a single line from the open file specified by 'handle' into the -destination variable specified by 'dest'. If the destination variable is -a string variable, the terminating carriage return and line feed (if present -in the file) will be included in the string variable. You can use the -TRUNCSP function to remove them if needed.</pre> -<pre>If the read is successful, the current logic state is set to TRUE, otherwise -it is set to FALSE. This function is the Baja equivalent of the standard C -fgets() function.</pre> -<pre><b>FSET_ETX <#> - args: etx -</b>------------- -This function is used to set the end-of-text character for the current -shell or module. The default end-of-text character is 0. It is used by the -FREAD and FWRITE functions to pad/terminate string variables when read from -and writing to disk files. The 'etx' argument must be a number from 0 to 255. -Many of Synchronet's data files (USER.DAT, for example) use 3 (appears as -^C or a heart) for an end-of-text character. If you intend to read or write -from any files that use a non-zero end-of-text character, you'll want to use -this function before using FREAD or FWRITE. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="FileSystemFunctions">[4.14] - File System Functions</a> -</h2> -<pre>These functions allow Baja modules to perform operations on unopened files.</pre> -<pre><b>CHKFILE <"str" or str_var> - args: path_and_filename -</b>-------------------------- -This function checks for the existence of the 'path_and_filename' specified. -The path_and_filename should contain path and possibly drive specifications -(i.e. CHKFILE C:\MYDIR\MYFILE.TXT). If the file exists the current logic state -is set to TRUE, otherwise it is set to FALSE.</pre> -<pre><b>REMOVE_FILE <str_var> - args: path_and_filename -</b>------------------------------ -This function attempts to remove the specified path_and_filename. If the -removal was successful, the current logic state is set to TRUE, otherwise it -is set to FALSE. This function is the Baja equivalent of the standard C -unlink() and remove() functions.</pre> -<pre><b>RENAME_FILE <str_var> <str_var> - args: source dest -</b>------------------------------- -This function attempts to rename the file specified as 'source' to the name -specified in 'dest'. If a different path is specified for 'dest', the drive -letter must be the same. If the renaming is successful, the current logic -state is set to TRUE, otherwise it is set to FALSE. This function is the -equivalent of the standard C rename() function.</pre> -<pre><b>COPY_FILE <str_var> <str_var> - args: source dest -</b>----------------------------- -This function attempts to copy the file specified as 'source' to the path -AND filename specified in 'dest'. If the copy is successful, the current logic -state is set to TRUE, otherwise it is set to FALSE.</pre> -<pre><b>MOVE_FILE <str_var> <str_var> - args: source dest -</b>----------------------------- -This function attempts to move the file specified as 'source' to the path -AND filename specified in 'dest'. If the source and dest paths are on the -same drive, this function is the same as a RENAME_FILE. If the source and -dest paths are on separate drives, then the this is the same as a COPY_FILE -with the exception that the source file is automatically deleted. If the -move is successful, the current logic state is set to TRUE, otherwise it is -set to FALSE.</pre> -<pre><b>GET_FILE_ATTRIB <int_var> <str_var> DIR_ATTR.INC - args: dest file -</b>----------------------------------- -This function retrieves the directory attributes for the file and writes them -into the dest variable. This function is the Baja equivalent of the C -_chmod(char *,0) function.</pre> -<pre><b>SET_FILE_ATTRIB <int_var> <str_var> DIR_ATTR.INC - args: attrib file -</b>----------------------------------- -This function sets the directory attributes for the specified file according -to the attrib flags. This function is the Baja equivalent of the C -_chmod(char *,1) function. Valid attrib flags (defined in DIR_ATTR.INC) are:</pre> -<pre>Flag Description -~~~~ ~~~~~~~~~~~ -FA_RDONLY Read Only -FA_HIDDEN Hidden -FA_SYSTEM System -FA_LABEL Volume Label -FA_DIREC Directory (or subdirectory) -FA_ARCH Archive</pre> -<pre>Multiple flags may be specified by ORing the flags together with the OR (|) -symbol. Example:</pre> -<pre> !INCLUDE DIR_ATTR.INC - INT I - SETSTR "MYFILE.TXT" - SET I FA_HIDDEN|FA_SYSTEM - SET_FILE_ATTRIB I STR</pre> -<pre># End of DIR_ATTR.INC</pre> -<pre><b>GET_FILE_TIME <int_var> <str_var> - args: dest file -</b>--------------------------------- -Retrieves the current date/time stamp of the specified file and writes it -into the specified dest variable. If the date/time stamp could not be read -(file doesn't exist perhaps), the value -1 is written to the dest variable.</pre> -<pre><b>GET_FILE_LENGTH <int_var> <str_var> - args: dest file -</b>----------------------------------- -Retrieves the current length of the specified file and writes it into the -specified dest variable. If the file doesn't exist, the value -1 is written -to the dest variable.</pre> -<h2><a name="DirectorySystemFunctions">[4.15] - Directory System Functions</a> -</h2> -<pre>These functions allow Baja modules to perform operations on directories and -subdirectories of the local file system.</pre> -<pre><b>MAKE_DIR <str_var> - args: dir -</b>------------------ -This function attempts to create the directory specified as dir. If the -directory is successfully created, the current logic state is set to TRUE, -otherwise it is set to FALSE and the system variable _ERRNO will contain -the reason. This function is the Baja equivalent of the standard C mkdir() -function.</pre> -<pre><b>CHANGE_DIR <str_var> - args: dir -</b>-------------------- -This function attempts to change the current directory to the directory -specified in dir. Since Synchronet assumes the current directory is the -current NODE directory at all times, this is a very dangerous function -and should not be used unless absolutely necessary. If the directory is changed -successfully, the current logic state is set to TRUE, otherwise it is set to -FALSE and the system variable _ERRNO will contain the reason. This function -is the Baja equivalent of the standard C chdir() function.</pre> -<pre><b>REMOVE_DIR <str_var> - args: dir -</b>-------------------- -This function attempts to remove the directory specified as dir. If the -removal is unsuccessful (files in the directory, directory doesn't exist, -etc.) the current logic state will be set to FALSE and the system variable -_ERRNO will contain the reason. This function is the Baja equivalent of the -standard C rmdir() function.</pre> -<pre><b>OPEN_DIR <int_var> <str_var> - args: handle dir -</b>---------------------------- -This function attempts to open the directory specified as dir (should end -in a '.'). If the directory is successfully opened, the handle is set to -the directory handle and the current logic state is set to TRUE, otherwise -the logic state is set to FALSE. This function is the Baja equivalent of the -standard C opendir() function.</pre> -<pre><b>READ_DIR <int_var> <str_var> - args: handle filename -</b>---------------------------- -This function reads the next file name from the open directory handle and -puts it into the string variable specified as filename. If the read is -unsuccessful (no more files in directory) the current logic state is set to -FALSE and the system variable _ERRNO will contain the reason. This function -is the Baja equivalent of the standard C readdir() function.</pre> -<pre><b>REWIND_DIR <int_var> - args: handle -</b>-------------------- -This function rewinds the open directory handle to the first directory entry -(file name). This function is the Baja equivalent of the standard C rewinddir() -function.</pre> -<pre><b>CLOSE_DIR <int_var> - args: handle -</b>------------------- -This function closes a previously opened directory handle. This function is -the Baja equivalent of the standard C closedir() function. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="SystemVariables">[5.1] - System Variables</a> -</h2> -<pre>System variables are global variables that are initialized and/or used by -Synchronet during operation. They should not be defined in your Baja module. -You must declare these variables by including (with !INCLUDE) SBBSDEFS.INC -or by declaring (with !GLOBAL) the individual variable names you wish to use.</pre> -<pre>These may be used anywhere a user-defined global variable may be used, with -the exception that many variables may not be written to (modified directly -by a shell or module). In some cases, there are specific Baja functions for -modifying otherwise "unmodifiable" system variables. These "Read Only" system -variables are indicated here with an asterisk (*).</pre> -<pre><b>String Variables</b> ----------------- -_USERON.ALIAS *Alias/Real Name of user online -_USERON.NAME *Real/Company Name of user online -_USERON.HANDLE *Chat Handle of user online -_USERON.COMP *Computer description for user online -_USERON.NOTE *Note for user online -_USERON.ADDRESS *Address of user online -_USERON.LOCATION *Location of user online -_USERON.ZIPCODE *Zip/Postal Code of user online -_USERON.PASS *Password of user online -_USERON.BIRTH *Birthdate of user online -_USERON.PHONE *Phone Number of user online -_USERON.MODEM *Modem/Connection description of user online -_USERON.NETMAIL *NetMail Forwarding Address for user online -_USERON.TMPEXT *Temp File Extension (i.e. ZIP) for user online -_USERON.COMMENT *Sysop Comment for user online -_CONNECTION Current connection description -_CAP_FNAME Capture file name -_CID Caller-ID information -_COMSPEC *Path to operating system command interpreter</pre> -<pre><b>Integer Variables -</b>----------------- -_USERON.NUMBER *Number of user online -_USERON.ULS *Total number of files uploaded by user online -_USERON.DLS *Total number of files downloaded by user online -_USERON.POSTS *Total number of posts sent by user online -_USERON.EMAILS *Total number of e-mails sent by user online -_USERON.FBACKS *Total number of feedbacks sent by user online -_USERON.ETODAY *Total number of e-mails sent today by user online -_USERON.PTODAY *Total number of posts sent today by user online -_USERON.TIMEON *Total minutes used (excluding this call) by user online -_USERON.TEXTRA *Extra time obtained by uploads during previous calls -_USERON.LOGONS *Total number of logons by user online -_USERON.TTODAY *Total time used today (previous calls) -_USERON.TLAST *Total time used during last call -_USERON.LTODAY *Total number of logons today -_USERON.XEDIT *External editor used by user online -_USERON.SHELL *Command shell used be user online -_USERON.LEVEL *Security level of user online -_USERON.SEX *Sex (gender) of user online -_USERON.ROWS *Number of screen lines for user online -_USERON.PROT *Default download protocol of user online -_USERON.LEECH *Total leech downloads detected for user online -_USERON.MISC *Miscellaneous attributes for user online -_USERON.QWK *QWK settings for user online -_USERON.CHAT *Chat settings for user online -_USERON.FLAGS1 *Flag set #1 for user online -_USERON.FLAGS2 *Flag set #2 for user online -_USERON.FLAGS3 *Flag set #3 for user online -_USERON.FLAGS4 *Flag set #4 for user online -_USERON.EXEMPT *Exemption flags for user online -_USERON.REST *Restriction flags for user online -_USERON.ULB *Total bytes uploaded by user online -_USERON.DLB *Total bytes downloaded by user online -_USERON.CDT *Total credits for user online -_USERON.MIN *Current minutes in minute bank for user online -_USERON.FREECDT *Free credits left today for user online -_USERON.FIRSTON *Date/time of first call for user online -_USERON.LASTON *Date/time of last call for user online -_USERON.EXPIRE *Date/time of expiration for user online -_USERON.PWMOD *Date/time of last password modification for user online -_USERON.NS_TIME *Date/time of last new-file scan for user online -_CUR_RATE *Current DCE rate -_CUR_CPS *Estimated CPS rate of current connection -_DTE_RATE Current DTE rate -_LNCNTR Line counter (for auto-screen pause) -_TOS Top-Of-Screen? (1=Yes, 0=No) -_ROWS Number of screen rows for current user -_AUTOTERM Automatic terminal detection results -_CONSOLE Console attributes -_ANSWERTIME Time phone was answered -_LOGONTIME Time of successful logon -_NS_TIME Current new-file scan pointer -_LAST_NS_TIME Time of last new-file scan -_ONLINE Online? (1=LOCAL, 2=REMOTE, 0=No) -_SYS_STATUS System status attributes -_SYS_MISC System toggle options (SCFG) -_SYS_PSNUM PostLink Site Number (SCFG) -_SYS_TIMEZONE *System time zone (in SMB format, SCFG) -_SYS_PWDAYS *Days between forced password changes (0=disabled, SCFG) -_SYS_DELDAYS *Days to preserve deleted user slots (SCFG) -_SYS_AUTODEL *Number of days before deleting inactive users (SCFG) -_SYS_NODES *Total configured nodes (SCFG) -_SYS_EXP_WARN *Days before expiration to warn user (SCFG) -_SYS_LASTNODE *Last displayable node (SCFG) -_SYS_AUTONODE *First auto-node (SCFG) -_NODE_SCRNLEN *Screen length of this node (0=auto-detect, SCFG) -_NODE_SCRNBLANK *Minutes between screen blanks (0=disabled, SCFG) -_NODE_MISC Node toggle options (SCFG) -_NODE_VALUSER *Number of user to send newuser feedback to (SCFG) -_NODE_IVT *Bits determining which time-slice APIs to use (SCFG) -_NODE_SWAP *Bits determining which swap types to use (SCFG) -_NODE_MINBPS *Minimum connect rate allowed for this node (SCFG) -_NODE_NUM *Number of this node -_NEW_LEVEL *Security level to give new users (SCFG) -_NEW_FLAGS1 Flag set #1 to give new users (SCFG) -_NEW_FLAGS2 Flag set #2 to give new users (SCFG) -_NEW_FLAGS3 Flag set #3 to give new users (SCFG) -_NEW_FLAGS4 Flag set #4 to give new users (SCFG) -_NEW_EXEMPT Exemption flags to give new users (SCFG) -_NEW_REST Restriction flags to give new users (SCFG) -_NEW_CDT Credits to give new users (SCFG) -_NEW_MIN Minutes to give new users (SCFG) -_NEW_SHELL *Command shell to default to for new users (SCFG) -_NEW_MISC Default settings for new users (SCFG) -_NEW_EXPIRE *Automatically set newuser expiration days (SCFG) -_NEW_PROT *Default download protocol for new users (SCFG) -_EXPIRED_LEVEL *Default security level to give expired users (SCFG) -_EXPIRED_FLAGS1 Default flag set #1 to give expired users (SCFG) -_EXPIRED_FLAGS2 Default flag set #2 to give expired users (SCFG) -_EXPIRED_FLAGS3 Default flag set #3 to give expired users (SCFG) -_EXPIRED_FLAGS4 Default flag set #4 to give expired users (SCFG) -_EXPIRED_EXEMPT Default exemption flags to give expired users (SCFG) -_EXPIRED_REST Default restriction flags to give expired users (SCFG) -_MIN_DSPACE *Minimum disk space (in k) to allow uploads (SCFG) -_CDT_MIN_VALUE *Minutes per 100k of credits (SCFG) -_CDT_PER_DOLLAR Credits per dollar conversion rate (SCFG) -_LEECH_PCT *Leech detection percentage (0=disabled, SCFG) -_LEECH_SEC *Minimum elapsed seconds before leech detection (SCFG) -_NETMAIL_COST Credit cost to send FidoNet netmail (SCFG) -_NETMAIL_MISC *Toggle options for FidoNet netmail (SCFG) -_INETMAIL_COST Credit cost to send Internet netmail (SCFG) -_INETMAIL_MISC Toggle options for Internet netmail (SCFG) -_LOGON_ULB Total bytes uploaded this call -_LOGON_DLB Total bytes downloaded this call -_LOGON_ULS Total files uploaded this call -_LOGON_DLS Total files downloaded this call -_LOGON_POSTS Total posts sent this call -_LOGON_EMAILS Total emails sent this call -_LOGON_FBACKS Total feedback sent this call -_POSTS_READ Total posts read this call -_LOGFILE *File handle of currently open NODE.LOG -_NODEFILE *File handle of currently open NODE.DAB -_NODE_EXT *File handle of currently open NODE.EXB -_TIMELEFT Number of seconds left online for current user -_MAX_MINUTES Max number of minutes allowed in minute bank (SCFG) -_MAX_QWKMSGS Max number of messages allowed per QWK packet (SCFG) -_UQ Bits determining which questions to ask newusers (SCFG) -_ERRORLEVEL *Error level of most recently executed external program -_ERRNO *Current DOS error code (see ERRNO.INC for values) -<a href="#TOC"><b> -Back to Table of Contents</b></a></pre> -<h2><a name="QuickFunctionReference">[6.1] - Quick Function Reference</a> -</h2> -<pre><a href="#String Manipulation Functions"><b>String Manipulation Functions</b></a> ------------------------------ -STR <str_var> [str_var] [...] -GLOBAL_STR <str_var> [str_var] [...] -SET <str_var> <"cstr"> -COPY <str_var> <any_var> -SWAP <str_var> <any_var> -STRCAT <str_var> <str_var or "cstr"> -SPRINTF <str_var> <"cstr"> <any_var> [any_var] [...] -TIME_STR <str_var> <int_var> -DATE_STR <str_var> <int_var> -SECOND_STR <str_var> <int_var> -FTIME_STR <str_var> <"cstr"> <int_var> -SHIFT_STR [str_var] <#> -STRIP_CTRL [str_var] -TRUNCSP [str_var] -STRUPR [str_var] -STRLWR [str_var] -SETSTR <"cstr"> -REPLACE_TEXT <#> <"cstr"> -LOAD_TEXT <"str"> -REVERT_TEXT <# or ALL></pre> -<pre><b><a href="#Integer Manipulation Functions">Integer Manipulation Functions</a> -</b>------------------------------ -INT <int_var> [int_var] [...] -GLOBAL_INT <int_var> [int_var] [...] -SET <int_var> <#> -ADD <int_var> <any_var or #> -SUB <int_var> <any_var or #> -MUL <int_var> <any_var or #> -DIV <int_var> <any_var or #> -MOD <int_var> <any_var or #> -AND <int_var> <any_var or #> -OR <int_var> <any_var or #> -NOT <int_var> <any_var or #> -XOR <int_var> <any_var or #> -COPY <int_var> <any_var> -SWAP <int_var> <any_var> -RANDOM <int_var> <#> -TIME <int_var> -STRLEN <int_var> <str_var> -DATE_INT <int_var> <str_var> -CRC16 <int_var> <str_var> -CRC32 <int_var> <str_var> -CHKSUM <int_var> <str_var> -CHARVAL <int_var> <str_var> - -<b><a href="#Logic/Control Flow Functions">Logic/Control Flow Functions</a> -</b>---------------------------- -GOTO <txt> -CALL <txt> -RETURN -SETLOGIC <TRUE or FALSE or GREATER or LESS> -COMPARE <any_var> <any_var or "cstr" or #> -IF_TRUE -IF_EQUAL -IF_FALSE -IF_NOT_EQUAL -IF_GREATER -IF_GREATER_OR_EQUAL -IF_LESS -IF_LESS_OR_EQUAL -ELSE -END_IF -SWITCH <int_var> -CASE <#> -DEFAULT -END_CASE -END_SWITCH -CMD_HOME -CMDKEY <key> -CMDKEYS <keylist> -CMDSTR <"cstr"> -END_CMD -CMD_POP -COMPARE_KEY <key> -COMPARE_KEYS <keylist> -COMPARE_STR <"cstr"> -COMPARE_WORD <"cstr"> -COMPARE_ARS <ars> -COMPARE_STRN <#> <str_var> <str_var or "cstr"> -COMPARE_SUBSTR <str_var> <str_var or "cstr"> - -<b><a href="#Display Functions">Display Functions</a> -</b>----------------- -PRINT <"cstr" or any_var> -PRINTF <"cstr"> <any_var> [any_var] [...] -PRINT_LOCAL <"cstr"> -PRINT_REMOTE <"cstr"> -PRINTSTR -PRINTKEY -MNEMONICS <"cstr"> -CLS -CRLF -PRINTFILE <"str" or str_var> [#] -PRINTTAIL <str_var> <#> <#> -PRINTFILE_STR -PRINTFILE_LOCAL <"str"> -PRINTFILE_REMOTE <"str"> -LIST_TEXT_FILE -EDIT_TEXT_FILE -PAUSE -MENU <"str"> -NODELIST_ALL -NODELIST_USERS -USERLIST_SUB -USERLIST_DIR -USERLIST_ALL -USERLIST_LOGONS -YES_NO <"cstr"> -NO_YES <"cstr"> -READ_SIF <"str"> -SAVELINE -RESTORELINE</pre> -<pre><b><a href="#Input Functions">Input Functions</a> -</b>--------------- -INKEY -GETKEY -GETKEYE -GETCMD <"cstr"> -GETSTR [str_var] [#] [#] -GETLINE [str_var] [#] -GETSTRUPR [str_var] [#] -GETNAME [str_var] [#] -GETFILESPEC -GETLINES -GETNUM [any_var] <#> -GET_TEMPLATE <"str"> -CHKSYSPASS -CREATE_SIF <"str"> - -<b><a href="#Miscellaneous Functions">Miscellaneous Functions</a> -</b>----------------------- -ONLINE -OFFLINE -LOGIN <"cstr"> -LOGON -LOGOFF -LOGOFF_FAST -LOGOUT -NEWUSER -SET_MENU_DIR <"str"> -SET_MENU_FILE <"str"> -SYNC -ASYNC -RIOSYNC -PUT_NODE -PAUSE_RESET -CLEAR_ABORT -UNGETKEY -UNGETSTR -HANGUP -EXEC <"str"> -EXEC_INT <"str"> -EXEC_BIN <"str"> -EXEC_XTRN <"str"> -LOG <"cstr"> -LOGSTR -LOGKEY -LOGKEY_COMMA -NODE_STATUS <#> -NODE_ACTION <#> -INC_MAIN_CMDS -INC_FILE_CMDS -COMPARE_USER_MISC <#> -COMPARE_USER_CHAT <#> -COMPARE_USER_QWK <#> -COMPARE_NODE_MISC <#> -TOGGLE_USER_MISC <#> -TOGGLE_USER_CHAT <#> -TOGGLE_USER_QWK <#> -TOGGLE_NODE_MISC <#> -TOGGLE_USER_FLAG <char> <char> -ADJUST_USER_CREDITS <#> -ADJUST_USER_MINUTES <#> -SET_USER_LEVEL <#> -SET_USER_STRING <#> -USER_EVENT <#> -UTO_MESSAGE -USER_DEFAULTS -USER_EDIT -TEXT_FILE_SECTION -XTRN_EXEC -XTRN_SECTION -MINUTE_BANK -CHANGE_USER -ANSI_CAPTURE -FINDUSER -SELECT_SHELL -SET_SHELL -SELECT_EDITOR -SET_EDITOR -TRASHCAN <"str"> -GETTIMELEFT -MSWAIT <#> -SEND_FILE_VIA <char> <"str" or str_var> -RECEIVE_FILE_VIA <char> <"str" or str_var> - -<b><a href="#Mail Functions">Mail Functions</a> -</b>-------------- -MAIL_READ -MAIL_READ_SENT -MAIL_READ_ALL -MAIL_SEND -MAIL_SEND_FILE -MAIL_SEND_BULK -MAIL_SEND_FEEDBACK -MAIL_SEND_NETMAIL -MAIL_SEND_NETFILE</pre> -<pre><b><a href="#Message Base Functions">Message Base Functions</a> -</b>---------------------- -MSG_SET_AREA -MSG_SET_GROUP -MSG_SELECT_AREA -MSG_SHOW_GROUPS -MSG_SHOW_SUBBOARDS -MSG_GROUP_UP -MSG_GROUP_DOWN -MSG_SUBBOARD_UP -MSG_SUBBOARD_DOWN -MSG_GET_SUB_NUM -MSG_GET_GRP_NUM -MSG_READ -MSG_POST -MSG_QWK -MSG_PTRS_CFG -MSG_PTRS_REINIT -MSG_NEW_SCAN_CFG -MSG_NEW_SCAN -MSG_NEW_SCAN_ALL -MSG_NEW_SCAN_SUB -MSG_CONT_SCAN -MSG_CONT_SCAN_ALL -MSG_BROWSE_SCAN -MSG_BROWSE_SCAN_ALL -MSG_FIND_TEXT -MSG_FIND_TEXT_ALL -MSG_YOUR_SCAN_CFG -MSG_YOUR_SCAN -MSG_YOUR_SCAN_ALL - -<b><a href="#File Base Functions">File Base Functions</a> -</b>------------------- -FILE_SET_AREA -FILE_SET_LIBRARY -FILE_SELECT_AREA -FILE_SHOW_LIBRARIES -FILE_SHOW_DIRECTORIES -FILE_LIBRARY_UP -FILE_LIBRARY_DOWN -FILE_DIRECTORY_UP -FILE_DIRECTORY_DOWN -FILE_GET_DIR_NUM -FILE_GET_LIB_NUM -FILE_LIST -FILE_LIST_EXTENDED -FILE_VIEW -FILE_UPLOAD -FILE_UPLOAD_USER -FILE_UPLOAD_SYSOP -FILE_DOWNLOAD -FILE_DOWNLOAD_USER -FILE_DOWNLOAD_BATCH -FILE_REMOVE -FILE_BATCH_ADD -FILE_BATCH_ADD_LIST -FILE_BATCH_CLEAR -FILE_BATCH_SECTION -FILE_TEMP_SECTION -FILE_NEW_SCAN -FILE_NEW_SCAN_ALL -FILE_FIND_TEXT -FILE_FIND_TEXT_ALL -FILE_FIND_NAME -FILE_FIND_NAME_ALL -FILE_PTRS_CFG -FILE_SET_ALT_PATH -FILE_RESORT_DIRECTORY -FILE_SEND -FILE_GET -FILE_PUT -FILE_UPLOAD_BULK -FILE_FIND_OLD -FILE_FIND_OPEN -FILE_FIND_OFFLINE -FILE_FIND_OLD_UPLOADS - -<b><a href="#Chat Functions">Chat Functions</a> -</b>-------------- -PAGE_SYSOP -PAGE_GURU -PRIVATE_CHAT -PRIVATE_MESSAGE -CHAT_SECTION</pre> -<pre><b><a href="#Information Functions">Information Functions</a> -</b>--------------------- -INFO_SYSTEM -INFO_SUBBOARD -INFO_DIRECTORY -INFO_USER -INFO_VERSION -INFO_XFER_POLICY -GURU_LOG -ERROR_LOG -SYSTEM_LOG -SYSTEM_YLOG -SYSTEM_STATS -NODE_STATS -SHOW_MEM</pre> -<pre><b><a href="#File I/O Functions">File I/O Functions</a> -</b>------------------ -FOPEN <int_var> <#> <"str" or str_var> -FCLOSE <int_var> -FREAD <int_var> <any_var> [int_var or #] -FWRITE <int_var> <any_var> [int_var or #] -FFLUSH <int_var> -FGET_LENGTH <int_var> <int_var> -FSET_LENGTH <int_var> <int_var or #> -FGET_TIME <int_var> <int_var> -FSET_TIME <int_var> <int_var> -FEOF <int_var> -FGET_POS <int_var> <int_var> -FSET_POS <int_var> <int_var or #> [#] -FLOCK <int_var> <int_var or #> -FUNLOCK <int_var> <int_var or #> -FPRINTF <int_var> <"cstr"> [any_var] [...] -FREAD_LINE <int_var> <any_var> -FSET_ETX <#></pre> -<pre><b><a href="#File System Functions">File System Functions</a> -</b>--------------------- -CHKFILE <"str" or str_var> -REMOVE_FILE <str_var> -RENAME_FILE <str_var> <str_var> -COPY_FILE <str_var> <str_var> -MOVE_FILE <str_var> <str_var> -GET_FILE_ATTRIB <int_var> <str_var> -SET_FILE_ATTRIB <int_var> <str_var> -GET_FILE_TIME <int_var> <str_var> -GET_FILE_LENGTH <int_var> <str_var> - -<b><a href="#Directory System Functions">Directory System Functions</a> -</b>-------------------------- -MAKE_DIR <str_var> -CHANGE_DIR <str_var> -REMOVE_DIR <str_var> -OPEN_DIR <int_var> <str_var> -READ_DIR <int_var> <str_var> -REWIND_DIR <int_var> -CLOSE_DIR <int_var></pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a> </pre> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/baja2new.txt b/docs/baja2new.txt deleted file mode 100644 index 967efc728d..0000000000 --- a/docs/baja2new.txt +++ /dev/null @@ -1,332 +0,0 @@ -New features added in Baja Version 2 -==================================== - -o Integer constants can be delcared as specific bit values (.x) -o Integer contsants can be modified during compilation (345*12) -o Compiler supports C-like macros (!define) for pre-processor definition of - integer and string constants -o Compiler supports multi-file projects using a C-like pre-processor directive - (!include) for combining multiple source/include files -o Enhanced functions: - SHIFT_STR [str_var] <#> - Can shift any string variable (not just str) - SETLOGIC <TRUE or FALSE or GREATER or LESS> - Supports new GREATER and LESS logic states - PRINT <"str" or any_var> - Can print any variable as well as string constants - CHKFILE <"str" or str_var> - Can check for file specified by string constant or variable - COMPARE_KEY <key> - Now supports DIGIT, EDIGIT, ^x, and /x like CMDKEY - COMPARE_ARS <ars> - Now supports WIP (Windows Interface Protocol) keyword - COMPARE_USER_MISC <attrs> - and - TOGGLE_USER_MISC <attrs> - Now support WIP (Windows Interface Protocol) attribute - PRINTFILE <"str" or str_var> [mode] - Optional mode (one or more): - NOABORT Disallows abortion of display with Ctrl-C - SAVEATR Retain attributes (colors) after display - NOATCODES Don't expand @-code variables/actions - OPENCLOSE Open and close immediately (before display) - GETSTR [str_var] [maxlen] [mode] - Can read into any string variable (not just str) - Optional mode (one or more): - UPPER Converts all letters to upper case - UPRLWR Upper/Lower case automatically - NUMBER Allow numbers only - WRAP Allows word wrap - MSG Allows ANSI, ^N ^A ^G - SPIN Spinning cursor - LINE Input line (inverse color) - EDIT Edit string passed - NOCRLF Don't print CRLF after string input - ALPHA Only allow alphabetic characters - LOWPRIO low priority input - NOEXASC No extended ASCII allowed - E71DETECT Detect E-7-1 terminal type - AUTODEL Auto-delete text (used with EDIT) - NOECHO Don't echo input to local or remote console - GETNUM [any_var] <#> - Writes to any variable (not just str) - NODE_ACTION <action or #> - Supported actions: - MAIN Main Prompt - RMSG Reading Messages - RMAL Reading Mail - SMAL Sending Mail - RTXT Reading G-Files - RSML Reading Sent Mail - PMSG Posting Message - AMSG Auto-message - XTRN Running External Program - DFLT Main Defaults Section - XFER Transfer Prompt - DLNG Downloading File - ULNG Uploading File - BXFR Bidirectional Transfer - LFIL Listing Files - LOGN Logging on - LCHT In Local Chat with Sysop - MCHT In Multi-Chat with Other Nodes - GCHT In Local Chat with Guru - CHAT In Chat Section - SYSP Sysop Activity - TQWK Transferring QWK packet - PCHT In Private Chat - PAGE Paging another node for Private Chat - RFSD Retrieving file from seq dev (aux=dev) -o New String Manipulation functions: - STR <str_var> [str_var] [...] - Define local string variable(s) - GLOBAL_STR <str_var> [str_var] [...] - Define global string variable(s) - SET <str_var> <"str"> - Initialize string variable - COPY <str_var> <any_var> - Copy from any variable to a string variable - SWAP <str_var> <any_var> - Swap contents of any variable with string variable - STRCAT <str_var> <str_var or "str"> - Append string variable or constant to end of string variable - SPRINTF <str_var> <"str"> <any_var> [any_var] [...] - Write text and formated variables to string variable - TIME_STR <str_var> <int_var> - Convert time integer variable to date/time string - DATE_STR <str_var> <int_var> - Convert time integer variable to MM/DD/YY string - SECOND_STR <str_var> <int_var> - Convert time integer variable to HH:MM:SS string - FTIME_STR <str_var> <"str"> <int_var> - Convert time integer variable to string in custom format - TRUNCSP [str_var] - Truncate space off end of string variable - STRIP_CTRL [str_var] - Strips all control characters from string variable - STRUPR [str_var] - Convert string variable to upper case - STRLWR [str_var] - Convert string variable to lower case - LOAD_TEXT <"str"> - Loads an alternate TEXT.DAT into memory - REVERT_TEXT <# or ALL> - Reverse effects of REPLACE_TEXT for specific line # or ALL -o New Integer Manipulation functions: - INT <int_var> [int_var] [...] - Define local integer variable(s) - GLOBAL_INT <int_var> [int_var] [...] - Define global integer variable(s) - SET <int_var> <#> - Initialize integer variable - ADD <int_var> <any_var or #> - Add any variable or numeric constant to integer variable - SUB <int_var> <any_var or #> - Subtract any variable or constant from integer variable - MUL <int_var> <any_var or #> - Multiply any variable or constant with integer variable - DIV <int_var> <any_var or #> - Divide integer variable by any variable or constant - MOD <int_var> <any_var or #> - Modula (remainder after division) - AND <int_var> <any_var or #> - Bit-wise AND integer with any constant or variable - OR <int_var> <any_var or #> - Bit-wise OR integer with any constant or variable - NOT <int_var> <any_var or #> - Bit-wise NOT integer with any constant or variable - XOR <int_var> <any_var or #> - Bit-wise XOR integer with any constant or variable - COPY <int_var> <any_var> - Copy from any variable to an integer variable - SWAP <int_var> <any_var> - Swap contents of any variable with integer variable - RANDOM <int_var> <#> - Write random number between 0 and # to integer variable - TIME <int_var> - Write current time (time_t format) to integer variable - STRLEN <int_var> <str_var> - Put length of string variable into integer variable - DATE_INT <int_var> <str_var> - Convert MM/DD/YY string variable to integer variable - CRC16 <int_var> <str_var> - Put CRC-16 of contents of string variable into integer variable - CRC32 <int_var> <str_var> - Put CRC-32 of contents of string variable into integer variable - CHKSUM <int_var> <str_var> - Put CHKSUM of contents of string variable into integer variable - CHARVAL <int_var> <str_var> - Put value of 1st char in string variable into integer variable - FLENGTH <int_var> <str_var> - Put length of file pointed to by string variable into integer -o New Logic/Control Flow functions: - COMPARE <any_var> <any_var or "str" or #> - Compare any variable with another variable or constant - IF_EQUAL - Same as IF_TRUE - IF_NOT_EQUAL - Same as IF_FALSE - IF_GREATER - If comparison resulted in GREATER-than - IF_GREATER_OR_EQUAL - If comparison resulted in GREATER-than or EQUAL-to - IF_LESS - If comparison resulted in LESS-than - IF_LESS_OR_EQUAL - If comparison resulted in LESS-than or EQUAL-to - SWITCH <int_var> - C-like switch { to replace multi if-else-if statements - CASE <#> - C-like case: block header - DEFAULT - C-like default: case block header - END_CASE - Like C "break" statement, terminates a case block - END_SWITCH - End of switch block (}) - CMDKEYS <keylist> - Skip block if current command key is not in keylist - COMPARE_KEYS <keylist> - Logic state set to FALSE if current command key not in keylist - COMPARE_STRN <#> <str_var> <str_var or "str"> - Compare first # characters of two strings (strncmp()) - COMPARE_SUBSTR <str_var> <str_var or "str"> - Find second string inside first (strstr()) -o New Display functions: - PRINTF <"str"> <any_var> [any_var] [...] - C-like function to display text and formatted variables - PRINTTAIL <str_var> <mode> <lines> - Print last x number of lines of file (mode same as PRINTFILE) - READ_SIF <"str"> - Read SIF/SOF file and display with user's answers filled in - SAVELINE - Save the current display line to be redisplayed w/RESTORELINE - RESTORELINE - Re-display last line saved with SAVELINE -o New Input functions: - INKEY - Set logic state to TRUE if the user hit a key (don't wait) - CREATE_SIF <"str"> - Create/overwrite SIF data file by asking user questions -o New Miscellaneous functions - ONLINE - Assume online execution (auto-halt if disconnected) - default - OFFLINE - Assume offline execution (no carrier or no one online) - LOGIN <"str"> - Process login attempt using passed str for password prompt - LOGON - Initiate logon procedure (auto-loads logon module) - LOGOUT - This function to be used before re-logging a user in - NEWUSER - Initiate new user procedure (auto-loads new user module) - RIOSYNC - Synchronize remote output (wait for output buffers to flush) - PUT_NODE - Force flush of current node information to disk - NODE_STATUS <status or #> - Set node status to one of: - WFC Waiting for Call - LOGON At logon prompt - NEWUSER New user applying - INUSE In Use - QUIET In Use - quiet mode - OFFLINE Offline - NETTING Networking - EVENT_WAITING Waiting for all nodes to be inactive - EVENT_RUNNING Running an external event - EVENT_LIMBO Allowing another node to run an event - ADJUST_USER_MINUTES <# or -#> - Add or subtract minutes from user's minute bank - USER_EVENT <event_type> - Execute user event(s), one of: - LOGON All configured external logon events - LOGOFF All configured external logoff events - NEWUSER All configured external new user events - BIRTHDAY All configured external birthday events - TRASHCAN <"str"> - Searches file specified by "str" for current command string - SEND_FILE_VIA <prot> <"str" or str_var> - Immediately start the transfer of a file with specific protocol - GETTIMELEFT - Checks the user's current time left online - MSWAIT <#> - Suspends execution for # milliseconds (gives up time-slices) -o New File Base functions: - FILE_BATCH_ADD_LIST - Add list of files (current command str) to batch d/l queue - FILE_SEND - Same as FILE_GET, but doesn't require system password. -o New Chat functions: - PAGE_GURU - Page one of the configured online Gurus for chat -o New File I/O functions: - FOPEN <int_var> <access> <"str" or str_var> - Open/create a file for random access - FCLOSE <int_var> - Close a file - FREAD <int_var> <any_var> [int_var or #] - Read # of bytes from a file into integer or string variable - FWRITE <int_var> <any_var> [int_var or #] - Write # of bytes from integer or string variable into a file - FGET_LENGTH <int_var> <int_var> - Get current length of file and put in integer variable - FSET_LENGTH <int_var> <int_var or #> - Set current length of file - FGET_TIME <int_var> <int_var> - Get the current time stamp of file - FSET_TIME <int_var> <int_var> - Set the current time stamp of file - FEOF <int_var> - Set logic state to true if currently at end of file - FGET_POS <int_var> <int_var> - Get current byte offset (position) in file - FSET_POS <int_var> <int_var or #> [BEG/SET or CUR or END or #] - Set the current file position (seek) - FLOCK <int_var> <int_var or #> - Lock a record of # bytes in length (retry for 10 seconds) - FUNLOCK <int_var> <int_var or #> - Unlock a previously locked record - FPRINTF <int_var> <"str"> <any_var> [any_var] [...] - Write text and formatted variables to file - FREAD_LINE <int_var> <any_var> - Read a single line from a file into a variable - FSET_ETX <#> - Set end-of-text character for ASCII termination (default: 0) -o New File System functions -o New Directory System functions - - -Incompatibilities with Baja Version 1 Source Code -================================================= - -PRINT function requires argument to be in quotes (if not a variable). - -PRINTFILE function requires first argument to be in quotes (if not a variable). - -NODE_ACTION function requires inclusion of NODEDEFS.INC and action parameters - (MAIN and XFER) where changed (to NODE_MAIN and NODE_XFER). Additional - action values were added. See Baja.DOC for details. - -TOGGLE_NODE_MISC and COMPARE_NODE_MISC functions require the inclusion of - NODEDEFS.INC. Misc attribute syntax was changed. See Baja.DOC for - details. - -TOGGLE_USER_MISC and COMPARE_USER_MISC functions require the inclusion of - USERDEFS.INC. The misc attributes were changed (prepended with UM_). - The syntax for combining multiple misc attributes was changed. See - Baja.DOC for details. - -TOGGLE_USER_CHAT, COMPARE_USER_CHAT, TOGGLE_USER_QWK, and COMPARE_USER_QWK - functions require the inclusion of USERDEFS.INC. The attr parameters - were changed (from ECHO to CHAT_ECHO, for example). The syntax for - combining multiple misc attributes was changed. See Baja.DOC for - details. - -SET_USER_STRING function requires the inclusion of USERDEFS.INC. The argument - syntax was changed (from ALIAS to USER_STRING_ALIAS, for example). - -Label names may no longer contain spaces. - -/* End of BAJA_V2.NEW */ diff --git a/docs/chat_section.html b/docs/chat_section.html deleted file mode 100644 index 8e9034fb10..0000000000 --- a/docs/chat_section.html +++ /dev/null @@ -1,164 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Chat Section</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2><a name="ChatFeatures">[11.0] - Chat Features</a> -</h2> -<pre>Selecting the Chat Features option from the SCFG will bring you to the -following sub-menu, an explanation of the options shown here follow.</pre> -<h2><img border="0" src="images/scfg_chat_features.gif" width="572" height="331"><br> -<br> -<a name="ArtificialChatGurus">[11.1] - Artificial Chat Gurus</a> -</h2> -<pre>This selection will give you a sub-menu with a list of available artificial -gurus, here you can insert and delete gurus.</pre> -<pre><img border="0" src="images/scfg_chat_gurus.gif" width="572" height="331"> - -Selecting a guru from the menu will bring you to a menu allowing you to -configure that guru.</pre> -<pre><img border="0" src="images/scfg_chat_theguru.gif" width="572" height="331"> - -<b>Guru Name:</b> - The name users will see when chatting with this artificial guru. - -<b>Guru Internal Code:</b> - This is an 8 character code used internally by Synchronet and should be - unique for each guru. This is also the filename which will be used for - the intelligence engine for this guru (with the .DAT extension, located - in your CTRL directory). See the section on customization for - information on customizing chat gurus. - -<b>Access Requirements:</b> - Only users meeting the criteria set here will be able to chat with this - guru.</pre> -<h2><a name="ChatActions">[11.2] - Chat Actions</a> -</h2> -<pre>Selecting this option will show a list of available chat action sets where you -can insert and delete action sets. Selecting an action set from this menu will -display a list of the actions contained within that set. - -Synchronet comes with a default chat action set, which you can modify, or use -as a reference for creating your own action set. Each command response should -have two '%s' fields contained in the line, the first will be replaced with -the name of the user performing the action, the second with the name of the -user to which the action is directed.</pre> -<h2><a name="MultinodeChatChannels">[11.3] - Multinode Chat Channels</a> -</h2> -<pre>Selecting this option will give you a sub-menu. An example of how a chat -channel might be set up, along with the options available, is shown:</pre> -<pre><img border="0" src="images/scfg_chat_channel1.gif" width="572" height="331"> - -<b>Name:</b> - This is the name of this chat channel, and what will be displayed to - users when viewing a list of available chat channels. - -<b>Internal Code: -</b> This is an internal code for SBBS to distinguish this chat channel from - the others on the system. This must be a unique name of up to 8 valid - DOS filename characters. - -<b>Cost in Credits: -</b> This is the amount of credits which will be deducted from the users - account when joining this particular chat channel. - -<b>Access Requirements: -</b> A user must meet the criteria set here in order to be able to use - (or even see) this chat channel. - -<b>Password Protection: -</b> If you wish to allow users to be able to lock this channel with a - password (only users knowing this password can enter the channel), you - should set this option to Yes. - -<b>Guru Joins When Empty: -</b> Set this option to Yes to have the selected chat guru enter this chat - channel when there is only one user in the channel. - -<b>Channel Guru: -</b> This is the guru which will join this channel (if the above option is - set to yes). Selecting this option will give you a list of available - chat gurus to choose from. - -<b>Channel Action Set: -</b> This is the chat action set which will be available to users in this - channel. Selecting this option will give you a list of available - chat action sets.</pre> -<h2><a name="ExternalSysopPagers">[11.4] - External Sysop Chat -Pagers</a> -</h2> -<pre>This option allows for sysops to have custom chat pages (external to what is -available in Synchronet). Sysops can have .TON files played when certain or all -users page, or if a sound card is installed, the sysop may have a .WAV or .VOC -file play. Selecting this option will give you a list of currently configured -chat pagers.</pre> -<pre><img border="0" src="images/scfg_chat_pagers.gif" width="572" height="331"> - -Selecting a pager from the above menu will give you other options for this chat -pager.</pre> -<pre><img border="0" src="images/scfg_chat_pager1.gif" width="572" height="331"> - -<b>Command Line: -</b> This is the command line necessary to invoke the chat pager. - -<b>Access Requirements: -</b> This is the list of criteria a user must meet for this pager to - affect them. - -<b>Intercept I/O Interrupts: -</b> If the chat pager specified produces screen output that the user - should see (or a series of beeps that the user should hear), this - option should be toggled to Yes.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/contents.txt b/docs/contents.txt deleted file mode 100644 index 60c0886060..0000000000 --- a/docs/contents.txt +++ /dev/null @@ -1,36 +0,0 @@ - Synchronet Version 2.2 Documentation Directory - Table of Contents - -The following files should be located in the DOCS directory off of your main -BBS directory (example: C:\SBBS\DOCS). - -CONTENTS TXT This file -SBBS LST List of public access Synchronet BBSs sorted by phone number -ORDER TXT Purchase order form for Synchronet v2.2 -VERSIONS HST History of Synchronet package versions and release dates -VERSIONS TXT Versions of utilities included with this Synchronet package -USER DOC Synchronet User Manual (exported to ASCII) -SYSOP DOC Synchronet Sysop Manual -BAJA DOC Baja compiler/langauge documentation -BAJA_200 NEW Changes made in Baja version 2 (and incompatibility reference) -FILES REF Reference for all Synchronet data/config files -SBBSECHO DOC FidoNet EchoMail import/export (toss/scan) documentation -MAILER BAT Batch file for using Synchronet with FrontDoor/InterMail -EXEBBS BAT Batch file for using Synchronet with FrontDoor/InterMail -QEMM DOC Tips on keeping QEMM from using memory it shouldn't (crashing) -SVDMANSI DOC Documentation for OS/2 ANSI replacement -USERCOM DOC Documentation for USER.COM log search utility -TEXT210A DIF TEXT.DAT changes from v2.00 to v2.1x -TEXT220A DIF TEXT.DAT changes from v2.1x to v2.20a -TEXT220B DIF TEXT.DAT changes from v2.20a to v2.20b -V200A NEW New features introduced in v2.00a -V210A NEW New features introduced in v2.10a -V211A NEW New features introduced in v2.11a -V220A NEW New features introduced in v2.20a -SBBS HST Development history of Synchronet version 2 - -Third Party: - -SYNCEDIT DOC Documentation for SyncEdit external editor -REGISTER FRM Registration (order) form for SyncEdit -CVT2SBBS TXT Information on how to convert previous BBS user data to SBBS diff --git a/docs/customization.html b/docs/customization.html deleted file mode 100644 index c217f18333..0000000000 --- a/docs/customization.html +++ /dev/null @@ -1,1057 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=IBM437"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Customization</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2><a name="MenusAndTextFiles">[17.1] - Customization: -Menus and Text Files</a></h2> -<pre>One of the easiest and possibly the most obvious ways to customize or -personalize your BBS is to change the look of the menus. Menus are merely ASCII -text files (with optional ctrl-a codes or ANSI escape sequences) stored in the -TEXT\MENU directory. The filenames are descriptive of the menu subject and -the extensions represent the content of the file. The possible extensions and -their meanings are: - -<b>RIP</b> Contains RIPscrip escape sequences for use with RIPterm -<b>WIP</b> Contains WIP escape sequences for use with DC-Term -<b>ANS </b> Contains ANSI escape sequences suitable for color display -<b>MON</b> Contains ANSI escape sequences suitable for monochrome display -<b>ASC</b> Contains no ANSI - -All of the above file types can contain ctrl-a codes, and only the ASC file -must exist. If a user has color ANSI, the ANS file will be displayed; if it -doesn't exist the ASC file will be displayed. If a user has monochrome ANSI, -the MON file will be displayed; if it doesn't exist the ANS file will be -displayed; and if it doesn't exist the ASC file is then displayed. - -A user without ANSI will always be displayed the ASC file. - -To edit files with ANSI escape sequences, it is usually preferable to use a -utility designed for such a task. TheDraw is quite popular for this use. - -To edit files with ctrl-a codes, you can use any editor that allows the input -of ctrl characters, but you won't see the attributes till you view the file -within Synchronet. You can, however, use the Synchronet internal editor (;EDIT -from the main menu) and it will display the attributes as you edit the file. -The Synchronet editor limits the line length to 79 characters which may not be -sufficient for lines with multiple ctrl-a codes. - -The best way to edit files with Ctrl-A codes is to first convert them to ANSI -with MSG2ANS.EXE (see the Utility reference for more information). Then edit -with an ANSI editor (such as TheDraw). Then convert back to Ctrl-A format -using ANS2MSG.EXE (see the Utility reference for more information). - - -<b>Menu Files Description -</b>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -ALLMAIL Sysop's reading all mail on system menus -ATTR Ctrl-A code menu for use within the Synchronet internal editor -BATCHXFR Batch transfer menu -BATDPROT Batch download transfer protocols -BATFLAG Batch flag command key menu -BATUPROT Batch upload transfer protocols -BIPROT Bidirectional transfer protocols -CHAT Chat section menu -DLPROT Download transfer protocols -E-MAIL E-mail section menu -EDITOR Synchronet internal editor commands and line editing keys -EXEMPT Exemption flag descriptions for use within User Edit -FLAGS1 Flag set #1 descriptions for use within User Edit -FLAGS2 Flag set #2 descriptions for use within User Edit -FLAGS3 Flag set #3 descriptions for use within User Edit -FLAGS4 Flag set #4 descriptions for use within User Edit -LOGOFF Logoff ('O' command) screen -LOGON Logon screen (LOGON2, LOGON3, ... LOGON9 also supported) -MAILREAD Reading mail menu -MAIN Main section menu -MAINCFG Main configuration menu -MAININFO Main information menu -MSGSCAN Message reading/scanning menu -MULTCHAT Multinode chat menu -PRIVCHAT Private node-to-node chat menu -QWK QWK Packet menu -RESTRICT Restriction flag descriptions for use within User Edit -SENTMAIL Reading sent mail menu -SYSMAILR Sysop additional commands while reading mail -SYSMAIN Sysop additional commands for main section -SYSMSCAN Sysop additional commands while message reading/scanning -SYSSMAIL Sysop additional commands while reading sent mail -SYSXFER Sysop additional commands for transfer section -TEMPXFER Temporary directory commands menu -TRANSFER Transfer section menu -UEDIT User Edit menu -ULPROT Upload transfer protocols -WFC Waiting for call menu -XFERCFG Transfer section configuration menu -XFERINFO Transfer section information menu - - -<b>Optional Menus</b> - -The following files must be created in the TEXT\MENU directory if you wish to -use them. - -GRPS Message Group listing -SUBSx Message Sub-board listing, 'x' is the group number -LIBS File Library listing -DIRSx File Directory listing, 'x' is the library number -XTRN_SEC External Program Sections -XTRNx External Program listing, 'x' is the section number -TEXT_SEC Text File Section listing -TEXTx Text File listing, 'x' is the text file section number -CHAN Multinode Chat Channels -TMESSAGE Displays when the user enters the transfer section -TPOLICY Transfer policy (&T transfer section command) - -<b>Other Optional Message Files</b> - -If you want to have an information file displayed for sub-boards when using -the 'I' scanning command and 'IS' main menu command, create a file for the -sub-board in the DATA\SUBS directory using the internal code for that sub-board -as the name and .MSG as the extension. Example: - -<b>DATA\SUBS\GENERAL.MSG</b> - -If you want to create in information file for file directories to be displayed -with the 'ID' transfer section command, create a file for the directory in -the DATA\DIRS directory using the internal code as the name and .MSG as the -extension. Example: - -<b>DATA\DIRS\GAMES.MSG</b> - -If you want to create a custom file listing header for a file directory, create -a file in the DATA\DIRS directory using the internal code as the name and .HDR -as the extension. Example: - -<b>DATA\DIRS\GAMES.HDR</b> - -<b>Colors</b> - -To modify some of colors of the BBS you can edit the ATTR.CFG file which is -located in the CTRL directory. The file contains one color per line and is -commented as to the use of the color. The colors are represented with ctrl-a -code attribute letters/numbers. The number of colors you can change with this -method is very small. - -<b>Text Files<u> -</u></b> -There are some text files that are displayed to users at different points -in the system. The locations and descriptions follow (* indicates optional): - -<b>TEXT\ANSWER.ANS </b> Answer message for ANSI users -<b>TEXT\ANSWER.ASC </b> Answer message for non-ANSI users -<b>TEXT\ANSWER.RIP </b> Answer message for RIP users -<b>TEXT\SYSTEM.MSG</b> Description of the system and its configuration -<b>TEXT\NEWUSER.MSG </b>Displayed to new users (usually system rules) -<b>TEXT\FEEDBACK.MSG</b> Displayed before new users write validation feedback -<b>TEXT\NUPGUESS.MSG</b> *Displayed to callers attempting to guess the NUP (after - failing to guess correctly) -<b>TEXT\TOOSLOW.MSG</b> *Displayed to users logging onto a node at less than the - minumum configured connect rate for that node -<b>TEXT\BADCID.MSG </b> *Displayed to users calling from a number contained in - CID.CAN -<b>TEXT\BADNAME.MSG</b> *Displayed to new users trying to use a name contained - in NAME.CAN -<b>TEXT\BADPHONE.MSG</b> *Displayed to new users using a number contained in - PHONE.CAN -<b>TEXT\BADFILE.MSG</b> *Displayed to user trying to upload filename contained - in FILE.CAN -<b>TEXT\QWK\HELLO</b> *Included in QWK packets -<b>TEXT\QWK\BBSNEWS</b> *Included in QWK packets -<b>TEXT\QWK\BLT-0.? </b> *Included in QWK packets (? must be number) - -<b>Logon Message Flow Chart</b> - -Displayed filenames are in upper case. - -(Note: LOGON*.* are not displayed for local logons) - -���������������ͻ -� TEXT\ANSWER.* � -���������������ͼ -��������������Ŀ -� Logon Prompt � -���������������� - �����������Ŀ �����Ŀ ���������������ͻ �����������������ͻ - � New User? �Ĵ Yes �Ķ TEXT\SBBS.MSG �Ķ TEXT\SYSTEM.MSG � - ������������� ������� ���������������ͼ �����������������ͼ - ����Ŀ ������������������ͻ - � No � � TEXT\NEWUSER.MSG � - ������ ������������������ͼ - � ��������������������Ŀ - � � Password Selection � - � ���������������������� - � �����������������������Ŀ - � � Default Configuration � - � ������������������������� - � �������������������ͻ �����Ŀ ��������������������Ŀ - � � TEXT\FEEDBACK.MSG �Ĵ Yes �Ĵ Feedback Required? � - � �������������������ͼ ������� ���������������������� - � ���������������Ŀ ����Ŀ - � � Send Feedback � � No � - � ����������������� ������ - � �������������������Ŀ � - � � New User Event(s) ��������������������� - � ��������������������� - � �������������������ͻ - ��Ķ TEXT\MENU\LOGON.* � - �������������������ͼ - ��������������������ͻ - � TEXT\MENU\LOGON2.* � - ��������������������ͼ - ��������������������ͻ - � TEXT\MENU\LOGON3.* � - ��������������������ͼ - ... - - ��������������������ͻ - � TEXT\MENU\LOGON9.* � - ��������������������ͼ - ����������������Ŀ - � Logon Event(s) � - ������������������</pre> -<h3><a name="Text/Colors">[17.1.1] - Text/Colors</a></h3> -<pre>Virtually all the text and color that the BBS displays is stored in the file -TEXT.DAT in the CTRL directory. The syntax of this file is VERY specific and -extreme caution should be taken when editing it. Knowledge of the C language -would be very helpful in producing the desired results. If all you want to -do is change colors of a certain text line, take care not to disturb the -arrangement of the other characters on the line. Ctrl-a codes can be preceded -by an embedded ctrl-a character (usually a black happy face) or by a '\1' -(the printf() equivalent of ctrl-a). - -The syntax of the characters between the double quotations is identical to -the C language printf() format string with one exception: \xxx where x are -digits (0-9) represents a decimal number, not an octal number. The range is -0 to 255. If you wish to set a background color using \1 for the ctrl-a code, -you may need to pad the attribute number with zeros. For example; to set the -background to blue, you might try to use the sequence "\14" which won't work. -You could either embed the actual ctrl-a character (which is preferred) or -use "\0014". - -Some of the strings have characters preceded by a tilde ('~'). These strings -are referred to as mnemonics. The tilde precedes a character that is to be -highlighted for users supporting ANSI and enclosed in parenthesis for non-ANSI -users. Usually used for prompt strings that contain the valid key commands. -The colors to use for the highlighted characters, normal characters, and the -command character are specified in the CTRL\ATTR.CFG file. - -The order of the % specifiers (if they exist) in a TEXT.DAT line cannot be -altered. The display of %s specifiers can be suppressed by changing the '%s' to -'%.0s'. Another way to suppress the display of specifiers is to enclose them -between Ctrl-A( and Ctrl-A). Any text between Ctrl-A( and Ctrl-A) would only -be displayed to users of level 90 or higher. To suppress the display to all -users, put the text/specifiers between Ctrl-ACtrl-Z and Ctrl-A) (assuming -that the Z flag from flag set #1 is not set on any user accounts). - -** WARNING ** -Make a backup of the TEXT.DAT file before you edit it. If you damage the file -syntax when editing it, Synchronet may execute erroneously or even fail to -initialize.</pre> -<h3><a name="NodeActionText">[17.1.2] - Node Action Text</a></h3> -<pre>The node action text can be over-ridden by editing the NodeAction lines in -the TEXT.DAT file (see previous section for details on TEXT.DAT). The node -action text is what is displayed on the node status line when a node is in -use. (i.e. instead of "Node 1: So-and-so uploading at 14400bps", you could -make it say whatever you like). - -You can also include the following optional specifiers (in this order): - -<b>%s</b> User's name or alias -<b>%u</b> User's security level -<b>%u</b> User's age -<b>%c</b> User's sex (gender, M or F) -<b>%s</b> User's computer type -<b>%s</b> User's note -<b>%s</b> Date user was first online -<b>%u</b> Auxiliary value (chat channel, door number, paged node, etc) -<b>%u</b> Connection rate (in bps) - -If you include any of the above specifiers, you must also include any of the -specifiers above it. The order of the specifiers cannot be changed. If you -wish to suppress the display of a %s specifier, use "%.0s" instead of "%s". -To suppress other specifiers, see the previous section for details.</pre> -<h3><a name="TrashCanFiles">[17.1.3] - Trash Can Files</a></h3> -<pre>Trash can files are used to be able to reject text during certain sequences on -the BBS. For example, if you don't want a user to be able to log on with a -certain name or use a certain phone number, you would place the information you -don't want them to use into the appropriate trash can file. Synchronet looks -for trash can files in the \SBBS\TEXT directory, certain ones may already -exist, others will need to be created if you wish to use them. The names of -the various trash can files and their function are as follows: - -<b>TEXT\CID.CAN</b> You MUST have caller ID capabilities in your area (as well as a - modem which can support those capabilities) in order to use - this file. When a call comes in to the BBS who's caller ID - phone number matches a phone number in this file, the call will - be rejected. - -<b>TEXT\NAME.CAN</b> When a user attempts to use a name contained in this file as - the name for their user account, they will be told that s/he - cannot use that name. - If the file <b>TEXT\BADNAME.MSG</b> exists, this will be displayed to - the user. - -<b>TEXT\FILE.CAN</b> When a user uploads a file to the transfer section who's - filename matches one of the names contained in this file, the - user will be told that s/he cannot upload the file. - If the file <b>TEXT\BADFILE.MSG</b> exists, this will be displayed to - the user. - -<b>TEXT\PHONE.CAN</b> When a user attempts to use a phone number contained in this - file as a phone number for their user account, they will be - told that s/he cannot use that phone number. This file can - also be used by the Synchronet Callback Verifier program. - If the file <b>TEXT\BADPHONE.MSG</b> exists, this will be displayed to - the user. - -The trash can files also allow special key characters to be used within them, -the tilde '~' character means "contained within" and the carrot '^' character -means "beginning with". For example: - -<b>sysop </b>in the name.can would mean users could not use the name "sysop". - -<b>sysop^</b> would mean users could not use names beginning with the word "sysop", - like "sysopa" or "sysops" etc. - -<b>sysop~</b> would mean users could not use names that have the word "sysop" - anywhere in them, like "imthesysop" or "mesysophere". - -These key characters can be used in any of the trash can files.</pre> -<h2><a name="MessageVariables">[17.2] - Customization: -Message Variables</a></h2> -<pre><b>Using Message Variables</b> - -Message Variables (also called @-Codes) are a way to customize text files in -Synchronet to display information about the user online or the BBS. -If Synchronet encounters an @-Code in a text file (i.e.: TEXT.DAT, menus, etc.), -it will replace the @-Code in the file with the information that it corresponds -with. @-Codes in e-mail messages and posts will only be expanded if they were -posted locally (not networked) by user #1. TEXT.DAT lines that have % -specifiers will not expand @-Codes unless the % specifiers are removed. - -For example, placing the following line in a text file displayed to a user -named Fred Jones living on 100 Maple Street: - - <b>Hi @ALIAS@, you live at @ADDR1@ don't you?</b> - -Would result in the user seeing: - - <b>Hi Fred Jones, you live at 100 Maple Street don't you? -</b> -It's that simple. The following is a list of the @-Codes that Synchronet will -recognize. Remember that the Code NAME must begin and end with an @ symbol. -The two columns after the description of the @-Code show which other BBS -programs also support that @-Code (either PCBoard or Wildcat). - -The @-Codes with "[...]" following the name indicate that you can have the -variable displayed with padding. If the @-Code name ends in "-L" the variable -will be left justified and "-R" indicates it will be right justified. If for -example, the user's name is Bob, the text string "___@NAME-L@___" would display -to the user as "___Bob ___" and the text string "___@NAME-R@___" would -display to as "___ Bob___". If you want the string to be padded longer, you -can add extra characters to the end of the @-Code name and before the -terminating '@' sign. So for example, "___@NAME-L#####@___" would display as -"___Bob ___" (the "___" segments of the above text examples are only -to demonstrate where the padding begins and ends). - -*** Synchronet Supported @-Codes *** -( * Indicates Synchronet specific ) - -Note: All codes must be uppercase and sandwiched between @ symbols - (e.g. @USER@).</pre> -<pre><b>System Information</b></pre> -<pre><b>Code Description Ver -</b>--------------------------------------------------------------------------- -BBS Name of BBS -BOARDNAME Name of BBS -CONF Name of current Group and Sub-board -CONFNUM Number of current Group and Sub-board -CONN Connection description (modem type, "Telnet", "Local") <b>2.3c</b> -DATE Current system date -DIR Current file directory short description -DIR-L[...] " " padded and left justified -DIR-R[...] " " padded and right justified -DIRL Current file directory long description -DIRL-L[...] " " padded and left justified -DIRL-R[...] " " padded and right justified -DN Number of current file directory -DL " " padded and left justified (4 chars wide) -DR " " padded and right justified (4 chars wide) -FIDOADDR System's primary FidoNet address <b>2.3c</b> -FREESPACE Free disk space available for uploads -GRP Current message group short description -GRP-L[...] " " padded and left justified -GRP-R[...] " " padded and right justified -GRPL Current message group long description -GRPL-L[...] " " padded and left justified -GRPL-R[...] " " padded and right justified -GN Number of current message group -GL " " padded and left justified (4 chars wide) -GR " " padded and right justified (4 chars wide) -INETADDR System's Internet Address (as configured in SCFG) <b>2.3c</b> -LASTCALLERNODE Name of user last on this node -LASTCALLERSYSTEM <same as LASTCALLERNODE> -LIB Current file library short description -LIB-L[...] " " padded and left justified -LIB-R[...] " " padded and right justified -LIBL Current file library long description -LIBL-L[...] " " padded and left justified -LIBL-R[...] " " padded and right justified -LN Number of current file library -LL " " padded and left justified (4 chars wide) -LR " " padded and right justified (4 chars wide) -LOCAL-IP System's IP address <b>3.0b</b> -LOCATION System location (city, state) <b>2.3c</b> -NOACCESS Why user was denied access (last false ARS) -NODE Number of current node -NODE### Status of node number ### -NUMCALLS <same as STATS.LOGONS> -NUMDIR Number of current library and directory -PREVON <same as LASTCALLERNODE> -QUESTION Current Yes/No question (for TEXT\MENU\YESNO.*) -QWKID System's QWK BBS-ID <b>2.3c</b> -REV Software revision (single letter) -STATS.LOGONS Total logons during history of system <b>3.0b</b> -STATS.LTODAY Total logons today <b>3.0b</b> -STATS.TIMEON Total time used during history of system (in minutes) <b>3.0b</b> -STATS.TTODAY Total time used today (in minutes) <b>3.0b</b> -STATS.ULS Total uploads today <b>3.0b</b> -STATS.ULB Total bytes uploaded today <b>3.0b</b> -STATS.DLS Total download today <b>3.0b</b> -STATS.DLB Total bytes downloaded today <b>3.0b</b> -STATS.PTODAY Total posts today <b>3.0b</b> -STATS.ETODAY Total e-mails sent today <b>3.0b</b> -STATS.FTODAY Total feedbacks sent today <b>3.0b</b> -STATS.NUSERS Total number of new users today <b>3.0b</b> -SUB Current message sub-board short description -SUB-L[...] " " padded and left justified -SUB-R[...] " " padded and right justified -SUBL Current message sub-board long description -SUBL-L[...] " " padded and left justified -SUBL-R[...] " " padded and right justified -SN Number of current message sub-board -SL " " padded and left justified (4 chars wide) -SR " " padded and right justified (4 chars wide) -SYSDATE Current system date -SYSOP Name of System Operator -SYSTIME Current system time -TCALLS Total number of logons for system -TFILE Total number of files on system -TIME Current system time -TMSG Total number of messages on system -TNODE Total number of nodes on system -TUSER Total number of user slots on system -VER BBS version number -WHO Display status of all active nodes</pre> -<pre><b>User Information</b> - -<b>Code Description Ver -</b>--------------------------------------------------------------------------- -ADDR1 User's street address -ALIAS User's name or alias -BAUD User's connect rate (DCE) in bps -BDATE User's birthdate (MM/DD/YY) -BPS <same as BAUD> -BYTELIMIT User's free credits per day -BYTESLEFT User's total credits -CALLS Total number of logons for user -CID Caller's Caller-ID info or IP address <b>2.3c</b> -CITY User's city -COMPANY User's company name or real name -CPU User's computer type (v2.x) or hostname (v3.x) -DATA <same as PHONE> -DATAPHONE <same as PHONE> -DAYBYTES Number of free credits used today by user -DLBYTES Total bytes downloaded by user -DLFILES Total files downloaded by user -DLKLIMIT User's total credits (in kilobytes) -DOWNK Total kilobytes downloaded by user -DOWNS <same as DLFILES> -EXDATE User's expiration date (MM/DD/YY) -EXPDATE <same as EXDATE> -EXPDAYS Days left before user expires -FIRST User's first name/alias -FIRSTREAL User's first real/company name -FROM User's location (City, State) -HANDLE User's chat handle -HOMEPHONE <same as PHONE> -HOST <same as CPU> <b>2.3c</b> -IP <same as CID> <b>2.3c</b> -KBLEFT User's total credits (in kilobytes) -KBLIMIT User's free credits per day (in kilobytes) -LAST User's last name (alias) -LASTDATEON Date of user's last logon (MM/DD/YY) -LASTNEW Date of user's last new file scan (MM/DD/YY) -LASTON Date and time of user's last logon -LASTTIMEON Time of user's last logon (HH:MM am) -LASTREAL User's last real/company name -LEFT <same as MINLEFT> -MAILW Number of mail messages waiting for current user -MAILW:x Number of mail messages waiting for current user #x -MAILP Number of pending mail messages sent by current user -MAILP:x Number of pending mail messages sent by current user #x -MAXDK <same as KBLIMIT> -MEMO Date of user's last password modification -MEMO1 User's note -MEMO2 <same as COMPANY> -MINLEFT User's time left in minutes -MSGLEFT Total number of messages posted by user -MSGREAD Number of messages read by user this call -MSGSLEFT <same as MSGLEFT> -NAME User's name or alias -NAME-L[...] User's name (padded and left justified) -NAME-R[...] User's name (padded and right justified) -NEWFILETIME Date and time of user's last new file scan -NUMTIMESON <same as CALLS> -PHONE User's phone number (###-###-####) -REAL User's real first name -SEC User's security level -SECURITY <same as SEC> -SINCE Date of user's first call (MM/DD/YY) -STATE User's state (from location) -TIMELEFT <same as MINLEFT> -TIMELIMIT Maximum time per call in minutes -TIMEON Time used this call in minutes -TIMEUSED <same as TIMEON> -TLEFT Time left (H:MM:SS) -TPERC Time allowed per call (H:MM:SS) -TPERD Time allowed per day (H:MM:SS) -TUSED Time used this call (H:MM:SS) -UPBYTES Total bytes uploaded by user -UPFILES Total files uploaded by user -UPK Total kilobytes uploaded by user -UPS <same as UPFILES> -USER User's name or alias (same as ALIAS) -ZIP User's zip/postal code </pre> -<pre><b>Display</b> - -<b>Code Description Ver -</b>--------------------------------------------------------------------------- -AUTOMORE Toggle automatic pausing -BEEP Generate a beep -BELL <same as BEEP> -CLS Clear screen -CRLF Carriage return/line-feed pair <b>3.0b</b> -MENU:filename Display a menu file (from TEXT\MENU directory) -MSGREPLY Command key to reply to last message <b>3.0b</b> -MSGREREAD Command key used to re-read last message <b>3.0b</b> -NOPAUSE <Same as POFF> -MORE <same as PAUSE> -PAUSE Immediately produces a [Hit a key] prompt -PON Toggles automatic screen pause for everyone -POFF Toggles automatic screen pause for everyone -TYPE:filename Display a specific filename -UP Move cursor up one row (ANSI) <b>3.0b</b> -UP:n Move cursor up n rows (ANSI) <b>3.0b</b> -DOWN Move cursor down one row (ANSI) <b>3.0b</b> -DOWN:n Move cursor down n rows (ANSI) <b>3.0b</b> -RIGHT Move cursor right one column (ANSI) <b>3.0b</b> -RIGHT:n Move cursor right n columns (ANSI) <b>3.0b</b> -LEFT Move cursor left one column (ANSI) <b>3.0b</b> -LEFT:n Move cursor left n columns (ANSI) <b>3.0b</b> -GOTOXY:x,y Move cursor to x/y (1-based) (ANSI) <b>3.0b</b> -PUSHXY Save current cursor position (ANSI) <b>3.0b</b> -POPXY Restore saved cursor position (ANSI) <b>3.0b</b></pre> -<pre><b>Miscellaneous</b></pre> -<pre>There a few special Synchronet specific @-Codes which require a parameter -(following the colon and before the terminating @ symbol):</pre> -<pre><b>Code Description -</b>--------------------------------------------------------------------------- -HANGUP Immediately disconnect user -SETSTR:STR Sets the current Baja command string to STR -EXEC:MODNAME Execute a loadable (Baja) module, EXEC\MODNAME.BIN -TYPE:FILENAME Display a specific filename (must specify path and file ext.) -MENU:FILENAME Display a menu file (from TEXT\MENU with automatic file ext.) - -Synchronet command line specifiers may be used in the FILENAME parameter to -the TYPE: @-Code allowing symbolic replacment for specific Synchronet -directories (%!, %z, %k, %j, etc). - -<b>Examples:</b> - -@EXEC:MYMOD@ -@TYPE:%zSYSTEM.MSG@ -@MENU:YESNO@</pre> -<h2><a name="MessageColorCodes">[17.3] - Customization: -Message Color Codes</a></h2> -<pre>Synchronet supports six different Color Code formats. When Synchronet -encounters one of these Color Codes in a message, it changes the text following -the Color Code to the specified color. Support of the formats which are not -native to Synchronet (WWIV, Celerity, Renegade, PCBoard, and Wildcat) can be -toggled on and off from the Synchronet Configuration utility (System->Message -Options->Extra Attribute Codes). The non-Synchronet color codes (Extra -Attribute Codes) only affect the text that is displayed on the SAME LINE. When -using Synchronet color codes, the new color is retained from line to line until -another color code is processed or the end of the text is reached. - -<b><font size="4">Synchronet Format</font></b> - -The native Synchronet Color Code format (preferred) consists of a Control-A -followed by a singe character. The following is a list of valid Control-A -Color Codes: - -<b> Foreground Background -</b> ---------- ---------- -Black K 0 -Red R 1 -Green G 2 -Yellow Y 3 -Blue B 4 -Magenta M 5 -Cyan C 6 -White W 7 - - <b>Attribute Description</b> - --------- ----------- -High H High Intensity -Blink I Blinking -Normal N No Special Attributes (Normal) -Pause P Insert a Pause Prompt into message -Pause Reset Q Reset the line counter for the auto screen-pause -Delay , Insert a Tenth Second Delay into message -Delay ; Insert a Half Second Delay into message -Delay . Insert a Two Second Delay into message -Date D Display the system date -Time T Display the system time -Cls L Insert a Form Feed (Ctrl-L, Clear Screen) into message -Clreol > Clear to End of Line (leave cursor in current position) -Bckspc < Non-destructive backspace (Ctrl-H) -CR [ Carriage return (Ctrl-M) -LF ] Line feed (Ctrl-J) -Ctrl-A A Send an actual Ctrl-A character -Sync S Synchronize output with remote system -EOF Z End of displayable text in this file - -Normal - Same as 'N' but only sends ANSI codes if the - (minus) High Intensity, Blinking, or Background attribute is - set. - -Normal _ Same as 'N' but only sends ANSI codes if the - (underscore) Blinking or Background attribute is set. - -Synchronet also supports Special Control-A codes used to hide text from users -not meeting certain criteria (i.e.: Security Level or Flags from Flag Set #1). -The following is a list of Special Control-A codes, and a brief description -of each code's usage: - -<b>Code Description</b> -------------------------------------------------------------------------------- -^A thru ^Z Only display the following text to users with the corresponding - flag A through Z turned on (from Flag Set #1). - - ! Toggle the text display off/on for users of less than level 10. - @ " " 20. - # " " 30. - $ " " 40. - % " " 50. - ^ " " 60. - & " " 70. - * " " 80. - ( " " 90. - ) Restore the displaying of text to ALL users. - - "<filename> Display contents of <filename> (from your TEXT directory) - -High Bit (greater than ASCII 127) Used for cursor right positioning. - -<b><font size="4">WWIV Format</font></b> - -Synchronet also supports Color Codes which are native to WWIV BBS software. -These codes consist of a Control-C followed by a number (0 through 7): - -<b>Code Color</b> ----- ----- - 0 Normal - 1 High Intensity Cyan - 2 High Intensity Yellow - 3 Normal Magenta - 4 High Intensity White with Blue Background - 5 Normal Green - 6 High Intensity Blinking Red - 7 High Intensity Blue - 8 Low Intensity Blue - 9 Low Intensity Cyan - -<b><font size="4">Celerity Format</font><u> -</u></b> -Synchronet also supports Color Codes which are native to Celerity BBS software. -These codes consist of a pipe symbol '|' followed by a letter (case sensitive): - -<b>Code Color (foreground) -</b>---- ------------------ - k Normal Black - b Normal Blue - g Normal Green - c Normal Cyan - r Normal Red - m Normal Magenta - y Brown - w Normal White - d High Intensity Black - B High Intensity Blue - G High Intensity Green - C High Intensity Cyan - R High Intensity Red - M High Intensity Magenta - Y Yellow - W High Intensity White - S * Swap foreground and background - -Example: "|b|S|W" would set the current color to high intensity white on a - blue background. - -Note: Due to conflicting escape sequences (namely, the pipe character), - Celerity color codes are not supported when using RIP terminal mode. - -<font size="4"><b>Renegade Format</b></font> - -Synchronet also supports Color Codes which are native to Renegade BBS software. -These codes consist of a pipe symbol '|' followed by a number (0-23): - -<b>Code Color</b> ----- ----- - 0 Normal Black - 1 Normal Blue - 2 Normal Green - 3 Normal Cyan - 4 Normal Red - 5 Normal Magenta - 6 Brown - 7 Normal White - 8 High Intensity Black - 9 High Intensity Blue - 10 High Intensity Green - 11 High Intensity Cyan - 12 High Intensity Red - 13 High Intensity Magenta - 14 Yellow - 15 High Intensity White - 16 Background Black - 17 Background Blue - 18 Background Green - 19 Background Cyan - 20 Background Red - 21 Background Magenta - 22 Background Brown - 23 Background White - -Example: "|15|17" would set the current color to high intensity white on a - blue background. - -Note: Due to conflicting escape sequences (namely, the pipe character), - Renegade color codes are not supported when using RIP terminal mode. - -<font size="4"><b>PCBoard/Wildcat Format</b> -</font> -Two of the Color Code formats which Synchronet supports (PCBoard and Wildcat) -use similar, yet cryptic, methods of displaying colors. The PCBoard method -uses the format "@X<Background><Foreground>", and Wildcat uses the format -"@<Background><Foreground>@". The following is a list of the Background and -Foreground choices available: - -<b><Background> Color Attribute <Foreground> Color Attribute</b> ------------- ----- --------- ------------ ----- --------- - 0 Black Normal 0 Black Normal - 1 Blue " 1 Blue " - 2 Green " 2 Green " - 3 Cyan " 3 Cyan " - 4 Red " 4 Red " - 5 Magenta " 5 Magenta " - 6 Brown " 6 Brown " - 7 White " 7 White " - 8 Black Blinks Foreground 8 Black High Intensity - 9 Blue " 9 Blue " - A Green " A Green " - B Cyan " B Cyan " - C Red " C Red " - D Magenta " D Magenta " - E Brown " E Yellow " - F White " F White " - -Example: "@1F@" in Wildcat format and "@X1F" in PCBoard format would set the - current color to high intensity white on a blue background.</pre> -<h2><a name="SIFQuestionnaireFile">[17.4] - SIF Questionnaire File</a></h2> -<pre>An automatic new user SIF questionnaire can be specified in SCFG->System. -If a newuser SIF is specified, all users who logon and don't have a copy of -the answered questionnaire data in their user file will be given the -questionnaire upon logon. The sysop can view the answered questionnaire from -User Edit with the '#' command. For convenience, the sysop can create a second -(abbreviated) SIF file for his own use in viewing user's answers. The two SIF -files (input and output) should be identical with the exception of what is -in the 'text' portion. - -format: - -<b><STX>text<ETX>mode[mod][l][r][x][.n]["str"]</b> - -element descriptions: - -<b>STX </b> is the ASCII code for start of text (ASCII 2 / Ctrl-B) -<b>ETX</b> is the ASCII code for end of text (ASCII 3 / Ctrl-C) - -<b>text</b> is any number of ASCII characters - Synchronet Ctrl-A codes supported - -<b>mode</b> text input mode desired for this field. Possible mode values are: - c single character - s string of characters - -<b>mod</b> optional mode modifier. Possible mode modifiers are: - n numeric characters only - u input converted to uppercase - f forced word capitalization ('s' mode only) - -<b>l</b> input line will be displayed (inverse bar of maximum input length) - -<b>r</b> a carriage return / line feed pair will be appended to this field - in the data buffer. Only use this field if you want the data buffer - or file to be more readable. All data is on one line otherwise. - -<b>x</b> maximum string length allowed (required for non-template 's' mode) - -<b>n</b> minimum string length allowed (only applicable with 's' input mode) - - -<b>str</b> 1: in 's' modes, a template string that defines what will be displayed - at the prompt and what type of characters the user can input. All - characters other than 'N', 'A' or '!' are printed at the prompt. - Occurances of 'N', 'A' or '!' define which type of character the user - can input for each character position. 'N' allows the user only to - enter a numeric character, 'A' allows only alphabetic, and '!' allows - any character. Popular templates are "NNN-NNN-NNNN" for phone number - input or "NN/NN/NN" for date input. - - 2: in 'c' modes, a string that defines which characters the user will - be allowed to input (not case sensitive), usually used for multiple - choice answers. Most common allowed characters are "ABCD..." or - "1234...". If this string is specified in 'c' input mode, 'u' and 'n' - have no effect and input will be converted to uppercase automatically. - -<b>Example 1:</b></pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> - <pre><BOT> -Enter string: <EOT>sulr8.3</pre> - </td> - </tr> -</table> -<pre>Prints the prompt, "Enter string: ", then a line of 8 blue spaces -(an input bar, if you like), would convert all of user's input to uppercase, -allow the user to input a maximum of eight characters, a minimum of three and -append a CRLF onto the end of the data field. - -<b>Example 2:</b></pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> - <pre><BOT> -A> First Answer -B> Second Answer -C> Third Answer</pre> - <pre>Which: <EOT>c"ABC"</pre> - </td> - </tr> -</table> -<pre>Prints "A> First Answer" "B> Second Answer" etc... then allows the -user to input one character, either A,B, or C. No other characters will be -accepted as input. - -<b>Example 3:</b></pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> - <pre><BOT> -Enter phone number: <EOT>s"NNN-NNN-NNNN"</pre> - </td> - </tr> -</table> -<pre>Prints "Enter phone number: ", then allows the user to input only -numbers in the 'N' character positions, and automatically skips over the -'-' characters. - - -See <b>EXAMPLE.SIF</b> in the <b>SBBS\TEXT</b> directory for more information.</pre> -<h2><a name="GURU.DAT">[17.5] - GURU.DAT</a></h2> -<pre>The Synchronet Guru is an artificial intelligence engine that users can chat -with for entertainment or educational purposes. You may wish to fool the users -into believing the guru is a live human, or tell them up-front that it's just -a program. - -You may have up to 500 different guru available to chat with on your BBS, -each with its own "personality" and "intelligence". You add additional gurus -in SCFG->Chat Options->Artificial Gurus. You can specify access requirements -(see the ARS chapter for details) for each guru, allowing you to have specific -gurus for different groups of users or allow users to choose which guru they -want to chat with. - -The gurus of your BBS can be "taught" to respond to keywords and phrasing that -your users use when chatting with him. The default guru's "brain" is a file -named GURU.DAT that is kept in the CTRL directory. It is a special data file -that contains logic expressions and lists of responses. Before you edit the -GURU.DAT file, be sure you understand exactly what you are doing, as the neuro -system that interprets the GURU.DAT file does not handle syntax errors very -well. The basic structure of the GURU.DAT is as follows: - -<b>(expression) -response -response -(expression) -response -response -() -response -response -response</b> - -You may include as many Expression/Response sets as you like, as long as -the file size does not exceed 64k or the amount of available memory. -Each expression contains one or more string of characters that The Guru may -respond to and logic operators. The string must be in all uppercase and may -not contain the following characters: ~^|&() - -If the expression just contains one string (e.g. (HELLO)) and that string is -used in the users input, The Guru will pick a random response from the list -that follows that expression. The Guru will only use one response for each -line input by the user, so as soon as a "true" expression is encountered, a -response is made and the evaluation of the user's line is complete. - -All expressions are evaluated from the top of the file down, so if a true -expression is encountered toward the top of the file, all of the remaining -expressions are ignored until the next evaluation. Notice that the last set of -responses is preceded by a pair of empty parenthesis. This is an "always true" -expression and should always be the last expression in the file. Omitting this -fall-through expression is a syntax error. If all the previous expressions are -evaluated as false, then a response will be picked from the set following the -fall-through expression. - -The simplest form of an expression is just a string of uppercase letters (with -or without spaces). If the string is followed by a tilde '~', the string will -be evaluated as true even if the string is embedded in another string (e.g. if -the user types "XhelloX", an expression of (HELLO) would evaluate as false, but -an expression of (HELLO~) would evaluate as true). - -You can also specify that the string must be the beginning of the users input -line by following the string with a caret '^'symbol (e.g. if the user types -"I said, Hello!", an expression of (HELLO) would evaluate to true, but an -expression of (HELLO^) would be false). - -An expression can contain multiple strings connected with logic symbols. The -valid logic symbols are & (and) and | (or) (e.g. if you have the expression -(HELLO&GURU) the user must type both "hello" and "guru" in the input line in -order for the expression to be true. If you have the expression (HELLO|HI), it -will be evaluated as true if the users includes either "hello" or "hi" in his -input string). Nested evaluations are supported (e.g. the expression, -(GURU&(HELLO|HI)) will evaluate as true if the user inputs either "guru" and -"hello", or "guru" and "hi"). - -Expressions may also contain AR strings within square brackets ([ and ]). The -expression (HELLO&GURU&[LEVEL 20]) would evaluate as TRUE only if the user -typed the words "HELLO" and "GURU" and had a level of 20 or higher. See the -ARS chapter for details on the AR string syntax and possible keywords. - -<b>RESPONSES:</b> - -Each expression can be followed by up to 100 responses and each response can -be up to 512 bytes long. Responses can not contain the characters ( or ) and -may only span several lines if the last character of each continued line is a -back-slash '\'. Responses are picked at random from the group below the first -expression that is evaluated as true. The more responses you have to each -expression, the less likely The Guru is to repeat himself. The Guru can also -respond with information about the current user or perform an action. To -initiate these special responses, you must precede a valid response variable -with a back-quote (`) character. The valid response variables and their -definitions are as follows: - -A User's alias (name, if Aliases not allowed) -B User's birth date -C User's computer type -D User's download bytes -G Guru's name -H Hang up on the user (immediately) -I System's QWK ID -J Current day of the month -L User's security level -M Current month -N User's note (location, if Aliases not allowed) -O Sysop's name -P User's phone number -Q Quit chat -R User's real name (address, if Aliases not allowed) -S System name -T Current time -U User's upload bytes -W Current day of the week -Y Current year -Z User's zip/postal code -$ User's credits -# User's age -! Toggle The Guru's typing mistakes Off/On -_ Pause in response - -Three of the above response variables only have effect when the user is -chatting with The Guru in the "Local" mode and not from multinode chat. These -are the 'Q'uit chat (which is the only means of the exiting without hitting -Alt-G locally), '!' Toggle typing mistakes, and '_' pause in response. - -e.g. The expression/response pair: - -<b>(HELLO) -Hello there, `a...</b> - -would display "Hello there, Joey..." if Joey were to say "hello" to The Guru. - -See <b>CTRL\GURU.DAT</b> for more detailed examples of GURU.DAT programming.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/default.htm b/docs/default.htm deleted file mode 100644 index 8a46a3538b..0000000000 --- a/docs/default.htm +++ /dev/null @@ -1,8 +0,0 @@ -<!-- This is for http servers that default to default.htm --> -<html> - -<head> -<meta http-equiv="refresh" content="0; URL=index.htm"> -</head> - -</html> \ No newline at end of file diff --git a/docs/exebbs.bat b/docs/exebbs.bat deleted file mode 100755 index a3576af977..0000000000 --- a/docs/exebbs.bat +++ /dev/null @@ -1,30 +0,0 @@ -@echo off -rem *************************************************************************** -rem EXEBBS.BAT for use with FrontDoor and Synchronet BBS v1c -rem if using with InterMail, change all "FD"s to "IM"s -rem *************************************************************************** - -rem *************************************************************************** -rem Drive where this Synchronet node is installed -rem *************************************************************************** -c: -rem *************************************************************************** -rem Directory for this node -rem *************************************************************************** -cd \sbbs\node1 -rem *************************************************************************** -rem You probably don't want to mess with this line -rem *************************************************************************** -call sbbs qc%1 e%3 -rem *************************************************************************** -rem Drive where FrontDoor is installed -rem *************************************************************************** -c: -rem *************************************************************************** -rem Change directory to FrontDoor system directory -rem *************************************************************************** -cd \fd -rem *************************************************************************** -rem Call MAILER.BAT so we go full-circle -rem *************************************************************************** -mailer diff --git a/docs/external_programs.html b/docs/external_programs.html deleted file mode 100644 index 2032c8554c..0000000000 --- a/docs/external_programs.html +++ /dev/null @@ -1,568 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>External Programs</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2><a name="ExternalProgramConfiguration">[12.0] - External Program -Configuration</a> - -</h2> -<pre>Selecting the External Programs option from the SCFG will bring you to the -following sub-menu, an explanation of the options shown here follow.</pre> -<h2><img border="0" src="images/scfg_xtrn_section.gif" width="572" height="331"><br> -<br> -<a name="FixedEvents">[12.1] - Fixed Events</a> - -</h2> -<pre><img border="0" src="images/scfg_xtrn_fixed.gif" width="572" height="331"> - -<b>Logon Event:</b> - This is the command line for a program that will execute during the - logon sequence of every user. The program cannot have user interaction. - The program will be executed after the LOGON message is displayed and - before the logon user list is displayed. If you wish to place a program - in the logon sequence of users that includes interaction or requires - account information, you probably want to use an online external - program configured to run as a logon event. - -<b>Logoff Event: -</b> This is the command line for a program that will execute during the - logoff sequence of every user. This program cannot have user - interaction because it is executed after carrier is dropped. If you - wish to have a program execute before carrier is dropped, you probably - want to use an online external program configured to run as a logoff - event. - -<b>Daily Event: -</b> This is the command line for a program that will run after the first - user that logs on after midnight, logs off (regardless of what node).</pre> -<h2><a name="TimedEvents">[12.2] - Timed Events</a> - -</h2> -<pre>Selecting Timed Events from the External Programs menu will give you a list of -currently configured timed events. Following is an example of a timed event -called MAIN, and the options available for timed events.</pre> -<pre><img border="0" src="images/scfg_xtrn_timed.gif" width="572" height="331"></pre> -<pre><b>Internal Code: -</b> This is an internal code for SBBS to distinguish this event from - the others on the system. This must be a unique name of up to 8 valid - DOS filename characters. - -<b>Start-up Directory: -</b> This is the directory where the event execution should take place. - Synchronet will change to this directory before executing the command - line for this event. - -<b>Command Line: -</b> This is the command line for a program that will run on the specified - times and days. - -<b>Execution Node: -</b> This is the node that will execute the event. - -<b>Execution Days: -</b> These are the day(s) when this timed event will be executed. - -<b>Execution Time: -</b> This is the time (in 24hr format) for the above mentioned program - to execute. - -<b>Requires Exclusive Execution: -</b> You may set this event to run exclusively (all other nodes inactive - or taken offline) by selecting this option. - -<b>Force Users Off-line For Event: -</b> Setting this to Yes will cause the BBS to force users offline for this - event.</pre> -<h2><a name="GlobalSwapList">[12.3] - Global Swap List</a> - - <b><i><font color="#FF0000">(v2 for DOS Only)</font></i></b> - -</h2> -<pre><img border="0" src="images/scfg_xtrn_swaplist.gif" width="572" height="331"> - -This is a list of programs which, when run, will cause Synchronet to swap out -of memory. This is useful for large executables, or programs which have the -possibility of Utilitizing a large amount of memory. Shown is an example of -what might be in your swap list. Notice that it is not necessary to specify -an extension for the programs unless an extension is specified on the command -line to be executed. If a file extension is specified (EXE, COM, or BAT) -the extension must be specified on the command line for the program to be found -in the swap list.</pre> -<h2><a name="Native32bitProgramList">[12.4] - Native (32-bit) Program List</a> - -</h2> -<pre><img border="0" src="images/scfg_xtrn_winos2list.gif" width="572" height="331"><u> -</u> -When running a node with Synchronet for OS/2 or Win32, all external programs -(doors, editors, file viewers, etc) will be assumed DOS programs and executed -inside a virtual DOS machine (VDM) automatically unless the program's name is -included in this list. Only CMD.EXE (OS/2 command interpreter) should be -included with an extension (e.g. .EXE) unless you actually configure your -external program command lines in SCFG with extensions (note ZIP and UNZIP do -not have specified extensions). All native Win32 and OS/2 programs that you -wish to execute from the BBS must be added to this list.</pre> -<h2><a name="ExternalEditors">[12.5] - External Editors</a> - -</h2> -<pre>This selection will bring up a list of external editors that are available as -alternatives to the Synchronet built-in editor. Editors can be added and -deleted with the INS and DEL keys. Selecting an editor allows you to view and -edit its settings. The available settings are (example given is for SyncEdit):</pre> -<pre><img border="0" src="images/scfg_xtrn_syncedit.gif" width="572" height="331"></pre> -<pre><b>Internal Code: -</b> This is an internal code for SBBS to distinguish this editor from - the others on the system. This must be a unique name of up to 8 valid - DOS filename characters. - -<b>Local Command Line: -</b> This is the command line to use when the user is online locally. - -<b>Remote Command Line: -</b> This is the command line to use when the user is online remotely. - -<b>Access Requirements: -</b> These are the requirements that a user must meet to be able to use - this external editor. - -<b>Intercept I/O Interrupts: -</b> If the editor relies on Synchronet for intercepting I/O interrupts, - this option should be set to Yes. When set to Yes, you will be able - to specify whether or not the editor uses WWIV color codes. - -<b>Quoted Text: -</b> If you want all the message text to be automatically entered into the - message edit/quote file (INPUT.MSG or MSGTMP), set this option to - 'All'. - - If you want the user to be prompted for which lines to quote before - running the editor, set this option to 'Prompt User'. - - If you want none of the lines to be automatically quoted, set this - option to 'None'. This option is mainly for use with editors that - support the QUOTES.TXT drop file (like SyncEdit v2.x). - -<b>QuickBBS Style (MSGTMP): -</b> If this editor was designed to run on QuickBBS, Remote Access, or - SuperBBS (uses a MSGTMP file for editing), set this option to Yes. - This option will also create a MSGINF file automatically as well. - -<b>Expand Line Feeds to CRLF: -</b> If this editor stores new lines as a single line feed character, set - this option to Yes. - -<b>BBS Drop File Type: -</b> If this editor requires a BBS drop file (DOOR.SYS, DORINFO#.DEF, etc) - use this option to select the drop file format.</pre> -<h2><a name="OnlinePrograms">[12.6] - Online Programs</a> - -</h2> -<pre>This selection will generate a list of configured external program sections. -You can add and remove external program sections from this list with the INS -and DEL keys. To edit an external program section or the external programs -within that section, select it with the arrow keys and hit ENTER. - -<a name="DropFiles">For</a> each external program section, you can set the Name, Internal Code, -and Access Requirements. Selecting "Available External Programs" will give -a list of external programs contained in this external program section. -Synchronet has been designed to eliminate the need for batch files and -drop file conversion programs to run external programs (doors) on your BBS. -Synchronet supports many different drop file types (often referred to as -drop files) listed below.</pre> -<h3><a name="SupportedDropfileTypes:">[12.7] - Supported Dropfile Types:</a> - -</h3> -<pre>Software Write File(s) Read File(s) -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -DOOR32 <b><font color="#FF0000">(v3+ Only)</font></b> DOOR32.SYS -GAP DOOR.SYS DOOR.SYS -WWIV CHAIN.TXT -PCBoard 14.x PCBOARD.SYS and USERS.SYS USERS.SYS -RBBS/QuickBBS DORINFO#.DEF and EXITINFO.BBS EXITINFO.BBS -Wildcat! 2.x CALLINFO.BBS -SpitFire SFDOORS.DAT -TriBBS TRIBBS.SYS -MegaMail UTIDOOR.TXT -Solar Realms DOORFILE.SR -Synchronet XTRN.DAT MODUSER.DAT</pre> -<h2><a name="Call-backVerifiers">[12.8] - Call-back Verifiers</a> - -</h2> -<pre>Call-back verification and user upgrade programs for other BBS packages may be -used, as long as the program supports the DOOR.SYS, EXITINFO.BBS, USERS.SYS, -or MODUSER.DAT file format. In general, Call-back verifiers written for -PCBoard, GAP, QuickBBS, or Synchronet will work. To allow a program to modify -the user data, you must set the option "Modify User Data" to "Yes". The -following user data items may be updated with the following formats: - -DOOR.SYS: Security level, Flag Set #1, Expiration Date, Minutes, - Total Files/Bytes Downloaded, and Credits -EXITINFO.BBS: Security level and Flag Set #1 -USERS.SYS: Security level and Expiration Date -MODUSER.DAT: Security level, Flag Set #1-#4, Exemptions, Restrictions, - Expiration Date, Credits, and Minutes</pre> -<h2><a name="InstallingNewExternalProgram">[12.9] - Installing a -New External Program</a> - -</h2> -<pre>Install your new external program into a sub-directory off your XTRN directory. - -Example: C:\SBBS\XTRN\TRADEWAR - -If your program asks you to provide the directory where the BBS software is -installed or where the drop file will be located, enter the directory where -you have installed the program (C:\SBBS\XTRN\TRADEWAR). Note: this is usually -only required for programs that do NOT support multiple nodes. - -The full path and file name of the drop file can be specified on the command -line by using the %f command line specifier in SCFG.</pre> -<h2><a name="ConfiguringNewExternalProgram">[12.10] - Configuring -a New External Program</a> - -</h2> -<pre>Run SCFG from any NODE directory (or hit 'C' at the Waiting For Call screen). -Select "External Programs" and hit enter. Hit END and ENTER for the External -Program Sections menu and select an External Program Section to add this -new program to. Select "Available External Programs" and hit the Insert key. -Enter a description for your new external program. - -Now your new external program appears in the list. Hit ENTER to edit the -configuration for this program. Synchronet BBS List is given as an example.</pre> -<pre><img border="0" src="images/scfg_xtrn_sbl.gif" width="572" height="331"> - -<b>Name:</b> - This is the name of the external program that will be shown to users. - -<b>Start-up Directory: -</b> The start-up directory will be the current directory when the program - is started. Move the lightbar down to "Start-up Directory" and hit - ENTER. Enter the path to the directory where you've installed the - program. - -<b>Command Line: -</b> This is the command required to execute your external program. If the - path and filename for the BBS drop file is required on the command - line, use %f to represent the path and filename. See Appendix A for - a full list of available command line specifiers. - - You can launch a Baja module in place of a DOS executable by prepending - an asterisk (*) to the name of the Baja module (e.g. "*MYMOD"). The - module .BIN file must be located in your EXEC directory. - - Some programs, when set to SWAP, require ".\" to be prepended to the - command line (e.g. ".\MYDOOR") to function properly. - -<b>Clean-up Command Line: -</b> If your external program requires a clean-up command line (usually only - multi-user programs), select "Clean-up Command Line" and enter the - required command line for your program. Note: Most programs do NOT - require this option. - -<b>Cost in Credits: -</b> If you wish your users to be charged credits when running this program, - you should enter the amount to charge the users here. Users with the - 'X' exemption will not be charged. - -<b>Extra Minutes: -</b> This option will allow you to give extra time to users for use in the - external program they are entering. For example, with this option set - to 10, a user having 15 minutes left on the BBS will end up having - 25 minutes in the external program they enter. This is especially - useful in conjunction with the 'Suspended (Free) Time' option. - -<b>Suspended (Free) Time: -</b> Setting this option to "Yes" will cause a user's time left online to - suspend (not countdown) when they enter the external program. The - user's time allowed in the external program, however, will be what they - had left on the BBS. To give them more time in the external program, - use the above 'Extra Minutes' option. - -<b>Access Requirements: -</b> If you wish to limit which users have access to (can see) this program, - use this option to set those requirements. - -<b>Execution Requirements: -</b> If you wish to have some users see but not be able to execute this - program, use this option to determine what requirements must be met to - run the program. - -<b>Multi-user: -</b> If this program supports multiple simultaneous users, set this option - to "Yes". - -<b>Intercept I/O Interrupts: -</b> If this program does NOT have it's own modem communications I/O and - does NOT use a FOSSIL driver, select "Intercept I/O Interrupts" and set - it to "Yes". Note: Most programs require this option be set to "No". - Programs written specifically for WWIV or Synchronet BBS software, - should usually have this option set to "Yes". Consult the documentation - for the program if you are unsure. If you do set this option to "Yes", - and the program was not written specifically for Synchronet, you'll - need to place the following string at the BEGINNING of your command - line: "%!dcdwatch %&". You will also be able to select whether or not - the program uses WWIV color codes when setting this option to Yes. - - Without the use of DCDWATCH, the program will not exit if a user drops - carrier (hangs up) while using the program (unless specifically written - for Synchronet). Some programs time-out eventually, and exit back to - the BBS, but not all. - -<b>Swap BBS out of Memory:</b> - If this program requires a large amount of free memory, set this - option to 'Yes' and Synchronet will swap to XMS, EMS, Extended - Memory or Disk (see "Node Toggle Options" for Swap Type selection) to - make room for this program to execute. Setting this option to 'Yes' - has this same effect as adding this program to the "Global Swap List", - but is available as a toggle on this menu for your convenience. - -<b>Modify User Data:</b> - If this program can modify the current user's data through one of the - supported drop file types (see Call-back Verifiers above), set this - option to Yes. - -<b>Execute on Event:</b> - If you want this program to run automatically during user logon, - logoff, new user application, or a user's birthday, use this option. - -<b>BBS Drop File Type:</b> - If your program requires a BBS drop file (most do), use this option to - select the type of drop file to create. - -<b>Place Drop File In:</b> - This is the directory where the drop file will be created. In general, - for multi-user programs or programs that can have the path and filename - of the drop file included on the command line or in a config file, - select "Node Directory". For single user programs that require the drop - file to be in the current directory, select "Start-up Directory". - -<b>Time Options...:</b> - Selecting this option will bring you to a sub-menu similar to the - following:</pre> -<blockquote> - <blockquote> - <pre><img border="0" src="images/scfg_xtrn_timeopt.gif" width="572" height="331"></pre> - </blockquote> -</blockquote> -<pre><b> Extra Time: -</b> This option allows you to give users an extra amount of time - (in minutes) which can be used only within this online program. - -<b> Maximum Time: -</b> This option allows you to set the maximum amount of time a user - should be able to spend in this online program (in minutes) PER - execution (not per day or per call). - -<b> Suspended (Free) Time: -</b> When this option is set to 'Yes', a users' time is suspended - while they are within the online program. That is, if they - enter the door with 60 minutes remaining on the BBS, when - they get back to the BBS they will still have 60 minutes of - time remaining.</pre> -<h2><a name="ExampleDoorGameSetups">[12.11] - Examples -for some popular programs</a> - -</h2> -<pre>It is advised to install all your doors off the SBBS\XTRN directory -(e.g. C:\SBBS\XTRN\BRE) if it's not too late. This will help keep all -your doors in an easy to reference point. Also, this is where the -pre-configured doors (SBL,SMM) are installed by default.</pre> -<pre>When configuring your Doors it is best whenever possible to place the -dropfiles in your SBBS\NODE# directories and configure the game to -look there for the file. This ensures smooth Multinode usage if your -door supports multiple users at the same time.</pre> -<h3><a name="LORD">[12.11.1] - Legend -of the Red Dragon (LORD)</a> - -</h3> -<pre>From the LORDCFG program your configuration should look something like this:</pre> -<pre><img border="0" src="images/lordcfg.gif" width="572" height="331"></pre> -<pre>You will need to do this for each of your nodes. Be sure to set the 'Path -To Drop File' to the node directory of the node you are configuring. The -reason we set the 'Locked Port Speed' to 'Port Not Locked' is because you -should be locking the speed of your FOSSIL when you load it, once that's done, -it can't be altered.</pre> -<pre>*** Be Sure to edit <b>START.BAT</b> and check for proper paths and filenames!</pre> -<pre>Now go into your SCFG program and create a new external program. It should -look like this when it's all setup:</pre> -<pre><img border="0" src="images/scfg_xtrn_lord.gif" width="572" height="331"></pre> -<h3><a name="Usurper">[12.11.2] - Usurper</a></h3> -<pre>You MUST use a fossil driver in order to use this program. Follow the Usurper -documentation for getting the game going. </pre> -<pre>Next, bring up the USURPER.CFG into a text editor and edit the first few lines -(or you can do it through the EDITOR program that comes with Usurper). It -should end up looking something like this:</pre> -<table border="0" cellpadding="3" cellspacing="3" width="70%" bgcolor="#CCCCCC"> - <tr> - <td width="100%"> - <pre>Sysop Name Goes Here -BBS Name Goes Here -C:\SBBS\XTRN\USURPER\ -DORINFO1.DEF</pre> - </td> - </tr> -</table> -<pre>The important things are line 3 and line 4. Line 3 MUST be the path to your -Usurper directory (with a trailing backslash) and line 4 must be the type -of drop file (I used DORINFO1.DEF like the Usurper documentation recommends). - - Now you'll need to go into your SCFG program and add an external program. -Set it up to look something like this:</pre> -<pre><img border="0" src="images/scfg_xtrn_usurper.gif" width="572" height="331"></pre> -<h3><a name="TradeWars2002">[12.11.3] - Trade Wars 2002</a></h3> -<pre>From the TEDIT program your configuration should look something like this:</pre> -<pre><img border="0" src="images/tw2002.gif" width="572" height="331"></pre> -<pre>You will need to do this for each of your nodes. Be sure to set the 'Path -To Drop File' to the node directory of the node you are configuring. - -Now go into your SCFG program and create a new external program. It should -look like this when it's all setup:</pre> -<pre><img border="0" src="images/scfg_xtrn_tw2002.gif" width="572" height="331"></pre> -<h3><a name="BRE">[12.11.4] - Barren Realms Elite (BRE)</a></h3> -<pre>Install and Configure BRE per the instructions in the BRE documentation.</pre> -<pre>Now go into your SCFG program and create a new external program. It should -look like this when it's all setup:</pre> -<pre><img border="0" src="images/bre.gif" width="572" height="331"> - -BRE and the other SR / John Daily games are easy with Synchronet since -it supports SR Games native DOORFILE.SR . Just place the DOORFILE.SR -in BRE's directory and all is well.</pre> -<pre>** Note: BRE is not Multiplayer and can only be used on one node at a time. - However, we can leave Allow Multiple Users ON in SCFG as BRE will - inform the player the game is in use by itself.</pre> -<h2><a name="InternalGateways">[12.12] - Internet Gateways</a></h2> -<pre>This allows users on your system to be connected to other TCP/Telnet services -on the Internet through your BBS. Typically, these services would be other -telnetable BBSs and MUDs, although really, you can gate to any single-port -TCP service (i.e. POP3, but not FTP).</pre> -<pre><b>TELNET_GATE <"str" || str_var> [mode]</b></pre> -<pre>The str or str_var argument is the destination address in the format:</pre> -<pre> <b><addr>[:port]</b></pre> -<pre>If port is not specified, the default is 23 (telnet), or 513 (when the -<b>TG_RLOGIN</b> mode is used).</pre> -<pre>Examples:</pre> -<pre> "<i>vert.synchro.net</i>" - "<i>24.0.193.46</i>" - "<i>retromud.org:3000</i>"</pre> -<pre>The valid mode bits (multiple may be <b>|</b>'d together) are:</pre> -<pre> <b>TG_ECHO</b> Turn on telnet echo - <b>TG_CRLF</b> Expand sole CR to CRLF - <b>TG_LINEMODE</b> Send entire lines only - <b>TG_NODESYNC</b> Call Nodesync, get msgs, etc. - <b>TG_CTRLKEYS</b> Interpret ^P ^U ^T, etc locally - <b>TG_PASSTHRU</b> Pass-through telnet commands/responses - <b>TG_RLOGIN</b> Use BSD <i>RLogin</i> protocol - -This function can be called from any module or shell, but will most likely be -used from the external programs menu (even though the telnet gate isn't -technically an external program). The following modules are included (in your -<b>EXEC</b> directory): <b>TELGATE.BIN</b>, <b>MUDGATE.BIN</b>, <b>UNIXGATE.BIN</b>, and <b>RLOGIN.BIN</b>. -Use them as follows:</pre> -<pre> To set-up an external gateway to another BBS:</pre> -<pre> Command line: "<b>*telgate vert.synchro.net</b>"</pre> -<pre> To set-up an external gateway to a MUD:</pre> -<pre> Command line: "<b>*mudgate batmud.bat.org</b>"</pre> -<pre> To set-up an external gateway to a Trade Wars Game Server (TWGS):</pre> -<pre> Command line: "<b>*rlogin twgs.someserver.com"</b></pre> -<pre>While using the telnet gateway (and not currently in telnet "Binary" mode), -users can press ctrl-] for a menu of telnet gate commands including: Disconnect, -Toggle Echo, List Users, and Private Message.</pre> -<h2><a name="TroubleshootingExternalPrograms">[12.13] - Troubleshooting -External Programs</a></h2> -<pre> This section will explain common reasons why an external program may not be -functioning properly and what can be done to get the program functioning -properly. It is impossible for Digital Dynamics to be familiar with every -available external program, therefore if you continue to have problems with -a program after reading this section, you should contact the company that wrote -the external program you are working with. - -IMPORTANT NOTE: Some games will not work properly if you do not put a PATH on - the command line (see the L.O.R.D. example), others will (see - the Usurper example). If your game is not working at all, - try using a path on the command line (e.g.: .\GAMENAME). - -PROBLEM : The external program works, but displays the wrong user name. -SOLUTION: Check to see that the program is looking in the proper place for the - drop file. Usually you will need to specify the path to look for the - drop file on the command line or in the program's setup program or - config file(s). - -PROBLEM : The program works fine locally, but when people call in they cannot - see anything. -SOLUTION: If the game uses a FOSSIL driver, make sure that you have a FOSSIL - driver loaded and make sure that you've locked the baud rate at the - same rate that you've locked Synchronet's com ports. - If the game uses it's own internal com routines (no FOSSIL required), - you should be able to pass it IRQ and I/O Address information (either - through configuration files, or on the command line) otherwise the - game probably will not work on anything other than the standard COM1 - and COM2. -NOTE : Normally only games written for Synchronet or WWIV will ever require - the 'Intercept I/O Interrupts' option to be set to YES. If a game - has it's own internal com routines or uses a FOSSIL set this option - to NO. - -PROBLEM : The program works fine locally, but when people call in they only see - garbled information. -SOLUTION: If the game is using a FOSSIL driver, make sure the locked rate of - the FOSSIL is the same as the locked rate in Synchronet. - If you are running Synchronet under OS/2 and you have "Intercept I/O" - set to "Yes" for this program, make sure you are using the SVDMANSI - program for ANSI under OS/2. - -PROBLEM : The program works fine when only one user is playing, but when a - second user tries to enter it doesn't function properly. -SOLUTION: The program is probably not intended for multiple simultaneous users. - Be sure to set the 'Multiple Concurrent Users' option to NO if this - is the case.</pre> -<p> <a href="#top"><b>Back to Top</b></a></p> -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/features.html b/docs/features.html deleted file mode 100644 index c25bab1fc0..0000000000 --- a/docs/features.html +++ /dev/null @@ -1,313 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Features</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><b><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></b></p> - -<h2>Synchronet Features</h2> - -<h3>General</h3> - -<ul> - <li>Designed from the ground up as a reliable and feature rich multi-node BBS</li> - <li>Up to 250 simultaneous nodes with multi-node chat and external program - (door) support</li> - <li>Sysop inter-node control (remote or local):<br> - Interrupting - hang up on any node<br> - Locking - only sysops can logon a locked node until the - lock is removed<br> - Rerunning - re-executes BBS, reinitializing - configuration, etc.<br> - Downing - shutdown a node from another remote node or - local console</li> - <li>Real-time user database:<br> - Amazingly complete user edit function<br> - Remote changes to online-user data are immediately - effective<br> - Disk image is always current for enhanced system fault - tolerance<br> - Linked free-form data file for every user<br> - International address and phone number support</li> - <li><i><b>RIPscrip</b></i> and <i><b>WIP</b></i> graphical user interfaces and - mouse support!</li> - <li>Online, sysop configurable, chatting artificial intelligence engine<br> - Multiple personalities available for your users to experience</li> - <li>Pay BBS features:<br> - Time credits, user expiration dates, credits, and 900/976 billing</li> -</ul> -<h3>Security</h3> -<ul> - <li><i><b>ARS</b></i> (<i>Access Requirement String</i>) security provides the - most flexible, comprehensive, and user friendly security available in the - BBS software industry</li> - <li>Post/Call ratio, connect rates, time of day, and other user data fields - can be elements of any <i>ARS</i> security field</li> - <li>Impenetrable to remote hackers</li> - <li>100 security levels with 104 sysop configurable flags per user</li> - <li>Sysop can allow or disallow users to choose their own passwords</li> - <li>Sysop can force periodic password changes (uniqueness is also forced)</li> -</ul> -<h3>Customization</h3> -<ul> - <li> -<p>Programmable Command and Menu Structure:<br> -Includes free Baja shell/module compiler<br> -Users can select a shell of their choice including emulations of other BBS -packages<br> -Several shells included with Baja source code</p> - </li> - <li><p>The most configurable BBS available today:<br> - Powerful object oriented menu driven configuration program<br> - All menus, text, and colors are sysop configurable without source code<br> - New User Questionnaire is available and customizable<br> - All standard new user questions can be disabled individually<br> - Over 120 <a href="http://customization.html#MessageVariables">message - variables</a> (@-Codes) supported</p> - </li> -</ul> -<h3>Messaging</h3> -<ul> - <li><p>Hierarchical bi-level message areas with an unlimited number of - messages groups and an unlimited number of sub-boards within each group</p> - </li> - <li> -<p>QWK message off-line reader and networking support built-in<br> -Off-line file requests<br> -Off-line new message scan configuration and pointer adjustment<br> -Send <i>FidoNet</i> or Internet NetMail from QWK REP packet<br> -32-bit CRC duplicate message checking<br> -Multiple compression formats supported<br> -File attachments optionally automatically included</p> - </li> - <li> -<p>Inter-node message services:<br> -Current node status - user online, action, connect rate, and more<br> -User activity - credited downloads, mail activity, logons, and logoffs<br> -Users can list active nodes and send private messages from any prompt<br> - (even between external programs and the BBS)<br> -Multi-channel multi-node chat with optional channel password protection<br> -Private real-time node to node character by character chat with remote split -screen support<br> -Users can send telegrams, single line messages, or enter private chat from any -prompt<br> -User information (gender, age, location, etc) can be included in node status -display</p> - </li> - <li><p>Extensive networking capabilities:<br> - Internal QWK network hub and node support with file transfer ability<br> - <i>FidoNet</i> EchoMail and NetMail support<br> - Send/Receive File Requests from within Synchronet<br> - UTI drivers for <i>PostLink</i> Networks (RIME, ILink, etc)<br> - Sub-boards can force real names<br> - Allow/disallow/force private posts and anonymous posts per sub-board<br> - Supports color codes for <i>WWIV</i>, <i>PCBoard</i>, <i>Wildcat</i>, and <i>Celerity</i><br> - Support for multiple networks of the same or different network technologies - with different addresses and tag/origin lines<br> - Duplicate message checking using 32-bit CRC for QWK and <i>Fido</i> Networks</p> - </li> -</ul> -<h3>File Transfers</h3> -<ul> - <li>Unlimited external transfer protocols with optional DSZLOG support</li> - <li>Batch uploads, downloads, and bidirectional file transfers</li> - <li>Transfer credit system is completely configurable</li> - <li>File viewing, extraction, and partial downloading of archives</li> - <li>Content rating, multi-disk numberings, and file upload dates can - automatically be added to file descriptions</li> - <li><i><b>FILE_ID.DIZ </b></i>and <i><b>DESC.SDI</b></i> files can be - automatically imported into extended file descriptions</li> - <li>Personal user to user file transfers</li> - <li>Optional batch download file flagging for user convenience</li> - <li>Support for offline directories</li> - <li>Multiple sysop file removal/move/edit search criteria</li> - <li>Directories can be sorted by filename or date, ascending or descending</li> - <li>Complete CD-ROM (single and multi-disk changer) support</li> - <li>Optional forced upload directory can be invisible to users</li> - <li>Optional allowance of blind (unsolicited) batch uploads with automatic DIZ - importation</li> - <li>Download events available for adding files/comments just before download - (i.e. CD-ROM)</li> -</ul> -<h3>External Programs/Doors</h3> -<ul> - <li>Unlimited number of external programs</li> - <li>Multi-user or single user programs</li> - <li>Programs that use DOS I/O (don't use COM port directly) supported</li> - <li>12 door file formats supported for an incredible level of compatibility - including: <b><i> </i></b> <b><i><br> - DOOR.SYS</i></b>, <i><b>PCBOARD.SYS</b></i>, <i><b>USERS.SYS</b></i>, <i><b>CHAIN.TXT</b></i>, - <b><i>DORINFO#.DEF</i></b>, <i><b>EXITINFO.BBS</b></i>, <i><b>SFDOORS.DAT</b></i>, - <i><b>TRIBBS.SYS</b>,</i> <b><i>CALLINFO.BBS</i></b>, <i><b>DOORFILE.SR</b></i>, - and <i><b>UTIDOOR.TXT</b></i></li> - <li>Supports native <i><b>WWIV</b></i> color code expansion</li> - <li>Free Software Development Kit (SDK) available for program development</li> - <li>Comes with multiplayer Synchronet Blackjack game (with C source code)</li> - <li>No batch file editing/programming necessary!</li> - <li>Configurable credit cost on a per program basis</li> - <li>Separate access requirements to see the program and execute</li> - <li>Multiple Timed and Fixed Events:<br> - Logon and logoff events<br> - New user events<br> - Upload events (integrity testing, adding of comments, - virus scan, etc.)<br> - Node and system daily events<br> - Timed events with support for forced exclusive execution</li> -</ul> -<h2><b><font color="#FF0000">Version 3 (for Win32) Features</font></b> -</h2> -<p><b>General</b> - -</p> -<ul> - <li>All "nodes" run in a single multi-threaded process<br> - - Minimal resource requirements and improved performance<br> - - DOS Windows are automatically opened/closed for external DOS - programs/doors<br> - - It's never been easier to run a 10+ node system (with DOS door - support) on one computer</li> - <li>Professional GUI <i>Synchronet Control Panel</i> (SBBSCTRL) to monitor all - clients and servers simultaneously<br> - - Replaces old "<i>Waiting for call</i>" screen<br> - - Launch configuration and editor dialogs directly<br> - - New Sysop Availability toggle button (replaces v2.3 Scroll-Lock - function)</li> - <li>GUI User Editor</li> - <li>Local and Remote Node Control/Spying</li> - <li>Optionally plays sysop's choice of <i><b>.WAV</b></i> file on user - connect/disconnect</li> -</ul> -<h3> -<b>Internet</b></h3> -<ul> - <li>Supports Telnet logins only (no more direct-dial user support)<br> - - No third-party FOSSIL/Telnet driver (SIO/VMODEM, NetModem, COM/IP) - required<br> - - Full FOSSIL/DOS/WWIV/XSDK program/door support (easy setup!)<br> - - Outbound Telnet module included for external MUDs/BBSs<br> - - Automatically detects and logs client IP and hostname<br> - - Optional auto-logon via IP address (requires V exemption)</li> - <li>Integrated FTP server<br> - - Supports Anonymous (Guest) logins<br> - - Virtual directory structure mimics BBS filebase hierarchy<br> - - User security settings enforced<br> - - Supports long/mixed-case filenames<br> - - Dynamically generates index (description) files<br> - - Supports blind upload and sysop directories<br> - - QWK/QWKnet packet uploads and downloads<br> - - Upload description support<br> - - Transfers included in BBS and user upload/download statistics<br> - - Time/Credit system enforced<br> - - Custom login/hello/goodbye messages<br> - - Optional connect/disconnect sounds (.WAV files)<br> - - File aliases supported<br> - Put links in your FTP root - directory to often access files<br> - Link to files on your local hard - disk or your BBS filebase<br> - Use general alias names to point - to often-changing versioned filenames<br> - - Complete access to local file systems for remote sysops</li> - <li>Integrated Mail (POP3/SMTP) server<br> - - Check BBS mailbox using standard Internet mail clients (Eudora, - Outlook)<br> - - SPAM Filters supported: RBL, RSS, DUL<br> - - Configurable alias list<br> - - Optionally receive mail by user number (1@yourbbs.com)<br> - - Optional inbound/outbound sounds (.WAV files)<br> - - Optional DNS/MX record lookup (no SMTP Relay Server required)</li> - <li>Outbound Telnet/RLogin gateway function to run external MUDs, BBSs, and - TWGS<br> - - Includes any-time ^] menu to see who is on the BBS, send messages, - etc.</li> - <li>IP/hostname filter/trashcan files (ip.can/host.can) for all Internet - servers/services</li> -</ul> -<h3>Online Programs</h3> -<ul> - <li>16-bit DOS Door Support<br> - - Windows 95/98/ME FOSSIL/DOS Interrupt driver (sbbsexec.vxd)<br> - - Windows NT/2000 FOSSIL/DOS Interrupt driver (sbbsexec.dll)</li> - <li>32-bit/WinSock Door Support<br> - - Duplicate socket handle passed in <b><i>DOOR32.SYS</i></b> drop - file (new standard)<br> - - Duplicate socket handle passed on command line via %H specifier<br> - - Support for external programs written with 32-bit XSDK (v3+)</li> - <li><p>Most popular DOS doors fully supported<br> - - Users can be ;INTERrupted while running ANY external program<br> - - Non-exclusive events do not take any nodes off-line<br> - - No more hassling with baud rates and initialization strings<br> - - DCDWATCH no longer necessary to support WWIV/DOS externals</p> - </li> -</ul> -<h2> -<b><font color="#FF0000">Version 2 (for DOS) Features</font></b> -</h2> -<ul> - <li>Enhanced <i>DESQview</i>, <i>Windows</i>, and <i>OS/2</i> operation modes</li> - <li>Runs under DOS 3.0 or higher on any 80x86 compatible computer with 450k - free RAM <br> - - BBS can shrink to 288 bytes to execute external programs</li> - <li>Interrupt driven COM I/O for the fastest through-put possible<br> - - even with multiple nodes per CPU via a DOS multi-tasker</li> - <li>Any COM port configuration supported (Intelligent and Non-Intelligent - Boards)<br> - - Direct UART support as well as DigiBoard, FOSSIL, and PC BIOS int - 14h drivers<br> - - Automatic modem configuration for most modem brands and types</li> - <li>DTE rates up to 115,200 baud</li> - <li>Caller-ID support with optional trash-can file</li> - <li>48 Local macros and sysop function hot-keys</li> -</ul> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/file_section.html b/docs/file_section.html deleted file mode 100644 index 9956dedeb3..0000000000 --- a/docs/file_section.html +++ /dev/null @@ -1,953 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>File Section</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> - -<h2><a name="FileTransferSection">[10.0] - File Transfer Section</a></h2> -<pre>The Synchronet file transfer section is used for transferring data and program -files between the BBS and the remote user. Files are stored in a logical -hierarchy of libraries and directories. A library is a group of directories -that contain files of a similar subject matter. - -An example file library/directory configuration: - -<b>Library Name Directory -</b>--------------------------------- -Main Text - Utilities - Business - Graphics - Games - Communications - Miscellaneous - -Adult Text - Animation - GIF files - TGA files - -DOS CD-ROM Utilities - Device Drivers - Business - Games - Communications - Programming - -Windows CD-ROM Utilities - BMP files - WAV files - Device Drivers - Games - Desktop Publishing - Fonts</pre> -<h2><a name="SettingUpFileTransferSection">[10.1] - Setting Up the File -Transfer Section</a></h2> -<pre>Run the SCFG utility, and select File Options from the menu. Following are -example screens and the options available from the File Options sub-menu.</pre> -<h3><a name="FileOptions">[10.1.1] - File Options</a> -</h3> -<p><img border="0" src="images/scfg_xfer_options.gif" width="572" height="331"> -</p> -<pre><b>Min Bytes Free Disk Space: -</b> This is the minimum about of disk space (in kilobytes) that is - necessary for a user to be allowed an upload. - -<b>Max Files in Batch UL Queue: -</b> This is the maximum number of files that can be stored in the batch - upload queue. The definite maximum is 500 files. - -<b>Max Files in Batch DL Queue: -</b> This is the maximum number of files that can be stored in the batch - download queue. The definite maximum is 500 files. - -<b>Max Users in User Transfers: -</b> This is the maximum number of destination users in user to user - transfers. The definite maximum is 500 users. - -<b>Default Credit on Upload: -</b> This is the default amount used for newly created directories. - -<b>Default Credit on Download: -</b> This is the default amount used for newly created directories. - -<b>Leech Protocol Detection Percentage: -</b> This value is the sensitivity of the leech protocol detection feature - of Synchronet. If the transfer is apparently unsuccessful, but the - transfer time was at least this percentage of the estimated transfer - time (based on the estimated CPS of the connection result code), then - a leech protocol error is issued and the user's leech download counter - is incremented. Setting this value to 0 disables leech protocol - detection. This option also allows you to set the minimum amount of - elapsed transfer time to be considered for a possible leech download. - - Leech protocol programs are file transfer programs (usually using - Zmodem technology) that attempt to "fool" the BBS into thinking the - file was not successfully transferred, when in reality it was. This is - accomplished by the transfer program requesting a reposition (ZRPOS) - after the last successful block and then aborting (ZCAN). A file - transferred in this manner will not be considered a successful transfer - by Synchronet, but will be caught as a possible leech download and - notify the sysop (if this option is used). - - This feature is also useful for detecting the partial download of image - (GIF) files. If you charge your users credits for downloads, this can - be a very useful feature in detecting dishonest users. If the user - accumulates a large number of leeches (as displayed in User Edit) and - the user never successfully downloads a file previously logged as a - possible leech download, the user is probably trying to get something - for nothing, though this is hard to prove without actually watching - the file transfer in progress.</pre> -<h2><a name="ViewableFiles">[10.2] - Viewable Files</a> -</h2> -<pre>This is a list of file types that have content information that can be viewed -through the execution of an external program or Baja module. Here are a couple -of command line examples for a few file types.</pre> -<pre><img border="0" src="images/scfg_xfer_viewable.gif" width="572" height="331"></pre> -<pre><b>NOTE:</b> When you select a file type from this list, you will be given one - additional option (Access Requirements) which is not shown here. - Users not meeting any access requirements which are set will not - be able to perform, or be affected by, that function.</pre> -<h2><a name="TestableFiles">[10.3] - Testable Files</a> -</h2> -<pre>This is a list of file types that will have a command line executed to test -the file integrity upon their upload. The file types are specified by extension -and if one file extension is listed more than once, each command line will -be executed. The command lines must return a DOS error code of 0 (no error) -in order for the file to pass the test. This method of file testing upon upload -is also known as an upload event. This test or event, can do more than just -test the file, it can perform any function that the sysop wishes. Such as -adding comments to an archived file, or extracting an archive and performing -a virus scan. While the external program is executing, a text string is -displayed to the user. This "working" string can be set for each file type -and command line listed. Shown is an example list of file types, and their -respective sub-menus and configurations:</pre> -<pre><img border="0" src="images/scfg_xfer_testable.gif" width="572" height="331"> - -ZIP type files:</pre> -<pre><img border="0" src="images/scfg_xfer_testable_zip.gif" width="572" height="331">� - -To add a ZIP comment to a ZIP type file:</pre> -<pre><img border="0" src="images/scfg_xfer_testable_zipc.gif" width="572" height="331">� - -If an extension of '*' is specified, all files uploaded will be tested with -this command line. An example would be when using Domain Upload Tester from -Domain Entertainment:</pre> -<pre><img border="0" src="images/scfg_xfer_testable_du.gif" width="572" height="331"> - -<b>NOTE:</b> Users not meeting any access requirements which are set will not - be able to perform, or be affected by, that function.</pre> -<h2><a name="DownloadEvents">[10.4] - Download Events</a> -</h2> -<pre>Download events are an event that you wish to have executed before a user -downloads a file from your BBS. This can be useful adding a comment to -a file from a CD-ROM before it gets sent to the user (as the example shows), -or to perform a virus scan, or any other function you can think of. - -Here is an example showing how to change the comment in ZIP type files when -a user attempts to download a file.</pre> -<pre><img border="0" src="images/scfg_xfer_event.gif" width="572" height="331"></pre> -<pre>Selecting the available event will allow you to edit the options available.</pre> -<pre><img border="0" src="images/scfg_xfer_eventc.gif" width="572" height="331"></pre> -<h2><a name="ExtractableFiles">[10.5] - Extractable Files</a> -</h2> -<pre>This is a list of archive file types that can be extracted to the temp -directory by an external program. The file types are specified by their -extension. For each file type you must specify the command line used to extract -the file(s). Here are some example command lines for extracting various files:</pre> -<pre><img border="0" src="images/scfg_xfer_extractable.gif" width="572" height="331"> - -<b>NOTE:</b> When you select a file type from this list, you will be given one - additional option (Access Requirements) which is not shown here. - Users not meeting any access requirements which are set will not - be able to perform, or be affected by, that function. - -<b>Notes on command lines syntax:</b> - The use of conversion specifiers are supported in all command lines - within SCFG. Conversion specifiers are proceeded by a percent (%) - symbol and are not case sensitive. The above command line examples use - the following specifiers: - -<b> %! EXEC directory:</b> - If the program you are executing with this command line is not - located in your EXEC directory, you can specify the directory - where the program is located or, if the program is in your - search path, start the command line with just the program name - (no prefix). We suggest specifying the location of the program - for security reasons. - -<b> %f Filename: -</b> This is the filename of the archive that is to be extracted. - -<b> %g Temp Directory: -</b> This is the path to the temp directory. In the above command - lines, it is the destination of the extracted files. - -<b> %s File Specification: -</b> This is the file specification to extract from the archive. - -<b> See Appendix A for a complete list of the available specifiers.</b></pre> -<h2><a name="CompressableFiles">[10.6] - Compressable Files</a> -</h2> -<pre>This is a list of archive file types that can be created for QWK packets -and temporary archives for download. The file types are specified by their -extension. For each file type you must specify the command line used to create -the archive. Here are some example command lines for various compression types:</pre> -<pre><img border="0" src="images/scfg_xfer_compressable.gif" width="572" height="331"> - -For these compression command lines to work, you must have the appropriate -executable files (PKZIP, ARJ, and LHA) in your EXEC directory.</pre> -<h2><a name="TransferProtocols">[10.7] - Transfer Protocols</a> -</h2> -<pre>This is a list of file transfer protocols that can be used to transfer files -either to or from a remote user. For each protocol, you can specify the -mnemonic (hot-key) to use to specify that protocol, the command line to use for -uploads, downloads, batch uploads, batch downloads, bi-directional file -transfers, and the support of DSZLOG. If the protocol doesn't support a -certain method of transfer, or you don't wish it to be available for a certain -method of transfer, leave the command line for that method blank. Be advised, -that if you add or remove any transfer protocols, you will need to edit the -protocol menus (ULPROT, DLPROT, BATUPROT, BATDPROT, and BIPROT) in the -TEXT\MENU directory accordingly. The '%f' command line specifier is used to -represent the filename or batch file list. The following is an example list of -protocols and their respective sub-menus and options:</pre> -<h3><a name="FDSZ">[10.7.1] - Version 3.0 (Win32 / -Telnet) using FDSZ :</a> -</h3> -<pre><b>IMPORTANT: </b>If you are running Synchronet as a Telnet Server then you - must use a Protocol that supports FOSSIL Communications - such as FDSZ or CEXYZ. Synchronet v3.0 comes pre-configured - for use with FDSZ.</pre> -<pre><img border="0" src="images/scfg_xfer_proto_fdsz.gif" width="572" height="331"></pre> -<pre><b>FDSZ Xmodem</b></pre> -<pre><img border="0" src="images/scfg_xfer_proto_fdsz_x.gif" width="572" height="331"></pre> -<pre><b>FDSZ Ymodem</b></pre> -<pre><img border="0" src="images/scfg_xfer_proto_fdsz_y.gif" width="572" height="331"></pre> -<pre><b>FDSZ Zmodem</b></pre> -<pre><img border="0" src="images/scfg_xfer_proto_fdsz_z.gif" width="572" height="331"></pre> -<pre><b>FDSZ Ymodem-G</b></pre> -<pre><img border="0" src="images/scfg_xfer_proto_fdsz_g.gif" width="572" height="331"></pre> -<h3><a name="DSZ">[10.7.2] - Version 2.30 (DOS/OS2) using -DSZ :</a> -</h3> -<pre><img border="0" src="images/scfg_xfer_proto_dsz.gif" width="572" height="331"> - -<b>DSZ Xmodem:</b></pre> -<pre><img border="0" src="images/scfg_xfer_proto_dsz_x.gif" width="572" height="331"> - -<b>DSZ Ymodem:</b></pre> -<pre><img border="0" src="images/scfg_xfer_proto_dsz_y.gif" width="572" height="331"> - -<b>DSZ Zmodem:</b></pre> -<pre><img border="0" src="images/scfg_xfer_proto_dsz_z.gif" width="572" height="331"> - -<b>DSZ Ymodem-G:</b></pre> -<pre><img border="0" src="images/scfg_xfer_proto_dsz_g.gif" width="572" height="331"></pre> -<h3><a name="HS/Link">[10.7.3] - Version 2.30 (DOS/OS2) -using HS/Link :</a> -</h3> -<pre><b>HS/Link Bi-Directional Transfers:</b></pre> -<pre><img border="0" src="images/scfg_xfer_proto_dsz_h.gif" width="572" height="331"></pre> -<pre><b>NOTE:</b> Users not meeting any access requirements which are set will not - be able to use that protocol. - -<b>IMPORTANT:</b> If you have Synchronet set to use anything other than UART - you will not be able to use the DSZ transfer protocols and will - need to locate a set of protocols that will work with your setup. - If you are using a UART serial board, there is no reason why - Synchronet should not be set to use UART. Just because a front-end - mailer or door game requires a FOSSIL driver, it does NOT mean - that you must also set Synchronet to use a FOSSIL.</pre> -<h2><a name="CreatingFileLibraries">[10.8] - Creating File Libraries</a> -</h2> -<pre>Select "File Transfers" from the SCFG main menu. Then select "File Libraries". -Hit INS (insert key) to create a file library. File libraries are groups of -file directories that have a similar subject matter or other common element. -File libraries are often used to separate Program files and Data files or -files stored on a Hard disk and files stored on CD-ROM. An example -configuration that separates programs from data: - -<b>Library Directory</b> ---------------------------------- -Programs Games -Programs Utilities -Programs Business -Programs Communications -Programs Graphics Programs -Programs Programming -Data Files Text (Documentation, Stories, Cheats) -Data Files Program Source Code (C, ASM, PAS, BAS) -Data Files Still Pics (GIF, PCX, TIF) -Data Files Animation (FLI, GL, DL) -Data Files Sound (MOD, WAV, MID) -Data Files Other - -Example configuration that separates hard disk directories from CD-ROM -directories: - -<b>Library Directory</b> -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Hard Disk Text -Hard Disk Games -Hard Disk Utilities -Hard Disk Business -Hard Disk Graphics -Hard Disk Communications -Hard Disk Graphics Programs -Hard Disk Programming -Hard Disk Graphics, Animation, and Sound -GIF CD-ROM G Rated -GIF CD-ROM G Rated 640x480 -GIF CD-ROM G Rated 800x600+ -GIF CD-ROM R Rated -GIF CD-ROM R Rated 640x480 -GIF CD-ROM R Rated 800x600+ -GIF CD-ROM X Rated -GIF CD-ROM X Rated 640x480 -GIF CD-ROM X Rated 800x600+ -PD/ShareWare CD-ROM Games - Mono, CGA, EGA -PD/ShareWare CD-ROM Games - VGA -PD/ShareWare CD-ROM Utilities -PD/ShareWare CD-ROM Communications -PD/ShareWare CD-ROM Graphics and Desktop Publishing -PD/ShareWare CD-ROM BBS Software and Utilities -PD/ShareWare CD-ROM Programming -PD/ShareWare CD-ROM Windows Programs, Fonts, Icons, etc. - -You must have at least one file library and one file directory for anyone to be -able to use the file transfer section. Following is a list of options available -when creating or modifying a file library.</pre> -<h3><a name="LibraryOptions">[10.8.1] - Library Options</a> -</h3> -<pre>Selecting a library name from the list of available libraries will give you a -sub-menu of options for that library.</pre> -<pre><img border="0" src="images/scfg_xfer_library.gif" width="572" height="331"></pre> -<pre><b>Long Name:</b> - This is a description of the library displayed in library listings. - -<b>Short Name: -</b> This is a description of the library displayed at prompts. - -<b>Access Requirements: -</b> These are the requirements which must be met by a user account in order - to access this library. - -<b>Clone Options: -</b> Use this command to copy the options of the first directory in this - library to all the other directories in the library. - -<b>Export Areas: -</b> If you wish to export the area information of all the directories in - the current file library to a text file, use this option. - -<b>Import Areas: -</b> If you wish to import a text file of area information into the - current file library, use this option.</pre> -<h2><a name="CreatingFileDirectories">[10.9] - Creating File Directories</a> -</h2> -<pre>After you have created at least one file library, you need to create -directories for the library. Creating a file directory is much like creating -a file library except that you will be prompted for an internal code to use. -The internal code should be an abbreviation of the name of the directory or -something else that specifies the contents of the directory. - -For each directory, you need to specify the file storage path. This is where -the files are actually located (Drive and directory) on your system. If you do -not specify a storage path, a sub-directory will be created off of your -DATA\DIRS directory with the directory's internal code as the name of the -sub-directory. If you wish to use the default storage path (DATA\DIRS\<code>), -you'll need to move any files that you wish to be added to the BBS file -database to that sub-directory. - -If you are adding CD-ROM directories, be sure to set the "Check for file -existence" and "Search for New Files" toggle options to "No", and -"Slow Media Device" to "Yes" for each of your CD-ROM file directories. - -Following is a list of options available in the SCFG when creating or modifying -a file directory.</pre> -<h3><a name="MainDirectoryOptions">[10.9.1] - Main Directory Options</a> -</h3> -<pre><img border="0" src="images/scfg_xfer_dir.gif" width="572" height="331"> - -<b>Long Name:</b> - This is a description of the file directory that is displayed in - directory listings. - -<b>Short Name: -</b> This is a description of the file directory that is displayed at - prompts. Some short names have a predetermined meaning: - -<b> Temp: -</b> This short name is reserved and cannot be used. - -<b> Offline: -</b> This short name specifies that this directory is to hold - offline files for the selected library and is treated a bit - differently than other directories. It will not be included - in new-scans and will be the default location of files that - are removed or moved. A directory with this short name should - have the upload level set to 90 and the access level and flags - set the same as the library. There can only be one directory - per library with this short name. - -<b> Sysop: -</b> This short name specifies that this directory will be the - destination for files uploaded by users with the 'Z' command - from the transfer section. There should only be one directory - with this short name and it should belong to the most - accessible library. A directory with this short name should - have the access level set to 90 and the upload level and flags - set the same as the library. - -<b> User: -</b> This short name specifies that this directory will be the - storage point for user to user transfers. There should only be - one directory with this short name and it should belong to the - most accessible library. Users can upload a file to another - user or group of users with the '/U' transfer section command. - Users download files sent to them with the '/D' transfer - section command. A directory with this short name should have - the access level set to 90 and the upload level and flags - set the same as the library or at whatever level the sysop - wishes to allows users to use the user to user transfer - facilities. - -<b> Uploads: -</b> This short name specifies that this directory will be used - for uploads if the user attempts to upload to a directory where - he or she does not have sufficient upload access. - If you wish all uploads to automatically go into one specific - directory, set the required upload level for all other - directories to 90 or higher (Sysop). If you don't want users - to be able to see the files in this directory or download them - until they are moved by the sysop, set the required access - for your "Uploads" directory to level 90 or higher. Creating - an "Uploads" directory also allows "Blind" batch uploads from - the users (files need not be added to the upload queue first). - -<b>Internal Code: -</b> This is an internal code for SBBS to distinguish this directory from - the others on the system. This must be a unique name of up to 8 valid - DOS filename characters. The code TEMP is reserved and cannot be used. - -<b>Access Requirements: -</b> This is a list of security requirements to access this directory. - -<b>Upload Requirements: -</b> This is a list of security requirements to upload to this directory. - -<b>Download Requirements: -</b> This is a list of security requirements to download from this - directory. - -<b>Operator Requirements: -</b> Any users meeting these criteria will be able to perform Sysop type - activities for this directory. - -<b>Exemptions Requirements: -</b> Any users meeting these criteria will be considered exempt from - credit deductions when transferring files from this directory. - -<b>Transfer File Path: -</b> This is the actual path for the storage of the files that belong to - this directory. If no path is specified, the directory DATA\DIRS\CODE, - where CODE is the internal code for this directory, will be used to - store the files. - -<b>Maximum Number of Files: -</b> This is the maximum number of files that will be allowed in this - directory. Once this number of files is reach, no uploads will be - allowed. - -<b>Purge by Age: -</b> This is maximum age of files (in days) to keep in this directory. - The DELFILES utility (included with Synchronet) must be run as - a timed event to automatically purge old files from your file areas. - -<b>Credit on Upload: -</b> If Credit Uploads is set to Yes in the toggle options for this - directory, users will be credited with this percentage of the file - size (in bytes) in credits when uploading a file to this directory. - -<b>Credit on Download: -</b> If Credit Downloads is set to Yes in the toggle options for this - directory, users will be credited this percentage of credits for - subsequent downloads of any file that they upload to this - directory.</pre> -<h3><a name="ToggleOptions">[10.9.2] - Toggle Options</a> -</h3> -<pre><img border="0" src="images/scfg_xfer_dir_toggles.gif" width="572" height="331"> - -<b>Check for File Existence:</b> - If this option is set to 'Yes', when files are listed in the transfer - section, each file is checked to see if it actually exists in the - DOS directory. If the file doesn't exist, the credit value is displayed - in high intensity blinking and is followed by a minus symbol. Setting - this option to 'No' speeds up the file listings, but files not actually - on disk will appear just as the others. Directories with a short name - of Offline should have this value set to 'No' as they should solely - contain files that aren't actually in the DOS directory. Directories - that are stored on CD-ROM or other slow random access device should - have this option set to 'No'. - -<b>Slow Media Device: -</b> If this option is set to 'Yes', files will be copied from the normal - storage directory into the temp directory and downloaded from there. - This option is helpful in reducing the overhead associated with - multiple simultaneous user access to a slow media device such as - CD-ROM. - -<b>Force Content Ratings: -</b> If this option is set to 'Yes', when a user uploads a file he is - prompted to rate the content of the file with a single character - (usually G, R, or X), and the file description will begin with the - rating letter contained in brackets. - -<b>Upload Date in Listings: -</b> Setting this option to 'Yes' will cause Synchronet to place the date - that a file was uploaded onto the first line of the file description, - similar to the Multiple File Numberings option. - -<b>Multiple File Numberings: -</b> If this option is set to 'Yes', when a user uploads a file he is - asked if the file he is uploading is part of a set of files. If the - user answers 'Yes', he is then prompted for the total number of files, - the number of the file he is uploading, and the file description will - end with the numbering in the format "[n/t]", where n is the file - number and t is the total number of files. - -<b>Search for Duplicates: -</b> If this option is set to 'Yes', this directory will be searched for - duplicate filenames when a user attempts to upload a file. - -<b>Search for New Files: -</b> When this option is set to 'Yes' this directory will be included in - new file scans (for those users than have access). Set this option - to "No" for CD-ROM directories or directories that will not be - receiving new files on a regular basis. - -<b>Search for Auto-ADDFILES: -</b> When this option is set to 'Yes' this directory will be searched for - FILES.BBS by the ADDFILES program when using the auto-add feature. - -<b>Import FILE_ID.DIZ: -</b> When set to 'Yes', Synchronet will attempt to import the FILE_ID.DIZ - or DESC.SDI of any files uploaded to this directory into the file - description. - -<b>Free Downloads: -</b> If you want all files downloaded from this directory to be free for - the downloader (not cost any credits regardless of the credit value), - set this option to 'Yes'. - -<b>Free Download Time: -</b> If you do not want time spent during downloading to be subtracted from - the users time online, this option should be set to 'Yes'. - -<b>Deduct Upload Time: -</b> If you want the time spent uploading a file to be subtracted from the - users available online time, this option should be set to 'Yes'. - -<b>Credit Uploads: -</b> If you want users who upload files to this directory to get credit - for their upload based on the "Credit on Upload" percentage, set - this value to 'Yes'. - -<b>Credit Downloads: -</b> If you want users who upload files to this directory to get credit - for subsequent downloads of the file based on the "Credit on Download" - percentage, set this value to 'Yes'.</pre> -<pre><b>Credit with Minutes: -</b> Setting this option to 'Yes' will cause the uploading user to receive - time (in minutes) for their upload rather than credits. The minutes - a user receives will be based upon the percentage awarded multiplied - by the time it took for the recipient of the file to download it. - -<b>Anonymous Uploads: -</b> If you want users with the 'A' exemption to be able to upload file - anonymously to this directory, set this option to 'Yes'. If you want - all uploads to this directory to be automatically forced anonymous, set - this option to Only. - -<b>Purge by Last Download: -</b> This option is for use in conjunction with the Synchronet DELFILES - program. When deleting files from the filebase, if this option is - set to 'Yes', it will compare the maximum age specified by the - "Purge by Age" field to the date the file was last downloaded. If set - to 'No', the maximum age will be compared to the date the file was - uploaded. - -<b>Mark Moved Files as New: -</b> If this option is set to 'Yes', then when a file is moved from this - directory to another, it's upload date will be reset to the current - date/time automatically.</pre> -<h3><a name="AdvancedOptions">[10.9.3] - Advanced Options</a></h3> -<p><img border="0" src="images/scfg_xfer_dir_advanced.gif" width="572" height="331"></p> -<pre><b>Extensions Allowed: -</b> This is a list of file extensions (separated by commas) that are - allowed to be uploaded to this directory. - -<b>Data Directory: -</b> This is the path where the data for this directory will be located. - -<b>Upload Semaphore File: -</b> This is the path and name of a semaphore file used to trigger your - front-end mailer when a file is uploaded. - -<b>Sort Value and Direction: -</b> Directories can be sorted either by filename or upload date in an - ascending or descending order. This option selects the value to sort - on and in which direction.</pre> -<h3><a name="AddingFilesToDatabase">[10.10] - IMPORTANT - Adding -files to the BBS database</a></h3> -<pre>Now that you've created at least one file library and one file directory inside -that file library, any files located in the storage path for that directory -are not automatically available for users to download. The file has to be -added to the BBS file database first. - -<b>Manual Upload</b> - -Logon to the BBS as yourself (most likely, user #1), go to the file transfer -section. Select the file area you wish to add the file to and hit 'U' for -upload. Now enter the filename. If the file is already in the storage directory -that you specified in SCFG you will be prompted for file descriptions and other -questions about the file. If the file is not already in the storage directory, -you will be prompted for the path from where to copy the file. - -<b>ADDFILES</b> - -If you have an ASCII list of your files with descriptions (often called -FILES.BBS or DIR##), you'll want to use the Synchronet ADDFILES program to -import this file and description information into the BBS file database. This -is usually only the case for CD-ROMs and when converting a file database from -another BBS. See the Utility Reference Chapter for more information on -ADDFILES. - -<b>Bulk Upload<u> -</u></b> -To add the files that are located in the storage paths of your configured -directories, exit the configuration program, logon to the BBS as yourself -(User #1), go to the file transfer section ('T' from the main menu), and type -";UPLOAD ALL" then hit ENTER. If there are any files that are in your storage -paths, but not already in the BBS file database you will be prompted to enter -a description for each file.</pre> -<h3><a name="CreatingOfflineFileDirectories">[10.10.1] - Creating Offline File -Directories</a></h3> -<pre>Each library can have an offline file directory. This is where you can place -files that have been removed from the system, but the file information (name, -description, uploader, etc.) remains in the database. Offline directories -are treated special. They are not scanned for new files and are automatically -used as an optional destination for the file information when a file is -removed by a sysop. Offline file directories are specified by having the -short name of "Offline" (not case sensitive). Only one offline directory can be -specified per library. Offline file directories should have the "Check for file -existence" toggle option set to "No". The minimum security level to upload -should be set to 90 so that users will not be allowed to upload to this -directory.</pre> -<h3><a name="CreatingSysopDirectory">[10.10.2] - Creating a Sysop Directory</a></h3> -<pre>A sysop file directory is a directory that users can upload to, but they can -not see nor download from. You can only have one sysop directory on the -system and it can belong to any one of the file libraries. A sysop file -directory is specified by the short name of "Sysop" (not case sensitive) and -will be used as the destination directory for uploads with the 'Z' (upload -to sysop) transfer section command. The minimum security level to access should -be set to 90 or higher so that only sysops can view the directory and download -from it and the upload access level should be set to 0 (or higher, if you want -to restrict the number of users who can upload to the sysop dir).</pre> -<h3><a name="CreatingUser-to-UserDirectory">[10.10.3] - Creating a -User-to-User Transfer Directory</a></h3> -<pre>A user-to-user transfer directory is used for users to send a file directly -to another user (or group of users) with only that user (or group of users) -being able to see the file and download it. It's like a private e-mail file -directory. Users send files to other users with the "/U" command and download -files from other users with the "/D" command. This feature is only enabled -if the sysop creates a user-to-user transfer directory. This directory can -belong to any library on the system, but must have a short name of "User" -(not case sensitive). The minimum security level to access should be set to -90 or higher so that only sysops can view the directory and download any file -they wish from it and the upload access level should be set to 0 (or higher, -if you want to restrict the number of users who can upload user-to-user -files). This directory should have the "Allow extended descriptions" toggle -option set to "Yes" so that the uploader of the file can attach a more -detailed description if he or she wishes.</pre> -<h3><a name="CreatingDefaultUploadDirectory">[10.10.4] - Creating a Default Upload -Directory</a></h3> -<pre>A default upload directory is used if you want all uploads to go to a single -directory. If you wish to use this feature, you must create a directory with -the short name up "Uploads" (not case sensitive). Set the minimum level to -access to 90 or higher if you do not wish to allow users to see this directory. -Set the upload access level to 0 (or higher, if you want to restrict the number -of users who can upload to this directory). You should set the required -upload access level of all other directories in the library to 90 or higher so -that all upload attempts to those directories will force the file uploaded into -this directory.</pre> -<h3><a name="SupportingBlindBatchUploads">[10.10.5] - Supporting Blind Batch Uploads</a></h3> -<pre>Some sysops would like for their users to be able to do a batch upload of files -to a directory without having to enter the files into an upload queue before -hand. These are called Blind Batch Uploads. In order for this feature to -work, you MUST have created a default upload directory (see the section above -describing this procedure). Once you have created a default upload directory, -the user need only go to the Batch Transfer menu and begin his upload.</pre> -<h2><a name="CD-ROM/SlowMediaDevices">[10.11] - CD-ROM and Other Slow Media -Devices</a></h2> -<pre>It is assumed that you have already installed your CD-ROM drive and any -necessary device drivers so that it can be accessed as a DOS device (like -a hard disk or floppy disk). - -Explore your CD-ROMs directories to find out what directories contain what -kind of files. Make notes of the directory paths and a description you would -like to give that directory. Example: - -<b>Path Description</b> ---------------------------- -D:\G-GIFS G Rated GIFs -D:\GAMES Games -D:\UTILS Utilities - -Now find the ASCII description lists on the CD-ROM for the individual -directory contents and note which description files are for which directories. -If multiple list formats are supplied, use the format that most closely -matches this (FILES.BBS format): - -FILENAME.EXT This is a file description - -or the DIR## format: - -FILENAME.EXT 530114 07-16-91 This is a file description that will be too - | long, so it wraps to the next line. - -Example for file list notes: - -<b>File List Description -</b>----------------------------------- -D:\DESC\GIFS.LST GIFs -D:\DESC\GAMES.LST Games -D:\DESC\UTILS.LST Utilities - -Or preferably: - -<b>File List Description</b> ------------------------------------ -D:\GIFS\FILES.BBS GIFs -D:\GAMES\FILES.BBS Games -D:\UTILS\FILES.BBS Utilities - - -Now run SCFG from your node directory. Go to "File Transfers", then "File -Libraries". Hit the INS key to add a new file library. Name it "CD-ROM" or a -description of what the CD-ROM contains. Now hit ENTER on the new library -and select "File Directories". Hit INS to add each directory specifying the -name and file storage path for each. Example: - -<b>Long and Short Name Internal Code File Path -</b>--------------------------------------------------------- -GIFs CD-GIFS D:\GIFS -Games CD-GAMES D:\GAMES -Utilities CD-UTILS D:\UTILS - -Now hit HOME and ENTER to edit the first directory. Select "Toggle Options" -and hit enter. Set "Check for File Existence" and "Search for New Files" to -"No" and set "Slow Media Device" to "Yes". Hit ESC three times to go back to -the "CD-ROM File Library" menu. Select "Clone Options" and hit ENTER. Answer -"Yes" to clone the options of the first directory into the rest of the library. - -Now exit SCFG and save changes. - -From the DOS prompt, type: - -SET SBBSNODE=C:\SBBS\NODE1 - -But use the correct path for your NODE directory. If you installed Synchronet -into a directory named "BBS" on drive D:, then you would type - -SET SBBSNODE=D:\BBS\NODE1 - -Now run ADDFILES (from your EXEC directory) for each of your CD-ROM file -description lists (or only once if a FILES.BBS exists in each directory). See -the Utility Reference chapter for specifics on how to use ADDFILES. Example -(assuming description lists are in DIR## format): - -ADDFILES CD-G-GIFS +D:\DESC\G-GIFS.LST 33 13 -ADDFILES CD-R-GIFS +D:\DESC\R-GIFS.LST 33 13 -ADDFILES CD-X-GIFS +D:\DESC\X-GIFS.LST 33 13 -ADDFILES CD-GAMES +D:\DESC\GAMES.LST 33 13 -ADDFILES CD-UTILS +D:\DESC\UTILS.LST 33 13 - -The following command will search ALL configured directories for FILES.BBS -lists and import the files from them: - -ADDFILES * - -If you have a FILES.BBS format list which has a different filename, this will -search ALL configured directories for that file and import the files from them: - -ADDFILES *FILES.LST - -These will add the file descriptions to your Synchronet file database. -Now you should be able to run SBBS and have users download files from your -CD-ROM.</pre> -<h3><a name="AlternateFilePaths">[10.11.1] - Alternate File Paths</a></h3> -<pre>Since a CD-ROM disk is "read only", you cannot alter the physical organization -of files and directories on the CD-ROM. Normally, you would have one logical -Synchronet file directory for every physical DOS directory. But for CD-ROMs -that have their files spread across a large number of directories, you may not -want your logical directory structure to mimic the physical structure. -Synchronet can store roughly a thousand files per directory and many CD-ROMs -have far less than that per directory to accommodate BBS software that have a -lower maximum number of files per directory. Each logical directory in -Synchronet takes up memory so it is advantageous to keep the number of -directories to a minimum when working with large quantities of files. - -Synchronet's alternate file paths allow the sysop to add files from multiple -physical directories into one logical directory on the BBS. Every logical -directory on the BBS has a default storage path where uploaded files will be -received and downloaded files are sent from. If you wish to add files to an -existing logical directory that are not stored in the default storage path, -then you will need to add an alternate file path that points to the location -of these files. Then either use ADDFILES with the ".altpath" switch or use -the ;ALTUL and ;UPLOAD sysop transfer commands to add the files. You will need -to know the number of the alternate file path for which you are adding files -from, so note which alternate path number you are uploading from before running -ADDFILES or ;UPLOAD. - -Alternate file paths are useful for grouping files of a similar subject from -different CD-ROMs into a single logical directory in Synchronet, thus freeing -the sysop to organize the files based on content rather than physical storage -location.</pre> -<h2><a name="SynchronetFTPServer">[10.12] - Internet FTP Server</a> <b><font color="#FF0000"><i>(v3+ -Only)</i></font></b> -</h2> -<pre><b>FTP Filename Aliases</b> - -You can create a list of file aliases that will appear in your FTP root -directory for:</pre> -<ul> - <li> -<pre>Quick and easy access to often downloaded user files</pre> - </li> - <li> -<pre>Static filenames that corresponds to a dynamically changing filenames - e.g. ftp://vert.synchro.net/sbbs_for_dos.zip always points to the current - versioned filename of Synchronet for DOS (e.g. SBBS230B.ZIP)</pre> - </li> - <li> -<pre>Download access to files on the local disk not in the BBS file database </pre> - </li> -</ul> -<pre>How? Edit the file <b>CTRL/FTPALIAS.CFG</b> (<i>SBBSCTRL->FTP->Edit->Alias List</i>). The -format is similar to that of the Synchronet Mail Server <b>ALIAS.CFG</b>, one alias -per line in the format:</pre> -<pre><b>alias path description</b></pre> -<pre>The alias is not case-sensitive and may not contain spaces. This is the -filename that will appear in your FTP root directory.</pre> -<pre>The path element is either the full path and filename to a file on a -local file system (e.g. <b>C:\DOCS\MYFILE.TXT</b>) or a virtual path to a file in the -BBS file database. Virtual paths are specified as "<b>bbs://lib/dir/filename</b>" -where lib is the library short name, dir is the directory internal code and -filename is the actual filename of the referenced file (may be the long -filename, but may not contain spaces). </pre> -<pre>The description is the optional description of the file that will be used in -the dynamically generated Auto Index file (if you have this option enabled).</pre> -<pre>Lines beginning with a '<b>;</b>' are considered comments and are ignored.</pre> -<pre>Example Alias:</pre> -<pre><b>sbbs_for_dos.zip bbs://main/sbbs/sbbs230b.zip Current version for SBBS for DOS</b></pre> -<pre><b>Sysop Access</b> - -To login with system operator access, you must login with a user account that -has a security level of 90 or higher (user #1 usually has level 99) and enter -your password as "<b>pass:syspass</b>" where pass is your personal password and -syspass is the system password.</pre> -<pre>A successful sysop login will generate a login message stating -"<b>Sysop access granted</b>". Logging in with just your personal password will give -you normal (non-sysop) access.</pre> -<pre>Sysop access allows you to mount local file systems and will enable secure -BBS database features in the future (such as deleting/renaming files).</pre> -<pre><b>Local File System Access<u> -</u></b> -This is a powerful new feature that allows the sysop to access any and all -locally accessible files and file systems via FTP (very convenient for -remote administration). The "<i>Local File System</i>" checkbox must be checked in the -FTP configuration dialog in SBBSCTRL to enable this feature.</pre> -<pre>To access local file systems, you must first login with sysop access -(see "Sysop Access" for details). Once logged in with sysop access, you may -mount the local file system. There are two ways to mount the local file system -(and subsequently to revert to the BBS file system):</pre> -<pre><b>SMNT (Structure Mount)</b> - -Sysops may use the FTP "<b>SMNT</b>" command to mount the local files system. Since most -FTP clients do not support the <b>SMNT</b> command, you'll probably need to use the -"quote" feature of your FTP client to send the command to the FTP server. </pre> -<pre>The syntax is "<b>SMNT new_dir</b>" where <i>new_dir</i> is the file system specifier -for the new directory used in the FTP hierarchy. Example: "<b>SMNT C:\</b>" -would make the root directory of your local C drive your new current FTP -directory (for Windows' command-line ftp, type "<b>quote SMNT C:\</b>").</pre> -<pre>You can access shared drives on other machines on your local area network -by using "<b>SMNT \\othersys\drive</b>" where <i>othersys</i> is the name of the other -computer and drive is the share name of the desired drive.</pre> -<pre>To switch back to (mount) the BBS file database, use "<b>SMNT bbs:</b>"</pre> -<pre><b>CD (Change Directory)</b> - -Sysops can mount the local file system using a special case of the <b>CD</b> (<b>CWD</b>, <b>XCWD</b>) -command. By prefixing "local:" to the new directory, the local file system will -be automatically mounted. Example: "<b>cd local:c:\</b>".</pre> -<pre>Once the local file system is mounted, you can switch between drives and shared -drives with the CD command (the "<b>local:</b>" specifier is not needed). -Example: "<b>cd d:\</b>".</pre> -<pre>To access a shared drive on other machines: "<b>cd \\othersys\drive</b>".</pre> -<pre>To switch back to (mount) the BBS file system, use "<b>cd bbs:</b>".</pre> -<pre>Since some FTP clients do not support the <b>SMNT</b> command, nor allow users to enter -verbatim FTP commands, the CD method is the easiest and most reliable method of -accessing the local file system. </pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/files.ref b/docs/files.ref deleted file mode 100644 index 551562cbf9..0000000000 --- a/docs/files.ref +++ /dev/null @@ -1,201 +0,0 @@ -Reference of Path/Filenames Created/Read by Synchronet BBS Software and Utils -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Updated 09/05/97 - - -The files listed in this document are each of a specific format. Many problems -may occur if a file is incorrectly modified by a person or program. Some of -the files below have a relatively self-explanatory format, while most are much -more cryptic and require the use of a technical specification and/or utility -program to decode or modify. The sysop manual defines the format of some of the -files (GURU.DAT for example) while some of the more technical file format -definitions are available in SBBSDEFS.ZIP and SMB_*.ZIP. - - See CNFS.FMT for specification - ------------------------------ -CTRL\MAIN.CNF Main configuration (SCFG) -CTRL\MSGS.CNF Message area/network configuration (SCFG) -CTRL\CHAT.CNF Chat configuration (SCFG) -CTRL\XTRN.CNF External program/event configuration (SCFG) -CTRL\FILE.CNF File area configuration (SCFG) -CTRL\*.CN? Configuration back-ups (SCFG) - - See NODEDEFS.H for specification - -------------------------------- -CTRL\NODE.DAB Node status/control (NODE) - - No specification currently available - ------------------------------------ -CTRL\NODE.IXB Node time synchronization index -CTRL\NODE.EXB Node extended status descriptions -CTRL\TIME.DAB Last-ran time for timed events (del to reset) -CTRL\QNET.DAB Last-ran time for QWKnet hub call-outs (del to reset) -CTRL\PNET.DAB Last-ran time for PostLink hub call-outs (del to reset) -CTRL\DSTS.DAB Daily statistics for all nodes (DSTSEDIT) -CTRL\CSTS.DAB Cumilative statistics for all nodes (SLOG) -CTRL\ATTR.CFG Text attribute (color) configuration - - See sysop manual for specification - ---------------------------------- -CTRL\GURU.DAT Guru brain -CTRL\TEXT.DAT Text strings - - No specification currently available - ------------------------------------ -CTRL\MDMS.IXT Modem configuration database index (SCFG) -CTRL\*.MDM Modem configuration data (SCFG) - - See SMB.TXT for specification - ----------------------------- -DATA\MAIL.* E-mail database - - No specification currently available - ------------------------------------ -DATA\GURU.LOG Guru conversations -DATA\HUNGUP.LOG Users who've hung-up on external programs -DATA\XFER.IXT User-to-user file transfer index (del to reset) -DATA\LOGON.LST User logon list for today -DATA\UTI.LOG UTI (PostLink) driver log file - - See DIRS.FMT for specification - ------------------------------ -DATA\DIRS\*.DAT File directory data -DATA\DIRS\*.IXB File directory index -DATA\DIRS\*.EXB File directory extended descriptions -DATA\DIRS\*.DAB File directory most recently uploaded file pointer - - No specification currently available - ------------------------------------ -DATA\FILE\####.QWK Pre-packed QWK packets for users or QWKnet nodes -DATA\FILE\####.DWN Download batch queue from user's last logon -DATA\FILE\####.IN\ In-bound e-mail file attachments for users -DATA\FILE\####.OUT\ Out-bound netmail file attachments for users - - No specification currently available - ------------------------------------ -DATA\LOGS\mmddyy.LOL Log-off list for date mm/dd/yy -DATA\LOGS\mmddyy.LOG Detailed log for date mm/dd/yy - - No specification currently available - ------------------------------------ -DATA\MSGS\AUTO.MSG Auto-message for SBBS -DATA\MSGS\####.MSG Users short-messages (telegrams) -DATA\MSGS\N###.MSG Node messages (pages, activity alerts, etc) - - See SYNCQNET.DOC for specification - ---------------------------------- -DATA\QNET\ROUTE.DAT Route map for routing QWK netmail -DATA\QNET\USERS.DAT User address look-up file (QWKNODES) - - No specification currently available - ------------------------------------ -DATA\QNET\qwkid.PTR Last-exported pointers for QWKnet hub (del to reset) -DATA\QNET\qwkid.IN\ In-bound file transfers from QWKnet hubs or nodes -DATA\QNET\qwkid.OUT\ Out-bound file transfers to QWKnet hubs or nodes - - See SMB.TXT for specification - ----------------------------- -DATA\SUBS\*.SDT Message base data -DATA\SUBS\*.SHD Message base header -DATA\SUBS\*.SID Message base index -DATA\SUBS\*.SDA Message base data allocation table -DATA\SUBS\*.SHA Message base header allocation table -DATA\SUBS\*.SCH Message base CRC history - - No specification currently available - ------------------------------------ -DATA\SUBS\*.SFP Message number last scanned/exported to FidoNet -DATA\SUBS\*.SMM Message number last scanned/imported to Match Maker -DATA\SUBS\*.SBL Message number last scanned/imported to BBS List - - No specification currently available - ------------------------------------ -DATA\TEXT\*.IXT General text file section index - - See SBBSDEFS.H for specification - -------------------------------- -DATA\USER\USER.DAT User data - - No specification currently available - ------------------------------------ -DATA\USER\NAME.DAT User name/alias index -DATA\USER\####.MSG Extended user description - - See PTRS.FMT for specification - ------------------------------ -DATA\USER\PTRS\####.IXB Message base scan configuration/pointers for users - - See CNFS.FMT for specification - ------------------------------ -NODE#\NODE.CNF Node configuration (SCFG) - - No specification currently available - ------------------------------------ -NODE#\SCFG.BAT Configuration loader -NODE#\SBBS.BAT BBS loader -NODE#\NODE.LOG Detailed log of last call -NODE#\DSTS.DAB Daily statistics for this node (DSTSEDIT) -NODE#\CSTS.DAB Cumulative statistics for this node (SLOG) -NODE#\CHAT.DAB Private chat data -NODE#\BATCHUP.LST Batch upload path/file list -NODE#\BATCHDN.LST Batch download path/file list -NODE#\BIMODEM.PTH Bi-dir upload/download path/file list -NODE#\PROTOCOL.LOG File transfer protocol log (DSZLOG) -NODE#\MSGTMP Editor drop file (QuickBBS) -NODE#\INPUT.MSG Editor drop file -NODE#\NETMAIL.MSG Editor drop file -NODE#\QUOTES.TXT Editor drop file -NODE#\MSGINF Editor drop file (RemoteAccess) -NODE#\EDITOR.INF Editor drop file (WWIV) -NODE#\SBBSFILE.NAM File processor drop file -NODE#\SBBSFILE.DES File processor drop file - - See sysop manual or XTRN_DAT.FMT for specification - -------------------------------------------------- -NODE#\XTRN.DAT External program drop file - - See sysop manual for specification - ---------------------------------- -NODE#\MODUSER.DAT External program return file - - No specification currently available - ------------------------------------ -NODE#\DOOR.SYS Door drop/return file -NODE#\PCBOARD.SYS Door drop file -NODE#\USERS.SYS Door drop/return file -NODE#\SFDOORS.DAT Door drop file -NODE#\CHAIN.TXT Door drop file -NODE#\DORINFO#.DEF Door drop file -NODE#\EXITINFO.DEF Door drop/return file -NODE#\CALLINFO.BBS Door drop file -NODE#\DOORFILE.SR Door drop file -NODE#\UTIDOOR.TXT Door drop file - - See sysop manual for specification - ---------------------------------- -TEXT\*.MAC Local keyboard macros -TEXT\*.SIF Input/questionnaire files - - No specification currently available - ------------------------------------ -TEXT\TOOSLOW.MSG Message displayed to users less than minimum node rate -TEXT\ANSWER.ASC Answer file for non-ANSI callers -TEXT\ANSWER.ANS Answer file for ANSI callers -TEXT\ANSWER.RIP Answer file for RIP callers -TEXT\SBBS.MSG Synchronet information message -TEXT\SYSTEM.MSG System information message -TEXT\NEWUSER.MSG New user rules/information message -TEXT\FEEDBACK.MSG New user feedback instructions -TEXT\NAME.CAN List of disallowed name/alias strings -TEXT\BADNAME.MSG Message displayed when attempting to enter a bad name -TEXT\FILE.CAN List of disallowed file names for uploading -TEXT\BADFILE.MSG Message displayed when attempting to upload bad file -TEXT\PHONE.CAN List of disallowed phone numbers -TEXT\BADPHONE.MSG Message displayed when attempting to use bad phone -TEXT\CID.CAN List of disallowed Caller-ID strings -TEXT\BADCID.MSG Message displayed when attempting to use bad CID string -TEXT\IP.CAN List of disallowed IP addresses for telnet connections -TEXT\BADIP.MSG Message displayed when attempting to use bad IP -TEXT\ZIPMSG.TXT Default ZIP comment - -/* End of FILES.REF */ diff --git a/docs/glossary.html b/docs/glossary.html deleted file mode 100644 index 99f53baade..0000000000 --- a/docs/glossary.html +++ /dev/null @@ -1,397 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Glossary</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2>[19.0] - Glossary</h2> -<pre><b>Alias:</b> - False name that a user is known as. The use of Aliases is common on - BBSs. Synchronet allows the sysop to disallow the use of them, forcing - all users to be known by their real names. - -<b>ANSI:</b> - American National Standards Institute. References made to ANSI are - actually referring to the ANSI X3.64 terminal definition and the - related escape sequences used to change cursor positioning and text - attributes. - -<b>Archive:</b> - A file that contains multiple (possibly compressed) files, that can - be expanded. Archived files usually have a specific extension that - specifies what type of archive utility was used to create it. - The most popular archive utilities are PKZIP (.ZIP files), - LHARC (.LZH), and ARJ (.ARJ files). - -<b>ASCII:</b> - American Standard Code of Information Interchange. A 7 bit binary code - used to represent letters, numbers, symbols, and control codes. - Supported by almost every computer and terminal manufacturer. - See Extended ASCII. - -<b>Baja:</b> - Baja (b�'h�) is a tool used to create command shells and modules for - Synchronet multinode BBS software (see DOCS\BAJA.DOC). - -<b>Baud:</b> - An obsolete term defining the number of signal-level changes per - second. The CCITT now prefers to use "symbols per second". For example - a V.22bis connection transfers only 600 symbols per second, but in this - protocol each symbol can represent up to four values; thus, you have an - effective transmission rate of 2,400 bps. V.32 is a 2,400 - symbol-per-second (9,600-bps) modulation protocol. - -<b>BBS:</b> - Bulletin Board System. A system configured to accept users via modem - or network to access public and private messages. Many BBSs also - incorporate file transfers (the uploading and downloading of program - and data files), information services, online entertainment, and more. - On a multinode BBS, all nodes must use the same live database for - users, messages, and file transfers. - -<b>BPS:</b> - Bits Per Second or Bit Rate. The rate of data transmitted between - modems. For every byte of data (8 bits), a start and stop bit are added - for a total of ten bits per data byte. - -<b>Chat:</b> - Online real-time communication between users either in line by line - (multinode chat) or key by key (private chat). -<b> -COM Port:</b> - RS-232 communications port on an IBM PC compatible computer through - which digital signals are exchanged between it and the modem (or other - peripheral). The interface is either a 25 or 9 pin male connector. - -<b>Command Line:</b> - The complete syntax used for the execution of a program. Includes - the program path and name to execute and any parameters that may be - required by the program for proper execution. Command lines configured - in SCFG can use special command line specifiers for variable parameter - replacement. See Appendix A for more information. - -<b>Compression:</b> - See Archive. - -<b>Conference Mail:</b> - See EchoMail. - -<b>Co-sysop:</b> - BBS user with additional privileges to enable partial system - maintenance. Co-sysops on a Synchronet system would usually have - a security level in the range 80-89 and have an exemption flag for each - sysop function he is given rights to. - -<b>CR:</b> - Carriage Return. This character represents the end of a line of text - and is usually initiated with the ENTER key on most keyboards. - -<b>CrashMail:</b> - Referring to FidoNet NetMail being sent immediately and directly (not - routed) to the BBS or network address of the destination person. - A more accurate term would be Crash NetMail, or NetMail with Crash - status. - -<b>Decompression:</b> - See Extraction. - -<b>Directory:</b> - A section within a file library that contains files for uploading or - downloading. Also known as a file area. - -<b>Download:</b> - Transferring a file from a BBS or other host system to a remote - computer. - -<b>DCE:</b> - Data Communications Equipment. Dial-up modems that establish and - control the data link via the telephone network. - -<b>DCE Rate:</b> - The data transfer rate between two modems. - -<b>DTE:</b> - Data Terminal Equipment. The device that generates or is the final - destination of data - the computer. - -<b>DTE Rate:</b> - The data transfer rate between the computer and the modem. - -<b>Echo:</b> - The term "Echo" or "Echo Conference" is often used to refer to a - sub-board where messages are distributed across a message network. The - term actually comes from FidoNet EchoMail - the technology used to - distribute sub-board messages across FidoNet. - -<b>EchoMail (Conference Mail):</b> - Sub-board messages echoed across FidoNet in compressed packets. - -<b>EchoMail Program:</b> - If the front-end mailer does not directly support EchoMail, an EchoMail - program is necessary. TosScan, Squish, GEcho, and FreeMail are examples - of EchoMail programs. - -<b>E-mail or Electronic Mail:</b> - Private multiple line messages between users that are stored on a BBS - until the receiver deletes them. - -<b>Escape Sequence:</b> - A sequence of characters usually preceded by a control code to perform - attribute changes and cursor positioning on a terminal. - See ANSI. - -<b>Exemptions:</b> - Extended privileges given to users to remove access limitations or - provide access to certain sysop functions. - See User Edit for more information. - -<b>External Programs:</b> - Programs (.COM, .EXE, or .BAT files) that the BBS executes for added - functionality. External programs are used for archive manipulation, - file transfers, games, databases, text editors, virus scanning, - backups, and more. Often referred to as doors or chains. - -<b>Extraction:</b> - The splitting (and possible decompression) of an archived file into - the original set of multiple files. - See Archive. - -<b>File Transfer Protocol:</b> - See Transfer Protocol. - -<b>Flag:</b> - One of 26 possible switches labeled A through Z. Flags are used to - represent specific security privileges or restrictions for a user. - See User Edit for more information. -<b> -Front-end Mailer:</b> - An EMSI compatible FidoNet message front-end. FrontDoor, SEAdog, - Binkley, and D'bridge are examples of front-end mailers. - -<b>Group or Message Group:</b> - A group of message sub-boards with a similar subject matter. - -<b>Hardware Flow Control:</b> - The modem's use of the CTS (Clear to Send) line to control the flow of - data to from the computer to the modem. - -<b>LAN or Local Area Network:</b> - A group of personal computers connected in a local environment for the - purpose of sharing data, applications, and peripherals. - -<b>Level or Security Level:</b> - A decimal value in the range of 0 to 99 that determines a user's - security level on Synchronet BBS. A user's level determines how long - he can stay online per call, total time per day, total logons a day, - maximum number of lines per message, which Message Groups, Sub-boards, - External Programs, General Text File Sections, Transfer Libraries, and - Directories the user can access. - -<b>Library or Lib:</b> - A group of transfer directories with a similar subject matter. - -<b>Logon: - </b> The act of entering a BBS system through a valid user account. - -<b>Message:</b> - File stored on the system created by a user that may contain ASCII text - ,Ctrl-A codes, and ANSI escape sequences. Messages are either public - (posted on a sub-board) or private (E-mail sent to a single user). - -<b>Message Network:</b> - Two or more BBSs sharing public message sub-boards (Aka Echoes) where - messages posted on one BBS get distributed to the other BBSs on the - network. There are many different network technologies used for the - distribution of networked messages. Synchronet supports the most - popular technologies; QWK, FidoNet, and PostLink. - -<b>Multinode:</b> - System that operates with multiple simultaneous access paths to the - same database of messages and other resources. - -<b>Multitask:</b> - The act of performing multiple tasks seemingly simultaneously. - -<b>Modem:</b> - A device that transmits/receives computer data through a communications - channel such as radio or telephone lines. Modems modulate, or - transform, digital signals from a computer into an analog form that can - be carried successfully on a phone line. Modems also demodulate signals - received from the phone link back to digital signals before passing - them to the receiving computer. - -<b>NetMail:</b> - A personal message sent to a specific person on a specific BBS or at - a specific network address through a message network. Most commonly - used in reference to FidoNet NetMail. - -<b>Network:</b> - Connection of two or more computers to facilitate the sharing of - resources. See LAN and Message Network. - -<b>NUP or New User Password:</b> - A password that the sysop has determined as a requirement before a - new user can apply for access. - -<b>Online:</b> - The state of a user when he is currently using a BBS. - -<b>Offline:</b> - The state of a BBS or BBS Node when it is not able to receive users - and the state of a user when he is not currently using the BBS. - -<b>Post:</b> - The act of a user writing and saving a message on a sub-board. - -<b>Protocol:</b> - A system of rules and procedures governing communications between two - or more devices. Protocols vary, but communicating devices must follow - the same protocol in order to exchange data. The format of the data, - readiness to receive or send, error detection and error correction are - some of the operations that may be defined in protocols. - See Transfer Protocol. - -<b>QWK Packet:</b> - A single compressed file, usually created by PKZIP, that contains - new messages, E-mail, sysop bulletins, and a list of new files that can - be downloaded by a user for use with an offline message reader. The - filename is the BBS ID followed by a .QWK extension (regardless of the - compression method). The developer of this packet format was Mark - Herring (Sparky) of Sparkware, for use with his Qmail Door (external - program). There are many popular offline message readers that support - the QWK format. QWK packets may also be used for message networking. - -<b>REP Packet:</b> - A QWK reply packet. Also, a single compressed file, usually created by - PKZIP, that contains e-mail or posts from the user that he/she created - with an offline message reader. The filename is the BBS ID followed - by a .REP extension. The packet must be uploaded by the user before - the messages and e-mail can be sent to the destination users or posted. - -<b>Restrictions:</b> - Flags that a sysop can place on a user to restrict the user from - certain features of a BBS. - -<b>RS-232:</b> - Interface standard developed by the Electronic Industries Association - (EIA) to define the signals and voltages used when data is exchanged - between a computer or terminal and a modem or serial printer. Data is - usually transmitted via a cable with a 9 or 25 pin connector. - -<b>SCFG:</b> - Synchronet configuration program. This program is run locally by - hitting C at the waiting for call screen or by running "SCFG" from - any node directory. - -<b>Serial Port:</b> - See COM Port. - -<b>Sub-board:</b> - A section within a message group that contains multiple messages posted - by users on a specific topic. Also referred to as a conference, forum, - or special interest group (SIG). - -<b>Sysop:</b> - System Operator. A person who participates in the maintenance or - management of a BBS. In Synchronet, sysops are defined as users with - a security level of 90 or greater. - -<b>Text File Sections:</b> - Areas for the storage of text files that the sysop wants users to have - the ability to read. Often referred to as general text file sections. - Common text files would be information about the BBS, ANSI art work, - and documents on debatable subjects. Text files placed in text file - sections do not get purged as public messages do and are not part - of the transfer section, so credits and transfer access are not - required. - -<b>Transfer Protocol:</b> - A protocol designed to govern the transmission of files between two - computer systems. BBS transfer protocols are usually specific to modem - transmissions. The most common of which are Xmodem, Ymodem, and Zmodem. - Most communications programs contain built-in protocol support and - stand-alone transfer protocol programs (like Omen Technology's DSZ) - are also available. - -<b>Throughput:</b> - The effective rate of data flow for a file transfer, measured in bits - per second. Throughput depends on the connect rate and the - error-control and data-compression protocols, if any. - -<b>UART:</b> - Universal Asynchronous Receiver Transmitter. The IC (Integrated - Circuit) that controls the serial port I/O. You must have a UART for - each COM port in your computer. The most common UARTs for IBM PCs are - NS8250s and NS16450s. If you are using a high-speed (9600bps or higher) - modem with your COM port and having communication problems, quite often - the only solution is to replace your UART for that COM port with a - buffered UART, usually an NS16550AFN. More modern UARTs are being - integrated with other peripheral controller ICs into a single chip (or - chip-set). This design does not allow for the replacement of the actual - UART. Internal modems have their own built-in UART. - -<b>Upload:</b> - Transferring a file from a remote computer to a BBS or other host - system. - -<b>User to User Transfer:</b> - An upload that is sent to a particular user or set of users. These - transfers are only allowed if the sysop creates a sub-board with a - short name of "User". The sysop should set the access level to 90 and - the upload level to something in the user range to allow users to - upload to the directory, but not be able to list the contents of the - directory. A user performs a user to user upload with the '/U' command - from the transfer menu, and the destination user(s) can download the - file with the '/D' command.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/gpl.txt b/docs/gpl.txt deleted file mode 100644 index 60549be514..0000000000 --- a/docs/gpl.txt +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/docs/htdocs_contrib.txt b/docs/htdocs_contrib.txt deleted file mode 100644 index 974404fa85..0000000000 --- a/docs/htdocs_contrib.txt +++ /dev/null @@ -1,112 +0,0 @@ -Introduction -============ -This document is for people interested in contributing to the Synchronet -Documentation Project : http://wasteland-bbs.com/syncdocs/ - -Synchronet and it's related Source Code and Documentation is freely available -and is continuing to be developed as an Open Source project. - -Active contributors are currently needed to help with the conversion and -updating of the Synchronet Documentation. - -If you are interested in contributing to this project please contact : -syncdocs@wasteland-bbs.com - -Availability -============ -CVS access to the Documentation and Modification History is Available at : -cvs.synchro.net:/cvsroot/sbbs/ - -Example Command Line to Checkout the Current Documentation Files : -cvs -d :pserver:username@cvs.synchro.net:/cvsroot/sbbs login -(Enter your Password) -cvs -d :pserver:username@cvs.synchro.net:/cvsroot/sbbs checkout docs - -Web-based CVS access is available at : -http://cvs.synchro.net/cgi-bin/cvsweb.cgi - -Instructions for Working with CVS -================================= -First, you should contact the address above if you not already done so to -obtain your CVS Username and Password for CVS Access. - -New members of the documentation team should first obtain the latest copy -of the documentation files from the CVS repository as described above. - -It is important that you keep your local copy of the CVS files updated and -always start your current editing session with the most recent CVS image. - -Example Command Line to Update the Documentation Files Locally : -cvs -d :pserver:username@cvs.synchro.net:/cvsroot/sbbs login -(Enter your Password) -cvs -d :pserver:username@cvs.synchro.net:/cvsroot/sbbs update docs - -If you make changes to the project you should upload your changes in a timely -fashion to ensure an organized and efficient version control system. All -changes should be *thoroughly documented* when uploading to the repository. - -Please refer to the CVS Documentation for information on how to obtain and -use the CVS Features and Functions http://www.cvshome.org . - -If you're looking for a GUI front-end for CVS management try these : -http://www.wincvs.org -http://www.lincvs.org - -If you have any questions on using CVS with the Synchronet Documentation : -syncdocs@wasteland-bbs.com - -Working with the CVS Files Locally -================================== -The bulk of the HTML Conversion and Formatting work is currently being done -on Windows 98/2000 with FrontPage 2000. This eases the editing and formatting -of the large amount of data in the docs project. The CVS image should be -portable to other platforms and editors as well. - -If you have problems or notice any incompatibilities please contact : -syncdocs@wasteland-bbs.com - -FrontPage 2000 --------------- -To get started with FrontPage 2000 the easiest thing to do is create a new -web and point it to your local cvs directory of the docs project. This will -convert your local cvs directory into a FrontPage Web and create the -necessary files and directories required by FrontPage. - -To do this follow these steps : - -1) Download the CVS image if you haven't already. -2) Open Frontpage 2000 and select File->New->Web from the Menu -3) Select "Empty Web" and enter the path of your local cvs image into the - Web Location Dialog Box (e.g. c:\cvs\sbbs\docs). -4) Hit OK to Create the Web - -** NOTE: If Frontpage asks if you want to overwrite anything, say NO. - -After creating the FrontPage Web you should now have a local Frontpage Web -containing the documentation project. You can now start to work with the -files and contribute to the project. - -** IMPORTANT: FP2000 has many features that require a Web server and FP2000 - Server Extensions. DO NOT use these features within the - Documentation Project. Compatibility between all platforms - should be maintained to prevent problems with other systems. - -** IMPORTANT: FP2000 has many files and directories it uses to manage a Web. - These files SHOULD NOT be included your CVS uploads, and only - the Documentation Project files themselves should be uploaded - to the repository. If you are unsure which files are needed - when uploading to the repository, please refer to the CVSweb - http://cvs.synchro.net/cgi-bin/cvsweb.cgi to see which files - are currently checked-in to CVS. - -Working with other HTML/Text Editors ------------------------------------- -Working with the documentation files with other editors should not be a -problem, but there are a couple things to remember. - -1) DO NOT use any features exclusive to your editor or editing environment. - Efforts must be made to ensure cross-platform viewing and editing. - -2) DO NOT upload files to CVS generated for or by your editor of choice. - -** Only approved HTML tags should be included in the Documentation Project. ** diff --git a/docs/images/baja_example.gif b/docs/images/baja_example.gif deleted file mode 100644 index 2da720c7718e091ea918b12ac022a2a5826fe779..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2968 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 Ly6q_r3=Gx)4m4_& diff --git a/docs/images/bre.gif b/docs/images/bre.gif deleted file mode 100644 index 32df192a6bc155a42bccbe729112250bb9b3e046..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19766 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 Ba-{$O diff --git a/docs/images/lordcfg.gif b/docs/images/lordcfg.gif deleted file mode 100644 index 8610c81ad19402abe10a0aeb58ed49f6a94a141f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13811 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 L&pS9UFjxZsL{;pX diff --git a/docs/images/sbbsctrl.gif b/docs/images/sbbsctrl.gif deleted file mode 100644 index 6a5c50a6c61c9981ebe4b60fd4aeb08e447f0641..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42138 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 diff --git a/docs/images/sbbsctrl_configure.gif b/docs/images/sbbsctrl_configure.gif deleted file mode 100644 index 1f582c25e52df91e7afaadd6836fb88313a58933..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15706 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%0A6)=@QO;f3L<Jo9cOm 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 Jq5}hiH2|wrNI?Jq diff --git a/docs/images/sbbsctrl_telnet_cfg_gen.gif b/docs/images/sbbsctrl_telnet_cfg_gen.gif deleted file mode 100644 index 6193436f33176edbe77c1e48bf107934dd81fd4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8373 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 V)UIsP^t*4;-K%f)O9?Po0|3PyP^bU^ diff --git a/docs/images/sbbsecho_additionalecho.gif b/docs/images/sbbsecho_additionalecho.gif deleted file mode 100644 index 601ed4bff50b102df83f005795d7f9c720396afc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18889 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 XaN6fNFJscJ?@OM~Jm%oQz+epkg%>3B diff --git a/docs/images/sbbsecho_additionalecho_list.gif b/docs/images/sbbsecho_additionalecho_list.gif deleted file mode 100644 index 2f4f714e92b7e7e595ad1fcafc03f976b1baee96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21013 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 OM6<XAGZPa7gEau}j1^1( diff --git a/docs/images/sbbsecho_additionalecho_list_tag.gif b/docs/images/sbbsecho_additionalecho_list_tag.gif deleted file mode 100644 index d568976285d1f118cdd5417b8d0eb404bfd9d984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21740 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 Zeeb3Be~#Y&efIv}xAz+=C@?Ts0{|ZM_+<b9 diff --git a/docs/images/sbbsecho_archiveprgs.gif b/docs/images/sbbsecho_archiveprgs.gif deleted file mode 100644 index be119e731dfc524cc7939a044bfc195a32671efc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19450 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 diff --git a/docs/images/sbbsecho_archiveprgs_zip.gif b/docs/images/sbbsecho_archiveprgs_zip.gif deleted file mode 100644 index 0dba7cfa8127e637400d332f6c6c80cbd10138e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20990 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 diff --git a/docs/images/sbbsecho_logoptions.gif b/docs/images/sbbsecho_logoptions.gif deleted file mode 100644 index e0e71732803395563f85692c38b105033a185fdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23649 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 OqDfP9RM?o97_0$80@JMk diff --git a/docs/images/sbbsecho_main.gif b/docs/images/sbbsecho_main.gif deleted file mode 100644 index bb8020a8724ba0479f0f641078f716a19768ae74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20695 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 ai)A#2WwcMr;Of4X(Jz*6sGz{WU=08XMiVvw diff --git a/docs/images/sbbsecho_node_arctype.gif b/docs/images/sbbsecho_node_arctype.gif deleted file mode 100644 index f7a8507dced64485d7c9f15adbb539473dc7336b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22179 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 O#5wMfp@ISfgEatG8^rhk diff --git a/docs/images/sbbsecho_node_packettype.gif b/docs/images/sbbsecho_node_packettype.gif deleted file mode 100644 index d56860c3bfc062d94b2d30f53d35c12bccaa90eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21622 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	o_N>e=9Xv%Tl4(;LeRN6ez1 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 diff --git a/docs/images/sbbsecho_node_settings.gif b/docs/images/sbbsecho_node_settings.gif deleted file mode 100644 index f0c71add01364a37bbf5a479fd7e6470b49ceabf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21517 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 diff --git a/docs/images/sbbsecho_nodes.gif b/docs/images/sbbsecho_nodes.gif deleted file mode 100644 index b96d503393f2920bffd64ab5c1375925a8dac4e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18837 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 diff --git a/docs/images/sbbsecho_paths.gif b/docs/images/sbbsecho_paths.gif deleted file mode 100644 index 0ff15c32ae4b41814ff5e88c17cf88214baf9fd3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21546 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 diff --git a/docs/images/sbbsecho_toggleoptions.gif b/docs/images/sbbsecho_toggleoptions.gif deleted file mode 100644 index fe06c30afa7250d8d73802b10d5abd320197ebd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22498 zcmZ?wbhEHb>|yd|{LTOYEes6*8CqI66tg)rvjsq?SirDY0)(n1EUOhks72AKMboK8 z)2l_(tH;o*$1teJFldTp&=kw4DV9-loSdATqUJay&+!7GrC!-fgR++f6)z1cUK>@s zHmZ7URQ1;6>aEEwTa#P%X7}vP?m3n{<yi5QW5sih70)?WJ?C8Y(sL~>EiFsWwJg2X zvi4dJ2;J-1dT$B{J)g4o`JBDa=Nx;#^w|5Q=iV<p_x;$hW7n>o`~RQe|0oy@0dhk? z2b2RqdBK6>A4C104~i2W9BAU;*D^U_ka)P2PuXeCj}41lx<&M}&YTcje7slQx=BWJ zQ_6|SDuJ_nP8Kcoo@x+%tVVOQ+S%F0#ka0>7OS_(J8}pqJYa6PxY%RjK8dIXhhS#E zg;E*`4;UDkLsy0!tvbNaw2FO~n!$tz3{9Ij&n@y@t<ZRTJ698n=LQ8v=3QLxj3PET z<lo=R!@yo9FoQAia0jP#MZ%1YkB{;zIM*>WZhFcwO*Ld1x8vsL=Y-T6<_SbOW$biR zo3L)dtgkHBHpHLa7I5$o%dH*R(FbxB55K#=uQvNdu4D6uN5@Q6&M!!GE`EC6(&qhz z8s@Kj*EW|Q*mt*zo&Wa1fA#<WHP*EA%Q;m1_~2Ok`@6!u_8$UFM`{GWeeC8~SpT0x zkb%j=sX>`1qKSijl7Ul`s*Z<Kv+9%&2`y?a9*HgLQvwp()KV&(+EwQ$B(*C|i%{ZH z>soP$Q+wNqMcrCQG#>XDuM=3@tGi-CGPm}Y4U7A2m?TrU^|mlH_q)oiOyM@v;B@BE zv(ZeQ91^DK%wv2&;V@4`(oWTB#wQ#O^BDJ7rtzju>rCS{I}^anYqo(ieU90M%)`8; z*E*f&RX<B`o^SS~p?N{wGlvxm+oe`DFS2}d;Kic8cMF`COn#T}a;Z(sF6U*AJztpE z=88?d63A4$D|5Nh%w5ha?ODGb4*0jI&+1i>^FlT8kZpdYs~NY;6|9a)yW7REf%Asd z^qBOMPp54xQ56UmDE%6mBha9mkeyJJ=&j3KWSOug@!qMgH<%|*jF#MaEU!(9Wsc{C zb!(UH?4Gq}iEqN1oJ~iMN#$<68#X&{*V|{a4;&FJpHq0$aQdA?=PlXi7M}~;?s!DF zczJC3!(4N@il+<9?^Vff-yT=<;o|jswci>Qm}-B0+&-V<|IR=28%(5kC^YdoSuAW3 zkBV4$UapN}QHSEP43jR+Lnj_xGTi6!__EdwiLHGh?{6&b59iKQndqdp^Xo)I3C^ce zQlfvR@ED$8V4j}1iTByG)UKIov(nEcF!N^IJG<=P-JDx5x6f-}|F!%<6PwqI1#L=w z8GPMl_g*}nY^1kx=~Ta{mCI(%i@LCat5#~&8n=yED_65Ax(GO~;`^c*up;@vuh$!n z>-~PS<$B)lw>zG%`~7au_jkYFA7I!2^Wlhi{-2L0)Yt#{bjJMspU>NWH@teauFmSf z*Bj~U|1vPL6x4pd(R_aI_s8|`_x^Y>dH&uXx0c8M`+a-1{J)=1cJtf+e!Dt<|KAU% z>-YcqIeY&9AL8~*kM!&QX)7=Yo;bi}^`TLqX90`4$3d>B4^6yB?*9`z;qa~TeFJBW z0*B*@1Ange*Qv|Ia~bb&5Gw0${@?t7ZRd4+4ln=GwOM!B13m0TzkO)^XJ3=}v%$he z@m)c?osN=FXT=c(y^9?-A&Z2UYaG=wyVw=DXOY<E6Gv6@E_TPJBuOmfIA+v!u_wi5 zvDD=g$JBRC?23<hEWNSgnB}pJy#+FhWxviiZuKp&ul|U#ETg4|<GsMDwaIt+?L=Lq z^fq?%{ZUkr_B`ns^=aaaDJg306`sCTlP1splc4VS(=)K`Q_W(NRL#K3Qy!B(O<mQZ zsvZ9FRK%^KX`9xl>gBII9T&D~>i#9E2E~>>abm^OPkc$$nq29V%2Yh_oQRrA;~_2A zsP{7u@GuB8T-cji6g>Mr%c8XnH_jF`O`h{Y<+<7EmuJg%eV+TFXSvOD&+}EcKF|B{ z@62+$?<ddK{rWtgfp>)iyVr%Ldz<H+_0cd9?efhun=-@v3**-ki4(S~3g$ldS?*?j z>SABjm&FRaD?Qx3E=|f4S*&Ke($cvrXv(t7OEr5}`lNeZo^|WXGKHfrta?8&&C@!% zoMD58;(Lt{=T93axNc436Ypef;|gA`eRO5Wa<8kaqPEU;IPxlVZ|2o?RbN*p@M=4q z=WLia?dtM0-_^mLJ1=aryE5a#9>w6Pufh`3t}LiHyE^Xssq6cGeO=$cyC#9X+rMR* z=vs%jnXxy2g{A3<tvj$}nalK3C%VE!R>@7}wyb^7{I2lZ<^{ZKGu*vzUFy2Fd5-Ja z%<$b&S2umzx}o>q+MIOn+qZ6g+qUEE+Pw19x34d{wsmi=Zki+eu0>MUH+i_~1v0M; zS-S4(j2UlNq%}(4dA00Y>$S7%%C?`r`>yKy?gza2<?m1VKH8_S*0y$Cvb41CF{>%l zisotr%b)i7lxD`EKWAOt$J6)!mF4eZyrJ*T_$U4k+l>S4Y?_UqxgW5q&zQrcXVAiX zCxJ`($3Y3V<;_P=J>;wYao9rjLz`;O<%do0_Sn3AnRtFz($P)fd*8OcsczSZ{26Ap z)1&uYgZ`ZazUUpRMYp}`aP)biB>nS*sVi^i(X6D%g*(=y*{+@<oIU07ql%s3cCQpy zyWd=P>H2i5doLzTUX!BIz4J_(-{ya_uAg~kc74mq%})ALBj-d&-2QpmVA->nojuPz zZ-wvT=qqTGmq{s%lei!pSJcM3HqcFc*2T_$FBbF5zGUIQd2q6t;gWKlL=W*>XBV&; z^=qDeF#C|DroUTZ_tKghcKdH!HU5|2l6xoQ=_|uCy?kH#MPox9lYd=EmD}849{Vz2 z`Q?aYGoy{YXWvZJ+r4^uSl68AHtE{QKW{~yGn1Nq`l+?P;PvBbrJIlY=B?`6eCLH< zx!2;_DIx1;om=y*Y|VA+_Y&3m`(oQl1rM%GjMc9^xQ}hyj^Arv#zt3N7nJ*Uu+q1n z;rHwd9Q_p@vVT9MtM9(T`n+U0`@ifS^*ax~-?do(&wlQ^zrV^a1f`aDh3|V6`a1g9 zyI#vP_7RWuqJLkz-;%k*R<EFGvgDKWZ7+{D_kHRUu6>bhR^`b&uh7}t_NKhJ<*9Dp zpe3hGZZNN3b!y?BqO8rkPHp>^Jnd-T+uY)tJN515_pe;{Zrkp^ZwvZ=`)q&r&T{pR zbD7(>-+LNsS9AI6RsWdXm%ZN>%;%r?uzQ-tk^gs#S-<~z64?J`scuctD)yU~r?l<b zub%(oM6}K8BKu7pmVCb^UWz@ZyS(V$PrKr(%N8M9_EpNV%Ky4```@=6?Z02{{`a+v zIrN+J)v^yK?c7}6MYgX#zxUJh^M9Ugzq{wMU+tc7|JnoJ1I}+*x6fedzxs%G%HLk! zYcKC!?i;giyY$zK>iZ`zjw%0aZ+Y(d`>NlM<Ny7-{r}&O^ZWmOKmY&V@BjZ9BpR43 z8vcftKYX6_^;p%q>s9+qvdzTH4vROsxz>p6aAQ^wzuw%)x1{mLW?zXb4ssEWiWUsY z685S;8Z~A#Y3*pzxzVKeqsc&`nP*9(#EVjGwi;oLMvECC>DO~_sTXrgv{bWuic7Fa zX0%9mv?#ssy?NQssKVCoM@x`JYe+<ESVe1ug`-JE%ii+x%jvZa7A*-Jc6G<olQmkn zG}<n0Y2`oCm{ZYm>u}@E&us+}?IkzbygF=)B3jBiTJmPJ*GP0oWV96RXpgMu_}4L` zqf4VTr=o%3Lo?5ewkaXS=U5vpD>|(+I{j5T8YJxNBif5^bhb&f&;8M|*rQ9Zq-$kF zm(Y@~?jKznB)WA@w3+>=o>kGEyu8`*NbZU9wk(OZNggfb9S-X>x{p=#oS4ybYDdqO ziiU$Px-%o%)-rcyc=S4V<lLCiduvDUog2OPe)K+&=zC<*_avh4Sw-KA8GWyI^u4*! z_rijqFQfPTjD{&Ua(6_O?V8a&BcpSxMe5$`{ej>5nRX^I{0#o*F@c#gg!N@L`^pKN zHzx>4PT;Vd$mcmxFmr-X<V2~;i99nW%Iut=@N<Hk<s^y7NwS%f6f-BLP3`=3V$u%@ zhGXLYsy|swzQExdTQRwB#^jJ?lOJrKY<F|A!_8WI%_)vQYh5a*xXqmMX!(@5jw#+h zr}&<nVqrNY=;UNS$*BRBQ(b3H4U3!_5*hZHqvu*j?a#2uX)_y4I;W*;PRo|;%se?Q zOLBUF<@CIp)2?Pr-ybo(XytV0Ck<0?O!}@-^P6Kv%g;%AnlsuX8=Es{G_IV{IkUef zaz@9^851mLPI@_G%FY>I4tM*APOJGjvwY|Dg`U$FbIz)aoVB8I)~c5?SDu`;`scJ| zFK2Dy^t@ydUtu|WJLl}RD`&5tIeVYxti7Cbc4*GoV>xHZ&hoDwfzu;r&e%C;*3CH+ zCFf4loO{7??zPCdH%`vE_3!7L+dpUA`8oHV<h+?DXZD25dG>Sm@yt0JE9V{QocH?W zyxpAh56+zTMzU>drmf}+Cxa!nZiTjgEgAkx+B0%3==WG4TH;_V;&j`1!Hr@O?x+R- zI2WF_SSS*;P^@a9MAgE&ms(607g|4Ds35gSLU55v)FL6pMJkDlv|cS#-nB@NYmtrM zV)<LbCR&S4trnZjT5PdvvH7jVR<9P@{95c}wODqR$2udCfI?A^T}!-fE%DS64X6^0 zFkBiEwKSzsG`VnTo}*auN3pnHOXI4<%N~kV87`{|l*pL1EbEj6&w*uqAD88N=@nTm zFRId;TDW}LMae2IsTwK$rGZjknO3YaT=DN`(2BpG^#5#<X80_9z|ml@p^W4P#=VLw zr4PtVlv>FfEPK_^aL%oj!jBo}ORZX9wQ9*L#${EjUMH@4v2oSPQ*v(%<<*#1D;miE zIcW5!aJ9a$g1)hW(t*{?pA`0<Qs6gQW0S0StZI$Kq&2Ra*SK9?<F;AJM|f?3@!DWx zQ(GZZ`y$iGWEHIfmFQ#@Kc;mLxR{?rt$UWWE^?FElUb@Mo6O#LseO=I|0&Bn<&xT$ zDD|?-YL%PT|GBlk$=QNow*`~+hVI82{lc2;(weh2ZJ2p^!?Z^mW`EisB)w6Dd!v~3 zMuBeUE*5PD0T#E18|7|q^a|8=d?4bbB_8ro+i}7s$AEvLTDL_H80qNF7GpQiy*x?h zxRJP-wC<@xx{e=oZYqh_DsH*?X!ET{n_DjG-Zj#DnxxmQsK<Xm@==iFCnm->LM)-$ z`cctRMUGOj-umkn>i=ev-g!`(@v!tkM}rAbGMvUT+=~s)FdFhNX1tUrdsfj<Z1VQI zigMDIw?AbxT78T0oubjlz#SX2<i9L5`nk|Z@36d~u`%-}`H8nzTO3xf+^itD$=H7L zPVqyEib^JOkJg-DrL<(ViP0mID^Y8$o7P$tt&LDtx&3Rc-6j?9ODaA}W>36SQ;SvK z%rc9;WR~x&X0kyw?U7n>vUx@Gp2A7%b1s>eG^zjIrQYyJz4?=R>%S(8uE`o5k1RO2 zH77V}&MLAL-Oaor$V&8~B{L&~;KF@ArdFIEnHM$-tTc|4UcJP(aKBpjeqTco?_VN; zic6yc8Dckz#(oq{Ogs=DD3%_$nfr}c)<TA?hhn*b;#>jZ<%tI+-iSAT6wj!Vkeefs zduv%spkAStWU1Bisg06z9VLYh9IARHxlB>&qtFVIJyL564{toE|1W4;_o)@Ei?^{c zuRQ&6Tk&gyix&-qlDAjBmc2L8ur6D!!P+P&XUAtj`L7=te*~`n`q4=1vyri}F@w@h zgUhSUnH8r-ugN&GQ|i-BsY8l#PD-xIyUud0U3Ob(Wwf&4BxQ?ByKes4<;<k=?_QTm zyzvSDM@+k-&7z!C_v|*?|5`OySS@*yTIu9H*-YwrMdmZ!?5SnmTg_x~N!#M8w?<>r zUY64qJxLmUOq%T3mQxOIn6Y`o2AR{FWKPdCKD}X%=G7zVLPzX5yIf2~993A({MtNU zXGzCFpH`PA4xF<Vp1E^|=}42D%bERa9HdOn$Zm0ZdD&U(i=9)8!$}(lhAU?okDR?E z)BL29@m$Tq`*Y5{xpVH_pK~8%&VMYP|3YW}E6Mq9XP*C(dH(CqdB5JA|NZCu519)r zycgJN?M~jDIrC(oRe4@ys-M;I0>QU6BC!|6WUJ0;&XcsAXM3ajkY}~H>?I}JODccU z|Jqz&zx&Vo%bXg8*h@vvgD#3*w%i`1D;g>ldO3M(nZ@691JjFoxz#g7`~TQnIW*;h zx!YX*E0^r|Uh%nm<w;tS7H65X?NyK3PQ%RN)yuE=?Y$av_o}N|%(;q7pEGBr{4788 zGhM1Zb}sAW?AoXt-l+XwuN`oWU9vQ)ur@aL?X`ua*DGwJ%FbS^@xA`Y^hQhUjkekw z8=gir&Aq-mHU9b68xvy7lWNcNa#ZurxTrff(<!Vf^!QDa))M8k(m2~&i`pvUwpKq= zpA-~(RVw!CbDhqaZ*NX&OIs3qd)wYCE9Pd!|74otdsCaYH^a9?IlaK^cyT6gWf%J` z(eKI9VHFZ$w@%+J+5XS=u4Zac_x8{>(VG*`7VZAq;Szh{Ov;t5Z8wc&i!SNjGBnLm zFt1wHTd3Nev*26K72PTa_OP92>!f#1;@*4z+|OH)vG+R6?kl~$z!dkuGW6aB_4?g+ zZ}0heJ6-nnG21&m$IEt_J)GuVDdk?|Zk{E0u5z>NLs7j_>+sBZ;rFHM?!N22cjfFo z#eZoWbxA9(-<_=6|44S8K;6AfbML9uRmd%iJooou%C)i^68Ejw)kIuR{9ZfB>)x&F zH|IK*T+LwbHP3qx?D`<2E?%qdsm0VMQ7glY`=+Pnw(;{lIL=$*C0;u9d9hd6qqnt% z=X7&UuB}j9_t5S8W5&Kmx_Ng_<v#p3<9o@1<Ig_zK0iA5>D<_a6TG?l`|9rOoyx&+ zFZu2)=~Z*q*goY>zh_fd(Q+@_GOuE8?2~4*C*I$me^~qUh1iRbqfb}KhWt5uOD1=T z+}wFn*5zzDn-(UQH}l`+t$wfak3UWPdsp+W2j9GT4_qRS#JxFI_vXaBH>dW!IpgQg zIN?Ez`W2?XFIGoBUTx>5IrF~8%vV>;>MxwDX8BR~e)$WQh<DHG-o2Rj?$y3`Z|=Q& zW>+7$_EpH;Cl7XZ%if*2=jPM6lP`XqoBE3V@jv#PtUqqNi~GP<|AAxv2d@1em~YhW zwR_9c=W_7h>-c?bbtk$OuCP^=Xp-S)33%~Qh2xXDMU(o8e-0}8pEUk|<S6;1CI3nH zexri^c_aJJT{k+6-o4h4y*KUe^fh+xZ&r5B>1eO2_$U_Av)SW|$^0)~`k%MVc;)l& z^F7X|b{(Iu@FhFWZ}Fbr;x_+l%>AzhH+s0^KK98yyX^5*P~Y?Li%zc}Z8`m4oacYc z`u{Eb{<jq!Ukl>DH^2CHWX1Qkh>kTozQ)P_2+sKYNAKHyxtCmTKl`owkyG-u>Hm)j z@;^=ezi|Kj(*6F{_qcg!`qw7i|2gmf&#oKq_vHStv}X{G|CRp!1>=ROF*on7>7Tkm z|JSDfzc#=Bwe9@-E%SeGub;ZL|M%|w@As_#z3+eNlK8LJ&i$Ac|Ncb%+ko?brvLMQ ze^UPMx%Gc+<Nsc;|9dIk<KNz&clbXZo&QVZ{@+#q|31<G_mDsSa`3c!`TthL|9k!a z-{bTDLf`-U$p8QO`d`QM|DN6d=g<28=lKPgnRs{<HYgly=46*L*>OS9v5iC7spiLq z#6#V}x?XEKCN6gB7jewu*%_E}tWPC$S&HQ*Rj=uWiRb=!d`|J5V_rJzN#v#HUNbGL znYLzLau<-dk4yN`7^2xWfl1x#u7&BV(AANv^S-Xws(rm9?r>A7#x|Xs&1shxE&X-% z?Tzi}kJrt;E%q*UXT{4`TW4Q?e{X*+BfnUTg!b*jrNW<MWp)@oJl=NI%gx5J=(4>3 zY_-^|o5iUY{&m@R^PR2O^72xj|7t(p%B`=jP4PVM<~w_9?u{L(*PqqyE`N7_cP)Q= z&6oE6rL*VrCEUC7v-rh1aU*%jyOs<LXEsLH@0<I({PpG8{_61)c2&N<cd$5o|GmG} zKR!M^zdZi_zuG@PzrKHd|Nj4a2Ie*IHO|c_T4l^AyoYc18<CO^jvUHU3Y@sKw|sEo zG5*7Ee0GkN-sUBCB8DzPjwXdiguPt~T}7jPKDvq}mKeH8rEdvzlgU2w(M`7c$;ace z&0hjN6xvNTd8l-Td^({zIpve5`r@1-FO8K`KAn6rN2!59UgFCq?>BKbHZ|z-DlA|y z=5?6Nz<kBzL4!GWL$MzV&p(F;4J`N07&F=kJ}_pqXY@@7uov|>aDkQ2x1o_mDD}Wa zR*Bk@ATQ<A2SMz5N2fIUSf@T<WS6OU5FF^r`n8c=!9cVrBsz6!C}%>eLReJ#+)$>N z^tldAvDHtvGR3K{aEM51H@z0Yt+hfSGHv!&h2~V<31-ciOKZcLvyBggG3V~Q+Hjk9 zA8&XJ?;+mp%|+%8+nGymzio&uv#r?9T>0|t1Lo?Fe-AL%+A<ux&;ReQLPC@Cj{^w; zP98s)1%>h=S_E7gB9a8%7DTWJshr!<(&hSK21}o}#6p${-fBBprUaTTY?&IW_mE{; z{Is7eGcvdROq-J%*7$60^|zla^Z$hkRAnq`&vR@Q4Y8<dT^yYd^-^q6Sya}_#EgTl zR!0{c%v!gz?_jG$0*7_Z#^YkqY!Yc5ifmg`6K3a1UYVEJwj*=K!Mxq+D<0<U%U*Dh zZEx<6-E0SQ748&B3;F+HlP(CbX+M_RAk%)bc)^^alf@V26rHucuGlVX^1r6!g5!Ui zFR~>!5=*a@KS=y~y__Sd>{j-6S?1ft>t&g*mwumHF2@y;cUrIcz`2Si`$Z-<+&ph% zeAe`~4TG=6{VjEV)(`g-pSNRwTNmIcEn8CdQB<Lx@soP*m7s5?XG?<p?4NGAeACnR zYDjRj>(|h5WslOb=!;$r0w1ofQ!&^b_cklypRhvM#;(*xP8IE@(~A~tS@cyWJFq+I z#-(eUw_J71Zw-iktdzL(RI47}9Pe1EhUvQ=eAO$xdOGg=Ch`66j_S*>^~5V^NE{Sm zV-l3%>0qypIHGoKqd>%(WQoHwjyjnc^*8EtX);Hiin_LG#=$czrn7HyZj0DF=Oz!U z`EAJyXMPwjWL%q(?KA6A%Qll0n!TC9i=(dW2s5=#JDaV`ar@etZ^t*CRhW=JIr`2G zH}idGb@R(^ODi*mTkKa{S1@S{<71`i7ROUJ6-_F>^UUU^WkA)sl7-f>d?DplS5~eo zUDGYg-&CL^q5E{IJ;Q<Ste;cv&E&8?els;~+NNEPQ#3V?{9~RxeV52GUDJM_v{|yV z($X8!oQydNX5D3+mw8s<PG`+kp960M9QNh0Db9H;yqrnGbhnGE)||;s>dddg?aSF7 z25l~O`1?xJzv|xmkl!g+-+cSNUtx(BlfZ}PjLi-g6drIjY<@h|sd<Aoi(kV+Zj)&n z6fD-Hgl=d$w<>I_MMh(P)$3*@lSEJN6MACvF2w4kX!4|M=+AiM9rydy^#d%&oaeCd zBwFW29BGg+RCe>}lnq{V)QIh9uj9uQW$VaONzXRTSnJarv*f1uUI{m&S8sZ<p1hLU zn`N?OuVJQd^{gw;BHY)wo@K4NlFajiqj_zo@4B>N>05WMnK?-n<rO;rQ@JOya{IoE z3HcLLbW}ylJ&$|p70uWzqi+8*B4FC4lEuz*Uj|IKI<sqC>H67EdsAl4jGp#l+Wskb z+xs|gUHCVNeV@q%gY93UZX6TamXZ{lyKwq4^NpH**H7P@{c4M?^~aO`6<qTdGA&(E zqW3DGC#u2fdbp<VPW@f)cc=exNZlW_P^*6RCHenK3XLIWUombyCAzLC^gx@@hBDqY z8Lq~^?qwXk9wm8Xf&1pCx)aJ)N2{rZ@32TXB)TbkseX^*o`fjpnYSh^lYQ`z@B2~b z7S4+aT(2_)`#Cl)@;bA^=gAF@NxKXuE?m>)TdO4&u6A{1?#I;dqgmb6+pe1M`S!;1 zuKp)|*y`FQx3_E3&n~`lt?IaS+uN)Z<|nrj9&D3Xur{}KinP-EW7l23`Q|sxWmH+M zbMmmP*v5&o=OpQ}@6>O%oU&+&j;3#VWaz4*scWa)<-YSL&El|RdEv6pvn#JZv%38A z+`*jOv?3KHhs!5CHt+=Yv*l*U3En#I7ge%2JSD^3zRIn!Ep;h(>>_XNUl$wvN|u|h zUF6$*>vE&m*X4;WFN2(CT?zSAygK%8mf!YW7bcwBvLJizt3Z3st9^QxmWj@Nsm*%Z zOHJrm(Ie%FpB1DPA31KTQ7D?9W*u$w*wMdr+1v$L#mjG=KDVuH&);0G!rk`g<+hg` zS({rF&tiLeS=p|CTmR0<Xji}cv28-(gv;qH2an%<<7c*cdF;H;EH*cT6FGJ*Wd6`J z{rFv0{~eVA>jW#-@4n5HzvIAq*}^X48ry$y7CUVJ6|(-l{ZRS*kAtdlA1Bp6f27&p zx4(6>_*DOzr)uxNor(4<>N#@ULRM?S7R!Hciqn_ey?W2=(97D-^Mh|c`u%MCCH8qj z#n1OB2C`f2l+XLHusi0F>vqc%d;gVYoWHH)#NK~n{oTS<-8GMW)2*-Xu6wuO^zY}f z^MBnieJA%+WVi9gPM`bnpNkIsp8LLDd`}*i{G7wW>K|It|2&Y*|8dOu-^Y%Ao2TmQ zf9$&*{XSr&%`<C$ne*{-UlzyjdExy}zw%17-PeWjwl9U>|2jWE?(61s+qa4Gv*+g5 zY3K`{@~_x0e4m~5hs#UbkL~||-{rRd>B?#Mxp)7cN6PzuUJU>Dr9b}f^Jw{B*UR^P z+5ErueY^bcNALgrI2&L0g<s|Uk7EvRcJ9qlI3mySzJ326L8bpc`InS^?YIB?_kTSD zj{~EO1Cx#evyB6bj{|Fr16z&*dyNA}j{~QR!}rw=m#b|LALyx$w&&T?_3!aEewU8F ztM~stZ7;~f^o#o-XN;p*j-z;uqePFR<Qzw-nuGjX4qThO_g3(pJIVXs{yxah<M_w= z;7v_OQ5mNu4X1y`2c>eH)N7nHdYm-pIBBsQP%!!D_`%x#mAC!7+fMpdIGG;qe7fTR z!;V8*HqItF4u66j*<74hw%D_#95$KbY}MmvT+?W9(%FWk!S;x=%obbOJ+}Q99PSp| z8?SM8@j3F{`p_S17x$DyMkWWHeH=Y=T)bsCERP)Vy5i#3bHwkAi!0Aj6BB2<GlzrT z95#4)!2XV-V+se~MccQR_j!uAM!7hf_Z;z=;;b0s?91Z%&)CT=<&f!?Be8E>Vp@(w z`5e<!IU1DX7JTQhe9uvxCx<fTxP7%2_*QK1f5$ELja&X7w*nq_*FA^RbKF8=j)tWi zbr9h=``OXi#jUW%y>gCw)f#t>H}=I>4yT74<#usD@Y<2@-xRkevt6roJeqAhTE4iY zxwx_=p2$+!uV3S#`{ocs#Qv|B-I{9bRe2cX9XRBFcue5&oG9ZtNyl@tj%SmF=hPU_ zX)+wsYCLE3c+Q;TIctsQ>^+`y&Untfb8=?M$-XBZ^J-4!9yy+*<yHUWxXc@Cr;_8` zXFT$5pP0{bs{f1UDwb2L=6J0vIXPvI*W@oJ=O6Lf@Z{8bpOX{5c&!)l+`PqWE6eEx zIo{iAym$0?@0@db_7{(BPfl%K<DI5+s_lsL5|$(TL);sVxOM7qEsrr<vBi6hjrY-> zQyW#hC*+)2m*R7Djn9dgGwY9>IT5q%=$TVnmv~>`@x3VHdr9Z)iYccq>zw{~`pC(J zbL{t(Y&Q7l-8kpOp`H^rw{#lZvFX|4!f@vVgTz7cC9)h>WVJ;6j+mTl@$q}Q#9sBw zS;;%z293UUN1WT1oGY^NdgIcw^vQv86Sx1LeV_dC6}htiqtBsFIp;prcs+3O|15I; zONjpy9j9+1{-4(P|JvjKC*=IMGv|Bfoc|f)$H061tBn8un)9qJeotQ>es#sYnCDDM zO~8R_SNT1@3oXtFs~q|=<^1O>0iSsMf7G03EcNR>Bm2k2{{xTz!#C%JT^;#){cpd# z!1MJ2!`zE0EPmg60tIa^c-Q!{=6VF{xHGKq?Gg!6;^pi<a_sIGzh`$Yh%a?~RN^RE z8pOQxU!c}pchOuYmajrDTh6k^UU=i<btv2YU5?kiKl?>>1ODDV&l`GKb8mpzR)3Sf z=S=td^XUePm7dd<y=cDlvf0`odt2v6fBePHTuQoisc4NKd+c$S-mZf>6O^uUaNj*I zZF|moZ=mqhi!!F?)no&H&$+_ja#0{PNMLR7_ahg)?_Rd|y=rnMSX%aqtnMk@yN7GO zTuiG8>5vKHy4tDy*3ziwir?2OQYwL-TSJ(1!;E_``OH0#VtXwy_NrQFXr;)N=QUTI z-d@z(d#>)xwIz4_4!!Zqn-Z*K<5#%#a?sRk{H9_5j$G6z4gT8_T+(~_-ki&+Q~iJS z1XtX>TrC^uQyX6QuQkk}G_d^dRkJ16Uc9*&x%C{|-=G73cDvPbMTc_4`-a=t2K&lh zO=S(UTN@E_^}3+S#s6C_hCRJuH8;GHHMHyMl|Nf9cZ*&t(!DnM>-9$_k)^#3PQAXf zS%Va6BeKqfDxN)?^X94%Yj|(zp#a~&{<*;u--cVBz1S^#&Mq~q(baicYovxrxV6d+ zmaR9l&$_pU9_M=!=KeJ-UM7rx?hU`I7rcBUe=G?RH9hAbdM%yzX4%~6>d;#icO(9; zxw4D*M&aGt$#=u|ZH-!G>fm=aVr#GSnyW$0cW>FnTv?}T%gO7JeW$ad_9oxa3k%QQ zSt=U3xb~urZ`4`esOhG+Hc!3z&;M&oNo<hW)|d&ZS1-lh+#wrzSvH0(C-!vc;UjNP z&z^gA&eO>Ib7K_mUN!VNb<HOBOs><xy?4}0ZeNr=P-^S2Gxrwzl(=2BQJQn282;YL zeCi^1^_KI|FoUaM2ShICsRpZF4W5!3zHe>#&DN-j-1x(PZ)|Ce6-*6X`Zapt+It7K zMz1i9xq9{X@2B_w#@<(Dz4OEOZdA?f6;lt)ntN_`>Yb397}wMrkxi}-bURPYy;*Sf zPT17wZAZhuO}Q^@`(S_R^}eZhw@eM;Ul;N0uD#&32m4j;9u9r@>}t$y-<#XE#!Z`= zczf$Tt1a=bt_Hqq4Q+mUH}Y!a?L7}pir(9+e2+)&U$}H#+zZ!ROQ+t_)V;loH%aWu zql&K&cc(tQ$a>@P-8<fAAL{K((x2w|cIrX4zN^i($(&^|Z)=wF>fB#alf)Dj{aZKI zs4afKZ(Jkm6MMG@WqX6<%r4Y~-nE$*J*73?^<3h)*m%vfM6a-W`q$!%S{+&EJ*+-+ zmp$%6@SWop(;l?Na;f}tsc3m5uJ>4Ko&TiRSed7nZ|goVtV>awn(C)_p))ox^4r73 zu?b$j_k&C0r<XpB4~y((O_nfyERmO(&X=a48>v_4>|d6UZI;yj=Wev^)3={*cC+02 zyf%&{?XKss8?TSX`7TRhj7k2|deM7c+O4;44tWR7wq1MwH0tBOuTkHbquWJqhlJgq zur}UBE<-~tu{rJj&#MoG|M@nHWhAIwYsm|%GL8OPn-QLNpYdC~z`2ZyzULD6GW_fg zRMkDG&bt$MF8xqP%%Ll39lTMldRODpo~EW<WO7UPEV~#RmT{%^X+&Cz&$|cbO)t*i zdu+#=BylW4a@oVkZ!d1mjV*uoL~-4<yQwGcg+9tn%hXGG^o{v>erneGe_0!r9h_K} zz@c|^GGF{rh5H*!?{CP<-d>k2UE-^x_Oiz1%I3I;Z5pX74rJ|km%abrYmPVfvX{M5 zewH1x^;PGUR~CBNEv~M|>K-58miF?=>4SB~r}pK@O$|LW?bX?LIp_c7T;R+7cTq0) zl3wm*yWA^&xmV3{&FkLmzV_Vm*=9r6?0pSyCZz=&-}g3P-D_vvq=WbF`t!ZJUzU9G zTF%j{cOQwpI~kYzEHCeQUEYhnyqELd?VOf#w~o<rS?<9#4>(<O^o~U4{JZ#}?AXU^ zIjhw2PR)B`)qVD<+q*Au?<|62KKH$U8S-AKZ8M8$-sx%iuioYV|Ci6eU+~{8|IoR# z_kNF7&x^@-3z{<T0o(Den~8lK?EReb4T(?q|7_;}xx4=dvo-(!0s;Py&u4t#D1Xad z|F-!-dazp|`}u>63Lh0B`nl5k`11Rt_7^HF_$agegY5c3>HCFp*FV1hP$(n*Nui%l z>3yN9`M*y};)Uw<MH=h*CFB`y``r-U|7ll1rn_lQ-m{|D)gL9;izWGsWxp57nSYjV z?^8Md!I=G%qWNdjl0M%5g=XoWmE()e?LR-CQEb&;WdFaoV0O_5vkxr#CAZFm9z9mH z=i0k1Gm5y>i#glB{8%9SdPd=&6S5BHOMLH_FwQIzPX8h%A8)1S;@X}YAYL5uzmKcD z#Bg~@Sb3>O{8xkW67P1t+nIeF?O#3ae+@Zb>OKFH#P`y;=Osz{WvqfF$IiWTWp~;8 z?h~_pj&nLk*mJ(f=U;D07JBu6iM;<UTfQuJdP(&8Z~4c+MY(^?J6@W&zRci%Y1#CW zLi4hU{_^bpkB<M$UDNx^Sj6|au$QKqf88+Sn^$>xL40}9@o(QX%70sYZ`l8})&EDi zdwFGlMQ1sm|NeJxG)g)C-U>|js!RWP!r*(O`HxEZ$_e6?`O7PemVeFVFQ2^pTVDOw zlK9F{{>swu@(%y6o#%f##Q)SX&+OqZm3xwR@@RR6{g-s}&PnxOW>5c`@Vsn-{rB?Y zUrPNeXR237gjW>RR~DZCwwk}PB)wwg@n0+ID>mhq&$X}qC-CLdvA$~aszv5pIe(t@ z{jUsVso1i=de8aaJS!{i9ecj>fAz6|!gGtO`_(O4u2&!NuQ^&if#dy84z)k?uNSp{ z{j_-bpZn1@XU^B0^`B6+KJ?$|^6CrQJ8R?1>h=Hj)aP8;{^QE~-*?h#@6`Rhn^$|Y z{qM15wa5EwZ^!?=dA#=C`oH(~*WTx^dmvwT_k8VD`?~A@YxP@e4wQ3jeV6`B{cq2F zo=5Kg?u!3=6khk*{NIz~|K48z_ip{a59jON%m06`|Npi4|1awGU!T{_&;R%Gxb4FD zm#5bM-){cqoO%97y$^ri*MDN`5NBZEknt!;aBSh?74xb1@X)E9m)CB}4g;m5ojm$s zXHEnvAL|vc?%HA@q;hhCR`4d5m!Fi+Og8kr^hM)y+Sy5F#p`N*8aOmCI<zwJT5VZz zaf$m>HPu~LGJ}`6EcBbY>&wckOYEC|{P@Up_}{g4@vEg&wXft{*%WbcQ|xQAtmqy2 ztB)<U{+<!Lr~K-vx7pX%#~rBoFT@v9vEkv74)OVSZ%2H1e0ZX$f7+aFM$b;q`W*Fa z&dtwh#}_L0Pm7uL>E*da7xVr;e4HJzULvSIE_b%ci#ywWUmx2mU7CMyf9P*Ly*m~k z9&Vi|Z2!*2^7GU4vz_Pb?X@a<b&LH6$0z5qH|rz1C&}j9z5V&=#r4(s^;7>=fA@JB z+?!wj@9(c4-(SC<f7QP7=U?-LhChNc<~6V~bu4J)lH-VP=F#JL*z(0TV_~zTS4Coz zbe4x=yI|7~#mKvztYYDtSf}4Dy?yc9qb|K;H<Wq}w9=DHETWeGQ|`7oRq?pT?wW+k zL<gyv$rA&&ev|4_=lYp4$=dDa<0<w^l}n~X1g%^;H8Sq!(&>qLoX=(?l|`zhu5FyY zs6x5w$FkXlNgU7T6qRKx?<jp$`FvjGr=QE`H->S%SkTlKp|Pl4%S<_obT}i`(30 zWiUK6U8ywPIgRV-vd}EAXEPVpWj$Mw(RE65#nO4NG*>OzmX(!ucPE?l?9CgivX}2% z_UqNEUAwwouRHMXmG+uFtE$#)Jb6yz^(?<fo-Y?qa^rrxxi8Fm<<{Du)w$ay_}yN+ z<$7JW?#{=vwDoq~nKnDGX<C$4&c+Ylq;xiZ=JVFy_x+W0{@xR(Ugz&Wb#I5tTEBn) zv<vqAQOj9>=(o`yg9F^|Z$2F1jpi{tG|4b}L(cP6uQzUg)AoDgiQ8>HMyJ$Q+k85u zw)xMd(}vC3pLb~<_F2$*c9jLgdE4KAj4#+IyT+Y&WPSVD!A8Ay%Oy6$zh5po^Se$x zA7tn|@p6DZuj%#J>c6Hp61#29Zl=zzHM^C$dav2-+}(f8?j)Q(^<;Mjf9%$a{>i)! zmur>JmY?^||NHf>lYj1y>k;hdzCU2*xmR&#qPLyp)2Y#Qmd|Ep@7sAJtH|cs%`j=b zstZlb?<%hO1~0LC662j~@-jqzuleKUv-j<KHRts{>-T$q|FiyZFnyl!aYu=In@=aT z_uG6vYyIEm%f)}*_O@TIM%UYZyP3V;_WRxH|F%CKcH7(id^)>+-<Qov8|;3+-TmM0 z&&SjD_J6<LuDAd9^YwoF|9^k~w`XA1IKU{hp@Gdtfk}A90ahb{hG<857G;ftoIx9! z#P%q#8Lv3VTePA1_~NPA`z}uvm{icBCZfpYJ>!t@stv6=H4nLxUpPq~DrhrXqsW)J z;;{5PgLa!g3;COG99CqS*x{t3B-FpcMcK%((>G?3@M4amnsytzg0?7$uID%;FVMhX z_d`kIu!fs_$;NIrg#(foSGY0Hnb^ykpe)TV;LdzvV;`ph0~24tah4Z`j2s`5nV2+B zII1NuHkza`Nd$Pf8YM9D{Hs`^to-wYXV4`^o()S>B|kKH=WUwIS8+gHp1~_{(kDg% zgQXh&oQ#|{4os_KQnkZ18N<(QnkGEqfNtT+)0}rEO&6VUK);#OC*j{ECQ*ZDhLbZH zll3OgJbk8tb%EyDj5G)4i&q#-Hm*FIo3&u}-8%=&4|AU5EpcF$RZzFGF7PW|HF=Kg zhX$*MKhN>iJed3S%K`Qeo#*+Vd}dbo;lS~SGoYT$ghf%{AiGOKK&#P~g-RJ3oN`)C z9eyQ?R5z?}^(?q3RIp{S+}{jNKY>dVyS}if@vig?UUg~etPoaR+eYtXuHYG~7A!N{ ztLYcIfoblwEv#A}Gz02yHHq?UWp%Utrxn!C#k^Q=E30>{R>*WIW{Cp{tHOE@h9(*? zugTlG+HeMA#D1=88=I!GrLH~5lViXvwPGt<)>g*oT!rxMr?##uJKD(mVOH~=TM6qe z4><Duk-Bk!scb`=?Hj(L2{(>vg>AIHaF9<)JMx5A8M{r#n^fKIn`g7OZJzm8C*AS& z%?p#hSu1=wC>j5miE+a<cBX>0*^$4S#HSecvIabszWC!9^Mb;@l0R!@1RIVsKl#{S z@kCi+@@xiHnV<=6HF-+hnJ3(W!Y5r>`$XBW($lx7X!qhjDH_h6r-J*$r*3FDpq)AM zUZm54>6=UP^&dww#{4UqaWEx~wQHqMy4>cO7ysn{Gt+H2o6WUj7TdFB=6fyucpD}& z^QbMiG@o#;WRvl{H!bRI?>qggUVWbb<Ii(@W-cbdb_Ny>(SsfQS&y0*{aC0Y*T|6| z^SI+s1&g3ABd6Pjz}~Kg#Zs)A?!E#~gg9m{Ry931(f`yX)$?0U8m-mz&6P@>^KQy= z`==}YJF8L`uWMN0S(+6zpX=H3T@I^4N)LvtUX`}y)Phyft&KeUw4O_zSg<;K?dQ3t zcU_ZQAiB1|S3CNz%!^%@wyvv~svRdhH+=uAt?TPm-y|x}WtL@`wy{6<%~E~d$Wvb5 zHckK9$G?BlBI!ESO$+WNuB=>OXIgrZo!L;%wW-1MR+(Yt_T1$BfA=F8ESbdnOGNbK zTYtOTJ`<c!&+}yC%+q&RB=UE*`OH%m*7STGWVHL*wRdXvnKmD~jP|V5Sznnf>HT<V z__R$a@2d+l_r#vMzVF-B{JM{)<NtpvpT!_%uy1SSgDf?RgAY;+4yejJ<XAuX(32_8 zZ47<<tBqt><m-Oevql97wA?tNoVT$nR_CI?35#Q*Un~0Z?<C8<{&C!%EpuY$nxctH zmP>T)87Iv=6EySOmy^NgG^ggix~!dTdD`vo%IV#|QVp7KvL@?op1IcR>Y8H<&KCaD zn)5s+edDPEYf83R&Ht{GVYk_IZJz8FUM|@(={pP;Q{HRGf9JZfk7?V6)~R2X@c#48 zJmwU(adzLEyV~5hg4;i|E_%oHmTi$;aDTvuR`vrADhn2=E)`?gbno_K!JyX)55#&; z7&|adN^f|4(Xf)kLauOTt&N?U{sb<Ky-f3DS+43IsNjkC`?~-8i6=+xIHvpDQ=9nQ zGpOtOlwI!npA;t8L@BMGcGUi!?&RlriBSzRPTk3`pZoKEnxFB3n|I8c{_6TQ%%A)~ zI4`~R`OJd0{D}Gg?kqp7?3dIeB(hL7?M0WVUSNOtmSf^uKf09K6v<3?IBv&QG_g}; z;?yapr%su4a*o%|kh51~d`uP2T@9J)xL~TN=!L&`0$F2&B<}`gKA17_<|WIimtsR_ zM_#?0d-ck{n~_&9&YbslX5>YO`D;U?d8Kaj-i@6p8?QMl-tyKhN2xo3w-V3BChLl& z@+K}9eaP1n6@K8t{l5&4HU<b!yCpbJ!1YV)s+nS4HSVkTMm>>qd2(^q#|PJ*1;$AT zHGC|I6WBBHql|-OU7Wy)i65T?zBHAV?z&fGI$LqB+$W2m&8CxHZ=LscXWW~+_vG0c zRdZ**?iJE_DW|E~|ADn}$Hdtz6K?M^O;TYysJHeui-i9t)`Oq+MjOdqW;rqYi|>8o zztc@)?>D@RHvbsCpE2eDt4xby#KFe<tve^%+!b!W8f<5I=O?E~2d~Ic){t&Skz-qD zIBSL+zk1*G?u=gD<o~5t{+*l~<1RXL0;j?mRY|X-bIvS0;HA0XtmDinwhN|)-t>Db z!^$PgCO7q>q3Fe_H!nJd@+`P{X|3dC)46lzJ_vs($$LfeTI$@$T-lhNQ?DNsU3hb9 z^whfxKZf4Yy|u{jR>I!92|p7O0;L4F7A|`joBDEY+Q(R4-9+JK7le}<QhR4*`#j`u ze7LGH>M`rRHNJ6ACHbX-;v`o+l)RK8u`5w}Q=-JbKq<4?FU~5;i3KUXO?-7UPUY*u z*Nl(0u|5itQc}zkQtArVkmT3;87DADT*YgVYS5!yFDI#mJyI)6GEfcHXnM3qH~7n4 z>4v$BOf!QU*CuJ_&2R3VtaI(D)m_y?n*Z+ncq-ifaZ!Aogu$l!9Wx~yj>i8vIlt%P z45P3s#!(?B|H?D?J@yDy_S`#%QR#tq<zuEM<@9GFmfu9qhc3ua3bop_c*fji)_QYo z+7dz|ug<O%&3W}W{A)7zx~tqmD)R-OTo+Zjxii%1o`Unc1qGiJ?zld2F$=qEJ1w~| z%I)3VhrSCrDpR;ypLo=<3)ej<jY>>esv=f(F{f6&qD_5m>BU^Z18ZldODD?7?!B1* zbyk7kbViojvb?i5at3YU6)JYTULu;hCG>i!<)p2-*UNODs+UgRUU_@_)ahCaCu#4U zwDaO5?WaMzHqH(&T4Z1tUpMvX=eerJj>2E(D(zdS^zC2jeQmu6opqDHUwqUWdE-!O zgx;q`><tk;zmgLD=KNlG!!dP^bE%B$)rcP5$N%o$F#aTeiZ}AKubSDcDQ2hUoXt&R zz9)0eb%AAG<oU02F7V#X+~$y_G&eXjbmr2?uwI2LGat-(njDcRdu`!V`&FUW-#*K` z^dM$x>`hG-zGqY8-ac4tn^Gv1o}`*CV5FX!8kYX?E{|>^*Gd7ADt4~k38nK+l&$N` zUJ@wjtF?66#mZUg60gMak6z6C8dY%dqHL?&#;+GQ%Fcet`LxLNda>rE65rYNao1H+ zCzVA8ZOaU5tP9_+nz3VU5X+29l`F+JxV>mOB;MMkYRDM;dFIo$MXLWa!{%$+t=7sD z)^5A3T{b^fO2%6DPM6vp+q;w7-zwSvO**<!zE3L6d1Hk0!HE8E63LI``)rr}_k8Rg zs5~j`S!&$lNrjJ@^3<5E5~kd{;x|=!YE(j|)K#lK$wPLbHnVPKt&7aw6`6f(Cg-i2 zIgf76+ql5KEY@M))Y<2z#-3g2v?zA*U(wqi6<iL*&Oa7=%I(_xq?F>UFecZqe>v)R zHMEv`X`Q<!wrr95`E7#LLJaHQ-jb<ZCC7VRPEfjNs#YDBYKdl0pxz~=Nbv@y6%BE- z%VUMsS~0A3Q+;21yQxlBd#ZHHx^O)~ZT*Ln^e;}2P?}uVnG`i`QF~KHwA_touYcM5 z|K4tzI=N-)Wu0A<tvm1k(2UuhcO(ASBK9@+JFaRZ9=g9XZ%+R=jb7cw|31o}6wFNV zQai2sk}+u+(<klpOCnQlT}jWAoEEAOz$+V+`f{36==4o#Gm@r;ZM?}jFJazS<*2LA z=5L*vC!{i`Yp#>h6DPZ<lU!l*{w*kETX;7%>QmY*x2$Q)Ctl02eV^g`{&SaDMy*)+ zs%aH@`rpgef3MU3(YF3apZ?Ej>wnJE|FvxWuXXyrx2^xZPyf%c^?%Ok|Gl>U@4fZE zn{H(`_I>!W{{KIH2KEgM{05BT1s`^F|4U-H;dAz(fx#P_4<RlEH)PJ;u-I_JhV@>6 z-@QLPtjB%X|FQS7dT(ItH{d+ndMn|><s5@60R_yf3)tKXxV;Uy>J8ZQ3pm_)Sq^XD z_CI$l=Ha;tUf%W%tn7vtd-{0ITLssD;Oq8#sNl!D`9p=p#wL}Gg4+#5q78ZX8;Ix^ z@J-$z-v2@Dbb;XGf{Qi=V(A~bn?LX|pB1?7!?pgS=xRgh^@Wo24P}kb-g&d0DgJ|? zccFOq#;XE`kM3-cxxPW(dLzg3jRNH#Ma&Duj&I;oE>djY`1-&{*?L2@?|u^21#cui zDd>MxUA|Gn_^hb?Y3cKZ;{8T^!o7(NyiBY8wYonl&URI~ZlscIASM4vN%@nqyrH)7 zCa(JiT%U{hgf~f*fB45P{!vf8NX>ln`<x=fcq2V#W8=k})aMuJUfyK(d=rQ8CL{OF zD$$<>!araBvf=rgjmF&lhRcnuw{N!IZ*23~PcB|@a>JRkSA0&N>9KqK+4i>a*&m<n zm`&{e7oTJ)apd3Pc$>#j`-|QFB3pSL7j_>PZ=Yi^K1UPIxCHySCU0>mH*u{#WjVjt zE&7XF{1(sYCSLs}?)6*Tv$uH7|Kh#eBus$Eb~~rDvWXw}7C-qfe)miKpBMXm-V*Tp zO91m%|L?_t%3F6?Y^gZ1C3w4ur@g7S|5k73uU_G%q3&Bl4{u4Hv3XJ7(Xi7cVewnT z`c1=UZ;eRa8a4fE)a0$v*H747{`bXiKVR(it+Dq_<DPGgdv6;5eQW%G(**Wy3H)Y> z;@cAC&63o&CFy^=D^VJxZxSHv?|b{yvMZ(n42@S5`me;81r?M9O7I6Xe7jI#mOOo1 z=6tiP<=e8>n`Lj`mi>Ec$o8$C)mue3c`?M8<yD(y)_?n$W0od<H1G4b*DuQQ#J3m9 zn-{5XFVZ(JHs4-sZ(icQy~N+VG<<t$ym?vr_Og8Q^62uY&88L7tiGpB{n^a}W^7OE z|CT@hdlmQhg6-e4k8iIzZ(e(Sd+mMm+R0{t@3$x4Hwg~@wobsj;BYy^lJfNJ=2h&B zv9rzV%y%@~TeP_EXqmsQq5gaH^b(KytxW&I%Ub<+wAWj7wD0KXugK!A$Z7xX*<a4| zx}<&bj_&;yJ;!(S`0r@=e#A+}G)22~_m!@g&0gK-EhcE2r4^es@|!h3H=QW{GedvJ zB=((?Z<qIGw>Wt0Y@Khq@`Bm2H>Yy{f17B(b2@Wb!Sip8{Fc+ze>V14PTu^zA^+#J z={sj^{+_qLa`th{y!xGU#kVzhTY7RF>5R9?IP$e?dil)zmJ6FLoA|9}tN-esyshxI z>0;$y{p)wm(zaTpUbQg3D*k$f_njZf>LvB+9Vy>`EOW71HhowA{GCh1zc*aBTowE) zcJ|LD+!Zs{m$zQ8S~}Zm-RkYL-v68zzH@yw+qCAb(<WE_TPOZ|wezpF`eoCltvAmu zo0r@&@B7ZF-#fZi^LMLPZ%*I6Ex&qm_AY-BmcHs;edZ_X)wwqoTkl%Fdlz%%6z6J} zKUERcZf)1i+ILr$-?!fPeD}Wh*89Kj-v8hF0Q;T;#@lDTuH16m`p{&zt=Bg%Sik$Q zz0Hx$)@iqY_?J`#d^X?t`A64pi*4?Ej@R3q*j=`}oMo!F^&WHA4f#Jdl-HctzUTCQ zn|b`Z4kovpoNcopy83W*Rcv<|L(jzX|7|X?@4dipdr^GvMS0sx>U%Hg+g>)`d)eOh ziu>Lx{<c^B_paWo^0wvo(fX?9mS4yEtxhYmo@YKPKC$+yzU|G~e{VJip8x%C&#m>g zcaHD9bKdsu^}To7C*Is&dpF+pTJqVGr_FMg?8%+KyIQ>UwzS=C<$e55YHv&LyQSQE z!M^VN^1V;O|2^9N_i6aPN6vMRvhAMTw|&vR??u1eOJ&=~<^P@++g;iH>&GYGL(Fy= zI(vMjO&_*zYx1^xHGiMP%erUrb<ec_Jyfr|Y5wmCzwh(k|K2C>yT|?igSq`D{rZ>g z`@i_xe+~b8+ne{Zx9$D!e{&ccuGRl{oNj&Ge^+e3?MLhV@0RcXRR8bu=Km6bcApR1 ze>!jfYrXy7^ZS2U*MEI)|Nr~`|I97?jm+$991a&29B8o<(^L5&kmS<p&>*oyg2BP9 zS1Nwbi5vd}9U2(f+`CLFi&8wNYItrk+4(8;^bDQEWm7UIKl7b#5&Dng)8pgZJa&y- zYj+C2yvQIvJ<Q~X$f|=1j`O^>REcJXt>xm+`}#{XCt_pr$!Vt5V!2UUvu|!|y>TV! zXm7D26GNrQ`g40Mf3CapIz0cuKHYwyuZmYT1kCkM)GIqPCG*OPVAb$#HIl_?XJ=cM zfBPd@l5ugd=XA4LsnV>gt0Rw>+LkBZ-Bo6PY@O_-rH}9Imi|0#<?iwi_w{OjaaetM zp2*|L%ACe|Q#0*U&`P!$_h#+-`fB<5{NwLpt$r-OzHz#Fy<Bb8*O|*F$Mef7zv-8I zdue<8?|re)n$xYm`|q&)$MEy9r^D2mA1^Hy_5EIbfX%<DfA8Bnm-F_#TK1}M6}R$~ zH%^?IvkQ#4H%o7HUg4#3@erS_ivLjo-zyuO1g_7XcuXocXYF3mz1D)JKc39yKk>&# zNQi;$ckzS+%2RzNo&5XH_~illDc(7j_x+gOnR6U|e8Ks(#udI}`l&J-os3Lng3pMT zo|))vd^B6|sCY7u@LB1%dxX#1XeSGv(+~ap(f#I&#l079zc~EKOWWJ2B+zxCkY1pN zx77uUBa?#9oKWk(^vQ_lu88qbqrZ2AZOl&I30U>UC)PB?-ahB*<-p|B(DPBbd$+pT zJ(k&O;_y`XO28kUQX$Wz=_X;98K(Cb{c~jL4Kj<IZn1UEx$~=zir&uIdUx9GJjc(X zW(l1tM!_j(b;V;dm={d)a+8-`w=vW6>$H1SZ}*DduQ6txuJ@bmtbW8Dm0I(l3SK>l zhi>d?ZyrqQ$`14LxvCp}&&+ji*jAaNr!5ZmhJThwu6320c`PFRiMd%lvs}@Q5_X&N zM>E(%E?in<Q1J8QB(1WKk77f8Cb|c2pHqBJ_VAKzr^8EoE{0nDej<3r)N|gftZQCZ zZalW1yKBYbb$i9kBZ^YbNj{ris5kAd_v)A%vDY6sO+6CpI`#9THI++6Lssarg<f4A zzw}(@lGoFAzdFRbecR*xm8rZ><Nxo~eXvcne9FTX&ai(w9-ii{+L8A3lv;KAF8`;u zLyfO)xgEUc<GU@754M)Q|9Z_e{O-HMx%>BKUOJsEbK+N++Le9hyKR3*JerxZ?HTKF zy>D+%M1<?7ST8<4_t&en*L%wE*UFnmJZ{ymtNakzRphl*J>B}t&h_#0|9-n`u3MeJ z+&AabXXEuU#iu`Bule8Hv_iyEFuL!%+19NuZ2Akfdh@Q{<*XQS)z9s+bT7-nkb}9L zZ)>+7eo)OLA%Fa9U-g0Caa&Hf9r(b@P{|lF@8*@OdziWMN&*jG;F%q!YnB)g-u?LI z%dTV2i(E6>N`FaS=sBjYEM}O`m69MhbB1Hy(RUqD)xHZt#18$QF`+f`pUy+h>r1zl zU0q-IvOAHFo!x@{8)uuVvDDobjfFRD4KlcDl6jv0F#g*6(ZxGQxr?dXip#3d*4-pB z>(TN}KN<Cvzg?cM^!d8SzpcH+j9+BL!j+EQd74+cAzPH`bj2#(sGgoJ$};Nqk;mD8 zy_wPwEz2XS?j_5#Da<k^b-mRO<+mr*a&#XnskU!FJ^O-B>-kGcpLKq^M=))gay(?& zJTA#4F-nuBKf3+MVCl_CTR107?AKW)GySG-ew}dm*(-8NmPNC3zP+FGa!HKJZPBw6 zb2d+obMk+4EP0n>Q&3s;obW1*3bo`<#giXw2{byd>=&aH<e?n0!g}IVrv#%bt+RIi zTh22*?U=%$-d@}8TiTCZ0&LhecG~msdo<2CzSxm>se10yixHkK@~eUtENx8ks1EVg zvJzf+_p_?0=MC?9zx*5GQ=%oTI|BWuWljFK<V9M_%D|-y^;Q<;Jh=1a#?o_VxK^cZ zQkL7vvUt@ZuI#YTWS`ViM>-FkUnVc3e&EE)a|`!<t$V&i<cQkN%U)uo8M~riF26D3 zs`shQjp=WnY%RzL4Hvq$q0UxWOEUU!<fF+Y>r_@}q|7{ZSz?OE7EcXl%k1z;7FQz8 zKfh`IaO&jAd18enE^o7xv%EJv6`8g8ZKi3a_3eo<mx~iz;xjLwh`RqzY{%S#IhNd4 z!|opYx})1?-9P2s90$rynJp?ftmqJ0eS8wDNy`5_56jM8_FrmixZsWOn#wkBziFKt zHrxB=`#b#(c;RNgUij84H{GZ}mbR_yjcPJqeKFJb<umL1nex)^`|L{^)3&rLo4#yJ z)Vjo#<h!U~iDvD`Qq$>TCTkzAdStww<L=jAQ*w5Mo+;XTGMZ`i`~9Xi$@QOCU$^Vp zR4NzyMn-w|sh`UVdsp-<PTwGP|H#+C63&0GE_|@wC4K$%%3X*3Do=Xa@6h^w@=WP! zpBtHWZHI#Ms{g*$sGN2(z%%UhFP^2nOP4*V?c2H0=$ZDcAG6bpxGncgu+5pX_i9?- zwUVwZ+ZVNFuM_Q8e^*<uRnq0(MwvVBF5SG4@HB1FMdKLlYtIgEja{+p#Pywm?mLg< zoz`A#dH3aIqnT@e&NP}bu{*P5SIW9+atbBfzKO51rXO>gs+k#~6VJg{;dZR%@*>aB z$jgBd#|+%Il&;QJdL>qUQu3WRhvlD%p3G9WE}H~YJ9}pczt3&nrf0A*k?SGL?pa6c zw&Z*7?{zz2S8<0eY|-Tc-MqDZzt42`M)$7&_3X{NSqI(!%?OH}`^F|)VtLKA%q@;F z1)kHrk7R3?#&FlB<Qj*S{d;Quw(LyE60z#llir%{4nOnmqmado-S47zgl0ZB(KS8s zBy1D!-HxP*=RY4$OPjMP_}XqY>FZY(Pc!QL{VzN<C+_Dh>oea@$JV4<pPzYJuPUe8 zwC>&Ry^+rp<jd~In3q<)ntE^3C)4{*bs-G*Z<@G2FU>ghJL9j*t!?MeNgCYsF1VC+ zYs<W8zwb<a`6BHy+uJPjipfIjJ}=)g>s_O`&2I-@%Q^aUu5{k7JlFZzewWvox9@qX zCUEaI&pR#rW@pyUt!f%!S*;p{g4=4=>stJ<@~<s7dETLT_8-$;`9J3^g}-nu^*wWP z_nnQ4uPaKvUL8O2)9(A}dOxQh*2-V9R%D6GmsMW!=d3JN{$BdP?O%&8e*#;4*jELc z^#_ure_mg{H)iUzCrbtOpN46_yXx{hOY-0!^V;&r(8&59GbY*myDy^t@zI^5-}=?F zUO)XTcw*K2BX9EGm@WR$<$a~%+<U*?j|oawkL6$8^Zw5U@4r8?zRcr)HIMHmleY5{ z{YOpbr`Wa5YxDcw;&<SV&S{@j8(AiNG7?z(FZX8N%XcyQ@3RD=()?#+y^naH{qCL1 z*$*mJ3A{4{`dPOheV4HM@SgK*^{d{C7?|s<<X9ZQ_4O$O`_m61?<daL!1(_7^H*L> z`T1Oj19<i>eUtX#_qhvmZ>+m@kK0P)5bu2fzQ+N4&nNJ`zQFfhfd6v<|Mv;}zc29r z7Z6|$6kwkyz<p7GUr<o^BX8n{XWP=*x>de?<Krz|#JT;0*PL`7<3Qn$PnBX$PssbH z$EaKQ@svKd?^<p}fA-la!r>D|KOPmH$;&x6moxa|?}C6Wd)A8<2a0chDk^Iz_EAqL z(Vw%_=}$|Sh~$SlKFupU`I3SYB<F7ocyfH&u}rDe7p2w<N^cI7-ab)!_eJUbf-;8# zWsXmjIek&)XrR>Wj{#dgNQiI9mHV)>t<d32w_NmkIr+jEyN%+x>tr00%wk?II~S<H zK1qT5k^;YwqVOb{r^~;p1<GY^RLdz8i#{Z$EhI1haoQRKg`b6X|2Af?Fl5`F?!j_2 zJM6r&{U&AqPx7LZRHHAc#tW$>Zxa9eQBXZdLUEGN-V-%91i2qO%jO=IY`(-*KWWE5 zS9$ZIwf~HQelIIDllY_&&aXAKXst<*+UiSM>xHy8Uy`~kD0Mwh#CxM`<)uU!|En@a z>F+*@Z}*S5B&7TEjV7a>*58l9`<F>QHPTz{p*(xi*Kd>L123ukZq?cvWWYYzfZLeu zdya1NakYc~+pZK`XxiwhGf7u<^6!=>y3Rq;OAU>gFB@22HntZwN&U1{OZbw)WgXRx zLWe(TPu!?}K9gZt5<{FZN77`o?8#<{m(7ZU&C4g7S6?=-7q(~)wrHPh(S6yXU)XYT zu;uj0ma{Kg_6nOP21}mx)H%4xboJ()a{5e#pA=Ou&P_2kE8J{;RG5RULFvqA%d?wp zdOzEozifWp*!-^XKilV%?OtEDdoOJNIoST7u+8ltG2ddtawjFmDGpN&tkN%=A2l|6 zTI_gtgPH6VTSXDOtDhZZx0pZOY<v2$)8h$d_cu5hUU9a*;`Dv8i}w{5e-YQ0pB>l_ z$T6EZbQh|JUzXjtIrm4fWBF${NfW2*#qQEq+_ghooJ-6dzqnV2n0HQbnk?cOJjHYN z70>xwJi|+@I8)tHMXVoQJjFG|dV9(H91+LkpS|n1csvy5Yo6jbImA=_i-+kHpUNw~ z7ejn{L;UWWc;ptlNQd|?4DtUy#eZgqm-HpqtzR~;cx$-(v)bOvhr>)94~JMh5Ak{Z z+2?mikowdh?Na;jEv~Fz1I+(@-BuzrJ3}O7ZAs#uFXs7Ig8W58gF{2ZzgjF65m^}= z5*i%#^|{D);XvN0hRXdR;#<wEmxM}wHET4r6rCE{eKn##)c^k#9%j+-@<WE1@56RZ z3BEWXqB7V<^sCd4U^7t>v-PIYhlL&YUJWTOcHJBrbNEV3x^Zmt*O>F7k@rR8ev1TW z2L%_0Mp>J#NGb_)|7evQT3;sWbMtHTc2S$-Tch@h#vHsF&V0@6x@h#_uin>7qfd(_ zJieNwFXkFMRbzEY{MyO!$1m;Nv?X$;si?M?yRukP^VY;*v&5}eQ^l{PoD_}7pAr%3 zl3G1Ab@$eU$gsrlX@Trw$<1LI{$`2){(gS*>Z{50)_{ejQJ!W|oQtD6%Q6~`vzA}W zS}*4He5&r;ZJC;9gNskc+h0pQKFxHdc3P@f_T{kL>(_!zw`mJ&hFEXQIVt8{&zHG# zn&-K))WT~C>EF`p!?NZV$9y-lk^C0UTyAqStk6F+^0HCp+pn2Zuch637bkzc=&M+I z{<c_FvDDjJi!YWY<c1|&oE9EmToQUM)_Z!s<Mm?y^1^uY<Y2R4_iuT{M)CHhIVYzj zR|^&AmnF$>OU)E3VHU608d_3&J?ik*RL<?umD4JW#Ve<qS0zrb(l<?AentCfS^3dz z&rb+3>2EKqTva}OdquZ+<?QJN<y&k1ZwpZt`<HO~YGvu?gurPvS54C+ucv?BUiE!@ zZMRs!;q67nPa}&BiWIkJ^P1E>4UhOay;1r`qiMNWx_JYmMDD(6e}08lKb}^;`dg#* zjb?j`ige-Xhi2u^ueF?C8Fp}bS?Sbf#~ZEj5@piUP5R4P)n_bc+tSAUqlmwxqv}R` zy+lWIL`VCKj_w;B{Suv%BRZ$g=$w6{bG}5^Vu?=Su%=Rp{E19%h33uP71f?e1&I<p zhbsz~ehyt3(!6tf_h0ptw`T49H`+p-dLBpgeZQWOIicyUglEBz-nBpSp5N&IZ;`uN zqM!X{!^f>PTO^u=C40}$$Z_AH(O9H$|Jy|Mn-jHn_9*|0)KH9^tod`2`OQh4pC+qX zPBET2*>UG&@5m|sl~W97PPP3x<+8-I>nE!p7xr^Tww|A4Bpf{5^tF=u=IQAXx|KJl zw@c1=ePc#(<cw~~nawk2_Wzt-zH{dEn=?BlXTAP0?dOc;Y(K=ZcTQLzd1;B{ocWeB zS6j|mSvlvt<*cKYbI(@Jof<iJ`OUdECFh;|IrsF=8S5?H2L(?ooj%cj#`Cb7Q+*>B z1XnKblw1&ab3th2LhfBt1$Qmvms%t~Yk|7eLP@IynpV}{Z_eMj<Kwj(+&gd1-fbED zOmeR0uDLHG=e?C&`grEj@LNm0qn0M_nwM_1G;`O|)LC<#t(JV1nC<whEBV)we}%u6 zHP2e%duv7GuNAq!mUc_6oE^2YwQA){!TG+%-3QCM*GDZ*p1F9t)N1jWt2ghOzjfE@ zpFdacty*LLYt8F#i>qg?&8=K@J7URui**m9mfyd%{OPWBsol%(O09ppYwh!2>t5bk z|1)aC?^_$VZ~y*sbIrkBYfk=Jb9B~5dFwUmyEk66+N58-(fIa8!|KhZ*4C$sHZcBP z|5<7y^X)C})>}M(Z{e)o>N-1ktL4_@-y5Q%w+2>k%iX=DaQ3#;*_^r&4=rwQvX$P{ zI(w7q?oI8xH&3?SF;#l!^xHdUOYcg(xi~Oz`|8<S*WTW`dH1&Uvv+Tuy}kVRw%ye& z-)`+byn9b^^q&3F|8{Txz2~6x-rLoC_by+hKVwJ#?j4QRyWU3c@14E><L`a1ckgGs zvp+m|?MmytXJ_vfj@irqXRoNtL2;RV+1-0&_Z(E5bLg)0;m5xZn(sLz7_)Ka@BNN7 z``K*{xb8VJ-}*>k%@Ni)M}6lUiI+*)`uULQp2OKThb8|UQ;s>FE^|C{&g{h5hl}SN zFTZoB+vY^A%*pDQlRwXG|NQ&NT$y9Bdya<wIT<W-YWbg2OJh#2j9DCf<3z5_$<99~ zrq`S}{pWP6%v-fTXAa*vb3EqE!8vEH+nl?5C+6Aj?Hli$`do8#yUppHGUvbFIsY@} z{A!sCPqU`Eik*EKbMC&)#fNh)-mJNJ+vd}ie=!%e?_N~hd(l|-l5Xtf=W|r;Y%VzO zJ?~z7VR6hA@4x3cW3T$oz2bf2v}NsOecMavve#_)UY4&t*%)&zTlRXj?B(RY*Xr+H zYpmTO%r~K5_U7c+o84Q(W=>XlAaSeGSUIWqR{iE%vp?UgWV$uq_IBy#Tir*@*U!B* zeeRvpckh%6Z<{{(cJ}7m<(qHqk5w)bzQ?X`ue<o}Vq3G@d(H39y>)Qzy@R#N8Nz1g z=04z-oACC|O;;t=jNtoEWgp1fJ;)BebN}xB*3b7O;~svjz0Vl;=;+@2*7qJb$2~c^ z<3PUKUE_Io1Ml6H|M&R+T{HE0Pdklo2PWMX-S?37-u=jXj}z}b{pWt~dHuY`%eHa0 zaxc2?z38vAdw$zu+Ps%bm%L;>^m1|C%cU)^mfw3df8VRk_g-zC_j;$?tNs68ZjXDj z_ulJ`b#Knkd$T_7)#19gx8>g4o%i;B+`Gr~-aWkc?)krWujSr<k9+^y?*0FH?-}pE zXP*Co{r(45`H$T8ANk`yO3(i&U;k0L{uRHh#<6*?^zU03?EiFm-)m#}xAyx#o7cZK zjsNU;|BLzj&;IgnJ@0=G-2XN5{?}yrZ|VQPX2*Zao&POA{(JHK?}hijm;e7>E&roE z{ztd{kN){TCf@%sdH&Do_kT{6|25nG*Yx@?f{(M;$^YIQ|9kuV-@EVs-Y@^>aQvU+ q^Z%T_FZ1WT{NKy*f3MH~d;9+1`||%D$Nzgi|KELiW+o;E25SJ3I$GcW diff --git a/docs/images/scfg_chat_channel1.gif b/docs/images/scfg_chat_channel1.gif deleted file mode 100644 index 997e128e0bd784b2f2aa3e23086900a03da8f59f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16798 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 diff --git a/docs/images/scfg_chat_features.gif b/docs/images/scfg_chat_features.gif deleted file mode 100644 index 192f5989a49abf3604b09689687f02e98cc38ff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13480 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 acb>2NXS{$}_l2YIt_y8t#%xSX4AuadOne9c diff --git a/docs/images/scfg_chat_gurus.gif b/docs/images/scfg_chat_gurus.gif deleted file mode 100644 index df0e8e4bff3ff108883cc483a3b2786533be2fee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15878 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 V&C)lU<r|xq7aJx!I503+0{}5qI~@Q3 diff --git a/docs/images/scfg_chat_pager1.gif b/docs/images/scfg_chat_pager1.gif deleted file mode 100644 index 027be2ae2c3467c34c4150fa9670d85338c5f597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17072 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 diff --git a/docs/images/scfg_chat_pagers.gif b/docs/images/scfg_chat_pagers.gif deleted file mode 100644 index 4104b0a37c712edb0836c7c18fefbec88e2451fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16441 zcmZ?wbhEHbv|;jQ{LTOYEes6*8CqI66tg)rvjsq?SirDY0)(n1EUOhks72AKMboK8 z)2l_(tH;o*$1teJFldTp&=kw4DV9-loSdATqUJay&+!7GrC!-fgR++f6)z1cUK>@s zHmZ7URQ1;6>aEEwTa#P%X7}vP?m3n{<yi5QW5sih70)?WJ?C8Y(sL~>EiFsWwJg2X zvi4dJ2;J-1dT$B{J)g4o`JBDa=Nx;#^w|5Q=iV<p_x;$hW7n>o`~RQe|0oy@0dhk? z2b2RqdBK6>A4C104~i2W9BAU;*D^U_ka)P2PuXeCj}41lx<&M}&YTcje7slQx=BWJ zQ_6|SDuJ_nP8Kcoo@x+%tVVOQ+S%F0#s3a`Q08!CVyR(}@Y<4bQQU!BKqH~S;qr1; zJ_!SXs|_K{9BYznCnRJut>f6I<{?m)!^Fxd))TrQOqY2ZkB~ux!F0#FyZGKbyL$Qo zBQtxQJcFFhkH$of27dd74HX+%jti)`%+pD1YB@dCIC|cJolZ}=gdM^eauZ8lTw0+W z;gG9%_|?^Qrd#H%RdjxPdxvSxg|!R6zq>D6Qhvi=PeuD<X`7OOeS3bkKRsn%!C)9` z)xm##bNhjPwk#Zi_nrSWh$}k%>G<^AvqNHGolED}_nv$774O$}{{HU!K!4$Xmiqr{ zKhz&^vWR6UG-?Q}Xlhc|dGVlG%S9uxMcXH0A(w7K$3rg3Z3h(Fbz3x&It;c1JnGav z!qCiZFlB`jkJhmTi+Bvq2{8AXJ<~YMV|mWuFptrnh~|D{9?xc8cd^bTyrwq}ESYR} zCxMyIFUWE!ucgmSRldk)2bNB^Y|&gc!|F*u+Dz*w6Q1!|ZP<BucJ98PYW&4)hL^Y{ zZfH&kbm44y&S!H&^U{3lA15dK+cRucpI@Wo>L4(|>C~0Q6WJ0OmPC1mYA#_{m@qXW zb*k&N$mEq%!=ef=wra(e+`alL?%#%QU$4iv3Wm){>@pQQm^9H*?dJN4iD@&_rbe<w zWz1F7zQwY1<+C?gtM)#dmAxfW;r7;Tsk3kA@BO$fy5NZ5^2Wj=isdrJr(Bn>E4j9{ zTee)j;`&^UkA3QLRZr$_pU3fP@AG*apHH%HsQE6qM!xQsY>iWcs*X)U1H0QDg=Ri8 zj)yH0@ezsbGI<t{j;plwJnB^6^&zRp;F88;9?jzml>7BQdmQd_66#zs$xH6%lXIa? zm8w%?na)0)9^WUKHZx6b?XydHX1eNg8}@0wSX3+3vV2|-U+Ri0ERrn&*X;$Y1m@Wa zwy3jZEMNQWR?haf-)<Ki*ZqE{<a+M+yA{vZe*br`=KI_4_Z!&temrOq&)f0Pj>F4r zQ3c<FACD)v%Q-MG`~3UyWQuj(&Zkp@&;5Khv$$^O^M#YwRlZp4zRv2!^74DTUMyN} z_v`tx-F%j>*Lu&}`FhLkbye@yPye_3-L}Vlzdy`4U1$AftGxZ6&llYF|9-g=?qBnM zD*OMM_s7-u|9y9$zJBkAJI(g{J}rNrSMzrN=6yTgUsSjIwlFQZ;pg8U&)5I|_vicj z|Nj|y7BH}T9AJ|A(7@rdfJyws0XC}-jRHLjSkyfZo}8+i^W|^?tNDq8d{rNs6?hhM zxO*HDnkCR;JM%v4$1e`YSrZxbYh;!zGk2CecA;(6>V;p+P8^o|^`ZTr1J9%PaT14x zr9O6e_$(6Qp0VTC+6#4jC5k+)9<DE5UTB@z6eG5=;;78M3vKatlz5I>9G05)u`Nj^ zS$y@0W17bdvTLFi$vpQsZe?cBDp8ZfefP#OyI&vs8+euobiS~#kUHAe;j=_ZT(Uvr zS3=>}+scZpo+rJcK1~XpvqZ7`&<Ve)Pm`5%lH?@WkFt4v>^{t`ESOy3rngF{cPi6j zvGp^Kne<)kT9NZq_v{WYgGEA<r(SuY*3NV)N$T?qz9Y&irV_4pZttfb=vij6oYN(d zPk82yGt12WK0lGVX~WFPTa@@V?(hyhcd6Ur$y43ap64`|ZJPe3=egDV<=(O9isyX% zw<X=W`Q^Dpq2k#Lyc%Y%FV6-UeVB5o`Kea5r+4eVOVc;kEOjcB+!=A|(o~V&7tV&K z0`<Z|7S(TgrpD@ZX;N9xOvyjXH0NsiW$pU1)Sx!a{%_``S+`31?)t2B6z>R_X~)Om z&><7RZV+-@^y&&nRjr^_sVj^4zOHcbef43UR_Fq+ugg7`z6x4+>dJ~d)78FfUxn5m z4_&Ktb!B9%R^;)hi!<XsFDvNH=Hy%z?77Q$S;g7aaqTazO+58=eZx})udg@G?3Mbq zp+mO8o>Ab&F{^KlmZ~}&;@&q;MSa^e<LsI=^V2uarM=y_fOjq9ORdO@v%YOv;j62` z?(KDT*SD=3djI8eD&LN}dF$J@9cSNWct%Fu{q=48fvLLL%93{;NqyhZzf`wy;^{lj zti%^AS^Ks)lsn{4=&QP`M`Oy?O0&FSO5F9p_F=(H$$Q7@zVCkO`(E(8wByrB;d_fx z*Q;;0-uWtT`o5d4`nAjn@qg!u@BPZU;oq;-cmIC6zMq}1py|8&1D5CC_p^SxUngDj zfc<*-L1wWJGEaBkU~ntn`Js1pjk8aZK+%k43^MDzymKxKZvJsp#O7o4|L6Ba56@Vl zcQ3x&kbNaXN%?Wxeeo02uRm50mptL{?f!&*pC|I~Zyfi}EBZHW&J#8F$`b+Sil%L> zNoGBDWBvc%AF6lDT#$LKf6DIKrhl^*_B{3Yc;jro+vl0<dD8!Foq4Ka+U5zb&pfku zJ@X9PpG}I)D;~{dikh7^@6$r@v-XaMCtj%1(pbzmE8}(2Irhniw=6T1Wst9!b$P+R zl4Z7YUj`QMy1Zmx{3_?#tiZ)mSLgSc{tL5x6}11?)h+u>SL@Hsio1R5>W03p8`^!} zBuW3ial&ugrs-$jq)Goi^x~}n!_l0_p7NV7Ic?jv?dR#Y3?8$Ob*+BAZDMDxTz~bY zzJEDg%DV50cmKYt`ghy^6}cG|>6bVEIJbS@_p|Toe*eDDa9(E#@73t)`_>OQ{C6A@ zKlh={+NSSyn4)H*g!Pw|c^X};4vMDhB2FaMJeJ%Zcl6&}am$|iKTrC9S9}SP`!uCE z=CN9S<<}X@_jXmwJkvjJc_Q+k^|arAo+@6q{CdrO&s1*Nr+WTX#~s&|^x40EZmyql zAysehMDzYy@$z5iw(@;FQdP^~zh{BNu{`0qK1)<m<agh^zV6$m{1#=4i6?x|{hP33 z{@u4+6RYp0KN8ygey&QLdbP*1zVdDC|30+I+uWGOIc1r}(vK7B_dJpPKjoDF(@!(b z*M#$2n0l^w-sd#Vy)VuRiSL|Yr&qSIJ0|G-uWP?u!x|fH*QL$ZK6YcD;gm*)4Q2Bs zlX90uoQ#^5p;Is`-S)NVrCGh%W*4NM<ts#=e||0B%;E2===s0o4($78`)@++JN5S8 z556~)9MP{U+n8<r(W}1v)z`*PcV5Rm>D*uS!?nKdXuI7H^@xMt4%h!TdGnuH$&ksz zP`KDoB3V&n5tHm?Lq#Sf1tB9fB_ox~N+J=BVke9Y4j4(zXp}mkEcc_)CW%?mqRG#Q zS@ngn#*C(jO-&J(RP{1U3}&eL2&?5UQp;9Sx3EyRk}$R5Ftyv!Y=5KK!J@@hqtISZ zgh7DCd0~s!j23rBk=ctxW*BKs57G?P5S@QXGlo$t$xth;Q7rAESP`T6>PK4ThT0i3 z#OoL(wm3<2PL$|vtnO8m+~*{@|5Ek-?UD;WN*-LUbJnS5C8O>McIg%i-AxO1|LsVW zzV}F4>Hy<CA(^9sde4GnUObYKRgj%-Av^1b-j$28*B^F1P?US<DECaT{`V!hw}$d> z4CPfH$o)Dl|FhA6;f4W^vx0ze1M4OQ)`$kdBt!NY4N{v7<qjM2{xH-NXgqFVr1?n6 z;8Kr<GP6;TviTz;z0JzDpOhV)RGfpD?UkB*i&XBvQ1N|a99E<ny{RdoN!5k9*{fO2 zbF*4*Qgh*?W-ANR-0cG4#sUlig1<W)gC+~uFEHg$H0z(@IAOU6$4(KhnG+l?PVo9D z;+H7uqbM5M*cx_FG+Iz>j<{IN!`AFTEd|ZCRYBrwFKMmZE}m(jogJaw#@OD`sJ(sr zKkZ%L873vRPd3z<KC%7iBgqqsbe0QBEf(y!*d%q?Ncw7!^tDC0T@})I4oUZM$UIi+ zd>W*8%5myh#kzBjb=MW^ZZhgCFm!!1>Uz9U?!$DspO^F*9(OSwuHSHD+W(K!_?;Da zl^Zw@DeV5Cu&<&)d{M)}6%9u^6cvhll!BB5cPOcB?m73O$9R*G0Yk5)kny#S-dhnW zQ#w_AlbRl$Fb)dpdzR7X#H_a9WS_|jle|T0g+~3>GiH6+F>B4qSpk=4eeqCdF)wr$ zw|<>G`;2q(PD|?tk8S5B7oXm2wR5H2cVp|*!FIPM+wG~Gb7rR9v&Gi?B<Dty+wBRq zI`27G?7H2Pf5mg-)ji%jTkm~2`%q=+5l;IP$#w@KOI+ILJdd<_qdfP9<-BW|^DYRN zZMix3$ISV^cFzBEbN;`drJszw6w(S<q89XqCVy>n_%g+NYl`2C7XSZ}3mZ}vh(u+S zvHA+lTKLn_QzUBvN7cf+k^Uc2{IkCVs=e}4$?|(u;#a=azf(1+`P#yEw|s?F3(a=T zH~5ud#FZh&<)>S<*x}crTG7SUw^HR_EtXj2`h3eGom)%3Z}I=N#5r)*lAk7vcz!KW zty*lkD$lhl*`#X;r>b|P$x?yRz^pBSvZ>zcQOo4620F9&XB}Bqn6*so>9VFROM5OY zb(6|to$g?JHONtF#l@E8{{)sV*DqV5E$a8B#eeOU06(s!VY~d4v|Qh-temK|G$d;2 zv|TG-ZCS+kYsE~HC01E0biOU^{I$5IH8i$0EFd*>)u~nCPghMi9O@&wI<Ym>U3GP! z>*~!`VPUDOla8)lFSTaxtkuU}g{B`3^ZMnc;kHWk+T!K2R<6)maYf3brOM;nuQhM3 zE$50_d+$~0r)g_nrLL0yQt+&5-HTlXkGzsDM6G-IYuyK_^|QCGQ*2xDrE2{TDW@m1 z*8jP+Ug*lYe^MKmW;=Yd+Q3%5;qtNQORXDtZg2R(yn#=8BYX4)q1z66X$g|gV((0~ zmx$iDAS91{%X+!p4hp*yrLHCHe-+Enwkd4szfC_bZ)8+U5Sg~gFgn3tcY>Mr=I>WG z^|B?J&faV$ooHRX`SsP@ho|fXtT%CnZ1VDsb-TUh&X%>@x3_rT&JF2~emQM9=WCbX z>aC4wTg%ciL$;-te@nS8n*M)sddlncoZac!+37W5>FKwZMn<m)w4TlUYAb8Vrut>u zKYra}T(+I{<k~uJhnm;h?A229ey2qpOX=m_E`2&RIBi?#vmM#j(tA$taC??g6}A0_ zR2tXp?XA)d?a|r0#d21uWv|H2+J9`<cDC&O*Rs#E?Oy*nYq|ICh0}H&dA4iQ?Cf*j zb{~-5bI5wnk<*#;PJ0TfFGx1qwS;?{)v@fO(t9si@4XVe_u9Yey*Fm>y<lePzS~~p z^q&90yB_=wKkh9eC${Uf^}fG{x4iP+*T9`tzIxBqYx}-P$J||Qe?NLZi^}>xxA*`1 zz5ip?zL;oxk@C4Ocb4icFEt7mu}&$ybhudZc?nNW3Fnzo_4Fbx8{6HSR(EEWXqg`r zoO4iB{h&)>v88&+)|c~K*=;4}98k_VB+7GGWKW@e`Js^T(ifex`PUrK^*L<#XKjPX z0#?=|E-^>kYL0m1M0_&d(a}`V`u&KX%+XHvqro~yLu!tO%{dyn=V-*4qfvK`Cin>U zw72|wqT%(iBIJZfh@vQaz{H5ciF2Do7hIYstErWdsFizAY`OU))l6}<&Po3^PZH0v zkl6OAtw*qZyZPh;n@&tL)ahFzS^Z-2A@`bdNi|I#x+le@w=A5pm$A0zgtVWgUXZ8W z;fZ=@Cr*8RiScHj?91<+uf9)xt3K_6IMc79X$-}uzb~J*euq4#a5saJ0z*eP`=V~q z%iYKRbV~^<N*-!B6Vs#YG^17WtgaBVn(^7Ln?^d1XI#CZY~rk9?=;gnX{OQ-l?N}3 zAMcoH%WM+0sLxSZ%{AG?=!BY&aKCT!tUzIn*^|ysoTUD1&3Oq1jlXZsHy9o0Y-;g6 z(c<@`Wy+!nzJ{&-jhayhHKQ6C=6({DdD*(iNoz@y*b4Wy(uE9ZKeW_OiswXV*A{9Q zbo@KPuQ1tUW%bVT_Jf~JRB13CSE_NatT}pI%6VqZsqH7XFYNH%DZSu~?qNllM^2}X z9h8~YG4<NPsZZTyZ!zjG+##F%v+nmI{Z|*|J~W>Gda>)bdUx(hg91*&?HXr}oawIo z*)0^Lc<4mK;TLD*ooAflP*&Tdq)~j`gsJz+4<p0JM)%*GojOzH;f$G&IaFWVnfc1b zMDNGB<VSs;kNfh9W?B50Rg%>IJ;St8N#O4dfxkc08=C~8HmfJQPe}GLt=XiJHb-QF zlV*saC~JdePLF2fK~3?qt#Y1X2^GhevtLTp5U;hlRI_lB*2^~Cnc77sBuXqKb$Ksa zteiZ@@$yNflT-fXoV;i>WmVvmYnP;MOq$a9<D`>rZJ^}Ti5W7d6Q^D*>^z+)JJUmU z&WX<3A7wY_bUk(K`WbY8dBy4fm#+RgThGqi{g3?&pYU{{;OWA})5RuV<CxKK`ptB? z&({PbjC6#~URk4by5hRQA|<mX<?7sCLuQrxIVyHS=bVhrJ&w2$SoFw#b5qD6)i-yV zdhYfa%u~x%y16#;X8EL>j3@h}H#1i)>i?@Tft6FEBKiVv<P*2NC!CxU*S-}ISt%;q z+bZFCac=p=<iz8Ol~v0>T~y?~vr*~9rl3pt7S-)@PV^nr?x~UNoill#_(@aUyGs&J zHr=><rAYVI*}EMUS9*Tv9$5JNpGU1;UES1~KV*FWGTsQ3ef?bai_-l~bM(I()u+9@ znz?gYyli(arvgJncai3qvdA;+>#k+5JtO7RBWLtV;WE?7j8~Ur9$t<)D|T+i<sUO_ zHYwNX8c*?LzWqX3WuJ;_UsKSeN3Y(fzLA;L(`#Z>p|&h@R)Ns$uRoa1+<SBG-J8l! zZ!X<?^Z(4_%XV+C=Cw2}FQ0x_sPegK8T*8;>u(u;zJ0>??$Noo<?iqD+uvnQFE3%Q zcyO+~e)+q&!{r&~?{42KPuu?f-@LN#=iYrd_x^jvyN~nUz3uz(Gwy@-!=rrm6Rb>& zFQ0T~_i+`CpUZpaV13C))|`*w%MZ!O&tcy)Pip?ZBm0U!D(l<WyL@_dc%IJvd2d$E z{U~`P$oqiO^H1{npS0#%S@6%l@c4jXe(|oIb00pQbJOz6$(!?R_J7v(|8k7;^TU+~ z{qjE<#LvCwTx6ARWw`#!P0cyp^XEkT{~G)Ls|5eoJ<jtFD<2WO|1m_~*604W0{QPn z=iL<bZNF*m`ZfEz!L}olmVK|=zuehwf4%*WmrK93WIJ$sInUSf_qX~k>Gfk(>Gzkn z*Y3aKT3Y2lE&k`FS3eYA&6%JdRdYX&{b*3{|78oZe$DwmU*^}(<*7enUoT(MA2E4W zz|2`ox8#4i-nC~<eDEawAM9V2>sKwE(Y5mYkp(Fwf4on59Xs#6ZGHI8fBE}%#|JO0 z|G~=gXJ!3gOO;hIQh!yR{;K%@dt?9KNAG>UpZ<IE%5P4tf3xlX^_^eSnEmfU=;z7n z|6M-yZ_fWe|5^SsKK=W-|Hngq0cI9H9;1K+ffhDVIh`E=iB9c;s$MM;hKWZzB~A05 z+_<QGyor~wM<sGo3d0o5&~+&{FFp01VVHVuN#x~czH=-~-#xi`IlV#NvF1-jqvDGT zi|m8tWG)mey1a}-F)3w-fb!K9EDN(tHAJ<pty7eali590$9aSN)pe=TK?^*0s7yV# zH2V6x*gchB?|l_~(%!$wy)$XS>5|ol59f&Lr`@^nG5JIu`;p$=*FUA6nQ5AT@AmiO z2?zgqK9{=oVoTDkRWZuy%QVbN-L6DMu5OEwF1x&aif_@gySKmRKd5q+7PZ=8@a`td z&Ruri)~}r}uiNZ5^<Ami)n|eJ>ev15zIyof{Oszje?`8h+*NO0pML+IZT0zvPGwaa zsmhn1etv!b{Cs>-)z^E%1rAKyUrrid=o0qTyp&h1yKVK3-x}NAADR4N=QW)-{fBP- zV=ho(b`~jg5o!!7uzUPw@|iuWW=wu(%9AO*-b!leDFYpzlg)yLo8zt&x^d@D2|V%1 z=FbKfmB}HKw*O$V{<uR_^Hsi=*6J-mUK8zD5<K;Ge<{*qnY)Dl)aM8h4h{t~r^)+G zRiiea{ddo&n88B*->S=smg{R?*ywKm^U2?Vxixdg!xK{kR$0GXQyge=dynyXV`)>3 zi>)f5UxHj8wul7TJeTRX>}I>PB*@=>YsuvR<xq{#&zo$50wR+CZuS%r|FhE3`0JVc z5Nq$NTNhha#-8zDNHzTyp>lZ5Ry(%$zrRLiEPgw|Uw7ixZ?_mZYlB=fcYpnMo3prD zG`i^Y+umzVZ<)(u%Wj9R@GpKm^}A8(<*RG_Yd&8skFWdv^?Q5+^Rk?{Chle4w++pO zD-zqJ%YGzw{57pe>MC|Bzg?|-ts=S4`dh^IE@v^xWmSf9KU1azhuySo36A-hIwN`7 z%yr$u^M0nyDZXa8bW-lUpXm$!H80zd8r^F4D`QFO+M7?8%r5)&Qm8sjDr?p1ZNJPH z&D>j+y>9oj)A~Q(e67mabb6iVt3_wSs&hAQPWzp^V{e?*+a0gB-OkvubzgLVN%|}6 zrTYV&G#U;vvM0UYd)IBx>BHe%F$F6_s{RxnYEJ0<bTmJ2PTGc}bF4lK@!z*$I1@dq z=F4<1_S)2oZ%<X1sz&<<l^zdV-(7aeb^G6S`~Dxh`(Z}a{kt(YAI|kGyy2{FTXtJ| zYR#7b>E$sMhyACY{CQ{ddE0_lo0r#C-CceEPx%>V*Ok9toOi$bN1%Is*|MEq{r3HR zdh*}hFAwiew)?MtSKfTt^|Sphn}iqK{S&_C@m!Cbf2=wJ|0Q;8J0|I`_OV*wuS~?j zb+QJwCY%av>@EkUN9d_eQ(nlyZSEu(_pHSrGVy7|r9(3hTxdSHdOk~X(;mrP>@9kp zicdJ&4^3TDP|zy9h;y%y)9W1{THL=Z^h(&_qV{P+yX%*QJgh4mCmdW~eEQVFhO!%z z<jM>)BV=ZX**~`2)p^l8zGk6ty~h!Qs6sv6Da!t@Zn&5pYU!EksZc96<GAUy{#Hj7 zMS-~%M}@*Jc1(1Bq!_DlR9P*sQ*+N_WzkAc{&#|UGIt)yGoF+-WBWMS<MNZdGcy$C z_X<sE;!!-$^q@I>(Gm6yHBWVNE4`yn2~FSqBvrrmr+31ypy>zysiYb9R{Er<1<yR4 zl4hJ=xld}JznVpeYP!=)x7bsgrfsQ7)7gIVY|N*g*|&OBEkcdFixz#Jv**e(%cGip zrTZ?=e#P=!@AgdJ%4?Tr{(h2f|JTze!!2MI!<!{1SM8jc-6t^bpp2T4^e_JorZ2Mv zmu9%?R$Yu^6Hzr&nHeAOb7yms+QKGo%?n<V3#7F!EKuEh#-sj3(A>EpdTBhjy%JZ6 zPjCCU%y6=1hhL}L&$lA_dZJqAs$MP6TxBxV^{H&|e6<VzOTXwllxBr$pSU=^<iaYh z-x1+^e}!&n3thvrnA3E7*UXK}Lf2-eW=G2(JGrvx<C>V#?AW(e;d|DJu9MgOcPc4h z(}blSDJm~co=A}V9Nw%@rqpbj<07>?f<fZR#;1WgN&l;EGB}uRdVlMUgWB#1$Lqcs z&JgWL@}7P3kXzW6NpIIAN57tUVV{`MGFgVq?AejGHciuAU3z`jrf1<-v{bh5GF{_Y zGF$pkS;~&>qHD6uvtyoQscc)L%9%L#_rz0=%yu7S&GnoRedo2)w;hj?)?`iIEqMD< z+0G-i>&k6!N4}URZhKYqef7%ddnZqrD<9^4Q}y=r&Fg;Kw=>H*{NcEBmsvgHAa`0p zv+SINm67g;gqIbx>eeLkq(>Z<epb+K`zKMLJ>rP6T4ASeO_Ip+h@;wRh26$J@;pZ( zju|g2{MVaXlPvQ*;<)v*!v5Mn$qMX|C!E!aCid2(sHjJt^iC_9JoitE#%l`=y=6sH z*Vd%!q(`2PepWPn@1Ily_Jf}FKhFf5s7W(kzVl4BoAK<cchW5ON1n@DRy^mmO}h1S z$@A6wisyfQlWzAv@<OAU$pT*67tZ2R7rVns77PE)aC5$OapJNsOLTQJebiqVvnU)e zv^<;1ETC{@vDnrXyalg<<rS{7IW#Z|B{VSav0~il=fETokRAOv>N>Xv19R5f*Q`Hg zF&>mF+bCI(lOlhcktgCC^Nh0$>DC8s@-Nu7Wo7MKc87*rx1McdkyBvgXo$Weq)@(7 z)qt^RarE8S>khE|yY)A(eD`i9u@wjQyv=2-dMtfkas$KupLg@QGZY?33hZFx@GIa| ziFqh>!{Lzhzk;^%1ZJV-6-TWL3VW&-Fw4JaIA-~ek-s74iQ<0;4m*aXN%QYKQRHak zh&op^y<6d#(Q->pmxRx=pYLH&(P-o-yZ2d$<?nMR^(s!kgpwule_6cKt1i#oS0Xw` z;g!~mU00U+m99yTeXYHqiaX>%>4y5ftlAllH_z66+jMvVYgYR2TQ|>rlQ_V@R=B+S zZn{9T#GTmp#y70*|MhE@WRUw{I-`-7%b!{L2E)hB?T)+>|0|>)9ALAYQS-Fe;pge} zxX-iCALKK7|MOh=z0cMPwJ&}D?Pr!-Fz?IC@Y>gr|9@RQe(&q1_P=j(>)jsxQN7Yo z*~n1yo|%zB{>Q%hgWPtqSxh1cS5BFiGKTEU3YA}Qb?v;bYh!C)M_>PSjqAczri#1S zAJ}(aKd82U<K(q((#>bzJe&88c}?!y-1O*w_xc=m?3c~^Gu`^m^R|Xv=WFxIW;aw+ zZ!h26z<FYO_2KQ6x6K<qZ*LT~XsUK-iMD7@-qEqyp=-7U?-q-m*B1O=c1*avW5Q>K zDcqJ*oOcR1I0^_f@(VBuWb72p**SCZPQeqFGdEibNifdVZWMfQaN%pmdCFG80=pD_ ztQH$LE_FU69B^oPw3WyPtJSluH1}AoJ#Dq_^FOOi!HqgH)?2Ktw?^+4D`?y#e0Y2G zZi#}%o!-v7X784mz-V@5_ny<%k{o*^XE+~ty!#-x&0*y|QVuppiuW9=wsDxU=frB8 zlcyV<k1)FIv2lH}=k(>q^QRd-zSzi0?De|S=sm^uDzmh`cGsf|n-?kA`kmPv@T74E zSC{YWEfXC&CUG!LHn8*C%=dINAM=8v%o8?5EZ!Hrc<Y<shBv?M;<%5oJlL8jygx~K z+h^zfsnN&2Hk)Nk-u8XBS?=Whd8f^O3vd4`y`7W8{C~7LL(X<a8HcLf+gZ+-v;8rz z)80`s#i4cf0j?_yd>amQcJJW5bAa!PMa>t7iNcN(nHhzBEJgq6>=dnWl$c{Fxx`X% z#le<42WP)_oX>n{0r#Or+J}TB4lQ;*q#R<^o8z?N^@&xJohGbt(tWdQBFk>wCx`S@ z4jZyKZ*x8@7U4W2#o4UKS+e7>)e~#U9nMxuoDVH#w6odc5M$%O<8o|wqmz!yncyQQ zvyZqvvGM3}@j7zkg7RMPGcGr!k1m{G>@UN0w?jM7Wb;Ie%^RlhU-_)O;ifG^f$NTd z(-Rw9TQs&t@-PKkH!wMHL^PZ3c42r~Y#KIs>zl_%Ssv_*5_U^uF-z38PqEpb>TQ2) z%C_{9{n^D0nM>TVdK!LzHp|i3p6j#y|7SPGH4Vkh+shW4mpeNY#~ffwIq<JRddJle z_hxU4@+t0>ZyLDI9O#~H!M|rm%@KEjKNiA&jth&Nm@0i@Mz`av$&RfdC*~b?Z2#ie zDYL87#j4w9S8s~b^6En?x}DxGvC>-Ov~KY(?LSt!CZ1E?9MWfTo>t;1QP8-<+u3xD zwZx9yv!<Ni+udlr#d+Ur&v`C;Bn$Q&Vm`8P4ddbzo0HlB&OTmlXZ9>BIkj?%i?@ue zkImjI-h2Jecv;;(CC|WMaXDbqokp&+0h1JrH<`Hl{$}+1+!&hTJt@IELWLo!=5%ne z-R?c!Edi!0PaJ(c+w|>f(|DOPiC+Q_*_=ss*>)txCoSe!X7>J!DaU?n_Tji-R&aX% z-_!q&{d??l{?C~L5npB%ch)QB4c5o6`W)w|IeQ~yN88~8?X%r)?>Sq2<t#tX!HK^c zCNuj@T^%g0bE0XEW9yckQYj~7SgbmFPAuZyr6l9jbL7NQW2?TBU2p!JSpE9kyE|4N zMEvzccI&z9{v2X$RI~eQiT{tD-LsBZTgY5JaM<7KjPp@to1@&Pj&NT%uI#ed=E%~R zQ!Hyk-C6dom~+Z&&8ZvJwrkcH^E?eOdwe12&yoEaoyOcpWi5_w4sq4ZyvQW5b^8|Y zr;ATZZoR0`u}|u&x9r({aYszwJ>FXI_hORtennq5<y4>V!S*L|!oSaU%bUFa*I^&c ztNZ`IK65U_yg<aa^55;C%P|L7|CnF>Vs2RKdt-^i%{vVhbB<T7vAA>Q?A<pOebNUl zZ7nBMJ2uFivo3XPwmB!g<)Gk&gKaD!FKYapL=SbF9CEGQ<#yL^LQjac%E=9@uWVA@ z{mEzd)STU4dl<KOd;Z|L`g6-k%QMze23LdM`Y$QnV;>XBkh;gw$A;P0D{Af@*AkZ% zJbS%zE^yq9y7k*-$B&*JT6~G3-s_(*_A>=;ymH~7f^C|w>pg9|9lf`A{N3_o_3fv- zZ$CeMd-t8wd2esW2%nMXJtP0suGsYYCvUeD>!7smZ7R9pnX`Q=&YI;{2UW?M7dUS} zy)}s8&oQ03+v{Y{vbgxxIv-~<+40Y?_H1+P4&&Gx+&K|<=2-L=2Y1fBE6CE=yZVOk znY&YV2S1KEC^==Pt?!9Bw;g4_I6jxT(q(gVN~o3V)^ln{{Q7$iO_+1<z0S#rcMeV7 z5;@0ow|<D{&T3EpT7R<==h->VLAp^kKKJK^gwB8Bzli4oqpr*1C3~1$16IWbu;pG@ z(|h6E<51487mPO>^Q3Mz3%<5_YrqCo<J6<JAzv7uERN>rdyt`O`Yd^$MD4!4dr!aY zHVvO_Cwq45e%9*;d5;|qX;5@MrWERyUc!)3b4Imyf5p{pm3z<p*?c|k%=HULf-bV$ zt$!P&FMGGH_`vlVhbv1RI;t&hmBhB6-NAonN8jpyv2|bErwE^zeE5cl&%sA;A|BjL zYI}3}*`Lb`jc-o&je8b*s5d53qa@_r5vv)!k*}BD+<ZAs|4H1m8c$;v=lQLTv*zqx zaCP^>rH3u=cpkib_+Lr<(%jJHssSrpPo3BtAAR<|=aHz3uj5z!xqqeF=+bY)ZEIJC z*x32AnflLr5VZUDv(pJ-&0E7B-;Ox#DzMG;z~6m^qGrNoZbxjkiG*EGE7^a%B>d-M zAC1}|sckWNSMF#(4QKiiu4j5&KJGY=Mud{y<?<Yh&SVSIt?u33cRTJLpQwFM)6TJ1 z*Rt>I<z|t%hesXfOW$ng*(KNFrzrE-D9p*#_3^a7Ctl`0en02t`hTbI%{qEz4zKex z8|R(b{_}fx@6L8!c-Q*NUguUhn*+C<m${~N#69_$`owilJZtI&4>?<}Whv|4hF)E5 zJK<l(E$PgOe3=v7_HL_<-Wi)YEiZF=UFM9w%$f5tXRXVey)Sdlxy-ruGUvU^oc}L# z0bkZaxvWKcS&PeFHg#$DbLc#HCAKUs>+&c4Q;+l>EXvv%(0QaQYh_u-@@H9V@4aFV z?s;=df3+OPX|3!P&(^JDTeF@|Z;hSq|Ekxwow9e_)7#a?lN*@Tw_(lUU9XQ#$hsY* zw|^V&hP3WOYT3_{)@|0)UE%kpGvdu*zU()LbdUFSe2wZlk@orsU(VUKoGV`XZzpm5 zyHJ+1ENuOScm0zN?%iVc`m$W^`E{?)=jGm1%iVAG_N?98Q+B%7_PxFR?$t&yz3ubf z?g-1i8Ta~bUG9#$oIB@oxAEmYo0fBYht5&4yj^LXFR$euSoUhIT=tV^IS-b-J+1fl z>A$=)QJj4{B=)-L-`$t@ZQI+U=d$kA<^KqK_oFZO*0r2B+wy;&dw=&|-oLc`(`tG5 z+}^y4%U{1Q|I4NK2ix9lmB{_Um;cZ09mDthUv_z{|KBrTf5meA!#TdUAE$Nfnbv=G zUOt2Pd&cuw&+q9y*!Oz5*~j~7xwqG4Gq)E$;>#0#Uht>w<G-+X>)i@_SA3NA&y!65 zu#zobWPRT6dD#z@{=NP;>Gd<a?A^-><;vfQe*dV*U+`1!%@w(xWoku#4f6E)iw)(A zjr!lQUg!8SjsMc2oVTAonAR7Y_kVsl?enL3#n$VKZSp@`U;k_q{>d)A*#3F3BY%k# zdx>-VXIuRem;aw#<-a&DFLuu_ac%$N>Ho!jdx_`%61U|gzWpVB=Su?qmjoXF68QhK z!28v{>ZPInrD5N{gqD8|TmL2EeMw|{Y4rNinB}Fh{9nV*m&VQi8o&Q*tbS=Ce_6cx zx8(O<6V*#YbOJ91lqJWPCAgPm>X&8pm*wm)%WeObJHIUNe_1|%c{cm^Lh<h@=HIjI z%kOv<hv=7=hnH9Qmsg%IEBe=8UgiG1y8e6R`?A{e<<-x>*RTIxEB+(kJ@@7w?Rxo& z8up6T_vLN=6&>{zo$5b2<14!MS9G7RXg^-zem-08`i}<opKbg<d&PftJg=DK|8rve z&&lRLyYwq(gjY_n`1(uW$2A9DS;y`dH-2(!7SHehFs;9GT7BhA^<N9!e=c_aenqUX zdwU0Wr+`f3ule(<nD~D!a<5wLU$yXj)jIPk3-|XT8-Kpj;C?aTmu%-m1y19w@zs3H zRqN}k*R)qp@2}o9zq(}k&u(|V_Z-}t-K&>huiVC8b5Nas`G((Xr~f{@{`V2{KdZ}s zrpX(drdPy#td=_{czS=$s^wKDUsN5<|MTzY|C;mswQIwFvdL}kzh9Al@#pOSTuMLr z_)gX+#S0#juf6sB&&}<%7uMGXF8|pw|Ia<8N!Ralyl$vH{$YZ6hW8|kItGinJK}$z zUH^No{on2MA4~JUH~9a(zg+O)^S%e`1s=Wc`W#UAG`{YM{F;~j|DOBTA1VL$RlaOP zeObx(zhwve#482fvH$yZUhtZK^``s3S(rN%m|6H37#_4bws4BGaTqLk=-eTs?p9)P zQOT`GR5@?YiH!^0Cdg}ceaSF-d}4x1_^O<lpPruV(@35+Co@>>+$_t;Lwi<!R`>6; zZ~F1$Bh%pv@^*dS?z}8gxWX8;JZNp!SFLMnqL#A>-Uxm5@A`V?y+Sg(Lv^liN;tV} zsnj%uTU*0+AG@3NUGLtixTRVl6$J|qE^~;z#PjO%hTwx8?AmHIHwqsenjq<&m$TF8 z*>TOuQm#@iFE1YLKInEf``4DRUAY%8g|3#$zPoW<{CeHnQS0KaZ3+DRZtwO7_a7V- z?3x$zXVbGY6DJ$TznfE3{NjAS_Vm2DyN)jLw*CL2$Hp*Z>)zv&_4EJP{Q6Q^|J~H$ z&fo8^k3Bzr+-`1N>F-akANQ~O|G&mrv~)_@!mrbXGas$ouF%YD^+O?lKjX9TYKBkc ziFNGnrYpAn%gj)0SFF;Q!9Tw=Oo2@{PeiUoch?W4o|hZhZ&WvSR?P2`?yLB>xX<Df z$D=;SUoR3n7ZhHXoWQSoLu#_G)lZcvfnJuXQ$wRFRi{N}?R=Wc;`<`5RlaLx@+8|? zk!rJ&|E*Xy!Jf0?QTpwPF9RxKZdIz!t9-RneSWap)qB&;w#|Gtr*&QCiv>A+J73IX zoaK=)hwa&ngr2EURhrADFtNX=Zjt+yxv0bFRpyEXeXA6^<`|Z0bkE%NOKZ)uvl=qX z7nx;guU!6U)r+;uzWur}dxBKtvSlmJKAl~$`>5IUrk$p*uWj1swK_bcvFud#y8W+S zWpBHi^gFlD^-yNY!nIPnZ*AVOblSVhi>s`4_k^GIQtaJ*>$L8UANQiQ_TRP(ds4P4 z$zjdT$g}^_rseE1<bHdo=&0!J!*BLIHHg_hQ+3+zkCW6Bd#}HHt$*TH*PFM;m7l*3 z-f-vS$yfQ$gZ}89;W)mg;IO!SjzP59VVlC-H(52e_9R?et$*?FtQez{uI)Sv4rmD7 z*>sR6`HoJm*y%gPQJY_G+j>OM|LmJ9lK**1w#v45emUvAymrf_9O>A!RsG9O6lDhX z*P7pZ`_D6ZZLa#?Z@21K_nO_(v_6}?vF!AlcX=Cr_84C<S^Ry+<I3!;w>Rt9_gOxi zRnAwjqiAu2-jxlhy0>@noc6HXWqA6v@%gFIc~*{dzVYsQzVq?E-w$@J=H0NtLn&^< zOWW0Azpo11o@RXh?DIcWdEx)``K&*m*S^2&+@;+oHooO4e7F1d-p_J&KbzPSDwY(t zd+ph?`lZaqS0AnWKm17#_22*X%H#OrX#Mp020cw_YtMJCZ+QCq-j6fWmn~cRKC@K& z-j@w(2XCdUO}c#f)~6NQ_i$(N7DX3_vHCx^U!A)?=kD)rCc%sYB0?V;bX7d>?ApBQ z>(q6%n|CYn^@dvS<JE1{DpC9qA#p_BjHULlR2*;rQoUoHzSR|(N*uB6Yk2Ke6bd|& z;}7&WqPuTGxAU8%7bz<?Nxtf;^>Udj`uO>gj}C&>0V2_VSDmoh`*uQ@ZOlUPT8?A- zp9}*JSWj9~F~x$z>Sg`O;0cHJE%V?uGOQ~7H*wCJ4cGVo)D5aD?wP>3*<+5)qr(2G zH_7U?sYj+>{LpB&=f>|mv(3C=M%BJcRFqe~I2h6Qp)UThJZI__b8D{SlNbI`F{sx( z!))}SW3rL*)@c!j>m0S4w=7BESlDSCX0>_d>qTiMiJDHF&w{4M8O{D)!+9j3uXu)& zNfggs=k3R1joRO}OlPoGJ6Akw^5my`)Gv1!t$S-RVQvT`lLO<cRSkKq3k-~2FtAk3 zYhZd98u8?*+Vf2Rsz=3(#Qt{dXmLGdq-HoXC@{lO`j^6lIM;<rxf30HtAf@}*s_E- zH*@Ku%H367Tb3<YqjBq>#)i6EuDU#Py}bOrE-k40vYfN_-%GFlU+0%Zu`YB8eHFCu zSIG3R)K#vmTEVNk0@lQZE)6o(^11!}tgzdcWg@n(UC;hH960G?*ohMFkgdBeEmYgO z)PHMML}OLx(k78L9&fY47_}qzahYz2>0K4RSL*uGXQ9C<t^HBCUVdA=!g7y3Q5W*9 zJhoU$WPR=5HDL=+-8^JAZSz81tys_Oh$}^3H?KU)<<nagarvF->ZQ4&&kjl6yz6JS zcCT)v)$Oc>+l!vg-4Oe>uy9A{*Arj*ES~E6F8m!Mzo|4~X72LB&E4DEFL`%Qotsxu zuYETswWR0O;}vOJSKpH{+dlpA*W8N7-1nGYh2;HxBV6}+_5Ht}!o6p<X#8W)_<ip^ zSHzy&ReCRft$x62yyIZ?qi!|D?1Z0UGY)-FUG_rCV$av29fyNXt}SQRdBk~s`=M)` z?<()UdMKLxePh!mgGT+FN0QcA4$n;GJ9e*5UdU*1+~(fK{$`$Ya{Q7fT>lwPYJKxa zxxVw5Vcn;Wr_uK=X6Bs?>)SAC<C!PA@iR}vnthr+`An+r`7K9`?2M;)#?1NEC3rmf zo6*e2JkKqgBhQsC+dSj&oKzcg$+LlG#j_H1L~64_cFex~dG`A?FKlklyjbJ6WwH3) zbkEbD&--oLGQYa|rbA!;rHTKxEO+M33{>8ArT5#HrB~-<I<B^|({P);QeHOO>%7#J z#rsOv{&SVha7eDYuDK>}RitiC-1c49kLj6hk~Dq#<!9B^BXVUM=Ig%A2(Grv5sTZr zxi%-mdiSkce%nq6?0K76zWdJoXWw?7+`HO0+WhW4x$nCV%I23Gt~Oe~Zu{=Dz3*#J zN8kU;wr&5*yYFj+=iFzq|KUH)SFd^X?1!K8ejJdEdzW1-^^kvm#R0{<k3GpT29NqI zPMF7in2^2aiR^iS-Tr<>Q@djxDd$^SzTaEaclpm#we>qsw{sNC-u&m8&GDaS>gA5r zN=3b}<o|Usab3y$^o~bw{j4re)cd;h`<_?Xzb&pd&MRH)Z~H3xc=)NU@4jw~p8Gof zz15vd>IR!9$G%Bz|8@J~zdAdo`#0W}rB~lMzwZ0CWRt_()2;8l=PN(REO*)Oy!Cx{ z`5#BM_vJ?T*F03-Uw$O`-n+!~Jx>(vD-Y$@T{n7P^Vm4P@=Wu*T_yH1FHPeECv2Fv za83Q**N#HJ87{bfW307(SG@lB-Ou~J@B452p;`aWL*e~Dj@jFNntcA(LUF63i~0B7 zD&xO!-~ax%HSf9JHeaYx(AfX`-haCvhxPw`oE-n7*vjU4sDE->kv+pzcF*i>`v0#d z*Z+I7-~Qj{_5c5V-v9sKe|rYD1q^%&jA9EI<rXmN$@kmb``md?%#`K(-Fd&a%Ky1K z?`v$r`%rnNJO%c$1?+VS9Bm6YgckhPopAqOV%RIw1-D!t{7F?{^;7tpDgS0~!q2M< zc<(9jJzK!{Opd#4_N|k?T+8NfcSzv8b?^7XdvAOn2%dW&^lpK$ouY`_LXlH(g6B@2 zbDaMxH;~^?@#Dt%B3=u=m?r*gTqq$HFI1E$@@+xCZrh>U5HYrg>jV^e7b$){tH^)r z;rFSEEZgMe+U|eJOpxEU;N9Oug-Z*0zde{_%J%D^q8QT&F{vckee#M)3Or1USo{_# zym}}Xq@bpksP2{^U!|mRPC@lvqA-&ZPneSYv3Y7vNu1m6OWnHt(lA<?>*2E#3$>Z< zYsx9=Us|BCOiAsX;`_CW47?tx_ASzCQ#4RYHrVz^f05EZEv`puVoFj<i>8?#dwNw# zx$1=Svm^<*WUahKg42?WCn-wIQquH${H^ej<)UQ6P09Lgk7VX8G~A>t9F%M-mZ(#8 zhrjEh*|fMXdl#AWrN})}7LrOa-KOODDoIdnQA*50=6{P%mOOR}TjCn0;&y1Bot&if zyo8IH${u!XdTA=2)0TKjEix6Fsq{^GTdRtL-x8s|1wQ9ge6KC>y{F<Q_Q1{VT9Uy6 zT`!e}6N!F&s)1rl1LahMsuF)&s%)rua@lo>_aPOhc`Bh{OGBmROBF5Akve(Hbt#wG zDUZ0N5q+wWeDPjVl4j=?8CE{^U&rbCXdcg@c;_qee_az}wdS)<`?oaiQexPrCn;MV zx;rgRcoZ1%E-vPhT+*ediD~os?k!E!Tb69}?1SsGxUgp*=PsSGRwevacr;&{>t5Br z2cITdJ&R46pX9YHQ*T*D*n*Tz&tjaGWnD|n`V^O$bw4v`S?aU2c((}uRZFGoR1507 z6JOoSxTTgPlwP=KS?(!?ymimAwbHXErR5w;Esl#Xy0<Lr*|I#dC#H5wg4xsqx;Qi9 z=9ivZnjNKHdg@tGSVGyQw79hRT(R`3Rm*FRJ*e4~R+^O_`A)6j>$9|9%F%7<UOegV zwl1%e(`b68kj6Km{FcNkR*jalBNeAqE1i}Ld!;v}Ww?HN-dDOrB5-DUlls1Y0va)s zo>y&qRy-{}<=OI&8#TJKUNq`uEd9&v9d<|B?Zrx;6_v*lD!;ubPI}%irO|b6S@k3J z;&~cfO6iqMnmzAS+m#~otu%DoGSY>XIefcUDwp0E_k3bh#zei96Wr8ux>mlws#dZu zWAdaWJ<}w;Q<SH2WwgCmF>TSa%1z7Xvb~&}_j1~z%y~jDv+t=_ebbz@>}7;q=KPP3 z>sMW#{b)tagp3R!ttD<*;zi57%rq|AKK1U>cyJ;!=2rthOT%(AmlaK`mQP!?vQKN} zyj82#X|3M2YV|&?)m>U^&S|Z^wrcG?t#!{<t$U}ne%>pOcgnsD%RYy`?EN)iahS#m zwb#oht@^iSU)JVtT3c?t+U%yiHEi|PIPGmtuRV;G2J0v-&RP{*pye^;)#hp0o0h%W zv})CwF0I{Kt9SNg?OOJF%cRx27roxqr@iN1_MUCoYp$(c`RetawABarbPoP{HI+&G z)Q_};G_8%xPHqf(v9oT~k#$=8FRebxlyf94=g2AT&5N{;{>nbOY2ML)uaAYT+0~SD zGB4-gI-S#LueX(@2iL7=JNR-@QL^BrXFJxtKCx)k-bb%D?aSV`Y}JWLs}EMKIe6^# z`7)hLzj7{p(mBbs_7q?4ifuYq!*sX)TNS31b%5dFcC$A%HgEc*a#yqIteLd-YTViz z^VZ&4_x9AjoTX+<r>sjoYxHJa$G_D}?&;q1y6^YtS-h3%*-N=?4R7Z>(|!2p?JO&C z?~2!V#I)sZ=03Drw?t~y@e3{f|8yUly_)(+=SiO4Lb-L-N8c=Mdi}Jj`*G2_muf4X zr1>3Edv&O9-Su;w587V7JeRjHNGmET>vQM2cU{lVURw8lS>~%()BHJBKYjPEA?@9J zwfwfKb@3U`u5G*dx-2)jAt@+q{nt4CZ)y4e-saYyO1kqe?TcPsz_BIYrmg=uPybh6 zf^)&^gdLg>y4DwHt^ebsb?DiV=R5O0*1i4nE`Qdh{MlMM%O0)&@`+>RT&Z=E1?yxt ztWh*z*5AN<If~i2;QOSG`+Np}KDjfc7qHx(#b$57{x83PvATf6+kn$MV*9lW2I=*z z&yR4_Z{W}_;M~4}=kNyZ;|9FvH^hH>{C(RxuK0qsk`27fg}nTRe9a$t<u?k5e|&D$ z`kQM5f4P*9bfJ*@M{fU(qTYsL;fD9KazA`1__1&Ot(c8s{e=SQg_4sE1%p3I-Y$rG zSJ2gS{B<C!ONwg(3!Ch1!^$Itu4fFx4zyS9U}rdR;!`1uV)v0SmQA4#KDH|s$^S0w z=J_OdnN$A$My2>xWql5X{T*`aJ3=Iil;bz48XI*da(z5xIM;_&rQN7NW|PMEV=BU% z!a|Ca@3$(Q-c<F$Freg<?0TcnkWISZH);IeR2jgcQ~pWw{ic5g`bOH{-E_AXRqgpC z<Gso4j8VSIXAS+1%TG6|OBd^;f6_Al9CBr&aW<>U@**YnO|sp^7X6<snKxT^8!K!s z4tuakF2C4%xv`b<Cadzz*6Tl;AKz>f&1yLPv*CFoyU&}9w2kGOH=8zZwm-bt{JyJJ z^(XE2PfpK^?bW}S?&fHk`6)Eyi}mZz7V#!d-X)HUKY7}3@z}mO)?$lWeX-|k6R+aU zCd!|^<V&2{H~Z}`_L=<I#JSij{HWb+BTw$HewRN5?k|!3{>4VT#JB&5o^+}9?k{f6 z9-6z0yqdRot>5hTc(W<@7th<DEz7rtlouNtZ;}@`jpHdY@h%R~Hi@$SSL70H5~=^m zYyX!pfh~&ppCYbrjXnM~B)-If`FLdUR=0Xnui!5#-KGZ1P2K*NCWmhgUA)0saa&5f zSz7wGv|@>9(bn|(Z9xs&mbaN@_HWDVHp|j>&78h1eSKN>@^6`&x8)o+%RT=s=kT}e z$J?@IZ_9pdmizo$9`pBn_V0PSzvX`aR>-|Q|M0fL&)<rK&5N&pE3n?4ul_wd+PtiL zTdx210_W{T>EDZs%`5u1S4=Oj$liWmv^;yYS+%%pb$NUBar2t<->b#9*Pb@7TWwx@ zy1e%D_WJkb_3S$u)_<?R|Giq=qUn5jopeRR^X<*dKN_8XH1qFh(caPOU(uw$qb)kx zqE+3Z`M-H%ctv~hk2dokt;{>xm+$CUZPB{jqI>_3u40SueGI+Vcl6%3=zG4S@4ZF; w_Z|KJEhez<oWO56QGDk_dCN)aJ16N|PBz~;+1_%B`_3u;Kl_p$92gj^0g6d==>Px# diff --git a/docs/images/scfg_chat_theguru.gif b/docs/images/scfg_chat_theguru.gif deleted file mode 100644 index 16112f8ab539910d9502c8a2ef35c26bd7134f37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16618 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 diff --git a/docs/images/scfg_dos_startup.gif b/docs/images/scfg_dos_startup.gif deleted file mode 100644 index 9fe5b42b2d44e62115c5816692f823af78f60c7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2393 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 diff --git a/docs/images/scfg_main.gif b/docs/images/scfg_main.gif deleted file mode 100644 index 22359b85a4473234e904e60eaf92d230f085014e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14925 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 diff --git a/docs/images/scfg_modem_config.gif b/docs/images/scfg_modem_config.gif deleted file mode 100644 index a69e5b5e7aabd87746a760cf35c9540570fcc6fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20932 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 diff --git a/docs/images/scfg_modem_fax_code1.gif b/docs/images/scfg_modem_fax_code1.gif deleted file mode 100644 index ab5a550dea8b2ffca1355db4785b3cb080695991..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22581 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 LryUUxV6X-Nw81?= diff --git a/docs/images/scfg_modem_fax_code2.gif b/docs/images/scfg_modem_fax_code2.gif deleted file mode 100644 index dda24933f8e9def3a1e5380b284d75ca0b8bead9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22603 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 diff --git a/docs/images/scfg_modem_port_type.gif b/docs/images/scfg_modem_port_type.gif deleted file mode 100644 index 32a0ddd45e2c22d1505b3f362bd02c840eba52fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20853 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 Cl!%A` diff --git a/docs/images/scfg_modem_resultcode_15.gif b/docs/images/scfg_modem_resultcode_15.gif deleted file mode 100644 index b8518fd1ec2d0b37ee800a4268609c14431224d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22669 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 O#l}ZRiws#<7_0$nNwly4 diff --git a/docs/images/scfg_modem_resultcodes.gif b/docs/images/scfg_modem_resultcodes.gif deleted file mode 100644 index 447b5f7a76d57fd1c89cb5655b7274ef8f42ae03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23594 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 diff --git a/docs/images/scfg_modem_strings.gif b/docs/images/scfg_modem_strings.gif deleted file mode 100644 index 58f6098c6563582a5e8bc159e2df2fd21cbcd223..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20604 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 A4FCWD diff --git a/docs/images/scfg_modem_toggles.gif b/docs/images/scfg_modem_toggles.gif deleted file mode 100644 index f422218dc4e5718f6e947529a8926142e09bb71c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20983 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 diff --git a/docs/images/scfg_msg_area_advopts.gif b/docs/images/scfg_msg_area_advopts.gif deleted file mode 100644 index 0c78f4100692f194d70a2fc1d19378172ac3b2e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18176 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 Q!YPksc6Ky2FfdpH0BAGv4FCWD diff --git a/docs/images/scfg_msg_area_netopts.gif b/docs/images/scfg_msg_area_netopts.gif deleted file mode 100644 index 5bb7274b3899e07cd00e2df403886e2d3a6fa41b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18896 zcmZ?wbhEHbv|;jQ{LTOYEes6*8CqI66tg)rvjsq?SirDY0)(n1EUOhks72AKMboK8 z)2l_(tH;o*$1teJFldTp&=kw4DV9-loSdATqUJay&+!7GrC!-fgR++f6)z1cUK>@s zHmZ7URQ1;6>aEEwTa#P%X7}vP?m3n{<yi5QW5sih70)?WJ?C8Y(sL~>EiFsWwJg2X zvi4dJ2;J-1dT$B{J)g4o`JBDa=Nx;#^w|5Q=iV<p_x;$hW7n>o`~RQe|0oy@0dhk? z2b2RqdBK6>A4C104~i2W9BAU;*D^U_ka)P2PuXeCj}41lx<&M}&YTcje7slQx=BWJ zQ_6|SDuJ_nP8Kcoo@x+%tVVOQ+S%F0#s3a`Q08!CVyR(}@Y<4bQQU!BKqH~S;qr1; zJ_!SXs|_K{9BYznCnRJut>f6I<{?m)!^Fxd))TrQOqY2ZkB~ux!F0#FyZGKbyL$Qo zBQtxQJcFFhkH$of27dd74HX+%jti)`%+pD1YB@dCIC|cJolZ}=gdM^eauZ8lTw0+W z;gG9%_|?^Qrd#H%RdjxPdxvSxg|!R6zq>D6Qhvi=PeuD<X`7OOeS3bkKRsn%!C)9` z)xm##bNhjPwk#Zi_nrSWh$}k%>G<^AvqNHGolED}_nv$774O$}{{HU!K!4$Xmiqr{ zKhz&^vWR6UG-?Q}Xlhc|dGVlG%S9uxMcXH0A(w7K$3rg3Z3h(Fbz3x&It;c1JnGav z!qCiZFlB`jkJhmTi+Bvq2{8AXJ<~YMV|mWuFptrnh~|D{9?xc8cd^bTyrwq}ESYR} zCxMyIFUWE!ucgmSRldk)2bNB^Y|&gc!|F*u+Dz*w6Q1!|ZP<BucJ98PYW&4)hL^Y{ zZfH&kbm44y&S!H&^U{3lA15dK+cRucpI@Wo>L4(|>C~0Q6WJ0OmPC1mYA#_{m@qXW zb*k&N$mEq%!=ef=wra(e+`alL?%#%QU$4iv3Wm){>@pQQm^9H*?dJN4iD@&_rbe<w zWz1F7zQwY1<+C?gtM)#dmAxfW;r7;Tsk3kA@BO$fy5NZ5^2Wj=isdrJr(Bn>E4j9{ zTee)j;`&^UkA3QLRZr$_pU3fP@AG*apHH%HsQE6qM!xQsY>iWcs*X)U1H0QDg=Ri8 zj)yH0@ezsbGI<t{j;plwJnB^6^&zRp;F88;9?jzml>7BQdmQd_66#zs$xH6%lXIa? zm8w%?na)0)9^WUKHZx6b?XydHX1eNg8}@0wSX3+3vV2|-U+Ri0ERrn&*X;$Y1m@Wa zwy3jZEMNQWR?haf-)<Ki*ZqE{<a+M+yA{vZe*br`=KI_4_Z!&temrOq&)f0Pj>F4r zQ3c<FACD)v%Q-MG`~3UyWQuj(&Zkp@&;5Khv$$^O^M#YwRlZp4zRv2!^74DTUMyN} z_v`tx-F%j>*Lu&}`FhLkbye@yPye_3-L}Vlzdy`4U1$AftGxZ6&llYF|9-g={@?oZ z(d%`4KO9&8zvtubdU?C|cc$yteOrBe-tNywHm|Gw(%E0T;-*AG-v7Tpp0EG^@6Y%5 z|Nk@aEMQ>wIKU+Jp@G9^0h9QN18i0w8U=b5u&7(?+|-&|C%$9>oB4@@d{rNs6?hhM zxO*HDs@tIcX|uvSnHM`0cn-AoH(&XZBH=7?Euhq7%RIjF6Nlw~eQ5vZz_Uo8-Q$SF zz7Hj8K8u8=R~$HU(ZBU;b^>>Q#1XBiiR}}s6nQsC9F_@N)ji>N5_fTgtx?v*o{TMt z5?3>hY47^jThOyu=DCK8>Y@)#0Vxj!uX-G}`}MKk?TNAiyXOffsZSH~OB8wDu2_Eb zqJMvvON!D;i(`_TCids%ELJf;dD5@y)8u(QDbFQdxY!u!b@9wuq)_<7LSaV{!#b9x z$4Q))QRgmAyK;NJ_WN+n-*1JA_diJ$sNrN$llna4gwHag-b~xTv|fLPJ&To%HICYP z<xee{6JyxD^GsgV=h+W<mK$zgx$lML=b5gZY08E>4rO%-RZYK=q`J4m&FfTf&69s3 z%kAWUoR0k_Jmb!lG@YF<{hQcA7BF(C{p0Gokf0^9kk>TBiQnpCZPb>ApDyWvAula@ zg;*Pw&PlTl&h#zj`#AUV<uoV#Q<tXg`m*%*nHBDg2QD(65n*^`5+Zju^Zdia;&zRx z^Sm^<E-#Y$y29h?0w3F`%d?+dVOMf}%ET#o<puB6`ol+LmN0DyUB|b1bu?>s*zsSX zo2s_f$J%B`Rab`nZoRtZhxh96r@O9gdgs3`>g=khhpVphUMnrC&CL#Ce|=zS)|QpV ztS>doe;u5CZ_Ba|GO>0)uZQp1C%R!`(d+o5UEzt_OgC4aouA75I`SM_+2$o%Gtw-* zZ(Iwyu;GQvzcuc~S*P5aE^IVzee*e|B6Q2HZ`%*>zH?3d?Q=8h%gVsgm3g&VH>dtG z+ma-z6MMWWe0QDMmP%IL2t)3OcV%L`r$5yyyBHODr6_#QtfvVjhqdo~OS-bNUw38j zfAOF)ud9nr|CP-T_qwuU+4oIlsjL5md57)Y^mTo4>$=F-QTN{OGGF(Q^=-2{kHe$1 zvpZfa$t{YW6(2S)Z&Ufw4IS=2k2s=c1WMGY6}?@3XOi2u!{?U1sTcQ2{-kBG`{~y; z<v*hy$^EWqQhyfQwRzbM^?93)hJG!0?qHL^@%YEdn|nXTNb@|EUu}MfZ`-Eo=A0>t z#$JbYo^9wZzkTQ5r=ZgrexLvK@7xpkQ|(*5MoZR=$XgFjyq$h>k?;GSQk@%i{o<$V z?iDYXtCQid`1_vf-Xins*|DbfGtRnvG%|U)`-XD2<;gNV<FK!5Zn8<wI5<DGAnW+* z7n<c#n^Sc^thAgP!nF9-MUl2I0V=s72FBkOmGUiKHlO=--0xjmH!WK^JDvM^={>3a zwr|$<s6S^;`~BeNg|f2E%m#1Mjc?z)vCM4SV&B}1>e;uit}EMiST{GjeE01K-^zCG zKl`q1_wTzO`nK<RJ~yv;@$EZb!@lo*dG>wX@89<s_;(y&U-v%Yven!vW}9;Bf2aP- zn{{Qqo9R^HHFsamE4yNSuHuMlToz;Zv@Js4cC`Gf_x;2tRdeIG?lwQ&vmZPk-`ua- zzw?Z4)u&>i+x3O_Hgv?-rFAgRx_F7VpfB?6lb65d?CNwYxnynqsbJIgmkagY9-X?c z<n^ZSd)nCY7n{y2O*m}6UE_Sgp=|H7bB|jb5%4!SF6x^QI(^owLwk0ta@<=MT)yXG zfcmamo^#7tjqbj1=eN4Jdtc$I+2seK`+v1$`yKuHD5kKu@9WLkHlI&L*Uju{U-<a< z^v@^a|9xJ-|2Oww-sdU5*Y7*-_Sra|f#F*Am9Nf~jIUGuMQ&c+_jPmo-nZHNtM46_ z`@Vns-}k*vzi)Hj|9)_P?VG9fHBTOY`+1>%-<Re7e_uua|8?Vh-B<p9{{p8@u3eH9 zSNq!5s^;zN|9@Wi@BelE{J(Fz|Np)D{9i!WoT~WdPyc?L-~aFX`TAG6^XgX|FItpt z{~^4At)hWrMg!N52A&ml+teDEEi8F08bu-+#VQ&lW;D7iD=K1hwGZ*z_t|>0S+<#K z&Y^38>K0AvGlCv7+bK#|s{F9f;;=M~X!={;Y%!zRYDaSsi>sK5fJ26`m7$=jV2guA zOPsN=UZb$njTWCDEgmmg0y$cPB3eT#T7ze_hOKCgs8E++5%GN}l3>x66w#LWLnOmO zG;2p&&J9tv3!()-+VV5RN+R0R1jUOcwihOfmnn+Z{Ah1@A-+jSqPau6ZHD&0o{1g3 zj*<cbI(;)Fk8F}WI!WiWl9X71)cH?3>lJl3Ka`TbAT@sn<4vWmJD;Sb3%XX!=vw}Q zarKQZxdUD6XUMF#=$2EE-5SyT=8)cPLH#{9WWRo5d|Igg-AV4q3b{W;J%5DczijMb z2{!osvFG1KgG&|)LczTv#)jg}hGI^NS{Dpug_RVTloXSdl$?!pi~3&7=+j|l*16pG z=0=~5Q2(bB%4QDz-(IK~H}u<W?*G%F`maMZR%n8o@r2AnCW)WavNov|ZJJPgX+q%V z2?4?r`7|dASWXn<oT%BN(Z$5zXdohcbD~V8h{HxruSU(uMVeEaCIx-eoO?(#K~ZdR z(m%0`M6p~&@q&$7>x#rTZ<<{BP`trWyJez8=S7L`8xoTqYESv7Jwc;$wxHB}$Ieri zbf(Xcy0EEpL*dlRO47HQq_;iP-M5fY=7H|PK$(Y0dPf`e&Rt}@v~b$xi__ja$=)rL zE##DYBq;YJQSQhN{kIq8J|C3(9LV(UV$Yw6@*Kv!yoU`~m<+E)C~!CR-jGlfTiknR zg`)IhLmB2i`NvF8R?JkMtfa@Jyr9#_NI}`ONLlZ(k@Y2Idm$AUBNfvR%3p7&xGT-} zyQE^5tQx*a^&f{?gp&#LN|TI9CfS$NI3?A2ZcYd;Zs995WoBd$d^ks3#gy|Sb5yfH z(&a`e%{H%p8|QjooO_2;<iSc2|A!)B2StJcMYS_UV>XH=er!uTC~CM<Y^l+F)0JAK z7q!+NYOg*xdGn*mTazT5J0*53>ezj$gI__?(^B$qk)%(g&b&sQQ$<n>4W&XPbypbb zZVuGlny7p0($wt-b@vEPJ7B1n8maemk&OB+nXNBmwpYk*ogw>yiK$ppzsyqZwPDZ8 ziTZz;3>qa3&RfiI_$BZ3%YfyQ!POZGJdbAZ3(dS$p?KG0=G}^!5==(3G?i4H`m~*l z=1I<4XsN8t%)EG}vf<=et8dP7En4PrN#&=<Y#U|O9W!U|)HF#jTE4$>g4biUEFtw{ zFDKMg&8hpfyq?Rnp=!>*l1)Wlf^F{!+jxlBb!OSGJZ!W3@rupH){mWSb_uWS)mpiD zi_PB4D`)&#*&}5=ldEaUua*5#E0?cYF`LWwjq|G0i&xpaaGTJzQvbxto6f7(-CDIG zYo*?cmCqO3O_;T6>n_`+pY1L_ZeA|3`qZv9XKt-I_iN2}ar^t_@q!U+uT`!6eWmhi zxx?;O&zKNT^A_iiENh=ctt)C-tE}cbZ@R<Iv~}-(t^2O-^+GG@7FXjNtF#ZVoWGR# z-^)rjP;vgU#r3~b<l`(qR_=A#Q`U3s-k`SC!&9Vz+dTBgto3OsZXDJA|7LCA*}YNb z_D1;|4zG5tWxKNObXTTa^(Kwkn~GG{D`fx6`PSv2;_bP<#CwB^x3TwTlj_Y*PYW2n z+H-vknEN&0v(*-r>HcT0ROFXcO%>b7C9?UW%7#CyJnUOHCaXA~a@)c!;w@?#$Y>fM zuyt#cbYRkId!D0PW2Lt-l?G(I-pZi5B_cX8{&+~@@}zsqi-oc`xv98R%(k=nzOC-} zc5cz_?WWtMe^f}G-12?bcH5=vyHBsO;odPpdglR^9UEPD@GjrN6<$_;dq>`q9j7mE zj|$CDG%s45T_~}<WXbGZLElQ2RhLJKWh}KWtUDUMR(q$~luC_?;yLV<O3@A>M|Yn1 zydxuh_Yvu;9nnp@PTPO&+9AE9)^B(A>9mS4^Sxcm%Y*(MFO4>jn&P^*A-qDDwPbzt z9>tP9|F_!<tloKI*^Y9v%F1bF8+T`Qh?mS4i;YMx4E<Jk*?Rx-?u>}E{okz}*KI3* zwA$s#>@B;qSG?Hmf1W!z?O7P}p999>2Tty`KRx@vuPq0>kL@#P-y1kR)uB9NS#)w; zT82_i>Vw_;1<p7M<y8GG-uGboz5}zjOWrxKusS($Yxu+4=__yVtyV9xoO8%Q$3a`C ztj&6@huGoZBM11!kNEVYIs0sH>z;c?+fSlq>y+b}YgVThY~AHyo)J-f$XCb7KW2yS zo-JZNM}=3Xgx%RErG9|jY?r{Y{XuON^Pe3JE#G_Z^?uLgK8$zD6W4_Nn-U!}%{tRH zXS;#TR!^J5-hYnw<doeJiC^k|gk9%ox{P0_&Yp0ajCS`!VbjZMjvY*xQ)rWOTwnB5 z@0vr6HHpnJ*~#fAxaJ)DvE-ob^4#BMx!=?5@3iI3aL&8bcKUr;?yfzjzm?@}nREKr zwbO@u3Qp}g^Cc|rWKaIDZ@I6Jow*Wo_FB!^(|4jL^lTAcW3TvoQ^pzR>^%o>#GHFp zbMD2QbFcQCdvoX9t2Jkr96zhGW{;lrQID$y3vS0Yem}?%c07Ff-m9T|*E~C1?2}RB zc4+yWwB(wdsdIMf|H;_&=D<7ctku`bTCbO^KfUXp&HfLs4@=)Y=Eq)Svt}=c+TMye zM;pukWrdd?|MEJD+xG-}&JpEl=i8@UFyoEUKYJ?h&8cXyi>5i3{^*pL*_6yXbM$WM z;lDhmlz1*ke2-<Qjpbi*vBm9Du=$}Y+8Jthj}_dxq|keLWlz%To`M<Lm-}iir`=7q z)V*eS_Hz2&Yk6xOZm+3i^EuxhebP>??&)<6_leb~+pG5-udaK0{n+vAjc==tPQPAj zd!uphjfS~5+I(;H^43((t?5|XIIZ^PjJ>sqcWaZ+UfUqHSxfrXBHLT;+Sl*SvA>^l zzR&H}n!C5w{dIo&`s~-7>+`4I+*W&g$K2by);74Bt(D(xd%?JQCwH@^MCLW-HH&tw zHrdf+CeeJXch8x>w=Vs&y?f=a#U-iGt8?$(+I#oTUFVO^Cu1e<#aP^nj=1+I_uiA* zd#~o+d((UG-QIie@80_mdtKTxxNnijEl$zk#(6I~MPJ?2j9}FIz&U?Wli0FLVmS-j zzje+pn>hcsrFP}T$<2w{PA4T?R(7y)=}5^*9=`N&*25`+QJvFY=**0mdgV~(Mn`Gc zThfbvOx+{6=uyz3Cq^<aFUjca(vzJad-Y&<(amlnt{zjX9>oRvR$K;d>w0XpX8fLL z(88&}WYpVTsn8o~I3e=sq?Lw(lN9gocsj#UDZFcG!aXI!1f!&TOLY$$C3elSbuxDO zq?~T0k{Q+SZ#3I3d3N3{V~546dnHZ&B?Xzd1y9I1WOC%DNwt(|<0j1xInByRFFN}e z8xFnb<<pqCd!oY6iHe$&rd*oqn>fk8Q8VhGW>h1?+)twKB_}U((pu6aR$Vc<bRmP~ zPpw}k#qA@tYYVlVD<AR)EMULY(X(R8!AB2$H5rcwbqZ&7&Nv|@cB*skibvZoPL<mw zt$$AUu%gT(qsPY%%4F_bbnWA!9Uii`81+kb%9?5Q{9dI0>Z06-!Y5xDXPk?e;jqfU znai+C@@eqD89rJwg@P2P{_LH0^QnCC(z%?<YMYcaf<KrT&07A`$nddI-o0lTvsAX6 zT(*r<wVZExrJV`m%jd~Lb3BFT<Skmxt+}FP(wtK({|TJ&oO^z!X=9T>)Mj;uin*6V z?niFc_&!%;f|F**#``mrMA;iOBM)jW{Ws~Or<if(gQ^#=EHuS=<X+cYoc~vH3d1aI z*OL<NmXf>Qz2?5PV2<LOlR}S_;~rg1TDYol;k8RrHx4a~dHLu<T$hU1qLfUT(-Rk6 zTsZA?qHK<*Z2r$_w?E3-$4!4)IQ^&4kE+Zk|2MsB``^QEJmcbzCw$IJgqoKKFJ2;6 z{QmZd-YB`Ha+lvfmN3#`dX~ISX<p<9gGEYaP0F0}XBjf9<mIW@F+F!udcMu_W1!J* z`^Wtuhg7TiCP?wm*)v})m+4c3)u%WOjSDvgE_iBGU7B+ta&8fu2FE|1c^BmWUV1+_ zX~liN!g*1Gue5j0Tg2DC)J}}mZ+=yU*4lrseB`wS^|UwZO=-(`DDh5W&!&gd4?g6P z>Qu0M6X!3b8aMT{pYC-g0WqVD4GR(<IP!9uYozShaQF}}zp2fVh>gzd{Nlz*PktOc z+|DQGSo6m~=t#SOMqrabV-Sn?G)0$=37SbRzCy<C9Va4_TsQ^o8mB1)9?A$@tm-2X z8}+CqXt|%Sjcwr7%+NKF8&|D3b@er;Xx!mG)zwL^H^j6qt&6?5$o2NNyr;WLFEY7x z?<)Vg>jJlOTen0VD|??{a$CG)o9Ou&ipgz>Qa#GoXE-(+rAnEl-B^*RT%3OHpP5Vd zK1Hea-pk92Z=6^t<=%H~L-Of!3z@(1-Po4<{>Iv5_V@P>mVfx+YjcA8$;qkO#|vtH z7C(`wvu@uP^Q%wZE-vAR;F06}A8sD37q_>wsr>Tn^z!idINRzUZ|@$TU%$`x=kIUV z+pq86zpwru!xw)0KTL1<9e&*?&Oh+|({Fx9cHt@hhu9RK^gFQ{uKD1^%>BgR5dYW3 z9~_y?bp((6_e+^@gkSYa!BO$#H6M1r-L+V-nX%|fp}QP2M*@R<rAW~Uxq6jP9xAOo zLMIib`xLpW&!6(?q{i|so4mBUSuUMW+xbV(TW!Bd(Fwg`9b<2k%OS;QRpzox_R_z3 zr|6vJ{eNqW	ibne1bD_RZ%L8gHje_K<HnvCi#%-3>lp`Hv-6{B=Le2nTt-%(-&b z^JmYOK##3UrUdKgUp2g9`1Q}^6Au4Hz66K4Z!Pw>y8WaiAS!$7*2~t>SGQb@slHo! zDKy#i>ZRbRI$;43$xk<*Nt&o5V&jr8V{#*U_0}-YnDtl7qVslt{T5wtShW03VQ$Ej z-7edAm&BIcF8v-`@px)^T-EEX-{WdNUoDTX`~CHMd;_ysMM4v|*^dXM^RM#Vl@=`f zk=UU;ts<#Qd)tqs9^-jCtTQC-!jmUBi&dsf@;3XKGR3g&TTJm)-XA9vnkE=Mlg+#~ zF>QA7nVB*3s=xhAU+{0CPi4j;?Yx`G(;2Tto|wztQJKCXbzS7EmCf6JWv$s97yN3` z?r&0wt&9KuNL_w<-^?tP#q%U{*WNDs{dRupvtQY}UVkf3-8lJQdFHl<Y*x>g-R7(D z*m}N9>g~b5VKs%v@_B#0Sj_rt_s9KD?f!gNUV1L(^NQSKk*}5u$Im*x%z6E-50`_N z*OXq1RxiryJ?tjMeDd_W+ogB1ugUnH4)ovj;eP)4+KNZ(-`S?@NngMB`=hlYv87uZ z^XsZ!t==A&aN_dPxj7G4zu*1kZ29-tnyYKg|JQtZ*!DO6rt<T9IbUY(|Ks^G@ts}m zpU>Cl-+s*OcdvHo&AvJ-CME%nj01UlS2z6o9F?$G>c!$2tO`whEKPTHDja#zJ|slG zl4Y>@;V95FA?{}Ojo<IgcQJ|>v}(E}Fosq*NbC#nvRn0FmmJ5z<*~2Y%%>y>+&JpY z%NE$-tdhiQnXyek?PK$otoh%jvD?r1+tbFlLXmeh$9mbgz{V(*B=NmJj!p@^&~eUr zk<jE5F3uazbgIcLcxa<;e&L{D?)TYB;s+&;urW<+`hRIL@6n9ow)X-j{195)e`dy! zle`ZmD9SAS#<0Vj@!z_v{5kiZ=N&WIHgjEHv(6)V+n){rVnvOM*C_JGO6UhgP3#I~ zNzw>kdCF$qq{(7BDGXwqPIomwO_OtZyl~2KH_vNcb?5)xexlQ>xyep0c;?$xPxWkP zc%(Ben4YDR$nf;LRdj4{*w&ad^SwWPQ-Ur|IM=ewSh{kt`!DT@nWxo69<q2891EWJ z*(8E@apbw!Z$*hO-(0s^tl?9h7d+>SN`@ovto3P=j3-^3lXh=g`q_q0`imNb)NQ1n z9`=6vAwjrC-2J`jL5`}DBqdi#55uZ}Dz%d7KlVJeTxn_6(f7Kg=24ovv6Pj}H-qJB zS2H{eUtO-K6j^TdbVWdI#-%dRuPfBAzVw^9OK+0d)D`x!T1Teb3hrGrWwO>@Rd4Z? z{_WTL(r@tu``-N;Qr2m*O8M-|11naA?vR?iy8Fv3Md@FsJ6%7|o0#%%`TR4puFO`- zS!-^q8L(U`;>f(xm5#2j1tv;euQ>O0LaFIu@55e(d$p#lSyFs8{_?CF-CA2$wyC~M zD4cOsZlCE|e^cE|ap|ZVv#w>^#jeRwyzP2&*2GO-EZT9Z({4`v^mTspC!LUwsnN+w z-?yDsjm(?6<F@g+*Y(+Z7T9lmdA;#a_sX`=H-+)H?{?Ult?Z3md-urcm{cqAiQJ~o z_jqswb4N`tn0t1eZ*ugFHBzEm18Q?$e2~7qGD&oGkZwNTU+(D2PO+6XsRb3&qoO}8 z+TOu@H=F&o_IkB2<9&zr>J`4O4&!`(dWE9e#=}>non9CP?aJJfQ)+1w|0YVLsqv}a zzX0~?xPSk=cd{%~@AIxXF8p}X-k&Awl~?Y5c=p+)!$#8-db6b;aIjl!U3B+lVqwoM zX8CIiwp{(xU+A59cG|=f5@uKI`g6>G8ujk;aeLjj_fMJyv(5>5pN$;hcMR(;>7Jd_ zTi7&LCsf*f=J78@#dCP)#u>0*Ka|{ez4~k0Gx60s&pZAt_E<RQ!CStHBb}vh>-hg> z+NkYX?VR^=?%6eo9_l|QO}>^_x%O6A!0}rPitE%??yq`2-ELQ2by$&M^xWjPT(ja^ z?Y8u%);dNpFF5C|V`O!H&ufp*l_%@i%BFv<e)=zL>W#K%M&<p!+f(#sPhXa2I7$81 z>#m^Rw_m53@BMcuH+%P^U3XU6eP6ZQ_vP<8lgmGEnJwIGd+U8uc=NHm?bq+^eGzo} z^hJKt?>;M^W&b{OYvuC0=1r^bW*%dbxqNlrk15)IAN!_%IT)*Fagk5&S<7+l!ylGz zKYV>nUfK8EPgL!8UXjqszrSry@ArROj~Mgaljgp)ZPU`Cy(xYsP3LPeOwV6DE1H)Q z;v9Wdqs5{__uR{R{TbU_#dn;K%}#B||Me>NP1%8|bw<lxPrCRaYUjGIGPxz<=8Myp zTkpR7u4L+Fi|0Y>w{Lt>chT+V0e3rvnuomgKMu<8`_SpX=Mk$s!*S((AG_Q4JXDvj zJd+;xdG_;~=eGYVPld~UZk%58!tq~y)s^LOUstEsz7~x?!?pO&HUILmEBEb!_t#5o zXx?x0Q2PAuQ_T0jPvEaP)V99zG57zEr_<|RNc#Ue{{7z9%ggItPSpSPEO_6q+t2I1 z@10+Dqy6SH@pHTNKmRc`3$6Wr<A2@nyZ`Hc9FPC^d3pU`OZht2({}e#j(y&||HSQ* z!{+m)*Uy*U!lZIwv9wv@>fMueTYqYv-a1>A;m>YKY3r@0cBy9@aQAFlUu-%lcmqeb zmcWu7tSJsBiVke8p1v)4hxIInyT5f(gLH-GINAxB?rPe8>d?;5lUIwItlOx3AmR5x zW}OW}SGK2qGV6Q1k?)Q}?`5m?zs-+09g=!%W#DvhO7lO570EkO7adSbK4ian(_*gO z{n7{YTefn`81zLSnlO8<&=RNoV&`jz9M)X6P&eM~=e<jD)1jN%`-3k#xg;A$dOJv^ z=-J-c|LL@;*quXibF3A8ocMLNTr;wk)pmOS$(-HzfchE3oXakfF^9R&Y=2ke<Ri1h z>5Sto=OZVgTn>D83gFqIcKLu$iq0yd4F*>ZtQS6N%wwgnWrvQi#M35cCT2JJ+w1*f zoc&mIjaZDN=jh0=IQ)C<yxm$&Z;6Y6&=JQayMs!OInOb7P1%(F$8A=$+uf{VFRWbi zTucgl+#@%uf6U&+9&*sg+P!p+d)1#=H>CHAluUoQX>XI&5^;ux`hR<tHvC!e#6#%` zgI){I!e*1j%`qNrGACMkJUZuibgl8|-s918#-sPniRzN$H96BcdbI0VPQ*5yc=};M z8_$U;Dkqv)PSnSEw7Ymdo!~kB%kk+UCugU4Hp`rty2f)xj%Oc_*FqVuMLJ%KZM+nn zci5)vuDD~}Ealme;;}^K)QmY^tM_=VIpekV&Z)kT-P$e3|2;mw<I&c?n%<jjP9F{Q zaz1kC)@SDvPKsN4ym!v=KKSv(`YXqm-ErKp$a~)#@BJ)Ndy-FWC^>EM*z2&3&k-M= zqcJ|m&gh&j@^a4hIXTDY)Eb}Dd(IqS@y_r$;(XZW{2!kSJiZr2PVKgmvQ(Vv^Kjz7 z^i^Ax6VHA*Jtc9Y@bxp3ZvOGUy~p>?nrW@pXRm~aDMtFHem?b}#9fy0oDQRK+{d$u zD}AkQ3tnGy_D+xA%Q@#%A|0<a`n@{i_x8@YYd4R-`=I}U$N!^@|0f;)&o=&FeEh%0 z_<zgs|6b$&qsRZ}9RFWy{D1H9|8vIw?;ZcodjxrY_%rYZFv<on=>{;{2C(=Bu*L?k z<p!|V25|HSaLx_jS{uN<H-P7C0Po!ZzPADVt{2`v@fVa06w(b8wha{V4HS(H6w3`1 zcNLMCDJa<+C^dDW)Z9Snvw<>qFG{}+l>Hhg_cu_HH%N&!NLluhvTl${Y>;a1C6(GB zwNT{`3jY|Ge%NR&4PsVk(779=do_sp$0dE+1_M(D7J~*Bg9c`c%Pbz3Sv(k6GJ?%p zgDqnlSP~k{wq9o45X^SsvhCYowjaR`e}mZ*8XRjGoKhK_OBtMN8Qelc+-k3|H!!$O z4e^@Vz&?S2<3Nb-R0hAdA)GT9{8&Q+Wv_D0Xb7?m4K}^XwV{D4A~bv}Ls)BQ#94;M z6<4EFIhqfIws>&FrE>5#bj1G+?ds_0*wE2!ajl1;GljRaKO?OF2g6j0&M6FyQ#crB z?zomcw{zBv&Y34V=RDvnQ0-c%(Y3&XYl#O}$<nSB3%J&1gs=V4wSj@VQkT0*wR>{_ zcTFt!){5?(|6YXeyuiJiBSPW@_im1!gCDpL1@s&>;5n8MajfFTiH;kR3wX|c;JJ9B z=ORPzMG4-k3B3KSyw?`+P85y2vx9f?-(DF3zNxx>4-;-qtBrir5IMa!a@O3)*;8*$ zf4l$9iJ-R?jEp}b<pmlR@ZOs5+NXUsh)JVCH#ACLm%&gr*wD7YNcXa7ZLo3eW%Jz2 z=AjIhp$t}QgEySLY;`tx)7Q%mqF0=CL!5N4IMp(^mtOJg4cWQ%3de~n-e*JhyuIS{ zH-tmrs{h}Rpt%hpwpW9<HgI-a4R5^~I`?YS($J{0p^X==#=H%UW4+eFaV_!eog~|^ z-Ul5ie>u`bJJW4BGj;F&n^wU&vx77DY1mwb>v>N*1z&W||G~LrL2OAY*D?dHQrpIr z5ALpd5nFD{C^F%CB`fzvgL_rH-J3nSw;6D6`*6L!w0rjo?mYq#dw+B{tMar=Wo)VC zd2h;dyrbts>y6H}JZE?GocY0X@xqM@4!oB?L|jkky<X9KQ{v{W3A}f1^xita``|_V z^xT_9voF5&5Rtgq_i{lX^E1ZJ-pX2E8Tq>;1-O`6_XPb9iu!NVz-`Cy!6$fCZLrzd zDAp6V)-Mef@?)^N8@%ytu$^u67TFN-xM&yG5ZBt<?o&f{uD#;1HQM*?ZQr>KK3{JK zvfc@jy>l@2YPj#6h}4*<y;qwm?x@ZC7o+hll#k=uY1Oc^Ph-xXeU#37w_l=jQpdHa z5u8_iV`oLgUfaq!_XXz-S+3in*KZ$<T~X1saspS`-mV9#aTRl~SNO&~b>-fC;`+1F z?j0|#?^(dzxRrZf2IJe<lor>BqaHl(OM8xW@SI$ca%M-**?{<-s}bLHdoLH<zuLk3 zvz7OkY~<|&_ov*A|NEEs{)hPKya^v0`WgTAIe%LEQh}det3M`g#>0YbbJqqjOn9Io zls09_r5P`SxcQj$Z5x<6Bu!j{)7=<Wng$z%US9L}0n3A1X1WiBjs@H5-WIjH?dTg_ z6c!>`cH6y_L3-aq>Ar^DTd&Bz3z6r$x}P`c;MxZNf38=9QbU7X@2JGxIhJ~-DdSP& zv^$L*Nm|Pu@d;e(-0-ODMu*Nh4*nl86D02H{d;t2ZP*Nr<g2ES=Q=!Izz{C<qjN#V z<HZ$^E&N_u9pid%wd>*2u1Brm8&_Pf{+nFOo3f+fUc=P5d2Nj@-!hwdU%Bb=NL286 z^f4Y!xFNCN$w%Gz&b5taX58pv<@M9!?JK?CSKAx7?tYNj(~xuV|GxH4DSbN4wC_tt zf8;+#h7bK)pFNdTNQnBkAi^(U?%zhXx`d>E3Q2X0Tzs-TVbAnSqtff1%@Dl2{NaPu zvB7I|FALmD6E4fi`<EulcBMe>xp>(_*W75Sbq{xxrgKaP@i}|@-`=MW_bpAY-j}X) zE&Z@<($T4*(YzT=6?Ymd9yKq!lW;VqW5=B{dppiP?dV{;o36^KuXcCRjB8UI?oNM@ zVa)b&&J9jexlFUN<d<&Omqm10&P!gs<8k@ht{L+(-|KZ($Hr~tNSQmYd-sEvdtPwQ z7wb8A;ocFAp7*`)Pi4GXelDf!>XWZ$Z}k36@&6ZbT_N@6i>yheksJA5|I1B%v>-BK zS^t*2?5`QGS=1i9VOaRdAmNR{=J>LN^heoRx(vFuY3X56X>vJ-`I=Vf=46MxS;LxW z@ifY+^yBe&mp9JM5!;qiR2IF}HC?tmT6$T?&b84MV!3<&-mY4g9w?hs8+P^Tw|~!% z#@<mC%Q!wY_oQ#ft#vV4^B!sKOX|MC(fKVVb?XcLZwy(zVZCne`tF6zDYz@xao1EY z^QGPOB^g}HCOj_Pn*8?JyBTJ2Ph8`w_J-Hi-mC5Hc6|2o6>G$TZQXBj^Cc?YFYZfu zzqE1LIv&sCPtG04Uv(}2`_Ziba!)6Sewg_5eu&<O^?6Uj=0!63E&7~Mux(qaoQLw( zvJc_!XWWl?pt<(atA;*p->BI5sJQy5`1)s=VTFnP!MSyBa_Vx{&;2N=A1%gq<+R!r zm$Nyt;a5uEee~FR<viaf-=iS`Ps=W|#VGo{4GsNN>lf27?W$_oofBspZZ0c|Tl?wu zv7)wZN$vmoI69tv(m&2Ik)w0cjtl{X*v!8SS3+Z_X(V6!`{J3{%Sn1&^98sp`aj=U z`uXnH*td0=@1|wi{eL%0?EU5gFSkCp{(|?XlU#&r+Iv^Oh<C9!mVCSSbKMiq^*z7a zUadU${_EDP@4CHLJ$eJKWif2Of5+nHU*DTd>R+dt_K6twZ($SUF8})e!vyJ>rJ7$E zmz*tKwZ4k~dC;=dTL<c*66&9=^bIzi8g;ZUI4Qp{Mg3uZSi{M<ho|x$N|ZH7+C4wp z7cD<MM4|rq9@!!Vvrjc{xwU%bYWca>-O3vS%1_LVsmSMO6$`6c-*NWsr_{MGYPY|b z%<;JX`U?Stist**`pe$^n^2ZFNv*5Ry{r9v?9^q+*4Oi9oO^7W_xA~JzQezYof2Or z*gx6b(b)8q+l{a1h(k|nZjU>Ao#*r~9k%yZ@b&s0`{Luz`{VA<fOYZf_r(X?=VexZ z&2qny?{6>L+)|$HuVdy{eXze3`#vZx|JFM7U=!WT3I4%+YSret-`2Ml+J^oXVS8?$ z`&+s_al7qv+3C?`Y#bc?Dh>i39~4+PxrF@!ZhTnS!pW~5vLIt)QY)93M%0BD7oFTE zC^@EWSa8s(ZIYDHoS2mdpPrtfZ+_;=g~n%Xys|m3uH1b1>^z@b9iQ&4ht2K$?vtw+ z8n3)$U#{R(!@=m}5-J$(oFS^%wEADTpz@wRRmDR&otu>}O^dj_&4p8_;Q1lbK=F5- zLY4kAEH+-(e{i57^oMHBj~1@Oox;j-dn#NXiD{_>$2sn7O+BM)mfyDVrYraP1-6Gf z9x}OQUNH<>-?y=<EnCts;rs;0YBt{6CTS0z`6ie5-Ze|Rvcd7NTj3M4Y3lKPhmY|} zTjtozpU2$(^|j@;<ooYp-T6LP7xn0`Km4ap_W9-I&o>^n{qyb9{nP#a|Myk@`SSVm z`uqRd`SlY%I14cBD^O_S)Y_rY%xm>Sp+(TkLa|jeszR|%GHZuoyKL1D#SX<T3#Crg zSrrM5jC?Z|H8Ah^q10o@C&18abgSZVx9OuD|CIY}k9j0B*q!1~>9OLfROxe5%2b}{ z{qM$-?tpVEmP`mTTB$O@(Q2pa^w_eQsl6d#E0@mjPMeuL(>00n>CC{WpGzj@+pSzS zC+?QV0)BfAj|GhqGAkEPi)YJv-kZ6|a_P)wp<9a=wwV1&pU~jur8d)}ZRLxpc}lx9 zme0K<slLok=%+^i^sKBED?7Y)Wv-gJj_cKe?5b0X`B`7>e8j&!ic4$t<au71>wTA5 ztyw?oormhi*;>^v)}QsuR9#<ebvtWWyI0imRR<1L<!n5rc2axg<}Pc!9k<$EJ)3!Q z(XF?eTG>{u+j(E_w#LSXaa_wLZ2fj}c~`v@_xkOZwYUm)v!4I=GiwiHwYR~hyIqm% zHoseSQ+x4IzSSR&Tnv->xI?!3OwKkL?`*9@pR#n;Z{-ZG{;>P`qMK^RG*@SRnCtjt zr+RmtlU2d#Q=2jkm)ZZmv*GmlOPZSx8R+ZeTnPHNXYGkg`*=QW&pzh$>Z-qdZ{9`u z>bDu^H|*N8>Z0qkUtf0lbpI{7Xz;lE-2~n8xq0X9UR7()-^KOI^!}5!+vX1%x$P_- zwo2Dk-2b)e#QFvm>vykLOm_NLv2Aj6oaM9cX?j1Oxn=*ee7>Ms&g$jj*>XQ$PU-Hm zdcA7;y<bmP@19rnX8n1->gPL7$63GKdH<jF`(3x?Y(DH0uCIAl@o4Vmk7wV%`}5(# zzwiHSzFrKs-~07u^8URa?uggdet%fMe(#SH&G!4gKbzcN_w&;B{nhs@p5NN>>*enA zcK^Qa-@otQ&-?f78UCvu_{=(?f%(aO#<%GQSd}I;a`jAk^yIoe`@8pzVrvxG{<=Hz znr&znfAWBx`^7<?E`t_Mm4}>;5&NR<@`P&zDe`!C9O6A?(5AUYkuQIRv(&qS7PBXc z0<|*^8)*91?c!R*Inlyd@tZ-XPsk(w`5Lb3L4}>6J&HFhfPnoy^HBv9ax1dBnJ zpj(p6;_g#3+)S0$_2$(m%Y0{Z)lJ*j8MbFJ*L$^tVjn-aC4RXmA1`vklrLdIt4p$s z@X8aeYDIlz|Bfihy_7il-&G)dd(cCvs~IPpr8Z6O5P71`Kl7yVq)k(n*{Es-uRImH zY17noHL5zvnx`W#ZJM?==bDP_%F~+9CQaY|Sn2VfE5{A9jHaZUJXSY<>27js)68=< zY9@;{&t?V%Piys=siL^@Y);YViHsfb;)V?;v(=2JoOVg;nX=NyZPVtt@7{<Q7Vh-T zzf?TEG$hI3;7aErrQ*4Z-z>Lue0jcHXv+dN*2kvxSADC$eVVuLiJC#N*|`e2l7eQL z71I4Xef;CLES6ZS;o<!2T;)2y{)czeU0qLYH`-J<QC?L=<Kj!tsh74adzbR!u@>jK zPPHq`<cybUFz@uN=bAd>jLE-OeIA^_jnjnZzBG9jxLWh-%Al>Q!uD$EJl%Q0!*z?l z#@m(t$G^HSSv9#=O7?Z2>&h@WNz=6qrLTe}ONFkvv~^wCUhTNxo56FU_~smZlId{x z)XKiJNh{lIb9}gGhiuqavbL{QCxun}=E-wii&Sc3?Q)O0t9_chNi=umgrHL=5A=Oo zE3LXVJ$Uu43-7)zJofq(cj^qc4eP$mUv8?aE*O3L?x$_rWlt|o^SAQ3b#2>5<KCBr zwX5$uHM;I;awW5XarX6<eV5km^36*Uw!ZteX#4JafAuQnuMGWuuxzuMN_xf7?zq>t z%+?*7n_cx-`~J^M+xMN#$>sQ~6?n7k+U7;I`u}1cYdv@-wBx|Ot!sFUt?d(w!nREQ ztDjLAee1T=jzeN`xn7wOafP3*A2f4P5oq|ZNZ@_PkvOK{X-+apBFvsg9XvL6HL4sF zJ3iy6**?R*;x&(DKkqnh_s?)bv(6Jm;hiVk?2IN&zLTsHD8j%{(Kvab%u~(#=awA& zqm`BZT1k|@;k5kjk6ooQX;QtG42dSi0tsuLm~P&AHm}Zj&SRbDmX{@u`}nPxvh>dr zP3xN#7h(+(s#%i6XIGq7lKZ%Dx6UJ{@SY1Pb%oQ;tw@tv{Nv1IHIrq=YhU^n@47ti zpUDbm-B*E=cU@U#XSynQ?W@quyRJ^yXDsz|&2t;(2h+`>=Y{`kpZ#>+q>79C!c2O& z?!I<0w_-5WGoGdU_l4(ki!<x$%(g7neVZA)`_{F6X4_(O-t0ds*1Kie*2#<?Zaw(7 z_3)9Y7Z(WTW+YZu-k4BjxMaHSvkK|i_cGiJH@#l-zV`F(`~Uu#AL!=E&np+Z^I+T8 zeNEk|j?#T+ZZ9j`r|6fTdwa$s#{Cw@jMshaExvP{`F)ht$1~4uC&%3Ru=}f=<)5Sf zl)mh0Il98_@wbnCmt`KD+g3hXxi5dNx%6|>|CYz?<=!n6-g}-^{pXsMGB(=A{?~cj z^P;+?ZoY}jeCDwK*PP@t#q+A~JWq%+yuP#V>&E1m7q0fz+hf1vE@{7g-tzX!o#p@T zhOE3SJJGB5jiKzj(oLW5o|v)D{J~S+iV9)74}I&(Z*bfHsCZs|CZYYyW7hlMPxAkK zES$8mo9A3v^!5*@{L)wZEY_=Xd?xlj^@{b=;P>SxwCCMSh~M+@ZEm5MyWF=);x%ux z`+w|Rz3;nb-H)foSACnfzV;5c-uF|sJ$anX*Jkv%>b|Pg|0{R@&&5sa_dVYH|Le8O zcE3-o`}j`L@8#_7+Fz^8f8Xq!_l+@Q-ZhT+Ifv}`-*9!jG5?~u{lBI0|Neabf8vFI z{q53gw?yxsEWKB!dVgoD%wN?7yCY)%+bXcQEnqRbeVB2<FWI{cTCwj8V%M2UFi*P2 z^lsKHiw7*z7I6NXx8Pss0#-H!*VKfQJ7W(qM%}TMU8r$?yFlEwrwjPrDe!+=!2eG{ zVA(9LbqjVRDtyd*@G9rVp~g6lcU*jIiXv_cMf?;+!ybz8J>*(9pZnF!j}N1A6c^m# zy~cj(&f$d%B<CqgG2Q(i`QX=9d7-3hw~x+eZ%Y*37cIF=QSRA7xp%jvm==i1J>(W! zAYLWNy7s<T@59Lx5|-*J&C!frI#FnX=Ix%RGn8*dsJ^<PdT;iz$SAdU3)S7^1*Kvq zZ@ha@S9YiAT^Xi6Ub6?XQAtadMykt2>RdXZb8m*qp`=+~qjl3{)So?4|CiLAs3^^) zpiuPi-JhGPN9Tr?-qyZ5Uw7Z4e`@n0_1%>9E+v`Xi`I>MWO7f*<l7^asKq_8$`(z@ zI%!Jgd5iUr&0Lb0toKgIz%D_4S-kY5N6%RMh4_TS3>Rx#F4k^SHvRY5q%7IGYq9FD zMJ9Yt?75y;G@Z0umh5~h$?BJ~rP7mqh04x#kFBRA*esGYoF>D_*I)Pbq(!8NQeT4h zrWww0kFC_Ay`+{{tV?m+m!vAE;uW>T$L)#kB4wAl$5xk?n7S>o+LmImE7@(<eK)bY zHhGC_Zzjv=-LRXugkw>sl97t)Bb9(p(r#LjVPdM`SxXFlCAzD{Dm1B_YQ3C#wnMrq z#Zc^_R?~wiKB-IYJ_)@xGnDITz^*4cdH<feo_qR*H6{Gj!@#%)8d|AS=O(dRUD>RW z8daot`sc)uc`C|!DYH`-du@B{;-s8*OeNLrL66|mc(;TEzPs|Po<>~aGZI>q-Fh;q zZFZ1U(&@dbDM3$Te=YXg^w|H_lC(!lUE);oom3o_spNiAy+3tQZk-xen;N&;m8_zB z3Puu1Or1%Wl0TY0YqwQ<e=#YIFSQ_UnOa)9uiImbUrSQTo|j*H=G2w`{^gQ%sdO%< zD2+`^PfT29IO*v}Sq0~{&$4zcOWws9b81FRk-E>PC!w!Y%hhK4+<TJq?n&9bW#y~l z9E3Eg4?PY)wOH`f^B^_<V7b67FTWDE<#l1|^~cg;{{6dARkW<YO`|JMrl>2art4|V zrE_g_pUT$0_|*EMbk@x{Ked)uO0Hazg?#D#%U*D<)2KN%t7PB9mjw@4ax-KD(|Zp+ z>t#|`o0n0^mEI{7nf__1b==FNsVgVUQk>Ygtb5yC!!(U7yYvNyic^vnIi)RAUi3U} zS4#Q3#ktqi=A243eY7l}DI--)Wv<}!xpkWVS~FYwG>ezT*zTM*S?j^9prqMd&u0g% z^v_y6=h@28PidA)Dofwpa28WvT9m1hrRB(#^-nO1dtK`MxiPg}Pr^b4dyTa07p3&6 zz3|U^?sseHTBocfVXLMErG&lHs640X#-*{MEvrIId*!N!Ek#fMC9He;TXJHh=@k{- zRg#hFv(>cw&#FvK(%$}V#>#CP*?o6*NGhyWTeUi9b@Z{UlxwRth&?Z7Tiy3fVw2s1 z__FN(wW}uzEz?~0YSN-izJ;r&nQHYhs{2N1?a4}CcIwf#zUAswEBAV>sBT*{qb)o0 z(7DW2GVzUyysK8{#4R(~^thAhm3LUyT)rnN>z*v>%R20ow7~AolZV;QWM9scT~%QC za?7^V14VB-KE2F;_j2x~%!6#2-tW>H|1GN0TXXuK%o)Ch_ElNMr!r=pn}5LWapR|) zLqW;0Vk;VwR^?q<b@A7$J!)@{>b@;9O6AE~v0rcDl~-%(?H1kGr+cUB&L*YQh@gLO zx)1sFY<tzil#~5cy)5jlbDEZq-^-=P);@GnxOqxvim2LtH|;BI0{4}KZvR_*{7}-# zu+#~yZy)BpyQ-UeneY5jyLHD_y?pZMMOob&$Gq3ec4coU%Q{`8_h#DNJ6y|(wBEI< zB}P`wJ9{hON!04adKstW*3ABvx#Zij<x074)b!=gt;@K!_E~A-sm?sbZ|i#FR<D&? z|3T>OgJ&vnU9Y}s>HlDhdGt!VZQk0)uh#w#cz@;F;*V^qpW5{QXk{M}dU(Wcy@H$m zuX747^P;C5%lyL>v-h9=+1~Y=-(?ridVN-D(UVW>zY4wGeJuNj)f$HDbDl3+b+U2Y z%%nH(UcJ9%^x^$KzWm)x`Tj!d=eQZ1UiF6MzcgdC#@SbSw@%&9o~9R2rd64xecfoy zv$~fTmlYff-O##BtJW^}Utb>k@3k-0G^&JFGr!KdruDx0nF0TA+0Sa}`@{-<9-1GV zro;38`L9!1BK3yVzdp=hGVFP_t~Sp=@c0IHew`+<nU+y6fB%YTD9R5#W_Xs>K%)D- z$mR^u%^Mh%SBWiu^iRt0;J*BiQmbdPuCF|n62C7`?(=Mk+qyH8HvG)`z}<ggby)V- zx(^pV<^0~ak>h!4s*}d4YpUzbUMQ8%Ig$2W`S?vPX|3Q%+55e;-#^N^-<5H@PhEJr z!QpMI%@1vy|86A*`{z8ZO|qAl{`>A!sD1kFpR|RaFDZYS^;E!ry{^82;$kCN<~+^Y znq2Yk_3B<VNolM-_wlOjM??M12i_J=Jf`#WQJ$)Dfv)z3_nSUG(=xV_Uv70>-{k&! zlf%aBt3R6FUpmEXg^QB5iqR&6?xL%gR$sXH`IFga1GClg`3n-yZTg}#;nyhxN98Zd zWyad|U)<AID$XyqwBF>ryU5P|v-_+xw)iissYSci8D2Hg;3(d_<YkuZe4}s6^epua zJ(=%n-Tv&^9O>n4qLaKrXa0J7?f|#bCcov@y#A*7`rD@RTOatO-zZua{CoQ$;B=(Q z?R<g9?}LIj+vFSBJ~r4`mh1Fy)q`g#7V~pB^ZylpcUoXsUV2Tm^zAldnSI3y^TSQg zfA+b(H9=V~u6j0W|7wALQ?<`)J-_Mq{$QB#qanq)jKSwyiv70KXtT8Bvb6GT>Dk-T zi?^k8e@mafEpxtE*79vx>&>#W%Tni?Wd?7{-fotAeOvB*v%Kfq^2*ILymA(L89kOO zh+iy_%xw1i)V8eS-%{<j74?71o^Dobzr8rUtoZ%5(s=W-^v-Pi?Pce;6^EObwQsNJ zH?KUrjeY-eyY*X+Zu?@QUlzS}lAF7EW^q}G|MxWavReP`na|DZ!@t!sch>IzR^we> zDZV4Od3&Auk0NP{X7e4*ugmf;zt5kp6vS;V^;lWw==S=5!WB*5&5Q1v7gd{=<X1FI zujtVJQC@7`U~kb~Z`RblqiBCc_j!xn$>lB9pI83-z&gF~ag>qn=j+olesnJXQFM9x z#Mj@u#D8`iu9#F_o?~t~<#a{w?HwiRmXnGty8L%e%l}z=zryADR?*$YVvFDQ+b=D) z+$x@IIeoq5?Cm>e@3)+j{=M>dSzrIhzQ=1Nr@t<64$@@%lKV~TS<u!LChZMPC7n&5 z5|+QvX8taJ{f+AH*S9ivENsttHA%yOyL8*Xl1258!rvRK_WztY?Pu+^#q-NQ`Kf>I z=c{`7?AiS5UmW)9Et>yp+53l!f-T;uZ7uHl#pZ4`YyE0od#$keb^iQo{)I^A3%&lr zynEMz^Hwv&zI}LEVWND0o_Emv$3{;#Er~MzSUKxW%;gftPn)iDWo!Lc_szE6{5)~( z^~a*l+3R+fsC=wiIX_|H{NK;Yc2(K?-P8KEn0;~bb}M)L4Nmp>?(26gc(-EPp{?`e zwpi?beeImqHu=|wXaCxoysOK~`uEMe0_IPx`F}Qh{4x)=((5zX*j(}~tLpyD-K*{w zoMNs%ziyAew9e_rANNN6dA_Mcb@%Vb)2cML*Idx5;T7I<JMF8Z^yY7UpLR?yS=Mjt zm{$C{@5A}_qVJ!!ToN`ua*3nLf5)!-yISA>eq3d9LD=@yp*?!>zgE}(<q`jMWAdM4 zGffN+|I1_${u@$UoWIMKQ-62hr9X+*Ya{%3+rR!}wts8<zfG66mr6HpKA>HwAH3(c zUdimX-!4jahn1_MnsbjF-h2LY{I1>eZ#Gr!-oAam*RH)<c6<4??m1iAds`oW{cH0N zTg~8IVd?4%lXpG({b!w$vBBiu=N|uilC68_yWPg!Tle#?JUU(1_4|%}tN&e({4MBT zC97X^>9@}8v;Pit)jj5a?eMuSRJ{7)zh5E8Yn*2<*xQ{w^WL84%KNXom!6*`^oF_C zeSY4m&oy_$_qpf4U$xm*$^YdQ?!VW#{+;8izR2Xl(8$!x!WmHTz_FQyThHf*K$1(R zux8kn3PXkoJxq)xUw-`i__%@5(XH#vk4H<~r!WL?$vh}}aGF8Cp5^1m$E<C$>}#G( z(JWT;S?ExIOhigVGiZ@}H=pUOEh{gzOPPk1toWdKsD)!|k?9H1)z{aCZ}f|~@l`8g zW5($&-s)*<!n%r%r<Hn$C&z6set1jQdP45q0}cC^^;U1+aPtU{@}slAC5oOL53y|8 zawky5a}smdx|Eqh#+Mgc7rx>-WV}51YEZa)sjigPo245wnV062<~Sef`2Xr1Z+M>b zk-lQ_|7QhqKOE(%ysi5B`p*v!C+YukyH{cP>3RO*_i3x==v5rPwAX)mom}m&-cbGc zb1_8>8RzFRZfV=OdHGBErSaG6tfUY8`_HoFyggH+(2H$5uS8F9eASUHaEL>7&V)l; zx_bl`-@di^&EB&wCZAvYuVK~8Wph4w_ihz&l?iaY84+{wK%>x+3CE;z_Xr-BDZMk% zoyD9h!Fhs}$;-`3-8n0dE~v3syG7Wr!SEzQ@*Ja6;{BgCu9Dk&XVPiCy?=y!x=nbD zj!d#)d3!=2RwTpo$`|ckFO8=$n@?HvFXHO3`FdyadAq-VgfBR-%1*i9#A_>Z(M2?N z%0)NXT9Hd0s&l8Dmp`c!Y^-GOW9%k0+eUZ4CHI=iA%RPM1RcFXW2asXi>(#C7Lhu4 zYS=eD)&!4p7w(97UGiZObq!uC6B=Rd&MSN~WoqoSe>c-qcZ-G_o8C2D>epC%S>38z zH}rO1f2r7=f}^t2??^2?TN)hq^2?WS^IqH1+ZB6T#nl9YKjk>rT>SHbwRYj(>znGD z-(0^R&B`Y6uthX(#=|z*I*CUes`Dfs#JqjF<&>FyX>eT9bJ=Ne{qA?a-1Gh@`XgZ~ z*RmP+r$#zyK0Te3HuKr6+<lVI=ak;Fyya7B8gw`C_L=kHJoi{7UoM`y?o-kX-@Kns zCnvni$(q3DHuKer#rt->`nF+O)awnQa<jA7razN>yX9)!?A&R(e!?!<-dFUm^iO|h z@nlb=%1`6zp-sEq9M~)-le2=c{O9Yn&p(?#JtAEH^UXHZ`Ex#<y6E<AdX#c?>ZZGY z-ff#5J@ISb#!ThUwlPm<d{wRZaMV9+?t@0@{=KQ!W7TJ8-H5+`_tU-F|FS>kJ=Fed zoPAeE>irUD`P!d*zrX$c@_}$)%&%8#_sjimGh~-Kd-i$Rr{arK{q6otFB0Ya`{io< z{J-Ds*319<@pS(Df4|=Dm;e9g>;3uv|NZ?h-@xcH|9nUL64A^x#W#iGe;#AE`gGPM zifPIN7R?Ap?l^&F$tw@o^j~Z)Ded=j&K93D>$rpPv<+UeLg%<5Z#aqX6KFG>@{lJp z!dd#BK)dCYhkTVcoaO%sbU2D6@wBs>_pI%REeTfmEO*0&Ju6$qdCDV^l@YGmaf02E z|E@d|+gYLZE;BE7PVl0O0WXfQPWzZF6Y^N<<_$OVeS&?3Z{itW2dk<pzVA#oQ5Kff zaJT;_IH6JGi30miM}t1C&Iitm<vyQqckAl!n`p8~@%iMPUUeTQ&HN*+X1>zXGicM~ zg@2Z)x>|Y$^-Y?*;>!}v;FG69n}Vh;ZCR?FTIm&ajH5C6PBOFnOOJS~^;0*CEYoe5 z^huJtJmX}Is?qe7XQHf(r(ImK)TH~SPqy9XSy#5GPI2kbHG21{<w497?=75XGv{rd zbt5F*a&xC&+PcegpZTa;KeRkwvF-A_pDIi5n1yYR`}Ar0!<;7$Uo_8`UlLyUea&-6 z(ODOo9!*}zANy~GqbAqIu2q~9lR}nQSXu?JS(z+S+^gZ?ek)+I*OVn<p)Xy+X9Z2$ zccsEbINANb=7m|yIF_o5W_p)KU7GW+WVwFn%Yf=r!3$<xuKxR_^Pk)#yXialjb}8j z3i*CLWa1H)+KAlw6YjZ(I@O7;Nfdn@aZ+o4jMd6j0%ul*-4wr?;k&ioKlXL#`c+fb z?z>tSr~5kY=dJMl|Gw7Wb&(6c`D^mZX(!jdT%48ka=O6sQ=#kHYqgU*mqhGg65BlU z>YKFhvrc3$omx9FRzCS_)Xh`VzSS;jeGuGUbp7J1tE*Q$eUp<J9eq3L!<zZ3IT=@P zg~jNaZR^ktPL_?neori{HfCwgZ;uP+cW&E>@47g3UF3Sxh)t);cHO-Cu572b$N5Fi z)E<iJ`yYGV{Au3wJugkyR~=p*_wCb>y>DILSH0A}|LIuyzHdk0*S-FI@83W3{r`9k z8dzfznB*%CaGGss65Nx(ZZ2_%XWEBmb(uu2_#1~L*L`R+JoE6YSg*;a*7qIxPLKXh zkvOUzwz1Q9&Lfe-*N+;cee6!YlO%e%;^^D0ANvYz9?Sf{aoq9U#|e!-DT?BfC*8v~ zO`JLBiJJb+lYwoYrp%8?)r_8bD*Rf}w4FVvvckQkiDI8;oQz2`o-cVeGwk!Mn|IR8 i_e-8Doc4Ln%b0ZQ`;zA?uYI2P^UibAWCaBV25SIf#y)!h diff --git a/docs/images/scfg_msg_area_toggles.gif b/docs/images/scfg_msg_area_toggles.gif deleted file mode 100644 index 60e8a09695c00a71494a67c574225943dd09582d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22080 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 GgEavBAtKuV diff --git a/docs/images/scfg_msg_areas.gif b/docs/images/scfg_msg_areas.gif deleted file mode 100644 index 721a08baa78a3514c35d9bf3ce8f2779bba96219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15314 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 BC1?Nu diff --git a/docs/images/scfg_msg_areas_gen.gif b/docs/images/scfg_msg_areas_gen.gif deleted file mode 100644 index 759d3732ec033010eccc4549ba8f5acee303b881..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17522 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 diff --git a/docs/images/scfg_msg_attrcodes.gif b/docs/images/scfg_msg_attrcodes.gif deleted file mode 100644 index adf122a2a98ba56bbfee1f73d6fc7d38be563823..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19853 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 diff --git a/docs/images/scfg_msg_options.gif b/docs/images/scfg_msg_options.gif deleted file mode 100644 index 7f2d925a437fa74c055c342205522399d2feec82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17004 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 T{*UtZpVaH$Bs(}TFjxZsa8Q;W diff --git a/docs/images/scfg_networks.gif b/docs/images/scfg_networks.gif deleted file mode 100644 index 5c6ca79bf33c728bc495aa34e338e079f7804f4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13354 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 NBylDyC@?Ts0|0j#cK84Q diff --git a/docs/images/scfg_networks_fido.gif b/docs/images/scfg_networks_fido.gif deleted file mode 100644 index 76919a672339e350ddf18866ca190ab002435690..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18676 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 N_T5KG3JMGi)&Nyf-z@+D diff --git a/docs/images/scfg_networks_fido_address.gif b/docs/images/scfg_networks_fido_address.gif deleted file mode 100644 index 2c4247d88599ae6d25623980b7dfacc078228b8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20651 zcmZ?wbhEHbv|;jQ{LTOYEes6*8CqI66tg)rvjsq?SirDY0)(n1EUOhks72AKMboK8 z)2l_(tH;o*$1teJFldTp&=kw4DV9-loSdATqUJay&+!7GrC!-fgR++f6)z1cUK>@s zHmZ7URQ1;6>aEEwTa#P%X7}vP?m3n{<yi5QW5sih70)?WJ?C8Y(sL~>EiFsWwJg2X zvi4dJ2;J-1dT$B{J)g4o`JBDa=Nx;#^w|5Q=iV<p_x;$hW7n>o`~RQe|0oy@0dhk? z2b2RqdBK6>A4C104~i2W9BAU;*D^U_ka)P2PuXeCj}41lx<&M}&YTcje7slQx=BWJ zQ_6|SDuJ_nP8Kcoo@x+%tVVOQ+S%F0#s3a`Q08!CVyR(}@Y<4bQQU!BKqH~S;qr1; zJ_!SXs|_K{9BYznCnRJut>f6I<{?m)!^Fxd))TrQOqY2ZkB~ux!F0#FyZGKbyL$Qo zBQtxQJcFFhkH$of27dd74HX+%jti)`%+pD1YB@dCIC|cJolZ}=gdM^eauZ8lTw0+W z;gG9%_|?^Qrd#H%RdjxPdxvSxg|!R6zq>D6Qhvi=PeuD<X`7OOeS3bkKRsn%!C)9` z)xm##bNhjPwk#Zi_nrSWh$}k%>G<^AvqNHGolED}_nv$774O$}{{HU!K!4$Xmiqr{ zKhz&^vWR6UG-?Q}Xlhc|dGVlG%S9uxMcXH0A(w7K$3rg3Z3h(Fbz3x&It;c1JnGav z!qCiZFlB`jkJhmTi+Bvq2{8AXJ<~YMV|mWuFptrnh~|D{9?xc8cd^bTyrwq}ESYR} zCxMyIFUWE!ucgmSRldk)2bNB^Y|&gc!|F*u+Dz*w6Q1!|ZP<BucJ98PYW&4)hL^Y{ zZfH&kbm44y&S!H&^U{3lA15dK+cRucpI@Wo>L4(|>C~0Q6WJ0OmPC1mYA#_{m@qXW zb*k&N$mEq%!=ef=wra(e+`alL?%#%QU$4iv3Wm){>@pQQm^9H*?dJN4iD@&_rbe<w zWz1F7zQwY1<+C?gtM)#dmAxfW;r7;Tsk3kA@BO$fy5NZ5^2Wj=isdrJr(Bn>E4j9{ zTee)j;`&^UkA3QLRZr$_pU3fP@AG*apHH%HsQE6qM!xQsY>iWcs*X)U1H0QDg=Ri8 zj)yH0@ezsbGI<t{j;plwJnB^6^&zRp;F88;9?jzml>7BQdmQd_66#zs$xH6%lXIa? zm8w%?na)0)9^WUKHZx6b?XydHX1eNg8}@0wSX3+3vV2|-U+Ri0ERrn&*X;$Y1m@Wa zwy3jZEMNQWR?haf-)<Ki*ZqE{<a+M+yA{vZe*br`=KI_4_Z!&temrOq&)f0Pj>F4r zQ3c<FACD)v%Q-MG`~3UyWQuj(&Zkp@&;5Khv$$^O^M#YwRlZp4zRv2!^74DTUMyN} z_v`tx-F%j>*Lu&}`FhLkbye@yPye_3-L}Vlzdy`4U1$AftGxZ6&llYF|9-g={@?oZ z(d%`4KO9&8zvtubdU?C|cc$ytecM;<U-#kp=5@7SI{Rx^+>}Vj`~UaH^Y#D#{rUd> z|9=La1q|#S2biQjG;sJVU=lxZfX(Vdqd?CB7IllAn_6@0#Fs2!Ge2>Vuj)gy0?$GY zcaK9tbsN+_ZC02k^J0er&w<wd<||)PB%CF#85HSldB|P*!$xY`g!X@Sdlr6e^Ejd; z^|8alXOYnK6GvY8@^LUWC_QUXIQlQ}VqN$a`6VBwy9!rrYzSDB#4PM?FM4f#qi#*2 z@Y3mrO?Q3lb?14+UmCGe>Xt!}^_<1Bl^xD@j|%%rmMF^o|KV=y<kz=KJ4N>U4QENN zOYPk<Pm~jX9MRC4(3P|&N!(D=)i24gdq&S9iTBG-YE^yeTqv?sD{$t?kglT1u{BRM z4rZKWNa^)waCyjj_Jot^C&9kVKdJ`po@bJzKF>H|lct*f^Jtn?@yyA)mj)KCTz>T8 z`sukYX=am8p3STJJo|x*n#p|6bLnk{vo5J{F`V4teQfT;#)B!36^lLm<1ZO^-2V4Q z@rl7se+8a~uKveM9<xXVH2f1@!1h<x>91u#o!ONI+`1ah@>YROawUtzk7igj&b-jQ zif_@sH!mE2OYUrOD_P<tqyE3C!CpS$9J}6J8K1;oL9?!vEVDSf(y#o~<vFKHmYK6= zG2}=E&*uwW;pY0vzy8+cxqZfSU;UY{w|1tZ$*-V!-e;bFXxVvjUDems39*a4z8?=- zX7+VWhVSaA>!+@5+x2ygf2$V5ikVL3Nx{7rFE8|vjtZC(XS)9LnZ*h3B~Bc?7TjTf z=5?a1=Zyn)mo`kO)ltgVh?Fog+t_$iJIPSm{q(isO^I{wMSKmvb~3lHo6#aSGW53n z6}JmpSC;<M%}Mr-zO|@q+g4Lu@BH1jFEM?Xvu(<2tGg$?S7&`KZ*5hv6I~fu8#Hah zh0wg@>8DS)xry!iJSDGm`z!aCY?D?m<Xs=3d-BZhpVPK(oSK{ew>_G5k@)tBhwfBg zpB=6HD{T9Zr*Ho^XkXvy6<R0}v#@aX?oc&3^NEjqH#CXs+`IVf{l2F?1uQ?c@BF{^ zbrv&QzSQp@ch3G3t!h2HSV3@gj9~kX!!mViY{P3Jh1Iuhnsanbo8+BD=d`e6y?57i z#qN15UTxOTcTB!T)hC55NMhAt-NmuSbIve7{&1}9&O1KaYJX|}nTLB>9;vWar#g5= zPHcZ`)Vpy`tj6OVr((nw{ZlzClWKg~;Dl?RF>C)Ezg^pe4}bWxY%;&)GrQkE&*x9s zyukNH{H|XOtC;>J)c=<DKQL+M(Ft*DmaNad>yj0D_S(|C9`@JCvi`gJjm-*XaKFqv zmv!rkeV@rvP2O9syMJBX(6@C>`zI!bD^=Ha=zaNrqw_^M-><q}wv987?(uM5ck|Q| zzs*Z``n*a~w?2B~t;wdn(P^36B`(}J_swwg%GX7HrU&-@+xq>RjC1bn-*;a4m1pdX zP0SA$zVql<{D!&R$$pD>9bSIVWJ|uzalzdd$5ydz-SuDhS&*^y&daIAo$P(NWy+R^ z_OzAnd29Zj>3YTG(|<SaTkG>Ct=V$dP1g6v|2bAa)vez7MD4l7$<@n~`q$5SXkcy- zx7+tzzIgegIm+MLlFxmf_xsOt|2D<5^E(eYd&@kZdAYK9{n|G|{*#_eep}wRvnqF` zwb|7O@sImA@B27?ec{9DY`bnew)k8&+4zz9@yeqUqu-kO|J)tYZ*n5g@9DPuKab8W z+cxF<+n4X#Y&s`B`Ei5Yzii>`xi1*}ejmBsmvG4X-^U5;s}H}HdAR7i)JscsgWFg4 zL<p(doDDm_<ydh}ZtMJt8v$un_t(l*UDe)pIj(=toBviN>5FPldZhoEym-zh52J1G z^7ilEV*T%9x4g~c!t)j#?r*<j+}?5H#MIw!mh0ynw!d??EvRNs>A&;oud4t5exUy7 z$x_Y4)AF%z<(GY5<$1s6Li^m^6Rzr%Cgv0vx&ME)NdDi!sk;Bx9Jl+EWL~#jC2@Ou z`itcy1?lC!>P45zi;jmCoZMDa^t~kadDTJpn&Rhfy6rU#KPs4Jm_D6ev7@|U*7XY6 ziYAR8welx46e|)#r&hmAFI>94L1SCavF%mUOq&Cam%jO4`SV!4bZVofMzwZ_w}5+$ z@{S5aix!_7Emy)@E{9YqWi)ubXbG!meHdPSHl^-Xd*$!R*$EPDNfvD>5p8J|Z5cD# zvUarPoM>`ikrMKvwaB8qB%-~nqFp(q*t4U(=0<znkM@QW?J+O>JVdNdeYXDRY{<~L zqJ!aqMeh%b?h_r8EL?7Ewrk_C?A*~Y^GC;Q3EPPloqZ=dC*A0nFJb$@*=C+c*Bp(m z2|qd}zv!C3qH|?O=ei$Vi#fV3C3h^Z=v*sdIrm2QfsWSu>26{w0>?6htqcWK3ww^u z=#eQDK08CeLQ(LdMeo%Yru>Y(T8X_kcl4foVS3s^_<BdrlM}s9fAl_|(f4de-_02U zA*>?44@Ev$^nZ%z|M)}XhlS{`9sPf9h_YP}W%$|uKSPWqazdJ*c+tcOg^A*2isC#! zCkVV0-y|d<+^H=#Q@dy4#9l{90RbJknUY5~Ngkb~b6QDCtU&7gC!O_*x|<(LNneoC z-}#U6rqbj)pQNP=CR@y$Z2pqb`sQT01C#A%%Gg^@kyDU$jhyo4klt-UeV?1MUq3NE zE!6++Bp0$$?oZLwKSJ_fHcn*;Hu(K<>c5KyNtOyi!P7*H4aJ)c#hetiE*Q!RD=9E3 zDJCl^IUDH~O|O_aU5A-j=koNLo6~KCW;C5tHglNK_EN>TVTRr289kk<eVwYYLNncr zXJ#HUN&KXiwMngL)6C*aGXp=*3=p0*Pjl7+%UR1fXX&lbU=Uz&J~(U5&ROn^BC{8X z%rMfN9;CTlQ*{0%%@{_pBtxyVMzOSuVnvMNs~>5V8)~1LDPG4YvBgQEbD~7=#)-X( zlKY$__cKjW`nOYZ;YUf8l{#mOCaq-D)#j9bW~sYrq3(`E>3ff)r4BIO6OuV9sP`;L z=EWl!Sq0gjma>0->Rq`gd!2E?14X%qj&jc&r~bYq_tsGUjiJ2i1G(6f@;@65l5ZOD zI4cMwPh;JrkkL6!Fv&3M<TR;GhH{4u3w|2vIZW5IGSYmcWbkQ`hBC8Jkh1wBBfZVa zwx5(8om8BInC*jR_!g-+zEbghWE@tc8vSTSLX)bC@l3B~HP6jzxszrV9-2AV()6*0 zeT1+e!v<69hNVmkO*s_J+|nICuMo-DC6YC3nZw0pULQsL5=DI!MMD?P4m&6sEhzS1 zLM(=HPIjPHgV&r@LE`_`Uee;(DSp~g`)s6ko8sJ#Ms2B`+Oj_xCN<8TY^XDR<J_Z< zBu^~TSuQBG*l^y(CaKFt(pQ6|uPxGjQz?Dtkn{&mna57^p9blja$J2jaLT#DDc1w1 z++@^OP+0IWXu;!+a=|m@eqPdNU|z`hd8*K@HUB@Z;dfTx4W7n%NI~|Og2Jk4;+Li= z-<qb@rKm7@ky4OS$xbDe%Zm)S78`FeGEi7-DP(N1YOzg}%9kz`-$^r^PZ<XlE%E4D z;>4`R@OsJgl_q(M)Cz-^&YQU*Y}W>!(;EUVZwT{Jzv<p_WwG7s%a$7#+ld^vTfW&^ z`u4`n#&#=q*vPHkD4)GidUv<#?oAJy|7|*RxLa}erj^W_#kuX2ylr+>Y+mughT+F1 z)z{XmlQ$c$-Yj0-aU$8y^tYXbwVl587MbcTOBZjs;M^mk-4j;5HKKa!$KrH-iH^A6 zTN9+WCCzSsf31~0Bs0FO%JfCzh40M_;#rZ>+jmX2-#8_1pQv|fcYJV2Tyl4Xuyi}e zk=pzvB}LIY9<Zd>YNsD~>d?%wBYk(vVV50RKfK>=FSXgREyp_3;98x%M&qp0rQf%g z&TG%tYuUjV;#F<!z2S@J=@P%nZm-oXyH>GyEoSjr60&>l70>O}o?Dl+{tRx2UG31c zx=}S_$1!QYWwUp<xTQZyPmGzJ!ELf9K77yd=)HITP1$owI`NEkgIL(IYKa{ac2`?* z?BehUQrjB-+&k#MNs!{wz*^QIjnW_`)<D&zfgg77d-b|l_Gv)f(eMw|`+uI^$5R^Q z*0T5e(h%p=Fdx<6w69?~OAm0@gmCzTc&i@tFg@sc^?<Kv`1R}d2e|hhlHPasc=*@u zK(Ww$70+YO9WSY3um3W={8V_A%!@;kFRG7!FIT@FIf-pMPuhWRq0v*7;=j0tIUjS_ zAR7N{Yn1bv?LKFYd`@+^&E0gay3*%ahF8m>YqO8$Jvn^ywNK!iwtts*9GvZNY4x^M z?4DPm^Gu)RzuTUb|GUceTDiJfi$lcDoHa*9z2n||J^btHao3pmfBavLyb6tKT64sq zCVq41i9er@y1lTMm&r@fIh1uKU-@{t@w4*1?jHNibKi^CMunB%ntC`ldM9gnUdNL{ zvmXu1c}`6iJ-))ms@pp(_RZ0~)fK-NxA$c`r0Nt;?>WA2k4ucr>9`{&0ws>6{@&aF z+Bd?dS^rO@UB)pUiTe3RlWl(Nl$hS!5LUW+P9*pDW517AUAVLHP*3H)+d&>PP7AxV z?f#Q7^-Y;@$Ki#m8w`C8zdKV?H~p~e^J7Q0oXX0M$k=wa>dL9BZ_Zz_vB|BtkP(r+ zz3syKwDgcQ8Ob}&?YFsj_{aq@-8Qb;i|f)d_<fu9&e{3;`I#lJ(=Phd&)Hsly6j)p zTJxIE%L}<YE^2VJx;i#Iw>kDm?V`r_npuC&f7YpCVNWxUIsbW0*8k%Pe{6E1mz~_B zeqjpF<zFeaQ`&3KbDuQVJ*n~bN(Ap^BiYa!&-cF2Nw+wA=)HMkq59d!x3B2VxwM46 zeo=M)2Jv%|rlsGeUya*()!FfKLB{3%V%L_X*L&5LyU(qf_xijfM`M+Eh1J|^7sPii zHa}eQH?-_+e9+yCUOUe8*WSD)eN*?v)hgSJn%ryCxLdv+J9hWX6@|I=O>+-f-#C_W z_oVBVoi;r;?<~2QZ*ev5#C7YK*j0BfFFJckE9U%~zhxhCGWXbCzcr`fP_Avq-<(an zH&d@4tjoSV<6rybv$1z0y>G|*-n^ZD)w_IWUhIYCzURMPJEkUkXGM6{>a~{=-S<hc z-M%IpcB8h;l=sl>y=P9>-k6<pW8K+ui5-V(d(U^<-Z``OR-Nqwo$C$n-`)whyJvE3 z-PF0q!sk8^y4UjY?e;mo_d|2<|ChbDkUMkn?`tZ1Ykp6^Rq?cx@%X*pI@h1uK0FZe zaGUx4kiFOM+&!=7p2`z(=hK=SY<2gGx8MHWv$N`0n$Efh3pwtdYdJkvH{*)!6Cb%c zy?w36|6DD+_9P^3@6#No{x@5t_CAfd_cZR`(*(I^@%Nf8@pdHDJ<FK)ENkDhoVts% z*WP_B^SsFJd5K(le@utD_vXbM-T#(Kbh-w*_;OphNOvvx@!U18yW_<3jVn6$&p7^K zv(2T;FI*mWZ?$;Y?$_Nh@5S03FIKPUx;A;UuJwx+zwXv|&!@#bUAT4Y-nLh3?!D5G zu%C0b?^Q?NrnuKz>RxZ2_j=p9*E{yT-gocyfpf19{d;{lPVl{i$ls?LUW)zOPKtym zin0eRk0@L|w@GxtrRB9+S{aF2xd+9#ELXH<iMMsF*gQ%6jHSdjp}9SVbEPa-9{BWb zqM^>Gb&_{qu2ij@bZ*k5C!V@GlG0liuG(uj`Q1tBby|9xyz~xF)H^$I_3KNFHv?sT zBp3MpTpggfCRmc`SJ4`V%^#yyt`XcN&uP4nK}jKb<-djOhZc%{UZ^F%NJ>~y^3ybf z`bEl4>z+n^))it_EB^fImXXfmb>_E}O`KKioz^=it#AFQ;`GYcb=P`ZW|OExOB|Ke zT$4?vo>cQOUh3PtAy8Oj_NA{AC#lE1|0=<tk*NQzVbb+gKWDAuoW0RgGwYVf)}JCX z7KzSTB+79?GydT61DaY(oU}4FPB<1R&ebqyebI`VhjX@G65p;g_su_sNnR^uPfolk zsq^{VT%iITRnApvos-rWuF|<V>3^N{o1Lq6JASxhBy&hnk0W2^Oym3=S+aY&rd(Ml z`@v|zZNoJ|JN17pl6%W2FB31%|7xnptu<WCYXv4RRO|mFH*2k;mZIoCr$zaZi;Vso zJ~_3>AW2EP$>^59vQgGzePLrg<1bF}>phK@{ES)>aOlh5S6`fkX9nA=1<W!Dc%{a^ zdnUiPdV-c<xbU)=U8app0`_%3elRi|aA;<#-*aF?@^ObY`z8SuhXd`7J(7$uCO;M> zHTF9;2?%5^XkeVI$}eFNAk@e>kzGK=!om39nc18r_d*tIe%{2w)1)P^tD*7Y0=Isn zgi{9`FE96#w3+bhKx62dNJX0myRN=w=8QYs)G83>bb~WpbxG=Ov)oor;RmOdMjvd7 z*<Go7<8JoB^>=y1n4&Kz?AXwDphHyu-U3JG$Hym1m(SSK_$l?YtX0K{H;KjV{Qnl1 z*MDGOD#_%RcUY0etJIPuxX!+%L$_&LuAq|JlY48USvUn%OSsholUzC<9q*o=5O>Js z^K<nX-plhIv3wQ2wmyG<U()Wb*AI@)4^Z6q=jUhbORF;$I{oeXru$%X`~5?8+!EhE zZZDX4zrI@{rbBT*BX`Tf1B~e%j%*SlB>`=cGCcuoQc7zQ+qg1!TxjFU-jK*9ZNqbs zO(=KAK^LLI4UR`;!eTZal__X2JSLO1#gJXLV2$B%neqdL?6NXkmlTz{pCq;`uqb6H zsLoE&IN3BS<<o*zDW^%EeJoxai`ps#G!}K%t;p~(I;|tDGJ!|I!FTeFn3qeYMi?<P zPJQvuC*j;Io)at8<`#G@SkBVG<h5eaq@)Ior9DAjT5j`;O0<@*IQ2?vo!pI6K|V(} zZPD>NYoxt)t5d4?x~<QeUWe@bHfw?Y-hZF84I=(poiR9M6mTZ&xWZ*qqf>IPMUBrI zT|Tq<yxr%XEf+kP6-}>t&3=1Rz(F8!+pQ&g-)<AkV?Jm8phx)J?FZAG*I7QFQN51k z<s#?nRwe7Rr(0JXo?O1?(+TJIao<mM_uKw@)4bm9@0;Sp{f+;d7ux^f6ZzoKCOGGz zgJe=cz#~b8DLb5a(su+n_Zt2waFKEo*?B}bHe{l!bdpb`n^bnn&0{jf9|DidWs7a{ zXz#o8@PtC#ho9*S{xu$3@O(k{x0_yzdiid7>8VBqol>1YO)6{E%q_oOEnnNW>(yG( zSy9=V8~LnXuRpl&R`!;&X4bE_oLu)Sr}a@;^qZ~6r_Fx7efP58+50})?atoIxc&FL zU022S6l{AKR#UL`p`Fc#E#K4jygAI9Z~gv+VE(7V{g&7N6dydO(y@@y%lvQ26=seE zhO2?)f4^P{Z?7%86`Mcz+qL}le@pI`f3N+1uU_1);$d=n?6*4;<L6e~nLhpR*C*cn z`zl_o-u~~`t<rS4il-ax|NVZyoqzxD+so(6RXtzoFJJcg`uDnW`AJ_Kzi6!tpIh_i zs`<V@&%ZvG|MNR@ef^8u@&CT0+x(ZDQ1Oq^<Sx_v>vkVDuCEt3bMM!=@;!{7&eaO$ z#4+9f?kLa}(9FB#0UP&>eg8Y(H$75L<POeoU}E!cReiGH?K|;(Qs?yQ;tw@ke)Zf| ztSg|yIpscMXN8N3T41MlN|Ny0A1)eh7u&xidoZl6aMei*?2dktB)<2Dt3g{}PqIp~ z<k<>0lVyRu*(u4=cYnB991H9VyYui*mBccwbAkQUPm<;T{&06-3!2cZlA`!mLr~67 zkhv`-MOpTzhlg9xq{&NE6w4!2UAGmMDSebx_kDiyQlZe4_0mt(nhSOXc72*MKPFWq z_NQ0Gu}K|KEKCA>B2F_r`c$XH$)Nv!`DrgU<G!wcXH=w}U+xO(Qkl9|#=&UjO`jCI z;F)J))LwbrJd=JZX!h+VY35hcy|tNwOD~^MwFp%|7svLn>xIZNm9r<0Sp^kNJl3LS zy4lmK`rW%JKd-3UXP5itvxO{RwtZyD{K2m*DR2&F>~rheoSxBEA-&V5ELVH|^GK~w z$O48|S@(^Sr>dL2%vW?(^>nQYdRV!oO75$QcQmJ0gH*_(<RhxinU=vu*Mb(k*pjKL zyvnMVMN~OnMNRJc&SS~5N;)L3t}tihx?H<1XsS}En%U~EOMPC!tL6W`2wBW^DQjBE z65YR9;hw8bt%#etI`-)+lm73)rmw!t5oBHNCs-A}^V*jM7F+*i$G)_>zL#m+oT9th z25*0zJ}f4-JgH@MK<lrg7555D+(VOt47tuOOAFgPTXu!d;~SUT-8OCPyULNWFeI?b zXlv)Hr#acNzoXQu%(iU)`^K@+>sF7z)fGoww9@psqaUz^?~pgq$nA~3&G5i%dt8rB zzIJt>`lhlSmzU<1dU9NUoF?A8I8=|pXST=UsE}PtL|%uij0$^ksc+_18HVca=lA$u zT`B#bD_gr(+WY6ZzP<16>I=Mj9sir{#{Rdg9~$0P+uqCzoXhydu{rd50*8CVA>m~O zt-3W2Iqttd#9z08-$I6gy?MuB0lC5s-#ZV5l4l&*#+qKvyXf{wEA!rIf7Aa}?ypMT zx~zQi=coCN|GncCZcjb%R`%2DU%&1veHTBu+}fz|q4pE`?>`QFk2QKb?@h8A|Be%p zW^*U)?AgnbU3gGR%&^0D%|p@UmPfVHHn(24c_>&Paj4L&xb3x0y7l&-XYPc)D}Sqz zY;q}L@5Pvv`Q<UYHG?BBc8ev>*ldwz>mGG!^0Jbpx_8rV?z*x2jP2T#)hcn$<zG(k zYkprbF*EtA*3~IVzF(t0p3D+lWpX^CbgS9PT^a7lg=ZdrNwumy`#SdZuIqUr%bKpf z^o~>dedD0qxAl{4pQY7LJinvWQ0?&STLF`|pN^8-I=xgUD{R}<wOi!2S8iMtw0WNS zorn8McmG=&6;|y2dDXL}+ryr(y;fMwzxL(4ymjk$yw22{G3P+vHc{?<$C}wUTt9DS zv8DNMcD%Oqqf6Uzi(=oTU-@?J$~B&c#{y4gOlbep`Oj=eneV)#nUlZmzBW&1Md)1r zlKH=$u87<E_0X<YGn5UVD=pVMDSEG<-FeTAq_}U=l6D{6#cdxk)myBet5?`rZuqos zZP~H;uRr=9in<%NG;N#z*>~lSZ{K@g_Vw&$t#{%1vP(a1duF>(>s{pMJ)3pjDIH+9 z`%uC+_eFutFTL6SN|q_tKIE6*^Wguym)*s?GOu6Taov*7X^p(`la%SzPa8eT_2m9N zIX?GSvgr9w{>jzPa^*FTyZ@^Xn!axLwZA!E&vieqnz%Xk_3OId!J6~mMPII2Wq1GS zv)cY2@51h0uFU!KGBp2Piq*fz3I4BdujDGPza%w3@w?WS?Q!{ArklJwaCfKi{P#7t z(yy%Ee%&st(*E52-}^p09{uq_)B16K_V4D2;dUny^D9r!-#`83{Xf6Fe^;(<w*S?= z_19#Zm&#khtPil*?Ed{)B{bUPX0UD8YTNC*ZMSuszpq~1_1K<|XL;9UlZVV(jExSw z&~k7-?XV%(JaCg8XN+wn^Xga1+U2|LDx`O_^Q?GxTWcGW{S{&RFG;GhG20)#a!~r> z(9Lak^tbV`YQ6A9`=xvKsvog;({|Fjq9nlb&*3|_itl9;N9!#&m2DNhY}uF0<CwEw zqh+a4$-z61%?(_v-^_M2|8wy2O(&~0&enUJZQgJ&R5aSWIjqZbQ1y+n{gn<q7W0T| z=S|JdE^Bt0#q6$8-ZHy*S+%o+l*(SVEjy*p91wkSaO<t@u20PUr#N4hbP3XN4Zgx* z_vCPJ%+YVcj<!}uou=4p=B)Leb5t?PHRjAwD<9WbougB^9UgZbT_1cvKj-l8$)<rO z&f+0%(K&7$N7iUhS+Xe0a<cHT<I3CD&N}G3WZzBaV}5(gSKPAO`uo_n*+<-t*v%?- zD}AE2tm~LZ);b5CV?U&im6oiHTH{`$av-$G-DA-Toi)cQ|Lr;U#@o86#&)uobFH<r zo451r;v<`?S8gzNYdzzBqWRd7$;a+?x!>A!?5XwoXU!gE$&NWWw)K;am`-sh@o{{0 z%F*D?u@9@4_uCxlTyo-j=JD<t_n(Z%dU;OtE%9vr;<;dpeYcB~=O_1Y9^Jk(yFR@> zHq+<${21M(R-T<Xj@MRue&Rk=y2W!*&yq|Y+qYg`LOd4Bd>p5nsJ`-c*)rv%#SzO1 zDko=@oRBivof@Or!E$`r5wB{QQ+BgeDwZ5u|HO0Yk^QTWcpnOJUwh~DqBmO>*Jy0u z*&6BW_$JZQXv%4}J?>sLsw;KQMB4ad&0exjW#5}DpXyVFA~N<fY<8di<Myxc$*yfV z2a8T0lQv%M`Q)H`%A$fP2X|jNbLNrH)W@gi{5ihA#Obb#-=i&h_m)`QXVKr!<9mST zbjq4jTZ9ic`K)ZN@l&cgbH~RcNyl&Do#V4xmYlD#uM{~~)N*i3inE7{_6P0L?k#7& zv>aU7a`@%qGZ&w@t=^*b<;l79FXz_2IetIpOqr1H-!&U|$^<a`E_(cB&yf(n^(lUz z-Z;8Fad}Z=nt$X-(wqzT9Zwi8IsMiq;PI8y=Z>6^xP0QKP{6a~vyVSJ{wO*7s%77` zm_VMMeYf`bwDCA8Y&ri&XYZ;@0sO6NSyJ~u2|4uCMo;){pt9{Hjb9i4M+aPB_EpL~ zCoFSDWa+<Cmy%Dj&N;)q_R{<<K5j0)daglDL6@EiT~rf2Ker~}rc2-sk&{uM-R{%` zu9J4(Jo{qtmU9xRfyHNn`p*O!d<_(MdzMx75?gJM$=hIO+bchR2R}&(nyVA2@l^fg zlmOkO7sR#(XdS&^=(0Wg(WNskR~`smUij%ukIbcyCXO?L&tFUNzqIAz_mInGbA2V( zp7&gPaqFBQKVNOTuOVldu8MPCa&tZ9el;{v_L^T%2<uT#w$e*Mrgprg=cn1M4zYFi zUFv^gv)`3HewwOb=N?`4RlXdbdM07-MYo#J?Il-lB?qTpweyQvW+SWpIb^qfti#5h z;9OaayroO_$y`ajy1eS&+v`<(uRqbbJX!lv%-c)ZOV2Tx-r#JxrdfL`?@?g=U5#Yc zpnO(8cGIgHkNDc!nr9#NH~s74RqI{UbNYq%4VAYyI;KYabMZ+L4N0{P?(vPBX&Tay z8q%#AB0MK@F6-r4PfrD24WDs0a^c_WmmVH>KXrY2>6L}Cx9Uuz+>N}1o*sys6SZn> z)at!aYtBZky&JXe?bR;U3-@0~ZIq4Pq#M22HhRn1sG7g$S3KRnr8as;Z}iT&(Yu!3 z+Ugr-yw+*&-ROO9qxZ9(pYMBXziiAQ-I&9+F$PYz_PE9z%Z)i+dxx*(*2!Hq(x(<! zvNSLnblkcaBOs)}pQPARAbU>M^~}<_|1O@rb7`)sl+?nrNAFy&oqJvM?v<tUF8AIQ zn4~BrB!Bzs+`Fl_8oB&WZB@KndiRp5%O%@;_vXr;->dj_<DErkJD$7Vec>DT(l+iA zZ|qssdk-V;ie=q>WqR*L?Y#@U@gJAoyEQk~>CC-XUuB;q-cyLW|Jrr#=dZEng6>>j z6!+_F{NGa5lT$kye#bNLB{0e*FzF>Q+a<90C9uXNu;nGN*ClZDC2-D5;98f!y)S|1 zTmrA&gOi6C`2Qsc@Ffb$B?{>!3fm=u#`5D5#qtux>k=jU5+&y)O07$j-j^tIE>ZSg zqTIWO!r$)m@+B$CB`N78DcdEf_$8^vC8^~l88H5vd#*D{V_wqvl}Vc0lC<_E>7Gl{ zJC>w>?~(qyBm=o*L%qiacF9I=$;N)kW^u{pag)@=gu5>o8zoLQ-I;9W$Z6X*+3KS3 zv>n2;Ure6+Ve(v#DGM%iE>f7{64|vZBV}a;*Q$mm9y7VtEtul<lFR3s$mSO!TVJFE zWOnZ;;0}>Y-E)I`?*s0A6`}_to`%}-M6aBBw16kFkLTnBo`jP;i5Gcd?WUdgn0Dny zYD(p_s};OAIT&wQJWD>;d;3K19frQ#!e<3Pr#<56dnO=WG?TC7WZIh!@w|EB)r$ND z$HWWu_`g1wUfaq4lS88P9)Gi^M0whbHcNr_PR7oa&p9SesQ%YCf#>85UdD+N9!?OF zoY_z&DB(GC%FKz<o-d?lO3qv<C|}4i^PuD$OQE?dU(DJ0V(!6=?sFM^_cHpgWwbM_ zZw#3Hvyzd~B2!+VVT#|&$=_xg1`0D-bec}goTAZSF>&(L37wV~g=aE6nfYPzOa_tp z3|-ECDb9f+Ze>s0*KsXxNb#6A#rt2^+6fKp9Sxflx_!gCH$`xBFr;o5c)CO4Y4A?& zu$SE7flnhmd&29UM$dd2na8u^9Yfqko?UEWvG-DwEqUX^#8M)A6aT%=?Bu<*K`b>b z?cNXGw6bS{FQz>X;Coh(Q)D^4=;E`|oqTUE^yPiy`@r!$f8F%Lxc+Z5`v3j(cwTys zze!M{>{~xWXFBu3bhd@hJ1ZyjGz#=QOz(d=LyBYO1VKSTMM1$p!6vl~v5A7yDkWR{ zX12YXC_izgqNGsIxs0D5XREJFYAfh?p*QE%Hz8G#j;;qB6Hjy~I2<+P+%cKMV#W-$ zX+Q4Is_3*8d}4o)bCH;cv)mL`hpwd&B1`K;{!U9-vp~dqpUBE(SsXiFt+DG~JFj8W zhgSi7*=+Ku!FsPl{GLW+K8;f3i8wYj;+*L52Mp2QrtVtzdiOUT!S_$ETzGvYLhPEt zvzrV#*Clf9R1_Y5*L#$&@4iLfgNB^!Ha=PZ>8}p-mA`y;cG>iTZ*R`)J-=Y~{G!_1 z2F-sGSIi_@GIOuFO{nUVxVdh|tz$Fz4o={{IpHqbi-|9DMHus@ESxyCP_p&j#8$sN zh0GVT87Fma%iF*>=cOLU@kc_h<0iEn_}si<@m$G^6Sr|NaJ*k2^rdeF$HX0vKgn@U zv1nil=={RRWRv*b@?+-Q2a^}v<NP@-fAPNeOUj<CxbWV6+LYBBQrLG)@i{q#<3QG$ zds*x3xLM_=a%oK66)|<A-P6r+PY+7)gl{VdkK^IFUa;evXyW$Q=MKCU{N9kP`Ej4! z$7>NEuXjwlRq!$O*tEmT3XlF1JCW8WV?I46OkDmx-<dY?v)|IH4EYQ7p4Z%*e(~S* zOXv817nJ{Zn9(dLQ1Q=ApfYa)>&zm~PR5>vx!fmb@Nr7^{*<_<H&IGsrih_r^R$UZ z`I7DSd1mo>=KUGZ_hrnxIqQO?RMU-O&6}TJxlLMol0)ZY-o$Ci@6}3r6iWIHO1{{A znU%-sF@5q3i}wl<`L;7Ty}xt*FnjWIUcT$Il4S?p`^UdpJ)>*+xA!ZKJqeL7*z{t` z+O)6h%1Q$zr$(x$?)I1(=9wCHtdu+ab=?22+pm3yyUB3+0>kcoJbTV%r`*p@b1d8+ z#+y{fd$8}@t%i^H82awMm?m}nTj9lT+0VWeC5o37PS5L`uJAlZ$-kyXGyQ8vzl#3b z-v!?<w=w=-@aNxx@@n}B9gVrw+tUB>d@OHxFTwY)Xu`+bX8w!^b`uTd^NjQV8qb%M z=M*yIpY&|ok2yQv9iCa-w_U3L{Un1xp^5Fu%Wme$D`fgc|C|vw*;${{BJ<0P_|BQ_ zKW#Ge=N#Z%_^;Fc<<F%Sul(A%mNAsBevrRpeF}qp>FQ;#*0lW!5S+Sl`qx$ZscZDJ zH_P#a9xGkno_d_&cho%wKK<YP>>Yg4Rvaof4l+BoaPikAym-jm(XL=u!65kPuxq!3 zW5<RYfi4_^3a))3j)#_<5LEV?BoXN3!Z}^V>%tt*&&xVztNP5j5xGeHg0NG&km@R@ z7Z;bPhp43PnxYx9LVL!xfWWV>x>oCM%FBItRr?>$dcCL?-PcNNkrIYiHpNOOukG1h zn0{n|wR2mnR7K{Q7pJG^_ewTq-&l~?ydm*Wd#*uPPxHse$1QW7Oz252>N_>ly!hN6 z<>SxKTRAne*;XBYDQjJ^;+f!)<NfjsX_x!{9zM>^vp)5HAMb4QJf79fH|E`qHfy-C zGxYwszs*1RnOF+;ugLrRtMuh1Zh;4R4GoP<_YX^3BrNz-`T3Qgghzn_Bh&W}!e_!A z><=>i`u17-#Q6k9X3jt63Jp9G6%QKu3>GLf^Xt5Lz|80J<3Ni*z>kJji6jliHh}_- z#&$U`hDR*QP63NpR9EdtVin%<BZ*aPheUF>*oBP7UW->5{~XyYzWrFtCYiFJkyVN% z^T|YytPPD5Wps9?um|v&s5&w$P6=@0wS6MMAzQ;R(M7<Q<&cYbsR)z1Vqu7or*cQh zq}e(Lw*>i^oLnO8XY%yQ<$3mhOPKs!MOzOAd5GS+5*(m<>PkpY)Y3yCk&&t^!($r1 zibf`-ayduj6~1~Iopn^9IjXETYgK&3*#p;CHLaD3NHmo&JDjvtu8cX^%%<&i%EZJn z$<$e;$7b@)n`$;IbK%@+v$9sdb-0s%{4ZN{-tM1ix3}2qeAn4_yma^4A_<%F+vT@r zR<GN6ukrfb@<)y0^D191OqZ+X*mM0J<Hx<`@wMOIPIsvP!TMu96ARzJjD$uutsM%7 z`K%NcHVJ!KJZu$<T9e2kXUCv)Txr$}r4w4qRwQ-n&Ek2?VtG#@xzGC5kH`J4e43jl zI%{RBOty5^Omz$qYkBGvWfwAWx=`pB)mce#Eo!rrmud!iXnNLO@-E!P66|f7*}L4| zj`6Foe?6Dhi@<idTOzjtJ)dfXMb)NiE=!D!3ggaL`P3=8^7ztgF{M{q!((e!o_ZC( z`j*0tHQkbFtCMy)J*!y1KS}M)21}9b%FIQL%hqI_u{tfqwy@jI>gCeecDu5c&p#Ja z@YpRqZ|7?-@#@{L``G90e%`tKUgevo(Q?(F_KL^Xd{Io0ul>o`GrxgJjAuau!#}Tn zgC=g{6Agz2v;7|)5lO4q*s9PbuXJ2~vBsw^<^2_(dW_cHF*>dH-DAlFlgo3Sob|WU zyfBG5^TK9Fwx*@c0s@L6nI{<g%S<{PQZi)@o^ZdyVmhhgfUl?v=T)DgtyYB>)GAJS zUf;*2v9KdI$60fBkigPyu4~^0hR>W5wu5QA&(;K;#EpuPNe$-Po}AUqUU+)NpEB{? zYqIp~K5{4gD6%+mWmREsvCMh}cgcj*XGWniVH>+#rOv5xo1V=&`+Sb7+qE9Uo>Uv< z>`NTSj3!NFKPxD{WrOl@%S#*k%JwMBeO__g_S44xx<ASa%$g@0g*HuSvr$nJUU|aR zXw$@se?7`F_bnPcgEmc?CgZ?hRC&_3XwsxvZ&Wm#HNCvkj2IU0Nzv5)c`|s@rpc>w zo~i|NdIy~<nzZ%E6K(&>(-HeNO<6Wa)u34uw3>7B&MQy#`#HVitAb{(dXuU<GxK!p zrJ|`<);!ZMe0e4@?vv$}u9Sj^pC@zJif7-Mlcv$@c`k6)=Q%54mRrw$=~ud_c+SZj zRolxmeS)_c&-?dBU1Ke$f7!FmbN<{>*Nd&ZP^ENb9_P~($BUL{bDkM5VpzI_f5Bs! z-Xw<kOtl%V;<Ey(PZ=#y5Pj(^>UDbZvM)2_OEo-;e_otwv}Kvr)N~*AtjkSt!pooJ zq?-g*U0f*ib*|mkf13I;GcV=3ZJDp1s}T~a6)^W*$O-}53`75!7tQ;$=j@vDB1rI; z&$K?#Wl6Hx4z5yRm6uAE1o~<Q#d-y9joP|4Z)!$Vq?O+usnTVOOtJ%+wQnp}y1JsA z^-XBBSLn8|(Dfl(HG*GqU7vbs^SU`-mTfyQQ@VfM<PE~MuTr*hMqRWk-ngA-Rno?r zVVS2yXBE$Vl~Eb#dra%f)}?>5GZSy0xvm$sVV~@>^sPT5Hon`m{gTML0&l4+D`$P% zvTd$L{@0V2?<GxHyzaJ+;mY5)-|B6if9J1W#bNDxA17_!^K9>nuxR#^r#6)@Tp6;w z`u6K<KQ5K;`_}rtcH^x0i;uSN|MgY>U;TgW2MoeL_A;9lG(P1{U@?w3$X-^^^m=y! zhk3*y{%r*<-=h<GgLfR3xc8yO{!JoZ_l_efa++!8S|<hO&p4{Lub?~e&m*4m5=V^o z8TJ<DJeK)faokR>u(xqdvf}p{C+y7%Crq?SQ5BzgQgmOQigET6P3xJb4D&us?VppX ztzLOL^xvlGhwnT!)Q>!qs%AXx;+j-bY0JG@eCo3g%A^}F|9Pfto$<WuHR-m`XP&P9 zRy_adpL9p|S?6l(O4N*hon7~g?Lvpzm&LqqUwAstx-@B>$uj-5FD;9!F3kQ`vYdO) zBaM8sD-+GOE)ATU8Ct*V!kRkM70GY2BInP#wsPNx75^lA8Qsf`IQH>5t*?(g8P8lj z=@6Uh#^$%L6XmNJ&iZ|;T&(*xbN==j`&gK^H72|bN{haI=Uka){omZ2{M~n+*_rRU zy!Kt`=G}Lnntcf~UY+e*Ty%5MmhBt6=jNxsuAcnEt!)4Qy*Z8FXWwG8w>ZR@l~=TU z_QRPa6$~}99~EM5-+s5x;+XNekG;XS&MvuUy5w{1oBGeQADr2za?m}lAmjb)Nh;5` ztG@MpGxPGEXJ-2?&lRuxJoodS=XU=sFEs0YS;+nO;a#&T!_L@`OV#H-@_BD|WwGAZ zmBD*oh3&Vxws~D?!F8$0JKI$DHm?0N!(95Ap8k&g-uFIjp8e;|;whFFAOF+)zVq_l zcV+vn?-l<0z)&FjNO<~>?KAuG+Vb~)XtTF@BwSyTA1`%k*R!pgmEV7>X0LgwJ^jxu z#=1{ui|roH`)~7N;>z6a&vU<UtM9$fs9({ydEeJ{>EB;W-IX5eZ24w}zU8f(aX+W? z|Nf@qUU{?LzwBQ7z8}ZF|G5`<{%fv$?VV-ocifNH|NC;k-M1P4en~6pm%YpT|Ksu8 z%IC)ZWgia<{rP&%_Ic<0pPPz<{}$M*?yH>t=bHZfU$5)xUUo~?{`SBBYjfqn{}<U9 zm>3v>BKGW!Tv-|QWa0gQ()r(8r~hJ{ziH;&{e}uZJrxdg#<GMhu-|$AfMLR)+Jtv! z<&O)_+x_qD{i73S-(Rcn?_>PekFjdJ4;X|J7|yYER?1Aty#JPS8nfMla?W^;S$EmH z=4{}7$Z8ZVuy4Ll)`FjF=Re&WyHRqXU|7N?-$V{G#WNEVIIZSzRYiYsj1iwEcV%j{ z#54Jaz4OG);w3jN__t8;($0DRFD{TdmB?5p@$KMDrf&-T?-ua?6ML_kD3X<M+V|lT z*4sbk-Vr)9M?pyGr0W6^u0={s2?{|8ihMCDX^K4C5_T_Dyj1w`Q{%!<sY%@H7D~@j zR9`pmV&x;rsOZnRbH1Kjz;I20VZw~ZYr{|IDt!N#DE~>}*2X#dYzqa<7O~q&D{Q)Z z>)>6{SF=Cx-d9mutjM<b-&02=6Q<c>yOgAtEqYn|NNb;>_OwM3QFEm1=9{fr^r<oV zZ)S|lp(NgG3)?Qrx!;_}$}~mpos#Xf#kTt<fBiaNZI^=mx5s}ECNQi}mc7KL`;LvN zY0g5)*?K}(ZSF00wp;Q&bg{jkifh=Dt&C5sjw$g<EhufgJLln}GE)_oJ{3>7IWAEu zUdvRz?p>tA^@P_ci0__~@H5#hXH|UfsrWrx;`dI)|C`E#g$p0CE)C#Q4HR2?HSvi< zno8^4L?*FYOz)OB{aO;@ry3fzH1t`@C&{H@d8*-Ms#h78IP6O4xSI6s<P#^e2a(g3 zM6Fv|F?WgAKGm4C7^`h540@_Q`yRV@{ZolLrX2lkX}r+X=wnM0_@3?D_(Y~lb)Dpr zG{q&eT%Ydcy>F<u$Y|M8r?8-HGsOjRgtkRqO8fV;tTatMR!z0^c1BZLrk~K2scGrU z(#oDL-f0=D`LiKMZC1{;Wx1D@<vv@M_f9SU+p@ezYWc^~a(`VaV0xazcA$`JIlsX3 zBBSN`V$Wmb(qijwFzTt<*e$!wyD%kaLENr6scFv`8q~FCE;GngtDLvIqAD$L;<BuH z&$80gs_LGr?oF>~Qm>Snl08j2=h(6$yXE!&)En-l)oZ0Mx|r6ew7fwrBTq`B$S9-1 zNj>7yQ<;4#;e}K9KBYd5U6c|h*H)yKF>874GWD!~%hWrrsb`;4uW8Gu?R(KROQZJE z@|siXJ>Q<zE?QCDwLD|fiuQXiI<Bp7fBJme+vQs|UlfX^7u#t}`lr_POD#_>qfqbV zM7<Z2tTKzGo)=F_aMM~UtMzQpQ`OX8aw>L8<#n0+SH9?~%jlc6Y}TRl?prUqSH0+Y z^`d-H=A3UUI{KFM&r|C^_M&!O=Im3N2CU2UIbRmZX-*Z(oEVikiEYIqp_L1rGN(jo z7RYHW`lrs>wp2$fWrxkY$TAI~v~**?Wy`mv_v~8H{^&)|uZ+%HE3;<3oU=`9&7@T; zH$9!TXjR6h^nRvQ^ERzo^GMxcp7cVcRmDc?OZ8qg`(;fQdfi~P;@>1LjZIFkrluvS zrM`5ymD<{Ny0k6mU9Q5ZiJ2NtS5~!YM{{NE__}=KJndb}R_|JuT`cvCM=7nvP&N78 z%;c=sbAG+-yQaNKQL(K^J7wDZ{cZOxb02K8TexNKeUC}mYMhxzc(snMj61wc`iS5C zBT=(=wBA1YZ|+g6yJr%0j)dhLR#aV<r&3z>r0eOz?eA7;G^Uk@J=<rg6hCkNfj;>& z=iV4pDyTloIq*wS(Q3&dw>O9EbdGc7Uhun<ownwS=G@~+Yc5K?JyNH0m}%aTm2xNA z)@<*6!xOZks`YehlKT30uU0iZ+1K>yv{v%LX}Qk@b7pugKB@XhbzkmzrKA;$bl;u* zxAxpI9g(nwChs1dfA{<f-`e{^x*Lq%ybfJ^*hu%P)7xW8dJlx&J?LE1vgvWt$?R=? zYuBC1ys=GZ2AeY5C0*sT70-6+s&=isJ!zdvQQk`_o&B%kexH4NPA%rX+`21V@9r;} z{czL0w`RE)?cQF{(|i1G-DAC&7O&?meM?WWxnIAv`c$3nx~zBa-p2j-yU1ATG0P^s zum9pc^xpka^x)gI6#X*&-;BbC+Sc<Qd-vWd_x-cHcX={b4y7Ic7yIDby7z3kzn3XI z5nBI5ZiaQz>gj!1zn8Ar!M1_nv(SVnokY2Um|d&g($;>|o29F^<i@vKucpZ}JeGU< zQ1|OLp`UV#o@IWx`H!!_#cTCjsSiK()*M-ve=POQ?^o%+&DKp&%losdAo1S&-G0m4 zLer-&TJ!(d+P&{S+$+;Na7*WA*Y(#;2A?_&Hk``)rT6jTtGtJo@~)`mUB0$X*jV>N zT%qXXhaavLe2kOei^^DDwU)IyPd{wKOR-1KYS#%&F8sz<nDXq+8L`K=r3x!&>WeAs zikffyyVBqi+e(r1>mHfi{i(I~LzVQ_LyKaqKAf~#`q@qYw%u&W^|}J{4W(A=J}+A* zby=4^X_Lz3!Ywxqf8E>oV3WcBr-c_MeR>mCsKs5xIe(K_eC`vWB_H!%F`K8cT%UbF zXz>BpqEnVeKfV=xJ!B{_YwZiB`Fgk4{<~FKB&+-}TWh06`o`mnJ{)~m_*YN&@3HmT z?!}L-ay}$w28F$z7MGnCx{hUcu=3`oY}&;;nv9sX8@p;5Y!zFgq?|9Iz5eT_OP2gf z_m~!+N&E0KaRdA6Vk_=q!CAVF(GPuI$r;vb>4_Fx+G*^v-<Vh5fT2J|SHEb<-J)BC z1@_g;`TrOE>P!%@S9UlY@3~slsX0%o+r+VZ&aKW&sl~e1?k2w9?~4U*;cdGiUYu(i zou_J7bmn7`W3jqn@_H}%M7C`8vujOW-CFze;|FH8H3mY8hH^<~dkw?XjaAQ;_?DZ# zc2yUDzJ5jFO7~YAB=#HHzs|ONUF^MoO`Dvl%=dryRCjL;np_y%9WPif7qUFpxKHmz zR8s6~ooIdO@anCJ$uc(eo0px6*1f#it^74h{kj!hAAfKu2PAL(5|!}HZ;_qyV#jzz zsoh(g^S-IQ&dsPc3p~8`i&06U{I=}>ixumQmD)dF>nr|0Z>z!6&FRm!THQ|0-fvbQ zUc_^($WQ&5jd_&+?`e6-ithPEG2xqT%`*|<`rxpCPG+{zYo<lt#7sl2=Q^{SS15mT z$$rTzpC6pI<yl#RO7OgGn@sGo%S7Tt@~<a*Jugx)Qv9j-*xNqww(q_3ZRQR3dODBS z>r{V?{ba&&`-$%=Q@#7fs@kSv-^_!$zeT(62=?BTuDto<KhLcP<4oi3Z@*`zBrrQR ztZHfJe2XsSdlk*a){{)#q9gA<Q)$ls(tdf(>%91c>lK#DI<fi7v+jSr`|eSkb9w*g z(uw|CTPFW7UuH4ceCK5My9L4(g~wM{p3k0FJ3l~wi&}qdda=1+nu0U);_s(6hDCp` znJu1~{GgP5Cu{ch7gDArtUKmxzo&Tn!xOn3x!MXWVILUgSLV0ho5No9Ix)8~_-A2s z<#oe|x!yk=&RL|~|J=d9MrGSZ`{!$4y(>Fwl$<rYGBv$4wEUM*kWg-q)ynC+R?fFt zwS3pA^;WC5Tdib%z;nv1@U+!p;a#rA-@4aJg$e#zl>RoEy|kFU`n8?%ziRd^^M!Xm zzgnK*oNP3Ery<+7=If>(cUo-?-@P^7dK>!!t2R@=%U0XJS1k;`;paVbow&q~=G}{# zt38-2w=i3Z#{F70Kd;{2v`zYpz~$e?rytvu{|I_r(UV-ZxBR<IbkH{OJqP7$wjTbq z;`6TU<<^JKmvzfmtq#3$_<Yr_(_eQj*W1lr<8J+FllOx?hj(wjZ(Z;GU59t4u$bjU zezW6;OZtRu4jtcf=KP*R=6`nHwmGN&&GFu>osVr6#_uV2`*w@z^YrtDE1rKh4BxdZ zT7S85Nzn4I$Bk7kt~YUtHl5zB@Wrn7=BoQ=%J*JRu0DIe=IHe*o#^b``R3=RU%FBM zTj$?Dt7HEwx5!%GnSbf}^}TmjSDjtI_waeE!>5hcUH*Jzx$TABId_$I7pGgb?yqLv zH2==|y^qy*KWVJKwLNkwd)>~{mx{h;S3fRykWPAh`^O{ueJ|wKJo#$7#`NY6<?T=X z|2$}3DKmd#`|>|h`pW&u<}dz#Da)^HOWX0bf8YE0HBZd{Jh7I1I<Ia~eb6&=^EZ!o z^#8X0uC)34rt%Zo|G%Hg?XCa!{(SBCnfun(N=7p6`>4L&-~8e7?42{zYcFcsU0(jv z-d_Jw`rpg9cW+3y|NH%eis!$l(l`G-`?==p|2D=W4GK)`A|@3Z9yqjcOPZDZ5J+<A z6xIyeVqw^Es9V~y?8}dTf+-#omF4+DelRgGOwkNq$6}!1z%auw{oE8!<7d8et#YrO zc`5w-oV;VrpNhuB7yR<>&EI%VeSRLiAYiuJUCXQKPE7))Tp=?A7rSlXJFcd4+Td~I zdX<~oO1lkmPp(TlIBo6itLq|m6kgx=^|$y3$H}abVrD&?vXWMHZ}cjyx$Hhc-ff~+ zT-U;nSC9LdmOuM*Gt0lJ_#)Rn@31$qmtw-DZSIEUCfpQ@uRiKsl@qhC(s!QS?DDdL zhjQ%v88d^HKAb+=**tuXWXYKmUj1rI|ID#0JAY2n`1-A=4KKIs{XI?o{Pi_2_ZFR= zEkEDR{O6Z-Pv^Ju*I5+)dG&KXd*1K8|8Ctm-G6||`_?OiCw-UocD>t{Y|yZ<Yt^|; zix)h8=fq)}lCz~FZ+E`pgA>95Yj0fnt-JN>kLbd+Kdu>Hbm(Kr;c)$N>+@RIpU<-O zkI8-3ez$`q_|%1iY@KsXS#hmAoN!oqv$l})oPD1+>|gJ-M%V6MP_v-J$2B~HM|WP3 zE;iMxU83u=WzCTwAEV+W`rgLp=M*n_)Z(MJQ*C}p(e5RB-a?ygS!)GOsaZeiI_IJ~ zDfptBY;B33!c^`eOQ)YEpFBA=KTlriWV_eo)Z1k)BJ1|%-PYF$$^7#{_sfAh6HR~J zXckrxSKKRlz5mUT%S&19WkoK(U3PoRAqQPnvnvU`HedcZL}sT19$Rmg6ry5T%G_^$ z`@)*9r(^d16<fSkW2s1pZU5cOUG}QG-(4@B>bq@c;B3~wYofK%J>KTAccx!8{~KED zu#@RZpm+HEwc*$Az6ut-(^h+@^v<C(wdIdEI+e;!7TsR@BRK7()yDg>?`79+&0GJb z`-sR-SKWkZ|6O;iGv{v$wQqTta^vBg*2yCNaT6~~yzsdm`e{>F?>&pS{!Esi&z8L` z60>i1y)!ARDwoYTr6F+Nqz9&}mvKLjoX-~heACO8ilEMkcE6nbv}d1jO1U|0_Tfj* zOr_6m_;_#j`+c#(=5OaUmx<q-VWPV0@<Ge67`3I|+M#<+2v3VDx)pWx-|w*KzxVdI zZ>jz^_2W)O>0fV8JH<<vR@%2oMP((&hUA-tt~pV9Bl*gl&v)us{uDp;v$u^^z4>=; zUO;I4tgow==S_59J~dqO_PX@-MXzPvR{MTi&0Kx{{;ksg^U7Fi{Q|xmooT)2%MMQc z{U3I1-(~&uru((RU(dJJf3=^zF+cd(^#4z#ie*pE|9l|af$`J2@O|3%m^fKAwr}Kb z3b4BOc+IiBdc9}sFYJ227TdZ%IP_f8uSxT^t#NbWKBeZHV*G$BRb^ktQ_WHymfqV8 zu6w>NJy)oh^pLOehO_%eoyMlgiN8Bq_OT!P(AG110iX8vwV@Z!q@GO<WRKq>|Nd@o z%lCi9-0x~`xSrO0;<rFr>33VJMe<Dj&g7gqcf-u*Gd#<7`xewIJip>-#$Anut6hu5 ze|D^x%yLfE%w@4})Awx;R|Zb-OjiDs;ky2>r(lk<@XY#UC+w#c7EZd_tSt9BeD8#S zqW)TurO%r>Bvkk|S-R<jDJgeMm2vXZp63&%VcID@^`uUATGHi%ayw7X<n{38WS%JN z8tI^*<<XcKlGZE}u_jFElJ$BXe_>Y-2hr4%A&lILGfO0WmY+Q_J^t~6Lmic8O+|(0 zK4g6SqvqS0)TkU!)0St}yjwlEmVKW5^vH9&`VNN_u8H%OpXt<^{=_fDDWh}4l&7y1 zIJLE^PCAFz{L3g%^V)4*);<4+%2RvalU_@v8rG((JhBm2KfC{8)@1+HFNF0ax7z$O z(h*;n>XT}9x#!o18Ref=9OL5DXzrU*z&STf#eIs>qP90Fx@!|=?lUo-k+rtv>t_D1 zGu#9NF1=r7dq?9Z%PG62S$#_!bXVHWeBri+NqG9&;+IacyA1s7*3S-Ql@Kq#d1b>| zpZSrd(SA2~2JbT6ydYNeO>0Y4(B`CorEYhZnO~jaG)p&Zj#`W+oBC_D;7Z*}lcUSx zcJH`a##h#1qB1w0`IXluttp#VhOT}0!)x6Jxwor3t93K-gKk8~T`LP%v&37{G;)pP zix%EgZnf~;&gZ)}ZgFN=`R}$zb-?$9ubMTlPRqB}3}106a7W;lSCOAjO1%>+Z(ZxV zthg~;Xa1#WdoJ3%4PaF9{O+@L?bW$YInMsP_QUPUuFxrq4`r=9I(w)1o(I<JZq4Fe zf1~Tm^0g)}bAM~w*NBF$eRD9SH*DE{v!kY)<)$nS$^B`?z&>N^zbh|uOxbQMS{T0O z!=|^tZEhaSzRJDnT1$qq{OPkNCJFDl>Et`Z!0WM&(zbo}Y=s@ye;(?aBoVo&Rk|r~ z&4aH}WhVls71{s4VcoFId;z<kL09-0t?RrWLhX)4^(9XaPb}Mf*!1+fDL>5;B*Y|~ zPRFWFnp{1Vb@Pv-I&;^#T<>}~E6ZTJ*x9_Ce`n^Tn{h`Rsa<M(yvl2ruKK3aaYgwD z=VYC<y7jeAbl>{C!!n_s(+etpN#2;n&#PxHzw_J*8-qFQ)#>{4LtQer&JUXHp6C<( zV^h-U2Q_cAga4e`btTttOLp+wq{9>6b*u?nw0h;MM{kZswD$g0h&fv6B;#J<Ep%?% z=ceD!*FH78(Q9SOAU8MVb6?rTV|98{58cfx|LwXbJnZ|+Eq7A%jI9s%i55+$*Nv$) z4mwlC@?EU@&%3?7yYIA2E<SeYZHgH4on@Y}SIh73&Tl(+b;Uo?FNc5I-f5DqS$|mW z{hq5gUZ|?eoHpnzIiPwjbJ4&4tSPg<E=|9;H?R4^+5|Pu?{fb*Kjkalxwjyy^l<dw z6t?5~hxEFW*D&5G;=OM1^6Vn*TF!NQXaBYd{K%(rvAZKDoy~TQcDz>d`g=+1GA|!9 zI;XR+)F*4D<N8kP`QO+!{?k~X{k!IQoY6h+?)SU?%YN`)U8GrmtaPET#u5$n%G|$v zPuiy%FO5I<qjcr&&8OJo?&z_o>^!)xV7>948~u5E)<5OW;P=<A5;=eEX{?{ZrDVI$ z&CfF)I`>;mmf!Skf}HJtwK<Rfq+On9>HoL;^K<znQNMiFx7S`X%})(kZgbT6ylrRs z{Rf3*bEc_1{=0VTwlC3UvOoLPzkZsj|69=if1BDg-Cqm!%Z@CweYd~V=7Z+#e_Kz? zH!k|$Xm;27c-1HM{XaSUKPtGK)M$QxV)e&={)~rxUuW?DN_d@gCWC=B>!{cTrrU4d z@%TsB@vpg&|Iy{}3%vjq@3oBWF3i$TzFm9I_<pT<&w18(0k-4-w)6>X*%#RI1=x!N z*vludS6^VS7vN|P;HWoXNY7`wt;Xd1isAX%y=@mb=L>Kx4&Yiofot^zuJs$ZxDTC> z`M`YD_wS4)pKs-}9548JsN;a2!PGD37%oo8J#m4TF`wJ_0<-y&d(%EFKXc({8b3d0 zKL6JVb02-+H($@sZYc11f&inSAnQhfp9O+{4Fq{N3i1aE%1;#3yeOzHD15(%cVW^) zs{+=y{|p#(0)-R<MU*d!cngXeZxjmsDC9X&)V)wNHc%{iqFD4svBZmF#e(8bKM226 zV?8J!BAhAi|53EFP^|Q#M82WqL_^X3LW$Xdk_#tFb_Yt$pD1;{fN!D8uPQ_7<%^`I zUzD0FD0BRy^y!aMM=#1;{3x@yP<DBs?EQ&?%^x-Qec-sPD|1s&?yjKx_dxmIALaf| zl)3#;p4~{{^F)R18{~ew@Lp|~mY!sNX`(!TkOH@nlBSS?;wL3_A!XG|3c8>E$V}p! zY;e;oP;U1`75_^r!9psBH*gCVsdBFomfWNoc}X>WlS;ghYGIISu913Wk-GU4@$4Xt z%t;#gm()vzH2?JnX|`X|*z2Y8{Ed3|CiR&`T1$<zW?#~pJW1<vKXYh-=H^e@8-sLK z7wN2@q;tMVojX8ndyw|QNxFxHbZ>9cd1|EhFi2ybQL>eidd4AzADa~0QaofHr8^|) zb2sVpU)E=xtjKg(L891@UD$x@vVp3x;eR0`-Os9bm@JKqjZ}k8)HW9yTsD;d%v-Fc zX6UT%ENl{5tjI9gST|VZ&m~KqV1xK1ll;%7o|_Gei&bVVQsY}><XLPIJ=t6^$wK{* zVZX78)@K9t&*r6{m8NVqdHF=#_K@-1&1USEP5GM)w_jFDDb|;MuAWuQz;xMq?_`_u z$=11(ZOu1ZNFOq{HU4MOx!J~8*!Fd>?e5Q}?}e>C8r$D4Hr9M(b^NpC=E=tIjV<pN zTRl&?8Z=q)*=Kvs#TH*L+iNq~%ni1QEVljo+2*FOl2D2B=gm&aN_LULPUcr^)W0}X z3cIK-a#a;^br(^ZA#7c{*<RJeJif$H`l-p<U}x?rc3+F_w|+KKZ!$6#F_CAoWfpN4 z-C`$P;`+AOm34~4;bPPJEuPnlJzB3=><sbL7dGk)vF#196Q1lKAMDdw;$1$)U0ld? zzpK^F5WnYBbdy$Vyc6-Cs^njr;Qu?s|Nj(!#;<;ip#f8y0@$zmGlvEWP7UM@4dgBj zlobu+7Y+KpB}mgW$k;Sc`tH<V)vrOirooC|gDp)1-LD4vh6eLb4Y4&1bqo!OE)5Pe z4ND9S%bpsRUm8|?HLO%Ly!>mh`s2@jr2)KCBf1wws2`4)EE+leYlQ#R$f=@Hty3eX zevMfCHFEaUsP@vJrJ~W(O{158joKX=v-NA#$*s|AMPv7h#;h)lz5F%i_}18iS7Xn9 zjb6Mp?y+dx=daOUMdQC;jsGp0@G~^we`x~qv;_Wdk*goGicL$DzLqF2mZTh(q&_W4 u`&yE|Sh8_gviY=R>ubsOVkypHDelu!ysxGBi=_sKrK*ZCGchqRSOWliZv!9z diff --git a/docs/images/scfg_networks_internet.gif b/docs/images/scfg_networks_internet.gif deleted file mode 100644 index fdf6079929677e2ac12510115df141331276bfd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16268 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 ND4VmfurM%K0|2?A0YCr% diff --git a/docs/images/scfg_networks_post.gif b/docs/images/scfg_networks_post.gif deleted file mode 100644 index ed0ecbad95be8bfc3786ca7e032caaa98a84dc99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15610 zcmZ?wbhEHbv|;jQ{LTOYEes6*8CqI66tg)rvjsq?SirDY0)(n1EUOhks72AKMboK8 z)2l_(tH;o*$1teJFldTp&=kw4DV9-loSdATqUJay&+!7GrC!-fgR++f6)z1cUK>@s zHmZ7URQ1;6>aEEwTa#P%X7}vP?m3n{<yi5QW5sih70)?WJ?C8Y(sL~>EiFsWwJg2X zvi4dJ2;J-1dT$B{J)g4o`JBDa=Nx;#^w|5Q=iV<p_x;$hW7n>o`~RQe|0oy@0dhk? z2b2RqdBK6>A4C104~i2W9BAU;*D^U_ka)P2PuXeCj}41lx<&M}&YTcje7slQx=BWJ zQ_6|SDuJ_nP8Kcoo@x+%tVVOQ+S%F0#s3a`Q08!CVyR(}@Y<4bQQU!BKqH~S;qr1; zJ_!SXs|_K{9BYznCnRJut>f6I<{?m)!^Fxd))TrQOqY2ZkB~ux!F0#FyZGKbyL$Qo zBQtxQJcFFhkH$of27dd74HX+%jti)`%+pD1YB@dCIC|cJolZ}=gdM^eauZ8lTw0+W z;gG9%_|?^Qrd#H%RdjxPdxvSxg|!R6zq>D6Qhvi=PeuD<X`7OOeS3bkKRsn%!C)9` z)xm##bNhjPwk#Zi_nrSWh$}k%>G<^AvqNHGolED}_nv$774O$}{{HU!K!4$Xmiqr{ zKhz&^vWR6UG-?Q}Xlhc|dGVlG%S9uxMcXH0A(w7K$3rg3Z3h(Fbz3x&It;c1JnGav z!qCiZFlB`jkJhmTi+Bvq2{8AXJ<~YMV|mWuFptrnh~|D{9?xc8cd^bTyrwq}ESYR} zCxMyIFUWE!ucgmSRldk)2bNB^Y|&gc!|F*u+Dz*w6Q1!|ZP<BucJ98PYW&4)hL^Y{ zZfH&kbm44y&S!H&^U{3lA15dK+cRucpI@Wo>L4(|>C~0Q6WJ0OmPC1mYA#_{m@qXW zb*k&N$mEq%!=ef=wra(e+`alL?%#%QU$4iv3Wm){>@pQQm^9H*?dJN4iD@&_rbe<w zWz1F7zQwY1<+C?gtM)#dmAxfW;r7;Tsk3kA@BO$fy5NZ5^2Wj=isdrJr(Bn>E4j9{ zTee)j;`&^UkA3QLRZr$_pU3fP@AG*apHH%HsQE6qM!xQsY>iWcs*X)U1H0QDg=Ri8 zj)yH0@ezsbGI<t{j;plwJnB^6^&zRp;F88;9?jzml>7BQdmQd_66#zs$xH6%lXIa? zm8w%?na)0)9^WUKHZx6b?XydHX1eNg8}@0wSX3+3vV2|-U+Ri0ERrn&*X;$Y1m@Wa zwy3jZEMNQWR?haf-)<Ki*ZqE{<a+M+yA{vZe*br`=KI_4_Z!&temrOq&)f0Pj>F4r zQ3c<FACD)v%Q-MG`~3UyWQuj(&Zkp@&;5Khv$$^O^M#YwRlZp4zRv2!^74DTUMyN} z_v`tx-F%j>*Lu&}`FhLkbye@yPye_3-L}Vlzdy`4U1$AftGxZ6&llYF|9-g={@?oZ z(d%`4KO9&8zvtubdU?C|cc$yteOsL@zx(~m$?=xIFR0snTbP#I@bmAF=j;Ff`}6(% z|Njg;3mDiv4lqf5XyEW!z$AX+0Gri^MuDCMEb1NyPfpd%`Eodc)%?UkzN!z+3Ooxr z+&vBn%@Sy_oq3=2;}?hHtceWzH8M+<nLA4!yU@03^}?@ZCl1T~`q2K*f#(r_yu@K) zsgE5VK8u9jPv7xt?S(qN5=EX?kE2>%`auRgiej-lTxG8nbVu?eOYG%v)1D>R;ZhQF z?Z=iQX1hN27W|3lGW>Bw%<p4c`kBRY-%lL3n`hX|9I-g?k;e%qsZSl6Uk*NcmG18F z>*K@;Jxf%6b9gw4J)JP)%n~)t8!lExd|kX#l;qmmk4w%n>Ro>2;d{T#!$Fe*dm{HF zE?v-mRDaUNX%;=Ie1(;#1N|=bOx^M%z|8YZlGNme;+Q3Diz|+6|NAuaLQk4Xv*wxP zsL!)*@Hi+<J?WHY^{H}Q%u=1s6|O}^ALqoMQMGVCdCG9w<+-~}mRp_Q>1ViY^V~=O zT$YPn{pnS6Xwtj~bCMKVIU91MzAR{eqhjuO(jn05bD;ynAqFL`z^<?>iv+j6a8Z@o z*%LQqu{7_?4>nzay=hYxtGQ-+xq4lkk`*#*(voGWf?k(r=^4(He3PazThccE(3j;7 zysM0pJuWoe`m(}9_MutvsSB)DTb5hOsOyBzJXe3{^1RPyo`){w3J43DI@eD0l?iLq zl_j&ju8|JW2$t3i*tqNK+5%pUK+djfyKZf5v{<Wb{P@)MeZRgIrtV#xz;1nD=_}C| zSKl>B;-_yMv--AiLhqUsMeiG@qRQ&CY~Q4spT2pn>f5Z!zfaQLy>DHbCDz#{`ZhEC z^sQ^V${J^e{(GC9?tS~#C9^F(Th`{4pN>Aa%xwE!-gO1-*_UrHP2X|CcU_TT=j~Lz z?>jH_t`n?(9rH4(yvc#Xq0CS`kfCh)?%PLYmVEkt_qCSc?uVrd3Rh>}`(`Atx8+S< zrE%5%$$sbdefQ0;JKP=rc2W5LuT$Tbz1)4D@$>Zq?BDY1L}MO&&MGfzoVxhYwO9AJ z^ab{biRrW{zp;Py%H*(uoI;y(&o$o5q7ASA8gz!A*)RB6pJT>n#~$_P%#xRP9P`;y z*jt+OnBmQgW9Dp|`pbP%WZ7>Xci(5&mmKp%&HCrbfWA#rmis)_ivD@(du;)O#hv}n zR?Rq?ux|ad-|We%@juUG_-+0->-w2zX1jl$^)@RsWqk2)S=-NZdiUaIs+-^Y*j0X> z@q_XF(>xh}e(pSP;8wDLd2WW&ZIhsSvy#Q{)iYd;e_fhxSF+IbZjx^C%zDjjpXVN& zlm3@c>e7^TCac(EGd%sHE>5_%Wr5`0bnoP%YZLuS*ZFEZpLwbB&@9=~8QydEhjHJY zuvaXF;dRZMG;8UV^N+nzZ~mK;?*Hx9jdR<!Z9n@qPy6@vwnb%I``^ATn*ICE3%~Cv z)7LI<Wh$&a@cV86+bTDP6@o>d*O~8Kz1{A^LH_&S*naH$%6p^X|JMf`{yPqdzq_U$ z7oZ@pz0*%EXi|rB&7-*4o!$jXANz{`JeK%gapIq&-ls{E|2$Fl-+3~$?~`?^fQD}& z*O_#^&$EvI(X^P~b*}u}=XDYbv>pEcJb%{d%c9w;dPSa9F>jK@cN+YC8SuS(4U=(c zOr&ji&&jG}4d%v#N?YS2w|q8E+NyIg;(^Kes%zOxOr@{qEHKT#@38I3xwZFm9=xkK z|NE}(hVT2T8{XIZpS#cgp7Eu~z7KDbu9rPJ`s3Y|*UV3MUf+Adx$^6W*Ps4$@z<L9 zZ)ke^{PVxe886sXHeL$ONfJLiqg7)`Q(vi$ivm;N2_F@sNn2lh+i~9Zbi#p6_df6Y zZo{?jLuCr{BkB8|#t!?=Pdi_uV=3<)+qLiFviWMuT3`BRMNOWw?VtVfckXY02XOEI zew6>;$Jz3Kv|OevVi0IqxMly}H}+fsW=lnUd|w4kJ+wc>?yBax23MWMNn#m^V!4Xq z1sk>26^U=&)KK|QyunesWuipqMTzL^5|bWkPx+{wpk6jxP-?zo*{Mr9>C>eyY%1GO z*mPM*`c{+lwuid=7Bb2_&^;I^^Ds&8Xrtb_i;R~RHebHj{N73SZlSCrhukAUxhIKo zQ?~2By(stjpxoy`rgs-B|4fwUFs|Y~Y{0@~xGY?OyQyl0xT4tNsx`|Mr5_v0Fjvbz zX4<m6O?k4C9+PrGhmnzjvT2dB-eV){OUm{_DlSGUrXQ4#URQBf>hQayVwbG?FMN~g zId-)OCzH#|O)@5#WM5LdDXxC!dTnrVAzz^>Gb4lG!%hhmQ_hdfQOyELi#_z!i@i2> zd0*^W!y&R^g^2${k+6dzL4l&b(?w%8iY9(6PCO{exI=8IQ4i}1t<sBHYY&xFA8gqC zs9|f8gm8z%jzy)rFO~8uNJ?5r9xjrUiO`wXsB@}FYN4T&iiGY8L*31Rx?2-<Z(VBI zeo%LhVDkY(J<|xir;B91-;im2F4JBv+d5tL0~3?8gua`F+-t+imlO5>G8qI)7|b_s z75FJH^wWUllEKpH3OtWm`Gwk6l`F1wZ(Cd5Cc$KsrJ<ziRITk~lqb<%XrZjl%v?O< zpR(cP_Uaq$u0@kQE~%V!@32u;?U>QgsbP{}G^M|y*6XoamXP|i7qvc>oqj*3_;Z>D zRCbmK<;_2mzmeH4@}$kH&DQrWTSmW}8o$%_rSi0xlT%M$w$93&wprLN`RCN{%(g#_ ztyePVmuA`}NZOwJod5Q*9nW`<^vdavF5ARb+Wj@NOL;l{U)uD8&Nj=HryV&wqu+Ao zq?J~D<x}ft&YZP#=A4@|=lz`7uWUcBB<6A0tYwxFXSRh0idt?q@n7|1RwC=HO_{FC zIn(0QvN*nkY~DG$p3`IN$)uG#gYO@iz2>K1=vV*Qi~Jdu&YAFe)+Wv1``>1t7R|~L zoqeQoZa(YW?0+hA&zH`=+Bx^Z%kWz>P4DcCIe0U`#?||*rvG;p|0q%aGdJf2ZJ85Q z>c8Qp>l@Cnu%~loTF&bUns>@|?!7Bvj8j8*UGaK6Wx=;A-dmn{CtR5o6XN$oW#Q|U z^Lb}2Sa)Q;;I0J{yB7YKx$r1wXt8NJgICNw%LUgg=Re%J$j~)RJ#5k8(s_PU=dr%B z&=(Cd-xVbK)ml3=Na^Tet)oHKzXBa!EuL^WNFjBxr_{WEC*2IJVwkk%uy}c`mRu-% z%j<)rw?fuZ@ly*qUM<|VWhvXKMQ2|wQu(!HZ|S0-S&M?bmgUWI_qFoKkcu%{<&a;s zyg)R!*eg2lm*cB%%NwLtG*#vPtDd#&fLe5&)rziND|&9NXgw8O`fJ4`tCezBmQSf# zIYY}aYu3s+w^nkAtehvcYSAtGX;!P2Rjrz_dF6^-s}^&uTJvkw^r%%EPDMREn$-}t zdh4!i9<$XIr7M=4Ts_Y<=fE$AL$e&#S*@8Gy2fM5YNj^(&r{=e?n>bP7JGJ={gq$w zk!ovM(-L@&t+^qUz_%^7YL@+`t~Jw^u6Z`g;pDct56ou0nY!+|RoaJF4zIoDJ!tEC zWVT*PZGDwlva?!>#kXYVZ7Du%8*J1zu-{H$+r7cVY=gJj2ENlNEZpfL(Hje<r9S$# z=wI-<Us>TVc4gFW%Uoray*e#xT3gn}u<RXa0qWZSHq9{0n0PGH$U8&HI`i7AOsU(c z`+lvHtqzyZ&aw55v#4HXHM?%V)Rxk(n|HZwT7GRy&9@|z*_rFrw$3QaF!1)-_H9$R z_g0mV_5VAQF1M}lc)jtD)i%~ATm7^W!z#C=-QKpvbls2QHF??*y;0lCs<+omIV}8^ z*Ku+>t9gNopyf}qfM##o_LtLYwRf;B&u^CA@ilBmh1AYT);sf5XT5XVIb-(DS-W>0 z(X{{3rJ*anOUHbdcKEJE*}Ilh?^-o`*P8BK>vr#2e|y)4>@A%_BCbz0ycTu^7>e%b z=#E&}J-1180aMQb4Xunst=xlRUg<q2GQ>~r=-E6;oYz8Pn^I%XKgY(X^xgxT_D(d^ zxwl$UPNFZhyzJbhGF1=V9C7I_7yI@amg}F8{-~k%)kE*_M7^^I`(IyTycsClqu$c1 zK4C)mgvsJezZOkkC_XUj`h=hz@|@1C3`z=%x3{uiY87Q}6Vqvv5>}M_R3+2Xrd%{h zL-LTW5VM-`A>ErsI>M7HZYY~LtJoJ!cAhl(=y#Ro7shQbCfhQbL|y7|R916MHo1CS z&BwXZck`4$VU5|7j!c}S?zQHK1cQd}n<EX6TwbN`{_wr-qk8?6OI^N+_5O{TQ3o}n z8X4w(65TJ+u*gYkNt2j&c|++!2F@Q^r%s6TM`+g;Y72Ml<qzn+exo#IdE>u>pZ3aX zFdh#odz?|0aa`)ziL%`7`?g<fdbdOR!)e{aiZYL!_8&VaW4WXM+Q<G5ciCHv`Yt<U z*)%JEFVcT?QSL+Ifv=3M^TJyNRvHL%8b)ax6#3ICquC}Dq?r1nD(%HV`Qk~r9Lj2& zlr)OZm>9K}|1dIqY^49@ki|@umJ^fPI8-fordZjST>O4GS*X)fxHE6jl-uf4OD1*B zS|KpUqig;S)5a!&sLkpE<z1(?)Manc*fCpVf|F**!QC^IMA;iOBM)k(|EWLdA;w&> z$BX?qhlcoB>*F;Sd(KKUUYMaRdO||nLb8_U#O)isa~w~cRND6>d*8*RzEzEV*Dguj zIP|Yi=f}QDG38%8`b{!qPEYK=xUl(jqO6UFto@JX+aF~aVp^USw)`}@;#G0r|D{tN ze=FIITNkn)<a3@V)I3pm@kFu7r&k}Zl9rhy_xbc@aU&g}Ln>>O@+!_4EK)LSQa(MW z-H=&DKS#w*=&+N~;kJmgfkD^pAJ>E&Qnlf!y~ER4H&-oJ>0ChMIX!ia1vdm1cxY5z z>Rb@fwSq$<J9_s9i<?t?Z?3WE{{2Q|`wG$IJ@vaijyaScOHSN#WJSsHPsa-1T-d0z zcT>=Dp^Vb&v-kEL)V@<KdG~a0qWHd6o=Zy-_o?1EaivICW9=nvi<A04bPqJ%nNg#6 zW^KRC51F}t7;pRwl<j*i`-SNW(;WTpNtK*0Pw~8*u->OtfKy>{d#kACLCMI2p=(d? zUUN{Ys7+4jzQSdu9FO}-f37OW97_2+sZ3+C%_ik@I>zRn%ylo6i}tD%@2v?cx^DGG z)y8MaogR~`<!YWYrxZ9%o$-T7YTrYda}O&oJyh8D(0>oJqrf9YyGL89&+#u5kU#z? z?(!qOeS(H|j~CA<6cQ{n^DC4{EYv<HsFPRtyymgi$H!9JA6eEt(ee}Wk`uD86E?8x zay<9g@!n(oeT9~GkKOE^diFhydiOYdpU|e;yQW*)R-bg9s_Bv*_pEB>j_Q(UHQuh> zozvS^+rHgAZO&?&ym>P!^Je@jihEum`Ml=dj1$c>s`XsvSwAcO_q;`N=Aq3tFPyCl zPCom%Y{o6-{8rDGshl(WI$uuRIrYWnXZ?LUa^Bfg<~=WeXWd};qH^Y|l$S3T=)G9; z?s=b{?J~O;Yn-2d+`PH>^RwmmUM&Cj`heV<YsE8jthXP_i);5wJihPEyQQnn{CjgD zb?2$RdGBv7cwPB6UiHlp&bJw^Z)|4I&iyq@plgm;)!SQqvs{n7O`H1WXO+XQ%+Mtw ze&I)!J+CX+xAL8*>f5(@4)4z`c`x!lWXZw@lFO&Jyg&NnZTvKczjhylS1pY(b^Flb zEgH4(%et8?{vvGgK5z84m3b}x`tPH-y^rL6&tK>MedK!oQNI42Vt$D7d{2)4+3)Tx z)8zlu|2kW@-%~pN&7Zzc#`15p>p#y7`D7LEz&+pj#=CiOqO<>*yf>M$NGSfTbI8Zp zKR-Lvd+7h48^Ah$*%Ln|{`YG&-^G7j;CKJS$(x}oQvCe)FO2^+GbH|N>y*#;<vt(Y z=@okGbIPr6dGhW~^53oPzq{ElW03#BbpPvzxbKbeKd!~OHvfPB{-@V9=N}dGzvq{H z)%X?gCG#8ite;z17EXwN_p$R^`uU}iSAXtFnd9aEZH|8E&zWzZ>4lrh&z<z&tziC# z2k*YG$^1S;`sc>|F4g|Oi}XKl-@n*g%U0j?&*kJlvZ70rw=S`3`BVOH)$iT&U8d|` zHtqjnuTw#Crc17`x3XOobY}h^Y1Ke=)*#!i#gEqi5iebGv;KQp*5`}of4?<*Yn=5v zwd?m}?!WKzUH0;SuI2ypm0y6Fg^xoh<-x&bRzba#8xs~fwX^Vgm2ga4<j^fB?04nH z#mDXw6s@J^a2$BzIYoncP0GznPrYXtrk-08dHI>|9Lv&oPi|g*?!UmKp5^1m$E<A& zUHjQ`J10Ik(JChD^;BcygCjj6ig8O<6~4N@ntAu6BT`{GSG$$2u1noLZOMTth5klM zqp!b<-BbDX-O|^}C-~*vCrceoxUPAtJy%pe?aqyl$tME5PxYR@{wej$Ow;^rufMZD zJowN1wOn7!tuL8ZR{HOkb=YZ?eq&?m`DJHKOoA4*@Y;voz5PA^!2$K%^P+G6D136# zvYM|aI`iShgG>FF$IaC(oO)_&{_}gb%hNCHbj?2&ckfT-mzP)9r{BN#xBADCz2}$5 z$NzqNd&A@R&+p&=U(djN<eVK7w~2u9GZtZft4}N?9~?Q9rwHt0*52~LY5sxW50*UE zUp_bsIE!qw{v#&y(M2RUq|j9?(d&Zc-KZ&rZc^D>CYtdk%Di`ztN!xQT_IU(;$eku zlTRKh&NYVnRc4ob^3>=*J@KT*>MftVbQ-0Mj_K_F^2u9&x{08V(P@**Cp3@S6#JUp z4k<h>dv{8)pB3jnk;x~lK3^&Je|+i4WPb-{Q4@U&NtrJJF2YA&`ss<5e!1xWH%BDM ztC)$2W42zdXYe#Gt^>i-EY_MFadI~mRr84zDpg%)=3BZn)Smaz(g^>fZ?5i==)HU` z(D3Niu#ozrp=t@0XHSRkQMr3H!eioG|I108qSKaVIQyF3$|^i%W|@9|_sWno-_mQl zBNp!cb}4f$Z&<9~#ib`>;xE>QhGZ}sT)$Tw8XFq-c9-dUwOC%>?UB{&au@G^V)&=M z$DX&WB&OZgrNUwMf!-evyZPfzM$cwCC-FGZ-mW0&r&V0VVNX{+kw-JqVo$bDPvkqm zJ}Y~jW!miGYnACUE4Tejo%64h?^gPvZnIw*OD2a^WiCzBwP5JW-V~AQ7}<96>CDD! zvzE?IUncot-qwG&Uavd(Eb`5Uy>7czm)$P=ox9`lxtlLT7B4%Qyo!D6FV!_qzx~cX zz${+#Vf)K_KjJ6bJ6GP^^ZCwg)itS8W7GnQnYMmXvfXP_bkcBrO!1oauS%|+RV<e* z4xPWPdf7_p`=38fvzTsLbUrhGYw9I)_P>|U<=Yp2Kk3eISMgw{m2G*LC420*fKc~6 zYI|az3xD%l>fV=fT_h~Vy>adG$yH&=?(>SCWorFZyHY<r_RB?Q{d(g!n!n2&wf3$T zuDR#CJ+|iK&HYy8Pu}V^JT{K|WD{b2`QzK#f73hX$85Pi=hw}AzaP;HSR`NUX;JM< z)ZDBv`@{8vH%&g61}&aH%i+ed33E5Zx1Uz{@{h?;cvV1~amvY8DT~&;yEws5_)#K% z?T^EpXWv^2UU|sZSmC0g7TBq~=Qg+a^utQKGCPBpB#Bn9*vl*DYN#E_;jNT3=^BHB zazYG`IR7D6<3)xHe2R;sZe_??91H9#UXm>Pwqll3Zeefion+?&9>=E0Ea|NmQT8~~ zA)wFqU_y@05{3H`ZtnL2Crw_GqN-czd6|W0^29qS>b5^U1KNV7T$?!Mqfez*$g-fR zt5Z_7V}E)@91EJZc}c2nZl!n3v!Lm_pQP&7{`5{@+dTFBzk?2jy_G&GYQZy4r=%Ir z{ppk87Ch_nk~Gt`mA*M?!Lx5aNi*O3)3=~4c+O*$<;LwwJ|)Y7=e|x!x4!$+ui{wn zyw6M01w>e8oEKr8|NBb1{pX+lbxc?0GpfFD;MEFf5i?oH9-84S`RhWf+m(evtuI`3 zqXK(^LKchP&2Y2)71-alWwA1=rl)IE(3E*0OVv^{E9{&Zm^65o8JIFKW>p2xzIBDc z`tD1{sw@T;2?a(rivt0|0asX57#KZ6wSwpFYG5%?SQ!-C5F#0Hb#>ZQ#^|T7!ekFL zthZxW!y~Yo`N%JZEwe<|X4f*XTzD0>!|MT~Py<8kTP?;t&qA4m5B$@P|NHAYmyg1R zX3;eX+6j$ZGGQCV9CVT;XESm;h;5p<wSi4*Hsk3mhRrjsI;7jKZsaX7+p?H7m)$HO z>dLZh%&Sw^vRi#<<l7;(P5uKzZf^8#{+0*K3Mby?l}a}WbSUgNAi9pDD?8@NBnOsL zv3bSb4oyNG4|ZPEbu3+;9s6e51D0D)-<A1)i2cwOzUO}ELC#aFn?BFFzUM`1e)Zkm zOkcJ+uzp(lz9xD@lh~8+{lCxZ^F%#}XZSCEfT53(Cm|q#MZJQ}u;XBptW7h!bHpK& z8H}x(G0l=U6b_qgXymoHlPG<K;fV4!M!uX0&BDtq*frt`yJP=6l6kY>s8L_xzn;`R z%reg-j$1!q>@U2NEYB`^!uem}#MYb?CHcscx23rfvZQ8+b2yx`6JVISQs=4oo`hwl zst$~KuTtlV9awJv^(AAI)Ro10p)0&&vx26tVpy)luqtqAap>ZxP@C+ntK(#|BMwSk z+hFIgHmf!}npgKa$Cc7`rKu%xuXlxW{3u;t&H9Fg%lgK_s060oSe<14-w~(0zHORz z^vw#(-;o!awryGE_BJziZPc}6Vb?aTeVd*An(^MXY1{YkGOl-2XyWf+U^)1=w4lHH zj-bi)9j8<ea!iSC5_I^z>tdT;nQy|~?DFv4YCrV0`#*U5u}+-zRp|T5vwP#dZxi45 z>F9c{f46Gm|Gm4u|9@^H_owXljQ`Eq^ehVY3)Vc4IKl9MFR!3EHQ=G7%$!34`wCi3 zdmc&^%s8yX_pw7W?~%~*8%Hc}SnyfwOX@#danx!?A)kj{vg{p;r`8cWC)WOP>XcJ8 z=d<PNOT2es)@KHT?|&G5Y7-_kEl}amylCXp`#klrq{2&fgVex_dqS3Mi)755XB@J2 z9>a>btLGw*zMA**Pw0mKGuNb;zFu(sRhaYft!ulsy<Ys@s&SXsuk};--YnJcy>YZ` z*Tx0&bW)68mj_pWyRz~c1A9pAtxNlUUENrg`#3c>I{LO4%dU58*BAeOohbZ!$1%5c z9FyMuOxHKRb!ll?>FR%T@8(Q@aO?KdZ`=0%{#7tJ{M$>@^0$}YzWecL-oE#3<$FHX z=2tP#xUc)8{39dZho;jD9&omA;1TO9Xi1*ICUC#tsJ+j}uI3+XlIJbDZR;LQXqP#r zqHlRBGA>zW{hp_8`zix@v_3D|k@j3-!%jQjP3M1`w;y+|c{rKT;L8pMhshednoejg z;bxj^)xe~|u}Dda&4s~OSZjgNDzolgEDf8N?Ao<@vDWHSo7dgmy#AH3po#V-;VoN> z7`Axt-qPLRI(hZB)7m>;ulAg6?Y+8TuhN<WPC5r4ZQ1*KO91oMQ@hqE{INd!YRy6G zJ%?X6gl2EOYNZ<)t$RG%CTg~B?BYGKyZ`OEe`wDmEwd*^+s^;q^CD^6#mU<)@7BBW zc-__4dN-KOKT2)?q-Ad5qF>@|{=;c~>1_S-+k5YIZ?9au{eiTdL_s6dYx8<<1BnQO zr_M*%yBk}BEjT9cd+~UKq`*d=#TIW?H@;;y6u#}!``K<nw&6!<`!B|pQ+FFqyS-8F z^~RaS_AO2O<rx^7nq2?hZVatCI{AS5-^-TMU+tX1WW{L1$*5z+<gttCj;3Mq0X7|u z`MbE5M{izSw0X&_T|7s2WnMYJ_rz-5uLA-+)*Gx>I~ecYtZgFJ!mxeOYPV{W?cFAl zOAbnHv6i{AWzT1m<BN3maXanT-l}Bdbe>B$Oj`Fy@*%Z<DK;8&wnpt<%YQ>x`-^U? zh}qf8dy;?KJoVakA=~VgmhI)!>t3DOmYu!#+HbwLUA7;qoNq<1x14kM`zB|b7W3a- z=Ko$f|39>yk=w<|<Oox+9h<VnoHYjSE<4&j8}NKKc>Q{Vw~S%W?R~w>_8)$`EETbo zGPeKXZTVGulVbM%mLk_k7LCX=J7+TUOu4aq*6qfh*+%jo>^}<}W7@EiDaAoQ*dZn6 zn1Y6J>XHNLImRoKwJe%f?Ot+h%`W4dFS~L@934L!3(NR8I$Q5B+Tv1tu()K4=j?-$ zUsmrr?0C4zUGC2o|JgbUQ`S_gI4QfBs@!2X>}+$?TUWj2kVcR0ja{byTJGrHlG=9a zv{ReNwzIDfr3P;kEHJyc+QV4qaL*RAYnRO?$mmb(Ieg35v-I@dUqL7T99nPtM*ji# z28SL-Mq@kYEhk-K_BCf4NZs(9H^=3@$i_})FK?EO-LDP&zU*6Kv$0=z=cm;hr$`?S z?(tWdy>rKpo}Z_CS0CB`^YO;kjjn&1T@M}DxFJSj{%Ip-+W;2PV|vjS^s_G*R$pN2 zIk0oig=L2vvi3M+O)=j0<h0Fat96guHfU+*%lK^eay*=)y;I5k=pOA|k5-Gtx_d3Q zF1J~8^2|ZM&yL4m?GCuCQ=@a}+#j7fp0lCSzUnr**QGqJ_*{x+ZoD3KHn#fGy(AC4 zKmWES8|!s^+4HQ*EPb+>(GicUug~89vaUbna6$3mo7(2Ly)Ro`vAt7melOYY`IYsR zzipY7_s!ICX%OD=lzYdVJAQ4ygJ1qW`Ev4+H@lDcoZ0c#d86+am#;jofig$G+Z>hX z_6k{Yv^Gd1oMlDBuT%e0Tz?-~zCLBszuB5Wx>tj2z2`6)8yFum?7qNevw4w_mT~p5 zWvc>qp9xs~+JW`Jv2~Y^t(UfD*Vrw@a@@(<XS>%Ku^f|QQ+6NUbFl1)qx4#z$~nhn zdUXP|4+VY>3{hTtF~~_t_3X7-Td#MmRqfq#^6}c!w{@?-*&28I(9JDD6}+~cGR|Fl z^zOYmt1o&vzj^P2e=6H2PI3NbbnbCV@Y6f`7E{eFdF>uuHm_UkClRoZdAA??X}=b0 zix-;>+Go2svHCAm@%J@3|4!S`E%ubVt>yPE8$EsZd%fLQcxYp$P=G|0X3*13a~7@C zO};QE>w-aX=mMox3npDyRJ1E9REvA=<~>_h#oo2zzoQk;>a$UJi;#+sbMV0;mE$R? z7k4xVmQC^TS$wAAj&&C69-bR#a;~}`;?}*)w6;FR=Bm}D%Po6upE51EYkK31?#&X9 zbBBX;Qq5kT^1ZZrU52r9_Tli_uiN_HTz|M^uZidlE1z>et1dsyIr)6e_6N7knWbG` z>1<%-ws=!xU>|F7VXpyKwZ+Fb5&tf;-gM!;*`FN}AmTcC@5U*<kw2$+$$J~!UK^`& zI`+=q*gH=*GTz<E!W;KcHtvyb++*9gC%$n{W8<FX#yzi%d(j*Ba&FwKwQ;Za#=SWk z_x5hw(^927GxksLP_dn){E_#*Yt)i^4)?cd+~1nf)u<8w?Q6#m*Cn6l-Ve;`nI5pj z&M3YyAbw&&{NKCrZ4L1sSrZuK9x#2o|J^i!(XCgA@qWL@Vxz2t69ErcuigK@G~vpI zgkuj9oTC<-Fg>)L^nm|ZLN7<6@V@xV7ApLC9Qs)gI|3H}6HRQNkjUefD0A(Bv|OUp zyoYu{@e+AGCO73i|9vR8Em6fT>AP=|@V18{W&aWx(~`vU9%$wzsixi6T6UlN+(U_b z_f@vtm!0=egzd4xz6W|{kJQ5+a=9hzwLMxkAxXCEk%`*_-Dio~^B!B-Da-ODnB7Y@ zZ0qb75ayT`Z>X27cI~mX+Y>XkB>T3<_HN0#bt#^H$?9oOZ1j>f!cwg55>@jaIW2pv z^RB}z?D2^ej{=`5d)lSy@;#OM_Q)?R)z>UJ@YzG=zEqP#$!!%6o@qStIQE3aFU9uV zW7fVTKDC6ze<|{6&l2xFNhnKIp7$vE+>?Z9Ps7&5r;9yJt9zE|mlhQFFk@Y+%eF@v z&r&kBB}{*iR`Tqzaa~%*y=MhwkL8X%ZIwtmBym4akJsqmzVzCA>2>eY9|$~oHsPVT zSfZ5N3x<0So5V6&{W99zGTOryx3#@!S9{TEm(jT|qw82k_qmL|dl~&^8581Obn(6H zc$YCrE_33w7n8$YPBD8q?ca;(ahcQgGG{EyoVhM@%C?s??q$w>_j2O3RNbV^`C_l; z=w&Ukdo|PS)e^U?IccwE*JaHMd$lYsYt_80)org9uFG08?bX_{S1Z1~TC?xf`fFM9 z@;1ea@UD}~-pKcQom%#`u-Dt-UT>+(-Zd|KH{0voWv};4%ii-Yd+)dGegCo#{>y0K zdv&lc`$${%(RJAe{Bn-jy*YX>`}njsC-UB$YI}2>FX!yMoYU_z_dnSGbN8EnXT@^Q z9m_d&?#(5++$(Ci*Wz-o+vVPP_vVIK?#;4S?CYN2T9$h^?Cs5GZ|{72d)F`bVcy$& za__GH%YCf(?iyRxiwSSK47%GJ@>W0Kc=3#@eqY`n+jkGt@}4|<_x4)e1HSwta*txC zy=^<u^?6-a&yTL&19{)&?mu~#_o46o`>=OEzvX?blYDQQy(KTFXT!TKKi+>0%Rh3W zYwZek7XN|-uhc)w-v8N`&#^t9b9(-|w7eU2T$>FFUdk2pTNJSVFA!L+dT+*uU&{)F z^$SJn3xwjc|NXny;Ff#IqMJ{>pv58oOI^N9Ki9pC0=fPV!r>p~%L^3yGdDi5Jp3$| z=YEH@_`d?C_)jm-6>8YO7v%pW7ynW5`$v)eMZeSXF7<tsvHx(dpy*9nFQZPeaXll$ ziXyG!MGEJOOv{V6sl8X8|3;<#(}sc~L-tOa@9EbZiWxq9wl^;}j4IZy|7>PoqN`rA zQ0$3B;XAAUMUO9Xy_#3Tqu$-!@kRar`|oO>9o~QOb1!!GFR{=sF%vI!5zpW@&%f4C z;=8@jYkSEzz7Ia>pI*N!cKlxKpk5jq{w47F*WmUKV)~z+eS7bIywG5KmlS*Pss&%Z zeJeO}A>Hrz*U1yU1+4!TwEbJ``>zkgzKQMs5ZYf<u$(XYdr2m{a=dwI$?<Q+;pN+( z6-nrSE9n1zzvEl<KmFpe|6g;Ce=pr%c4b;I&xdb<)5{yfdkfjW6v>z5UjN?WUtV{< z{CL`ze|B#Ua};*1ujqc>YdpWKI{!y)`H$-KihlhUA?9zrwpUEHudI61+id@1LjKRb z`k$@aza@OXr`P_yasST~3(AY`S4{7(?EC(6UU-G;qi>UcmWT3J%<-=}u2IqZ{mTOO z${FHSE528jmw(BhUZi^cOW5`=U+#TQiT|~U<8%7`^tt90^ZI|Soc^mn{&&##@&@_e zEg5AI(@P?!|DN#Sm(Bj-9p8UVZ1`QB_N&Lde1UuQw)$U(-sg14mvwHhl$~Dqt?lcc z>3M7WOBt3|udUB}-S>6N46a?}-~MfS!Ig3Rhkt%m!2imv=6|>N|LvErRN4RQNWq^C z;otVUbDvuN_my73{{1EE^52KO|Fa?dliK;eeoTKZivPK6UUS9%&%yuiX7ax+FaLYY zzB|1C@6G<M+w<#Q`hR<Mz4rF<e{c5xS-bpeo?i7O|IbhC>!0}7A4<<&r2c5J_`me$ z)l1pSAEp2N8vg&O{lDMruUDy;y<qQPWMXBLv{2x1YGD(VvWeL6(4mb-F=)w*0wtFo zF?p*s9upQjPmpuh6N&t!e6mBv)a=NN2`LBL85s7=h`g+Jj)9Tw#gm(#)dS{RH}dI5 zg{<&j;xhS_&8;b!7nXZ3muh`wqIGR`)Y_t@tG2BA7rrv#c%82HwVZ3~QqFJsD){7h zzqmx*p0A4Gy0_M{e?Me1Qz-T5be+&cCNnP<oSf0@uJ^C{#^Qt{vi4fjWNv)A*KVGF z>4>GU{_QP^uIp9jif?&&A=-Vt-rZj&*;m$wo?a(Ad+TlavgiAHyA?~bnrbA~#Vi9C zx*VON?4MWnbH}H?lS|`EID?Xt_n(l@Ymb?0_3)|wVP-Y?8SB%}&1PhnfA`+D>>nE* z-(QwrZ&!Eg>*xLV*VpUD+Wl~wo>%^JdRUrfY`R3r<kIH}C3Th8Cly{SZI`LI7I<Pt ztE|;_#R>(l=?|Nf<}II@K6fQYL(Tt>&*ge_zm?DLHa+)aQIDbAihs(zR)Q7@u|;=J zOe>hd`#sS^yH`A@;$*1C&GIRNY_jEEddr2TPK#{`nkMY@Bc<3+>!xbTi<K+l{A?cW zNbbws^fRqL>z2mz38j}_iZt&2n~^XlM)k(@<VG$ljfJgJRT_&rm82#+yk2T9++DEl z=JF-QyF4|QP0q^7Tv`?-sxX1|UzvKat5$}9z)Gft8LLFLzPh+td9T#!MH|*dX|LNU zbm|2|zul|M<xAMAUoJb4cIxHEV|lZpSL_!2eP#X;-YZ&b>n}#FO}^o@<Q2m$t|xC7 zJa}cLx3k`=N^Qw`t?rzShtyu@?S6IW^t(AbU*4QO;qxr67u)ZAyZv_UjkxM;=Z!)C zq&MsrU3u#5!OKEEx(5W$?<&~OCLE)8tn1S&?Om^{Y~COL)McY{@_nC;$cmz;C)4*_ zoc6Nd;OeLx!&Tyk|GYo)$WNy5jKS$Y#^<jFz1grsQrcIhOM6~*(H>Rv+)bCiw8?xu zUj0e!)vn)Ozw^)VtH%@`HCC1}xxm%WyW#9VGaj?+cFHkdE*7SzJlpx&m)G>3|7%^- z6Sc-?&4ab$-_AavH(%ZSQK$C4A1gf<?|gK>{JpN_gOK03l}{L#)O^j0l+F`uy=nMQ zV$$@P?z^TeUd^}5=f%IO%6n6f`&qu-;Gb8`aAuW^3R~;vU0+|Wn5=D8yv%#&lH^6} z=UJ>TT|UF|%Zz{C_SWyVy5~>XyZi9e_nV{k>pW~eXDjjahoI2^*dLKf>le11*5AMJ zwQRWk|F7Gx>+k-1dG^+w5BAAdTKqT@zUW(PhwAgklRTxC%=u93QTeVr`g710lfMtw zH(gu&fOTcLz5K)O;ybISd}pXwDzLQA^Qoi4G^gjP>MJ)mdLFtoqvwmm;)CZa=blXX zXVT&L>uo`Ek<gs0f6`SX&u!>%i-~2K`fZP#QDD2@8ATD@8|ME$o-5vOtt7U2#nILa zzD=2*6eVU$xXO4L_Bdah%U*51=6vqP-n@`lA^GEy#(fjp{dE>ge3V%JhWB0bajl?I zCe0I$LYpSE*{CQ9uRP&uv}t1BzZw;l>=#F+Z*A-=xw2UGvxl2j*QxS}e^fM_HBSXj z+B9Wi&J~sCD^7YPZJL@=qpEGWW3NfoyWVYkp7L0xZIAf$Y0`!-srrAJkMN1{O+RL{ z>`~5&Q`Y~ArXHwSX54w`<hhMO(^s}kG1^$^o2|8RcF~n(<_CZJ=JgrZ-Bej_ak=wc z>8#JQ&ZeXpJmmDP4CCtkd;6i~ZArhfXPf8WzLIYFcc*{Ds>uuf{8{dB+VZ^5rOgX@ zYBlcv$S^gMD_Ov)`@&UQDxjt4$|BjjE8LyAF6HkNUZh%@YUBIsumXoi^|?dO-3_IJ zdryTdF_nGkTkLgtuGE(0!X+AB;!;;Kn6}!63ICIEt+fhXdTYvZ$y6=Bxx20`kNdJD z%=cwLch}VwJjK)Omb?l%d@E$dt0`-OWVItM?s8en^>tP5-B%)!w{+}ReOX(kniczT z*3~_mLf7a0?X;~dzrIgs+WNM;+DZSTZX7ve>MrzlK@z`o<T1XmO}$@Vr;2;;%-qzo zX~x<$>87(IPdAlqTGo0oaJ9v)3zNQWUMHHH8D1TAp=@fw`dr<d{L{DYo(tQ)S5!CM zUG(<DUt!yhspjQP?!KK``eELwr*8|pyYD=8D&KW=>z(BEpV6=KzVAB!R<C05@4HjC zne<-ceP4O>bnMrv^1T~<b+6s%j(d5je9z0h`L&B9Zl61Mec#Vq{eKO=U*G#5XS#!l zZ$pi6PyBzQiUSV3IqIBi5;*m5929daXjMM7yVGySL5XDs9kw+O1SglT%MvMU*Y|nE zv)<x}*0q@8(9@4Z>LrdE@7vhTxaYp`eu?8|=L);)by7}C%{b=x&JeWBR$gB0kiKkD z??j%b%I-T)g<SJ2t1W)2sy_2%*t1VlA|+$=^Jkt(m}WF<{~XI7L6^_uy)&9~_)nU~ z`-*d!dc||z*QA-UuRc-sZ1bGYJQ=qCElvHNy`T3{=7p<p)P*iFuW2u>UU=Hiy41O^ zWMR5-ntSrB%QOFNSss2e%`<%0mAPqKmOB2uW7RHoby-;H;@I36`|VcOwzcI2|0~+N zA?9<{b>EMr3__o>LqG1iam>za)8w^pQjK@tJXdG7WwCB<n*HkwHh!gRH|j>EEbqE` zSFUWGpwJtI7g8LT?aX&wUi+?e^X|JrJzEMk|IMoWo}2iL@4)uiMH7oY&%XZX-S)lA zdLJ5v_dH;;w>Tuc?nA5bo`-zm73=12&5S%8b-VOR=g!XF_tmeXZ#?+7W7Gb>A0|%T z^F+<w@|17i`&CCR_KD6nKiWL?V_o~4$I{=;cUI>Xmw(>#-0uI+^XYMpVaNBp*xsgk zEZpu*jkxp;>GWOa7V>>r8NByZSpKd{PhGPYNAGzZF8b^0(zjnSz5hPDb8qKH*S>G_ zrrW+bFJ@)M`|s{2b@{(nO4-vcU4Qp2wS4#6^yNQqe~o+B!+r04<Ne<|Tj%-TJRtq7 ze0lk^1ARZzn0LSbKF#X#>3R95lVctq=lgNi{QSp#?ejj&y<YK@)&6I^w(YxF(^h*6 z{w>;Fy*Ixye(&am=YC%9zxQm``@J`hulsy%_S|Pnp6|J}_+9n+$8p!a;%&0sWb@Zq z@B20}yy|oIy^@Qs<KE8u{`Fn?{BNfx*FRrj{`aM$U(Nf~b)O2<GqO7VRlK^quWb8y zyMLe8*DuiiH-FR3Uw>E^e0@9N$=msiatcgAajy^F&xyGG##Z5p;L*RT3anuZSijwO zFud3181}bRfn^`}!=-aL`V=^)E#Uk&FX6Cmg4t2|H#5UoF5PE;=6Y|T0`Ij2y!RCN z#O{3l8UN+1?8?dq+*}LhiY#CiTPSFD|M%JluRFa2SRXPRO4#7@K+sQ7v`v;xD};ZV zco3taNLk`;fy9kZW8Njq<e#vRe~zNmvV~IX6s6ZKl-!mm*_Zfk%R}iy3uW&q$~{{s z_fAp%o1*-^`L7$>n5`1OiYoPZJlxosD050t=GsE}c?*?yDJoxjC}X!sHBLz_ZIPPS zBT=y_Y(|Rg#~uiCJ)GOHaKGtMrA129W-4m;CCcnmlKdp4vM5RU*)5%YN;>BfRq~Yd zzb(@Lrl??~kl`bv*|kV9id9K!w$iajD$5eJrzQT=dz2)5D@oVuvC6t6)u6}vdCKNx z%2M~_zwB)LBCD)e^sswI(vFpj^wuS-o_l2V=#f%gvbCGC>LF#*ti@)>7Tau7)~#A> z|8KF4+CppHhkGkREu|J)ev|s9I9rKniL;%Gi`x_BCT0GvWbQmgr!<x23m5NuI7i~u zk^KvA?{7^J{WoVv?~{GK(H?A*yy{Xmv`X(>xa9akmF+7ZIB+fEkCV2ndZ=;E)2L0+ zrzvIA#FWjP(t*=d&d*IbC%80-P1WPrlOU(3!F{(w4lN0(yT_NNke9QdO!bMM*yFx} zB>_>Y=PaLw$fX`%`Xq8wO0d$?O<R{ntx65umU28$HT2XHiB11h!tO;Yw6Pj~dlJs{ zZ0?^Ynq^C3&pl04OH*=t8tb(*dDoI?zNeu^PeaeC#`vkFO<S5|b$@Sba$L{i@U~@c zQmqmDR3eu>b+4M^<&_rt?zWekYKmK$Qk1Iiq$k<8Qlr;B3qGfk{BEh=7uAM>rMVwd z62#PBZ=IicYFUxq^TJmx>8scnxSnM+sb=au$(ffHyG+_wEH%eSJ!{!A?|sX%l;%0K zO}=w>QgPt&DzE2#0%=xh>E%jl<zdgFk1a0`T2}FFX>DArdeIqmu_e<wpE>enlq#iH z1TBj+Q*#b$Z{nKNWT(*_wlGF3txjp7@2uyqGZ!WZzNnH~UM=-3;+9&)KeZQ0>r$J| zGV;@w=X9+|o3!Hg*YrPs;{BwamvE(J%4t+|t*E>8ylmI9x=X21t2Bc8)LWmeX#KR* z;MdZEQ*!N_)C<j)Z+g4D+%J>$&<p?CXRfCrCSTInJ5_CJU8d(Wbx+d-ziS%PPu*&7 zS~)9d;na1ZaVGN`>@=O)68NsIoO@4mp3$AwzLy4RnJp(@PHR(p|5S6K*s6t(Ru+e; zOk1>k8q=!9WiMvAt(wL3{GZNBzhjz9&dpnrr#00sJ<R3#%(Se@^Fl*rPF=YybmgL~ z$dy_vpIxb(HDhMds>#n-SI=7&vGmp2by@4SX|132sy@rV;n=DTTv6+<t=jl*)!J24 zH$8gwZ_}=<wnJG9__Y7ZW^WeL-V~(0Ic@d2u<V|13X6BeY-!W>kJ8?r^m<#C_RdAw zo3gaIn-)3Ry;^f@_1qcRyXLLldrf=ay4QQlR=Z|psLOJ#mvr&3IFeq&c2G)Z5z86} zhtr4na$Fs_4%z8+D+nJATXQr{=a^a-Gt(PC4xPh6E(iVI9MtMMZ1(2Rtelf(E=Rad zol0ACdY{gjV>)67qYu^P1j*#=`oh)iqI0Ni%>tJ@4hA`=nsUy)T62+)<$TwgGkUt0 z&DLI?bb3aijw{bv#~*Jlu3B><YHjk8oa1~s0UkOoB5NH~-d>)z_U1g@TVY3zNpW2b z(!KO9=bGBugHCT2X#CR&Vp)5;Pxr1=?)k2@H<sx>U|aVfOy{gr@M%81M{4UH>8)E= zFs;Ex@5w8-C-W9Q3DbKT_wGsBy1a;WPwn)cSFL-N^zOOeyBB47FXPs|Y+Ltg*}GR= z>t1iud$VcXn|<%z9MgMyZ{6Exd2iq8z5BH8-8a1t|JHr@rT397|0Cb}k81B<9lHLk zNiT-u#4|VjFMjVohpqn-rT;Ze|6APp&q43M7QO$L_5OR8{?D-W-{-ym)|dZl(fVK8 z^ndSr|LfTL->3BdoLm3*n*P5_>;K(*|L>Xp|9|WMvlaa3Ghh(jz#v}0=)eBd9tLLf z4b1iiEbbdv{0&&cH?YPVu%&Nc%Qs*z-@q<eZ@|&MfurAmbNU9(`379eH*l^0z>@6X Iz`$S)04`F~ZU6uP diff --git a/docs/images/scfg_networks_post_hubs.gif b/docs/images/scfg_networks_post_hubs.gif deleted file mode 100644 index 66569ded806f11217a46950c1603dde584ee81ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16476 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 O=PYkaHWn5J25SId7c4da diff --git a/docs/images/scfg_networks_post_hubs_sccm.gif b/docs/images/scfg_networks_post_hubs_sccm.gif deleted file mode 100644 index 75705e96505f32f5f5b9252513fa5887605ea05f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18471 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込#bO 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 Aj{pDw diff --git a/docs/images/scfg_networks_qwkhubs.gif b/docs/images/scfg_networks_qwkhubs.gif deleted file mode 100644 index b37d9ea8da853a4717d7ee513a0f7112d8af6d3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16265 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 diff --git a/docs/images/scfg_networks_qwkhubs_vert.gif b/docs/images/scfg_networks_qwkhubs_vert.gif deleted file mode 100644 index 18f57a8254f964a37295b13b2247fe507a40b2d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19050 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 diff --git a/docs/images/scfg_networks_qwkhubs_vert_subs.gif b/docs/images/scfg_networks_qwkhubs_vert_subs.gif deleted file mode 100644 index fb6235545454f772815f6a9ecc9c64678e474774..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21580 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 diff --git a/docs/images/scfg_networks_qwkhubs_vert_subs_opt.gif b/docs/images/scfg_networks_qwkhubs_vert_subs_opt.gif deleted file mode 100644 index 056e29ec5b812125b7b5efe0e0d6da56acd4c3aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20327 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 diff --git a/docs/images/scfg_node1.gif b/docs/images/scfg_node1.gif deleted file mode 100644 index c24aa3076ccbfa0a6d37feb5c4ddec156ec63596..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22095 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 diff --git a/docs/images/scfg_node1_advanced.gif b/docs/images/scfg_node1_advanced.gif deleted file mode 100644 index 65f4a4ca51badae6ce9329fc326879b7b4044950..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22902 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 VBrm;_DU<!|I8`S|u&^*#0{}4Dw{8Fc diff --git a/docs/images/scfg_node1_toggles.gif b/docs/images/scfg_node1_toggles.gif deleted file mode 100644 index ce09e26c32dfed3b7b7d5146421b281b1890b189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27710 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�HY+d)0yqeis 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 diff --git a/docs/images/scfg_system.gif b/docs/images/scfg_system.gif deleted file mode 100644 index 7c5d165fa489efaf1dadc2360176c6935c0f97a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16277 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%0A;*6@hdh#jq=6^ZtOA`Aj7&WdeG5^e5`BC{8X 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 Oue3I2V_{)num%8lPSLRd diff --git a/docs/images/scfg_system_advanced.gif b/docs/images/scfg_system_advanced.gif deleted file mode 100644 index 448873250272e5de24fadb22f4f499cf6e12ab2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20568 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 W)!6%@agRgeo|i@&Dkv~8SOWl$G6%8% diff --git a/docs/images/scfg_system_expired.gif b/docs/images/scfg_system_expired.gif deleted file mode 100644 index 3b54952d0e62886bbc0ad5d11c96ca0b1ab47541..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19122 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 diff --git a/docs/images/scfg_system_loadablemods.gif b/docs/images/scfg_system_loadablemods.gif deleted file mode 100644 index ac5fdb7303f7e4787c6117e85adf7e8da40d0e0e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18790 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 diff --git a/docs/images/scfg_system_newvalues.gif b/docs/images/scfg_system_newvalues.gif deleted file mode 100644 index ead4fbe22140ef64dbbe91f1136674680282d429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18909 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 diff --git a/docs/images/scfg_system_newvalues_questions.gif b/docs/images/scfg_system_newvalues_questions.gif deleted file mode 100644 index f2a4e100a58c776c78e3ec29d58a94d97fdd5a2c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22677 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 MrYCzOn3x!>0n3n%^Z)<= diff --git a/docs/images/scfg_system_newvalues_toggles.gif b/docs/images/scfg_system_newvalues_toggles.gif deleted file mode 100644 index e851764a7f9276892ce92084d3c5c06ce08715b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22276 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 N!*Op66%-g4tO4(*=T-m! diff --git a/docs/images/scfg_system_quickval.gif b/docs/images/scfg_system_quickval.gif deleted file mode 100644 index 53743368f9f981d9887dca7ecd9c94f851ffa00f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19960 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 Mq+zI_z`$S)0K>@eGynhq diff --git a/docs/images/scfg_system_quickval_0.gif b/docs/images/scfg_system_quickval_0.gif deleted file mode 100644 index 7d0d4ca9e186a8409ce89b215ecde63077c2cb02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20938 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 Sdd+$9+RNqDh6)M{4AuZiG-DqC diff --git a/docs/images/scfg_system_securityvalues.gif b/docs/images/scfg_system_securityvalues.gif deleted file mode 100644 index 9a108983868121e90a3ea2f8d6b8ac6ebcd2ab13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20558 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 diff --git a/docs/images/scfg_system_securityvalues_0.gif b/docs/images/scfg_system_securityvalues_0.gif deleted file mode 100644 index 840ffe99be4fd430b0feca6a64c67d9971f19ea9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21390 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 diff --git a/docs/images/scfg_system_toggle.gif b/docs/images/scfg_system_toggle.gif deleted file mode 100644 index fbfb8863bf9fa6416bfde149f1c90ce3c410b48f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22004 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 diff --git a/docs/images/scfg_xfer_compressable.gif b/docs/images/scfg_xfer_compressable.gif deleted file mode 100644 index 81ad6ca3641e7e831e69cc83df20e3ea51b23388..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17293 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 DBpwaJ diff --git a/docs/images/scfg_xfer_dir.gif b/docs/images/scfg_xfer_dir.gif deleted file mode 100644 index 6a653a7c0f8863a95ed7747418459096209c99f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17884 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 ZCR;D_>4fV1IiF7HerJ(xZeU=r1^@-rha&(0 diff --git a/docs/images/scfg_xfer_dir_advanced.gif b/docs/images/scfg_xfer_dir_advanced.gif deleted file mode 100644 index d40a5deee6b21a7ccf0b92e544ea8a40dd0fd1b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18488 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 H1_o;Y;IL4t diff --git a/docs/images/scfg_xfer_dir_toggles.gif b/docs/images/scfg_xfer_dir_toggles.gif deleted file mode 100644 index 4b18229fcb251fa61af33260e3011c4cc743c1cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22625 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 AmH+?% diff --git a/docs/images/scfg_xfer_event.gif b/docs/images/scfg_xfer_event.gif deleted file mode 100644 index f5270e94298648fbe9709e1844fd142f16c5b520..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17446 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 P1dq!&A5l<XV6X-N@|bb; diff --git a/docs/images/scfg_xfer_eventc.gif b/docs/images/scfg_xfer_eventc.gif deleted file mode 100644 index 120677109a81031bdbb8db7e53681cad0a4b951e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19050 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 diff --git a/docs/images/scfg_xfer_extractable.gif b/docs/images/scfg_xfer_extractable.gif deleted file mode 100644 index ce9cfec0140b5e25731d71c0eb2fe78373f87427..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17607 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 diff --git a/docs/images/scfg_xfer_library.gif b/docs/images/scfg_xfer_library.gif deleted file mode 100644 index 56b6905b38dbf05429903fddc2949e980b29faf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15348 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ℜD(<?sCCHhI}S?<BTZ-V?UOMhmPtGQPn_GXIGy^75GouzB< zT>ks($F02fw`;rSRNsGp{VT)Onz!9aU!VM5bLUw7zg-Fce~QhV`!gik_{-+|`cIDA zS(fkr_2u>|&$pBJM_qEaJjnAt<@NpWs2SDve;(`q|9Sa->;#q1&kn{WpI<D0`0h%3 z2DSwZd<u;J*x$umz40}EcdmrYQ~8}!<yo|RxBJF^Kk2vQVeAh<AC|laXHx=Lk9j_q zyv?qq;OMh}^B-5>xrGlnpYd@kC2;%Q;@Y)<=g<PKYY({Dr1_RT;C=Og=UD>Jr3ZZf z7Vs}hxLbMu&EIIjqzHjq3H+ZF1k4r+SUnWbQxtVl6t+_o^IIqymMG@6P~1&XBJQEU zCVBR=ClV$mYPTwiXC;cSdMLIpQM&7)_^E}`#~w<ZdnkKNQTm;toLQn!S=-6fgf~wW zWyO>f<&<PTEtLDVP*zPzS!<D^)gvXpB*jIEO$G}%xE?(ZR8lfqr0$fY-n2-??UB0O zBF&;l8f}j>Pd$_myUW@n&)GEZ?FuEWX-T?Wi*zR`>AicTb!m~_w<ImLWSOX>ue}R& z<dU_O7Be49GBSH?q_y~;s@vloHS<lfl#J~b8;3nM%~CdzN;W$-@7GTm^SZ^RWyzM4 z9-CDuo2`3nu_{Di*<;I1i><aP+n!r&do0<uE&lw%#g>N_+kaDb__WyJl(OBu$M#a^ zw4Xh86nf&MmEvIZ#M$bJ!?H+2u_dl%OB~%&-29%nIjOi$Q#LJI;!>sJ*|)^AOT{a0 ziBa2Q_oO9W+m^WPOYvN`#QU0x!@gvnTPi;9p7@-4;`vL(_t_GcH_865QUbYD{r@cq z)KU#{dh&@iHOT2{pqpwy*wY{{)s1iC)#8?hnyCf{sfM>L4Np=nYE21mdKxkBX~?># z;hR(=&DgznEsffy8oO_4#3I$WL;raFo~6c~TN=CUY3!-ggllqv-<~G?Q;k<zmcXQz ztoAtgmuiY!T8i1TB(-NLR>`hj%hH0DB^E79DqEIX)g76amQnRAHB2q5DJ|=lPt2-i z*>!3;^PXj&TISgLVBy4PS(ldOJ$jb&X<3L^TF$R$d9#)kh^ZIKrPtanE1afQ{Onng zm3q;lv^2N${GjxLsOJS{>gIiFWp?SMS<g$G(#z6jNG3^@bS*D$dtSNjdHJrzxk`%F ztJ15_Ew8!uJd^2p#ijJRTj^Erme&il6qPM+SoFN%*z<a^3~N92M!gk{-<CHkY1C)2 zmK&|8v(spGd(qk!pPiJ^?DV2BZAELDhU&k}r@2)b9bqdvmuYmYdht=_;jcoCu5~MV zx-@#VA{x$R^jy>EdH14y-rdy~TVgAY1Wq|}fQM(Ilx8f4hnvfZNqm}~Tev3Ktqj=1 zGc|1G)Huy)X)CAYX-+R&IX#QZl<B1dhvwuymx+EaCkCCEQFdfPUuKBMOCOh))6Z$n zy|!}hJ<WN~R?fTSVxhKjve`;chnG|4t#nt=TxjJp)9B@VuayhAT&LJ+&3d<TiJ#We zuvJUrw3hwT$XTN~lWo;vzN{r>E{pjZ=HziL7h+jp<T|U4WvOV^l4)AYj;&gAPHXM8 zRcotUX5_u{(9v35w`zscs)<f7`!qBIH)yWkm9<(<Yvs1Ae{Ke^*V<`saa+B`FMHmX zmunAcZB1LfEl+!U+3GcNQzBbd?@&6j!;gRGywy9GW$#?4?X*C9SKI2{hqQOE%HA_A zd+)y2dzWeNJEy(>UH1M<+6VrvKJZKXAY0BszBLEcbPnmgIcT=#kd@A1yERALbdEZ$ zIqLW3Xqe8iyqx`uLUy0ZcAnw7yKl{jX*nn6>6~1&=H$9Hr<UoQn3Z#CSI+58IcF}d zIXh41%(I-+*WR3arE~t@n)7VA=lOIm2(7&!rh7?l?IkJQ%WAoo_10c?)4k&N_Hx+T zD^a>v<KAAKwx(oH!}U7d8*OWE^y%K5w)W;c-CN7n-dd-7d)wOE`*iOdTYKl6?%iub aYwzCEz4vVGy?46zzvbRca&TZ^um%93QTc2D diff --git a/docs/images/scfg_xfer_options.gif b/docs/images/scfg_xfer_options.gif deleted file mode 100644 index 6feaede395e2918ad4e546e521c41a5bbff4e0aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16516 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 Oh2mASlN}rw7_0%~(__s5 diff --git a/docs/images/scfg_xfer_proto_dsz.gif b/docs/images/scfg_xfer_proto_dsz.gif deleted file mode 100644 index d61104705725996c96bb115aa2b964f94974d3ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18021 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 J#s&rkYXHl^!xI1i diff --git a/docs/images/scfg_xfer_proto_dsz_g.gif b/docs/images/scfg_xfer_proto_dsz_g.gif deleted file mode 100644 index 11b174a6573be83a90b8542ea94a0f25629f343a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20568 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 J3JMGi)&S2Z$+`dl diff --git a/docs/images/scfg_xfer_proto_dsz_h.gif b/docs/images/scfg_xfer_proto_dsz_h.gif deleted file mode 100644 index 269143271efbd49561de706ec1eeb78f000550c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19769 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 Q_Y2BQ6l7*%VqmZa0NJvZd;kCd diff --git a/docs/images/scfg_xfer_proto_dsz_x.gif b/docs/images/scfg_xfer_proto_dsz_x.gif deleted file mode 100644 index 7bab96dd5e26c7aebc16a1c3bd4bb7049f594349..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20246 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 diff --git a/docs/images/scfg_xfer_proto_dsz_y.gif b/docs/images/scfg_xfer_proto_dsz_y.gif deleted file mode 100644 index e1b1913cca073e3262ebf75c0cc9fc9d3021da37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20716 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 I6c`w+0Z*@3IsgCw diff --git a/docs/images/scfg_xfer_proto_dsz_z.gif b/docs/images/scfg_xfer_proto_dsz_z.gif deleted file mode 100644 index c8e3ab327792a08245f8025dd723e7c57f5bb37d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20646 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 F0|49pS~~y$ diff --git a/docs/images/scfg_xfer_proto_fdsz.gif b/docs/images/scfg_xfer_proto_fdsz.gif deleted file mode 100644 index e6f010fcaf91b22a091081164131ab4204eebdf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17301 zcmZ?wbhEHbv|;jQ{LTOYEes6*8CqI66tg)rvjsq?SirDY0)(n1EUOhks72AKMboK8 z)2l_(tH;o*$1teJFldTp&=kw4DV9-loSdATqUJay&+!7GrC!-fgR++f6)z1cUK>@s zHmZ7URQ1;6>aEEwTa#P%X7}vP?m3n{<yi5QW5sih70)?WJ?C8Y(sL~>EiFsWwJg2X zvi4dJ2;J-1dT$B{J)g4o`JBDa=Nx;#^w|5Q=iV<p_x;$hW7n>o`~RQe|0oy@0dhk? z2b2RqdBK6>A4C104~i2W9BAU;*D^U_ka)P2PuXeCj}41lx<&M}&YTcje7slQx=BWJ zQ_6|SDuJ_nP8Kcoo@x+%tVVOQ+S%F0#s3a`Q08!CVyR(}@Y<4bQQU!BKqH~S;qr1; zJ_!SXs|_K{9BYznCnRJut>f6I<{?m)!^Fxd))TrQOqY2ZkB~ux!F0#FyZGKbyL$Qo zBQtxQJcFFhkH$of27dd74HX+%jti)`%+pD1YB@dCIC|cJolZ}=gdM^eauZ8lTw0+W z;gG9%_|?^Qrd#H%RdjxPdxvSxg|!R6zq>D6Qhvi=PeuD<X`7OOeS3bkKRsn%!C)9` z)xm##bNhjPwk#Zi_nrSWh$}k%>G<^AvqNHGolED}_nv$774O$}{{HU!K!4$Xmiqr{ zKhz&^vWR6UG-?Q}Xlhc|dGVlG%S9uxMcXH0A(w7K$3rg3Z3h(Fbz3x&It;c1JnGav z!qCiZFlB`jkJhmTi+Bvq2{8AXJ<~YMV|mWuFptrnh~|D{9?xc8cd^bTyrwq}ESYR} zCxMyIFUWE!ucgmSRldk)2bNB^Y|&gc!|F*u+Dz*w6Q1!|ZP<BucJ98PYW&4)hL^Y{ zZfH&kbm44y&S!H&^U{3lA15dK+cRucpI@Wo>L4(|>C~0Q6WJ0OmPC1mYA#_{m@qXW zb*k&N$mEq%!=ef=wra(e+`alL?%#%QU$4iv3Wm){>@pQQm^9H*?dJN4iD@&_rbe<w zWz1F7zQwY1<+C?gtM)#dmAxfW;r7;Tsk3kA@BO$fy5NZ5^2Wj=isdrJr(Bn>E4j9{ zTee)j;`&^UkA3QLRZr$_pU3fP@AG*apHH%HsQE6qM!xQsY>iWcs*X)U1H0QDg=Ri8 zj)yH0@ezsbGI<t{j;plwJnB^6^&zRp;F88;9?jzml>7BQdmQd_66#zs$xH6%lXIa? zm8w%?na)0)9^WUKHZx6b?XydHX1eNg8}@0wSX3+3vV2|-U+Ri0ERrn&*X;$Y1m@Wa zwy3jZEMNQWR?haf-)<Ki*ZqE{<a+M+yA{vZe*br`=KI_4_Z!&temrOq&)f0Pj>F4r zQ3c<FACD)v%Q-MG`~3UyWQuj(&Zkp@&;5Khv$$^O^M#YwRlZp4zRv2!^74DTUMyN} z_v`tx-F%j>*Lu&}`FhLkbye@yPye_3-L}Vlzdy`4U1$AftGxZ6&llYF|9-g=zQ5+x zvFrb;-yc_(xBa|t{l4lCPd?k(eZ2Gj-QJ&1^Yec_d+0p>$Bp(`y^PO(JYWC+-=FXA z|Nm#;S-`;VaeztcLj#A;0w(bj2iUAWGz#=AU{Uut$mO>#CvkN=o9>B&d{rNs6?hhM zxO*HDn)RVY@eSu+gAR30CPfDQBQgR>KlV#LI^XuAdCI?njze<4KD7UHV0pxyoUvC) z>SKq8&my6<;w_9O8;kjT=KPJQ*w4Xd*rEJnA<tG0XQ{G_-G3f0<UQ))rh87HJzeLq z*zOzq4Ub*ujb4%{m7j6Us_9~1!jVOyi55H8e9Y`@;8~);&be33?qa{2-~ujV4_EO| zf&CMDmZ+$Ep44VznCPmwM9uu<NhPUEg)>yTl)i4U_-$#_KgDOMR`|(Nw#N*nIKNz? zlkVxQeyfOK14{$L(i0xXLIs<qeTf$^c+M;@uzAJ_pJhf9B^i><HqV&so%U}=rBAxs z<yqHbmKkr~c{V3&^UUjWmYE&*JXbX9^PCqx%dM`TJXf~s^V|=A)a2tiPe<MQJg?#3 z9~HesOD|{BOH&zSmYF~HywD`|WdVop3McVX7upUL7fm~(YNzgX@zqP?>3_dCYMOIg z_|Iw5E-$)(uU#`hw&}|fwWD)9gKybSV@p_~c=o<Wyp`qjZJ(A|geJJWj=VVUmr0TM z({zT)ofpN*LT3Ehoaqq%D{xw#*V2hiue`Lc22GkaWtDDfmhZ+{m)BK=HdymM^*{dV z@`AQa^Y@xO4cz?e>b6~9*DCU8tDW?^-Z@KjvZU@SeR&C=ZF!-qndiI=O_d6oA@ps% zT<^+6&J$OcOq#N+p>=giy+*jpwXd7D?$K5%e|fr|>GQ<NylXSue@9kziEdu;bV=IZ zj<CIxzHQym`!82Ob=Iw0d_`L$Pp@X{edTcc<>zvj%7cL|znLB~E!g2~_^xp3?mN%S z#CIM{)hqei5%a>&eCM&VdWB0*$NGeY?>?7$rF`S-JC9~f-*bKLyNdbT_g+8ywD&{r zyMoi+cOD=6zVFA`{F>a;_iOG6Ep~ppMqly8?PxKfq6tB<O9bXTIIeqRJHK39leEo4 zb*qgB#g7%VN#;D{HQq6yZA(Fm_R)tz&Jl+NzZJAu--%z)cH^LioMD^ipG1lB8OL<b zZR}g#9__ZZY<qQTLSy6~Yo+%;PI&ljnl$~)liUBoS1^PubZhiUh?bIEp_lftXa0#) zsc?xy;_C`$@UBTv&aOC<d~MUej^vuh#^yiI7W8eNBl_pbX10nh=DG(Hmb#~y74JA* zXSZ>dug*ie`IZ-&=51aie)fgi<)0G*{@quKU7fD|`R2tL=e8^}U;9$-v*-4Cxew+o zzW&T)f5p*QH{)6RWzx9j?>f;ISKJt_``YOCj0;-NwyY~Zn=N-;a(%g<wtIDUW>B}} znRWL*trF}_7B!E)s=2LnT5Qkj^zXlJ-8fgakx?e~XyDFE`)lt_-Rk?UX!h?rLjS&| zF>9oH30vQJ*|u?IX6{q*-Lr0`gnixfUN*V%`R^P5_$*pK&V4Q7E`687e}}E@+!G1A zqpuvbD|nLj!=fwrPGS0*iesjAA5EAVA4|y}IQp+X{bPUkpU2Agf1GsRS9D_Ko~L@| zmdE1PeVBE7&pICcQ~l1mPdd7PKXc&Ubz$b5;=oO_r`)gmzW=4p`#N@;vkCtU_Gim} zE!-V>|5RMnmDzr!Royoqbja<x(HQq-VS(8Btk7ROj-UIsZTH+Ysn?%g{5vx}Y5(7M z73ZyEcj{&?`FyAO7w?`2?EXIvN&oxM;lJmR`1v2ltp9zSz;4FSIjiJm)W1(N&hL3< zZ}IX}{=d%)`1ihWmv1Pmp7&*i|K3;O^}(n9&;7cgfA5=g{zK>X&-=FH{N8uv_TM#w z13Nbc%M~zg@DC7@pFW{`>BsK)y$`JQi#CSr`y#*m&x_FcKTo^YecAZW-}b{s{U0aQ z_kB59|L2AL|H|wB^*_7)|2;E*U-KY*?$6Ejb#MIbe}CCt_xCEl*SF&T)gQjseH5;{ zaJ}xz_WG~S%R*WlnJzY%Eff|G6ym$lAP~_g@}oieprD1Kpt)cp|Hekajz+G7jq(=4 zdW=n~9zq%~8Wb-!DrGckOEeqYXiC@|=x|ZQudvx_Mzc*vv;W8DV8IqAi<a0#hS<Uu zw~UswjV(SIVugz00TSY6iQ+|utzi|db&A@J3tM+wYTbEABH@O_6h_8_L2WY~b!G?Z zoZO_dD3NjbN1gMZq%IjruiMDDHnClLf^Ovr-TfOG>wdI1yl9tG=xBMt*qqVv?_^>} z*9*o=2RnLB=)Kt_`_ZWLZlJz=fZX>Y{U;kcUmet+cS8T8qx>Qd1J=#*%U;OyPVQn> zGF;<fC|qnPk*p}Ph)MRcp(2x#f{>A#l99?~rF}oT51cSEIAC<dqUXp7<r6b{Y?7Ey z-{|o(Vm|-E_>x6$L{M+UCDj`lCbwp&`3S4!FH*}^Qh#Kj{zSs`8HeeMh`yH<eXnlx zJ>TKfu}FhKfW_Id|BFSxJEO?#MItkdG^Yn?{?`zle@QcjQ7p+&E3Hv1?V?x_qxkAa zTIGh?LNmqd7$vqiNpwz>=v8d%Rg~Q4B)Pw+EpvzD!jF>KD|F62YFo*uTf`x)XQ{hs z;XmCSiPHBTNlP7IyeA}cR8a3(kj#rmGO`M?j+U}6KlQF$l)c_K<$<EyLr1x18#{kr zl6z|?|He>W^?}@y6Y@VB4OZPS;Bi(ExZK6MNn!nuF2N+jjTYTfn+)X+8*cw$sJEfJ z(9%frk&;2tbPZ)@qabDTM@D*^m2E#MJ36U22Qk|p>hUd7>3pf;`^Y$~NHsdBH=#+@ zWpS@pvzq5-wOppYLZiMX7N+7m1j3C47z6~D&U6f#EMULDlta;MpLoCJ3Xx4aMYdSZ zb|{?f^-;txQPf9KG*ody*g?@~K`}Q8v6#jQ*@0T8PEJ@AB);~NR`3pSVM}e%NbR<T z6FVBU6aVedPWizwiE+|oL!Ie{la4-;Jh4b;xuDeIjgu}mNnJLQz8WNbZIP}?rSzRc z(iWUDj}J|L8l-pX;rz1)JI+1qxPGwXCZoQ>f+-&_O?kXgZq^LBpO^F*nx`@*cSTh$ z{6BFazq11G;V#ZY3aLL8G9<gjow~C<yYo5~6@;fN1u5;`p`;Q#y`pov@g^gK1=B5s zj2kp(v_z`db*cC=^>&{$4*E1>0_RL8W;L&@nfF$h<SkMwyfpKv#nO3^OT)631{5!y z=c!(jZvW2Q?xwKy>t_2Ki|x)RFH5hoJF?h1ZPv2fT{bT-+a>R^3t(BkdGWG>s%5Fa zY;FeId@Q#;*S<XaSIxg?(`@b;FR!n%dY`_GdB?Kr%neU3FYnY^nQyh?ma^TJ;*}RS zH|$$dKJVAc1+#KLE9dMvTD`1l)rzj_W#!djEN;D_?!ONQ#Y|bXWmfP)D{q06>eA!k z3qn`#<Eoxkvbtr7|ISzCyI(ofZmryW%B^IJ+umLFDO2nVj=05$tUdS3ZH3C(@-1u6 z+**63Ywa1UwE|P!PkTj8ed>PbRrZ9m^vUW8na5Y({I&X%RMqoYrZ1~9Uu#v?USE2c zZT;t8>sN%Y?<rb;Y})$Q*K$AnSa;&rnvGsQ7fk}5ec5n~#rM36?<E#LQSXgX(i<gj z`^r{t6#nfa@H#*xdXrl9CXLrVOuyY(e*Y_GI~~PWUd1zI4KH_ShicHory((0HwPXK zv6WsOwl&mis&m8F5C-om?Q9X<*PD(VU-#Q<mE$!Bli4Be(OVZy-7<5_7T0BY2HhLh zuiOxHdP7L|W;T@w^XhHguG^fegL1Te`b{Iktg9ltMWS|Z)t?=0czPA5$yTGQ+gL@m zWSrit*&6D`y~XwS=El|?A=aT?(%UUfw_gw6zW7-Azs0K)tT!j!-rl!+XB_KJPK}*~ z>{-W8?Oc+*YK!VlzGGV}Zm-L@zTTES|6zLkr=@XQs^e}fjd|@FxBYZX@1fm0vv=>7 zj@`k%Cz5&3v!lD+KJLC|y65!MxR+n|+<6)|F?`SM*0>%2q~k8n-aD;z*UIYcc4p-P z(Wx7%8#b-p`>cB3i`n~L?cUdaeDB@cTYg3DJXW=n(<Do1duizO{c*>$Hn<g>xK_GG z?7;eE`B%#F*`AfGoK_lNp7p0Xh4)Qb@b~@PHrc#y_H7g0RcXD8D`mg^@zU+z4o0dc zw_i)kW<RJLlgpldP|K!7qG!WH?!2h>1Z|tcCOql7d)CLl-o<_7;77BAKbIZ&ZGAvd zCojz`<Ck_p;`BqNdyaIM9sc*YN-Ac*-Sxw9&l695%keyu7G|Ciy)7-)=TP?XBT08M zSN-0r_oraJ^x>7($8zo*D|ve4@8(s3Jq|W|w)%%3^?QD>A|^|)=g8)3`~O{fcHI8W zQ4N`6c{L|yh8~+g?cf*h<H0${e^e(;nv=8X+R^&7<d!)Z$Cn+MI4AqUvZEa`r~a@W z|C7AaYR|#`GbM}moLZyfv1E^Z(VY|QA;(wA6d9WrYNQvbwx8Zsb6V;7=?jO8)Q_Lm zR4+b!r*LP@X&v=5hi!_F{V6iJe(KU3m-TDx19VQaxtxwzc0Brej!|0H8MZQ2ne2b3 zPgcJ<`l9CK<vr*8p6%_fIcB7N^zrVqZ(`1W>q&igry#ETn03whe}B$<xa|B}e0KR6 z$2Zj%IObm9+IxZL?ghTT71rj*MZa7SiM=RRdr@NUMX9;*i@MJ){e4kE_7bzpg{4}T z)M_tjto>)dEasBt-Aj70yEevL(6_y8qPt$Dm+?UR^3GFr&)v7PaO`&#S#e2t=kF_* z?RagkPT%Ug`-+RMZ55YQQ&q#a@+)4pHlDRtT+d#a&uv@#YlTN{L*(Df-n>_ySYL5l zTldtw{@w9qalLh%E3PHRUWwK%Tf8cqq4s*k-IULh4;%exs=Ir=!M3?x_eP`bjkeeu z9lkfZYHxJUz0vdchDc(w<3#ViMIswHMT0-i-rp&D@TO)2qt@}tIg6UamR%Cd5o|sC zb50rK+)I|)m5vje6SXBzN=Qq#-R0ETAuD-!)9qP-lU|%`%X^_yaAMLGqxOxC(qC>$ zS7l7z(>VXpq4`gYWM2NeB*VN*Pj-UrRl`nC&rZ&&PM%eriVO4wxeT7jc8ScI`g@{5 zG^Ya7qOPP$g_KCcbj$mhD-8uFDQ=r_Ki^VG@7JP#ca;nij2QeD>mD|;_%+?u$=KzS zvYnNR!>JzsMKkO!&v3nE?66pMilj+Wkcr#j-kd`wvu~ONNtrfo(o~bvtSow@-pAOm z=#e&`##-(E?-~6+X7o>Sn(ceB-@j2a>Y!#+Bg5QJqQ^QXEOOFX(j*r2VnXRc27#Yi z7f*_dMQYa;YD-1l=07m^o@ZOK#H53VZmVcA9zWFf>SkO138}Z1?Ij&|wmVM#x>Ne> zS>3~mGLMAr9y=)Gpt;~$;(~q;*?+ef^}Tn>^3Lk~y-5GnMY#`w_r4ZRU3y}w_$mV_ zF2ls1_de!MQ=T<VC`d6UvpaX^efh_WN;s9(HYsTszcN`gz3!)x;bSA7eGlwssdQT| z>E%=vty>~)XL94j!{nx!p3O7!gqA*<v9yF~*1}BFN+p5iHwBjeRBvn&h}x{q`(oB4 zU(=dR8dK+rOmNZ+nRs)Ck|=wFX5>Ll=e!9gJjJ*?Zv~!s!mla5>hF^p$GKNJCtjba zEpt*r&Qdb++|x&%^X4!<JNfDMLEAeQFU?!^ao)8{Qa6m|8=t(Bcdq^S&iU4vGN&0A zTojygI#JfyQ`RkW%I%M`ch63F`f$omp-+LH_x?}%_d+edi+%Cb6*unjZC)t!d7-fI zBC+6?n=HD2^e&Ry{BoCsk<O$0jO&z2EngWdQZj2&Ud}hekXeN%PsQ%h11F}3y^^m3 zjlS9k_l6u&m8|RCQ8zPYzFO|1*Wprc%7fml&YTs!nYqeo*7B3Hg4s0wRLw4s|6UY7 z+p^=P-^1BaA0IPm&T*(~akdj%ymwAug_ifdCvW7m*XwEr&YKwPaeLcai9M5UPhWWZ zacA2;*=PU!qz<2*l<B8?J?R67{^b0;$@iILmij+`KIs>u)s*uSpUXGMUJdNL=cq6D z|L)Hs{ka?qyX+Q<?s^ejxsYK|SNzF^?|Bz}vi&@*?&bHjig_;;&;8>!(lwZV@&A2W z{s&BYU(9Yzw>+h6z37$E<HaTcGwhhYdJBEMq@fyG|1fUSL+`HF9*29=nU)4{sYm~s zdA$1n_xb8S_Wy4YV)?@_pwGg0WJB_CetCU^KOB!9A9rrymvx)MQTXU+mxy87k{N}M z-TP!6ySAJtTy%1hl;W}w&rMHHP1p6G*K+dH(-Xb2sZ}m7Kc)H4QEdM7XJ=8yxy3HM z*Ou%QS#f!abM3hhudge;S6eT);+++;I(&nRtX7JJ*kOh(nOE2G3M4q(-dgx{Q>pd! zcXxLbygzicJ3Kdjf8$>!v6vYJiM#S&e~Nwc?L*x0(x*ml-jW|v&&)JE|MvHdg2!k7 zO|^F4mVMJC^XN*;#oKIVn!dVFSIgq)vF#y$>-5`A*Q%`w^G_}coquocwap(NtZZDJ z)_3RUr>7<E&!@imT~U0$VlBJ=KB?-W_oogXSBtMRj{kT#F*w{u>er9`57rys*ZWgZ z`*zR6<?i<OZ{M`%7;BsTKV$siz@--F0!KFKk`Im?%2NuQxXx-{Sih+t`h{6*+2;?= z0?s0ZE<)ZWA6-O(LkeBRqDwxyN+eGybd$>7^3hGE_)6jNZ45pc&YLSliaeCMO+I<3 zOb#jXRGV!xX(2=7l?$F)tG9ge(%F2a$XjnFOTb|sYZ)O91wWO`hmFg*l{y%%xoke8 z_jpRNpOy2!H6Q$JB)1s)Xdc}nc+T8D=JMIQmvT;D*v7%T#m`N;bc(0N=P4zZ&NK=1 zy2-Q7`E<;Pk(c43pdf4LkwAIVuOT6cZ@xHrMIXH!<b8YgM{nQ1YYMN1B<q+SiS>RH z8txx&^Eo`OIrQp{n8+id3~94VuSJG0o+}WxW!~0pks?2z2)oBjF5MUsz^hsu6VE7H z8e`G!JN=H6t!sI#@L}GtyJgJ2!T0>{nof_+Kl^9P+U)gH%O0?=lvPN`4m`8PpJ&J4 z?eQJT(`KAV6>OW9&?9JaBPm^U8LtnY^s_GyJH5?*KFODVw&P|`v|0Y+sf;Jgp5(f_ z{Y;xv%qRL_M(nqldm{cNPy2bKHT&P>l)00`tR8iR|NEJFCL!+TV~yT@qM3p>-xR)P zsQK_Kd&A*x3$r)vmb?9CeYHq*?#A0?zjJr&Rr{T@^J3rcygi?<Rp;;f{q1-D0p{<& z1EyBD{rYfV$+L>I&1;rzye+uZta|&t?S8lOcIltLb9lqeyxX658OB$?+r?`Bx8zE2 zcx~ymyJ|9i3k9eD)jO)Y?3erT^cI`!Q_<i5mOp3~ud8^}Ex$LjFFo9D-7UdoQco1z z-NFL+IYY0wm~FoP>zA48`g_$<JNXTNzY}Jy&-~Kua_`a8+wQA>Hb}PDU0%F=y`0O( zjq3Mn9QT%A{^j_!-{sEl`#<+xS2L9~sQt%%<>D`aXZyY#d>^%a_0$uu+HKj=0-7gi z&AF_w!iH0=CqsVqg2Qi?FZ-xDq5Rh4`-~r#J1I`&Z;)QH@Jq$BgZ!uTTFy_3=gf^z z`ta1ho+BrbiJ!xP>5xIalgXkdGa{TdR-I^MJpJ%Z*^P~Y*V+=*jwFce{oxv0YET*K zaz}LI)T2LdzAB86zAu>AVb5~zLMzjri^9n&hu`iM?D3qv=)j2z3uB|z?a_Z8GThy< z=)YuP-&5x#fvGP}d`is?sO(vy(iw5mHf=-ywO`5#>;hY61WuSB&hkiHbEap=B(I(~ zub*6IvNRFCm^CHbI#DaP(pw<+Q{>u`r|PRkPYGvgr||tdoNCzXsdPiKZ@OOfQjOwr zpA0u)_l?nN#<i6O3CAY2Y@TxQ_d3n#X?qVuGBGk(3a0rj><ymtFy^`C(av)v(>Bk& z-jr?=?sl%~*5tXrQo`(h{`Aj&SUi{MZMx-C&VUxRkcA8@mYF(QZcVt9GsE;#+L{BA z7iwn}E4*0q-0k<zbCriK&wo`D=5AXRFtM#<-WQga?)*{)O^dcHHO_r$7klbr<DHVF z+`bxq@m)dl*g{t%=V%<8HPiKu?-V!Dt=<;xzd}~Hg{}%-niaaXDs+)pX@dLJw5wCB zl$Sj^x@f*kcE+_Q(>Ko(HO$iGkA6Do+NO0!*S5}F9d@!ReDg8U^+{L%t&aUGwKbb7 zcf$Faz=+J{({}n9g>}`&M?TD&e#A;FOsw>E^7mUePG1w<I63#tf=fX+J(I%L6{fCE z)m`m;u5Q|<d7*2g{C9^RyBE5-e(BnT9Z`!G)oz`=?~Qg+_V4HiY~ecucj<Pfct(gz zifx*`_s!`qR?#QEm2Ek^G_Q1R_O%0Pn_Uj|+zYDg4tv(LZEL@8Zbqv0wM(<UuRTBY zO@;XBTd$9W?>nITuA}I7?1sAVHJ_j6*Z++^`>X54j$OSIi=I10y_B;!IIDGCQ|{~s z|J@=ErSKGV?C{?IN9xUn%Wv0YKfE3Dd7s%{`DX>4uHIqSR+S&pPWyOXi)YdAq>AlQ zae4o`b8C`i{Iz!ryv>r*o$)aLn#5+_W!f#WHBYulSswRJ`_vfsXCe3MjR$_+{V?Hv zb=<w8usvaN`qL-Ad3s}>*cO+(qM2vs?2y&xTWR-2ub00j&EmM_Isa#O%qHGeV%|S> zXGW;e{GYq-ou2UXNRe8}Li^ciw_Udsva|)xo4Nh@*+t=(&UhO(xxapRX5F+S6P}sm zIPb}HZnrvAvP>p-QrCS+_Mc}LrIoH;@BK>d=FE$&OE*o}_{Ny+d*y{Km$$C2)s2Z@ zS2$(wXWF7J8>gErd3oZu4;`w#FLf77?AobUIK%O8c22hG4Z~?gi?jE>y1`*}`>~pN zq2OB^lTDH*j`eZR{3rD!@6!(Hd#y9e_cR9N)m%2aad_Lr#ZPa&t6seH9+SNIL3W1x zl9fyEy*ILmWBd1^`h4|6L4J!P{Bj@K;%grKeD;HVdu~>#xbz-b^~#gR-wM|+sydZ- zt$2yA&O5KKyLMjWEy>!?Q#|>3P0;UYD^Be_`^kOx^vlU{+p=uu#-)9qc56bP?gIV2 zQ7PpS&x7+tPx<RUp1OM1(~##?*QHyE<iG#E9j9J>Q})Pb*WYul8JSn#zUy~A{*%OZ zh3C(v+^;L&Bk!@{<+|S!HvB3-z#jLZS-s{VZ+*p)|HT_NKMQ;$`@iCZd)%kV%WIx~ zed%-T{fSSrpVvIM{a<;ZU9Q`fZ>Ndxzxt{x&wK8#Os{<%`(8Is`1jY%%WL0mHc8le zJMR1L=eGS}_p2YU$Nw<u`um}`zUGN^__dw>b)V<v|GsY@|LgMn+K(&iYv0V5`!2<G zHgT7+cv_;c{zLVEqCdiQpPJ_{tn=LeL)Jw0-y8PXufx56-@PC5>%P3>&BAj(B(whS zU^uW<;J|?ldnOhBLkIf1FZD3b*^u~p-^U$%U!wQNdUb!9?QrBn&*K9Je(pZ-=kWet zr}xJ?+5hG4dHG}Cd+r0>4;}be9JxgtGZYW9{o%dP!T;^IJ=dNY@l}q~ZaT`%ab#|B zoHp?we+$p`6$f`S9FVIyD3G%0#_YM0XRI~n9C{n9qrK;!lg=3@-8)WtZ=Cf1I2rIb z8_GBv={OtPIGgx5o5nbs<v5$yI9v1_)-&PeS>bHG$JyqLv+W&cyEo4Ef1Dk7TpVRw zoOE2AZCqS@TwG&Z+;UvpYg{~fTs-Hvcztnho8ato#>MxJi{Bd;|35APJg$K<u0cFZ zw|{VL^l%M{Il3XiH8jUHqQ*6{#5JntXw)3n=rgV{caBECagF`r8u!OFk;g5G#VuLJ zZ9*jnlS0GZ$YZG{3``AfnLWocOc=7a9AiG<#_Yhr?7_fn!I1C6P~g+R;=oX(bG+E+ zII9N(o5Jz3n1-?xhKecfRVfVBd)%u_7}zcxXTRaj_QIY0-;3ky5+@pDJeq45I3!NA z#CUL4FmN_BwD)*$&hY4((!e?6ME4nw-Zc%J4?OzcoakG_z`cTDqK+rG#L3AvCwVqB zOpWoJwuOPW;UrIoC-01tGp{hrIpfKDgJI4S&-r&w^4(}yAmg>@4Z~s^Fa8$|{4W}o z#GK;)(6GG6YsH@ifgcP43%pjZIVHfsDEQ#i+BaT;45v59cnb+MZZh%SqQfYp!6+Eu zy-kO4N6G0Ob509cH168tz1xOy?;Y=bZ@l-0Gzv5LhzguJz;ouHjn5IEGolh_!~z<R z)%YCGX%x+1JhjH>^b#M5jK(u}e9qoEbGC<3qJi;(jPIp6jS?M<mwnFulMFa}HOE(K zM&tFGvr;n{r5E^0ZD5q%;d^IGqtp%G`&$@gHZ;lz_&qw)_|U}fiI3mYGmWwi=bokb zJ<IWHp5gb(ghTE|<Le`SukZN1eRJ;3AHR1j{_lDGKiPDod|}M+=@1uS`1Xa7vB3X( zihpB)TZT#l(}ZKc*BoOy;g);m81n<SJQ4TeH*Uoy?nNf<tRC*H5$<I<0Tn6k6+IWK zjvTM~;$C;hz3$0zc8wEFAs#J%F0}P9bd-2>=md7PcyzZk^lb6yzH@?;!L$F12loty zDJCZ;i+E10IXP|0$r*Dz<@S2ceRFay%PB=!uZ1?37TI_$i@CI{#cOGc7yk~g6?^`j zTFuj_#mXr7gF%piaov%ibt0!X$}n!>IlW1xQBdQwkVK=&RBzMR(>qNXceDiWS>r8y z;k1=)qxDzsy)KQ1bbJo}2|n!Ob0p@>u{l1X1|cW+_?$lDb2f)je8Cy_uRdpc7{vvA zy=8qb_ApAGxN^nC_sSH;8*>-~YR_Js;(KGw*_&$`Z|^yK?}_jIoU0F5{2uX~lUWcd zvm*5Io~uty{A3Hx$-KDw><Z&ck!!LFVehW^1qZvf?&w_~z|rgxwzeQl?t+rW&&Jd* zjA@a=>6}fIirkLw@;_?SP+-fT&2pT<^mw630INX&TdaGzZ$s&n<Lpb1S1!50b=AG* z=!N<}#~c1V3262?!Jq2UB6G3BC9rc2Lq|+tZ%$xeOQ3|T=j1JcQ_ciVkMW$f<%axO zPX*B+-UkheqFxJJf>c5;Ez!BD+Ivd9*GphV(3(9#tBwTey$#y<=h8+IM#HU<CZ^t| zxu?xqz0H?;Tk0}eY&~tY^zt5?DBHi@OI6R<=SDf&h8%0Tb=>8OOXwAk)+=sz&v@lB z`n<j6b2h|(Dx<&X)vHq&gLtn7%=MM>2)$hrdN(ID{O(!l389g;=b}aZVy|9(`X)4< z_gYe`U$a73@>9Qz(vJR!uyzLt-KuMy31VFZcjOPAb9L_c!orZZb=v8-%Tr^7vskVx ztT@K3(O~-XSiVf`Kb9Zo^X?ogFu73T+rXlFyu9{$d5=5i+HkI`?%ZeZHaxk`YwE$y zaHE0u28Y7MHl2trmx!K}i><X6xi*~We{y2tn-fxVBV?{#lxg*xdE{RATF*ImZuI}X z!KV<UZ0fZzCTOwA%}KdI%jX15TY72wRj(PW-ukkq_4nSKoqF2n?oHFbkvmy#?Usq! z<8sU9t+ySkkG<`KgFGRQv1bmdgdDfIvT|*dYw8uZv$xi^GKw?!dhZRn)WUdK<TiiU zSqX)!fw8_@eQ)2M(|B*m*|65zQZsJf<?)l87rOgw=#wkA_p;uJmkoQVbM4ihbFWjv z4nO5Q@|Tezqf@!>j;uhEa^AF#j(>MDeciHCkL8@blXmis_=jtrLf6l4J@!{7_EPNR z92t>f)qp~qfTEc28?Dz(`(ke`y<WW~_RiVx8c`44uh;9pUU=Br&{E?e>>Ah{dhtnY z+_Taf&*xt3*n4qGjc3=<xbClk@4nuf^W>z`SI-Hu@t;(0eohTipL&Xa!>Mm)y#ntA z&72x(u=nOBk;`*TFK>SnIe)45jw!(wy0;cxJ-y54);^PjWu`u?VF^cb9<cjeIT3Q@ z^pXc>dP2@0dBFQF;eyER%Wpz5+Rh5`g$AEJd-II%_M^Vy-_AzNjgC4Ry=QA;;k~QR zzeFDp4Lf-E+<TpvMH-J(&UL6v3rln5NMFd2Zrics-=Y|;zL`34$Cx_Y&dJ{W%@b=N z_gLYBzhT^6W3zx#+v6;;$J^7At6Bmqwq3V8cb9kXg?o2j@Uq@${SzRld(Yl3P%Jd= z>Dd!)wf82tJb8IEP^R?c>)ey>_wK#pz4ZPrLqBWeMAcKDOyj?#o?6-x6tL~o@+X(3 zwZ;eCyEJoYypil>L5twIxljK+y&q8*yl8H4%s1~?w+G9<K6UJkIw6vFYK{-*F`qS0 zeR%pB&waVYSC%Fq7aid0D>Wl6D=cyMJKwOQ&&2NeMjSmWx$Sm=m|x7@tNU9060au8 z`@Q*)5|+J@qulM$(Wj05nU9X!Ch;0_Wc{6yeOKe$yPWhb{uhq<|GW6i|B_nlmDr3c zZpW{uCSOl|%(^tAYg$0{UU#c|?hRWW_wso>_?pp@<6$S3*;#X<TjZT%USOMP%EXw= z7h5mB@;%vg_2R6Sly_@0=Pr3NNA1#Fz4(Pbr+nG6-nRt_1e{v9Ea=lQub_GHI;@vB zxTMZ@^)|7+Y<f37LhRP6eXsWHdCGY0GE-cXeQDJHw1kzdQ7%iPHkrLXm2zb@ukX6p zG`@3Jd}X73d!Oyp3*`#GogH^uq%T^$EirQL?T1qyN{QvjoJ*9o%aKnzSMu+n>anga zjYrFOJU=P-Xz7mh^_QNX-&ZKZ|Mpz#u|Hpu{+Z-nVht#GbL_uOa!E*Tds%Mz(tok6 z4Uem)KCZqS&i*3&-qB?Kzb{&NG9Q@+P71p*x$K@(-My!InXYju&(luIK8=%``%dAn z=X{>~Z=Pi?NeNn-;`PDr=G48Xrf>CHye&w3>iwm0`Htr!L$Ae$P4iy0F6-C6d>hwW zYu;Us^?Pvm%d7Q#1sk`WVT!-Pd_HR3+$&zG*%AWL7i(T$>3JQ%8oH(TY;fp9p5xiM z&t6M>d%cVGoPd0~5PR6+K0guu7}5RbJWV<rkG!dwm-I{LTe{A-`gv{_ulXz7KbHUG z*kv~NV%tweF}ZBLFDi0ARj!S#ZYk=ycAfWWY~Q~N58fu*-TU;w@5Upwl&O7z)BK)v znilt*ZJ7BluGsTg#5|r;bN4)%sO$CaU*?plUYb{nwOq4Sg=7UUyZJ5ey;1Jz70)7f zgk1ht8|<3?#d_~k_xoAPzUF(SKiE*_!zBMY$u8UdY?K$TFK=4*1ruN2*6gcu3W9no zZ`SyRTzwtBzcTXshsfihg8LuJ94mc!=WA?uPU$tjk2Y0{_5GKyCoTPc?##O0bA44S z=U1&-U$uIF)td8FYwuUBdtbHwf7J&5>W%W%oAj$U+gES#uihG8y>_{^#?Og7DN`>^ z*w5*C@caY5UHA9z5$D-`oQJ=Yf6x8umnZrUi2vE&WPi4UkAtP=5c{834hQ#@*F0J9 zTcqa?tDu_hubxvH``Ksq|GV~}`mjF#&g;Dw=2w5U_`AL1_cM<E^V`=w+E8;Lo`3)Q z-@hw*FW2*5KK|D`vHwfM1jg=3JL>=3zRv$Uqvzd${%ap<K5wo)@_zq4^*$Dne@8Ux zUYY-WZt(Ax{J)dtP6q<&9?I9Q-6YJqq;J1`{q=-De|G$Pm0v3@!+Yxezt;<RtT}t` zoT}LuF7PD2?n?Oo=hOSYvv)8uGVus_6eKvda0m<OyeL?ButQMXDMjPsqr+{&(ppzu zd`LdpCuTosi^oTW;}ccQ(_(ghQgNGZlzwSV=4Z8Y(=;MK)toF;KhtIB&7~??r0zda zZ>rW@$t#Nk7qBOv`XhMcc)z&BntvY_nm+&MutH#V+tr_wUqmcnJ1WLn8KNAy&FS)? zo?m9lv77y#Zd)RGEje<JDdT_9oC@75bGpQh^JKQ>KbV){?&g>AdEJ@)_Ad{u?GZC} zKD6ljwWY5vxlfRf+`cUC?Ts(5Z){4JUzYpZ?A@JR<)7cZ{cT=wJXd`2yH!(Hhw~_% zE}QbI=JDre7nXak?=$*U`s(J|^;hrBwf_9}(f)pZ|9^XaemQ+T+5P;z-M_wle7K)I ze*d4^@1H)O-@gC9eJ#T;afL?argYJ;<4dQ-H2&axk<k3h^@e;4TUf=y7O}Jr#a8L6 z8;Tu&I)6N9SN6+T)TTIT#iLH`MJFCQ#H>|Y9Hu|*g;JmHs~P_m_3C_@@wngm5XX}V zPWLjF^t-a{Tr$a5?&K1OqpIz9!UNQPE}0yjbyIn|OVZD$)8g7XQ>LeMMJ}6~k+$+# z?+VouvkFhmwOl^4beZS#xn=7*pU<mmI{9oyCD*Oz3+kC#AM~sZ_0(A0_DeEj@dT@= z6-%ZvRcX$j?AG;i@f@@E6-|Xnt8O|t%-~{KnK-v=)vD!fqAY9H&YGpQcI&Mw?R7g} z?b2Sq_t!7&4F|cbbv7PhE7#d{fH5j&QQ@q}*K2mTMQg2QJ}Q;H`e@c}-R*a)e(Uad z*yWwQ>FKQQ+jE23c1bN;y~%3r)(vbQ#rJ$TwmNdlyH~sQ_y7I%TmJwfw~fI;R_T8= z28TGc_ZS@hdrVvZh@iKP;Zf1(8pC6f*?SC+%g&ynx}w0SB7G&}j;x}s{O4!up5FfK zw!s<0(>BIuO>fs2pIfo%mf?BZ-+zoRI7Ztz2&6sqSbW0t+)CrUn$EK~?Y&`Ut9Lat zy4LhsWb^5gq~}$Cw|cvZpPe)<<j_m0lWMDVS6}wMUR|_mb(XF9-O}5&-?zs!?=`=# z(wSS*tvLJcyIU2P-@d!D>D#LOd*6O(mESFpwllxZ5K(9OY{vJ!mHGAj2|u|P#LHPR zEc|>tXNB_n$fDbmqu*Mr-Qaz@YU3vTb;fV~^RsuqejGN>^24-ZyPCXtll`h*F5-Sa ze^<J8uG;mz|B`ttPhUwpZG9@o`ft&<yXtv=PfvQxZT{${|L?Nzn~VDQeZ3U?xBA0O zVSD@BdD{JdJ~Dhz|IySfb!yk|W!J5$=jxX~UOn&Uy;kdOq5TbPIr2<b!*#zD=4ZWG zEcT5_Lg&ZP_eEcRKgjM`zURqA0R~2=TMwp%S@8Z^mwTl;k&W9!>x8F3bHMF+Jh5$u zC9MjY@^>o=h|X{n``6VhYof?8d4<I9i30VDZpZ(h)83fA@@=Eb9wo8OD~{$#Zfy4Y z^T^jF;?N)6^NxRnr*f^`any9v#@@V;tGD`ASQ=akRP#|u7XGR(e?>L7E3^BaG_&Rj z$GDB%A6F|Yc`Lc8Pcv{h`_EbGVUgNN&!A0{rtMKtE8MnCykOJhd0&=XaMC;#I4LN} zMf=2Gx9=`L=LDAiU!A0uta&=}(xz$KY;LI8uk`ktwrTplKTD7KSu)r>`q<L-Dp`ed z<(X8Y%Xw`)aY~CLCs_9x)CcqkUs}O&BCTli?0Z+P88@n*&Cm;)+WW;{dw%)y++|s* zj2{j<JoxD+e_`{yZ+p~jUP}5`J~Gz%en;JoS?fZh(3W|hSytF{ue#7`v}GY*t%i%T z*2T^slSK?X4KlVCel9`9J*!*z<<BlVD|+eF+&?TYobIo@)O_yp0^P0ZUfRC`rheMI z%xJHsU-7ETb3c_V7eBk=gIUz^qGg+UepUW^VmP@{d-AK`MH;;?gTq&ypMGe{s!-ny zo8(*Pr)O<l9`{!(;;`1WDPe^Q4z7y=4&DfKo7FcpJad}%;gZ1UnI@~lR5QXpYhGA! z>x;gg?uszsUE#Afm8@yA)kzYrzC54FbZv=BmRzrtyog)i%95|kV`X=ppXM}mRozr| zCwu7&=Wdm(_MN*bDR}j*tDB~6lq_8n)f#!lCa&1)xXen?nWt{u{j_cSzQ1ezPj_8B zb||cKg07m?{aIF}?>gr$DN1M9pt?0?t<SCtwKLL|t=4@z?MvK^ziJho5`I5L%{#MA z)1w`$d?x;zxa94h?$UD8^*_VD@4D0buC%-K{u?*({r7nF|1~gM+_Rkaz4^H8LgmFA zCruum+V|<x)sn5!iNF4t@BUdUdgR^Kc%H-G4>A7RVEowQ4%6lLdsenQntfxp)x)@J zhxYCYtM}%*o4wQcuxQ@$=D*sH|6LP5VrO=z!PM)~PuU-H(qi&cCHGu;UbQ3a($j)= z-JIB!u4hj2-P_QYedmdM@y}YNy0;TLb#9-ybZza8J-OAzx1XABzFF(Ymo=k3Jmra` z@lnsVdDZi8KV<*B>bTXt&D}4brT@v>dA3dN+U$!`&(F@>apqO%*`mKYlAeDuzwqhl z#|8OoGFP89Kiz6)vZ8V73)j<;Gmf|zd={A#qPkt;l)${gK1-Q+ndq74*WLTL_Mh|G zY?u1Tz9r9M7O#C7W^Ju~mbdTI>dKs_8o@WOMf@vXH*-x+#`|5jT;F^ZtUsF(94>s- zz0JfZ^6e8_d+Q5P+qRs#w04u4_l;v)`V6<O)y<FXjk;aK{mq?!Nmjw*Z#O>wGe7XM zH&_2wb$;=;grd&5GN=2bFX(^ME6?5gGI45jMDw(Y13P2hH`VjrKWQyHsoVCYO?cHK z?_~yC-$#EGueXYrJFoQE%{_&E^It!hl*%7;@a%_or*=Jkk!QZyxHm`U^UPzlZa+6I zmMxY)Kj+!gPZd>P*B1OgIrS*-^$q7udGa&A%N#x%m(>^E_cgWL>Yg`y;pMq~I<sdR z?0n#-IPdDeHw8b#%&)(lw`rQ8T}i3B^!4X<)zdGp`}V*gw*P}+v{~=ol*-q#AO4H| zc~F1&o7Lf|JKGj*d2Bqt@Pzxm;$*w8$G=N_+EJFdZkB!R8O!@W@A}wXO}|ztm9P2x z=H-3gwzc0pz`yfXvZ&nAsnfq`=j;D@D7^p2cJtRA<@%L*)mKjZTBswnvg6mw^nYtk zssDMtTlUxC_tLrA%j|wI=Kp=IU!SvJdGVoo{uP;A#j4L(V%3eM{%<}cU-@Oe{a^R= zdcSA;|Ihrq<UcF_zpwKDSr;&#if6ngAAR#aquByxIfb87<+Ucx++cg_{neA2y}iGC z175cHF>xs{-@E^>^}+v21<rp;4+Lu;FemZ-U%7yB*MrD|54hM8xaImeyUy{RTfp~D z;h?KR{+4;oPh@s?aQ@Cr@Z1y6u9hgIrobbXz`N-I$Ek^2bwYnM9}2&c7x7Bui&Nx? zddR!&fzY!A(XfXiw-yL}dceq(Ad#jhwJlNl*MjH0XLCXqT!~GXm$JY|;i2fR2kh?_ zO3YJKC|f9Olpx8JBtK6<j4w$cZK0CgL-Bu#!g&i-^cG2XB`D2W$R4&x%}zn)pTg&j zqK9f{{}NP`+tnh+r=TUI^lxP%yPT5JHYKrX4>;TwX)jAq30lPDr1;NAN%!3&onMc% z^OQbJd8j*Wf`MG}zfz^wsqvp(V=EQp{>}R8shPLHP-(GgoU&QkVzWGD^R(GUV&~Nt zg=^T&FKU&ZB$DVWp}6KszhGPMo{~FOw=P<LinA6IKk~!Z_L7TD-4UBt$#!+gGrrDy zu{TyEal!L5Emr>?C%sv0Bh>4(YjLi@5~a?w&R!`Jwkn-#7rW{O+T}fQVOp}6@nK-; z{HK|mR<D%pw=H(-JL}~q?7C}-^Qp&nZahBcQk;&Z_#8|2wrX*|rsBO%#pjbsz&jPc zWlI7csRXVP4PZ+Re6-kK>S^#Z6}Kjp98Q(*zOo;BPnz5k43SF>H%bjz*W%LmG|1?Q z-=x&wZ%aa&R3jEG4c_-O>e$m{-PEXak0UQF^|ku9G%6@HwC!<@q_Csg{Hb$PoR+27 ze_QOVwuDVhHD*(4(xb;ovzDf4EpxiJIAGNhUoEwixU>|vwBWjlsk@f=DJ@HFOG_$S zmguJ%&owpl)$P}n^B3o&-dLlSdu>_nuQm_AFv~-C6HYCQkXo8@s?AktneT-q;a$&i z)s`3K&6WvD*f-VPL-dKPoJzRd(>SAJZgJ_!N=vfzmY3J5=RHw7H*v|FIg9hPgbMCG z3C>E1ZA%R_O3TVikLy#bxVF63$}QXOah}(5lc480QOm2gJ@>wsT5a{rUG7C8pL*dv z^=2~-`(LUv8J}s)T3-Ke*?kAKthUt5NzW2jEp19mYn!($@n7GIRI3%8L8*0%*iAm& zF4-1eI!~kL*oz09%Zrx;SAI)tU8J6#mF`!g;a;TCd1}RkQyE>$+)KJ*a-O|t%}Xy# zN+~OQUij<r1V7E5OBy8{iJsp$68B{^@uk|@t*kzmo+`9F`j~2ekmjsO@e}phd!?3i z|4R?ATanI`G2@(Od6#OM+sX{5%vs-7-imy=yeDqjx)ak5Wlky6h%9^N@0Zr`=%q_j zM(4ZC33h2qeyv=}refTbl)IMu>eQ2!dM}r@ty(c{*3V4&U$T;6>+UbN(?~yetSN4Z z&%Bo_&b=~Urx_rl`SR(BRi9F-c4^J8Q=R<i`T9#*8?D3^#IaAimoZIb)xTD^RPRmC zH?wIZUrP6HQ)>)bJ-04xW8P}pv{e?r;+E`u8FEi$+p{N8Y|A%St=#rXv+<i&^enaQ z$6i~=zK(LZe`w;ONt;$J3466wD{E=ji+ztYGxO5s>a9xq_j>iI)rainZl5<}=1sBg zZ_j6&y*?DS=BSu@i<0;%KaD=WHGS`1Zus|L`l(l$Y#K}BbWSx*SnJ2Ku58u1XWHvu zX}bJcHAP8djalZYXE~jzYqs}3$>w|2V(|Jn)0!Bgta)O&?*CF6Pd!~Mmpff4^~9?+ zS01Gwwu+K%%kJ*e-Z1aYrDdzne#@TImwoBb(m8%>Z&oF(G<$6EDlOrjc59W+ifK6q zt(I+7`<Jy^NcW<e&RwOfj#+B$a&K<3y~{Uy{!?;Zwv$dymg<>J^B<VKTXQKp;>L<q zdhcex%Dw+1qyLxg11r7f*Zi+uQY_)h3aiq3Iw|{#(7hXJ@6ML#y*|eF<d|@!pWdBU zuhZSMeeW%eUG@4JTWU~O=9*K>(=VmJ=6jzbv~H!;y1JyLJC-fp?Uv2Px8hP>?%iqH zm!GAcWm<pckoL!I?_RSt>}AUB;>f*Il>3fp#aFhMUxLyOJX_n|r?W)q`LBO(m*lNK zv~G>lnv6%2-n}`t=Jh<izyI>xKCSuuGHunP*Z++29A9+j&GE`vbLzT*0fT#i=DCN( zi`-B5y*n-U;mE90c?BDC{uOLsf9%3hZy?}Nz*3&S>D0PwlUz7<b8}Dsz|dg8(_g@J zxPbTg2OjGU-Y*RJoHy`TAL00Kz{melfPEwH<qe$H>;B5Q%udt&yw5=3_6OeT4Fcak z2zndxDi?aDY!ngyC|chlP;4l8zd$6rP{=>`d)@j?O`Sh3=}Gn%N<KFb{A?iey+Gu8 zi^To{apw)P(+wr04Mjf}%3n7SoBdHT{*@3n%fDS~`rc?U$s4IOr%1hDo}jl{*<UB^ zmwtgndi10<-{SIBmggw#pZr2k-|N!Lg;}5G7Cm`&DC_sTJPmyvuH)+%*B8vKQ+*fo z{_>(t2ds314?Vxzmiu{Ckxux_=V1l^s!TQ>xmEOaR?f_-w?EfqZ<zM7bWy5_@Kbg1 z;uU^Hx103aw;29cdYkeod)_|%KSgWLvc37TuBgT>OV5ARpRCQDeV>$)3zVm?vw8mc zoo^B2eqF=Y#tzA=KCaR|QM%cd{iG`U7N^U1bpF4Qn*HQ6(_|Na6W8!9uJI;r>08|L zP2B%qGR(h!_1i?pG850~TRi8RcrD-Jwcf-#I_=@TnBJ~+tMp8K>y=rXx71mguw66p z|NX#w``u%1vzAXe?%SLc*!?(AeQWWmwL$;41k2|KJAVz5{u-iO8tQHu9KSWpzBH`Z zG_-naXtQZp{nn7~uVK?oqaJTzoo=*rLwn@@(x}P*O2dzrMqK_Has6w|^Q|%OP2)a) zjs5>M@^xuEzgfcJtqJ1WV%fLFyRUeyxXwJg%R%8=qPAIL@U|5FZHdWcN$F*&#otoP zzooT*OR3(LI^8U@*lb5vNwoFx%<gSz{oAse&2r9v%f7xX=k~Ys=i4%mZ_C?mmV4i< z;Q!Lwg>RNIxaNQUmiPZ#p>}!E<FaD*@5TDti+_JBQ8q7iHjl_(B~r?j9lgEW_<O0h zd0BmVX|s7{|Mtq|<(2Ert2S>B3Z55`-nI0^_W<W_HO1z2>&xoIzt`O^uf4y$F8U<v zck_nN<qgsnO~1`+^(`9zZ*MmK(Wt#+<`RPz^@>LCikA2tZU5{mn!_#HqAl9fD>{q~ zRi9_I&)?Be{iAL5kB<5s-Rmv7nk~BZcSvow=viLTvwuhL`yV~efApT-(f`@v`%9BP zamxwPJNv#{O!{9jiGAlJdCMu+vpen0CWr5wp#O8K`_8HMm6MY#r|0ivO<FrGy>fd0 z&*_sbXH@T;yng4b<rb}*cg{RqIrDtwtmBolZ(Gj0{Igzr^St>x=bx^e``vQEV#|g9 zf6kq}*irn~0_m!G?7J3g|5|8owfJ(St^Tg1?p908tCn$FE%V>CWOnD1s$a|MtCq*_ zTGnl~YPQw#_H~Y{tya$8wYq=Tn&nk1ukV_<f9KluyVmXhweEb?n#)#ep6~kZ_w%14 z`|ge3tu`qCUa!A<!|z{nuT*UMylac~?~VS|TY`6Q3ieuR{(Eb=_2zKvZPCBCr~fY9 zva&$LEq=x#&V!Psr`pn5jurSUSY*l8_>*nd_15$q_t_?~?3Q0R;VauN<ztZ-T=s6? zohR}qZ%=i`4%h1zER|0m?$LhUFn@Qf$sd+FzayWkk7*x^iP&>Ef6uYoEW5v3?<#2v ziD=uETyvtH<>dN5M_;oAZ*cYH@ISrT=EVL#Nj-ng?sq%BxF+~Vb@CM(4>j%c)oy!| z_qbi$v*_T=OU<q+EPwW~hhBdC$LGbKv#V`PEN$ah-1f!qy|Ug~$k+Br{NLlrdoAv| zoLPSKO!MEP(f?|1FP?gp+xF^l+Z*<O5<-q$uHLifu<h;Xd+*;~w$t1#TITPS?KYRc z+uky-*&|+e<n-VBtN%Q{Z1d!C%Ps#FFNVL@o%h{XUh_o%?=Js;cfDQC3)kG2w!6># z_i^~%=aXx1H}8w@U`<`Y`s((dJ-hej`t5m8&ihdL-~RK0hxY$VpRn)w^?i4)@1CIg z_hqo%b^e;`)BirS|9@8c|L4bh9vkmDIp5{8^4|}a?d}WLf9L-H?X>mR_j|t1wmH1o z?vww%FO&E43)#ws*83l?Z(J%Ic4hzH@}qw*3;%n+|KIoef6OiY@^&mjG8P*YoLX6h z&0<b`NOWlyR`i>qu`$WDhubo0$&Otg7rXUKT3dbL*ra%JvSR3}H$Nt&o@`dsKPJN| z^z_Uev*2?gH!m&sn`KkZq*`?)<I*B;UACVeAG5Z}`?bn#(faTzcun-yva_?MYKPAa z6|NJlzNUR^W8&p)tgolNjoMsr`<U+PZ|m;tDgIb?_xAMl_qR8EUS#SMp7&s9sJL+5 z?;ZNL5BCaMFRQs(^z78^<9t0_UtKdUF7}*mRx4GSb#-;*_OicHWjQxDXI|e{D_x#< TcX#FYZ-1qKWb!aFGFSruYDPRd diff --git a/docs/images/scfg_xfer_proto_fdsz_g.gif b/docs/images/scfg_xfer_proto_fdsz_g.gif deleted file mode 100644 index 5e57ba485d0610ef67ea7e16f9475de6d06b34b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20627 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 TNnb44I4qe}jG2jvfx#L8UE1SF diff --git a/docs/images/scfg_xfer_proto_fdsz_x.gif b/docs/images/scfg_xfer_proto_fdsz_x.gif deleted file mode 100644 index 4aa01f278648d8e5da61ff925d74ee748d255f5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20293 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⩔PqB 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 diff --git a/docs/images/scfg_xfer_proto_fdsz_y.gif b/docs/images/scfg_xfer_proto_fdsz_y.gif deleted file mode 100644 index 1c03f037f4b0c3e486eb3e780af4d7cb2340e195..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20612 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 IVqmZa05vE7IRF3v diff --git a/docs/images/scfg_xfer_proto_fdsz_z.gif b/docs/images/scfg_xfer_proto_fdsz_z.gif deleted file mode 100644 index f376a12eb73bfe4b22d772b5286f1174950e61e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20627 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 aEJ=M@lJ>PEeX(TYuw+&-W+o;E25SH)fh$Y^ diff --git a/docs/images/scfg_xfer_testable.gif b/docs/images/scfg_xfer_testable.gif deleted file mode 100644 index a44d1270f1316f1d7e626b858409d7ff1d4922df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17503 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 XKSE~=j>=3vV|3Q$vnLM|6N5DX0?vm$ diff --git a/docs/images/scfg_xfer_testable_du.gif b/docs/images/scfg_xfer_testable_du.gif deleted file mode 100644 index ba61723b02f812afe176b4bc98294a27b9c41cea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18580 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 Iz`$S)0LgY+4gdfE diff --git a/docs/images/scfg_xfer_testable_zip.gif b/docs/images/scfg_xfer_testable_zip.gif deleted file mode 100644 index d09a7d82fa6779bd471446d6c427cb0f8d5e1bdb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19211 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 G!5RQ*J-Pq@ diff --git a/docs/images/scfg_xfer_testable_zipc.gif b/docs/images/scfg_xfer_testable_zipc.gif deleted file mode 100644 index bc8f1856cf76d3b70bdb0e38ace801aa7b017665..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19185 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 diff --git a/docs/images/scfg_xfer_viewable.gif b/docs/images/scfg_xfer_viewable.gif deleted file mode 100644 index e4be449c4732e42e4d16f9ceada8b115785c10f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17007 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 F)&M-GZjt~1 diff --git a/docs/images/scfg_xtrn_fixed.gif b/docs/images/scfg_xtrn_fixed.gif deleted file mode 100644 index 3e8c67965cc6ee42f1a5db0294bdffc143d2066c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15932 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 Z&35mN?Z0of|8MNTUSgH(;K0CO4FC~8Sfc;{ diff --git a/docs/images/scfg_xtrn_lord.gif b/docs/images/scfg_xtrn_lord.gif deleted file mode 100644 index aa3f3410a4fc3ce2fff2c17c7789f8b197414538..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19231 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 Y?Ay%n-?whwE8D)`cC`ct2LppO0Ms<Tg#Z8m diff --git a/docs/images/scfg_xtrn_sbl.gif b/docs/images/scfg_xtrn_sbl.gif deleted file mode 100644 index a9ff0e0a6a690606b7fd56394d7dd9ecb7a28d26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19441 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 diff --git a/docs/images/scfg_xtrn_section.gif b/docs/images/scfg_xtrn_section.gif deleted file mode 100644 index a38d67ae99190ba181df21ae9dd6c94e01e4cdbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13721 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 diff --git a/docs/images/scfg_xtrn_swaplist.gif b/docs/images/scfg_xtrn_swaplist.gif deleted file mode 100644 index 6142eb127dc0108e3de93a65a2836e9c8dfa3927..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17211 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 XS}m3vwKe<Zw$k5XdSN__j11NQ#7N&` diff --git a/docs/images/scfg_xtrn_syncedit.gif b/docs/images/scfg_xtrn_syncedit.gif deleted file mode 100644 index dc1cf41531b201ea467b694e714296c03ebfec94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19501 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 diff --git a/docs/images/scfg_xtrn_timed.gif b/docs/images/scfg_xtrn_timed.gif deleted file mode 100644 index fe9a883839a40c8dc37386dc169d599983d93c4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19095 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 diff --git a/docs/images/scfg_xtrn_timeopt.gif b/docs/images/scfg_xtrn_timeopt.gif deleted file mode 100644 index 1ee9ddda5943b014198505fb039bdc98d4cd342b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19898 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%0A_YWI%& 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 diff --git a/docs/images/scfg_xtrn_tw2002.gif b/docs/images/scfg_xtrn_tw2002.gif deleted file mode 100644 index 229044bac22342266fedd8048458f210947212df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19910 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 diff --git a/docs/images/scfg_xtrn_usurper.gif b/docs/images/scfg_xtrn_usurper.gif deleted file mode 100644 index 257ca460d86641b491df78f68837caef936e7582..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19642 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 diff --git a/docs/images/scfg_xtrn_winos2list.gif b/docs/images/scfg_xtrn_winos2list.gif deleted file mode 100644 index ad7de6cae9651c964de22942c08678dbb7bf13ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15395 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 ao`$V^8mIRxZQZjxz2`!DY%DAc4Aua4fE6A9 diff --git a/docs/images/setuptype.gif b/docs/images/setuptype.gif deleted file mode 100644 index 631b3f4c3427786e1c723ebcc6e2080b0f5650ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29268 zcmZ?wbhEHbyw8}*_?-a)S{NAqGqf-;w6rk%XJGjMpF=U5Lo-_dgo*_WizPs)TEeng z5rkS4omw=VS~R^{G`)HZy?P9TdJKc6SO!h8jGAH@HOI-x$th}%Q}P@y5L)V$y)-C$ zX;AUfpyIVr#cQLg*G5%uO|IUW+_E*fWp8%R-t3-Z*;9@cPdQdR=UDNabJcUsRWCgU zatlLCOA83MEIrq<^jgc>Yds)zuV?GMDIoNG%HHR5_CB9;?ETVX@0Xr?zx3SqW5<qN zyLRqB$OjDnN5N<a5D@}8pd0|o3l1Fr7`jCil_oqm(8R&7WpctG@o+1jveTR&8y2~A zi|A*aIU%_Cc(1&5lZ@u3loOLx0%!T0EL!S4)gby<jppVPZAu;;Di#F{o&NJVgj6_Y zIWRKKcb%*kut9;5d6~bYPJ+VJgXib-$fVqT^?<RNJ@&92gY`GZmW}C`?It9Y<+5<* z-#;|fz_ID>t_tl7a~Eu9ir**76uv=V#)gN7C3GS@&fIWnJJPT0ea>Mf^HZK_y5%P> zG&(;&KhL^D>}_L7`=u3*6#-|fOgpYCI31a%t5nu;OUbEchpm&#`+F*G69feJ9O)1` zI&peL-yN4uVbwW{EAo<lb-q#!SYWYmZ}oSPTL=Fw4lvxer|a{J%ggf@HtqfW?d{#| zGyM1O>;7pF_2m3}rek&g8IC=e&&zyBfVq+7-h>6bTxKU0G+Ep!aON|6V(_rV^1*~= zKFPcphuf{*Y*^S~({jR@&*sem=PvC}7o5B8*8E`RH$3;FncwW*kHdX7-+nL)*#DC_ z!tcmnm?GdICfOq3Y1Dbdk%3`Bz!c`I8xBr#iRhf{XCvEifYG{DQe*}fPw2CmUYZXs z2Ze6+6lLbkc^W(?;pdmB5wR1mibdtlWt|>fd{R|Bw&mK=>nt^%53Vn2@O8M6FhR*I zBB?vHi;+#zqD^zz<j}I2X)`L@Zl=wjS~V+Ee$J{W_O%<?Zs+{ld@}5I?#9juv-9`8 ze0ICwu%x&Q=P^z7HN~eb*=0*EFKoD5cB<-oY{kQg>TfHaFI^y4rG0??e)Z?0;rF-e z-kCnX?(anIgnEWU4GE3xt5)kZaT#g6=M{Vuptx7;+3JUFzpG9twp%mAEb7wQwBu2? z$)OX6do1+seCV_IwL^J=BcG?rL^q+CDU&^{PF{2jQ;KYvX31%C(Ti=SO|Y}#M3>9Q z4UT`gcuGk1i_uvV=OdpyjNMZL&#^3IF*&cpJ9pv*j>Hn<^D4{NT)3?HeofJ(;Q2KH zSIqwBe7YQ_U0Zt9F__ovqSfs^C09+4#~5FeuGO7%MXPhI$!-4B+AVifXUdxWyJfs{ z@AiuY*&-D;Th`l_KJew<XUf=P{_e-)3GRA7pG*nQ`}uT6`Z}{KG1u?zyq8)1w(@-b z<GJP67v`VccE4SF-_F;K-+e94rTl;U`R(S_^Q=yoPhC^?>;Sv|pASc}?X0c``ROj5 z;^H#X=JOfnoi&0XTu*8)h1mK3{dz52-t7Cm;Pus?ucpUe_;g2l$=`3UyX)<KoS)8b zJN1cs%D(Rp^8HKyea^oB=h~y@c_%-8-~VCiyM}G2WnYWkFzZv{E8*0f$D;0Wkjw5| z?o#gAm(6w@V5wVIx`KP*H3yHad*_~MStOjuZn(pE?ajQrUD<aZ#7G?8t@xo$+h!h@ z=BESmB0seMbKp^WT4cWC%GI|WN!klvmUK9=CgqmO$tbc}em4}JCy=^hcB0rxHb;%7 z53L)bAMsi4n8cp9k;BPnu~hwu10u(ATb3-oEqQRpVX0daIwM?SxmMmdq<74qtfE_5 zKKjt1^9Min*Ohqki|#n)W))PSXrgl8<HZpJzE6`%L>`NqPe0&XC(!R9{Y3bDgs{=O zzMhJb&byOtoSdRlq<rLbr%tEC={W)ir|np?R4;$$>6lNSrtjlP)6ceKV7Q>bV8Y<Q zyC~$Kx7raeyFxjJnoX)3Rr3{?rl^_io^JE$==qskTjH+%5qHqod4Bfg-}nEYvD{nM z<zM^eiki)0_j7q!o9BN2XOe#5&dYP<yYgrMbGiTZ!OC+byZYyGcFH*lXdPh6yS$K_ zH$y4<<nF9Te2N>7q%xSDy4Y9sWw8S9N)LOhGto+n3`PnKJZuKdj3*cv&R$vY@_?rM z`MK{DFJ?cMvG15LN9kkUr7xMhPj75f6MHwO>a=E1xVvx&-_}N%9xYARla|Ys)|ChK zdgzo|URqc6b+sJpGCluUm!@v}vec0G$q&1gW)fbyo!V<2J3Ni_%V#Q?`}B8|-^<SZ z`?x+VXsAv9ccjxV=U3_aOTV>k7_+apDt)PbxkUaq$7=g}xeqIxxlby&S58>_Nob9d zC_~0xFYk@_gc#C8HN6wP4r*piY-!N>w<P%e4EL^M(^iB{dF0<;9=&ekrd8Rgv0=SZ z$M&5y+b(IN%3zpjWZZRR^Oidrj4TFsUj=>N#h|gaY<u+S`4@ziUEjK{!ZrF*#;mJL zwNl@*thP8AdTgWGq1dNtD_>X{TIsG^`9y_fy+-`ps<j0>THpI!Ja#$Yn#j89>ZNW* zQQj|urWf+J6_l#V?EKIrUd(8)Rwr=Pt!d{R_6jX|&zEif;NGs%oaD=j_4m7u*v^`? zJZGv>1Lw-yKetIttiF@462I-JPU6%9)}M3yY_uM71Xt|o?cUJZKj#T&`j6=cTy(3> zay@#qvuxR)y+(Cccclj0+P-4ylQp^DtM3QyGux->X7I1CI%mi1TOW^VJu?&({N&Z| z5Po>s(ajO*mSGyVCr#frWf@PF!wV<rUl&@}89klh*-#+GGAsP!yUAjU0t)krYcKEq z@^eB~<gK8v`QL2PmpS*o)SNnbzOC$oAamJQ9bD6{KHYQ6bp6YKkoCcHr(KI%mOVE+ zkbT?i_0vq(C`(1Y$(^+-Bdnvi*K2~i(k?cWfR_t<C9f<f62A}`^lUS~FY{!#S+`E} zY&VLJ%KdssU|)O9+k)$7!hV^xTzhxyQ}^BKK+j9jZCQTX)$Vq9+<fPE+J9@g*47^{ z<bUtpJZZJ#w$pF-NV)9Vqq_IoHbLKpg3VuMv|Rgkg!gR0bJt&w)pKJs{(ZMi*F9gh z%JqrNp3OO~=J7jIw^+|spLjb@HO}xr!nWC(%r$w}^{NkY##bCS_xrL)TK3{iyI)4O ze4m#6KXNDYT~R^0-=`g~w(Og?Z0B^_*!**gB9=`&qtmt9uSjh5hrMb4f2oVknRrrj z&V{9-<;OO=l<(Sa>zyCI>+aNZg-g9Jziep#)pd4R+L^FTeaTNY^_23ZiDuUx|COdt zV7~I*BflxH_q^Ty<adPGYOW(a^VZAU+g$th(sa9vfks<iX6`I}m$m0bJ$ub%*8Yl; z=5wFh)eBD-+&Cp8{&7d}d-EHX@*nO^4mwkJ=Hr8#)sIidtvx4RdFNH+{Euz-H?bMb z__y`{zddIzWm)gG4BYW8-v7&u)Bhefov)c{_TgjnueF!DgkL@J?b#l=TJ~dlozw<( z|C4jqp6~vc=6CX1*vaKFVvIT4pZUyHso$6ub2hbLe``VC=bX#owHm5*o1O??QTJW? zRQS<#?}yW??w992*<SdJz2dZr<%#9R;S1f{oSom8CWU=AJ@q~Kmvd?KviO{3#yl1^ z`<L1|rPipjI|PP!xL5>#FD>qLNoTw6!u!#KMZs5id#uEc*nLN0AC{Fo6K_4VxjL?; zIzggQUA_7Dl&m+&c030I_(OA8r}!Tc^S}N%f?;V}m1z3{v4FB4Z4;)pPZQ0m$Y`H$ z)?z7<o_Z{m?MLyyT=v$k9UYh2i>$60?`DmDE81{oYN*?nwCT^AlG%$L+|n|ggAaYr zKe07$I&0_T8KpK?S{7Q^L<TXiJm_LA$dJ8JXDVQ062QQwz_3$;Vb6_jHV0<o0v00$ zW;cf(qXHkM0A@ykIOYpI7u_7Se}pxw_qv_P5uX}=rqt}FM(?ZkvS}eLOFEjZHCh<N z)4oslbd9KBVXVp)v$=PzWa-l`uI~jd2@IwWy84V61g3Sf9k6J1V{UO{X7XfqXUJu~ z(0#>p0&`?6qXWaGuM=cl8P3nJH2YB`_@nb#Mso7>3N`Vrxfu=C5!I5Bm09c!trDeo zB)XW*TdsK|voh9-1pc$R8Cv!Hd-^7KmR%9C7s^;7nI_n+oWNws;6B0U%GC*rw+8;o zuw-vbGu&QdCebPVGw$=(4z0>gc~AEvsx3Q?PkF;u<5$_`x1zFnM@`Y^;vx~3UlEf{ zJ-zp4#4>Q^GG|T@lw|nzB9xDFqT9;}Zeo_U>IHf)qvvd&bah3gx@U1{dgsTfWoM6f zPTOu`Dpnd6UZlHn>KXO?*;_q(BrH!`#Ld=>;`=#MhIN*LsxR|}z@uAy^rreS&zy4B zg5mg;35%9bRBq1rbtU`JlI-c%?6&Wmz1`FAUr4|~vFwd$_4P+>YRc!Fm^tUv&N*jp z&N<gPXP>ZfM~0wNN``2AqtuF6wto&Ry_aVN7EO_7Wnfg8_gIo)#m!mgB&Kj_#?El= z3Vmd~N!d90Wc9)8(dCzm!lrxvIUe#LqJsHF>ARKlPi!x4OP{)t)yUtdAjf^KmuIcV z_r7|!$qMb|J&!}5ybOF&xlq1z`m;=*vn!?_nH<k|ed1fSsqK~t_a*#dEN9HN@QgE0 zp1nLK@p#je?WVU<@(-qVsNJ-Taxztx>QiQJTsVEE7|Xm~kv2YY(+|s+2z(4*|12xb zqHETaMVjh;$r(#OJ@stLn4!ALda_$*$<c5Q)&O&h$OD;?dMT>bpBLNzn6&DKpo`S< zzA2M9PUW+@RWNH6x9wP@*){2lXS0!2+ANE-e=D~zwpFd@n6;v7*NUE7EBbz|=-st! za@f)|OS7V?m6<KYuV*Z%>#UzAG2^Xkpq_Z!3AYt`!pZ8lmi{bHi{rG|<}RGG%60nB zRAtZAEZc)armx;{tMiFRr;huKA8yN)$`<VNS`+_b{-2pk5A13=`D=c{$~AU7@-9Wq zztWZOUSWN?Qc(F-f&Zi>rUn8Y6P9fD%y<~J?t#?0`R=}a+t;;)t+Ur!_k7i~Pgd){ zM6Lf;wf@Jf^}lwl|8r~ozhCPaq&M)FuNB_7VCIdGz{={%<W<R>H7Y+Vs$Q-1^^9Kk zswU#+D$&^+U)`8dvTCCscg>p{_0qei#BeQHU@=wy)rM`eI+N7@&Fm_7P+h#b{drQ) za)&S@U-|BhOG`Ghv(GmR*}Oe!^`zy?EN3O;M=kw+ZBj(~@_dn+6;g{2pW5VV+^4TS zb<dONzP5&aZP{$0IVxgHELP7jJQB`tI%iJXvWloso9_8chAVfbXYO9vUTV6X?dr<c z6~d~&D+P8e^6@TXo0d9Z`|8G5ovgpM*Sy|j+%0^5=Z-Tw85tN>PLSR?$$Dq|t|hC4 z*Y(WadAxHw=j&v#r;ZKL6N7GTuw<XQJ3KyM<*Mo8m0#MsI%jX*@OtB>)te_+&fh$H z^QNv)YeqF2LA3-UHK#;1&q6hx0FmH_BEg2Dd7spx4vI!Qid7hiRUT5$dZ?cJPf(*w zQKKbDqvW8*J#L96M$P6ziD`=@rYC7m-=sPDpyrH^nsYAhoBL4mleN^sLapUZQfoFz z{d}#pK~Z{x5Yr|{?d^ry+n8i_2+16AlsU9e=D;Qy-ZL^6KFZuwJb3bu?9GL;cOL58 zW0bpGq$}4WcSlJ6Hj|#p8hN!p@-HUoX}!^V*QCIn#B5fe!23wyOOc}ZBK@DA6n`I5 zlq*tFYf@s_ti*a*iF2}n=_3Q~#ma)phSo(Y;=w8slU3X{8TxEe39C68I_IdYFpJ|Z z)!ovWwt|_Q4I-(Jgnb%C$`+}4Y}ivKq#pKBIO?G=-vb7_j|}qedn^8kr5zM2zIeR+ z;NE}jpTxU9i8nGzv<YfXUL-L!NpohA=EQ~jrX1Y&cDCgE(~O_3_s<WMTDDN@=j#1y z7fJp5y?=9)^mfAoy9*EO-lTopQRd*K1H3*u7X@W6H_D3L(UDwp@KGa^%$n1eE}hm& z(3L+UciZUDr@%uGi_ZK`)caMar?p4#91rtHA!d_53T6U|UyAfCaujX$oRw2jVsuur zI-ulib3|K6nR~K<*(U?5Lq~jL3?+n*dTlb4IlQt>HPTVb$anMZ_(!{)1=U;|88U*@ zyeBevA5`PIpmyr@v4TyaybDC*E{aAjRKFZ8RvolAk5QvAQM^P^yken7>!-b~I{Vsn zG`r78%={$r>hwR&H{FcW9%{~J)LPPX@@w|~AHNxwUesFmP-?y4fsIT|+aFzCK1Z94 zM`m@5%z+{qejlbIMLI$`OeZGEUOgy#wej?YMW>%R>K^!W@U`KYyGduhHOile(KDEE zNOO;#Zq2oeHfM!`&I&mx{xnjw-g8*aNJ&HJTxqVslbCZ=XAPdOIbyl#obcmw4oNC4 zvgbeTIqEa%M#P?@VP{lg-)vr3Rdec;Yiv}pwbhCl8k6{|SE-lZ6xN=<ZS_RY9aDl& zFQ58yMyTZOt*y=<#k>@=J!3*TdOSO(WNeasJ#m@tiY>7>15~%xOV4M|-lgq5X|?xO zZtdA^r*}2|uAcmM=Y(3D8B%w1{;_OaG~<?4#nRfW`EeB+4BEEnd6iAgxN}?f*81v= zPTadpcGroS-n?}8-fPu6*Gsa5t_I9LwpGYAz<foUVC((eX_*Ipwy|H`I>qh&Vz!); z759JbwV$H;pvdBWiFD4NSpSBlTi30=tIfT&sdD@L+iCCaK0It(Up#G%LBx*U@H<O& zljqh>G<;Q|ce_SIYk~CdO(Nb)`%X;cXPmt4@k6UTo96D8qt7QUn7u``Z_&EwEh}SZ zT&U{(xvV;L`SLTmw@l|fyrs2d`j*FGah7ZMwjAI4q%>tshxV%W*UMeynj<x5n_t<r zckYJUFO0U=PBk@L?e1bDuTglu^6A9M%?in??Of&m9K0W=Zm!SW=J0WEQCMVyY~XgU zseQ5{_cbSHe%=0P-^{juy3aP*ZVUQtWt{c6YWKYvDk&}u^A>Vi^6#n@*q$B~7Pfk7 zSVNa1SG%x1<2s3r^<NgZarW66SS7hEE&6`)+0T<{3{@?<>Pz+b$_|uHioRE@G_QI; zUqKREZOP`)Z7i=Y`9(b~eWf)uZdKp&qj@drURK*bzkYqCVevQrZF$=wghQBK1nkM& z_U7G-r|;hFORHybopb7P_7}VD>z2Ly5I0BZbpEUKCjm$MlGxr}G=0m)AN15UOvf~} z>)XRmJKrquTE!N%`ef`2)9VurG@hm{zjJfPt^IprY_{LZzUP?Z{?GM7E6c*jDT|H< zUNN0~>v`4Xtv$1ME|gUBNx7P+clE=Bke3pAk5@>viS<2_yqTu{ZR(-g`pntO#a1@N z&wG}zZe^49lWec29M4`#i^fIRCyHGwG+><_GvjN5KZEQIZ;h=V<d%ItC_FQ0-VXWm zix@PX=$=|6u0NxN`^)#RRd33kMeSQPGxl!$%rq&vxpVDoYMv$dZcFicX3??!hw!l< zLf=vjF8Q#sHEeBamw$9+ZvLuy?sry2PnzSK|J-a>#H@Q$cD_=+es?BsdP_)=#XAA@ z`{_5*KHqZ9P$*4toA%Z8e)_Z4&qfZ@&n2fOatcl;6Mffi(=h9&`sL=&tr3ZFUu^$f zzTeaLCHP2Y>Wmk^zHj<+_vt>nn+IiIoDlz8wqM|!oO4%1#vN6k8*IP#PigJ04hmY~ z^FcoE@ktAh+XA{Ax9mE$-M%|LsJu;`Tfn7@N5o=7$AKm`ZatNX4GW!{xfHEZW&|i5 z>JXC*+M^-($gP`Sx$eu1kBP1mMHqc#c5YmFtWU*ql1fmrv!Dv6;XW0Q1JBRTH_c*V za9DgSP|0J8mZ(&ShTw|8Y`LXTS6^L}G}*+q;NVt`21esUZEGDFv;!Huuda)Y3So=d zQFu{{^~2?*=O!umUV35~obNNE?t5O0Wx-Rg#&&)!vly0*kB{l4&dag<sFym;`hVWC zGc!M@9Q<eO`rb!!$CsD;t8KHUoxG*ycXAp#)6!UGPu`t{>)$=g6@3-8^5DX6$9(T- z#cVry^V-+W>F+<EpKrZhjz=o>*{ij`<F5JHT9r+kG57V~d$wD@US9Nbl6ZgRuCkMB z4xSeOVU>RG%$7#3vzDgY3mKT#XlXuO!sOs^=UGsmqsk2BhP@Y#33KXmyuAI+>1N38 zJ|`Ys9nM|fnLcmW`{@?*N9&(Xul0@y`|ip){QQ8ipz?1YW>0$=`6XR!i#R4UYCUXw zt$Sici&4>zS(99{wllN3^f^A2nG#?nc(-}|F0RX`gRDNMy}96Z?NPFz+q*4C^xe1< z-xMACd1Hy*VXf_7)-9CU`_D$hUFq|bR~kE(?0Tzd+j-{YitP`axK^n#*9e_@`eu{y zIsNrV44f>En_N7tqxm=Btl;W3Q;zIYDfJ7{Ir!((E;CQx&}~;T_PpFDq4<e2K#}po zW{)isl(bIFVbkr?xWlo;^umf?hfM<+#8X3bHN9I;EMuCO@N#35+-9>)hdL70Y&aev zo4KiVQ)`al38Czc+s8JA`rIy-4=Rs2!KGauQ+QZ)dQ9Q%qth3ZN+y4gEx!Ht`hwEu zz26^{3qRx7ST6hNdsG#tUB%hYuXsW?%NVOUnBQwMHe31N!mq*|TO6KUj`){jD&UxU z^;Sf(`_=5LA)-%fCa3xT?DdE{Xrr3@Oz+=kRiC9ZbX2#WF>oy1;p!Dwdh6(->~j}< zeVw&VB(1h>s?1)uds*+})!&Z1UC#KxsM~z=-eZAIU+h$UF9ql4-8K<$zrE#oz~0_p zxji@JO!v%RUj6&BF|+$**O?a|e>r>f^S*OQd#i)0i%#v8YiMKQ5J)IKYyEr=n-rVG zf}-^+ZGsEG|62CT#xPv>{0C9@n7~ku^ykv1E0*?6^*Oe2^GDmImHQ1Yua5uwck#)q zT<hA-a5GFg@TBSTdL70ZqlO0Mo?9^t7mTm_|32H#wV>(~C&z(53``7r*PL>1?JO+_ zPTE|ytnl34BR9hRW%G@t{e^%0_^Fqd=RD`UO!$70pJ)C4u^hbBqY-Z8=*Z9Mu#!9C zQu)CzR~>5YZ_Z)dmOf4SN(-Aiha#^5`>qSI=UUtr9`wJ|ZpU-%L(Rh1v(n{CSMKuV z&09Td_NAQVvqJ8!D{Rk>Vmy1qe!<>#<qaqOx-y<GTe5XoW2ZLLOO1@#sg9l&UN05C z_iR!YX$vfI+qi%ynZx<>L4jt2#{o0dmL6Gil{a&FaXiDy7yEzSJ)c+P!!Ms3p%lV8 z!P&bdg#Y^G-PcyG<e0#H$7#)qZOnh&Dp`Le{5&<?P3nZg<ZPJ+N!y=J0joAvNolLR zey~Zc+;O71jq@W-)oWJTD>oUr%f#uXswf}U{M4D$6#wCy*h+Q23Awia<~*7ySLq`@ zkAKQ37kMdrNoR%_gIO1+9DI5}$tq`6Kr4g9(`zrn<s)`->k3JxC$0Os;pmjj@h&^3 zAN1>-(9~-@S0MQLrIyO`O1D1N*O@#z)3N<@-8=sIep`I?UnkrA$#BU%tTgHK9&ypl z6+YePzoeKj8~FO?=}b=bUdYK>V7Ha`lghS*Hw1Gv4ou2AHC?lJk=@rFE_bgQPMmz| ze(I8?3-ix@a<-Z(@Aq~43EqH?C5|#2Pwp(+*3I`o^T^Co3rk!qyW&h%Eqvk?zU!yQ zyDz;<I2VdpDqgx;X?SK{!d_(q##M`C<^0=owQqTHcLqhAd$-JLO_=5Br3PiZIZ2PR z{-sRMX`0k@&u2BqQVAp8>WCvjc@rumSJ`()Z9Vbv{E{WJR(k!E*lBi2a3aT&Y+-ie z>$h~x+Ve`q5}Hp<KJaRaV(^|=QQ_ZFH;#RCv{=)*MQgXkE={36^Et_K@7r9IH-&ET zy0a#g`Q#;OrSP5eJ#)SJ4|(ie>9<Q}W?t#a>e$z5;=6BO%`4xoZMyZ^$K}Do`jw{E z_dYHAzUP_i`>LzA<9=)k-}ip*`s%l*Cw~{ay#4IdMR7Tw;}aVvD{pW*5isBTLE}8p z?FW88mrHFwuK82okcstz!q)D1wP~B`zbU`fT|DEo-rg5U6K5F+dotbSQh%yo9%|^9 z(>+;KpEboimg}G6JLAU^x5JJbsihQs+!3R|e$#ok=%#+d)F(>nGk3_w6&1{0^Mv)( zkriBXgaespM#rSFuRHi9wRvKX(qhi@8_l2P&D>j^W*mQAE%Rj3?7M%SvF0|ck*_qI z^>)rPYksjK@`-PmoULziyw5vgyKK?Fb$^^So)^!TPZOMZ`0;~0R-N^IiO+2|wpwYP z{&|$;kH>zQu*{OsT~W`!uAg&p)uY;FEmNoUP2YMW)32oSi{AQ=@$+R@znCvo(jcO@ zMUnHzc6sBO^AGG@v$)>(h!^L^9iow+m(5*q?Y`Q_pfhHs9fEhV4c<$t`rkg6-Ebn} zkk_?CJ9g{*<8Z$@@6z_IlXbP%{mV6bGRZFTUi`B1MbGD6(!IU=-gm!VU$YPS4eT)w znAIx|^41l!sK-3yPOmsD`>&wGJ?4?{@`|Inb%j0YF^{F=Epop7Ev#*yb6-Jz=Lyfc zqRGqmJkfTyJUu;nF^kLt21EA)XVUu`SdPRnTHdcbFT9|E^-l~VkH-Nf34@Zw#s^;T zCNMD1ILE;55c`Th;Q+JD1BO-6e;K3hSFvpS$FROSmMNkBzztP_#?8xPnKI`exOLmE zk;`KNQ^9oWI}h!?b3NJ1BzB|vzV3nV`;!kaHL3r3z&f9iM<MQG_jv|(qYpohx$k3^ znNjmp)Bh)5$pPk>*K3}ezi&L-e1Lh8y6sEne*wQPH#@K_7jJy!yy2JNo;nt#8Gqk+ zDliH4Jou)fagf97K=u9U3s}@1?ET;y&?L+w&w9fA;HSU~e}oq>uwI;Q#}yP%`#L?I zRpZ7!u8;{#@7v@5JkD?AI#plydH#OZ*Xi}YufJ~+JD~9IV|nABM26;H_v8Qn-p<JL z>wmq(j>i9+85wmP7>_hcA7GR|(a5rgk?jnlOoD^#2}X`N2RN4;kUhaDd%{8PhJ)M* zM!6e|avTQ*-!uw7VU(9RDB^Qa-r=D9heokKjp9=rrPeqqOgO0Uqfz>dqZ~_<0tb`) zpM&xuO^PLEXEt;y2rw;Z>YWkHHM@H!OF;Mh$xcfdtd@5CbJ`lPYnivz(gG{C7f$Q} zT?QfCYn2bLQ?}kDZM{)@_a<lSt<lz;8M`fd4)54(y=SxYUS^y9w|DQC-gDsd;lqa; zj!3&4tF}3Ae1zu(!%6QWr&sSeb9m3$*L(Os*j#$ua7o%$;KUJu11{H?8wDzCuXo!D zF4!xuV(;zCwt_GA-g&+EezxmF?R}4}?Ve~iKDBOqw)p6aY`ZtNkG{Tb_u;YKJLdiG zr1yV_X8iow?o06gFU9uXo9%zD-Y?d0?DuK=KbQCa+r2-V<$!btBh!{f35^4Jdm5QV zj>~Ll<S047ex;FPi39hUMxG}Jcv&1}6&$N<97XpW7fW%JXmOOA;3%=ivEkpDgR)l~ z6`mZF=W$Z>Ii$d$p1X1NtQ!p~F^A@KSk884P~YP;=k`wRD;_EvoKy}RVhw1}^RZg` z+G$y`)zS=xRl<ka1)P`u*k!D;dxN+0menWCdm6SETXQaGu-I~V*WukeAMdthvDqhV z<6v{jQRT=H?IS0OZCp!iP9?jXer$8@x6S#@E*F>?*X%js^ToyY%aLo$N3S;91|6}z zwR!K&-?sNZ?|r0g_fUFYWQ+In-AA9V_I|n8?#*tyx6E$uAKN9V9Q$N_EG1=sYRa*U znEmNX_W$nQpLNInfAyK;SC0K>c0c8FfHmg;yUlU#5O>~^<LB-)R=hdDzr<Z|i@V5? z<Co_+{;T`q-mv7L^dH8?7T=pTCt5;0ZnsPgH|{y)a7bZ-hth%*vzia7hcL|fZOL-O za-sGv7K>dIY^-!^&Mm9nwPLo_ir|y04qLrx@tiT|q^ZkpGn3usa}HZRImwx^+nU8| z$L5CJmz@_KY1pg1=a93FW5}MRDSMoAPPwGGtUO|Ks{6=lnZ4(f_g*}F<f6Cj`Y&Dq zEUtku0h?W1Lqc4`a!zkIv3uyf@2PR)i{yPTH=mAOW4Cw9zITsLzyIz1k^4-F&;COu zXAYMf`<d-?tmKSD!x@RIZh0aH@_F2uWZc>J_;C0fFU>iAZjL*zjPC^%-^(TkFQ+() zzd2sJ<Y4_4N7*U9H^2OIly5nEOT|f1q^ZsOQ2Q4P^=AD<W7*J7^Tu7Kmu{JbFd5e< z8&xO=pRiIXuMYm^U~K8CXJ%`;V5i=NjGc?P%rD+jjNG+dWAUcRPFqsEH@du5o}Roj zL3zuXUprV&o7(A`R|N-GJf3uSmQm5-mDhv}w>hag{|df(b8&;0w#wqAe>g*KJ<=62 zo|-7MB!k;HpjO^}>wK%NmzA5><U57zcQA}@m5$^#lIvP+mK)qq6;dM|7JYW6!0D?= zOH~b9ua?gaJ)dPT`(SW-ZkX3vqw5Mf%t~Sfyy1ni;YGUF3;!xUate(NzLp@g*)i2T zQY+N$_m%prD`qpzy{}&LFkNu<--RnbCg?WsMrd1^y8boOb>4F7R9K1kwcAD!c}G{4 zY&D8pdM$cuSoEs!Bav6rKZdQE$=mohVnXZ8bB|WdeW-o9W6Q=@ij|%bFFH&rSBlSV zTp3V$<9kG8sL^!K*Nek;2~4?qcInT{^F+;-9lRmq6k)}=eH&-w(%4(`Jv8STPH!?? z{#r<TMeXv%oLiT6axZF(GEbZl>@>aP=gngl66^Mg&zUQ+_Uo-ep;^_I%h!wE_I!M6 z-Ks5}0@`_%%fpjzm+g(He0n7{Rlz=2X_;)ygxu{Mzvuq%RG!r!@r}vs{wwVYrk=c+ zW)+Q7mP|C^IX&y;qVN@t!3Td`s^PudV|vTybI?DXV%<Z&cW-Q(Z7FNQ(|mQ}-`nR^ z%^g)`j+@@$sg6ildPnW|>^oP(9~?EE`IoQ$Ezeckd)K9I&H8osNNq&$-A&Qb=HY*1 z;x64}k=k~q=<<V0i}Q0s7d;J^e{FomA?}l@&UB?kk1e;fhOP{JtF6bq<wk?7-|o9% zzB1ja+u~M*Fx(2?KlkRl3s){^#52m>NS__oXte1w$GytZb?@FTv|f9^V(wkPr_t4- zVMn*#zZe_-i1!YMWCH&@nXfP6otDOOgvCAhWTb!l8oRXa&dmGGbFXog$xb-@;P@@` zkEy-<=MvW)+!9}!@a}0eb6i4+>1wyD4=!0H{Wv)#MD>PPTe#lFf675?Z?tDD(7v3g zeNG}?*t|NBN6$?{|J@_Kuu$RdHEj0`Sik8!KYKai)fDBl#4oOotD3{)KWX=!)w=YO z-{v2$Et{m>xyN?*lI{6Y9ORxzPG*#s<X&4a!9C0TKx(&GG2h<1u~SZ*RSOd=wCvd( zI(_Tel)Fcs_(?|_{L|XKY4rwC(}2e*Th98fPMzNIF~#3bT(2(DE6>Bf&9rXk?OjWw zD{npVTV~S4Xd164BOJ}aaIM=~Pt5LLa;n&qRJD|}x@T;LPqKu%w;SBIXI`}}!8p@# zL*Vb56-v=lA3UAO%d@c4wBX*fHG8AhAG)b0XS&Yzc5&X*6F(l6*xlZ|^>*dIeNSrm zR<93wUd(m7t}cDk(dT=9rFC>(QGSx}(c;;^8CvaiFZ`?07-l?UoRH?KmY{TQqi?i! z`MMZS(-}-`VK@KYGiTazeQPYc@Pd1<?uyq1r&r#6_O@f%C4=bO-N|f{9p^IV<~_^! zHqm)rW4GE|tJ=_yT91tWuAQ=M_DNYaj)h{InBtq>ZkQ)JW8>V+Fw;n#)A6xql?5)x zaL!9w^7e}LvE;dW+3jV|GUT|sx1}k_T|FaflA?P>_#ICxV@3&+MDxN|yQ?~vugzXF zHGR=d@q>ML7Vq40kS(<#Ej4W3?eMM{Yh|OQ*4=y6yYA=PVEv^JXP@KTeD6)V(=$6Z zhOB=t|1DTI=SQV>dFi@Iewlx2`&O1E+O9QVJ{MssHix+?L}Xvqx6;Qd`@;X)ZnWAr zf8#&ib8_<^9#fb%@5TIeFD@>dvvyhHooOi-=HAHEeH$VB?3P&O87EDybv$3^=4JlQ zx@s17L)Y~3(ww%oF4I+VkNoDp>Qqr)*fswI@0JU5J{r#NH&Wg*FJtSsiBH)cuItMc zUG}aucFStNt<is%{w)l@FJ<^6^+U<;M9sKuQL1Kra>5LGy=T;z0+i&x>d8;NSnwx| z>){G+?@jr_>*dZLOTMr!<6_$DUpqIbEY9Hy|FCV|+~Ck)6TZx&qDdNZ4>|7N(>Z)K zB9&j{clQH7u5aIDRP+D6KW906Wkpe&(nr<#pB^vE$a<H*bzwx^)*Cgl>Frn7zJ8Wx z@$G(v?v;~ncV?gc`24B?|L-Cv>j!3+)_>fQ`NeL&x7J7N`9<dr7Tbn@Vvl^bMXXyp z{q^O$pI)%VeN9bqPQN+fLY`6n=i_Ik<7_Xtc;)gv-s)6dtef7Mw5*4xe&Om_MYmoo z6Z&2}U!jz*XrajeUeW2#HXJBg|1r_oy2R^#)=aO<`%S-mUi)zSuaCadA7#fSE_oKy zwpKO%>;z?ZrU3ua5c|@!{GtUKU(?FJF<f|T^DeV%U0TYdYcXH%<>(rknTJJf-5~$i z#HTvpq2c4p|1Kq-|MKeCmF}sZ_gTD8`M2)-CIjV+_HRM?MIrL4BJ(#Uah8Z(|Ca3a zYPv;NgEQBef~D!91+lyM)~+oy&s}1Wx18aWcu;Cb6Q}6xxhb^=b!W7Szq-2V@=~6j z{NClE-!Jj1`=0z@|Lt*F-OrSNGiDhq4&-7;J13fA$+u8$om-#WwEo*=PS5wwiaExR zo__UK)3h1WMJspDd%kyBdi5pka;~(Jc`+-mYahM$y76Pw3ijI(dZ|b9sy66HhUrz+ zeKTn|_R7P5&MdXg8;_=jKF@407u(G)#^Na^)5tCNQ<O>L7Lzc?)`*R*@=y23Rv$he z9eQu;F|pf6?0;?VmFUTsVbEq8Zd|qRP-<D+?cGMH|0-WSJ1X{O)%5gD<vHuse@)%{ zCpxS~f7{baub+v`uTSq&UTVv?GeIMp{fF(npL^Qn5`K2Y|D3w%<-}(*O3I$gI&dYG zd51H}mnE96zq>6rGWB2ows%+h7Big-?rB|DcwU0#q#)x=##I5Ua^&lN_I0nA@#5}; z1y6qbjko;&Q}18#<ZOw!t247AyiPy4ynRc3p{Xx>hmuQ|fJj8a1BYfVPPLSZ3kwgo z2q`M*WE4C)+94&HbY#cH<YVo;;*)YLE-g9Q#V@|<iO0oM4<%DG5l5qsD(*~H<?q%g z3Nu_-;KV4v7<G7=uaf6vq0CoXGJ979Ee}!+Xl7%SGF@{`LSd@gKL#m=6@Ic>Wg52@ zcwE~Q%bl?Nc%N!~T}kC+J-=y6im$$MG(5b&pP89kC1yuQ!jZ1-Ppp;O^?Y_tRP<iw zBdLG)jHrD6oZXZ3ea<dWKR&0sFwOUz7W=21+AVHT3sX*N<?i058Fa_L{QNuLgkv}E zrChwF7x!oFxjp^5lk@t5D!oqV%et%g8ht5!we)M-vA&z{%AXZ&b-tfn`St0u2Ydae z+1OfT&AzI<{n<~evVe!bzJK1oH##lk;79h^QO6`th!wHKY>)MR-nu=gdEP?y#PX+> zCuED?Z)KmAb=UUAyo&p+Q*KsC^&MC2JU#Qq^_tgn-6q%Yiv`B}Gd@y(&|vxM`@bo5 z7Vp%rG&-tPC^cX6%y`nO)#vfBY=)rbqHgUVjz{S)0)H;-v2ZMZ*rk=$o)TMW+P28? zW9D?>-msU?LP7!rmnzRG+;($Hzpa?Wl0xS+&!EYH)25|VDQT@tnRv%DJ+*X>?9b(G zZbnfrS~~hpCQXr@XPMag-ZCR?k^a(?SLf_f4PEYU_fbuF)rx6c3JpbGu37mGk7laJ z%w5&4I62Wub7|`?tMtI7)$ckp*T+q=T)AXM6KCe)+PGVfnjXyEq3S$GZuW)cHh;J4 zhL}A%v3Aww#?y;e*}v3yy=L3Xm4R(_$F9Cv@QU%4-hzXhzQ?5ZnZ3N%_CD{&iX}#e zW+zoW`TOs7(EMvb){mF(HY^Q`^jd1Aw<B<FYRC#v_KJ6NUn)gtA4qZ2(pcvrm7~A^ zYu}ur<^Qx^<xih=>s9RDJ=^ZAm?3Ewxpbdo<ZQWKKS|dq!9Ia|)^5)|l=kJ~?OQC; z#~muy=$(jh+sb%NdQ0T2fSqhT>oX1I%Pz!6?9$eEOg-*x;FHyz^FHa4?(Pi-)vBKb zB=z;B+?c|`zvM&et$*S&f!Q;oN^;FMd8%Lbef%w}&g<Yeku{qaTAK>J?lPa;==E`G zgj1)an?!P^c3IWEg!+>~H<Pv1tZptlp1Uhy?eu?DH`@%CeS5L|d|dUreY@{k-CrW! zAMxR!c*yUUyQQa?f8PA>v0t^@MRWVVudful%(#8X?91m#LRTv+`dOI1iUfJawiY&c zOw=!2<<R+5SZK0!+|L5p^IRd>@l8*HeQziUs1&ToZZ?#A)5SDpBP)N}>fbRgO`mM; zE<9Jl6|>;IiqgT`jQ%CuHV;^Gm+w8ABakm|lJHH>V%w$K3rgFxA2J0Ww?5!8p`tz0 zgI&JJhSg3#*VO0X0k2QSEi0b{ZxZC&Ui4U3@<P6jt9EGJf){pqu{`x5J7Wq(X6SCX z%afbNeQ^=bRt3F(++I5_&0ZT(wq)yC9&f%)w->94Ze!nM7=C6K--9hjCggnFXy@#> z=rGesX$FIj8Z(>k=dFnl`zyM%|JFYt-rFzAHc#Jsw(m-2?B|3I$0twq+UD}`eDv$s z^VD;~WRo04eqYN|-5Ex0r?q=Dq9eRS<u<e)YEI=S-08J@C7<j0t}xlgsS|A89aZSF zQ8TLi<X-skScs2uz?EZ@7Nn@D_vU}TZ^|Av&*NNrg&2#{%b*iB&n)u|3c1y-&YwJ$ zA2h-6na={N`!}6$T-@Bg@N**T>&SzrzkJG>x+L7};C3sefXxfoo<0^#eC)B1MZtl6 zt-t;DN;gf`S1EV4%ycmq)-Vy<oUr((&$1<<MwUTY;c9C&mdectQWNA>bN+MAIa%xS z%u8G99q*{=*GkHEx0$3{z18&W)Y!1|WMIGe*?%IE)uuryz9lKjQW>2+x7?;P^rbUZ zW-xLDFx+}@%szVJ$}kRvhK-Y^uCXy(9dTKTVQzz}mdRAD;I+4wpDW>*l(c2lxjCZY zT652=JZ2T)K2tR!VNuVz{Z=C0wM!#BI7N)F)WnA=TTfji+p*xL5Cd;UL5mc}0fto5 zhT0=p*H)ikU|{lioyjWDuyvi7j-hYXzM@@AmLC($bNG5MuA58MJ92YhK~KPsBW}l! zu!&C!4h{3Z7%^{p)YMsXi@Q?hW=gx{nXa}{T%FDvz_2#so7QdHLxM)T?`~MMZO<y- zw^^JUZhdWI)xKgAT=3g-(dM(KC)u+;&fA-IY1gOC-5;4={PS9WB*aT?npHikUV&xS zq*YlRvlwQ~@)0>ArW6sb&b*-@eBZB|=eQ0ext!3cF!yd|iU?<Td{&1+sw(m7s_9$b z_`YY*tMQrs@LSJeQ-j;@W<~#Q`w~^Fy)2-&D{!{%sr5yB#ZUg(a-ZpZd8A0@niRfW zt2F-~SF<^(H2Z{6*afKuEq4W`3j3I5<s(0|Oe7rAE}y<7wtvT2mX3|es+?~7gv2+r z@G1v3@~pL;zM?1lN^$+~p2r83A`e>6of-GH^1%ktg{zdiR|>1P?c`j%-eTU{HAmMe zJv%c?^6bp7rx;@HJPYjJwYB!hvwb{wpUd`doOEZ4M#yxXCoJM&Ci_#xlm3OTdUE^Q z)eW+uuhu!UJaxG`g@J$Gm*TmH5`E&A-ke!m*0WePIcRs~+1II`qqchl#-9JVc)Qp$ z-`y|n|9&REiu2#MMCX#2Mn>yZKY3?PRCdugAogUbn{HY5y`neg9(Ho1+2%%V3}TkN z(C|P!Ex)_mDYs?y&7%zYGYU(ijY}Wr++O=FU}5I5=Lu4h>ou<akmaBI(N)}gW4PC} zxx%hK3Xgx!h|UZR*<>4baaQ<RtH{@zQw3g`w^u!6Y$)C){O?iwa?Yzd>Xncb>h{ zs+0Hb%6dL;DcuF%g!Y#wZ@H3tCS#72*XvVzU(~za%iXnRkBP4Si%jMT-?qf>etYfP z&#K0MLJSLD)G#neG@LuH^VWFxv=^?=uLdf$e0i<7q;Z#ZjUD4;&(?;#Ioc(%%%bwP z7gAjoPg`&EOn?2)GsShE=e@UiVXyz|!sNOy%bwRfSg1GQ*rTU!=4VZ=uQ)O}=y2^7 z&3%8f5``b{_P%|2URmyit+lJKT%Yl3&hb49BahwYWUD?db9Be?)~_`aOs3ww_Wou~ zM$E#+F;jL1+GV708#Jtm`*A3G=H(!r>W8}@+uhDxRXe+I{v&Z=p<7k|Yd<{Zd66X; zaCOJky6r0k7na<4`d4D-&8hcg6i)C?uUDMSZ1-SE?g0-0mXBY#niEg-ob}qi#xvLF z`i>mdJ7?vq&&qS^&58KuaXahh+<&a0i@(Zm_$sxxQe^K`nc7a-Yl>IxJLmA3-9KSD z-}TG=#LC#OFC*eiXR&m#eAk@nbD%@Wh{s9u#P5{A$03n_f4FQra+hOL6lc)vs+H3Z zuAI)LCfuv&B4iY&`E`P1n-E*<1@5(pIf6GQncnsE6*<N$m75vs7J2#VTn+&>ahtu0 zxqn4>a9;Jf!}@V4d$DiVYh9&3g^Jlb!#1j(RJ4+1X+0;kDB${pNtYff-dGwl@vY(_ z(Zp|mB{fe)_nq{X@9N>*IhnVx-zxTehJu8P$Rf9b_=MbJtaitg-YMzZO}QAD&@)HK za$%x&<pkZi3pK^OWEROx{y6K%#~J^O^X4XYo>X7wqP1%_+s?#AzNZ<(Sag5+^c=ah z;h>BDw8fV5q7p1!Bp)rfK65so+H{jsV!YRS-5<{II=Q&^=q<BrF86if4^$+XYaKDK zO12Q1zS#GerP>mwFyFwNN<4m7?`BL{6dRw*D`nd@XWy4wH*}R1{1&Y0mG!uGBU504 zf?i_Qn*~2~mUvBDEM%2peJ;WH)+}Bjss63eYYXoj^Ic-RuGj2kqDS2l54)M%ySn#w z&V4MS8l<)~NbhM-oCu4ZYKYs?5I@z>u%)4Ks$q7iu0aaI`yR&5k&Bo%FQQE~vhQib zMyaTMDla_mPks;{y-To=G2zJ4=t);Y1@~Q)z4dSD`j@G3kD~I|#)Y#b9l0x&$QQ{g zmv-Z-!gP*V^L|dTFH3RJ3+?~<)K*N&^k4GTUZuuBHIrk4E_te|t;@psp6ReXi(Dti zIF*aRREoj%=&PM+-22=d_qk>NJA19*eu#+5_Jb*jhg5upZf<8yFuSPg@h~~2C@t;K zLVL#L;wNV@YAFl$rOn$o>w6+w-l^l+YvQ<1v3Q<(mdz8KRhIs@=lT7DbRoY*(Q)@< zucZd0rF>bsyqf9hm$Og(uccQXdhRywPVKwrp94b^euen-J&bLYJySEchE2V`O{Gb0 z1<$SJjaC{hYAaeUrL-7joG)Q{eKK`br?18<sbsUc!Isa9{zYZvubVBdE7j^H-|_E$ zOV|tNUtEnlU$oS@D{W#gx}{L_GCe)%S?8e_ZYMJ)s;C*?Ypt2GbmF(}$a6=UCuVe? z>X`IR)w649q}<DwyiaaFSv2|RiWpNx>t_pgKTTe+S0g}5{gkTb#7WD#*DT5lyqD?K zGRbY_!d#)tTYFpd6lW(L33$iDw=-bIHP?GA(pf()TWER3yu22uc-^lr`a16e-CrpI zlV18d9h>R3%<^XItTNuGH-l_eJ!aF<tdDJfyixIk%{;cBGu&-5y+u|0@A*kBo6M7# zHE(802jAs-r3Xz#nQQ(&@!vU%;nU4LyA}P1q}~0pPQ6^(FgLnl&&v)wwSSpGF)j;M zNw{kI*U27ISefwa`69d3nd??${ECcQ_(HQTyIp9x-zuIYzm!y;S2jZGiKW_A8rqA+ z)VafC8YU(#7dsUo7G7<2KYEv@uZPNfiHDwSuh&d_w9oHBwAtcsvY{zq$(>b6dk(5j z_0v3>CpS56O;gsLBY8PTxu%`JvWmHJ(Vjz7*R9KLXuREiY1YZ2B@-6C7B|&Ac1UMJ zSjN$#YtCA|t}uv@bCciTl(XZK`YEP2tz6R&3FRyix^?E%noIZI?2~(TNp0<hqEv=d z)vIA^ug2+KOIv#_PxpG++UstqH6jNYWgM7#a&M{~xVdQUt#xZ}=`q|ga$q{J_Rcw7 z<}3f!-o5vh`AY7+ce>0r2k!mSeZaQvfmg$Qp>-@0dXMDRJ@Py7&}iLbuLCRwd8|GM zo`mT=jdEZOVR)9e?pfYC)(8f+n!FcD4r~p1FDL1}Omld(ERQXPfql!n*F_HOJKnu1 zb6`L5?rm8E`-^pNs}8*TrT5{N9tVg1$F>6>r1U>Yt><WQ;LutB*=+sit_F??4PS!v zIj0=>GL7MDRz7FJ`tN1$IUDjh=P+>f<o{g6z%?QN*CPGj+w{3sF#I~S{?ESmzgIQ< zy{G^0Sw8oT_y4vz{QsrTz`lX|$9snD2N-rU@JJLe9cJKBFkn91z^kx<*Wd%oZ3ou) z4Xo(}Z1)>jpF6PsyY0YNQNYn}z&ZH?UyA|%69=yK2Hc+;xc3|I{BPhsZNPux1OJT= zyw5lAz5l?^a*+3TfdIos0d_+{Zbt#>LIH)1Lh^>f?2QM6F5Hk~V49#Ss?NZ)K$l6w zfhpson0mwQU2B<i818g!WHM-wnEmmtnZsQx2IdtX@0m3)Z}`Y;aX{v`t}OREW|xNh zuL@aSY-DjcAa8%*A=4*$=XZ~!K0OXvrxgC~NzuAzcAuVyIlSo7d(ou#GOFQKn$fFm zd9Rn{z1fw=cIMsddwCkq*J*y%d;d<4qvXJcsskVPebU}-#L>X;>5>sg2ZQe8O`rQ5 zIC>g5K77&-e$SEfo+BgQQ2g`1uT|?gd-A{Q75|uZ;O9IBlgauf>+^pvW8g|K{&Q(P z*OCK&Zml<e{{HVf{r{^D{GavtKbrxgw1GAM2PW$RZi5ZX!3Hdsi&>95u-<3jDcHbU zu)+TSXWj|}z9$Y2{3U!6Tlk(hIB9?3e0_j(`3Jra4bHna@a-vZ*<HZ@p@IL*2Dj@U z-2ON4KPd3{Y#?x_z;n8Z0JEbP`$jMILP7R}S8^PLW~+$I))kF66wUr9nr-M`{ZXvH zP;$DV<n6bT#thP{4W&;T%DmT=H8+)e{!z|(tNizk4~2{r<%^WO4?NNPq-0+7tZ3cy zq=sjGd8+Y7Y%!bEij7{^ZPI8idizK(=KH^OF|XgTZ`h=L+f?WLCT;2Uy2|VIjMwX% z>l^&uWFWkaW6A*oWwY;UpTFuA8ygq@n5J*KKHoIj_*c^B)Whq|_vc$&&$oE~p6kVW z%YHM4#hb0x7u#(A%w+z7`Mk01VF#WY#&*sI?8h7IzZ>V>cW}7Pz{gVJC|tt9|Ha98 zi__{2&eG=mE+wwJKe+Dx;8y;{J$nmp`xlS?Eqv2U`2QD_tuNtccl6$G;$wfphvlPi z_gls_ts>!uH{%R%t#cJ`FBI2zkgPUj<|w^8?_<=JwNlch_oYl_zON0w|1tQpVaR_& z1#TmScvD5=b&A0aiuqfgroDR__b%Mo=tZBY>f*c?|5m+IOD|GCtf$d$#NJb((Owj@ zxJc{uJ1u_wxZRs{su|+HZ`J+(HU9S}{q_a}|My?SK7WbRH!9cXwAhwxyqVL*%w#%4 z>SFz$tMt>%E&t|i`&+fmqT4KU@#f6=W?A9|OoxrL%YQQ4e_*-(nbmm%?}N{|zm566 zY|a<|lFwXTC|>TQ{>9mU3zznG*Zl=<<t6T?3p}d7@J4^<oByTke}mWe4PNqAg2o#K z`JZxbJy&5}c%yG^Zj51-dPDW@?PBX)mnk<gt!b@!ULL6LP$yklXYEk8o>g}7uc#ky zSF!6g`kOY1Zwi$zdaPvh#BW_#x#`oack7x>pS7)1nZ8vu`P09)a*NkZMjic|I%n^A z`)J+Ub6?+=9bjLvsr&G!?$bNspBr)TY)klGWKh4mzc}AeyZF0P8K=xn6L({-kk6Ag z>!+m~?>VhMrT*KL$NHAv*H2B}$-w+!+VXAFcbhRE-)8IlA;;gqe*Vr`%^!Hbm=$c_ zS<t>=j`(($>y@szD~po16sOmee7E!{|1+Q6YT@$@{NlR=ly@zXFWk2-Xyyr%C5JmI zmw&HRW@Os&y{g<wsAS`^XshMbR?Hc{YOlXtvAHms!&d0b##Q3AvfO%&!g^~?|5DJ- zTWhbk&i%)_>eAL~y*BROFXrV%$y>kNr`OTF>4x#|&5z%``;-^^|6Nyjb=>WLn{I2b z-**4Ur(Z^QUt4f~_;I&;w~_g`<o5OV7w<OR{yUZ5?r)Ltl=9-es~s}>%cefwy>D?@ zmhy)E$_59nf1Vz0aPWEYOyxg^R$DqY8yw!f({X?0k#Liu=$his4sOqX7U%ydskh;8 zuQ}0QQ@(gh`DT*}ZpOvsL0eC35xB6W(!c8FEw}3AUAZ@Gq8DuZ#BO^*`C$ERH(BTU z5O32a@rpI#Mptg{dg7!P?p^WB&Pb&^@425*<ZRQZ@(Q(P+fCZL-)yVjZ2tS^>8)C? z^R{mO8@Inm_i*j!Z=bfk-?W{Xg;P-3LqH@j$%RvhLv&g}Mp9y@u&U1#2gQp=jtFb` zEV%LFpP=iB37RgGLK>BhdWvd>t_%4nl;$I<8+U1o<z`pExz^D;PP`O$>t5iTxTB%) z%8S6I201dhS<1(FmzgKs*iiWRRp^@N{3kDNiMC&tu{`wbLSosPK3U6(4WXyY*!g8` zUL0F`yLlbIT-DcqH(q~l@0V|67nkEnDVT8BzKJ35&X0}B#~n4;1%+5VCn~v^6yN(Z z)1#MnnsdI!q@M>GSyu5YM9e*4n#0N|bY|XOg@a72J0ukxCp9oKv+{_sq+eL@qmYfS zMnC@D?Z#$y9yyQo{}`;laom#6xv!_#)WZJYq&I{8!96TrUaN-8Fj(kR{o{l7mGub= z?dtyiHjLPCVgLSrJPaZe9C(ZrJ{(}SJdtpa)jGkTna^Uv24*hpJr|m}jPG1v7O;AA zz*)fQO~4TWFBV4@0VfVcSHTFGherk61RNJgatn1VY!&L_Q0kJIwPI190n<sP2|X&D zODFmnb*hS_R0*lgN}F|Q*_?t$E0@o0V)9zCXqs1+=CUI-t2EavI+dlpHs`}DHko}= z+-tTxiOJU8daH|j-L4mp4zAnt;#0T&0T$sNgTp+bXEw?UwfY#H(AfRPNF{5=luKUP zvbr5gF4k*1u0#a$GG0ws?Av%F=k!`LwxFkLcRcJcK4<w<reK}bt0lWdtzYjteQx*1 zGT!&QKOOS!xBYUbJAYsD%hUb;ZvK7u`@B8F|HBFgviMC599b1hCN$@1_FQn{F@5u( zna}9Uhr@!dA{Uv3Lu<@k#R5|dk2StAeQ``E<IKf{ty)zt7Ix}cEnM8&b?3$6iC#rQ zs#AlCKB-PiiCVa<EC13<FP&N;t<wv8UJ0EsI4-kUYuN>xn`c+=;acsx@x-LybKCFT zN^IZxX4Y!GJ%8?Wr#rC9_5?Wdy1p?yCXsw4@br{*JujEd7IO-|Z1lS4)hhelw>Gcd z`mN{ns?GnRjMuDvSM_?sL9yLAoA-uEzuj`tZuZ*^$LIad-F4D#_M2UIuUWs}{q$IM z?%MxpxAS*0>)T`>77e#4Ji>nccJA@Fc5^;$dFc1Ars$l?{X4IHjW5>}op5BIn}10D zdvwu8%jI_pFL|5W7G2Y3-}B|_!#dm2gTeYX1-sJM?|Hkge!EP?9e;Vd@+;Nh_sX6u zem3RHv#WjgDj$XZkNvgBaq`|D$EwZum95&meqPzjwQTdhU%hBQ|J(8F^|Cde+ULiA zfBLlj&(D>+_2&P5o7}!XZ;o)>*FW30{r!2a`j+(luYbyS{{Hx`_Fi-BuY~ji?`N*B zD_;D7x&Qh$jxzoh;gb2ETvk}0H@r|PXY=68oAmvn+s-u|)K2^xcf;}H*Z0l5JPF*z zE1Vg;0vgO@?(&{qwvXr7gccc<MNCsqxcp%hY)>dwVzDfClHaA*s{Jn}iD&0@SCzbp zjrSKTN`!VCkO}H<$uvp+;icjDQ}si)wN8TM<7006dKbEL_sIWUFvHQ}lwiBMOR@~N z#?gO&3!AM%k|k;_++KhESW)4kD3NV(QrqoglWfbwUuK*qm2U->6dEVVtFAn574&gJ z%a_Fpx|};)l0Md-6`m(0tKn?P7f{eMMOD@D<|+BM550wNQq=4{Pw6iD)Uo?<5`Vp= zv(+x6l6i@$`uQghD<-Y)-st^EUwozOBgxIP?k-XLs`t`8iS6?Ar!LE+&sv@=-PJ#N zMo+x4^NW*S*DiG3dm_d7<EDT8Kj8(8qAwgcqXL@cL>6+&rdele_?3ozp834zU%D0h zO7BXeFEfs$Jl8Y4<&$#la+`?jZ4=oOGh60~EY%Es=_M-VsW)l!qVF>5F3U9n`%Z;S zOyNoX-S+cbu+{oypMB=3IY(V?oz@oIs-omQ^H#`myRY*vl%%^o=eRu6N@R{S>nekl zUgz|$33XX)eHmtLbwyohYm=aD);~E;sTKP~*A=R+Q0$IiVYnm8F#BY7T>go0sb8YY z!%Vf~ZJWa@*KJ*H_0%UW`Ip81xS-Y5z0wIQ*&+^Yo80ilMmx<lYDdkfK8_;Mw;A_$ z`JOfWmbK!o_HT*mn{KP7t^2hm=V}1=j$6C7Y>t(klNEpb`suJsbM`!)mF@pJ{Q9;2 z9STbq|0^=R<-KmANavEN?@EGaxm>t=ZQV`Nb!DQ@qwlAM8~6X!6I79o`!MhOo=Jaa zC7#W`cdc&Oo(HjO;x5m=`%}y;=ap(s<#z7de_nmv{rB&?`n#v^GTooH=RvK0EwfHY zLf*A`;Y;tNU-pRQj;~m-&3QwL{Op8NT04xNvfi$6)k)g=_WHhT=?|GNt>Z=7XB;$e zTbmWQCqeA=^nK4aZ|oGF^Z4hi-oy35?{gUEJigK=zP84v$i;X2wbdJgmPt(eG)3^G z=^nEgd&*5WWk0?hrCXkRpv?45(*Bs6`oE{|eR#E~Z|k1xCXdaJq~?8|c%J9Jsr2`A z2J_yQZI(&XyMFUD_pyzs|K9$&$5I`!(=TOR)aIXN8lQ_!P25(HQ+eW$rBPIS_P+Hk z^1s{<{|rAfO>JTQR&}@aW-|+waxzv0=6e5|`Duge(Iu02o1LAL=XPnQnr`gTi0j_| zCjE`2TbG{Panf)5u2cVm-}o<Ib!FSE&$Bk_r4?V+dULh*+qH#PzixXN<t@YK*WD$z zAXGQ%Tr|J*;>Tj9TMB3URGbRCyC~+9!q#0kU8T2P>}b||y5sKq<yumk_uRX^es5M- z(R#t+Yp2ZwcWyruT5tV;C;Y4b%#7GA*Q{5ZUHbKw#+<PF`Z-H?_?U0poV7#5t@tjF zx!U@rRqh3ox8BsBTB_rG{e<kgKX*Ux%g8(UFa7nGMwu5Hz2%;%aiNl%gr9OAm$6{% z^q$szW#YqimB(JL^qHw9bXPFV+&8`bZ6Ukt8}`yq<|}^&gzT@%-;na@VE(>$ym6Zs zajAd1rTFjFu`IKjSDvl9`FC5sLYwRd$zy9X_wOpdaBuf5m#>*yYJ1-=@voUCetzd3 zXG!~KD{G!#+ZTVlQ@rB5yXZ~6@^?JZ>&nZQU%DeOcYcUt=0~?pd+()8U2>q=_Q&4* zcNd@i`SXtRK-G%=qF1N=Y&NgnQ?aXm&Zj4OTlMX&-d;1`_^|KztM^6c^Y2yPn~=D- z_Tt@+(zWSvUxf8nKZ^FqOpmYqRC-)3W#Ri1Z>L{+Ubfrr+s^a<O1-`I{8lSZ{PnW0 z@S$}5LaF?ghUaDX`2Lr4|Fv83pzj^SMfTf^GX620f24GNk=D9Pd8f*M<$r28z1YI{ z_niK3M(JPU^cYR^zbskDIQ#gu5`Ct_eseyZXHwRCeNX)tPyWOyJ<q+~RcQ!ZzM%Ka ztKj#%^9SReGfrL38asjIV`q?&?$2u-&-#3it~>MAsFRsn{lu3w-}+8hwCOZj^|b1} z-f_U^VTaz+7GI9D6W)hSC=2W2=r~}0Pk`@n0N?Woe6KI?z5Q_N(}(+CR&<#qFh97! zZ|{C=$%LjB@8dK0CuenEG0EUMe*Qq+8ituXyJODWyl{GUPS3WU9LDmjPL1qu75`4M zsQYBOd@v5<;=CmwdUpe_f1qgeMA7&{(d3Jwse)qZ7scWQIT;+-I2_p664=-r*ccM{ z9SyVYeOPzTV5NfKl~ei^Hi1*Wsq;s#+5fM5I}gvvH?Q}u3y^%u&EtGlD!50A*GJ~4 zx71GU(`UH%pDUE<Tyv1?jLg>@S@xd&cLH~>6a2=+zDwY^Nb*OK-xJ0De-vZfB*q@3 z@Uu|7`lER20=AZmD>Yv1{AVEk@s#<3<$L+o?%kCm+sGr6|Do!_nd4qO(y4Ehg1dJ& zt&zT4cw~p*z6%?V$$eCQdQ9c4;L%GPRZqLgg?>7ou=;S;CfVD97o*lZ`_cB9D_uTu zV^ENw=08p&h3P?>vxOKMCW_Y<GDvJ%InBSz#hGvNMx{(1)vX)%-V0=4y`X$D=NQjw zo##A9+Pu&2nIv$uXOn}`m3Q7;U%f9c2~fVNbL>K(O5~<9AB3cz<{Zo5HV|K<{xj&p zw2L?Fl)tYzB@%DQASZ039BiaM*+~1ck?LkP79;VcpA?oCNmRZvRtqXt6Ut5#lH)YI zz@@t{A>fPIN?qFww%c5<4bIQbJ8?OsuioqY*94CZ5xtUob06MFGfYgE5B+G=FKjtE z*ofIke6f)tXM@&Eua{A8r`36%bzn9;{f>FA-=DU;A1CzY=4gI>koWFe|N8*`9Tmb~ zXI#8q^ZBcv`ahSo|1@p~SiZh&r+!&;p^&2OW<~7|rg#lC<}E7hCMT|()w&og-2Jxc z#705R^+LKI4tp$@jtpM0%JAJGP0q{b|7<({=h)fT*VY<_f3$PIVrTkUlix^dvGJ2x z20AA<eCvDvFF~{L7?0^oqXVZtl}KFCeVnuZ-I}v|PM@u~viF>jN9g4<SI+EyaYnlQ zi`CUY{k=N-Yqp%Y!ndY~b85<!%5S;dU7tlfuXs<KY&rjvWqF|M%@4O_iV7tzep<1i z?}?tleUoDvhU$_pR2F~S_TbBfFWm>96{+5z;;(3^d(g=Lv587O&#`AybS@el%`2WA zb@^^W$LE?1yUqvR+FOkR3l&-m?N9#uV%({J_0icEQ`Yv(SeN@DL@hYy#FvunS6lp} zL;W^yl<_qU4V)SlJ}Io!C@eZu=BLn+2U`M88#p&lux?)dYgLxr!~;Q-O^tj*?3Zrx z3H5p+7I4QXU>o0tpUX^lPFu%WENs4gDud+}+wAk!+UH*#S>NvW&i4A3f>r0cov!ds z6^%PQ#W;9NFk|LB7rm+5KF66)h)*_Vxv2m2MsWvUU*Jm9Yg69)$e-bfEn#R6nB^82 zeZI|GQ#5X}XmDm=@bj;ctF=!miA9_(ezPd_@0+tX-kp1D!JTqG-Ih`Bx74*Y-#Tm* zSA2S-f3M4+SuNCv^?_lj8AHXj^m4QG#%<}X-_rlJU&~-_h_wDJZXWhxP9_s?S$t!^ z?NZ%u>#jt(8+<zuypn6$qgz+rte7U^c=g$}{6uqSUftyu_eG7mr=|bY<iBsmz@d=$ zIE>-RwA{{bhSmKF=EXigH)}Cpi!(2bh~JW>|0?yOujBe{FMsrZ-0<c9H_;ep(VTjN zn<?AAD23n65zALA%Pqf_$GISHp|IveBV%uK6Q^Xwr{9XJ#Y&>X)Ag^38h^8#`E7}l z!Iw+tGMDD2%r988i0@g`<d;qt3$OCeT2)$f`E%LSllF&$3qEbkyEH8+a(mv(Yo&|{ zCF{ReNfzbBUN4n5&YXKWf9Yn%R@2I#0Uf`t_Wa?G@P0XWO8LL54U^gH&j(j)&OW2g z=D#+-&8XmxXynrA^IwTI+%*%`Hs%YQsK_kQ7%iUpJ<MnJ)UxO-w&m|{PWhgYIw67A zJj8t6x?}Crq_(|{3Q3S&TbI6y{rPs|w$Hg1)2oCnN*E86Y!t8NpHVHm<2%cy#`NuR z@dlfDCY;pR{$ZEd#}y{`-QH(cPqxyZ-qO!sUw<Q|{`1EbY^~SXsy=TkO_wOSA6EMR z`h2ygC8;x7MQ23T2lgB;cila?rP+&}*R10VZ{@=kMV*4q?FQ_*`kh-}O3suJ?EG=X zMET!~uKJZb<~x~B`0F`=m8+XStMUKD{G~;i?Gs-cocJ*(|EAT97)gQR+JE9)vn3`y z=xzAK#}caFXZo|}y~N5d?XyB6x}D7%f@e+*kL-@V*~KhT79UtP_v%E~n~CbvD>5ff zFeqpiz0M-t{YvV4&l6pt^JkxFNKO|No8ox9GB{#s#6-KtX45!#&f=Dwy?$o({&IVH ziG_I=I#%lT+TZljuIzLC!BWayY4}t4XmH0(k)JJ+{k`lDzKG}kn=vbM$E=;xr>>2d z{W>h}_qEwa^JZQNd3~Xx{G<EwfOG%0OwJMB&SkAtz{_9g%lTZ)Z)WQIyKR^A17^<u zzq2dRa(4L5sp*xX*)xNG2QO5PTJ+KH`K7H-ddh9iiXRI4aC6_*n*G7i`BC#4!|UF! zulr|Fl~Z6g-}zT}?9XoY$f<uN7yK*~H4n}_dBcZ!+TyILol&!v&JS2tY4BgJGVN(! zNH_nV1l^4WRr9Xzxc6&D?WJ!b-r;%bo4Y1f&HouW|KJVz_q!Ucix==_IiFq@G%2!E zGW@aIw$*pV=gDkb?(dh?%FkFGzGjy0MnQqK<{z9})009siY0F6&3>>})p*JG$aPP} z#6C*Z1pms<waQYsWX=>=T5@Hnueww4gbRI@F=vBSE>C20PnWFBsnWT!ao?rMH#&rk zcSWrh-7OKFvt`TT#WOAE?$VrVC7Rt}WFOVdc!}44ia4VJ!?H`Q!R4z8w@W+^(B>6A zQDfq9SLl3|$Um?BQUT{@@BO9Y@tenUx=3L1rVaOgpY_`0-reK*GyCj?*(%khSI$Ly zd_J?c+~j=B8~3Bf_f(3g+}*8ryvORIZqRh=rAsRF=k8XB7TjztvupXy>ZLzVWgH0d zstJ0>6_w1ZeKcC&Va~R=sR4~8Cu-I#v*$UPHr0cB>IIf5+M<8<-v4+^HfI0XBGr%H z4%wl4$vl3%yvI*}JoY9eoLyvZx~NIxjwuIk8_&}+USGatW{{Zep2P2@_W8~^b9zqM z`W(g9iw+ATwoVKbVBT{eLFVEUkrRbJk2|zad<;3CIVVhT?eW)lLiZb<e{ExM)#zmN zo)d|sCyT$z%(OX>8hUV@z@?M_CV!gt!kNE)*N&RQhBjxc_v}6`bLH%v`5(I2Vs2d7 zTYc@Hn~7=i)raj<>~d}-%_<MR)Uk6{hi*oN?X_gtU8x&06Pz{YNS>5zj(vN;YNw)@ zqyC#C?^lU$uPNC*=ki}e6Fb{0j<Wk07hDk!y6rD}^k?Sl8{ap??tSPaxm^AC9gVxz zi+N32e{6jF?!$qp_ipT{so%?FxW4^nR`%*+htyKpG8)9yTaR4+le;$j^3j;vtM3Lq znQ(i1ts?V-37idSlCx4({o{+J%I6erDE7))dNn3;OZmml>nGoTymqJO{ohmm+l+;> z7=l)vNngOmwty`|fg$6-Q{UPL_rF!~&pUH>1K+>*T@R~2KHDw(Xy?^c>hqSp|8ec) zvF)mS{pJ@Z37Wm%VV1qRYFX#K!eq0E`!hEGnxN!duwa`EpZV@1Ti4E?BU^gX=0Wy> zr;K&a(*L=9HjpS4lxP%OFEXk7{RIi{y;qw5otky|HlvvD`lxI9-@j!AU0}Z`D_*#Y zL;TgXE6W9>w|?I1s3<+7a^{@XX{>YKzFt1}ec<-p`(>&H=WS-(cR%*tQ&FL>|K}dD z|C{@A!ux1>zLiEc3*$Cq-g4~z9rk_G$;P0Mw=G`JuV`{NXp!FKyMEp$Rf*U7^4TWe z3(evmG|ywx`?fPN;>*=}N8ZLM#zs6_DSIV8Ua5NDe63$|m(P1NvF=~z_I5YbJ8s*1 z_D|;CuzJeO1GXB1-v8U8=RTC^W50fH=fAVx@Bd_EYB<oy!g$4^VgkpcR-TChfj=%N z9%&cRwsYw)Om>qp&5*dlvB~XVBd_-?76*k?K_%C)Z7DA|E%lyZ5`Sw?r0{az8P=uG zzEldoI5UkQ=~+tUmgRv9ZQ4)yyb{s6GQ)ed7w;+K)mPX0mIfXDbw&I7g23%{zP~PK z_VT(;Xt=t|Xz87urV~13JPnrIlM?i`nv${cQCy2WyS&N^^Frq-S`)k0W_^2gX-l8_ z<h7oWnW-lW46DD^glPnyoqupzpN`m;tV_#No!oLQO`fbwcD@{Q`&!YZoqJy2JF5Nf z!iIvqT#W4dW^CM$c%)0zSS`Tp&GpN3z5lN{Q?=#G*$u|Q*Y8EWE?t#zIRAg&F3s;R zZk{d6_mBQl`7Nw)ckjH(=CMlq8~Ok9E4UrgG?yqo`}3<zZGq+28zCR(E}xgNHIY3! z>wabX!|WR;-Dj7+@H}>_>Vv67SPR!Ajo40Qy;S)+i<j!+@qZtRCiI#K?U>%kK5fc_ zrcJsY51XZ;GG=wYW_)>XLU`(r#gn{vQy;ZH3zb+h+4of1t*(2qVz(<Sw`x2JGFav! zQE>2PN1F5TkLs7|t=^po=#M$~{o&MNBh94~LNC31)am?dr&OhDTgRhnp(cs6Dcg2# zQ=OK|Dy1^xpO%)X8e>i5kqfRCi#QdQsS0k)^vFNd*)r!{;fWQ~R-Q|LvT8M})$G-q z$}-a@`^fEFHB}+$=EI7~)7+OYs?M`mUGwJWuAuHM$3k8%72`cJ-|^4JlWMcB7D;J& zEIyQ(RoW!Pow3gIo>%I|O-hloGX#}R&z%sdX7zmTi@nzC_S|>+p|V7?OmzN|TA_<? z3Yjhnyxr2|TfMS}<Matlr|a7+?`*R!^VXO$`IweY*V=#Ddg*miUE0k*zDeq@JvQyl z#>Kxrtz5rxfv$D-s+pS7Mm}egTn;cWCa4@{XnMPK*&$A4pS82|Cb_&yDw2JzcwFUm z=DT&$`>mF)*YtNU?b4dew)$VQ`2WcCoYUJ*n^q(oj&51<E6nQpteh&A1|A7k-#NF% z1$|8p-^^0^*jQ9H_1=Qy(>eK<-?7zYEo@r0dq;;|)!!Ejg0km+te&as`M$+apKIZ* zn~Z177)2%1&0SNq(#<a{ZLZql;HiB#;_>sgzY6naHTPOviM%&&<MFGCtG+(a39egl z)3iBe&)mbio~&=mQC6SulAqDx*DJBPcIB`5g|AtCU9X?=YTtgYzMZSqgjGB}C7m6! z?TvmnukrqruUEGI*mkRX+v%s*PA}N5zWnU8-&fWLtu8*1_)clkBb6gnCC#^I&Jmrl zSCu{U{^A*L?8;0h-h5Ya<Z<l7e^a)8RpgB5`==dp;s~2*QEov^_-7%m^V3D^f3D{+ zkeVASVX>==!-ehACT@lT35m`*?;1}peDL~E`0g!=DscxM3+*!LFgm<3ze4S|0_Vi= zo$7b{>wg;07uHTQbz1pB(`2`T_ZMM_Cg1l4Tr5hiVnq_oHBZ{}YQnznW8b&bH&0hO z;{@BU9jg|dSfa5-P-R1h$WbMMORC*Z9z9!k<Ah+5o_0&mljlb+ozPt-P_LlE6>1de zv|ge}-8C}hl-ZR%y>FjeTorzlFEr_Z)jyxUqBY&I3M&p<Kf2iTmpLJ+C|KC>){zNQ zMV2^p6#2Ny8PAOF7F8CtoZMJZG)rfqn(<Q3vpGtxvlayXd#13y@=TVV&}{w4W#&gM zPfabDtZ?FtnwhufnZUBkb03O4)9794mlAeq_Me>PM#hm|bxo&cu-sj)x-r7d_?Sip z%js^XC891}JS@ugCJUrvIoHOxo$2u0oKSl0lXv?BqtI_(QcQih&eop$ochXH)5PEF z%#0OV7BJSX^xn;RIlWJKDXXNK|9{DI^WTZgcdlLLyZz<KMb9?R(OkORviO%s%{&n` zM%$IX$1{CrE9I*hsm$>{!E(?{(Y<lop42a0ZhKAdZn9q-y+B&kBe3rsM@TWJc>S*k zp@hDY313Q<#}{{9E)n7mKR9Kj-)+yUHD$%inN7U{8E=QI2n$^u)T{F^m0$bj>a1;> zUWH@^v;GR66SZxb&()lysZm!K$(3Z;YA*hlA+h*P;;97Y*az`qht#4zZLl!%xT~Ey zC2ae_(vBsIR@W`anAv*9Wv7nsygwP!ttWb3%nnXfTL0>aBv<T&Sy3@D`m3w=ow<0v zc3tP4Pn)#k4sAP99M60=Momg+yW|FYPQy+<^;H7fpKVCEq<yvE@rzx|f)6Z@vxbYe zwyWRwyy*H`%D2)Y!}3j2`_^y9A=xW#?2hxAo|7n}|L5Lz$!|`EC7PNZckfw5Ge|$* zR^X!Ge(uyM(>#*{b%LCo8;?C;&HrA=9kxETs_RadtKJ^V$lT1Cw;rtJ{5&B|CqL=m z?3Fu&_T?YnsdSrruk<5^M-qA}e6ewUJ&$CVZUi6O*)65I%3DrwMy_1XyAur4pG?bK zZnTUgwbHZg&ePgWo`<fy>dI5P!F7ARvG==#XLmxE{x{uTD^hkQcT0`_%aY1VdkhO} zl4T?qE(a!Lep6hU+`jQqs>VUNJxa}0Sy#{NO<Vutk51ssS!ZUgvzo8^^tG3Ib^0a0 zZRfjdOM@cMUQbWkw&eGfG?9y`55$$U3rsWTwcY*wG9&!gX@#Bl>iUZhNG=amxYXwN z^MPrWwqH=s;>?td6SE?s{5LP#SNCa6=-w-pv!>jr4*MQ-lQ*Y&xAnd6BHQ8@a~9Y> zpIH;?GiT-Xf7~x8UtDsVN8NC%X_0OF%^9~3X?h&qE1US`;3=;sax!UW&Yno&6Ip%q z+t!flnb~E1d*(dZlVy8yaZ%YZ=@mC?G|m5?ESk7|^9;rHZ%((HA9idOY>Nx^4=*hJ zxFq=2C60|(Vvl_(V9>68V994X?eg{Hvuh`uoTDQzB5fP@g==QPjN&gll<y|$YT0CU z@+_VhQ!Tah^xTKc6U**Ce;3<dUQ@Q~RfTt>Ue<o^%o@RMpH5x)mu9Yfd$sT3kC#u} zKKXe=xK{D{Jx}$|KPwQgxhcPI*UH*APKTQRy}2K@`@-5d`&9AT`t1JArGo#Zj)dnW zPo6INEZ;tpQNZE5rewqW!uWsJFIn@xc_mbHwYKNiG5+`yj`E+bGwYWKC<~qM<kSDm zyLY+fz0mbPlfo_;CkcAT&SPT}X!v<{|L@Q5?f$-6evqMPnvhh;y_rS(K234{|I=)F zY|ZkLb;{?(be27@iuf+pd8E+!n%0ELiI0vcafTc6gfp-RG_o>y3#16~x-)-DuY0P_ zAhV-UR*_k9MdP03)w{$QSSB=9EKlG6IX$i1^T6c#zwDLu%PXH;@>%jNhw(;=V_EE7 zcH@)JeU_!yn-`YMSIiYPY!u?CJNi)k&&5>J0v4IVI=LH-Oa%gu(lr$|nB4>zRCm;= zSTL9rG>K1dUXq?6b~)Bs!;+6JR+7E>AFG8vi-qgk(nOsVZPO1s@%*TlY>_WW7rSUC z=wZ=#vsmH6G3h^rEUXU9vOB7urZZ?J)|oam$pkXLeJ&W6(Zsl*bDB~c@Auevk;)ZH zaq`7APAd}fR@8hhb}Evn)R#!jUQx*L%_G#T`E!%@*6q^X>G8{qJGO1@c1d73pwU^h zux{cBL6Zp`CIJlnKk77Y2<}?mG2ut+>+PLaE1DP;>MyBPGiJ0WZMR!uQ5B+Iqibq; zdquN$N?ZGv-uCv=35T1zm|FfG7uwMwdhwdfo);xPGc*r)u!x+H4qZ_la6^#2uqVKS zB`|_PFrrEGM~|8Z!?lWD{*|3KX7o-8D{z|euOj1xZbwPi8;iakvG!=Cf`?6s#m`dY zCRIJ&=IMCCGLl_-<r2kj9P0dnjkOO24oWl@UF<n>qC+l2)19F;u!4m>l9{=o?wCf? zyYeQcf?nU3Q*P{-99uR~J*7hKn~Qct*0YKA92M3(Cg-%6w|8x?%8AgEvn+e}W8&j! z0jeb}>zNHoKXw=@)g7*AVpiy6_}RhcFv0ocblHiGtRJfDG~1@`sP@&IC}=s6QJ_ui zq+ad~my^?6mYy(VmT)@MJn=mHw6z-3mWR*$B0eddbJniH9G4ZTvSn@;)28PwHW2w3 z_xWl`iDI4fi4K;Vg6x)4Bsr#d&TLHlQP=r$cKgfO-TySFc08NGl99SVqEBF1hC=2v zt`}XZk(1glyF`mtP0O5nd8G}*6zSB8S!Lx0j!V>zesuHAu#%ZEoqghLCe0})PRw?_ zDd^8R@xaU(ha{~Yc%+nOBsxx?v(chps^rXy4#%GIsR^8V^LN&C95%Uo!m}ts)xc7o zmpxG9*|f)*@tZmgj?ZXho;f8kV#=qNvxQ$S<oBFE^^nO8akH&EW`5m1DSV1)t8qkq z+k&|)>FOsf&aJF}yE(Ps#QYQN!r3RaJi`MkzG$Yju`ryJm++df>t(gljoI?Q7Rqrg zGG7*(ys=`V$J9vi<{b5^YsZs6RLq&T()#l8s%JrqS7a!5Z(Az))B0bmsa=tKveT}9 zvBY^y0TYf(H2J)$uH>5U_iD)j&7~L9yP}s)Wcgmf{=Ip1MOVeQ3cbw5#=Dw*+E%1# zS==t2nRYUi??=?M@5{Ot_IEl8ZtAR)IVD*Bs;<&1!E*ER8m)<+elDNok{TgW9pa@F z{j$l}rRJ)*&4%!$TW%S;BrR5uT=6ZlHr%~L_KAejGRGO>wgpi_@hj>k%~-OuYetRN z+P0rl*1noQ=VZAw`-0w+tAoU5wNEeGc512G&#D(1HM<Y5-TP~`twpt=Vp1qm&GM+Q z`@v1$XVn!sGMBG1zHT+qN?E9uYvR?8we8QE6SBJhTwfidxq8!&&MW0@OQ(y47XRDe z*fI5K$DCVU1xhZ<)<4aWGF!iQp~1W=0Tqkh89O?Eb1_&cFJcH-+xc_CYOX~rvnv;_ z5ZSs-Wtodc>#=0FrJ*{fV%LYRK7Vq-nVYr3t5;vNTz&ofhBd9zcuqLFPYO68x@qC% z)^k;xE?cY>=46n(u~qA~pq}-7xs6LIU)8OiB_tTRdHbxqtEI(XMFKudDW3Z@#4|Lb z)-8n9bo=u!ek)UJL|4zB{k&3q^TfZAH6|7FH%KgFQg8koF^lP!P^h%kj2T;fDrYEq ztz}-;`ChzD`}Nke*~`6OZQ2vQ`BTvP9Y<r2e(`hLnmzYx$lBe(?$5$aOe2F^qr8u< z*|~c6?$f*X{(HT9f3|pDp-tcJx!L04lcF`lSMO0fF~yH_=~b<5!kR++wr|pw-t}(# z>{%YWR8FasE|fHUx^46C><Le|_owD;eU>#tG}5coPt<I|%cuK3a_|4_z2@uhec!bA z|KQ&LM{$p2WXsNuJtuch@weKbFTHo4<=$)3yY_VM{Zzh{b+z<8>pi!+w)6>Qb`~EL zk4ZV^xndcoh~A9(oTqa-rFZo2+IZ*X>NA)3CqHfvV654+wg1?{>4#@*JI}qBvEYC( zr#bhYCA&1+Zb$FZd9nA(&8ZE^hpIVJMcmf(WUt}+z0^Ntqv2xvz)PD0?#%e{=}1$U zWa-5Et?8o0;!_3MqaRK;zGBVrPouEO^3NuVGsm*l%qYCPbLpuAN<R)9uCy28i8Z=$ zkWFhH_iaV3M_absh?&qeF|udz!YdkWZ)%?H$dEj?|JkdfRu^+0hBI@{oN%_HRXA`; zdd;ez8IudP9GmrG)8apyn2$LZZk}DTr>=*yGG@+k^;?x<*V2w2x1ap7SvY6igp+o0 z=}JneW&3js59pjZ=yT?9PT7vaGuko62AMij(#&;^30(L!p;V=Fq0gzL*T?*&ny$@m z%sPEaPCH0NXT`=jj?ps@g{U<AJAV4*n^l^>4r)I<y~%3Ji_obD)|8(-BzEKBDVfKM z^?Z`%W?6YlEEhSoQathSzRI(U_8b%P+*ZYPWb(Fuy??xCI;$_1U0wU%U7tIn=Jl-v z<{78cy5c_atdQtgU2tOKnazwMo6c8-wZ!`*UHx{FSvJt8Lnd59yhds-r|hYHKX+Pv zzOd$u$?u%gn{rm}5?*QUaj7}H-nV<cv+l-z#Y^2yo4Y5aTw^^nd6U=*6^ECX55*Z~ z8a!KhHQ8D8VrtCkV_db@tmn>{EwkD4dvm7nIq#=I-eEzXu4S2t=LpBHd6BX1z^b@c zGqyBm_gzkv4O}Z_c+_9xd$>}0al@JoKWfA({wRFWP`lf9Sb5<Lb&tbE>DMyXUNd-o zKx@Uig1zB(NAp!eqaK{jZhSjwJ;%nmkyD>7-FVEoy=ivL;`SSM|E`DpX!CQt8XMGj zrbp>!PkTYtRZ~Wr^7*!#1FI_k7~ffKE7Ei|>od!~w$Q6@C8lxi*uqo2bkWHxlAK*p z*G-i6N^M+ydr@f7vZLn&h3=$?Tn#vKW_shD9qtG2*{pB)bZ6Z}zi;2d|F>Q53cbDd z?bL^_u5bLcR`blpb?$xoj`ysr)@8n05w9uy_OFoh8^gamVxQMOoTS}%_^*V(y5<?3 zcW14<Yxer!ecdgJJ~qKNC8if2NcnVUY3bh-cmAn!=ah_O&Mr~ubB_;9Z?=^>*YMWl z>!vy4k=m+uZtt?Ls%M@%A3FEzp0&CkA2rErG}yInV(#O2xl=73wp-tO9G_QdStb21 z+V`CDoVkjB*7@dKVUD|KQZ-jdZNJC42fWVDOZx;P;~rYXN%6h9n(*#<aC%n7n+;8| z3!ZBn%J}uH-D_F9--FpNJ@~`UOw2no$?xUlcNW^dPwlc=>d(F8NiQfkySl-BlB&+> z$d$=!ZcLoY^;{|QQlIaU_4jscNq+cd)!ZsSskwcxFSc1Y**>ZLK0hFO-6YO6+`C@o z%zNcgtE4LPdPCeCtv#l;T`OCrzrLJzeA2<!$}^v+|6O!p=2ESjW!$%BKDc*Xx$bV@ z?Kh|Qy}53ueL_lQ)021a`QCrzbGe)N{A=F(?|tuou6zIc-21<I5{0&=AF~dYyM18I z|G?h=fph%_?(_dXu;;fYhQAcde<|euQ8@pjX#Yp?^&chAf0TazQI`KxxUHgm^b6kn zPwM@jG}nL1>)Y^s%_1M|nc=tI{wS|C-hXk~z2j#4SF~0wvz71nnP(Av`pB2+{jT%( zyZL`PXq-B)a*?iyz2Uky0s7~bi&sm({E|HD%GR1kzn?!_v+hZV|H^1P*>h?SRruaq zn0YsS{<rWq7rWkk`#O8UL9L3{GxT!hPj{br)ZhE|(cc@D(`(=Vc(bMN=zFCv;m5_( z<C!y!``H5@h7|tjyPuO;|0HXExy!tbcKKgTUR_lEwJ-9_x3@8K)7e`V*B^Czw{*Jy z=~b7O>iv@Ze_FNao#>2tItROt=lxT>lKJq|=N*TBo&N1{zr54>m07iC%f1&5rzb7+ zlb1@fV?XvM>ek)E`zw~5`w}?ED0Z)COiX;|d2#a;?+<7G9*oxYnE3b4?!Wir|24gP z|8o7m*XRGeegE%0|No!&g5r2YZ|Lt4n)9Q-=HC|iC*RipW(Z{NbWmYsms1IHNtmd_ zDQnj9BOuA8OISDTNJU_>Tc5OT8OzVW6pu;DzSCSPgHpYwX~%ABv7GqmObc&zjz&|9 znsb|JEtkqB1C2=wOgmnftlDtwQnSN!Db-y8iieiF&$YYyQ{Yk9eA}H>f2Fp)zP>T_ z;4IPVu-vH48F$y!{x*9XvorVMy`|mT*TwCt{9E?#?(gmS35T*y-#fFj^x3%$5|W?y za6}qK9IVrh=Zo1{@OW02dHK0Nl?JI>X1ULH+iUst$;Q>O-D<1FHlDk&HFWzmt{Vpa z*S3C~^e^{jalwt5(){~%WWHoxJwAPZn%v#3B@en5#_RW#ZOdI>H1YYfzcPQ4UOzg# ze(4#>ikF|RP8V07w{P>WojuR*m+Q-x|Gu|k<LmdQ?Y{gt%)jsdr=o0Y#;LFK4lv!c zI=|;{l=26gcRz{?wljY`d|~ImlE)_%1l?6Ox(NHb7#<ZdXIS7W9^Yc<CYiouqnmW* zmJQmX<xe)c%ex*~d2q`%X8m<CpJ)4=P%>rN==sEG&je?Uxi$h`+WY@a?l-%)?a3x@ z{ry`mSQ+f*>2kfr<6^vPHbaMi&Z1*H!hV*|rwDI6(DCK1q3y}X1)e&K&s<)&`^M|f zCs=v+OmfnEo$Yb@`MesFv#%6lKl?D4%jBLlQ`}r~>938i(WL<Qx984%J#;wOL)E<Y zgTMV&rwLb|lqp@g;HbZLtF!ClHCF?F*5$r;4ceL%Z1lNmb;$lC;V7}|45CSfKJzzi zni`g<{f2){((;xUYBTo*3%LAe(aE*p|H*R2Su0WZi?h#0*0PIbmS46WEbGn?i|_a( z+s{!KDtpOC<ziN0e7SVe<>k5ky1v2X_s?95I=&-y?aj*FcN4C!53-$hGWc?>Psqf7 zjO(s?_8t`txm5k|YU!z}{Yx_w=dHUt>1=N9wQ%R}la}i1&MDp(8DHNzO(*e-N=d|F zzxu0ZGs<%HzNObTpPRmK)*jO>s|yrO#h%o?cAohp)PCQO;QrlqUoN>c_HKVWy*kaz zcJbnOo>?uOe6vmGMdudXY$|^DCV%nXU*c(N7r#BLm^HcOLT1~Fb<!V>@BS?wy(WJv z=klX#*{Zkf?dj2bU;5cw@=)_$>+-kF*FRm2Ik(OAhU>kSuiGCiRR8|2fMMFPO{-h; zx7j8><UB8S?dYUu9FMjcE|QJE*}Sec@1VWd>!PT=w|3bUKGdz<HQDyr?Jw`{OGm%G za(@4h!`J$seX{!}X{kQHc;2^jzgA0LPW=)2<oIio`p36Y`oDR!ZVf-{U%c|N#L-9W zR@-z7LYH#K-#QX*&$jhU)5o7)d&OGTuIF|4;(WvNSLnM#b?@5Hn#{BRA~x^%a8SK` z!6AOei)s_s+MY5xrhW5eMX3tMCjW*X#t%RBOm_GZD4?Hz`f7gFi7m2edFB3%Ng_)v zT(!b3c7-oddi0KIqZrePocUe%!`7rvZ+YMu$6P#hP2P^#Z$&3G&tQ&aSN&moOwh2l z>ZXI-*B$P5-!Asov!p1na-NVDy)>cSMWv_W!~{pPOB4HBROBT&)*jigI;!cCu!QsV zoo3haYwSyu`3x(LaT~pAeIK-9rqJA0uU8#;Q&%1dnW?o?)kp8*BnhFjFC0v@EO)JI zcslFhr<P1dE3wa0kEf&>#m<mRRWddyKY6d!qr!Fzr(ka}&jcT}mO~1CA7YlMJk=0= z;ZtOGc~0S-5X;2QU42Vm<t*e`#Cvn4vw~BH(_NED;inNtf}Wk4|BB^>CG#!YjhtU% udC$xV+OQ*_&FsoT{?-f^Rja_Ruq%tik7l@;?h5QHyRw-3u7d*ugEat0YGMTd diff --git a/docs/images/synclogo_fancyred.gif b/docs/images/synclogo_fancyred.gif deleted file mode 100644 index d2211ade6e8da13181180b9889974dd14c3372d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15560 zcmZ?wbhEHbEMf{{_|5<Z#taO`#tdmQK{SK0u`vi68>bnkr5VpWlg7Z1#$cRg%#a2V z0tu(3rOiy6nU*$l=1c~LnGD7=8P3dP_&?K_VWzS1Oyjhf#xrLcpP6a=e`XrP%rs+= z!nBz))6UFH`#*Cg!%UDgNbAg*XJ*d)Kl2R3%rhW+K)f?&W}f*!^FPDP|Hd=_r_KC7 zbLRguGynfT!@zKc!T1bA8b~d}nKKOk&loeDF*ZJ9oCeZreCCYt|1)U}XVQ$%q@|rn zn|UVf%$c<RXF$#}J_E9N=9!si&dmIO<_yD`Gsb5?(lgJ1!2dJ<8P5DSKJ!2A%>S8Z z{+~JX|NnmmhW`x4{~6Liu3$LxpW*+1V}}36#{Z4eK#np#^WXUY|1^gGX~zH4(m-xZ zJM%y7|9`Om|AT!9G70SH|6pf<d~oK>f3VU2!J7a72TA`218@Y45(5?jia%Kx85rsr zbU-cu<p~Cke+>UQWIQ%3IM~b~tQB)&!@|Su0?J-<JT@*m+AU$6b?3y!#mD;<oV#Q^ zH!V3iStEE=%*jnlPfs^UK9%!g`LeUKP19f9Ik|cH`S}jbua0<L>Gzpk@F%CS*u7`I zd431iT&Ybfd{;$m&eF};y88NT@%>%8Rzm6Xmsc!`%ANV_oS0tpqf@=wY2Gt*GY>tv zbE;hF;*tbTskh!cKAf7BzV}<_<{RgvEeej^ICwez%-JK=ijTG=3xAF{kYZ}rt1N!@ zwr=Us75AFdzns)fez)jeQQDcACWWczTWxP_$ZxK@aG+9H+V8cA+1n#41s<KBqFJ%& z&%C-Vs~>DCD9gUT@93Ai?@PA-+mZG{y>Es|!G#{j$!@(;hP!s&o_l}q){t(~+sitW z+5M``C;SY*9+T8iHmSa#;F-I8xyJK0sm%x3uQwFkWn?eie^Bt4#EON2>{8_pp$g(Y zE(He|&)Ys{my_7G;!=3|55;52^<S<{lrLW)$ex#2QrOm?RKOT2Q}KZ@QtC)6<Mo=4 zx~;;_K81p8QmYCZ+oVcOW+=-ze*5uQ(ot!pTXW2(7f+gIx^6it`&O{Mtt#`(33<7) zh!t%!3s<HF1!f-o87H;1l`&qzt8V*}UcIzX@tAU5&f9HC83_ywQx+w>EWV_=YNdzS z%7-_qCtnQ|ma%KO5Yr{wX~<UeZDHor<^NvIRX-*f(~ucn6V&yby~@qE@rC@RT#fJz zE0!K)PqnBjyD62wVp>#QhvCyZ>p3#jS1jInkZsYlLW5MrqANvLLggzi?7Uwes}U() zk$A`9dhu+(t*+7~w=^|sMFkvQ?$dB7cq#IcZBJl&&%uw1d9U^sy0dW#G$eJowQ^tF z#ZuImAjP9req6RN;zyfQ{)C5ayH+=vPcMl2QP5tzkFTWYc-e}?+hvaX6w{8GUS0X2 zVD&2X*{wc0g$uj51f|2*-rXemysRM5Gj$GYmSc(g4Zdorsp&b1pU(vED~*#%z7uer zcWINt2LHlR$M>>Neob6Z&-Y@tK7-(uxB6Ul3^m{W-4hDju_89?+|vX5f+M<^_6XUx zsL3^yY2LrM<>)b2sf5{V@v*Cmc1nqxi+p6dC-C1;`axb!jBvg5`-qImEN(MiSBd=k z(6mz1t$jkKj9Ar|Z9HOglH){<Kh0x}zEj}L5wwKCUF<??*Zrh~&3;cMVh&uFjR{(& z<|ddV@UVf+JR`vIuA+#Y>3tnbsU;F`)=qC@W<BG(va?kFp3$!#`b*eeuZog8#>72i z_FcWH7VS3@LtPUuT-&C+;_J;;r|(Rc=U!USxGThg`K!0!forY0nsXh~<PM#YeNm#q z7wK*KeUea2UO*$OM*~B<^_?!BNpiQBa2Gvn^iSEgb<w{!9TxwRHZU-VA2`Hbqwi{X zh+pQ{0%h}rcM%siF*nb6B(HKeHRs4~M)5X|1I#W8EIt(n|9)y0`W2DQ{d1E1QUL}= zmLJ`mQ3{J?c$?ZMwlbzHtM=+Rwt#Wx+tYc14tHGTB*gh5PdF9qn7lS^%7R|i750BQ z12!{EUu*D0JD$(Gf$a_Znw*{7y<yz^O*1yFs-F8icd<**9FqslJOU4<vRO1NjbYGl zia4L`bBl>VEP#<gK*6RcFjVS+3Y&aH5u=#F0VbIOrTUALxM~-iSQNsn^gG4f?)As> z(o3eaDdjjYOFekX^yRA;lS=}VM#dqLIp)VFrg-bQd<l?xwA_thiy+g#f2&fhpTA(U zOju^xx#W@<(+am=tdqD*cX>!$E0}iUg<Ey`Awjt-0n4-k`z*>F&P%hH&QbbtfL(M$ zgS_TehQogyTX#NW`WW|;dD#=yaLYZ(%5PmP(|Zp_*2-uys3fdZOKEgv;#~IC=ZD3W z10{Ni2O9ZJ9xyOpm>k5;!N?V4;CA-P5vRGG-aTs$%{BSK!27UgwiKrVQ^~yi`3jc2 z3p;i#Ja|=@A*ZK-B_q;d%dyvLyqEm+U;k`isVU^TxaPIfF6Sv$v0K_)@Agi5)Wl{a zaFAUrqrtB>(*C07itOEj&6hMx#7{arv-y<yFop5KQQ?A5{MTi~w(TkMJt3mV>vG}W z0k)*-hKp_uOd1oMLQh^k9Q)H<&-~^&-*ui1TwfBn#RT3)|8{lQ-L@pQi1CUkXOw^Q zyoOcU#d-fiOqFxrw(VlFVX)KO5Z%SYZQ?PjJA9Ryc)4sik8X|jU8N69NBi>3;|zV1 zE?V6B`O~|n-oxABtVGP)2P%3l8cnP+27dATrq+a9jdqqR4~;!l&bVjgNimKM3}Ibg z4}KM1Q>NZzdo$z4q5M(@CYcY%1SfA?u{gHDF|eTB!pY?j%f)k3XLyL5Yg&E$!;`1{ zGqmpiT%=&SDX@7H7tftV3mW$_zg=IidZ5KVWeZ=?io*qul7vOB3m^8gG~|}nxzG4& zvSON&$iL~PF)60&R`N5msxzv64dc3UHvHPgRS_(kpEp;y##FX>uv~xhv})ar^%^Sz z7i3;aU$?}wuzuZ%2!Ty6dVHjmEOIVsAMbj2?S{JY;Y$q+B~#}(o$jyjefOzN{6d4B z*i9FWjD+$xO~QA!NHSz^<4ixUncAF|Sf9MXSBh`xl<4!m;j8y;6`$)lvu#BqM~GiD z!>$FZ%_V-X-J|nv*?p}x{at7I(?2vfF&PVVuFbe4_`7fk>m)gjqf7ZSCAN2ne@b~b zC;cAN&P7$-;VEg?^m$SyoNnLdmDjrC)%oU)owXuMUbL)m+<&X_LceBF!Rs$+CRcZ_ zjN{UKnfPkP75}UbiGMN^7{wm3x)&;b-WS)Ixc!8Nro_zdEslAwl#(T$B<(n8aWMKq zs<GEz)5Z(D>)xI=e&}Il^M2?4Hwvq(a}^Cu_ivkW`1di*8#^+V-(=bv7%aS~I<`*g zfO_7httwX)p0XA4%+>9$nl888QDM%~t$TJppJTs3(ayKXtL*IV_?-z>?~YE>XY2~t zzUbB8i*;dqzhkWOOm?h(7s;$Qd&#LychhS3zjFKIcqw?6?h!}bylR^RLef)J!df~# zCQYp?EuL;suqSGB<fOQFMv=9Q1>BPxo7pt_lRG)4pN(H0vaZy!bXR2|)91#Dx<&uO zcJkIAKDF+4fyS(hZ!R$YIQZS_Z@@o=W4jhDGZQ&f_pSGBgPD;mZ*0Sk#@Yfun<X!n z>rM8Tm=x4<T$^>}ign&)J>qN)zVe={FNIz-5lj~mKN8Hy-jQ`UBz(ug$i{GgmIn;Q z6Sda}i+eOFUpExU5Rf^4DB^jdl#UA9;^nfL8yGnm7^O<=)sl_wG-hR7kV;=@Un8Kh zMX3CcvyJo@Wxw+Hofmbvlm+u9%le10CkL>zelppf(ik3?$9k|?t*l<g&2L|b-z_mV zk$~v(4@^M`g2Fe-_+OOXR+Gz^Q1bPO>!uLPFN(@%$`gNWN-HhQR(llAG|5!DHRtj2 z+S6@JJ^^vQ9pXL=k}^tl<r&4L#%y^XQvT&0Xnvcj#NOcdP1ybAM~NDfvSLO*(GQ;U zmP9da3K3Okno-OaVVr%ZkljMTIXzW?nJM*Mk@&G>N5>>7o<z4Yj>h|o8GQuUtc4oP zG{g%8-1aqT9Y`{?xFq*VQT*y<X0Zv3(FUvwQyP9xVrpa7=Mc&X*erX@*~a>K_pIsp zUQKM$OY4dbI$3mxe-%<VAI2gTz_QmxJS2c6^jHg*AzRNwO@4EQ>B3#N4vK^uy73x0 zPWjBdV_D+6O_?Dlik=?PpLVGAA}d3pTg}1ai95>JtFNZ9xvJ`DbOc>*OHR+xe#T(Z zrjlZivt(Oa^AGp4U*c<KB)6&r@J3F`ea7%+^FP+S4`LPDrLEM>IU1Oh3M}di<kUna zA2JU3eaKsML0U<n_`QpY502O#KEi6OS>0c3W2EMGAVZ-4vPzbjnWtsMkI)<|R|eh< zA?1vUr5}}N%qTji9x8N!eMOT&(goJQgY1e-rsa(d^N++mC}k?&Y;^m{G|>(>tLu96 zmlPji)?>fO{^}yz4drgOjF_DlSr0$axtwBiaz~%&2PUI!J<Bt^gD<fzGIGrqvgn*@ zu6x<2q|@oBbB458(36r0Od^a*0fM&|DyVQa>bSdzu(YfHtS<aGL1n92fx*PoGKRb_ zDTfqY<8I8>vz&8!n*ZK%f%hTeix+tx+Bv7h*+s#*#r@w>S#wMCXH)zWg2XEpsa*Z( zy(v6@k*Bzhidk+Vd&z>rz?u3CDGWJZ^!E#uhhNd~OYav|77t%ODfVTmPC2thfyoSG zE7MGyqemG^gBhm@$@m2I#5A}|Ph~R?C_4M1=eH7LnK7$=s-@&C?}JU9YTH>E)Fcc) zIreCZ+ZJ?sgxY$9*=|1A)pC=8a|46O1g2e~aow!qN|p;J7qaJ0uyze)345+r8Qi<t zQL&-Xjp0b*o^M&D%Cp(pCT=gA%@fITG`(iSu{cx4`1s>Rx?33XJtnd*ND^F-A7fy- zYMb{pP5T~;<lqhEoQeg8pOdAZF%$;-Jy4$O<=Ez$R+_hv?O)I(jXR7EtXJ!VRP&w| zTG=gdOS$C`tEAX1!sdL9`ORlT7p~N!#mu+e7?>VRv?&d<_$aZ=QG3}!r`JImuMgRM z2(`Hoxpdc&Y{40QE)V4Y9$XQ<)iCFg?4uKjOaal+1r}Q$>EvC|4K4~+%CwomF;y$w z|7)i3vc)><zAOB?*0^&LW8@bm5dkK<0E>DBHNMiyw@()p8M5U#OIA3j<vfya5jWrJ z8nwwJv>{ZWiAk;H5nG9ova!>O`kAvLQ<#Gv=&dUcU4D4Q$7R`UFIGl-*{8MUFB0y{ zE@MAmwKR|;tv_p7<%!vuCAr)M%O14I6)>z&d+92mz<Bp#!S_X394G#{t~i#u^=5He zMw+H%ebkag(m$3m90*aL)VJQ%^00f!{*ojQ)$ZGD%Q+jEY8fPXozxF|uv~4G5_B<I zVW_aSh55hNx}(ZbR-%l{N-e6>H(Ywfc2jxl-HVG`mN;=g@X~b=Xg@rAcgaS(3zqTB zl7BWT8E!J160D*0)Sab(SxABP4vT!bQh-_I^p79cuxv;YRLFZ#=uw#>|2m6Z%+pY& zq*+&lkw=WpE;ZjQb6x6jkwc39QyzyZ9!U7OOaFMf{oajIZx%|)T`xa$*oonQlfHvZ zh5@VDX9<r@5{YTTE0@QlMVTvokoj+!7%IiaBEaw|bjwC{>Dqv~M&9;kG`hq7Rpn%q zER$wnlxASEFJNMQ#O{22&TaFR56kNxec7%*JIgTIJncoeWJ>AA6KnboZQ`idKYhpC zU5oZyPiwrrMY>NY{woV3e*;th=hVzyQoo(Gw=Qy;*3!VLwVNlpt*F$ZFr_)tT3+T! zN%FBGbtjj6?bQqlQ8(Ef(j!A;b?nU>YNVO!B862tO%+6~?F2utZCWjRZF9uiriQ>9 z1`=&db5@0yRZiQjA#M{BtJn~|wS>*fNqY-ZiHo-UvE~)iI~%@lozcH2@x|_?*;m}k zgEwC-IuyTaR=nk;bHDRcvTM#}9=LWWZSRp;t8T{4Z(+}tSbq9g&#s4hCluw_c5F4{ zJo@jLo4wAnISD!f^Q0WMb4i*9iYo}H+ch|?k&@q{nabiRK4GD(ZNZj%FWp4LHzX-A zToq-!dD%iPM7zw9frnwKx{f@rz|!PU`{;_irw7g6wN<k(i!ivF$T8#8z7nPVPxK33 zpVDTZ9H3|<!fLuIkWumggQ)c(!4D}OH<i<VTQD;<8nIQGCrZ^gh`bVC+`=So`(X*+ zV}>Kb*%LN*%f`e^f3Ya>f>hQ9B~B-qjYm(fe>11vz^GikOQF1R$xr5E#^SaHX}n>K zA_gT=7YzHBsIFa<m}#^39Op*IGUf%xWmfi_VoPA$aJu`|BI`#V+5SG=m-ED}af__) zD{n>@Kkk5kEItQQ|9V({c*%Y#dlK7Je-<sX0!N$6C+9L)r|m8&+U+#4v^lyu;zZjS zSE&h%tXx(8%PzeQ++`=JUU^*Z?4#{LKfLr`o4NU%{INu4Q4xD~!QN+6&PN_*EmP3( zSnj6CAZ3|*WJX9@X|OQ&TXsfuvC;(*pDbP0Rx;?FI>so~x_Bx>g_%}q1N-a~A!lvu z)^>@PyN7)G*!o+@yy}d|<b&)xpNXzDUVLin4#5pw2BqRtIQ-X0GW8cG9NK8Bcp#)C z?7U6n&Qs5C{C>1R<HPwG-PcQ+nbu!nesI}KYyqRi14R!(HlBjq!Y==xCJp=>rH=$} z@Vdxw=E|K#xdwj^%7y+DkzdEVJUeD@Y-EoAscgOn%!QZo*n-*b2C44~sxkh?RM)`l zQo?+}H9PCa@pkJHt`jWFS2MC3m`{Ghd?t0z=VzNZI<j{?5-VERv!Pqgu-I~oV^bZ& ziuG4g3LPhWZMk7_<oMy8+Po!fo{l?L8156)GrO7N$eWw8d&cHdoDWu()$`{~cxvMJ zL`VLC(Q4OY4C)J54~B|+x9<8ng^_cObfC>{-4I5ffV+jCH(gnqsN9;x{!RA2U{IhG zlm3V8XC;oxYTIvLp66CG`R~%38U{Wo)zU53(imEp^gejrbZgx`g(28u!ckWjowpNq zWhyDvY96=VzsWb-v(fFxY}bb$3;r2T72m9}^q&%|2H(*gf(|h(2YO>?->=lH-{9?h zWs{f1i{77)b&ssMuyvl!6=s81Ud6N7d=BgqaGX$8#V{#}G2N;2)U7Lr1C6d;b|~G+ zP#K(ZVCti@?T#6TBzFa+Xsan?scET;Jvz_6^zSp*yu~v8AD`y49xZBQPP1!$)ZFQt zB%IIl%%e-9>?5<}1fM%%jGi4iyOtE|Y+1^3!9C1|ZEfP=>)JKu0T$Cfoi|uh%(fv@ zbi)G{frF9TLl13U8r3Wk{UGq{pBts0*+P`q@(jvipKttUWaFQe!+3y!{Q<MOd4S@& zV?EV=?U!=|4AUmq#Y_~^wAipjy2$<Q!yx8G|3so+v8x-b65K6a?el)iE(V?likwUh zO!dJh;!;=?*#3WF=i#0>H73{X&I|^VWhYwXJRULMo!jGhiP>%gW6)H#;15iuY=XSk zW-$aXEQormuBO4;5wg-_@$`tGrtjXnKD}pnaQKfRyYiO8Gw$}sezd68Wjo%!pk~DA z^6~ju_b=_6Szbpno^omR`0K}VC@n^YVdpg2B!x5gcCre75c^u4#50X?K~1&@gV+6y zY>5i&rh=EJTw)Ll*gf;LzP|Rk;1kE+>}8dj(8l9ivNO!*%$4lGuVN{`TN0}n_LN=c z`xeHR&+xKid1DQO=>MZGxl`Ztc5V%0aS7PPSY#N$ThjF}E`FzJ(@j}6JA*HeLKu@1 zj73rvWj9~CRF}=oz%*@B`y%CYK@q<mC`tF-`+off!)hk8DZ)&y4+3BAsIIDtb?(jo zTY4!<|K&nf0nxmikAaO03@x0ZLJ=DhxW(-`__bIzJYZ?ml{C%!xVcrym7P;5=M2Yj z|Kt6ds!S&;E<JXc%A({VFnMCP+jK2qqdO-B9yjsWN$c%sOjhvhH}^Tj$PoPeRHORQ zI}sO5R2#We4sWrkT)wPrxrq9m9UDuvuP<le60kTi?EoW-C`(xG>1nC%OJa=M{=T@d z)PF9wOpnW~$@;D{&1Y@9YH56kmpk1uuW**pp+*)yJ{N&brlV6d|5g0!QH#A*^0LSM z?>rN0Hg^fbB$ek^UmNDIa*5gmpM3qi?}}l@ic?}9)u*rB*O;%DAmPZ|B@(>p&&JuC zwEXT%^PXC|s_?;qHKGzG89%-;FpB8S^02=<ujJ`Ij_osSI?dO|?384Dow8!aVn2~1 z3SK<+k2Wk`x?E4WN98bI_A4tBr6|v(TuKL+`^+y1B=hu5+3lsb>yp)pMpms831)1z zB@=e`yt}c8>6zAK%{`0FR=ww2CBve?_<zTQH%p%K6r9#%ew5UwcR+2m!?v4JB>~Jm z|5m+I?h(85!u)oL&x-~wv1b2;XRA)ES~hJ{&YOm_E?ftVFZ?NZfA-?G6AIe$8~%NE z?lGyk(4cVh(F%RuNyii}EM4{E_QwX+8#aE*?UyW0_8C?sXfSWGT63Py;z5DQ&N(v{ z7cJT@<m%X^xuST2_H?sdjBbV|y=U8{HFWb29kiQ$$k)R6ve4Bx6O>+SH1C_jvEom_ zsvJgLlcFoCqV`S+oA0Uk7Ν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≧hojPXSEAdKCS(h zr~kcd{r6?kv+CCW=+pl>ZT-)A?+;7K{#vL1d)xZo`}F@5MIJt;|M%MZzxVY2-CO=? dU)H~G>;M1LXJ9w@u})zl=LW{>t_}<g)&R@?1pEL1 diff --git a/docs/images/tw2002.gif b/docs/images/tw2002.gif deleted file mode 100644 index 1ff78ed042d8d7f651992ffc6f7ced0268aa164a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12023 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 diff --git a/docs/images/uedit_v3.gif b/docs/images/uedit_v3.gif deleted file mode 100644 index ecea17506dfa5ae61ee3620eb5119d49c058fcc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21347 zcmZ?wbhEHbJjytk@jC+q{AW;9WKeWsaB^ZuPG(4MVQ6XLP|W7g%oYHlVgbWq2@tB5 zu&h>O0IOA0RJ5#Cv}{pya#D0^(bP25bZXJ`YSHxSG4$#&4C*lqnqoL*ie=Cg%cv=q zQFELa7@QOpoj^7yIypHxMa^+aPIgM3<J8jPl|08Qd8t?S(xB|6LB&ghiq}RJuZ^l+ z8&$nES&<=GQ85|hD5vD=t;sE0lUw#?_w3E?IhH-;SoYfD;wi_9=Nv1ZbFR9Yp}JbJ zy4tC_y1IJKx$33os`omzFfg<@DYiH{wInOHw6wG=J=e1ITFcsNJs@<iXY0KwAoP67 z-sf}XD9)LaJZG=doW0NI9DBd?*!!jD-Y-4(eQmbk+O@@d=Opjl>$G?8-o5t}&z%dp zcJ17~d&%$L8~$ft`2U~b|0o#BA)o`w0ie9#!10gaEQgH8h6M+kIfS)hPHb3sxLrWm zYmUdpMMt|OjI-{X*qH1hoOW%7V}n9t3llq6$A*JT&P+0}tBDD8nDk`UZ1YU5hzSYH z&$Dt#=tNvl$Y5S%E@=|+YQaI~<-BSZr3McjuX0ALO}d+v*wi{Z&d}$;hf-cP9?85# zvAY!yv+?AbAIUwP=p4&ukze%SL*x6i{Pp=wKNuEmcqrT|xSV0(50@^HKKbPlhL)_| zBD!kZBR1}IO&6aR-B5S2=?k~GLCl_tiBiY9CDtS!o?vLrmMdwLbmo9=a`}51qXHK8 zdCKg4k4_Z7a9Ee@&iCAU*82{-y;Wc3tv6)f|F?Me_je8l{{1&#I&z{y`N>7;!bS7` z3V!pOx2E6!zvo{K{{=P&&&zv>Xa@cfKPvKH(4ti&#K)1fi8JWogXXY+g{>_i5rzxJ z#IhO}w#nozR1}YDIB`@=sqe(m&X|(IMIJn&iA>$DA{SeFOw1G~b!%?QU}InqII`Hm zqA0PgTd}u=LC{G<;2<yagbha|H9Qm?eN|KgRGF+a3xb&({%#Rw=8{<|66mG7G$c5{ z^Xrt*kjSN1!(u8`)gzN9mQG_$Po1D1mA~`p^O!Q$s_C&cqPMOuY!-BjNbEM6Cc!bm zkt;K0VyK&Bs!qT)$@ICcY`2y#T^S~oy<%fp7LUP#s@b{Qz8;&s`ro0m1#@_gJvDGH zJg#~CPVp(n=c`LEe=LYCJ5o0NZu$Mz@6Hv^mM)L0zHn&!z3OkF((`M7z1=>)j`1D) zf(8bm9Se4FTdjD|%;#pYaF<w=hGM&H){BQ7ijyMryVO^mXzk<Lxgt4^fj`r!kF(b> zU;>kP<^~6DbDIf=({yAE4~zK62pkaz&)IlHBK*w9!*cC=HXf6Y_6ayC)SUC_gi?8q z(J5W&DTSx>F8gdcW!in_(@Bf?H6PE}9zSDrMw@%@=QB>}He1eF>c1_y>?^E!>9}ps zoyS-0_RDO!<aT<^=WCwzvL;S3>Afa5+}mTfT+g2Vw&-HOeV=W&%*1=jE*D$dn*F=O zKK1YB8)=tye_Xcn-uvxg?swiDck=%CnBUg?TvKr}=YQ<Z`xEEO?tC;odY}2_9`Aic zcc$gf`}trw`#RGLQ>yRnx;tmFp7q0a>2;g>EB~%&lPYGO@Y^?ZxuVT$rk{P2-|bP} z_gE^~ME>#T(EPZ<p5zZ42P6!?aX;>6D1ZO=`-67<e?Oi~&#(Kg=&Nh_vY&g6-P<?+ zeN-k`or~Y&6zV?Zf1h08k@p7`e#SrPxo*oK;+THTdjXU13ri-ZGYyfOXS`qMeo*O6 ze=ggSxUX}>7jx^a;ka!*pTphbkkBlFT64*{SGk(D{(h=o#r84$)}rsq|6JF!>YkC9 z$iwEua8Ix7AMeC__gil4=iqx%@4%(-Ml9U&gkfOioa);Gq3SM|O&4}VoKbSk`?N>W zc71pJl0b>07Rvfn8@u(n7EA8m;bwO1MNh(%iIR><o0;`mIu<F*-k%pCsH9|=sPkz0 zSFR+Bi4vPU+I>`%#8;khGx{{KuSZ2iUGt<@(5Fe$&ZwxFuRQ5j^l9=u9#su@%~L^> zK22F_azmbT<&j37Nl7l7?n<Xy9#hk}IAw>+QoZ7nr(=I@nttHVQiEpCGl^2hQ=PLG z8#y|iHrzLH=Gu^Xmmab2zZv*>*0nQfrrSGx^RhP2e(-0R#a_>I1=EU^DpWe&Ui;=G zzUe}n!IPQ$uRU;JmwVsx<KLO(cHc9dS}pVDJmXoR{jk!$TxiQ&4q0jbo$e0RuP)Dj zr4z@S&9U*X@8yo|+LE75w)rV}P3(X7c)5qW*QH5a{EK3QUs#4`?b@@oq{x5Ha?e7h zi_L4_&tLjG>eZ{T%PL};B~{+)0ij+Y4N_B=Zay6?(jOJlqj#~?&m<{WKHT+u?YqUR zc57<auiDmg>g;L{-q#^By~6fpUR@j@njJJZ>go~2cS}=4Gll2=a-QI3P}G{Ty#HNW z@Sl^yDp7B)cQgGKkj!FPz1>(RiL-m#<}}fU)irClBwq{UoXg+1Xz^-(e$6ZA{$9xM z+8pn=+WeN-r}bI(PHTC~OB@fc+pu7j=|2rVeya;N^rpnKWiRLTl#agqYuW<gV4cHN z+_$gJD%<*Q$-}trYUc<4%ogr0o$qL~BI>r?_HBnv-xcvz-FhSxzVpIgg@o7Ntj^}? zt-n-#`*jD~#BQeCf?Fcd=8Jz_oN{P-#j~k8X|JW@=ax-fKYw+0#Cos$nwR(v*tzI8 zN^2*SG?lK*oUN1LxclsliRFd8x0Nqm`gv)tm)VNGwFV8wJvTP56kYb-)<D#e{XxXN zqEeyY2M*j_cctPt?B24}uzB(i>-Uyls(I(GoY3y`r1smFLo4QH<gSiRmNCCEM{(<N z=ABZBg6U=l>_Q8|D}P-*c}l#j;A!E+<37)fX3yL#U$_2W_2ulVqN`_4eX_Wy>-nDJ zZ1>L`?S5j^q8**kT48Z0*|u;2yX<wR>o?EM_`9KMzShI7To#Ah*^(YEnE8Ch(aBpj zJ<a1wKOMWUEpk~p-_{lGu})L;ROa0Z-Lz`9O?1mGu@w{cs{g2qai}?U^EBt>qU&G& zq|ZsZdc=vvbY-LYn<VMo%Xtz%H%*-z%)I^GwqwgyG8A^Dn=s$H`Sa?kZL|MIItxc# zxcO(>j^DS^64Zb9<+5c*AJ0u~581s;^07(D#<Dw4HdUOREBtMZ@2SOiB>S&zvXeis zxc1HW#<IrCscV<b?Rizad&**-w;!3ibF!B2{au@;`u)|NJvUtYbLKItZ({n#>G#P< z-g5Jd!)79k*I!?I`MX82-}u=4G;fD_GDqDO&ykydHY5MH%pHgH^5ESvS97(c7R#n> zx$wXGJ<EQHexopp!%P1~OXwHw{q#8Q<o0u4XDUS(@|-cbx^?&U8%pMnU$9jk=&U`j zz+U<G%aZi{d)srS$I4uH45^$EzV6DJ^1tsJ%s-vkX?y*O?VNLG*1bOMSzFw5HRk%; z*7e6PW<3=AU-Qy&|DI>^ZwpTS-gz_k=<cV+^B-}qo_y)rzL|S+Z2~;L&pnsT{PWJ^ zbKkb^-}~+BoZ1KF@t4-m*L#(E{!4kJebm&=zHfzlsy|KlubxzQH@iH1+e6cuAM?De zHby<)`)&Kb|9hV=zOy->b&=e9nZs|y@2ri!YE-@X)a9?AZ9h8SwR!ej|9|16`!7`L zYCG=k&;7Od?&pigO;(uYCw-6cc~(%$mV0M=1J8{HJ`TI>-$EHH;=dg&x_&+KczPZG zjz*aqjnU$bUF}t(&kME6YRke(N}twiMbt0Z-lTh?NpD5Et#RWl<M3D0%C8=;)Zfu; z$kA+fqS^jMeQj8sS$pBLw36PbCDQE{3N3cKSYs{R8df}Q42fv{bHzDqd$UiufG|gO z<q?;+%C26`t(UH+F1udoIHS#BN1N@8LYpH>Z=R+8F0FFqaDA#8YS~^NuWFbgksbD< zJ>9G+%fr|EM!SP~`oDGR5v3Ao)#8~}H_Ba-I}}+vrdXu)ns@A;7Tm^>>i#0KdV4_k zj`Z}368^-h8jkk5h|X0nO4-b-oHTq}TDqRJ#7BhXC0}lRv8~0{J@G?%m%#R}0~tZ0 z+bi~zXV0F|?meUEWm>3abGKA^lSV|9xQG3Ii^8+hYqpp>axSU4^P=qbkNn#a*#*;k zA4~LXyVf=NM8h$SZqpwrchlN4TWc3~G|f#-y1%^Mb#v#ol)gV26*|s6ySMjkNb5@T z5KNts>i@m+$J4lv9jOyFx_`HK=4ed3zidJ-M=Cq>#8VwD6Ed2)ANJI2Pwtnf6DXS~ zQaMR@=A_&ituNTSTfg^NJ^xoSwXIn=t>#BZheqZkt(lW;b_Ol_k>K^TGQOg|B*Q|& zBhq8$6tA6Ad~Qzh`#HtelFd|IC?rT&D8W`OU~0%B;fO^Hk&mW22u`yu6iK<skeZ~% z+o0zAQ6#8PG>=og;F4&pqF7mzdU=sp^(HaN59)b};&qZ5O`F843pHAPGIkkBv`w7R zSH#qFa>j&@GbSZ!PTI*dWvAxChms2(G0iWMnzK@B*(0e9jar5Vvvvl~THhpnXyUBH zj@rj3YM-1abNZw90i)TM7s?)Q(%CUn=dq#O(~mkAHpv}$$?`#Q&Y?`*tBZ91T-0S$ zQh4x5K16`^=_iHfO?n{#tfEee;)@g||1s&`(Nt1wQc`Ks*PNvP#B$!VmHICt=e?|) z_v+@nXPPQ)$y3=27*ZZE`W3Nh8O&!7U<~CnFqtTBJyDo@g0QFKH1ou1>{Sc=3x&fb zF31iLO}J>AYA9CR$!MN9J!_(P)g@c$0^uS<jjBNLhK+1>j*A*MvUO-mC=>{*D@gP* z&YT(~Iju-?PT=Bs2Q}v@Ni7u8T2iF7+(>%mCaoO{rS}MG9~6|?t|YUqNqhZHnT<bX z&VH2HBB`@AQfGVR>=TQ0&K#Qk;^OQV2j$|kSl$cH@&6$AwQ$bwhb(_K>YnCQ$g@(o zpvn5ENbhpy+?P&@uap!eH_g4PseivxU#&^$mr&%t<?PB#DauUF26jdsk4lxy!i7y1 zP7O~|jp<aKwu-@)Q6%P(aDtM^T(4=VhZr&@P0KVA4Hp!R`luG6IK9|tdfCraRh^7d z4C2)*84E8?ud~!BH=NOSNWA5sc!%Vg{!KF`Z;~+3lAN9-Ib)%w*)K_}Rf`uDNv%{| zYd1@4^G7MCS<?F+YVBS)YwM&X>sM+Y6<m5jQTB@A>>G(o?@XM1T1oEgqowDVmL24r z^X(yvd%~RSlXU-1oD;~vdjHX~M@9<gZz`~K>s6l8lb*EU&PzqbOB>Wa&3$-to|e(Z z$DSL-qBlxZZ<Lz7Q6jroyEysc(`*^>Ue%iu-)`&C=<bQu*rYh~Uzpd4)W^ruPlrtq z?3`@+I^n<jCaaelSv<qpIqNUYXr27srKclf+l`W1w?vN>JrXzU^gNrYKX3Z)TDkYy z1hd`g>vmMit)9?cHl;kHY2xvooihX?I41m!$kH^)J9M?l)V<e^b!vfk>Lbxcw$0XC z*cf(Cw$Uu!o~B@v`N6b|JEbz)?5~^S)nrEn>sW4)vPr?)q$;*O@8~o9<`?elyuKu^ z`Ki&IFk7#(sOjIfIWMyNyf`M^yk^Z;ud}Af$BsI5u69lS;Qrbr{G_wMp3RBtQXC{* z0(lH~GauZ|yk&<%cEthlC`Fc?f2P>wWi+*^JF{nQxtnGmF~i`y`&O~cgouCDf>!Li z*Sf5*3-!5I?epOG-bd2=o>=dD7QOF<^}hADl`gt$Q`)gl;c}FI*}gBc_kD}r|D$^U zui5+mMDJU5WM2r|ruS-sR*?s6GY?qLJiyU2F>!X;+u5eSCp&*g-FEDDY14`WsjSZP zcbiDBaToa$;AWx1FE;tw?m`tE0clfP{ynifMO)V|*&QQMcx^?^&UD)+GkVQxszr62 zrgt1{5<9qEx>c`bm%dNQ0<q$Z+5IcS40+3&--L%Zi|<zEPU84@(AuX+ba}ZgXWifL z5gn;VpRYLLd@}yU@huuU{g=xUf=+MZt~ucDy6M)o&2lFvU69z)yR5ZrX{5@{ErxqM zR6OhcB}oV-+^Oak&J{ac(aN*4z2@i(<6}nLCqD0pJ$!W6D(+U#X;Jl}`|X{N%zeFc zUQXGiuYPLAflGM&J=0F<i}<fIO|FhUH6v!{_UKcss|-z5O1GWavEa=i@h6VUwF9}_ z^QUQ_K4==T=#IhF(v!|Ir%&hvZmlUh^XJSGp3~>woD5>`(tWw-B}=83N1oA-i49-- z0$0~pxSlz6+nsIOsj43L&g1Pz-qg)=-+S46%EzACJHJ!SA{rmHm&8=}Us}DzTiRlR z`0+b;1n=4$4c>FsvwF+-uW2WLPxcMjnjwCXCuZ~8jQ(<q665HmFgDZv=@Sgpl1({} ztg_y=^M+ybnG=71{Hu`_F0<Wj;OkTJ_{+f}?l$f2gq_bW?*AUO_sp5&s+X4UuChKm z@$jAGyz6D#+^^({_i4ly?fY)tJmpkc`N`8cfjMVNE*z@~Zj08uVH(c1#b{=g!qfBW z9p^vs7^?5RaxkJi!{WSSw|S$_`NzhWRbmfmtJ|LYvD;wJd1sE}5vA8M_I7<p3+;)% z^wIp1j#z!2Zc34?qe+LrjypS#$DE$gbLwb#$y@Q%P1geMTO9shW;46?@O6#C9p#5T z{#@5s(k*}bWT0=^s@&wcJy|@JNB&JaywJ92DR1LylQt!dohIJblXbT(3U}|%z9m{y zEb;K_ADt<glW(lixYGO9Q0k7$$A4FjEOR|}Vs77&+M|uVj#jl>z8*VTu_NS+ZclT1 z`R>1IcD_eWv}W4(CU1Kk->Px=jz`X}^xHY@y`OFG&z*b!M{n<M-oDn`H8<yqNAeuB z@;$lX>y^tfd%s7RWgWj+WPY1*-Tg1QS8~E1Se4wnY(7QP`(kLW$z$6Gax;$3Ke0(^ z=hcU@b&Bt5_Q)D3NG2z4KWK6N!uLCA+Io+qU(|MK-<&OD!n=K<ANO^Z<&R}9Uo?Js zV~b6)>zoHalPlu5L(Tgh^R2ixd(FLRXD&zh-ITf4@y6!XR`mx7b@z?`JY|Wyw}^R? zpy1}RJ>BVccY@|!dyz5W7f+gH#?~9LIlg}jrQU`ATa$D3!`jUY%Ae=w^&OjgYx?f% z{d=MevfF-l9Bodw%&@x@u=dGWp5rGuUTo66mALM(mCv*0yfk~!D#h8+`g2aLv3a?A z_I1vPqj`E+R(VFT5>I}d$w@jJX87l2mre1aeeHc`9t!@gYdTlaKhJby+|yNcFQ?tR z>VNg=j(cy;$=NAz)K>3n>GzFsTJzLDqt;jC>G^wak4eAPvwNH6*BvuEWAD0#d-LAy z;A@)l`OY_uE2VET54=5`>+?P@=lu`8aKArSRq~!E-7VyrYa(rP_j}xXw)hVm_b=>k zn_&F%$&!f4AvPB#-FUJ>=juwiBm3rjV4we9YW_qWj>+w|+Zk&Qz18^F-gs~8W#)-7 zyi?pye$?Cl(O`YWn}{&~)z|;5d##Xve(Ss2MarFb*1eOLc&_h%+0f)O^R~}&ojWJm zJXg1SFQaB+cmI{c{KvX>UyS9tza5{j*{?!t&zBE7CM@-+=vM0tlmDE$|AJHZB()d| zxA)gR%YCrn@46Lp++xONyVI=#KOZE{^WUy(_w~usdHdeI`0;tcx~s=4a^KB(c5b!N z#C7LP`yO5XVH(I^QEUG-^<RGwe?`n!N4NfpXum1ak|yQ3FZ1ti&OYCwmH%zk{10+< z-#UwbblPw0)yQ1l+?}6$q4WI@&bPl-pZ_ge-{DyKDZBROe%oIydygmVewF$D_nG^@ z&;7d}FUxmX;OzOG8NWBKkH6UehW+pF^Y{PU(f{M{v%|ms`#ZI!!s>r7=Kp)O|KFSY z|3n1mt1M&?3Sj&d$)Hilz{J2Hq`=}Luu_##fJ1~MWP-!Nre-c7y@Uk|7@gaB<jfXm zd}MTG=T$S=@gt$hy<ga_OC>Y0$&*_`Ex}{wBvrO)k_o4l>|{LL#$#dr;?9AE&;9xA zENeJ^HLkeGuVB&OaY}@xL)d>|lZWBftS({A4Ov%rEz0f^)j6;&!tq*8x0v3kT^S#h z)<%o#$L(lP+^*Lnp`Uc%fV49kkEGEbwt0dQ?GF!G6rDI>sNDWYW}@or4xdW*K3OZh z_YdyuH10q5&%Uff?eF0)nOE!^X0RnaX`gs)eeZ#Jxko(T-rm`7QMqaM_xI}la~wG3 zS}Ue#`1iO^Y}&I^L^EWO&qSkEuaegxD|}Wiy2~~7ebkB$^?cXUm7kwqEw<e6dRpvT z%!A^E@%y=_>t&yL^Zfq&dO_hYpYt7z8IJfnF#R^3(9Ps);B3#LwB`W=7r#Pcr|}U5 zW?p`dj(`QG*91HkusG?QI3f@nvw)E`C}uIEcznypqoy)54jk=IQsH#xj`7i4Dv<c9 zkeA1(z>rxv_=x5a-fIk6F7rDcDIDW>T4Qu{dCZw2UV&>JuU4(u@#~cK`V(FU*K9iH zq^)cAyy&#A#G_rWS@*>K`;o1G@E?~?+aZq04>w5iRj=9TsBZkl=&Zr*GsbSN(r+(b z3Ubah^@?4**7R1Ib<(ywIiE!=9<)?HvUobBxoPLqS;=`_FIROZ?S8%Gw4e2dEM0%@ z&&Qno_kO>1*=b+=!{4F%etobuaQx38vVnu;|K;-s{`_H1h+_CAz1Z=WRLzARe!&Au z+@=?HeBcq)So7d;qgzhk5#j3|8ZIplcmo%SKA-#XUboX1jU$r9F^`Yc2QuwgI=!hy z(_>Z>kD>b98FxH2G^%$MX=tqFxwx`>_Y<QdYZmOv(w=bA$8n9=F)i)0CMT1+b$2{# zTBvLFbV;!Ofe)984fg-i(J?$G5q!q*#6OkOjhjxH9riIkHz7?V$U}K*i0O*t-CMTZ zGW&Za_+gH)sD(y__q!`W6Rkt9K98HL7xsG5<f+%*A7XwV7E>8|esBD1wXz#OU+mVu z^>@Y6u!9WWlgkbqT<BVG>z}~!X^srr--<P|2rwu#3GQ3L$aKQJ$Dl~)YHY^BHi?Kp z#wzVaD;j$&f@+ofb67f6Zun2SyJUKp*UP0di;llkQ>jdf&{)u7m9=8wB%^yPm(QA| zwW`mW&C+MXF`b`JHV4J+JiG1DqSL8+U!39gKk(<!O#j0t#6>ckn#E=ro$iY($vp3o zUA1L-WcRHgpY+rBU-^{^pX&_ZU2fs$ajt0I0xgXxXG8y8@|0d9b7OAQ&a+%QyKb+0 za%^7QMfHd;CueWmmB1v>7SN)slE~@WAul}3AiDSR`K@OjIEnAO5M?|ikvGxfu+*~; zZB|Df@|B-(mcC@rX8&cOK=q0FN^*gnjwz1>dT$(2XEN+`iFqV4HN#cG$*|imWs%s% z7p^L8A3Hr+9*Z6Aa5d=*>`mRG#9e&j=)Q*=>{DWt#gjFTTPbz-2C7_;o%r;)<-EYY z%s-E%ey?yhx^&ULg+)by|EHTKpHP2wjEdZT4o@GUP2F8fRFpq+xSGGakbhNaspKkA zcim|pC-&`m%&&d(r01bRhjnw7D%#&X;jeb0uRms~YJQ}5?6aV0Gyb(amHu0C(ue8t zw5pz``rR)*59FTiUtW@^>ATV*iA$(2L}am9`A?sOBEt!hSJI63R=Otc+cfjplBI^l zH_sK;ZJc|&M9uc_%hNfJHqYE4qh|8==ehqDD_Xy&q$&QkJeOGZdCr?V%T+#~Jk_KW zvhbZxs)2e{Ku^$=X`g+T8wvh8-=roqf2~ZW%fp=k6PB6u<b|kPo;~SPc*tZ?$DS8f zxvLJVi7e!>yt~q`_SfZkY*UxpTzwf(n{{Q8n&=8|)mQ!#yFwN?g|76UyDF$zN_kCM z=<4XRSq(dWg>EP_b#!05D)eO5wWW)`t_cy%ioE$NY`d7KqhZQQ!>bG0{@pQMU!nR> zfFY)3hY5?>2BEwCaX*u99QrhMCc}r!t$tR%`$bC%c)7Aub*m%Kq=juZth(Uv`lZjQ zx@|LV3Egp!HV?kCENtuQ*xb!byVg$oW$L=gcBxfrcj&=q*QRfeWzLn(I;CU~w&S2` zjs&AY+by~6+gN6;*<|)R=7n4Mu86m5oPBSemI*SRa4JaIY%BNC_lGuc^6k2o;#qz7 z>A$zLUOYXoc{Td%k*(%CyAG>mhrf2Z&gHkj^y%C9Zi8e0+B6P4^qmtX`TLZ_uh5+* zRP}r$Z{NuLTe8zMXI=R6>O`LOiq%*DJ}a77eb+**e9|4({EpvZH@`OhXkV@?&?IG^ zn7v8-i1D(te^rmUld|h74t<;ZQug!ewSSHU@Gh27jgNhKIJ4LB<cYs|ah-3>k9q|i zJdygLFaGBPLze9vk$E31wAUmWv`Zeoy7WbUrKPiwwa}!jZR)MEAyJZ>X3S96HExQ| z3Y2^NGs=El_U!J}flZepx2pJNcs`%ACN(nROn2IrRLhui5l&xv9*a&`^4{l$wb{Bo zdUc=YXRh)~`4oJ1jjU<T<gM{n-i6z*z9+Ui_HI_h{-|pkmwjE68=D<-KkE9<XJ6OV z-px+<A9drP+P4k8u{kO7(Kk<~ecKfL_f5dF@<VwsWm{+0=4Pi$-@bjVZ2Qi?x%utV zcOI90>-W!nCFwqS>Di$7+5e9I%_}-Ceed(M^1Ux>^Q)iFzV|{-dzF98?N3%2cTe%` z*vH$K-y$FLkTd<qA=!Hcb;j54N9M%D2Cfb&NRxRiEv|dq^j_hF`j{tj>Xj$F*PU{V zuh}DLzT#x8-KXjEW1bl<w>*<;_j&epndeLYZAnqr%bN1caILd?)y3Yrk|pY~FTK;N zE_cUe&ULqa9z1{1<+XM@WaI9>D9BwMTzcwx=Xs-J!q=A6N!ONbS^jtRB^ULpOY>ac zb4@-lWyzbHH`ggx)`cI@-KxHjllQiCl+31Ax=-(|zn%8{)3j}ug$f?Cp80XlNbb|b z<+)F;*8Oz7fA{Td{ogf#n#tc+SsYuDv%L8KKd!U`kM|zanwL14|L?`Ns%v+}=Rdix z`tHYN^L?N8&eeTiyZ*tw`(_7bsN0nU??1U+UH+%o+uhFQTo!lQBR@AOSDd%}86<x? z@Izx>^-ACPnh)*wf6VLEd_J{4&BOo7`?G)Qo~8Q#t+0~cedhbJZ0@|gi(=*HA3d-C zZz}Ei&UpXDU0c2yugKThe=f+{<CFc`rX_C|TgO=$J-xk?bB)84&s!LlIB=L4-#)$E zd$B#^7vp({HOvk>M7`SFXXVg;$w6$(0kI?Nf|z#+JW;+8eQ;X0{m<D4b64%PnY~|{ zWy!9j10oj>it9LCP|{G*aZq-#w@KD03Ockv`H+-}qskP``OW{f25vT)_{pL3^+6kH zX0Ojqh9<iWV^;ilypBod@RZ4_u8Wj~HXqUnaW>Sk{#dp7b+S|3BD3;M8?%e_?YD>> z^4@6oXV3Lr8%rJ=YIkowFmc*9B^PIz2`)U#%yV4am$+=&t!b`of6e;H(MK-+OOE)q ztS?!tY&zS;>5t;|>}4J*E_Pe=O@8V5Ml0F)toS{9pO?tS3zH3FWvu;rTxC8T-rs2G zaKtdlXS?SdwM*S=V(#p|_}fO@%FXSK^N~n5sny4PdDdEM*<^2VJ6yf+kh7u3pY540 zs&Of9hD~n#)`mqP$J~y%mZcmmFfmM8ax8F_TZD?f43DNUvr%-8)AU~sw*Mv>+h1O8 z{d<EY*Wr25#+{q??l*Sr-=yij%f;x4TI;D}S6&_H?mD<HNWFc}!RyZZg^rl)`|VKo z$+c^W<HRS&zcU}OSaae^mc3$+=gc{tv(|XdKBCnay!HCz1Eo@q{YxBWR9r7SQpt!q zQBt*!J7>52mdy)T93^#5y^B^`8MAMNjDuOvp=YZ#rmVJ@d&Vo^v7_Z452=<z?U&rw znw$<WHd+72dcKK?agNs-pMwioRun0DuShwyqvX`a80B?Goa`Q*oK|vFi_2l{<W(zz zRxdU_vn=?`y3f0|WUV^BM(dc1&(>LI7A*2v)NHkPIkTY9a}oZ&gZ!{WX0wCDaM z8V%k@|Hb>r9RKC=`j<&~)5+O$d~dB;Q&*$ZP<&D-_{79N7B`oyOH(}6cgj)0#5e4< z!`oA?0W!AdH@g@8Ib!|C?qRbH>*_rxyZ603bMDrib3Cuz!@d06V{AY69J6O$*-*9T z<|Ew_XRnkXdw*>U+b3!ZkDRu0J~fNW^VBWdho5cl-9CTs@ZP^){NKr3c)rW`z!HC< zIZmsWXs^HIFCKY*O3j+4o)!CS{C4~~DdpnHXL9PkN&x>}&*&%1_xd<R_N?4;N6+>4 zhMliGFR7fEwmRT_i}U6?K9et<{rfvWM)tyVBd>cofy<t(nEQtR%pxa#nG@|L##5gh z`f~WfW|siJOI8}aL7H>_1!=7f(u@sUa3)Bi##?~pbb5@{i6uVAT6`8Cy3}Cech>o6 z9@iP`U|-#(UYkz`T5di0QhMv1EA|UQf*pQe)OZ!};j#I)E7N|&EK-v`Uzy|XV(Vhw zx<xem!v8roS&rxb|FM0$WzW&-J+F^k`4Y3|)tumeyLVgYTuC$uk?nR1JYyL0_q5lf za}u3b{%x`GZM}NdXls7eTF2V6R?RBctGyoWIe5g`|25CPFxIfU!q>uW!~Q+-f1rKs z{^u(ncKfQ|Io|Us&}OMd*xZl@+yTkD7ar*7NnAamRvPHd9sXvwZMtpv|L%*DcQ4Pn zbT(_MqrI+OROr=wS4)M`@U}NW+E4gP{=E%nTM}k#eW`43z!nt&tFs=Zuf0N_o_Y27 zVpQyn@J&ITb0fOeMs%B66__4~j0s}7dc%F!jn$XWNUaH<*R#9V$55?%=}vEFpEcI? zwKq?%zU-XkdgF>Kk4S_{PxvG6U{j^YLs@=_I&M#|9Fz4?o#ty3zSQRU>MI_tA+K6O zm%a60w)UJ~@72`Sn}(-vbhs>9C~CVt*KMA0(8OO?-D{&#O`}&$4Gmu##hvQu7#hJ) za$RiilIpqVcU=xkySq1;H!LkTjQRGp)Y5=lS-Uk)uhrLhe=E6IBjPBfa{JEhXojgF z2U+h3JdCvX6xqk>Dc$0*>!{*f-Ixoq_C={N_e4zo)h0!@{JJxP^}5QTJKs&53pbti z_<YHLEB1D($@wGR59eHyTWV~-D0p}2-Pu{^FXlw>{^g(G8}~Fe?isJIvhJ3gU3P!A zs2<6_cf>?ru+@LZ+ND=`T-%r4JDYk#e9@NMy7yl;UAwBX_gZkg^sdX2+$XI|4v4(9 zFFk8w66^U%<Y>^>W9#Q$IQ;d7k4ZeE*&PSdBNrCC{WA@@@HxV))h@O6PRiS8#-r!h zVot^i-RnIY+h7{|-}XG?zXys(@6VU<sPH<x?TW|otG83$>hGBwB3>8pr}yk{)(FYD zUPp6x?o*BzxR<zLQe=bA$wuDr%cUw;Lmjy5lz7Cvcile3rl%oS_b=)8o^S@fq?KRp z*3>9In7dzP-NSEF9%=V2TC+LMP%hbM-=!CGAL$<pZ4e3c(R#e_^h$}itCD)AM-4p! zqas*Jf^L0H(0G?Dp%<QhXXD+cPJeX+`?Vfz;l5bs9c0gZE3ov)<D;QJRApSH?T$)^ zarN2xeoIzt2}?P%?rBW?H>F#DV{NA=J#NsxmQ#B*bef&uyF<}eW4`}6A-gt^f6q0J zb5Gfig{@JF@%wir{M^AsqBlI39d(`;pP*-~e(1rErHMT`r&VLqQvRh1xW#Mn-T2+& z-OHlp;$~fHyFFU<o}lT)>|^1ji_%KME?o-sI;wh4uxFvpG|e+dPuS>2C@p<-;9qfa z?Y;E6IPK#+!N*yA8`M@UQ+ly_vrj`=vW4G??Y6#mTq11!G&<iHo}ZgmvM;0O+^x2) zp*#Mb`=Xm#X_F9~>(+K`ao)L%DSnxvvNzJ_JdXRDG%w|f;Tq?u>oRBaB{GP`S*2X8 z{d<2_>CM@ESqq=7QJB1<a@lFYR3|>RWErWf<#n$VpS)Zw_Q-tg!}<SSs-DRbzmui; zCTs1ttd2DqZfy6@_&%PU8!pO{z4c$#wr8)l#l4>J+0mr<W#YEy#?y{gT}#`3FMG$k z*W3SP@6+4;a8A~;wC6msXL__AWS=w))Jxg^_4R?ioD=hM4m>;a<7!;H+LP<8afNEj zPVQP*_2&LRmbR2@(UB+D<y^6QyZ2wt-ffn4e?1QM-7WvS_HOE9vB#Oe=RBS6mwPJg z?L9He^oOr)-5k#3MIX5rtdM(H=j%c>fynBofwz9=-kX<q-^~B~RUh7%%X{*YcZEI5 zntSSqsLD05Ij4DEG^tsw^L|kmmv4UT-K)Bt55x{!pK~wj)}y}KLvQ2KPYT_f+?Mr@ z<?5a_Z~oft-xQL(_+8%HzUcKT4olsV{%y<nKQH+7(!Aun<nL^G7QO|Z*Vb>mcb)b7 z@!6`UKeD~za1Upgp0`PEHTU*+xotNlMD2_?cJnmb#|>|9vg?1GZd-UWG`nVBE)V~E zwQ1+u%<@)EiIac(F+{3RM*rWPMN2=F_vMS#pICbCS<BfsYFnb&)<4yeE&TSbNT2;? ztJora_OlC5um5;2^UuG$yKzq>_~Yl8=J39cl~2E*`u@7``}g%nFB$t6?mYJTzwS9c z_DAOH4^3-T*DJpgx6JQk_pP+l+gqPr*<X8Q&8}Mu_7!u?KihHpv)c7=`}GAM-3q$m z4rk1ZRkr$aqV~bb*eK8G3Hz@;^>!=u*_Y{k{-RHOq3QNi^ZVhy*;2OK1o5&S`hNJc z)$)^(#{)U8emS)4^no=W6)t5uyFFIeYS$X{De-%_T2a`c!gsmnlC}L#2(y$nvA+Mg zIa*KZ<9D~h68oLHzU9t~R&)1XE6Tg6d_Sq{Uruh3-{YipWwrmW#C-j-^h!QY%CpDs z&P-bNwz&LLvwuaI{MzdLkM-%_1ecUo>!nrt7q`U!=ssW3y8L7G@@r<+p8Cw?k4=AU z?#ooaQqdD$G39^OX1)Dv=N>1vt%yy(-to<Iy8gYX;gxg!D`jJ1GDW}6v)i1{oAFt1 z)k&WhU(|kmmMdPCU$s2H>L}0UrRtwg<eWLRrm9(N)f^wib?>Xz|F7D>U%gSjdXs+j zX8Y<b{?%LKtGDG>Z?CW35&oOyPWi6&)%>N4kDsjGd;d3w=k&$^jsyHP2i!TtG;0pq z%O0_x+Z$2S+aY^goO5af=gD@?Q|oI^E$>v?$T{x@=ec@`e+yo4KC<LmV!*ZBLT+V( z+zJcEtLM3{v3Cm#%oOdYy*a<uB(Qtx&RX#kwQmb2?|3oq{l#txj(;|S^KE|$Kep$Q z3E+9EFS0PRZt+7N*T(r59`syVF#nfj@6`kHt8V_g{bR}<289po3)XfrtyffdVp0Fa z{{OQHeBbixqblp86!~K>itb!l&(p>KM_=sk{rZ3J>;JQJ=rOSi$z&|+;55!YqmVI! zp^=4?g-6E1VF42Z3%{z3%Yp-okM(njs6-fCdcwrUC83kCU;$$@n{J|6!G#CUn%OMX zEh-Ea9%PyCq%N@4;NXjkOT-L(4s0mVWaE)s<hOR0<Eu8F$nAL#7EE>icYU3VUCs}K zX@?^OWE^UK9QdZ&u|vV{$kN$NNA3!1etC6wc9Lt?{-*FP9v7Po9v;>e+g@;S$I<R% z6XSPOFdk;@5!X+Oc&5XA?777J)Dr@>&c`w(EmEE&*fP7nmf4W{d_`=ud!Ovi^4Ayk zJ~sdGz`l-Of8XLC{ZCHSGbH{y%u)Qpt%qS|-rrrq$~U*C*FQR9UGY9(o=c(7Q_d-$ z0~dLCp0E2mMdRa2kA?oJTvLDl{2ab8skKY&A7e(V7z@)1)+WxZjYpfJ3LY+KjxJDq z*b-Bsc%d~rV~1k9?5qol9Wt{N0y<RtZX9*w)V&hmEE*Ehz+$2i=)@?;QE*g1zLn*l zkf(Cx5(Y1A#+N}px<{8h^fkM>M0m2}-zQH3Ts4=91p7r+s)hz77KE}%Wqf_gme|TF zHZyH*>a@1(om-d1<ed$@KD+Lt=#01qRyK)wt%}Pe=J%UEi%6Zib%JEtG)XDujM=?v zvoe;>ExVPq`l$hP?v!(7vvYU6ycV6ekM;Y@g5#ZCcM4BiPM=e9-q!tY>9y4Ima>gj zg-6P_wy_^Ae>L%WT=i?uk8w3$T^;4?zP+7(zy1VQgu>>tS|<{k`MtCiTSekB9y+D< zB(`n4lXqL!>86;W-p(gQ-2$EWR^8U!p}uT|fHSXWK%lFNP9d8_)`CViRzAfA3*F>Y z6@n(Ht^7CTl9$oNmJ}Z^qnVTatsGx2nc^0?=3$VpZfjwPR92+ujD$AMYcr&}QpHYX zu3M=XQ?PI4^_ZexPp8jqW?Xh-Ue8*F7s+}SZZlJ-re3?5W>BCemC<X)wK8kPQMZ*# zx5jp@T(-0D*URNL0_IsOPt3eEXVs<9?OCfgo?0cl);}YCb%lS$^0=xet`qOAfB)C( z=!QeDrpwp;{rX-00Rvx$LL-;jkAy9PVHOv*N^bhC`{a3DMP7%iPK%!S%{*=fhC4;) za=XO#?M~|cBA4)9QcK}svny}ym4^qU`c!tesa;){IFa|ky5CZJvR^c`S!P-|emJr| z(I)V4@*2Znx$-@1Y*PQCRR6N66-OAg%VcyslakLlzbRU$`G8To!RbBWXB#$t5KnA- zx@YtJrhh$>DURvKW?ppLA8;$<k9Akn<#}SWZ~Ex6@7UR!zlLqjy@cNEB}P|^4ouSu zo47Xg=FD?teGg>cHY^W&Y{*|#wshXkt84QP9+Iwm6})CIr$;2Ck-$Tq=?WRXryZFV z3OqJgva{4xFJ?;gbw@q(MQ0d47BAqI?Gj+p7h_z&lyX7*Rfxm-9-Ae~{1aoDELc=- z>OLsTJ|R1)LjBl0g_n${qMQBCMQnT;d6MZ|vGNzA1B#aG6jRicgTvpQ*t@Z2ef0zB z`%;gb_L<&TI>C6iu+rx*;&Tks4Ez4QluTi9ow+d8t-j-v&!u1A_b>D83R*XDRxZyB z&3hHAf_X)zGVf+{+|c^gGI_IKX-q0hL~4PxEKk4iF=M$MYoBxOUo^YshOzu!(d^cc zAGbHLu{%pTbvyDGscq%BWTE8tu5gm@b-wzJow8CFJ3M4!_Xs(#C~`FL$aOqo)KXx) zZpu=oH1V$3b%FC!3p{#w9E2uSJ=*<v=EsT?#`oI#HZAP2T<RS3a6*X5g@v!yI{GBM z6o|5VviBXM(FEbto16w+(=ETc8Z>U4`CDS;4EKL;{3r6<TG+L1=3mL)`UQ%<JTtaQ z`9C@^c>#~=)w0datLGMFuZ-!_@;5ygzKP3PV#>eJTNy{Uy`P{y{mDdWkym1&37o-p z-!#?gqh|O>h@FdUcb;G@YA%rd@<Q|+>+I*ZRM!<vT+Qj^Bfk65tF>x7ygQdnZs?P0 zvJ&2)kzgg%c|fGWbuz=t1edJNiFt<@+HbNXIW*olqLH>y)3UWPptFm0*(bv_KCRmE zk~dGBY7v_<_o;49(d3vHLd$0qepxIRdS6L==H_E6YylHFMR@$8Jg2s$)q6B+X3B{k zU~qc7Y_ZD%Kgk`J+1gH7#6>SHYSY@bDR#m%nV8$UGhc<op3SvAu;i7<mt}|kt`V5| zpHrZU`});%#T9MlGOJq+rdV#fR31|j>m1#Ef#vU~^8F>Mf&XgX-oCbLmBySmHrYax z6q@$2@u)EWzIcGmEn><Hm&Bdjok=sdsGP7f+ax+UDD`%S>e(<??`XluFpsw57dJ_y zW?AN*zPII;u*9at>K^wKoPO<dn|38#-SuUjVCa_nTDm)ybY4-n_jK?{%nDxmX63cI zS#uVsxi=+Nr|R@pZHp{D9(F7Dm7c4IQ#|YEa7`b@`+ZBVe&$*i`I=RG&is`YGN;V< zmFjWK`@H6P_Djq2;!Mv4nRQ<{3h%nmW@oZUc<l>U<6Rf~>P(g>>%R01-gRl(K9gm} ze=~Mx&AM>k>dSI#-K-0(yDltcd$dBZ_Lcj3tE)v{zbuIU`zr9X)zz(KUzh%~?0w~M z`q#D1VP96(`o2o^|8@Bw+oO&3vf1v^)fcbYByCod%?;!Jb#txQwoRLJU*$IMx^-`x z={ob+grvn=i=VZbZJa*$MYizm>(~0e?5^y1Q}%w=?bq|lx3BGdANM@^_J+P})8%Kg z6Y6JQJny%C)l1#{CjLM7AC_%d$2|91-rU<f>2J&T-Q+FEOSXRe%5KM@yLU4tRM$M_ z^)Fj%UH55%_3e9V%gYW6?<=VNJ^Pu8`p?6>d)Icz7e1P|dB@R<QE#di-@b1#-RvUs zzrsbUXFp_{zw@wY-^b<aYo6TK+j>g2?`?|s-q+#Ntxgx;d*4xi>$$`F9};K&70o?; z=fx~P%gYP@$$ed8EPdZK{_9$2-|ws5|9!{NZhm92T=AO!bDy>H@43OPXIUX@_e|e@ z*W<_czVA98^}hJJ)upw075l?$U-sr(JzpvJbJpg)pS#}wI{5Q%)``h>9}hpP+!oxQ zHSzqv`!V^}$NlrmcfO8(@bz2m%g46A&U4TIwlLrNoUVPzJ@bFx&fYJ77kfTq(|@^N zXWVPP?2Rir-~8{#)cKaDw${Htdph)SL3`zQ$#Y*%F1CBO)PMh`ssH|N_1^z-j-KGZ z&+GsH{k;GGzyJ0OYzr9p6d1)8Fv=+~sV!jAQ(!hr_}4i3O=<j(iT4jR&iNCY@GVr~ zKChJ1j0W~P1&+1_9DNF$(-v_4o2S6FYysDz1x_j6JAPg`tQmOV;#IC|3wZA-@GVo= z^FlWEt-{8Yj0YGM1sD@IPmO+lNA8Kh!d)B>A8RDOXT5uL<~`w}d)p(<nOZ7{r9EWW zmT>Oi18%jJZ97C?oLIo-r^q%dQF7iwsbvfIq+Wic+wy5<qm;zL?JF7u?4%jiFf#Ns z%DsBHa|xq@);*bN(XvJhFG(sYvfX>u!>DYO6m@dG=&}wmKPA<7^5VPhU#L{vF)>kP zANSFX50#r1?P^hyn)XO))*}8*-RlJB9WC^bV>%%F?w0nsM@Jcxq#EvNe|o5GwD5}J zq6?Mx<@{m{vJzC<yjA6tjj~RtUXxZ_HTTHTIseqSW}UZu{G~BbU~6|IqwLv<k0i6a zHHws_7cH`giZ**2(|9sYF3&?rNKSX(BDq^h3SxJ3UOm*G6tBnRAoxI8)9J23Rq`#z zSi?FGBfcjpdW*OF#@x$H-sQUZh^>;To$^A>i~PFx?ElSi3X{1NI>#yN@w12}Zdp$> z+f=R`e7LJ1YRk=sGSfJ8J|&&MsBF6|mf=W>)R85|i&Ct=J@hh4)@Dn#d#3EJcSp`_ zQGnSaJHI7{LMlOK3mo}w>CcLes(rHEFy(ya<KQMfx4e`Eg^ReoQj{hoh0dGnI!StE zZF0oFIUaq=`=%<h%!{#V;;<8oir%#-dev>4c~j-Y9Pixym+arPIEHnpa#3G^*i%!l zq#&_nOnQ%3RjRtDExGTxG&JgIcwcJDqS-ESi!HTM+?^gKTRqXJy1e~L@&(6d;q#tG zE|T_K^=QY&q?lbwaj)iOs3`@kO36O<&~Mq@xM>TYbENvSJzK}RB=O%fMyV$&HJ2Gw z`HAQ~d2-~AN!K#>X-@@1)6^#|{O<ekk7d01B(=O_S2M#NS}vL;D|ckajl`Wb&lfSK z1yo($RinPM<9U@;;;yHPwI83ZW=u;s^*ljNwcwdLgWl3_kq_2Qouzhfj>x5DVSS1c zTJrZo?|)q@_dZdbwdq{hKE=PT3b}mqpC6t5UiHbJ)cebSE~~3s@&99b{l9B*KRKfs z)b2L8EisLHm}<1*r0V_We`TLoYG`ljj+*tPqb~O0#<&}ukALK9d|%n!-lQ?nZh_IF z6+a~98r0Np{CwV4^jsn@)yXA6GilL-nei5<=CiqJSg_uxyLo+jU1r16>C?F+>gQ(G zcD|f3&3neIm9rMDoH;3T_A<@dpVw#I)13Eg<-B*A^S`~Eb!%lkYgRp{)&i!idf6;t ziL8aMt}jy4T4bcPL`!SNCe1n1H0QOwoRg+C^VG{Zzh2J&q{;GWKEE!@%0u2O=dD_~ zOl#G;RjamXt=_k4^)anA=T@z`rnUCos<qFw*1cP`?wi*7f2-EBX>Z_Ly+KTS<D^&r zZia4BYx%dXFq7Z++(xO@Timp_`mNp?roAn0^|mza?Rl%Wmuat0Qs}c=C}jG2mxN$> z)9dZ)R`1%Ty?fv4-N&@|oLjx8>9u5^_AaT66+tl~%e43Y%ihbh<^Y?{LB2Hy#c~dG zWtTfGJU{jIj=5<Wi_{Lu=^XW2b2LonSlpUpn_lnL%h{(lZ|ANRDrq_=^VXc4rgLiE znp0eB4lR4M$MOwdQD&G^_Ni-cPTgB`_L<JPcWazV)|@U<*en*o`$^~Gt2GzJbT7%h z-S$j@yYIE;HTf%UYp?j}UJYA&b=#c&w#6-Wy1!%BUa!-=(YE%6Uv6gB+Z{paJ$-9$ zt<$}|ZSC!#sGHLs-L!jg``W*?ckk)mdzO1=+ZyR(@=Hq<F0-wBz^C_6>>Za;+`WCe z52W-smEILM<=(f_T_wBF_0n8RG0kU8%O9()TU2@3*=XsKSUpvxymqrWH)Yd1)iRs- zW^>y;KlDmE*>34`tK@dBl$|S6o;`cVl$ZDV?%U9~C23`s3*8i}nATbq^)XxJi8ke} z;aqk?ZRLWk>-IV2#1yJU7_BMZH_PzY)2u9y@2~WJuqnJRdbcg~X~sXj5VOUHA1?o{ zmHJvQzc5JI$!oz6&N*M=((b1{ON)E|_1yc{H}#^n=KtQcnBnmfhV{>Ez9s&6rT%h~ z{vyjK;dOp2%=+neDZ5TB{mmy6cWk|h*1Ti?Zr)zLGvV#BMIYwgdlgskecMv&RR!%! z7ISNFU=;tr^#9optAhQt27fB=vK}sAV-Cy~%6E>Nvw>4%&EEIdzGd+FKm69#5qoF@ zxAJ<X{RXy5`rPL?Jo8%LdQVq-)w~Cl28s9dn6=*T+!5cl?|$E>TYuN7eoHk};aVcP z|Kq!)Lb2Vtt!yvfRm%NNS|}mUB6<7c1Kn91{`#GI_ctHfsHm>+{@RMWhhD6=oWCtJ zSWbPt;OD~kPWpcx^}nt%?4R{<^VVg&^+pR%ew686JNetjskh`*+i$C!U#4n*U-^B8 z)cm(k0yQ<R8*#kOxNVi$x^G1`-=-T!6~!MLJS*MEzkl6}sUQAn-Zr`?cE73Vt=RJD z)+7zR@J%Zi=TG~#>8x+@?ym{=gYF7w7wZ~-Qj5-&{lDUCtK5gDcYdX&H*0C!61sh7 z*5)=fV~f>qd$w)9-c|hf-*U~#pLK(mPrFxab~)N+w&A<0o0;>C1j}`oP5spTYV%{m zEvu&%Z}I%x>NQW{`W&VE8(oyQT;cliGjOfmc6l@I82A61<b^l(85!HmPgdAn+;i>4 zmfCL9DwCU!jQQr9JlL6G_1@^3TH%#hU)XkiGM)eV?@T$})$)dN8Ybpj@18B$)u?#H z>1(j{*T)lQg~XSJM!#H@TKXo^G&K9GYX7F)sihJB4L!R{Bi5JR>YK-TAudq;-`Bv? zx2^t_+<3dV<Wk18X-}TKFpZj&9smBTb@t~IZ1WR-Z*`ph#WXbYpzY`Q-=@DqpSgbC za^>NBx#VZh`93R(8S{UAotUm%dMM!u$3~5Ba`9zFMSb6%uUW|Id{^R5ID7xoIP0fJ z7s>{Ry+5_}+o{fNk&VwJ+wWwCuPdy}xf7Or(y}b-e5s)6(|<v#tp3lw_7&XZ{aX5O zNzBg+8K0%%Pc8p1W?I&t^t|_3O1qTvxpz6y<!O0k+d9A7U(ajVw(b1X;)4HA?53%0 zn>jb-vvKO;O)bkdmL{u4>Md(1E{J)$J*_SEmznu5uFS0ObDo!N`1voU#k(T%lUcFS zj^g=uTmF65Z<hYJQ@5h9N=3j~bvMuYChs3@|KBBrukS3j=nA&z`JCV2%-85&(dE9z zP4C{rNE1Eh%$1i+W6On8;wn10W#gigS2}J_I`pGy_0(=ZgUR;Gikp?|*vl?zRu+dD zWF)6nnm<?PvY1h?_CHKvnt!EPl>YSSodx`rZQeiavwntDEzSvlKQn#j+~YrIpI`Gz zsnA-xd}>jla{BTTzU|H2i!054PW-O>>eRXkr`I*j-u_z4s%qPhcJIpIFiWxH+ZXOv ztDUbMTBWuye#cC4%a2J_>Bi-4%o{tn*DqXew!Hlpi}TJ^+jpuby=76FGe3Nb`0}q7 z-x6NE+wncO?|)y;znJ&C^xaKz#H(K|i?fZIm;CBO0e^Mi`|V9ezYDE)PkmkWWa?)- z`}c0{pEq8wN{;^I)_hqd+2qj0XPSIfyW-_0c&)jkyXEV{4Xw)NqJ8%!&HKG=akU5g zu4{)%63dhOHhtW&y?VR#r(=>9`oF8KX8+dsyepA^n_IWsFWW!AQ|B63$8Ik+F?6;u z%bs^M`p>I<zx`g{yVh8<@8FyM%WuQOfA1HTw+-HWELhGoeUBx3rX;iJ>Eks?+4s!F zZO;48J$U|)WB%+@??0YgzO^~-)0XdhF03y+@_El${>}TfSGLZRzZM;J*xoj3cg!;1 zzh}j37s~FffBmOU|L-B~l4#|)%b)*k_ph$i-o3f4$vR;3Jiq?prM-Ln;^#j-R&#vf zUTyzBdw*+$uKs)YboG0-FSicY9N%vKt<m=7-P&iZe-D4mIR3Eq1hd_p)$@|=-+rsL z-5(rx-O1$3x!N7Z|4R7&`hDLU#BBS*y_W4%@uEyS#eQ?^^>f$j>OFpE_x}67_y7NK zD%qaBZB_q&E!V%CkK6w(y7=$DuDZdriVp3%8=TQ9@|(UUulrz}AIUZQrlR7q(E4_T z{UWFCT-(0ou>7pg@)fr@f2z;ZU+uo;SMnpi&jxJo;~C=Z|0zF6RaaZsTd|s%g~2$D zK}06w!kHP3+`>jBKLi#XR#LmRhA}|!v1?D-HIp8Te*q8OI~1Lbbbd})GP6_5x1fYm zNY$~8iBrraBUr(=)udSOh^BDHx%qPT%jR@kR0>)mHPy^_*2T<_mBA~+wpNK|hpmlX zyRSua(zAoj_J_ZTbYFhs*`MVqmKwP+!EKqW^(NI@*Al%ZbKiWG`g3~Tkx7ZoO(xpG z>K6>nYsK7he!M<$!hNBguhjQV$9B$s=#*+TJv-y#V$bQ<UYUN1TVQ%r&E`*3;jI}J zx2G+s5#0XtKw0qhcXz|To}8-9{QT(ZY2Q7cHuZjfyEjb9_3T{h`fX=+ZYsU7Y-joR ze}7kn?_ZTZ-TZxw(c3TF`N8vF7g<(rFMm0`$A6Qj_oEe8|EKl+v;6m;!G(Y4cAZ;1 z#&5NnPpd7JN-41ZpfYEI)4G7ix(>gXWcUyK__g}H!-adRy;XP?PWE@+pL2Qr(nlsH z=MRft&+a?$pJB<GLo%gzCc3ZDi_zaH$<9)ALMZb{q1KOoo4XG)HFFp25UY>*WV!dv zY~2%5>`!=4%I*Cl<iolAkCxj{i!C3W6|cTB(o&smE$kw)_RWX&f32K8y6`;j;qfzO zt=ZUN!YVuEf)lT;$VC^|U7ycur?b2}`_G5RDB!Ed6`>&a_B+A*G-8uXF7tdZxpc(l zV~EJrkkHtvSHrIMe6jfC6#CxBmsfVZ|DriZM6Na3lm><yt+e^LF33_h$Rm7e?6iM3 z)A)6bZzL9*hI!j~FEx!!Ja2t1BtG)blw)@8M=yCKo$oGD621~U{chRaTJd`oPv=g* zSM_$U`2Cu%cfZH}Yil*V9&xty<KmK^wiR*at3zLee@s&9F~|$eS#!PXdb07E9@Bd} zv;$7Y`fkj+Skhr2xxSX;ac}&ssSDdA|E_qlvBKzu+UzLjoM$ub+rF%xQr<J+@q*TG z;kV}oY?6Gw`IOTNwYkM%R=#bTRv!*7Yxviv9HUqyxqim!A|2fuMav`~6ia`Ke6i)~ zvy1V5%5lDLj$L5dxncc&yYiz;m+gvre^KOL|LX$BzTJ5{j~C?_?qYscl*Ow5`HbTU z`SpFDPL>w`tNHZu+Pyhii!56t-d%Xxmh<KKxkWo-zAanU_w|m@9zSz#{aV8%2Tmtj zp4*=Jh1YlYt?ap9A0(FRe|oq!TA<?W&u2Bo?dG+n=W@%}hkB@NoP4L~;r1xW$d!!6 z`@Y}Jv@d;f`{H3ky|Z@Je|O#Co8n!`rg&ve){oBqxj+9js*3sDG4A>2|9^M)SD7!n z9*5>u&YeBCGDm#_Lmz*n*kr+y3vA0+Uhy|C{}{1FZJLzYQugvlquGsDzHPs2I>BsP z*Sxh~LR4Q?YBw8BS;)3F)WlveCn0rF+`+KvX2NnWqko^i#_VdLtt8rQdoJja(99D@ zrr&jsmf0e)eTk^!ZIg*+-2avY&t39m6Mt<$*c0LFhmN$n8qX8#ZAy|9eJbKAeQtTP zytlH9>oZ&Hv+Vu3H49dJ2s>u^PjEux9U=L0wnMyoKgKti#BbU2)mFdmqvy)m3O^@U zIJCqHO`dt>iJE1l=OSL6NgX;%6eTr{@=Jv#|1lKgdU@ES@kgt=injlmKM`KqPt)6W zUP+y8_QLH#<p;}6i7Fzj>WjIWIBRT5QmzZMo6OQZtIp;rqgyF{YER_TrbP!m@9%iL zFShRG<Re~Zv}d!K&Ya1bIWcFFbZ_zOTr1VtOE{ljYntIR<494?i<%z46Hexg)BH=r zJC}!TbKbv#C#3rRm5Vm(znngLV@=6#nSWgCSxPqDR~1>faHjgHS3ggj_+UJ39b<I1 zoBLUjPwy7pE4kZr$6WU9jxTjP8Z)0hT5g`NH6^$IOTZ%yv5PxCPF_@XWU;mUk_C@b z-)S13<te?j?2PrV!1hPhk=*{T=1e){xAbUmR@n7$`!idoRJa{oIo(duU~=f@XywIW z9c$QjE^ZTDH?{hd+uB=!o}8wxEk@e>&(rN6Z}hKx<E?dpuS0SPpIPk>Y3<fGD-T7j zn>x37k9PE0wTQ2>TbH@6?Xi8i^UVLuw;_E;#iABZzHoG2SgIUrnxVVIl?!r$YR5$~ z+~zu6pLTPrN8ugOjK#~sg%*kJa1PeBt_<@IWHRv1ezovlfqjcpQdsGX=0#ZtMIvKg zn|Uv<kj+(M{INnhvV2F*Mp=o4SGA76`>^X}==)WZvR$p7ZQT9V^qq`<nb{q=qDhH= z)Kz^sPksF-exUW1X8GUO$5uSLSYPjwUt*&jd2y1_{)@S50|O!xx#J}cOU6yta=v+g z@1*JbSMOch_W5X{!`<)2#vjwmJ+r-~V~uwh`n?sC?y?eH|0C`D6ovO(D$$$r1cG?4 zh`eYK@~zQ3yF@mx@a;71WcBYEUYcT=mrgwMO26ilCa7~eB`o|(`L5#|LRX)g-e|V0 z!(zIR>f@C!Z|F=ZaoR9x>5}J@U;at{EA%w)mq@I?V%51Ld#(pwuUXykPsuzZPfILf zsnq&yd(w7Xwyiq*Uq*aZO-#D?@3)=*8CSh@y7kQVxZ5SYp4`U~Q8v?*K3wQ9+g$N} z_BGv8fvc7*S+q>6HZ%J2hjW!z->nN@;r^6KzwG+utW}|NGoNwH>|s5Z-=xl~yYjBo zt$T%W3zkP5+Z$E9b<4Y=8T`Fs9GvSH?BOxoq<PC;&i{RHf==$1o4WqVzh`y45}6@b z8v9yy=FZLjr5_5<|8?qoc=Fy`u^(<Bw-46eFNm7I_VJ3@&yR*Kvba03G(o;tBdLv5 z;<04>6dCouPM!60wm(@pMXB-46}?lpubzrp-eP*MX!`!L(;NJLa-6*z#TtC6Pu>0J z*7koZva9yXym0hak^U>~t{Pr*|7z&>UWI#WfB8i`OIo7dxiYSFb$o1Wa@D&&-Z?pT ztre~j{t+kHUEWREVWhNWkJ#4gzJ(3^F%N#+JFWkHwPvSk<aOI@qvKEZP5WaqV`7z_ zdNv#XURL?JC-3@Qn7%*u0LMkKcZo)Y`E@h>v?otl5|KCS7U!RDT)y}8pG;F-E^BMP zqHb^XqB^rr6Wm`s*n4%$#QYta?8$Q$Uf8R?Q-5!-|9q)0Q>AVsDOJCSmerkb&*yyh zx}POed6WNeTK_n#yzPzU^3tm&zb;mt`~0qW&#_Mx^EMuvcVp4n(uBUlW^SMU>VA>G zUv*7+)-TnPA99D=|K0z0sJ#2Z{0Uzzxqi<KC(&Epdt4bP4*xYk~0^7`+i{M==^ z{mZm&KU<x&#qEC!|Faz&F+WcKDe65I@a{!jH>0z`DJj;kEE^8bTleQw-utvSZEsc| zR1i4#N$)+|hsp#EmVASY8S7c(*L*+K+FFy(YI=+@RN%v^td|xAQ|b(Q-27h5n(#!x zk7=^%L4`A0Lzwn_@wVtX&#s#JD8qnlt^m*a?vOYA&$0yAYy(ce;N~?9=&1AC^hD=n z+3SCYCh%S6*rL|T70=73-u;u|CEsmN?w#v8I68Nn)3-XpCny{!C_Yh8x-fo6dws}r zR`;fN%L;BPD4$E~dsr|**!tqRl7HSpUwPB|mZf#AnX~523BKi%-t?`vxhNWckx963 z>ILVsUhMM?^7FiobGxo#O1vmuADDP5Ma;M9#18-84!+`xGhUm06rX)jvNomhT+392 z)$At&rtH}uK0i=e@`CTL6p84Z{Ye)dD81XZ?V`;2jY_*Nww}n}9dY{goL-shyt2<X zN?tA8y07rjyPg**YgsJ2<o;h2e;a7@;p0)B{(p}I^=EA06Q86gZ4{X1F2QUVIIXa~ zW8DrJA!Xwr<>_xMIfOWWUOfE6SJHfviuWaz!2ZInf_n^WxuT0y{Dst#Hz~^NJU5!a zy>gY3vcQxIKeg&h>Wn#sPJz!AR)!Y@sn_$d{;LntoPMcCs83_x#SXhQ^3Nw6opDKP z{imKKMOQ*T#WQXAxkOKRW021AqRx4G+@YU1I6K)3&q*mZ&GKS<e<Db4?WTRl4lC#O zslP6&nzewl>wy06O+kFgpU-uE(BYr;Psp&F!9d*DP%_w1TG&WF*hqG=k@99E^~*-a z!p7#GjjV%>Z6_Ps2b(xgHgUXc;y&5%>IIISIYM_YK3|pj_Q6^Xo2<(<S{ixpk39=A zpP6drd}fc^Yp=G6qMr?3C4Baf<J7b7{o?XUtT4xXzHngGX3fh6P0Ivju6yaf_E){v zE0rB^WPz|veya7x7fKho<fj^3QSy1nR`l=6<~^76Z5{{z>%Eb@W7^U^6DG(;a<gro z%pJYVR`sQ=Ymgm#NX?SVk&}YX%{cS_#%kF_Z>4{m?H_-5%n@Q&y~eJ-*w&HfY}tfI zEGIPmk2-ASv7KxnqbXvO``Ag;m9KkK)D1zA-F+I>dD%v16J##B<%_(|(SDJo?i%U( zx9QXyqY$_KlLeYTPuwJ^kj~FjZ{Q*sB9QFo=vrv8me(R$;P#7R{Rt+XPtQL)BA{Bk z)IIczs<xJzi~oUp+3NNJ-cJj?8@=5xYpc%=@e%KQ%9P>kntPou|EY_TOZa-<yIZE4 z<n4O$#o@4_Qnaw0zQD_lmv+~;$ov-xn0=vx<Eu~XW*cX}FD|Dw9{*!Gaz)r@vk8Y{ z==6IbdnHP348L&me$-hi;-5S@_+qZp-^=o@U$-3Mbe!$M8Cas!ZsKrS!y{Js<B2P; zx!T;Er-r3=gs^IA$zFB;-K&+K?O2=LbS%K(^cN4`D~g-7AOGtOlHQ_a`Se4~gwV#X z8~06d&0OriQB*lUbmFov!Oy4MJoEKx*b<JLd6TA<MlF07yD~U7woiSk=&oI+PN5l+ zkv%^IOvAcY+9Xa%mw4t;D3YWccDQ4in`&6xmB55R)s|(On(Myqu`<wkpPzU+)Vn|Q zlg+A>gPDy+)4V=<|6L&(vbdB@vdlEPApD6)EzfCdh4pLw&VD^JF{xLy`CnV=KfyDp z_XD1Vm1;cXiAfAu+hG#nG3|;*OS-S_$_JeP5)3nrcV$$Uy!^2Bz_$>MT%oLDqnyxE zw}P_U2CuVp+1E@vm3upE<2v@MN$*9si!C=W^Wi+>+%Fb+BL6^K>9b!3tnwlu)z=EA zbQOhpt$XLLwSa$P$u-H3VGF-(vriP0`)=?g%ZUB#*PT7<f){@Xk>6VPM{DzrvxWMr zO9RB~1dc4&bWK?E`|MrQ_`e#zRN(Qe3r(>u5v|;w-gPx)r&wxhSbfIzoNGm@D=)l_ z^7Xe5Vz>WbH|s%Svw41dcm;b#{&QikjTfGr5aYl8p)8rNsbE{YxKL{AyC9iuZ9H4M z`d0sIJrm-=_^SH7srUW0H7_T`Uf2F|NL$6x@2gxv&i8iqtwALRi{ib%)HMn<ZogVk zYc3R<^Sofi#4ow>`hn`E28vrv8ynX(sg{=f+?L2)==1)=`(s~us!#8@Gu8G_kWu6g zlR)9N_=q<D;<n@&ZTUCaiX+-$XS8SEXfOQH?tZy-X?UROy3Et*GDk}@XX@+EEr0r{ zym|4C$cfuht!EVQm&Gj9u2kkOS$d;8w3xsAdn31y%FTjLUoM2c-J0<KYxnI6D@BW# z&>7B*=1to-q`KY+z8lg1JcO+~+h5w$_rdlk^(!Ib75)5?$(AO<`j`5zho5_Q<weJ4 zdGVY?!JCto&iERmxFXR0O5E9sA2+_QIU=sJ@W&*<pZ|NpWUhw%wFz_KES$1zQoMKM zw4LXIj+^)jo7^;-`p6~Y^o$!5(sxd&{K+EvvvdA*rkUb@V|Mllf1TcVbIQjlUBAU% zCiK0PI+nCva`xuP+1qE%Hecx%wWIxT<ecL(=bXMd=e*?H%aL=h&zyVv=G^;|^Bzae Xdp>jC>zni5OV0aQq{PI;z+epkqWwmT diff --git a/docs/images/uedit_v3_exe.gif b/docs/images/uedit_v3_exe.gif deleted file mode 100644 index af5d847df17c53d675a4ffb1bf916505465c8e3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17609 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 btJ9PI8ZQir+$(xLM*XqzS?_RO4hCxgIG6EN diff --git a/docs/images/v3icon3.gif b/docs/images/v3icon3.gif deleted file mode 100644 index 31d2bee5de53eee1cea39c44d7ef2d2da36ca6b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270 zcmZ?wbhEHb)MMab*vtR|#>U2J#>Q!BX*1J|XQrjioS8Or=FBr`#%IpVJagvEe+GvC zX~zH4(*FPd&%nT-_>+Z^fq|bv2c#2Z1_R6P3nx8S@3n|lbqWw!(K{<ijk(FdrHJQ4 zL5g?o)zdBhY(WYvqKg70SmaJHE;C!vDdUq~!l)I&c|-J2frXl?+3ZIJD`Z_Re_FJ2 z##}xo(dL7!3i4hrW^u+n|C-ZSBf`Q|=)xISQQK%0($`d-t>{=B9a~-*T;JR<doCZB zBTI4V%)aa_uHbo-dRwO2vB{Oq@lmia+P*V=k7#mO3^T*wZeauCh5G4yMyHIFjLt|e TJkNM;zv3-n|Eqk03=Gx)H)LWL diff --git a/docs/index.htm b/docs/index.htm deleted file mode 100644 index 8ec8b0cb2e..0000000000 --- a/docs/index.htm +++ /dev/null @@ -1,134 +0,0 @@ - -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<base target="_blank"> -<title>Synchronet BBS Software Documentation</title> -<meta name="Microsoft Border" content="none, default"> -</head> - -<body><!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<h1>Synchronet Documentation Index</h1> -<p>Latest News and Updates for <a href="http://www.synchro.net">Synchronet</a> -can be found at the following sites :</p> -<blockquote> - <b>Official Synchronet Web-site<a href="http://www.synchro.net"><br> - http://www.synchro.net</a></b> - <p><b>Official Synchronet BBS (Vertrauen) Telnet Servers<br> - <a href="telnet://vert.synchro.net">telnet://vert.synchro.net</a> and - <a href="telnet://cvs.synchro.net">telnet://cvs.synchro.net</a></b></p> - <p><b>Official Synchronet BBS (Vertrauen) FTP Servers<br> - <a href="ftp://vert.synchro.net">ftp://vert.synchro.net</a> and - <a href="ftp://cvs.synchro.net">ftp://cvs.synchro.net</a></b></p> - <p><b>Official Synchronet Mirror FTP Server<br> - <a href="ftp://ftp.synchro.net">ftp://ftp.synchro.net</a> (official releases only)</b></p> -</blockquote> -<h2 align="left">Synchronet Sysop Documentation</h2> -<blockquote> -<h4 align="left"><a href="sysop.html">Synchronet Sysop -Documentation</a> - For Synchronet System Operators</h4> -<h4 align="left"><a href="baja.html">Baja -Documentation</a> - The Synchronet Command Shell and Loadable Module Compiler</h4> -<h4 align="left"><a href="sbbsecho.html">SBBSecho Documentation</a> - How to configure and use Synchronet's FidoNet Packet Tosser</h4> - -<p align="left">Important Information and Frequently Asked Questions :</p> -<ul> - <li> - <p align="left"><a href="platforms.html">Supported Platforms</a></li> - <li> - <p align="left"><a href="ftp://vert.synchro.net/main/sbbs/sbbs3faq.txt">Synchronet v3.0 Frequently Asked Questions</a></li> - <li> - <p align="left"><a href="ftp://vert.synchro.net/main/sbbs/v3cfgfaq.txt" target="_blank">Synchronet v3.0 Frequently Asked Questions (regarding configuration)</a></li> - <li> - <p align="left"><a href="ntreadme.txt" target="_blank">Synchronet v3.0 Windows NT/2000 Instructions</a></li> - <li> - <p align="left"><a href="ftp://vert.synchro.net/main/sbbs/v300_new.txt">Synchronet v3.0 What's new in this version?</a></li> - <li> - <p align="left"><a href="upgrade.txt">Synchronet v3.x Upgrade Information</a></li> - <li> - <p align="left"><a href="http://vert.synchro.net/sbbstodo.html">Synchronet v3.0 To-do List</a></li> - <li> - <p align="left"><a href="ftp://vert.synchro.net/main/sbbs_3rd/syedtfaq.txt">SyncEdit Frequently Asked Questions</a></li> - <li> - <p align="left"><a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">What - happened to Digital Dynamics? (Aug. 1996)</a></li> - <li> - <p align="left"><a href="ftp://vert.synchro.net/main/sbbs/sbbs4os2.faq">Synchronet - v2.30 OS/2 Frequently Asked Questions (March 1996)</a></li> - <li> - <p align="left"><a href="ftp://vert.synchro.net/main/sbbs/sbbs0595.faq">Synchronet - v2.30 Frequently Asked Questions (May 1995)</a></li> - <li> - <p align="left"><a href="ftp://vert.synchro.net/main/sbbs/ddtb1001.txt">Synchronet - v2.30 Common Problems (Feb. 1996)</a></li> -</ul> -</blockquote> -<h2 align="left">Synchronet User Documentation</h2> -<blockquote> -<h4 align="left"><a href="user.html">Synchronet User -Documentation</a> - How to use the Default Synchronet (Classic) Command Shell</h4> - -<h4 align="left"><a href="http://www.synchro.net/sbbslist.html">Daily Updated -Online Synchronet BBS List</a> - Worldwide Listing of Synchronet -Systems</h4> - -</blockquote> -<h2 align="left">Synchronet Developer Documentation</h2> -<blockquote> - -<p align="left"><b><a href="smb.html">Synchronet Message Base (SMB) -Documentation</a> - Synchronet Message Base Specification </b></p> -<p align="left"><b><a href="http://www.synchro.net/source.html">Synchronet Source Code</a> -- Obtaining, building, and modifying the Synchronet source code</b></p> -</blockquote> - -<p align="left"><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -<p align="left"> </p> - -</body> - -</html> diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index c3795be95e..0000000000 --- a/docs/index.html +++ /dev/null @@ -1,8 +0,0 @@ -<!-- This is for http servers that default to index.html --> -<html> - -<head> -<meta http-equiv="refresh" content="0; URL=index.htm"> -</head> - -</html> \ No newline at end of file diff --git a/docs/install.html b/docs/install.html deleted file mode 100644 index 5fa0eb526c..0000000000 --- a/docs/install.html +++ /dev/null @@ -1,206 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Installation</title> -<base target="_self"> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> - -<h2>[1.0] - Synchronet Installation Instructions</h2> - -<h3>Finding the Latest version of Synchronet</h3> - -<pre>You can find the latest released public distribution of Synchronet at -<a href="http://www.synchro.net" target="_blank">http://www.synchro.net</a>.</pre> - -<h3><b>Versions and Supported Platforms</b></h3> -<pre>Synchronet is currently available in two separate major versions:</pre> -<ul> - <li> -<pre><b>Version 2.3 for DOS and OS/2 -</b>Supports serial/modem and local logins -Native 16-bit and 32-bit console mode executables -Single node per instance (up to 250 total) -Version-specific features are noted with: <b><i><font color="#FF0000">(v2 Only)</font></i></b></pre> - </li> - <li> -<pre><b>Version 3.0 for Win32 (Windows 95/98/ME/NT/2000) -</b>Supports TCP/IP logins only -Native 32-bit DLLs and GUI front-end application -Up to 250 nodes per instance -Version-specific features are noted with: <font color="#FF0000"><i><b>(v3+ Only)</b></i></font></pre> - </li> -</ul> -<pre>All configuration and data files are compatible between version 2.3 and 3.0 so -you can combine instances of different versions to create a single "hybrid" BBS.</pre> - -<h3> -Upgrading to a Newer Version of Synchronet</h3> -<pre>Because of the many variances when changing to a different version or revision -of Synchronet, this topic is not covered here. When upgrading an existing Synchronet -installation to a newer version or revision, you should <b>ALWAYS</b> consult the -upgrade documentation included with the distribution (usually in the form of an -<a href="../upgrade.txt">UPGRADE.TXT</a> file). Upgrade-only distributions are usually made available -in a more compact archive form (e.g. <b>sbup300c.zip</b>).</pre> -<h3><b>Windows 95/98/ME/NT/2000 Installation</b></h3> -<pre>After downloading the Synchronet distribution file (e.g. <b>sbbs300c.zip</b>), you will -need to extract the archive file that you downloaded into a temporary directory -on your hard drive. You will need <a href="http://www.winzip.com" target="_blank">WinZip</a> or an equivalent archive program to -uncompress and extract the installation files.</pre> -<pre>Once you've extracted the installation files, go to the directory you extracted -the compressed files to and run <b>SETUP</b> to start the installation.</pre> -<pre>The default installation directory is recommended for most users. If you choose -to change the installation directory, it is <b>critical</b> that you <b>DO NOT</b> use a path -with long filenames or spaces as Synchronet still relies on some 16-bit DOS -utilities which require DOS-compatible 8.3 file and directory names to function. -It is recommended you use a directory named <i>SBBS</i> off of the root directory on one -of your hard drives (e.g. <b>C:\SBBS</b>).</pre> -<pre>You should now be at the Setup Type Installation menu. Choosing a <i>Custom</i> setup -from this menu, will allow you to select the items that you want (or don't want) -installed. If you are upgrading an existing installation of Synchronet (v2.3 or -v3.0), it is advised that you choose <i>Custom</i> Setup and disable the following -installation components:</pre> -<ul> - <li><pre>Configuration Files</pre> - </li> - <li><pre>Text and Menu Files</pre> - </li> - <li><pre>External Programs -</pre> - </li> -</ul> -<pre><img border="0" src="images/setuptype.gif" width="479" height="357"></pre> -<pre> -After completing your selection and the installation is completed you will -find a new Icon on your Desktop and in your StartUp Folder in your Start -Menu. If you do not want Synchronet to start automatically during boot, you -may safely delete the Synchronet shortcut from your StartUp Folder.</pre> -<h2> -<br> -<a name="GettingStarted"> -[1.1] - Getting Started</a></h2> -<h3>Getting Started with v3.0 for Win32</h3> -<pre>Upon Executing Synchronet the screen will look something like the one below.</pre> -<pre><img border="0" src="images/sbbsctrl.gif" width="740" height="497"> - -After starting Synchronet for the first time there will be several pop-up -windows that are running programs and events required before the system -can be used.</pre> -<pre>The last window that opens will start the Synchronet Configuration -Program (<a href="system_config.html#System Configuration">SCFG</a>). To run SCFG again later you can load it from the -<i>Synchronet Control Panel</i> (SBBSCTRL) by selecting <i>BBS</i> and then -<i>Configure</i> from the menu bar.</pre> -<pre><img border="0" src="images/sbbsctrl_configure.gif" width="301" height="192"></pre> -<pre>Before putting the system online you should <a href="system_config.html">configure your BBS</a> with <a href="system_config.html#System Configuration">SCFG</a> -to set your system options and settings according to your preferences. It -is recommended you spend some time reading and becoming familiar with -your <a href="system_config.html">configuration</a> and the many options available.</pre> -<pre>After completing <a href="system_config.html">configuration</a> you should then follow the proper steps -to <a href="system_config.html#Creating User Accounts Locally">add a sysop account</a>. Once you <a href="system_config.html#Creating User Accounts Locally">create the account</a> you should become -familiar with the <a href="user_editor.html">Synchronet User Editor</a> and set the <a href="security.html">security</a> settings for -the account(s) you have created.</pre> -<pre>Once you have completed the initial setup of your system and sysop -account, you have a basic functioning Synchronet BBS System. Please -refer to the rest of the <a href="../index.htm">documentation</a> to finish the setup of your new -BBS System. - -<a href="#top">Back to Top</a></pre> - -<h3> -Getting Started with v2.3 for DOS and OS/2</h3> - -<pre>Before putting the system online you should <a href="system_config.html">configure your BBS</a> with <a href="system_config.html#System Configuration">SCFG</a> -and set your system options and settings according to your preferences. It -is recommended you spend some time reading and becoming familiar with -your <a href="system_config.html">configuration</a> and the many options available.</pre> -<pre><a href="system_config.html#System Configuration">SCFG</a> is the <a href="system_config.html#System Configuration">Synchronet Configuration Utility</a> which can be executed from the -"<i>Waiting for call</i>" screen by hitting '<b>C</b>', or from DOS by typing <b>SCFG</b> from any -node directory. Example:</pre> -<pre><img border="0" src="images/scfg_dos_startup.gif" width="500" height="150"> - -After completing <a href="system_config.html">configuration</a> you should then follow the proper steps -to <a href="system_config.html#Creating User Accounts Locally">add a sysop account</a>. Once you<a href="system_config.html#Creating User Accounts Locally"> create the account</a> you should become -familiar with the <a href="user_editor.html">Synchronet User Editor</a> and set the <a href="security.html">security</a> settings -for the account(s) you have created.</pre> -<pre>Once you have completed the initial setup of your system and sysop -account you have a basic functioning Synchronet BBS System. Please -refer to the rest of the <a href="../index.htm">documentation</a> to finish the setup of your new -BBS System.</pre> - -<h3>Copying Utilities</h3> -<pre>Synchronet has a specific sub-directory for executable programs (<b>EXEC</b>). -You need to copy all utilities that the BBS will run into this directory -(this does not mean Doors or Online Games). For example, you need to copy -<i>PKZIP.EXE</i> and <i>PKUNZIP.EXE</i> into your EXEC directory. If you plan on supporting -other archive/compression programs on your BBS, you should copy these programs -into the <i>EXEC</i> directory as well. Any file transfer protocol programs need to -be copied into your <i>EXEC</i> directory. Synchronet comes with an unregistered copy -of <i>FDSZ</i> (<i>DSZ</i> for the DOS and OS/2 versions). If you have a registered version of -<i>DSZ</i>/<i>FDSZ</i>, copy it into the <i>EXEC</i> directory as well.</pre> -<h2><a name="GettingHelp">[1.2] - How to Get Help</a></h2> -<pre>There are a number of avenues that can be used to find help on Synchronet.</pre> -<pre>This list is but a small one of the available resources:</pre> -<pre><b><u>Synchronet Homepage</u> :</b> <a href="http://www.synchro.net">http://www.synchro.net</a></pre> -<pre><b><u>Support BBS (Vertrauen)</u> :</b> <a href="telnet://vert.synchro.net">telnet://vert.synchro.net</a></pre> -<pre><b><u>Echomail support:</u></b> - FidoNet (zone 1) : <b>SYNC_SYSOPS</b> - Synchronet BBS Software Discussion</pre> -<h2><a name="AboutManual">[1.3] - About this manual</a></h2> -<pre>This manual is an ongoing work in progress. As <a href="http://www.synchro.net">Synchronet</a> is constantly evolving, -so is this manual. This manual will give you comprehensive information about -installing, configuring, updating, and maintaining your <a href="http://www.synchro.net">Synchronet</a> system.</pre> -<pre>The manual is currently maintained in an <a href="http://www.synchro.net/source.html">Open Source</a> manner. If you have any -questions or concerns about the manual, please direct them to : -<a href="mailto:syncdocs@wasteland-bbs.com">syncdocs@wasteland-bbs.com</a></pre> -<pre>Updates for this manual can be found periodically on <a href="http://www.synchro.net">http://vert.synchro.net/docs</a> -or at the <a href="http://wasteland-bbs.com/syncdocs/">Synchronet Documentation Project</a> (<a href="http://wasteland-bbs.com/syncdocs/">http://wasteland-bbs.com/syncdocs/</a>).</pre> -<p><a href="#top"><b>Back to Top</b></a></p> -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/install.iwz b/docs/install.iwz deleted file mode 100644 index f7c4c29c18..0000000000 --- a/docs/install.iwz +++ /dev/null @@ -1,288 +0,0 @@ - -[InstallShield Wizard] -iDate=0 -iTime=0 -Flag=0 -ISX.EXE Size=679936 -ISX.EXE Date=11:21:52AM 4/8/1999 -ISX.EXE Ver=2.1.2.62 -SETUP.EXE Size=45312 -SETUP.EXE Date=9:12:24AM 3/23/1999 -SETUP.EXE Ver=3.0.111.0 -SETUP.INS Size=81342 -SETUP.INS Date=11:26:40AM 4/8/1999 -SETUP.INS Ver=Not available -_INST16.EX_ Size=81342 -_INST16.EX_ Date=11:26:40AM 4/8/1999 -_INST16.EX_ Ver=Not available -_INST32I.EX_ Size=294079 -_INST32I.EX_ Date=9:12:22AM 3/23/1999 -_INST32I.EX_ Ver=Not available -ISDEPEND.INI Size=6857 -ISDEPEND.INI Date=1:24:36PM 12/27/1999 -ISDEPEND.INI Ver=Not available -SWDEPEND.INI Size=9711 -SWDEPEND.INI Date=1:24:40PM 12/27/1999 -SWDEPEND.INI Ver=Not available -ICOMP.EXE Size=119808 -ICOMP.EXE Date=9:12:24AM 3/23/1999 -ICOMP.EXE Ver=3.00.062 -SPLIT.EXE Size=90624 -SPLIT.EXE Date=9:12:24AM 3/23/1999 -SPLIT.EXE Ver=3.00.060 -PACKLIST.EXE Size=87552 -PACKLIST.EXE Date=9:12:24AM 3/23/1999 -PACKLIST.EXE Ver=3.00.060 -Version=2.12 -DevTool=Borland C++Builder 5 -Platform=Win32 -DisksBuilt=1 -DisksDir=INSTALL\650MB\ -TabsVisit=111100111 -LangNum=0 -LangDir= - -[VisualDesign] -AppName=Synchronet BBS Documentation -AppExe= -AppExeFile= -Version=3.0 -Company=Rob Swindell -Title=Synchronet BBS Documentation -TitleType=1 -BackgrndBmp=e:\artwork\syncgold_16_499.BMP -BackgrndAlign=1 -Backgrnd=1 -BackgrndColor=0 -Uninstall=1 -UninstallChecked=1 -Silent=1 -SmsMode=0 - -[Types] -Types=1 -Type1Components=1 -Type1Name=Complete -Type1ComponentList=1 - -[Components] -Components=1 -Component1Groups=2 -Component1Name=Documentation Files -Component1Description=Documentation Files -Component1GroupList=1 2 - -[Groups] -Groups=2 -Group1Size=1000154 -Group1Files=33 -Group1Name=Documentation Files -Group1Dir=<INSTALLDIR> -Group1Update=2 -Group1TargetOS=-1 -Group1File1=C:\sbbs\docs\utility_reference.html -Group1File2=C:\sbbs\docs\appendix.html -Group1File3=C:\sbbs\docs\baja.html -Group1File4=C:\sbbs\docs\chat_section.html -Group1File5=C:\sbbs\docs\customization.html -Group1File6=C:\sbbs\docs\default.htm -Group1File7=C:\sbbs\docs\external_programs.html -Group1File8=C:\sbbs\docs\features.html -Group1File9=C:\sbbs\docs\file_section.html -Group1File10=C:\sbbs\docs\glossary.html -Group1File11=C:\sbbs\docs\index.htm -Group1File12=C:\sbbs\docs\index.html -Group1File13=C:\sbbs\docs\install.html -Group1File14=C:\sbbs\docs\message_section.html -Group1File15=C:\sbbs\docs\modem_setup.html -Group1File16=C:\sbbs\docs\multnode_config.html -Group1File17=C:\sbbs\docs\networking.html -Group1File18=C:\sbbs\docs\platforms.html -Group1File19=C:\sbbs\docs\sbbsecho.html -Group1File20=C:\sbbs\docs\security.html -Group1File21=C:\sbbs\docs\smb.html -Group1File22=C:\sbbs\docs\sysop.html -Group1File23=C:\sbbs\docs\sysop_commands.html -Group1File24=C:\sbbs\docs\system_config.html -Group1File25=C:\sbbs\docs\textfile_section.html -Group1File26=C:\sbbs\docs\troubleshooting.html -Group1File27=C:\sbbs\docs\user.html -Group1File28=C:\sbbs\docs\user_editor.html -Group1File29=C:\sbbs\docs\adding_nodes.html -Group1File30=C:\sbbs\docs\htdocs_contrib.txt -Group1File31=C:\sbbs\docs\gpl.txt -Group1File32=C:\sbbs\docs\upgrade.txt -Group1File33=C:\sbbs\docs\ntreadme.txt -Group2Size=2075783 -Group2Files=110 -Group2Name=Documentation Image Files -Group2Dir=<INSTALLDIR>\images -Group2Update=2 -Group2TargetOS=-1 -Group2File1=C:\sbbs\docs\images\baja_example.gif -Group2File2=C:\sbbs\docs\images\bre.gif -Group2File3=C:\sbbs\docs\images\lordcfg.gif -Group2File4=C:\sbbs\docs\images\sbbsctrl.gif -Group2File5=C:\sbbs\docs\images\sbbsctrl_configure.gif -Group2File6=C:\sbbs\docs\images\sbbsctrl_telnet_cfg_gen.gif -Group2File7=C:\sbbs\docs\images\sbbsecho_additionalecho.gif -Group2File8=C:\sbbs\docs\images\sbbsecho_additionalecho_list.gif -Group2File9=C:\sbbs\docs\images\sbbsecho_additionalecho_list_tag.gif -Group2File10=C:\sbbs\docs\images\sbbsecho_archiveprgs.gif -Group2File11=C:\sbbs\docs\images\sbbsecho_archiveprgs_zip.gif -Group2File12=C:\sbbs\docs\images\sbbsecho_logoptions.gif -Group2File13=C:\sbbs\docs\images\sbbsecho_main.gif -Group2File14=C:\sbbs\docs\images\sbbsecho_node_arctype.gif -Group2File15=C:\sbbs\docs\images\sbbsecho_node_packettype.gif -Group2File16=C:\sbbs\docs\images\sbbsecho_node_settings.gif -Group2File17=C:\sbbs\docs\images\sbbsecho_nodes.gif -Group2File18=C:\sbbs\docs\images\sbbsecho_paths.gif -Group2File19=C:\sbbs\docs\images\sbbsecho_toggleoptions.gif -Group2File20=C:\sbbs\docs\images\scfg_chat_channel1.gif -Group2File21=C:\sbbs\docs\images\scfg_chat_features.gif -Group2File22=C:\sbbs\docs\images\scfg_chat_gurus.gif -Group2File23=C:\sbbs\docs\images\scfg_chat_pager1.gif -Group2File24=C:\sbbs\docs\images\scfg_chat_pagers.gif -Group2File25=C:\sbbs\docs\images\scfg_chat_theguru.gif -Group2File26=C:\sbbs\docs\images\scfg_dos_startup.gif -Group2File27=C:\sbbs\docs\images\scfg_main.gif -Group2File28=C:\sbbs\docs\images\scfg_modem_config.gif -Group2File29=C:\sbbs\docs\images\scfg_modem_fax_code1.gif -Group2File30=C:\sbbs\docs\images\scfg_modem_fax_code2.gif -Group2File31=C:\sbbs\docs\images\scfg_modem_port_type.gif -Group2File32=C:\sbbs\docs\images\scfg_modem_resultcode_15.gif -Group2File33=C:\sbbs\docs\images\scfg_modem_resultcodes.gif -Group2File34=C:\sbbs\docs\images\scfg_modem_strings.gif -Group2File35=C:\sbbs\docs\images\scfg_modem_toggles.gif -Group2File36=C:\sbbs\docs\images\scfg_msg_area_advopts.gif -Group2File37=C:\sbbs\docs\images\scfg_msg_area_netopts.gif -Group2File38=C:\sbbs\docs\images\scfg_msg_area_toggles.gif -Group2File39=C:\sbbs\docs\images\scfg_msg_areas.gif -Group2File40=C:\sbbs\docs\images\scfg_msg_areas_gen.gif -Group2File41=C:\sbbs\docs\images\scfg_msg_attrcodes.gif -Group2File42=C:\sbbs\docs\images\scfg_msg_options.gif -Group2File43=C:\sbbs\docs\images\scfg_networks.gif -Group2File44=C:\sbbs\docs\images\scfg_networks_fido.gif -Group2File45=C:\sbbs\docs\images\scfg_networks_fido_address.gif -Group2File46=C:\sbbs\docs\images\scfg_networks_internet.gif -Group2File47=C:\sbbs\docs\images\scfg_networks_post.gif -Group2File48=C:\sbbs\docs\images\scfg_networks_post_hubs.gif -Group2File49=C:\sbbs\docs\images\scfg_networks_post_hubs_sccm.gif -Group2File50=C:\sbbs\docs\images\scfg_networks_qwkhubs.gif -Group2File51=C:\sbbs\docs\images\scfg_networks_qwkhubs_vert.gif -Group2File52=C:\sbbs\docs\images\scfg_networks_qwkhubs_vert_subs.gif -Group2File53=C:\sbbs\docs\images\scfg_networks_qwkhubs_vert_subs_opt.gif -Group2File54=C:\sbbs\docs\images\scfg_node1.gif -Group2File55=C:\sbbs\docs\images\scfg_node1_advanced.gif -Group2File56=C:\sbbs\docs\images\scfg_node1_toggles.gif -Group2File57=C:\sbbs\docs\images\scfg_system.gif -Group2File58=C:\sbbs\docs\images\scfg_system_advanced.gif -Group2File59=C:\sbbs\docs\images\scfg_system_expired.gif -Group2File60=C:\sbbs\docs\images\scfg_system_loadablemods.gif -Group2File61=C:\sbbs\docs\images\scfg_system_newvalues.gif -Group2File62=C:\sbbs\docs\images\scfg_system_newvalues_questions.gif -Group2File63=C:\sbbs\docs\images\scfg_system_newvalues_toggles.gif -Group2File64=C:\sbbs\docs\images\scfg_system_quickval.gif -Group2File65=C:\sbbs\docs\images\scfg_system_quickval_0.gif -Group2File66=C:\sbbs\docs\images\scfg_system_securityvalues.gif -Group2File67=C:\sbbs\docs\images\scfg_system_securityvalues_0.gif -Group2File68=C:\sbbs\docs\images\scfg_system_toggle.gif -Group2File69=C:\sbbs\docs\images\scfg_xfer_compressable.gif -Group2File70=C:\sbbs\docs\images\scfg_xfer_dir.gif -Group2File71=C:\sbbs\docs\images\scfg_xfer_dir_advanced.gif -Group2File72=C:\sbbs\docs\images\scfg_xfer_dir_toggles.gif -Group2File73=C:\sbbs\docs\images\scfg_xfer_event.gif -Group2File74=C:\sbbs\docs\images\scfg_xfer_eventc.gif -Group2File75=C:\sbbs\docs\images\scfg_xfer_extractable.gif -Group2File76=C:\sbbs\docs\images\scfg_xfer_library.gif -Group2File77=C:\sbbs\docs\images\scfg_xfer_options.gif -Group2File78=C:\sbbs\docs\images\scfg_xfer_proto_dsz.gif -Group2File79=C:\sbbs\docs\images\scfg_xfer_proto_dsz_g.gif -Group2File80=C:\sbbs\docs\images\scfg_xfer_proto_dsz_h.gif -Group2File81=C:\sbbs\docs\images\scfg_xfer_proto_dsz_x.gif -Group2File82=C:\sbbs\docs\images\scfg_xfer_proto_dsz_y.gif -Group2File83=C:\sbbs\docs\images\scfg_xfer_proto_dsz_z.gif -Group2File84=C:\sbbs\docs\images\scfg_xfer_proto_fdsz.gif -Group2File85=C:\sbbs\docs\images\scfg_xfer_proto_fdsz_g.gif -Group2File86=C:\sbbs\docs\images\scfg_xfer_proto_fdsz_x.gif -Group2File87=C:\sbbs\docs\images\scfg_xfer_proto_fdsz_y.gif -Group2File88=C:\sbbs\docs\images\scfg_xfer_proto_fdsz_z.gif -Group2File89=C:\sbbs\docs\images\scfg_xfer_testable.gif -Group2File90=C:\sbbs\docs\images\scfg_xfer_testable_du.gif -Group2File91=C:\sbbs\docs\images\scfg_xfer_testable_zip.gif -Group2File92=C:\sbbs\docs\images\scfg_xfer_testable_zipc.gif -Group2File93=C:\sbbs\docs\images\scfg_xfer_viewable.gif -Group2File94=C:\sbbs\docs\images\scfg_xtrn_fixed.gif -Group2File95=C:\sbbs\docs\images\scfg_xtrn_lord.gif -Group2File96=C:\sbbs\docs\images\scfg_xtrn_sbl.gif -Group2File97=C:\sbbs\docs\images\scfg_xtrn_section.gif -Group2File98=C:\sbbs\docs\images\scfg_xtrn_swaplist.gif -Group2File99=C:\sbbs\docs\images\scfg_xtrn_syncedit.gif -Group2File100=C:\sbbs\docs\images\scfg_xtrn_timed.gif -Group2File101=C:\sbbs\docs\images\scfg_xtrn_timeopt.gif -Group2File102=C:\sbbs\docs\images\scfg_xtrn_tw2002.gif -Group2File103=C:\sbbs\docs\images\scfg_xtrn_usurper.gif -Group2File104=C:\sbbs\docs\images\scfg_xtrn_winos2list.gif -Group2File105=C:\sbbs\docs\images\setuptype.gif -Group2File106=C:\sbbs\docs\images\synclogo_fancyred.gif -Group2File107=C:\sbbs\docs\images\tw2002.gif -Group2File108=C:\sbbs\docs\images\uedit_v3.gif -Group2File109=C:\sbbs\docs\images\uedit_v3_exe.gif -Group2File110=C:\sbbs\docs\images\v3icon3.gif - -[Sequence] -DestinationLocationDir=C:\SBBS\DOCS -DatabaseLocationDir=<INSTALLDIR>\data -SelectProgramFolderName=install -DestinationLocation=1 -ProgressBar=1 - -[RegEntries] -Reg1Path=HKEY_CLASSES_ROOT -Reg1Val1Type=0 -Reg1Val1Name=(Default) -Reg1Val1Data=(value not set) -Reg1Vals=1 -Reg2Path=HKEY_CURRENT_USER -Reg2Val1Type=0 -Reg2Val1Name=(Default) -Reg2Val1Data=(value not set) -Reg2Vals=1 -Reg3Path=HKEY_LOCAL_MACHINE -Reg3Val1Type=0 -Reg3Val1Name=(Default) -Reg3Val1Data=(value not set) -Reg3Vals=1 -Reg4Path=HKEY_USERS -Reg4Val1Type=0 -Reg4Val1Name=(Default) -Reg4Val1Data=(value not set) -Reg4Vals=1 -Reg5Path=HKEY_CURRENT_CONFIG -Reg5Val1Type=0 -Reg5Val1Name=(Default) -Reg5Val1Data=(value not set) -Reg5Vals=1 -Reg6Path=HKEY_DYN_DATA -Reg6Val1Type=0 -Reg6Val1Name=(Default) -Reg6Val1Data=(value not set) -Reg6Vals=1 -Regs=6 - -[Registry] - -[Autoexec] -PathDir= -ShareLocks= -ShareFiles= -Command= - -[CopyToFloppy] -DriveOption= -DestinationPath= -DestinationPathOneFile= -Password= - -[Uninstall] -UserUninstall=0 diff --git a/docs/install.txt b/docs/install.txt deleted file mode 100644 index cd21869be8..0000000000 --- a/docs/install.txt +++ /dev/null @@ -1,97 +0,0 @@ -Installing Synchronet BBS for Win32 v3.0 Revision C -=================================================== - -This version has been succesfully tested with the -following operating systems: - - o Microsoft Windows 95 - o Microsoft Windows 95a - o Microsoft Windows 95b (OSR2) - o Microsoft Windows 98 - o Microsoft Windows 98 SE - o Microsoft Windows Me - o Microsoft Windows NT 3.51 - o Microsoft Windows NT 4 - o Microsoft Windows 2000 - -If you are upgrading an existing installation of -Synchronet (v2.3 or v3.0), it is advised that you -choose "Custom" Setup and disable the following -installation components: - - o Configuration Files - o Text and Menu Files - o External Programs - -It is recommended that you install Synchronet into -the default installation directory (C:\SBBS). If you -choose to install into a different location, it is -strongly recommended that you use \SBBS or another -MS-DOS compatible 8.3 format path name (e.g. D:\SBBS, -NOT D:\Synchronet). Installing into a location other -than C:\SBBS will require modification of the -following files for full operation: - - o EXEC\VERT.BAT - o EXEC\VERT.FTP - o EXEC\TIMED.BAT - o TEXT\BULLSEYE.CFG - - -SBBSCTRL (Synchronet Control Panel) -~~~~~~~~ -SBBSCTRL is the Sysop's console for SBBS v3 for Win32. You -still must use SCFG to configure the BBS options shared -between the new and old versions. - -The installation program will create a short-cut to -SBBSCTRL.EXE on your desktop and in your startup folder -(so Synchronet will start automatically during boot-up). - - -Known Issues -~~~~~~~~~~~~ -o Moving messages between message areas will corrupt the - message base. -o DOSKEY must be loaded in your autoexec.bat for the DOS - shell to work right (Windows 95/98/ME) -o Backspace doesn't work right in DOS shell (Windows 95/98/ME) -o First node (set in SBBSCTRL) configuration is used for all - nodes (this is actually intentional, i.e. not a bug) -o First node's temp directory must be set to "TEMP\" - - -Documentation -~~~~~~~~~~~~~ -The sysop documentation has been converted to HTML format, -but is no longer included in the installation package due -to size considerations. See http://synchro.net/docs for the -online docs or download ftp://synchro.net/sbbsdocs.zip -for a local installation. - - -Ordering/Registering Synchronet -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Synchronet (as of April 1997) is FREEWARE - no registration or -licensing fee is required. - - -For More Information -~~~~~~~~~~~~~~~~~~~~ -See DOCS\NTREADME.TXT for instructions on running - Synchronet v3.0 on Windows NT or Windows 2000. - -See DOCS\V300_NEW.TXT for list of new features in - Synchronet v3.0. - -See DOCS\SBBS3FAQ.TXT for answers to frequently asked - questions regarding Synchronet v3.0. - -See DOCS\V3CFGFAQ.TXT for answers to frequently asked - questions about configuring Synchronet v3.0. - -Thanks for your interest in Synchronet BBS Software -(www.synchro.net). - -Rob Swindell -(rob@synchro.net) diff --git a/docs/mailer.bat b/docs/mailer.bat deleted file mode 100755 index 7dc7deacc0..0000000000 --- a/docs/mailer.bat +++ /dev/null @@ -1,136 +0,0 @@ -@echo off -rem *************************************************************************** -rem MAILER.BAT (AKA IMRUN.BAT or FDRUN.BAT) file for use with FrontDoor or -rem InterMail and Synchronet BBS Version 2 -rem -rem If you get OUT OF ENVIRONMENT SPACE messages when using this batch file, -rem increase your DOS environment by adding the following to your CONFIG.SYS: -rem SHELL=C:\COMMAND.COM /E:1024 /P -rem *************************************************************************** - -rem *************************************************************************** -rem Set this to IM for InterMail or FD for FrontDoor -rem ************************************************ -set fd=FD - -rem *************************************************************************** -rem Node Number - needed for NODE utility -rem ************************************* -set nodenum=1 - -rem *************************************************************************** -rem SBBS Directory -rem ************** -set sbbs=c:\sbbs - -rem *************************************************************************** -rem SBBS CTRL Dir - needed for NODE utility -rem *************************************** -set sbbsctrl=%sbbs%\ctrl - -rem *************************************************************************** -rem SBBS NODE Dir - needed for SBBSECHO (use NODE1 directory) -rem ********************************************************* -set sbbsnode=%sbbs%\node1 - -:top -rem *************************************************************************** -rem Set Node status to WAITING FOR CALL -rem *********************************** -%sbbs%\exec\node status=0 %nodenum% rerun off %nodenum% event off %nodenum% - -rem *************************************************************************** -rem Drive letter and directory where Mailer is installed -rem **************************************************** -c: -cd \%fd% -%fd% - -rem *************************************************************************** -rem These error levels must be set in FDSETUP or IMSETUP! -rem ***************************************************** -if errorlevel 200 goto fax -if errorlevel 100 goto bbs -if errorlevel 75 goto event -if errorlevel 50 goto inmail -if errorlevel 25 goto outmail -if errorlevel 10 goto userbreak -if errorlevel 1 goto error -goto end - -rem *************************************************************************** -rem Mailer received in-bound mail from another system -rem ************************************************* -:inmail -echo Importing in-bound mail!!! -rem *************************************************************************** -rem Set node status to NETWORKING -rem ***************************** -%sbbs%\exec\node status=6 %nodenum% -%sbbs%\exec\sbbsecho /les! -goto top - -rem *************************************************************************** -rem Semaphore file (xxEXIT.025) was signaled by the BBS - new outbound messages -rem *************************************************************************** -:outmail -echo Exporting out-bound mail!!! -rem *************************************************************************** -rem Set node status to NETWORKING -rem ***************************** -%sbbs%\exec\node status=6 %nodenum% -%sbbs%\exec\sbbsecho /lin -rem *************************************************************************** -rem Signal the rescan semaphore so that FD will rescan the netmail folder -rem ********************************************************************* -rem > fdrescan.now -goto top - -rem *************************************************************************** -rem Received a call from a user wanting access to the BBS - how dare they! -rem This actually executes EXEBBS.BAT with the proper switches for SBBS -rem You will probably also need to edit EXEBBS.BAT for your configuration -rem ********************************************************************* -:bbs -dobbs - -rem *************************************************************************** -rem Run any pending events (Remove the 'o' if running SBBS v2.1 or earlier) -rem *********************************************************************** -:event -cd %sbbsnode% -call sbbs o -goto top - -rem *************************************************************************** -rem Received a fax call -rem ******************* -:fax -cd \zfax -rcvfax 2 /p:1 -if errorlevel 0 echo riIncoming FAX Notification! >> \bbs\data\msgs\0001.msg -goto top - -rem *************************************************************************** -rem Quit FD -rem ******* -:userbreak -echo User Break. -goto end - -rem *************************************************************************** -rem Mailer error of some kind -rem ************************* -:error -echo %fd% ERROR (1-9) -goto end - -rem *************************************************************************** -rem End of the batch file, so display a blank line for prettiness -rem ************************************************************* -:end -rem *************************************************************************** -rem Make node status OFFLINE -rem ************************ -%sbbs%\exec\node status=5 %nodenum% -echo. diff --git a/docs/message_section.html b/docs/message_section.html deleted file mode 100644 index b13e21d31c..0000000000 --- a/docs/message_section.html +++ /dev/null @@ -1,718 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Message Base</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2><a name="MessageBase">[8.0] - Message Base</a></h2> -<pre>The Synchronet message base is used for storing messages from a user or sysop -to other users or a specific user. The messages are divided into sub-boards -where each sub-board has a unique message topic. Sub-boards are grouped -together into message groups.</pre> -<pre>Sysops can control which users have what level of access to each group and -sub-board. If a user doesn't have access to a specific group or sub-board, -the user won't even know the specific group or sub-board exists.</pre> -<pre>The following is an example group/sub-board configuration:</pre> -<pre><b>Group Name Sub-boards -</b>------------------------------------------------------------------------------ -Main Sysop Notices - General Discussion - Debate - Entertainment - Advertisements</pre> -<pre>Adult General Discussion - Entertainment - Singles Only</pre> -<pre>Technical Hardware Help - Software Help - Programming</pre> -<pre>The Synchronet configuration program (<a href="system_config.html">SCFG</a>) is used for adding, deleting, -and configuring message groups and sub-boards.</pre> -<h2><a name="ElectronicMail">[8.1] - Electronic Mail (E-mail)</a> -</h2> -<pre>Synchronet has a separate private personal mailbox for each user on the system. -Users may receive local E-mail, NetMail, and Attached Files in their mailbox. -Upon logon, each user is asked if they wish to read any mail in their box. Mail -will stay in the user's box until it is deleted. Mail in a user's box may only -be viewed or deleted by the receiving user, the sending user, or a sysop. - -E-mail is preferred over Private Posts (on a sub-board) for sending private -messages to users on the same BBS. Private posts are only useful for sending -private messages on message networks that do not support or allow NetMail. - -An E-mail file attachment may be uploaded by a user if SCFG->System->Message -Options->Allow Uploads in E-mail is set to Yes. When reading E-mail with a file -attached, the receiving user will be prompted if he or she wishes to download -the attached file at that time. If the user downloads the file, the file is -deleted. If the message is deleted without the file being downloaded, the file -is deleted as well. - -Users with the 'A' exemption may send Anonymous E-mail if SCFG->System->Message -Options->Allow Anonymous E-mail is set to Yes. - -When replying to another message in E-mail, the original message may be quoted -if the SCFG->System->Message Options->Allow Quoting in E-mail is set to Yes.</pre> -<h3><a name="SynchronetMailServer">[8.2.1] - Internet (SMTP/POP3) Mail Server</a> -<b><font color="#FF0000"><i>(v3+ Only)</i></font></b> -</h3> -<pre><b>Set-up:</b></pre> -<ol> - <li> -<pre>Set SCFG->Networks->Internet->Address to your system's Internet address - (domain name or static IP).</pre> - </li> - <li> -<pre>Set SCFG->Networks->Internet->Allow Sending of Netmail to "Yes".</pre> - </li> - <li> -<pre>Set SCFG->Networks->Internet->Allow File Attachments to "No" - (File attachments from the BBS are not supported at this time).</pre> - </li> - <li> -<pre>Set SCFG->Networks->Internet->Send NetMail using Alias however you wish - (Users can receive e-mail to their Alias OR real-name regardless of this - setting).</pre> - </li> - <li><pre>Set SBBSCTRL->Mail Server->Configure-><i>DNS Server</i> to the address of your - ISP's Primary DNS server (run "<b>ipconfig /all</b>" from the Windows command line - to display your ISP's Primary DNS server) OR set <i>Relay Server</i> to the address - of your ISP's SMTP server (check your e-mail program for your configured SMTP - server hostname).</pre> - </li> -</ol> -<pre><b>Notes:</b></pre> -<pre>Users will be able to send Internet e-mail from your BBS now (if you have a -customized <b>TEXT.DAT</b> make sure you have updated line 62, "<i>InternetMailing</i>").</pre> -<pre>Your users will be able to receive e-mail at your BBS using any of the -following ways: - </pre> -<pre> <b>First.Last@your.bbs.domain -</b> <b>First_Last@your.bbs.domain - RealFirst.Last@your.bbs.domain - UserNumber@your.bbs.domain (if <i>RX By User Number</i> is toggled on) - "First Last"@your.bbs.domain - "RealFirst Last"@you.bbs.domain </b></pre> -<pre>E-mail user names are not case sensitive (e.g. Digital.Man and digital.man are -both valid user names). In order for users to receive mail via user number, that -option must be checked in SBBSCTRL->Mail->Configure.</pre> -<pre>E-mail sent to "<b>SYSOP</b>", "<b>POSTMASTER</b>", your BBS's QWKID, or the sysop name -(as configured in SCFG) will automatically go to user #1 on the BBS.</pre> -<pre>Additional aliases can be configured by creating the text file <b>ctrl/alias.cfg</b> -with the following syntax:</pre> -<pre>-------------------------------[ Begin ]--------------------------------------</pre> -<pre>; This is a comment -; -; Alias User Name or number</pre> -<pre>root sysop -sysadmin sysop -webmaster sysop -great.drummer Rob Swindell</pre> -<pre>--------------------------------[ End ]---------------------------------------</pre> -<pre>If a user has their account configured to forward their e-mail to an Internet -address and they receive an Internet e-mail, it will automatically be forwarded -to the configured address.</pre> -<pre>The sysop of QWKnet nodes can receive e-mail at their QWK-ID @ their hub's -Internet domain/ip address. Example: If YOURBBS (QWK-ID) polls VERT for QWKnet, -you (the sysop) can receive e-mail at yourbbs@vert.synchro.net.</pre> -<pre>You (or any of the user's on YOURBBS) can send Internet e-mail from YOURBBS -through VERT by sending a QWKnet NetMail message to NETMAIL@VERT with the -actual destination Internet address as the first line of the message. - -<b>Relaying:</b> - -As of v1.10, the Synchronet Mail Server can be used to relay e-mail to external -servers. Due to the security (SPAM) risks of opening the SMTP server up to just -anyone, you must specify which hostnames or IP addresses you wish to allow to -relay mail. You do this by creating the file <b>text/relay.can</b> and list the IP -addresses or host names of the systems you wish to give relay access to. If you -wish to allow relay access to all hosts (not recommended), simply create a -<b>relay.can</b> with one line containing "<b>.~</b>".</pre> -<h2><a name="SettingUpMessageBase">[8.3] - Setting Up the Message Base</a> -</h2> -<h3><a name="CreatingMessageGroups">[8.3.1] - Creating Message Groups:</a> -</h3> -<pre>Run SCFG and select "<i>Message Base</i>" from the SCFG main menu and add any -additional message groups you want. A message group is a group of message -sub-boards that have a similar subject matter or other common element. It is -common to put all of your local sub-boards in one group and your networked -sub-boards (where messages are shared with other BBSs) into other groups. An -example configuration that separates local and networked sub-boards into groups: - -<b>Group Sub-boards</b> -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Local General -Local Sports -Local Debate -Local Literature -Local Technology -Local Advertisements -DOVE-Net General -DOVE-Net Advertisements -DOVE-Net Entertainment -DOVE-Net Debate -DOVE-Net Hardware/Software -DOVE-Net Programming -DOVE-Net Synchronet -DOVE-Net Synchronet Sysops -FidoNet Interuser Discussion -FidoNet Politics -FidoNet Unix -FidoNet OS/2 -FidoNet DESQview - -Another use of message groups is to group sub-boards of similar topic together: - -<b>Group Sub-board</b> -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Main Sysop Messages -Main General -Main Debate -Main Entertainment -Main BBS Ads and ANSI -Technical Software Help -Technical Hardware Help -Technical Programming -Adult General -Adult Singles Only -Adult Dear Abby -Adult Jokes -Adult Financial - -And you certainly can mix the two examples of message group utilization given -above or invent your own. Or, you can just have one message group for all of -your sub-boards - forgoing the organizational advantages of using multiple -groups. - -To add message groups, select the position you want the new message group -to be in with the arrow keys. If you want the new message group to be the -first group, highlight the top line. If you want the message group to be added -to the end of the group list, highlight the bottom line. Hit <i>INS</i> (insert key) -to add a new message group, or <i>DEL</i> (delete key) to remove an existing one. -Following is a list of options available when creating or modifying a message -group.</pre> -<h3><a name="MessageGroupOptions">[8.3.2] - Message Group Options</a> -</h3> -<pre><img border="0" src="images/scfg_msg_areas.gif" width="572" height="331"></pre> -<pre><b>Long Name:</b> - This is a description of the message group which is displayed in - message group listings. - -<b>Short Name: -</b> This is a description of the message group which is used for prompts. - -<b>Access Requirements: -</b> Use this option to set specific user requirements for access this - message group. - -<b>Clone Options: -</b> Use this option to "copy" the options from the first message sub-board - in this group to all other existing sub-boards in this group. - -<b>Export Areas: -</b> If you wish to export the area information of all the sub-boards in - the current message group to a text file, use this option. - -<b>Import Areas: -</b> If you wish to import message area information from a text file, use - this option. - -<b>Message Sub-boards...: -</b> Select this option to get a list of, and be able to edit, the sub- - boards within this group.</pre> -<h3><a name="CreatingMessageSub-boards">[8.3.3] - Creating Message Sub-boards:</a></h3> -<pre>To create sub-boards, hit enter on the message group you want to add the -sub-boards to, then select "Message Sub-boards". Adding sub-boards is very -similar to adding groups except you will be prompted for an internal code. -The internal code should be a short description (name abbreviation) for the -sub-board. To configure the particulars for the sub-board, select it by hitting -enter on it from the sub-board list. Following is a list of options available -when creating or modifying a message sub-board.</pre> -<h3><a name="Sub-boardMainOptions">[8.3.4] - Sub-board Main Options</a></h3> -<pre><img border="0" src="images/scfg_msg_areas_gen.gif" width="572" height="331"> - -<b>Long Name: -</b> This is a description of the sub-board which is displayed in - sub-board listings. - -<b>Short Name: -</b> This is a description of the sub-board which is used for prompts. - -<b>QWK Name: -</b> This is the name of the sub-board used for QWK off-line readers. - -<b>Internal Code: -</b> This is an internal code for SBBS to distinguish this sub-board from - the others on the system. This should be a unique name of up to 8 valid - DOS filename characters. - -<b>Access Requirements: -</b> These are the requirements that a user must meet to be able to access - this sub-board. - -<b>Reading Requirements: -</b> Use this option to set the security requirements to read messages on - this sub-board. - -<b>Posting Requirements: -</b> Use this option to set the security requirements to post on this - sub-board. - -<b>Operator Requirements: -</b> Use this option to set the security requirement to be a sub-op on this - sub-board (note: sub-op is a sysop of a sub-board). - -<b>Moderated Posting User: -</b> Users meeting the criteria set here will have their posts "moderated" - when posting on this sub-board. Moderated messages cannot be read by - users or exported until validated by a sub-op or sysop. - -<b>Maximum Number of Messages: -</b> This is the maximum number of messages that will be allowed on the - sub-board. This number is used by SMBUTIL to maintain the message base - and remove the oldest messages when this limit is exceeded. - -<b>Purge by Age: -</b> This is the maximum length of time (in days) that old messages will - be kept in a sub-board. - -<b>Duplicate Checking: -</b> Use this option for duplicate message checking (comparing a new - message against those previously imported to detect a duplicate message - created by program or user error). Enabling duplicate message checking - requires you specify a maximum number of CRCs. This is the number of - previously imported messages to keep track of (using CRC calculation). - This number, if used, should be set to about one weeks worth of - messages. Large numbers in this field will slow down message importing.</pre> -<h3><a name="ToggleOptions">[8.3.5] - Toggle Options</a></h3> -<pre><img border="0" src="images/scfg_msg_area_toggles.gif" width="572" height="331"> - -<b>Allow Private Posts: -</b> If you want to allow users to post private messages to another user - on the sub-board, set this option to Yes. Since Synchronet has an - internal e-mail system, this option is usually only set to Yes on - networked sub-boards that allow private posts. You can also force - private posts on this sub-board by setting this option to Only. - -<b>Allow Anonymous Posts: -</b> If you want to allow users that have the 'A' exemption to be able to - post anonymously on this sub-board, set this option to Yes. You may - also force anonymous posts by any one (with or without the 'A' - exemption) by setting this option to Only. - -<b>Post Using Real Names: -</b> If you wish posts on this sub-board to be posted using the real name - of a user instead of his/her alias, set this option to Yes. Many - networks require BBSs that allow aliases to force real names on - networked sub-boards. - -<b>Users Can Delete Posts: -</b> You may allow users to delete their posted messages by setting this - value to Yes. You may allows users to delete their messages only if - it is the last message on the sub-board by setting this value to - Last. - -<b>Default On for New Scan: -</b> If this option is set to Yes, this sub-board will default to 'On' - when a user does a new message scan on this sub-board for the first - time. - -<b>Forced New Scan: -</b> If this option is set to Yes, the sub-board will not be skipped in - new message scans even if the user has configured his or her new scan - to not contain this sub-board. - -<b>Default On for Your Scan: -</b> If this option is set to Yes, this sub-board will default to 'On' - when a user does a new message scan for personal messages on this - sub-board for the first time. - -<b>Public 'To' User: -</b> If you wish all posts to be prompted for a 'To' user, set this option - to Yes. Many networks do not allow private messages on networked - sub-boards, so the only way to send a message 'To' someone is to send - it publicly with a 'To' field. Normally, 'To' users are only prompted - for on private posts. - -<b>Allow Message Quoting: -</b> If you wish for users to be able to quote from other messages on this - sub-board, set this option to Yes. - -<b>Permanent Operator Msgs: -</b> Setting this option to Yes will cause messages posted by the Sysop (or - sub-op) to be marked as permanent (will not be deleted by normal - maintenance). - -<b>Kill Read Messages: -</b> If you wish for messages to be deleted after the recipient has read the - message, set this option to Yes. To delete only those messages marked - as private after they've been read, set this option to Private. - -<b>Compress Messages (LZH): -</b> When this option is set to 'Yes', the BBS will utilize the LZH - compression method when storing messages. This will cause message - importing to be slower, but can conserve disk space (30% to 50%) which - can mean tens or even hundreds of megabytes of extra space on BBSs with - large message bases.</pre> -<h3><a name="NetworkOptions">[8.3.6] - Network Options</a></h3> -<pre><img border="0" src="images/scfg_msg_area_netopts.gif" width="572" height="331"> - -<b>Append Tag/Origin Line: -</b> If you want a tagline (QWK network) or origin line (FidoNet) to be - appended to messages sent out on the network from this sub-board, - set this option to Yes. - -<b>Export ASCII Only: -</b> Set this option to Yes if this sub-board should only be exporting - ASCII characters to message networks. - -<b>Gate Between Net Types: -</b> If this sub-board is simultaneously networked with multiple networks - using different network technologies, and you want messages imported - from one network to be exported to the other network(s), you must set - this option to 'Yes'. Gating messages between networks usually requires - specific authorization from the moderator of each network. Do not set - this option to 'Yes' unless you are absolutely sure you understand the - consequences. - -<b>QWK Networked: -</b> Setting this option to Yes will limit posted message titles to the - QWK packet limitation of 25 characters and allow QWK network accounts - to upload and download messages to/from this sub-board. - -<b>QWK Tagline: -</b> This is an optional tagline that will be used for this sub-board. If - this field is blank, the default tagline will be used. If "Append - Tag/Origin Line" is set to No, then no tagline will be used. - -<b>Internet: -</b> If this sub-board is networked via the internet, this toggle option - should be set to 'Yes'. - -<b>PostLink or PCRelay: -</b> If this sub-board is networked via PostLink or PCRelay, set this option - to Yes. - -<b>FidoNet EchoMail: -</b> If this sub-board is networked via FidoNet, set this option to Yes. - -<b>FidoNet Address: -</b> This is the FidoNet address used for this sub-board. - -<b>EchoMail Origin Line: -</b> This is an optional origin line that will be used for this sub-board. - Do not include the FidoNet address in this line. Synchronet - automatically adds the " * Origin: " and "(Zone:Net/Node.Point)". - If this field is blank, the default origin line will be used. If - "Append Tag/Origin Line" is set to No, then no origin line will be - used. - -<b>EchoMail Directory: -</b> This is the storage directory where FidoNet style (FTS-0001 stored - message format) messages are imported from and exported to for this - sub-board (using SBBSFIDO a defunct method of importing/exporting - FidoNet echomail). If this option is blank, then the EchoMail base - directory is used with the internal code of this sub-board as the - sub-directory where the FidoNet messages are stored. - -<b>EchoMail Semaphore File: -</b> This is the path and filename of a file that should be created to - trigger your front-end mailer to export FidoNet EchoMail.</pre> -<h3><a name="AdvancedOptions">[8.3.7] - Advanced Options</a></h3> -<pre><img border="0" src="images/scfg_msg_area_advopts.gif" width="572" height="331"> - -<b>QWK Conference Number: -</b> This option allows you to use a Dynamic (automatic) or Static - (hard-coded) numbering for the QWK conference number of each sub-board. - Dynamic numbering gives "as is" conference numbers, where sub-board 1 - in group 1 would be 1001, and sub-board 1 in group 2 would be 2001, - etc. Static numbering allows you to give each conference whatever - number you prefer, which is extremely useful because it allows you to - add and remove conferences without altering the numbers of other - sub-boards. - -<b>Storage Method: -</b> This is the method which will be used for storing messages when a new - message is posted on this sub-board. There are three message storage - methods. Their advantages and limitations are as follows: - -<b> Self-packing: -</b> - Self-packing is the most efficient message storage method because it - looks for and uses deleted message blocks for new in-coming messages. - Because of this behavior, it is the slowest storage method, but - eliminates the need to run "SMBUTIL P" on the message base regularly. - It is suggested however, that you do run "SMBUTIL P" on Self-packing - message bases that have accumulated a large number of deleted message - blocks. This can happen if you lower the maximum number of a messages - for a message base and then run "SMBUTIL M" or import a large number of - networked messages into this message base, far exceeding the maximum, - and then running "SMBUTIL M". Under these circumstances, you will be - wasting disk space on deleted message blocks that will not likely be - used again unless you reach that number of messages again. - - An example: - - A Self-packing sub-board is set to maximum of 500 messages. The - sub-board has 500 messages in it taking up approximately 2MB of disk - space. A large network message packet is imported containing 200 - messages for this sub-board. The sub-board now has 700 message in it - taking up approximately 3MB of disk space. "SMBUTIL M" is run and the - oldest 200 messages are deleted, bringing the total messages down to - 500 again, but still taking up 3MB of disk space. The sub-board will - not increase in size (disk consumption) again unless the total number - of messages exceeds 700. If this is not likely to happen, then running - "SMBUTIL P" on this sub-board will save you approximately 1MB of disk - space. - -<b> Fast Allocation: -</b> - Fast Allocation storage method is faster than Self-packing because it - does not search for deleted message blocks to use for new messages, it - always adds to the end of the message base. Because of this behavior, - the message base will continually grow in size (consuming disk space) - until "SMBUTIL P" is run. Since the idea of using Fast Allocation is - speed, it is also a good idea to speed up your "SMBUTIL P" event by - specifying a minimum number of packable kilobytes before actually - packing a message base. This will cause SMBUTIL to analyze the message - base before actually packing it. This is be done by specifying the - number of kilobytes on the SMBUTIL command line. If for example, you - only want it to pack the message base if it can save 500k or more of - disk space, then use "SMBUTIL P500" for a command line. This will keep - SMBUTIL from packing the message base every time it is run (which can be - time consuming) even if only a small amount of disk space will be saved - from the operation. - - You can switch between fast Fast Allocation and Self-packing storage - methods at any time. You can even have one program importing into a - message base using Self-packing and another using Fast Allocation and - no harm will be done to the message base. - -<b> Hyper Allocation: -</b> - Hyper Allocation is much like Fast Allocation, except it is much faster - because it does not update the message base allocation files necessary - to be downward compatible with the Self-packing storage method. For - this reason, you cannot change a message base from Hyper Allocation to - Self-packing or Fast Allocation without first deleting all the messages - in the message base (SCFG will do this for you). You must also be sure - that all programs that write to this message base support the Hyper - Allocation storage method (as defined in v1.20 of the SMB - specification). If you are using any third party message import - programs, do NOT use this storage method unless you are positive the - program supports it. Ask the developers if you are not sure. - - Like Fast Allocation, you must run "SMBUTIL P" on Hyper Allocated - message bases regularly. The minimum packable kilobytes analysis - feature of SMBUTIL (i.e. "SMBUTIL P500") takes longer with a Hyper - Allocated message base but the actual packing operation is much faster. - - To get the fastest importing/writing speed, disable Duplicate Message - checking and LZH compression for the message base. - - Retrieving messages (exporting/reading them from the message base) is - the same speed with all storage methods. LZH compressed message bases - will export slower than non-compressed message bases. - -<b>Storage Directory: -</b> Where Synchronet should place the data files for this sub-board. - Normally this option should be left BLANK unless it is required that - the data be placed on a different drive letter.</pre> -<h3><a name="QWKPacketPreviousSoftware">[8.4] - Importing QWK -Packet from Previous BBS Software</a></h3> -<pre>If you are upgrading to Synchronet from another BBS package and have your -messages in QWK packet format, you can import them into Synchronet as follows: - -1. Create message groups and sub-boards under Synchronet to accept the - messages from your old system. -2. Write down the conference numbers for each of your message areas from - the old system. -3. Rename your exported QWK packet to TEMP.QWK and copy it into your DATA - directory. -4. Add a QWK network hub in SCFG using TEMP for the QWK ID. -5. Add each of your sub-boards to the list of Networked Sub-boards and - enter the conference number from the old system. Select "Strip-out" - for Ctrl-A handling. Set Node 1 for the call-out node. -6. Run SBBS from your NODE1 directory and your messages should be - imported immediately. -7. Run SCFG and delete the TEMP QWK network hub.</pre> -<h3><a name="PostingMessage">[8.5] - Posting a Message</a></h3> -<pre>When posting a message on a sub-board, users or sysops can specify that the -message is NOT to be distributed across a message network (kept local only). -This is done by starting the message title with "NE:" which stands for -"No Echo" (only useful on networked sub-boards).</pre> -<h3><a name="RemoteQWKFunctions">[8.6] - Remote QWK Functions</a></h3> -<pre>Following are examples on how to perform various functions remotely via QWK. -Note that some of these functions are intended only for users who are using QWK -mail doors to retrieve their messages from the BBS, and not for BBSs which are -QWK netted together, these commands are noted as being for users only. Although -intended for users, some of the user commands will work properly on a QWK -netted BBS (e.g. FILES would place the resulting file list into the BBSs -inbound directory), but some will not (e.g. the YOURS function). - -In order to invoke the various remote QWK functions via a QWK network, you must -post a message to SBBS on one of the conferences which you are receiving from -your QWK hub. Note that the ADD and RESET functions are conference specific, -meaning that your message MUST be posted on the conference where the function -is to take effect. - -<b>NOTE:</b> In the following examples, 'ptr' is a pointer indicating the message - number to start at (e.g. specifying 100 would set the message pointer to - message number 100), '-msgs' sets the message pointer to a number of - messages from the end (e.g. -100 to set the pointer to 100 messages - from the last message), and 'mm/dd/yy' sets the message pointer to the - date specified (e.g. 01/01/90 sets the message pointer to January 1, - 1990). - The '|' symbol shown in the options means OR. Function parameters in - square brackets '[]' are optional, parameters in less than/greater than - symbols '<>' are required. Specifying an ON/OFF function without the - ON or OFF parameter will toggle the function OFF. - -<i>Examples:</i> - -To: <b>SBBS</b> (All messages must be sent to SBBS) - -Subj: <b>DROP [conf#]</b> -Note: Drop current conference (or specified conference #) from future packets. - -Subj: <b>ADD [YOURS] [ptr | -msgs | mm/dd/yy]</b> -Note: Add current conference to future packets and optionally set the message - pointer. - If "YOURS" is specified, only mail addressed to you will be packed for - this conference. - The YOURS option is for users only. - -Subj: <b>YOURS [ptr | -msgs | mm/dd/yy]</b> -Note: Same as "ADD YOURS". - For users only - -Subj: <b>RESET [ptr | -msgs | mm/dd/yy]</b> -Note: Set message pointer for current conference. - -Subj: <b>SUBPTR [ptr | -msgs | mm/dd/yy]</b> -Note: Same as "RESET". - -Subj: <b>RESETALL [ptr | -msgs | mm/dd/yy]</b> -Note: Set message pointers for all conferences. - -Subj: <b>ALLPTR [ptr | -msgs | mm/dd/yy]</b> -Note: Same as "RESETALL". - -Subj: <b>FREQ <filename></b> -Note: File Request from file transfer database (not attachments). QWK netted - BBSs will receive the requested file into their hubs IN sub-directory, - normally located in the \SBBS\DATA\QNET directory - -Subj: <b>FILES [ON | OFF | mm/dd/yy]</b> -Note: Include files list in packet and/or specify new-scan date. - Specifying files with the date only will turn this option ON. - For users only - -Subj: <b>ATTACH [ON | OFF]</b> -Note: Include file attachments in packet automatically (e-mail only). - For users only - -Subj: <b>OWN [ON | OFF]</b> -Note: Include messages from you (affects all conferences). - For users only - -Subj: <b>MAIL [ALL | ON | OFF]</b> -Note: Include private mail-box (ALL includes previously read mail). - For users only - -Subj: <b>DELMAIL [ON | OFF]</b> -Note: Automatically delete mail-box after successful packet download. - For users only - -Subj: <b>CTRL-A [KEEP | EXPAND | STRIP]</b> -Note: Ctrl-A color/attribute codes - leave-in, expand to ANSI, or remove. - -Subj: <b>NDX [ON | OFF]</b> -Note: Include index (.NDX) files (not necessary for Synchronet QWKnet) - -Subj: <b>CONTROL [ON | OFF]</b> -Note: Include control files (DOOR.ID, CONTROL.DAT, NETFLAGS.DAT, etc) - -Subj: <b>VIA [ON | OFF]</b> -Note: Include message path (@VIA) line in messages. - -Subj: <b>TZ [ON | OFF]</b> -Note: Include time zone (@TZ) line in messages. - -<b>Downloading Files in QWK</b> - -If there are any files in the batch download queue when a QWK packet is -created, they will be added to the QWK packet automatically. This is what -makes the FREQ control command so useful. A user (or QWK network node) just -posts a message (on any sub-board) to SBBS with the title "<b>FREQ FILENAME.EXT</b>" -(where FILENAME.EXT is the filename and extension of the file to download). -When the REP packet is extracted, the requested file (if found) is added to -the batch download queue. Then when a QWK packet is created, the file is -automatically included. Multiple file requests can be made and all files -will be included in the QWK packet. - -<b>Sending Netmail via QWK</b> - -If a user wishes to send netmail via a QWK packet generated from his offline -mail reader, he must post a message in the E-mail conference (number 0) with -the name and address of the recipient in the TO field of the message. -(e.g. John Doe @1:103/715 would be a valid Fidonet netmail address, or -jdoe@easyst.com would be a valid Internet netmail address). -This will not work if the user does not have the ability to send netmail. - -If the entire netmail address is too long to fit into the TO field (up to -25 characters), the user can alternately place the word "NETMAIL" in the TO -field, and place the netmail address (name@addr) of the recipient on the FIRST -LINE of the message body. Note that the '@' symbol MUST be present in a -netmail address if used in the 'to' field.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/modem_setup.html b/docs/modem_setup.html deleted file mode 100644 index 3319aed2d7..0000000000 --- a/docs/modem_setup.html +++ /dev/null @@ -1,493 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Modem Setup</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> - -<h2><a name="UART_Serial/Modem">[4.1] - Using UART Serial -Cards/Internal Modems</a> - -<b> <i><font color="#FF0000">(v2 Only)</font></i></b></h2> - -<pre>If you are using a shared IRQ or non-UART serial card, you should skip this -section and go to the section on 'Using a Shared IRQ or Non-UART Serial Card'. - -If you are using an internal modem, note that all references to serial boards -are the same as referring to an internal modem. Also note that most internal -modems only have support for up to 4 different IRQ's and I/O addresses. - -Prior to installing your serial board, you should insure that neither the IRQ -or the I/O address of any of the ports on the board are being used by any other -devices in your system. Following is a list of IRQ's and I/O addresses which -are commonly used by devices (those marked with a minus sign (-) may never be -used by a serial board): - - <b>Device IRQ I/O Address</b> - ---------------------- --- ----------- - -Timer 0 040 - 05F - -Keyboard Controller 1 060 - 06F - *EGA/VGA Cards 2 - Serial Port 2 3 2F8 - 2FF - Serial Port 1 4 3F8 - 3FF - Parallel Port 2 5 278 - 27F - Floppy Drive 6 3F0 - 3F7 - Parallel Port 1 7 378 - 37F - -Real Time Clock 8 070 - 07F - *Same as IRQ 2 9 - -Co-processor 13 0F0 - 0F1 - Fixed Disk Controller 14 1F0 - 1F8 - - *NOTE: IRQ's 2 and 9 may never be used at the SAME time. - -The following are suggested IRQ and I/O address settings for using up to 8 -serial ports: - - <b>Device IRQ I/O</b> - ---------------------- --- --- - Serial Port 1 4 3F8 - Serial Port 2 3 2F8 - Serial Port 3 5 3E8 - Serial Port 4 2 2E8 - Serial Port 5 10 1F8 - Serial Port 6 11 1E8 - Serial Port 7 12 1A8 - Serial Port 8 15 2A8 - -An additional 2 serial ports may be added using the following IRQ and I/O -addresses: - - <b> Device IRQ I/O</b> - ---------------------- --- --- - Serial Port 9 7 400 - Serial Port 10 14 408 - -Refer to the documentation provided by the manufacturer of your particular -serial board for information on how to select IRQ and I/O addresses. - -After you have the ports on your serial board set up to fit your system -requirements, you should write down the IRQ and I/O address information for -future reference. Once you have determined the IRQ and I/O address that each -node on your system will use, you must run the SCFG program and go to the -Nodes->Node #->Modem Configuration and set the COM Port, UART IRQ Line, and -UART I/O Address. Each node, when running on the same machine, should have a -unique COM Port number. - -<b>Notes on UARTs</b> - -If you are using an external high-speed modem, you may require a buffered -UART chip on your serial board for error-free transmissions. 8250 and 16450 -UARTs DO NOT have buffers and are usually insufficient for high-speed modems. -16550AFN UARTs have a 16 byte FIFO UART which allows error-free transmissions -with high-speed modems, particularly necessary when multi-tasking. Almost -all internal high-speed modems come with a built-in 16550 UART.</pre> - -<h2><a name="Shared_IRQ/Non-UART">[4.2] - Using a Shared IRQ -or Non-UART Serial Card</a></h2> - -<pre>If you are using a serial card which allows the use of shared IRQ's or has a -non-standard UART interface, you will need to use a device driver to interface -this card with Synchronet. Usually, such a driver would be included with the -serial card from the manufacturer. Third party drivers are also available (such -as COMM-DRV and X00). - -Synchronet supports three driver interfaces, all using Int 14h services. The -supported driver interfaces are: - - <b>FOSSIL</b> (Fido/Opus/SEAdog Standard Interface Layer Version 5) - Functions 0 through 6, and Fh - Example FOSSIL drivers: X00, BNU, and COMM-DRV - - <b>PC BIOS</b> - Functions 0 through 3 - - <b>PS/2 BIOS</b> - Functions 1, 2, 4, and 5 - - <b>DigiBoard</b> - DigiCHANNEL PC/Xi and PC/Xe DOS driver - -When setting the COM port in SCFG->Nodes->Node #->Modem Configuration, you -will be prompted for the COM port type:</pre> -<pre><img border="0" src="images/scfg_modem_port_type.gif" width="572" height="331"> - -If you are NOT using a special shared IRQ or non-UART serial card, then you -should select "UART" and ignore the rest of this section. - -When selecting a non-UART COM port type, the "Channel" will automatically be -set to the COM port number minus one. This is the zero-based COM port that will -be used when communicating with the device driver (i.e. COM port 1 is channel -0, port 2 is channel 1, etc). You should NOT change the channel number unless -you have a specific reason for doing so and understand exactly what you are -doing. - -If you are using an Intelligent DigiBoard and are using the DigiBoard supplied -device driver, then select "DigiBoard Int 14h". - -If the card you are using has a FOSSIL compatible device driver, this should -be your preferred selection unless you wish to use baud rates greater than -38400, in which case a "PS/2 BIOS" compatible driver would be a better choice. -The COMM-DRV/Universal Serial Communications Driver supports both FOSSIL and -PS/2 BIOS interfaces. - -You should only select "PC BIOS" in a last case scenario (i.e. Your card's -device driver does not support any other Int 14h interface). The PC BIOS -interface does not support DTR, so if you use such a limited driver, you must -set "Drop DTR to Hang Up" to "No" under "Modem Toggle Options", set the -"Hang Up String" to "~~~\1\1\1~~~ATH" and change "S2=128" to "S2=1" in your -"Initialization String". - -Int 14h drivers can also be used to communicate with non-UART serial devices -such as Packet Assembler/Disassemblers (PADs), Network Redirectors, HAM Radio -Packet Servers, etc.</pre> -<h2><a name="DumbModemConnection">[4.3] - Dumb (NULL) Modem Connection</a></h2> -<pre>If you are connecting a Synchronet node to another computer or terminal through -a serial port WITHOUT the use of a modem, you must set SCFG->Nodes->Node # -->Modem Configuration->Toggle Options->Dumb Modem Connection to "Yes". This -disables all modem commands (Init, Special Init, Answer, Off-hook, etc.) and -causes Synchronet to only log a user on when the DCD serial line is raised. - -If your serial connection or terminal does not support the correct use of the -DCD line, then you must run SBBS with the 'D' command line switch to force -Synchronet to assume that DCD is always high. If this is the case, then there -is no way to "hang up" on the BBS.</pre> -<h2><a name="ModemConfiguration">[4.4] - Modem Configuration</a></h2> -<pre>Now that you've set up your serial card, the easiest way to finish setting up -the rest of the options for your modem is to run the SCFG program and go to the -Nodes->Node #->Modem Configuration->Auto-Configuration, and select your modem -model from the list of available choices. If your modem is not listed, you may -select Generic 2400 for unlisted 2400bps Hayes compatible modems, Generic 9600, -Generic 14400, or Generic 28800 for unlisted high speed modems. You may also -import .MDM configuration files (located in your control directory) if you -receive an updated or new version of a configuration file for your modem from -Digital Dynamics or a third party. - -Following is a list of remaining options and a brief description of each for -those of you that wish to manually alter the modem settings. - -UART (DTE) Rate is the data transfer rate between your computer and your modem, -for non-data-compressing, non-high-speed modems, you should set this to your -modem's highest DCE rate (e.g. a 2400bps modem should use a 2400bps DTE rate). -If you have a data-compressing or high-speed modem, this value should be set -to the highest DTE rate your modem supports (consult your modem manual). If -you plan on using a FOSSIL driver for any external programs or doors, the -DTE rate you set for your FOSSIL driver should be the same number you use for -this option. - -Hardware Flow Control should be set to Transmit and Receive (Both) if your -modem supports CTS/RTS hardware flow control (usually data-compressing or -high-speed modems). - -Answer delay is the number of seconds to pause after a connection is -established and before the terminal detection string is sent. It is suggested -that this delay be set to a minimum of 5 seconds to allow for accurate -terminal type detection. If the callers on your BBS are experiencing -inaccurate terminal type detection, you may want to increase this number. - -Answer after (# rings) is the number of rings the bbs should wait for before -answering the phone, the minimum is 1 ring. - -Reinitialization Timer is used to automatically reinitialize the modem -periodically to make sure it is functioning correctly. If you find that your -modem works most of the time, but occasionally will not answer the phone or -functions incorrectly, you may wish to use this feature. Setting this value to -0 will disable periodic modem reinitialization. - -Example (for Generic 28.8k Modem on COM 2):</pre> -<pre><img border="0" src="images/scfg_modem_config.gif" width="572" height="331"></pre> -<h2><a name="ResultCodes">[4.5] - Result Codes</a></h2> -<pre>Result Codes is a list of numeric result codes (connect codes) supported by -your modem. If you have set "Use Verbal Result Codes" to 'Yes' in your -the SCFG modem toggle options for this node, this list is not used. - -You would use this list to add result codes that your modem supports, but are -not currently in the list or to remove codes that are in the list but are not -supported by your modem. For each result code, the actual numeric code, the -DCE (connect) rate, estimated file transfer CPS, and an 8 character description -of the connection type are stored. A complete list of result codes supported by -your modem should be given in your modem manual. - -Here is an example of what the result code list would look like for a Generic -28.8k modem:</pre> -<pre><img border="0" src="images/scfg_modem_resultcodes.gif" width="572" height="331"></pre> -<pre>Selecting result code 15 from this menu would result in a sub-menu as follows:</pre> -<pre><img border="0" src="images/scfg_modem_resultcode_15.gif" width="572" height="331"> - -If "FAX" is used for the result code description, Synchronet will exit with -an error level of 100 when this result code is returned. This feature is used -for FAX/Modems that can auto-detect FAX and DATA calls and return a numeric -result code for FAX connections. If a different error level is preferred, -use "EXIT nnn" (where nnn is a numeric value) for the description. If a verbal -"FAX" or "+FCON" result code is returned, Synchronet automatically exits with -an error level of 100 (see FAX/Modem setup later in this chapter). - -If your modem returns any result codes PRIOR to the actual connection result -code (and this behavior cannot be disabled), then add these result codes to the -result code list and enter "IGNORE" for the result description, thus causing -Synchronet to ignore this result code and wait for another result code to -determine the actual connection type. This step is only necessary for modems -that insist on returning multiple result codes during a connection.</pre> -<h2><a name="ToggleOptions">[4.6] - Toggle Options</a></h2> -<pre>Selecting this option gives a menu of available modem toggle options:</pre> -<pre><img border="0" src="images/scfg_modem_toggles.gif" width="572" height="331"> - -<b>Caller Identification: -</b> This is used for toggling the ability to use Caller-ID. Consult the - section on caller identification for more information. - -<b>Dumb Modem Connection: -</b> This option should be set to 'Yes' if you are using a dumb (null) modem - cable to connect a computer to your BBS. - -<b>Drop DTR to Hang Up: -</b> This is normally set to 'Yes', but some modems do not support the - dropping of DTR to hang up the modem. If your modem is one of those, - you should toggle this option to 'No'. - -<b>Use Verbal Result Codes: -</b> This option should be set to 'Yes' for the easiest configuration of - your modem. When this option is set to 'Yes', SBBS will automatically - parse the CONNECT message received by the modem to determine the - connect (DCE) rate and estimated CPS of the call. If "ARQ", "V42", - "LAPM", "MNP", or "REL" are contained in the connect string, hardware - error correction is assumed to be in effect and the estimated CPS - rate is increased appropriately. Setting this option to 'Yes' has the - added advantage of allowing DCE rates above 64000. Result codes not - recognized as CONNECT messages (e.g. PROTOCOL, CARRIER, etc) are - ignored. Result codes with "FAX" or "+FCO" cause SBBS to exit with an - error level of 100 (for the execution of FAX receive software). - -<b>Allow Unknown Result Codes: -</b> If "Use Verbal Result Codes" is set to 'No', then numeric result codes - returned by the modem are then looked up in the configured result code - list. If the result code is not found and the "Allow Unknown Result - Codes" option is set to 'No', the call is immediately disconnected and - an error message is logged for the sysop's attention. If the result - code is not found and the "Allow Unknown Result Codes" option is set to - 'Yes', then the connection information (DCE rate, estimated CPS rate, - etc) is taken from the last configured result code and an error message - is still logged for the sysop's attention.</pre> -<h2><a name="ControlStrings">[4.7] - Control Strings</a></h2> -<pre>Modem Control Strings are the strings which are sent to your modem at various -times during BBS operation. Normally the default strings are sufficient for -proper operation, but occasionally you may wish to modify one or more of these -settings.</pre> -<pre><img border="0" src="images/scfg_modem_strings.gif" width="572" height="331"> - -Initialization String is the basic modem initialization for Synchronet. You -should not modify this unless you are unhappy with any of the settings and are -familiar enough with the AT command set to understand what each command does. -Placing a tilde '~' anywhere in this string will produce a 500 millisecond -(half second) pause. Synchronet requires that the modem NOT echo characters -back and return numeric result codes. So "E0" and "V0" must be included -in the init string. Since Synchronet manually detects incoming calls from -the modem, the modem's auto-detect feature must be disabled with "S0=0". If -you do not want to hear the connection progress sounds, add "M0" to the end -of your modem initialization string to disable the modem's speaker. - -Special Init String is where additional initialization commands are placed for -specific modem types, usually error-correcting, data-compressing, or high-speed -modems. - -Terminal Init String is the initialization string sent to the modem when you -enter Synchronet's terminal mode ('T' from the waiting for call screen). - -Dial String is the command sent to the modem for making outbound calls. -Currently only used by the Synchronet Callback Verifier. - -Off Hook String is the command sent to the modem to take the phone off-hook -(busy). - -Answer String is the command sent to the modem when a ring is detected by -Synchronet. - -Hang Up String is the command sent to the modem to hang up the phone and is -only used if Drop DTR To Hang Up modem toggle option is set to No.</pre> -<h2><a name="AutoConfiguration">[4.8] - Auto-Configuration</a></h2> -<pre>The auto-configuration contains a very long list of modem types. Using this -list is the EASIEST way to configure your modem to work with Synchronet. All -you need to do is select your modem from this list and most everything will be -configured for you. If you do not see your modem in this list, you can -normally select a 'Generic' model from the list. - -If someone later creates an .MDM configuration file specifically for your -modem, you can use this configuration file simply copying the .MDM file into -your control directory and then selecting the 'Import Configuration' option -from the menu and typing in the name of the .MDM file. - -If you create a new configuration you would like to make available to people, -you can export the configuration information into an .MDM file by selecting the -'Export Configuration' option from the menu.</pre> -<h2><a name="CallerIdentification">[4.9] - Caller Identification</a></h2> -<pre>If your modem supports one of the Caller-ID formats listed below and you have -Caller-ID service enabled on your phone line, you can have Synchronet log -Caller-ID information and disallow specific numbers. First, add the appropriate -commands to SCFG->Nodes->Node #->Modem Configuration->Special Init String to -enable Caller-ID on your modem (see your modem's manual for details). Then set -SCFG->Nodes->Node #->Modem Configuration->Toggle Options->Caller Identification -to "Yes". - -If you are using a Front-End (e.g. FrontDoor) on your BBS, the CID information -can be passed to Synchronet on the SBBS command line with the 'Z' command line -switch (e.g. sbbs c14400 z01-09_11:15_7145295313). The Caller-ID information -must be ONE string with no spaces. - -The user's phone number will be placed in the user's note field for your -records and logged for each call in the system log. If you wish to disallow -access for a specific number, create the file CID.CAN in your TEXT directory -and enter one phone number per line to disallow that number. If you want a -message to be displayed to the user who calls with a disallowed number, create -the message file BADCID.MSG in your TEXT directory. - -Supported formats: - - Single Line: - - MM-DD HH:MM Number - - Three Line: - - TIME: - CALLER NUMBER: - CALLER NAME: - - Four Line: - - DATE = - TIME = - NMBR = - NAME =</pre> -<h2><a name="FAX/ModemSetup">[4.10] - FAX/Modem Setup for -Receiving FAXes</a></h2> -<pre>In order for Synchronet to be able to receive incoming FAXes, there are a few -requirements that must be met, these are: - - 1) Your modem MUST be able to return either a verbal or numeric FAX - result code (verbal results must contain "FAX" or "+FCO"). - - 2) Your modem MUST be able to auto-detect FAX and DATA calls. - - 3) You MUST have a command line receive FAX program that works with - your FAX modem. - -If all of the above requirements can be met, then you will need to modify the -SBBS.BAT/SBBS.CMD file in the directory of the node(s) to be used for receiving -incoming FAXes as follows (using a ZyXEL FAX/Modem setup on COM 2 as an -example): - ------------------------------------[ Begin ]----------------------------------- -@echo off -:top -..\exec\sbbs %1 %2 %3 %4 %5 -if not errorlevel 100 goto end -c: -cd \zfax -rcvfax 2 /p:1 -echo Incoming FAX! >> c:\sbbs\data\msgs\0001.msg -c: -cd \sbbs\node1 -goto top -:end -------------------------------------[ End ]------------------------------------ - -Change the 'c:' on the 5th line to the drive letter where your receive FAX -program resides. - -Change the 'cd \zfax' on the 6th line to the name of the directory where your -receive FAX program resides. - -Change the 'rcvfax 2 /p:1' on the 7th line to match the name and command line -options of the receive FAX program for your modem. - -Change the 'c:\sbbs\data' portion of the 8th line to match the location of your -Synchronet data directory. - -Change the 'c:' on the 9th line to the drive letter where you have Synchronet -installed. - -Change the 'cd \sbbs\node1' on the 10th line to match the directory of the -node(s) that will be set up for receiving FAXes. - -Check your modem manual to find out if your modem responds with a verbal -"FAX" (e.g. ZyXEL) or "+FCO" (e.g. Practical Peripherals) result code or a -numeric FAX result code (e.g. Hayes). If a numeric result code is returned, -then run SCFG from your node directory and go to Nodes->Node #->Modem -Configuration->Result Codes and add the numeric result code your modem returns -for a FAX connect and enter "FAX" for the result description. If your modem -returns a numeric "DATA" result code when in auto-detection mode (e.g. Hayes) -then add this result code to your result code list in SCFG and enter "IGNORE" -for the result description. - -Example numeric FAX result code (using Hayes Optima 288):</pre> -<pre><img border="0" src="images/scfg_modem_fax_code1.gif" width="572" height="331"> - -Example numeric DATA result code (using Hayes Optima 288):</pre> -<pre><img border="0" src="images/scfg_modem_fax_code2.gif" width="572" height="331"> - -If there are any commands needed to enable FAX auto-detection, add these -commands to the end of your Special Init string in SCFG->Nodes->Node #->Modem -Configuration. If there is an auto-configuration entry listed for your modem -with FAX enabled, this step is not necessary. - -Now you are ready to receive FAXes! When your modem returns a FAX result code -to Synchronet, the receive FAX program specified in this batch file will be -executed. FAXes will be placed into the directory that your FAX program uses -for received FAXes. - -FAXes CANNOT be sent to specific users on the BBS, this option is only for the -convenience of being able to receive FAXes without the need of a dedicated FAX -machine and phone line. However, the ability to allow users to FAX on demand -or to upload files to be sent out as FAXes can be accomplished by using one of -the add-ons (Domain FAX) from Domain Entertainment.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/multnode_config.html b/docs/multnode_config.html deleted file mode 100644 index 66f4773211..0000000000 --- a/docs/multnode_config.html +++ /dev/null @@ -1,467 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Multinode Configuration</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2><a name="MultinodeConfiguration">[14.0] - Multinode Configuration </a><i><font color="#FF0000"><b>(v2 -Only)</b> -</font></i> -</h2> -<pre>Synchronet Version 2.x runs under DOS v3.0 or greater and SHARE (or NetWare). -A DOS process is required for each node on a Synchronet system (unless -running Synchronet for OS/2). You can run multiple nodes on one cpu with DOS -multitaskers such as DESQview, Windows, or OS/2 or you can run one node per CPU -and let the CPU's share the same data on a common hard disk via Local Area -Network (LAN).</pre> -<h2><a name="LANMethod">[14.1] - LAN Method</a> -</h2> -<pre>Using one CPU per node is by far the fastest way to run multiple Synchronet -nodes. Since SBBS4DOS runs in 8086 real mode, any IBM PC can run Synchronet -with sufficient speed. The minimum equipment necessary for each node would be a -power supply, motherboard, at least 450k free memory, a network interface card -(NIC), floppy drive and controller (or just a boot PROM for the NIC), and a -modem. Some BIOS's require a video controller and/or a keyboard as well, but -they are not necessary for the execution of Synchronet. - -To link these computers together, you will need some form of networking -software. DOS based networks (Lantastic, NetWare Lite, CBIS Network O/S, -MainLAN etc.) are the cheapest and don't require a dedicated CPU as a file -server, but they lack the speed of a dedicated file server and network -operating system. The most popular Network Operating System (NOS) is Novell -NetWare. The disk performance on a dedicated NetWare file server is often -preferable over a local hard disk (especially on XT's) due to NetWare's high -speed file system and dedicated memory for intelligent disk caching. Synchronet -will run on any NOS that allows multiple CPU's running DOS to access data on a -common disk.</pre> -<h2><a name="MultitaskerMethod">[14.2] - Multitasker Method</a> -</h2> -<pre>Any program that allows the simultaneous execution of multiple DOS programs -should be able to run multiple SBBS4DOS nodes per CPU. To reliably and -efficiently run multiple DOS sessions on one CPU, you will probably need an -80386 CPU (the faster, the better), and at least 2 megabytes of memory -(the more, the better). Different multitaskers will have different hardware -requirements, but the common denominator seems to be an 80386 and extended -or expanded memory. - -<i>IMPORTANT NOTE:</i> When multitasking using Windows or OS/2, it is suggested that - you have a minimum 80486/33mhz CPU with a minimum of 8 mega- - bytes of memory. This is due to the requirements of the - operating environment, not the requirements of Synchronet. - -You will need a separate IRQ line and UART I/O address for each COM port in -the computer. It is recommended that you use high speed, buffered 16550A UARTs -rather than the non-buffered 16450 UARTs which some I/O cards use. If you wish -Synchronet to always use BIOS calls for screen output, you need to include the -B parameter on the SBBS command line. Normally, Synchronet uses direct video -for block text which can conflict with some multitaskers that manage a split -screen for multiple DOS sessions. - -Generally, the faster the machine, the more nodes you can run. But how many -for what kind of performance is not an easy question to answer. It depends -heavily on the multitasking software, modem speed, and hardware I/O. Under any -configuration, expect some amount of performance degradation when running -multiple nodes per CPU.</pre> -<h2><a name="Safe?">[14.3] - Is it Safe?</a> -</h2> -<pre>Many Sysops will worry how reliable the system is with multiple simultaneous -users. Rest assured that Synchronet was designed from the ground up for -multiple simultaneous users. Data integrity and system fault tolerance is never -sacrificed when adding nodes to a Synchronet system. - -Users can post on the same sub-board, e-mail the same user, download the same -file, run the same external program, perform virtually any system function -simultaneously. Note: External programs must support multiple simultaneous -users if the program has been configured for multi-user access from Synchronet. - -Considerations and precautions have been taken where user data is concerned -to allow changes to the real-time database to take place immediately - even if -the user is online on a node other than the one that performed the data update. -Any security, configuration, or statistics changes made remotely will take -effect immediately. - -The transfer section disallows simultaneous uploading of the same filename to -the same directory and prevents a file that is currently open (being downloaded -or just added to a user's batch download queue) from being moved, removed, or -edited while allowing simultaneous downloads. - - -As a general rule, no data files or records are allowed exact simultaneous -access if one of the nodes will modify the data. Simultaneous read only access -is allowed. Collisions (simultaneous write access requested of a file by two -or more nodes) are logged along with the retry count. There is a retry maximum -count (or time-out) that will deny access to the requesting node and log a -critical error for that node. This situation should not occur, but provisions -are made for it in case of hardware failure of a node with a file or record -open with write access.</pre> -<h2><a name="MultinodeDESQview">[14.4] - Multinode: DESQview</a> -</h2> -<pre><a name="How many nodes?"><b><u>How many nodes?</u></b></a></pre> -<pre>The answer to this question depends on the speed of your machine. Here is -a table to estimate the maximum number of nodes you should run on any given -machine under DESQview: - -CPU Nodes -386-16 1 -386-25 2 -386-33 3 -386-40 4 -486-25 5 -486-33 8 -486-50 10 - - <b>Note:</b> You can run more than the suggested number of nodes, but - performance will decrease with each additional node.</pre> -<pre><a name="How much memory?"><b>How much memory?</b></a></pre> -<pre>You will need roughly 500k of available expanded memory for each node. When -running multiple nodes, a disk cache is required. Around 1 to 2 MB should be -used in most situations. Here is another table of estimated total system memory -required in megabytes (assuming a 1MB disk cache is used): - -Nodes MB of RAM -2 3 -3 4 -4 4 -5 5 -6 5 -7 6 -8 6 -9 7 -10 7</pre> -<pre> -To save memory for each node, you can reduce the "Maximum program memory size" -to something like 450k or so. If you get memory allocation errors when -running SBBS, you'll need to increase this number. You can raise it beyond 640k -and actually get more than 640k free in some situations. This number is the -amount that DESQview will give this node if it can, or if not possible, as much -as it can. The "Memory Size" parameter is the minimum amount the program will -require. - -If you have VGA, you may want to change the Video mode to 80x50 or 80x60 with -the "Rearrange" menu, and change the "Window Positions" under DVSETUP -(advanced) and/or the "Window Position" information for the each SBBS node -under "Change a Program Advanced Options". This way you can display multiple -80x25 windows simultaneously. - -Don't forget to have a batch file execute DVANSI.COM before running Synchronet -if you have external programs that access the COM port themselves and use DOS -for output. Example: Trade Wars uses the BIOS for output so DVANSI is not -required. Global War uses DOS for output and uses the COM port directly, so -DVANSI is required. - -You must have "Close on exit" to [N] if you are going to execute SBBS from -a batch file that executes other programs before SBBS. Here is an example -batch file which will run dvansi, then Synchronet, and closes the window after -exiting Synchronet. This example file is called SBBSDV.BAT: - ----------------------------------[ Begin ]------------------------------------- -@echo off -c:\dv\dvansi -c:\sbbs\exec\sbbs %1 %2 %3 %4 %5 -if errorlevel 1 pause -exit ----------------------------------[ End ]------------------------------------- - -This batch file (SBBSDV.BAT is just an example name), can be used to execute -any of the Synchronet nodes, because the "Directory" parameter determines which -node is going to run. You would have to change the "Program" parameter to -"C:\BAT\SBBSDV.BAT" if you created SBBSDV.BAT in the C:\BAT directory. - -<a name="Auto Start-up Scripts DV">Start-up Scripts</a> -~~~~~~~~~~~~~~~~ -If you want your nodes to be automatically loaded up when running DESQview, -see "Learning Scripts" and "Start-up Scripts" in your DESQview manual. - -Here is an example script (in text format) that loads two Synchronet nodes -(assuming the Open Menu keys are S1 and S2): - -DESQVIEW.TXT: - ----------------------------------[ Begin ]------------------------------------- -{Learn {Alt-\} "!startup"} -{DESQ}os1 -{DESQ}os2 -{Finish} ----------------------------------[ End ]------------------------------------- - -Here is an example script (in text format) that uses the Big DOS program to -load two Synchronet nodes: - -DESQVIEW.TXT: - ----------------------------------[ Begin ]------------------------------------- -{Learn {Alt-\} "!startup"} -{DESQ}obd -dvansi{Enter} -cd \sbbs\node1{Enter} -sbbs{Enter} -{DESQ}obd -dvansi{Enter} -cd \sbbs\node2{Enter} -sbbs{Enter} -{Finish} ----------------------------------[ End ]------------------------------------- - -To use this script, you MUST modify the Big DOS program parameters to match -the program setup examples given at the top of this chapter. - -To use either script, you must first convert it to DESQVIEW.DVS by running the -DESQview CONVSCR program. - -IMPORTANT: When running under DESQView you will be required to load DOS's SHARE - program. Be sure that you do NOT load SHARE into high memory (or - allow any memory managers to do so)!</pre> -<h2><a name="MultinodeOS/2">[14.5] - Multinode: OS/2</a> -</h2> -<pre><a name="0s2 System Requirements">System Requirements</a> -------------------- -The OS/2 operating environment requires a faster CPU and more system memory -(compared to DESQview) to run efficiently. Because of this, there are greater -system requirements for running SBBS4DOS using OS/2. First, the number of -nodes which can be run on a given CPU is approximately one half of the number -which can be run on an equivalent CPU using DESQview. Next, it is recommended -that an 80486 CPU of 33mhz (or greater), with 8 megabytes of memory (or more) -be used. - -The default OS/2 communications driver is not sufficient for high speed modem -communications, it is recommended that you replace the default drivers with -a third party driver (such as SIO by Ray Gwinn). It is also recommended that -you have buffered 16550 UARTs on your I/O cards rather than the non-buffered -16450 UARTs. - -You cannot use a standard DOS FOSSIL driver with OS/2. If you require the use -of a FOSSIL driver, you must use a FOSSIL driver which has been written for use -with OS/2 (such as VX00). - -See the contacts reference appendix for contacting Ray Gwinn, author of SIO -and VX00 serial communications drivers for OS/2. - -When running Synchronet under OS/2, be sure that you do NOT use any additional -timeslice programs such as TAME or OS2SPEED. - -You should have the Win/OS2 time slice API option set to 'Yes' for all nodes -running in an OS/2 DOS session (in each node's toggle options). - -<a name="OS2 Settings"></a>Following are example settings for OS/2, you will find these settings by -clicking on the DOS Settings box for the DOS window. Settings which are not -listed should be left as default. You must run each node in its own DOS -session, consult your OS/2 user guide for more information on running multiple -DOS sessions. - -DOS Settings -~~~~~~~~~~~~ -COM_DIRECT_ACCESS ON -COM_HOLD ON -COM_SELECT ALL -DOS_BREAK OFF -DOS_BACKGROUND_EXECUTION ON -IDLE_SECONDS 0 -IDLE_SENSITIVITY 100 -HW_TIMER ON -INT_DURING_IO ON</pre> -<h2><a name="MultinodeWindows3.x">[14.6] - Multinode: Windows 3.x</a> -</h2> -<pre><a name="Win31 System Requirements">System Requirements</a> -------------------- -The Windows operating environment requires a faster CPU and more system memory -(compared to DESQview) to run efficiently. Because of this, there are greater -system requirements for running Synchronet using Windows. First, the number of -nodes which can be run on a given CPU is approximately one half of the number -which can be run on an equivalent CPU using DESQview. Next, it is recommended -that an 80486 CPU of 33mhz (or greater), with 8 megabytes of memory (or more) -be used. - -<a name="Win31 Settings"></a>Following are example settings for Windows. Settings which are not listed -should be left as default. A setting with (check) next to it means the box -for that setting should be marked, and (no check) means the setting should -not be marked. - -386 Enhanced Mode Settings -~~~~~~~~~~~~~~~~~~~~~~~~~~ -All com ports should be set to Never Warn. - -Set the Minimum Timeslice to 15. - -Exclusive in Foreground (no check). - -PIF Settings -~~~~~~~~~~~~ -Program Filename : SBBS.BAT -Startup Directory : C:\SBBS\NODE1 (modify as required) -Video Memory : (Text should be checked) - -Memory Requirements - KB Required : 450 - KB Desired : 640 - -*EMS Memory - KB Required : 360 - KB Limit : 1024 - -*XMS Memory - KB Required : 360 - KB Limit : 1024 - -*NOTE: EMS and/or XMS memory will need to have a value if you wish to allow - Synchronet to swap using either of these. - -Display Usage - Windowed : (check) - -Execution - Background : (check) - - -PIF Settings - Advanced Options -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Multitasking Options - Background Priority : 70 - Foreground Priority : 70 - Detect Idle Time : (no check) - -Memory Options - EMS Memory Locked : (check) - XMS Memory Locked : (no check) - Uses High Memory Area : (no check) - Lock Application Memory : (check) - -Display Options - Emulate Text Mode : (check) - (all remaining options) : (no check) - -Other Options - Allow Close When Active : (check) - - -IMPORTANT: These are settings to get you started! Different machines and -configurations require different settings, and it may take some trial and -error with different memory and timeslice settings to get everything working -as you desire. Also note that the default windows communications driver -probably will NOT be sufficient for high speed modems, and you will probably -want to purchase a third party communications driver that can handle higher -baud rates under windows. When running windows, be sure to load SHARE before -you run windows!</pre> -<h2><a name="MultinodeWindows9x">[14.7] - Multinode: Windows 9x</a> -</h2> -<pre><a name="Win9x System Requirements">System Requirements</a> -------------------- -The Windows 95 operating environment requires a faster CPU and more system -memory (compared to DESQview) to run efficiently. Because of this, there are -greater system requirements for running Synchronet using Windows 95. You -should follow the recommendations included with Windows 95 for your system and -memory requirements, we recommend a minimum 80486 CPU of 33mhz with at least 8 -megabytes of memory. - -<a name="Win9x Settings"></a>Basically Windows 95 straight out of the box will run Synchronet without any -problems. Following is some information to help you get Synchronet set up -under Windows 95 and to help get it running a little more efficiently. - -First we want to set up an ICON for each of the Synchronet nodes you plan to -run under Windows 95. The following steps will guide you through adding one: - -1) From Windows 95 Explorer go to the directory of the node you are setting up, - (e.g. for node 1 this would normally be C:\SBBS\NODE1). - -2) On the right side of Explorer you'll see SBBS.BAT, click on it with your - RIGHT mouse button. - -3) Go to NEW and click on SHORTCUT. - -4) Click on BROWSE, find the SBBS.BAT file in the sub-directory for this node - and DOUBLE CLICK on it. - -5) Click on NEXT. - -6) Click on CHOOSE ICON and select the ICON you wish to use for this node. - -7) Click FINISH. - -That's all there is to creating an ICON (shortcut) for Synchronet. Do this for -each of your Synchronet nodes. Now there are a couple of settings you'll want -to change for better efficiency: - -1) For each node set the IDLE SENSITIVITY to it's lowest (all the way to the - left-hand side). - -2) In SCFG under each node, set the toggle option 'Windows/OS2 Time Slice API' - to 'YES'.</pre> -<h2><a name="MultinodeLAN">[14.8] - Multinode: LAN</a> -</h2> -<pre>Most of the information necessary for setting up your nodes on a LAN will be -provided by the documentation for your Network Operating System. All that -Synchronet requires is that each node have access to the SAME drive for -data storage. ALL Synchronet directories must be accessible by ALL nodes as -the SAME drive letter (if multiple drives are in use). If one drive is used -for all BBS data, then simply remove all drive letters from the configured -paths in SCFG (and each workstation can use different drive letters if -necessary). - -You may mix the LAN multinode method with the multitasker method to get more -than one node on each workstation. - -NOTE: When using Netware 3.x or 4.x you should create a SHELL.CFG or NET.CFG in - the directory where your workstation loads your network files. In the - SHELL.CFG or NET.CFG file you should have the line: SHARE=OFF. You will - also need to load the SHARE program that comes with DOS. Most other - networks also require that you use the SHARE program that is included - with DOS. - -<b><i>*** IMPORTANT ***</i></b> - -Do not give ANY of the files associated with Synchronet a sharable file -attribute. Synchronet uses file and record locking to handle multiple -simultaneous file access requests and maintain data integrity. "Flagging" -a file "sharable" overrides these locking methods and will cause Synchronet -to corrupt your data in a multinode system.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/networking.html b/docs/networking.html deleted file mode 100644 index b2deafc4e3..0000000000 --- a/docs/networking.html +++ /dev/null @@ -1,753 +0,0 @@ - -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Networking</title> -</head> - -<body> -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2><a name="Networking">[9.0] - Networking</a></h2> -<pre>Selecting the Networks option from the SCFG will produce a list of available -network technologies. - -<img border="0" src="images/scfg_networks.gif" width="572" height="331"> - -Select the network technology of your interest and refer to the following -section that pertains to your selected network technology.</pre> -<h3><a name="QWKPacketNetworking">[9.1] - QWK Packet Networking</a></h3> -<pre>Let's start with some basic definitions. A QWK netted BBS is either a node, -a hub, or both. A node is a BBS that calls another QWK net hub to transfer -packets (receiving QWK and sending REP). A hub is a system that receives calls -from other nodes and transfers packets (sending QWK and receiving REP). - -There are two options from the QWK Packet Networks menu, Network Hubs and -Default Tagline. Selecting the Default Tagline will allow you to create or -edit the tagline that will be used for messages that are sent out on the -network from your QWK netted sub-boards. Individual sub-boards can have a -different tagline to override this one, or use no tagline at all. Ctrl-A codes -can be used in taglines so that other Synchronet systems will see the tagline -in your preferred color scheme. The beginning of the tagline is not -configurable. It consists of a tear line and the Synchronet product name: ---- - � Synchronet � - -The configured tagline text will be attached to the end of the above tagline.</pre> -<h3><a name="NetworkHubs">[9.1.1] - Network Hubs</a></h3> -<pre>Selecting this option produces a list of configured hubs that your system -calls to upload REP packets to and download QWK packets from. If a system -calls your system for messages, it is a node and your system is the hub and you -should not have that system listed as a hub. If you do not call any systems -for networked messages, then your system is a hub and the only configuration -you need to do is set your taglines and the network options for each of your -netted sub-boards. Use INS to add hubs and DEL to delete hubs from this hub -list.</pre> -<pre><img border="0" src="images/scfg_networks_qwkhubs.gif" width="572" height="331"> - -Selecting a hub from the list of available hubs will produce a sub-menu: - -<img border="0" src="images/scfg_networks_qwkhubs_vert.gif" width="572" height="331"> - -<b>Hub System ID: -</b> This is the QWK system ID of the hub BBS. - -<b>Pack Command Line: -</b> This is the command line to execute to pack messages. - -<b>Unpack Command Line: -</b> This is the command line to execute to unpack messages. - -<b>Call-out Command Line: -</b> This is the command line to execute to perform the call-out. - -<b>Call-out Node: -</b> This is the number of the node which should perform the call-out. - -<b>Call-out Days: -</b> These are the days to perform the call-out. - -<b>Call-out Time/Frequency: -</b> This is either the specific time to call-out, or the number of times - per day to call-out.</pre> -<h3><a name="NetworkedSub-boards">[9.1.2] - Networked Sub-boards</a></h3> -<pre>Selecting this option will give a sub-menu containing a list of networked -sub-boards that will look something like this:</pre> -<pre><img border="0" src="images/scfg_networks_qwkhubs_vert_subs.gif" width="572" height="331"> - -For each sub-board the following options are available: - -<img border="0" src="images/scfg_networks_qwkhubs_vert_subs_opt.gif" width="572" height="331"> - -<b>Sub-board: -</b> Which sub-board is to be networked (Group and Sub-board name). - -<b>Conference Number: -</b> This is the conference number of the sub-board on the HUB system. - If the hub is a Synchronet version 2 BBS and the sub-board is the - second sub-board in the first group, the conference number is 1002; if - the sub-board is the first sub-board in the third group, the conference - number is 3001, etc. The conference numbering scheme for BBS programs - other than Synchronet is usually just 1, 2, 3, etc. - -<b>Ctrl-A Codes: -</b> This option allows you to determine how to handle Ctrl-A codes in - messages. If the hub is a Synchronet BBS, you will want to set this - to "Leave in". If the hub is not a Synchronet BBS, you will almost - always want to set this to "Strip out". If the hub is not a Synchronet - BBS, but allows ANSI escape sequences in messages, set this option - to "Expand to ANSI".</pre> -<h3><a name="ConfiguringQWKNode">[9.1.3] - Configuring Your BBS as a -QWK Node</a></h3> -<pre>In the SCFG program, you'll need to specify your system's tagline (usually -the system name and phone number), the hubs to call, when to call, what node -will do the calling, and which sub-boards to carry for each hub (a sub-board -can send and receive messages from more than one hub!). - -The hub's System ID is important and must match the System ID of the hub BBS. -For each hub, you can specify a list of sub-boards to network. For each -sub-board, you must also set the conference number for the sub-board on the -hub BBS. In Synchronet, conference numbers are based on the Group/Sub-board -relationship. Group 1 / Sub 1 is conference number 1001, Group 2 / Sub 3 is -conference 2003, etc. (Note: this is NOT the conference number for the sub-board -on your BBS. It is the conference number on the hub BBS.) Also, for each -sub-board you must set the method of Ctrl-A code handling. If the hub system is -a Synchronet BBS, you'll want to leave Ctrl-A codes in. If it is not, you'll -probably want to strip them. - -You'll need to decide which node will do the calling-out and configure it so. -You'll also need to decide if you want your BBS to call-out multiple times -per day at any given time based on a total number of calls per day (usually, -if all your hubs are local) or if you wish the BBS to call-out at a specific -time every day (usually if one or more hubs are long distance). - -You also need to set the command line to execute to perform the call-out. -If your hub is a Synchronet BBS, use the included QNET module (*QNET), -otherwise you probably use a batch file to execute a scripted terminal program. -Example scripts for Telix, Robocomm, and Qmodem are included in the EXEC -directory (SBBSQNET.*).</pre> -<h3><a name="ConfiguringQWKHub">[9.1.4] - Configuring Your BBS -as a QWK Network Hub</a></h3> -<pre>Being a QWK network hub, just means that other QWK network compatible systems -are going to logon to your system and upload and download messages. All you -have to do is create a user account for each QWK network node that is going -to call your system. The user name/alias should be the QWK system ID of the -node BBS. The account needs to have the 'Q' restriction. - -The 'Q' restriction is used only for QWK network node accounts. An account -with this restriction will receive the QWK: prompt immediately upon logon -and can't access any other facility of the BBS. This restriction also allows -that account to send messages that are from other users as well as receive -private posts that are to other users. - -In addition to the 'Q' restriction, the 'L' (logons per day) and 'T' (time -per day) exemptions may be helpful, depending on how many times the node will -call your system a day and the time per call/day and logons per day allowed by -the level you've given the account. - -Be sure to give all node accounts sufficient access to read and write messages -on the sub-boards networked between the node and your BBS.</pre> -<h2><a name="TransferringFilesThroughQWK">[9.2] - Transferring Files -Through QWK Network</a></h2> -<pre>Synchronet allows the transferring of files between a QWK network node and hub -with great simplicity. If you wish to send a file to a QWK network hub (your -system calls directly) or QWK network node (their system calls yours directly), -create a DOS subdirectory of DATA\QNET\QWKID.OUT, where QWKID is the QWK ID of -the system to which you are sending the file. Copy any files you wish to send -to this system into this directory. The next time the systems network with -each other, the files will be sent. - -If your system is a QWK network node, you may request a file from your hub -by posting a private message to SBBS on any of the networked sub-boards you -get from your hub. The title of the message must contain "FREQ FILENAME.EXT" -where FILENAME.EXT is the filename and extension of the file to download. - -When files are received through a QWK network, the sysop is notified of the -received file upon next logon. The file will be automatically placed in the -subdirectory DATA\QNET\QWKID.IN, where QWKID is the QWK ID of the system -that sent the file. - -The transferring of files can be made automated for other programs to share -data over the network. One popular use for this is Online Games that support -inter-BBS play. One such game is Barren Realms Elite (BRE), see the external -programs section for more information on this.</pre> -<h2><a name="PostLinkNetworking">[9.3] - PostLink Networking</a></h2> -<pre>PostLink is a message networking program written by Kip Compton and available -for purchase from Bonnie Anthony (see Contacts Appendix). It is a derivation -from PCRelay software. RelayNet (AKA RIME), headed by Bonnie Anthony, ILink -and a few other networks use this technology. Selecting this option from the -networks menu will bring up the following sub-menu:</pre> -<pre><img border="0" src="images/scfg_networks_post.gif" width="572" height="331"> - -<b>Site Name: -</b> This is the site name to be used for your BBS. - -<b>Site Number: -</b> This is the site number which is assigned to you by the network - coordinator. - -Selecting Network Hubs from this menu will display a list of available hubs. -Hubs can be added and/or removed from this menu.</pre> -<pre><img border="0" src="images/scfg_networks_post_hubs.gif" width="572" height="331"> - -Selecting one of the available network hubs from this list will allow you to -configure the call-out information for that hub.</pre> -<pre><img border="0" src="images/scfg_networks_post_hubs_sccm.gif" width="572" height="331"> - -<b>Hub Site Name: -</b> This is the name of your network hub. - -<b>Call-out Command Line: -</b> This is the command line which will be executed to perform the call-out - for this hub. - -<b>Call-out Node: -</b> This is the number of the node which will perform the call-out for this - hub. - -<b>Call-out Days: -</b> This allows you to select the days on which call-outs to this hub will - occur. - -<b>Call-out Time: -</b> This allows you to select the time when call-outs to this hub will - occur. - -Synchronet supports PostLink by letting the sysop configure the call-out -schedule and which node will perform the call-out. Multiple PostLink networks -are supported simultaneously by specifying multiple hubs. The Site ID entered -in SCFG is only used for documentary purposes. Synchronet includes a UTI -(Universal Text Interface) driver for PostLink. It is a set of 6 programs -(UTI*.EXE) included in your EXEC directory. See the Utility Reference for -more information on the Synchronet UTI Driver. - -Be sure to set the "PostLink Networked" Network Option to 'Yes' for each of -your PostLink networked sub-boards.</pre> -<h2><a name="FidoNetNetworking">[9.4] - FidoNet Networking</a> -</h2> -<pre>FidoNet is both a network technology (referred to as FTN) and an actual message -network. The technology was developed specifically for FidoNet, but is used -by many other networks today as well. These non-FidoNet networks are referred -to as FTNs (FidoNet Technology Networks) because they share the same -technology, but don't necessarily have anything more in common with FidoNet. - -Setting up a FidoNet is likely the most complex task a sysop could attempt. -There are many steps associated with joining a FidoNet and most of the steps -involve new terminology to even the most experienced sysop. - -The first step is to find a FidoNet Front-end mailer program. This program -will need to be run to make and accept FidoNet mail calls. It is usually run -24 hours a day, but is usually only required during a certain period (called -Mail Hour and defined by the individual networks). The most popular of these -programs are FrontDoor, D'bridge, InterMail, and Binkley. Both FrontDoor and -Binkley will require the use of a FOSSIL (serial communications) driver as -well. The most popular FOSSIL drivers are BNU and X00 (many DOORs require -FOSSIL drivers as well). - -When running Synchronet from the Front-end, you will need to pass the current -connect rate, tell Synchronet to quit after the call, and possibly pass the -minutes till the next event. - -Example: SBBS Q C14400 E60 - -The above command line tells Synchronet that someone is currently connected -(at 14400bps), to quit back to DOS after the caller logs off, and that the -next scheduled event is in 60 minutes. See Appendix B for all the available -switches for running Synchronet. - -SBBSecho is an included Synchronet utility (registered separately) to -import/export NetMail and EchoMail bundles/packets. - -NetMail will be exported to and imported from the directory specified in the -Networks configuration in SCFG. EchoMail will be imported to and exported from -the EchoMail path specified for that sub-board, or off the base EchoMail -directory specified in SCFG Network options in a subdirectory named after the -internal code of the sub-board.</pre> -<h3><a name="FidoNetUsingSBBSECHOandInterMail">[9.4.1] - Step-by-Step -instructions for setting up FidoNet using SBBSecho and InterMail</a> <b><i><font color="#FF0000"> -(v2 Only)</font></i></b> -</h3> -<pre>One of the most difficult tasks that the novice sysop will encounter is the -setting up of FidoNet. These instructions will take you step by step through -the process of setting up FidoNet on your BBS. Be warned that these steps are -very basic, just enough to get FidoNet up and running on your system, but it -may still be necessary for you to refer to the documentation which accompanies -the programs referred to in these steps. For any advanced operations you will -definitely need to refer to the documentation of programs referred to in these -steps. If you know of anyone who is already on FidoNet that is willing to help -you out, by all means ask them for their help! - -NOTE that while it doesn't cost anything to have a node number (for sending -and receiving netmail) or to receive local conferences, there is usually a -nominal fee (called "cost recovery") to receive conferences from the FidoNet -backbone or files from the FidoNet filebone. - - 1) First of all you will need to obtain a copy of FidoNet's Policy 4 document - (the filename is usually POLICY4.ZIP or POLICY4.TXT), a recent nodelist - (usually named NODELIST.???), AND a front-end mailer program. All three of - these can normally be downloaded from any local BBS which carries FidoNet - (if not, an e-mail to the sysop of a FidoNet BBS can usually point you in - the right direction). There are several front-end mailers available such - as FrontDoor, InterMail, D'Bridge, SEAdog, Dutchie, BinkleyTerm, and Portal - of Power to name a few (the latter two are referred to as "FLO-Style" - mailers and the others are referred to as "Attach-Style" mailers). Most - front-end mailers offer a limited evaluation version which you can try out - before you decide to purchase the program. - - 2) Read the Policy 4 document, it will give you information about FidoNet as - well as some specifics on how to obtain a node number for your system. - - 3) If you do not plan to run InterMail (or FrontDoor which is very similar) - you must set up the front-end mailer you plan to use by following the - directions which accompany the program and then skip to step number 9. - The documentation will also tell you how to "compile" the nodelist file - you've downloaded so that your front-end mailer can use it. Use the - temporary address specified in Policy 4 when specifying your node address - in the front-end mailer. -</pre> -<pre><b>Setting up InterMail v2.xx or FrontDoor v2.xx</b> - - 4) Install InterMail per IM.DOC (included with InterMail). - - a) If using FrontDoor, follow the FD.DOC file and substitute the letters FD - where ever you see an IM in this section. - - 5) Copy the MAILER.BAT included with SBBSecho and the EXEBBS.BAT from the - Synchronet DOCS directory into the InterMail directory (C:\IM). - - 6) Change into the InterMail directory, run IMSETUP, and perform the - following: - - a) Under Global->Address->Main, enter your FidoNet address (or the - temporary address specified in Policy 4 until such time as you have - received your own address). - - b) Under Global->Filenames, verify that the paths are set similar to the - following: - - ������������������������������������������������������� Filenames and paths � - � � - � System C:\IM\SYSTEM\ (or C:\FD\ for FrontDoor) � - � Netmail C:\IM\MAIL\ � - � Files C:\IM\INBOUND\ � - � Sec Files C:\IM\INBOUND\ � - �*Packets C:\IM\PACKETS\ � - �*Log file C:\IM\IM.LOG � - � Banner � - � Nodelist C:\IM\NODELIST\ � - � In-event � - � Hudsonfmt � - � Wildcat! � - � Swapping C:\IM\ � - � Semaphore C:\IM\ � - � � - � * = Must be unique for each Mail Server � - ���������������������������������������������������������������������������ͼ - - c) Under Modem->Advanced Setup->Connect Strings set ALL "BBSexit" levels - to 100. (For FrontDoor under Mailer->Errorlevels set all baud rates to - 100, Received Mail to 50, and Create .BAT file to Yes). - - d) Under Manager->Events, make sure all your events are set to exit when - mail is received (under Event Behavior). This allows for the immediate - importation of new messages into the BBS. - - e) Under Manager->Events, add the following event: - - ���������������������������������������������������������������������� Edit � - � Tag X � - � Days -------A � - � Modifier Ignore eventbase (*) � - � Start time 04:30 � - � Length 00:01 � - � Errorlevel 75 � - � Not used � - � Behavior � - � Use alias 1:103/705 � - � Retry delay 0 � - � Comment Synchronet exclusive event � - ���������������������������������������������������������������������������ĺ - � Event tag A..YZ - eXternal event, errorlevel is required � - ���������������������������������������������������������������������������ͼ - - f) Under Mailer->Misc, set "Trigger exit upon receipt of netmail" and - "Upon receipt of ANY file" to Yes. This will allow for the immediate - importation of NetMail and any File Distribution Echoes you may carry. - - g) Under Modem->Hardware, set "Lower DTR when busy" to "No". - - h) Under Modem->Command strings, set the "Down" string to "ATM0H1|". - - i) Exit IMSETUP. - - 7) Unarc the nodelist file (NODELIST.???) that you downloaded previously - into your nodelist directory. - - 8) Now run IMNC to compile the nodelist. - - -<b>Setting up FidoNet in SCFG</b> - - 9) Run SCFG from one of your node directories, or hit 'C' from the waiting for - caller screen. Then select Networks->FidoNet EchoMail and NetMail. - You'll then be brought to a menu that should be set up similar to this:</pre> -<blockquote> -<pre><img border="0" src="images/scfg_networks_fido.gif" width="572" height="331"> - - a) For FrontDoor the NetMail Semaphore file should be set to - C:\FD\FDRESCAN.NOW and the EchoMail Semaphore file should be set - to C:\FD\FDEXIT.025. - - b) For FrontDoor version 2.11, the EchoMail Semaphore file should be - set to C:\FD\FDXIT.025. - - c) For FrontDoor version 2.20 (commercial, multinode), the EchoMail - Semaphore file should be set to C:\FD\FDXIT#.025, where # is the - node number (0 based). - -10) Set your address to your system's FidoNet address (or the temporary address - specified in Policy 4 until such time as you have received your own - address). This is the address used for sending and receiving NetMail. It - will also be used as the default address for message sub-boards. - -11) Create an origin line for your system that most likely contains your BBS - name and phone number. - -12) Following is an overview of the remaining options available on this menu: - -<b> a) System Addresses: -</b> This option will bring you to a sub-menu to allow you to configure - different addresses (AKAs) for your system. Following is an example - for a BBS configured for two fido type networks.</pre> -<pre><img border="0" src="images/scfg_networks_fido_address.gif" width="572" height="331"> </pre> - <blockquote> -<pre><b> b) Default Outbound Address: -</b> When a user sends netmail, this is the 'send to' address that is used - as a default (useful for FidoNet<->Internet gateways). - -<b> c) NetMail Semaphore: -</b> This is the name of the trigger file which will cause your front-end - mailer to exit and scan for outgoing netmail. - -<b> d) EchoMail Semaphore: -</b> This is the name of the trigger file which will cause your front-end - mailer to exit and scan for outgoing echomail. - -<b> e) Inbound File Directory: -</b> This is the name of the directory where your front-end mailer stores - incoming files. - -<b> f) EchoMail Base Directory: -</b> This is the base directory for your echomail subdirectories - -<b> g) NetMail Directory: -</b> This is the name of the directory where your front-end mailer looks for - and places netmail. - -<b> h) Allow Sending of NetMail: -</b> When set to 'Yes' users can send netmail from your system. - -<b> i) Allow File Attachments: -</b> When set to 'Yes' users can send netmail file attachments from your - system. - -<b> j) Send NetMail Using Alias: -</b> When set to 'Yes' the user alias will be used (rather than their - real name) on outgoing netmail. - -<b> k) NetMail Defaults to Crash: -</b> If set to 'Yes' netmail sent from your system will default to crash - status (send immediately and directly). - -<b> l) NetMail Defaults to Direct: -</b> If set to 'Yes' netmail sent from your system will default to direct - status (send directly). - -<b> m) NetMail Defaults to Hold: -</b> If set to 'Yes', netmail sent from your system will default to hold - status. - -<b> n) Kill NetMail After Sent: -</b> Setting this to 'Yes' will delete outgoing netmail after it has been - sent. - -<b> o) Cost to Send NetMail: -</b> This is the cost (in credits) that a user will be charged when sending - netmail. - -13) Setup SBBSecho by running the ECHOCFG program and reading the documentation - for information on the available options. - - a) Under Paths...->Outbound Directory be sure to enter the path where - outgoing mail packets and bundles should be placed (i.e.: C:\IM\OUTBOUND). - - b) Select the appropriate Mailer Type. - - c) Enter your registration number (if you are a registered owner of the - SBBSecho program). - -14) Once you have done this you must now run the file MAILER.BAT (if using an - Attach-Style mailer) to use Synchronet with your front-end mailer. - MAILER.BAT must be run from your front-end mailer's directory (e.g. C:\IM). - You will no longer run the file SBBS.BAT to start this node (if you run a - multi-node system, you will still use SBBS.BAT to start those nodes which - are not using a front-end mailer). - - a) If you are NOT using InterMail as your front-end mailer, be sure to - modify your MAILER.BAT file to reflect the front-end mailer that you - are using. - -15) Follow the instructions given in the Policy 4 document to determine who - you should send netmail to in order to obtain your own node number. - -16) Now, from your front end mailer, send a netmail to this person following - the instructions contained in the Policy 4 document. Once you have done - this and the netmail has been sent, you should patiently await a netmail - reply containing your node number and the node number of your hub (where - you will send/receive your echomail and netmail to/from). - -17) Once you have received your node number, you'll want to replace the - temporary node number you used in your front-end mailer as well as in - SCFG->Networks->FidoNet Echomail and Netmail->System Addresses to it. - -18) Send your hub a message with the Area Manager (for the backbone <echomail>) - and Areafix (for the filebone <files>) passwords you wish to use on their - systems. You will need to remember these passwords as you will be using - them to do remote maintenance (such as adding and removing conferences and - file areas that you wish to receive). - -19) Your hub should respond with Area Manager instructions and a list of areas - available for you to connect to. If not, contact your hub for more - information. - -20) Look through the list of areas available to you and determine which - conferences you'd like to carry. In SCFG->Message Areas create a - message group(s) for the conferences you'd like to carry. When setting - up a sub-board for a conference, be sure to use the "Area Tag" name - given in the area list as the sub-board Short Name. - - a) Under Network Options... for each sub-board toggle the FidoNet - Echomail option toggled to YES. - - b) If the conference requires a different address, configure the address - under Network Options... - - c) If you allow aliases on your system, under Toggle Options... set Use - Real Names to YES. - - d) If you are unfamiliar with adding message groups and/or sub-boards, - consult that section of the Synchronet System Operator's Manual. - - e) For a more complete list of conferences available on the FidoNet - backbone you may wish to download the file FIDONET.NA from either your - hub or a local FidoNet BBS. This file contains a list of ALL - conferences carried on the backbone. - -21) Once you have set up all of the conferences you'd like to carry, you'll - need to go to SCFG->Message Areas-><group>->Export Areas...->AREAS.BBS - (SBBSecho) to create an AREAS.BBS file for SBBSecho to use. - -22) Now following the Area Manager instructions, send a message to your hub's - Area Manager and turn on all of the conferences you wish to carry. Note - that there are some administrative conferences for FidoNet that your - users shouldn't be able to read or post on, and some that even you - shouldn't post on, there is also usually a "test" conference which you may - want to set up to post messages on and insure that echomail is being sent - and received properly. - -23) That's about all there is to it. You are now set up on FidoNet and should - be able to send and receive FidoNet echomail and netmail. - - -<b>Examples for Receiving File Echoes via TICK (third party file echo program)</b> - -Example TIC.CFG: - ----------------------------------[ Begin ]------------------------------------- -IN c:\fd\file -ZONE 1 c:\fd\-mailout -NET 2 -NODE 3 -HOLD c:\fd\tickhold -QDIR c:\fd\tickqdir -FDLog - -AREA j:\fido\backbone BACKBONE -1:2/1 xxxxx * - -AREA j:\fido\SOFTDIST SOFTDIST -1:2/1 xxxxx * ----------------------------------[ End ]------------------------------------- - -In MAILER.BAT, at the end of the ":inmail" block, before "goto top": - ----------------------------------[ Begin ]------------------------------------- -set tz=PST8EDT -tick >> fd.log -set tz= -%sbbs%\exec\addfiles * /diz ----------------------------------[ End ]------------------------------------- - - -<b>Setting up ALLFIX (third party file echo program) with Synchronet BBS Software<u> -</u></b> -In ASETUP->System data->Global Options: - -������������������������������������������������������������� Global options � -� � -� Keep original file date Yes Replace extension No � -� Mailer rescan FrontDoor Max age of requests 0 � -� Log style FrontDoor Keep exported messages No � -� Mailer mode FrontDoor Days to keep on hold 30 � -� Download counters Size of stat file 0 � -� Update DESCRIPT.ION No Max TIC archive size 0 � -� Date format mm-dd-yy Max size to pack 0 � -� Min HD space to import 1024 UTC offset -8 � -� Process local requests No Max Msg size 0 � -� MSG compatibility Fido � -� Dupe checking Filename � -� � -����������������������������������������������������������������������������ij -� � -� LongDesc character One line LongDesc No � -� Filter LongDesc No Max len of LongDesc 0 � -� Spaces to indent 1 Add tag to desc No � -� � -����������������������������������������������������������������������������; - -Edit your MAILER.BAT: - -Search for "set sbbs=" -Add "set allfix=c:\allfix" - -Search for ":inmail" -Add "%allfix%\allfix file mgr" -Add "%sbbs%\exec\addfiles * /diz" - -Search for ":outmail" -Add "%allfix%\allfix file"</pre> -<h3><a name="SendingFidoNetNetMail">[9.5.2] - Sending FidoNet NetMail</a></h3> -<pre>Once you have a FidoNet address and have your Front-end mailer functioning -properly, you may send NetMail messages and allow, if you wish, your users -to send NetMail. You can set a NetMail cost in credits for users in SCFG-> -Networks->FidoNet EchoMail and NetMail->NetMail Cost. Sysops and users with -the 'S' exemption will not be charged credits when sending NetMail. Users -with the 'M' restriction are not allowed to send NetMail. Users will not -be allowed to send NetMail at all, if the sysop has set SCFG->Networks->FidoNet -EchoMail and NetMail->Allow Sending of NetMail to No. - -Users can optionally set a NetMail forwarding address for their account using -the "Account Defaults" menu. If the user has a NetMail address specified, -any E-mail set to that account will be automatically forwarded to the NetMail -address if the sending user wishes. This is useful for users who can receive -FidoNet NetMail on a "home" BBS system and prefer to receive their E-mail there -instead of on this particular system. - -Sysops and users with the 'F' exemption can also perform other special -functions with NetMail. If NetMail Defaults to Crash status is OFF, sysops -and 'F' exempted users can override this by starting their NetMail title -with "CR:" setting the Crash status ON for that NetMail message. - -Sysops and 'F' exempted users may also send File Requests by starting the title -with "FR:" and then the filename(s) being requested follow on the title. If -multiple filenames are requested, they must be separated by a space. -Example: "FR: FILE1.EXT FILE2.EXT". - -Sysops and 'F' exempted users may also send File Attachments from anywhere -on the system (potentially dangerous) by starting the title with "FA:" and then -the filename(s) to attach to the netmail message. This allows the sysop to -send a file attachment to multiple users without creating multiple copies of -the attachment or requiring the attachment to be copied into the Synchronet -DATA\FILE\xxxx.OUT directory of the sending user. Since the sending user -(sysop or 'F' exempt) can attach ANY file on the system, the 'F' exemption -and sysop security level (90+) should given out with extreme caution. - -Sysops and 'F' exempted users can also request a return receipt by starting -the title with "RR:". "CR:", "FR:", "RR:", and "FA:" may be used in combination -with one another, but must be specified in that order. -Example: "CR: RR: This is my title". - -The "xx:" specifiers and an optional trailing space are eliminated from -the final title for the NetMail message. -Example: "CR:Hello" or "CR: Hello" -Becomes: "Hello" before it is sent out by Synchronet.</pre> - </blockquote> -</blockquote> -<h2> <a name="InternetNetworking">[9.5] - Internet Networking</a></h2> -<pre><img border="0" src="images/scfg_networks_internet.gif" width="572" height="331"> - -<b>System Address: -</b> This is the Internet address for your BBS. - -<b>NetMail Semaphore: -</b> This is the name of the trigger file which will cause your Internet - mail program to exit and scan for outgoing netmail. - -<b>Allow Sending of NetMail: -</b> When set to 'Yes' users can send Internet netmail from your system. - -<b>Allow File Attachments: -</b> When set to 'Yes' users can attach files to the Internet netmail that - they are sending. - -<b>Send NetMail Using Alias: -</b> When set to 'Yes' the user alias will be used (rather than their - real name) on outgoing Internet netmail. - -<b>Cost to Send NetMail: -</b> This is the cost (in credits) that a user will be charged when sending - Internet netmail. -</pre> -<pre><b><i><font color="#FF0000">(v2 Only)</font></i></b> -In order for your BBS to support Internet networking (including such things as -sending/receiving Internet netmail and newsgroups, FTP, Telnet, etc.) it is -required that you obtain a third party program such as NetXpress or BBSNet. It -is also possible (but not recommended) to use a Fido->Internet or a -QWK->Internet gateway (usually available as shareware software).</pre> -<p><a href="#top"><b>Back to Top</b></a></p> -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/ntreadme.txt b/docs/ntreadme.txt deleted file mode 100644 index 3a98660fc3..0000000000 --- a/docs/ntreadme.txt +++ /dev/null @@ -1,47 +0,0 @@ -Synchronet v3.0 Windows NT/2000 Instructions -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Rob Swindell -www.synchro.net - -Note -~~~~ -Windows 2000 is actually Windows NT 5 (renamed for marketing reasons), not -to be confused with Windows Millennium Edition (the successor to Windows 98). - -Issues -~~~~~~ -1. Your C:\WINNT\SYSTEM32\CONFIG.NT file should NOT include Microsoft's - ANSI.SYS if you want DOS I/O Interception to function properly (required - for 16-bit XSDK/WWIV programs, DOS shell, viewing zip files, etc.). - -2. Add C:\SBBS\EXEC\SVDMANSI to the end of your C:\WINNT\SYSTEM32\AUTOEXEC.NT - to use the Synchronet Virtual DOS Machine ANSI driver (originally created - as a replacement for OS/2's ANSI driver, but it functions as an ANSI.SYS - replacement for Windows NT/2000 just as well - thanks again Steve!). - -3. At this time, only the output of 16-bit DOS programs can be intercepted, - so the output of internal NT commands and executables (dir, copy, rename, - more, etc) won't be intercepted for the remote sysop. This is a very - unfortunate problem (that does not exist on Windows 95/98) and I'm still - trying to find a solution. In the mean-time, the remote DOS shell is of - only limited usefulness. Perhaps a third-party command shell (e.g. 4DOS) - or console/ANSI driver will solve this problem (this is potentially related - to issue #1). Any feedback on this issue is appreciated. - -4. If you need more conventional memory for your external DOS programs and - do not need DPMI support, remove (or REM-out) the DOSX line of your - C:\WINNT\SYSTEM32\AUTOEXEC.NT. This will give you about 40K additional - conventional memory for your external DOS programs. - - -Debugging -~~~~~~~~~ -If you have any problems with programs that worked under Windows 95/98, -but aren't under NT/2000: find the sbbsexec#.log (where # is the node -number) that was generated after the program in question was run and -send it to me for debugging purposes. The sbbsexec#.log files are created -in the current directory at the time the program is run. This will -usually be either the Synchronet EXEC directory or the startup directory -for an online external program (e.g. C:\SBBS\XTRN\DOORNAME). - -/* End of File */ diff --git a/docs/platforms.html b/docs/platforms.html deleted file mode 100644 index 91855959ba..0000000000 --- a/docs/platforms.html +++ /dev/null @@ -1,31 +0,0 @@ -<html> -<head> -<title>Synchronet - Supported Platforms</title> -</head> -<table border="1"> -<CAPTION><h1>Synchronet - Supported Platforms</h1></CAPTION> -<TH>Synchronet -<TH>DOS -<TH>OS/2 -<TH>Win3.x -<TH>Win95 -<TH>OSR2 -<TH>Win98 -<TH>WinME -<TH>WinNT3 -<TH>WinNT4 -<TH>Win2000 -<TR><TD>Pre 2.3<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1] -<TR><TD>2.30<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1]<TD BGCOLOR=LIME>Yes [1] -<TR><TD>3.00a<TD BGCOLOR=RED>No<TD BGCOLOR=RED>No<TD BGCOLOR=RED>No<TD BGCOLOR=RED>No - [3]<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes<TD BGCOLOR=RED>No - [2]<TD BGCOLOR=RED>No [2]<TD BGCOLOR=RED>No [2] -<TR><TD>3.00b<TD BGCOLOR=RED>No<TD BGCOLOR=RED>No<TD BGCOLOR=RED>No<TD BGCOLOR=RED>No - [3]<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes<TD BGCOLOR=RED>No - [3]<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes -<TR><TD>3.00c<TD BGCOLOR=RED>No<TD BGCOLOR=RED>No<TD BGCOLOR=RED>No<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes<TD BGCOLOR=LIME>Yes -</table> -[1] Supported in DOS-Box/Emulation mode<br> -[2] No FOSSIL/DOS-interrupt driver (for external programs/doors)<br> -[3] No support for Win32 API function: GetDiskFreeSpaceEx<br> -</html> \ No newline at end of file diff --git a/docs/qemm.txt b/docs/qemm.txt deleted file mode 100644 index 9e7451eaba..0000000000 --- a/docs/qemm.txt +++ /dev/null @@ -1,168 +0,0 @@ -Experience has shown that problems with DESQview usually have nothing to do -with DESQview and everything to do with QEMM. - -The default QEMM config.sys line is "DEVICE=QEMM386.SYS RAM". If you are using -this config.sys line, you are playing with fire. On every system configuration -tested at Digital Dynamics, DESQview (or even just plain DOS) will eventually -crash using this config.sys line. - -The problem is that QEMM is using memory regions that other components of your -systems are also trying to use. This is bad. QEMM may also not be using memory -regions that are not in use and therefore you may not be getting all the -available upper memory possible. This is important if you need to load TSRs, -device drivers, or network drivers into high memory to leave as much DOS base -memory as possible. - -An example config.sys: - - 1: shell=c:\dos\command.com /e:1024 /p - 2: stacks=0,0 - 3: buffers=5 - 4: files=50 - 5: lastdrive=m - 6: device=c:\dev\qemm386.sys ram x=b800-c7ff i=f000-f7ff i=fd00-fdff - 7: device=c:\dev\loadhi.sys c:\dev\smartdrv.sys 1024 - 8: device=c:\dev\loadhi.sys c:\dev\ramdrive.sys 4096 256 512 /e - 9: device=c:\dev\loadhi.sys c:\dev\ansi.sys - -Remember, this example config.sys will probably NOT work in your system. It -does however work in one specific system. The right config.sys line for your -system will need to be determined by you. Keep reading to find out how to make -that determination. - -Note line 6, where QEMM386.SYS is loaded. The extra parameters after "ram" -are specifying that QEMM exclude (not use) the memory region B800h through -C7FFh and that QEMM should include (use) the memory regions F200h through F2FFh -and F400h through F6FFh. - -The "x=b800-c7ff" part of the line is VERY IMPORTANT. Without this parameter, -this particular system will eventually crash under DESQview or even DOS alone -under some circumstances. The crash will manifest itself differently with -different system configurations. It may give you a "QEMM protection violation" -or "Invalid instruction", or "NO ROM BASIC - SYSTEM HALTED", or it just may -suddenly freeze. - -The "i=nnnn-nnnn" parameters in the line tell QEMM to include (use) these -memory regions for more available high memory. You should NOT use the inclusion -parameter unless you are positive that no component of your system will try -to use that memory region (including your system BIOS). - -So how do you figure what to include and exclude? By using the QEMM.COM utility -with the "analysis" parameter. The first time you run "qemm analysis", you'll -see something like this: - -�����������������������������������ͻ -� Area Size Status � -� 0000 - C2FF 780K OK � -� C300 - C7FF 20K Include � -� C800 - EFFF 160K OK � -� F000 - F1FF 8K Include � -� F200 - F2FF 4K OK � -� F300 - F3FF 4K Include � -� F400 - F6FF 12K OK � -� F700 - F8FF 8K Include � -� F900 - FAFF 8K OK � -� FB00 - FBFF 4K Include � -� FC00 - FCFF 4K OK � -� FD00 - FDFF 4K Include � -� FE00 - FFFF 8K OK � -�����������������������������������ͼ - -The regions with the status "OK" mean that QEMM is dealing with it correctly. -It is either NOT using the region because another resource is using it or it -is using the region and no other resource has tried to use it since you booted. - -The regions with the status of "Include" mean that QEMM is not using the region -and no other resource has tried to use it since you booted. - -The regions with the status of "Exclude" (none listed above) mean that QEMM is -using the region and another resource has tried to use that region at the same -time. This region must be manually excluded with the "x=nnnn-nnnn" parameter -on your config.sys line. - -Now don't be fooled by all the "Include" regions above in that box. As you use -the system, those regions will shrink, split, or disappear altogether. After -executing "qemm analysis" (producing the above output) and then accessing a -floppy drive, the "Include" regions already begin to disappear: - -�����������������������������������ͻ -� Area Size Status � -� 0000 - C2FF 780K OK � -� C300 - C7FF 20K Include � -� C800 - EFFF 160K OK � -� F000 - F1FF 8K Include � -� F200 - F2FF 4K OK � -� F300 - F3FF 4K Include � -� F400 - F6FF 12K OK � -� F700 - F8FF 8K Include � -� F900 - FCFF 16K OK � -� FD00 - FDFF 4K Include � -� FE00 - FFFF 8K OK � -�����������������������������������ͼ - -After switching into every available video mode and running "qemm analysis" -again: - -�����������������������������������ͻ -� Area Size Status � -� 0000 - C5FF 792K OK � -� C600 - C6FF 4K Include � -� C700 - EFFF 164K OK � -� F000 - F1FF 8K Include � -� F200 - F2FF 4K OK � -� F300 - F3FF 4K Include � -� F400 - F6FF 12K OK � -� F700 - F8FF 8K Include � -� F900 - FCFF 16K OK � -� FD00 - FDFF 4K Include � -� FE00 - FFFF 8K OK � -�����������������������������������ͼ - -After typing "echo ^g" at the DOS prompt (^g stands for Ctrl-G) and then -running "qemm analysis" again: - -�����������������������������������ͻ -� Area Size Status � -� 0000 - C5FF 792K OK � -� C600 - C6FF 4K Include � -� C700 - EFFF 164K OK � -� F000 - F1FF 8K Include � -� F200 - F2FF 4K OK � -� F300 - F3FF 4K Include � -� F400 - F6FF 12K OK � -� F700 - F7FF 4K Include � -� F800 - FCFF 20K OK � -� FD00 - FDFF 4K Include � -� FE00 - FFFF 8K OK � -�����������������������������������ͼ - -As you can see, just about every system function will effect the regions that -QEMM thinks you can safely include. It is a good idea to run just above every -application you can and access every device on your system before deciding -that the information provided by "qemm analysis" may be accurate and usable. - -If "qemm analysis" every reports a region with the status of "Exclude", do not -question it. Immediately edit your config.sys excluding that region and reboot. - -If, for example, "qemm analysis" reports: - -�����������������������������������ͻ -� Area Size Status � -� 0000 - C5FF 792K OK � -� C600 - C6FF 4K Include � -� C700 - EFFF 164K OK � -� F000 - F1FF 8K Exclude � -� F200 - F2FF 4K OK � -� F300 - F3FF 4K Include � -� F400 - F6FF 12K OK � -� F700 - F7FF 4K Include � -� F800 - FCFF 20K OK � -� FD00 - FDFF 4K Include � -� FE00 - FFFF 8K OK � -�����������������������������������ͼ - -Edit your config.sys file addding "x=f000-f1ff" at the end of your -"device=qemm386.sys" line. Then reboot your system. - - - diff --git a/docs/sbbs.hst b/docs/sbbs.hst deleted file mode 100644 index 6413297bca..0000000000 --- a/docs/sbbs.hst +++ /dev/null @@ -1,1318 +0,0 @@ -Synchronet Version 2 Development History ----------------------------------------- - -Legend: ! Bug Fix - * New Feature - & Change of Operation - -Each line begins with one of the modification types listed in the legend above -and then followed by a single digit (0-9) rating the importance/severity of -the modification (0 being least significant). - -*********************************** -June 2, 1994 Version 2.00a Released -*********************************** - -!0 When a directory was set for content ratings, the rating letter was not - converted to uppercase and a new line was not displayed after the uploader - entered the rating. - -!9 If more nodes were configured in SCFG than the node license allowed - for (i.e. 3 nodes in SCFG with a 2 node license), random lock-ups and - bizzare errors would occur, increasing in frequency between logons. Version - 2.00a was supposed to allow for an additional local-only node for all - licenses. Even the existance of the additional node in SCFG would cause - this problem. If you had more nodes listed in SCFG than your node license - allows, this could explain just about any wierd behavior you may have - experienced. - -!0 RESORT directory command no longer creates an empty extended descriptions - file (EXB) if there are no extended descriptions for the files in the - directory being sorted/compressed. - -!5 Start-up directory for timed events not working at all. - -!1 Bulk upload command would abort if sysop hit ENTER for the description, thus - not allowing the automatic DIZ import into the single line description. - A Ctrl-C is now required to abort a bulk upload. - -!0 Slash commands were sometimes written with a control character following - the slash in the activity log files. - -&5 The contents of the current PCMS variables (string, logic state, and command - key) are now retained when loading a Baja module via EXEC_BIN function. This - allows variables to be "passed" from a shell to a module. - -*3 Users can logon directly to the QWK: prompt by prepending an asterisk (*) - to their user name or number at the logon prompt. - -!4 When performing an un-read personal message scan (MSG_YOUR_SCAN), if a sub - contained more than one un-read personal message, every other message would - be by-passed without displaying. - -!2 When viewing the user defaults from the User Edit function, the command - shell shown was the command shell of the current user online (most likely - the sysop), not the user that was being viewed in User Edit. - -!1 When modifying the external editor from the user defaults function, hitting - enter did not select the default editor if no external editor was previously - selected. - -&1 The COMPARE_USER_MISC Baja function now only sets the logic state to TRUE - if the all of the flags specified are enabled for the current user. - Previously, anyone of the flags set would cause the logic to be set to - TRUE. - -&0 When retrieving statistics for the WFC statistics display, a single dot - is displayed for each stat that has been retrieved. - -!5 Rockwell/Supra/PPI Caller ID format support (NMBR) was not functioning. - Synchronet was looking for "DATE=" when in reality the modems return - "DATE =". - -!8 A garbaged SFDOORS.DAT file was being created if this drop file type was - selected for an external program, and sometimes creating this drop file - when running the program from SBBS would hang the system or cause other - miscellaneous problems. - -&4 Improved preperation of DIZ text for single line description, when a - single line description is not provided by the uploader. - -!0 Could not change internal code of chat channels in SCFG - chat channel - internal codes are not used in Synchronet at all at this point, so this - bug really had no effect. - -!1 Could not change internal code of Gurus in SCFG. - -!2 FidoNet EchoMail base directory was not always created when saving changes. - -!1 Modifying certain elements in SCFG->Networks->QWK Networks would not prompt - to save changes when ESCaping. - -!2 Installation program no longer causing SCFG to give an error reading - MAIN.CNF if installing without default config (.CNF) files. - -&1 New (V)ersion command line switch for SBBS to display detailed revision - information (i.e. "SBBS V"). - -!3 EXEC_BIN function was not looking in the EXEC directory for .BIN modules. - -!2 PAGE_SYSOP function was not checking the 'C' exemption for the user. - -&2 DEFAULT.SRC, MAJOR.SRC, and RENEGADE.SRC all load (via EXEC_BIN) the module - STR_CMDS.BIN for the string (sysop) commands (i.e. DOS, MEM, CHUSER, etc). - This eliminates the duplicated code in the various .SRC files, so changes - are easier made. - -&1 CHAT command (for 'C' exempt users) was added back into the string commands. - -!2 There were no time left warnings before disconnect when using private chat. - -!1 Fixed problem of (NULL)*.* being created in current node directory when - using temp archive features. - -!3 Viewable file types with less than a three character extension were not - being recognized as viewable file types. Same thing with extractable - file types. - -************************************ -June 25, 1994 Version 2.00b Released -************************************ - -!1 Users can read/delete private posts if they are the author. - -!3 If a user had access to more than one external program section and the - sysop did not use a custom XTRN_SEC menu screen, and the user did not - have access to the first external program section listed in SCFG, they - could just hit CR and get access to it. - -!3 SCFG was not creating DATA\TEXT\<code> directories correctly for general - text file sections. - -&1 If NAME.DAT becomes corrupted (truncated), valid user accounts in USER.DAT - will not be overwritten by new users. - -!3 Forwarding e-mail would cause the attributes to become corrupted. - -!7 The ;RESORT command would corrupt extended file descriptions. - -&2 Unused extended description records in the DATA\DIRS\*.EXB files could - contain garbage. While this didn't hurt anything, some curious sysops were - concerned about the contents of this file containing recognizable data. Now - the unused records are filled with 0 instead. - -&7 Sending Internet NetMail from the BBS required an '@' in the user address - and the name was stored separate from the address in the SMB header record. - -!5 If the advanced option "Expires when out-of-time" was set to Yes and the - user expired to a level that allowed the same amount of time online or - less, it would loop saying "Your account has expired" and "Time's up". - -&2 If a non fidonet network address is used in netmail and internet netmail - is disallowed and a default fidonet address is specified in SCFG, then the - outbound name@addr will become name@addr@fidoaddr to allow for remote - fido/uucp gateways. - -&3 Fixed problem when setting message new-scan pointers and a large message - number gap existed in the base. Was very slow at the finding the date - of the nearest message to display to the user. - -!1 Number of posts incorrect when displaying user stats from the BBS. - -*8 SCFG now uses a modem configuration database that can be user modified - and extended. Also added options for exporting and importing modem config - files (.MDM). - -************************************** -August 20, 1994 Version 2.00c Released -************************************** - -!9 New version of Borland C++ (v4.0) causing numerous problems with external - program/event execution. Reverting back to older release (v3.1) only - apparent solution. No code changes whatsoever. - -************************************** -August 21, 1994 Version 2.00d Released -************************************** - -!7 Fixed bug that would erase extended descriptions for existing files in - a directory when a new file was uploaded with an extended description - and the directory was already compressed (no deleted file slots). - -************************************** -August 24, 1994 Version 2.00e Released -************************************** - -!7 The above mentioned bug in v2.00d was not fixed in the revision E patch. - It has now been fixed. - -&4 QWK packet downloads will not be started if the estimated transfer time - is more than the user is allowed for that logon and the user does not have - the 'T' exemption. - -************************************** -August 30, 1994 Version 2.00f Released -************************************** - -!4 32-bit CRCs were generated incorrectly in v2.00f (only) and have been - corrected. This would cause errorneous duplicate message errors when - posting or importing messages into a sub-board that used duplicate message - checking. - -!3 If all Artificial Gurus were deleted in SCFG, editing Multinode Chat - Channels would cause displayed garbage or other problems. - -!9 Moving files between drives would cause occasional lock-ups or exceptions. - -!2 Newly created sub-boards would default to 'On' in users' new-scans even if - the sub-board had been set to not default on in SCFG. - -*3 Added toggle option for each sub-board to set whether a sub-board will - default to 'On' or not for users' "Your" message scans. - -**************************************** -September 9, 1994 Version 2.00g Released -**************************************** - -&0 User's can no longer use ASCII char 255 in their name/alias/handle. - -&4 Internet posts can now be replied to via NetMail with the 'M' command - from the reading messages prompt. - -*3 Automatically loaded Baja modules can be specified in SCFG->System-> - Loadable Modules. This is for specifying .BIN modules that you want - to have loaded automatically without having to edit all of your command - shells. Available triggers are Logon, Logoff, and New User. - -!5 Relative swap directory disallowed by SBBS and SCFG (i.e. ..\etc) which - would cause problems when swapping to disk for external programs that - have start-up directories. If a swap directory is specified, the complete - path must be specified. - -&2 More intelligent directory/drive checking in SCFG when saving changes. - -!4 Problems resolved with private posts not being exported into QWK type - networks. - -*2 External programs can be configured to suspend the user's time online - while running the program (Free Time). - -!1 EXPIRE ARS paramter wasn't functioning properly. - -*7 File directory listings are re-listed if using batch flagging prompt. - If a selection other than [More] is selected, the current page of files - is redisplayed. - -!0 When CID is used to reject a caller, the log showed a random amount of - time used. - -!0 Fixed problem with @EXPDAYS@ showing expired users with large numbers of - days till expiration. - -!0 Fixed problem with @TUSED@ showing incorrect time used under some - circumstances. - -*4 Private node-to-node chat now uses a split-screen mode for ANSI users. - -!1 Messages posted to "SYSOP" and read by user #1 will be marked as READ. - -!3 Fixed problem of users being able to extract files from directories they - were not allowed to download from. - -!3 Multiple extractions from the same file would not work properly unless the - command was given multiple types ('E' for example), from the transfer - section. - -*4 New toggle option in SCFG for each directory to specify if directory - should be excluded from new file scans of all libraries/directories. - This helps speed up new-file scans when there are large numbers of CD-ROM - directories where no new uploads are likely to occur. - -*5 New toggle option in SCFG for each directory to specify if directory - should be exluded from Auto-ADDFILES search for new FILES.BBS entries - (for use with ADDFILES v2.10 or later). - -*2 New options in SCFG->Nodes->Node X->Toggle options. Logons via user number - can be disallowed, logon via user "real name" can be allowed (in addition - to alias), and passwords can be prompted for each logon attempt (even if - the user name is not found). - -&3 Any keys left in the local keyboard buffer by an executed program are - ignored by Synchronet. Some programs (namely DSZ) have a nasty bug where - they leave random key sequences (like Ctrl-Break and Alt-Tab) in the - keyboard buffer sometimes. These "magical" keystrokes are now purged from - the keyboard buffer. - -*0 If an external program creates the file HANGUP.NOW in the node directory - (file size and contents irrelevent), Synchronet will immediately hang-up the - user upon return and log the user off without logging a "Hung-up" in the log - file or the HUNGUP.LOG file. Both SCB (Synchronet Callback) v1.24+ and SMM - (Synchronet Match Maker) will create this file, so the user can logoff - directly from the program without generating a "Hung-up" in the log. XSDK - programs can't drop carrier on users. While this is still the case, - technically, the user can be automatically hung-up upon exit if the program - creates this file, giving the appearance of the program actually hanging the - user up. - -*2 External programs (doors) that require DORINFO1.DEF (for all nodes), this - drop file can be selected (separately from DORINFO#.DEF) in SCFG. - -*4 External editors that require drop files can now have the drop files - automatically created by Synchronet (configured in SCFG). - -*9 New memory compression algorithms allow for more configured items - (message and files areas, for example) in SBBS. Some systems may see - as much as 50k more free memory (typing ;MEM at the main menu) with this - version. Each additional configuration item (message area, file area, etc) - will also take up much less RAM, thus allowing a much larger number of - items for most configurations. This memory compression technique is not and - cannot be utilized in SCFG. Run "SCFG /M" to display the amount of free - memory in the configuration utility at all times. - -!1 The %T command line specifier could contain the wrong number when run during - the new user process (new users events or external editors). When used - during a new user logon, this specifier will always be 10 minutes. - -*7 Any command line configurable in SCFG can be used to execute a Baja module - (.BIN file in your EXEC directory) instead of an executable (.COM, .EXE, or - .BAT). This is done by prefixing the command line with a '*'. For example: - "*type %f" for a viewable file type command line for .TXT. TYPE.BIN is - included and makes a single Baja call to a new function, PRINTFILE_STR, - which is the same as PRINTFILE, except that it prints the contents of the - current string variable (as passed to the module via the command line, - %f in the example above, the path and filename to print). This is also - convenient for executing Baja modules from your external program (door) - menu or as transfer protocols, or whereever an external program is normally - used. - -!2 User's time left was not checked before starting the download of an e-mail - file attachment. - -!0 When sending bulkmail, the title of all messages after the first were - converted to all lowercase characters. - -!7 When displaying the userlist and sorting alphabetically, if there wasn't - enough available memory for allocation, the BBS would "lose" most of what - memory was available. - -*5 User database (USER.DAT) is accessed using record locking, rather than - file locking (as before). This significantly increases speed on writing - to the user database on active multinode BBSs. - -*9 Optional message base compression using LZH encoding. Intelligent - compression algorithm only stores in compressed form if disk space (in 256 - byte block increments) is actually saved. Larger messages compress better. - Preliminary testing shows average message base compression between 30% - and 50%, which can equal hundreds of megabytes on large message base - systems. This toggle should only be used on message bases where the average - message is at least 512 bytes in length (roughly have a page of text). - Debate and philosophy type sub-boards appear to benefit the most from - compression. :-) - -&3 PostLink networked sub-board now allow 60 character "to" fields and - 70 character "subject" fields. - -*4 MAIL_SEND_NETFILE baja command now allows sending FidoNet file attachments - as well as Internet file attachments. - -*1 FidoNet NetMail "Direct" status now supported (in SCFG->Networks). - -*5 TEXT.DAT strings can be replaced dynamically with a Baja function call, - REPLACE_TEXT. See TEXTNUMS.DAT for the number of the TEXT line you wish - to replace in a specific shell or module. - -*3 DOOR.SYS is now created with line 31 (Max Kbytes to download today) - containing the number of credits the user has (including free credits) in - kilobytes. If "Modify User Data" is set to Yes for a DOOR.SYS type external - program, line 29 is read back to update the number of downloaded files in - the user data and line 30 (Kbytes downloaded today) is read back in, - subtracted from the user's credits and added the total bytes downloaded in - the user data. - -*4 Support for FAX/Modems that insist on returning verbal result code "+FCON" - upon FAX connections. The BBS will exit with error level 100 so that the - SBBS.BAT file may launch the FAX receive software. - -!3 Fixed problem with bi-directional QWKnet account transfers that would cause - contents of outbound QWK packet to be imported into DATA\QNET\<QWKID>.IN. - -*8 New message storage method: Hyper Allocation for the ultimate message - importing (tossing) performance. Twice as fast as "Fast Allocation". - -!1 @ZIP@ code wasn't working at all. - -*3 If blind uploads are allowed, files are not added the database (upload - rejected) if the file was found in another directory. - -*5 Circular QWK echomail messages are automatically detected and rejected. - -*9 QWK NetMail with automatically maintained route map (DATA\QNET\ROUTE.DAT) - for routing instructions for multiple hop NetMail. - -*7 Optional QWKnet user list (DATA\QNET\USERS.DAT) for automatic address - look-up. Created with included utility: QWKNODES.EXE - -&2 Searching for "Your messages" and displaying Titles only is MUCH faster - now. - -*3 QWK mail imported that's sent to the system ID will be sent to user #1 - rather than being rejected as an "Unknown user". - -*5 Support for QWKnet call-out semaphore files: DATA\QNET\<HUBID>.NOW - If this file exists the QWKnet call-out node will delete the file and - do an immediate call-out for that hub. - -*1 QWKnet call-outs can be forced from any node using the WFC 'F' command - or by typing ;FORCE <BBSID> from the main menu in the BBS. - -*3 If a user attempts to send e-mail to user@addr, the BBS will automatically - assume they intend to send netmail. - -*1 Ctrl-AZ can now be used to signify a premature end of file for display. - -**************************************** -February 17, 1995 Version 2.10a Released -**************************************** - -!0 QWK netmail forwarded to a FidoNet address would have the "From" field - set to the sysop's name instead of the sender's name. - -*2 When creating a message locally, all tear lines in the message text are - automatically converted to "-+-" by Synchronet. This conversion does - not happen with E-mail or NetMail. - -!2 Couldn't receive e-mail by user number via QWK REP packets. - -&5 Removed Guest ('G' restriction) hardcoded shell and expert questions and - display of SBBS.MSG - -*3 Added SELECT_SHELL and SET_SHELL Baja functions for changing user's command - shells from Baja modules. - -*2 Added SELECT_EDITOR and SET_EDITOR Baja functions for changing user's - external editor from Baja modules. - -*0 Added RANDOM ARS keyword for random number generation used in access - requirements and Baja modules. Baja line "COMPARE_ARS RANDOM 5=1" would - generate a random number between 0 and 5 and set the logic state to true - if the number generated was a 1. - -*1 Searches for "Un-read messages to you" will now show messages sent to the - either the user's name or alias (regardless of whether the echo is set to - "Use real names" or not). - -!3 Fixed problem with Searches for "Un-read messages to you" starting at the - last personal message in the sub-board if the user's last read message - pointer was higher than the last un-read message, rather than the beggining - of the un-read messages (as it should have). - -*2 Searches for messages to you from the reading messages prompt and from - the main menu (displaying titles only) is many times faster. - -*2 Message threading (by from, to, or subject) from the reading messages prompt - is many times faster. - -*1 Un-read messages to the user online will be displayed with a flag of '!' - in message title listings in sub-boards. - -!2 Baja function "SET_USER_STRING" was changed in the following ways: - Had a bug when called and the current string was blank. No longer allows the - user to choose an alias already in use (which could be bad) or an alias that - does not begin with an alpha character. For ALIAS, REALNAME, or HANDLE - checks the TEXT\NAME.CAN before allowing the user to use that name. For - PHONE checks the TEXT\PHONE.CAN before allowing the user to use that number. - For REALNAME or HANDLE disallows names in use if the "Force Unique" toggle - is set to Yes in SCFG->System->New User Values->Question Toggles. For - setting BIRTHDAY, invalid BIRTHDATES are not allowed. If the string can't be - used the logic state is sete to FALSE, otherwise it is is set to TRUE. - -!7 Serious problems when attempting to load a baja module from within another - baja module (not command shell). - -*3 Added ARS keywords LASTON and LOGONS to check for days since last logon and - total logons in Baja COMPARE_ARS functions or in SCFG. - -*7 Added Pre-pack QWK feature. All users meeting the requirements in SCFG-> - Msg Options->Pre-pack QWK Requirements will have new messages automatically - added to a QWK packet and store until they download a QWK packet and the - pre-packed QWK will be appended to. This is mainly intended to reduce LD - costs for long QWKnet connections. - -!4 Sending FidoNet file attachments from Synchronet with a relative data - directory in SCFG (i.e. ..\DATA) would cause the file to not be sent. - -*2 When posting on a local message base (not networked) and a "to" name - is prompted for, the name is checked against the user database before - allowing the posting user to continue. - -*3 When a QWKnet call-out node is run, it will now import HUBID.QW0 through - .QW9 as well as .QWK if they exist in the DATA directory. - -&5 When routing QWK netmail, Synchronet will automatically take the shortest - route if the next hop is a node or hub off of the local system (overriding - the DATA\QNET\ROUTE.DAT file). - -&2 Synchronet will automatically eliminate duplicate entries in the ROUTE.DAT - file, keeping the newest entry. - -!2 Solved the problem of a user or QWKnet node receving e-mail while creating - a QWK packet. The mail would be auto-deleted after the packet was downloaded - even though the new e-mail wasn't included in the packet and wasn't read. - -*4 The following Baja functions can now use %s (to represent the current - string) and %f (to represent the current file directory) and any of the - command line specifiers (listed in Appendix A of the sysop manual) in their - string arguments: REPLACE_TEXT, LOG, PRINT, PRINT_LOCAL, PRINT_REMOTE, - PRINTFILE, PRINTFILE_REMOTE, PRINTFILE_LOCAL, CHKFILE, EXEC_BIN, YES_NO, - NO_YES, MENU, SETSTR, SET_MENU_DIR, SET_MENU_FILE, and COMPARE_STR. - -*4 The following command line specifiers have been added: %o (SysOp Name) - %q (System QWK ID) %x (User's Command Shell) %* (Node number 0 padded to 3 - digits) %1 (user number) %2 (user number 0 padded to 2 digits) %3 (user - number 0 padded to 3 digits) %4 etc. - -&0 Version number command line specifier (%v) now includes revision letter - (i.e. 2.10B). - -&3 Added option in SCFG->Message Options to Allow users to have their e-mail - forwarded to a netmail address. Previously, this option would automatically - be available to the user if the system allowed users to send FidoNet or - Internet mail. This toggle defaults to "No" (disallow forwarding). - -&2 Added option in SCFG->Message Options to have Read E-mail automatically - killed by running "SMBUTIL M". - -!2 Fixed problem of small chunks of memory disappearing while moving around - within SCFG. - -&5 Overlay buffer manipulation released 32k of more free memory in SCFG and - 40k of more free memory in SBBS. - -&6 Daily events, QWKnet call-outs, and PostLink call-outs will now execute - automatically, even when started from a front-end mailer or other program - which requires SBBS to exit after a caller. - -*5 New QWK options can be toggled from the "Change Settings" menu from the - QWK prompt: Include Message Path (VIA), Include Time Zone (TZ), Include - Index Files, and Include Control Files. This allows for non-Synchronet - systems to QWKnet with Synchronet BBSs without receiving @VIA and @TZ - lines. This also allows Synchronet systems to eliminate the index and - control files from QWK packets since they are unnecessary for QWKnet - importing and just make the file larger. These options can also be - toggled via QWK control message to "SBBS" with a title of "VIA", "TZ", - "NDX", or "CONTROL" followed by "ON" or "OFF". TZ and VIA default to OFF, - so Synchronet systems may need to post a control message to enable them. - -*2 Split screen chat can now be toggled from the Chat: prompt with the 'S' - command. - -*6 New Baja functions: COMPARE_NODE_MISC, COMPARE_USER_CHAT, COMPARE_USER_QWK, - TOGGLE_USER_CHAT, and TOGGLE_USER_QWK. See BAJA.TXT for details. - -!2 The timeleft field in drop files created for external editors could contain - the incorrect number when used as a new user external editor for validation - feedback. - -!0 Batch file flag prompt (P)revious command went backwards exactly one file - less of a full screen. - -!3 When forwarding mail, the original author's user number could be set to - a random number which would cause havoc when the new destination user - (A)uto-replied to the mail. - -*4 External editors can now be configured as QuickBBS (MSGTMP) style to - support native QuickBBS/Remote Access external editors (i.e. GEdit, - IceEdit, TopEd, etc.) - -*1 External editors can now be configured to expand single line feeds to - carriage return/line feed pairs. This is for editors that store new lines - as a single line feed (i.e. VI and other Unix editors, WWIVEdit in WWIV - mode, etc.) - -*5 Externalized storage (environment variables SBBSFILENAME and SBBSFILEDESC) - of uploaded file names and descriptions allows upload processors to - use file names and descriptions. Upload processors can modify the file - name and description of uploaded files by writing the files SBBSFILE.NAM - and SBBSFILE.DES in the current node's directory. - -*4 New node toggle options in SCFG for turning on/off the retrieval of total - files and messages (significantly speeding up the WFC statistics retrieval), - disabling the local keyboard (entirely), disabling local inactivity warning - and auto-logoff, and requiring the input of system password for local WFC - commands and Alt-key combinations. - -*2 New Baja function MSG_NEW_SCAN_SUB to scan the current sub-board for new - messages. Sets the current logic state to FALSE if the user aborted the - scan. - -*1 New Baja functions MSG_SET_GROUP and FILE_SET_LIBRARY to set the current - message group of file library by short name. - -!2 E-mail file attachments can now be downloaded from the Reading Sent Mail - and Reading All Mail prompts and if the file is not there, it will say - File Not Found at the end of the message. - -*5 Split-screen private node-to-node chat enhancments: Ctrl-P and Ctrl-U - functional, fake cursor in top window, and notification of waiting - telegrams and node messages on window separation line. - -&2 Extended file descriptions in file listings are no longer truncated at page - break and displayed again on next page. - -*5 SCFG now imports and exports message area files: AREAS.BBS, SUBS.TXT, - and FIDONET.NA as well as file area files: DIRS.TXT and FILEBONE.NA - -*3 SCFG now support multiple levels of automated back-up of config files. - SCFG /B# specified back-up level (by number), default is 3. - - -!2 Message pointers are now loaded before any logon modules, so the Baja - message new-scan functions can be used in logon modules. - -!0 HUBID.QW0, QW1, etc. would not be deleted automatically after import. - -!1 Fixed problem with XTRN_EXEC Baja function causing "checking instruction" - error message. - -*1 Sub-boards can be configured with static QWK conference numbers instead of - the default dynamic numbering scheme (allowing inserting of sub-boards - without causing incorrect REP posting by users). - -*1 Added FA: (File Attacment) Subject "status override" for FidoNet Netmail - from Sysop or 'F' exempt users. Be VERY careful who you give the 'F' - exemption to! They can attach any file on your system to Fido netmail. - This is to be used when sending the same file attach to multiple people - instead of the MAIL_SEND_NETFILE Baja function. - -!0 Node paging and activity alerts were enabled between logon and the end - of the logon sequence regardless of the user's default settings for these - two toggles. - -*5 Files added to batch download queue, but not downloaded while online - will be automatically added to the batch queue during the user's next logon - until the files are either downloaded successfully or removed from the - queue. - -*8 Baja modules can now be executed from within TEXT.DAT lines (that don't - contain % variables) and menus/text files by using "@EXEC:MODNAME@" - without the quotes, where MODNAME is the name of the .BIN file (without - the .BIN) in the EXEC directory. - -&2 Down arrow (ESC[B) is now translated by Synchronet into Ctrl-J instead of - Ctrl-M. - -!2 Telegrams and inter-node messages could flash by (screen cleared) - without being read in some circumstances. - -*3 Added new command line option to SBBS (o) to force Synchronet to run - any pending events and then immediately exit. This eliminates the need to - have events down the nodes they are being run on to return to front-end - mailers. But more importantly, if "SBBS O" is run as an event from a mailer - and there just so happens to be no pending events, Synchronet will - immediately exit back to the mailer instead of sitting at the waiting for - call screen. - -*0 Added Guru response codes `o (SysOp's name), `s (System name), `g (Guru's - name), and `I (System's QWK ID), `L (user's level - previously `m), - `T (time), `M (month), `W (day of week), `J (day of month), `Y (year), - `Z (user's zip/postal code). - -!1 Replies to Anonymous posts on local sub-boards now work. - -!2 Pre-packed QWK packets will no longer contain e-mail (causing duplicates) - -*3 Guru expressions can now contain ARS elements contained in square brackets. - Example: (HELLO&GURU&[LEVEL 90 OR FLAG S]) - -!5 SBBS now correctly supports more than 3000-4000 posts per sub-board (if - available memory allows). - -!1 Auto-sorting file directories by upload date now functions correctly. - -*4 Non-Synchronet color codes are now supported in extended file listings. - -!0 Baja function COMPARE_KEY now supports DIGIT, EDIGIT, control characters - (^x) and slash commands like the CMDKEY function. - -*9 New Baja functions: INKEY, RIOSYNC, GETTIMELEFT, SAVELINE, RESTORELINE, - MSWAIT, ADJUST_USER_MINUTES, TRASHCAN, CREATE_SIF, READ_SIF, CMDKEYS, - COMPARE_KEYS, and PAGE_GURU. - -!2 When (V)alidating a message from the Reading Messages prompt, the index - was not properly updated causing the header and index attributes to be - mismatched (as reported by CHKSMB). This also caused validated messages to - remain unvalidated. - -*1 When changing message attributes, a menu-interface is now used. - -!4 Using Hyper Allocation (and possibly Fast Allocation or Self-packing), - message bases could be corrupted when importing multiple sequential messages - for a single message base. The symptom would be corrupted message bodies - (appearing as blank in the BBS) and CHKSMB v1.21 or later reporting - unsupported translation types. This was fixed in SMBLIB v1.20b used in - v2.22 of SBBSFIDO and Synchronet UTI as well. - -*9 New Baja variable functions: INT, STR, SET, GLOBAL_INT, GLOBAL_STR, PRINTF, - SPRINTF, STRCAT, RANDOM, COPY, SWAP, ADD, SUB, MUL, DIV, MOD, AND, OR, NOT, - XOR, TIME, TIME_STR, DATE_STR, FTIME_STR, SECOND_STR, STRLEN, STRUPR, - STRLWR, and DATE_STR_TO_INT. - -*9 New Baja instructions: COMPARE, IF_EQUAL, IF_NOT_EQUAL, IF_GREATER, - IF_GREATER_OR_EQUAL, IF_LESS, IF_LESS_OR_EQUAL, SWITCH, CASE, END_CASE, - DEFAULT, and END_SWITCH. - -*9 New Baja file I/O functions: FOPEN, FCLOSE, FREAD, FWRITE, FSEEK, FGET_POS, - FEOF, FGET_LENGTH, FSET_LENGTH, FGET_TIME, FSET_TIME, FLOCK, FUNLOCK, - FPRINTF, and FSET_ETX. - -!0 Fixed problem of extremely-slow file searches when using the Remove/Edit - command from the file section. - -*2 Timed events can be forced by creating a CODE.NOW semaphore file in the - DATA directory, where CODE is the internal code of the timed event. - -*1 The number of seconds between each node semaphore check and statistics - check while WFC can be configured in SCFG->Node->Advanced Options. - -*3 File areas can be toggled to deduct time during uploads (normally time spent - uploading is not counted). - -*1 File areas can be toggled to reward the uploader with minutes instead of - credits. - -*1 Sub-boards can be toggled on as networked to the Internet via UUCP when - using NetXpress allowing unknown "To" users and the 'N' restriction to work - properly. - -*4 New system toggle to disallow users to convert credits into minutes. - -&2 When local system protection is used (node toggle), the system password is - now prompted for in the status line. - -*3 When deleting a message from a sub-board, the message is flagged for - deletion rather than being immediately removed. This allows the sysop or - user to undelete the message before message base maintenance is run. - -*2 Messages can be be moved between sub-boards without deleting the original - message. - -&0 Reinitializing message pointers now resets the last read message pointer - as well as the highest read message pointer. - -*5 New Baja functions: ONLINE, OFFLINE, and PUT_NODE. - -*1 NODE_ACTION Baja function now supports the following actions: - MAIN, RMSG, RMAL, SMAL, RTXT, RSML, PMSG, AMSG, XTRN, DFLT, XFER, DLNG, - ULNG, BXFR, LFIL, LOGN, LCHT, MCHT, GCHT, CHAT, SYSP, TQWK, PCHT, PAGE, - and RFSD as well as specifying the action number directly. - -*2 New Baja function: NODE_STATUS can set the current node status to: - WFC, LOGON, NEWUSER, INUSE, QUIET, OFFLINE, NETTING, EVENT_WAITING, - EVENT_RUNNING, or EVENT_LIMBO. - -*0 Messages and text files larger than the available memory (size is unlimited) - can now be displayed. - -&1 If SCFG->System->Toggle Options->Expire When Out-of-time is set to "Yes", - specific users can be excluded from this behavior by giving them the 'E' - exemption. - -&0 If SCFG->System->New User Values->Question Toggles->Location is set to - "Yes", commas will not be required if the "Require Commas" toggle is set - to "No". - -*5 Local messages (posts or e-mail) from user #1 containing @-codes WILL be - expanded to message variables (or actions) when read. - -*1 "Beep Locally" toggle option moved from System to Node Toggle Options in - SCFG. - -*5 Each security level can have a specific security level to expire to or - quick-validation set to expire to. - -*9 New loadable modules for Login, Synchronization, Logout, and Expired Users. - -*3 New Baja instructions: COMPARE_STRN and COMPARE_SUBSTR. - -*0 New command line specifier: %z to represent the text directory (similar to - the %j, %k, and %! specifiers). - -*2 New Baja functions: FLENGTH, USER_EVENT, and PRINTTAIL. - -&9 Removed hardcoded login procedure (NN: prompt, "New" for new-user, etc.). - Must use a login module to perform this functions (see EXEC\LOGIN.SRC - or EXEC\MATRIX.SRC and DOCS\BAJA.DOC for details). Login module name is - specified in SCFG->System->Loadable Modules->Login Module. If set to blank, - Synchronet will assume "LOGIN" as the module name. - -&9 Removed hardcoded logon procedures for displaying TEXT\MENU\LOGON screens, - last few callers, auto-message, user events, etc. Must use logon module - to perform these functions (see EXEC\LOGON.SRC and DOCS\BAJA.DOC). - -*9 New Baja function: LOGIN to initiate login procedure, LOGON to initiate - LOGON procedure (includes automatic execution of Logon module) and LOGOUT - to force LOGOUT procedure (only to be used for RE-logins, does NOT execute - Logout module). - -*2 New Baja function: BATCH_ADD_LIST to add a list of files to the current - users batch download queue and automatically delete the list file. - -*5 When returning from an external program, if the file DATA\FILE\xxxx.DWN - exists (where xxxx is the user's number), the files contained in that - list will be automatically added to the user's batch download queue and - the list file will be deleted. - -*7 Default download protocol can be selected by users in default config. - And automatic hang-up after download (without asking) can be turned on. - New user defaults for these two options can be configured in SCFG. - -*5 Baja compiler supports definition of macros (!DEFINE) and include files - (!INCLUDE). - -&0 SCFG online help now functions correctly even if SCFG.EXE is renamed. - -*3 WIP (Windows Interface Protocol) terminal (DC-TERM) auto-detected and .WIP - menu files displayed (if present). New WIP ARS keyword as well. - -&1 When RIP or WIP terminals are detected, a color and extended ASCII support - is assumed. - -&0 When moving files from upload or sysop directory, upload date/time is - changed to current date/time. - -!1 When importing AREAS.BBS or FIDONET.NA message base lists in SCFG, internal - codes would be padded with spaces out to eight characters (which was wrong). - -&2 Internet netmail uploaded via QWK REP is now stored with name and addressed - combined (same as sending netmail online) instead of the SBBS 2.0 method - of separate name and address. Both methods are valid (and documented in - the SMB specification), but this has been changed for consistency with the - newer storage method of online Internet netmail. - -&1 The ADJUST_USER_CREDITS Baja function will now deduct from the user's free - credits (if they have any), if adjusting negative. - -!0 Fixed problem with CREDIT ARS keyword not working correctly with values - greater than 32MB. This keyword now supports up to 64MB, for comparison. - -!1 Fixed problem with executing a loadable (Baja) module as an external program - if that module contained an EXEC_XTRN statement. This would cause problems - with re-opening the log file when returning from module. - -!0 Fixed problem with editing Access Requirements for External Program Sections - in SCFG when the section name was longer than a certain number of chars. - -!0 Fixed problem with FILE_SET_LIBRARY Baja function causing critical error. - -*1 Archives can be (V)iewed from the (R)emove file prompt. - -*8 System variables can be read (and some modified) from Baja modules. See - DOCS\BAJA.DOC for a list of available system variables. - -&3 The DIR and SUB ARS keywords now support the area's internal code as well - as the sub-board or directory number (which can change and be hard to - calculate). To specify a directory or sub-board internal code that begins - with a digit, use SUBCODE or DIRCODE instead of the SUB or DIR keyword. - If the first character of the value is not a digit, it is assumed to be - a internal code. - -&1 When deleting file libraries and directories in SCFG, the data files may - automatically be deleted (if the sysop answers YES to the delete data - prompt). - -&3 When forwarding e-mail that has file attachments, the attachments are now - automatically copied along with the e-mail message. - -*1 When in local Guru chat (not multi-node Guru chat), the Guru will type - first, as if responding to the user string "HELLO". - -*5 New Baja function (LOAD_TEXT) to load an alternate TEXT.DAT file from module - or command shell. - -*2 Additional line in TEXT.DAT allows different keys for (Y)es and (N)o. - -*3 Configuration command line (from WFC) configurable in SCFG for each node. - This is allows the sysop to add command line switches for some all nodes, - or use the 32-bit version of SCFG (SCFG32.EXE) for some or all nodes. - -&1 Hitting the key for (N)o at the pause prompt is now the same as hitting - Ctrl-C (abort). - -*3 RIP and WIP files are not displayed locally to keep the local screen clean. - -*0 New GETSTR (Baja function) mode, NOECHO accepts a string of input without - echoing to the local or remote consoles. - -*4 E-7-1 terminals are now supported by setting the Node Toggle Option in - SCFG for "Allow 8-Bit Remote Logons" to "No". If a user logs on and - does not have IBM extended ASCII support disabled, then they will be allowed - to send 8-bit characters (after the logon procedure). - -&2 New users are asked less initial questions about terminal type (to simplify - new user procedure). If ANSI, RIP, or WIP is auto-detected, auto-terminal - type is not asked. If RIP or WIP is detected, COLOR is not asked. - If auto-terminal type is not selected, RIP is not asked. All these items can - still be toggled from the user default settings menu (which may still appear - during the new user procedure if configured), allowing undetected RIP - terminals (for example) to be correctly configured during the new user - procedure. WIP is not supported unless it is correctly auto-detected. - -*1 New Baja functions: CHKSUM and STRIP_CTRL - -!0 Hexadecimal character constants (\x1b) in the TEXT.DAT were not interpretted - correctly. - -*2 New @-code to display a menu from within the TEXT.DAT or within another - text file or menu (@MENU:filename@). - -*1 New @-code to allow yes/no questions to be imbedded in menu files - (@QUESTION@). - -*1 New Baja functions: FILE_SEND, SEND_FILE_VIA, and FREAD_LINE. - -*0 Lines starting with '#' in the TEXT.DAT will be ignored (comments). - -*2 New @-code to display any file from any directory within another text file - or menu (@TYPE:filename@). - -*4 New DOS File System related Baja functions: REMOVE_FILE, RENAME_FILE, - COPY_FILE, MOVE_FILE, GET_FILE_ATTRIB, and SET_FILE_ATTRIB. - -*3 New DOS Directory System related Baja functions: MAKE_DIR, CHANGE_DIR, - REMOVE_DIR, OPEN_DIR, READ_DIR, REWIND_DIR, and CLOSE_DIR. - -*1 New Baja function (GET_FILE_TIME) to get file date/time without having to - open the file first (FGET_TIME). - -************************************** -August 31, 1995 Version 2.20a Released -************************************** - -&0 �[ is now interpreted as <ESC>[ when ANSI encoded reading messages. - -!3 The "maximum time" option for external programs, was using the value - for maximum SECONDS instead of minutes causing invalid drop file to - be created if this option was used. - -!1 The "Credit Uploader with Minutes" option could not be toggled to Yes - in SCFG (under Directory Toggle Options). - -*2 External editors can be configured to automatically quote all or none - of the message text, rather than prompting the user. - -&0 Users should no longer run out-of-time while in local chat with the sysop - (alt-C) or be kicked out immediately after exiting chat if popped in - during logon sequence. - -!0 The FSET_POS Baja function was incorrectly setting the logic state to - Non-TRUE unless the file was set to the beginning. - -!0 When logging on for immediate QWK (*username at the login prompt or 'Q' - restriction), any waiting telegrams would not be displayed. Now they are. - -*5 No more 500 line limit for messages created online. The maximum number of - lines is determined by free memory. Most systems should be able to allow - 1000-2000 line messages. The internal line editor still has a 500 line - message limit. Raw input and external editors are limited only by the number - of lines set in SCFG for the user's security level and the available DOS - memory. - -!1 The FINDUSER Baja function was setting the current command string to an - invalid string if the username was not found and NOT setting the command - string if it was. - -&5 SBBS.EXE is now limited to 2 nodes when run in unregistered mode (no - key file) plus an additional local node (total of 3 nodes). - -&0 Directories with "Check for file existence" set to "No" will no longer - allow single file downloads and extended file information now includes - the correct file size and date. - -!1 Fixed problem with possible stack overflow (lock-up) if pause (ctrl-a p) - used in TimesUp TEXT.DAT entry. - -!0 Toggling "Allow Anonymous Posts" from "Only" to "No" for a sub-board in - SCFG did not work correctly. - -*2 Carbon Copy FidoNet netmail now supported. Only one "cc: name@addr" - allowed per line (cc: must start line, anywhere in body text). If - "cc: addr" is used, then "sysop" will be used as the destination - user name. "* Originally to: name@addr" is placed at the top of all - carbon copy messages. "cc:" is not case sensitive and all white space - inbetween "cc:" and "name@addr" is ignored. - -***************************************** -September 27, 1995 Version 2.20b Released -***************************************** - -&0 FidoNet netmail CC:'s didn't support name@addr@addr. This has been changed. - -!9 Fixed problem with local node (node license + 1) locking up. - -&1 Yes/No prompt can now use light-bar module (no patch required), and Ctrl-C - sets the abort flag correctly (unlike the patch). - -*3 The updating of a file's upload date when moving from one directory or - another can now be toggled (per directory) in SCFG. The default is OFF. - -&0 Video mode is optionally reset between each call (Node toggle option). This - reverses the effects of some external programs that change the text mode - (without permission). This option is not suggested when running in an - OS/2 window (i.e. not full screen). - -&0 XTRN.DAT now contains EXEC directory, TEXT directory, TEMP directory, - System's QWK ID, and Node toggle options (in hex) for use with XSDK v2.40 - and later. - -*1 Added TRIBBS.SYS door drop file support. - -!5 Fixed problem with lock-ups during text searches in message bases with - excessively large messages (>64k). - -*3 Maximum number of seconds to allow for message base open/lock retries - now configurable in SCFG->Message Options. Previously hard-coded at 10 - seconds, now configurable (defaults to 30 seconds). - -*4 Inactivity seconds before warning and disconnection now configurable - (per node) under node advanced options in SCFG. - -&0 OS/2 flavor of SCFG now gives up time-slices while waiting for keyboard - input. - -*2 Internal editor no longer limited to 500 lines per message. - -*1 New modem configuration toggle option to disallow unknown result codes - (the default behavior is to allow them and use the last configured - result code information, but still log an error for the sysop). - -!3 COMPARE_STRN Baja function could/would mess up the execution (flow control) - if located in if/else/end_if code blocks. - -*7 All Baja File I/O functions now use buffered I/O for a major increase in - read/write performance from Baja modules. - -*1 New @-code (@SETSTR:value@) sets the current command string for the - currently executing module or shell to the value specified. - -&3 When a node is configured for exclusive execution and it is waiting for - other nodes to become inactive, it now displays the number and status of - the first offending node that it's waiting for (this will help sysops to - know which node is keeping their events from executing). - -*2 New Baja File I/O function FFLUSH <handle> to flush any pending output - (writes) to a file. - -&1 New ARS keyword "OS2" to specify whether or not the current node is running - Synchronet for OS/2 or not. - -&5 All paths are expanded to FULL paths (no longer relative) when the BBS is - run (i.e. "..\EXEC" becomes "C:\SBBS\EXEC") to eliminate dependancy on - the current directory (which SHOULD always be the current NODE directory - when the BBS is executing) and intermittent problems under some system - configurations. The downside is that users can now see your full system - paths when view/extracting archives (if the archiver, e.g. PKZIP, shows - the path). - -&0 If the sysop has specified a trailing backslash on the start-up directory - for a timed event, it will be automatically removed by the BBS. DOS will - not let you CD to a sub-directory with a trailing backslash. - -*9 When running Synchronet for OS/2, all executables (with the exception - of SCFG) are assumed to be DOS programs (which require extra work by the BBS - to execute) unless the program name is listed in SCFG->External - Programs->OS/2 Program List. At the very least, CMD.EXE should be listed - here. Since all DOS programs are executed in a fresh DOS window (with - very little overhead) all swap options are unused in SYNC4OS2. WWIV - external programs (requiring DCDWATCH and/or WWIV color codes) are not - supported in Synchronet for OS/2. OS/2 programs canNOT have I/O interrupts - intercepted (this is a DOS program ONLY feature). - -*2 New %y command line specifier points to your DOS COMMAND.COM (in - Synchronet for DOS, gets the path from the COMSPEC environment variable, - in Synchronet for OS/2, gets the path from SCFG->Nodes->Node X->DOS - Command Interpreter). - -&5 New modules for Synchronet for OS/2: EXECSBBS.EXE (not to be confused with - EXECSBBS.COM, still required by Synchronet for DOS) and EXECDOS.EXE located - in your EXEC directory. - -!2 All pending events are now executed when "SBBS O" is run regardless of - the order of their configuration vs. execution time in SCFG. - -&1 Posts to non-QWKnet sub-boards from a Q restricted account are now - disallowed. - -&4 Maximum file sizes (for the file transfer section) have been increased from - 9,999,999 bytes to 999,999,999 bytes. - -!2 ARS for compressable file types was not being used. - -&1 New ARS keyword "DOS" evaluates to true if the current node is running the - 16-bit DOS version of Synchronet. - -&5 The 32-bit versions of Synchronet now allow a maximum of 10000 files per - directory (vs. 1000 for the 16-bit DOS version) and 50000 total e-mail - messages (vs. 5000 for the 16-bit DOS version). - -&8 Synchronet no longer physically removes deleted e-mail messages when a user - exits the reading mail prompt unless the sysop has set SCFG->Message Opts - ->Delete E-mail Immediately to "Yes". Instead, the mail is physically - removed during the system daily maintenance (run automatically). This speeds - up the e-mail access considerably on systems with large e-mail databases. - Also, e-mail and posts that have been flagged for deletion will not be - visible to the user unless the sysop has set SCFG->Message Opts->Deleted - Messages Viewable to "Yes". Settings this option to "Sysop Only" means only - sysops or sub-ops (when appropriate) can see deleted messages. The above - mentioned system maintenance also scans for old e-mail (greater than the - maximum age specified in SCFG->Message Opts->Purge Mail by Age) if enabled. - SMBUTIL is no longer necessary for maintaining your MAIL database. - -&1 When a new user takes a deleted user's slot, any mail that user has SENT - will be deleted as well as any mail that user had received (previously, - sent mail was not deleted and thus readable by the new user). - -*3 Added the following @-codes: @last@ for user's last name/alias, - @firstreal@ for user's first real/company name, and @lastreal@ for - user's last real/company name. - -&0 Maximum allowed DCE rated increased from 57600 to 64000 (to support ISDN - modems). - -*2 When reading e-mail, the thread commands (<>{}[]) are now available - to thread forward and backward by subject, from user, and to user (as - with reading sub-boards). - -*0 When a node is run and a NODE.LOG already exists (not a normal situation) - it is appended to the file DATA\CRASH.LOG (as well as the normal system - log) to allow the sysop to easily browse through logs resulting in possible - crashes to help diagnose the cause. The file CRASH.LOG in the current - node's directory is also appended (to more easily solve node specific - crashes). - -*0 New @-codes: REAL, LAST, LASTREAL, and FIRSTREAL - -*7 Synchronet BBS now supports VERBAL modem result codes by setting SCFG->Nodes - ->Node #->Modem Config->Toggle Options->Use Verbal Result Codes to "Yes". - You must also change V0 to V1 in your modem init string. When verbal result - codes are enabled, the result code list is no longer used. This feature was - added for the flexibility and easier configuration of modems that don't - correctly support numeric result codes, insist on returning multiple connect - results (CARRIER, PROTOCOL, etc), or have too many possible result codes to - configure by hand. When this option is set to "Yes", Synchronet - automatically creates the connection description and estimated CPS rates. - This option also has the added advantage of supporting DCE (connection) - rates above 65535. The DCE rate is not to be confused with the DTE rate - which is currently limited to 115200 bps. - -*4 Synchronet will now automatically fix the E, V, and &C modem registers - if configured incorrectly in (one of) the modem init string(s). If the - above "Verbal Result Codes" option is used (for example), the init string - does not need to be modified. Synchronet will automatically send an ATV1 - after the init and special init strings (if needed). - -&1 The PERSONAL.NDX file included in QWK packets now includes entries for - the E-mail conference (#0) as well as private posts in sub-boards. - -*3 Synchronet for OS/2 (SBBS4OS2.EXE) can now be launched with an already - open port by specifying the open port's handle on the command line (with - the new H command line parameter). This is useful for OS/2 front-end mailers - (like BinkleyTerm) that leave the port open when spawning the BBS. - -*3 When Synchronet for OS/2 launches OS/2 executables, the com port can be left - open by configuring the program (in SCFG->External Programs->OS/2 Programs) - to leave the port open. The port handle must then be passed to the child - process with the %H command line specifier. The port is always closed when - launching DOS executables and then re-opened upon returning. - -*0 The system variable, _WORDWRAP is now available for Baja programmers to - check/modify the current word wrap buffer (set with GETSTR). - -*0 New Baja functin, EXIT immediately aborts execution of the current module - (used in place of RETURN when in CALLed sub-routines). - -*4 The following Baja functions now allow integer variables to be used in place - of integer constants: USER_EVENT, COMPARE_STRN, RANDOM, FOPEN, FSET_ETX, - NODE_ACTION, NODE_STATUS, PRINTFILE, PRINTTAIL, GETSTR, GETNUM, MSWAIT, - GETLINE, GETSTRUPR, GETNAME, SHIFT_STR, REPLACE_TEXT, REVERT_TEXT, - TOGGLE/COMPARE_USER_MISC, TOGGLE/COMPARE_USER_CHAT, TOGGLE/COMPARE_USER_QWK, - TOGGLE/COMPARE_NODE_MISC, SET_USER_LEVEL, SET_USER_STRING, - ADJUST_USER_CREDITS, and ADJUST_USER_MINUTES. - -*0 New @-codes: MAILW (number of e-mail messages waiting for current user), - MAILP (number of e-mail messages sent by current user pending deletion), - MAILW:# (number of e-mail messages waiting for user #), and MAILP:#. - -&4 If a loadable module is executed from a module (or shell), the logic state - is maintained when returning to the parent. This allows sub-modules to - return error levels to the parent modules without using global variables. - -*2 If a module named FEEDBACK.BIN exists in the EXEC directory, it will be - executed whenever a user sends e-mail to user #1 (with the exception of - validation feedback). If the module sets the logic state to FALSE, then - the feedback will be aborted. - -!5 When the day passes midnight (new day) while a user is online, his/her - daily stats (e-mails per day, posts per day, free credits, etc) are reset - immediately. - -*3 New 'P'urge user command from the Sysop's e-mail and reading messages - menus. - -*4 New 'N'ext un-read message command from reading e-mail prompt. - -&2 If a user uploads a file and that user is then deleted and another user - then logs on as 'New' with the old users name and the file is subsequently - downloaded, the new user will not receive the credit award. - -!5 Fixed bug in daily mail maintenaince that would corrupt memory and the - mail index file in the 16-bit DOS 2.3 beta version if there were over 3276 - messages in the e-mail database. No effect on the 32-bit versions. - -!9 Fixed bug that would potentially crash the process if first user to logon - was a new user and hung-up during the new-user feedback. - -!4 Fixed bug that would potentially crash the process if a DORINFO*.DEF door - was run with no timed events configured. - -!0 If SCFG->Message Options->Users Can View Deleted Messages was set to "No", - and a user delete a post, the current message number skipped over the next - message. - -!1 If the Internet toggle option for a sub-board is set to "Yes", replies are - always posted to "All" - reply-to-user name is not prompted for. - -*********************************** -May 30, 1997 Version 2.30a Released -*********************************** - -!2 SBBS4OS2 status bar would disappear sometimes (fixed by Enigma by shortening - status bar to 79 chars instead of 80). - -!9 SBBS4OS2 would occassionally display output very slowly (fixed by Enigma - by adding time-slice yields to various console loops). - -!4 SBBS4OS2 would get non-uppercase filenames confused on HPFS partitions - (fixed by Enigma by converting all filenames to uppercase). - -!3 Internal message editor would continue to display first line of message when - using the up arrow (fixed by Enigma). - -!6 When SBBS.EXE/SBBS4OS2.EXE returned with a non-zero errorlevel (e.g. - incoming FAX or whatever), the NODE.DAB was closed prematurely, posssibly - causing errrors (fixed by Enigma). - -*5 IP logging of telnet connections (requires "TEL FROM" in connect string) - to detailed log file and user note field (added by Enimga). - -*5 IP trash can (TEXT\IP.CAN) for telnet connections now supported - (added by Enigma). - -!5 Possible crash (GPF) cause in internal message editor when clearing (/CLR) - a message when not on the last line of the message (fixed by Enigma). - -**************************************** -September 5, 1997 Version 2.30b Released -**************************************** - -!8 Fixed Y2K bugs in QWK, Fido, and log filenames where a 2-digit year - is used (would have used 100 in some places for the year 2000). When parsing - a 2-digit year, a 100-year window is used with 1970 as the pivot point. - e.g. "69" is assumed to refer to 2069, "70" is assumed to refer to 1970. - -&4 Birthdates are still stored in MM/DD/YY format. But if a user's age is - calculated to be more than 90, then 90 is subtracted from the calculated age - e.g. A user born in 01/01/00 is assumed to have been born in 2000, not 1900. - -*3 New @-codes: REV (Synchronet revision), CONN (current connection), - LOCATION (system location), TNODES (total nodes on system), - HOST (same as CPU), CID and IP (Caller-ID or user IP addr). - -*1 Down-arrow at a pause prompt now moves down one line at a time. - -*1 'Q' at the Pause prompt aborts the display (same as 'N' or Ctrl-C). - -*1 TAB (Ctrl-I) now works like CR (enter) when at string prompts. - i.e. you can now "TAB" from the NN: prompt to the PW: prompt in a - full-screen/ANSI login. - -!4 Creating REP packets that contained messages with "Replied-to" numbers - larger than 7-digits (some OLRs apparently send large bogus numbers in - this field), would corrupt the packet. When attempting to import such a - corrupted packet into an SBBS system, the error message was garbled. - -!1 Only the last line of an inter-node telegram was logged to the system - activity log. Now the entire telegram is logged. - -!1 High-priority input is no longer assumed when in RAW input mode (Ctrl-Z). - -!5 Guest account ('G' restriction) would save the real user's name in the - database (if asked during login via logon module). If the user then hungup - and called back and logged on as "New", they would be unable to use their - real name (if duplicate real names are disallowed in SCFG). The real name - field is now cleared upong logoff (for 'G' restricted users). - -!0 If a user hung-up without fully logging on (during the new user process, - for example), an inter-node message was sent to all active nodes saying that - he/she logged off (even though there was never a "logon" anouncment). - -!1 The number of posts read statistic was not being properly reset for QWKnet - node ('Q' restricted user) calls. - -!0 If EXEC_XTRN was called from a loadable module or shell, the node status was - not automatically changed back to "User at external program menu". - -!3 SBBS4OS2 created an invalid EXITINFO.BBS (created with DORINFOx.DEF). Would - cause doors that used this file to behave strangely or fail to function. - -&4 Changed NOPEN/NODEDAB retry counter from 500 (which could take several - minutes on some systems) to 50 (more like several seconds). - -!0 Hitting 'A' from a local node WFC no longer tries to answer a call. - -**************************************** -December 14, 1999 Version 2.30c Released -**************************************** - -*3 New @-codes: QWKID (System QWK-ID), INETADDR (System's Internet Address), - FIDOADDR (System's primary FidoNet address). - diff --git a/docs/sbbsecho.html b/docs/sbbsecho.html deleted file mode 100644 index 938aebed1a..0000000000 --- a/docs/sbbsecho.html +++ /dev/null @@ -1,633 +0,0 @@ - -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Synchronet's FidoNet Packet Tosser Documentation</title> -</head> - -<body> -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<h1> Synchronet's FidoNet Packet Tosser Documentation</h1> -<pre><b>Table of Contents</b> - -<a href="#Introduction">Introduction</a> -<a href="#Terminology">Terminology</a> -<a href="#Installation">Installation</a> -<a href="#AREAS.BBS">AREAS.BBS Format</a> -<a href="#Configuration">Configuration</a> -<a href="#RunningSBBSecho">Running SBBSecho</a> -<a href="#CommandLineSwitches">Command Line Switches</a> -<a href="#AREAFIXCommands">Area Manager Remote Commands</a></pre> -<h2><a name="Introduction"> -<br> -Introduction</a></h2> -<pre>SBBSecho is a full-blown FTN echomail program (tosser/scanner) for Synchronet -BBS version 2.0 and higher. SBBSecho is level III implementation of the SMB -v2.00 specification including support for HyperAllocated and LZH compressed -message bases.</pre> -<pre>It is intended to replace FTSC-1 (*.MSG) compatible echomail programs (GEcho, -Squish, FastEcho, Alexi/Mail, etc.) and SBBSFIDO with a single program -incorporating the standard features of echomail programs without the .MSG -phase (consuming disk space and time).</pre> -<pre>You will not need to use SBBSFIDO (*.MSG import/export utility for Synchronet) -or any echomail programs after you have installed SBBSecho. - -<a href="#TOC">Back to Table of Contents</a></pre> -<h2><a name="Terminology">Terminology</a></h2> -<pre><b>FTN</b> - -FidoNet Technology Network: Any network using FidoNet standards for addressing, -mail packets, mail sessions, node lists, etc.</pre> -<pre><b>Zones, Nets, Nodes, and Points?<u> -</u></b> -FTN node addresses are like phone numbers, they are made up of multiple -components (four to be exact). The components are: zone, net, node, and point. -Each component is specified by a decimal (base-10) number, separated by symbols -(no spaces):</pre> -<pre><b> Zone:Net/Node.Point</b></pre> -<pre>The zone represents the continent (if FidoNet) or the network number (if other -FTN network). All FidoNet nodes in North America have a zone 1 address. When -the zone is specified in an address, it is the first component and must be -followed by a colon. If the zone is not present in an address, the local -system's zone is assumed.</pre> -<pre>The net represents the network number of the FTN node. Duplicate net numbers -may exist between zones. If the net number is not present, the local system's -net is assumed.</pre> -<pre>The node number specifies an exact FTN node within a network. The node number -is the only required element of an FTN node address.</pre> -<pre>The point is an optional component which specifies a sub-node that does not -directly receive mail and is also not listed in the main FTN node list, but -instead gets all its mail from its boss-node (zone:net/node.0). When the point -is not specified, 0 (zero) is assumed (i.e. 1:2/3 and 1:2/3.0 are identical) -which indicates the system is not a point node address.</pre> -<pre>A 2D (2 dimensional) address refers to an FTN address containing just the -net and node numbers (i.e. 103/705).</pre> -<pre>A 3D (3 dimensional) address refers to an FTN address containing the zone, -net, and node numbers (i.e. 1:103/705), specifically excluding the point number -if it exists.</pre> -<pre>A 4D (4 dimensional) address refers to an FTN address containing the zone, -net, node, and optional point numbers (i.e. 1:103/705.1).</pre> -<pre>A 5D (5 dimensional) address refers to an FTN address consisting of a standard -3D or 4D address with an appended "@domain" (i.e. 1:103/705@fidonet.org). - -<b>Attach or FLO Mailer?<u> -</u></b> -If you are using FrontDoor, InterMail, D'bridge, SEAdog, Dutchie, or any other -ArcMail *.MSG attach-style mailer, you are using what we will refer to as an -"Attach Mailer".</pre> -<pre>If you are using BinkleyTerm, Portal of Power, or any other FLO/CLO/HLO/DLO -style mailer, you are using what we will refer to as a "FLO Mailer".</pre> -<pre>Both types are supported equally by SBBSecho.</pre> -<pre><b>NetMail<u> -</u></b> -Point-to-point (usually person-to-person) direct or routed messages.</pre> -<pre><b>EchoMail<u> -</u></b> -Group or conference messages of a particular subject matter. Usually -distributed on a regional or continental (e.g. FidoNet Zone 1 backbone) scale. -FTN style echomail areas have a unique area tag (name) associated with them to -distinguish each area from the others.</pre> -<pre><b>Packet<u> -</u></b> -An FTN packet is a group of one or more messages contained in a single -uncompressed file. Packets may contain echomail and/or netmail messages. -Packets usually have a .PKT extension, although outbound NetMail packets for -FLO Mailers will have .?UT extensions (where ? is either O, C, D, or H). The -first eight characters of the filename may be anything, but are usually decimal -digits representing the date and time the packet was created. SBBSecho creates -temporary outbound packet files with a .PK_ extension and then renames them to -.PKT when they're completed. If you find any .PK_ files in your outbound -directory, don't worry. SBBSecho will find them the next time it is run and -continue packing them and sending them on their way.</pre> -<pre><b>Bundle</b> - -An FTN bundle is a single file archive of one or more (usually compressed) -packets. Bundles will have file extensions where the first two characters -represent the day of the week the bundle was created (MO, TU, WE, TH, FR, SA, -and SU) and the third character of the extension is a number or letter. The -first eight characters of the filename may be anything, but are usually -hexadecimal digits representing the FTN node address (or relative address) of -the system that created the bundle. SBBSecho changes the file extension of bad -inbound bundles to .MO_, .MO-, or .MO.</pre> -<pre><b>Areafix/Area Manager</b> - -Areafix is a synonym for area manager (the very first FTN area manager -program was called AreaFix). Area manager capabilities (remote adding/removing -of areas, changing compression type, etc) are built into SBBSecho, so therefore -no external area manager program is required. If you are not an FTN hub, then -the area manager portion of SBBSecho will probably not get any use on your -system.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="Installation">Installation</a></h2> -<pre>To begin, copy the SBBSECHO.EXE, ECHOCFG.EXE, and AREAMGR.HLP files into your -Synchronet EXEC directory (usually C:\SBBS\EXEC), copy the SBBSECHO.CFG file -into your Synchronet CTRL directory (usually C:\SBBS\CTRL), and copy the -SBBSECHO.DOC file into your Synchronet DOCS directory (usually C:\SBBS\DOCS).</pre> -<pre>If you plan on using the 32-bit DOS, OS/2, or Windows 95/NT version of -SBBSecho, you will need to put the appropriate SBBSECHO.EXE file into your -Synchronet EXEC directory (unzip OS2.ZIP for the OS/2 version, DOS4G.ZIP for -the 32-bit DOS version, or WIN32.ZIP for the Windows 95/NT version). If -you get memory allocation errors running the 16-bit DOS version or desire -improved performance, you will want to run one of the 32-bit versions.</pre> -<pre>Add the SBBSCTRL and SBBSNODE environment variables to your AUTOEXEC.BAT. -Example:</pre> -<pre><b>SET SBBSCTRL=C:\SBBS\CTRL -SET SBBSNODE=C:\SBBS\NODE1</b></pre> -<pre>Note: The node number used for the SBBSNODE environment variable is not - important, use your NODE1 directory.</pre> -<pre>These environment variables must be present for SBBSECHO and ECHOCFG to -function correctly. Type "SET" at the DOS prompt to be sure they are listed -correctly.</pre> -<pre>You will also need to modify your existing MAILER.BAT (or FDRUN.BAT, IMRUN.BAT, -etc) file to accomodate the use of SBBSecho, or replace it with the MAILER.BAT -included with SBBSecho. If this is your first time setting up FidoNet, you will -not currently have a MAILER.BAT file set up, so use the one that is included -and modify it so that it reflects the proper drive letters and directories.</pre> -<pre>Next, SBBSecho expects to find the file AREAS.BBS in your Synchronet DATA -directory (usually C:\SBBS\DATA) unless you have overridden the default name -and/or location using the ECHOCFG program. The format of this file is very -similar to the standard AREAS.BBS (which many echomail programs use, or can -at least export their native area file to this format - i.e. GEcho's GSETUP).</pre> -<pre>SCFG can also export your sub-boards to AREAS.BBS, but you're probably better -off modifying the AREAS.BBS file you're already using (if you are) or -converting your current echomail program's area file to AREAS.BBS. This is -because SCFG assumes the sub-board short name will be the same as the area's -tag (as shown in your echo list), but this may not always be the case - unless -you imported an AREAS.BBS or FIDONET.NA file into SCFG to begin with). - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="AREAS.BBS">AREAS.BBS Format</a></h2> -<pre>Lines beginning with a semicolon (;) are considered comments, and are ignored.</pre> -<pre>Each line is in the following format:</pre> -<pre><b><i>CODE TAG UPLINKS</i></b></pre> -<pre><i>Where:</i> - <b>CODE</b> is the internal code of the sub-board. Any unrecognized internal - codes are considered "Passthru" (not imported to your BBS).</pre> -<pre> <b>TAG</b> is the FidoNet tag as shown in your echo list (i.e. FIDONET.NA). - If this is '*', then it will be considered a "badecho" area - and will receive all messages for areas not otherwise specified - in this file.</pre> -<pre> <b>UPLINKS</b> is a list of FidoNet addresses which you wish to export mail - to. At the very least, your hub's address should be listed - here. Your address should NOT be listed here. If multiple - addresses are specified, you should specify the full 3D address - for each.</pre> -<pre><b>AREAS.BBS Example:</b></pre> -<pre>SBBS SYNCHRONET 1:3615/50 -SYNCDATA SYNCDATA 1:3615/50 -SYNC_SYS SYNC_SYSOPS 1:3615/50</pre> -<pre>The amount of spacing between each element in the line is not important. Each -line can be up to 1000 characters in length.</pre> -<pre>So if your OLD AREAS.BBS file is in .MSG format (for example):</pre> -<pre>C:\FD\ECHO\SBBS SYNCHRONET 1:3615/50</pre> -<pre>It must be changed to match the example given above! - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="Configuration">Configuration</a> -</h2> -<pre>In order to set up SBBSecho for your system you must run the included ECHOCFG -program. It should already be located in your EXEC directory. You may want to -put your EXEC directory in your DOS search path so you can execute SBBSECHO and -ECHOCFG from any drive and directory on your system.</pre> -<pre>Multiple configuration files can be used (but isn't usually required) for -multi-mailer systems. The default configuration filename is SBBSECHO.CFG -located in your Synchronet CTRL directory. You can override this by specifying -the name and location of the configuration file on the SBBSECHO and ECHOCFG -command lines. Example:</pre> -<pre><b>ECHOCFG D:\ECHO1.CFG -SBBSECHO D:\ECHO1.CFG</b></pre> -<pre>If you do not specify a configuration file, ECHOCFG and SBBSECHO will use -SBBSECHO.CFG located in your Synchronet CTRL directory.</pre> -<pre>Upon running ECHOCFG you will be brought to the main menu of the configuration -program. The path and filename of the configuration file being modified will -appear at the top of the menu. Following are screen captures of available menus -within the configuration program and an explanation of the options contained on -each of them.</pre> -<pre><img border="0" src="images/sbbsecho_main.gif" width="652" height="331"></pre> -<pre><b>Mailer Type: -</b> Selecting this option will toggle between the mailer types supported - by SBBSecho, either FrontDoor (message attach) type mailers or Binkley - (FLO file) type mailers. Choose the one that matches your front-end - mailer type.</pre> -<pre><b>Maximum Packet Size:</b> - This option allows you to set the maximum size of each outgoing - echomail packet. - -<b>Maximum Bundle Size: -</b> Mail packets are normally packed into what are called "bundles" (unless - a node is set up to receive uncompressed mail packets). This option - allows you to specify the maximum size of each outgoing mail bundle.</pre> -<pre><b>Areafix Failure Notification: -</b> This is the user number of the person where notification of Areafix - failures should be sent. Such failures include nodes which are not - configured for areafix, nodes using incorrect areafix passwords, and - the like. Setting this to 0 will disable this option.</pre> -<pre><b>Nodes... -</b> This option allows you to add, remove, and configure nodes that you - will be sending mail to. Selecting this option will bring you to - a sub-menu which will look similar to the following:</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_nodes.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre> At the Nodes... sub-menu, pressing the INSert key will allow you to - add a new node, pressing the DELete key will remove the currently - highlighted node number, and pressing ENTER on the currently - highlighted node will allow you to edit the options for that particular - node from a menu like the following (note that the node number you are - editing appears at the top of the window):</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_node_settings.gif" width="652" height="331"></pre> -<pre><b>Address: -</b> This is the address of the node you are editing, selecting it - will allow you to change this to a different address. Using - the "ALL" wildcard in place of one of the address components - will allow you to configure settings for all nodes that meet - that specification (e.g. all nodes in zone 1 can be specified - as 1:ALL or all nodes in zone 1, net 103 can be specified - as 1:103/ALL).</pre> - </blockquote> -</blockquote> -<pre><b> Archive Type:</b> - This is the compression type to be used when packing mail - bundles for this node. Selecting this option will allow you - to choose from a menu of currently configured archive types, - like the following:</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_node_arctype.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre> Selecting "None" will specify that this node is to receive - uncompressed packets (no bundles).</pre> -<pre><b> Packet Type:</b> - This is the packet type that will be used when creating mail - packets for this node. The default packet type used by SBBSecho - is 2+. If you are a "point" address (e.g. 1:100/100.1) you - should use either a type 2+ or 2.2 packet since type 2 packets - do not support point numbers. Selecting this option will allow - you to choose from a menu of currently supported packet types:</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_node_packettype.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre><b> Packet Password: -</b> This is a password that will be placed into each outgoing mail - packet for this node. Passwords are normally used for extra - security when sending and receiving mail packets. This node - must also have the same packet password defined for your - address and SBBSecho must be set up for secure operation (set - in the 'Toggle Options' sub-menu) in order for this feature to - function properly.</pre> -<pre><b> Areafix Password: -</b> This is the password that will be required by this node (in - the subject field) when it sends messages to the area manager - (AreaFix).</pre> -<pre><b> Areafix Flags: -</b> When additional echo lists have been defined (from the - 'Additional Echo Lists...' sub-menu) these flags determine - which echo lists can be used by this node when processing area - manager add requests.</pre> -<pre><b> Status: -</b> This option determines the netmail status that will be set - when SBBSecho sends out an areafix message or a file attach. - Selecting this option toggles between None, Crash, and Hold - status.</pre> -<pre><b> Direct: -</b> When set to 'Yes' this option will add a Direct kludge line - to messages that SBBSecho sends out (or create DLO/DUT files - for FLO mailers).</pre> -<pre><b> Passive: -</b> Setting this option to 'Yes' will prevent messages from being - sent to this node without the need for altering the AREAS.BBS - file. This is useful for temporarily shutting off the messages - to this node. This option can be toggled on and off remotely - via an area manager request.</pre> -<pre><b> Send Notify List: -</b> This determines whether or not this node is sent a Notify List - when using that command line option in SBBSecho. - A Notify List is a netmail sent to the system operator of the - node showing options set for the node as well as connected - areas. - -<b>Paths... -</b> This option allows you to configure the paths and filenames which are - used by SBBSecho. Selecting this option will bring you to the - following sub-menu:</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_paths.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre><b> Inbound Directory: -</b> This is the directory where SBBSecho should look for inbound - mail packets. This is normally taken from whatever has been - set in the SCFG program.</pre> -<pre><b> Secure Inbound (optional): -</b> This is an optional directory where SBBSecho should look for - secure inbound mail packets.</pre> -<pre><b> Outbound Directory: -</b> This is the directory where SBBSecho will place outgoing mail - packets and bundles.</pre> -<pre><b> Area File: -</b> This is the path and filename of the file that SBBSecho will - use as it's AREAS.BBS file. By default SBBSecho looks for - the file AREAS.BBS in the data directory defined in SCFG.</pre> -<pre><b> Log File: -</b> This is the path and filename of the file that SBBSecho will - use when logging events. By default SBBSecho uses the file - SBBSECHO.LOG in the data directory defined in SCFG. - -<b>Log Options... -</b> This list allows you to toggle what events SBBSecho should place into - the logfile. Selecting this option will bring you to the following - sub-menu:</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_logoptions.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre> Selecting ALL, NONE, or DEFAULT will toggle all of the options to - 'Yes', 'No', or to their default states, respectively. - -<b>Toggle Options... -</b> These options allow you to toggle various features in SBBSecho. - Selecting this option will bring you to the following sub-menu:</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_toggleoptions.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre><b> Secure Operation: -</b> When set to 'Yes', SBBSecho will compare the origin of any - incoming mail packets to the nodes in the AREAS.BBS file - as messages are imported. If a packet password has been - defined for that node, it will also be compared to the - password contained in the mail packet. Packets and messages - failing this security will not be imported.</pre> -<pre><b> Swap for Executables: -</b> SBBSecho relies on external executable programs for extracting - and compressing mail bundles. This option tells SBBSecho to - swap out of memory when running any of these executables, - giving the executable programs more free memory to run in. - This option is only used in the 16-bit DOS flavor of SBBSecho.</pre> -<pre><b> Fuzzy Zone Operation: -</b> Some mail programs do not create netmail messages with zone - information (INTL kludge line) or may only do so when sending - between zones. This is a problem for systems that receive - netmail for multiple addresses with different zones (AKAs with - different zone numbers). Setting this option to "Yes" allows - SBBSecho to guess what the correct originating and destination - zone is based on the net and node portions of the destination - address in netmail message.</pre> -<pre><b> Store PATH Lines in Message Base: -</b> When set to 'Yes', SBBSecho will store the PATH lines from - incoming echomail in the Synchronet message base headers (not - the body text). This option is useful for troubleshooting - routing/duplicate message problems.</pre> -<pre><b> Store SEEN-BY Lines in Message Base: -</b> When set to 'Yes', SBBSecho will store the SEEN-BY lines from - incoming echomail in the Synchronet message base headers (not - the body text). This option is useful for troubleshooting - routing/duplicate message problems. - -<b> Store Unknown Kludge Lines in Message Base: -</b> When set to 'Yes', SBBSecho will store any unknown kludge lines - from incoming echomail in the Synchronet message base headers. - This option is useful for troubleshooting problems.</pre> -<pre><b> Allow Nodes to Add Areas in the AREAS.BBS List: -</b> When set to 'Yes', SBBSecho will allow nodes to add areas - (via area manager) which are listed in the AREAS.BBS list. - When set to 'No', SBBSecho will only allow nodes to add areas - from any additionally configured echo lists which they have - access to. - -<b>Archive Programs... -</b> This option allows you to add or remove archive programs from SBBSecho. - Selecting this option will bring you to the following menu:</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_archiveprgs.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre> At the Archive Programs... sub-menu, pressing the INSert key will allow - you to add a new archive program. Pressing the DELete key will remove - the currently highlighted archive program. And pressing ENTER on the - currently highlighted archive program will allow you to edit the - options for that particular program from a menu like the following (note - that the name of the archive program you are editing appears at the top - of the window):</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_archiveprgs_zip.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre><b> Packer Name: -</b> This is the name that will be used to reference this particular - archiving program. This is also the name that should be used - by nodes using areamanger to change their compression type - remotely.</pre> -<pre><b> Hexadecimal ID: -</b> This is a hexadecimal identifier that SBBSecho should look for - when determining the compression type used on incoming bundles. - In this example we are looking for the ID 'PK', '50' is the - hexadecimal value for the letter 'P' and '4B' is the - hexadecimal value for the letter 'K'.</pre> -<pre><b> Offset to Hex ID: -</b> This is the byte offset (from the beginning of the file) where - the hexadecimal ID for this archive program can be located. - In this example we are looking at an offset of 0 bytes from the - beginning of the file. - -<b> Pack Command Line: -</b> This is the command line used by this archiving program for - compressing files. The '%f' command line specifier will expand - to the name of the compressed file, the '%s' command line - specifier will expand to the name of the file being compressed.</pre> -<pre><b> Unpack Command Line: -</b> This is the command line used by the archiving program for - Uncompressing files. The '%f' command line specifier will - expand to the name of the compressed file, the '%s' command - line specifier will expand to the path where the file is - being extracted to. - -<b>Additional Echo Lists... -</b> This option allows you to add and remove additional echo lists which - can be used by SBBSecho for area manager add requests. Normally these - will be used in addition to your AREAS.BBS file. If you have the - toggle option 'Allow Nodes to Add Areas in the AREAS.BBS List' set to - 'No', you MUST create at least one additional echo list if you wish - to allow other nodes to add areas via area manager requests.</pre> -<pre> Selecting this option will bring you to a sub-menu listing any - additional echo lists you currently have defined:</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_additionalecho.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre> Pressing the INSert key will allow you to add a new echo list, pressing - the DELete key will remove the currently highlighted echo list, and - pressing ENTER on the currently highlighted echo list will allow you to - edit information about that list:</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_additionalecho_list.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre><b> Echo List Path/Name: -</b> This is the full path and filename of the echo list you are - defining. This list should contain the areatag names of areas, - one per line, with any comments separated from the areatag by - at least one space.</pre> -<pre><b> Hub Address: -</b> This is the address of the hub of the conferences contained - in this list. If an area is remotely added from this list - (using Areafix) this address is automatically added to the - AREAS.BBS file.</pre> -<pre><b> Forward Password: -</b> This is the area manager password to use when forwarding - requests. - -<b> Forward Requests: -</b> Setting this option to 'Yes' will cause SBBSecho to send a - request to the Hub Address specified to turn on an area from - this list. This happens when users remotely add areas using - Areafix and is not necessary if you are already receiving the - conferences in this list (i.e.: from Planet Connect). -</pre> -<pre><b> Echo List Flags: -</b> These are the flags required for a node to be able to gain - access to this particular echo list. These flags are defined - for each node from the 'Nodes...' sub-menu.</pre> -<pre> Selecting this option will bring you to a sub-menu where you - may add and remove flags for this echo list.</pre> -<blockquote> - <blockquote> -<pre><img border="0" src="images/sbbsecho_additionalecho_list_tag.gif" width="652" height="331"></pre> - </blockquote> -</blockquote> -<pre><b><a href="#TOC">Back to Table of Contents</a></b></pre> -<h2><a name="RunningSBBSecho">Running SBBSecho</a></h2> -<pre>The command line for executing SBBSECHO is very similar to SBBSFIDO, although -some command line switches have been eliminated.</pre> -<pre>We suggest you use the following command lines:</pre> -<pre>For importing:</pre> -<pre> <b>C:\SBBS\EXEC\SBBSECHO /LES!</b></pre> -<pre>For exporting (Attach Mailer):</pre> -<pre><b> C:\SBBS\EXEC\SBBSECHO /LIN</b></pre> -<pre>For exporting (FLO Mailer):</pre> -<pre><b> C:\SBBS\EXEC\SBBSECHO /LINF</b></pre> -<pre>Remove all references to SBBSFIDO from your batch files (if you have any). -See the included MAILER.BAT as an example.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="CommandLineSwitches">Command Line Switches</a> -</h2> -<pre><b>usage: sbbsecho [cfg_file] [/switches] [sub_code]</b></pre> -<pre>where: cfg_file is the filename of config file (default is ctrl\sbbsecho.cfg) - sub_code is the internal code for a sub-board (default is ALL subs)</pre> -<pre>SBBSecho will execute normally (for Attach Mailer operation) with NO command -line switches required. Command lines switches are used to cause SBBSecho to -_do_ or _not_ do specific operations. When used, command line switches -are prepended by a slash (/) character. Multiple switches can be specified -in one grouping (multiple /switch sets are supported, but not required). -Switch letters are not case sensitive. The available switch letters and their -descriptions are:</pre> -<pre>P: Do not import inbound packets or extract inbound bundles -X: Do not delete inbound packets (*.PKT) after they're imported -N: Do not import inbound netmail (packetized netmail and *.MSG) -D: Do not delete inbound netmail (*.MSG) after they're imported -I: Do not import inbound echomail -E: Do not export outbound echomail -M: Ignore echomail pointers (export all locally created echomail messages) -U: Update echomail pointers only (export no echomail messages) -T: Do not update echomail pointers (test export) -H: Export all echomail messages (including messages imported from FidoNet) -J: Ignore received bit on netmail (import even though flagged as received) -L: Create log file (data\sbbsecho.log) -R: Create report of import totals (text\sbbsecho.msg) -B: Import locally created netmail too (ignore the local flag) -A: Export ASCII characters only (override individual sub-board ex-ASCII strip) -F: Create packets for outbound netmail (necessary for FLO Mailer operation) -G: Generate notify lists -Y: Import netmail for unknown users to sysop (user #1) -O: Import all netmail regardless of destination address (unless flagged local) -S: Import private echomail override (strip private flag) -=: Change existing tear lines to === when exporting -!: Notify users via telegram of received echomail messages</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="AREAFIXCommands">AREAFIX Commands</a> -</h2> -<pre>Remote area manager, or areafix, commands are used by uplinks to be able to -turn echo areas off and on, list currently connected areas, and more.</pre> -<pre>The following text is from the file AREAMGR.HLP which, after installation of -SBBSecho, should be located in your Synchronet EXEC directory. It lists the -area manager commands available to the nodes which have been configured using -the ECHOCFG program:</pre> -<pre>Address all requests to 'SBBSecho' or 'AreaFix' (without quotes). -Your Area Manager password goes on the subject line.</pre> -<pre>In the body of the message to Area Manager:</pre> -<pre>[+]<areaname> Connect an area --<areaname> Disconnect an area -%HELP Request this message -%LIST Request a list of areas available to you -%QUERY Request a list of areas to which you are connected -%UNLINKED Request a list of areas to which you are not connected -%COMPRESSION <type> Change the compression type (ARC/ARJ/LZH/PAK/SQZ/ZIP/ZOO) -%PASSWORD <password> Change your AreaMgr password -%RESCAN Request a rescan of newly added areas -%ACTIVE Reconnect all temporarily disconnected areas -%PASSIVE Temporarily disconnect all connected areas -%FROM <address> Remote maintenance, must be the first command -%+ALL Connect all available areas -%-ALL Disconnect all areas -[---] Everything below the tear line is ignored</pre> -<pre>NOTE: A compression type of NONE is also supported for uncompressed packets.</pre> -<pre><b><a href="#TOC">Back to Table of Contents</a></b></pre> -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> -</body> - -</html> diff --git a/docs/security.html b/docs/security.html deleted file mode 100644 index d0d9674947..0000000000 --- a/docs/security.html +++ /dev/null @@ -1,568 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>ARS Security</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> - -<h2><a name="Introduction">[7.1] - Introduction to ARS -Security</a></h2> -<pre>ARS stands for Access Requirement Strings. Access requirement strings are used -to specify the requirements of a user to have access to features/sections of a -Synchronet BBS. The string can consist entirely of English key words and -numbers or use short-hand symbols to fit a large number of security -requirements into the 40 character space allowed for access requirement -strings. Short-hand symbols and key words may be used interchangeably and -combined in the same string. For clarity, it is suggested you use the key words -whenever possible. The string syntax is as follows: - -<b>usage: [not] [parm] [not] [equal] <value> [or] [and] [...]</b> - -<i>where:</i> <b>not</b> is the word "NOT" or the symbol '!' to specify reverse logic - <b>parm</b> is one of any keywords (or short-hand symbols) that specifies - a specific required parameter (default is LEVEL) - <b>equal</b> is the word "EQUAL", "EQUALS", the words "EQUAL TO", or the - symbol '=' to specify exact equality required - <b>value</b> the required value (for either minimum requirement or equality) - <b>or</b> the word "OR" or the symbol '|' used to specify that ANY of two - or more parameter values MAY be met to match the requirement - <b>and</b> the word "AND" or the symbol '&' may be used for clarity in - reading when specifying that two or more parameter values MUST - be met to match the requirement</pre> -<h2><a name="Keywords/Symbols">[7.2] - Key words and Symbols</a></h2> -<pre><b>Key word Symbol Description -</b>------------------------------------------------------------------------------ -AND & More than one requirement (optional) -NOT ! Logical negation (e.g. NOT EQUAL) -EQUAL = Equality required -OR | Either of two or more parameters is required -AGE $A User's age (years since birthdate, 0-255) -ANSI $[ User has ANSI terminal (no value argument) -BPS $B User's current connect rate (bps) -CREDIT $C User's number of credits in Kilobytes (0-65535) -DAY $W Day of the week (Sun, Mon, Tue, etc. or 0-6) -DIR $J Current file directory (Internal code or 1-65535) -DOS Current node is running SBBS4DOS (no value argument) -EXEMPT $X Exemption flag (A-Z) -EXPERT User is in expert menu mode (no value argument) -EXPIRE $E Days till user account expires (0-65535) -FILE_CMDS Number of executed file menu commands (0-65535) -FLAG $F User's flag (1-4) and (A-Z) -GROUP $M Current message group (1-65535) -LASTON $Y Days since last logon (0-65535) -LEVEL $L User's level (0-99) -LIB $I Current file library (1-65535) -LOCAL $G Logged on locally (no value argument) -MAIN_CMDS Number of executed main menu commands (0-65535) -NODE $N Current node (1-250) -OS2 Current node is running SBBS4OS2 (no value argument) -PCR $P User's post/call ratio (0-100) -QUIET User is in quiet mode -RANDOM $Q Random number between 0 and value argument (0-65535) -REST $Z Restriction flag (A-Z) -RIP $* User has RIP terminal (no value argument) -SEX $S User's sex/gender (M or F) -SUB $H Current message sub-board (Internal code or 1-65535) -SYSOP User has level 90 or temp sysop (no value argument) -TIME $T Time of day (HH:MM, 0-23:59) -TLEFT $R User's time left online (minutes, 0-255) -TUSED $O User's time online this call (minutes, 0-255) -UDR $K User's upload/download ratio (0-100) -UDFR $D User's upload/download file ratio (0-100) -USER $U User's number (1-xxxx) -WIP User has WIP compatible terminal (no value argument)</pre> -<h2><a name="GeneralUsageExamples">[7.3] - ARS General Usage Examples</a></h2> -<pre><b>General Example #1</b> - -LEVEL 60 - -This string specifies that only users with a level of 60 OR HIGHER meet this -requirement. The space between the level and the required value is optional: - -LEVEL60 - -is functionally equivalent, but doesn't read as well. You may also use short -hand symbols in place of key words to save space: - -$L 60 - -is also functionally equivalent. Once again, the space between the short hand -symbol and the required value is optional. If a parameter is not specified, -the requirement is assumed to be LEVEL. So the following string: - -60 - -is also valid and evaluates the same as the above strings. - -<b>General Example #2</b> - -NOT LEVEL 60 - -This string specifies that only users with a level BELOW 60 will meet the -requirement. The "NOT" key word can be include before or after the parameter: - -LEVEL NOT 60 - -evaluates identically to the first string in this example. - -Short-hand symbols may be used to abbreviate the string: - -LEVEL !60 - -$L!60 - -!60 - -have exactly the same meaning as the first string in this example. - -<b>General Example #3</b> - -LEVEL EQUAL 60 - -This string specifies that only users with a level EQUAL TO 60 will meet -this requirement. The key word "EQUALS" or the combination "EQUAL TO" may -be used in place of "EQUAL" if preferred: - -LEVEL EQUALS 60 - -and - -LEVEL EQUAL TO 60 - -are both functionally equivalent to the first string in this example. Again, -short-hand symbols may be used to make the string shorter: - -LEVEL = 60 - -evaluates identically to the above example strings and the space on either side -of the '=' symbol are also optional: - -LEVEL=60 - -is valid and may be preferred by some sysops. Since level is the default -parameter type, the following string is also valid: - -=60 - -<b>General Example #4</b> - -LEVEL 60 AND FLAG 1A - -This string indicates that the user must have a level of 60 or higher AND have -the flag 'A' from flag set #1. The user must meet both requirements in order to -be considered as meeting all the requirements of the string. The "AND" portion -of the string is only included for clarity in reading and is optional: - -LEVEL 60 FLAG 1A - -has the same meaning, but may be confusing when read. When specifying a flag -from flag set #1, the set number may be eliminated: - -LEVEL 60 AND FLAG A - -is functionally the same and is the preferred method of referring to flags from -flag set #1. When specifying the flag set, spaces can be on either side of -the number, or eliminated entirely: - -LEVEL 60 AND FLAG1 A - -and - -LEVEL 60 AND FLAG 1 A - -and - -LEVEL 60 AND FLAG1A - -have the same meaning as the first string in this example, but are probably -not as easy to read as the second string in this example. - -The following strings all have the same meaning as the first string in this -example but have been shortened using symbols and other short-cuts: - -LEVEL 60 & $F A - -$L60 AND $FA - -$L60$FA - -60$FA - -but for reasons of clarity, the first string is preferred if space allows. - -<b>General Example #5</b> - -SEX F OR LEVEL 90 - -This string specifies that the user must be of FEMALE gender OR have a level -of 90 or higher. The following strings are functionally equivalent to the -above: - -SEX F | LEVEL 90 - -SEXF|LEVEL90 - -$SF | $L90 - -$SF|$L90 - -<b>General Example #6</b> - -USER NOT EQUAL TO 20 - -This string specifies that user #20 will not meet the requirement. - -Shortened using symbols: - -$U!=20 - -<b>General Example #7</b> - -BPS 9600 OR NOT TIME 19:00 - -This string specifies that the user must be connected at 9600bps or higher, -OR the time of day must be before 7pm. The value for the TIME parameter -is in the format 24 hour format of HH:MM. If the specified time is on an even -hour, then ":00" portion may be omitted: - -BPS 9600 OR NOT TIME 19 - -has the same meaning. - -You may also omit the "00" from the BPS value to shorten the string: - -BPS 96 OR NOT TIME 19 - -Shortened versions: - -$B 9600 OR NOT $T19 - -BPS9600|!TIME19 - -$B96|!$T19 - -<b>General Example #8</b> - -BPS 9600 OR TIME NOT 18:00 OR TIME 21:30 - -This string specifies that the user must be connected at 9600bps or higher, -OR the time of day must be before 6pm, OR the time of day must be after -9:30pm. - -When specifying multiple parameters of the same type consecutively (in this -example, two of the required parameters are "TIME"), the parameter does -not need to be restated. For example, the string: - -BPS 9600 OR TIME NOT 18:00 OR 21:30 - -has the same meaning as the first string in this example. - -Shortened versions: - -$B 9600 OR NOT $T 18 OR 21:30 - -$B96|$T!18|21:30 - -<b>General Example #9</b> - -FLAG A OR FLAG B OR FLAG C OR LEVEL 90 - -The above string specifies that a user must have flag A, flag B, flag C, (all -from flag set #1) or a level of 90 or higher to meet the requirement. Using the -"sticky" parameter type feature of AR Strings, we can shorten the line: - -FLAG A OR B OR C OR LEVEL 90 - -Utilitizing symbols, we can shorten it even further: - -FLAG A|B|C OR LEVEL 90 - -Taking it to extremes: - -$FA|B|C|$L90 - -<b>General Example #10</b> - -USER EQUALS 145 OR LEVEL 90 - -This string indicates that user number 145 will meet the requirement and all -users with level 90 and higher (sysops). - -Best shortened as: - -USER=145 OR LEVEL 90 - -For ultimate compression: - -$U=145|$L90 - -<b>General Example #11 -</b> -LEVEL 60 AND FLAG X AND FLAG Y AND FLAG Z - -Compressed examples: - -LEVEL 60 AND FLAG X AND Y AND Z - -LEVEL 60 AND FLAG X Y Z - -LEVEL 60 FLAG XYZ - -LEVEL60 FLAGXYZ - -$L60 $FXYZ - -60$FXYZ - -<b>General Example #12 -</b> -FLAG 2A OR FLAG 2B OR FLAG 4Z - -This string specifies that the user must have either flag 'A or 'B' from flag -set #2, or flag 'Z' from flag set #4. Using the "sticky" parameter type -feature, this could be shortened to: - -FLAG 2A OR B OR FLAG 4Z - -If the flag set is not #1, you MUST specify the flag set number when using -the FLAG keyword. - -Example: - -FLAG 2A OR FLAG B OR FLAG 4Z - -is NOT the same as the first two strings in this example. The second flag (B) -would be considered as from flag set #1, since a flag set number was not -specified. - -Correct and shortened version: - -FLAG2A|B OR FLAG4Z - -$F2A|B|$F4Z - -Note: Multiple flag sets were developed for advanced sysops who found that - the 26 flag limitation (A-Z) was insufficient and requested additional - flag capabilities. Most sysops will probably not find it necessary to - use more than 26 flags, and therefore have no need for flag sets 2 - through 4. - -<b>General Example #13</b> - -NOT FLAG 2G - -This string specifies that the user most not have flag 'G' from flag set #2. -The NOT keyword can appear in several places in this string while keeping -the exact same meaning: - -FLAG NOT 2G - -FLAG 2 NOT G - -Condensed versions: - -!$F2G - -$F!2G - -$F2!G</pre> -<h2><a name="NestingExpressions">[7.4] - Nesting Expressions</a></h2> -<pre>All of the above string examples have been single expressions that evaluate to -either true of false. Sometimes, you may wish to require access to an area -using "nested" logic. - -Example: If the user is level 90+, OR the user has the A flag, AND is 21+ - years of age or older. - -The above example could be read two ways. - -1: The user must have level 90+, and either the A FLAG or be 21+ years old. - -2: The user must be 21+ years old and have either the A FLAG or level 90+. - -To clarify which of the above methods were intended, we use parentheses to -separate the two true/false expressions. - -1: LEVEL 90 OR (FLAG A AND AGE 21) - -2: (LEVEL 90 OR FLAG A) AND AGE 21 - -Strings 1 and 2 are interpreted differently and correlate to the above two -English logic statements. - -Whenever using a combination of AND and OR logic, nested expressions are -required. The following string: - -LEVEL 90 OR FLAG A AND AGE 21 - -is INVALID and would most likely NOT produce the desired results. - -Expressions may be nested, using parenthesis, as deep as is required. - -Example: - -((LEVEL 80 OR FLAG S) AND AGE 18) OR LEVEL 90 - -is a VALID string that would evaluate with the following: - -User with level of 80 and age 17 would not qualify -User with level of 80, flag S and age 17 would not qualify -User with level of 80 and age 18 would qualify -User with flag S and age 18 would qualify -Any user with level 90+ would qualify regardless of age or flags</pre> -<h2><a name="NestedLogicExamples">[7.5] - ARS Nested Logic Examples</a></h2> -<pre><b>Nested Example #1 -</b> -BPS 9600 OR (BPS 2400 AND TIME NOT 15:00) - -User must be connected at 9600bps or higher, OR be connected at 2400bps or -higher and the time of day being before 3pm. 9600bps and higher callers would -always meet this requirement. 2400-7200bps callers will only meet this -requirement between 12:00 midnight and 3pm in the afternoon. 1200bps and slower -callers would never meet this requirement. - -Note, that when nesting expressions, the parameter type DOES NOT stick from -one expression to another. Example: - -BPS 9600 OR (2400 AND TIME NOT 15:00) - -Is an INVALID string. The 2400 would be interpreted as a LEVEL requirement -since it is as the beginning of a new expression and LEVEL is the default -parameter type. - -The first (correct) string in this example, can of course also be shortened -using symbols (and eliminating the AND key word): - -$B9600|($B2400$T!15) - -<b>Nested Example #2</b> - -(SEX M AND AGE 21) OR (SEX F AND AGE 18) - -This string specifies that only male users of 21 years and older and female -users of 18 and older will meet the requirement. - -Shortened Example: - -($SM$A21)|($SF$A18) - -The logic of the above string is more verbose than necessary and could be -reduced to: - -AGE 21 OR (SEX F AND AGE 18) - -producing the same results. - -<b>Nested Example #3<u> -</u></b> -(BPS 2400 AND PCR 20) OR LEVEL 90 - -This string would indicate that users of any level will have access if they -are connected at 2400bps and have a Post/Call ratio of 20% or higher - OR -the users has as least level 90 (sysop). - -Utilizing the default parameter type of level, the LEVEL key word can be -omitted: - -(BPS 2400 AND PCR 20) OR 90 - -to create a functionally equivalent, though more confusing, AR string. - -A better way to shorten the string would be to eliminate the AND keyword -and use symbols: - -($B 2400 $P 20) | $L 90 - -Eliminating the spaces creates an even more compact string: - -($B2400$P20)|$L90 - -<b>Nested Example #4<u> -</u></b> -NOT (USER=1 OR USER=20) - -All users will meet this requirement accept user #1 and user #20. - -The above string could also be stated in a non-nested format with the same -results: - -NOT USER=1 AND NOT USER=20 - -though the meaning is not quite as clear, they are functionally the same. - -Note: The second method requires 2 bytes less in raw logic storage because it - is not nested and will be interpreted slightly faster (by a matter of - microseconds). Just in case you were wondering... - -<b>Nested Example #5<u> -</u></b> -LEVEL 90 OR (TIME 12:00 AND TIME NOT 18:00) - -Users with level 90 or higher will always meet this requirement. Users with -levels below 90 will only meet this requirement between 12 noon and 6pm. - -Re-arranged: - -(TIME 12:00 AND TIME NOT 18:00) OR LEVEL 90 - -the string has exactly the same meaning. Eliminating the unnecessary occurrence -of the second "TIME" parameter shortens the string while keeping it easily -readable: - -(TIME 12:00 AND NOT 18:00) OR LEVEL 90 - -Maximum compression: - -($T12!18)|90</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/smb.html b/docs/smb.html deleted file mode 100644 index 5b93317cb9..0000000000 --- a/docs/smb.html +++ /dev/null @@ -1,2946 +0,0 @@ - -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Synchronet Message Base Specification</title> -</head> - -<body> -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<h1><a name="top">Synchronet Message Base Specification</a> -<i>Version 1.21</i></h1> -<h4><a name="toc"><b>Table of Contents</b></a></h4> -<div align="left"> - <pre><a href="#Introduction">Introduction</a> -<a href="#Implementation Levels">Implementation Levels</a> -<a href="#Definitions">Definitions</a> - <a href="#Acronyms:">Acronyms</a> - <a href="#Data types">Data Types</a> -<a href="#File Formats">File Formats</a> - <a href="#Index File (*.SID)">Index</a> (*.SID) - <a href="#Header File (*.SHD)">Header</a> (*.SHD) - <a href="#Message Header Block Allocation (*.SHA)">Header Allocation</a> (*.SHA) - <a href="#Message Data (*.SDT)">Data</a> (*.SDT) - <a href="#Message Data Block Allocation (*.SDA)">Data Allocation</a> (*.SDA) - <a href="#CRC history for duplicate message checking (*.SCH)">CRC History</a> (*.SCH) -<a href="#Header Field Types:">Header Field Types</a> -<a href="#Data Field Types:">Data Field Types</a> -<a href="#Message Attributes:">Messsage Attributes</a> -<a href="#Translation Types:">Translation Types</a> -<a href="#Agent Types:">Agent Types</a> -<a href="#Network Types:">Network Types</a> -<a href="#Media Types:">Media Types</a> -<a href="#Message Storage Pseudo Code">Message Storage Pseudo Code</a> -<a href="#Message Retrieval Pseudo Code">Message Retrieval Pseudo Code</a> -<a href="#SMBUTIL">SMBUTIL</a> -<a href="#CHKSMB">CHKSMB</a> -<a href="#FIXSMB">FIXSMB</a> -<a href="#SMBLIB">SMBLIB (C library)</a> - <a href="#SMBDEFS.H">Data Types and Constants</a> (SMBDEFS.H) - <a href="#SMBVARS.C">Global Variables</a> (SMBVARS.C) - <a href="#SMBLIB.H">Function Prototypes</a> (SMBLIB.H) - <a href="#SMBLIB.C">Library Functions</a> (SMBLIB.C) - <a href="#Miscellaneous SMBLIB Files">Miscellaneous</a> (CRC*.* and LZH.*) -<a href="#SMBLIB Storage Example">SMBLIB Storage Example</a> -<a href="#SMBLIB Retrieval Example">SMBLIB Retrieval Example</a> -<a href="#SMBLIB Performance Issues">SMBLIB Performance Issues</a> -<a href="#Bibliography">Bibliography</a></pre> -</div> -<h2><u><a name="Introduction">Introduction</a></u></h2> -<pre><b><i>Q. What is SMB?</i></b></pre> -<pre>A. SMB (Synchronet Message Base) is a technical specification for the storage - format of electronic mail messages. These e-mail messages may all be - contained in one database, or, more commonly, separated into categorized - databases. These message databases (or message bases) are also referred to - as "sub-boards", "forums", "conferences", and "SIGs". The messages may be - directed to an individual person, sent to a group of individuals, or sent - to everyone who can read messages in that message base. Messages may be - created and read solely at one physical location, or imported from and - exported to a message network that may span continents. Message bases that - are connected to a message network are often called "echoes". -</pre> -<pre><b><i>Q. Why SMB?</i></b></pre> -<pre>A. The Synchronet Message Base is designed to store high volumes of messages - while maintaining optimum search, retrieval, and creation performance. - These messages are not limited to mere text. In addition to text, SMB - defines the storage of digitized sound, MIDI, graphics, fonts, animation, - as well as other multimedia data and triggers for localized multimedia. - SMB thrives on a multi-user environment where messages are being created, - read, modified, and deleted by multiple tasks simultaneously. With the - large message networks of today being the rule, rather than the exception, - and high volumes of messages being imported on a daily, sometimes hourly - basis, creation and deletion speed is of the utmost importance. This is - where SMB really shines. Being extensible enough to handle message formats - from networks of today and tomorrow, and fast enough to import more messages - that humanly readable, the SMB format will more than meet your message - storage needs. -</pre> -<pre><b><i>Q. Why a specification?</i></b></pre> -<pre>A. Message bases are often accessed and modified by a number of different - programs. Often these programs are developed by individuals or companies - other than the original designer of the message base format. This - specification is an attempt to aid developers in creating programs that - access or modify a message base stored in the SMB format. -</pre> -<pre><b><i>Q. Who can use this specification?</i></b></pre> -<pre>A. Anyone that has interest in the Synchronet Message Base format at either - an educational or professional level. Specifically, software developers - interested or currently involved in the development of message readers, - editors, echomail (toss/scan) programs, message transfer agents (MTAs), - network gateways, and bulletin board systems. Much of the information in - this specification is intended for those with preexisting programming - knowledge, so those with little or no programming experience may find it - hard to comprehend.</pre> -<pre><b><i>Q. What does the SMB specification include?</i></b></pre> -<pre>A. The text you are reading is part of the SMB specification: a single text - document that defines the storage format of each of the six files of an - SMB format message base and how they are related to each other.</pre> -<pre> Included with this specification is C source code to be used as an example - to programmers of how to access an SMB format message base and public domain - library functions (SMBLIB) that can be compiled and linked into programs - that access an SMB format message base developed by third parties. An SMB - utility program (SMBUTIL) is also included with C source code as an example - of how to use the SMBLIB functions. -</pre> -<pre><b><i>Q. Where did the SMB specification come from?</i></b></pre> -<pre>A. Digital Dynamics (southern California based software development company) - released "Synchronet Multinode BBS Software Version 1a" in June of 1992 as - one of the first BBS packages to be designed from the ground-up to operate - in a multi-node environment with incredible speed and reliability, with a - large suite of multi-node specific features and design innovations.</pre> -<pre> The original message base format was designed with localized messaging and - low volume message networks in mind. By January of 1993, it was clear that - high volume message networks (FidoNet, RelayNet, Usenet, etc.) were the - preference of most BBS users and a new message base format was required to - allow for high volume message storage, improved storage, retrieval, and - maintenance performance, as well as lower storage space requirements.</pre> -<pre> Rather than introduce another new message format, Digital Dynamics sought - to implement an existing public specification for a format that would meet - current and future message storage needs. More than a few specifications - were seriously considered at one time or another, but after careful - examination, design flaws and lack of extensibility eliminated them from the - long term plans of Digital Dynamics and Synchronet BBS Software. Thus began - the design of the "Synchronet Message Base" (SMB) format.</pre> -<pre> At the request of many message related program developers, Digital Dynamics - created and released the SMB specification before the release of "Synchronet - Version 2.00" to allow lead-time on developing support programs for the new - format.</pre> -<pre> Digital Dynamics strongly encourages developers of message related programs - (including software that directly competes with Synchronet or other Digital - Dynamics products) to implement support for SMB. Though this is a public - specification and Digital Dynamics encourages developer suggestions, it will - remain under the sole control of Digital Dynamics unless specifically stated - otherwise in a future revision of this specification.</pre> -<pre> Digital Dynamics requests that any organizations that wish to adopt or - ratify this specification, in part or whole, notify Digital Dynamics through - any of the contact methods listed at the beginning of this document.</pre> -<pre><b><i>Q. How does SMB store messages?</i></b></pre> -<pre>A. Each message base is stored in a set of binary files. This set consists - of between three and six files depending the storage method used. The base - filename (maximum of eight characters under DOS) is the same for all six - files of the same message base and unique among the filenames of other - message bases in the same directory. The six files each have a different - three character extension. The first character of the extension is always - the letter 'S' (for SMB), while the second and third characters define the - contents of the file.</pre> -<pre> Two of the six files associated with each message base are not re-creatable - and therefore are the most important when considering data integrity. These - two files are the data file (with a .SDT extension) and header file (.SHD - extension). Both of these files use 256 byte blocks and have associated - block allocation tables (stored in .SDA and .SHA respectively) so that - deleted message blocks may be used by new messages without creating odd - sized unused 'holes' in the files. The block allocation table files (.SDA - and .SHA) can be recreated with the information stored in the header (.SHD) - file. When using Hyper Allocation storage method, the allocation files (.SDA - and .SHA) are not used.</pre> -<pre> For fast indexing, there is a small fixed length index file (with a .SID - extension). This file allows for the immediate location of message header - records based on sender's name or user number, recipient's name or user - number, subject, message number, or message attributes. This file can be - recreated with the data stored in the header (.SHD) file.</pre> -<pre> The last file is an optional CRC history (.SCH) file. It contains 32-bit - CRCs of a configurable number of messages imported or created locally. This - is to help eliminate duplicate messages created by user or program error. - The CRC history file can be recreated with the combination of information - stored in the data (.SDT) and header (.SHD) files. - -<b><i>Q. How fast do messages import into an SMB message base?</i></b></pre> -<pre>A. This is a very important question for systems for that import large volumes - of messages. Of course, the answer depends on the storage format which you - are importing from, the average length of messages, the design of the - program which is performing the import process, as well as the hardware and - system software being used. What's important is that SMB will allow the - fastest import process possible with any given combination of the above - factors.</pre> -<pre> Since system storage capacity is rarely infinite, neither is the number - of messages which can be stored in a message base. System operators must - define the maximum number of messages to be stored in a message base, the - maximum age of the messages in that message base, or a combination of both. - When using the Self-packing storage method (defined later in this document), - the smaller the number of messages stored in a message base, the faster the - import process. The SMB format is flexible enough to support multiple levels - of import performance based on optimizations for storage space or speed. - Most system operators will almost invariably choose speed over space, but - which choices are available is determined by the importing program. This - specification defines three storage methods, from slowest to fastest: - Self-packing, Fast Allocation, and Hyper Allocation. Other options defined - in this specification may affect storage performance, including duplicate - message checking and message compression/encryption. -</pre> -<pre><b><i>Q. How much storage is required for an SMB message base?</i></b></pre> -<pre>A. The biggest factor in determining storage requirements for a message base - is the maximum number of messages to be stored in the base (defined by the - system operator) and the average size of each message. The minimum required - storage for a message base is 32 bytes plus 532 bytes per message (plus four - bytes per message if duplicate message checking is used and three bytes - per message if Self-packing or Fast Allocation storage methods are used).</pre> -<pre> The SMB format was originally designed to be "self-packing", meaning purged - (deleted) message header and data blocks will be used automatically by new - messages. Relying solely on self-packing, an SMB format message base will - never "shrink" in size. This is not to say that it will continually "grow" - in size, but that without specific packing procedures, deleted message - blocks may remain unused for extended periods of time, meanwhile using some - amount of storage space that could be recovered using specific packing - procedures. The Fast Allocation and Hyper Allocation storage methods do not - use deleted message blocks for new messages so specific packing procedures - must be used if any messages are deleted and that storage space is to ever - be recovered.</pre> -<pre> Limiting the maximum age of messages in an SMB message base is another way - to control the storage requirements. While maximum message age definition is - optional, the definition of the maximum number of messages is not. - -<b><i>Q. How many messages can be stored per SMB message base?</i></b></pre> -<pre>A. Without considering storage limitations or message data lengths greater than - 256, the theoretical maximum number of messages that can be stored in a - single SMB message base is 16.7 million. Considering the variable length - nature of message and header data, it is suggested that the system operator - allow no more than 1 million messages per base.</pre> -<pre> To determine an estimated maximum number of messages for a message base - using the average message data length as a factor, use the following - formula:</pre> -<pre> 4.2 billion divided by the average message length rounded up to be evenly - divisible by 256.</pre> -<pre> If the average message data length is 1500 bytes, the estimated maximum - number of messages would be 2,734,375 (4.2 billion divided by 1536).</pre> -<pre> Implementations of this format may be further limited by available system - memory.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Implementation Levels">Implementation Levels</a></u></h2> -<pre>The SMB format can be implemented to varying degrees between programs without -creating compatibility issues. Rather than have developers specifically state -which features they have and have not implemented, we have defined seven levels -of implementation (represented by Roman numerals I through VII). For a program -or software package to meet an implementation level, it must have all of the -features listed for that level and all of those for each level below it. The -minimum suggested implementation is level I. The SMBUTIL program included with -this specification is an example of a level I implementation with features -from some of the higher implementation levels.</pre> -<pre><b><u>Level I</u></b> - -The minimum suggested level of implementation. Messages contain merely ASCII -text displayable on an ANSI terminal. Messages can be added to the message -base and if the maximum number of messages is exceeded, messages are removed -or marked for deletion.</pre> -<pre><b><u>Level II</u></b> - -The addition of file attachments, multiple index/header entries per message -(multiple destinations), multiple text bodies for the separation of message -text and tag/origin lines (for example), forwarding, threading, and specific -FidoNet kludge header field support makes this level of implementation more -realistic for bulletin board system and EchoMail software implementation.</pre> -<pre>Synchronet Multinode BBS Software v2.00 has a level II implementation of this -specification.</pre> -<pre><b><u>Level III</u></b> - -This implementation adds support for translation strings defined later in this -document for data compression, encryption, escaping, and encoding. This level -is still limited to basic ASCII text and ANSI escape sequence entry and -retrieval.</pre> -<pre>Synchronet Multinode BBS Software v2.10 has a level III implementation of this -specification.</pre> -<pre><b><u>Level IV</u></b> - -The storage and retrieval of embedded and attached images is added in this -level of implementation. Supported images are limited to single binary or text -data blocks that can be displayed or transferred to the user (automatically, -or by request) if their display and translation protocols define specific -support for the image type. - -<b><u>Level V</u></b> - -This level of implementation adds support for embedded and attached sound data. -This includes digitized sound and MIDI data. Supported sounds are limited to -single binary or text data blocks that can be played or transferred to the user -(automatically or by request) if their presentation and translation protocols -define specific support for the sound type.</pre> -<pre><b><u>Level VI -</u></b> -Localized sound and image data can be triggered by messages stored and -retrieved in an implementation of this level.</pre> -<pre><b><u>Level VII</u></b> - -Complete multimedia support is reached in this implementation level with -support for embedded and attached animation, sound, and video data.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Definitions">Definitions</a></u></h2> -<pre><u><b>Control Characters</b></u></pre> -<pre>When specifying control characters (ASCII 1 through 31), the caret symbol "^" -or the abbreviation "ctrl-" followed by a character will be used to indicate the -value. ^A is equivalent to ASCII 1, ^B ASCII 2, etc. The case of the control -character is not significant (i.e. ^z and ^Z are equivalent). The control -character ^@ (ASCII 0) will be specified as NULL or 0. -</pre> -<pre><b><u>Hexadecimal</u></b> - -Base sixteen numbering system which includes the digits 0-9 and A-F. -Hexadecimal numbers are represented in this document with a prefix of "0x" or -"\x" or a suffix of "h". Hexadecimal letter digits are not case sensitive -(i.e. the number 0xff is the same as 0xFF). -</pre> -<pre><b><u>File dump</u></b> - -When example file dumps are displayed, the format is similar to that of the -output from the DOS DEBUG program. With the exception of the ASCII characters, -all numbers are in hexadecimal.</pre> -<pre>Offset Byte values ASCII characters</pre> -<pre>000000 53 4D 42 1A 10 01 20 00 F4 01 00 00 F4 01 00 00 SMB... ......... -000010 20 00 00 00 D0 07 00 00 D0 07 00 00 00 00 00 00 ............... -</pre> -<pre><b><u>Bit values</u></b> - -Bit (or flag) values are represented in C notation as (1<<x) where x is the bit -number. (i.e. bit number 7 (1<<7) is the same as 0x80). -</pre> -<pre><b><u>Word storage</u></b> - -All words (16-bit) and double words (32-bit) are stored in Intel 80x86 (little -endian) format with bytes stored from low to high (reverse of the Motorola -680x0 word storage format).</pre> -<pre>A 16-bit word with the value 1234h is stored as 34h 12h. - -<b><u>Translation strings</u></b> - -Translation strings (xlat variables) are arrays of words (16-bit) in the order -of the original storage translation. The last translation type is followed by a -16-bit zero (defined later as XLAT_NONE). If there are no translations, then -the first and only element of the array is XLAT_NONE.</pre> -<pre>If multiple translations are used, the translation order must be reversed -upon retrieval to obtain the proper data. -</pre> -<pre><b><u>Local e-mail</u></b> - -When referring to the local e-mail message base of a Synchronet BBS, we are -referring specifically to the message base with the name "MAIL" stored in the -"DATA" directory (e.g. \SBBS\DATA\MAIL).</pre> -<pre>Messages stored in this message base are different in the following respects:</pre> -<ul> - <li> -<pre>The SMB_EMAIL status header attribute is set ON</pre> - </li> - <li> -<pre>Hyper Allocation storage method is not supported</pre> - </li> - <li> -<pre>The "To" and and "From" fields of the message indexes do NOT contain CRCs</pre> - </li> -</ul> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="Acronyms:">Acronyms:</a></u></h3> -<pre>ANSI American National Standards Institute -ASCII American Standard Code for Information Interchange -BBS Bulletin Board System -C The C programming language as defined by ANSI X3.159-1989 -CR Carriage Return character (ASCII 13) -CRC Cyclic Redundancy Check -CRC-16 Standard 16-bit CRC using 1021h polynomial (seed 0) -CRC-32 Standard 32-bit CRC using EDB88320h polynomial (seed -1) -CRLF Carriage Return character followed by a Line Feed character -FSC FidoNet Standards Committee (FTS proposal) -FTN FidoNet Technology Network -FTS FidoNet Technical Standard -LF Line Feed character (ASCII 10) -QWK Compressed message packet format for message reading/networking -RFC Request for Comments -SMB Synchronet Message Base -UT Universal Time (formerly called "Greenwhich Mean Time")</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="Data types">Data types</a></u></h3> -<pre>uchar Unsigned 8-bit value (0 through 255). - C example:</pre> -<pre> #define uchar unsigned char -</pre> -<pre>short Signed 16-bit value (-32768 through 32767). - "short" is a C keyword indicating "short int". -</pre> -<pre>ushort Unsigned 16-bit value (0 through 65535). - C example:</pre> -<pre> #define ushort unsigned short -</pre> -<pre>ulong Unsigned 32-bit value (0 through 4294967295). - C example:</pre> -<pre> #define ulong unsigned long -</pre> -<pre>time_t Unsigned 32-bit value. - Seconds since 00:00 Jan 01 1970 (Unix format). - Used for all time/date storage in SMB as part of the when_t - data type. This time format will support dates through the year - 2105. - time_t is defined by ANSI C as a long (signed) which can - limit its date support to the year 2038 depending on the - library routines used. -</pre> -<pre>ASCII String (aka character array) of 8-bit ASCII characters. - Characters with the bit 7 set (80h through FFh) represent - the IBM PC extended ASCII character set. When data or header - fields of this type are stored in the header, a NULL - terminator may or may not be present. - C example:</pre> -<pre> uchar str[80]; -</pre> -<pre>ASCIIZ ASCII string with (non-optional) NULL terminator. - C example:</pre> -<pre> uchar str[81]; - -nulstr ASCII string immediately terminated by NULL. - C example:</pre> -<pre> uchar *nulstr=""; -</pre> -<pre>undef Data buffer with undefined contents. - C example:</pre> -<pre> uchar buf[BUF_LEN];</pre> -<pre>when_t Date/Time stamp including time-zone adjustment information. - C example:</pre> -<pre> typedef struct {</pre> -<pre> time_t time; // Time stamp (in local time) - short zone; // Zone constant or Minutes (+/-) from UT</pre> -<pre> } when_t;</pre> -<pre> time:</pre> -<pre> A time value of 0 is invalid and indicates an un-initialized - time stamp.</pre> -<pre> Time stamps are always stored in universal time. i.e. - Regardless of what the local time zone is, Jan 1st 1994 00:00 - will always be stored as 2D24BD00h.</pre> -<pre> zone:</pre> -<pre> If the zone is in the range -720 to +720, it represents the - number of minutes east or west of UT. Values in this range - should only be used for time zones not otherwise represented - here.</pre> -<pre> If the zone is greater than 720 or less than -720, then the - following bits have special meaning:</pre> -<pre> (1<<12) // Non-US time zone (east of UT) - (1<<13) // Non-US time zone (west of UT) - (1<<14) // U.S. time zone - (1<<15) // Daylight savings</pre> -<pre> The lower 12 bits (0 through 11) contain the number of minutes - east or west of UT (not accounting for daylight savings). - - If the time zone is one specified in the U.S. Uniform Time Act, - the following values represent the zone:</pre> -<pre> AST 0x40F0 // Atlantic (-04:00) - EST 0x412C // Eastern (-05:00) - CST 0x4168 // Central (-06:00) - MST 0x41A4 // Mountain (-07:00) - PST 0x41E0 // Pacific (-08:00) - YST 0x421C // Yukon (-09:00) - HST 0x4258 // Hawaii/Alaska (-10:00) - BST 0x4294 // Bering (-11:00)</pre> -<pre> With bit 15 set, the following values represent the same zone - with the presence of daylight savings:</pre> -<pre> ADT 0xC0F0 // Atlantic (-03:00) - EDT 0xC12C // Eastern (-04:00) - CDT 0xC168 // Central (-05:00) - MDT 0xC1A4 // Mountain (-06:00) - PDT 0xC1E0 // Pacific (-07:00) - YDT 0xC21C // Yukon (-08:00) - HDT 0xC258 // Hawaii/Alaska (-09:00) - BDT 0xC294 // Bering (-10:00)</pre> -<pre> The following non-standard time zone specifications may also be - used:</pre> -<pre> MID 0x2294 // Midway (-11:00) - VAN 0x21E0 // Vancouver (-08:00) - EDM 0x21A4 // Edmonton (-07:00) - WIN 0x2168 // Winnipeg (-06:00) - BOG 0x212C // Bogota (-05:00) - CAR 0x20F0 // Caracas (-04:00) - RIO 0x20B4 // Rio de Janeiro (-03:00) - FER 0x2078 // Fernando de Noronha (-02:00) - AZO 0x203C // Azores (-01:00) - LON 0x1000 // London (+00:00) - BER 0x103C // Berlin (+01:00) - ATH 0x1078 // Athens (+02:00) - MOS 0x10B4 // Moscow (+03:00) - DUB 0x10F0 // Dubai (+04:00) - KAB 0x110E // Kabul (+04:30) - KAR 0x112C // Karachi (+05:00) - BOM 0x114A // Bombay (+05:30) - KAT 0x1159 // Kathmandu (+05:45) - DHA 0x1168 // Dhaka (+06:00) - BAN 0x11A4 // Bangkok (+07:00) - HON 0x11E0 // Hong Kong (+08:00) - TOK 0x121C // Tokyo (+09:00) - SYD 0x1258 // Sydney (+10:00) - NOU 0x1294 // Noumea (+11:00) - WEL 0x12D0 // Wellington (+12:00) - -fidoaddr_t FidoNet address stored as four ushorts that represent the zone, - network, node, and point (in that order). - C example:</pre> -<pre> typedef struct {</pre> -<pre> ushort zone, - net, - node, - point;</pre> -<pre> } fidoaddr_t; -</pre> -<pre>typestr_t ASCIIZ string with ushort type prefix. - C example:</pre> -<pre> typedef struct {</pre> -<pre> ushort type; // Specifier for type of 'str' - uchar str[]; // ASCIIZ filename or other string data</pre> -<pre> } typestr_t; -</pre> -<pre>mattach_t File attachment information with type prefix, translation - string, and filename. - C example:</pre> -<pre> typedef struct {</pre> -<pre> ushort type; // Attachment type - ushort xlat[]; // Translations of data in attachment - uchar str[]; // ASCIIZ filename</pre> -<pre> } mattach_t;</pre> -<pre>vattach_t Video file attachment information with type, compression, - translation string, and filename. - C example:</pre> -<pre> typedef struct {</pre> -<pre> ushort type; // Attachment type - ushort comp; // Compression method - ushort xlat[]; // Translations of data in attachment - uchar str[]; // ASCIIZ filename</pre> -<pre> } vattach_t; - -mtext_t Message text with translation string prefix. - C example:</pre> -<pre> typedef struct {</pre> -<pre> ushort xlat[]; // Translations of text - uchar text[]; // Actual text data</pre> -<pre> } mtext_t; -</pre> -<pre>ftext_t Formatted message text with translation string prefix and - format type. - C example:</pre> -<pre> typedef struct {</pre> -<pre> ushort type; // See Image Types for valid types - ushort xlat[]; // Translations of data - uchar data[]; // Actual formatted text data</pre> -<pre> } ftext_t; -</pre> -<pre>membed_t Embedded data with type prefix, translation string, and ASCIIZ - description. - C example:</pre> -<pre> typedef struct {</pre> -<pre> ushort type; // Specifier for type of 'dat' - ushort xlat[]; // Translations of embedded data - uchar name[]; // ASCIIZ char description of embedded data - uchar dat[]; // Binary data</pre> -<pre> } membed_t;</pre> -<pre>vembed_t Embedded video data with type, compression method, translation - string, and ASCIIZ description. - C example:</pre> -<pre> typedef struct {</pre> -<pre> ushort type; // Specifier for type of 'dat' - ushort comp; // Compression method - ushort xlat[]; // Translations of embedded data - uchar name[]; // ASCIIZ char description of embedded data - uchar dat[]; // Binary data</pre> -<pre> } vembed_t;</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="File Formats">File Formats</a></u></h2> -<h3><u><a name="Index File (*.SID)">Index File (*.SID)</a></u></h3> -<pre>The index file for each message base contains one record per message in the -base. Each record is fixed length using the following format: - -<b><u>Index Record:</u></b> - -<i>C example:</i> - -typedef struct { - - ushort to; // 16-bit CRC of recipient name (lower case) or user number - ushort from; // 16-bit CRC of sender name (lower case) or user number - ushort subj; // 16-bit CRC of title/subject (lower case) - ushort attr; // attributes (MSG_PRIVATE, MSG_READ, etc. flags) - ulong offset; // byte offset of message header in header file - ulong number; // message serial number (1 based) - time_t time; // import date/time stamp (Unix format) - - } idxrec_t; -</pre> -<pre><b><font SIZE="2">Example file dump (16 messages starting with message number 15):</font></b></pre> -<blockquote> -<pre>000000 36 4F 13 07 2A 77 00 00 20 00 00 00 0F 00 00 00 -000010 BE 62 76 2C 36 4F 46 0A 7F B2 00 00 20 01 00 00 -000020 10 00 00 00 C7 29 78 2C 36 4F 70 6F 46 FF 00 00 -000030 20 02 00 00 11 00 00 00 AD D3 7A 2C 70 6F 13 07 -000040 46 FF 00 00 20 03 00 00 12 00 00 00 D6 F8 7F 2C -000050 36 4F E1 EA E7 E9 00 00 20 04 00 00 13 00 00 00 -000060 1E 7B 85 2C 37 0D 2E DF 4D 79 00 00 20 05 00 00 -000070 14 00 00 00 5C E1 A1 2C 90 54 2D 5A 86 62 00 00 -000080 20 06 00 00 15 00 00 00 39 2E A2 2C 70 6F 1A 8B -000090 46 FF 00 00 20 07 00 00 16 00 00 00 D0 7B A8 2C -0000A0 2E DF 1A 8B 4D 79 00 00 20 08 00 00 17 00 00 00 -0000B0 FF 7B A8 2C B4 D9 35 7C 23 B1 00 00 20 09 00 00 -0000C0 18 00 00 00 CE D4 BA 2C 36 4F BC D8 B2 E7 00 00 -0000D0 20 0A 00 00 19 00 00 00 14 5F C3 2C BA A8 4E B0 -0000E0 67 76 00 00 20 0B 00 00 1A 00 00 00 6F 89 C3 2C -0000F0 36 4F 0C 01 19 9C 00 00 20 0C 00 00 1B 00 00 00 -000100 F8 30 C6 2C 36 4F FA 48 0E 55 00 00 20 0D 00 00 -000110 1C 00 00 00 6A 94 D3 2C 36 4F F1 CE CF A2 00 00 -000120 20 0E 00 00 1D 00 00 00 53 DB D5 2C 8D A6 21 CE -000130 F7 AB 00 00 20 0F 00 00 1E 00 00 00 31 29 DC 2C</pre> -</blockquote> -<pre><b><u>Field descriptions:</u></b></pre> -<pre><b>To:</b> -The 'To' field is the CRC-16 of the name of the intended recipient agent of -this message or the intended recipient's user number. If the CRC is stored, the -text must be converted to lower case (A-Z changed to a-z) before the CRC is -calculated. If the message is forwarded to another agent, the original or new -index record must be changed to contain the CRC-16 of the new recipient name or -user number. This field must always contain the recipient user number for local -e-mail on a Synchronet BBS. Outbound netmail stored in the Synchronet local -e-mail message base will contain 0 in this field.</pre> -<pre><b>From:</b> -This field, similar to the 'To' field, contains the CRC-16 of the name of the -sending agent of this message or the sender's user number. If the CRC is -stored, the text must be converted to lower case (A-Z changed to a-z) before -the CRC is calculated. If the message is forwarded to another agent, the -original or new index record must be changed to contain the CRC-16 of the new -sender name or user number. If the message was imported into the local e-mail -message base on a Synchronet BBS via netmail, this field will contain 0.</pre> -<pre><b>Subj:</b> -The 'Subj' field contains the CRC-16 of the message's subject. The subject -must be converted to lower case (A-Z changed to a-z) and all preceding -"re: "'s and "re:"'s removed before calculating the CRC-16.</pre> -<pre><b>Attr:</b> -This ushort is a bit field of the specific attributes for this message. -It is a clone of the 'attr' element of the msghdr_t structure.</pre> -<pre><b>Offset:</b> -This ulong is the offset (in bytes) in the header file for this message's -header record.</pre> -<pre><b>Number:</b> -This ulong is the serial number of this message. Valid values are 1 through -0xffffffff. No two index records in the same message base may have the same -message number. All index records must have sequential, but not necessarily -consecutive, message numbers.</pre> -<pre><b>Time:</b> -This field is the date/time stamp the message was imported to or posted in -the message base. It is a clone of the 'when_imported.time' element of the -msghdr_t structure.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="Header File (*.SHD)">Header File (*.SHD)</a></u></h3> -<pre>Each SMB header file is made up of two distinct sections: base header records -and message header records (usually the bulk of the file).</pre> -<pre><b><u>Base Header Records:</u></b> - -Base header records are blocks of data that apply to the entire message base -and are of variable length. This specification defines only one base header -record, the "Status info" (smbstatus_t) record. This status info record must be -the first base header record in the file (offset 0) and must be modified if -additional base header records are added.</pre> -<pre>Additional header records allow other developers to store configuration and -status information particular to their application needs. It also allows for -future header record definitions as part of this specification without causing -backward compatibility issues.</pre> -<pre>Each base header record contains a fixed length portion (smbhdr_t) and an -optional variable length portion.</pre> -<pre>Whenever a base header record is read or updated (written), it must first -be successfully locked and subsequently unlocked (using the file system record -locking facilities).</pre> -<pre>The first base header record (Status Info) is used as a semaphore when writing -to the message index (.SID) file and, when using the Hyper Allocation storage -method, writing to the message data (.SDT) file. This record must be -successfully locked before writing and subsequently unlocked. This is to insure -that multiple applications simultaneously writing to the same message base -does not result in corrupted data. -</pre> -<pre><b><u>Message Header Records:</u></b> - -Following the last base header record is the first message header record. Each -header record is stored in one or more 256 byte blocks. There must be exactly -one active message header record for every index record in the index file. -(Note: This does not include deleted message headers that have not been -overwritten by a new message header).</pre> -<pre>Each message header record contains a fixed length portion (msghdr_t), a list -of zero or more fixed length data fields (dfield_t), and a list of three or -more variable length header fields (hfield_t).</pre> -<pre>The value of the data stored in the zero or more unused bytes of the last -header record block have an undefined value, though whenever possible -developers should initialize to binary zero for human readability.</pre> -<pre>Whenever a message header record is read or updated (written), it must first -be successfully locked and subsequently unlocked. - - -<b><u>Base Header Record (Fixed Portion):</u></b> - -<i>C example:</i></pre> -<pre>typedef struct {</pre> -<pre> uchar id[4]; // text or binary unique hdr ID - ushort version; // version number (initially 100h for 1.00) - ushort length; // length including this struct</pre> -<pre> } smbhdr_t; -</pre> -<pre><b><u>Base Header Record Field Descriptions:</u></b> - -<b>Id:</b> -This is a four byte unique ID identifying the type of the base header record. -The bytes may contain any value, but printable ASCII characters are preferred. -The only ID defined in this specification is "SMB^Z" used by the Status Info -base header record.</pre> -<pre><b>Version:</b> -This is a version number of the base header record type. Base header records -of different versions may have different formats or contain different -information. This is to aid the application in determining if the record -is pertinent and if so, to what degree. The Status Info base header record -uses this version field to define the version of the format for the entire -message base (currently 0x121 for version 1.21).</pre> -<pre><b>Length:</b> -This is entire length in bytes of this header record (including both fixed -and variable portions). -</pre> -<pre><b><u>Base Header #1 (Status info) Record (Variable Portion):</u></b> - -<i>C example:</i></pre> -<pre>typedef struct {</pre> -<pre> ulong last_msg; // last message number posted or imported - ulong total_msgs; // total messages currently in message base - ulong header_offset; // byte offset to first header record - ulong max_crcs; // Maximum number of CRCs to keep in history - ulong max_msgs; // Maximum number of messages to keep in base - ushort max_age; // Maximum age of messages (days) to keep in base - ushort attr; // Attribute bits</pre> -<pre> } smbstatus_t; - -<b><u>Base Header #1 (Status Info) Record (Variable Portion) Field Descriptions:</u></b></pre> -<pre><b>Last_msg:</b> -This is the serial number of the last message imported or posted into this -message base. The index, header, and data records for this message may possibly -not exist (due to deletion). This field is used for determining the message -number to give to a new message being imported or posted into this message -base. This field must be updated for every message added to the message base.</pre> -<pre><b>Total_msgs:</b> -This is the total number of active messages currently in the message base. -This number should match the number of records in the index (.SID) file -and active header records in the header (.SHD) file. This field must be -updated whenever a message is added to or removed from the message base.</pre> -<pre><b>Header_offset:</b> -This is the byte offset to the first message header record. It is useful -for skipping all the base header records and going directly to the first -message header record.</pre> -<pre><b>Max_crcs:</b> -This is the maximum number of message CRCs to store in the CRC history (.SCH) -file for duplicate message checking. If this field contains 0, then duplicate -message checking is disabled.</pre> -<pre><b>Max_msgs:</b> -This is the preferred maximum number of messages to keep in this message -base as specified by the system operator. It is used by maintenance programs -that trim the message base down by removing old messages. This field should -be ignored by applications importing or posting messages allowing them to -exceed this maximum at will.</pre> -<pre><b>Max_age:</b> -This field is the maximum age (in days) of messages to keep in the message -base. It is used by maintenance programs to purge out-dated messages from -the message base. - -<b>Attr:</b> -This is a bit field containing specific attributes (or flags) that may define -the way messages are stored or retrieved from the this message base. The -following attributes are defined:</pre> -<pre> <b>SMB_EMAIL (1<<0)</b></pre> -<pre> Indicates the message base is specifically for messages to or from local - users. When this bit is set, the idxrec.to and idxrec.from fields will - contain the user numbers (or 0 for non-user destination/source) instead of - the CRC-16 of the agent name.</pre> -<pre> <b>SMB_HYPERALLOC (1<<1)</b></pre> -<pre> Indicates the message base uses the Hyper Allocation storage method. This - bit should not be cleared by an application without first deleting all the - messages in the message base. This is due to the fact the Hyper Allocation - is not downward compatible with the Self-packing and Fast Allocation - storage methods.</pre> -<pre>When used with Synchronet BBS software, a message base must NOT have both of -the above attributes set. The only message base that should have the SMB_EMAIL -attribute set is the DATA\MAIL message base. - -<b><u>Base Header #1 (Status info) Record Contents:</u></b> - -smbhdr.id="SMB\x1a"; // SMB^Z -smbhdr.version=0x121; // v1.21 -smbhdr.length=sizeof(smbhdr_t)+sizeof(smbstatus_t); smbstatus_t status; -</pre> -<pre><b><u>Additional Base Headers:</u></b> - -Additional headers from developers must have initial 8 bytes in smbhdr_t -format, length must include size of smbhdr_t, and header_offset of smbstatus_t -must be changed to include the size of the additional header(s).</pre> -<pre><b>Example file dump (base header portion only):</b></pre> -<blockquote> -<pre>000000 53 4D 42 1A 20 01 20 00 F4 01 00 00 F4 01 00 00 SMB............. -000010 20 00 00 00 D0 07 00 00 D0 07 00 00 00 00 00 00 ...............</pre> -</blockquote> -<pre><b><u>Message Header Record (Fixed portion):</u></b> - -<i>C example:</i></pre> -<pre>typedef struct {</pre> -<pre> uchar id[4]; // SHD^Z (same for all types and versions) - ushort type; // Message type (this is the definition of type 0) - ushort version; // Version of type (initially 100h for 1.00) - ushort length; // Total length of fixed portion + all fields - ushort attr; // Attributes (bit field) (duplicated in SID) - ulong auxattr; // Auxiliary attributes (bit field) - ulong netattr; // Network attributes (bit field) - when_t when_written; // Date/Time message was originally created - when_t when_imported; // Date/Time message was imported (locally) - ulong number; // Message number (unique, not necessarily seq.) - ulong thread_orig; // Original message number in thread - ulong thread_next; // Next message in thread - ulong thread_first; // Number of first reply to this message - uchar reserved[16]; // 16 reserved bytes for future use - ulong offset; // Offset for buffer into data file (0 or mod 256) - ushort total_dfields; // Total number of data fields</pre> -<pre> } msghdr_t;</pre> -<pre>typedef struct {</pre> -<pre> ushort type; // See "Data Field Types" values - ulong offset; // Offset into buffer - ulong length; // Length of data field in buffer</pre> -<pre> } dfield_t;</pre> -<pre>typedef struct {</pre> -<pre> ushort type; // See "Header Field Types" for values - ushort length; // Length of buffer - uchar dat[length];</pre> -<pre> } hfield_t; -</pre> -<pre><b>Example file dump (one header record, both fixed and variable length portions):</b></pre> -<blockquote> -<pre>000020 53 48 44 1A 00 00 20 01 F5 00 00 00 00 00 00 00 SHD... ......... -000030 00 00 00 00 46 DB F7 2C 00 00 7D D7 29 2D 00 00 .......,..}�)-.. -000040 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -000060 00 00 00 00 02 00 00 00 00 00 00 00 4A 01 00 00 ............J... -000070 02 00 4A 01 00 00 53 00 00 00 00 00 13 00 4D 61 ..J...S.......Ma -000080 72 69 61 6E 6E 65 20 4D 6F 6E 74 67 6F 6D 65 72 rianne Montgomer -000090 79 30 00 0C 00 43 61 72 6F 6C 20 47 61 69 73 65 y0...Carol Gaise -0000A0 72 60 00 07 00 46 61 72 6E 68 61 6D A4 00 14 00 r`...Farnham.... -0000B0 31 3A 31 33 38 2F 31 30 32 2E 30 20 32 63 66 38 1:138/102.0 2cf8 -0000C0 30 35 37 36 A5 00 14 00 31 3A 33 34 33 2F 31 30 0576....1:343/10 -0000D0 30 2E 30 20 32 63 66 33 62 39 30 61 A3 00 23 00 0.0 2cf3b90a..#. -0000E0 31 33 38 2F 31 30 32 20 31 20 32 37 30 2F 31 30 138/102 1 270/10 -0000F0 31 20 32 30 39 2F 32 30 39 20 31 30 33 2F 30 20 1 209/209 103/0 -000100 33 35 35 02 00 02 00 02 00 03 00 08 00 01 00 8A 355............. -000110 00 66 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .f..............</pre> -</blockquote> -<pre><b><u>Contents of example header:</u></b></pre> -<pre>id SHD^Z -type 0000h -version 0120h -length 245 -attr 0000h -auxattr 00000000h -netattr 00000000h -when_written Sat Nov 27 17:57:10 1993 -when_imported Tue Jan 04 15:54:21 1994 -number 1 -thread_orig 0 -thread_next 0 -thread_first 0 -reserved[16] -offset 0 -total_dfields 2</pre> -<pre>dfield[0].type 00h -dfield[0].offset 0 -dfield[0].length 330 -dfield[1].type 02h -dfield[1].offset 330 -dfield[1].length 83</pre> -<pre>hfield[0].type 00h -hfield[0].length 19 -hfield[0]_dat Marianne Montgomery -hfield[1].type 30h -hfield[1].length 12 -hfield[1]_dat Carol Gaiser -hfield[2].type 60h -hfield[2].length 7 -hfield[2]_dat Farnham -hfield[3].type A4h -hfield[3].length 20 -hfield[3]_dat 1:138/102.0 2cf80576 -hfield[4].type A5h -hfield[4].length 20 -hfield[4]_dat 1:343/100.0 2cf3b90a -hfield[5].type A3h -hfield[5].length 35 -hfield[5]_dat 138/102 1 270/101 209/209 103/0 355 -hfield[6].type 02h -hfield[6].length 2 -hfield[6]_dat 02 00 -hfield[7].type 03h -hfield[7].length 8 -hfield[7]_dat 01 00 8A 00 66 00 00 00 - -<b><u>Fixed Portion Field descriptions:</u></b> - -<b>Id:</b> -This field (regardless of the header type or version) must always contain the -the string "SHD^Z". This is to aid in the restoration of a corrupted header -file and give a visual indication of the beginning of a new header record when -viewing dumps of the header file.</pre> -<pre><b>Type:</b> -This is the message header type. Only one type is currently defined by this -specification (type 0). Any and all future header types will have the first -4 fields (10 bytes) in the same format of type 0. This allows other types -(with different lengths) to be skipped because the 4th field (length) will -always be in the same position.</pre> -<pre><b>Version:</b> -This is the version of this header type. This specification defines version -1.21 of message header type 0 (stored as 121h).</pre> -<pre><b>Length:</b> -This is the total length of this message header record (including both fixed -and variable length portions, but NOT including unused block space).</pre> -<pre><b>Attr:</b> -This is a bit field (16-bit) containing basic message attributes (flags) for -this message. An exact duplicate of this field is stored in the index file as -well. They must always match.</pre> -<pre><b>Auxattr:</b> -This is a bit field (32-bit) containing the auxiliary attributes (flags) for -this message. The attributes stored in this variable are more specific in -nature and less critical than those in the Attr field.</pre> -<pre><b>Netattr:</b> -This is a bit field (32-bit) containing the network attributes (flags) for this -message. The attributes stored in this variable are related solely to message -networking.</pre> -<pre><b>When_written:</b> -This is the date and time when the message was originally created.</pre> -<pre><b>When_imported:</b> -This is the date and time when the message was posted on or imported into the -local message system.</pre> -<pre><b>Number:</b> -This is the message's unique serial number (from 1 to FFFFFFFFh). This field -is duplicated in the index file. They must always match. - -<b>Thread_orig: -</b>If this message is a reply, then this field contains the number of the original -message that was replied to. If this message was not a reply, this field will -contain the value 0.</pre> -<pre><b>Thread_next: -</b>If this message is a reply, and there are later replies to that message -(the message number contained in the Thread_orig field), then this field will -contain the number of the next reply in the chain. If this message is the only -reply to the original message, this field will contain the value 0.</pre> -<pre><b>Thread_first: -</b>If there are any replies to this message (after it has been posted), this field -will contain the number of the first reply to this message. If there are no -replies to this message, this field will contain the value 0.</pre> -<pre><b>Reserved: -</b>Unused bytes, reserved for future definition in the message header type 0 -specification.</pre> -<pre><b>Offset: -</b>The byte offset into the data file, specifying the start of the buffer for -all data associated with this message. This value must be either 0 or modulus -256. When retrieving the actual data portion of data fields, the physical -offset into the file will be the offset of the message data buffer (this field) -plus the offset of the individual data field (msghdr_t.offset+dfield_t.offset).</pre> -<pre><b>Total_dfields: -</b>This field contains the total number of data fields associated with this -message. The value of this field must match the actual number of data fields -stored in the header (dfield_t data types following the fixed portion of the -message header). -</pre> -<pre><b><u>Variable Portion Field descriptions:</u></b> - -See the Header Field Type and Data Field Type sections for the descriptions -of the values contained in these fields.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="Message Header Block Allocation (*.SHA)">Message Header Block -Allocation (*.SHA)</a></u></h3> -<pre>If this message base uses the Hyper Allocation storage method (the -SMB_HYPERALLOC bit is set in the smbstatus_t.attr field), then this file is -not created or used.</pre> -<pre>This file contains no header or signature data. Each byte (uchar) in the file -specifies the allocation state of the corresponding 256 byte block in the -header (*.SHD) file. A value of 0 indicates a free header block, and a value of -1 indicates an allocated block. Other non-zero values are undefined.</pre> -<pre>This file must always be opened DENY ALL (non-shareable).</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="Message Data (*.SDT)">Message Data (*.SDT)</a></u></h3> -<pre>This file contains no header or signature data. It contains the text and other -embedded data for the messages in a single message base. The data for each -message always begins on a 256 byte block boundary. The data in the unused -portion of a data block is undefined, but should be initialized to NULL -whenever possible.</pre> -<pre>This file must always be opened DENY NONE (shareable).</pre> -<pre>Data fields of type TEXT_BODY and TEXT_TAIL must have all trailing white space -and control characters removed (i.e. the last character of the data record -must be in the range 21h to FFh). The only exception to this rule, is if the -TEXT_BODY is terminated with multiple contiguous CRLFs, only the last CRLF -should be removed. A CRLF should always be appended to the text data when it is -displayed.</pre> -<pre>When reading from this file, it is a good idea to make sure the message header -for the data being read is currently locked (though no single message header -should be locked for extended durations of time). This will insure that no -other application will write to this portion of the file while it's being -read (read from disk, not displayed).</pre> -<pre>When using the Hyper Allocation storage method, the Status Info message base -header must be successfully locked before writing to this file and subsequently -unlocked.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="Message Data Block Allocation (*.SDA)">Message Data Block -Allocation (*.SDA)</a></u></h3> -<pre>If this message base uses the Hyper Allocation storage method (the -SMB_HYPERALLOC bit is set in the smbstatus_t.attr field), then this file is -not created or used.</pre> -<pre>This file contains no header or signature data. Each word (ushort) in the file -specifies the allocation state of the corresponding 256 byte block in the data -(*.SDT) file. A value of 0 indicates a free block, and a non-zero value -indicates the number of message header records associated with this message -data (most often 1). Each block can be used by up to 65,535 header records.</pre> -<pre>This file must always be opened DENY ALL (non-shareable).</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="CRC history for duplicate message checking (*.SCH)">CRC history -for duplicate message checking (*.SCH)</a></u></h3> -<pre>This file is optional and contains no header or signature data. Each long word -(ulong) in the file contains a CRC-32 of previously posted/imported messages. -These CRCs can be used to check a candidate message for posting/import to be -sure the message isn't a duplicate created by human or program error. The -maximum number of CRCs to store is defined in the first message base header -record (smbstatus_t.max_crcs).</pre> -<pre>The CRC is calculated on the first TEXT_BODY data field before any translations -are applied (e.g. encoding, compression, encryption).</pre> -<pre>This file must always be opened DENY ALL (non-shareable).</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Header Field Types:">Header Field Types:</a></u></h2> -<pre>These are the defined valid values for hfield_t.type:</pre> -<pre>Name : SENDER -Value : 00h -Data : ASCII -Multiple : Yes, order significant -Required : Yes -Summary : Name of agent that sent this message</pre> -<pre>If blank (0 length or nulstr), assumed "Anonymous". If multiple SENDER fields -exist, then the message has been forwarded and the order of the fields in the -record must match the forwarding order (chronologically). When forwarding a -message, the original SENDER field should be left intact and new SENDER, -FORWARDED, and RECIPIENT fields added to the end of the record.</pre> -<pre>Name : SENDERAGENT -Value : 01h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : AGENT_PERSON or previous SENDERAGENT if exists -Summary : Type of agent that sent this message</pre> -<pre>If multiple SENDER fields exist, then the message has been forwarded. If any of the -forwarding agents is of a type other than AGENT_PERSON, then this field must -follow that SENDER field to specify the agent type.</pre> -<pre>Name : SENDERNETTYPE -Value : 02h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : NET_NONE or previous SENDERNETTYPE if exists -Summary : Type of network message was sent from</pre> -<pre>If multiple SENDERNETADDR fields are included, a SENDERNETTYPE field should be -included before each to determine what data type the address is stored in.</pre> -<pre>Name : SENDERNETADDR -Value : 03h -Data : undef -Multiple : Yes, order significant -Required : No -Default : Previous SENDERNETADDR if exists -Summary : Network address for agent that sent this message</pre> -<pre>The SENDERNETTYPE field indicates the data type of this field. If the -SENDERNETTYPE is of type NET_INTERNET, the local-part of the Internet -address is optional. If the local-part separator character ('@') is omitted, -the SENDER field is assumed to be the local-part of the address.</pre> -<pre>Name : SENDEREXT -Value : 04h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous SENDEREXT if exists -Summary : Extension of sending agent</pre> -<pre>This field is useful for storing the sending agent's extension, when the -agent's extension binds more tightly than the agent's name.</pre> -<pre>For example, Synchronet Multinode BBS Software stores local e-mail with the -sending and receiving agent's user numbers stored as their respective -extensions. This is done so that if a user name changes for some reason, -messages will not "disappear" from the user's mail box.</pre> -<pre>If the SMB_EMAIL status header attribute is set, then the "From" field in the -index must contain the binary value of this field rather than the CRC-16 of the -SENDER (name) field.</pre> -<pre>Name : SENDERPOS -Value : 05h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous SENDERPOS if exists -Summary : Position of sending agent</pre> -<pre>Primarily for documentary purposes, this field contains the position of the -sending agent (i.e. President, Sysop, C.E.O., MIS Director, etc).</pre> -<pre>It can also be useful for getting a message or reply to the intended -recipient when the agent name is not located or is unknown, but the position -of the agent is known and specified.</pre> -<pre>Name : SENDERORG -Value : 06h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous SENDERORG if exists -Summary : Organization name of sending agent</pre> -<pre>Primarily for documentary purposes, this field contains the organization to -which the sending agent belongs (i.e. Microsoft, Joe's BBS, SoCal User's Group, -etc). - -Name : AUTHOR -Value : 10h -Data : ASCII -Multiple : Yes -Required : No -Default : First SENDER -Summary : Name of agent that created this message</pre> -<pre>This field can only be added by the process that originally creates the -message. It should not be included if same as first SENDER field. If multiple -AUTHOR fields exist, then the message was created by multiple agents and is -considered valid. The order of multiple AUTHOR fields in the record is not -significant.</pre> -<pre>Name : AUTHORAGENT -Value : 11h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : SENDERAGENT or previous AUTHORAGENT if exists -Summary : Type of agent that created this message</pre> -<pre>This field can only be added by the process that originally creates the -message. It should not be included if same as first SENDERAGENT field. If -multiple AUTHOR fields exist, then the message was created by multiple agents -and if the agent type for any of the authors is other than AGENT_PERSON, an -AUTHORAGENT field must follow to specify the agent type.</pre> -<pre>Name : AUTHORNETTYPE -Value : 12h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : SENDERNETTYPE or previous AUTHORNETTYPE if exists -Summary : Type of network this author is member of</pre> -<pre>Name : AUTHORNETADDR -Value : 13h -Data : undef -Multiple : Yes, order significant -Required : No -Default : SENDERNETADDR or previous AUTHORNETADDR if exists -Summary : Network address of this author - -Name : AUTHOREXT -Value : 14h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : SENDEREXT or previous AUTHOREXT if exists -Summary : Extension of this author</pre> -<pre>Name : AUTHORPOS -Value : 15h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : SENDERPOS or previous AUTHORPOS if exists -Summary : Position of this author</pre> -<pre>Name : AUTHORORG -Value : 16h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : SENDERORG or previous AUTHORORG if exists -Summary : Organization this author belongs to - -Name : REPLYTO -Value : 20h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDER -Summary : Name of agent that replies should go to</pre> -<pre>Name : REPLYTOAGENT -Value : 21h -Data : ushort -Multiple : Yes, but only last is valid -Required : No -Default : SENDERAGENT -Summary : Type of agent that replies should go to</pre> -<pre>Name : REPLYTONETTYPE -Value : 22h -Data : ushort -Multiple : Yes, but only last is valid -Required : No -Default : SENDERNETTYPE -Summary : Type of network that replies should go to</pre> -<pre>Name : REPLYTONETADDR -Value : 23h -Data : undef -Multiple : Yes, but only last is valid -Required : No -Default : SENDERNETADDR -Summary : Network address that replies should go to - -Name : REPLYTOEXT -Value : 24h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDEREXT -Summary : Extension of agent that replies should go to</pre> -<pre>Name : REPLYTOPOS -Value : 25h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDERPOS -Summary : Position of agent that replies should go to</pre> -<pre>Name : REPLYTOORG -Value : 26h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDERORG -Summary : Organization of agent that replies should go to - -Name : RECIPIENT -Value : 30h -Data : ASCII -Multiple : Yes, order significant -Required : Yes -Default : "All" -Summary : Name of agent to receive this message</pre> -<pre>If multiple RECIPIENT fields exist, the message has been forwarded and for each -additional RECIPIENT field (after the initial RECIPIENT), there should be a -FORWARDED field. The order of the RECIPIENT fields in the record must match the -order in which the message was sent and forwarded (chronologically).</pre> -<pre>Name : RECIPIENTAGENT -Value : 31h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : AGENT_PERSON or previous RECIPIENTAGENT if exists -Summary : Type of agent to receive this message</pre> -<pre>If multiple RECIPIENT fields exist, the message has been forwarded. If any of -the recipient agents are of a type other than AGENT_PERSON, this field must -follow the RECIPIENT field to specify the agent type.</pre> -<pre>Name : RECIPIENTNETTYPE -Value : 32h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : NET_NONE or previous RECIPIENTNETTYPE if exists -Summary : Type of network to receive this message</pre> -<pre>Name : RECIPIENTNETADDR -Value : 33h -Data : undef -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTNETADDR if exists -Summary : Address of network to receive this message - -Name : RECIPIENTEXT -Value : 34h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTEXT if exists -Summary : Extension of agent to receive this message</pre> -<pre>If SMB_EMAIL status header attribute is set, then the "To" field in the index -must contain the binary value of this field rather than the CRC-16 of the -RECIPIENT (name) field. This is the case specifically with the local e-mail -message base on a Synchronet BBS.</pre> -<pre>Name : RECIPIENTPOS -Value : 35h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTPOS if exists -Summary : Position of agent to receive this message</pre> -<pre>Name : RECIPIENTORG -Value : 36h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTORG if exists -Summary : Type of agent to receive this message - -Name : FORWARDTO -Value : 40h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Name of agent this message is to be forwarded to</pre> -<pre>Name : FORWARDTOAGENT -Value : 41h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTAGENT or previous FORWARDTOAGENT if exists -Summary : Type of agent this message is to be forwarded to</pre> -<pre>Name : FORWARDTONETTYPE -Value : 42h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETTYPE or previous FORWARDTONETTYPE if exists -Summary : Type of network this message is to be forwarded to</pre> -<pre>Name : FORWARDTONETADDR -Value : 43h -Data : undef -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETADDR or previous FORWARDTONETADDR if exists -Summary : Network address this message is to be forwarded to - -Name : FORWARDTOEXT -Value : 44h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTEXT or previous FORWARDTOEXT if exists -Summary : Extension of agent this message is to be forwarded to</pre> -<pre>Name : FORWARDTOPOS -Value : 45h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTPOS or previous FORWARDTOPOS if exists -Summary : Position of agent this message is to be forwarded to</pre> -<pre>Name : FORWARDTOORG -Value : 46h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTORG or previous FORWARDTOORG if exists -Summary : Organization of agent this message is to be forwarded to</pre> -<pre>Name : FORWARDED -Value : 48h -Data : when_t -Multiple : Yes, order significant -Required : Yes, if forwarded -Summary : Date/Time this message was forwarded to another agent - -Name : RECEIVEDBY -Value : 50h -Data : ASCII -Multiple : Yes, order significant -Required : Yes, if receiving agent is other than RECIPIENT -Summary : Name of agent that received this message</pre> -<pre>Name : RECEIVEDBYAGENT -Value : 51h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTAGENT or previous RECEIVEDBYAGENT if exists -Summary : Type of agent that received this message</pre> -<pre>Name : RECEIVEDBYNETTYPE -Value : 52h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETTYPE or previous RECEIVEDBYNETTYPE if exists -Summary : Type of network that received this message</pre> -<pre>Name : RECEIVEDBYNETADDR -Value : 53h -Data : undef -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETADDR or previous RECEIVEDBYNETADDR if exists -Summary : Network address that received this message - -Name : RECEIVEDBYEXT -Value : 54h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTEXT or previous RECEIVEDBYEXT if exists -Summary : Extension of agent that received this message</pre> -<pre>Name : RECEIVEDBYPOS -Value : 55h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTPOS or previous RECEIVEDBYPOS if exists -Summary : Position of agent that received this message</pre> -<pre>Name : RECEIVEDBYORG -Value : 56h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTORG or previous RECEIVEDBYORG if exists -Summary : Organization of agent that received this message</pre> -<pre>Name : RECEIVED -Value : 58h -Data : when_t -Multiple : Yes, order significant -Required : Yes, if received -Default : NULL -Summary : Date/Time this message was received - -Name : SUBJECT -Value : 60h -Data : ASCII -Multiple : No -Required : Yes, but may be blank (0 length or nulstr) -Summary : Subject/title of message</pre> -<pre>Name : SUMMARY -Value : 61h -Data : ASCII -Multiple : No -Required : No -Summary : Summary of message contents, created by AUTHOR</pre> -<pre>Name : COMMENT -Value : 62h -Data : ASCII -Multiple : Yes -Required : No -Summary : Comment about this message, created by SENDER</pre> -<pre>This field is useful for adding notes to a message when forwarding to a new -recipient.</pre> -<pre>Name : CARBONCOPY -Value : 63h -Data : ASCII -Multiple : Yes -Required : No -Summary : List of agents this message was also sent to</pre> -<pre>This field is optional and only for the use of notifying the recipient of who -else received the message.</pre> -<pre>Name : GROUP -Value : 64h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of group of users to receive message on recipient system</pre> -<pre>This field is used when sending to a group name across a network, where the -group can be expanded into multiple header records for each agent on the -destination system.</pre> -<pre>Name : EXPIRATION -Value : 65h -Data : when_t -Multiple : No -Required : No -Summary : Date/Time that this message will expire - -Name : PRIORITY -Value : 66h -Data : ulong -Multiple : No -Required : No -Default : 0 -Summary : Message priority (0 is lowest, FFFFFFFFh is highest) - -Name : FILEATTACH -Value : 70h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name/file specification of attached file(s)</pre> -<pre>Name of attached file(s). Wildcards allowed. MSG_FILEATTACH attribute must be -set. If the MSG_FILEATTACH attribute is set but this field is not included, -the SUBJECT field is assumed to be the filename(s).</pre> -<pre>Name : DESTFILE -Value : 71h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Destination name for attached file(s)</pre> -<pre>Wildcards allowed. FILEATTACH field must also be included.</pre> -<pre>Name : FILEATTACHLIST -Value : 72h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of ASCII list of attached filenames</pre> -<pre>Wildcards not allowed in ASCII list filename. Wildcards allowed in ASCII list. -MSG_FILEATTACH attribute must be set.</pre> -<pre>Name : DESTFILELIST -Value : 73h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Name of ASCII list of destination filenames</pre> -<pre>Wildcards not allowed in ASCII list filename. Wildcards allowed in ASCII list.</pre> -<pre>Name : FILEREQUEST -Value : 74h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of requested file</pre> -<pre>Wildcards allowed. MSG_FILEREQUEST attribute must be set</pre> -<pre>Name : FILEPASSWORD -Value : 75h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Password for FILEREQUEST</pre> -<pre>Name : FILEREQUESTLIST -Value : 76h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of ASCII list of filenames to request</pre> -<pre>Wildcards allowed.</pre> -<pre>Name : FILEPASSWORDLIST -Value : 77h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Name of ASCII list of passwords for FILEREQUESTLIST - -Name : IMAGEATTACH -Value : 80h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached image file for display</pre> -<pre>MSG_FILEATTACH attribute must be set. See Image Types for valid -mattach_t.type values.</pre> -<pre>Name : ANIMATTACH -Value : 81h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached graphical animation file for display</pre> -<pre>MSG_FILEATTACH attribute must be set. See Animation Types for valid -mattach_t.type values.</pre> -<pre>Name : FONTATTACH -Value : 82h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached font definition file</pre> -<pre>MSG_FILEATTACH attribute must be set. See Font Types for valid mattach_t.type -values.</pre> -<pre>Name : SOUNDATTACH -Value : 83h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached sound file for playback</pre> -<pre>MSG_FILEATTACH attribute must be set. See Sound Types for valid mattach_t.type -values.</pre> -<pre>Name : PRESENTATTACH -Value : 84h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached presentation definition file</pre> -<pre>MSG_FILEATTACH attribute must be set. See Present Types for valid -mattach_t.type values. - -Name : VIDEOATTACH -Value : 85h -Data : vattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached interleaved video/sound file</pre> -<pre>MSG_FILEATTACH attribute must be set. See Video Types for valid -vattach_t.type values and Video Compression Types for valid vattach_t.comp -values.</pre> -<pre>Name : APPDATAATTACH -Value : 86h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Name of attached application data file for process/display</pre> -<pre>MSG_FILEATTACH attribute must be set. See Application Data Types for valid -mattach_t.type values. - -Name : IMAGETRIGGER -Value : 90h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of image file to trigger for display</pre> -<pre>See Image Types for valid typestr_t.type values.</pre> -<pre>Name : ANIMTRIGGER -Value : 91h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of animation file to trigger for display</pre> -<pre>See Animation Types for valid typestr_t.type values.</pre> -<pre>Name : FONTTRIGGER -Value : 92h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of font definition file to trigger</pre> -<pre>See Font Types for valid typestr_t.type values.</pre> -<pre>Name : SOUNDTRIGGER -Value : 93h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of sound file to trigger for playback</pre> -<pre>See Sound Types for valid typestr_t.type values.</pre> -<pre>Name : PRESENTTRIGGER -Value : 94h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of presentation definition file to trigger</pre> -<pre>See Present Types for valid typestr_t.type values.</pre> -<pre>Name : VIDEOTRIGGER -Value : 95h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of interleaved video/sound file to trigger</pre> -<pre>See Video Types for valid typestr_t.type values.</pre> -<pre>Name : APPDATATRIGGER -Value : 96h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of application data file to trigger</pre> -<pre>See Application Data Types for valid typestr_t.type values. - -Name : FIDOCTRL -Value : A0h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : keyword ":" [" "] appdata -Summary : FTS/FSC-compliant control information line</pre> -<pre>Any FidoNet FTS/FSC-compliant control information ("kludge") line that -does not have an equivalent representation here. All data not unique to the -actual control line, including leading and trailing white space, Ctrl-A (01h) -character and terminating CR must be ommitted. Defined in FTS-0001.</pre> -<pre>Name : FIDOAREA -Value : A1h -Data : ASCII -Multiple : No -Required : No -Summary : FTN EchoMail conference name.</pre> -<pre>Defined in FTS-0004.</pre> -<pre>Name : FIDOSEENBY -Value : A2h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : net"/"node [" "[net"/"]node] [...] -Summary : Used to store two-dimensional (net/node) SEEN-BY information</pre> -<pre>Often used in FTN EchoMail environments. Only the actual SEEN-BY data is stored -and SEEN-BY: is stripped along with any leading and trailing white space -characters. Defined in FTS-0004.</pre> -<pre>Name : FIDOPATH -Value : A3h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : net"/"node [" "[net"/"]node] [...] -Summary : Used to store two-dimensional (net/node)</pre> -<pre>Defined in FTS-0004. ^aPATH: is stripped along with any leading and trailing -white space characters. - -Name : FIDOMSGID -Value : A4h -Data : ASCII -Multiple : No -Required : No -Format : origaddr " " serialno -Summary : MSGID field as specified in FTS-0009.</pre> -<pre>Name : FIDOREPLYID -Value : A5h -Data : ASCII -Multiple : No -Required : No -Format : origaddr " " serialno -Summary : REPLY field as specified in FTS-0009.</pre> -<pre>Name : FIDOPID -Value : A6h -Data : ASCII -Multiple : No -Required : No -Format : pID " " version [" "serialno] -Summary : Identification string of program that created this message</pre> -<pre>Defined FSC-0046. "^aPID:" and any white space is not included.</pre> -<pre>Name : FIDOFLAGS -Value : A7h -Data : ASCII -Multiple : Yes -Required : No -Summary : Used to store the FTN FLAGS kludge information</pre> -<pre>Note that all FLAG options that have binary representation in the message -header must be removed from the FLAGS string prior to storing it. Only the -actual flags option string is stored and ^aFLAGS is stripped along with any -leading and trailing white space characters. Defined in FSC-0053. - -Name : RFC822HEADER -Value : B0h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : field-name ":" [field-body] [CRLF] -Summary : Undefined RFC-822 header field</pre> -<pre>Internet Message storage format, that does not have an equivalent -representation here. Folded header fields are allowed. Terminating CRLF may be -ommited.</pre> -<pre>Name : RFC822MSGID -Value : B1h -Data : ASCII -Multiple : No -Required : No -Format : "<" addr-spec ">" -Summary : Message-ID field as specified in RFC-822.</pre> -<pre>Name : RFC822REPLYID -Value : B2h -Data : ASCII -Multiple : No -Required : No -Format : "<" addr-spec ">" -Summary : In-Reply-To field as specified in RFC-822. - -Name : UNKNOWN -Value : F0h -Data : undef -Multiple : Yes -Required : No -Summary : Undefined header field of undefined type</pre> -<pre>This field is useful for retaining binary header fields (that do not have an -equivalent representation here) between message storage formats.</pre> -<pre>Name : UNKNOWNASCII -Value : F1h -Data : ASCII -Multiple : Yes -Required : No -Summary : Undefined header field of type ASCII</pre> -<pre>This field is useful for retaining ASCII header fields (that do not have an -equivalent representation here) between message storage formats.</pre> -<pre>Name : UNUSED -Value : FFh -Data : undef -Multiple : Yes -Required : No -Summary : Unused (deleted) header field</pre> -<pre>The data contained in this header field is of an unknown type and should not be -processed. -</pre> -<pre>Note: ----- -Specifically, not defined are the values F000h through FFFFh. These values -are to be used for user or system defined header fields. Digital Dynamics -requests that any developers or organizations that wish to have additional -header fields added to this specification notify Digital Dynamics through any -of the contact methods listed at the beginning of this document.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Data Field Types:">Data Field Types:</a></u></h2> -<pre>These are the defined valid values for dfield_t.type: -</pre> -<pre>Val Name Data Description ---- ---- ---- ----------- -00h TEXT_BODY mtext_t Displayable text (body of message). - Included in duplicate message checking. - All terminating white space and control - characters are to be truncated from data - (except when multiple contiguous CRLFs - terminate the text, only the last CRLF - is removed).</pre> -<pre>01h TEXT_SOUL mtext_t Non-displayed text. - Not normally displayed. Not necessarily - displayable. - Included in duplicate message checking.</pre> -<pre>02h TEXT_TAIL mtext_t Displayable text (tag/tear/origin lines, - etc). - Not included in duplicate message checking. - All terminating white space and control - characters are to be truncated from data.</pre> -<pre>03h TEXT_WING mtext_t Non-displayed text. - Not normally displayed. Not necessarily - displayable. - Not included in duplicate message checking.</pre> -<pre>10h FTEXT_BODY ftext_t Formatted equivalent of TEXT_BODY to be - displayed in place of TEXT_BODY if format - is supported. See Image Types for valid - values of ftext_t.type.</pre> -<pre>12h FTEXT_TAIL ftext_t Formatted equivalent of TEXT_TAIL to be - displayed in place of TEXT_TAIL if format - is supported. See Image Types for valid - values of ftext_t.type. - -20h IMAGEEMBED membed_t Type and data of embedded raster image file - for display. - See Image Types for valid membed.type - values.</pre> -<pre>21h ANIMEMBED membed_t Type and data of embedded graphical - animation file for display. - See Animation Types for valid membed.type - values.</pre> -<pre>22h FONTEMBED membed_t Type and data of embedded font definition - file. See Font Types for valid - membed_t.type values.</pre> -<pre>23h SOUNDEMBED membed_t Type and data of embedded sound file for - playback. - See Sound Types for valid membed_t.type - values.</pre> -<pre>24h PRESENTEMBED membed_t Type and data of embedded presentation - definition file. - See Present Types for valid membed_t.type - values.</pre> -<pre>25h VIDEOEMBED vembed_t Type and data of embedded video/sound file - for playback. - See Video Types for valid vembed_t.type - values. - See Video Compression Types for valid - vembed_t.comp values.</pre> -<pre>26h APPDATAEMBED membed_t Type and data of embedded application data - file for process/display. - See Application Data Types for valid - membed_t.type values.</pre> -<pre>FFh UNUSED undef Space allocated for future update/expansion -</pre> -<pre>Specifically, not defined are the values F000h through FFFFh. These values -are to be used for user or system defined data fields. Digital Dynamics -requests that any developers or organizations that wish to have additional -data fields added to this specification notify Digital Dynamics through any -of the contact methods listed at the beginning of this document.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Message Attributes:">Message Attributes:</a></u></h2> -<pre>These are the bit values for idxrec_t.attr and msghdr_t.attr:</pre> -<pre>MSG_PRIVATE (1<<0) // Private -MSG_READ (1<<1) // Read by addressee -MSG_PERMANENT (1<<2) // Permanent -MSG_LOCKED (1<<3) // Msg is locked, no editing possible -MSG_DELETE (1<<4) // Msg is marked for deletion -MSG_ANONYMOUS (1<<5) // Anonymous author -MSG_KILLREAD (1<<6) // Delete message after it has been read -MSG_MODERATED (1<<7) // This message must be validated before export -MSG_VALIDATED (1<<8) // This message has been validated by a moderator -</pre> -<pre><b>Auxiliary Attributes:</b> - -These are the bit values for msghdr_t.auxattr:</pre> -<pre>MSG_FILEREQUEST (1<<0) // File request -MSG_FILEATTACH (1<<1) // File(s) attached to Msg -MSG_TRUNCFILE (1<<2) // Truncate file(s) when sent -MSG_KILLFILE (1<<3) // Delete file(s) when sent -MSG_RECEIPTREQ (1<<4) // Return receipt requested -MSG_CONFIRMREQ (1<<5) // Confirmation receipt requested -MSG_NODISP (1<<6) // Msg may not be displayed to user -</pre> -<pre><b>Network Attributes: -</b> -These are the bit values for msghdr_t.netattr:</pre> -<pre>MSG_LOCAL (1<<0) // Msg created locally -MSG_INTRANSIT (1<<1) // Msg is in-transit -MSG_SENT (1<<2) // Sent to remote -MSG_KILLSENT (1<<3) // Kill when sent -MSG_ARCHIVESENT (1<<4) // Archive when sent -MSG_HOLD (1<<5) // Hold for pick-up -MSG_CRASH (1<<6) // Crash -MSG_IMMEDIATE (1<<7) // Send Msg now, ignore restrictions -MSG_DIRECT (1<<8) // Send directly to destination -MSG_GATE (1<<9) // Send via gateway -MSG_ORPHAN (1<<10) // Unknown destination -MSG_FPU (1<<11) // Force pickup -MSG_TYPELOCAL (1<<12) // Msg is for local use only -MSG_TYPEECHO (1<<13) // Msg is for conference distribution -MSG_TYPENET (1<<14) // Msg is direct network mail</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Translation Types:">Translation Types:</a></u></h2> -<pre>Definition for values of *.xlat[x]:</pre> -<pre>XLAT_NONE 0 // No translation/End of translation list -XLAT_LF2CRLF 1 // Expand sole LF to CRLF -XLAT_ESCAPED 2 // 7-bit ASCII escaping for ctrl and 8-bit data -XLAT_HUFFMAN 3 // Static and adaptive Huffman coding compression -XLAT_LZW 4 // LZW (Lempel-Ziv-Welch) encoding for compression - // Terry Welch, IEEE Computer Vol 17, No 6 - // June 1984, pp 8-19 -XLAT_LZC 5 // LZC (modified LZW) encoding for compression - // Unix compress program -XLAT_RLE 6 // Run length encoding compression -XLAT_IMPLODE 7 // Implode compression (PKZIP v1.x) -XLAT_SHRINK 8 // Shrink compression (PKZIP v1.x) -XLAT_LZH 9 // LZH dynamic Huffman coding - // Haruyasu Yoshizaki, LHarc - // November, 1988</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Agent Types:">Agent Types:</a></u></h2> -<pre>AGENT_PERSON 0 // To or from person -AGENT_PROCESS 1 // Unknown process, identified by agent name</pre> -<pre>Agent types E000h through EFFFh are reserved for Synchronet process types -(defined specifically by Digital Dynamics).</pre> -<pre><b>Note:</b> - -Specifically not defined are agent types F000h through FFFFh. These values -are to be used for user or system defined agent types. Digital Dynamics -requests that any developers or organizations that wish to have additional -agent types added to this specification notify Digital Dynamics through any -of the contact methods listed at the beginning of this document.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Network Types:">Network Types:</a></u></h2> -<pre> // Net Type Address Format - // ----------------------------------- -NET_NONE 0 // Locally created none -NET_UNKNOWN 1 // Unknown undef -NET_FIDO 2 // FTN network fidoaddr_t -NET_POSTLINK 3 // PostLink network none -NET_QWK 4 // QWK based network ASCII -NET_INTERNET 5 // The Internet ASCII -NET_WWIV 6 // WWIV based network ulong -NET_MHS 7 // MHS network ASCII</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Media Types:">Media Types:</a></u></h2> -<pre><b>Image Types:</b></pre> -<pre>IMAGE_UNKNOWN 0x00 // Use image signature header to determine format -IMAGE_ASC 0x01 // ASCII text/IBM extended ASCII graphics -IMAGE_ANS 0x02 // ANSI X3.64 terminal escape sequences -IMAGE_AVT 0x03 // AVATAR terminal escape sequences -IMAGE_LVI 0x04 // LVI terminal escape sequences -IMAGE_GIF 0x05 // Compuserve Graphics Interchange Format (GIF) -IMAGE_TIF 0x06 // Tagged Image Format (AKA TIFF) -IMAGE_JPG 0x07 // Joint Photographers Electronics Group (JPEG) -IMAGE_T16 0x08 // TrueVision 16-bit bitmap (TGA) -IMAGE_T24 0x09 // TrueVision 24-bit bitmap (TGA) -IMAGE_T32 0x0a // TrueVision 32-bit bitmpa (TGA) -IMAGE_PCX 0x0b // ZSoft PaintBrush graphics -IMAGE_BMP 0x0c // Windows bitmap -IMAGE_RLE 0x0d // Windows bitmap (compressed) -IMAGE_DIB 0x0e // Display independant bitmap -IMAGE_PCD 0x0f // Kodak PhotoCD -IMAGE_G3F 0x10 // Group 3 FAX -IMAGE_EPS 0x11 // Encapsulated PostScript -IMAGE_RTF 0x12 // Rich text format -IMAGE_RIP 0x13 // Remote Imaging Protocol Script (RIPscrip) -IMAGE_NAP 0x14 // NAPLPS -IMAGE_CDR 0x15 // Corel Draw! -IMAGE_CGM 0x16 // Computer graphics metafile -IMAGE_WMF 0x17 // Windows metafile -IMAGE_DFX 0x18 // Autodesk AutoCAD -IMAGE_IFF 0x19 // Amiga Interchange File Format -</pre> -<pre><b>Animation Types:</b></pre> -<pre>ANIM_UNKNOWN 0 // Use file signature header to determine format -ANIM_FLI 1 // Autodesk animator -ANIM_FLC 2 // Autodesk -ANIM_GL 3 // Grasprt -ANIM_IFF 4 // Amiga Interchange File Format -</pre> -<pre><b>Video Types:</b></pre> -<pre>VIDEO_UNKNOWN 0 // Use file signature header to determine format -VIDEO_QTIME 1 // Apple Quick-time -VIDEO_FQTIME 2 // Apple Flattened Quick-time -VIDEO_AVI 3 // Windows Auto/Video Interleave -VIDEO_ULT 4 // OS/2 Ultimotion - -<b>Video Compression Types:</b></pre> -<pre>VCOMP_UNKNOWN 0 // Use file signature header to determine codec -VCOMP_RLE 1 // Apple animation -VCOMP_SMC 2 // Apple graphics -VCOMP_RPZA 3 // Apple video -VCOMP_KLIC 4 // Captain crunch -VCOMP_CVID 5 // CinePak -VCOMP_RT21 6 // Intel indeo R2 -VCOMP_IV31 7 // Intel indeo R3 -VCOMP_YVU9 8 // Intel YVU9 -VCOMP_JPEG 9 // JPEG -VCOMP_MRLE 10 // Microsoft RLE -VCOMP_MSVC 11 // Microsoft video 1 -</pre> -<pre><b>Font Types:</b></pre> -<pre>FONT_UNKNOWN 0 // Use file signature header to determine format -FONT_TTF 1 // Windows TrueType -FONT_PFB 2 // PostScript Type 1 Font Binary -FONT_PFM 3 // PostScript Type 1 Font Metric -FONT_AMIGA 4 // Amiga Bitmapped -FONT_AGFA 5 // CompuGraphic Fonts -</pre> -<pre><b>Sound Types:</b></pre> -<pre>SOUND_UNKNOWN 0 // Use file signature header to determine format -SOUND_MOD 1 // MOD format -SOUND_VOC 2 // Sound Blaster VOC format -SOUND_WAV 3 // Windows 3.1 WAV RIFF format -SOUND_MID 4 // MIDI format -SOUND_GMID 5 // General MIDI format (standardized patches) -SOUND_SMP 6 // Turtle Beach SampleVision format -SOUND_SF 7 // IRCAM format -SOUND_AU 8 // Sun Microsystems AU format -SOUND_IFF 9 // Amiga Interchange File Format - -<b>Application Data Types:</b></pre> -<pre>APPDATA_UNKNOWN 0 // Use file signature header to determine format -APPDATA_WORDPERFECT 1 // WordPerfect Document -APPDATA_WKS 2 // Lotus 123 Worksheet (?) -APPDATA_WK1 3 // Lotus 123 Worksheet rev 1 -APPDATA_WK2 4 // Lotus 123 Worksheet rev 2 -APPDATA_WK3 5 // Lotus 123 Worksheet rev 3 -APPDATA_DBF 6 // dBase III data file -APPDATA_PDX 7 // Paradox data file -APPDATA_EXCEL 8 // Excel data file -APPDATA_QUATRO 9 // Borland Quatro Pro file -APPDATA_WORD 10 // Microsoft Word</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Message Storage Pseudo Code">Message Storage Pseudo Code</a></u></h2> -<pre>The following is a "C like" pseudo code listing example of adding a message to -an SMB message base. SMBLIB contains C functions to do most of the following -operations. We are supplying this pseudo code as a general definition of the -order of required operations in writing to the message base. Many details have -been left out to simplify the code and to demonstrate only the basic -principles.</pre> -<pre>shd = open ( MSGBASE.SHD , READ/WRITE/DENY_NONE ) -sdt = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) -sid = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE )</pre> -<pre>lock ( shd , smbhdr ) -read ( shd , smbstatus )</pre> -<pre>if ( smbstatus.attr & SMB_HYPERALLOC ) - msg.hdr.offset = filelength ( sdt )</pre> -<pre>else { - number_of_blocks = length_of_message_data / SDT_BLOCK_LEN - if ( length_of_message_data % SDT_BLOCK_LEN ) /* unevenly divisible */ - number_of_blocks = number_of_blocks + 1</pre> -<pre> sda = open ( MSGBASE.SDA , READ/WRITE/DENY_ALL )</pre> -<pre> if ( fast_allocation_mode ) - seek ( sda , END_OF_FILE )</pre> -<pre> else { - seek ( sda , BEGINNING_OF_FILE ) - while ( not end_of_file ( sda ) ) { - read ( sda , allocated , number_of_blocks * 2 ) - if ( allocated = 0 ) { - seek_backwards ( sda , number_of_blocks * 2 ) - break - } - } - }</pre> -<pre> msg.hdr.offset = ( current_position ( sda ) / 2 ) * SDT_BLOCK_LEN</pre> -<pre> allocated = 1</pre> -<pre> write ( sda , allocated , number_of_blocks * 2 )</pre> -<pre> close ( sda ) -} - -seek ( sdt , msg.hdr.offset )</pre> -<pre>write ( sdt , message_data )</pre> -<pre>if ( smbstatus.attr & SMB_HYPERALLOC ) - msg.idx.offset = filelength ( shd )</pre> -<pre>else { - number_of_blocks = length_of_message_header / SHD_BLOCK_LEN - if ( length_of_message_header % SHD_BLOCK_LEN ) /* unevenly divisible */ - number_of_blocks = number_of_blocks + 1</pre> -<pre> sha = open ( MSGBASE.SHA , READ/WRITE/DENY_ALL )</pre> -<pre> if ( fast_allocation_mode ) - seek ( sha , END_OF_FILE )</pre> -<pre> else { - seek ( sha , BEGINNING_OF_FILE ) - while ( not end_of_file ( sha ) ) { - read ( sha , allocated , number_of_blocks ) - if ( allocated = 0 ) { - seek_backwards ( sha , number_of_blocks ) - break - } - } - }</pre> -<pre> msg.idx.offset = ( current_position ( sha ) * SHD_BLOCK_LEN ) - msg.idx.offset = msg.idx.offset + smbstatus.header_offset</pre> -<pre> allocated = 1</pre> -<pre> write ( sha , allocated , number_of_blocks )</pre> -<pre> close ( sha ) -}</pre> -<pre>seek ( shd , msg.idx.offset )</pre> -<pre>msg.hdr.number = smbstatus.last_msg+1</pre> -<pre>write ( shd , msg.hdr )</pre> -<pre>smbstatus.total_msgs = smbstatus.total_msgs + 1 -smbstatus.last_msg = msg.hdr.number</pre> -<pre>write ( shd , smbstatus )</pre> -<pre>write ( sid , msg.idx )</pre> -<pre>unlock ( shd , smbstatus )</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Message Retrieval Pseudo Code">Message Retrieval Pseudo Code</a></u></h2> -<pre>shd = open ( MSGBASE.SHD , READ/WRITE/DENY_NONE ) -sdt = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) -sid = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE )</pre> -<pre>read ( sid , msg.idx )</pre> -<pre>seek ( shd , msg.idx.offset )</pre> -<pre>lock ( shd , msg.hdr )</pre> -<pre>read ( shd , msg.hdr )</pre> -<pre>seek ( sdt , msg.hdr.offset )</pre> -<pre>read ( sdt , msg.hdr.data_length )</pre> -<pre>unlock ( shd , msg.hdr )</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="SMBUTIL">SMBUTIL</a></u></h2> -<pre>SMBUTIL is a utility that can perform various functions on an SMB message base. -The primary purpose of SMBUTIL is as an example to C programmers of how to use -the SMBLIB functions to access and modify an SMB message base. The complete C -source code for SMBUTIL is included and functions from it can be used or -modified by developers at their own discretion. The following files make up -SMBUTIL:</pre> -<pre>SMBUTIL.EXE Compiled and linked for 16-bit DOS (ready to run) -SMBUTIL.C C functions -SMBUTIL.H C definitions and variable prototypes -SMBUTIL.WAT Makefile for Watcom C/C++ (type wmake -f smbutil.wat) -SMBUTIL.BOR Makefile for Borland C/C++ (type make -f smbutil.bor)</pre> -<pre>The usage syntax is as follows:</pre> -<pre>SMBUTIL [/opts] cmd smb_filespec.shd</pre> -<pre>where cmd is one or more of the following:</pre> -<pre> l[n] = list msgs starting at number n - r[n] = read msgs starting at number n - v[n] = view msg headers starting at number n - k[n] = kill (delete) n msgs - i<f> = import from text file f - s = display msg base status - c = change msg base status - m = maintain msg base - delete old msgs and msgs over max - p[k] = pack msg base (k specifies minimum packable Kbytes)</pre> -<pre>where opts is one or more of the following:</pre> -<pre> a = always (force) packing - z<n> = set time zone (n=min +/- from UT or 'EST','EDT','CST',etc)</pre> -<pre>and smb_filespec is the base filename or file specification (wildcards) for the -message base. If wildcards are used, the ".SHD" extension must be specified.</pre> -<pre>An example command line:</pre> -<pre>SMBUTIL MP C:\SBBS\DATA\SUBS\*.SHD</pre> -<pre>would maintain and pack all the message bases found in the C:\SBBS\DATA\SUBS -directory.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="CHKSMB">CHKSMB</a></u></h2> -<pre>CHKSMB is a utility that performs a comprehensive analysis of a message base -to find any possible errors and calculate the number of packable bytes. It does -not "fix" a message base if any errors are found, it only reports the specific -errors (and exits with a non-zero error level). If any errors are reported, -packing the message base with SMBUTIL may rebuild the damaged files. If that -doesn't work, then use FIXSMB as a last resort.</pre> -<pre>C source code for CHKSMB is also included as an example to programmers of how -to use SMBLIB functions.</pre> -<pre>The usage syntax is as follows:</pre> -<pre>CHKSMB [/opts] smb_filespec.shd</pre> -<pre>where opts is one or more of the following:</pre> -<pre> q = quiet mode (no beeps) - s = stop after an erred message base (for use with wildcards) - p = pause after an erred message base (wait for key press) - t = don't check for unsupported translation strings (faster) - e = display extended information on corrupted messages</pre> -<pre>An example command line:</pre> -<pre>CHKSMB /QP C:\SBBS\DATA\SUBS\*.SHD</pre> -<pre>would check all the message bases in the C:\SBBS\DATA\SUBS directory, without -beeping on errors, and pausing after an erred message base.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="FIXSMB">FIXSMB</a></u></h2> -<pre>FIXSMB is a utility that will rebuild the index and allocation files for a -message base. Since the message headers are not necessarily stored -sequentially, the order of the messages in the index may be changed when the -index is rebuilt. Messages are also re-numbered, so only use this program if -the index is corrupted and the messages are extremely important.</pre> -<pre>C source code for FIXSMB is also included as an example to programmers of how -to use SMBLIB functions.</pre> -<pre>The usage syntax is as follows:</pre> -<pre>FIXSMB [/M] smb_file</pre> -<pre>An example command line:</pre> -<pre>FIXSMB \SBBS\DATA\MAIL</pre> -<pre>Only use the "/M" command line switch if fixing an older Synchronet e-mail -message base (created with SBBS v2.1 or earlier). Once the SMB_EMAIL status -attr is set ("SMBUTIL S" will report a status attr of 1), the "/M" is not -required.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="SMBLIB">SMBLIB</a></u></h2> -<pre>SMBLIB is a library of C functions for accessing and storing messages in an -SMB format message base. It can eliminate much of the development time for -developers that wish to use the library in whole or in part, or use the -functions as examples for their own message base function library. The library -consists of the following files:</pre> -<pre>SMBDEFS.H Constant definitions, macros, and data types -SMBLIB.H Library constants and function prototypes -SMBLIB.C Function definitions -SMBVARS.C Global variable definitions (doubles as declaration file)</pre> -<pre>For developers to use this library with their program, they must include the -"SMBLIB.H" header file at the top of each C file that uses any of the library -functions, global variables, data types, macros, and constants. This can be -done by simply adding the following line to each .C file:</pre> -<pre>#include "smblib.h"</pre> -<pre>If SMBLIB.H is included, there is no need to include SMBDEFS.H or SMBVARS.C.</pre> -<pre>To link the library functions and variables with a main program, the files -SMBVARS.OBJ and SMBLIB.OBJ must be linked with the main program .OBJ files. -If the operating system is DOS, be sure that all .OBJ files are compiled for -the same memory model.</pre> -<pre>Example MAKEFILEs for compiling and linking SMBUTIL with Borland C/C++ -(SMBUTIL.BOR) and Watcom C/C++ (SMBUTIL.WAT) are included.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="SMBDEFS.H">SMBDEFS.H</a></u></h3> -<pre>The SMBDEFS.H file contains important constant definitions and data types (also -defined in this document). If ever this document and SMBDEFS.H are inconsistent -with each other, then SMBDEFS.H is to be considered correct and this document -in error. If such a discrepancy is found, please notify Digital Dynamics so it -can be corrected in a future revision of the specification.</pre> -<pre>Most notable of the data types is a structure called smbmsg_t (not defined -in this document). It contains the fixed and variable portions of a message's -header record as well as convenience pointers to the sender's name -(smbmsg_t.to), recipient's name (smbmsg_t.from), network addresses, and more. -If multiple SENDER header fields are included (for example), then smbmsg_t.to -will point to the last SENDER header field in the header record. Convenience -pointers for other data items work in the same fashion if multiple header fields -of the same type exist in the header record.</pre> -<pre>Variables of the smbmsg_t data type (and pointers to variables of smbmsg_t -type) are used as arguments to many of the SMBLIB functions.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="SMBVARS.C">SMBVARS.C</a></u></h3> -<pre>The SMBVARS.C file contains definitions of the global variables used by the -SMBLIB functions. It is a fairly small file since their are a small number of -global variables (by design). This file is used for both definitions and -declarations, so no "extern" declarations need to be made in developers source -code as long as SMBVARS.C or (preferably) SMBLIB.H is included in the source -code.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="SMBLIB.H">SMBLIB.H</a></u></h3> -<pre>The SMBLIB.H file contains prototypes of all the functions in the SMBLIB.C -file. It is necessary to include this file in C source code if any of the -SMBLIB functions are used. The following C source line will include this file:</pre> -<pre>#include "smblib.h"</pre> -<pre>and should be placed near the top of all C source files that use SMBLIB -functions, variables, constants, or data types.</pre> -<pre>Function prototypes are necessary for compilers to know the correct calling -syntax of a function and detect incorrect usage. Prototypes are also useful -as a quick reference for programmers as to the correct calling syntax of a -specific function.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="SMBLIB.C">SMBLIB.C</a></u></h3> -<pre>The SMBLIB.C file contains the actual SMBLIB library functions. This source -file is not a stand alone program, but instead must be compiled and linked -with a main source file to create the executable program.</pre> -<pre>The functions in this file are organized in a logical order, but their order -is actually irrelevant to the compiling, linking, and execution of the -resulting program.</pre> -<pre>A comment block precedes each function, explaining what the function does, -how the passed parameters are used, and what the return code (if any) -indicates. A more detailed explanation of each function is included here:</pre> -<pre><b>int smb_open(int retry_time)</b> - -The smb_open() function must be called before the message base is accessed -(read from or written to). The parameter, retry_time, is the maximum number -of seconds to wait while retrying to lock the message base header. If -retry_time is 0, then the message base header is not locked or read (this is -called "Fast Open" and should only be used when speed is more important than -checking for compatibility and validity upon opening). The global variable -smb_file must be initialized with the path and base filename of the message -base. This function returns 0 on success, 1 if the .SDT file could not be -opened, 2 if the .SHD file could not be opened, and 3 if the .SID file could -not be opened. If the message base header could not be locked, this function -returns -1. If the message base ID is incorrect, it returns -2. And if the -message base is of an incompatible version, it returns -3.</pre> -<pre>The errno global variable (standard of most C libraries) will most likely -contain the error code for open failure.</pre> -<pre><b>int smb_open_da(int retry_time)</b> - -The smb_open_da() function is used to open the data block allocation file for -writing messages to a message base. The parameter, retry_time, is the maximum -number of seconds to wait while retrying to open the file. This function -returns 0 on success. -1 is returned if an open error other than "Access -Denied" is returned from the operating system, and the global variable errno -will contain the error code. -2 is returned if the retry_time has been -reached, and -3 is returned if the file descriptor could not be converted to -a stream by the fdopen() function.</pre> -<pre>fclose(sda_fp) should be called immediately after all necessary file access -has been completed.</pre> -<pre>This function is not used with the Hyper Allocation storage method. - -<b>int smb_open_ha(int retry_time) -</b> -The smb_open_ha() function is used to open the header block allocation file for -writing messages to a message base. The parameter, retry_time, is the maximum -number of seconds to wait while retrying to open the file. This function -returns 0 on success. -1 is returned if an open error other than "Access -Denied" is returned from the operating system, and the global variable errno -will contain the error code. -2 is returned if the retry_time has been -reached, and -3 is returned if the file descriptor could not be converted to -a stream by the fdopen() function.</pre> -<pre>fclose(sha_fp) should be called immediately after all necessary file access -has been completed.</pre> -<pre>This function is not used with the Hyper Allocation storage method.</pre> -<pre><b>int smb_create(ulong max_crcs, ulong max_msgs, ushort max_age, ushort attr, int retry_time)</b> - -The smb_create() function is used to create a new message base or reset an -existing message base. The parameters max_crcs, max_msgs, max_age, and attr -are used to set the initial status of the message base status header. The -parameter, retry_time is the maximum number of seconds to wait while retrying -to lock the message base header. This functions returns 0 on success or 1 if -the message base header could not be locked.</pre> -<pre><b>int smb_trunchdr(int retry_time) -</b> -The smb_trunchdr() function is used to truncate the header file when packing -the message base and writing the new header information back to the header -file. The parameter, retry_time is the maximum number of seconds to wait while -retrying to truncate the header file. Returns 0 on success, -1 if error was -other than "Access Denied", or -2 if retry_time reached.</pre> -<pre><b>int smb_locksmbhdr(int retry_time)</b></pre> -<pre>The smb_locksmbhdr() function is used to lock the first message base (status) -header. The parameter, retry_time is the number of seconds to wait while -retrying to lock the header. The smb_unlocksmbhdr() function should always be -used to unlock the header after accessing the message base header (usually -with smb_getstatus() and/or smb_putstatus()). Returns 0 if successful, -1 if -unsuccessful.</pre> -<pre><b>int smb_unlocksmbhdr() -</b> -The smb_unlocksmbhdr() function is used to unlock a previously locked message -base header (using smb_lockmsghdr()). Returns 0 on success, non-zero on -failure.</pre> -<pre><b>int smb_getstatus(smbstatus_t *hdr) -</b> -The smb_getstatus() function is used to read the status message base header -into the hdr structure. Returns 0 on success, 1 on failure.</pre> -<pre><b>int smb_putstatus(smbstatus_t hdr)</b></pre> -<pre>The smb_putstatus() function is used to write the status information to the -first message base header. The parameter hdr, contains the status information -to be written. Returns 0 on success, 1 on failure.</pre> -<pre><b>int smb_getmsgidx(smbmsg_t *msg)</b> - -The smb_getmsgidx() function is used to get the byte offset for a specific -message header in the message header file based on the message base index.</pre> -<pre>If msg->hdr.number is non-zero when this function is called, then the index -will be searched for this message number. If the message number is found in -the index, the msg->idx.offset is set to the byte offset of the message header -record in the header file and msg->offset is set to the record offset of the -index record in the index file, and the function returns 0. If the message -number is not found in the index, the function returns 1.</pre> -<pre>If msg->hdr.number is zero, msg->idx.offset and msg->idx.number are obtained -from the index record at record offset msg->offset. If msg->offset is an -invalid record offset when this function is called, the function returns 1. -Otherwise, the function returns 0.</pre> -<pre><b>int smb_getlastidx(idxrec_t *idx)</b> - -Reads the last index record of the currently open message base into the -idxrec_t structure pointed to by idx. Returns 0 if successful, -1 if the index -is empty or unopened, or -2 if the record can't be read.</pre> -<pre><b>int smb_getmsghdrlen(smbmsg_t msg)</b> - -The smb_getmsghdrlen() function is used to calculate the total length of -message header msg including both fixed and variable length portions. This -function returns the length of the header record in bytes.</pre> -<pre><b>long smb_getmsgdatlen(smbmsg_t msg)</b> - -The smb_getmsgdatlen() function is used to calculate the total length of the -data for message msg. This function returns the length of all data fields -combined.</pre> -<pre><b>int smb_lockmsghdr(smbmsg_t msg, int retry_time)</b> - -The smb_lockmsghdr() function is used to lock the header record for message -msg. The parameter retry_time is the maximum number of seconds to wait while -retrying to lock the header. Returns 0 on success, -1 on failure. The function -smb_unlockmsghdr() should immediately be called after accessing the message -header (usually with smb_getmsghdr() or smb_putmsghdr()). - -<b>int smb_getmsghdr(smbmsg_t *msg)</b> - -The function smb_getmsghdr() is used to read the header record for message -msg. msg->idx.offset must be initialized to the byte offset of the header -record in the header file before this function is called. The function -smb_freemsgmem() must be called to free the memory allocated by this function -for the header and data fields. This function returns 0 on success, -1 if -the fixed portion of the message header record could not be read, -2 if the -message header ID was incorrect, -3 if memory could not be allocated, -4 -if a data field could not be read, -5 if the fixed length portion of a header -field could not be read, -6 if the variable length portion of a header field -could not be read, -7 if one or more of the mandatory header fields (SENDER, -RECIPIENT, or SUBJECT) are missing, -8 if total_dfields extends beyond the -end of the header record, or -9 if incompatible header version.</pre> -<pre>Several convenience pointers in the msg structure are initialized by this -function to point to the last occurrence of the SENDER (msg->from), RECIPIENT -(msg->to), SUBJECT (msg->subj), etc.</pre> -<pre><b>int smb_unlockmsghdr(smbmsg_t msg)</b> - -The smb_unlockmsghdr() function is used to unlock a previously locked message -header (with smb_lockmsghdr()). This function returns 0 on success, non-zero -on failure.</pre> -<pre><b>int smb_addcrc(ulong max_crcs, ulong crc, int retry_time)</b> - -The smb_addcrc() function is used to add a CRC-32 to the CRC history file -for a message base, automatically checking for duplicates. The parameter -max_crcs should be the max_crcs defined in the status header of the message -base. The parameter crc, is the CRC-32 of the TEXT_BODY and TEXT_SOUL data -fields for the message. The parameter retry_time is the maximum number of -seconds to wait when retrying to open the CRC history file.</pre> -<pre>This function returns -1 if there was an open error, -2 if the retry_time -was reached, -3 if there was a memory allocation error, 1 if the CRC already -exists in the CRC history file (indicating a duplicate message), or 0 on -success (and no duplicate).</pre> -<pre><b>int smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data)</b> - -The smb_hfield() function is used to add a header field to the structure msg. -The parameters type, length, and data, must be specified according to the -header field values listed in this specification. This function returns 0 -on success, non-zero on memory allocation error. The function smb_freemsgmem() -must be called to free the memory allocated by this function.</pre> -<pre><b>int smb_dfield(smbmsg_t *msg, ushort type, ulong length)</b> - -The smb_dfield() function is used to add a data field to the structure msg. -The parameters type and length must be specified according to the data field -values listed in this specification. This function returns 0 on success, -non-zero on memory allocation error. The function smb_freemsgmem() must be -called to free the memory allocated by this function.</pre> -<pre><b>int smb_addmsghdr(smbmsg_t *msg,smbstatus_t *status,int storage,int retry_time)</b> - -The smb_addmsghdr() function is used to add a new message header to the message -header file and update the index file. The msg and status structures are -updated to reflect the new total messages, last message number, etc. The -storage parameter is used to indicate the storage method to use (either -SMB_SELFPACK, SMB_FASTALLOC, or SMB_HYPERALLOC). If the storage type is -SMB_SELFPACK, the header block allocation file will be searched for unused -block(s) to store this header. If the storage type is SMB_FASTALLOC or -SMB_HYPERALLOC, the header is stored at the end of the header file. Returns 0 -on success, non-zero on failure. The parameter retry_time is the maximum number -of seconds to wait while retrying to lock and open files.</pre> -<pre><b>int smb_putmsg(smbmsg_t msg)</b> - -The smb_putmsg() function calls both the smb_putmsghdr() and smb_putmsgidx() -functions to write the header and index elements of a message to the -appropriate files. Returns 0 on success, non-zero on failure.</pre> -<pre><b>int smb_putmsgidx(smbmsg_t msg)</b> - -The smb_putmsgidx() function is used to store a message index in the message -index file. The message index can be for a new message or an existing -message. Returns 0 on success, non-zero on failure.</pre> -<pre><b>int smb_putmsghdr(smbmsg_t msg)</b> - -The smb_putmsghdr() function is used to store a message header in the message -header file. The message header can be for a new message or an existing -message. Returns 0 on success, non-zero on failure.</pre> -<pre><b>void smb_freemsgmem(smbmsg_t msg)</b> - -Frees allocated memory for the header and data fields in the msg structure. -This function must be called to free the memory allocated by the functions -smb_hfield(), smb_dfield(), and smb_getmsghdr().</pre> -<pre><b>long smb_hdrblocks(ulong length) -</b> -The smb_hdrblocks() function is used to calculate the number of blocks -required to store a message header of length size (in bytes). This function -returns the number of blocks required.</pre> -<pre><b>long smb_datblocks(ulong length)</b></pre> -<pre>The smb_datblocks() function is used to calculate the number of blocks -required to store message data of length size (in byte). This function returns -the number of blocks required. - -<b>long smb_allochdr(ulong length)</b> - -The smb_allochdr() function is used to search for free blocks to store a -message header of length bytes and mark the free blocks as allocated in the -header allocation file. This function returns the byte offset to the header -record or a negative number on error. The function smb_open_ha() should be -called prior to calling this function and fclose(sha_fp) should be called -after. The function is called from smb_addmsghdr(), so you probably have no -need to call this function directly.</pre> -<pre><b>long smb_fallochdr(ulong length)</b> - -The smb_fallochdr() function works exactly the same as the smb_allochdr() -function except it is much faster because the header allocation file is not -searched for free blocks. The function is called from smb_addmsghdr(), so you -probably have no need to call this function directly.</pre> -<pre><b>long smb_hallochdr(ulong header_offset) -</b> -This smb_hallochdr() functions works exactly the same as the smb_fallochdr() -function except the status.header_offset is passed as the argument and the -header allocation (.SHA) file is not updated so smb_open_ha() need not be -called. The function is called from smb_addmsghdr(), so you probably have no -need to call this function directly.</pre> -<pre><b>long smb_allocdat(ulong length, ushort headers)</b></pre> -<pre>The smb_allocdat() function is used to search for free blocks to store length -amount of data for a message. The parameter headers, indicates the number of -message headers that are associated with this data. Normally, the headers -parameter will be 1, unless this message is part of a mass mailing. The offset -to the allocated data blocks is returned, or a negative value on error. The -function smb_open_da() should be called prior to calling this function and -fclose(sda_fp) should be called after.</pre> -<pre><b>long smb_fallocdat(ulong length, ushort headers) -</b> -The smb_fallocdat() function works exactly the same as the smb_allocdat() -function except it is much faster because the data allocation file is not -searched for free blocks.</pre> -<pre><b>long smb_hallocdat()</b> - -The smb_hallocdat() function works exactly the same as the smb_hallocdat() -function except no argument is passed and the data allocation file (.SDA) is -not updated so smb_open_da() need not be called. - -<b>int smb_incdat(ulong offset, ulong length, ushort headers) -</b> -The smb_incdat() function is used to increment the header counter in the data -allocation file for the data starting at the byte offset and length size in -bytes. The parameter headers, indicates the number of headers to add to the -current allocation value in the data allocation file. Returns 0 on success, -non-zero on failure.</pre> -<pre><b>int smb_freemsg(smbmsg_t msg, smbstatus_t status) -</b> -The smb_freemsg() function is used to free the disk space allocated for the -header and data fields of the message msg. Returns 0 on success, non-zero on -failure. The parameter, status, must be the current status from the message -base header for this message base.</pre> -<pre><b>int smb_freemsgdat(ulong offset, ulong length, ushort headers)</b></pre> -<pre>The smb_freemsgdat() function is used to decrement the data block allocation -records in the data allocation file associated with the data in the data file -by the value of the headers parameter (normally 1). The parameter offset -indicates the byte offset to the beginning of the message data in the data -file and the parameter length is the total length of the message data. -Returns 0 on success, non-zero on failure.</pre> -<pre><b>int smb_freemsghdr(ulong offset, ulong length) -</b> -The smb_freemsghdr() function is used to set the header block allocation -records in the header allocation file to 0 (indicated non-allocated block). -The parameter offset indicates the byte offset to the beginning of the header -record being freed and the parameter length indicates the total length of the -header record. Returns 0 on success, non-zero on failure.</pre> -<pre><b>int smb_stack(int op)</b> - -The smb_stack() function is used to save and restore message base information -so that multiple message bases can be open simultaneously. The stack can -save up to 4 message bases (allowing 5 simultaneously open message bases). -The stack is a "last in, first out" storage area for open message bases. -If the op parameter is SMB_STACK_PUSH, smb_stack() will save (push) the current -message base onto the stack. Calling smb_stack(SMB_STACK_POP) will restore -(pop) the most recently pushed message base off the stack. Calling -smb_stack(SMB_STACK_XCHNG) will exchange the most recently pushed message base -and the current message base (replacing the top of the stack with the current -message base).</pre> -<pre><b>void smb_close() -</b> -Closes the header, data, and index files for the currently open message base.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h3><u><a name="Miscellaneous SMBLIB Files">Miscellaneous SMBLIB Files</a></u></h3> -<pre><b>CRC32.H C header file for CRC-32 calculations</b> - -This file contains a static 32-bit CRC table (crc32tbl[]) and a macro (ucrc32) -that uses this table to calculate 32-bit CRCs one byte at a time.</pre> -<pre>Example:</pre> -<pre> ulong crc=0xffffffff;</pre> -<pre>for(i=0;i<length;i++) - crc=ucrc32(buf[i],crc); -crc=~crc; -</pre> -<pre><b>CRC16.C C functions for 16-bit CRC calculations</b></pre> -<pre>This file contains a function (ucrc16), to calculate 16-bit CRCs one byte at a -time and a function (crc16) that uses the ucrc16() function to calculate the -16-bit CRC of an ASCIIZ character string.</pre> -<pre>Example:</pre> -<pre> ushort crc;</pre> -<pre>crc=crc16("Text"); - -<b>LZH.H Function prototypes for LZH.C</b> - -This file contains function prototypes for the two most important functions -in LZH.C, lzh_encode() and lzh_decode().</pre> -<pre>Example:</pre> -<pre> uchar str[256],lzh[512]; - long length;</pre> -<pre>strcpy(str,"This is a string of text"); -length=lzh_encode(str,strlen(str),lzh); -lzh_decode(lzh,length,str); -</pre> -<pre><b>LZH.C C functions for LZH encoding (compression/decompression)</b> - -This file contains the functions for encoding and decoding LZH compressed -data. If the macro LZH_DYNAMIC_BUF is defined when this file is compiled, -temporary buffers will be dynamically allocated as opposed to static. This -may be slower than the static buffer method, but frees the allocated memory -after encoding or decoding. If free memory for your application is an issue, -then define this macro when compiling this file.</pre> -<pre>Example (Borland C):</pre> -<pre>bcc -c -DLZH_DYNAMIC_BUF lzh</pre> -<pre>Example (Watcom C):</pre> -<pre>wcc -dLZH_DYNAMIC_BUF lzh</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="SMBLIB Storage Example">SMBLIB Storage Example</a></u></h2> -<pre>#include "smblib.h" -#include "crc16.c"</pre> -<pre>int main(void) -{ - char str[256] // General purpose string - ,*msg_text="Hello, world!" // Message text - ,nul_buf[SDT_BLOCK_LEN]={0} // NULL initialized buffer - ; - int i // General purpose integer - ,storage=SMB_SELFPACK // Default storage method - ,retry=10 // Retry for opening/locking files - ; - ushort max_age=0 // Default maximum age of messages - ,xlat=XLAT_NONE // Translation string - ,tzone=PST // Time zone - ,copies=1 // Number of copies of this msg - ; - ulong max_msgs=500 // Default max number of msgs - ,max_crcs=0 // Default max crcs - ,length // Length of msg text - ,offset // Offset to msg text in data file - ; - smbmsg_t msg; // Message structure - smbstatus_t status; // Message base status record</pre> -<pre>strcpy(smb_file,"MSGBASE"); // We'll use "MSGBASE" for the name -if((i=smb_open(retry))!=0) { // Can't open!?! - printf("smb_open returned %d\n",i); - return(1); }</pre> -<pre>if(!filelength(fileno(shd_fp))) // Message base not created yet - smb_create(max_crcs // Create with default settings - ,max_msgs - ,max_age - ,storage==SMB_HYPERALLOC - ? SMB_HYPERALLOC : 0 // SMB_EMAIL if this was e-mail - ,retry - );</pre> -<pre>if((i=smb_locksmbhdr(retry))!=0) { // Can't lock status base header - printf("smb_locksmbhdr returned %d\n",i); - smb_close(); - return(1); }</pre> -<pre>if((i=smb_getstatus(&status))!=0) { // Can't read status base header - smb_unlocksmbhdr(); - smb_close(); - printf("smb_getstatus returned %d\n",i); - return(1); }</pre> -<pre>if(status.attr&SMB_HYPERALLOC) - storage=SMB_HYPERALLOC; -else - storage=SMB_SELFPACK;</pre> -<pre>length=strlen(msg_text); // Get length of message -length+=sizeof(xlat); // Add length of xlat string</pre> -<pre>if(storage==SMB_HYPERALLOC) // Allocate space for message text - offset=smb_hallocdat(); -else { - if((i=smb_open_da(retry))!=0) { - smb_unlocksmbhdr(); - printf("smb_open_da returned %d\n",i); - smb_close(); - return(1); } - if(storage==SMB_FASTALLOC) - offset=smb_fallocdat(length,copies); - else - offset=smb_allocdat(length,copies); - fclose(sda_fp); }</pre> -<pre>fseek(sdt_fp,offset,SEEK_SET); // Seek to beginning of data block -fwrite(&xlat,sizeof(xlat),1,sdt_fp); // Write xlat string -fwrite(msg_text,strlen(msg_text),1,sdt_fp); // Write message text -fwrite(nul_buf,SDT_BLOCK_LEN-length // Write NULLs out to end of block - ,1,sdt_fp); -fflush(sdt_fp); // Flush output buffer -smb_unlocksmbhdr(); // Unlock status base header</pre> -<pre>memset(&msg,0,sizeof(smbmsg_t)); // Initialize header to NULL -memcpy(msg.hdr.id,"SHD\x1a",4); // Always set to SHD^Z -msg.hdr.version=SMB_VERSION; -msg.hdr.when_written.time=time(NULL); -msg.hdr.when_written.zone=tzone; -msg.hdr.when_imported.time=time(NULL); -msg.hdr.when_imported.zone=tzone; -msg.hdr.offset=offset;</pre> -<pre>strcpy(str,"All"); // Send message to "All" -if((i=smb_hfield(&msg,RECIPIENT,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_close(); - return(1); } -strlwr(str); // If this were e-mail, idx.to -msg.idx.to=crc16(str); // would be the "to" user number - -strcpy(str,"Sysop"); // Send message from "Sysop" -if((i=smb_hfield(&msg,SENDER,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } -strlwr(str); // If this were e-mail, idx.from -msg.idx.from=crc16(str); // would be the "from" user number</pre> -<pre>strcpy(str,"This is a test"); // Set the message subject/title -if((i=smb_hfield(&msg,SUBJECT,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } -strlwr(str); -msg.idx.subj=crc16(str);</pre> -<pre>if((i=smb_dfield(&msg,TEXT_BODY,length))!=0) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); }</pre> -<pre>if((i=smb_addmsghdr(&msg,&status,storage,retry))!=0) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); }</pre> -<pre>smb_freemsgmem(msg); // Unnecessary if exiting main() -smb_close(); // Unnecessary if exiting main() -return(0); -}</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="SMBLIB Retrieval Example">SMBLIB Retrieval Example</a></u></h2> -<pre>#include "smblib.h"</pre> -<pre>int main(void) -{ - char ch; // General purpose character - int i, // General purpose integer - retry=10; // Retry for opening/locking files - ushort xlat; // Translation string - ulong l; // General purpose long integer - smbmsg_t msg; // Message structure</pre> -<pre>strcpy(smb_file,"MSGBASE"); // We'll use "MSGBASE" for the name -if((i=smb_open(retry))!=0) { // Can't open!?! - printf("smb_open returned %d\n",i); - return(1); }</pre> -<pre>if(!filelength(fileno(shd_fp))) { // Message base not created yet - printf("Empty\n"); - smb_close(); - return(0); }</pre> -<pre>for(msg.offset=0;!ferror(sid_fp);msg.offset++) {</pre> -<pre> fseek(sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) - break;</pre> -<pre> if((i=smb_lockmsghdr(msg,retry))!=0) { - printf("smb_lockmsghdr returned %d\n",i); - break; } - if((i=smb_getmsghdr(&msg))!=0) { - smb_unlockmsghdr(msg); - printf("smb_getmsghdr returned %d\n",i); - break; } - if((i=smb_unlockmsghdr(msg))!=0) { - smb_freemsgmem(msg); - printf("smb_unlockmsghdr returned %d\n",i); - break; } - - printf("Subj : %s\n",msg.subj); - printf("To : %s\n",msg.to); - printf("From : %s\n",msg.from); - printf("Date : %s\n",ctime((time_t *)&msg.hdr.when_written.time));</pre> -<pre> for(i=0;i<msg.hdr.total_dfields;i++) - switch(msg.dfield[i].type) { - case TEXT_BODY: // Only show BODY and TAIL data fields - case TEXT_TAIL: - fseek(sdt_fp,msg.hdr.offset+msg.dfield[i].offset - ,SEEK_SET); - fread(&xlat,sizeof(xlat),1,sdt_fp); - if(xlat!=XLAT_NONE) // No translations supported - continue; - for(l=sizeof(xlat);l<msg.dfield[i].length;l++) { - ch=fgetc(sdt_fp); - if(ch) - putchar(ch); } - printf("\n"); - break; } - printf("\n");</pre> -<pre> smb_freemsgmem(msg); } // Free memory allocated by smb_getmsghdr()</pre> -<pre>smb_close(); -return(0); -}</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="SMBLIB Performance Issues">SMBLIB Performance Issues</a></u></h2> -<pre>Since importing messages is the usually the most time consuming task likely -undertaken by an SMB application, it is also the most susceptible to design -issues that effect performance.</pre> -<pre><b><u>Opening and Closing</u></b> - -When importing multiple messages for a single message base, it appears logical -to open the message base, import all the messages, then close it. This indeed -is preferred over opening and closing the message base for each message.</pre> -<pre>When importing multiple messages for possibly non-consecutive message bases, -developers may easily make the mistake of opening and closing the message base -for each message. This is not necessary and can considerably hinder the -import performance. The easiest solution is to only close the message base and -open a new one if the next message to be imported is not for the same message -base as the previously imported message. Example:</pre> -<pre>smb_file[0]=0; -for(i=0;i<total_messages_to_be_imported;i++) { - if(stricmp(get_messagebase_for_this_message(i),smb_file)) { - if(smb_file[0]) /* We've already opened one */ - smb_close(); - strcpy(smb_file,get_messagebase_for_this_message(i)); - smb_open(10); } - /* Import this message */ - } -if(smb_file[0]) - smb_close(); - -A more advanced method is to keep multiple message bases open at the same time. -Due to the likely limitation of total file handles on the system, it is -suggested to keep the number of simultaneously open message bases at or below -3. SMBLIB includes the function smb_stack() to easily "push" and "pop" message -bases without closing them (push is the equivalent to "save" and pop is the -equivalent to "restore"). The downside of this function is that you cannot -access message bases on the stack without actually popping them off (in reverse -of the order they were pushed). You can however "exchange" the current message -base with the message base on the top of the stack (most recently pushed). -To intelligently juggle more than two open message bases, the developer should -create their own equivalent of the smb_stack() function so they can access the -message bases on the stack without popping them off. An example of keeping a -maximum of two message bases open using smb_stack():</pre> -<pre> char last_messagebase[128],new_messagebase[128];</pre> -<pre>smb_file[0]=0; -last_messagebase[0]=0; -for(i=0;i<total_messages_to_be_imported;i++) { - strcpy(new_messagebase,get_messagebase_for_this_message(i)); - if(stricmp(new_messagebase,smb_file)) { /* Not current message base */ - if(smb_file[0]) { /* We've already opened one */ - if(!stricmp(new_messagebase,last_messagebase)) { /* Same as last */ - strcpy(last_messagebase,smb_file); - smb_stack(SMB_STACK_XCHNG); } /* Retore previous base */ - else { - if(last_messagebase[0]) { - smb_stack(SMB_STACK_XCHNG); - smb_close(); - strcpy(last_messagebase,new_messagebase); } - else { - strcpy(last_messagebase,smb_file); - smb_stack(SMB_STACK_PUSH); } /* Save current base */ - strcpy(smb_file,new_messagebase); - smb_open(10); } } - else { - strcpy(smb_file,new_messagebase); - smb_open(10); } } - /* Import this message */ - } -if(smb_file[0]) - smb_close(); -if(last_messagebase[0]) { - smb_stack(SMB_STACK_POP); - smb_close(); } - -The second example would be of negligible performance gain over the first -example (6 open operations versus 7) if the messages to import were in the -following order:</pre> -<pre>msg[0] --> msgbase[0] // 0 opened -msg[1] --> msgbase[1] // 0 pushed 1 opened -msg[2] --> msgbase[1] -msg[3] --> msgbase[2] // 1 closed 0 popped 0 closed 2 opened -msg[4] --> msgbase[0] // 2 pushed 0 opened -msg[5] --> msgbase[2] // 0 pushed 2 popped (exchanged) -msg[6] --> msgbase[3] // 2 closed 0 popped 0 closed 3 opened -msg[7] --> msgbase[0] // 3 pushed 0 opened</pre> -<pre>The second example would be of significant performance gain over the first -example (4 open operations versus 8) if the messages to import were in the -following order:</pre> -<pre>msg[0] --> msgbase[0] // 0 opened -msg[1] --> msgbase[1] // 0 pushed 1 opened -msg[2] --> msgbase[0] // 1 pushed 0 popped (exchanged) -msg[3] --> msgbase[1] // 0 pushed 1 popped (exchanged) -msg[4] --> msgbase[0] // 1 pushed 0 popped (exchanged) -msg[5] --> msgbase[2] // 0 pushed 1 popped (exchanged) 1 closed 2 opened -msg[6] --> msgbase[3] // 2 pushed 0 popped (exchanged) 0 closed 3 opened -msg[7] --> msgbase[2] // 3 pushed 2 popped (exchanged)</pre> -<pre>More advanced use of "stack-like" message base file handle storage can easily -reduce the number of open operations, therefore increasing import performance -under more adverse message base ordering conditions. - -<b><u>Compression</u></b> - -If any message data compression features are offered by the application, it -is important the the application not unnecessarily compress data that will -not save any storage space. While this may seem an obvious statement, please -review the following pseudo-code example:</pre> -<pre>if ( message_data_length < SDT_BLOCK_LEN ) - // Store uncompressed data -else { - // Compress data - if ( ( compressed_data_length / SDT_BLOCK_LEN ) - < ( message_data_length / SDT_BLOCK_LEN ) ) // Saves a block or more - // Store compressed data - else - // Store uncompressed data - }</pre> -<pre>Since the SMB format stores message data in fixed length blocks, there is no -point in storing a message in compressed format if it requires the same number -of blocks as the uncompressed format (i.e. a message that is two blocks in -length in uncompressed format and only a block and a half in length when -compressed should not be stored in compressed format since it still requires -two full blocks of storage). It is important to note that in the above example, -the length of the data translation string was not taken into account in -determining the number of required blocks. Also, the smb_datblocks() function -is normally used in determining the number of required blocks to store a given -data length and it is a little more involved than simply dividing the length of -the data by SDT_BLOCK_LEN.</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Bibliography">Bibliography</a></u></h2> -<pre>Title : The C Programming Language -Publisher : Prentice Hall -Author : Brian W. Kernighan and Dennis M. Ritchie</pre> -<pre>Document : ARPANET Request for Comments (RFC) #822 -Title : Standard for the Format of ARPA Internet text messages -Publisher : SRI International -Author : David H. Crocker, University of Delaware</pre> -<pre>Document : FTS-0001 -Publisher : FSC -Author : Randy Bush, Pacific Systems Group</pre> -<pre>Document : FTS-0004 -Title : EchoMail Specification -Publisher : FSC -Author : Bob Hartman</pre> -<pre>Document : FTS-0009 -Title : A standard for unique message identifiers and reply chain linkage -Publisher : FSC -Author : Jim Nutt</pre> -<pre>Document : FSC-00046 -Title : A Product Identifier for FidoNet Message Handlers -Publisher : FSC -Author : Joaquim H. Homrighausen</pre> -<pre>Document : FSC-00053 -Title : Specifications for the ^aFLAGS field -Publisher : FSC -Author : Joaquim H. Homrighausen</pre> -<p><b><a href="#toc">Back to Table of Contents</a></b></p> -<h2><u><a name="Implementations">Implementations</a></u></h2> -<pre>Product : Synchronet Multinode BBS Software -Developer : Digital Dynamics -Level : III -Version : 2.20</pre> -<pre>Product : Synchronet/FidoNet Import/Export Utility (SBBSFIDO) -Developer : Digital Dynamics -Level : III -Version : 2.23</pre> -<pre>Product : Synchronet UTI (Universal Text Interface) Driver -Developer : Digital Dynamics -Level : III -Version : 2.23</pre> -<pre>Product : SBBSecho FidoNet Packet Tosser for Synchronet -Developer : Digital Dynamics -Level : III -Version : 1.11</pre> -<pre>Product : NetXpress Internet UUCP for Synchronet -Developer : Merlin Systems -Level : II -Version : 1.50</pre> -<pre>Product : InterEcho FidoNet Packet Tosser -Developer : InterMail Sales Inc -Level : II -Version : 1.11</pre> -<p><a href="#top"><b>Back to Top</b></a><!--webbot bot="Include" -U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/svdmansi.txt b/docs/svdmansi.txt deleted file mode 100644 index 5f7d4024c9..0000000000 --- a/docs/svdmansi.txt +++ /dev/null @@ -1,24 +0,0 @@ - -SVDMANSI.COM -- OS/2 Virtual DOS Machine ANSI Driver for Synchronet - - This program is a direct replacement for OS2FIX.COM, which, -although it solves an incompatibility problem between the OS/2 VDM and -native DOS, leaves the VDM without ANSI support. - - OS2FIX.COM is now obsolete, SVDMANSI is to be used in place of -it. If you are not familiar with the way OS2FIX worked: remove the -line (if any) containing ANSI.SYS from DOS_DEVICE in the DOS session's -settings, and place a line "SVDMANSI" in the file specified by the -setting DOS_AUTOEXEC, before any ANSI codes are output to the screen. - - The basic ANSI codes are supported. Not supported are cursor -position report (usually only used to detect the presence of an ANSI -driver, and handled by the BBS itself), and keyboard key redefinition -(less an omission than a safety feature). If you have any questions -or problems with this program, you can send me e-mail on Vertrauen -(714) 529-9525, or via fidonet: - Ille Homine Albe @1:103/705 - - If you continue to use this program after the 30-day evaluation -period, please send 5 cents to the Clinton Legal Defense Fund, or -$1 to the charity of your choice. diff --git a/docs/syedtfaq.txt b/docs/syedtfaq.txt deleted file mode 100644 index ae887278f5..0000000000 --- a/docs/syedtfaq.txt +++ /dev/null @@ -1,159 +0,0 @@ - Answers to Frequently Asked Questions Regarding SyncEdit - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Apr 15, 2000 - Rob Swindell - - -What Is It? -~~~~~~~~~~~ -SyncEdit is an external message editor originally designed for use with -Synchronet Multinode BBS Software. It was later extended to support other BBS -packages as well. - - -Authorship -~~~~~~~~~~ -Robert D. Bouman is the author of SyncEdit. Unfortunately he passed away a few -years ago. I, Rob Swindell, am the author Synchronet BBS Software and while I -was given permission to include an unregistered demo version of SyncEdit in -Synchronet distributions, I am not the author of SyncEdit and have never had -any official connection with the product. I've decided to create this help file -to answer all the common questions I get regarding SyncEdit (the most common -being: "How do I register YOUR product, SyncEdit?"). - - -Registration -~~~~~~~~~~~~ -Since it is no longer possible to purchase SyncEdit registrations, I have -been including my personal registration key (SYNCEDIT.KEY, registered to -"Digital Dynamics") with Synchronet distributions since v2.30b. Feel free to -use this registration key guilt-free, as that's what I think Robert would have -wanted. If you're using v2.20 or later, you'll need to convert this key to the -SYNCEDIT.CFG file format by using the KEY2CFG.EXE program (included with the -SyncEdit archive: SYEDTxxx.ZIP). - - -Y2K Patch -~~~~~~~~~ -There is a Y2K bug in all known versions of SyncEdit where the year 2000 is -displayed as 100, causing the status bar to wrap and making the program -unusable. I've released a group of binary-edited SyncEdit executables (for -all located versions) that works around this problem: the year is still -displayed as 100, but the status bar no-longer wraps. The file that includes -these patched files is SYEDTY2K.ZIP and can be downloaded via Telnet/Zmodem or -FTP from vert.synchro.net. - - -Configuration -~~~~~~~~~~~~~ -First, it is very important that you know WHAT VERSION of SyncEdit you're -trying to get working. You can tell by looking at the file size of your -SYNCEDIT.EXE in your Synchronet EXEC directory and comparing to the following -list of known/located released versions: - - 166222 1.5.3 - 166570 2.0.0 - 162594 2.0.5 - 164490 2.20A - 170900 2.50 - 192126 3.00 - 191906 3.05 - -If the file size of your SYNCEDIT.EXE does not match any of the above, check -your SyncEdit documentation for the version number or logon to Vertrauen -(vert.synchro.net) to obtain one of the above versions (and the Y2K patches). - -Different versions of SyncEdit require different configurations in SCFG -(SBBSCTRL->BBS->Configure)->External Programs->External Editors->SYNCEDIT: - -v1.0 - v1.5.0 -�������������������������������������������������������������������ͻ -� Name SyncEdit � -� Internal Code SYNCEDIT � -� Local Command Line %!syncedit %! %l %f � -� Remote Command Line %!syncedit %! %l %f � -� Access Requirements ANSI � -� Intercept I/O Interrupts Yes <- Versions 1.0 - 1.5.0 only! � -� Quoted Text None � -� QuickBBS Style (MSGTMP) No � -� Expand Line Feeds to CRLF No � -� BBS Drop File Type Synchronet XTRN.DAT � -�������������������������������������������������������������������ͼ - - -v1.5.3 - v2.0.5 -�������������������������������������������������������������������ͻ -� Name SyncEdit � -� Internal Code SYNCEDIT � -� Local Command Line %!syncedit %! %l %f � -� Remote Command Line %!syncedit %! %l %f � -� Access Requirements ANSI � -� Intercept I/O Interrupts No � -� Quoted Text None � -� QuickBBS Style (MSGTMP) No � -� Expand Line Feeds to CRLF No � -� BBS Drop File Type Synchronet XTRN.DAT � -�������������������������������������������������������������������ͼ - - -v2.20 -�������������������������������������������������������������������ͻ -� Name SyncEdit � -� Internal Code SYNCEDIT � -� Local Command Line %!syncedit %l %f � -� Remote Command Line %!syncedit %l %f � -� Access Requirements ANSI � -� Intercept I/O Interrupts No � -� Quote Text None � -� QuickBBS Style Editor (MSGTMP) No � -� Expand line feeds to CRLF No � -� BBS Drop File Type Synchronet XTRN.DAT � -�������������������������������������������������������������������ͼ - - -v2.50 -�������������������������������������������������������������������ͻ -� Name SyncEdit � -� Internal Code SYNCEDIT � -� Local Command Line %!syncedit local %l %f � -� Remote Command Line %!syncedit %l %f � -� Access Requirements ANSI � -� Intercept I/O Interrupts No � -� Quoted Text None � -� QuickBBS Style (MSGTMP) Yes <- Version 2.5 and up � -� Expand Line Feeds to CRLF No � -� BBS Drop File Type Synchronet XTRN.DAT � -�������������������������������������������������������������������ͼ - - -v3.00 - v3.05 -�������������������������������������������������������������������ͻ -� Name SyncEdit � -� Internal Code SYNCEDIT � -� Local Command Line %!syncedit -l -maxlines %l -f %f � -� Remote Command Line %!syncedit -maxlines %l -f %f � -� Access Requirements ANSI � -� Intercept I/O Interrupts No � -� Quote Text None � -� QuickBBS Style Editor (MSGTMP) Yes � -� Expand line feeds to CRLF No � -� BBS Drop File Type GAP DOOR.SYS � -�������������������������������������������������������������������ͼ - - -SyncEdit v2.20 and higher requires running SETUP.EXE (included in the SyncEdit -archive: SYEDTxxx.ZIP - should be unzipped with all other SyncEdit files into -your Synchronet EXEC directory). Example configuration: - - Directory of external files : C:\SBBS\EXEC\ - User Timeout in Minutes : 3 - Allow user dictionaries : Yes - Memory swap method : EMS - Registration code : **************** - Registered to : Digital Dynamics - -SyncEdit/G configurations not given (use SyncEdit instead). - -Hope this information is helpful! - --Rob (www.synchro.net) diff --git a/docs/syncedit.txt b/docs/syncedit.txt deleted file mode 100644 index 49be2e79a9..0000000000 --- a/docs/syncedit.txt +++ /dev/null @@ -1,538 +0,0 @@ - - - - SyncEdit - The Synchronet Full-Screen Editor - - - (c) Copyright 1995 Robert D. Bouman - - ALL RIGHTS RESERVED - - - Robert D. Bouman - 94 W Roosevelt Ave. - Zeeland, MI 49464 - USA - - Fido: 1:2201/11 - Internet: bouman@macatawa.org - - - - - - As this document covers both the freely distributable and registered - versions, not all items apply to the demo version and are identified as - such throughout the document. - - - - �����������������������������������������������������������������������Ŀ - � ���� Description ۲�� � - ������������������������������������������������������������������������� - - This product provides an integrated full-screen ANSI message editor for - use with the Synchronet bulletin board package. - - - - �����������������������������������������������������������������������Ŀ - � ���� Disclaimer ۲�� � - ������������������������������������������������������������������������� - - The entire SyncEdit package is provided as is and comes with no warranty - of any kind, either expressed or implied. In no event will Robert - Bouman be liable for damage resulting from the direct or indirect use of - this software. - - The user of these programs bears all risks as to their quality and - performance. - - Users are encouraged to use common sense and back up all important system - files using industry accepted methods before using this or any other - newly obtained application. - - - �����������������������������������������������������������������������Ŀ - � ���� Special Thanks ۲�� � - ������������������������������������������������������������������������� - - We would like to thank the beta testers and others who have been most - instrumental in getting SyncEdit to where it is today. They have been - very helpful in the debugging process and provided numerous suggestions - which have been included in SyncEdit. - - The testers include, in no particular order - - - Jim Knight of 21st Century - Kelly Wright of Tele-Star - Bill Cronkhite of The Game Room - - - - �����������������������������������������������������������������������Ŀ - � ���� Included Files ۲�� � - ������������������������������������������������������������������������� - - HISTORY.TXT Revision history of SyncEdit - REGISTER.FRM Registration form - SYNCEDIT.DOC What you're reading now, the documentation - UPGRADE.DOC Information on upgrading to this version of SyncEdit. - SYNCEDIT.EXE The executable text editor - KEYGEN.EXE Program to generate key file - SYNCEDIT.MAC Example macro file - FEATURES.TXT List of features included in SyncEdit to date - - Note: The dictionary is distributed as a seperate archive, and will not - be used by the editor until a key code is obtained. The dictionary can - be found at various locations as SYEDTDIC.ZIP. - - - - �����������������������������������������������������������������������Ŀ - � ���� System Requirements ۲�� � - ������������������������������������������������������������������������� - - An operational Synchronet BBS system, version 2.00 or greater. ANSI - emulation is required for the remote user of course, DOS 3.0+, a fossil - driver may be needed if you are currently using Digiboard or similar - product. SYNCEDIT SUPPORTS FOSSIL AND DIRECT COMPORT I/O ONLY! - - - - �����������������������������������������������������������������������Ŀ - � ���� Distribution Method ۲�� � - ������������������������������������������������������������������������� - - Freely distributable shareware. This package may be uploaded, placed in - CD-ROM collections, or otherwise be freely disseminated as long as the - archive remains intact. Only reasonable fees may charged for copying or - distributing, and no copyright or ownership may be claimed by parties - other than Robert Bouman. This product is NOT in the "public domain". - - The latest version is always available via file request at 1:2201/11 as - SYNCEDIT. - - - - �����������������������������������������������������������������������Ŀ - � ���� Limitations ۲�� � - ������������������������������������������������������������������������� - - The registered version of SyncEdit is designed to operate with a KEY - file, which activates the registered features of the editor. Operation - of the editor without a key will invoke the editor in demo mode. A key - file is not distributed with SyncEdit, it can be generated with KEYGEN - and a key code from Robert Bouman. - - The demo version is a very functional editor, with no time limitations or - restrictions on usage except as noted above under "Distribution method". - The demo contains complete block editing and file functions, but the menu - items indicated by a light grey color, SEARCH, SPELL CHECKER, and - GRAPHICS, are not active in the demo version. Also, the demo does not - allow the use of Sysop definable TAGLINES. There is a three second delay - upon entry to the editor as well. - - The key file activates SEARCH, SPELL CHECKING, GRAPHICS, Sysop definable - TAGLINES and removes the entry delay screen. - - See "Registration" for specifics on how to obtain a key code. - - Both versions of SyncEdit are limited to a maximum of 500 lines of text. - - - - �����������������������������������������������������������������������Ŀ - � ���� Installation ۲�� � - ������������������������������������������������������������������������� - - SyncEdit is installed as an external message editor, and if one is - familiar with Synchronet and installing doors, there should be little - difficulty. However, it is assumed that the reader is familiar with - Synchronet and how to configure the BBS software. - - - Step 1 - - Decide where you wish to place the external files, ie the SYNCEDIT.DIC, - SYNCEDIT.KEY and TAGLINE files, all of which are only activated by a - registered key file. As mentioned earlier, remember that the dictionary - is distributed as a separate archive. - - If you plan on using a different directory from \SBBS\EXEC, create the - directory using any valid DOS name and path, with the DOS "MD" - command. - - If used, copy SYNCEDIT.DIC into the directory you just created, and make - a note of the full path and name of this directory as you'll need that - information in a moment. Otherwise, if using the BBS EXEC directory, - copy SYNCEDIT.DIC into \SBBS\EXEC. - - When you later get to the step of setting up the editor within - Synchronet, you will need to be sure your second command line argument - points to the directory containing the external files. - - - Step 2 - SYNCEDIT.EXE may be installed in any convenient directory, though we - suggest the \SBBS\EXEC subdirectory or a directory beneath \SBBS\EXEC - called SYNCEDIT. If you place SYNCEDIT.EXE in a directory that's NOT - in your system path statement, then you must provide the full path to - this directory on the command line with the executable - (C:\SYNCEDIT\SYNCEDIT %l .. .. ). - - - Step 3 - Add SYNCEDIT to your BBS's external on-line programs menu via the - Synchronet configuration utility: External Programs -> External Editors - - Before we get to installing SyncEdit, please note the command line used - with SyncEdit: - - syncedit [<EXTERNAL DIR>] [<NUM LINES>] [PATH\FILE] - or - %!syncedit [<EXTERNAL DIR>] [<NUM LINES>] [PATH\FILE] - - - A typical command line example might be: - - syncedit %! %l %f - - Left to right: the name of the executable, the path to the external - directory (for the dictionary files, tag files, and SYNCEDIT.KEY), maximum - number of lines allowed in the editor, and the optional path\file_name - to read into the editor. - - The external directory (first argument) is where the dictionary, and when - obtained, the SYNCEDIT.KEY should be placed. The external directory - argument MUST be defined, even if you don't have a key file and don't - intend to install the dictionary. The count of the arguments must be at - least two, with the last item, PATH\FILE_NAME being the only truly - optional parameter. - - Assuming you've placed SYNCEDIT.EXE in the \SBBS\EXEC directory and the - \SBBS\EXEC path is properly defined in your system setup, it shouldn't be - necessary to use the "%!" in front of the executable name. However, if - you have difficulty getting SyncEdit to run, try placing the %! at the - beginning of the command line as in the second example above. - - The Synchronet parameter %l may be substituted for NUM LINES. This is - handy if you wish the editor to use the default number of lines as - configured within each of your BBS user levels. - - Note that in our example we used the path to the \SBBS\EXEC directory as - our external directory (%!), received the maximum editor lines from the - BBS (%l) and received the path & name of the file to read into the editor - from the BBS (%f). If %f isn't used, SyncEdit will default to reading - the INPUT.MSG text dropped by the BBS in the respective NODE directory. - - If we wished to use a different external directory, and pass on the - command line a specific number of lines to allow, we could have done - something like: - - syncedit c:\sbbs\exec\syncedit\ 80 %f - - This example assumes a directory called "syncedit" exists in the - c:\sbbs\exec directory and will be used for our external files. 80 - is the maximum lines allowed in the editor. - - We suggest the use of a separate external directory with the - availability of user dictionaries. Otherwise, the \EXEC directory may - become cluttered with dictionary files. - - - Hit INSERT on a blank line to start the process of adding the editor. - - Below is an example intended to show a typical setup for SyncEdit, and - should work for the vast majority of users. Please note, SyncEdit - *requires* the use of the XTRN.DAT drop file so be sure to configure - Synchronet to drop the file as indicated below. - - - SyncEdit Editor -������������������������������������������������������������������������ͻ -� Name SyncEdit � -� Internal Code SYNCEDIT � -� Local Command Line syncedit %! %l %f � -� Remote Command Line syncedit %! %l %f � -� Access Requirements ANSI � -� Intercept I/O Interrupts No � -� Quote Text Prompt User � -� QuickBBS Style Editor (MSGTMP) No � -� Expand line feeds to CRLF No � -� BBS Drop File Type Synchronet XTRN.DAT � -������������������������������������������������������������������������ͼ - - - Once again, this example will work if you have the directory where you - placed SYNCEDIT.EXE in your path, and you placed your external files in - \SBBS\EXEC. Otherwise, you will need to modify the above to match - your setup. - - If memory is tight, or you experience difficulties, add SyncEdit to your - BBS global swap list. This is accomplished within the Synchronet - configuration utility. - - - That's it, you and your users should now be able to use the editor! - - - - �����������������������������������������������������������������������Ŀ - � ���� Using the Editor ۲�� � - ������������������������������������������������������������������������� - - As SyncEdit contains an extensive built-in help system, we will not go - into great detail here on the commands or how to use the editor. - - All functions are available from the menu at the top of the screen by - using CTRL-key combinations. For instance, on-line help is available by - using CTRL-P. There are also several keyboard shortcuts, such as CTRL-O - for quick save, as well as the traditional "slash" commands (/A, /ABT, - /N, /S, /?). Again, be sure to review the help system when you first - use the editor for more detailed information. - - The menu bar at the bottom of the editor reflects (left to right): - - registration information (who the editor is registered to) - maximum lines allowed - number of lines used - insert/delete mode status - date - time - - - �����������������������������������������������������������������������Ŀ - � ���� Sysop File Functions ۲�� � - ������������������������������������������������������������������������� - - There are two Sysop only commands available from the File menu that are - accessible, and visible, only to user groups 90 and above (co-Sysops and - Sysops). These commands are LoadFile and SaveFile which do exactly what - their names imply. - - LoadFile reads a separate text file into the current editing session. - This function does not overwrite existing text, but rather inserts the - file at the current cursor position. - - SaveFile saves the current text to a file in ASCII format. - - Both LoadFile and SaveFile expect a full DOS path. - - - - �����������������������������������������������������������������������Ŀ - � ���� Sysop Hot Keys ۲�� � - ������������������������������������������������������������������������� - - Several functions are also available to the sysop both when used locally - and when a remote user is using SyncEdit. They are defined below. - - ALT+C - Allows you to chat with the remote user while they are editing a - message. This function is only available when the user is at the main - editing screen. ALT+C again to return to normal screen. - - ALT+H - Hang up on user and exit from SyncEdit. - - ALT+J - Drop to DOS. This is available when the user is on-line as well - as when the editor is used locally. It is available when the remote - user or local user is in the main editing screen only. - - ALT+K - When this key is pressed, SyncEdit will ignore key strokes from - the remote user. Pressing this key again will return the editor to - normal function. - - ALT+D - Drops user to BBS without hanging up on them. - - F1 - Will display a status bar containing the sysop key information from - above. - - F9 - Will return the status bar to the normal user information display. - - F10 - Will remove the status bar completly from screen. - - ALT-+/- - Increase or decrease the amount of time the user has in - SyncEdit to write or edit a message. - - - �����������������������������������������������������������������������Ŀ - � ���� Creating TAGLINE Files (registered version only) ۲�� � - ������������������������������������������������������������������������� - - The registered version of SyncEdit allows for the use of up to 20 - different tag lines. Remember, all the *.TAG files, must be placed in - the external directory pointed to by the first command line argument. - - Each TAG file may be up to 600 bytes in length. If these limits are - exceed, the file will be truncated. Tag files may contain both ANSI or - ASCII text and must be named using any valid DOS name, with an extension - of .TAG. These names may be descriptive, as in ANSI.TAG, ASCII.TAG, - simple as in 1.TAG, 2.TAG, or any other scheme you prefer. Use - desecration when using tag lines, particularly those containing ANSI - escape codes as they can quickly become overdone and irritating to - readers of your messages (and network administrators). - - If more than one *.TAG file is found, SyncEdit will randomly select - a different *.TAG file each time the editor is called by the BBS. - For example, if you have two *.TAG files, the odds are approximately - 50-50 that a particular tag file will be used. If you have three tag - files, the odds are 1 in 3, and so on. If you only wish to have one tag - line added by the editor, only define one tag file, for example 1.TAG. - If you don't want any tag lines added, simply don't define any. - - Note, the unregistered "SyncEdit" tear line is not user definable or - modifiable. The tear line is not appended by the registered version. - - - - �����������������������������������������������������������������������Ŀ - � ���� Sysop (only) Macro Files ۲�� � - ������������������������������������������������������������������������� - - For the macros, a file named SYNCEDIT.MAC must be in the external - directory. We have included a basic macro file so you have a reference - point for creating your own. - - There is a maximum of 40 macros lines allowed. If this number is - exceeded, only 40 will be used. Lines that have a ';' in column one - will be skipped, which is primarily used for adding comments to the - macro file. Blank lines are skipped also. Everything else is - considered a macro line. - - Macro lines 1-10 correspond to F1-F10 on the keyboard; 11-20 to - shift+F1-f10; 21-30 to ctrl+F1-F10; and finally 31-40 to alt+F1-F10. For - example, if you have 11 lines that are considered macro lines, then you - can insert those lines into your message by pressing F1-F10 and shift+F1. - If you press shirt+F2, the computer will beep telling you that there isn't - a macro associated with that key. - - One common use of a macros as implemented within SyncEdit is to allow - the Sysop to easily use different signatures, depending on the target - audience of the message. - - - - �����������������������������������������������������������������������Ŀ - � ���� User Dictionaries ۲�� � - ������������������������������������������������������������������������� - - Any user that is allowed to use SyncEdit will be able to create their own - custom dictionary. SyncEdit will provide a menu item entitled ADD when - it encounters a word during a spell checking session that it doesn't - believe is spelled correctly. By simply choosing the add option the - highlighted word will be added to the users personal dictionary (*not* - the master dictionary). Please note, SyncEdit doesn't delete user - dictionaries when there are changes to the BBS database. Consequently, - if a user is deleted from the BBS database, the next person that has - the same user number will inherit the old dictionary. - - - - �����������������������������������������������������������������������Ŀ - � ���� Registration Cost and Process ۲�� � - ������������������������������������������������������������������������� - - Registration fee is $20.00 (twenty dollars US). That's right, only - twenty dollars. This will get you a key code which you can use to - generate a customized key file that will activate all the editors - features. - - Please review, complete and return the REGISTER.FRM (enclosed). - - Save yourself the time and expense of calling us to determine if we - accept on-line orders or credit cards. We don't. Currently, the only - way to register is to follow the procedure outlined above. When this - changes, we'll be sure to announce it. - - - - �����������������������������������������������������������������������Ŀ - � ���� Cautions ۲�� � - ������������������������������������������������������������������������� - - This product was designed specifically to interface with the Synchronet - BBS system, and has not been tested with other BBS packages. Though it - may work with other BBS systems, we make no representation that it will. - - - - �����������������������������������������������������������������������Ŀ - � ���� Technical Support ۲�� � - ������������������������������������������������������������������������� - - Support is provided by calling the SyncEdit support BBS; The Game Room - (616)857-3135 and either posting a message to "Playster" in the SyncEdit - message section or by sending private e-mail, via FidoNet netmail - (1:2201/11) addressed to Robert Bouman or Internet e-mail addressed to - bouman@macatawa.org. - - Please note, we will do everything possible to assist folks in getting - the freely distributable version up and running. However, technical - support is primarily intended for registered users. They are after all, - our paying customers. - - Apparent bug reports should be forwarded as identified above. Please - provide as much detail as possible regarding your difficulty, ie hardware - configuration, BBS setup (paths, etc), and a specific description of the - problem. - - Suggestions regarding new features, and comments in general are welcome - from all users and should be forwarded as indicated above. - - - - �����������������������������������������������������������������������Ŀ - � ���� Known "Anomalies" ۲�� � - ������������������������������������������������������������������������� - - o SyncEdit is limited to a maximum of 500 lines of text. If attempts are - made to use more than 500 lines, the editor will continue to load and - enter into an editing session. However, only the first 500 lines of - text will actually be edited and saved. - - o There seems to be some incompatibilities when SyncEdit is used under - Novell DOS v7. In particular, the problem occurs when attempting an - editing session from the WFC screen. Usage of the editor from within - the BBS is not generally affected. - - o Due to the spelling library SyncEdit currently uses, there are times - the spell checker will flag words as misspelled when in fact the word - is spelled correctly. This may be most noticeable when adding words to - one's personal dictionary. We are aware of the problem, but due to the - fact that we don't have the source code to the library we can't easily - correct the problem. The solution lies in either writing our own - library from scratch or locating another spelling library. We are - investigating the options are planning to correct this situation in a - future release. - - - - �����������������������������������������������������������������������Ŀ - � ���� Upgrade Policy ۲�� � - ������������������������������������������������������������������������� - - Registering SyncEdit is a one time ONLY process. By purchasing the - registered version of SyncEdit, you get a life long "subscription" to - all future versions of SyncEdit. - - - - �����������������������������������������������������������������������Ŀ - � ���� Miscellaneous ۲�� � - ������������������������������������������������������������������������� - - SyncEdit reads either the INPUT.MSG placed in the node directories by - the BBS, or the file passed to it from the BBS via the %f parameter, - EDITOR.INF, QUOTES.TXT, and Synchronet's drop file XTRN.DAT. No other - files are read from or written to. - - If the LoadFile or SaveFile commands are used, SyncEdit will load and - save to the path\file provided by the user. It does not, however, - modify any BBS system files on it's own. - - - SyncEdit is a trademark of Robert D. Bouman. - Synchronet is a trademark of Digital Dynamics. - All other brands are trademarks or registered trademarks of their - respective companies. diff --git a/docs/sysop.html b/docs/sysop.html deleted file mode 100644 index 297877eb8a..0000000000 --- a/docs/sysop.html +++ /dev/null @@ -1,287 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Synchronet BBS Software - Sysop Documentation</title> -</head> - -<body> -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<h1>Synchronet System Operator Documentation</h1> -<p><b><a name="TOC">Sysop Documentation Table of Contents</a></b> -</p> - -<p><a href="features.html">Features</a> -</p> - -<pre>1. <b>Installation</b><a href="install.html"> -</a> 1.0 <a href="install.html">Installation</a><a href="install.html#Getting Started"> -</a> 1.1 <a href="install.html#GettingStarted">Getting Started -</a> 1.2 <a href="install.html#GettingHelp">How to Get Help -</a> 1.3 <a href="install.html#AboutManual">About this Manual</a></pre> - -<div align="left"> - -<pre>2. <b>Configuration -</b> 2.0 <a href="system_config.html">System Configuration</a> - 2.1 <a href="system_config.html#MessageOptions">Message Options -</a> 2.2 <a href="system_config.html#SystemOptions">System Options</a> - 2.3 <a href="system_config.html#SystemToggleOptions">Toggle Options</a> - 2.4 <a href="system_config.html#NewUserValues">New User Values</a> - 2.5 <a href="system_config.html#AdvancedOptions">Advanced Options</a> - 2.6 <a href="system_config.html#LoadableModules">Loadable Modules</a> - 2.7 <a href="system_config.html#SecurityValues">System Security Level Values</a> - 2.8 <a href="system_config.html#ExpiredAccountValues">Expired Account Values</a> - 2.9 <a href="system_config.html#QuickValidationValues">Quick Validation Values</a> - 2.10 <a href="system_config.html#CreatingUserAccountsLocally">Creating User Accounts Locally</a> - 2.10.1 <a href="system_config.html#CreatingSysopAccount">Creating a Sysop Account</a> - 2.10.2 <a href="system_config.html#CreatingGuestAccount">Creating a Guest Account</a></pre> - -</div> - -<pre>3. <b>Adding Nodes to your System</b> - 3.0 <a href="adding_nodes.html">Adding Nodes</a> - 3.1 <a href="adding_nodes.html#ConfiguringNodes">Node Configuration</a> - 3.2 <a href="adding_nodes.html#NodeToggleOptions">Node Toggle Options</a> - 3.3 <a href="adding_nodes.html#NodeAdvancedOptions">Node Advanced Options</a> - 3.4 <a href="adding_nodes.html#WFC_NumberKeys">Waiting For Caller Number Key Assignments</a> <b><i><font color="#FF0000">(v2 Only)</font></i></b> - 3.5 <a href="adding_nodes.html#WFC_FunctionKeys">Waiting For Caller Function Key Assignments</a> <b><i><font color="#FF0000">(v2 Only)</font></i></b></pre> - -<pre>4. <b>Modem and FAX Configuration <i><font color="#FF0000">(v2 Only)</font></i></b> - 4.0 <a href="modem_setup.html">Modem Setup</a> - 4.1 <a href="modem_setup.html#UART_Serial/Modem">Installing UART Serial Card/Internal Modems</a> - 4.2 <a href="modem_setup.html#Shared_IRQ/Non-UART">Installing a Shared IRQ or Non-UART Serial Card</a> - 4.3 <a href="modem_setup.html#DumbModemConnection">Using a Dumb (NULL) Modem Connection</a> - 4.4 <a href="modem_setup.html#ModemConfiguration">Modem Configuration</a> - 4.5 <a href="modem_setup.html#ResultCodes">Modem Result Codes -</a> 4.6 <a href="modem_setup.html#ToggleOptions">Modem Toggle Options</a> - 4.7 <a href="modem_setup.html#ControlStrings">Modem Control Strings</a> - 4.8 <a href="modem_setup.html#AutoConfiguration">Modem Auto-Configuration</a> - 4.9 <a href="modem_setup.html#CallerIdentification">Caller-ID Support</a> - 4.10 <a href="modem_setup.html#FAX/ModemSetup">Incoming FAX Support</a></pre> - -<pre>5. <b>Sysop Commands (Remote / Local)</b> - 5.0 <a href="sysop_commands.html">Sysop Commands</a> - 5.1 <a href="sysop_commands.html#SysopDefinition">Definition of a Sysop</a> - 5.2 <a href="sysop_commands.html#MultipleSysops">Multiple Sysops</a> - 5.3 <a href="sysop_commands.html#LocalSysopCommands">Local Only Sysop Commands</a> - 5.4 <a href="sysop_commands.html#OnlineSysopCommands">Remote/Local Sysop Commands</a></pre> - -<pre>6. <b>User Management</b> - 6.0 <a href="user_editor.html">User Editor</a> - 6.1 <a href="user_editor.html#UsingUserEditLocally">Editing Users Locally -</a> 6.2 <a href="user_editor.html#UsingUserEditRemotely">Editing Users Remotely</a> - 6.3 <a href="user_editor.html#UserEditCommands">User Editor Commands Explained</a></pre> - -<pre>7. <b>Access Requirement Strings (ARS) Security</b> - 7.0 <a href="security.html">ARS Security</a> - 7.1 <a href="security.html#Introduction">Introduction to ARS</a> - 7.2 <a href="security.html#Keywords/Symbols">ARS Keywords and Symbols</a> - 7.3 <a href="security.html#GeneralUsageExamples">ARS General Usage Examples</a> - 7.4 <a href="security.html#NestingExpressions">Nesting ARS Logic</a> - 7.5 <a href="security.html#NestedLogicExamples">ARS Nested Logic Examples</a></pre> - -<pre>8. <b>Message Bases</b> - 8.0 <a href="message_section.html">Message Base</a> - 8.2 <a href="message_section.html#ElectronicMail">Electronic Mail -</a> 8.2.1 <a href="message_section.html#SynchronetMailServer">Internet (SMTP/POP3) Mail Server</a> <b><font color="#FF0000"><i>(v3+ Only)</i></font></b> - 8.3 <a href="message_section.html#SettingUpMessageBase">Adding Message Bases</a> - 8.3.1 <a href="message_section.html#CreatingMessageGroups">Creating Message Groups</a> - 8.3.2 <a href="message_section.html#MessageGroupOptions">Main Options -</a> 8.3.3 <a href="message_section.html#CreatingMessageSub-boards">Creating Message Sub-Boards</a> - 8.3.4 <a href="message_section.html#Sub-boardMainOptions">Main Options</a> - 8.3.5 <a href="message_section.html#ToggleOptions">Toggle Options</a> - 8.3.6 <a href="message_section.html#NetworkOptions">Network Options</a> - 8.3.7 <a href="message_section.html#AdvancedOptions">Advanced Options</a> - 8.4 <a href="message_section.html#QWKPacketPreviousSoftware">Importing Messages from Your Previous BBS Software</a> - 8.5 <a href="message_section.html#PostingMessage">Posting</a> - 8.6 <a href="message_section.html#RemoteQWKFunctions">Remote QWK Functions</a></pre> - -<pre>9. <b>Networking</b> - 9.0 <a href="networking.html">Networking Message Bases</a> - 9.1 <a href="networking.html#QWKPacketNetworking">QWK Networking</a> - 9.1.1 <a href="networking.html#NetworkHubs">Network Hubs</a> - 9.1.2 <a href="networking.html#NetworkedSub-boards">Networked Sub-Boards</a> - 9.1.3 <a href="networking.html#ConfiguringQWKNode">Setting up a QWK Node</a> - 9.1.4 <a href="networking.html#ConfiguringQWKHub">Setting up a QWK Hub -</a> 9.2 <a href="networking.html#TransferringFilesThroughQWK">Transferring Files via QWK Network</a> - 9.3 <a href="networking.html#PostLinkNetworking">PostLink Networking</a> - 9.4 <a href="networking.html#FidoNetNetworking">FidoNet Networking</a> - 9.4.1 <a href="networking.html#FidoNetUsingSBBSECHOandInterMail">Step-by-Step Setup</a> - 9.4.2 <a href="networking.html#SendingFidoNetNetMail">Sending FidoNet NetMail</a> - 9.5 <a href="networking.html#InternetNetworking">Internet Networking</a></pre> - -<div align="left"> - -<pre>10. <b>File Section</b> - 10.0 <a href="file_section.html">File Transfer Section -</a> 10.1 <a href="file_section.html#SettingUpFileTransferSection">Setting up the File Section Options</a> - 10.1.1 <a href="file_section.html#FileOptions">Main Options</a> - 10.2 <a href="file_section.html#ViewableFiles">Viewable File Types</a> - 10.3 <a href="file_section.html#TestableFiles">Testable File Types -</a> 10.4 <a href="file_section.html#DownloadEvents">Download Events</a> - 10.5 <a href="file_section.html#ExtractableFiles">Extractable File Types</a> - 10.6 <a href="file_section.html#CompressableFiles">Compressible File Types</a> - 10.7 <a href="file_section.html#TransferProtocols">Transfer Protocols -</a> 10.7.1 <a href="file_section.html#FDSZ">FDSZ Protocol</a> - 10.7.2 <a href="file_section.html#DSZ">DSZ Protocol</a> - 10.7.3 <a href="file_section.html#HS/Link">HS/Link Protocol</a> - 10.8 <a href="file_section.html#CreatingFileLibraries">Adding File Libraries</a> - 10.8.1 <a href="file_section.html#LibraryOptions">Main Options</a> - 10.9 <a href="file_section.html#CreatingFileDirectories">Adding File Directories</a> - 10.9.1 <a href="file_section.html#MainDirectoryOptions">Main Options</a> - 10.9.2 <a href="file_section.html#ToggleOptions">Toggle Options</a> - 10.9.3 <a href="file_section.html#AdvancedOptions">Advanced Options</a> - 10.10 <a href="file_section.html#AddingFilesToDatabase">Adding Files to File Sections</a> - 10.10.1 <a href="file_section.html#CreatingOfflineFileDirectories">Creating an Offline Files Directory</a> - 10.10.2 <a href="file_section.html#CreatingSysopDirectory">Creating a Sysop Directory</a> - 10.10.3 <a href="file_section.html#CreatingUser-to-UserDirectory">Creating a User to User Directory</a> - 10.10.4 <a href="file_section.html#CreatingDefaultUploadDirectory">Creating a Default Upload Directory</a> - 10.10.5 <a href="file_section.html#SupportingBlindBatchUploads">Supporting Blind Batch Uploads</a> - 10.11 <a href="file_section.html#CD-ROM/SlowMediaDevices">CD-ROM and other Slow Media Devices</a> - 10.11.1 <a href="file_section.html#AlternateFilePaths">Using Alternate File Paths -</a> 10.12 <a href="file_section.html#SynchronetFTPServer">Internet FTP Server</a> <b><font color="#FF0000"><i>(v3+ Only)</i></font></b></pre> - -</div> - -<pre>11. <b>Chat Section</b> - 11.0 <a href="chat_section.html">Chat Section Configuration</a> - 11.1 <a href="chat_section.html#ArtificialChatGurus">Artificial Chat Gurus</a> - 11.2 <a href="chat_section.html#ChatActions">Multinode Chat Actions</a> - 11.3 <a href="chat_section.html#MultinodeChatChannels">Multinode Chat Channels</a> - 11.4 <a href="chat_section.html#ExternalSysopPagers">External Sysop Chat Pagers</a></pre> - -<pre>12. <b>External Programs</b> - 12.0 <a href="external_programs.html">External Programs -</a> 12.1 <a href="external_programs.html#FixedEvents">External Fixed Events</a> - 12.2 <a href="external_programs.html#TimedEvents">External Timed Events</a> - 12.3 <a href="external_programs.html#GlobalSwapList">Global Swap List</a> - 12.4 <a href="external_programs.html#Native32bitProgramList">Native (32-bit) Program List</a> - 12.5 <a href="external_programs.html#ExternalEditors">External Editors</a> - 12.6 <a href="external_programs.html#OnlinePrograms">Adding Online Programs</a> - 12.7 <a href="external_programs.html#DropFiles">Supported BBS Drop File Types</a> - 12.8 <a href="external_programs.html#Call-backVerifiers">Callback Verifiers</a> - 12.9 <a href="external_programs.html#InstallingNewExternalProgram">Installing a New External Program</a> - 12.10 <a href="external_programs.html#ConfiguringNewExternalProgram">Configuring a New External Program</a> - 12.11 <a href="external_programs.html#ExampleDoorGameSetups">External Program Setup Examples</a> - 12.11.1 <a href="external_programs.html#LORD">Legend of the Red Dragon (LORD)</a> - 12.11.2 <a href="external_programs.html#Usurper">Usurper</a> - 12.11.3 <a href="external_programs.html#TradeWars2002">Trade Wars 2002 -</a> 12.11.4 <a href="external_programs.html#BRE">Barren Realms Elite -</a> 12.12 <a href="external_programs.html#InternalGateways">Internet Gateways (Telnet, RLogin, etc.)</a> <b><font color="#FF0000"><i>(v3+ Only)</i></font></b> - 12.13 <a href="external_programs.html#TroubleshootingExternalPrograms">Troubleshooting External Programs</a></pre> - -<pre>13. <b>Text File Section</b> - 13.0 <a href="textfile_section.html">General Text Files</a> - 13.1 <a href="textfile_section.html#TextFileOptions">Main Options</a> - 13.2 <a href="textfile_section.html#AddingTextFiles">Adding Text Files to a Section</a> - 13.3 <a href="textfile_section.html#976/900NumberBilling">976/900 Number Billing Support</a></pre> - -<pre>14. <b>Multinode Information <i><font color="#FF0000">(v2 Only)</font></i></b> - 14.0 <a href="multnode_config.html">Multinode</a> - 14.1 <a href="multnode_config.html#LANMethod">The Local Area Network (LAN) Method</a> - 14.2 <a href="multnode_config.html#MultitaskerMethod">The Multitasker Method</a> - 14.3 <a href="multnode_config.html#Safe?">Is it Safe to run Multiple Nodes?</a> - 14.4 <a href="multnode_config.html#MultinodeDESQview">Setting Up Synchronet Under DESQview</a> - 14.5 <a href="multnode_config.html#MultinodeOS/2">Setting Up Synchronet Under OS/2</a> - 14.6 <a href="multnode_config.html#MultinodeWindows3.x">Setting Up Synchronet Under Windows 3.x</a> - 14.7 <a href="multnode_config.html#MultinodeWindows9x">Setting Up Synchronet Under Windows 9x</a> - 14.8 <a href="multnode_config.html#MultinodeLAN">Setting Up Synchronet on a LAN</a></pre> - -<pre>15. <b>Synchronet Utility Reference</b><a href="utility_reference.html"> -</a> 15.1 <a href="utility_reference.html#CHKSMB">CHKSMB</a> <b>(</b>Checks Message Base for Validity<b>)</b> - 15.2 <a href="utility_reference.html#FIXSMB">FIXSMB</a> <b>(</b>Fixes Message Base and Mail Indexes<b>)</b> - 15.3 <a href="utility_reference.html#SMBUTIL">SMBUTIL</a> <b>(</b>Synchronet Message Base Utility<b>) -</b> 15.4 <a href="utility_reference.html#SMBACTIV">SMBACTIV</a> <b>(</b>Checks for Active Message Bases<b>)</b> - 15.5 <a href="utility_reference.html#ADDFILES">ADDFILES</a> <b>(</b>Importing ASCII File Lists<b>)</b> - 15.6 <a href="utility_reference.html#FILELIST">FILELIST</a> <b>(</b>Creating ASCII File Lists<b>)</b> - 15.7 <a href="utility_reference.html#DUPEFIND">DUPEFIND</a> <b>(</b>Finds Duplicate Files in Synchronet<b>)</b> - 15.8 <a href="utility_reference.html#DELFILES">DELFILES</a> <b>(</b>Deletes Files from File Base<b>)</b> - 15.9 <a href="utility_reference.html#MLABELS">MLABELS</a> <b>(</b>Mailing Labels Creation Util<b>)</b> - 15.10 <a href="utility_reference.html#QWKNODES">QWKNODES</a> <b>(</b>Create QWKnet Users/Route/Node Lists<b>)</b> - 15.11 <a href="utility_reference.html#ALLUSERS">ALLUSERS</a> <b>(</b>Command Line Bulk User Editor<b>)</b> - 15.12 <a href="utility_reference.html#AUTONODE">AUTONODE</a> <b>(</b>Automatic Local Logon Utility<b>) <font color="#FF0000"><i>(v2 Only)</i></font></b> - 15.13 <a href="utility_reference.html#NODE">NODE</a> <b>(</b>Node Display/Control Utility<b>)</b> - 15.14 <a href="utility_reference.html#UTI">UTI Driver</a> <b>(</b>PostLink Import/Export Utils<b>)</b> - 15.15 <a href="utility_reference.html#SLOG">SLOG</a> <b>(</b>Node/System Statistics Viewer<b>)</b> - 15.16 <a href="utility_reference.html#DSTSEDIT">DSTSEDIT</a> <b>(</b>Node/System Statistics Editor<b>)</b> - 15.17 <a href="utility_reference.html#TOTALS">TOTALS</a> <b>(</b>Credit Gain/Loss Util for Games<b>)</b> - 15.18 <a href="utility_reference.html#ANS2MSG">ANS2MSG</a> <b>(</b>ANSI to Ctrl-A Conversion Utility<b>)</b> - 15.19 <a href="utility_reference.html#MSG2ANS">MSG2ANS</a> <b>(</b>Ctrl-A to ANSI Conversion Utility<b>)</b></pre> - -<pre>16. <b>Troubleshooting your System</b> - 16.0 <a href="troubleshooting.html">Troubleshooting</a></pre> - -<pre>17. <b>Customizing your System</b> - 17.1 <a href="customization.html#MenusAndTextFiles">Menus and Other Text Files</a> - 17.1.1 <a href="customization.html#Text/Colors">Text Colors</a> - 17.1.2 <a href="customization.html#NodeActionText">Node Action Text</a> - 17.1.3 <a href="customization.html#TrashCanFiles">Trash Can Files</a> - 17.2 <a href="customization.html#MessageVariables">Message Variables</a> - 17.3 <a href="customization.html#MessageColorCodes">Message Color Codes</a> - 17.4 <a href="customization.html#SIFQuestionnaireFile">SIF Questionnaire File Format</a> - 17.5 <a href="customization.html#GURU.DAT">GURU.DAT (Guru Brain) Modifications</a></pre> - -<div align="left"> - -<pre>18. <b>Appendix Information -</b> 18.1 <a href="appendix.html#Appendix_A">Appendix A</a> : Command Line Specifier Reference<b> -</b> 18.2 <a href="appendix.html#Appendix_B">Appendix B</a> : Synchronet (SBBS/SCFG) Command Line Options - 18.3 <a href="appendix.html#Appendix_C">Appendix C</a> : Synchronet Environment Variables<b> -</b> 18.4 <a href="appendix.html#Appendix_D">Appendix D</a> : Wait for Call Status Display<b> <i><font color="#FF0000">(v2 Only)</font></i> -</b> 18.5 <a href="appendix.html#Appendix_E">Appendix E</a> : Node Status Display<b> -</b> 18.6 <a href="appendix.html#Appendix_F">Appendix F</a> : Log File Line Type Specifiers<b> -</b> 18.7 <a href="appendix.html#Appendix_G">Appendix G</a> : File Formats (Technical Specs for Developers)</pre> - -</div> - -<pre><b>19. Definitions of Commonly Used Terms -</b> 19.0 <a href="glossary.html">Glossary</a></pre> - -<p><b><a href="#TOC">Back to Table of Contents</a></b></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/sysop_commands.html b/docs/sysop_commands.html deleted file mode 100644 index b2f5a8d694..0000000000 --- a/docs/sysop_commands.html +++ /dev/null @@ -1,476 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Sysop Commands</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> - -<h2><a name="SysopDefinition">[5.1] - Sysop Definition</a></h2> - -<pre>There is usually one sysop (System Operator) per BBS - the owner and operator -of the hardware which Synchronet is running on and accepting remote users. -Quite often systems require more than one sysop and Synchronet is flexible in -this respect. Within Synchronet, a sysop is defined as any user with a main -level of 90 or above. Any user that qualifies as a sysop, is prompted with an -"<b>SY:</b>" to enter the system password at logon. Any time a sysop attempts to -perform a sysop function that may breach the system security, he is prompted -with an "<b>SY:</b>" to enter the system password before he can proceed. Users with -sysop access can cause serious damage to the system. Give out this ability with -caution.</pre> - -<h2><a name="MultipleSysops">[5.2] - Multiple Sysops</a></h2> - -<pre>As stated above, any user with a security level of 90 or greater can perform -sysop functions, "So why have levels 91-99?" you might ask yourself. Well, you -can still restrict a user with sysop access from accessing Message Groups or -Sub-boards or File Libraries or Directories by setting the minimum required -level above that user's level. For example: If you have a remote sysop with a -security level of 90, you can still have a Message Group or Sub-board with a -minimum required level of 91. Now this remote sysop will not be able to access -that Group or Sub-board. While it is true that sysops can edit their own -and subordinate user's accounts, they can not edit a sysop of higher level's -account (when calling remotely). A remote sysop can't raise any user's level -above his own, or add flags or exemptions that he himself doesn't have.</pre> - -<h2><a name="LocalSysopCommands">[5.3] - Local Sysop Commands </a><i><font color="#CC0000"><b>(v2 -Only)</b></font></i></h2> - -<pre>Most sysop functions will be performed locally, while some sysop functions can -<u>only</u> be performed locally. The following special key combination are only -available while online locally (not from the Waiting for Call screen). - -<u><b>Macros:</b> -</u> All the function keys (F1-F12) and combinations with Shift, Ctrl, and - Alt (48 macros total) are available for the sysop. A macro is a short - way to enter many keystrokes. Each macro is stored in a separate file - in the TEXT directory with a MAC extension. The name reflects which - key combination will initiate the macro. For regular F1 through F12, - the name is F1.MAC through F12.MAC respectively. For Alt-F1 through - Alt-F12 the name is ALT-F1.MAC through ALT-F12, Ctrl-F1 through - Ctrl-F12 are named CTRL-F1.MAC through CTRL-F12, and Shift-F1 through - Shift-F12 are named SHFT-F1.MAC through SHFT-F12. Each file is a basic - ASCII text file with one exception; an extended key combination (such - as Alt-D) can be entered by placing a Ctrl-@ (ASCII 0, NULL) in the - file followed by the scan code of the key you wish to use. - -<b><u>Alt-key combinations: -</u></b> -<b> Alt-U (User Edit) -</b> At any place within Synchronet, pressing Alt-U at the local keyboard - will pop the local console into User Edit while the remote side (if - there is a remote user) will see [WAIT]. Alt-U is available while using - the terminal mode as well. See User Edit for more information. - See UEDIT command below. - -<b> Alt-# (Quick Validation) -</b> Pressing Alt and then any of the numbers 0-9 will change the current - users level/flags/exemptions/restrictions/credits and extend their - expiration date to the settings for that quick-validation slot set in - the system configuration. SCFG->System->Toggle Options->Quick - Validation Hot Keys must be set to 'Yes' for this feature to work. - -<b> Alt-S (Crazy Cursor Toggle) -</b> Pressing Alt-S will toggle the state of the crazy (spinning) cursor, - but doesn't change the current user's default settings regarding it. - -<b> Alt-E (Local I/O Only) -</b> If a user is on remotely, this allows the local console to use the BBS - while the remote user just sees [WAIT]. Pressing Alt-E again re-enables - the remote console. - -<b> Alt-L (Capture) -</b> This starts and stops the local capture of text to a file. If capture - is active the status line will reflect this state with a blinking 'C' - as the far left character. The file the BBS opens to capture to will be - appended if the file already exists. The filename to capture to is - prompted for when capture is started. The filename defaults to - CAPTURE.TXT in the current node's directory. To direct output to the - printer, change the filename to PRN. - See ANSCAP command below. - -<b> Alt-Q (Quiet Remote User) -</b> If a user is connected remotely, hitting this key will disable him from - being able to enter any keystrokes into the BBS . The user will see all - the BBSs output, but any characters sent from his side will not be - accepted as input. Hitting Alt-Q again enables remote input again. - -<b> Alt-P (Sysop Page Off) -</b> If someone is currently paging the local sysop (annoying sounds at the - local console), hitting Alt-P will turn them off. Scroll-lock toggles - local sysop availability. - -<b> Alt-H (Disconnect) -</b> Hangs up on the current user immediately. - -<b> Alt-I (Interrupt) -</b> Hangs up on the current user after displaying a message the node has - been closed for maintenance. - See INTR command below. - -<b> Alt-A (Sysop Alert) -</b> When the current user logs off the BBS, the local sysop will be alerted - by a message and a continuous alarm. - -<b> Alt-R (Rerun Node) -</b> When the current user logs off the BBS, this node will automatically - rerun itself. - See RERUN command below. - -<b> Alt-X (Down Node After User Logs Off) -</b> Hitting this key combination while the user is in the BBS will toggle - the down status of this node. When a node is to be downed, it will - be automatically shutdown when the current user logs off. - See DOWN command below. - -<b> Alt-- (Subtracts 5 Minutes) -</b> Subtracts 5 minutes from the users time allowed online this logon. - -<b> Alt-+ (Add 5 Minutes) -</b> Add 5 minutes to the user's time allowed online this logon. - -<b> Alt-N (Lock Node) -</b> Pressing this key will disallow any non-sysops or users without the - 'N' exemption from logging on after the current user logs off. - See LOCK command below. - -<b> Alt-T (Temp Sysop) -</b> Gives the current user sysop status temporarily for this logon. Hitting - Alt-T again removes the temp sysop status. This doesn't actually raise - the security level of the user to 90, but gives him access to all sysop - functions. The status line reflects Temp Sysop state with a blinking - asterisk to the far left of the status line. - -<b> Alt-G (Guru Chat) -</b> Pops the user in and out of apparent local chat with the system's guru. - -<b> Alt-C (Local Chat) -</b> Pops the user into chat with the local console. - -<b> Alt-D (DOS Shell) -</b> Pops the local console into DOS. If a user is on remotely, he sees - [WAIT] till the local console exits the shell. The sysop can use the - 'D' command to shell to DOS from the wait for call screen. - See DOS command below. - -<b> Alt-Z (Local Key Menu) -</b> Displays the local key menu. - -<b>Status Line:<u> -</u></b> - The status line displays one line of user information at any given - time. To change the current line, use CTRL and the UP and DOWN arrow - keys to scroll through different information lines, or CTRL-HOME to go - to the default (1st) or CTRL-END to go to the last. - - The available status lines are: - - 0: UserName SecLevel Password ModemType Birthday Age Sex Phone - 1: UserName SecLevel RealName/CompanyName "Alt-Z for help" - 2: UserName SecLevel RealName/CompanyName Age Sex Phone - 3: UserName SecLevel Location Phone - 4: UserName SecLevel Note/Caller-ID Phone - 5: UserName SecLevel Flags1 Age Sex Phone - 6: UserName SecLevel Flags1 Expiration - 7: UserName SecLevel DateFirstOn DateLastOn Expiration - 8: UserName SecLevel Credits Minutes Expiration - 9: SecLevel Flags1 Flags2 - 10: Exemptions Restrictions - 11: ComputerType ModemType ChatHandle - 12: Address Location ZipCode - 13: UploadBytes UploadFiles DownloadBytes DownloadFiles LeechCount - 14: Posts EmailSent FeedbackSent EmailWaiting TotalLogons TotalTimeOn - 15: NetMailForwardingAddress - 16: SysopComment - - You can set the default status line number in SCFG->System->Advanced - options. This will be the default status line that appears until - manually scrolled. - - There are status flags on the status line that indicate specific status - items. They appear blinking on the left or right edges of the status - line. They are defined as: - - C Local text/ANSI capture is on - * Temporary sysop status - A Alert sysop when user logs off - R Rerun this node when user logs off - D Down this node when user logs off - E Run node daily event when user logs off - L This node is locked for sysop logons only</pre> - -<h2><a name="OnlineSysopCommands">[5.4] - Extra Online Sysop Commands</a></h2> - -<pre>Most of the additional commands available to sysops online (local or remote) -are initiated from the main or transfer sections. A menu of the available -commands can be viewed with the '!' command from the main or transfer sections -with the Synchronet Classic command shell. Additional sysop commands are -available in many other sections of the BBS and are displayed after the normal -menu with the '?' command. All sysop commands from the main or transfer -sections of the Synchronet Classic command shell begin with a semicolon (';') -character, end with CR (ENTER), and some have optional parameters (shown in -square brackets). Users with certain exemptions can use some of these commands -and have access to the menus via the '!' command using the Synchronet Classic -command shell. - - -<b> UEDIT [x] (User Edit) -</b> This command initiates the User Edit function. If 'x' is specified - and is a valid user number, that user will be the current user when - User Edit starts, otherwise the user online will be the current user. - This command is also available from the transfer menu. Locally, Alt-U - is the preferred method of initiating User Edit. - See the chapter on User Edit for more information.</pre> - -<pre><b> SPY [n] (Spy on Another User) <font color="#CC0000"><i>(v3.00c+ Only)</i></font> -</b> This command allows the sysop to remotely monitor or control another node - running in the same instance as the node the sysop is logged into.</pre> - -<pre><b> CHUSER (Change into Another User) -</b> This command allows the sysop to temporarily change to another user - account. If changing to an account with a higher level, the password - of that user must be given. Changing to an account of non-sysop status - automatically enables Temp Sysop mode so that the sysop can change back - to his/her own account before logging off (a suggested action). - -<b> ANSCAP (Toggle ANSI Capture Mode) <font color="#CC0000"><i>(v2 Only)</i></font> -</b> Normal ANSI escape sequences are not written to the capture file. The - sysop can use this command to enable all characters (including ANSI - escape sequences) to be written. - -<b> LOCK [x] (Lock Node) -</b> The sysop can use this command to prevent users logging onto a node - until the lock is removed. If 'x' is specified, that node's lock - status will be toggled, otherwise a list of all nodes is given and - the sysop is prompted for the node to lock or unlock. Sysops and - users with the 'L' exemption can use this command and log onto locked - nodes. A locked node will have an 'L' in parenthesis after the node - information in the node listings. - -<b> INTR [x] (Interrupt Node) -</b> This command allows a sysop (or user with the 'I' exemption) to hang up - on a user on another node. If the user is currently executing an - external program (editors and transfer protocols included), he will - not be disconnected until control returns to Synchronet. A message will - be displayed telling the user that the node has been temporarily closed - for maintenance before carrier is dropped. If 'x' is specified that - node's interrupt status will be toggled, otherwise a list of all nodes - is displayed and the sysop is prompted for the node who's interrupt - state he wishes to toggle. The current interrupt status of a node is - reflected by an 'I' in square brackets following the node information - line in the node listings. - -<b> DOWN [x] (Down Node) -</b> A sysop can toggle the down status of a node with this command. When - a node has the down status (noted by the [D] flag on the node status - line) it will be shutdown immediately after the user logs off. If a - user is not online, it will shutdown immediately. - -<b> ANON (Anonymous) -</b> This command makes the current node anonymous. Sysops and users with - the 'Q' exemption have access to this command. To a sysop, an anonymous - node appears normal with the addition of an 'A' in square brackets - following the node information line. - -<b> QUIET (Quiet Mode) -</b> Using this command, a sysop (or user with the 'Q' exemption) can make - his node appear to be "Waiting for call" to other users of the system. - Users with this ability can also make this state their default state - upon logon in the user defaults section. Local users can logon in - this state with the WFC command SPACE, then 'Z' or user number 1 can - logon fast and quiet with the WFC command SPACE, then 'Q'. - To a sysop, a node in this state appears normal with the addition of - a 'Q' in square brackets following the node information line. - -<b> RERUN [x] (Rerun Node) -</b> This command allows a sysop to rerun any node on the system by - specifying the node number on the command line. If there is a user - on the node that is to be rerun, the node will not rerun until that - user logs off. A node that is going to be rerun is noted with an - 'R' in square brackets following the node information in node listings. - -<b> DOS (Shell to DOS) -</b> Using this command, a sysop can go straight to the DOS command line - locally or remotely. If the sysop is on locally, ALT-D is the - preferred method of shelling to DOS. If a local sysop wishes to shell - to DOS from the wait for call screen, he can use the 'D' command. - -<b> EDIT [s] (Edit Text/MSG File) -</b> A sysop can edit any ASCII text (and MSG format) files on the system - with this command. If 's' is given, it will be used as the filename to - be opened or created if it doesn't exist. If 's' is not specified, the - filename will be prompted for. - -<b> LOG (Today's Detail Log) -</b> A sysop can view today's detailed log file with this command. This - command views the same file as the 'L' wait for call screen command. - -<b> YLOG (Yesterday's Detail Log) -</b> A sysop can view yesterday's detailed log file with this command. This - command views the same file as the 'Y' wait for call screen command. - -<b> NS [x] (Node Statistics) -</b> This command will give today's statistics for node 'x' if specified, - or the current node. - -<b> SS (System Statistics) -</b> This command will give today's statistics for all nodes combined. - -<b> NLOG [x] (Node Statistics Log) -</b> A sysop can view the history of statistics information for any node on - the system. If 'x' is specified, that will be the node who's statistics - are viewed, otherwise the current node. Same as 'N' from the wait for - call screen. - -<b> SLOG (System Statistics Log) -</b> Using this command, a sysop can view the history of statistics - information for the system. Same as 'S' from the wait for call screen. - -<b> MEM (Available Memory) <font color="#CC0000"><i>(v2 for DOS Only)</i></font> -</b> This command displays the amount of memory available to Synchronet and - any external programs it executes (without swapping). - -<b> LIST [s] (View Text/MSG File) -</b> A sysop can use this command to view any ASCII text (or MSG format) - file on the system. If the filename 's' is not specified, it is - prompted for. - -<b> GURU (View Guru Log) -</b> A sysop can use this command to view the GURU.LOG file which contains - discussions that users have had with the system guru (GURU.DAT). - See GURU.DAT for more information. - -<b> MAIL (Read All Mail) -</b> Using this command (or 'M' from the WFC screen) a sysop can read all - the e-mail on the system. - -<b> BULKMAIL (Send Mass Mailing) -</b> Use this command to send a single e-mail message to multiple users. - -<b> CALL [Hub-ID] (Force QWKnet Call-out) -</b> Forces a QWKnet call-out to the hub "Hub-ID" the next time the call-out - node is at the WFC screen. Example: CALL VERT - -<b> EXEC [Command] (Execute a DOS program or Baja module) -</b> Execute internal DOS commands (DIR, TYPE, etc.) by prepending - "command /c" to your command line. Execute Baja modules by prepending - "*" to the command line. Baja modules must be located in your EXEC - directory. Command line specifiers (see appendix A) may be used. - -<b> CHAT -</b> Users with the 'C' exemption can use this command to page the sysop. - -<b> OLD (Search for Files not Downloaded Since New-Scan Date) -</b> A sysop can use this command to remove, edit, or move files that were - uploaded before the new-scan date (set with the '&P' transfer section - command) and have not been downloaded since. - -<b> OLDUL (Search for Files Uploaded Before New-Scan Date) -</b> A sysop can use this command to remove, edit, or move files that were - uploaded before the new-scan date (set with the '&P' transfer section - command). - -<b> CLOSE (Search for Files Currently Open) -</b> If there are no users online and all nodes are running, there should - be no file records open. A sysop can check for open file records with - this command. Any file records that are left open erroneously, can be - closed with this command. This circumstance should not happen. - -<b> ALTUL [x] (Alternate File Path Uploads) -</b> If there are alternate file paths configured, a sysop can use this - command to set the current upload path to one of the alternate file - paths. All subsequent upload commands will use the alternate upload - path as the storage directory regardless of the storage path specified - for the directory being uploaded to. This is a useful command for - those who wish to have one directory with files listed from multiple - CD-ROMs. - See CD-ROM for more information on creating alternate file paths. - -<b> UPLOAD (Bulk Local Upload) -</b> This command searches for files that are on disk, but not in the - database of the directory. If any are found, a description is prompted - for and the file is then added to the database. - -<b> RESORT (Re-Sort and/or Compress) -</b> A sysop can use this command to re-sort a directory if he has changed - the sort order in the directory configuration or can use this command - to remove deleted file records from the database to conserve memory and - disk space. If there are many deleted files in the database of a - directory, performance will also be affected. Deleted file records - are used by new uploaded files, but if a substantial amount of files - have been removed from a directory, a sysop may wish to use this - command. - -<b> OFFLINE (Search for Offline Files) -</b> This command will search the disk for files that are in the database - of a directory but not actually on the disk. The sysop can then remove, - edit, or move these files to another directory. Offline directories - are ignored in this search. - -<b> DIR [s] (Directory of Files) -</b> This command displays a DOS directory of the path specified. If no - path is specified, a directory of the current file transfer directory - is displayed. - -<b> GET [s] (Download File From Anywhere) -</b> A sysop can download a file from any drive or directory on the system - by using this command. The file does not have to be in the file - database. - -<b> PUT [s] (Upload File to Anywhere) -</b> A sysop can use this command to upload a file to a local disk without - having to add it to the file database.</pre> - -<pre>Note: The Baja source code file for these commands is: <b>exec/str_cmds.src</b></pre> - -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/system_config.html b/docs/system_config.html deleted file mode 100644 index 82043247ba..0000000000 --- a/docs/system_config.html +++ /dev/null @@ -1,524 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>System Configuration</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><b><a name="top"></a></b><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2><a name="SystemConfiguration">[2.0] - System Configuration</a></h2> -<pre>SCFG is the Synchronet Configuration Utility. It is a stand-alone console mode -application currently available in the following forms:</pre> -<ul> - <li> -<pre>SCFG.EXE - 16-bit DOS application</pre> - </li> - <li> -<pre>SCFG32.EXE - 32-bit extended-DOS/Win32 application</pre> - </li> - <li> -<pre>SCFG4OS2.EXE - 32-bit OS/2 application</pre> - </li> -</ul> -<pre>To run SCFG from Synchronet for Win32 Control Panel, select <i>Configure</i> from the <i> -BBS</i> sub-menu on the menu bar.</pre> -<pre><img border="0" src="images/sbbsctrl_configure.gif" width="301" height="192"></pre> -<pre>SCFG can be executed from the <b>v2</b> "<i>Waiting for call</i>" screen by -hitting '<b>C</b>' or from DOS by typing <b>SCFG</b> from any node directory. -Example:</pre> -<pre><img border="0" src="images/scfg_dos_startup.gif" width="500" height="150"></pre> -<pre>Once SCFG has initialized, you will see a main menu titled "Configure" which looks -something like this:</pre> -<pre><img border="0" src="images/scfg_main.gif" width="572" height="331"> - -To manipulate the light-bar, use the <i>UP</i> and <i>DOWN ARROW</i> keys or type a letter or -number in the option you wish to highlight. To highlight the first option of -the menu, hit the <i>HOME</i> key. To highlight the last option of the menu, hit the -<i>END</i> key. You'll notice that if you hit <i>UP ARROW</i> key when the light-bar is at the -first option of the menu, the last option will become highlighted. This wrap effect -also occurs when hitting the DOWN ARROW key when the light-bar is at the last option -of the menu. To select the current highlighted option, hit <i>ENTER</i>. To exit SCFG, -hit the <i>ESC</i> key.</pre> -<pre>Under "System", set your system's name (BBS Name), the sysop's name (You), the -system location (City, State), and system password. The system password you -enter here will be required for any remote sysop operations and is prompted -for with an "<b>SY:</b>" prompt. Under "<a href="#Message Options">Message Options</a>", set your system's QWK ID -(Up to 8 character BBS name abbreviation). Under "Toggle Options" set -"Allow Aliases" to "Yes" or "No" depending on if you want users to be known -by their real names on your BBS or a personal alias.</pre> -<pre>Remember that at any time within SCFG, you can hit the <i>F1</i> key to get online -help about the current configuration window. Following is a more specific list -of the commands available in the SCFG under System options.</pre> -<h2><b><a name="MessageOptions">[2.1] - </a> </b><a name="MessageOptions"><b>Message Options</b></a> -<br> -<br> -<img border="0" src="images/scfg_msg_options.gif" width="572" height="331"></h2> -<pre><b>BBS ID for QWK Packets:</b> - This is the ID that will be used in QWK packets. It is important that - you set this to an abbreviation of your BBS name before users start - using the QWK functions of your BBS. Only valid DOS filename characters - can be used and the ID must begin with an alphabetic character. This - ID will also serve as your system's QWK Network address, should you - choose to join a QWK message network. - -<b>Local Time Zone:</b> - This should be set to the time zone where your BBS is located. - -<b>Maximum Retry Time:</b> - This is the maximum number of seconds the Synchronet message base - library will wait for a locked message base to become unlocked. - Under normal conditions, message bases are only left locked for an - extremely short period of time. - -<b>Maximum QWK Messages:</b> - This is the maximum number of messages which will be packed when a - QWK packet is created. If the number of new messages to be packed - exceeds this, the packing will be stopped after packing this number - of messages. Setting this value to 0 sets the number of messages - per packet to unlimited. Private e-mail is not included in the total - number of messages and QWK network nodes are automatically exempt - from this maximum. - -<b>Pre-pack QWK Requirements:</b> - If this option is used (not blank), Synchronet will pre-pack any new - messages into a QWK packet in the DATA\FILE directory for each user - that meets this requirement. When that user calls to download their - packet, it will automatically extract the pre-packed QWK (if it - exists) and append to it. It is mainly intended for QWKnet nodes that - feed from your BBS, but can also be used for long distance users that - wish to save connect time and always read their messages via QWK. - -<b>Purge E-mail by Age:</b> - This will allow electronic mail for your users (stored in DATA\MAIL.*) - to be purged after a specific number of days (read or unread). - -<b>Purge Deleted E-mail:</b> - This option can be set to "Daily" or "Immediately". If set to - "Immediately", e-mail marked for deletion will be physically removed - from the e-mail database immediately after the user exits the - reading mail menu. If set to "Daily" (the suggested setting), e-mail - is marked for deletion isn't physically removed from the database - until the automatic daily event executes (sometime after midnight). - -<b>Duplicate E-mail Checking:</b> - This option allows the setting of a number of message CRCs to be kept - to check e-mail to insure that it is not a duplicate of another piece - of e-mail. This option should be set to 0 (disabled) unless you - specifically want duplicate e-mail disallowed, in which case a value - of 2000 should be sufficient. - -<b>Allow Anonymous E-mail:</b> - Setting this option to Yes will allow users with the 'A' exemption to - send anonymous e-mail. - -<b>Allow Quoting in E-mail:</b> - To allow users to quote from e-mail, this option should be set to Yes. - -<b>Allow Uploads in E-mail:</b> - To allow users to attach files to e-mail, this option must be set to - Yes. - -<b>Allow Forwarding to NetMail:</b> - If you allow users to send NetMail on your BBS and want to allow your - users to set their account to forwarding their e-mail to a NetMail - address, set this option to Yes. - -<b>Kill Read E-mail:</b> - If you would like to have any e-mail that has been read by the - recipient automatically deleted by the message base maintenance program - (SMBUTIL) set this option to yes. - -<b>Users Can View Deleted Messages:</b> - This option allows all users or sysops/sub-ops the ability to view - messages (posts/e-mail) marked for deletion (and optionally undelete - them) before they are permanently removed from the message base. - -<b>Extra Attribute Codes...:</b> - This option will give you a sub-menu of toggle options. These options - tell Synchronet whether or not it should interpret color codes which - are supported by other BBS packages.</pre> -<h2><img border="0" src="images/scfg_msg_attrcodes.gif" width="572" height="331"> - - -<br> -<br> - - -<a name="SystemOptions"> - - -[2.2] - System Options</a></h2> -<pre><img border="0" src="images/scfg_system.gif" width="572" height="331"> - -<b>BBS Name:</b> - This is the name of the BBS. - -<b>Location:</b> - This is the city, state and/or other pertinent location information. - -<b>Operator:</b> - This is the name of the system operator. Doesn't have to be the same - as user #1. - -<b>Password:</b> - This is the super-secret system password that only sysops should know. - -<b>Users Can Change Password:</b> - If you want enhanced system security, it is suggested that you force - users to keep the original randomly generated password they were - assigned by setting this option to No. If you do allow users to change - their passwords, you can make them change their password periodically - with this selection. - -<b>Days to Preserve Deleted Users:</b> - If a user is deleted, his slot will be preserved for this many days - since his last logon date. Preserved slots will not be written over - by new users. Preserved slots may be undeleted by the sysop. - -<b>Maximum Days of Inactivity:</b> - If you wish that users that haven't logged on in a certain number of - days be automatically deleted, set this value to the maximum number - of days a user can be inactive before he is deleted. Users can be - exempted from the automatic deletion with the 'P' exemption. Setting - this value to 0 disables this feature (Unlimited inactivity). - -<b>New User Password:</b> - If this field has a value, new users will have to enter this password - correctly before being able apply for access.</pre> -<h2><b><a name="SystemToggleOptions">[2.3] - </a> </b><a name="SystemToggleOptions"><b>System Toggle Options</b></a></h2> -<pre>Selecting this option will bring you to the following sub-menu:</pre> -<pre><img border="0" src="images/scfg_system_toggle.gif" width="572" height="331"></pre> -<pre><b>Allow Aliases:</b> - If you wish the users of the BBS to be allowed to use aliases publicly, - set this option to Yes. - -<b>Allow Time Banking:</b> - Set this option to Yes to allow users to store their time in a time - bank, or to convert their credits to time via the BBS. - -<b>Allow Credit Conversions:</b> - Setting this option to Yes will allow users to be able to convert - credits to time. - -<b>Allow Local Sysop Access <i><font color="#FF0000">(v2 Only)</font></i>:</b> - To be able to perform sysop actions locally, this option should be set - to Yes. - -<b>Allow Remote Sysop Access:</b> - To be able to perform sysop actions remotely, this option should be set - to Yes. - -<b>Echo Passwords Locally <i><font color="#FF0000">(v2 Only)</font></i>:</b> - If this option is set to No, all BBS passwords will not be displayed - locally (characters will be replaced by an X). This includes passwords - entered during logon, passwords in the user editor, as well as - passwords normally displayed on the status line. - -<b>Require Passwords Locally <i><font color="#FF0000">(v2 Only)</font></i>:</b> - If this option is set to No the BBS will not ask for a password to be - entered when performing local operations. - -<b>Short Sysop Page: -</b> If set to Yes, this sysop page will be a short series of beeps, - otherwise a continuous sysop page will be used. - -<b>Sound Alarm on Error: -</b> If the above option (beep locally) is toggled off, but you still wish - to have errors produce an audible alarm, you should toggle this option - to Yes. - -<b>Include Sysop in Statistics: -</b> It is suggested that you set this option to No, so that the sysop's - activity on the BBS is not included in the usage statistics. - -<b>Closed to New Users: -</b> If you wish to disallow access to any new users, set this option to - Yes. - -<b>Use Location In User Lists: -</b> If you wish the location (City, State) of the user to be displayed - in user listings instead of the user note, set this option to Yes. - Setting this option to No will display the user's note (sysop created) - if one has been created. The option should be set to Yes if using - Caller-ID since the user's note may contain their phone number. - -<b>Military (24 hour) Time Format: -</b> Use this option to toggle your BBS between 12 and 24 hour time formats. - -<b>European Date Format (DD/MM/YY): -</b> This option should ONLY be toggle to Yes if you are in a European - country which uses this date format. All countries using the MM/DD/YY - format should leave this option set to No. If your BBS has been running - for any length of time with this option set to No, you should NOT - change it to Yes. - -<b>User Expires When Out-of-time: -</b> Useful for BBSs which charge users based on time, this option, when set - to Yes, will set a user to the expired account values once the user's - time runs out. - -<b>Quick Validation Hot-Keys <i><font color="#FF0000">(v2 Only)</font></i>: -</b> If this option is set to No, the quick validation hot keys will be - disabled.</pre> -<h2><b><a name="NewUserValues">[2.4] - </a> </b><a name="NewUserValues"><b>New User Values</b></a> -</h2> -<pre><img border="0" src="images/scfg_system_newvalues.gif" width="572" height="331"></pre> -<pre>This option allows you to modify the security values assigned to a new user -after he completes his validation feedback. You can also set the number of -credits and minutes new users start off with. If you have configured an -alternate command shell or external editors, you may select one of these as the -default for new users. See User Edit for more information about user account -values.</pre> -<pre><img border="0" src="images/scfg_system_newvalues_toggles.gif" width="572" height="331"></pre> -<pre>The 'Default Toggles' are used to set the account defaults that users will have -when they log on to the system as a new user. These account defaults can be -changed by the user at logon, or while on the system from the user defaults -menu.</pre> -<pre><img border="0" src="images/scfg_system_newvalues_questions.gif" width="572" height="331"></pre> -<pre>The 'Question Toggles' are used to enable/disable the different questions which -new users will be asked when logging on to the BBS. The 'Force Unique...' -question toggles are used to force users to pick a string that is not being -used by any of the other users currently in the system user list.</pre> -<h2><b><a name="AdvancedOptions">[2.5] - Advanced Options</a> -</b></h2> -<pre><img border="0" src="images/scfg_system_advanced.gif" width="572" height="331"> - -<b>New User Magic Word: -</b> If this field has a value, it is assumed the sysop would have put - some reference to this "magic word" in NEWUSER.MSG and the user - will be prompted for this after he enters his own assigned password. - If he doesn't enter it correctly, it is assumed he didn't read the - text displayed to him and he is disconnected. - -<b>Data Directory: -</b> This is the path to the directory where all the data files for SBBS - are stored. This value should not be changed unless necessary. - -<b>Index Directory: -</b> This is the path to the directory where all the index files for SBBS - are stored. This value should not be changed unless necessary. - -<b>Executables Directory: -</b> This is the path to the directory where all the executable files for - SBBS are store. This value should not be changed unless necessary. - -<b>Input SIF Questionnaire: -</b> This is the name of a SIF file that resides the text directory that - all users will be prompted to answer upon logging on the first time. - See SIF for more information. - -<b>Output SIF Questionnaire: -</b> This is the name of the SIF file that is used by the sysop to view - the users' answers to the input SIF questionnaire. If this value is - left blank, the input SIF questionnaire is used. This output SIF - questionable should be identical to the input SIF with the exception - of the text content. See SIF for more information. - -<b>Credits Per Dollar: -</b> This is the monetary value of a credit (How many credits per dollar). - This value should be a power of 2 (1, 2, 4, 8, 16, 32, 64, 128, etc.) - since credits are usually converted by 100 kilobyte (102400) blocks. - To make a dollar worth two megabytes of credits, set this value to - 2,097,152 (a megabyte is 1024*1024 or 1048576). - -<b>Minutes Per 100k Credits: -</b> This is the value of a minute of time online. Credits can be converted - to minutes by the user if allowed by the command shell. Credits are - only converted in 100k (102400) blocks. This field is the number of - minutes to give the user in exchange for the 100k credit block. - -<b>Maximum Number of Minutes: -</b> This value is the maximum total number of minutes a user can have. If - the user has this number of minutes or more, he will not be allowed - to convert credits into minutes. A sysop can add minutes to a user's - account regardless of this maximum. If this value is set to 0, the - user will have no limit on the total number of minutes he can have. - -<b>Warning Days Till Expire:</b> - When a users account is about to expire, the BBS will begin sending - expiration warning messages to the users notifying them this many days - in advance. - -<b>Default Status Line <i><font color="#FF0000">(v2 Only)</font></i>:</b> - This is the number of the status line that will be displayed by default - at the bottom of the screen while the user is online. - -<b>Last Displayable Node:</b> - This is the number of the last node that will be viewable by the users. - Any nodes which exist above this number will be "invisible" nodes and - cannot be seen by anyone. - -<b>First Local Auto-Node <i><font color="#FF0000">(v2 Only)</font></i>:</b> - When using the AUTONODE utility, this is the node number to begin - searching at for an available (offline) node. - -<b>Phone Number Format:</b> - This is the format which users will be required to use when entering - their phone numbers. - -<b>Sysop Chat Requirements: -</b> Any user meeting the criteria set here will be able to page the sysop - regardless of the status of the sysop availability (Scroll Lock in v2.3).</pre> -<h2><b><a name="LoadableModules">[2.6] - Loadable Modules</a> -</b></h2> -<pre><img border="0" src="images/scfg_system_loadablemods.gif" width="572" height="331"> - -The Loadable Modules options are used for loading Baja .BIN modules during -various stages of the BBS operation. Selecting one of the functions -will prompt you for the name of the Baja module to be used when that event -occurs. See DOCS\BAJA.DOC for details on creating/modifying loadable modules. - -Following is a brief description of when each of the Loadable Modules occur -during the BBS operation: - -<b>Login:</b> - This module is <b>REQUIRED</b> for remote and local logins. Occurs when a - user is connected, immediately after the Synchronet copyright notice is - displayed. - -<b>Logon Event: -</b> Occurs immediately after Login (above). - -<b>Sync Event: -</b> This is a Synchronization Event and occurs each time the BBS performs - a node synchronization (e.g. when node messages are received, node - status is read, etc...basically continuously while a user is online). - -<b>Logoff Event: -</b> Occurs ONLY when a user does a slow logoff. Does NOT occur when users - hang up on the BBS or do a fast logoff. - -<b>Logout Event: -</b> This is an offline event that occurs after a user has disconnected from - the BBS, either by logging off or hanging up. - -<b>New User Event: -</b> Occurs at the end of a new user procedure (e.g. after the user has - logged on, left new user feedback, and anything else that is - required of a new user). - -<b>Expired User: -</b> This is an offline event that occurs during Synchronet's internal daily - event (after the first caller at the beginning of a new day).</pre> -<h2><b><a name="SecurityValues">[2.7] - </a> </b><a name="SecurityValues"><b>Security Values</b></a></h2> -<pre><img border="0" src="images/scfg_system_securityvalues.gif" width="572" height="331"></pre> -<pre>This option allows you to define the values of the Security Levels (0-99). -Selecting the desired security level will bring you to another menu similar to -the following:</pre> -<pre><img border="0" src="images/scfg_system_securityvalues_0.gif" width="572" height="331"></pre> -<pre>Here you can modify the corresponding values for that particular security -level. These values will be given to ALL users who have the selected security -level. Many of these values may be overridden by giving certain users the -necessary exemptions (if required).</pre> -<h2><b><a name="ExpiredAccountValues">[2.8] - </a> </b><a name="ExpiredAccountValues"><b>Expired Account Values</b></a> -</h2> -<pre><img border="0" src="images/scfg_system_expired.gif" width="572" height="331"> - -This sub-menu contains the account values for expired user accounts. When -a user account expires, the information contained here will be applied to -that user account.</pre> -<h2><b><a name="QuickValidationValues">[2.9] - </a> </b><a name="QuickValidationValues"><b>Quick Validation Values</b></a></h2> -<pre><img border="0" src="images/scfg_system_quickval.gif" width="572" height="331"> - -This is where you define the values of the quick-validation sets (0-9). -Selecting a level from this list will bring you to another menu similar to the -following:</pre> -<pre><img border="0" src="images/scfg_system_quickval_0.gif" width="572" height="331"> - -These are used to quickly set a user's Level, Flags, Restrictions and -Exemptions, as well as extend their expiration date and add credits to their -account. A user can be quick-validated by hitting Alt-(0-9) while the user is -online, or with the 'V' command from User Edit.</pre> -<h2><b><a name="CreatingUserAccountsLocally">[2.10] - </a> </b><a name="CreatingUserAccountsLocally"><b>Creating User Accounts -Locally</b></a><b> <i><font color="#FF0000">(v2 Only)</font></i></b></h2> -<pre>Exit the configuration program and run SBBS from your NODE1 directory. When you -get a menu that says "Synchronet Version xx" (Wait For Call screen), hit -SPACE BAR to logon. Answer 'Y' to the Logon (Y/N) prompt. At the NN: prompt, -enter "NEW" to create a new account. Answer the questions until you get to the -BBS main menu and then logoff the BBS. - -Repeat this process for any other user accounts you wish to create. Be sure -to give out high access levels and exemptions very carefully.</pre> -<h3><b><a name="CreatingSysopAccount">[2.10.1] - </a> </b><a name="CreatingSysopAccount"><b>Creating a Sysop Account</b></a></h3> -<pre>Follow the above steps to create a user account. Once you are back at the WFC -(Wait For Call) screen, press 'U' and go to the account that you've created. -You should give this account (the main sysop account) all of the different -flags and exemptions (no restrictions), and a level of 99 (use '?' to help -find the keys to select the different options). - -<b>NOTE:</b> Users with levels of 90 and above have SYSOP access. - - <b><i>TIP:</i></b> To logon from the wait for call screen quickly, hit SPACE, then 'F' - for fast sysop (user #1) logon. - - <b><i>TIP:</i></b> To keep your logons from being written to the logon list, turn - "Default to quiet mode" on from the Default Configuration menu. If - you want users to see that you're online, you can toggle quiet mode - off/on with the ";QUIET" sysop command from the Synchronet main menu.</pre> -<h3><b><a name="CreatingGuestAccount">[2.10.2] - </a> </b><a name="CreatingGuestAccount"><b>Creating a Guest Account</b></a></h3> -<pre>Follow the above steps to create a user account. Once you are back at the WFC -(Wait For Call) screen, press 'U' and go to the account that you've created to -be used as your Guest account. Change the Real Name field of the account to -'Guest', and give this account the access that you feel is necessary for a -Guest user to have (along with any Restrictions that may be necessary). Select -the Password field, and make it blank (this will allow Guests to log on by -simply entering GUEST at the NN: prompt without the need for a password). - -If you have certain areas on your BBS which are restricted by age, you may wish -to modify the Birth-date field of the Guest account as necessary. - -You may also wish to (from the SCFG program under Nodes->Node#->Logon Prompt) -modify the logon prompts of your nodes to read something along the lines of -'Enter Name, Number, New, or Guest', so that users will be aware that there is -a Guest account available for them to use. You can also place a note informing -users of the Guest account in your BBS's ANSWER screen.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/text210a.dif b/docs/text210a.dif deleted file mode 100644 index c6c4ce90ef..0000000000 --- a/docs/text210a.dif +++ /dev/null @@ -1,191 +0,0 @@ -Comparing files 200G\TEXT.DAT and 210A\TEXT.DAT -***** 200G\TEXT.DAT -"rh\r\n\7You have posted too many times today.\r\n" TooManyPostsToday -"\r\7Sorry, Sub-board is full - message NOT saved.\r\n" SubFull (*) -"n\r\nThe sending of mail is beyond your ability.\r\n" R_Email -"n\r\nPlease post on some other computer.\r\n" R_Post -"n\r\nThanks, but %s doesn't care to hear "\ R_Feedback - "from you.\r\n" -"nm\r\nSending E-mail to h%s nm#%un\r\n" Emailing -***** 210A\TEXT.DAT -"rh\r\n\7You have posted too many times today.\r\n" TooManyPostsToday -"\r\7Sub-board is full - message NOT saved.\r\n" SubFull (*) -"n\r\nThe sending of mail is beyond your ability.\r\n" R_Email -"n\r\nYou can't post messages.\r\n" R_Post -"n\r\nYou can't send E-mail to %s.\r\n" R_Feedback -"nm\r\nSending E-mail to h%s nm#%un\r\n" Emailing -***** - -***** 200G\TEXT.DAT -"nm\r\nForwarded by h%snm on "\ ForwardedFrom - "h%s\r\n" -"nm\r\nMail forwarded to h%s nm#%d.n\r\n" Forwarded -***** 210A\TEXT.DAT -"nm\r\nForwarded by h%snm on "\ ForwardedFrom - "h%sn\r\n" -"nm\r\nMail forwarded to h%s nm#%d.n\r\n" Forwarded -***** - -***** 200G\TEXT.DAT - "h%ung): n" -"n\r\nCannot reply to anonymous message.\r\n" CantReplyToAnonMsg -"ncRE: h%sn\r\n\r\n" Regarding -***** 210A\TEXT.DAT - "h%ung): n" -"n\r\nYou can't reply to an anonymous message.\r\n" CantReplyToAnonMsg -"ncRE: h%sn\r\n\r\n" Regarding -***** - -***** 200G\TEXT.DAT -"\r\nNo messages have been posted on %s %s\r\n" NoMsgsOnSub -"\r\nncPost : [h%dnc][h%dnc] h%dnc/h%d" ZScanPostHdr -"_\r\nchReading nc[h%unc] %s "\ ReadingSub -***** 210A\TEXT.DAT -"\r\nNo messages have been posted on %s %s\r\n" NoMsgsOnSub -"\r\nncPost : [h%unc][h%unc] h%lunc/h%lu" ZScanPostHdr -"_\r\nchReading nc[h%unc] %s "\ ReadingSub -***** - -***** 200G\TEXT.DAT -"\r\nAre you sure" AreYouSureQ -"\r\n\r\nYour chatting abilities have disappeared.\r\n" R_Chat -"RE: Feedback\r\n\r\n" ReFeedback -***** 210A\TEXT.DAT -"\r\nAre you sure" AreYouSureQ -"\r\n\r\nYou can't chat.\r\n" R_Chat -"RE: Feedback\r\n\r\n" ReFeedback -***** - -***** 200G\TEXT.DAT -"\r\nYou can't post on this sub.\r\n" CantPostOnSub -"\r\n\r\nSorry, you can't access the transfer "\ R_TransferSection - "section.\r\n" -***** 210A\TEXT.DAT -"\r\nYou can't post on this sub.\r\n" CantPostOnSub -"\r\n\r\nYou can't access the transfer "\ R_TransferSection - "section.\r\n" -***** - -***** 200G\TEXT.DAT - "than %d days.\r\n\r\n" -"\r\nChoose a new password" NewPasswordQ -"_\r\nyhNew password (4-8 chars): " NewPassword -***** 210A\TEXT.DAT - "than %d days.\r\n\r\n" -"\r\nEnter a different password" NewPasswordQ -"_\r\nyhNew password (4-8 chars): " NewPassword -***** - -***** 200G\TEXT.DAT -"_\r\nyhMagic word: w" MagicWordPrompt -"\r\nSorry, illiterate users aren't given "\ FailedMagicWord - "access here.\r\n" -"Sorry, the system is full." SystemFull -***** 210A\TEXT.DAT -"_\r\nyhMagic word: w" MagicWordPrompt -"\r\nSorry, that was not the magic word.\r\n" FailedMagicWord -"Sorry, the system is full." SystemFull -***** - -***** 200G\TEXT.DAT -"rhiYou call that a password?n" PasswordInvalid -"rhiThat's not very original!n" PasswordObvious -"\r\nnA) IBM (or compatible)\r\nB) Apple\r\nC) "\ ComuterTypeMenu -***** 210A\TEXT.DAT -"rhiYou call that a password?n" PasswordInvalid -"rhiThat password is too obvious!n" PasswordObvious -"\r\nnA) IBM (or compatible)\r\nB) Apple\r\nC) "\ ComuterTypeMenu -***** - -***** 200G\TEXT.DAT -"\r\n_yhNetMail address "\ EnterNetMailAddress - "(Example: Joe Schmoe @1:1/1)\r\n: " -"nlgSelect h%sng:\r\n\r\n" SelectItemHdr -***** 210A\TEXT.DAT -"\r\n_yhNetMail address "\ EnterNetMailAddress - "(Example: name@address)\r\n: " -"nlgSelect h%sng:\r\n\r\n" SelectItemHdr -***** - -***** 200G\TEXT.DAT -"\r\nwhWelcome to Channel %d (c%sw)\r\n\r\nn" WelcomeToChannelN -"_whNode %2d: g%sng in multinode chat "\ NodeInMultiChatLocally - "channel %d locally.\r\n" -***** 210A\TEXT.DAT -"\r\nwhWelcome to Channel %d (c%sw)\r\n\r\nn" WelcomeToChannelN -"_wh%3d g%sng in multinode chat "\ NodeInMultiChatLocally - "channel %d locally.\r\n" -***** - -***** 200G\TEXT.DAT -"\r\nCorrect.\r\n" CorrectPassword -"\r\nWrong password.\r\n" WrongPassword -"Password protect this channel" PasswordProtectChanQ -***** 210A\TEXT.DAT -"\r\nCorrect.\r\n" CorrectPassword -"rh\r\nWrong password.\r\n" WrongPassword -"Password protect this channel" PasswordProtectChanQ -***** - -***** 200G\TEXT.DAT -"\r\nnYou've taken too long to log on.\r\n" TakenTooLongToLogon -"\r\nnCall back later when you are there.\r\n" CallBackWhenYoureThere -"_bh%s (cYb/cnb) ? w" YesNoQuestion -***** 210A\TEXT.DAT -"\r\nnYou've taken too long to log on.\r\n" TakenTooLongToLogon -"\r\nnYou've been inactive too long.\r\n" CallBackWhenYoureThere -"_bh%s (cYb/cnb) ? w" YesNoQuestion -***** - -***** 200G\TEXT.DAT - "Continue" -"nm\r\nSending NetMail To: h%snm at h%s\r\n"\ NetMailing - " nmFrom: h%snm at h%s\r\n" -"Remove this sub-board from your new-scan list" RemoveFromNewScanQ -***** 210A\TEXT.DAT - "Continue" -"nm\r\nSending NetMail To: h%snm (h%snm)\r\n"\ NetMailing - " From: h%snm (h%snm)\r\n" -"Remove this sub-board from your new-scan list" RemoveFromNewScanQ -***** - -***** 200G\TEXT.DAT -"\r\nEcho is now %s \r\n" EchoIsNow -"\r\nnyhPrivate Chat - bType w/?b for "\ WelcomeToPrivateChat - "menu.n\r\n\r\n" -"\r\nngUploading h%s.REP\r\n" UploadingREP -***** 210A\TEXT.DAT -"\r\nEcho is now %s \r\n" EchoIsNow -"\r\nnyhPrivate Chat - bCtrl-C to Quitn\r\n\r\n" WelcomeToPrivateChat -"\r\nngUploading h%s.REP\r\n" UploadingREP -***** - -***** 200G\TEXT.DAT -"hc%3u nc%-25.25sh%8lu" ChatChanLstFmt -"\r\nYou cannot access that channel.\r\n" CantAccessThatChannel -"\r\nYou cannot download from this directory.\r\n" CantDownloadFromDir -"_whSearching for duplicates..." SearchingForDupes -***** 210A\TEXT.DAT -"hc%3u nc%-25.25sh%8lu" ChatChanLstFmt -"\r\nYou can't access that channel.\r\n" CantAccessThatChannel -"\r\nYou can't download from this directory.\r\n" CantDownloadFromDir -"_whSearching for duplicates..." SearchingForDupes -***** - -***** 200G\TEXT.DAT -"ng(h%dng) %sh\r\n" CfgLibLstFmt -"~Batch download, ~Extended info, ~View file, "\ BatchFlagPrompt - "~Skip dir, ~Quit or [More]: " -"~Batch, ~Extended, ~View, ~Delete, ~Move, "\ SysopBatchFlagPrompt - "~Skip dir, ~Quit or [More]: " -"\r\nDownload attached file: w%sb (%s bytes)" DownloadAttachedFileQ -***** 210A\TEXT.DAT -"ng(h%dng) %sh\r\n" CfgLibLstFmt -"_chListing nc(h%unc) %s "\ BatchFlagPrompt - "(h%unc) %s (h?nc=Menu) (h%lunc Filesnc): n" -"nl4 hy[wBy]atch Download [wVy]iew Content [wEy]xtended "\ - "Info [wPy]revious Files [wQy]uit n\r\n" -"\r\nDownload attached file: w%sb (%s bytes)" DownloadAttachedFileQ -***** - - diff --git a/docs/text220a.dif b/docs/text220a.dif deleted file mode 100644 index 01ca95023c..0000000000 --- a/docs/text220a.dif +++ /dev/null @@ -1,167 +0,0 @@ -Comparing files 211A\TEXT.DAT and 220A\TEXT.DAT -***** 211A\TEXT.DAT -"\1n\1cSubj : \1h%s\r\n" MsgSubj -"\1n\1cAttr : \1h%s%s%s%s%s%s%s\r\n" MsgAttr -"\1n\1cTo : \1h%s" MsgTo -***** 220A\TEXT.DAT -"\1n\1cSubj : \1h%s\r\n" MsgSubj -"\1n\1cAttr : \1h%s%s%s%s%s%s%s%s%s\r\n" MsgAttr -"\1n\1cTo : \1h%s" MsgTo -***** - -***** 211A\TEXT.DAT -"rh\r\n\7You have posted too many times today.\r\n" TooManyPostsToday -"\r\7Sub-board is full - message NOT saved.\r\n" SubFull (*) -"n\r\nThe sending of mail is beyond your ability.\r\n" R_Email -***** 220A\TEXT.DAT -"rh\r\n\7You have posted too many times today.\r\n" TooManyPostsToday -"\r\7nrhCannot add w%sr to queue - n" CantAddToQueue -"n\r\nThe sending of mail is beyond your ability.\r\n" R_Email -***** - -***** 211A\TEXT.DAT -"\r\nWhich, ~Add, ~Remove, ~Edit, or ~Quit: " WhichTextFileSysop -"_\r\ncWhich or h~Qncuit: h" WhichTextFile -"_\r\nyhBefore which file: n" AddTextFileBeforeWhich -***** 220A\TEXT.DAT -"\r\nWhich, ~Add, ~Remove, ~Edit, or ~Quit: " WhichTextFileSysop -"_\r\nncWhich or h~Qncuit: h" WhichTextFile -"_\r\nyhBefore which file: n" AddTextFileBeforeWhich -***** - -***** 211A\TEXT.DAT -"\r\n~Quit or [Next]: " QuitOrNext -"~Remove, ~Move, ~Edit, ~Quit, or [Next]: " RExemptRemoveFilePrompt -"n(%d) %s\r\n" MoveToLibLstFmt -***** 220A\TEXT.DAT -"\r\n~Quit or [Next]: " QuitOrNext -"~Remove, ~Move, ~Edit, ~View, ~Quit, or [Next]: " RExemptRemoveFilePrompt -"n(%d) %s\r\n" MoveToLibLstFmt -***** - -***** 211A\TEXT.DAT -"~Remove, ~Credits only, ~File only, ~Move, ~Edit, "\ SysopRemoveFilePrompt - "~Quit, or [Next]: " -"~Remove, ~Edit, ~Quit, or [Next]: " UserRemoveFilePrompt -"\r\nFile not there.\r\n" FileNotThere -***** 220A\TEXT.DAT -"~Remove, ~Credits only, ~File only, ~Move, ~Edit, "\ SysopRemoveFilePrompt - "~View, ~Quit, or [Next]: " -"~Remove, ~Edit, ~View, ~Quit, or [Next]: " UserRemoveFilePrompt -"\r\nFile not there.\r\n" FileNotThere -***** - -***** 211A\TEXT.DAT - "(%s bytes)n\r\n" -"wh\r\nFile is already in queue.\r\n" FileAlreadyInQueue -"wh\r\nFile is not online.\r\n" FileIsNotOnline -***** 220A\TEXT.DAT - "(%s bytes)n\r\n" -"wh\r\n%s is already in the queue.\r\n" FileAlreadyInQueue -"wh\r\nFile is not online.\r\n" FileIsNotOnline -***** - -***** 211A\TEXT.DAT - " Bytes: h%snc Time: h%s\r\n" -"\r\nNon-viewable file type.\r\n" NonviewableFile -"rhi%s NOT RECEIVED!n\r\n" FileNotReceived -***** 220A\TEXT.DAT - " Bytes: h%snc Time: h%s\r\n" -"\r\nnrhThe sysop has not configured w%sr as a"\ NonviewableFile - " viewable file type.\r\n" -"rhi%s NOT RECEIVED!n\r\n" FileNotReceived -***** - -***** 211A\TEXT.DAT -"\r\nmhChecking Slots..." CheckingSlots -"%-32.32s%-30.30s%-8.8s %-8.8s\r\n" UserListFmt -"\r%d Total users. \r\n" NTotalUsers -***** 220A\TEXT.DAT -"\r\nmhChecking Slots..." CheckingSlots -"nh%-32.32snm%-30.30sh%-8.8s nm%-8.8s\r\n" UserListFmt -"\r%d Total users. \r\n" NTotalUsers -***** - -***** 211A\TEXT.DAT -"ncExemption : h%-26s ncRestricts : h%s\r\n" UeditExempts -"\r\n_yhUser edit (%u of %u): n" UeditPrompt -"Restore User" UeditRestoreQ -***** 220A\TEXT.DAT -"ncExemption : h%-26s ncRestricts : h%s\r\n" UeditExempts -"\r\n_yhUser edit (w?y=Menu) "\ UeditPrompt - "(w%uy of w%uy): n" -"Restore User" UeditRestoreQ -***** - -***** 211A\TEXT.DAT -"\r\nDelete Questionaire" DeleteQuestionaireQ -"-gDefault settings for h%s #%d\r\n\r\nn" UserDefaultsHdr -"T) Terminal Mode : %s\r\n" UserDefaultsTerminal -"E) External Editor : %s\r\n" UserDefaultsXeditor -"L) Screen Length : %s\r\n" UserDefaultsRows -"X) Expert Menu Mode : %s\r\n" UserDefaultsMenuMode -"P) Screen Pause : %s\r\n" UserDefaultsPause -"H) Hot Keys : %s\r\n" UserDefaultsHotKey -"S) Spinning Cursor : %s\r\n" UserDefaultsCursor -"C) Clear Screen Between Messages : %s\r\n" UserDefaultsCLS -"N) Ask For New Message/File Scan : %s\r\n" UserDefaultsAskNScan -"Y) Ask For Your Un-read Msg Scan : %s\r\n" UserDefaultsAskSScan -"F) Automatic New File Scan : %s\r\n" UserDefaultsANFS -"R) Remember Current Sub-board : %s\r\n" UserDefaultsRemember -"B) Batch Download File Flagging : %s\r\n" UserDefaultsBatFlag -"M) Forward E-mail to NetMail : %s\r\n" UserDefaultsNetMail -"K) Command Shell : %s\r\n" UserDefaultsCmdShell -"D) Default to Quiet Mode : %s\r\n" UserDefaultsQuiet -"W) Change Password\r\n" UserDefaultsPassword -"A) Temporary/QWK Archive Type : %s\r\n" UserDefualtsArcType -"Q) Quit (accept settings)\r\n\r\n" UserDefaultsQuit -"_yhWhich: n" UserDefaultsWhich -"On" On -***** 220A\TEXT.DAT -"\r\nDelete Questionaire" DeleteQuestionaireQ -"-gDefault settings for hw%s #%d\r\n\r\nn" UserDefaultsHdr -"nhTng) Terminal Mode : h%s\r\n" UserDefaultsTerminal -"nhEng) External Editor : h%s\r\n" UserDefaultsXeditor -"nhLng) Screen Length : h%s\r\n" UserDefaultsRows -"nhXng) Expert Menu Mode : h%s\r\n" UserDefaultsMenuMode -"nhPng) Screen Pause : h%s\r\n" UserDefaultsPause -"nhHng) Hot Keys : h%s\r\n" UserDefaultsHotKey -"nhSng) Spinning Cursor : h%s\r\n" UserDefaultsCursor -"nhCng) Clear Screen Between Messages : h%s\r\n" UserDefaultsCLS -"nhNng) Ask For New Message/File Scan : h%s\r\n" UserDefaultsAskNScan -"nhYng) Ask For Your Un-read Msg Scan : h%s\r\n" UserDefaultsAskSScan -"nhFng) Automatic New File Scan : h%s\r\n" UserDefaultsANFS -"nhRng) Remember Current Sub-board : h%s\r\n" UserDefaultsRemember -"nhBng) Batch Download File Flagging : h%s\r\n" UserDefaultsBatFlag -"nhMng) Forward E-mail to NetMail : h%s\r\n" UserDefaultsNetMail -"nhKng) Command Shell : h%s\r\n" UserDefaultsCmdShell -"nhDng) Default to Quiet Mode : h%s\r\n" UserDefaultsQuiet -"nhWng) Change Password\r\n" UserDefaultsPassword -"nhAng) Temporary/QWK Archive Type : h%s\r\n" UserDefualtsArcType -"nhZng) Default Download Protocol : h%s "\ UserDefaultsProtocol - "ng%s\r\n" -"\r\n_gWhich or [hwQng]uit: n" UserDefaultsWhich -"On" On -***** - -***** 211A\TEXT.DAT -"No one has logged on today.\r\n" NoOneHasLoggedOnToday -"ghLast few callers:\r\nng" LastFewCallers -"\r\n%-2d %-6lu %-25.25s %-25.25s%02u:%02u %-8.8s %-3d" LastFewCallersFmt -"\r\nghCallers Today:\r\nng" CallersToday -"_bhDo you mean %s #%u "\ DoYouMeanThisUserQ -***** 220A\TEXT.DAT -"No one has logged on today.\r\n" NoOneHasLoggedOnToday -"ghLast few callers:\r\nng" LastFewCallers (*) -"\r\nnhm%-2d nm%-6lu wh%-25.25s m%-25.25s"\ LastFewCallersFmt - "nm%02u:%02u h%-8.8s nm%-3d" -"\r\nghCallers Today:ng" CallersToday -"_bhDo you mean %s #%u "\ DoYouMeanThisUserQ -***** - -***** 211A\TEXT.DAT -***** 220A\TEXT.DAT -"YN" YN -***** - - diff --git a/docs/text220b.dif b/docs/text220b.dif deleted file mode 100644 index 74a1fb481a..0000000000 --- a/docs/text220b.dif +++ /dev/null @@ -1,22 +0,0 @@ -Comparing files 220A\TEXT.DAT and 220B\TEXT.DAT -***** 220A\TEXT.DAT -"Only %d lines left.\r\n" 025 OnlyNLinesLeft -"\r\n\r\nOut of bytes.\r\n" 026 OutOfBytes -"Invalid line number\r\n" 027 InvalidLineNumber -***** 220B\TEXT.DAT -"Only %d lines left.\r\n" 025 OnlyNLinesLeft -"\r\n\r\n\1n\1r\1h\1iOut of bytes.\1n\r\n" 026 OutOfBytes -"Invalid line number\r\n" 027 InvalidLineNumber -***** - -***** 220A\TEXT.DAT -"nh\r\nSaving..." 033 Saving -"\rbSaved w%ub bytes.n\r\n" 034 SavedNBytes -"n\r\nWriting Index..." 035 WritingIndx -***** 220B\TEXT.DAT -"nh\r\nSaving..." 033 Saving -"\rbSaved w%lub characters (w%ub lines).n\r\n" 034 SavedNBytss -"n\r\nWriting Index..." 035 WritingIndx -***** - - diff --git a/docs/text230a.dif b/docs/text230a.dif deleted file mode 100644 index 5581592b48..0000000000 --- a/docs/text230a.dif +++ /dev/null @@ -1,106 +0,0 @@ -Comparing files 220B\TEXT.DAT and 230A\TEXT.DAT -***** 220B\TEXT.DAT -"_\r\nghMail Waiting:\r\n\r\n" 046 MailWaitingLstHdr -"gh%3d: ng%-25.25s h%cng %.47s\r\n" 047 MailWaitingLstFmt -"_\r\nyhStart with number [w%luy]: w" 048 StartWithN -***** 230A\TEXT.DAT -"_\r\nghMail Waiting:\r\n\r\n" 046 MailWaitingLstHdr -"gh%3d: ng%-25.25s h%cng %.46s\r\n" 047 MailWaitingLstFmt -"_\r\nyhStart with number [w%luy]: w" 048 StartWithN -***** - -***** 220B\TEXT.DAT -"-\r\nghMessages:\r\n\r\nn" 077 SubMsgLstHdr -"gh%4lu:ng %-22.22s %-22.22s h%cng %.25s\r\n" 078 SubMsgLstFmt -"\r\nMake post #%d %s" 079 ChangeMsgPurgeQ -***** 230A\TEXT.DAT -"-\r\nghMessages:\r\n\r\nn" 077 SubMsgLstHdr -"gh%4u:ng %-22.22s %-22.22s h%cng %.25s\r\n" 078 SubMsgLstFmt -"\r\nMake post #%d %s" 079 ChangeMsgPurgeQ -***** - -***** 220B\TEXT.DAT -"l_chGeneral Text File Sections:\r\n\r\n" 081 TextSectionLstHdr -"nc<h%dnc> %s\r\n" 082 TextSectionLstFmt -"_\r\ncWhich or h~Qncuit: h" 083 WhichTextSection -***** 230A\TEXT.DAT -"l_chGeneral Text File Sections:\r\n\r\n" 081 TextSectionLstHdr -"nc<h%ldnc> %s\r\n" 082 TextSectionLstFmt -"_\r\ncWhich or h~Qncuit: h" 083 WhichTextSection -***** - -***** 220B\TEXT.DAT -"l_ch%s Files:\r\n\r\n" 084 TextFilesLstHdr -"ch%3d: nc%s" 085 TextFilesLstFmt -"\r\nWhich, ~Add, ~Remove, ~Edit, or ~Quit: " 086 WhichTextFileSysop -***** 230A\TEXT.DAT -"l_ch%s Files:\r\n\r\n" 084 TextFilesLstHdr -"ch%3ld: nc%s" 085 TextFilesLstFmt -"\r\nWhich, ~Add, ~Remove, ~Edit, or ~Quit: " 086 WhichTextFileSysop -***** - -***** 220B\TEXT.DAT -"l-gSub-boards of h%s:\r\n\r\nh" 131 CfgSubLstHdr -"ng[h%dng] %-40.40s h%s\r\n" 132 CfgSubLstFmt -"l_ghMessage Groups:\r\n\r\n" 133 CfgGrpLstHdr -"ng[h%dng] %sh\r\n" 134 CfgGrpLstFmt -"\r\nSub-board to toggle new message scan"\ 135 NScanCfgWhichSub -***** 230A\TEXT.DAT -"l-gSub-boards of h%s:\r\n\r\nh" 131 CfgSubLstHdr -"ng[h%ldng] %-40.40s h%s\r\n" 132 CfgSubLstFmt -"l_ghMessage Groups:\r\n\r\n" 133 CfgGrpLstHdr -"ng[h%ldng] %sh\r\n" 134 CfgGrpLstFmt -"\r\nSub-board to toggle new message scan"\ 135 NScanCfgWhichSub -***** - -***** 220B\TEXT.DAT - ", ~All, or ~Quit: " -"ng[h%dng] %-40.40s hc%s\r\n" 137 SubPtrLstFmt -"\r\nSet new-scan pointer for which, ~All, or ~Quit: " 138 WhichOrAll -***** 230A\TEXT.DAT - ", ~All, or ~Quit: " -"ng[h%ldng] %-40.40s hc%s\r\n" 137 SubPtrLstFmt -"\r\nSet new-scan pointer for which, ~All, or ~Quit: " 138 WhichOrAll -***** - -***** 220B\TEXT.DAT -"You do not have sufficient access for this node." 388 NoNodeAccess -"nr\7\r\nSorry, This node is temporarily closed "\ 389 NodeLocked - "for maintenance.n\r\n" -***** 230A\TEXT.DAT -"You do not have sufficient access for this node." 388 NoNodeAccess -"nr\7\r\nSorry, this node is temporarily closed "\ 389 NodeLocked - "for maintenance.n\r\n" -***** - -***** 220B\TEXT.DAT -"\r\nYou can't send messages.\r\n" 533 R_SendMessages -"\r\nhyNode, User name, w#yNumber, "\ 534 NodeToSendMsgTo - "w'yHandle, w^Uyser list, or wAlly: wh" -***** 230A\TEXT.DAT -"\r\nYou can't send messages.\r\n" 533 R_SendMessages -"\r\nhyNode, Name, w#yNumber, "\ 534 NodeToSendMsgTo - "w'yHandle, w^Uyser list, or wAlly: wh" -***** - -***** 220B\TEXT.DAT -"\r\nnYou've been inactive too long.\r\n" 558 CallBackWhenYoureThere -"_bh%s (cYb/cnb) ? w" 559 YesNoQuestion -"Yes" 560 Yes -***** 230A\TEXT.DAT -"\r\nnYou've been inactive too long.\r\n" 558 CallBackWhenYoureThere -"@EXEC:YESNOBAR@" 559 YesNoQuestion -"Yes" 560 Yes -***** - -***** 220B\TEXT.DAT -"No" 561 No -"_bh%s (cyb/cNb) ? w" 562 NoYesQuestion -"_rh[Hit a key] " 563 Pause -***** 230A\TEXT.DAT -"No" 561 No -"@EXEC:NOYESBAR@" 562 NoYesQuestion -"_rh[Hit a key] " 563 Pause -***** - - diff --git a/docs/textfile_section.html b/docs/textfile_section.html deleted file mode 100644 index c9f258c20e..0000000000 --- a/docs/textfile_section.html +++ /dev/null @@ -1,115 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Text File Section</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2><a name="TextFileSections">[13.0] - Text File Sections</a></h2> -<pre>Run the SCFG utility, and select the Text File Sections option from the menu. -This selection will produce a list of text file sections that the sysop has -created for users to freely view text files. It is requested that all sysops -make some or all of the Synchronet documentation available in a text file -section. At the very minimum, TEXT\SBBS.MSG should be available for users to -review. You can add and remove sections with the INS and DEL keys. The -following configuration options are available for each section:</pre> -<h2><a name="TextFileOptions">[13.1] - Text File Options</a></h2> -<pre><b>Name:</b> - This is a description of the text file section. - -<b>Access Requirements: -</b> Use this option to set the security requirements to access this file - section. - -<b>Internal Code: -</b> This is an internal code for SBBS to distinguish this text file section - from the others on the system. This must be a unique name of up to 8 - valid DOS filename characters.</pre> -<h2><a name="AddingTextFiles">[13.2] - Adding Text Files</a></h2> -<pre>To add files to a text file section, you'll need to log on to the BBS and enter -the section you would like to add files to. Here you'll be given a choice to -add files to the section, you will be prompted for the title of the file, and -the path/filename. If you do not enter a path for the file, the default path is -the Synchronet DATA\TEXT directory PLUS the internal code of the text file -section.</pre> -<h2><a name="976/900NumberBilling">[13.3] - 976/900 Number Billing</a></h2> -<pre>There are several methods of implementing 976/900 billing support. - -One method, which is internal to Synchronet, is to set up a billing node. -This method of support requires that you have your own in house 976 or 900 -phone number. Set up your 976/900 service to bill a lump sum of money -(e.g. $10.00) after the first 30 seconds of use. In SCFG, under Nodes->Node#-> -Advanced Options->Cost per Call you would enter this charge (where Node# is the -number of the node which will be attached to the 976/900 line). When a user -calls this billing node, he/she will be informed that they will be charged for -the call if they do not hang up, they will then be asked for their user name -and password. Once they've entered their account information, the account will -be credited with a number of credits (determined by the value in System-> -Advanced Options->Credits per Dollar). They can now call back on a node which -is connected to a standard phone line, and they will be able to make use of the -credits. - -Another method, which is cheaper and more popular, but external to Synchronet -is to use a third party 976/900 service. Once such service is called TABS. This -method consists of having your users dial a 976/900 line supplied by the -service. Initially, you are given an external program and a list of codes for -your BBS. When a user calls the 976/900 service they will be given a code to -use on your BBS. They then call your BBS, run the external program, and enter -the code that they were given. Upon entering a valid code, their account is -immediately credited with a number of credits. You are then periodically mailed -a check for the accounts which have used the service for account upgrades. - -The final method, which is very expensive and very unrealistic, is to simply -attach all of your pay nodes to a 976/900 number and charge the user by the -minute for access to the BBS.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/troubleshooting.html b/docs/troubleshooting.html deleted file mode 100644 index 3d520facc7..0000000000 --- a/docs/troubleshooting.html +++ /dev/null @@ -1,246 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Troubleshooting</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2>[16.0] - Troubleshooting</h2> -<pre>Before contacting Digital Dynamics about any problems you encounter, you -should check to see if your problem is listed here, as well as do a review of -the manual. - -If you are having problems with a program which is external to Synchronet -(e.g. doors, add-ons, memory managers, multi-taskers, mail tossers, front-end -mailers, hardware, etc.) you should contact the manufacturer of that -particular product. - -If all else fails, and you must call Digital Dynamics for help in solving -your problem, be sure that: - - 1) You are at your BBS machine. - 2) You can duplicate the problem. - -<b>Problem :</b> <i>Ymodem-G doesn't work.</i> - -<b>Solution:</b> Synchronet is distributed with an unregistered shareware copy of - DSZ.COM to allow the beginning to sysop to start out with the three - basic protocols, Xmodem, Ymodem, and Zmodem. To use Ymodem-G, you - must use a registered copy of DSZ.COM (or EXE). - See DSZ.DOC for more information on registering DSZ. - - -<b>Problem :</b> <i>Can't create QWK packets or temporary archive files. -</i> -<b>Solution:</b> Synchronet comes configured for PKZIP as the temporary file (and QWK - packet) compression method. In order for this to function correctly, - you must have a copy of PKZIP.EXE in your SBBS\EXEC directory, or - change the Temporary Archive Command Line to exclude the '%!' - specifier (short hand for the exec directory), or specify the - directory where PKZIP.EXE resides. See Configuration Reference for - more information. - - -<b>Problem :</b> <i>Can't view ZIP files online and can't upload files because they fail - the ZIP integrity test. Can't extract QWK REP packets.</i> - -<b>Solution:</b> You must copy PKUNZIP.EXE into your SBBS\EXEC directory, or change - the command lines to reflect the actual location of PKUNZIP.EXE. - See Configuration Reference for more information. - -<b>Problem :</b> <i>HS/Link and BiModem don't work. "Bad command or filename" is - displayed when a user tries to use them.</i> - -<b>Solution:</b> You need to copy HSLINK.EXE and BIMODEM.COM into your SBBS\EXEC - directory. BiModem must have a BIMODEM.CFG file in each node - directory. Run BICONFIG to create/change the configuration - information stored in BIMODEM.CFG. Refer to the BiModem documentation - for more information on this file and using BICONFIG. One important - note for BiModem configuration is that "Allow remote file requests" - be set to "NO". - - -<b>Problem :</b> <i>Get a "Removing" file error when starting up SBBS, at logon, and at - logoff sometimes when another node is active.</i> - -<b>Solution:</b> You have more than one node using the same directory as the temp - directory. You must have a unique temp directory for each node. - Configure a unique temp directory for each node in the config program - (type SCFG from the node directory or hit 'C' at the wait for call - screen). See Configuration Reference for more information. - - -<b>Problem :</b> <i>When answering calls, Synchronet displays "Unknown result code: xx" - where xx is a decimal number, and hangs up on the caller. -</i> -<b>Solution:</b> Add this result code to your node's result code list in the config - program (type SCFG from the node directory or hit 'C' at the wait for - call screen). DO NOT add result codes 0, 2, 3, or 4. Refer to your - modem's manual for the connect speed and average transfer CPS for the - new result code. See Configuration Reference for more information. - - -<b>Problem :</b> <i>When using the ;DOS sysop command, the cursor position does not - follow your keystrokes properly. -</i> -<b>Solution:</b> Remove DOSKEY or other DOS command line TSR program from memory. Many - DOS command line utilities redirect DOS output to the BIOS - which in - turn bypasses Synchronet's interception of the DOS output functions. - Some ANSI drivers may also cause this problem. Use the standard DOS - ANSI.SYS for your console driver. - - -<b>Problem :</b> <i>When running external programs under OS/2 that require intercepted - I/O to be displayed remotely (like PKZIP, Synchronet Blackjack, - FEdit, etc) the output does not appear at all remotely and ANSI - escape sequences display as garbage. -</i> -<b>Solution:</b> OS/2's DOS console driver has a DOS compatibility bug. Run - SVDMANSI.COM (from the EXEC directory) and remove ANSI.SYS from your - CONFIG.SYS and DOS settings. See SVDMANSI.DOC for more information. - - -<b>Problem :</b> <i>At the WFC screen, Synchronet shows that a node has errors, and I - can't get them to stop showing.</i> - -<b>Solution:</b> You must log on to the BBS, and at the main menu prompt type ;ERR, - the errors will be displayed to you, and you will be asked if you - want to clear the critical error counter, answer YES to clear the - errors. - You may also clear the errors using the Synchronet node utility, by - typing NODE ERRORS=0 at the DOS prompt. - - -<b>Problem :</b> <i>One of the BBS nodes will run fine, and then after one or two callers - the modem won't reinitialize (Synchronet returns NO RESPONSE). -</i> -<b>Solution:</b> Be sure that the com port on that node is NOT using the same IRQ or - I/O address as any other com port or device in your computer. Some - motherboards have com ports built onto the board itself, if your - motherboard is like this, and you are not using those ports, you - should make sure they are disabled. - - -<b>Problem :</b> <i>My users see garbage when Synchronet runs from my front-end mailer, - or when they run an external door.</i> - -<b>Solution:</b> Check to make sure that the DTE rate that you have set in your front - end mailer or door matches what you have configured for Synchronet. - If you are using a FOSSIL driver, the DTE rate you have set up for - the FOSSIL must be the same as what you have set up for Synchronet - (e.g. if your FOSSIL rate is locked at 38400, then that Synchronet - node must have its port locked at 38400). - - -<b>Problem :</b> <i>I am running a program as a door that was not written to be a BBS - door. It functions fine locally, but when someone runs the program - remotely their screen remains blank.</i> - -<b>Solution:</b> Make sure you have set 'Intercept I/O' turned on for that program, - if there is still nothing displayed to the user, it's likely that - the program uses direct screen writes, which would require the use - of a doorway program for it to be usable via modem. If the program - uses graphics, it is most likely that you will not be able to use it - remotely. - - -<b>Problem :</b> <i>When posting a message or sending email, the BBS immediately responds - with 'ABORTED' right after I enter a title for the message.</i> - -<b>Solution:</b> You have an external editor defined, and that editor is not working - properly. A couple of reasons an external editor may not function - properly is either not enough memory available for it to run, or - you have used an improper command line for that editor. - - -<b>Problem :</b> <i>I am trying to add another BBS node using DesqView, when I try to - open another window for that node, I get the message 'A Non-Swappable - Window is in the Way'.</i> - -<b>Solution:</b> You do not have enough memory available on this machine for another - window to be opened. You should attempt to make more EMS available. - - -<b>Problem :</b> <i>I am running under Windows, when the board runs it says 'Share - Installed' but it then says 'File Locking Failed'.</i> - -<b>Solution:</b> You MUST run share from the DOS prompt BEFORE running Windows. - - -<b>Problem :</b> <i>I am receiving sharing violations while Synchronet is running. -</i> -<b>Solution:</b> Disable 'Swap to XMS' in the advanced settings for each node using - the SCFG program. - - -<b>Problem :</b> <i>I am receiving errors with an action of "opening" and a doserr - of 04h (as shown in the ERROR.LOG).</i> - -<b>Solution:</b> You need to increase the number on the FILES= statement in your - CONFIG.SYS. FILES=20 should be plenty for Synchronet. - - -<b>Problem :</b> <i>I (or a co-sysop) lost carrier while shelled to DOS remotely and - the BBS didn't return to waiting for a call.</i> - -<b>Solution:</b> Create two batch files (2.BAT and 3.BAT) in a directory that is - in your DOS search path with one line containing the word "EXIT". - - -<b>Problem :</b> <i>When typing ;DOS, ;SLOG, or ;NLOG from the main menu I get "Incorrect - DOS version" or nothing at all. -</i> -<b>Solution:</b> Make sure the COMMAND.COM for the version of DOS you are running is - in your DOS search path. If multiple copies of COMMAND.COM exist on - your disk drive, make sure they are all for the same version.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/upgrade.txt b/docs/upgrade.txt deleted file mode 100644 index 10c2f9f779..0000000000 --- a/docs/upgrade.txt +++ /dev/null @@ -1,128 +0,0 @@ -Upgrading to Synchronet BBS for Win32 v3.0c -=========================================== - -This is an UPGRADE ONLY, so you must have Synchronet (v2.3 or -v3.0b) already installed before you can continue. A full -Synchronet installation package can be obtained via FTP or -Telnet/Zmodem from vert.synchro.net. - -This version has been tested with the following operating -systems: - - o Microsoft Windows 95 - o Microsoft Windows 95a - o Microsoft Windows 95b (OSR2) - o Microsoft Windows 98 - o Microsoft Windows Me - o Microsoft Windows NT 3.51 - o Microsoft Windows NT 4 - o Microsoft Windows 2000 - - -Configuration Files -~~~~~~~~~~~~~~~~~~~ -The following files will be over-written by this upgrade, so -if you have customized them, it is highly recommended that you -make a BACK-UP of the files before continuing this installation: - - SBBS\CTRL\TEXT.DAT (Text Strings) - SBBS\CTRL\GURU.DAT (Guru Brain) - SBBS\CTRL\ATTR.CFG (Default Colors) - SBBS\CTRL\ALIAS.CFG (Internet Mail Aliases) - SBBS\CTRL\FTPALIAS.CFG (FTP Filename Aliases) - SBBS\TEXT\MENU\LOGON.ASC (Logon Screen) - SBBS\TEXT\MENU\EXEMPT.ASC (Exemption Descriptions) - SBBS\TEXT\MENU\EDITOR.ASC (Internal Editor Menu) - SBBS\TEXT\MENU\MSGSCAN.ASC (Message Scan Menu) - SBBS\TEXT\MENU\MAILREAD.ASC (Mail Read Menu) - -Two of the unused lines in CTRL\TEXT.DAT (lines 62 and 74) are -now used in v3. If you're going to allow auto-logon by IP or -sending of Internet e-mail, then you'll need to use the TEXT.DAT -included (or modify your own). If you're still going to be using -v2.3c (or earlier), you'll want to eliminate one of the %s's from -the MsgAttr line in your TEXT.DAT. - -If you do not want these files installed (you're upgrading a -previous installation of SBBS v3 for example), choose "Custom -Installation" and disable the "Configuration Files" from the -install set. - - -Command Shell Updates -~~~~~~~~~~~~~~~~~~~~~ -The following files will be over-written by this upgrade, so -if you have customized them, it is highly recommended that you -make a BACK-UP of the files before continuing this installation: - - SBBS\EXEC\RENEGADE.SRC (Renegade Command Shell) - SBBS\EXEC\RENEGADE.BIN (Renegade Command Shell) - - -SBBSCTRL -~~~~~~~~ -SBBSCTRL is the Sysop's console for SBBS v3. You still must use -SCFG to configure the BBS options shared between the new and old -versions. - -The installation program will create a short-cut to SBBSCTRL.EXE -on your desktop and in your startup folder (so Synchronet will -start automatically during boot-up). - - -Update Your Configuration -~~~~~~~~~~~~~~~~~~~~~~~~~ -Before you run your BBS with v3, you'll need to go through all -of your command lines in SCFG (SBBSCTRL->BBS->Configure) and -make sure there aren't any hard-coded relative paths. - -For example, you must change SCFG->File Options->Testable Files - %!pkzip -z %f < ..\text\zipmsg.txt -to: %!pkzip -z %f < %zzipmsg.txt - -If you have any Baja modules that assume the current directory -(use relative paths), they need to be fixed too. - -Relative paths in "data directories" in SCFG are okay. Only -executable command lines need to be changed to absolute paths -("%n..\xtrn\etc" is okay). - -Also, make sure that all of your external programs either use DOS -I/O interception (XSDK/WWIV doors) or utilize a FOSSIL driver -(i.e. use FDSZ or CEXYZ instead of DSZ). The COM ports and baud -rates configured for your doors are irrelevant. - - -Known Issues -~~~~~~~~~~~~ -o DOSKEY must be loaded in your autoexec.bat for the DOS shell to - work right (Windows 95/98) -o Backspace doesn't work right in DOS shell (Windows 95/98) -o QNET.BIN doesn't work (see DOVE-NET.ZIP for alternatives) -o First node (set in SBBSCTRL) configuration is used for all nodes - (this is actually intentional, i.e. not a bug) -o First node's temp directory must be set to "TEMP\" - - -For More Information -~~~~~~~~~~~~~~~~~~~~ -See DOCS\NTREADME.TXT for instructions on running - Synchronet v3.0 on Windows NT or Windows 2000. - -See DOCS\V300_NEW.TXT for list of new features in - Synchronet v3.0. - -See DOCS\SBBS3FAQ.TXT for answers to frequently asked - questions regarding Synchronet v3.0. - -See DOCS\V3CFGFAQ.TXT for answers to frequently asked - questions about configuring Synchronet v3.0. - -See DOCS\DOVE-NET.ZIP for details on joining DOVE-Net - (Synchronet support message network). - -Thanks for your interest in Synchronet BBS Software -(www.synchro.net). - -Rob Swindell -(rob@synchro.net) diff --git a/docs/user.html b/docs/user.html deleted file mode 100644 index 3c425467aa..0000000000 --- a/docs/user.html +++ /dev/null @@ -1,1363 +0,0 @@ - -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>Synchronet BBS Software - User Documentation</title> -</head> - -<body> -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<h1>Synchronet User Documentation</h1> -<p><b><a name="TOC">Table of Contents</a></b></p> -<p align="left"><a href="#HowtousetheUserManual">How to use the User's Manual</a><br> - <a href="#QuickKeySequenceGuides">Quick Key Sequence Guides</a><br> - <a href="#Nomenclature">Nomenclature</a><br> -<a href="#LoggingontotheBBS">Logging onto the BBS</a><br> -<a href="#LoggingofftheBBS">Logging off the BBS</a><br> -<a href="#DisplayingMenus">Displaying Menus</a><br> -<a href="#ControlCommands">Control Commands</a><br> -<a href="#SettingUpYourUserAccount">Setting Up Your User Account</a><br> - <a href="#AccountDefaultsConfiguration">Account Defaults Configuration</a><br> -<a href="#ElectronicMailFunctions">Electronic Mail Functions</a><br> - <a href="#ElectronicMailMenu">Electronic Mail Menu</a><br> - <span style="font-size:12.0pt;font-family:"Times New Roman"; -mso-fareast-font-family:"MS Mincho";mso-ansi-language:EN-US;mso-fareast-language: -EN-US;mso-bidi-language:AR-SA"><a href="#SendE-mail">Send Local E-mail</a><br> - <a href="#SendNetMail">Send Internet Email / NetMail</a></span><br> - <a href="#ReadMail">Read Mail</a><br> - <span style="font-size:12.0pt;font-family:"Times New Roman"; -mso-fareast-font-family:"MS Mincho";mso-ansi-language:EN-US;mso-fareast-language: -EN-US;mso-bidi-language:AR-SA"><a href="#ReadSentMail">Read Sent Mail</a><br> - <a href="#SendSysopFeedback">Send Sysop Feedback</a><br> -<a href="#MessageBaseFunctions">Message Base Functions</a><br> - <a href="#GroupandSubboardSelection">Group and Subboard Selection</a><br> - <a href="#ReadingMessages">Reading Messages</a><br> - -<a href="#ReadMessages">Read Messages</a><br> - -<a href="#NewMessageScan">New Message Scan</a><br> - -<a href="#Browse">Browse</a><br> - -<a href="#ContinuousNewScan">Continuous New Scan</a><br> - <a href="#PostingMessages">Posting Messages</a><br> - -<a href="#PostingMessages">Posting a message</a><br> - <a href="#PrivatemessagevsE-mail"> -Private message vs E-mail</a></span><span style="font-size: 12.0pt; font-family: Times New Roman; mso-fareast-font-family: MS Mincho; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"><br> - -<span style="font-size:12.0pt;font-family:"Times New Roman"; -mso-fareast-font-family:"MS Mincho";mso-ansi-language:EN-US;mso-fareast-language: -EN-US;mso-bidi-language:AR-SA"><a href="#AutoMessage">Auto Message</a><br> - <a href="#SynchronetMessageEditor">Synchronet Message Editor</a><br> - -<a href="#SlashCommands(/)">Slash Commands</a><br> - -<a href="#Control(Ctrl)Commands">Control (Ctrl) Commands</a><br> - -<a href="#TextAttributes(Ctrl-Axwherexisattribute)">Text Attributes (Ctrl-Ax where x is attribute)</a><br> - <a href="#QWKMailPacketMenu">QWK Mail Packet Menu</a><br> -<a href="#ConfigurationCommands">Configuration Commands</a><br> - <a href="#ConfigurationMenu">Configuration Menu</a><br> - <a href="#ConvertCreditstoMinutes">Convert Credits to Minutes</a><br> - <a href="#UnfilteredInputSwitch">Unfiltered Input Switch</a><br> - <a href="#NewMessageScanListConfiguration">New Message Scan List Configuration</a><br> - <a href="#NewMessageScanDate/TimePointers">New Message Scan Date/Time Pointers</a><br> - <a href="#ReinitializeNewScanDate/TimePointers">Reinitialize New Scan Date/Time Pointers</a><br> -<a href="#OnlineUserInteraction">Online User Interaction</a><br> - <a href="#UsersOnlineCtrl-U">Users Online <Ctrl-U></a><br> - <a href="#ListNodeActivity{/L}">List Node Activity {/L}</a><br> - <span style="mso-fareast-font-family:"MS Mincho""><a href="#SendPrivateMessagetoNodeCtrl-P">Send Private Message to Node <Ctrl-P></a><o:p> -</o:p> -<br> -<a href="#ChattingFeatures">Chatting Features</a><o:p> -</o:p> -<br> - <span> <a href="#ChatMenu">Chat Menu</a><br> - <a href="#Pagingdisable/enable">Paging disable/enable</a><br> - <a href="#ActivityAlertsdisable/enable">Activity Alerts disable/enable</a><br> - <a href="#PageSysoptoChat">Page Sysop to Chat</a><br> - <a href="#TalkwiththeGuru">Talk with the Guru</a><br> - <a href="#Join/InitiateMultinodeChat">Join/Initiate Multinode Chat</a><br> - <a href="#PrivateNodetoNodeChat">Private Node to Node Chat</a><br> - <a href="#ChatCommandPrompt(/fromwithinchat)">Chat Command Prompt (/ from within chat)</a><br> - <a href="#PageUsertoChat(multinodechatonly)">Page User to Chat (multinode chat only)</a><br> - <a href="#ChangeChannel(multinodechatonly)">Change Channel (multinode chat only)</a><br> -<a href="#TextFileSection">Text File Section</a><br> -<a href="#ExternalServices">External Services</a><br> -<a href="#UserLists">User Listings</a><br> -<a href="#Information/Statistics">Information/Statistics</a><br> - <a href="#InformationCommandMenu">Information Command Menu</a><br> - <a href="#SystemInformation">System Information</a><br> - <a href="#VersionInformation">Version Information</a><br> - <a href="#SubboardInformation">Subboard Information</a><br> - <a href="#YourAccountStatistics">Your Account Statistics</a><br> -<a href="#FileTransferSection">File Transfer Section</a><br> - <a href="#LibraryandDirectorySelection">Library and Directory Selection</a><br> - <a href="#Wildcards">Wildcards</a><br> - <a href="#ListingFiles">Listing Files</a><br> - <a href="#ExtendedFileInformationListing">Extended File Information Listing</a><br> - <a href="#NewFileScan">New File Scan</a><br> - <a href="#SearchforFilename">Search for Filename</a><br> - <a href="#FindTextinDescription">Find Text in Description</a><br> - <a href="#QuickKeys">Quick Keys</a><br> - <a href="#FileTransferAreaInformation">File Transfer Area Information</a><o:p> -</o:p> -<br> - -<a href="#FileTransferInformationMenu">File Transfer Information Menu</a><br> - -<a href="#BBSFileTransferPolicy">BBS File Transfer Policy</a><br> - -<a href="#CurrentDirectoryInformation">Current Directory Information</a><br> - -<a href="#UsersWithAccesstoDirectory">Users With Access to Directory</a><br> - -<a href="#YourFileTransferAccountStatistics">Your File Transfer Account Statistics</a><br> - <a href="#FileTransferAreaConfiguration">File Transfer Area Configuration</a><br> - -<a href="#FileTransferAreaConfigurationMenu">File Transfer Area Configuration Menu</a><br> - -<a href="#BatchDownloadQuickFileFlagging">Batch Download Quick File Flagging</a><br> - -<a href="#ChangeNewFileScanDate/Time">Change New File Scan Date/Time</a><br> - <a href="#DownloadingFiles">Downloading Files</a><br> - -<a href="#DownloadFileorFiles">Download File or Files</a><br> - <a href="#DownloadUsertoUserFile">Download User to User File</a><br> - -<a href="#DownloadOptions">Download Options</a><br> - <a href="#UploadingFiles">Uploading Files</a><br> - -<a href="#UploadFileorFiles">Upload File or Files</a><br> - -<a href="#UploadUsertoUserFile">Upload User to User File</a><br> - -<a href="#UploadFiletoSysop">Upload File to Sysop</a><br> - -<a href="#UploadProcedures">Upload Procedures</a><br> - -<a href="#Remove/EditFile">Remove / Edit File</a><br> - <a href="#BatchFileTransfers">Batch File Transfers</a><br> - -<a href="#Batch/BidirectionalCommands">Batch/Bidirectional Commands</a><br> - <a href="#FileExtraction/TempDirectory">File Extraction / Temp Directory</a><br> - -<a href="#TempDirectoryCommands">Temp Directory Commands</a><br> - -<a href="#ExtractfromarchiveinTempDirectory">Extract from archive in Temp Directory<o:p> -</o:p> -</a><br> - -<a href="#AddfilestoTempfile">Add files to Temp file</a><br> - -<a href="#DownloadTempfile">Download Temp file</a><br> - <a href="#Creatinganddownloadingfilelists">Creating and downloading file lists</a></span></span></span></span></p> -<p><a href="#TOC"><b>Back to Table of Contents</b></a></p> -<h2> -<a name="HowtousetheUserManual">How to use the User's Manual</a></h2> -<pre><a name="QuickKeySequenceGuides"><b>Quick Key Sequence Guides</b></a> -------------------------- -Each command title will be followed by a quick key sequence guide. The command -sequences are the exact keystrokes to enter from the Main or File Transfer -prompt to execute that command without pausing to look at menus. Key sequences -to be entered from the Main prompt are enclosed in brackets. For example the -Send E-Mail command title will be listed as:</pre> -<pre> Send E-Mail [ES]</pre> -<pre>You would type E then S from the Main Prompt (noted by the brackets) to Send -E-Mail. Key sequences to be entered from the File Transfer prompt are enclosed -in parenthesis. For example the Find File command title would be listed as:</pre> -<pre> Find File (F)</pre> -<pre>For this command you would type F from the File Transfer prompt (noted by the -parenthesis). If a command may be entered from either the Main or File Transfer -prompt it will be enclosed in curly brackets. For example the Join Multinode -Chat command title would be listed as:</pre> -<pre> Join/Initiate Multinode Chat {CJ} </pre> -<pre>For this command you would type C then J from either the Main or File transfer -prompt. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><a name="Nomenclature"><b>Nomenclature</b> -</a>------------ -Throughout the documentation Carriage Return (or the ENTER key) is referred to -as <CR>.</pre> -<pre>There are two primary prompts on the Synchronet BBS, the Main prompt from the -Main section, and the File Transfer prompt, from the File Transfer section. -These can be identified by diagrams in the Message Base Functions chapter and -the File Transfer Section chapter. When referred to in the documentation the -Main and File Transfer prompts are italicized.</pre> -<pre>Most key strokes referred to in the documentation are highlighted in bold. -<a href="#TOC"><b> -Back to Table of Contents</b></a></pre> -<h2><a name="LoggingontotheBBS"><b>Logging onto the BBS</b></a> -</h2> -<pre>After dialing and connecting to the BBS:</pre> -<pre>At NN: prompt enter your username or user number. </pre> -<pre>At the PW: prompt enter your unique user password. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="LoggingofftheBBS"><b>Logging off the BBS</b></a> -</h2> -<pre>To logoff the BBS enter O from either the Main prompt or the File Transfer -prompt. Enter /O for a quick logoff. -<a href="#TOC"><b> -Back to Table of Contents</b></a></pre> -<h2><a name="DisplayingMenus"><b>Displaying Menus</b></a> -</h2> -<pre>Hitting ? from almost any prompt will display a menu of available commands. -From inside chat or the Synchronet editor /? will display a menu of the -available commands. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="ControlCommands"><b>Control Commands</b></a> -</h2> -<pre>Control commands are commands that are available from anywhere on the BBS. -Control commands are primarily used to control the scrolling of text at anytime -on the system or to abort a command in process such as a file search. Two -online user to user commands are also available to list the users currently -online or send messages at anytime while on the BBS. Control commands are -entered by holding down the Ctrl key and hitting the control letter. For -example, to enter the control command Ctrl-S hold down the Ctrl key and strike -the S key. The following control commands are available at all times while on -the BBS:</pre> -<pre><sm heading>Scrolling Text/ Messages/ System Commands - Ctrl-S Pause scrolling text/messages - Ctrl-Q Continue scrolling text/messages - Ctrl-C Abort scrolling text/messages or a BBS command</pre> -<pre><sm heading>Online User Information/Interaction - Ctrl-P Send a private one line message to another user - Ctrl-U List users online</pre> -<pre><sm heading>Other Information - Ctrl-K List control commands - Ctrl-T Time online info -<a href="#TOC"><b> -Back to Table of Contents</b></a></pre> -<h2><a name="SettingUpYourUserAccount">Setting Up Your User Account</a> -</h2> -<pre><b><a name="AccountDefaultsConfiguration">Account Defaults Configuration</a> [D]</b> ----------------------------------- -To display and or change your user account defaults hit D from the Main prompt. -Your account defaults will be displayed. </pre> -<pre>A) ANSI Terminal : Yes, Color -E) External Editor : None -L) Screen Length : Auto Detect (24) -K) Command Keys : Synchronet -X) Expert Menu Mode : On -P) Screen Pause : Off -S) Spinning Cursor : Off -C) Clear Screen Between Messages : Off -N) Prompt for New Message / File Scan : Off -F) Auto New File Scan* : Off -R) Remember Current Sub-board : Off -B) Batch Download File Flagging : Off -W) Change Password (if allowed) -Q) Quit (and accept settings) - </pre> -<pre>The A) option toggles ANSI terminal support. The ANSI definition of terminal -escape sequences used for text attributes and animation is supported by most -communications programs and dumb terminals. If your terminal supports ANSI, -this option should be set to "Yes". You can also tell the system if you have a -color or monochrome display with this option.</pre> -<pre>The E) option selects an external editor as your default message editor. -External editors may have more functionality or a command structure that you -may prefer over the internal editor. You may only select external editors from -a list that the sysop has configured for the system.</pre> -<pre>The L) option sets how many lines (or rows) your display has. If your terminal -or communications program has a status line, you will want this set to the -number of lines your terminal can display excluding the status line. If this -option is set to "Auto Detect", the number of screen lines your terminal -supports will be automatically detected upon each logon.</pre> -<pre>The K) option selects an optional command key set. You may select an alternate -command key set resembling another BBS type or any command set the sysop has -predefined. You may also define your own command set. If you select an -alternate command set you will also receive matching menus. However, if you -define your own set you will not receive matching menus.</pre> -<pre>The X) option toggles Expert menu mode on and off. When Expert menu mode is -turned off menus automatically appear at each new command prompt. When Expert -menu mode is turned on menus only appear as requested with the '?' command. -Expert menu mode off is generally referred to as Novice mode.</pre> -<pre>The P) option toggles screen pausing. When this option is on, every screen full -of text displayed to you will pause with a "Hit a key" prompt. When this option -is off, the user must use the Ctrl-S and Ctrl-Q commands to pause and unpause -scrolling text.</pre> -<pre>The S) option toggles the spinning cursor on and off</pre> -<pre>The C) option toggles screen clearing before each message (posts or E-mail) is -displayed.</pre> -<pre>The N) option toggles whether or not the BBS will automatically prompt you for -a new message and file scan upon logging on.</pre> -<pre>The F) option toggles automatic new file scanning after a New Message Scan All -(NA or /N) from the Main Section.</pre> -<pre>The R) option is used to toggle whether or not the BBS remembers your current -subboard each time you logoff.</pre> -<pre>The B) option is used to toggle the Batch Download File Flagging prompt that is -displayed after each screen full of files are listed to you. This function is -handy for quickly adding files to the batch download queue without having to -type the name of each file. Batch Download File Flagging can be temporarily -toggled with the &B command from the Transfer Section.</pre> -<pre>The W) option is not available on all systems. If the sysop has configured the -system so that users can edit their passwords, this option will appear on the -menu and allow you to change your current password.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="ElectronicMailFunctions">Electronic Mail Functions</a> -</h2> -<pre><b><a name="ElectronicMailMenu">Electronic Mail Menu</a> [E]</b> ------------------------- -Selecting E from the Main prompt brings you to the E-mail Prompt. From here you -can read, send, and kill E-mail (mail to and from users on your BBS) and -NetMail (mail to and from users on other BBSs). Your E-mail options are:</pre> -<pre> S Send E-mail - N Send NetMail - R Read E-Mail\NetMail - K Read\Kill mail you have sent - F Send feedback to the sysop - Q Quit to the Mail Menu - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="SendE-mail">Send E-mail</a> [ES]</b> ----------------- -Select Send E-Mail to send a mail message to another user's mailbox. You will -be prompted for the user's name or user number. If you don't know the correct -spelling for the target user and don't know the user number, you can enter in -just part of the user's name and the system will help you find the user's full -name. Enter the message title then your message. All Synchronet editor commands -are available to you (see Synchronet Message Editor) in the message unless you -have selected another (external) editor as your default editor. /S will save -and send your message when you are finished. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="SendNetMail">Send NetMail</a> [EN]</b> ------------------ -Select Send NetMail to send a personal message to user on another BBS across a -Fidonet style network. This feature works exactly like the Send E-Mail command -except that you will be prompted for the user's name and Fidonet address. The -syntax is as follows:</pre> -<pre> Username @Fidonet Address</pre> -<pre> Ex: John Doe @1:138:110 - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="ReadMail">Read Mail</a> [ER]</b> --------------- -After selecting Read Mail you will receive a list of the mail messages in your -mailbox. An * will be displayed next to any unread mail messages. If you have -only one message in your mailbox, that message will be displayed rather than -the list. Either event will be followed by the Read Mail prompt. At the Read -Mail prompt you have the following commands available: - # read a mail message (where # is the number of the message). - <CR> read the next mail message. - - read the previous mail message. - L list all mail message titles and authors. - R re-read the current mail message. - D delete the current mail message. - A automatically reply in mail to the author of the current mail message. - This will prompt for mail message removal. - F forward the current mail message to another user. This will automatically - remove the mail message from your mailbox. - Q quit the Read Mail prompt and return to the Main prompt. - ? display the Read Mail menu - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="ReadSentMail">Read Sent Mail</a> [EK]</b> -------------------- -After selecting Read Sent Mail you will receive a list of active mail messages -you have sent and to whom you have sent them. An * next to a title denotes an -unread mail message. If you have only one active mail message that message will -be displayed rather than the list. Either event will be followed by the Read -Sent Mail prompt. At the Read Sent Mail prompt the following commands are -available:</pre> -<pre> # read a sent mail message (where # is the number of the message). - <CR> read the next sent mail message. - - read the previous sent mail message. - L list all sent mail message titles and recipients. - R re-read the current sent mail message. - D delete the current sent mail message. - Q quit the Read Sent Mail prompt and return to the Main prompt. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="SendSysopFeedback">Send Sysop Feedback</a> [EF]</b> ------------------------- -Send Sysop Feedback sends a private message to the Sysop. Again, all -Synchronet editor commands are available to you (see Synchronet Message Editor) -in the message unless you have selected another (external) editor as your -default editor. /S will save and send your feedback when you are finished.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="MessageBaseFunctions">Message Base Functions</a> -</h2> -<pre>The Synchronet message base is a two level system. It is organized in groups -and subboards. A group is a generalized collection of related subboards. -Subboards contain specific interest messages. -Groups tend to be categories such as Public, Computers, 18 and Over, etc. -Subboard categories are more specific such as: Public/Politics, Public/Game -Hints, Computers/Macintosh, Computers/DOS, Fidonet/For Sale, Fidonet/Trekkies, -etc. -At the Main prompt you can always see your current group and subboard. The Main -prompt and the File Transfer prompt can be easily differentiated by the bracket -style. The Main prompt uses square brackets [ ] and the File Transfer prompt -uses parenthesis ( ). The first name and number is your current group. The -second name and number is your current subboard. The clock displays your time -left online unless you have a time exemption in which case it will display your -time spent online. ? will display the Main Menu. </pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="GroupandSubboardSelection">Group and Subboard Selection</a> -</h3> -<pre>There are two ways to select groups and subboards. You can jump to the group -and subboard #'s directly or you can jump through the groups and subboards -sequentially until you reach the desired selection. If you wish to jump to the -group and subboard #'s directly you may want to view a list of groups or -subboards first. From the Main prompt enter:</pre> -<pre> * to list all available subboards in your current group - /* to list all available groups</pre> -<pre> # to jump to a new subboard (where # is the subboard number) - /# to jump to a new group (where # is the group number) - </pre> -<pre> } to jump forward to the next subboard - { to jump backward to the previous subboard - ] to jump forward to the next group - [ to jump backward to the previous group.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="ReadingMessages">Reading Messages</a> -</h3> -<pre>To read messages in a subboard you can either go to the Read Messages prompt or -you can scan for new messages. There are three different new scan commands -available. All new scan commands can scan either your current subboard, all -subboards in your current group, or all subboards in all groups. Remember that -the control commands are available at all times while on the BBS to control -text scrolling. Ctrl-S to pause, Ctrl-Q to continue, and Ctrl-C to abort. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="ReadMessages">Read Messages</a> [R] </b> ------------------- -Read Messages, activated by hitting R at the Main prompt, is used to read -messages sequentially forward or backward in your current subboard (displayed -at the prompt). While reading messages you can also reply to and post messages. -The following are the Read Message commands:</pre> -<pre> <CR> Display next message - - Display previous message - L Lists message titles and authors. - T Lists message titles and authors of next ten messages - (advances current message forward ten messages) - R Re-read current message - F Searches for specified text in all messages. - B Bypasses remaining messages in current subboard and moves to next - subboard in new scan list if applicable. - I Displays information about current subboard - Y Lists posts addressed to you - C Displays remaining messages in current subboard continuously - without pausing for a Message Scanning prompt. - A Reply publicly regarding current message. - M Reply privately in mail regarding current message. - Z Reply privately in message area regarding last message. - D Deletes only the last message in current subboard if you are the - message's author. - P Post a message in current subboard (see Synchronet Editor commands) - W Post a private message in current subboard. - Q Quits to Main prompt. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="NewMessageScan">New Message Scan</a> [N]</b> --------------------- -After selecting New Message Scan you will be prompted to scan for new messages -in your current subboard, all subboards in your current group, or all subboards -in all groups. Browse and Continuous New Scan will also prompt for these -selections.</pre> -<pre>After each displayed message you are provided a Read Message prompt and may -execute any Read Message commands (See Read Messages). When <CR> is hit after -the last message is displayed or the subboard is bypassed (B) the new scan will -continue with the next subboard in the new scan list. "Group" and "All" new -scans will skip over subboards that do not contain any new messages.</pre> -<pre> Quick Keys: - New Message Scan Subboard [NS] - New Message Scan Group [NG] - New Message Scan All [NA] - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="Browse">Browse</a> [B]</b> ----------- -Browse works exactly like New Scan except on subboards that do not contain any -new messages. Unlike New Scan Group, which will skip over a subboard that -contains no new messages, Browse will display the last message read in a -subboard that contains no new messages and provide you with a Read Message -prompt (see Read Messages) allowing you to still read and post messages in that -subboard. When <CR> is hit after the last message is displayed or the subboard -is bypassed, by hitting B, the browse will continue with the next subboard in -the new scan list.</pre> -<pre> Quick Keys: - Browse Subboard [BS] - Browse Group [BG] - Browse All [BA] - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="ContinuousNewScan">Continuous New Scan</a> [Z]</b> ------------------------ -Continuous New Scan displays all new messages continuously without providing a -Message Scanning prompt.</pre> -<pre> Quick Keys: - Continuous New Scan Subboard [ZS] - Continuous New Scan Group [ZG] - Continuous New Scan All [ZA]</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="PostingMessages">Posting Messages</a> -</h3> -<pre><b>Posting a message [P]</b> ---------------------- -To post (write) a message in your current subboard hit P from the Main or the -Message Scanning prompt. You will also be prompted to post when you pass the -last message in your current subboard when reading, new scanning, or browsing. -After selecting Post Message you will be prompted whether to make the post -private or public. When posting a message all Synchronet Editor commands are -available to you (see Synchronet Message Editor) unless you have selected an -external editor as your default editor. In which case you should consult the -documentation for the external editor you have selected. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><a name="PrivatemessagevsE-mail"><b>Private message vs E-mail</b></a> -------------------------- -Private Messages cannot be delivered directly into another user's mailbox as -can E-mail or NetMail so when ever possible use E-mail and NetMail to send -confidential messages to other users. However, QWK style BBS networks do not -support NetMail. If you wish to send a confidential message to a user on -another BBS through a QWK style network you should use a private message on a -subboard. You can tell what types of networks are being utilized on a subboard -by hitting I from the read message prompt or [IS] from the main prompt. -NetMail is the most convenient and direct way to send confidential messages to -users on other BBSs if the BBSs are connected to a Fidonet style network. (see -also E-mail and NetMail)</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="AutoMessage">Auto Message</a> [A]</b> ----------------- -The auto message is displayed to every user when the user logs on. You may -change the Auto Message from the Main prompt by hitting A. Remember that as -soon as another user changes the Auto Message your message will be deleted. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="SynchronetMessageEditor">Synchronet Message Editor</a> - </h3> -<pre>When using the Synchronet Message Editor to post, send mail, or send feedback -you have a wealth of powerful message editing functions available. There are -two types of editor commands available: Slash (/) commands and Control (Ctrl) -commands. </pre> -<pre>Slash commands are preceded by the forward slash key (/) and must be entered -from the beginning of any new line. Control (Ctrl) commands may be entered from -any cursor position on any line. </pre> -<pre>There are two help menus available when in the editor. /? displays all standard -message editing commands and /ATTR displays all available text attributes which -can set by the Ctrl-A command. Text attributes set with the Ctrl-A command do -not become visible until the line is word wrapped or a carriage return <CR> is -entered. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><a name="SlashCommands(/)"><b>Slash Commands (/)</b></a> ------------------- - /? Message editor help menu - /S Save message - /ABT Abort message - /CLR Clear message - /L List message - /Lx List message from line number x - /E Edit last line - /Ex Edit line number x - /D Delete last line - /Dx Delete line number x - /I Insert line before last - /Ix Insert line before line number x - /T Edit message title - /ATTR Text attribute code list - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><a name="Control(Ctrl)Commands"><b>Control (Ctrl) Commands</b></a> ------------------------ - Ctrl-C Cancel current line - Ctrl-V Center current line - Ctrl-R Redraw current line - Ctrl-X Delete current line - Ctrl-Y * Delete to end of line - Ctrl-W Delete word to left - Ctrl-D * Delete word to right - Ctrl-B * Move cursor to beginning of line - Ctrl-E * Move cursor to end of line - Ctrl-N * Move cursor to next word - Ctrl-\ * Move cursor to previous word - Ctrl-F * Move cursor position forward one space - Ctrl-Bkspc * Move cursor position back one space - Ctrl-Minus * Toggle insert/overwrite mode - Ctrl-Ax * Toggle new text attribute where x is attribute</pre> -<pre>* Requires ANSI - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><a name="TextAttributes(Ctrl-Axwherexisattribute)"><b>Text Attributes (Ctrl-Ax where x is attribute)</b></a> ----------------------------------------------- - </pre> -<pre> K Black foreground (zero) 0 Black background - R Red foreground 1 Red background - G Green foreground 2 Green background - Y Yellow foreground 3 Yellow background - B Blue foreground 4 Blue background - M Magenta foreground 5 Magenta background - C Cyan foreground 6 Cyan background - W White foreground 7 White background - </pre> -<pre> H High intensity - I Blinking - N Normal (reset attributes) - P Insert pause into message - L Insert form feed into message - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><b><a name="QWKMailPacketMenu">QWK Mail Packet Menu</a> [Q]</b> - </h3> -<pre>Hitting Q from the Main prompt accesses the QWK Mail Packet Menu. QWK mail -packets are used in conjunction with an offline mail reader. When you download -a QWK mail packet all of your new messages in all of the subboards flagged in -your newscan list and a list of new uploaded files will be compiled into a QWK -file readable by most QWK supported offline mail readers. After logging off the -BBS you can read the messages, E-mail, and new files list with your offline -reader. You can reply to and post messages from your offline reader and upload -the reply packet (.REP) to the BBS and your messages will be posted for you. -(see QWK Offline Reader Diagram) There are many offline readers available as -shareware and commercial products. The QWK Mail Packet Menu offers the -following commands: - </pre> -<pre> D Download QWK message packet - U Upload REP reply packet - B Bidirectional simultaneous QWK & REP transfer - Q Quit to Main prompt</pre> -<pre>When D or B is selected to download a QWK packet you will be prompted to select -a what type of Ctrl-A filtering you wish to employ. Synchronet uses Ctrl-A -codes in messages to signify color and other text attributes. </pre> -<pre> E Expand the Ctrl-A codes to ANSI, which is recommended if you wish - to display ANSI color and have an ANSI compatible offline reader. - L Leave the Ctrl-A codes in. In which case you would need an offline - reader capable of converting Ctrl-A codes to ANSI. - <CR> Strip out the Ctrl-A codes, removing the color and other text - attributes from the messages.</pre> -<pre>If you are not sure which method to use the safest bet is to just hit <CR> to -strip out the Ctrl-A codes.</pre> -<pre>Your QWK packet will not contain any messages you have already read since you -logged on. If you wish to reset your new message scan pointers back to their -state when you logged on use the Reinitialize New Message Scan Pointers [&I] -command before downloading your QWK packet. After downloading a QWK packet your -New Message Scan Pointers will always be set to the last messages stored in the -packet. If you wish to new scan messages while still online after downloading a -QWK packet you may wish to use the [&I] or [&P] command before attempting a new -message scan. (see Reinitialize New Message Scan Pointers and New Message Scan -Date/Time Pointers in next section) - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="ConfigurationCommands">Configuration Commands</a> -</h2> -<pre><b><a name="ConfigurationMenu">Configuration Menu</a> [&]</b> ----------------------- -Hitting & from the Main prompt access the Configuration prompt. Your choices -from the Configuration prompt are:</pre> -<pre> C Convert Credits to Minutes - R Unfiltered Input Switch - N New Message Scan Configuration - P New Message Scan Pointers - I Reinitialize Message Pointers - Q Quit to Main Menu - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="ConvertCreditstoMinutes">Convert Credits to Minutes</a> [&C]</b> -------------------------------- -To convert online credits to online minutes hit C from the Configuration -prompt. You cannot convert minutes back to credits. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="UnfilteredInputSwitch">Unfiltered Input Switch</a> [&R]</b> ----------------------------- -The Unfiltered Input Switch, R from the Configuration prompt, is used to allow -text files created offline with control codes, ANSI graphics and colors, and -page formatting to be uploaded into a message or a mail message. To toggle -unfiltered input ON hit R from the Configuration prompt. The next message you -post or mail message you send will allow you to ASCII upload a text file from -your computer by executing your terminal program's upload command (often PGUP) -and selecting ASCII upload. Save your message by hitting Ctrl-Z. After you save -the message the Unfiltered Input Switch will be toggled OFF. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="NewMessageScanListConfiguration">New Message Scan List Configuration</a> [&N]</b> ----------------------------------------- -New Message Scan List Configuration, N from the Configuration prompt, allows -you to set which subboards you wish to be scanned in a new scan, browse, or -express new scan. When you select New Scan Configuration you will be prompted -with a list of groups. Select the group number you wish to view. A list of -subboards in the selected group will be displayed. An asterisk * next to a -subboard designates the subboard is toggled ON for new scans. To toggle a -subboard OFF select the subboard number. To toggle a subboard back ON, select -the subboard number again. Hit Q to quit back to the group selection. Select -another group or Q to quit back to the Main prompt. Your selections in the New -Message Scan List Configuration are saved and remain in effect until the next -time you change the settings.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="NewMessageScanDate/TimePointers">New Message Scan Date/Time Pointers</a> [&P]</b> ----------------------------------------- -The New Message Scan Date/Time Pointers, P from the Configuration prompt, -allows you to set back the date and time a new scan will begin to look for new -messages in a specified subboard. After hitting P from the Configuration prompt -select the group number you wish to change or A to change all groups. If an -individual group was selected a list of subboards in the selected group will be -displayed. Select the subboard you wish to change or hit A to select all -subboards in that group. Enter in the new date and time. When finished hit Q to -quit back to the group selection. Select another group or Q to quit back to the -Main prompt.</pre> -<pre>The pointer is automatically set to the date and time of the most recently -posted message you have read in a subboard each time you read messages. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="ReinitializeNewScanDate/TimePointers">Reinitialize New Scan Date/Time Pointers</a> [&I]</b> ---------------------------------------------- -I from the Configuration prompt resets all your New Message Scan Date/Time -Pointers back to the their original values for your current logon. This command -is helpful if you have already executed a New Message Scan and then wish to -download a QWK message packet containing new messages you have already read -online or at any time you wish to reset your new message pointers back to their -original state for your current logon. </pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="OnlineUserInteraction">Online User Interaction</a> -</h2> -<pre><a name="UsersOnlineCtrl-U"><b>Users Online <Ctrl-U></b></a> ---------------------- -To list users currently online enter Ctrl-U at any time from any section of the -BBS. Users Online lists the user names, which nodes they are logged on to, -their connect rate, and what each user's current action is on the BBS. -<a href="#TOC"><b> -Back to Table of Contents</b></a></pre> -<pre><a name="ListNodeActivity{/L}"><b>List Node Activity {/L}</b></a> ------------------------ -List Node Activity, /L from the Main prompt, the File Transfer prompt, or from -inside a chat session, lists the current activity of each node on the system. -List Node Activity lists all the information of Users Online (Ctrl-U) but also -lists inactive nodes and their current state. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><a name="SendPrivateMessagetoNodeCtrl-P"><b>Send Private Message to Node <Ctrl-P></b></a> -------------------------------------- -Ctrl-P from anywhere in the BBS will allow you to send a private one line -message to another user on another node or all users on the system. After -entering Ctrl-P you will see a list of users currently online and their node -numbers, enter the node number or A for all users. Then enter your one line -message followed by <CR>. Your message will be sent to the user on the node -specified or all users on the system. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="ChattingFeatures">Chatting Features</a> -</h2> -<pre><b><a name="ChatMenu">Chat Menu</a> {C}</b> -------------- -The Chat Menu, C from the Main or File Transfer prompt, allows you to join or -initiate multiuser chat, page the sysop to chat, talk with the system's all -knowing Guru, toggle your paging switch ON and OFF, and toggle the activity -alert switch ON and OFF. Commands available from the Chat prompt are: - D Disable and enable paging - A Disable and enable activity alerts - J Join or initiate a Multinode chat session - P Private node to node chat initiate/join - T Talk with the system Guru - C Page the sysop to chat - Q Quit to Main prompt</pre> -<pre> Ctrl-U List users online - Ctrl-P Send private message to another user</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a><a name="Pagingdisable/enable"> - -<b>Paging disable/enable</b></a><b> {CD}</b> --------------------------- -Paging disable/enable lets you allow other users to or disallow other users -from paging you to chat. The default is Paging enabled. To disable Paging hit D -from the Chat prompt. The system will show you your new node status. A (P) -after your node status designates Paging is disabled. If there is no (P) after -your node status then Paging is enabled (default). If you need to check your's -or another user's Paging status use Ctrl-U to list users online and their -current status. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="ActivityAlertsdisable/enable">Activity Alerts disable/enable</a> {CA}</b> ------------------------------------ -Activity alerts are messages displayed to you regarding other users activities -such as logons and logoffs. The default is for Activity Alerts enabled. If you -wish to disable Activity Alerts so they are not displayed to your console hit A -from the Chat prompt. To reenable Activity Alerts hit A again from the Chat -prompt. The system will show you your new node status. An (A) after your node -status designates Activity Alerts are disabled. If there is no (A) after your -node status then Activity Alerts are enabled (default). If you need to check -your's or another user's Activity Alerts status use Ctrl-U. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="PageSysoptoChat">Page Sysop to Chat</a> {CC}</b> ------------------------ -To page the sysop to chat hit C from the Chat prompt. This will alert the sysop -that you wish to chat with him/her if the sysop is available. -<a href="#TOC"><b> -Back to Table of Contents</b></a></pre> -<pre><b><a name="TalkwiththeGuru">Talk with the Guru</a> {CT}</b> ------------------------ -The system Guru is a programmable artificial intelligence engine capable of -simulating and understanding human conversation. The guru may be programmed to -assist users in BBS usage or purely for entertainment. To enter a conversation -with the Guru hit T from the Chat prompt. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="Join/InitiateMultinodeChat">Join/Initiate Multinode Chat</a> {CJ}</b> ---------------------------------- -Multinode chatting is joined by hitting J from the Chat prompt. You are -immediately placed in channel 1 of a 99 channel chat system. From this point -any text you type will be sent out on the channel when you press <CR>. Entering -a forward slash (/) will enter you into the Chat Command mode (see Chat Command -prompt). Remember CTRL-U (list users online) and CTRL-P (send private message -to another node) are available from anywhere on the BBS. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="PrivateNodetoNodeChat">Private Node to Node Chat</a> {CP}</b> ------------------------------- -To initiate or join someone in a two way private node to node chat hit P from -the Chat prompt. If you are initiating a private chat you will be prompted for -the username you wish to chat with. It will page that user to join you. If you -have been paged to join someone in a private chat hit P from the Chat Menu and -you will be placed in private chat with the user who paged you. Once in a -private chat session hit / to acces the Chat Command mode (see Chat Command -prompt). All Chat commands are available from within Private Node to Node Chat -except /P and /#. An additional command, /E, is available to toggle local echo -off and on so you can invoke split screen chat with your terminal program. For -example, with Telix, split screen chat is ALT-Y. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><a name="ChatCommandPrompt(/fromwithinchat)"><b>Chat Command Prompt (/ from within chat)</b></a> ----------------------------------------- - </pre> -<pre> ? Display Chat Command Menu - P Page another user to chat - # Change channel (where # is the number of the channel) - L List node activity - E Toggle local echo off/on (private node to node chat only) - Q Quit chat session - </pre> -<pre> Ctrl-U List users online - Ctrl-P Send private message to another user online - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><a name="PageUsertoChat(multinodechatonly)"><b>Page User to Chat (multinode chat only)</b> </a> ------------------------------------------ -Enter P from the chat command prompt to page another user online to chat. The -targeted user will receive a brief message requesting they join you in -multinode chat. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><a name="ChangeChannel(multinodechatonly)"><b>Change Channel (multinode chat only)</b></a> --------------------------------------- -You can see what channel you and others are in by listing users, Ctrl-U. If you -wish to change to a different channel enter the channel number at the chat -command prompt. If there are no other users in the channel you will be prompted -to password protect the channel. By password protecting a channel you can -create a "private" chat session. Anyone entering a password protected channel -will be prompted to enter the password upon joining the channel. If you -password protect a channel be sure to send the password to the users you wish -to join the channel. Only the first user in the channel has the option of -password protecting the channel. The password protection is lifted after the -user who protected the channel leaves. The number of channels available to you -is determined by the sysop.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="TextFileSection">Text File Section</a> -</h2> -<pre>The BBS may contain text files available for you to read online. These files -may be anything from BBS rules to special interest information to ANSI art. To -enter the Text File Section hit G from the Main prompt. The system will display -a list of text file areas. These are groups of related text files. Select an -area and a list of files contained in that text file area will be displayed or -hit Q to quit back to the Main prompt. Each file will be numbered. Enter a -number at the prompt to view a file or Q to quit back to the text file area -list. Remember that the Ctrl commands are available at all times while on the -BBS. Ctrl-S to pause, Ctrl-Q to continue, and Ctrl-C to abort. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="ExternalServices">External Services</a> -</h2> -<pre>External services (commonly referred to as Doors) are programs the sysop has -added to the system and made available to the users. Programs may be games, -database applications, online shopping, date/match making, and virtually -thousands of other possible services. Hitting X from the Main prompt will enter -you into the External Services menu where you may select from the listed -services available. Each service should contain its own online instructions and -help. If a service requires a charge for access the rate will be listed next to -the title. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2>User Lists</h2> -<pre><b><a name="UserLists">User Lists</a> [U]</b> --------------- -To display a list of user accounts on the BBS, users who have access to your -current subboard, or a logon list for the day hit U from the Main prompt. You -will be prompted for which list you would like to view.</pre> -<pre> Quick Keys: - User Account List [UU] - User Account List of Subboard [US] - Logon List for the Day [UL]</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="Information/Statistics">Information/Statistics</a> -</h2> -<pre><b><a name="InformationCommandMenu">Information Command Menu </a>[I]</b> ----------------------------- -Hitting I from the Main Menu will access the Information Command prompt. -Information on the BBS, your user account, and the current subboard can be -accessed through the Information Commands.</pre> -<pre> I System information - V Version information on Synchronet - S Information on your current subboard - Y Your user account information and statistics - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="SystemInformation">System Information </a>[II]</b> ------------------------ -To view information regarding the BBS hit I Information Commands prompt. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="VersionInformation">Version Information</a> [IV]</b> ------------------------- -To view information regarding the version of Synchronet your node is running -hit V from the Information Commands prompt. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="SubboardInformation">Subboard Information</a> [IS]</b> -------------------------- -To view information regarding your current subboard hit S from the Information -Commands prompt. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="YourAccountStatistics">Your Account Statistics </a>[IY]</b> ----------------------------- -To view your account statistics hit Y from the Information Commands prompt. -Statistics include credits, minutes, uploads, downloads, E-mail, posts, logons, -time online, and account expiration date. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h2><a name="FileTransferSection">File Transfer Section</a> -</h2> -<pre>The Synchronet File Transfer section is entered from the Main prompt by hitting -T. To return to the Main prompt from the File Transfer prompt hit Q. The File -Transfer section is organized in the same manner as the Message area; a -bi-level hierarchal system with groups and sub groups. In the case of the File -Transfer section there are libraries and directories. Libraries are groups of -related directories. -Libraries might be organized such as Shareware, Graphics, etc. The Shareware -library, for example, may contain directories such as Windows, Business, -Utilities, etc. -The File Transfer prompt identifies your current library and directory. The -first name and number is your current Library. The second name and number is -your current directory. ? will display the Main Menu. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="LibraryandDirectorySelection"><b>Library and Directory Selection</b></a> -</h3> -<pre>There are two ways to select libraries and directories. You can jump to the -library and directory #'s directly or you can jump through the libraries and -directories sequentially until you reach the desired selection. If you wish to -jump to the library and directory #'s directly you may want to view a list of -libraries and directories first. From the File Transfer prompt enter:</pre> -<pre> * to list all available directories in your current library - /* to list all available libraries</pre> -<pre> # to jump to a new directory (where # is the directory number) - /# to jump to a new library (where # is the library number)</pre> -<pre> } to jump forward to the next directory - { to jump backward to the previous directory</pre> -<pre> ] to jump forward to the next library - [ to jump backward to the previous library - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="Wildcards"><b>Wildcards</b></a> -</h3> -<pre>Many commands in the File Transfer section accept wildcards. Wildcards allow -you to search for or list a specific file or files based on part of a filename. -Wildcard syntax is entered by typing part of the filename in conjunction with -wildcard characters. * will wild the remainder of a filename and/or the -remainder of an extension and ? will wild specific character positions. No -extension after the filename will wild the entire extension. <CR> for the -entire filename will wild the entire filename and select/list all files. When -wildcards are accepted the prompt will appear as follows Filespec [*.*]. Some -examples of wildcard uses are:</pre> -<pre>Filespec [*.*]: FONT?.ZIP = FONT1.ZIP or FONT2.ZIP not FONTMAN.ZIP -Filespec [*.*]: FONT*.ZIP = FONTMAN.ZIP or FONT1.ZIP not LANMAN.ZIP -Filespec [*.*]: FONTMAN.Z* = FONTMAN.ZIP or FONTMAN.ZOO not FONTMAN.GIF -Filespec [*.*]: <CR> = all files -Filespec [*.*]: FONTMAN = FONTMAN.ZIP or FONTMAN.GIF </pre> -<pre><heading> - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><b><a name="ListingFiles">Listing Files</a> (L)</b> -</h3> -<pre>L from the File Transfer prompt lists files in your current directory. -Wildcards may be used. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><b><a name="ExtendedFileInformationListing">Extended File Information Listing</a> -(E)</b> -</h3> -<pre>Hitting E from the File Transfer prompt allows you to list a file or files with -extended information. This displays the filename, uploader name, time to -download, credit cost, times downloaded, date/time uploaded, file date/time, -and last date/time downloaded. If an extended description is included it will -also be displayed. Wildcards may be used. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><b><a name="NewFileScan">New File Scan </a>(N)</b> - </h3> -<pre>N from the File Transfer prompt lists all new files uploaded since your last -logon. The last logon date can be changed with the Change New File Scan -Date/Time command (&P). After selecting New File Scan you will be prompted to -scan your current directory, all directories in your current library, or all -directories in all libraries. </pre> -<pre> Quick Keys: - New File Scan Current Directory (ND) - New File Scan Current Library (NL) - New File Scan All Libraries (NA) - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><b><a name="SearchforFilename">Search for Filename</a> (S)</b> - </h3> -<pre>S from the File Transfer prompt allows you to search for a filename in your -current directory, all directories in your current library, or all directories -in all libraries. Wildcards may be used. - </pre> -<pre> Quick Keys: - Search for Filename Current Directory (SD) - Search for Filename Current Library (SL) - Search for Filename All Libraries (SA) -<a href="#TOC"><b> -Back to Table of Contents</b></a></pre> -<h3><b><a name="FindTextinDescription">Find Text in Description</a> (F)</b> -</h3> -<pre>F from the File Transfer prompt allows you to list files by searching for a -string of text in the file descriptions. Partial words may be used. Wildcards, -however, may not be used. You will be prompted to search your current -directory, all directories in your current library, or all directories in all -libraries. You also will be prompted to expand the search to include extended -file descriptions if desired.</pre> -<pre><b><a name="QuickKeys">Quick Keys</a>:</b> ------------------------------------------------------- - Find Text in Description Current Directory (FD) -------------------------------------------------------- - Find Text in Description Current Library (FL) -------------------------------------------------------- - Find Text in Description All Libraries (FA) -------------------------------------------------------- - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="FileTransferAreaInformation">File Transfer Area Information</a> -</h3> -<pre><b><a name="FileTransferInformationMenu">File Transfer Information Menu</a> (I)</b> ----------------------------------- -To access the File Transfer Information prompt hit I from the File Transfer -prompt. The following choices are available from the prompt:</pre> -<pre> T File transfer policies - D Current directory information - U User account list with access to current directory - Y Your file transfer statistics - Q Quit back to Main menu - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="BBSFileTransferPolicy">BBS File Transfer Policy</a> (IT)</b> ------------------------------ -T from the File Transfer Information prompt displays the BBS's file transfer -policies, rates, upload credit system etc. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="CurrentDirectoryInformation">Current Directory Information</a> (ID)</b> ----------------------------------- -D from the File Transfer Information prompt displays information on your -current directory. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="UsersWithAccesstoDirectory">Users With Access to Directory</a> (IU)</b> ------------------------------------ -U from the File Transfer Information prompt lists all users with access to your -current directory. The list can be sorted alphabetically or numerically by user -number. -<a href="#TOC"><b> -Back to Table of Contents</b></a></pre> -<pre><b><a name="YourFileTransferAccountStatistics">Your File Transfer Account Statistics</a> (IY)</b> ------------------------------------------- -Y from the File Transfer prompt displays your File Transfer account statistics -including credits, downloads, and uploads.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="FileTransferAreaConfiguration">File Transfer Area Configuration</a> -</h3> -<pre><b><a name="FileTransferAreaConfigurationMenu">File Transfer Area Configuration Menu</a> (&)</b> ------------------------------------------ -Hit & from the File Transfer prompt to access the File Transfer Area -Configuration prompt. From this prompt you have the following choices:</pre> -<pre> B Batch Download File Flagging toggle ON/OFF - P New File Scan pointers - Q Quit to Main Menu - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="BatchDownloadQuickFileFlagging">Batch Download Quick File Flagging </a>(&B)</b> ---------------------------------------- -B from the File Transfer Information prompt toggles Batch Download Quick File -Flagging ON and OFF. This feature allows you to add files to your batch -download queue quickly and easily by simply with file list commands L, S, F, -and N. With Batch File Flagging turned on file listings will list one page of -files at a time displaying a letter next to each file and a prompt at the end -of the list. Enter the letters of any files you wish to add to your batch -download queue then hit <CR> to continue the listings. Batch Download Quick -File Flagging can be set ON as your default in User Defaults (see User -Defaults). Remember CTRL-C (abort listing) is available from anywhere on the -BBS. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="ChangeNewFileScanDate/Time">Change New File Scan Date/Time</a> (&P)</b> ------------------------------------ -The new file scan date and time is set each time you logoff. If you wish to new -scan files from a different date than the last date you logged on, hit P from -the File Transfer Information prompt. After entering the new date and time new -file scans (ND, NL, and NA) will scan from the new date and time you have set. -The new file scan date and time will be reset when you logoff. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="DownloadingFiles">Downloading Files</a> -</h3> -<pre><b><a name="DownloadFileorFiles">Download File or Files</a> (D)</b> --------------------------- -To download a file (or files) or add files to the Batch Download queue hit D -from the File Transfer prompt. You will be prompted to enter the filename. You -may use wildcards.</pre> -<pre>Filespec [*.*]: filename.ext or wildcards</pre> -<pre>All file matches in you current directory will be listed one by one with -download options after each file (see Download Options). If no matches are -found in your current directory the search will automatically expand to all -directories in all libraries. If a wildcard was entered the next file in the -search will be displayed with download options (see Download Options) after -each file is downloaded, entered into the batch/bidirectional queue or skipped. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="DownloadUsertoUserFile">Download User to User File</a> (/D)</b> -------------------------------- -To download personal user to user file transfer sent to you by another user hit -/D from the File Transfer prompt. All user to user files sent to you will be -listed one by one with download options (see Download Options) after each file. -User to user file transfers may not be allowed on all systems. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><a name="DownloadOptions"><b>Download Options</b></a> ----------------- -Download options vary depending on which and how many protocols the sysop has -installed on the BBS. The most common protocols are Xmodem, Ymodem, Zmodem, and -Ymodem-G. The download options are: - </pre> -<pre> protocol Download file with selected protocol (usually X, Y, Z, or G). - B Add file to Batch/Bidirectional Download queue (see Batch - File Transfers). - Q Quit to File Transfer prompt and abort search. - <CR> Display next file and download options. Will quit to File - Transfer prompt on last file. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="UploadingFiles">Uploading Files</a> -</h3> -<pre><b><a name="UploadFileorFiles">Upload File or Files</a> (U)</b> ------------------------- -To upload a file to the current directory or add a file or files to the Batch -Upload Queue (see Batch File Transfers) hit U from the File Transfer prompt. -You will be prompted for the filename. Now see Upload Procedures. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="UploadUsertoUserFile">Upload User to User File</a> (/U)</b> ------------------------------ -To upload a file to another user or users hit /U from the File Transfer prompt. -You will be prompted to enter the filename. After confirming the filename you -will be prompted to select the destination user or users. Enter the user's -name, user number, or partial name. After the user has been selected you may -select additional users or <CR> when finished. User to user file transfers may -not be allowed on all systems. Now see Upload Procedures. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="UploadFiletoSysop">Upload File to Sysop</a> (Z)</b> ------------------------- -To upload a file to the sysop's file directory hit Z from the File Transfer -prompt. You will be prompted for the filename. User to sysop file uploads may -not be available on all systems. Now see Upload Procedures. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="UploadProcedures">Upload Procedures</a>:</b> ------------------- -You now may be asked if the file is part of a multiple file set. If the file is -not a part of a set (1 of 3 for example) then hit <CR> or N. You may now be -asked to rate the file based on its contents. Next you will be prompted to -enter the one line file description as you wish it to appear in the file -listing. Then you may be asked to enter an extended description. If you do not -wish to enter an extended description hit <CR> or N. When entering an extended -description all Synchronet editor commands are available to you (see Synchronet -Message Editor) in the description unless you have selected another (external) -editor as your default editor. /S will save your description when you are -finished.</pre> -<pre>After the extended description you will be prompted with upload options. The -upload options are:</pre> -<pre> protocol Upload file with selected protocol (usually X, Y, Z, or G). - B Add file to Batch Upload queue (except user to user). - Q Quit to File Transfer prompt and abort search. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="Remove/EditFile">Remove / Edit File</a> (R)</b> ----------------------- -To remove any file or edit the description or extended description of any file -you have uploaded on to the BBS hit R from the File Transfer prompt. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="BatchFileTransfers"><b>Batch File Transfers</b></a> - </h3> -<pre>You can make uploading and or downloading multiple files much easier by using -batch file transfers. In batch file transfers you have two queues (like holding -tanks) in which to store files to be transferred. The upload queue holds files -to be uploaded and the download queue holds files to be downloaded. To place -files into the queues use the standard upload and download commands from the -File Transfer prompt but select B for batch instead of a protocol when prompted -with upload or download options. The upload and download commands that accept -batch transfers are D, U, /D, and Z. The maximum number of files you may store -in your batch queues is determined by the sysop. </pre> -<pre>An additional option available with batch file transfers is bidirectional file -transfers. Bidirectional file transfers allow you to upload and download files -simultaneously in the same amount of time it takes to upload or download in one -direction. Using bidirectional file transfers you can optimize your time online -by virtually doubling your file transfer speed if you are uploading and -downloading. To use bidirectional file transfers your communications software -must either support bidirectional protocols directly or allow you to add them -as external protocols. Currently the two most popular bidirectional protocols -are Bimodem and HS/Link. All modems should support bidirectional file transfers -without any problem except for US Robotics HST modems in high speed modes. -These modems are designed to send high-speed in one direction and 450bps in the -other simultaneously. You will not benefit from bidirectional file transfers -with this modem at high-speed. If you have a US Robotics Dual Standard modem -make sure you are calling in the v.32 or v.32bis mode to utilize bidirectional -file transfers. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="Batch/BidirectionalCommands">Batch/Bidirectional Commands</a> (B)</b> --------------------------------- -To use Batch/Bidirectional commands hit B from the File Transfer prompt. If you -have no files in either your upload or download queues you will not be able to -use Batch/Bidirectional commands until you add at least one file to one of your -queues. Only protocols supporting batch uploads and downloads will be available -from these commands. Xmodem for example will not be an option. The -Batch/Bidirectional commands are:</pre> -<pre> B Start a bidirectional file transfer - U Upload files from upload queue - D Download files from download queue - L List files in Upload and Download queues - R Remove a file or files from Upload or Download queues - C Clear (remove all) files from Upload or Download queues - Q Quit to File Transfer prompt - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><a name="FileExtraction/TempDirectory">File Extraction / Temp Directory</a> - </h3> -<pre>If implemented on the BBS, file extraction allows you to extract files from an -archived file (ZIP, ARC, LZH, etc.) and download only the file or files you -need from that archive. This can be extremely helpful if you need only one 50k -file from a 1MB ZIP file online. </pre> -<pre>You can even extract files from nested archives. For example if an archive -called FONTMAN.ZIP contained two archives within itself, BLUE.ZIP and RED.ZIP -and BLUE.ZIP contained two files called FILE1.FON and FILE2.FON you would be -able to download just the file FILE1.FON if that were the only file you needed.</pre> -<pre>All file extraction is done in your Temp Directory. This is an area you may -extract files to and download from. You may work on one original archive at a -time in the Temp Directory. The Temp Directory may, however, contain many files -extracted from the original archive. </pre> -<pre>The Temp Directory is also used to create and download a new file scan list or -a complete list of all files on the BBS. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b><a name="TempDirectoryCommands">Temp Directory Commands</a> (T)</b> ---------------------------- -Hit T from the File Transfer prompt to access the Temp Directory prompt. From -this prompt the following commands are available:</pre> -<pre> E Extract files from an archive into the Temp Directory - N Create a New Files list - F Create a list of all files on the BBS - A Add or create a Temp File - D Download a Temp File - I Information on files - V View the contents of any archive located in Temp Directory - L List all files in the Temp Directory - X Extract from an archive located in Temp Directory - R Remove file or files from Temp Directory - Q Quit to File Transfer prompt</pre> -<pre><a name="ExtractfromarchiveinTempDirectory"><b>1) Extract from archive in Temp Directory</b></a> ------------------------------------------ -To extract files from an archive into the Temp Directory hit E from the Temp -Directory prompt. Enter the filename you wish to extract from. You may use a -wildcard. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b>2) <a name="AddfilestoTempfile">Add files to Temp file</a></b> -------------------------- -To download from the Temp Directory you must first create a Temp File -containing any files you wish to download from the Temp Directory. To create a -Temp File or add to a Temp File select A from the Temp Directory prompt. You -can view the contents on any archives located in the Temp Directory by -selecting V from the Temp Directory prompt. If you wish to extract files from a -nested archive located in the Temp Directory select X. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<pre><b>3) <a name="DownloadTempfile">Download Temp file</a></b> ---------------------- -When your Temp File contains all the files you wish to download select D from -the Temp Directory prompt to download the Temp File.</pre> -<pre><a href="#TOC"><b>Back to Table of Contents</b></a></pre> -<h3><b><a name="Creatinganddownloadingfilelists">Creating and downloading file lists</a> </b> - </h3> -<pre>Entering N from the Temp Directory prompt will create a file listing of all new -file uploads called NEWFILES.TXT, and place the file in the Temp Directory. To -download the file hit A to create a Temp File then D to download the Temp File. -The list is a standard ASCII text file and can be read from any standard text -editor or wordprocessor. Remember that creating this file in the Temp Directory -will delete any files that are already in the directory. </pre> -<pre>To create and download a complete file list of all files on the BBS hit F from -the Temp Directory prompt. This will create a file called FILELIST.TXT. Then -hit A to create a Temp File then D to download the Temp File. Again, creating -the FILELIST.TXT will erase all existing files in the Temp Directory. - -<a href="#TOC"><b>Back to Table of Contents</b></a></pre> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -<pre> </pre> - -</body> - -</html> diff --git a/docs/user_editor.html b/docs/user_editor.html deleted file mode 100644 index a7f385e200..0000000000 --- a/docs/user_editor.html +++ /dev/null @@ -1,546 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>User Editor</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> - -<h2><a name="UsingUserEditLocally">[6.1] - Using User Edit Locally </a></h2> - -<pre><b>Graphical Synchronet User Editor <i><font color="#FF0000">(v3+ Only)</font></i></b></pre> -<pre>The User Editor application can be executed from the menu bar of the Synchronet -Control Panel as shown below. - -<img border="0" src="images/uedit_v3_exe.gif" width="430" height="151"></pre> -<pre>Below is a screenshot of the GUI User Editor with a sample user and data -shown. How this screen looks will vary depending upon your configuration -and what data you decide to collect from new users. There are many options -and settings available in the User Editor and you should spend some time -getting familiar with this feature.</pre> -<pre><img border="0" src="images/uedit_v3.gif" width="453" height="403"></pre> -<pre><b>Online Synchronet User Editor</b> - -<b>Alt-U <i><font color="#FF0000">(v2 Only)</font></i></b> - The sysop can locally hit Alt-U at any time within Synchronet to bring - up the User Edit function with the user that is online as the current - user to edit. After exiting User Edit, the sysop will return to the - place where he was prior to hitting Alt-U. </pre> -<pre><b>U</b> - At the Reading Mail or Reading All Mail prompts, hitting 'U' will pop - the sysop into User Edit with the author of the previous message as the - current user. Hitting 'U' at the Waiting for call screen will start - User Edit. Hitting 'U' from the Reading Messages (O)perator menu will - start User Edit too. - -<b>;UEDIT -</b> Typing ';UEDIT' at either the Main or Transfer prompts will also pop - the sysop into User Edit and if a user number or name is specified - (e.g. ;UEDIT 20 or ;UEDIT BOB), then that user will be the current - user.</pre> -<h2><a name="UsingUserEditRemotely">[6.2] - Using User Edit Remotely</a></h2> -<pre>When a remote sysop initiates User Edit (with the U or ;UEDIT command), User -Edit functions a little differently than when a local sysop initiates it. -A remote sysop cannot raise any user's Level above his own and can't give a -user any Flags or Exemptions that he/she doesn't have. A remote sysop can not -edit any information of any users with a Level higher than his own and their -passwords, real names, and phone numbers aren't displayed to him/her. - -<b>User Edit Screen Example:</b> - -<font color="#000080">Alias : The Albatross Password : MYPASS 10/12/91 -Real Name : Joe Schmoe Phone number : 714-555-1212 -Address : 404 N.S. West Ln. Age/Sex/BD : 31 M 03/08/61 -Location : Irvine, Ca Zip Code : 90001 -Note : Handle : J Schmoe -Computer : 386DX-25 ISA SVGA 4 60 ST506 Modem type : 14.4/V32 - -First on : 07/19/91 Expire : 12/18/95 Last on : 09/12/92 20:13 -Time on : 2831 Today : 0 105 Last call : 9 90 Extra : 0 -Logons : 156 Today : 0 6 Posts : 39 24 Today : 0 -E-mails : 22 To sysop : 3 Waiting : 0 Today : 0 - -Uploads : 3,085 bytes in 1 files -Downloads : 90,389,401 bytes in 282 files -Credits : 4,007,324 free: 0 (0 per day) -Minutes : 0 - -Sec Level : -Flags #1 : CD L N Flags #3 : AB E -Flags #2 : G Flags #4 : F H -Exemption : Restricts : - -</font><b>User Edit Screen Explanation</b></pre> -<pre>The 1st line contains either the alias (if aliases are allowed) or the name -of the user, the user's password, and the date the password was last modified. - -The 2nd line contains the user's real name and the user's phone number. - -The 3rd line contains address of the user, the user's age, sex, and birthday in -the form MM/DD/YY or DD/MM/YY if European Date format is enabled. - -The 4th line contains the user's location (normally City, State) and Zip -(or postal) code. - -The 5th line contains a public note about the user and the user's chat handle. - -The 6th line contains the user's computer description and modem type. - -The 7th line contains the user's private comment - only readable or editable -by a sysop. If there is a '$' after the "Comment" label, then this user has -a message file currently attached and is view/editable with the '$' command. -If the comment is blank and there isn't an extended comment, this line is -blank. - -The 8th line contains the date the user was first on, the user's expiration -date, and the date and time the user was last on. Dates are in the form -MM/DD/YY or DD/MM/YY if European date format is enabled. - -The 9th line contains the total time (in minutes) the user has been online, -how much time today, the maximum time he is allowed per day, amount of time on -his most recent call, the maximum time he is allowed per call, and any extra -time the user may have accumulated through file uploads. - -The 10th line contains the total number of logons for this user, the number -of logons today, the maximum number of logons this user is allowed per day, -total number of messages posted by this user, the user's current post/call -ratio, and total posts today. - -The 11th line contains the total number of e-mails sent by this user, total -number of e-mails sent to user #1, number of e-mails currently in user's -mailbox, and the number of e-mails this user has sent today. - -The 12th line contains the user's NetMail forwarding address. If the user -doesn't have a NetMail forwarding address specified, this line is blank. - -The 13th line contains the total number of bytes uploaded by this user and -the total number of files. - -The 14th line contains the total number of bytes downloaded by this user and -the total number of files. If the user has had any suspected leech downloads, -the number of leech downloads is displayed here too. - -The 15th line contains the number of credits this user currently has. The -free credits are given on a daily basis as determined by the sysop. - -The 16th line contains the amount of time credits this user has (in minutes). - -The 18th line contains the user's Security Level. - -The 19th line contains the user's Flag Sets 1 and 2 (if any). - -The 20th line contains the user's Flag Sets 3 and 4 (if any). - -The 21st line contains the user's Exemption and Restriction Flags that are set -(if any). - -The 23rd line contains the User Edit command prompt which contains the number -of the current user and the total number of user slots on the system. - -If the current user is deleted or inactive, then the 1st line will contain a -string that specifies this status and all other lines will be shifted down one.</pre> -<h2><a name="UserEditCommands">[6.3] - User Edit Commands</a></h2> -<pre>As with most Synchronet command prompts, hitting '?' will display a menu -of commands.</pre> -<pre> A Alias and Chat Handle S Sex (Gender) - B Birthday T Set Text Search String - C Computer U Upload/Download Stats - D Delete/Deactivate/Restore V Validate User - E Exemptions W Password - F Flags X View Extended Comment - G Go to a User Y Copy User to Another Slot - H Edit/Create Extended Comment Z Restrictions - I Inspect/Edit User's Defaults ] Go Up One User - J Edit Minutes [ Go Down One User - K Edit Dates } Search Up - L Location and Address { Search Down - M Security Level / Set ARS Search String - N Note ~ Set Leech Download Counter - O Comment + Adjust Credits - P Phone Number * Adjust Minutes - Q Quit to Main Menu $ Edit Credits - R Real Name # View User Questionnaire - -The available commands are listed below with explanations. - -<b>A - Alias and Chat Handle: -</b> This command will let you edit the user's alias - a 25 character field - that must start with a non numeric character. You can also edit the - user's chat handle (an 8 character field) with this command. - -<b>B - Birthday -</b> You can edit the user's birthday with this command. The form of the - date is forced as either MM/DD/YY or DD/MM/YY (depending on the - setting of the European date option). - -<b>C - Computer Description: -</b> You can edit the user's 30 character computer description field with - this command. - -<b>D - Delete/Deactivate/Restore/Activate: -</b> If the current user is at normal status (not deleted or inactive), - hitting this command will prompt you if you wish to delete or - inactivate this user. If you delete a user, his account will be saved - for number of days since his last logon. This number of days is - specified by the sysop in the SCFG. After this number of days, - a new user may obtain this slot. Inactive slots are the same as deleted - ones, except that they are reserved and can't be used by new users. - - If the current user is deleted or inactive (as specified by the 1st - line of the screen), this command will allow you to restore the user - to normal status. - -<b>E - Exemption Flags:</b> - Exemptions are used by the sysop to give user's extended privilege - to the system. For example, you might want to give a trustworthy - user the right to remove, move, and edit descriptions of all files - in the Transfer Section. Normally users can only remove or edit the - description of a file they've uploaded, but a user with the 'R' - exemption can move any file, remove any file, or edit any file - description in the Transfer Section. This ability is normally only - given to sysops. - - Using this command you can toggle the state of an Exemption Flag - by hitting the corresponding letter. To view a menu of the available - exemptions, hit '?' or [ENTER] to stop editing the Exemption Flags. - - The following is a list of the available exemptions and their - descriptions ($ indicates that sysops have this capability): - -<b> A - Anonymous -</b> Allows user to post and send e-mail anonymously. -<b> C - Chat $ -</b> Allows user to page the local sysop with the ;CHAT command - regardless of the sysop availability state (Scroll-Lock). -<b> D - Download -</b> Allows user to download files even when the user doesn't - have enough credits. -<b> E - Expire by Time -</b> Prevents user account from expiring when the user runs out of - time and the SCFG->System->Toggle Options->User Expires When - Out of Time is set to YES. -<b> F - FidoNet Crash/File Request/Return Receipt NetMail -</b> Allows user to send NetMail using title specifiers: - "CR:" to over-ride default crash status to ON - "FR:" to send file requests (FREQ) - "FA:" to send file attachments - "RR:" to request a return receipt - See Sending FidoNet NetMail for more information. -<b> G - Multiple Nodes $ -</b> Allows user to be logged on to more than one node at a time. - This exemption is useful for Guest accounts. -<b> I - Interrupt Nodes $ -</b> Allows user to interrupt (hang up on) other nodes with the - ;INTR command. -<b> J - Chat Channel Cost -</b> User will not be charged credits to change chat channels. -<b> L - Logons per day -</b> Allows user to logon the system an indefinite number of times - per day. -<b> M - Modem Rate $ -</b> Allows user to logon any node at any modem speed regardless - of what the minimum modem speed for that node is. -<b> N - Node Locking $ -</b> Allows user to toggle the lock status of any node with the - ;LOCK command and log on a locked node. -<b> P - Permanent -</b> This user account will not be automatically deleted because - of inactivity. -<b> Q - Quiet/Anonymous Node $ -</b> Allows user to toggle the quiet or anonymous state of his node - with the ;QUIET or ;ANON commands respectively. Nodes that are - in quiet mode appear to be "Waiting for call" to the other - nodes. Anonymous modes appear to have "UNKNOWN USER" online. -<b> R - Remove/Move/Edit Descriptions of Files $ -</b> Allows user to remove, move, or edit the descriptions of any - file in the Transfer Section that the user has access to. -<b> S - Send NetMail Cost -</b> User will not be charge credits for sending NetMail. -<b> T - Time Online -</b> Allows the user to remain online indefinitely - no time limit. - The inactivity timer remains active. -<b> X - External Programs -</b> User will not be charged credits to run external. - -<b>F - Flags: -</b> This command lets you toggle the state of all Flags. Hitting a number - will allow you to edit that particular flag set. Hitting '?' will - display a menu that is used to remind the sysop of the meaning of each - Flag. These menus are located in the TEXT\MENU directory and names are - FLAGS1.ASC, FLAGS2.ASC, FLAGS3.ASC, and FLAGS4.ASC. Hitting [ENTER] - will end the editing of the flags. - - The Flags in conjunction with the Level can by used by the sysop to - limit access to Message Groups, Sub-boards, External Programs, - General Text File Sections, Transfer Libraries, and Directories. - -<b>G - Go to a User: -</b> This command will let you change the current user into another user - by entering the user's name, partial name, or number. It should be - noted that the fastest way to change the current user is to type the - number of the user directly at the User Edit prompt. - -<b>H - Edit/Create Extended Comment: -</b> This command will let the sysop edit or view an existing extended - comment or create a new one. An extended comment is a free-form message - file that a sysop creates that contains information pertaining to this - user. A '+' after the "Comment:" string on the 5th line of the User - Edit screen specifies that an extended comment already exists. - -<b>I - Inspect or Edit User's Default Settings: -</b> This command will bring up the current user's default settings for - ANSI terminal emulation, screen length, screen pausing, spinning - cursor, auto new file scan, clear screen after messages, auto menu - display, and default QUIET mode (if the user has the 'Q' exemption). - -<b>J - Edit Minutes: -</b> This command allows the sysop to edit the current user's minute field. - -<b>K - Edit Date Fields: -</b> The command will let you edit the date fields for this user's last - logon, first logon, expiration date, and password modification date. - All dates are forced to the form MM/DD/YY or DD/MM/YY if European - date format is enabled. - -<b>L - Location: -</b> This command will allow the sysop to edit the user's address, location, - and zip/postal code fields. - -<b>M - Security Level: -</b> The sysop can edit the user's Security Level with this command. The - user's Level is a decimal number in the range 0 to 99. Higher levels - indicate higher access. Users with a level of 90 or higher are - considered to be sysops. The sysop can use the Level in conjunction - with the Flags to limit access to Message Groups, Sub-boards, General - Text File Sections, External Programs, Transfer Libraries, and - Directories. The Level also determines the user's maximum time online - per day, per call, maximum logons per day, and maximum number of lines - per message (post or e-mail). - -<b>N - Note/Name: -</b> If aliases are allowed on the system, this command will allow the sysop - to edit the user's public note. This field is displayed next to the - user's alias in user listings and the logon list. - - If aliases are not allowed, this command allows the sysop to edit the - user's name. The user's name is a 30 character field that must begin - with a printable non-numeric character. The first letter of each word - in the user's name is forced uppercase. - -<b>O - Sysop Comment: -</b> This command allows the sysop to edit the private 60 character comment - field regarding this user. - -<b>P - Phone Number:</b> - The sysop can edit the user's phone number. - -<b>Q - Quit User Edit: -</b> Exits the User Edit function and returns the sysop to where he was - prior to initiating User Edit. - -<b>R - Real Name (if aliases are allowed): -</b> This command allows the sysop to edit the user's real name - a 25 - character field. The first letter of each word in this field is forced - uppercase. - -<b>S - Sex: -</b> A single uppercase character is used to describe the sex of the user - (normally 'M' or 'F'), but can be changed to any uppercase character - with this command. - -<b>T - Set Text Search String: -</b> Use this command to set the text string to search for (using the { - and } commands). - -<b>U - Upload/Download Statistics: -</b> The sysop can edit the user's upload and download statistics with - this command. The statistics are the number of bytes and files uploaded - and the number of bytes and files downloaded. These are numeric fields. - -<b>V - Quick-Validate User: -</b> This command will display the ten quick-validation sets (0 to 9) - for quickly setting the user's Security Level, Flags, Exemptions, - Restrictions, Expiration Date, and/or Credits. The Quick-Validation - sets are set by the sysop in SCFG->System->Quick-Validation Values. - -<b>W - Password: -</b> Use this command to change the user's password. The password - modification date doesn't change when using this command (use 'K' - to change the password modification date). - -<b>X - View Extended Comment: -</b> This command allows the sysop to the user's extended comment if it - exists. - -<b>Y - Copy User to Another Slot: -</b> This command will copy the user data of the current slot to another - valid slot. This will overwrite any user information in the - destination slot. - -<b>Z - Restriction Flags: -</b> A sysop can give a user restrictions from certain sections or features - of the BBS by setting one or more valid Restriction Flags. Typing the - letter of a restriction will toggle its status, '?' will display a menu - of the valid restrictions and [ENTER] will end the flag editing - procedure. The valid restrictions and their descriptions follow: - -<b> A - ANSI and Ctrl-A Codes -</b> User can't write messages containing either ANSI escape - sequences or Ctrl-A attribute codes. -<b> B - Beep -</b> User can't put beeps (Ctrl-G, ASCII 7) into messages - (posts, mail, or chat). -<b> C - Chat -</b> User can't use any chat functions. -<b> D - Download -</b> User can't download files. -<b> E - E-mail -</b> User can't e-mail other users (can still e-mail sysop). -<b> F - Forward Mail -</b> User can't forward mail. -<b> G - Edit Defaults -</b> User can't edit their default settings. -<b> J - Quoting -</b> User can't use internal message quoting. -<b> K - Read Sent Mail -</b> User can't read/kill sent mail. -<b> L - Logon Once a Day -</b> User will only be allowed to logon a maximum of once a day - regardless of what his Level allows normally. -<b> M - Networked Mail -</b> Can't send NetMail. -<b> N - Networked Subs -</b> User can't post on networked sub-boards. -<b> P - Post -</b> User can't post messages on Sub-Boards. -<b> Q - QWK Network Node -</b> This user account is used for a QWK Network Node BBS system. - This restriction automatically puts the user at the QWK prompt - upon logon and no other sections of the BBS are accessible. - This restriction also allows the user to upload REP packets - containing messages that are from users other than the current - user. -<b> R - Remove/Edit Descriptions of Files -</b> User can't remove or edit file descriptions of files he has - uploaded. -<b> S - E-mail Sysop -</b> User can't send e-mail (feedback) to user #1. -<b> T - Transfer Section -</b> User can't access the Transfer Section at all. -<b> U - Upload -</b> User cannot upload files to the Transfer Section. -<b> W - Auto-message -</b> User cannot write to auto-message. -<b> X - External Programs -</b> User can't access the external program menu ('X' from Main - Menu). -<b> Y - Are you sure (y/N) ? -</b> The user will be forced to answer Yes prior to performing - any function from the Main or Transfer Sections. - -<b>] - Move Up One User Slot: -</b> Increment the current user number by one. If the current user is - the last user, the current user will become user number 1 (wrap). - -<b>[ - Move Down One User Slot: -</b> Decrement the current user number by one. If the current user is - the first user, the current user will become the last user (wrap). - -<b>(Number) - Change to User Number: -</b> Entering a user number directly at the User Edit command prompt will - make that user the current user. - -<b>/ - Set Search String: -</b> Use this command to set the AR string to search for (using the { and - } commands). See the ARS Security chapter for explanation of AR string. - -<b>} - Search Forward: -</b> Searches from the current user to the last user for the string set by - the '/' (ARS) or 'T' (text) command. - -<b>{ - Search Backward: -</b> Searches from the current user to the first user for the string set by - the '/' (ARS) or 'T' (text) command. - -<b>~ - Set Leech Download Counter: -</b> Every time a user downloads a file and the BBS detects the possible - use of a 'leech' protocol, a counter is incremented and the value is - displayed on the Downloaded Bytes and Files line if it is not zero. To - change the value of this counter, use the '~' command. - -<b>+ - Add or Subtract Credits: -</b> This command will let you add or subtract credits to/from a user's - account. Putting an 'M' after the number will multiply the amount by - one megabyte (1,048,576) or a 'K' will multiply the amount by one - kilobyte (1024). Placing a '$' will multiply with the number by the - number of credits per dollar in the current system configuration. - Placing a minus sign before the number will perform a subtraction of - credits. - -<b>* - Add or Subtract Minutes: -</b> This command will let you add or subtract time from the user's minute - field. Putting an 'H' after the number will multiply the amount by 60 - minutes (an hour). Placing a minus sign before the number will perform - a subtraction of minutes. - -<b>$ - Edit Credits: -</b> This command allows you to edit the amount of credits of the current - user. - -<b># - View SIF Questionnaire: -</b> If the sysop has specified a SIF questionnaire in the SCFG and the - current user has answered the questionnaire, this command will allow - the sysop to view the answered questionnaire. An output SIF (usually - an abbreviation of the input SIF) will be used if specified in the - SCFG, if not specified the output SIF will be used for viewing.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> - -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/usercom.txt b/docs/usercom.txt deleted file mode 100644 index 167d1afb1e..0000000000 --- a/docs/usercom.txt +++ /dev/null @@ -1,17 +0,0 @@ -USER.COM Documentation ----------------------- - -This utility will extract the activity and statistics of a particular user from -the Synchronet detailed log files. - -usage: user <username> <logfiles> - -'username' is the name or number of the user whose doings should be extracted. - It should be placed in double quotes if the name is more than one - word, and is case sensitive. -'logfiles' is a log filename or list of log files to search (wildcards are ok) - -It is useful to redirect the output of USER.COM into a text file for viewing. - -Examples: user "Bill Wagstaff" c:\sbbs\data\logs\07*.log > bwag.txt - user 0155 ..\maylogs\*.log ..\junlogs\*.log >rbar.txt diff --git a/docs/utility_reference.html b/docs/utility_reference.html deleted file mode 100644 index b4311f7eaa..0000000000 --- a/docs/utility_reference.html +++ /dev/null @@ -1,1249 +0,0 @@ -<html> - -<head> -<meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -<meta name="GENERATOR" content="Microsoft FrontPage 4.0"> -<meta name="ProgId" content="FrontPage.Editor.Document"> -<title>External Utility Reference</title> -</head> - -<body> - -<!--webbot bot="Include" U-Include="_borders/top.htm" TAG="BODY" startspan --> - -<a href="http://www.synchro.net"><img border="0" src="images/synclogo_fancyred.gif" alt="Synchronet BBS - Multinode Bulletin Board Software" width="626" height="86"></a> - -<hr> - -<!--webbot bot="Include" endspan i-checksum="23126" --> - -<p><a name="top"></a><a href="sysop.html#TOC">Back to Table of Contents</a></p> -<h2>[15.1] - <a name="CHKSMB">CHKSMB</a> - Checks mail/message base for -validity</h2> -<pre><b>usage: chksmb [/opts] <filespec.SHD></b> - -opts: - s - stop after errored message base - p - pause after errored message base - q - quiet mode (no beeps while checking) - -<b><i>WARNING:</i></b> All BBS nodes should be DOWNed (offline) or inactive when utilizing - the CHKSMB utility. - -The purpose of the CHKSMB utility is to insure that mail and/or message bases -are valid. If you suspect that your mail, or one of your message bases has -become corrupted, you can run CHKSMB. This will inform you of any possible -corruption, and display information which may be useful in determining the -cause of the corruption. - -Example command line: - - <b>CHKSMB \SBBS\DATA\MAIL \SBBS\DATA\SUBS\*.SHD</b> - -to check your e-mail and sub-board data files for possible corruption. - -Most mail and/or message bases which are corrupted can be reconstructed -(fixed) using the SMBUTIL program with the pack option. - -Message bases with corrupted index files must be fixed with the FIXSMB program.</pre> -<h2>[15.2] - <a name="FIXSMB">FIXSMB</a> - Rebuild Synchronet Message/Mail -Base</h2> -<pre><b>usage: fixsmb [/opts] <smb_file> -</b> - opts: - m - mail format instead of sub-board format - - ex: <b>FIXSMB /M C:\SBBS\DATA\MAIL -</b> or: <b>FIXSMB C:\SBBS\DATA\SUBS\DEBATE -</b> -Use the FIXSMB utility whenever CHKSMB shows that a message base has become -corrupted due to problems with the index.</pre> -<h2>[15.3] - <a name="SMBUTIL">SMBUTIL</a> - Synchronet Message Base Utility</h2> -<pre><b>usage: smbutil [/opts] cmd <filespec.SHD> -</b> -cmd: - l[n] = list msgs starting at number n - r[n] = read msgs starting at number n - v[n] = view msg headers starting at number n - k[n] = kill (delete) n msgs - i<f> = import from text file f - s = display msg base status - c = change msg base status - m = maintain msg base - delete old msgs and msgs over max - p[k] = pack msg base (k specifies minimum packable Kbytes) -opts: - a = always pack msg base (disable compression analysis) - f = fast msg creation mode - d = disable duplicate message checking - z[n] = set time zone (n=min +/- from UT or 'EST','EDT','CST',etc) - - -The SMBUTIL can be used for several things, but most importantly, it must be -used for maintaining your Synchronet message base (using the 'm' command). This -command causes SMBUTIL to mark old messages, and messages over the maximum sub- -board limit, as deleted so that their spaces can be used by new messages. If -you are using the 'Hyper Allocation' or 'Fast Allocation' method for your -message bases, you must also use this utility to pack your message bases (using -the 'p' command) periodically. The pack command causes SMBUTIL to compress the -message bases removing any unused spaces (messages marked as deleted). - -SMBUTIL maintenance and/or packing should be done using your daily event (or -after importing from a network such as FidoNet). If your message base is using -the 'Fast Allocation' or 'Hyper Allocation' storage methods, you should run -maintenance before packing (there is no reason to pack if you do not run -maintenance!). If your message base is set up for the 'Self Packing' method, -you do NOT need to use SMBUTIL to pack, only to perform maintenance. - -Example batch file lines for SMBUTIL would read: - -for maintenance and packing (100k or more per sub): - -<b> SMBUTIL mp100 \sbbs\data\subs\*.shd -</b> -for maintenance only (self-packing sub-boards): - -<b> SMBUTIL m \sbbs\data\subs\*.shd -</b> -<b><i>WARNING:</i></b> All BBS nodes should be DOWNed (offline) when using SMBUTIL with the - pack option! To do this, set the SMBUTIL event to be 'Exclusive' in - the SCFG program. - -When using the pack command, SMBUTIL will check to see if it is necessary for -you to pack your message base, if you want to skip this checking and have it -unconditionally pack the message base (useful when attempting to repair a -corrupted message base), you should add the '/a' switch to the command line: - - <b>SMBUTIL /a p \sbbs\data\subs\*.shd -</b> -The maintenance and pack commands are likely all that you will ever need to -SMBUTIL for.</pre> -<h2>[15.4] - <a name="SMBACTIV">SMBACTIV</a> - Checks Synchronet Message -Base Activity</h2> -<pre>SMBACTIV.EXE is used to create a list of the number of users that are currently -reading each message area (sub-board) on your BBS. If a message area has a -very low number of active users, then it may be a waste of disk space and -memory on your BBS. - -Before SMBACTIV is run, you must have your SBBSNODE environment variable set -to point to a valid node directory. Example: - -<b>SET SBBSNODE=C:\SBBS\NODE1 -</b> -SMBACTIV can be run with no parameters to display a list of all your sub-boards -and the number of active users. If you wish to keep this list for reference, -it is a good idea to redirect the output to a file or printer. Example: - -<b>SMBACTIV > PRN -</b> -You can also specify a maximum number of active users to include in the list -of sub-boards as a paramter. Example: - -<b>SMBACTIV 50 -</b> -would create a list of all sub-boards that have 50 or less active users. To -create a list of sub-boards that have no active users, you would use: - -<b>SMBACTIV 0</b></pre> -<h2>[15.5] - <a name="ADDFILES">ADDFILES</a> - Adds Files to Synchronet File -Database</h2> -<pre><b>usage: addfiles code [.alt_path] [/opts] ["*user"] +list [desc_off] [size_off] -</b> - or: <b>addfiles code [.alt_path] [/opts] ["*user"] file "description" -</b> -available opts: - - a import ASCII only (no extended ASCII) - d delete list after import - e do not import extended descriptions - f include file date in descriptions - t include today's date in descriptions - i include added files in upload statistics - n do not update information for existing files - o update upload date only for existing files - u do not update upload date for existing files - z check for and import FILE_ID.DIZ and DESC.SDI - k keep original short description (not DIZ) - s search for files in directory (no file list) - * use * in place of code for Auto-ADD of FILES.BBS - use *filename to Auto-ADD a different filename - -example for importing FILES.BBS format: -<b> addfiles games +c:\lists\files.bbs -</b> -example for importing DIRxx format: -<b> addfiles games +c:\lists\dir01 33 -</b> - -<b>SBBSNODE DOS Environment variable:</b> - -The environment variable SBBSNODE must be set prior to running ADDFILES. Add -the following line to your AUTOEXEC.BAT: - -<b>SET SBBSNODE=C:\SBBS\NODE1</b> - -Where, the path to NODE1 reflects the complete path of your NODE1 directory.</pre> -<h3>Parameter Explanations:</h3> -<pre><b>dir_code:</b></pre> -<pre>The dir_code parameter is the first argument and is the internal code of the -Synchronet file directory you are adding the files to. This parameter is -not case sensitive. The dir_code parameter is required. Use * for Auto-ADD. - -<b>.alt_path: -</b> -If the files are located on an alternate file path, you can specify the -alternate file path number by using the ".x" paramter, where 'x' is the -number of the alternate path. - -<b>/opts:<u> -</u></b> -If desired, you may specify a list of options. The available options are: - -A - Import ASCII character only (ignore any extended ASCII or control chars) -D - If you want ADDFILES to delete the file list after importing it -E - If you want ADDFILES to NOT import extended descriptions -F - Automatically include the file date in the beginning of the description -T - Automatically include the today's date in the beginning of the description -I - Include files that are added in the system's upload statistics -N - Do not update any information for files already in the database -O - Only update the upload date for files already in the database -U - Do not update upload date for files already in the database -Z - Check for and import FILE_ID.DIZ and DESC.SDI as extended description -K - Keep original short description (don't override with DIZ) -S - Search for files in directory (no file list for names and descriptions) - -<b>*user:<u> -</u></b> -The *user parameter sets the name of the uploader of the files to the -string following the asterisk. An example would be: "*Digital Man". If an -uploader is not specified, files will be added with "-> ADDFILES <-" as the -uploader. The quotation marks are only necessary for uploader names of more -than one word. The quotation marks are not used as part of the actual name. -Example: - -*Joe is OK -*Joe Doe is NOT OK -"*Joe Doe" is OK - -Multiple uploader names can be used if more than one file or file list is being -added. Example: - -<b>ADDFILES GAMES "*Bob" +FILES.BBS "*John Doe" TICTAC.ZIP "tic-tac-toe" -</b> -The above command line would add the files listed in FILES.BBS using "Bob" -as the uploader, and then add TICTAC.ZIP using "John Doe" as the uploader. - -<b>file "description": -</b> -You can specify individual filename and description pairs on the command line -to add. The filename is NOT case sensitive and the description IS. The -quotation marks are only necessary for descriptions of more than one word. -Example: - -TICTAC.ZIP Tic-Tac-Toe is OK -TICTAC.ZIP Tic Tac Toe is NOT OK -TICTAC.ZIP "Tic Tac Toe" is OK - -<b>+list [desc_off] [size_off]:<u> -</u></b> -An ASCII text file list can be specified for adding to the database. The format -of the file must be as follows (FILES.BBS lists work best): - -Filename and description on single line. Number of spaces between filename and - description doesn't matter. -Filename must contain a period (.). - Example: TICTAC.ZIP is OK - TICTAC ZIP is NOT OK - TICTAC .ZIP is OK -Lines beginning with control characters or extended ASCII characters - are ignored (this includes blank lines). -Up to 58 characters of description are used. -Lines following a filename/description line that begin with space are - used as additional information for the description, and the entire - description is used as an extended description for the file as well. - -The name of the file list is specified on the command line after the plus (+) -character. Example: - -<b>ADDFILES GAMES +FILES.BBS -</b> -If the file list is not located in the current directory, you must specify -the complete path to the file list: - -<b>ADDFILES GAMES +C:\LISTS\FILES.BBS -</b> -If no filename/description pairs are given on the command line and no +list -parameter is given, ADDFILES will attempt to use a file list with the dir_code -as the filename and .LST as the extension. -Example: - -<b>ADDFILES GAMES -</b> -Would add files to the GAMES directory using GAMES.LST as the file list. If -GAMES.LST is can not be found, it will look for FILES.BBS in the current -directory or in the directory's storage path. - -If a file list is specified on the command line, but is not found in the -current directory, the storage path for that directory is searched. If the -file list exists, it will be imported from there. - -<b>desc_off:</b> - -If a filelist is specified on the command line, a description offset can be -specified as the next argument. If used, this parameter will specify at what -column to start importing the descriptions. For PCBoard DIR file format, you -should specify a description offset of 33. Example: - -<b>ADDFILES GAMES +DIR10 33 -</b> -This offset is also used for the importing of any extended description lines. -size_off: - -If a filelist is specified on the command line with a description offset, -a file size offset can be specified too. If a file size offset is specified, -the disk does not need to be searched for the size of the file to determine -the credit value. This is useful for adding lists of files from a CD-ROM -drive as it speeds up process since the CD does not need to be scanned for -the file size. This parameter is also useful for importing off-line file -lists, where the file doesn't actually exist on the drive. For PCBoard DIR -file format, this offset should be set to 13. Example: - -<b>ADDFILES GAMES +DIR10 33 13</b></pre> -<h2>[15.6] - <a name="FILELIST">FILELIST</a> - Generate Synchronet File -Directory Listings</h2> -<pre><b>Description:<u> -</u></b> -This utility creates an ASCII text file list of the files in a Synchronet file -transfer database. This utility is useful for creating file lists for users to -download, exporting into other programs, or for easy statistics reporting by -the sysop. - -The default output is compatible with the FILES.BBS standard format. Options -are available for enhancing the output for your needs. - -Understand that this is an EXPORT utility and is not necessary for the normal -execution of Synchronet. This utility exports from the binary indexed file -databases of Synchronet into ASCII text. If you are looking for a program to -IMPORT files from ASCII into Synchronet, you need to look for the ADDFILES -utility for Synchronet. If you are just trying to ADD files to your Synchronet -database, then you need to read Sysop Commands - specifically the ";UPLOAD" -sysop transfer section command. - -<b>Syntax:</b> - -<b>usage: FILELIST [dir_code] [switches] outfile -</b> -switches: /LIB name All directories of specified library - /ALL All directories in all libraries - /NOT code Exclude specific directory - /CAT Concatenate to existing outfile - /PAD Pad filename with spaces - /HDR Include directory headers - /CDT Include credit value - /ULN Include uploader's name - /ULD Include upload date - /DFD Include DOS file date - /DLD Include download date - /DLS Include total downloads - /NOD Exclude normal descriptions - /NOE Exclude normal descriptions, if extended exists - /EXT Include extended descriptions - /JST Justify extended descriptions under normal - /+ Include extended description indicator (+) - /- Include offline file indicator (-) - /* Short-hand for /PAD /HDR /CDT /+ /-</pre> -<h3>Parameter Descriptions:</h3> -<pre>Either the "/LIB name", "/ALL", or <dir_code> parameter must be included for -a list to be generated. If you want to create a list of files for a single -file directory, use that directory's internal code as the first parameter on -the command line. If you want all directories in a certain library to be in -the list, use the "/LIB name" switch - where "name" is the short name of the -library you want to list. If the library short name is more than one word, -you most puts quotes around the name (e.g. /LIB "short name"). If you want to -include all the directories on your system in the list, use the "/ALL" -parameter. - -If you want to exclude a specific directory from a library (when using the -"/LIB" or "/ALL" parameters), use the "/NOT" switch and follow the switch -with the internal code of the directory to NOT include in the list. If you -wish to exclude multiple directories, you must use multiple "/NOT" switches. - -If you want the list to be appended to an existing file rather than overwrite -the original file, include the "/CAT" switch on your command line. - -The default format for file names is non-padded (FILE.EXT). If you want the -list to have the filename and extension in separate columns (like the file -listings inside Synchronet), use the "/PAD" switch, so that "FILE.EXT" will -be displayed as "FILE .EXT". - -If you want a small header to be placed at the beginning of each directory, -include the "/HDR" switch. The header contains the library short name, the -directory long name, and the total number of files in the directory. - -If you want the credit value of the file (normally the same as the file size) -included in the listing, include the "/CDT" switch on the command line. - -If you want the name of the uploader of each file to be included in the list, -use the "/ULN" switch on the command line. - -If you want the date of the upload (in MM/DD/YY format) to be included in the -list, use the "/ULD" switch on the command line. - -If you want the DOS file date to be included in the file listing, use the -"/DFD" switch on the command line. - -If you want the date of the most recent download (in MM/DD/YY format) to be -included in the list, use the "/DLD" switch on the command line. - -If you want the total number of downloads for each file included in the list, -use the "/DLS" switch on the command line. - -If you DO NOT want the normal (58 character) description included in the file -list, include the "/NOD" switch on the command line. - -If you want the normal description to be excluded only if an extended -description exists, then use the "/NOE" switch. This is useful for generating -file lists from a directory where the original descriptions were imported -from an ASCII file list using ADDFILES. When using this switch, you do not -have to include the "/EXT" switch. - -If you want extended descriptions to be included in the file list, use the -"/EXT" switch on the command line. - -If you want extended descriptions to be automatically justified under the -normal description, include the "/JST" switch on the command line. You do not -have to include the "/EXT" switch if you use this switch. - -If you want the '+' identifiers for extended descriptions to be included in the -list, use the "/+" switch. - -If you want the existence of each file to be verified and non-existent -(offline) files to be indicated by a '-', use the "/-" switch. This switch -should NOT be used for CD-ROM directories. - -To generate a list most closely resembling the internal Synchronet file listing -format, use the "/*" switch. It is the same as including the "/HDR", "/CDT", -"/PAD", "/+", and "/-" switches. - -<b>SBBSNODE Environment Variable:<u> -</u></b> -Prior to running FILELIST you must set the SBBSNODE environment variable to -the path of one of your NODE directories. - -Example: - -<b>SET SBBSNODE=C:\SBBS\NODE1 -</b> -<b>Examples:<u> -</u></b> -<b>FILES.BBS<u> -</u></b> -If you want to create a simple FILES.BBS format listing of your GAMES directory -(and the directory's internal code is "GAMES"), then use the following command -line: - -<b>FILELIST GAMES FILES.BBS -</b> -This command line would create the file "FILES.BBS" in your current DOS -directory with a list of the filenames and descriptions in your Synchronet -GAMES file directory. This file could then be imported into another BBS package -or used by another FILES.BBS compatible program for searching, sorting, moving -or other file maintenance. - -<b>FILELIST.TXT<u> -</u></b> -If you want to create a list of all the files on your BBS that closely matches -the format of the internal Synchronet file listings, use the following command -line: - -<b>FILELIST /* /ALL FILELIST.TXT -</b> -This command line would create the file "FILELIST.TXT" in your current DOS -directory with a list of the filenames, credit values, and descriptions of -all the files in your Synchronet file transfer database. A header for each file -directory would be included and the filenames would be padded with spaces for -easier viewing. - -To generate the same list, but include any extended descriptions as well, add -the "/EXT" switch after the "/ALL" parameter. - - -<b>FILESTAT.TXT<u> -</u></b> -If you wanted to create a list of all the files on your BBS with detailed -statistical information, you may want to use a command line similar to the -following: - -<b>FILELIST /* /ALL /NOD /ULN /ULD /DLD /DLS FILESTAT.TXT -</b> -This command line would create a list of the files with the uploader's name, -the date the file was uploaded, the date of the most recent download, and the -total number of downloads. The "/NOD" switch would cause the descriptions to be -excluded from the list. This list could then be used for statistic reports. -It would be a fairly simple programming task to create a utility that read in -this generated file and created file popularity graphs or a list of the most -valued uploaders. The possibilities are endless. - - -<b>NOTE:<u> -</u></b> -The functionality of creating file lists is not limited to only this utility. -There are commands to generate file lists (of both New files and All files) -from the Temp Directory menu in the Synchronet transfer section. Users can use -these commands to generate lists for download immediately. Also, QWK packets -generated in Synchronet contain a file named "NEWFILES.DAT" - an ASCII text -file containing a list of files uploaded since the user's last logon. - -The main advantages of this utility over the internal file list generation -capabilities of Synchronet are its output format flexibility and compatibility -with the FILES.BBS standard.</pre> -<h2>[15.7] - <a name="DUPEFIND">DUPEFIND</a> - Synchronet Duplicate File -Finder</h2> -<pre>DUPEFIND.EXE is used to find duplicate file names in your Synchronet file -database. This is most useful for CD-ROM installations, where files may be -duplicated on the CD-ROM and your hard disk. Duplicate files can be a waste -of memory and disk space on your BBS. - -Before DUPEFIND is run, you must have your SBBSNODE environment variable set -to point to a valid node directory. Example: - -<b>SET SBBSNODE=C:\SBBS\NODE1 -</b> -DUPEFIND can be run with no parameters to search all of your file directories -in Synchronet for duplicate file names. If you wish to keep this list for -reference, it is a good idea to redirect the output to a file or printer. -Example: - -<b>DUPEFIND > PRN -</b> -You can also specify a starting and ending library number to limit the search -to certain libraries. Example: - -<b>DUPEFIND 1 3 -</b> -would only search file libraries 1 through 3 for duplicate file names.</pre> -<h2>[15.8] - <a name="DELFILES">DELFILES</a> - Removes Files from Synchronet -File Database</h2> -<pre><b> usage: DELFILES <dir_code or * for ALL> [switches] -</b> -switches: /LIB name All directories of specified library - /NOT code Exclude specific directory - /OFF Remove files that are offline (don't exist on disk) - /NOL Remove files with no link (don't exist in database) - /RPT Report findings only (don't delete any files) - -<b>Examples:<u> -</u></b> -If you wanted to remove ALL files that are offline (don't exist on disk) you -would use the command line: - -<b> DELFILES * /OFF -</b> -To remove files that exist on the disk but not in the Synchronet file database -you would use: - -<b> DELFILES * /NOL -</b> -Or to simply remove files that match the criteria specified in the SCFG program -you would use: - -<b> DELFILES * -</b> -The /NOT parameter is used to exclude certain directories: - -<b> DELFILES * /NOT GAMES /NOT TEXT -</b> -Or you can specify a library name rather than a directory name: - -<b> DELFILES /LIB <library name> -</b> -Appending /RPT to the command line will cause DELFILES to generate a report -of files that would have been removed, but it will not actually remove any -files.</pre> -<h2>[15.9] - Synchronet <a name="MLABELS">MLABELS</a> Utility</h2> -<pre>The MLABELS utility is used to generate a list of mailing labels from a -Synchronet user database. Two basic label forms are supported, single -column (e.g. Avery 4145) and double column (e.g. Avery 4143). Specific -groups of users to print labels for can be specified by level, flags, -exemptions, or restrictions. If the BBS is real name based (no aliases), and -the "Company Name" new user question is toggled on in SCFG, then the company -name will appear at the top of the address and an ATTN: <User's Name> can -optionally be added to the end of the address (with the use of the "/A" -command line switch). - -Syntax: - -<b> MLABELS C:\SBBS\DATA\USER [-required] [/options] <output> -</b> -<b>User Data Path<u> -</u></b> -The first parameter is the path to your USER.DAT file. The example given is -the default location of the USER.DAT file ("\SBBS\DATA\USER"). - -<b>Requirements<u> -</u></b> -The second parameter, "-require" is optional. Use this parameter to specify -a security requirement for the users to be included. Multiple "-require" -parameters can be specified, and the syntax is as follows: - --L# set minimum level to # (default is 0) --M# set maximum level to # (default is 99) --F#<flags> set required flags for flag set # (Default is flag set #1) --E<flags> set required exemption flags --R<flags> set required restriction flags - -The syntax of the -require option is identical to the ALLUSERS utility, so -please see the chapter on ALLUSERS for examples of how to use this parameter. - -<b>Options<u> -</u></b> -The next parameter, if specified, are one or more valid option characters -following the slash '/' character. The available option characters are: - -D Double column labels -A Add ATTN: <Alias/Real Name> to the labels - -<b>Output<u> -</u></b> -The last parameter is the name of the output file. If you want the output -to go immediately to the printer, specify "PRN" as the output file. - -Example: - -<b> MLABELS \SBBS\DATA\USER PRN -</b> -If you wish to view the labels before you print them, specify a filename. - -Example: - -<b> MLABELS \SBBS\DATA\USER LABELS.TXT -</b> -<b>Complete Example</b> - -<b>MLABELS \SBBS\DATA\USER -L50 -M59 -FP /DA PRN -</b> -The above command line would create a double wide mailing list containing all -users with security levels between 50 and 59 and flag 'P' from flag set #1, -and send the output directly to the printer, adding "ATTN: <Alias/Name>" -to the end of each label. - -<b>Example label:</b> - -John Doe -555 Main St. -Small Town, Ny 01234 -ATTN: Mr. Anonymous</pre> -<h2>[15.10] - Synchronet <a name="QWKNODES">QWKNODES</a> Utility</h2> -<pre><b>usage: qwknodes [/opts] cmds -</b> - cmds: r = create ROUTE.DAT - u = create USERS.DAT - n = create NODES.DAT - - opts: f = format addresses for nodes that feed from this system - a = append existing output files - t = include tag lines in NODES.DAT - l = include local users in USERS.DAT - m# = maximum message age set to # days - -The QWKNODES utility is used to scan through all the messages in all of your -QWK networked sub-boards and create one or more lists: - -<b>ROUTE.DAT<u> -</u></b> -The DATA\QNET\ROUTE.DAT file is automatically created and maintained by SBBS. -It includes the routing necessary to get netmail from your BBS to any other -QWKnet BBS (using Synchronet's QWKnet extensions) in your QWK network. Entries -are automatically added, modified, and removed (when out-dated). You can use -QWKNODES to create this file (by scanning your QWK networked message bases), -but it isn't normally necessary. - -If you are a QWKnet hub and wish to create a ROUTE.DAT for your QWKnet nodes -(other BBSs that call your BBS for QWKnet messages), you must include the -/F command line option when creating the file (and DO NOT put that ROUTE.DAT -in your DATA\QNET directory as the routing information will be incorrect for -your system). This is a convenience for your QWKnet nodes which allows them to -immediately send routed QWK netmail (without waiting for SBBS to create the -ROUTE.DAT automatically while parsing incoming echomail). - -<b>USERS.DAT<u> -</u></b> -The DATA\QNET\USERS.DAT file (if it exists) is used by SBBS to look-up user -names on other BBSs in your QWK network when attempting to send e-mail to an -unknown user name. The QWKNODES utility must be used to create this file (most -likely via timed event). If the /L command line option is specified when this -file is created, it will include the names of users that posted from YOUR BBS -as well as all others in the network (not of any use to SBBS, but informative -if you wish to create a list of ALL active users in your QWK network). Only -users who are active in the message bases (on any of the BBSs) will appear in -the USERS.DAT file. - -<b>NODES.DAT<u> -</u></b> -While this file is informative (list of all QWKnet nodes that have generated -messages in your QWKnet sub-boards) it is not used by SBBS currently. If the -/T command line option is specified when this file is created, it will include -a copy of each node's tagline in the list in addition to their QWK-ID and -routing details. - -<b>/A<u> -</u></b> -The /A option is used to append (concatenate) an existing output file. If this -option isn't specified any existing output file (ROUTE.DAT, USERS.DAT, or -NODES.DAT) will be truncated and overwritten. - -<b>/M# -</b> -The maximum message age option is used to specify a maximum age of messages -(in days) to include in the list of messages scanned to obtain user/node -/routing information from (example: /M90 to specify a maximum age of 90 days -causing QWKNODES to ignore any messages older than 90 days). The default -behavior is all messages (no maximum age). - -<b><i>Note:</i></b> Output files are created in the current directory. - While it is possible to create all three output files from one - execution of QWKNODES, the U command will cause duplicate entries - in the NODES.DAT and ROUTE.DAT files. So it is best to create the - USERS.DAT in a separate execution of the QWKNODES utility. Example: - - QWKNODES RN -> To create ROUTE.DAT and NODES.DAT - QWKNODES U -> To create USERS.DAT</pre> -<h2>[15.11] - Synchronet <a name="ALLUSERS">ALLUSERS</a> Utility</h2> -<pre>ALLUSERS can allow a sysop to modify the security settings for a large number -of users with one command line. If you're a Synchronet sysop, you may have -found yourself at one time or another going through the internal User Editor -searching for users with a certain flag or exemption and changing their level, -removing an exemption, adding a restriction, etc. The User Editor's ARS search -facility is very quick and flexible, but having to hand modify each user, even -with the use of macros, can be very tedious with a large user database. - -This program attempts to eliminate the monotony of such a task. With a single -command line, you can change security levels, add/remove flags, exemptions, -or restrictions to some or all of the users in your database. The syntax is -pretty simple: - -<b>Syntax<u> -</u></b> -<b>ALLUSERS C:\SBBS\DATA\USER -require /modify -</b> - -<b>User Data Path<u> -</u></b> -The first parameter, "C:\SBBS\DATA\USER" is the directory where your USER.DAT -file is located. The example given is the default location of the USER.DAT -file. If the USER.DAT is in the current directory, the path should be simply -"." for current directory. This parameter is not optional. - -<b>Requirements<u> -</u></b> -The second parameter, "-require" is optional. Use this parameter to specify -a security requirement for the modifications to follow. Multiple "-require" -parameters can be specified, and the syntax is as follows: - --L# set minimum level to # (default is 0) --M# set maximum level to # (default is 99) --F#<flags> set required flags for flag set # (Default is flag set #1) --E<flags> set required exemption flags --R<flags> set required restriction flags - -<b>Examples:</b> - --L20 indicates that only users with a level of 20 or higher will be modified --M80 indicates that only users with a level of 80 or lower will be modified --FC indicates that only users with flag 'C' from flag set #1 will be modified --F3G indicates that only users with flag 'G' from flag set #3 will be modified --RA indicates that only users with the 'A' restriction will be modified - -If multiple requirement parameters are specified, they must each begin with -a dash '-' character and be separated by at least one space. - -<b>Examples:</b> - --L50 -M59 indicates that only users between level 50 and 59 will be modified --RB -F2M indicates that only users with the 'B' restriction and flag 'M' in - flag set #2 will be modified - -Multiple required flags may be specified as well. - -<b>Example:</b> - --F4AC indicates that only users with both the 'A' and 'C' flags from - flag set #4 will be modified --EPLM indicates that only users with the 'P', 'L', and 'M' exemptions - will be modified - -<b>Modifications -</b> -Next on the command line are one or more modification parameters. Each -modification parameter begins with the slash '/' character. The available -modification parameters are as follows: - -/L# set level to # -/F#[+|-]<flags> add or remove flags from flag set # -/E[+|-]<flags> add or remove exemption flags -/R[+|-]<flags> add or remove restriction flags - -<b>Examples:</b> - -/L20 indicates that all users' levels will be changed to 20 -/FA indicates that flag 'A' from flag set #1 will be added to all users -/F3-G indicates that flag 'G' will be removed from flag set #3 for all users -/E+L indicates that exemption 'L' will be added to all users -/R-N indicates that restriction 'N' will be removed from all users - -Flag set #1 is the default, so "/F1+A" and "/F+A" are equivalent. -Addition of flags (+) is the default, so "/F+A" and "/FA" are equivalent. -Flags and parameters are not case sensitive, so "/FA" and "/fa" are equivalent. - -Multiple modification parameters can be used. - -<b>Example:</b> - -/L40 /F2-Z indicates that all users will be set to level 40 and have flag - 'Z' from flag set #2 removed - -Multiple flags per modification may be specified. - -<b>Example:</b> - -/RAB indicates that both 'A' and 'B' restrictions will be added to - all users. - -<b>Complete Examples</b> - -To change all level 20 users to level 30, use the following command line: - -<b>ALLUSERS C:\SBBS\DATA\USER -L20 -M20 /L30 -</b> -To give all QWKnet node users the 'M' exemption, use the following command: - -<b>ALLUSERS C:\SBBS\DATA\USER -RQ /EM -</b> -To give all users below level 90, the 'B' restriction, use the following: - -<b>ALLUSERS C:\SBBS\DATA\USER -M89 /RB -</b> -To give all users with level 50 or higher, the 'M' and 'L' exemptions: - -<b>ALLUSERS C:\SBBS\DATA\USER -L50 /EML -</b> -To remove flag 'C' from flag sets #1 and #2 from all users: - -<b>ALLUSERS C:\SBBS\DATA\USER /F1-C /F2-C</b></pre> -<h2>[15.12] - Synchronet <a name="AUTONODE">AUTONODE</a> Utility</h2> -<pre>The AUTONODE utility is used for automatically finding an available local -node for logon and running that node. You set the first local node number -in SCFG->System->Advanced Options->First Local Auto-Node. - -In order for the AUTONODE utility to run, you must first set the SBBSCTRL -and SBBSNODE environment variables. Add the lines: - -<b>SET SBBSCTRL=C:\SBBS\CTRL -SET SBBSNODE=C:\SBBS\NODE1 -</b> -to your AUTOEXEC.BAT file. If your CTRL or NODE1 directories are in a different -locations, then specify the correct paths accordingly. - -This utility is useful for systems that have more than one local node. This -eliminates the need for those users to change into an unused node directory -and run SBBS. It will automatically find the first unused local node and -take them to the logon prompt. When they logoff, they will return to the -DOS prompt. - -If for some reason, you do not wish the user to automatically go to a logon -prompt or to exit back to DOS after logoff, you can specify which command -line to use when running SBBS. The default is "SBBS L Q", which tells -Synchronet to take the user straight to the logon prompt and then quit back -to DOS.</pre> -<h2>[15.13] - Synchronet <a name="NODE">Node</a> Display/Control Utility</h2> -<pre>The NODE utility can be used to display or control the status of nodes from -the DOS prompt or via batch files. - -<b>usage: node [/debug] [action [on|off]] [node numbers] [...] -</b> -actions (default is list): - -list = list status -anon = anonymous user -lock = locked -intr = interrupt -down = shut-down -rerun = rerun -event = run event -nopage = page disable -noalerts = activity alerts disable -status=# = set status value (definition of status values at end of section) -useron=# = set useron number -action=# = set action value (definition of action values at end of section) -errors=# = set error counter -conn=# = set connection value -misc=# = set misc value -aux=# = set aux value -extaux=# = set extended aux value - -Before the NODE utility can be run, the SBBSCTRL environment variable must -be set to point to your CTRL directory. Example: - -<b>SET SBBSCTRL=C:\SBBS\CTRL</b> - -Place this line in your AUTOEXEC.BAT file to automatically set this variable -at boot-up. It is necessary for the NODE utility to find the shared node -control files. If your CTRL directory is in a different location, use the -correct path for the SET command. - -If you want to be able to run the NODE utility from any directory, you must -have the NODE.COM program in one of your DOS search directories. Either copy -this file into a directory already in your DOS search path, or add your -Synchronet EXEC directory to your search path in your AUTOEXEC.BAT. Example: - -<b>SET PATH=C:\DOS;C:\UTIL;C:\SBBS\EXEC -</b> -(DOS and UTIL directory are included for example only). - -<b>Running NODE</b> - -To run the NODE utility, you must type the word "NODE", an action (ex: "LOCK"), -then a list of nodes to take the action on (ex: "1 2 4 5"). If no node numbers -are specified, it is assumed you wanted to perform the action on ALL nodes. - -Some actions can have an option "ON" or "OFF" state specified. Typing "NODE -LOCK 1" would toggle the "locked" state of node 1. If it were previously off, -it would be set to on. To be sure you are setting the state to either on or -off rather than toggling, you may specify on or off (e.g. "NODE LOCK ON 1" -would set the locked state of node 1 to on). - -Some actions are setting a value for the node status. These actions are listed -with "=#" after the action word. This indicates that you must specify a numeric -value for that status option (e.g. "NODE USERON=1 5" would set the current -user number on node 5 to 1). - -The optional "/debug" switch can be used to view the current numeric values -associated with the node status. - -<b>Example Usage</b> - -Example #1: To list the status of all your nodes, type - -<b>NODE LIST</b> - -Example #2: To lock node 1, type - -<b>NODE LOCK ON 1</b> - -Example #3: To unlock nodes 1 and 2, type - -<b>NODE LOCK OFF 1 2</b> - -Example #4: To set the status of node 3 to "Offline", type - -<b>NODE STATUS=5 3 -</b> -Example #5: To interrupt and lock node 4, type - -<b>NODE INTR ON 4 LOCK ON 4</b> - -Example #6: To clear the error counter of all nodes, type - -<b>NODE ERRORS=0</b> - -Example #7: To toggle the "rerun" status of all nodes, type - -<b>NODE RERUN</b> - -Example #8: To down node 2, type - -<b>NODE DOWN ON 2</b> - -<b>Definition of Numeric Values</b> - -Possible Node Status Values: - -0 Waiting for call -1 At logon prompt -2 New user applying for access -3 User online -4 User online in quiet mode -5 Offline -6 Networking -7 Waiting for all nodes to become inactive before running timed event -8 Running timed event -9 Waiting for timed event node to finish running event - -<b>Possible Node Action Values:</b> - -0 Main Prompt -1 Reading Messages -2 Reading Mail -3 Sending Mail -4 Reading G-Files -5 Reading Sent Mail -6 Posting Message -7 Auto-message -8 Running External Program (aux=program number) -9 Main Defaults Section -10 Transfer Prompt -11 Downloading File (aux=estimated time of transfer completion) -12 Uploading File -13 Bi-directional Transfer (aux=estimated time of transfer completion) -14 Listing Files -15 Logging on -16 In Local Chat with Sysop -17 In Multi-Chat with Other Nodes -18 In Local Chat with Guru -19 In Chat Section -20 Sysop Activity -21 Transferring QWK packet -22 In Private Chat (aux=node chatting with) -23 Paging another node for Private Chat (aux=node being paged) -24 Retrieving file from a sequential device (aux=device num) - -<b>Bits Used in Node Misc:</b> - -0 Anonymous User -1 Locked for sysops only -2 Interrupted - hang up -3 Message is waiting for user -4 Paging disabled -5 Activity Alert disabled -6 User data has been updated by another node -7 Re-run this node when logoff -8 Must run node event after logoff -9 Down this node after logoff -10 Reset private chat -11 Message is waiting for node</pre> -<h2>[15.14] - <a name="UTI">UTI</a> Driver</h2> -<pre>This UTI driver complies with UTI Driver Specification Rev 2.1 by Kip Compton. -This driver is for use with PostLink v1.05+ and possibly MegaMail. - -Copy the UTI driver files: - - UTIVER.EXE Returns UTI version number (2) - UTILIST.EXE Generates list of conferences (sub-boards) - UTIHIGH.EXE Returns highest message number in a conference - UTILSTRD.EXE Generates list of message pointers for a user - UTIIMPRT.EXE Imports messages into a conference - UTIEXPRT.EXE Exports messages from a conference - -into your PostLink directory, or another directory that is in your DOS search -path. - -The UTIDOOR.EXE program is not part of this driver set, since Synchronet can -generate a UTIDOOR.TXT file internally. - -You may need to know that the conference identifiers, as well as the name of -each conference, is the same as the Synchronet internal code for each -conference. This allows you to modify your message base configuration in -Synchronet without having to immediately "Update" the network or mail software -conference list to avoid a catastrophe. However, you should still "Update" the -network or mail software to avoid configuration confusion - especially when -deleting sub-boards. - -<b>ERROR LEVELS</b> - -If one of the UTI driver programs exits with an error level, you can define -the error with the following table. If the UTI driver program exits with an -unlisted error level, please contact Digital Dynamics. - -<b><u>Level Description</u></b> -1 Syntax error on command line -2 Cannot open/create UTI text file -3 Memory allocation error -4 Too many messages in a conference to import -5 Cannot open Synchronet message data file -6 Cannot open Synchronet message index file -7 Unrecognized Synchronet sub-board code -8 Cannot open Synchronet user name data file -9 Cannot find user name in Synchronet user database -10 Cannot open Synchronet message pointer index - - -If you get an error 2, 5, 6, 8, or 10, you may want to double check the number -of files handles you are reserving in your CONFIG.SYS file (FILES=# statement) -and try increasing it. - -If you get an error 3, then you need to make more DOS memory available to the -UTI driver and the parent program (i.e. PostLink).</pre> -<h2>[15.15] - <a name="SLOG">System/Node Statistics Log</a> Viewing Utility</h2> -<pre><b>Usage: slog [path] -</b> -where path is the directory where CSTS.DAB is located. If your SBBSCTRL -environment variable is set and no path is specified, it will use the system's -statistics file located in the CTRL directory. To set your SBBSCTRL environment -variable, add the following line to your AUTOEXEC.BAT: - -<b>SET SBBSCTRL=C:\SBBS\CTRL</b> - -Make sure the path is the correct path for the Synchronet CTRL directory in -your configuration. - -If you want to list the statistics of a specific node on your system (same as -using the ;NLOG command from the main menu, or the 'N' WFC command), specify -the path for that node on the command line. Example: - -<b>SLOG C:\SBBS\NODE1</b> - -If a path is not specified and the SBBSCTRL environment variable is not set, -the current directory will be searched for CSTS.DAB. - -The output of SLOG can be redirected to a file or printer for easy viewing. -Example: - -<b>SLOG > PRN</b> - -or - -<b>SLOG > SLOG.TXT</b></pre> -<h2>[15.16] - <a name="DSTSEDIT">Daily Statistics Editor Documentation</a></h2> -<pre><b>Description:</b> - -DSTSEDIT (Daily Statistics Editor) is used to edit the statistic values of your -BBS that are stored in the DSTS.DAB file in your CTRL directory. There is also -a separate DSTS.DAB file in each node directory which stores the statistic -values for that individual node. This utility can be used to edit either of the -two statistic types: System or Node. - -<b>Usage:</b> - -To edit your system's statistics, you can either run DSTSEDIT with your CTRL -directory as the current directory, or run DSTSEDIT with the path of the -CTRL directory as an argument. - - Example: <b>DSTSEDIT C:\SBBS\CTRL</b> - -To edit an individual node's statistics, you can either run DSTSEDIT with the -node's directory as the current directory, or run DSTSEDIT with the node's -directory as an argument. - - Example: <b>DSTSEDIT <a href="file:///C:/SBBS/NODE1">C:\SBBS\NODE1</a></b></pre> -<h2>[15.17] - <a name="TOTALS">TOTALS</a>: External Programs Credit Gain/Loss -Log Totaling Utility</h2> -<pre>The TOTALS.COM utility is used to generate a total gain/loss of multiple log -files created by SBBS external programs that adjust user credits and log the -adjustments in text files. Each file containing one line that contains the -gain/loss value in credits. It is a positive value if it had net winnings -(took more credits than it gave), and negative value if it had a net loss -(gave away more credits than it took). The Synchronet external programs that -currently generate such logs (by running the program with the /L option) are -Synchronet Blackjack, Dice War, and Domain Poker. - -<b>usage:</b> <b>totals <log files [...]> -</b> - examples: - - <b> totals *.log - totals 06*.log 07*.log 080192.log</b></pre> -<h2>[15.17] - <a name="ANS2MSG">ANS2MSG</a></h2> -<pre>ANSI to Synchronet Ctrl-A message format conversion utility - -This utility will convert basic non-animated ANSI files into Synchronet Ctrl-A -code files that can be displayed to color or monochrome ansi users with -attractive results as well as non-ansi users. This allows you to use an ANSI -drawing program (such as TheDraw) to create your menus in ANSI and convert the -ANSI file to Ctrl-A message format for your .ASC or .MSG version. Or you can -use the converted file for all users by keeping the ANSI (.ANS) version in -a directory other than TEXT\MENU. - -If, for example, you create a main menu with an ANSI drawing program that you -want your ASCII and monochrome ANSI users to see with attractive output, use -ANS2MSG to create the .MON and .ASC versions. - -Type: <b>ANS2MSG MAIN.ANS MAIN.MON</b> -in your TEXT\MENU directory to create the monochrome version. - -Type: <b>ANS2MSG MAIN.ANS MAIN.ASC</b> -in your TEXT\MENU directory to create the ASCII version. - -If you rename MAIN.ANS or move into a directory other than TEXT\MENU, then -you will not need the .MON version as the .ASC version will be used for all -terminal types. - -This utility is also useful for creating colorful system, newuser, feedback -and other Synchronet .MSG files for display. For example, create -TEXT\SYSTEM.ANS with your favorite ANSI editor and then convert to .MSG by -typing: <b>ANS2MSG SYSTEM.ANS SYSTEM.MSG</b> - -Be aware that ANSI animation codes are NOT supported since there aren't Ctrl-A -equivalents. The following ANSI codes (preceded by <ESC>[) are supported: - -<b>ANSI Code Ctrl-A Code Explanation (* indicates not supported by IBM)</b> -2J L Clear Screen -#C 7Fh-FFh Move cursor right # columns -0m N Normal attribute -1m H High intensity -2m N Low intensity * -3m I Italic * -4m I Underline * -5m I Blink -6m I Rapid Blink * -7m H Reverse Video * -8m E Concealed text * -30m K Foreground black -31m R Foreground red -32m G Foreground green -33m Y Foreground yellow -34m B Foreground blue -35m M Foreground magenta -36m C Foreground cyan -37m W Foreground white -40m 0 Foreground black -41m 1 Foreground red -42m 2 Foreground green -43m 3 Foreground yellow -44m 4 Foreground blue -45m 5 Foreground magenta -46m 6 Foreground cyan -47m 7 Foreground white</pre> -<h2>[15.18] - <a name="MSG2ANS">MSG2ANS</a></h2> -<pre>Converts Synchronet Ctrl-A file to ANSI escape sequences. - -This utility allows you to convert files that use Ctrl-A codes into ANSI files. -(the opposite of the ANS2MSG utility). - -The syntax is: <b>MSG2ANS infile.ext outfile.ext</b> - -The extension for the input file will most likely be .ASC or .MSG and the -output file should be .ANS. - -This utility is also useful for viewing files with Synchronet Ctrl-A codes from -the DOS prompt. - -Example: <b>MSG2ANS MAIN.ASC CON</b> - -This will read from the Ctrl-A file MAIN.ASC and write to your screen using -ANSI escape sequences.</pre> -<p><a href="#top"><b>Back to Top</b></a></p> -<!--webbot bot="Include" U-Include="_borders/bottom.htm" TAG="BODY" startspan --> - -<hr> -<p><b><a href="http://www.synchro.net/copyright.html">Copyright</a> � 2000 by </b> <a href="http://www.synchro.net/author.htm"><b>Rob Swindell</b><br> -</a> - -<a href="http://www.synchro.net"><font size="2"><br> -Synchronet BBS Software</font></a> <font size="2"> (Synchronet) -Version 3 is comprised of several documentation,<br> -library, executable, and <a href="http://www.synchro.net/source.html">source code</a> -files, all of which are covered by the<a href="http://www.fsf.org/copyleft/gpl.html"> -<br> -GNU General Public License</a> with the exception of the following portions -covered by<br> -the <a href="http://www.fsf.org/copyleft/lesser.html">GNU Lesser General Public License</a>: -SMBLIB and XSDK.<br> -<br> -Synchronet Version 2 (for DOS and OS/2) and its source code was released to the<a href="http://www.fsf.org/philosophy/categories.html#PublicDomainSoftware"> -<br> -Public Domain</a> by <a href="ftp://vert.synchro.net/main/sbbs/manifest.txt">Digital Dynamics</a> -in 1997 and remains Public Domain software today.<br> -Synchronet Version 3 is not Public Domain software.</font></p> -<p align="left"><font size="2"><a href="http://www.synchro.net/author.html">Rob Swindell<br> -</a>PO Box 501<br>Yorba Linda, CA 92885<a href="http://www.synchro.net"><br> -http://www.synchro.net</a> - -</font></p> -<p align="left"><font size="2">For the complete Copyright Information please -read the <a href="http://www.synchro.net/copyright.html">Copyright Documentation</a> -.</font></p> - -<!--webbot bot="Include" endspan i-checksum="55766" --> - -</body> - -</html> diff --git a/docs/v200_new.txt b/docs/v200_new.txt deleted file mode 100644 index 5b1256b5be..0000000000 --- a/docs/v200_new.txt +++ /dev/null @@ -1,174 +0,0 @@ - What's new in Synchronet BBS Version 2.00 Revision A - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Programmable Command and Menu Structure -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -o Multiple command 'shells' can be available for you and your users with - configurable security access to each -o Includes Baja {tm} shell/module compiler free ($50 value) -o Shells can dynamically load and execute third party Baja modules or - external DOS applications/doors automatically or by command -o Stock command shells include emulations of other BBS packages and a - simplified beginner/first-time user shell -o Shells are easily modified and recompiled for your user interface preferences - - -Communications -~~~~~~~~~~~~~~ -o FOSSIL, PC BIOS Int 14h, and PS/2 BIOS Int 14h communications driver support - allows the use of virtually any multiport serial card (Intelligent - or Non-Intelligent), shared IRQ cards, and non-UART serial devices -o DTE rates to 115.2K -o Support for manual hang up (for devices/interfaces lacking DTR support) -o 12 new high-speed (19.2K-28.8K) modems added to auto-configuration list -o Supra/Practical Peripherals Caller ID formats supported -o Configurable number of rings to answer after -o Invalid/Unrecognized result codes are now logged as critical errors -o Intelligent answer function detects and recovers from ring-interrupted answer - sequences -o Specific modem result codes can be ignored or defined as "FAX" - - -General -~~~~~~~ -o New configuration file format (.CNF) for faster BBS initialization, lower - storage space requirments, and future expandability -o Significant reduction in memory requirements for SCFG allowing for larger - quantities of sub-boards, directories, etc. -o "Sticky" menus in SCFG for sysop convenience when editing long lists -o Local "beep" replacement to eliminate performance over-head and decrease - the sysop annoyance factor -o Optional critical error siren -o Sysop Manual overhaul/additions (from 188 pages to 273 pages) including - many more examples, screen captures, explanatory text, and an index -o Automatic "maximum" adjustment eliminates need for manual adjustment for - maximum values in SCFG -o Maximum configurable options per SCFG menu increased from 254 to 500 - (raising the ceiling) -o Addition of WWIV Color Codes 8 and 9 -o Node activity text can be overridden to include any text and optional - user variables (including age, gender, location, etc.) -o Hot Keys are now optional -o New user default setting screen can be toggled off by sysop -o Callers log now contains time logged on -o User listings now contain date last on -o Username "look-up" available - - -Security -~~~~~~~~ -o Current message group, sub-board, file library, and file directory ARS - parameters -o RIP and ANSI ARS parameters to limit access based on terminal support -o Disallows invalid birth dates, incomplete phone numbers, single word - real names, locations without a state, etc. -o Users can be set to expired account values when out-of-time -o Quick Validation Hot-Keys can be disabled (default) -o Configurable maximum posts per day and E-mails per day based on user level - - -External Programs -~~~~~~~~~~~~~~~~~ -o Ability to swap out of memory almost entirely for any executable from - anywhere in the BBS to XMS, EMS, Extended Memory or Disk - (no more "Shrinking" or use of SHROOM) -o Up to 500 configurable timed external events with optional exclusive - execution and shortening of users' time online -o Online External Program (door) sections for organizational purposes - and easier manuverability (Group/Sub principle) -o RIP and ANSI ARS parameters to limit access based on terminal support -o MODUSER.DAT supports simultaneous addition and removal of flags - - -File Transfers -~~~~~~~~~~~~~~ -o New storage format lowers storage space requirements, and speeds up searches -o First line of FILE_ID.DIZ or DESC.SDI imported into short description -o Viewable, Testable, and Extractable File Types can have ARS parameters - specified for limiting to specific users or file areas -o Download Events for modifying files (e.g. adding comments) just before - download (with attached ARS) -o Up to 500 Compressable File Types can be defined for QWK packet creation - and temp archives (with attached ARS, of course) -o ARS attachment to Transfer Protocols -o Up to 500 Alternate File Paths -o Directory operators definable per directory via ARS -o Exempted users can be defined for each directory via ARS -o Credit percentages configurable on a per-directory basis -o Each directory's data can be stored on any drive, in any DOS directory -o Upload semaphore files supported on a per-directory basis -o Sysop can allow blind (unsolicited) batch/bi-dir uploads -o Uploads can be forced rated using any alphabetic rating scheme -o Individual directories can be eliminated from duplicate upload name search - - -Message Base -~~~~~~~~~~~~ -o New storage format lower storage space requirements, increases maximum - storage capacity, lowers memory requirements, and speeds up - import/export (Download SMB_1*.ZIP for details) -o Support for moderated sub-boards (via ARS) -o Sub-board operators definable per sub-board via ARS -o ARS to restrict users from reading a sub-board while still seeing it -o Message data can be stored on any drive, in any directory, on a per-sub basis -o Messages (including E-mail) are purgable by age (via SMBUTIL) -o Optional and configurable duplicate message checking -o Operator/Sub-op messages can be automatically permanent -o Operator/Sub-op can move messages between areas -o Read messages can be automatically purged -o Self-packing and Fast Allocation storage methods available for each sub -o Network Gateway Security -o Separate EchoMail semaphore file per sub-board -o Message pointers can be set by date or number of messages from end -o Bulk E-mail capabilities (via ARS or user names) -o Start message number specified for message text searches -o Received mail can be forwarded to multiple users -o Message listings include "To" user as well as "from" and "subject" - - -QWK -~~~ -o Incredible speed increase (via SMB) -o Multiple archive formats supported (user selectable) -o Automatic inclusion/exclusion of file attachments -o Optional inclusion of Un-read, All, or No E-mail -o Optional automatic deletion of E-mail (user configured) -o Optional exclusion of messages from user -o Scan configuration and pointer adjustment from QWK menu -o Inclusion of new files list is optional (user configured) -o NetMail can be sent by sending to "user@addr" -o New conference numbering scheme to allow for more subs per group -o New QWK control messages: YOURS, RESET, RESETALL, FILES, ATTACH, MAIL, OWN - , DELMAIL, and CTRL-A - - -Networking -~~~~~~~~~~ -o Up to 500 FidoNet AKAs supported -o Optional use of "Default Outbound Address" for Fido/UUCP gateway convenience -o Separate NetMail and EchoMail semaphore files -o EchoMail Gateway security to eliminate unintentional gating -o Pending QWKnet REP packets appended with new messages before call-out -o Internal support for outbound Internet mail storage with file attachments - (SMB compliant UUCP gateway required) -o Public message base specification (SMB) insures 3rd party developer interest - and support for EchoMail programs, gateways, editors, offline readers, - etc. - - -Chat -~~~~ -o Multiple Artificial Gurus - can be separately attached to different chat - channels -o Multiple MultiNode Chat Action sets, separately attached to different chat - channels -o Real-time InterNode Telegrams with store-and-forward if user is offline -o Real-time key-by-key chat available from anywhere via Ctrl-P -o Whisper command in MultiNode Chat -o InterNode messages can be sent by node number, user number, user name, or - user chat handle (with search for partial names) -o Chat options (echo, action commands, pagability, action alerts) are now saved - between logons - -/* End of V200A.NEW */ - diff --git a/docs/v210_new.txt b/docs/v210_new.txt deleted file mode 100644 index bd09e9202d..0000000000 --- a/docs/v210_new.txt +++ /dev/null @@ -1,173 +0,0 @@ - What's new in Synchronet BBS Version 2.10 Revision A - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Estimated Date of Release: 02/17/95 - -General -~~~~~~~ -o New file sharing method for user database (USER.DAT) significantly improves - performance on active multinode systems - -o Systems with large quantities of message and files areas will see - significantly more free memory inside the BBS with this version - - -Message Base -~~~~~~~~~~~~ -o SMB level III implementation offers optional real-time message base - compression/decompression using LZH algorithm for up to 50% savings on - disk space (potentially hundreds of megabytes on some systems)! - -o New Hyper Allocation storage method (defined in v1.20 of the SMB - specification), twice as fast as "Fast Allocation"! - -o Innovative QWK NetMail technology using dynamically maintained route map - Send NetMail to User@BBSID from ANY DOVE-Net system (using v2.10) - (i.e. "Digital Man@VERT" to send me routed NetMail) No nodelist hassle! - -o Automatic detection of circular paths for QWK EchoMail messages (duplicates) - -o Optional QWKnet user list (DATA\QNET\USERS.DAT) for automatic address look-up - -o Ability to force QWKnet call-outs from within the BBS (;CALL HUBID) and - from any node WFC screen - -o Internet mail replies from Reading Messages prompt for UUCP gateways - (i.e. NetXpress) - -o New memory compression allows for significantly greater number of configured - message areas in Synchronet - -o UTI driver supports long names (>25 chars) for internet addresses - -o When quoting messages, tag/origin lines are automatically not quoted - -o Out-bound file attachments supported for both FidoNet and Internet NetMail - -o 'Direct' FidoNet NetMail status now supported in SCFG - -o 'To' field for FidoNet EchoMail now supports up to 35 characters - -o 'To' field for PostLink messages now supports up to 60 characters - -o 'Subject' field for PostLink messages now supports up to 70 characters - -o Crash, Return Receipt, and File Request over-rides now supported in off-line - FidoNet NetMail - -o Attempted e-mail to user@addr will automatically be interpreted as NetMail - - -Security -~~~~~~~~ -o Logon via user number can be disabled - -o Optionally allow logons via real name or alias - -o Optionally prompt for password for all logon attempts - -o Keyboard buffer flushed after execution of external programs - -o Extended ASCII char 255 stripped from strings (would appear as space) - - -Chat -~~~~ -o Automatic split-screen private chat for ANSI users with 24 or more rows - -o Internode messages received and displayed before logoff when user runs - out of time - - -External Programs -~~~~~~~~~~~~~~~~~ -o External editors can have drop files created automatically - -o Baja modules can be executed as doors in place of DOS executables - -o External online programs can give the user extra time while in use - -o External online programs can be configured to suspend BBS time while in use - -o DOOR.SYS is created with user credits (in Kbytes) on line 31 (Download limit) - -o If a DOOR.SYS external program is set to modify user data, lines 29 and 30 - are read back in to update files/bytes downloaded and subtract credits - -o External programs can have Synchronet immediately hang-up upon return - -o DORINFO1.DEF (always 1 instead of node #) added to available drop file list - -o New software development kit (XSDK v2.30) has improved incorporation of - intelligent variable time-slicing (IVT) under multitaskers and other - enhancements for Synchronet application developers - - -File Transfers -~~~~~~~~~~~~~~ -o Extended descriptions optionally displayed in normal file listings (&E) - -o Batch flagging prompt redisplays page after operations - -o Batch flagging prompt allows (P)revious page command to move backwards - -o Batch flagging prompt has help bar at top of screen for list command - -o Batch flagging prompt has help menu (?) for available commands - -o Batch flagging prompt can display library and directory name - -o TYPE.BIN included to be used as a viewable file type command for text files - -o New-file scan date/time defaults to last new-scan, not from last logon - -o Duplicate files (already in database) are rejected on blind uploads - -o New memory compression allows for significantly greater number of configured - file areas in Synchronet - -o New toggle option to allow the inclusion or exclusion of each directory in - the Auto-ADDFILES search and import of FILES.BBS (for FDNs or CDROMs) - -o New toggle option to allow the inclusion or exclusion of each directory in - users' new file scans (for CDROMs) - - -Programmability -~~~~~~~~~~~~~~~ -o Baja modules can be automatically loaded during logon, logoff, or new users - -o Baja modules can be used in place of any executable command line in SCFG - -o New Baja function PRINTFILE_STR used to create TYPE.BIN module - -o New Baja function REPLACE_TEXT used to replace TEXT.DAT strings in shells - -o New Baja functions SET_USER_LEVEL, TOGGLE_USER_FLAG, and SET_USER_STRING - used to change or adjust user flags, exemptions, restrictions, level, - name, address, etc. - -o New Baja functions FILE_ADD_BATCH and FILE_CLEAR_BATCH allow batch download - queue manipulation - -o New Baja functions GETLINE, GETNUM, and GET_TEMPLATE for extended control - over user input - - -Miscellaneous -~~~~~~~~~~~~~ -o Support for auto-detecting FAX/Modems that return "+FCON" on FAX connections. - -o Supra Caller-ID NAME and NMBR strings can be in either order. - - -Revisions Since v2.00a -~~~~~~~~~~~~~~~~~~~~~~ -o Direct QWK logons with normal user accounts by prepending '*' to the username - -o SCFG uses a modem configuration database that is user extensible - -o Toggle option for each sub-board to default ON or OFF in users' personal - (as opposed to new) message scans - - -/* End of V210A.NEW */ diff --git a/docs/v211_new.txt b/docs/v211_new.txt deleted file mode 100644 index f770410a7e..0000000000 --- a/docs/v211_new.txt +++ /dev/null @@ -1,130 +0,0 @@ - What's new in Synchronet BBS Version 2.11 Revision A - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -General -~~~~~~~ -o Overlay buffer manipulation released 32k of more free memory in SCFG and - 40k of more free memory in SBBS -o Forcing the internal daily event ("SBBS F") when using a front-end mailer - is no longer necessary -o Pending QWKnet and PostLink call-outs are performed immediately after user - logoff, even when launched from a front-end mailer -o WFC statistics retrieval many times faster when "Total Msgs/Files on WFC" - toggled off in SCFG node toggles -o User inactivity warning and auto-logoff can be disabled for local logons - in SCFG node toggles -o Local system security can require the input of the system password for WFC - and Alt-key commmands -o Configuration program (SCFG) support multiple levels of automated backup of - config files -o Local keyboard can be completely disabled for the ultimate in local security - - -New Baja Functions -~~~~~~~~~~~~~~~~~~ -COMPARE_NODE_MISC Check miscellaneous node attributes -COMPARE_USER_CHAT Check user chat settings -COMPARE_USER_QWK Check user QWK settings -TOGGLE_USER_CHAT Change user chat settings -TOGGLE_USER_QWK Change user QWK settings -SELECT_SHELL Allow user to select command shell from list -SET_SHELL Set the user's command shell to specific shell -SELECT_EDITOR Allow user to select external editor from list -SET_EDITOR Set the user's extrnal editor to a specific editor -MSG_NEW_SCAN_SUB Force the new scan of the current sub-board -MSG_SET_GROUP Set the current message group by short name -FILE_SET_LIBRARY Set the current file library by short name - - -Enhanced Baja Functions -~~~~~~~~~~~~~~~~~~~~~~~ -SET_USER_STRING Checks for duplicates, proper syntax, and trash can -REPLACE_TEXT Can use command line specifiers in string argument -LOG " " -PRINT " " -PRINT_LOCAL " " -PRINT_REMOTE " " -PRINTFILE " " -PRINTFILE_REMOTE " " -PRINTFILE_LOCAL " " -CHKFILE " " -EXEC_BIN " " -YES_NO " " -NO_YES " " -MENU " " -SETSTR " " -SET_MENU_DIR " " -SET_MENU_FILE " " -COMPARE_STR " " - - -New ARS Parameters -~~~~~~~~~~~~~~~~~~ -RANDOM Random number generation for random access/Baja control -LASTON Number of days since last logon -LOGONS Total number of logons - - -New Command Line Specifiers -~~~~~~~~~~~~~~~~~~~~~~~~~~~ -%o Sysop name -%q System QWK ID -%x Internal code of user's command shell -%* Node number 0 padded to 3 digits -%1 User number -%2 User number 0 padded to 2 digits -%3 User number 0 padded to 3 digits -%4 etc.. - - -Message Base -~~~~~~~~~~~~ -o Optional Daily QWK Pre-packing (for any user accounts) -o The automatic forwarding of e-mail to NetMail can be specifically allowed - or disallowed in SCFG -o New toggle option in SCFG to automatically kill e-mail after it has been read -o QuickBBS/RemoteAccess MSGTMP style external editors now internally supported -o Unix style (sole LF for newline) external editors now internally supported -o When posting on a sub-board, any user added tear lines are changed to "-+-" -o Searches for Personal Messages will now include both Real Name and Alias - matches, regardless of how the sub-board is configured in SCFG -o Searches for Personal Messages now significantly faster -o Message threading now many times faster -o Un-read Personal Messages will display with an '!' in message title lists -o Posting to a username on a local-only sub-board will require a valid username -o QWK indexes and control files can be toggled off for smaller/faster packets -o Synchronet QWK extensions (@VIA and @TZ) can be toggled from the QWK menu - or via QWK control messages -o Importing and exporting of Area Files: Synchronet SUBS.TXT format, three - flavors of AREAS.BBS, and FIDONET.NA format -o QWK control messages are now echoed to the user when importing REP packets - -QWK Networking -~~~~~~~~~~~~~~ -o HUBID.QW0 through .QW9 will be imported in addition to .QWK -o Routed QWK netmail will automatically take shortest route - - -File Transfers -~~~~~~~~~~~~~~ -o Externalized storage (environment variables SBBSFILENAME and SBBSFILEDESC - and files SBBSFILE.NAM and SBBSFILE.DES) of uploaded file names and - descriptions allows upload processors to convert/rename files, modify - file descriptions, or auto-hatch files into file distribution networks -o Extended file descriptions in file listings will not be truncated and listed - twice on the same screen -o Importing and exporting of Areas Files: Synchronet DIRS.TXT format and - FILEBONE.NA format -o ADDFILES v2.12 adds "/S" option to search directories for files and import - them without requiring a file listing (FILES.BBS) - - -Chat -~~~~ -o Split-screen private node-to-node chat now has fake cursor in top window -o Ctrl-P and Ctrl-U are active while in private chat -o Notification of awaiting messages and telegrams while in split-screen chat -o Split-screen chat can be toggled off/on by users from the Chat menu - - -/* End of V211A.NEW */ diff --git a/docs/v220_new.txt b/docs/v220_new.txt deleted file mode 100644 index d934c74965..0000000000 --- a/docs/v220_new.txt +++ /dev/null @@ -1,162 +0,0 @@ - What's new in Synchronet BBS Version 2.20 - ========================================= - -General -~~~~~~~ -o Support for WIP (Windows Interface Protocol) terminal programs (DCTERMW.ZIP) - by automatically detecting WIP terminals and displaying WIP menus -o Each security level can be set to expire to a specific security level, the - default expired level, or a specific quick-validation set -o Loadable module can be executed during daily maintenance for each expired - user enabling custom expiration options/features -o New exemption (E) keeps specific users from expiring when their time runs out - if the "Expire when out-of-time" option has been enabled in SCFG -o Expired users are written to the detailed log with a !% line for each user -o New SBBS command line switch (o) to force all pending events to execute - and then immediately exit (for use with Front-end mailers) -o New system toggle to disallow credit to minute conversions -o Timed events can be forced by creating a semaphore file in the DATA directory - (similar to forced QWKnet call-outs) -o Number of seconds between checks for node semaphores (down/rerun/event/etc) - and seconds between checks for waiting for call statistics can be - configured on a per-node basis -o Each node can be individually toggled to disallow local beeps -o New user locations can be allowed without commas (between city and state) - if the sysop wishes -o Quick-validation hot-keys require locally input system password if changing - a user with level 90 or higher (reduces accidental Quick-validations) -o If daily statistics database (DSTS.DAB) time stamp is more than 24 hours - in the future (apparently corrupted), a critical error is generated -o Last few callers and callers today listing can be custom colorized and - easily removed from the logon procedure for some or all users - (number of callers displayed for last few callers is Baja modifiable) -o Low-priority input toggle available on a per-node basis to fine-tune - aggregate system performance under multitasking environments -o ARS keywords SUB and DIR now support sub-board and directory internal codes - (static) as well as the area number (dynamic) for the value argument -o Doors can be configured for maximum time allowed (in drop file) -o Waiting for call configuration (SCFG) command line configurable for each node -o 32-bit DOS and OS/2 versions of the Synchronet configuration (SCFG) program -o RIP and WIP screens are not displayed locally for a cleaner local console -o E-7-1 remote terminals are now directly supported by Synchronet - - -Message Networks -~~~~~~~~~~~~~~~~ -o New FA: (file attachment) status override for sysops and 'F' exempt users - to send file attachments from anywhere to multiple addresses -o Sub-boards can be toggled for "Internet Networked" to allow posts to unknown - user names and the 'N' restriction to work properly with NetXpress -o QWK NetMail imported for an unknown address will be returned to the sender - (bounced) with "BADADDR: address" in the subject of the message - - -Message Base -~~~~~~~~~~~~ -o Moderated messages now show Moderated and Validated attributes -o When changing message attributes, a hot-key menu interface is used -o When moving messages between sub-boards, the original message may be left - intact (copying messages rather than moving) -o When deleting messages from a message base, they are only flagged for - deletion later by message base maintenance, allowing the user to - undelete the message -o More than 3000-4000 messages per sub-board supported (if memory allows) -o Messages and text files of any size (no maximum length) can be viewed online -o File attachments (e-mail) can now be forwarded among users -o Local posts and e-mail from user #1 may contain @-code variables/actions -o Sub-boards can be configured with static QWK conference numbers instead of - the default dynamic numbering scheme - - -Guru Chat -~~~~~~~~~ -o New response variables: - `O SysOp's name - `S System name - `G Guru's name - `I System's QWK ID - `L User's level (previously `m) - `T Time - `M Month - `W Day of the week - `J Day of the month - `Y Year - `Z User's zip/postal code -o AR strings can be used in Guru expressions by enclosing them in brackets - e.g. (HELLO&GURU&[LEVEL 90 OR FLAG S]) -o Guru starts conversation in "Local" mode (not multinode chat mode) - - -File Transfers -~~~~~~~~~~~~~~ -o Non-Synchronet color codes (@-codes, pipe-codes, etc) are now supported in - the descriptions of extended file listings (&E toggled ON) -o Files moved from the upload or sysop directories automatically have their - upload date set to the current date so they will appear in new-scans -o When in novice mode and batch flagging is enabled, file scans clear the - screen and display the batch flag command reference at the top of the - screen between each group of files -o File areas can be configured for maximum file age in days for the new - file maintenance utility (DELFILES) to purge by upload date, last - download date, and/or files not on disk -o Users can select a default download protocol and enable auto hang-up after - download (sysop can configure new user default values for these too) -o Files placed in the batch download queue, but not downloaded during the call - will be automatically added to the batch download queue during the - user's next logon -o File contents can be viewed from the (R)emove/Edit file prompt -o External programs can place files in the batch download queue by creating a - list of files as DATA\FILE\####.DWN (where #### is the user number) -o File areas can be set to deduct users' time online during uploads (instead - of the default behavior of suspending their time while uploading) -o File areas can be set to award uploaders with minutes instead of credits - - -PCMS (Programmable Command and Menu Structure) Enhancements -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -o Login procedure is controlled by a loadable module instead of hard-coded, - allowing custom login protocols and matrix menus -o Loadable logon module has greater control over logon procedure, assuming - responsibility for displaying logon screens, initiating logon events, - displaying auto-message, last few callers, etc. -o Optional synchronization module to be executed whenever nodes and displays - are synchronized (very frequently) -o Optional logout module to be executed offline during logout procedure - (after disconnection) -o Optional expired user module to be executed offline during daily maintenance - when users expire -o Modules can be loaded and executed from anywhere by placing @EXEC:MODNAME@ - in TEXT.DAT lines (excluding lines with % specifiers), menus, text - files, and even e-mail messages (optional) -o Command shells and modules can use dynamic global and local variables - (character strings and 32-bit integers) -o Direct file i/o operations available for command shells and modules -o Maximum binary executable size increased from 32k to 64k -o Read/write access to over 100 internal system string and integer variables -o Ability to dynamically load alternate TEXT.DAT files allowing complete - foreign language and graphical protocol shells -o Additional TEXT.DAT line to specify which keys are to be used for Yes and No, - completing the support necessary for foreign language shells -o Comments allowed in TEXT.DAT by placing '#' at the beginning of the line - - -Baja Compiler Version 2.00 Enhancements -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -o Compiler supports C-like macros (!define) for pre-processor definition of - integer and string constants -o Compiler supports multi-file projects using a C-like pre-processor directive - (!include) for combining multiple source/include files -o Many enhanced functions -o New String Manipulation functions -o New Integer Manipulation functions -o New Logic/Control Flow functions -o New Display functions -o New Input functions -o New Miscellaneous functions -o New File Base functions -o New Chat functions -o New File I/O functions -o New File system functions -o New Directory system functions - -/* End of V220A.NEW */ diff --git a/docs/versions.hst b/docs/versions.hst deleted file mode 100644 index 18286e2742..0000000000 --- a/docs/versions.hst +++ /dev/null @@ -1,30 +0,0 @@ -Synchronet Version Number History/Release Dates -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -1A08 05/29/92 First commerical release -1A09 06/02/92 Bug fixes -1A10 06/25/92 QWKnet, Alternate file paths, bi-dir QWK/REP, overlaid EXE only -1A11 07/01/92 Bug fixes -1A12 07/19/92 DESQview time-slice API, active nodes displayed at WFC, bug fixes -1A13 08/03/92 Enhanced MODUSER.DAT, enhanced DESQview performance, bug fixes -1B00 09/25/92 Multiple command sets, private node-to-node chat, FidoNet -1B01 01/23/93 RIP, PostLink (UTI), quoting, FAX detection, QWKnet file xfers -1B02 02/05/93 Reads DOOR.SYS -1B03 03/11/93 Multiple CDROM drives, PCBOARD.SYS and USERS.SYS, Free K per Day -1B04 04/30/93 EDITOR.INF, QUOTES.TXT, SFDOORS.DAT, CID, QWK FREQs, threading -1B05 06/01/93 Bug fixes -1C00 08/26/93 DIZ, ARS, dupe chking, @-Codes, reg key, WIN/OS2 time-slice API -1C01 11/21/93 DigiBoard, RX flow ctrl, chat actions, file ratios, dumb modems -1C02 11/30/93 Command line CID info, bug fixes -200A 06/02/94 SMB, Baja, FOSSIL, 115.2k DTE, swapping, blind uploads, bulkmail -200B 06/25/94 QWK *logons, STR_CMDS.BIN, bug fixes -200C 08/20/94 SCFG modem config database, bug fixes, compiled w/Borland C v4.0 -200D 08/21/94 Recompiled with Borland C v3.1 -200E 08/24/94 Bug fix via patch (unsuccessful) -200F 08/30/94 Bug fixes -200G 09/09/94 Bug fixes -210A 02/17/95 LZH compressed msg bases, QWK NetMail, split-screen pvt chat -211A 03/18/95 Baja enhancements, MSGTMP editors, upload conversions, pre-QWK -220A 08/31/95 WIP, major Baja enhancements, Multi-TEXT.DAT, SCFG32, LOGIN.BIN -220B 09/27/95 External editor quote options and unlimited lines, bug fixes -230A 05/30/97 Final release by Rob Swindell (FREEWARE - unlimited nodes) diff --git a/docs/versions.txt b/docs/versions.txt deleted file mode 100644 index 1ec1e1556f..0000000000 --- a/docs/versions.txt +++ /dev/null @@ -1,41 +0,0 @@ -Versions of Utilities Included with this Synchronet Package -=========================================================== - -The "Filename" column specifies the program filename or sub-directory. -The "Vers" column indicates the version number of the program. -The "SBBS" column indicates the SBBS package when the program was last updated. -The "Description" column is a description of the program. - -Filename Vers SBBS Description --------- ---- ---- ------------------------------------------------------- -UTI* 2.23 220A UTI driver set for PostLink v1.05+ -ADDFILES 2.22 220B Add files to database from DOS prompt or BAT file -DELFILES 1.01 220B Delete files from database or disk from DOS prompt -FILELIST 2.10 220A Generate ASCII file listings of file directories -DUPEFIND 1.01 210A Finds duplciate file names in file directories -AUTONODE 2.00 200A Find first available node for local logon -BAJA 2.01 220B Command shell/module (EXEC\*.SRC) compiler -NODE 1.03 1B03 Node display/control utility -SLOG 1.01 210A System/node statistics log viewer -DSTSEDIT 1.01 200A System/node daily statistics editor -ANS2MSG 1.06 220A ANSI to Ctrl-A conversion utility (for ASC/MSG files) -MSG2ANS 1.03 200A Ctrl-A to ANSI conversion utility -MLABELS 2.11 220A Generate mailing labels from Synchronet user data -TONE 1.01 200A Tone generation utility (external chat pager) -DBCS 1.00 1C01 DigiBoard channel status utility -USER 1.00 1A12 Pull specific user logons out of DATA\LOGS\*.LOG files -ALLUSERS 2.11 220A Bulk command line user editor -QWKNODES 1.20 220A QWKnet Node/Route/User list generator -CHKSMB 1.24 220A Checks Synchronet message base(s) for corruption -FIXSMB 1.22 220A Rebuilds Synchronet message base index and alloc files -SMBUTIL 1.24 220A Message base utility for maintaining and packing -SMBACTIV 1.00 210A Displays message base activity (users reading subs) -SYNCEDIT 2.05 220B SyncEdit external message editor (Unregistered) -SBBSECHO 1.12 220B FidoNet EchoMail import/export program (Unregistered) -XTRN\SDK 2.34 220B External program software developer's kit (Freeware) -XTRN\SBJ 2.31 220A Synchronet Blackjack Game with C source code (Freeware) -XTRN\SBL 1.36 220A Synchronet BBS List Door with C source code (Freeware) -XTRN\SCB 1.32 220A Synchronet Callback Verifier (Unregistered) -XTRN\SMM 1.31 220B Synchronet Match Maker (Unregistered) -XTRN\SCP 2.30 200A Supernet Centipede (Freeware) -XTRN\DPOKER 1.40 200G Domain Poker Multi-Player Online Game (Unregistered) diff --git a/exec/Makefile.bor b/exec/Makefile.bor deleted file mode 100644 index 9ca926d1f3..0000000000 --- a/exec/Makefile.bor +++ /dev/null @@ -1,38 +0,0 @@ -# Synchronet Baja Module Makefile (for Borland make) - -# Requires Baja v2.20+ - -# @format.tab-size 8, @format.use-tabs true - -# $id$ - -all : bullseye.bin \ - cntnodes.bin \ - default.bin \ - dir.bin \ - file_io.bin \ - login.bin \ - logon.bin \ - major.bin \ - matrix.bin \ - mudgate.bin \ - noyesbar.bin \ - pcboard.bin \ - qnet.bin \ - ra_emu.bin \ - renegade.bin \ - rlogin.bin \ - sdos.bin \ - simple.bin \ - str_cmds.bin \ - telgate.bin \ - type.bin \ - typehtml.bin \ - unixgate.bin \ - wildcat.bin \ - wiplogin.bin \ - wipshell.bin \ - yesnobar.bin - -.src.bin: - @baja /q $< diff --git a/exec/Makefile.gnu b/exec/Makefile.gnu deleted file mode 100644 index 5ed8a5e6cc..0000000000 --- a/exec/Makefile.gnu +++ /dev/null @@ -1,38 +0,0 @@ -# Synchronet Baja Module Makefile (GNU make) - -# Requires Baja v2.20+ - -# @format.tab-size 8, @format.use-tabs true - -# $id$ - -all : bullseye.bin \ - cntnodes.bin \ - default.bin \ - dir.bin \ - file_io.bin \ - login.bin \ - logon.bin \ - major.bin \ - matrix.bin \ - mudgate.bin \ - noyesbar.bin \ - pcboard.bin \ - qnet.bin \ - ra_emu.bin \ - renegade.bin \ - rlogin.bin \ - sdos.bin \ - simple.bin \ - str_cmds.bin \ - telgate.bin \ - type.bin \ - typehtml.bin \ - unixgate.bin \ - wildcat.bin \ - wiplogin.bin \ - wipshell.bin \ - yesnobar.bin - -%.bin : %.src - @./baja /q $< diff --git a/exec/bullseye.src b/exec/bullseye.src deleted file mode 100644 index 221c143926..0000000000 --- a/exec/bullseye.src +++ /dev/null @@ -1,78 +0,0 @@ -# bullseye.src - -# Bulletins written in Baja by Rob Swindell - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include file_io.inc -!include sbbsdefs.inc - -# Load the configuration file - -int i -int b -int file -int filepos -int total -int mode -str fname - -printf "\r\nSynchronet BullsEye! Version 1.00 by Rob Swindell\r\n" -pause_reset -set str "%zBULLSEYE.CFG" -fopen file O_RDONLY str -if_false - printf "\r\n!ERROR %ld opening %s\r\n" _errno str - return - end_if -fread_line file str -copy mode str -fget_pos file filepos - -set total 0 -#print "%l: %s" total str -:count_bulls - fread_line file str - #print "%ld: %s" total str - if_true # not end of file - add total 1 - goto count_bulls - end_if - -# Display menu, list bulletins, display prompt, etc. -:menu -printfile "%zBULLSEYE.ASC" -print "\1n\r\n\1b\1hEnter number of bulletin to view or press (\1wENTER\1b) to continue: \1w" -getnum b total -compare b 1 -if_less - return - end_if -fset_pos file filepos -set i 0 -:next -fread_line file str -if_true # not end of file - add i 1 - compare i b - if_equal - print "\1n\1l" - truncsp str - copy fname str - compare_substr str ".htm" - if_true - exec_bin typehtml - else - printfile_str - end_if - sprintf str "Node %d %s viewed bulletin #%d: %s" _node_num _useron.alias i fname - print_local "%s" - clear_abort - goto menu - end_if - goto next - end_if -printf "\r\nInvalid bulletin number: %d" b -goto menu diff --git a/exec/chat_sec.src b/exec/chat_sec.src deleted file mode 100644 index 642e44b7d8..0000000000 --- a/exec/chat_sec.src +++ /dev/null @@ -1,92 +0,0 @@ -# chat_sec.src - -# Chat Section for any/all Synchronet command shells - -# Requires v3.00g or later - -!include sbbsdefs.inc - -compare_ars rest C -if_true - print "\r\nYou can't chat.\r\n" - return - end_if - -# Set return point for main menu commands (via end_cmd) -cmd_home - -# Display TEXT\MENU\CHAT.* if not in expert mode -compare_user_misc UM_EXPERT -if_false - menu chat - end_if - -# Update node status -node_action node_chat -async -print "\r\n\1_\1y\1hChat: \1n" -getcmd "ACDFIJPQST?\r" -cmdkey 'S' - TOGGLE_USER_CHAT CHAT_SPLITP - printf "\1n\r\nPrivate split-screen chat is now: \1h" - COMPARE_USER_CHAT CHAT_SPLITP - if_true - print "ON\1n" - else - print "OFF\1n" - end_if - crlf - end_cmd - -cmdkey 'A' - crlf - toggle_user_chat CHAT_NOACT - toggle_node_misc NODE_AOFF - nodelist_users - end_cmd - -cmdkey 'D' - crlf - toggle_user_chat CHAT_NOPAGE - toggle_node_misc NODE_POFF - nodelist_users - end_cmd - -cmdkey 'F' - crlf - exec "?finger" - end_cmd - -cmdkey 'I' - crlf - exec "?sbbsimsg" - end_cmd - -cmdkey 'J' - multinode_chat - end_cmd - -cmdkey 'P' - private_chat - end_cmd - -cmdkey 'C' - page_sysop - if_false - page_guru - end_if - end_cmd - -cmdkey 'T' - page_guru - end_cmd - -cmdkey '?' - compare_user_misc UM_EXPERT - if_true - menu "chat" - end_if - end_cmd - -cmd_pop -return \ No newline at end of file diff --git a/exec/cntnodes.src b/exec/cntnodes.src deleted file mode 100644 index 61648559db..0000000000 --- a/exec/cntnodes.src +++ /dev/null @@ -1,56 +0,0 @@ -# cntnodes.src - -# Counts number of nodes in use and number of nodes waiting for call -# Sets global variables NODES_INUSE and NODES_WFC - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -int status -global_int nodes_inuse nodes_wfc - -set nodes_inuse 0 -set nodes_wfc 0 - -# Rewind NODE.DAB (_NODEFILE is a system variable) -fset_pos _nodefile 0 - -:read - feof _nodefile - if_true # End of file - goto end - end_if - # Lock record - flock _nodefile NODE_RECORD_LEN - if_false # Failed - goto end - end_if - # Read status - fread _nodefile status 1 - if_false # Failed - funlock _nodefile NODE_RECORD_LEN - goto end - end_if - # Unlock record - fseek _nodefile -1 CUR - funlock _nodefile NODE_RECORD_LEN - # Skip record - fseek _nodefile NODE_RECORD_LEN CUR - switch status - case NODE_WFC - add nodes_wfc 1 - end_case - case NODE_LOGON - case NODE_NEWUSER - case NODE_INUSE - case NODE_QUIET - add nodes_inuse 1 - end_case - end_switch - goto read -:end -printf "Nodes in use=%ld Waiting for Caller=%ld\r\n" nodes_inuse nodes_wfc - diff --git a/exec/default.src b/exec/default.src deleted file mode 100644 index 3eb5c1a744..0000000000 --- a/exec/default.src +++ /dev/null @@ -1,922 +0,0 @@ -# default.src - -# Default Command Shell for Synchronet Version 2.00a+ - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -############################################################################### -# This shell is an imitation of the Version 1c command set/structure # -# # -# It also serves as an example of a complex command shell using the Baja # -# command shell language # -# # -############################################################################### - -# Tips: -# -# Tabstops should be set to 8 to view/edit this file -# If your editor does not support control characters, -# use \1 for Ctrl-A codes -# All lines starting with # are considered comments and are ignored -# Left margins (indents) are not relevant and used only for clarity -# Almost everything is not case sensitive with the exception of @-codes - -################################# Begins Here ################################# - -!include sbbsdefs.inc - -# Set return point for main menu commands (via end_cmd) -cmd_home - -# Display TEXT\MENU\MAIN.* if not in expert mode -compare_user_misc UM_EXPERT -if_false - cls - menu main - end_if - -# Update node status -node_action node_main -async - -inc_main_cmds - -# Display main Prompt -print "-c\r\n� bhMain nc� h" -compare_ars exempt T -if_true - print "@TUSED@" -else - print "@TLEFT@" - end_if -print " nc[h@GN@nc] @GRP@ [h@SN@nc] @SUB@: n" - -# Get key (with / extended commands allowed) -compare_user_misc UM_COLDKEYS -if_false - getkeye -else - getstrupr 60 - endif - -compare_ars RIP -if_true - getlines - end_if - -# Do nothing for control keys and space -cmdkey ^@ - end_cmd -cmdkey ^M - end_cmd -cmdkey ^S - end_cmd - cmdkey " - end_cmd - -# Write command to log file -logkey_comma - -# Hitting number changes current sub-board -cmdkey digit - compare_user_misc UM_COLDKEYS - if_false - ungetkey - end_if - msg_get_sub_num - end_cmd - -# Hitting /number changes current group -cmdkey edigit - compare_user_misc UM_COLDKEYS - if_false - ungetkey - else - shift_str 1 - end_if - msg_get_grp_num - end_cmd - -# Show the key hit -compare_user_misc UM_COLDKEYS -if_false - printkey - endif - -# Next sub-board -cmdkey > - msg_subboard_up - end_cmd -cmdkey } - msg_subboard_up - end_cmd -cmdkey + - msg_subboard_up - end_cmd -cmdkey = - msg_subboard_up - end_cmd - -# Previous sub-board -cmdkey < - msg_subboard_down - end_cmd -cmdkey { - msg_subboard_down - end_cmd -cmdkey - - msg_subboard_down - end_cmd - -# Next group -cmdkey ] - msg_group_up - end_cmd - -# Previous group -cmdkey [ - msg_group_down - end_cmd - -# String commands start with a semicolon -cmdkey ; - compare_user_misc UM_COLDKEYS - if_true - shift_str 1 - else - getstrupr 40 - end_if - exec_bin str_cmds - end_cmd - -cmdkey T - chkfile "%zmenu/tmessage.*" - if_true - menu tmessage - end_if - call file_transfers - end_cmd - -compare_user_misc UM_COLDKEYS -if_false - crlf - end_if -pause_reset - -# Menu -cmdkey ? - compare_user_misc UM_expert - if_true - menu main - end_if - end_cmd - -# Sysop Menu -compare_ars SYSOP or EXEMPT Q or I or N -if_true - cmdkey ! - menu sysmain - end_cmd - end_if - -# Commands - -cmdkey A - auto_message - end_cmd - -cmdkey B - print "\r\nchBrowse/New Message Scan\r\n" - msg_browse_scan - end_cmd - -cmdkey C - exec_bin chat_sec - end_cmd - -cmdkey D - user_defaults - end_cmd - -cmdkey E - call E-mail - end_cmd - -cmdkey F - print "\r\nchFind Text in Messages\r\n" - msg_find_text - end_cmd - -cmdkey /F - msg_find_text_all - end_cmd - -cmdkey G - text_file_section - end_cmd - -cmdkey I - call main_info - end_cmd - -cmdkey J - msg_select_area - end_cmd - -cmdkey /L - nodelist_all - end_cmd - -cmdkey M - minute_bank - end_cmd - -cmdkey N - print "\r\nchNew Message Scan\r\n" - msg_new_scan - end_cmd - -cmdkey /N - msg_new_scan_all - end_cmd - -cmdkey O - file_download_batch - if_true - end_cmd - end_if - logoff - end_cmd - -cmdkey /O - file_download_batch - if_true - end_cmd - end_if - logoff_fast - end_cmd - -cmdkey P - msg_post - end_cmd - -cmdkey Q - msg_qwk - end_cmd - -cmdkey R - msg_read - end_cmd - -cmdkey S - print "\r\nchScan for Messages Posted to You\r\n" - msg_your_scan - end_cmd - -cmdkey /S - msg_your_scan_all - end_cmd - -cmdkey U - print "\r\nchList Users\r\n" - mnemonics "\r\n~Logons Today, ~Sub-board, or ~All: " - getcmd LSA\r - - cmdkey L - userlist_logons - end_cmd - cmdkey S - userlist_sub - end_cmd - cmdkey A - userlist_all - end_cmd - - # fall-through for CR, Ctrl-C, etc - end_cmd - -cmdkey /U - userlist_all - end_cmd - -cmdkey X - xtrn_section - end_cmd - -cmdkey Z - print "\r\nchContinuous New Message Scan\r\n" - msg_cont_scan - end_cmd - -cmdkey /Z - msg_cont_scan_all - end_cmd - -cmdkey * - msg_show_subboards - end_cmd - -cmdkey /* - msg_show_groups - end_cmd - -cmdkey & - call main_cfg - end_cmd - -cmdkey # - print "\r\nchType the actual number, not the symbol.\r\n" - end_cmd - -cmdkey /# - print "\r\nchType the actual number, not the symbol.\r\n" - end_cmd - -# fall through -print "\r\nchUnrecognized command." -compare_user_misc UM_expert -if_true - print " Hit 'i?nch' for a menu." - end_if -crlf -end_cmd - -# shouldn't hit next line -print "Problem in command shell." -pause -hangup -return - -############################### E-mail Section ################################ - -:e-mail -cmd_home -compare_user_misc UM_expert -if_false - menu e-mail - end_if -async -print "\r\nyhE-mail: n" -getcmd ?SRFNUKQ\r -logkey - -cmdkey ? - compare_user_misc UM_expert - if_true - menu e-mail - end_if - end_cmd - -cmdkey S - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send - end_cmd - -cmdkey U - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send_file - end_cmd - -cmdkey R - mail_read - end_cmd - -cmdkey F - setstr "1" - mail_send_feedback - end_cmd - -cmdkey N - no_yes "\r\nAttach a file" - if_true - mail_send_netmail - else - mail_send_netfile - end_if - end_cmd - -cmdkey K - mail_read_sent - end_cmd - -cmdkey Q - cmd_pop - return - end_cmd - -cmd_pop -return - -############################ Main Info Section ############################### - -:main_info -cmd_home -compare_user_misc UM_expert -if_false - menu maininfo - end_if -async -print "\r\nyhInfo: n" -getcmd ?QISVY\r -logkey - -cmdkey ? - compare_user_misc UM_expert - if_true - menu maininfo - end_if - end_cmd - -cmdkey I - info_system - end_cmd - -cmdkey S - info_subboard - end_cmd - -cmdkey Y - info_user - end_cmd - -cmdkey V - info_version - end_cmd - -cmdkey Q - cmd_pop - return - end_cmd - -cmd_pop -return - -########################### Main Config Section ############################## - -:main_cfg - -compare_user_misc UM_expert -if_false - menu maincfg - end_if -async -print "\r\nyhConfig: n" -getcmd ?QNPIS\r -logkey - -cmdkey ? - compare_user_misc UM_expert - if_true - menu maincfg - end_if - goto main_cfg - end_cmd - -cmdkey N - msg_new_scan_cfg - return - end_cmd - -cmdkey S - msg_your_scan_cfg - return - end_cmd - -cmdkey P - msg_ptrs_cfg - return - end_cmd - -cmdkey I - msg_ptrs_reinit - return - end_cmd - -return - - -########################### File Transfer Section ############################# - -:file_transfers - -compare_ars file_cmds=0 -if_true - compare_user_misc UM_ask_nscan - if_true - yes_no "\r\n\r\nSearch all libraries for new files" - if_true - file_new_scan_all - end_if - end_if - end_if - -cmd_home - -compare_user_misc UM_expert -if_false - cls - menu transfer - end_if - -# Update node status -node_action node_xfer -async - -inc_file_cmds - -# Display main Prompt -print "-c\r\n� bhFile nc� h" -compare_ars exempt T -if_true - print "@TUSED@" -else - print "@TLEFT@" - end_if -print " nc(h@LN@nc) @LIB@ (h@DN@nc) @DIR@: n" - -# Get key (with / extended commands allowed) -compare_user_misc UM_COLDKEYS -if_false - getkeye -else - getstrupr 60 - endif - -compare_ars RIP -if_true - getlines - end_if - -# Do nothing for control keys and space -cmdkey ^@ - end_cmd -cmdkey ^M - end_cmd -cmdkey ^S - end_cmd - cmdkey " - end_cmd - -# Write command to log file -logkey_comma - -# Hitting number changes current sub-board -cmdkey digit - compare_user_misc UM_COLDKEYS - if_false - ungetkey - end_if - file_get_dir_num - end_cmd - -# Hitting /number changes current group -cmdkey edigit - compare_user_misc UM_COLDKEYS - if_false - ungetkey - else - shift_str 1 - end_if - file_get_lib_num - end_cmd - -# Show the key hit -compare_user_misc UM_COLDKEYS -if_false - printkey - endif - -# Next directory -cmdkey > - file_directory_up - end_cmd -cmdkey } - file_directory_up - end_cmd -cmdkey + - file_directory_up - end_cmd -cmdkey = - file_directory_up - end_cmd - -# Previous directory -cmdkey < - file_directory_down - end_cmd -cmdkey { - file_directory_down - end_cmd -cmdkey - - file_directory_down - end_cmd - -# Next library -cmdkey ] - file_library_up - end_cmd - -# Previous library -cmdkey [ - file_library_down - end_cmd - -# String commands start with a semicolon -cmdkey ; - compare_user_misc UM_COLDKEYS - if_true - shift_str 1 - else - getstrupr 40 - end_if - exec_bin str_cmds - end_cmd - -cmdkey Q - cmd_pop - return - end_cmd - -compare_user_misc UM_COLDKEYS -if_false - crlf - end_if -pause_reset - -# Menu -cmdkey ? - compare_user_misc UM_expert - if_true - menu transfer - end_if - end_cmd - -# Sysop Menu -compare_ars SYSOP -if_true - cmdkey ! - menu sysxfer - end_cmd - end_if - -# Commands - -cmdkey B - file_batch_section - end_cmd - -cmdkey C - exec_bin chat_sec - end_cmd - -cmdkey D - print "\r\nchDownload File(s)\r\n" - file_download_batch - if_true - end_cmd - end_if - getfilespec - if_true - file_download - end_if - end_cmd - -cmdkey /D - print "\r\nchDownload File(s) from User(s)\r\n" - file_download_user - end_cmd - -cmdkey E - print "\r\nchList Extended File Information\r\n" - getfilespec - if_true - file_list_extended - end_if - end_cmd - -cmdkey F - print "\r\nchFind Text in File Descriptions (no wildcards)\r\n" - file_find_text - end_cmd - -cmdkey /F - file_find_text_all - end_cmd - -cmdkey I - call file_info - end_cmd - -cmdkey J - file_select_area - end_cmd - -cmdkey L - setstr *.* - file_list - end_cmd - -cmdkey /L - nodelist_all - end_cmd - -cmdkey N - print "\r\nchNew File Scan\r\n" - file_new_scan - end_cmd - -cmdkey /N - file_new_scan_all - end_cmd - -cmdkey O - file_download_batch - if_true - end_cmd - end_if - logoff - end_cmd - -cmdkey /O - file_download_batch - if_true - end_cmd - end_if - logoff_fast - end_cmd - -cmdkey R - print "\r\nchRemove/Edit File(s)\r\n" - getfilespec - if_true - file_remove - end_if - end_cmd - -cmdkey S - print "\r\nchSearch for Filename(s)\r\n" - file_find_name - end_cmd - -cmdkey /S - file_find_name_all - end_cmd - -cmdkey T - file_temp_section - end_cmd - -cmdkey U - print "\r\nchUpload File\r\n" - chkfile "%zmenu/upload.*" - if_true - menu upload - end_if - file_upload - end_cmd - -cmdkey /U - print "\r\nchUpload File to User\r\n" - file_upload_user - end_cmd - -cmdkey V - print "\r\nchView File(s)\r\n" - getfilespec - if_true - file_view - end_if - end_cmd - -cmdkey Z - print "\r\nchUpload File to Sysop\r\n" - file_upload_sysop - end_cmd - -cmdkey * - file_show_directories - end_cmd - -cmdkey /* - file_show_libraries - end_cmd - -cmdkey & - :xfercfg - compare_user_misc UM_expert - if_false - menu xfercfg - end_if - async - print "\r\nyhConfig: n" - getcmd ?QBEP\r - logkey - - cmdkey ? - compare_user_misc UM_expert - if_true - menu xfercfg - end_if - goto xfercfg - end_cmd - - cmdkey P - file_ptrs_cfg - end_cmd - - cmdkey B - toggle_user_misc UM_BATCHFLAG - end_cmd - - cmdkey E - toggle_user_misc UM_EXTDESC - end_cmd - end_cmd - -cmdkey # - print "\r\nchType the actual number, not the symbol.\r\n" - end_cmd - -cmdkey /# - print "\r\nchType the actual number, not the symbol.\r\n" - end_cmd - -# fall through -print "\r\nchUnrecognized command." -compare_user_misc UM_expert -if_true - print " Hit 'i?nch' for a menu." - end_if -crlf -end_cmd - -# shouldn't hit next line -print "Problem in command shell." -pause -hangup - -############################ File Info Section ############################### - -:file_info -cmd_home -compare_user_misc UM_expert -if_false - menu xferinfo - end_if -async -print "\r\nyhInfo: n" -getcmd ?TYDUQ\r -logkey - -cmdkey ? - compare_user_misc UM_expert - if_true - menu xferinfo - end_if - end_cmd - -cmdkey T - info_xfer_policy - end_cmd - -cmdkey Y - info_user - end_cmd - -cmdkey D - info_directory - end_cmd - -cmdkey U - userlist_dir - end_cmd - -cmdkey Q - cmd_pop - return - end_cmd - -cmd_pop -return - -#end of DEFAULT.SRC diff --git a/exec/dir.src b/exec/dir.src deleted file mode 100644 index b02a2eadff..0000000000 --- a/exec/dir.src +++ /dev/null @@ -1,110 +0,0 @@ -# dir.src - -# Test of Directory System Functions - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc -!include dir_attr.inc - -int dir fattr flen ftime bytes files i -str path name attr time date - -print "Directory of: " -getstrupr path 60 -open_dir dir path -if_false - printf "Unable to open %s\r\n" path - return - end_if -printf "Directory of %s\r\n\r\n" path -:next - copy i _sys_status - and i SS_ABORT - compare i 0 - if_not_equal # Ctrl-C hit - print "Aborted.\n" - goto end - end_if - read_dir dir name - if_false - goto end - end_if - # Increment file counter - add files 1 - sprintf str "%s\\%s" path name - get_file_attrib fattr str - get_file_length flen str - # Add to total byte counter - compare flen 0 - if_greater - add bytes flen - end_if - get_file_time ftime str - ftime_str time "%H:%M:%S" ftime - ftime_str date "%m/%d/%y" ftime - - set attr "" - - copy i fattr - and i FA_RDONLY - compare i 0 - if_not_equal - strcat attr "r" - else - strcat attr "-" - end_if - - copy i fattr - and i FA_HIDDEN - compare i 0 - if_not_equal - strcat attr "h" - else - strcat attr "-" - end_if - - copy i fattr - and i FA_SYSTEM - compare i 0 - if_not_equal - strcat attr "s" - else - strcat attr "-" - end_if - - copy i fattr - and i FA_LABEL - compare i 0 - if_not_equal - strcat attr "l" - else - strcat attr "-" - end_if - - copy i fattr - and i FA_DIREC - compare i 0 - if_not_equal - strcat attr "d" - else - strcat attr "-" - end_if - - copy i fattr - and i FA_ARCH - compare i 0 - if_not_equal - strcat attr "a" - else - strcat attr "-" - end_if - - printf "%s %10ld %s %s %s\r\n" attr flen date time name - goto next -:end -close_dir dir -printf "\r\n%lu total bytes in %lu files\r\n" bytes files - diff --git a/exec/dir_attr.inc b/exec/dir_attr.inc deleted file mode 100644 index dcd3448721..0000000000 --- a/exec/dir_attr.inc +++ /dev/null @@ -1,18 +0,0 @@ -# dir_attr.inc - -# Baja include file defining DOS Directory Entry Attribute constants -# Specifically used with the SET_FILE_ATTRIB and GET_FILE_ATTRIB functions - -# $id$ - -# @format.tab-size 8, @format.use-tabs true - -!define FA_NORMAL 0x00 -!define FA_RDONLY 0x01 -!define FA_HIDDEN 0x02 -!define FA_SYSTEM 0x04 -!define FA_LABEL 0x08 -!define FA_DIREC 0x10 -!define FA_ARCH 0x20 - -# End of DIR_ATTR.INC diff --git a/exec/dumpobjs.js b/exec/dumpobjs.js deleted file mode 100644 index 24848eceec..0000000000 --- a/exec/dumpobjs.js +++ /dev/null @@ -1,100 +0,0 @@ -// system -console.clear(); -print("\1hproperties of \1ysystem \1wobject\1n"); -for(i in system) - print("system." + i + " = " + system[i]); - -// system.stats -console.clear(); -print("\1hproperties of \1ysystem.stats \1wobject\1n"); -for(i in system.stats) - print("system.stats." + i + " = " + system.stats[i]); - -// system.node_list[] -console.clear(); -print("\1helements of \1ysystem.node_list \1warray\1n"); -for(n in system.node_list) - for(i in system.node_list[n]) - print("system.node_list[" + n + "]." + i + " = " + system.node_list[n][i]); - -// client -console.clear(); -print("\1hproperties of \1yclient \1wobject\1n"); -for(i in client) - print("client." + i + " = " + client[i]); - -// client.socket -console.clear(); -print("\1hproperties of \1yclient.socket \1wobject\1n"); -for(i in client.socket) - print("client.socket." + i + " = " + client.socket[i]); - -// server -console.clear(); -print("\1hproperties of \1yserver \1wobject\1n"); -for(i in server) - print("server." + i + " = " + server[i]); - -// user -console.clear(); -print("\1hproperties of \1yuser \1wobject\1n"); -for(i in user) - print("user." + i + " = " + user[i]); - -// user.stats -console.clear(); -print("\1hproperties of \1yuser.stats \1wobject\1n"); -for(i in user.stats) - print("user.stats." + i + " = " + user.stats[i]); - -// user.security -console.clear(); -print("\1hproperties of \1yuser.security \1wobject\1n"); -for(i in user.security) - print("user.security." + i + " = " + user.security[i]); - -// msg_area -console.clear(); -print("\1hproperties of \1ymsg_area \1wobject\1n"); -for(i in msg_area) - print("msg_area." + i + " = " + msg_area[i]); - -// msg_area.grp_list[] -print("\1helements of \1ymsg_area.grp_list \1warray\1n"); -for(n in msg_area.grp_list) { - for(i in msg_area.grp_list[n]) - print("msg_area.grp_list[" + n + "]." + i + " = " + msg_area.grp_list[n][i]); - for(d in msg_area.grp_list[n].sub_list) - for(i in msg_area.grp_list[n].sub_list[d]) - print("msg_area.grp_list[" + n + "].sub_list[" + d + "]." + i + " = " + - msg_area.grp_list[n].sub_list[d][i]); -} - -// file_area -console.clear(); -print("\1hproperties of \1yfile_area \1wobject\1n"); -for(i in file_area) - print("file_area." + i + " = " + file_area[i]); - -// file_area.lib_list[] -print("\1helements of \1yfile_area.lib_list \1warray\1n"); -for(n in file_area.lib_list) { - for(i in file_area.lib_list[n]) - print("file_area.lib_list[" + n + "]." + i + " = " + file_area.lib_list[n][i]); - for(d in file_area.lib_list[n].dir_list) - for(i in file_area.lib_list[n].dir_list[d]) - print("file_area.lib_list[" + n + "].dir_list[" + d + "]." + i + " = " + - file_area.lib_list[n].dir_list[d][i]); -} - -// bbs -console.clear(); -print("\1hproperties of \1ybbs \1wobject\1n"); -for(i in bbs) - print("bbs." + i + " = " + bbs[i]); - -// console -console.clear(); -print("\1hproperties of \1yconsole \1wobject\1n"); -for(i in console) - print("console." + i + " = " + console[i]); diff --git a/exec/errno.inc b/exec/errno.inc deleted file mode 100644 index 7029d99551..0000000000 --- a/exec/errno.inc +++ /dev/null @@ -1,65 +0,0 @@ -# errno.inc - -# Defines the system error variable _errno and the error -# numbers set by system calls. Errors which exist in Unix(tm) -# but not MSDOS have value -1. - -# $id$ - -# @format.tab-size 8, @format.use-tabs true - -!global _ERRNO - -!define EZERO 0 # Error 0 -!define EINVFNC 1 # Invalid function number -!define ENOFILE 2 # File not found -!define ENOPATH 3 # Path not found -!define ECONTR 7 # Memory blocks destroyed -!define EINVMEM 9 # Invalid memory block address -!define EINVENV 10 # Invalid environment -!define EINVFMT 11 # Invalid format -!define EINVACC 12 # Invalid access code -!define EINVDAT 13 # Invalid data -!define EINVDRV 15 # Invalid drive specified -!define ECURDIR 16 # Attempt to remove CurDir -!define ENOTSAM 17 # Not same device -!define ENMFILE 18 # No more files - -!define ENOENT 2 # No such file or directory -!define EMFILE 4 # Too many open files -!define EACCES 5 # Permission denied -!define EBADF 6 # Bad file number -!define ENOMEM 8 # Not enough core -!define EFAULT 14 # Unknown error -!define ENODEV 15 # No such device -!define EINVAL 19 # Invalid argument -!define E2BIG 20 # Arg list too long -!define ENOEXEC 21 # Exec format error -!define EXDEV 22 # Cross-device link -!define ENFILE 23 # UNIX - not MSDOS -!define ECHILD 24 # Unix/DOS -!define ENOTTY 25 # UNIX - not MSDOS -!define ETXTBSY 26 # UNIX - not MSDOS -!define EFBIG 27 # UNIX - not MSDOS -!define ENOSPC 28 # UNIX - not MSDOS -!define ESPIPE 29 # UNIX - not MSDOS -!define EROFS 30 # UNIX - not MSDOS -!define EMLINK 31 # UNIX - not MSDOS -!define EPIPE 32 # UNIX - not MSDOS -!define EDOM 33 # Math argument -!define ERANGE 34 # Result too large -!define EEXIST 35 # File already exists -!define EDEADLOCK 36 # Locking violation -!define EPERM 37 # UNIX - not MSDOS -!define ESRCH 38 # UNIX - not MSDOS -!define EINTR 39 # UNIX - not MSDOS -!define EIO 40 # UNIX - not MSDOS -!define ENXIO 41 # UNIX - not MSDOS -!define EAGAIN 42 # UNIX - not MSDOS -!define ENOTBLK 43 # UNIX - not MSDOS -!define EBUSY 44 # UNIX - not MSDOS -!define ENOTDIR 45 # UNIX - not MSDOS -!define EISDIR 46 # UNIX - not MSDOS -!define EUCLEAN 47 # UNIX - not MSDOS - -# End of ERRNO.INC diff --git a/exec/examples/dir.js b/exec/examples/dir.js deleted file mode 100644 index 080b6311d6..0000000000 --- a/exec/examples/dir.js +++ /dev/null @@ -1,25 +0,0 @@ -// dir.js - -// Example use of global directory() method. - -// $Id$ - -// @format.tab-size 8, @format.use-tabs true - -load("sbbsdefs.js"); - -if (argc==0) - path = prompt("Path"); -else - path = argv[0]; -if (path==undefined) - exit(); -if (path.indexOf('*')<0 && path.indexOf('?')<0) - path += "*"; // No pattern specified -print(path); -dir = directory(path); -for (i in dir) { - if(bbs.sys_status&SS_ABORT) - break; - print(dir[i]); -} \ No newline at end of file diff --git a/exec/examples/socktest.js b/exec/examples/socktest.js deleted file mode 100644 index 3ca7fc9a89..0000000000 --- a/exec/examples/socktest.js +++ /dev/null @@ -1,46 +0,0 @@ -load("sbbsdefs.js"); // CON_RAW_IN -load("sockdefs.js"); // SO_RCVBUF - -printf("tx = %d\r\n",client.socket.getoption(SOL_SOCKET,SO_SNDBUF)); -printf("rx = %d\r\n",client.socket.getoption(SOL_SOCKET,SO_RCVBUF)); -console.status |= CON_RAW_IN; // Enable RAW input mode (pass-through ctrl chars) -var socket = new Socket(); - -socket.debug=true; - -if(!socket.bind()) { - printf("!bind error %d\r\n",socket.last_error); - exit(); -} - -var addr=prompt("address"); -var port=Number(prompt("port")); - -if(!socket.connect(addr,port)) { - printf("!connect error %d\r\n",socket.last_error); - exit(); -} - -printf("\r\nConnected to %s:%d - Ctrl-] to abort\r\n",addr,port); -console.pause(); - -while(socket.is_connected && client.socket.is_connected) { - if(socket.data_waiting) { - buf = socket.read(); - client.socket.write(buf); - continue; - } - if((input=console.inkey())!="") { - if(input=="\x1d") /* Ctrl-] */ - break; - socket.write(input); - continue; - } - sleep(1); -} - -console.status &= ~CON_RAW_IN; // Disable raw input mode - -socket.debug=false; - -print("\r\nEnd of socktest!\r\n"); \ No newline at end of file diff --git a/exec/file_io.inc b/exec/file_io.inc deleted file mode 100644 index 3b20527cce..0000000000 --- a/exec/file_io.inc +++ /dev/null @@ -1,32 +0,0 @@ -# file_io.inc - -# Baja include file defining various File I/O related constants - -# $id$ - -# @format.tab-size 8, @format.use-tabs true - -!define O_RDONLY 1 # Read only -!define O_WRONLY 2 # Write only -!define O_RDWR 4 # Read/write - -# Flag values for open only - -!define O_CREAT 0x0100 # create and open file -!define O_TRUNC 0x0200 # open with truncation -!define O_EXCL 0x0400 # exclusive open -!define O_APPEND 0x0800 # to end of file - -!define O_NOINHERIT 0x80 -!define O_DENYALL 0x10 -!define O_DENYWRITE 0x20 -!define O_DENYREAD 0x30 -!define O_DENYNONE 0x40 - -# Seek (FSET_POS) constants for 'whence' - -!define SEEK_SET 0 # Seek from beginning of file -!define SEEK_CUR 1 # Seek from current position -!define SEEK_END 2 # Seek from end of file - -# End of FILE_IO.INC diff --git a/exec/file_io.src b/exec/file_io.src deleted file mode 100644 index 711f71219d..0000000000 --- a/exec/file_io.src +++ /dev/null @@ -1,182 +0,0 @@ -# file_io.src - -# Module for performing various i/o operations on a single file - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include file_io.inc - -# Variables -int file -int len -int pos -int time -int int -str buf -str name - -# Get filename to open -print "\r\nFilename: " -getstr -copy name str -fopen file O_RDWR|O_CREAT|O_DENYNONE str -if_false - printf "Failed to open %s\r\n" name - return - end_if - -cmd_home -fget_length file len -fget_pos file pos - -crlf -printf "Filename=%s\r\n" name -fget_time file time -time_str str time -printf "Buf=%s\r\nInt=%ld Pos=%ld Len=%ld Time=%s\r\n" buf int pos len str -feof file -if_true - print "At EOF\r\n" - end_if -crlf -print "[R] Read buf [W] Write buf\r\n" -print "[G] Get int [P] Put int\r\n" -print "[S] Seek [B] Rewind\r\n" -print "[L] Lock [U] Unlock\r\n" -print "[F] Fprintf [C] Change len\r\n" -print "[D] Change date [Z] End of file\r\n" -print "[E] ETX Char\r\n" -crlf -print "Which or [Q]uit: " -getkey -printkey -crlf - -cmdkey Q - print "Close: " - fclose file - call success - cmdpop - return - end_cmd - -cmdkey S - print "Seek to: " - getstr - copy pos str - fset_pos file pos - call success - end_cmd - -cmdkey B - print "Rewinding...\r\n" - fset_pos file 0 - call success - end_cmd - - -cmdkey Z - print "Seeking to End of File...\r\n" - fset_pos file 0 SEEK_END - call success - end_cmd - -cmdkey R - print "Length to read: " - getstr - copy len str - fread file buf len - call success - end_cmd - -cmdkey G - print "Length to read: " - getstr - copy len str - fread file int len - call success - end_cmd - -cmdkey P - print "Length to write: " - getstr - copy len str - print "Int: " - getstr - copy int str - fwrite file int len - call success - end_cmd - -cmdkey W - print "Length to write: " - getstr - copy len str - print "String: " - getstr - fwrite file str len - call success - end_cmd - -cmdkey F - print "String: " - getstr - fprintf file "%s" str - call success - end_cmd - -cmdkey L - print "Length to lock: " - getstr - copy len str - flock file len - call success - end_cmd - -cmdkey U - print "Length to unlock: " - getstr - copy len str - funlock file len - call success - end_cmd - -cmdkey C - print "New length of file: " - getstr - copy len str - fset_length file len - call success - end_cmd - -cmdkey E - yes_no "Use ETX (3) instead of NULL (0) for terminating text" - if_true - fset_etx 3 - else - fset_etx 0 - end_if - end_cmd - -cmdkey D - print "New file date (MM/DD/YY): " - getstr - date_int time str - fset_time file time - call success - end_cmd - -end_cmd - - -# Print "Successful" or "Unsuccessful" based on the current logic state -:success -if_true - print "Successful\r\n" -else - print "Unsuccessful\r\n" - end_if -return - diff --git a/exec/finger.js b/exec/finger.js deleted file mode 100644 index 8db5f27c66..0000000000 --- a/exec/finger.js +++ /dev/null @@ -1,23 +0,0 @@ -// finger.js - -// A simple finger client - -if(argc>0 && argv[0].indexOf('@')!=-1) - dest = argv[0]; -else if((dest = prompt("User (user@hostname)"))==null) - exit(); -if((hp = dest.indexOf('@'))==-1) { - alert("Invalid user"); - exit(); -} -host = dest.slice(hp+1); -sock = new Socket(); -//sock.debug = true; -if(!sock.connect(host,79)) - alert("Connection to " + host + " failed with error " + sock.last_error); -else { - sock.send(dest.slice(0,hp)+"\r\n"); - while(bbs.online && sock.is_connected) - print(sock.readline()); -} -sock.close(); diff --git a/exec/fingerservice.js b/exec/fingerservice.js deleted file mode 100644 index d97de6e71c..0000000000 --- a/exec/fingerservice.js +++ /dev/null @@ -1,254 +0,0 @@ -// fingerservice.js - -// Synchronet Service for the Finger protocol (RFC 1288) - -// Example configuration (in ctrl/services.cfg): - -// Finger 79 0-unlimited 0 fingerservice.js - -// Add -n to the configuration line to eliminate user age and gender -// information from the query results. - -// !WARNING! -// Finger is an open protocol utilizing no forms of authorization -// or authentication. FINGER IS A KNOWN AND ACCEPTED SECURITY RISK. -// Detailed information about your system and its users is made -// available to ANYONE using this service. If there is anything in -// this script that you do not want to be made available to anyone -// and everyone, please comment-out (using /* and */) that portion -// of the script. - -const VERSION="Synchronet Finger Service Version 1.00a"; - -var include_age_gender=true; - -load("nodedefs.js"); - -for(i=0;i<argc;i++) - if(argv[i].toLowerCase()=="-n") - include_age_gender = false; - -// Write a string to the client socket -function write(str) -{ - client.socket.send(str); -} - -// Write a crlf terminated string to the client socket -function writeln(str) -{ - write(str + "\r\n"); -} - -// Send the contents of a text file to the client socket -function send_file(fname) -{ - f = new File(fname); - if(!f.open("r")) - return; - txt = f.readAll(); - f.close(); - for(l in txt) - writeln(txt[l]); -} - -// Returns true if a connection on the local 'port' was succesful -function test_port(port) -{ - sock = new Socket(); - success = sock.connect("localhost",port); - sock.close(); - - return(success); -} - -// Get Finger Request (the main entry point) -request = client.socket.recvline(128 /*maxlen*/, 10 /*timeout*/); - -if(request==null) { - log("!TIMEOUT waiting for request"); - exit(); -} - -log(format("client request: '%s'",request)); - -if(request.substr(0,2).toUpperCase()=="/W") // "higher level of verbosity" - request=request.slice(2); // ignored... - -while(request.charAt(0)==' ') // skip prepended spaces - request=request.slice(1); - -if(request=="") { // no specific user requested, give list of active users - log("client requested active user list"); - write(format("%-25.25s %-31.31s Time %7s Node\r\n" - ,"User","Action",include_age_gender ? "Age Sex":"")); - var dashes="----------------------------------------"; - write(format("%-25.25s %-31.31s %8.8s %3.3s %3.3s %4.4s\r\n" - ,dashes,dashes,dashes - ,include_age_gender ? dashes : "" - ,include_age_gender ? dashes : "" - ,dashes)); - var user = new User(1); - for(n=0;n<system.node_list.length;n++) { - if(system.node_list[n].status!=NODE_INUSE) - continue; - user.number=system.node_list[n].useron; - if(system.node_list[n].action==NODE_XTRN && system.node_list[n].aux) - action=format("running %s",user.curxtrn); - else - action=format(NodeAction[system.node_list[n].action] - ,system.node_list[n].aux); - t=time()-user.logontime; - write(format("%-25.25s %-31.31s%3u:%02u:%02u %3s %3s %4d\r\n" - ,user.alias - ,action - ,Math.floor(t/(60*60)) - ,Math.floor(t/60)%60 - ,t%60 - ,include_age_gender ? user.age.toString() : "" - ,include_age_gender ? user.gender : "" - ,n+1 - )); - } - exit(); -} - -if(request.charAt(0)=='?') { // Handle "special" requests - request=request.slice(1); - switch(request.toLowerCase()) { - - case "ver": - writeln(VERSION); - writeln(server.version); - writeln(system.version_notice + system.revision); - writeln("Compiled " + system.compiled_when + " with " + system.compiled_with); - writeln(system.js_version); - writeln(system.os_version); - break; - - case "time": - writeln(system.timestr() + " " + system.zonestr()); - break; - - case "logon.lst": - send_file(system.data_dir + "logon.lst"); - break; - - case "auto.msg": - send_file(system.data_dir + "msgs/auto.msg"); - break; - - case "stats": /* Statistics */ - for(i in system.stats) - writeln(i + " = " + system.stats[i]); - - total = time()-system.uptime; - days = Math.floor(total/(24*60*60)); - if(days) - total%=(24*60*60); - hours = Math.floor(total/(60*60)); - min = (Math.floor(total/60))%60; - sec = total%60; - - writeln(format("uptime = %u days, %u hours, %u minutes and %u seconds" - ,days,hours,min,sec)); - break; - - case "nodelist": - var user = new User(1); - for(n=0;n<system.node_list.length;n++) { - write(format("Node %2d ",n+1)); - if(system.node_list[n].status==NODE_INUSE) { - user.number=system.node_list[n].useron; - write(format("%s (%u %s) ", user.alias, user.age, user.gender)); - if(system.node_list[n].action==NODE_XTRN && system.node_list[n].aux) - write(format("running %s",user.curxtrn)); - else - write(format(NodeAction[system.node_list[n].action],system.node_list[n].aux)); - t = time()-user.logontime; - write(format(" for %u minutes",Math.floor(t/60))); - } else - write(format(NodeStatus[system.node_list[n].status],system.node_list[n].aux)); - - write("\r\n"); - } - break; - - case "services": /* Services running on this host */ - if(test_port(23)) - writeln("Telnet"); - if(test_port(513)) - writeln("RLogin"); - if(test_port(21)) - writeln("FTP"); - if(test_port(25)) - writeln("SMTP"); - if(test_port(110)) - writeln("POP3"); - if(test_port(119)) - writeln("NNTP"); - if(test_port(70)) - writeln("Gopher"); - if(test_port(80)) - writeln("HTTP"); - if(test_port(113)) - writeln("IDENT"); - if(test_port(6667)) - writeln("IRC"); - break; - - default: - writeln("Supported special requests:"); - writeln("\tver"); - writeln("\ttime"); - writeln("\tstats"); - writeln("\tservices"); - writeln("\tnodelist"); - writeln("\tauto.msg"); - writeln("\tlogon.lst"); - log(format("!UNSUPPORTED SPECIAL REQUEST: '%s'",request)); - break; - } - exit(); -} - -// User info is handled here - -var usernum=Number(request); -if(!usernum) { - var at = request.indexOf('@'); - if(at>0) - request = request.substr(0,at-1); - - usernum = system.matchuser(request); - if(!usernum) { - log(format("!UNKNOWN USER: '%s'",request)); - exit(); - } -} -var user = new User(usernum); -if(user == null) { - log(format("!INVALID USER NUMBER: %d",usernum)); - exit(); -} - -uname = format("%s #%d",user.alias,user.number); -write(format("User: %-30s In real life: %s\r\n" - ,uname,user.name)); -write(format("From: %s\r\n",user.location)); -if(include_age_gender) { - birth=format("Birth: %s (Age: %u years)" - ,user.birthdate,user.age); - write(format("%-42s Gender: %s\r\n" - ,birth,user.gender)); -} -write(format("Shell: %-34s Editor: %s\r\n" - ,user.command_shell,user.editor)); -write(format("Last login %s %s\r\nvia %s from %s [%s]\r\n" - ,system.timestr(user.stats.laston_date) - ,system.zonestr() - ,user.connection - ,user.host_name - ,user.ip_address)); - -/* End of fingerservice.js */ diff --git a/exec/ftp-html.js b/exec/ftp-html.js deleted file mode 100644 index ba8f8c8c94..0000000000 --- a/exec/ftp-html.js +++ /dev/null @@ -1,429 +0,0 @@ -// JavaScript HTML Index for Synchronet FTP Server -// $id$ - -var start=new Date(); -var time_stamp=start.valueOf().toString(36); // Used to defeat caching browsers - -load("sbbsdefs.js"); // Synchronet constants - -/* Utility Functions */ - -function writeln(str) -{ - write(str + "\r\n"); -} - -function date(time) -{ - var mon=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]; - var d=new Date(time*1000); - - return(format("%s %02d %d %02d:%02d" - ,mon[d.getUTCMonth()] - ,d.getUTCDate() - ,d.getUTCFullYear() - ,d.getUTCHours() - ,d.getUTCMinutes())); -} - -function kbytes(nbytes) -{ - return(Math.round(nbytes/1024)+"k"); -} - -function secstr(sec) -{ - return(format("%02u:%02u",sec/60,sec%60)); -} - -var title = system.name + " BBS - FTP Server"; -var font_face = "<font face=Arial,Helvetica,sans-serif>"; -var font_size = 2; // Change base font size here - -writeln('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">'); -writeln("<html>"); -writeln("<head>"); -writeln("<title>"); -writeln(title); -if (ftp.curdir.name!=undefined) - write(" - " + ftp.curdir.name); -else if(ftp.curlib.description!=undefined) - write(" - " + ftp.curlib.description); -writeln("</title>"); - -/* META TAGS */ -writeln("<meta name='GENERATOR' content='" + system.version + "'>"); -// The following line is necessary for IBM extended-ASCII in descriptions -writeln("<meta http-equiv='Content-Type' content='text/html; charset=IBM437'>"); - -writeln("</head>"); -writeln("<body bgcolor=teal text=white link=yellow vlink=lime alink=white>"); -writeln(font_face); - -/* Go To Select Box */ -writeln("<table width=100%>"); -writeln("<td>"); -writeln("<h1>" + font_face + "<font color=lime>" + title.italics() + "</font></h1>"); -writeln("<td align=right>"); -writeln("<form>"); // Netscape requires this to be in a form <sigh> -writeln(format( - "<select " + - "onChange='if(selectedIndex>0) location=options[selectedIndex].value + \"%s\";'>" - ,"?$" + time_stamp)); -writeln("<option>Go To...</option>"); -writeln(format("<option value=/%s>Root</option>",html_index_file)); -for(l in file_area.lib_list) { - writeln(format("<optgroup label=%s>",file_area.lib_list[l].name)); - writeln(format("<option value=%s> [%s]" - ,file_area.lib_list[l].link - ,file_area.lib_list[l].name)); - for(d in file_area.lib_list[l].dir_list) { - writeln(format("<option value=%s>     %s" - ,file_area.lib_list[l].dir_list[d].link - ,file_area.lib_list[l].dir_list[d].name)); - } - writeln("</optgroup>"); -} -writeln("</select>"); -writeln("</form>"); -writeln("</table>"); - -var prevdir; - -var hdr_font="<font color=silver>"; -var dat_font="<font color=white>"; - -if(!(user.security.restrictions&UFLAG_G)) { /* !Guest or Anonymous */ - /* Logout button */ - writeln("<table align=right>"); - writeln("<form>"); - writeln("<input type=button value=Logout onclick='location=\"ftp://" - + format("%s/%s?$%s",system.inetaddr,html_index_file,time_stamp) - + "\";'>"); - writeln("</form>"); - writeln("</table>"); - - /* User Info */ - writeln("<table nowrap align=left>"); - writeln(font_face); - writeln("<tr><th align=right>"+hdr_font+"User:<th align=left>"+dat_font+user.alias); - writeln("<tr><th align=right>"+hdr_font+"Address:<th align=left width=150>"+dat_font+user.ip_address); - write("<tr><th align=right>"+hdr_font+"Credits:<th align=left>"+dat_font); - if(user.security.exemptions&UFLAG_D) - writeln("Exempt"); - else - writeln(kbytes(user.security.credits+user.security.free_credits)); - write("<tr><th align=right>"+hdr_font+"Time left:<th align=left>"+dat_font); - if(user.security.exemptions&UFLAG_T) - writeln("Exempt"); - else - writeln(secstr(ftp.time_left)); - writeln("</table>"); - - /* User Stats */ - - writeln("<table nowrap>"); - writeln(font_face); - writeln("<tr><th align=right>"+hdr_font+"Logons:<th align=left>"+dat_font+user.stats.total_logons); - writeln("<tr><th align=right>"+hdr_font+"Last on:<th align=left>"+date(user.stats.laston_date)); - writeln("<tr><th align=right>"+hdr_font+"Uploaded:<th align=left>"+dat_font); - writeln(format("%s bytes in %u files" - ,kbytes(user.stats.bytes_uploaded),user.stats.files_uploaded)); - writeln("<tr><th align=right>"+hdr_font+"Downloaded:<th align=left>"+dat_font); - writeln(format("%s bytes in %u files",kbytes(user.stats.bytes_downloaded) - ,user.stats.files_downloaded)); - writeln("</table>"); - writeln("<br>"); -} else if(ftp.curlib.name==undefined) { /* Login */ - writeln("<table align=right>"); - writeln("<td><input type=button value='New User' onClick='location=\"telnet://" - + system.inetaddr + "\";'>"); - writeln("</table>"); - - writeln("<form name='login'>"); - writeln("<table border=1 frame=box rules=none cellpadding=3>"); - writeln(font_face); - writeln("<tr><th valign=top align=left>"+hdr_font+"Name"); - writeln("<td colspan=2><input type=text name='username' size=25 maxlength=25>"); - writeln("<tr><th valign=top align=left>"+hdr_font+"Password"); - writeln("<td><input type=password name='password' size=10 maxlength=25>"); - writeln("<td align=right><input type=button name='LoginButton' value='Login' onClick='login_event();'>"); - - /* Client-Side Script */ - writeln("<SCRIPT language='JavaScript'>"); - writeln("<!--"); - writeln("function login_event() {"); - write("var url='ftp://'"); - write("+ escape(document.login.username.value) + ':'"); - write("+ escape(document.login.password.value) + '@'"); - write(format("+ '%s/%s?$%s'\r\n",system.inetaddr,html_index_file,time_stamp)); -// writeln("alert(url);"); - writeln("location = url;"); - writeln("}"); - writeln("// -->"); - writeln("</script>"); - - writeln("</table>"); - writeln("</form>"); -} - -/* Virtual Path */ -writeln("<h3>" + hdr_font + "Path: "); -if(ftp.curlib.name==undefined) - writeln(dat_font + "Root"); -else - writeln("Root".link(format("/%s?$%s",html_index_file,time_stamp))); -if(ftp.curlib.name!=undefined) { - if(ftp.curdir.name==undefined) - writeln(" / " + dat_font + ftp.curlib.description); - else - writeln(" / " + ftp.curlib.description.link(format("/%s/%s?$%s" - ,ftp.curlib.name,html_index_file,time_stamp))); -} -if(ftp.curdir.name!=undefined) - writeln(" / " + dat_font + ftp.curdir.description); -if(ftp.curdir.settings!=undefined && ftp.curdir.settings&DIR_FREE) - write(hdr_font+" - FREE"); -writeln("</h3>"); - - -/* Table Attributes */ -var hdr_background="white"; -var hdr_font=format("<font size=%d color=black>",font_size-1); -var dat_font=format("<font size=%d>",font_size); -var cell_spacing=""; //"cellspacing=2 cellpadding=2"; - -/* Directory Listing */ -if(ftp.dir_list.length) { - - writeln("<table " + cell_spacing + " width=33%>"); - writeln(font_face); - - /* header */ - writeln("<thead>"); - writeln("<tr bgcolor=" + hdr_background + ">"); - writeln("<th>" + hdr_font + "Directory"); - if(ftp.curlib.name!=undefined) - writeln("<th>" + hdr_font + "Files"); - writeln("</thead>"); - - /* body */ - writeln("<tbody>"); - for(i in ftp.dir_list) { - writeln("<tr>"); - - /* filename */ - writeln("<th nowrap align=left>" + dat_font - + ftp.dir_list[i].description.link(ftp.dir_list[i].link + "?$" + time_stamp)); - - if(ftp.curlib.name!=undefined) { - writeln("<td align=right><font color=black>" + dat_font + ftp.dir_list[i].size); - writeln("<th>" + dat_font + (ftp.dir_list[i].settings&DIR_FREE ? "FREE":"")); - } - } - writeln("</table>"); - if(ftp.file_list.length) - writeln("<br>"); -} - -/* File Listing */ -if(ftp.file_list.length) { - - /* Sort the list? */ - switch(ftp.sort) { - case "uploader": - ftp.file_list.sort(function(a,b) - { if(a.uploader>b.uploader) - return(1); - if(a.uploader<b.uploader) - return(-1); - return(0); } - ); - break; - case "size": - ftp.file_list.sort(function(a,b) - { return(a.size-b.size); } - ); - break; - case "credits": - ftp.file_list.sort(function(a,b) - { return(a.credits-b.credits); } - ); - break; - case "time": - ftp.file_list.sort(function(a,b) - { return(a.time.valueOf()-b.time.valueOf()); } - ); - break; - case "hits": - ftp.file_list.sort(function(a,b) - { return(a.times_downloaded-b.times_downloaded); } - ); - break; - } - if(ftp.reverse) - ftp.file_list.reverse(); - - var show_ext_desc; /* show extended descriptions */ - var total_bytes=0; - var total_downloads=0; - var most_recent=0; - - if (ftp.curdir.name==undefined) - show_ext_desc=false; /* aliased files have no ext desc */ - else - show_ext_desc=user.settings&USER_EXTDESC; - - writeln("<table " + cell_spacing + " width=100%>"); - writeln(font_face); - - /* header */ - writeln("<thead>"); - writeln("<tr bgcolor=" + hdr_background + ">"); - - /* File */ - writeln(format("<th><a href=%s?sort=name%s$%s>%sFile</a>" - ,html_index_file - ,(ftp.sort=="name" && !ftp.reverse) ? "&reverse":"", time_stamp, hdr_font)); - - /* Credits or Size */ - if(ftp.curdir.settings!=undefined && !(ftp.curdir.settings&DIR_FREE)) - writeln(format("<th><a href=%s?sort=credits%s$%s>%sCredits</a>" - ,html_index_file - ,(ftp.sort=="credits" && !ftp.reverse) ? "&reverse" : "", time_stamp, hdr_font)); - else - writeln(format("<th><a href=%s?sort=size%s$%s>%sSize</a>" - ,html_index_file - ,(ftp.sort=="size" && !ftp.reverse) ? "&reverse" : "", time_stamp, hdr_font)); - - /* Description */ - write("<th>" + hdr_font + "Description"); - if(!(user.security.restrictions&UFLAG_G) && ftp.curdir.settings!=undefined) { - if(user.settings&USER_EXTDESC) - writeln(format(" [%s]" - ,(hdr_font+"short").link(format("%s?ext=off$%s",html_index_file, time_stamp)))); - else - writeln(format(" [%s]" - ,(hdr_font+"extended").link(format("%s?ext=on$%s",html_index_file, time_stamp)))); - } - - /* Date/Time */ - writeln(format("<th><a href=%s?sort=time%s$%s>%sDate/Time</a>" - ,html_index_file - ,(ftp.sort=="time" && !ftp.reverse) ? "&reverse" : "", time_stamp, hdr_font)); - - /* Uploader and Hits (downloads) */ - if(ftp.curdir.name!=undefined) { /* not valid for aliased files in root */ - writeln(format("<th><a href=%s?sort=uploader%s$%s>%sUploader</a>" - ,html_index_file - ,(ftp.sort=="uploader" && !ftp.reverse) ? "&reverse" : "", time_stamp, hdr_font)); - writeln(format("<th><a href=%s?sort=hits%s$%s>%sHits</a>" - ,html_index_file - ,(ftp.sort=="hits" && !ftp.reverse) ? "&reverse" : "", time_stamp, hdr_font)); - } - writeln("</thead>"); - - /* body */ - writeln("<tbody>"); - for(i in ftp.file_list) { - - total_downloads+=ftp.file_list[i].times_downloaded; - if(ftp.file_list[i].time>most_recent) - most_recent=ftp.file_list[i].time; - - writeln("<tr valign=top>"); - - /* filename */ - if(user.security.restrictions&UFLAG_D - || (ftp.curdir.settings!=undefined - && !(ftp.curdir.settings&DIR_FREE) - && !(user.security.exemptions&UFLAG_D) - && ftp.file_list[i].credits > (user.security.credits+user.security.free_credits)) - ) { - write("<td align=left>" + dat_font); - writeln(ftp.file_list[i].name.link( - "javascript:alert('Sorry, you do not have enough credits to download this file.');")); - } else { - write("<th align=left>" + dat_font); - writeln(ftp.file_list[i].name.link(ftp.file_list[i].link)); - } - - /* size */ - write("<td align=right>" + dat_font + "<font color=black>"); - if(ftp.curdir.settings!=undefined && !(ftp.curdir.settings&DIR_FREE)) { - if(!ftp.file_list[i].credits) - writeln("<font color=white><b>FREE"); - else - writeln(kbytes(ftp.file_list[i].credits)); - total_bytes+=ftp.file_list[i].credits; - } else { - writeln(kbytes(ftp.file_list[i].size)); - total_bytes+=ftp.file_list[i].size; - } - - /* description */ - write("<td>" + dat_font); - if (show_ext_desc) { - if(ftp.file_list[i].settings&FILE_EXTDESC) - writeln("<pre>" + ftp.file_list[i].extended_description); - else - writeln("<tt>" + ftp.file_list[i].description); - } else - writeln(dat_font + ftp.file_list[i].description); - - /* date/time */ - writeln("<td align=center nowrap>" + dat_font + "<font color=black>" - + "<tt>"+ date(ftp.file_list[i].time)); - - if(ftp.curdir.name!=undefined) { /* not valid for aliased files in root */ - /* uploader */ - var uploader=ftp.file_list[i].uploader; - if (ftp.file_list[i].settings&FILE_ANON) - uploader="Anonymous"; - else if (uploader == "-> ADDFILES <-") - uploader="Sysop".link("mailto:sysop@"+system.inetaddr); - else if (!(user.security.restrictions&UFLAG_G)) /* ! Guest/Anonymous */ - uploader=uploader.link("mailto:" + uploader + "@" + system.inetaddr); - writeln("<td nowrap>" + dat_font + uploader); - - /* download count */ - writeln("<td align=right>" + dat_font + "<font color=black>" - + ftp.file_list[i].times_downloaded); - } - } - - /* Footer (with totals) */ - writeln("<tfoot>"); - writeln(format("<tr bgcolor=%s><th>%s%lu files" + - "<th align=right>%s%s<th>%s-<th>%s<font color=black><tt>%s" - ,hdr_background - ,hdr_font, ftp.file_list.length - ,hdr_font, kbytes(total_bytes) - ,hdr_font - ,dat_font, date(most_recent) - )); - - if(ftp.curdir.name!=undefined) /* not valid for aliased files in root */ - writeln(format("<th>%s-<th align=right>%s%lu" - ,hdr_font - ,hdr_font, total_downloads - )); - - writeln("</table>"); -} - -if(!ftp.file_list.length && !ftp.dir_list.length) - writeln("<br><b>No Files.</b><br>"); - -/* Footer */ -write(format("<br><font size=%d color=silver>Problems? Ask ",font_size-1)); -write(format("<a href=mailto:sysop@%s>%s</a>.",system.inetaddr,system.operator)); - -write(format("<br><font size=%d>Dynamically generated ",font_size-1)); -write(format("in %lu milliseconds ", new Date().valueOf()-start.valueOf())); -write("by <a href=http://www.synchro.net>" + server.version + "</a>"); -writeln("<br>" + Date() + "</font>"); -writeln("</body>"); -writeln("</html>"); - -/* End of ftp-html.js */ \ No newline at end of file diff --git a/exec/ftp.src b/exec/ftp.src deleted file mode 100644 index 6c0aab22de..0000000000 --- a/exec/ftp.src +++ /dev/null @@ -1,311 +0,0 @@ -# ftp.src - -# FTP Client for Synchronet - -# Requires Baja v2.30 and Synchronet v3.00d or later - -!include sbbsdefs.inc # _ftp_mode and _socket_error - -!define ON "\1gON" -!define OFF "\1rOFF" - -int sock port i -str addr user pass src dest fname -str pasv_mode hash_mode ascii_mode - -set _ftp_mode FTP_ECHO_RSP|FTP_HASH|FTP_PASV - -print "\r\n\1h\1ySynchronet \1wFTP Client v1.00 \1y- Copyright 2001 Rob Swindell\1n\r\n\r\n" - -compare str "" -if_false - compare_word "*" - if_false - call socket_connect - end_if - end_if - -loop - -print "\1n\1hftp\1n> " -getstr -compare str "" -if_equal - continue - end_if - -compare_word "?" -if_true - compare_all_bits _ftp_mode FTP_HASH - if_true - set hash_mode ON - else - set hash_mode OFF - end_if - - compare_all_bits _ftp_mode FTP_PASV - if_true - set pasv_mode ON - else - set pasv_mode OFF - end_if - - compare_all_bits _ftp_mode FTP_ASCII - if_true - set ascii_mode ON - else - set ascii_mode OFF - end_if - - print "\r\n\1hCommands are\1n:\r\n\r\n" - print "\1h\1yopen \1w: \1cstart an FTP session\r\n" - print "\1h\1yclose \1w: \1cclose an FTP session\r\n" - print "\1h\1ydir \1w: \1cprint a directory listing\r\n" - print "\1h\1ypwd \1w: \1cprint working directory\r\n" - print "\1h\1ycd \1w: \1cchange working directory\r\n" - printf "\1h\1yhash \1w: \1ctoggle hash printing during transfer (currently %s\1c)\r\n" hash_mode - printf "\1h\1ypasv \1w: \1ctoggle passive mode transfers (currently %s\1c)\r\n" pasv_mode - printf "\1h\1yascii \1w: \1ctoggle ASCII (CR/LF) mode transfers (currently %s\1c)\r\n" ascii_mode - print "\1h\1yget \1w: \1cretrieve (download) file\r\n" - print "\1h\1yput \1w: \1csend (upload) file\r\n" - print "\1h\1ydelete \1w: \1cdelete (erase) file\r\n" - print "\1h\1yquit \1w: \1cexit FTP\r\n" - crlf - continue - end_if - -compare_word "open" -if_true - shift_str 5 - - socket_close sock # In case there's already a socket open - - call socket_connect - continue - end_if - -compare_str "pasv" -if_true - xor _ftp_mode FTP_PASV - compare_all_bits _ftp_mode FTP_PASV - print "\1h\1cPassive file transfer mode: " - if_true - print ON - else - print OFF - end_if - crlf - continue - end_if - -compare_str "hash" -if_true - xor _ftp_mode FTP_HASH - compare_all_bits _ftp_mode FTP_HASH - print "\1h\1cHash mark printing: " - if_true - print ON - else - print OFF - end_if - crlf - continue - end_if - -compare_str "ascii" -if_true - xor _ftp_mode FTP_ASCII - compare_all_bits _ftp_mode FTP_ASCII - print "\1h\1cASCII file transfer mode: " - if_true - print ON - else - print OFF - end_if - crlf - continue - end_if - -compare_str "quit" -if_true - ftp_logout sock - socket_close sock - return - end_if - -compare sock 0 -if_true - print "Not connected (use '\1i?\1n' for menu).\r\n" - continue - end_if - -# ALL commands from here on require connection - -compare_str "close" -if_true - ftp_logout sock - if_false - printf "!ftp_logout failed socket_error=%d\r\n" _socket_error - end_if - socket_close sock - continue - end_if - -compare_word "dir" -if_true - shift_str 4 - ftp_dir sock str - if_false - printf "!ftp_dir failed socket_error=%d\r\n" _socket_error - end_if - continue - end_if - -compare_str "pwd" -if_true - ftp_pwd sock - if_false - printf "!ftp_pwd failed socket_error=%d\r\n" _socket_error - end_if - continue - end_if - -compare_word "cd" -if_true - shift_str 3 - compare_str "" - if_true - print "Directory: " - getstr - end_if - ftp_cwd sock str - if_false - printf "!ftp_cwd failed socket_error=%d\r\n" _socket_error - end_if - continue - end_if - -compare_word "delete" -if_true - shift_str 6 - compare_str "" - if_true - print "File: " - getstr - end_if - ftp_delete sock str - if_false - printf "!ftp_delete failed socket_error=%d\r\n" _socket_error - end_if - continue - end_if - - -compare_word "get" -if_true - shift_str 4 - compare_str "" - if_true - print "File: " - getstr - end_if - copy fname str - # skip path - shift_to_last_char fname '/' - if_true - shift_str fname 1 - end_if - shift_to_last_char fname '\\' - if_true - shift_str fname 1 - end_if - set dest "%g" # temp directory - strcat dest fname - ftp_get sock str dest - if_false - printf "!ftp_get failed socket_error=%d\r\n" _socket_error - continue - end_if - copy str dest - file_send - remove_file dest - continue - end_if - -compare_word "put" -if_true - shift_str 4 - compare_str "" - if_true - print "File: " - getstr - end_if - copy dest str - copy fname str - # skip path - shift_to_last_char fname '/' - if_true - shift_str fname 1 - end_if - shift_to_last_char fname '\\' - if_true - shift_str fname 1 - end_if - set src "%g" # temp directory - strcat src fname - copy str src - file_receive # uses str - chkfile src - if_false - continue - end_if - printf "ftp: sending %s\r\n" fname - ftp_put sock src dest - if_false - remove_file src - printf "!ftp_put failed socket_error=%d\r\n" _socket_error - continue - end_if - remove_file src - continue - end_if - -printf "Invalid command (use '\1i?\1n' for menu).\r\n" str - -end_loop - -######################################## -# Socket create/open/connect sub-routine -:socket_connect - -socket_open sock -if_false - printf "!socket_open failure socket_error=%d\r\n" _socket_error - continue - end_if - -copy addr str -compare addr "" -if_true - print "address: " - getstr addr - end_if - -set port 21 # default FTP port -printf "Connecting to %s ... " addr -socket_connect sock addr port -crlf -if_false - printf "!socket_connect failed socket_error=%d\r\n" _socket_error - return - end_if -print "login: " -getstr user -print "password: " -getstr pass 60 K_NOECHO -crlf -ftp_login sock user pass -if_false - printf "!ftp_login failed socket_error=%d\r\n" _socket_error - end_if -return diff --git a/exec/gopherservice.js b/exec/gopherservice.js deleted file mode 100644 index 626bfa93bd..0000000000 --- a/exec/gopherservice.js +++ /dev/null @@ -1,222 +0,0 @@ -// gopherservice.js - -// Synchronet Service for the Gopher Protocol (RFC 1436) - -// Example configuration (in ctrl/services.cfg): - -// Gopher 70 0-unlimited 0 gopherservice.js - -load("sbbsdefs.js"); -load("nodedefs.js"); - -const VERSION = "1.00 Alpha"; -const GOPHER_PORT = 70; - -var debug = false; -var no_anonymous = false; - -// Parse arguments -for(i=0;i<argc;i++) - if(argv[i].toLowerCase()=="-d") - debug = true; - -// Write a string to the client socket -function write(str) -{ - if(0 && debug) - log(format("rsp: %s",str)); - client.socket.send(str); -} - -function writeln(str) -{ - write(str + "\r\n"); -} - -// Send the contents of a text file to the client socket -function send_file(fname) -{ - f = new File(fname); - if(!f.open("r")) - return; - txt = f.readAll(); - f.close(); - for(l in txt) - writeln(strip_ctrl(txt[l])); -} - -var msgbase=null; - -if(!login("guest")) { - writeln("Sorry, no Gopher access here."); - log("!NO GUEST ACCOUNT CONFIGURED"); - exit(); -} - - -// Get Request -request = client.socket.recvline(512 /*maxlen*/, 10 /*timeout*/); - -if(request==null) { - log("!TIMEOUT waiting for request"); - exit(); -} - -log(format("client request: '%s'",request)); - -var gopher_plus=false; -if((term=request.indexOf("\t+"))>=0) { - gopher_plus=true; - request=request.substr(0,term); - writeln("+-2"); -} - -if(request=="") { /* blank = "root" */ - for(g in msg_area.grp_list) - writeln(format("1%s\tgrp:%s\t%s\t%u" - ,msg_area.grp_list[g].description - ,msg_area.grp_list[g].name.toLowerCase() - ,system.inetaddr - ,GOPHER_PORT - )); -/** to-do - for(l in file_area.lib_list) - writeln(format("1%s\tlib:%s\t%s\t%u" - ,file_area.lib_list[l].description - ,file_area.lib_list[l].name.toLowerCase() - ,system.inetaddr - ,GOPHER_PORT - )); -**/ - writeln(format("0%s\t%s\t%s\t%u" - ,"Node List" - ,"nodelist" - ,system.inetaddr - ,GOPHER_PORT - )); - writeln(format("0%s\t%s\t%s\t%u" - ,"Logon List" - ,"logonlist" - ,system.inetaddr - ,GOPHER_PORT - )); - writeln(format("0%s\t%s\t%s\t%u" - ,"Auto-Message" - ,"automsg" - ,system.inetaddr - ,GOPHER_PORT - )); - - exit(); -} - -switch(request) { - case "nodelist": - var user = new User(1); - for(n=0;n<system.node_list.length;n++) { - write(format("Node %2d ",n+1)); - if(system.node_list[n].status==NODE_INUSE) { - user.number=system.node_list[n].useron; - write(format("%s (%u %s) ", user.alias, user.age, user.gender)); - if(system.node_list[n].action==NODE_XTRN && system.node_list[n].aux) - write(format("running %s",user.curxtrn)); - else - write(format(NodeAction[system.node_list[n].action],system.node_list[n].aux)); - } else - write(format(NodeStatus[system.node_list[n].status],system.node_list[n].aux)); - - write("\r\n"); - } - break; - case "logonlist": - send_file(system.data_dir + "logon.lst"); - break; - - case "automsg": - send_file(system.data_dir + "msgs/auto.msg"); - break; -} - -field = request.split(':'); -switch(field[0]) { - case "grp": - for(g in msg_area.grp_list) - if(msg_area.grp_list[g].name.toLowerCase()==field[1]) { - for(s in msg_area.grp_list[g].sub_list) - writeln(format("1[%s] %s\tsub:%s\t%s\t%u" - ,msg_area.grp_list[g].name - ,msg_area.grp_list[g].sub_list[s].description - ,msg_area.grp_list[g].sub_list[s].code.toLowerCase() - ,system.inetaddr - ,GOPHER_PORT - )); - break; - } - break; - case "lib": - for(l in file_area.lib_list) - if(file_area.lib_list[l].name.toLowerCase()==field[1]) { - for(d in file_area.lib_list[l].dir_list) - writeln(format("1[%s] %s\tdir:%s\t%s\t%u" - ,file_area.lib_list[l].name - ,file_area.lib_list[l].dir_list[d].description - ,file_area.lib_list[l].dir_list[d].code.toLowerCase() - ,system.inetaddr - ,GOPHER_PORT - )); - break; - } - break; - case "sub": - msgbase = new MsgBase(field[1]); - if(Number(field[2])) { - hdr=msgbase.get_msg_header(false,Number(field[2])); - if(hdr.attr&MSG_DELETE) - break; - writeln(format("Subj : %s",hdr.subject)); - writeln(format("To : %s",hdr.to)); - writeln(format("From : %s",hdr.from)); - writeln(format("Date : %s",system.timestr(hdr.when_written_time))); - writeln(""); - body=msgbase.get_msg_body(false,Number(field[2]),true) - writeln(body); - break; - } -/** - msginfo=format("%-25.25s %-25.25s %-25.25s %s" - ,"Subject" - ,"From" - ,"To" - ,"Date" - ); - writeln(format("0%s\tnull\tnull\tnull\r\n",msginfo)); -**/ - first = msgbase.first_msg; - for(i=msgbase.last_msg;i>=first;i--) { - hdr=msgbase.get_msg_header(false,i); - if(hdr==null) - continue; - if(hdr.attr&MSG_DELETE) - continue; - msginfo=format("%-25.25s %-25.25s %-25.25s %s" - ,hdr.subject - ,hdr.from - ,hdr.to - ,system.timestr(hdr.when_written_time) - ); - writeln(format("0%s\tsub:%s:%u\t%s\t%u" - ,msginfo - ,field[1] - ,i - ,system.inetaddr - ,GOPHER_PORT - )); - } - msgbase.close(); - break; - case "dir": - /* to-do */ - break; -} - -/* End of gopherservice.js */ diff --git a/exec/load/nodedefs.js b/exec/load/nodedefs.js deleted file mode 100644 index 6a07f24930..0000000000 --- a/exec/load/nodedefs.js +++ /dev/null @@ -1,146 +0,0 @@ -/* nodedefs.js */ - -/* Synchronet NODE.DAB var ants definitions - (mostly bit-fields) */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2001 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - - /********************************************/ - /* Legal values for Node.status */ - /********************************************/ -var NODE_WFC =0 /* Waiting for Call */ -var NODE_LOGON =1 /* at logon prompt */ -var NODE_NEWUSER =2 /* New user applying */ -var NODE_INUSE =3 /* In Use */ -var NODE_QUIET =4 /* In Use - quiet mode */ -var NODE_OFFLINE =5 /* Offline */ -var NODE_NETTING =6 /* Networking */ -var NODE_EVENT_WAITING =7 /* Waiting for all nodes to be inactive */ -var NODE_EVENT_RUNNING =8 /* Running an external event */ -var NODE_EVENT_LIMBO =9 /* Allowing another node to run an event */ -var NODE_LAST_STATUS =10 /* Must be last */ - /********************************************/ - - /********************************************/ -var NodeStatus =[ /* Node.status value descriptions */ - "Waiting for call" /********************************************/ - ,"At logon prompt" - ,"New user" - ,"In-use" - ,"Waiting for call" - ,"Offline" - ,"Networking" - ,"Waiting for all nodes to become inactive" - ,"Running external event" - ,"Waiting for node %d to finish external event" - ]; - - /********************************************/ - /* Legal values for Node.action */ - /********************************************/ -var NODE_MAIN =0 /* Main Prompt */ -var NODE_RMSG =1 /* Reading Messages */ -var NODE_RMAL =2 /* Reading Mail */ -var NODE_SMAL =3 /* Sending Mail */ -var NODE_RTXT =4 /* Reading G-Files */ -var NODE_RSML =5 /* Reading Sent Mail */ -var NODE_PMSG =6 /* Posting Message */ -var NODE_AMSG =7 /* Auto-message */ -var NODE_XTRN =8 /* Running External Program */ -var NODE_DFLT =9 /* Main Defaults Section */ -var NODE_XFER =10 /* Transfer Prompt */ -var NODE_DLNG =11 /* Downloading File */ -var NODE_ULNG =12 /* Uploading File */ -var NODE_BXFR =13 /* Bidirectional Transfer */ -var NODE_LFIL =14 /* Listing Files */ -var NODE_LOGN =15 /* Logging on */ -var NODE_LCHT =16 /* In Local Chat with Sysop */ -var NODE_MCHT =17 /* In Multi-Chat with Other Nodes */ -var NODE_GCHT =18 /* In Local Chat with Guru */ -var NODE_CHAT =19 /* In Chat Section */ -var NODE_SYSP =20 /* Sysop Activity */ -var NODE_TQWK =21 /* Transferring QWK packet */ -var NODE_PCHT =22 /* In Private Chat */ -var NODE_PAGE =23 /* Paging another node for Private Chat */ -var NODE_RFSD =24 /* Retrieving file from seq dev (aux=dev) */ -var NODE_LAST_ACTION =25 /* Must be last */ - /********************************************/ - - /********************************************/ -var NodeAction =[ /* Node.action value descriptions */ - "at main menu" /********************************************/ - ,"reading messages" - ,"reading mail" - ,"sending mail" - ,"reading text files" - ,"reading sent mail" - ,"posting message" - ,"posting auto-message" - ,"at external program menu" - ,"changing defaults" - ,"at transfer menu" - ,"downloading" - ,"uploading" - ,"transferring bidirectional" - ,"listing files" - ,"logging on" - ,"in local chat with %s" - ,"in multinode chat" - ,"chatting with %s" - ,"in chat section" - ,"performing sysop activities" - ,"transferring QWK packet" - ,"in private chat with node %u" - ,"paging node %u for private chat" - ,"retrieving from device #%d" - ]; - - /********************************************/ - /* Bit values for Node.misc */ - /********************************************/ -var NODE_ANON =(1<<0) /* Anonymous User */ -var NODE_LOCK =(1<<1) /* Locked for sysops only */ -var NODE_INTR =(1<<2) /* Interrupted - hang up */ -var NODE_MSGW =(1<<3) /* Message is waiting (old way) */ -var NODE_POFF =(1<<4) /* Page disabled */ -var NODE_AOFF =(1<<5) /* Activity Alert disabled */ -var NODE_UDAT =(1<<6) /* User data has been updated */ -var NODE_RRUN =(1<<7) /* Re-run this node when log off */ -var NODE_EVENT =(1<<8) /* Must run node event after log off */ -var NODE_DOWN =(1<<9) /* Down this node after logoff */ -var NODE_RPCHT =(1<<10) /* Reset private chat */ -var NODE_NMSG =(1<<11) /* Node message waiting (new way) */ -var NODE_EXT =(1<<12) /* Extended info on node action */ -var NODE_LCHAT =(1<<13) /* Being pulled into local chat */ - /********************************************/ - diff --git a/exec/load/sbbsdefs.js b/exec/load/sbbsdefs.js deleted file mode 100644 index a49ea72df3..0000000000 --- a/exec/load/sbbsdefs.js +++ /dev/null @@ -1,517 +0,0 @@ -/* sbbsdefs.js */ - -/* Synchronet Object Model var ants definitions - (mostly bit-fields) */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2001 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -load("nodedefs.js"); - -/* Would rather use const than var, but end up with redeclaration errors. */ - - /********************************************/ - /* system.settings */ - /********************************************/ -var SYS_CLOSED =(1<<0) /* System is closed to New Users */ -var SYS_SYSSTAT =(1<<1) /* Sysops activity included in statistics */ -var SYS_NOBEEP =(1<<2) /* No beep sound locally */ -var SYS_PWEDIT =(1<<3) /* Allow users to change their passwords */ -var SYS_RA_EMU =(1<<4) /* Reverse R/A commands at msg read prompt */ -var SYS_ANON_EM =(1<<5) /* Allow anonymous e-mail */ -var SYS_LISTLOC =(1<<6) /* Use location of caller in user lists */ -var SYS_WILDCAT =(1<<7) /* Expand Wildcat color codes in messages */ -var SYS_PCBOARD =(1<<8) /* Expand PCBoard color codes in messages */ -var SYS_WWIV =(1<<9) /* Expand WWIV color codes in messages */ -var SYS_CELERITY =(1<<10) /* Expand Celerity color codes in messages */ -var SYS_RENEGADE =(1<<11) /* Expand Renegade color codes in messages */ -var SYS_ECHO_PW =(1<<12) /* Echo passwords locally */ -var SYS_REQ_PW =(1<<13) /* Require passwords locally */ -var SYS_L_SYSOP =(1<<14) /* Allow local sysop logon/commands */ -var SYS_R_SYSOP =(1<<15) /* Allow remote sysop logon/commands */ -var SYS_QUOTE_EM =(1<<16) /* Allow quoting of e-mail */ -var SYS_EURODATE =(1<<17) /* Europian date format (DD/MM/YY) */ -var SYS_MILITARY =(1<<18) /* Military time format */ -var SYS_TIMEBANK =(1<<19) /* Allow time bank functions */ -var SYS_FILE_EM =(1<<20) /* Allow file attachments in E-mail */ -var SYS_SHRTPAGE =(1<<21) /* Short sysop page */ -var SYS_TIME_EXP =(1<<22) /* Set to expired values if out-of-time */ -var SYS_FASTMAIL =(1<<23) /* Fast e-mail storage mode */ -var SYS_QVALKEYS =(1<<24) /* Quick validation keys enabled */ -var SYS_ERRALARM =(1<<25) /* Error beeps on */ -var SYS_FWDTONET =(1<<26) /* Allow forwarding of e-mail to netmail */ -var SYS_DELREADM =(1<<27) /* Delete read mail automatically */ -var SYS_NOCDTCVT =(1<<28) /* No credit to minute conversions allowed */ -var SYS_DELEMAIL =(1<<29) /* Physically remove deleted e-mail immed. */ -var SYS_USRVDELM =(1<<30) /* Users can see deleted msgs */ -var SYS_SYSVDELM =(1<<31) /* Sysops can see deleted msgs */ - /********************************************/ - - /********************************************/ - /* bbs.sys_status */ - /********************************************/ -var SS_UNUSED =(1<<0) /* Unused */ -var SS_INITIAL =(1<<1) /* The bbs data has been initialized. */ -var SS_TMPSYSOP =(1<<2) /* Temporary Sysop Status */ -var SS_USERON =(1<<3) /* A User is logged on to the BBS */ -var SS_LCHAT =(1<<4) /* Local chat in progress */ -var SS_CAP =(1<<5) /* Capture is on */ -var SS_ANSCAP =(1<<6) /* Capture ANSI codes too */ -var SS_FINPUT =(1<<7) /* Using file for input */ -var SS_COMISR =(1<<8) /* Com port ISR is installed */ -var SS_DAILY =(1<<9) /* Execute System Daily Event on logoff */ -var SS_INUEDIT =(1<<10) /* Inside Alt-Useredit section */ -var SS_ABORT =(1<<11) /* Global abort input or output flag */ -var SS_SYSPAGE =(1<<12) /* Paging sysop */ -var SS_SYSALERT =(1<<13) /* Notify sysop when users hangs up */ -var SS_GURUCHAT =(1<<14) /* Guru chat in progress */ -var SS_UNUSED2 =(1<<15) /* not used in v3 (used to be SS_NODEDAB) */ -var SS_EVENT =(1<<16) /* Time shortened due to upcoming event */ -var SS_PAUSEON =(1<<17) /* Pause on, overriding user default */ -var SS_PAUSEOFF =(1<<18) /* Pause off, overriding user default */ -var SS_IN_CTRLP =(1<<19) /* Inside ctrl-p send node message func */ -var SS_NEWUSER =(1<<20) /* New User online */ -var SS_MDMDEBUG =(1<<21) /* Modem debug output */ -var SS_NEST_PF =(1<<22) /* Nested in printfile function */ -var SS_DCDHIGH =(1<<23) /* Assume DCD is high always */ -var SS_SPLITP =(1<<24) /* Split-screen private chat */ -var SS_NEWDAY =(1<<25) /* Date changed while online */ -var SS_RLOGIN =(1<<26) /* Current login via BSD RLogin */ -var SS_FILEXFER =(1<<27) /* File transfer in progress, halt spy */ - /********************************************/ - - /********************************************/ - /* bbs.startup_options */ - /********************************************/ -var BBS_OPT_KEEP_ALIVE =(1<<0) /* Send keep-alives */ -var BBS_OPT_XTRN_MINIMIZED =(1<<1) /* Run externals minimized */ -var BBS_OPT_AUTO_LOGON =(1<<2) /* Auto-logon via IP */ -var BBS_OPT_DEBUG_TELNET =(1<<3) /* Debug telnet commands */ -var BBS_OPT_SYSOP_AVAILABLE =(1<<4) /* Available for chat */ -var BBS_OPT_ALLOW_RLOGIN =(1<<5) /* Allow logins via BSD RLogin */ -var BBS_OPT_USE_2ND_RLOGIN =(1<<6) /* Use 2nd username in BSD RLogin */ -var BBS_OPT_NO_QWK_EVENTS =(1<<7) /* Don't run QWK-related events */ -var BBS_OPT_NO_HOST_LOOKUP =(1<<11)/* Don't lookup hostname */ -var BBS_OPT_NO_JAVASCRIPT =(1<<29)/* JavaScript disabled */ -var BBS_OPT_LOCAL_TIMEZONE =(1<<30)/* Don't force UCT/GMT */ -var BBS_OPT_MUTE =(1<<31)/* Mute sounds */ - /*******************************************/ - - /********************************************/ - /* bbs.online */ - /********************************************/ -var ON_LOCAL =1 /* Online locally (events only in v3) */ -var ON_REMOTE =2 /* Online remotely */ - /********************************************/ - - /********************************************/ - /* console.status */ - /********************************************/ -var CON_R_ECHO =(1<<0) /* Echo remotely */ -var CON_R_ECHOX =(1<<1) /* Echo X's to remote user */ -var CON_R_INPUT =(1<<2) /* Accept input remotely */ -var CON_L_ECHO =(1<<3) /* Echo locally */ -var CON_L_ECHOX =(1<<4) /* Echo X's locally */ -var CON_L_INPUT =(1<<5) /* Accept input locally */ -var CON_RAW_IN =(1<<8) /* Raw input mode - no editing capabilities */ -var CON_ECHO_OFF =(1<<10) /* Remote & Local echo disabled for ML/MF */ -var CON_UPARROW =(1<<11) /* Up arrow hit - move up one line */ -var CON_NO_INACT =(1<<13) /* User inactivity detection disabled */ - /********************************************/ - - /********************************************/ - /* console.attributes, also used for ansi() */ - /********************************************/ -var BLINK =0x80 /* blink bit */ -var HIGH =0x08 /* high intensity foreground bit */ - - /* foreground colors */ -var BLACK =0 /* dark colors (HIGH bit unset) */ -var BLUE =1 -var GREEN =2 -var CYAN =3 -var RED =4 -var MAGENTA =5 -var BROWN =6 -var LIGHTGRAY =7 -var DARKGRAY =8 /* light colors (HIGH bit set) */ -var LIGHTBLUE =9 -var LIGHTGREEN =10 -var LIGHTCYAN =11 -var LIGHTRED =12 -var LIGHTMAGENTA =13 -var YELLOW =14 -var WHITE =15 - - /* background colors */ -var ANSI_NORMAL =0x100 /* special value for ansi() */ -var BG_BLACK =0x200 /* special value for ansi() */ -var BG_BLUE =(BLUE<<4) -var BG_GREEN =(GREEN<<4) -var BG_CYAN =(CYAN<<4) -var BG_RED =(RED<<4) -var BG_MAGENTA =(MAGENTA<<4) -var BG_BROWN =(BROWN<<4) -var BG_LIGHTGRAY =(LIGHTGRAY<<4) - - /********************************************/ - /* user.settings */ - /********************************************/ -var USER_DELETED =(1<<0) /* Deleted user slot */ -var USER_ANSI =(1<<1) /* Supports ANSI terminal emulation */ -var USER_COLOR =(1<<2) /* Send color codes */ -var USER_RIP =(1<<3) /* Supports RIP terminal emulation */ -var USER_PAUSE =(1<<4) /* Pause on every screen full */ -var USER_SPIN =(1<<5) /* Spinning cursor - Same as K_SPIN */ -var USER_INACTIVE =(1<<6) /* Inactive user slot */ -var USER_EXPERT =(1<<7) /* Expert menu mode */ -var USER_ANFSCAN =(1<<8) /* Auto New file scan */ -var USER_CLRSCRN =(1<<9) /* Clear screen before each message */ -var USER_QUIET =(1<<10) /* Quiet mode upon logon */ -var USER_BATCHFLAG=(1<<11) /* File list allow batch dl flags */ -var USER_NETMAIL =(1<<12) /* Forward e-mail to fidonet addr */ -var USER_CURSUB =(1<<13) /* Remember current sub-board/dir */ -var USER_ASK_NSCAN=(1<<14) /* Ask for newscanning upon logon */ -var USER_NO_EXASCII=(1<<15) /* Don't send extended ASCII */ -var USER_ASK_SSCAN=(1<<16) /* Ask for messages to you at logon */ -var USER_AUTOTERM =(1<<17) /* Autodetect terminal type */ -var USER_COLDKEYS =(1<<18) /* No hot-keys */ -var USER_EXTDESC =(1<<19) /* Extended file descriptions */ -var USER_AUTOHANG =(1<<20) /* Auto-hang-up after transfer */ -var USER_WIP =(1<<21) /* Supports WIP terminal emulation */ -var USER_AUTOLOGON=(1<<22) /* AutoLogon via IP */ - /********************************************/ - - /********************************************/ - /* user.qwk_settings */ - /********************************************/ -var QWK_FILES =(1<<0) /* Include new files list */ -var QWK_EMAIL =(1<<1) /* Include unread e-mail */ -var QWK_ALLMAIL =(1<<2) /* Include ALL e-mail */ -var QWK_DELMAIL =(1<<3) /* Delete e-mail after download */ -var QWK_BYSELF =(1<<4) /* Include messages from self */ -var QWK_UNUSED =(1<<5) /* Currently unused */ -var QWK_EXPCTLA =(1<<6) /* Expand ctrl-a codes to ascii */ -var QWK_RETCTLA =(1<<7) /* Retain ctrl-a codes */ -var QWK_ATTACH =(1<<8) /* Include file attachments */ -var QWK_NOINDEX =(1<<9) /* Do not create index files in QWK */ -var QWK_TZ =(1<<10) /* Include "@TZ" time zone in msgs */ -var QWK_VIA =(1<<11) /* Include "@VIA" seen-bys in msgs */ -var QWK_NOCTRL =(1<<12) /* No extraneous control files */ - /********************************************/ - - /********************************************/ - /* user.chat_settings */ - /********************************************/ -var CHAT_ECHO =(1<<0) /* Multinode chat echo */ -var CHAT_ACTION =(1<<1) /* Chat actions */ -var CHAT_NOPAGE =(1<<2) /* Can't be paged */ -var CHAT_NOACT =(1<<3) /* No activity alerts */ -var CHAT_SPLITP =(1<<4) /* Split screen private chat */ - /********************************************/ - - -/************************************************************************/ -/* Valid flags for user.security.exempt/restrict/flags */ -/************************************************************************/ -var UFLAG_A =(1<<0) -var UFLAG_B =(1<<1) -var UFLAG_C =(1<<2) -var UFLAG_D =(1<<3) -var UFLAG_E =(1<<4) -var UFLAG_F =(1<<5) -var UFLAG_G =(1<<6) -var UFLAG_H =(1<<7) -var UFLAG_I =(1<<8) -var UFLAG_J =(1<<9) -var UFLAG_K =(1<<10) -var UFLAG_L =(1<<11) -var UFLAG_M =(1<<12) -var UFLAG_N =(1<<13) -var UFLAG_O =(1<<14) -var UFLAG_P =(1<<15) -var UFLAG_Q =(1<<16) -var UFLAG_R =(1<<17) -var UFLAG_S =(1<<18) -var UFLAG_T =(1<<19) -var UFLAG_U =(1<<20) -var UFLAG_V =(1<<21) -var UFLAG_W =(1<<22) -var UFLAG_X =(1<<23) -var UFLAG_Y =(1<<24) -var UFLAG_Z =(1<<25) - - /********************************************/ - /* Bits in 'mode' for getkey and getstr */ - /********************************************/ -var K_UPPER =(1<<0) /* Converts all letters to upper case */ -var K_UPRLWR =(1<<1) /* Upper/Lower case automatically */ -var K_NUMBER =(1<<2) /* Allow numbers only */ -var K_WRAP =(1<<3) /* Allows word wrap */ -var K_MSG =(1<<4) /* Allows ANSI, ^N ^A ^G */ -var K_SPIN =(1<<5) /* Spinning cursor (same as SPIN) */ -var K_LINE =(1<<6) /* Input line (inverse color) */ -var K_EDIT =(1<<7) /* Edit string passed */ -var K_CHAT =(1<<8) /* In chat multi-chat */ -var K_NOCRLF =(1<<9) /* Don't print CRLF after string input */ -var K_ALPHA =(1<<10) /* Only allow alphabetic characters */ -var K_GETSTR =(1<<11) /* getkey called from getstr() */ -var K_LOWPRIO =(1<<12) /* low priority input */ -var K_NOEXASC =(1<<13) /* No extended ASCII allowed */ -var K_E71DETECT =(1<<14) /* Detect E-7-1 terminal type */ -var K_AUTODEL =(1<<15) /* Auto-delete text (used with K_EDIT) */ -var K_COLD =(1<<16) /* Possible cold key mode */ -var K_NOECHO =(1<<17) /* Don't echo input */ -var K_TAB =(1<<18) /* Treat TAB key as CR */ - /********************************************/ - - /********************************************/ - /* Bits in 'mode' for putmsg and printfile */ - /********************************************/ -var P_NOABORT =(1<<0) /* Disallows abortion of a message */ -var P_SAVEATR =(1<<1) /* Save the new current attributres after */ - /* msg has printed */ -var P_NOATCODES =(1<<2) /* Don't allow @ codes */ -var P_OPENCLOSE =(1<<3) /* Open and close the file */ - /********************************************/ - - /********************************************/ - /* system.new_user_questions */ - /********************************************/ -var UQ_ALIASES =(1<<0) /* Ask for alias */ -var UQ_LOCATION =(1<<1) /* Ask for location */ -var UQ_ADDRESS =(1<<2) /* Ask for address */ -var UQ_PHONE =(1<<3) /* Ask for phone number */ -var UQ_HANDLE =(1<<4) /* Ask for chat handle */ -var UQ_DUPHAND =(1<<5) /* Search for duplicate handles */ -var UQ_SEX =(1<<6) /* Ask for sex */ -var UQ_BIRTH =(1<<7) /* Ask for birth date */ -var UQ_COMP =(1<<8) /* Ask for computer type */ -var UQ_MC_COMP =(1<<9) /* Multiple choice computer type */ -var UQ_REALNAME =(1<<10) /* Ask for real name */ -var UQ_DUPREAL =(1<<11) /* Search for duplicate real names */ -var UQ_COMPANY =(1<<12) /* Ask for company name */ -var UQ_NOEXASC =(1<<13) /* Don't allow ex-ASCII in user text */ -var UQ_CMDSHELL =(1<<14) /* Ask for command shell */ -var UQ_XEDIT =(1<<15) /* Ask for external editor */ -var UQ_NODEF =(1<<16) /* Don't ask for default settings */ -var UQ_NOCOMMAS =(1<<17) /* Do not require commas in location */ - /********************************************/ - - /********************************************/ - /* node.settings */ - /********************************************/ -var NM_ANSALARM =(1<<0) /* Alarm locally on answer */ -var NM_WFCSCRN =(1<<1) /* Wait for call screen */ -var NM_WFCMSGS =(1<<2) /* Include total messages/files on WFC */ -var NM_LCL_EDIT =(1<<3) /* Use local editor to create messages */ -var NM_EMSOVL =(1<<4) /* Use expanded memory of overlays */ -var NM_WINOS2 =(1<<5) /* Use Windows/OS2 time slice API call */ -var NM_INT28 =(1<<6) /* Make int 28 DOS idle calls */ -var NM_NODV =(1<<7) /* Don't detect and use DESQview API */ -var NM_NO_NUM =(1<<8) /* Don't allow logons by user number */ -var NM_LOGON_R =(1<<9) /* Allow logons by user real name */ -var NM_LOGON_P =(1<<10) /* Secure logons (always ask for password) */ -var NM_NO_LKBRD =(1<<11) /* No local keyboard (at all) */ -var NM_SYSPW =(1<<12) /* Protect WFC keys and Alt keys with SY: */ -var NM_NO_INACT =(1<<13) /* No local inactivity alert/logoff */ -var NM_NOBEEP =(1<<14) /* Don't beep locally */ -var NM_LOWPRIO =(1<<15) /* Always use low priority input */ -var NM_7BITONLY =(1<<16) /* Except 7-bit input only (E71 terminals) */ -var NM_RESETVID =(1<<17) /* Reset video mode between callers? */ -var NM_NOPAUSESPIN=(1<<18) /* No spinning cursor at pause prompt */ - /********************************************/ - - /********************************************/ - /* netmail_misc */ - /********************************************/ -var NMAIL_ALLOW =(1<<0) /* Allow NetMail */ -var NMAIL_CRASH =(1<<1) /* Default netmail to crash */ -var NMAIL_HOLD =(1<<2) /* Default netmail to hold */ -var NMAIL_KILL =(1<<3) /* Default netmail to kill after sent */ -var NMAIL_ALIAS =(1<<4) /* Use Aliases in NetMail */ -var NMAIL_FILE =(1<<5) /* Allow file attachments */ -var NMAIL_DIRECT =(1<<6) /* Default netmail to direct */ - /********************************************/ - - /********************************************/ - /* Bit values for sub[x].settings */ - /********************************************/ -var SUB_QNET =(1<<3) /* Sub-board is netted via QWK network */ -var SUB_PNET =(1<<4) /* Sub-board is netted via PostLink */ -var SUB_FIDO =(1<<5) /* Sub-board is netted via FidoNet */ -var SUB_PRIV =(1<<6) /* Allow private posts on sub */ -var SUB_PONLY =(1<<7) /* Private posts only */ -var SUB_ANON =(1<<8) /* Allow anonymous posts on sub */ -var SUB_AONLY =(1<<9) /* Anonymous only */ -var SUB_NAME =(1<<10) /* Must use real names */ -var SUB_DEL =(1<<11) /* Allow users to delete messages */ -var SUB_DELLAST =(1<<12) /* Allow users to delete last msg only */ -var SUB_FORCED =(1<<13) /* Sub-board is forced scanning */ -var SUB_NOTAG =(1<<14) /* Don't add tag or origin lines */ -var SUB_TOUSER =(1<<15) /* Prompt for to user on posts */ -var SUB_ASCII =(1<<16) /* ASCII characters only */ -var SUB_QUOTE =(1<<17) /* Allow online quoting */ -var SUB_NSDEF =(1<<18) /* New-Scan on by default */ -var SUB_INET =(1<<19) /* Sub-board is netted via Internet */ -var SUB_FAST =(1<<20) /* Fast storage mode */ -var SUB_KILL =(1<<21) /* Kill read messages automatically */ -var SUB_KILLP =(1<<22) /* Kill read pvt messages automatically */ -var SUB_SYSPERM =(1<<23) /* Sysop messages are permament */ -var SUB_GATE =(1<<24) /* Gateway between Network types */ -var SUB_LZH =(1<<25) /* Use LZH compression for msgs */ -var SUB_SSDEF =(1<<26) /* Default ON for Scan for Your msgs */ -var SUB_HYPER =(1<<27) /* Hyper allocation */ - /********************************************/ - - /********************************************/ - /* Bit values for dir[x].settings */ - /********************************************/ -var DIR_FCHK =(1<<0) /* Check for file existance */ -var DIR_RATE =(1<<1) /* Force uploads to be rated G,R, or X */ -var DIR_MULT =(1<<2) /* Ask for multi-disk numbering */ -var DIR_DUPES =(1<<3) /* Search this dir for upload dupes */ -var DIR_FREE =(1<<4) /* Free downloads */ -var DIR_TFREE =(1<<5) /* Time to download is free */ -var DIR_CDTUL =(1<<6) /* Credit Uploads */ -var DIR_CDTDL =(1<<7) /* Credit Downloads */ -var DIR_ANON =(1<<8) /* Anonymous uploads */ -var DIR_AONLY =(1<<9) /* Anonymous only */ -var DIR_ULDATE =(1<<10) /* Include upload date in listing */ -var DIR_DIZ =(1<<11) /* FILE_ID.DIZ and DESC.SDI support */ -var DIR_NOSCAN =(1<<12) /* Don't new-scan this directory */ -var DIR_NOAUTO =(1<<13) /* Don't auto-add this directory */ -var DIR_ULTIME =(1<<14) /* Deduct time during uploads */ -var DIR_CDTMIN =(1<<15) /* Give uploader minutes instead of cdt */ -var DIR_SINCEDL =(1<<16) /* Purge based on days since last dl */ -var DIR_MOVENEW =(1<<17) /* Files marked as new when moved */ - /********************************************/ - - /********************************************/ - /* Bit values for file.settings */ - /********************************************/ -var FILE_EXTDESC =(1<<0) /* Extended description exists */ -var FILE_ANON =(1<<1) /* Anonymous upload */ - /********************************************/ - - /********************************************/ - /* Bits in the mode of bbs.exec() */ - /********************************************/ -var EX_SH =(1<<0) /* Use system shell to load other process */ -var EX_OUTR =(1<<1) /* Copy DOS output to remote */ -var EX_OUTL =(1<<2) /* Use _lputc() for local DOS output */ -var EX_INR =(1<<3) /* Trap int 16h keyboard input requests */ -var EX_WWIV =(1<<4) /* Expand WWIV color codes to ANSI sequence */ -var EX_SWAP =(1<<5) /* Swap out for this external */ -var EX_POPEN =(1<<7) /* Leave COM port open */ -var EX_OFFLINE =(1<<8) /* Run this program offline */ -var EX_NATIVE =(1<<9) /* Native 32-bit application */ -var EX_BG =(1<<10) /* Back-ground/detached process */ -var EX_BIN =(1<<11) /* Binary mode (no Unix LF to CR/LF) */ - /********************************************/ - - /********************************************/ - /* Values for bbs.user_event() */ - /********************************************/ -var EVENT_LOGON =1 /* Execute during logon sequence */ -var EVENT_LOGOFF =2 /* Execute during logoff sequence */ -var EVENT_NEWUSER =3 /* Execute during newuser app. */ -var EVENT_BIRTHDAY=4 /* Execute on birthday */ - /********************************************/ - - /********************************************/ - /* Bits in mode of bbs.telnet_gate() */ - /********************************************/ -var TG_ECHO =(1<<0) /* Turn on telnet echo */ -var TG_CRLF =(1<<1) /* Expand sole CR to CRLF */ -var TG_LINEMODE =(1<<2) /* Send entire lines only */ -var TG_NODESYNC =(1<<3) /* Call Nodesync, get msgs, etc. */ -var TG_CTRLKEYS =(1<<4) /* Interpret ^P ^U ^T, etc locally */ -var TG_PASSTHRU =(1<<5) /* Pass-through telnet commands/responses */ -var TG_RLOGIN =(1<<6) /* Use BSD RLogin protocol */ - /********************************************/ - - /********************************************/ - /* Bits in console.telnet_mode */ - /********************************************/ -var TELNET_MODE_BIN_RX=(1<<0) /* Binary receive (no CR to CRLF xlat) */ -var TELNET_MODE_ECHO =(1<<1) /* Echo remotely */ -var TELNET_MODE_GATE =(1<<2) /* Pass-through telnet commands/responses */ - /********************************************/ - - /* Message attributes */ -var MSG_PRIVATE =(1<<0) -var MSG_READ =(1<<1) -var MSG_PERMANENT =(1<<2) -var MSG_LOCKED =(1<<3) -var MSG_DELETE =(1<<4) -var MSG_ANONYMOUS =(1<<5) -var MSG_KILLREAD =(1<<6) -var MSG_MODERATED =(1<<7) -var MSG_VALIDATED =(1<<8) -var MSG_REPLIED =(1<<9) // User replied to this message - - /* Auxillary header attributes */ -var MSG_FILEREQUEST =(1<<0) // File request -var MSG_FILEATTACH =(1<<1) // File(s) attached to Msg -var MSG_TRUNCFILE =(1<<2) // Truncate file(s) when sent -var MSG_KILLFILE =(1<<3) // Delete file(s) when sent -var MSG_RECEIPTREQ =(1<<4) // Return receipt requested -var MSG_CONFIRMREQ =(1<<5) // Confirmation receipt requested -var MSG_NODISP =(1<<6) // Msg may not be displayed to user - - /* Message network attributes */ -var MSG_LOCAL =(1<<0) // Msg created locally -var MSG_INTRANSIT =(1<<1) // Msg is in-transit -var MSG_SENT =(1<<2) // Sent to remote -var MSG_KILLSENT =(1<<3) // Kill when sent -var MSG_ARCHIVESENT =(1<<4) // Archive when sent -var MSG_HOLD =(1<<5) // Hold for pick-up -var MSG_CRASH =(1<<6) // Crash -var MSG_IMMEDIATE =(1<<7) // Send Msg now, ignore restrictions -var MSG_DIRECT =(1<<8) // Send directly to destination -var MSG_GATE =(1<<9) // Send via gateway -var MSG_ORPHAN =(1<<10)// Unknown destination -var MSG_FPU =(1<<11)// Force pickup -var MSG_TYPELOCAL =(1<<12)// Msg is for local use only -var MSG_TYPEECHO =(1<<13)// Msg is for conference distribution -var MSG_TYPENET =(1<<14)// Msg is direct network mail - - /* Net types */ -var NET_NONE =0 // Local message -var NET_UNKNOWN =1 // Networked, but unknown type -var NET_FIDO =2 // FidoNet -var NET_POSTLINK =3 // PostLink -var NET_QWK =4 // QWK -var NET_INTERNET =5 // NNTP -var NET_WWIV =6 // WWIV -var NET_MHS =7 // MHS diff --git a/exec/load/sockdefs.js b/exec/load/sockdefs.js deleted file mode 100644 index 1745d820fb..0000000000 --- a/exec/load/sockdefs.js +++ /dev/null @@ -1,127 +0,0 @@ -/* sockdefs.js */ - -/* - * Constants and structures defined by the internet system, - * Per RFC 790, September 1981, taken from the BSD file netinet/in.h. - */ - -/* $Id$ */ - -/* - * Protocols - */ -var IPPROTO_IP =0 /* dummy for IP */ -var IPPROTO_ICMP =1 /* control message protocol */ -var IPPROTO_IGMP =2 /* internet group management protocol */ -var IPPROTO_GGP =3 /* gateway^2 (deprecated) */ -var IPPROTO_TCP =6 /* tcp */ -var IPPROTO_PUP =12 /* pup */ -var IPPROTO_UDP =17 /* user datagram protocol */ -var IPPROTO_IDP =22 /* xns idp */ -var IPPROTO_ND =77 /* UNOFFICIAL net disk proto */ - -var IPPROTO_RAW =255 /* raw IP packet */ -var IPPROTO_MAX =256 - -/* - * Port/socket numbers: network standard functions - */ -var IPPORT_ECHO =7 -var IPPORT_DISCARD =9 -var IPPORT_SYSTAT =11 -var IPPORT_DAYTIME =13 -var IPPORT_NETSTAT =15 -var IPPORT_FTP =21 -var IPPORT_TELNET =23 -var IPPORT_SMTP =25 -var IPPORT_TIMESERVER =37 -var IPPORT_NAMESERVER =42 -var IPPORT_WHOIS =43 -var IPPORT_MTP =57 - -/* - * Port/socket numbers: host specific functions - */ -var IPPORT_TFTP =69 -var IPPORT_RJE =77 -var IPPORT_FINGER =79 -var IPPORT_TTYLINK =87 -var IPPORT_SUPDUP =95 - -/* - * UNIX TCP sockets - */ -var IPPORT_EXECSERVER =512 -var IPPORT_LOGINSERVER =513 -var IPPORT_CMDSERVER =514 -var IPPORT_EFSSERVER =520 - -/* - * UNIX UDP sockets - */ -var IPPORT_BIFFUDP =512 -var IPPORT_WHOSERVER =513 -var IPPORT_ROUTESERVER =520 - /* 520+1 also used */ - -/* - * Ports < IPPORT_RESERVED are reserved for - * privileged processes (e.g. root). - */ -var IPPORT_RESERVED =1024 - -/* - * Types - */ -var SOCK_STREAM =1 /* stream socket */ -var SOCK_DGRAM =2 /* datagram socket */ -var SOCK_RAW =3 /* raw-protocol interface */ -var SOCK_RDM =4 /* reliably-delivered message */ -var SOCK_SEQPACKET =5 /* sequenced packet stream */ - -/* - * Option flags per-socket. - */ -var SO_DEBUG =0x0001 /* turn on debugging info recording */ -var SO_ACCEPTCONN =0x0002 /* socket has had listen() */ -var SO_REUSEADDR =0x0004 /* allow local address reuse */ -var SO_KEEPALIVE =0x0008 /* keep connections alive */ -var SO_DONTROUTE =0x0010 /* just use interface addresses */ -var SO_BROADCAST =0x0020 /* permit sending of broadcast msgs */ -var SO_USELOOPBACK =0x0040 /* bypass hardware when possible */ -var SO_LINGER =0x0080 /* linger on close if data present */ -var SO_OOBINLINE =0x0100 /* leave received OOB data in line */ - -var SO_DONTLINGER =(~SO_LINGER) - -/* - * Additional options. - */ -var SO_SNDBUF =0x1001 /* send buffer size */ -var SO_RCVBUF =0x1002 /* receive buffer size */ -var SO_SNDLOWAT =0x1003 /* send low-water mark */ -var SO_RCVLOWAT =0x1004 /* receive low-water mark */ -var SO_SNDTIMEO =0x1005 /* send timeout */ -var SO_RCVTIMEO =0x1006 /* receive timeout */ -var SO_ERROR =0x1007 /* get error status and clear */ -var SO_TYPE =0x1008 /* get socket type */ - -/* - * WinSock 2 extension -- new options - */ -var SO_GROUP_ID =0x2001 /* ID of a socket group */ -var SO_GROUP_PRIORITY =0x2002 /* the relative priority within a group*/ -var SO_MAX_MSG_SIZE =0x2003 /* maximum message size */ -var SO_PROTOCOL_INFOA =0x2004 /* WSAPROTOCOL_INFOA structure */ -var SO_PROTOCOL_INFOW =0x2005 /* WSAPROTOCOL_INFOW structure */ -var PVD_CONFIG =0x3001 /* configuration info for service provider */ - -/* - * TCP options. - */ -var TCP_NODELAY =0x0001 - -/* - * Level number for (get/set)sockopt() to apply to socket itself. - */ -var SOL_SOCKET =0xffff /* options for socket level */ diff --git a/exec/login.src b/exec/login.src deleted file mode 100644 index 9e4f989a66..0000000000 --- a/exec/login.src +++ /dev/null @@ -1,90 +0,0 @@ -# login.src - -# Login module for Synchronet BBS v2.2+ - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -logout - -node_status NODE_LOGON - -compare_ars WIP -if_true - exec_bin WIPLOGIN - return - end_if - -int c -int guest - -set str "Guest" -matchuser guest str # save Guest account number in guest - -:top -compare c 10 -if_greater_or_equal - hangup - return - end_if - -compare guest 0 # Guest account? -if_greater - print "\r\n\1nEnter Name, Number, '\1hNew\1n', or '\1hGuest\1n'\r\nNN: " -else - print "\r\n\1nEnter Name, Number, or '\1hNew\1n'\r\nNN: " - end_if -getstr str 25 K_UPRLWR|K_LOWPRIO|K_E71DETECT|K_TAB -truncsp str -compare_str "" -if_true - add c 1 - goto top - end_if -compare_str "GUEST" -if_true - setstr "%q" - compare_str "VERTx" - if_true - no_yes "Are you a registered Synchronet owner" - if_false - print "\r\n\1h\1rLogon as \1wNEW\1r to create your account.\r\n" - goto top - end_if - end_if - setstr "Guest" - end_if -compare_str "NEW" -if_true - setstr "%q" - compare_str "VERTx" - if_true - yes_no "Are you calling just to download the Synchronet DEMO" - if_true - setstr "Guest" - login "PW: " - if_true - logon - if_true - return - end_if - end_if - end_if - end_if - newuser - logon - return - end_if -login "PW: " -if_true - logon - if_true - return - end_if - end_if -add c 2 -goto top - diff --git a/exec/logon.src b/exec/logon.src deleted file mode 100644 index 1f96b71ab5..0000000000 --- a/exec/logon.src +++ /dev/null @@ -1,154 +0,0 @@ -# logon.src - -# Synchronet v2.20 Logon Module - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -or _node_misc NM_NOPAUSESPIN # Disable spinning cursor at pause prompts - -compare_ars rest G -if_true - :get_name - print "\1y\1hFor our records, please enter your full name: \1w" - getname 25 - compare_str "" - if_true - goto get_name - end_if - log "Guest: " - logstr - set_user_string user_string_realname - - :get_loc - print "\1y\1hPlease enter your location (City, State): \1w" - getname 30 - compare_str "" - if_true - goto get_loc - end_if - log " " - logstr - set_user_string user_string_location - -# :get_phone -# print "\1y\1hPlease enter your voice telephone number: " -# get_template nnn-nnn-nnnn -# compare_str "" -# if_true -# goto get_phone -# end_if -# log " " -# logstr -# set_user_string user_string_phone - log "\r\n" - :get_mag - print "yhWhere did you hear about this BBS?\r\n: w" - getstr 70 - compare_str "" - if_true - goto get_mag - end_if - logstr - log "\r\n" - end_if - -#compare_ars rest G or rest X or flag S -#if_false -# no_yes Do you want to enter the \1cSynchronet Match Maker\1b -# if_false -# exec_xtrn smm -# end_if -# end_if - -# Force split-screen chat on ANSI users -compare_user_misc UM_ANSI -if_true - compare_user_chat CHAT_SPLITP - if_false - toggle_user_chat CHAT_SPLITP - end_if - end_if - -# Inactivity exemption -compare_ars exempt H -if_true - or _console CON_NO_INACT - end_if - -############################################################################### -# Replaces the 2.1 Logon stuff -############################## -int i - -# Logon screens - -compare_ars LOCAL -if_true - goto logon_event - end_if - -sprintf str "logon%ld" _useron.level -chkfile "%zmenu/%s.*" -if_true - menu "%s" - end_if - -set i 0 -:logon_screens - add i 1 - compare i 1 - if_equal - set str "logon" - else - sprintf str "logon%ld" i - end_if - chkfile "%zmenu/%s.*" - if_false - goto logon_event - end_if - menu "%s" - compare_user_misc UM_WIP - if_true - getkey - end_if - goto logon_screens - -:logon_event -cls -user_event event_logon - -# Last few callers -clear_abort -cls -str logonlst -set logonlst "%jlogon.lst" -get_file_length i logonlst -compare i 1 -if_less - print "\1n\1g\1hYou are the first caller of the day!\r\n" -else - print "\1n\1g\1hLast few callers:\1n\r\n" - printtail logonlst P_NOATCODES 4 - crlf - endif - -# Auto-message -setstr "%jmsgs/auto.msg" -get_file_length i str -compare i 0 -if_greater - printfile str P_NOATCODES - crlf - end_if - -# Automatically set shell to WIPSHELL -compare_user_misc UM_WIP -if_true - setstr "WIPSHELL" - set_shell - end_if - diff --git a/exec/major.src b/exec/major.src deleted file mode 100644 index c58e73c745..0000000000 --- a/exec/major.src +++ /dev/null @@ -1,349 +0,0 @@ -# major.src - -# MajorBBS Clone Command Shell for Synchronet - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -:main -cmd_home -menu major/main -getstr 10 -compare_str "" -if_true - end_cmd - end_if -ungetstr -getkey -node_action node_main -logkey_comma - -cmdkey ? - end_cmd - -cmdkey T - exec_bin chat_sec - end_cmd - -cmdkey I - text_file_section - end_cmd - -cmdkey F - call message - end_cmd - -cmdkey E - cmd_home - menu major/email - getstr 10 - compare_str "" - if_true - end_cmd - end_if - ungetstr - getkey - logkey - - cmdkey R - mail_read - end_cmd - - cmdkey W - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send - end_cmd - - cmdkey S - no_yes "\r\nAttach a file" - if_true - mail_send_netmail - else - mail_send_netfile - end_if - end_cmd - - cmdkey U - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send_file - end_cmd - - cmdkey E - mail_read_sent - end_cmd - - cmdkey X - cmd_pop - end_cmd - - end_cmd - -cmdkey L - call transfers - end_cmd - -cmdkey D - xtrn_section - end_cmd - -cmdkey A - cmd_home - menu major/userdefs - getstr 10 - compare_str "" - if_true - end_cmd - end_if - ungetstr - getkey - logkey - - cmdkey S - info_user - end_cmd - - cmdkey A - user_defaults - end_cmd - - cmdkey X - cmd_pop - end_cmd - - end_cmd - -cmdkey R - print "\r\nchList Users\r\n" - mnemonics "\r\n~Logons Today, ~Sub-board, or ~All: " - getcmd LSA\r - - cmdkey L - userlist_logons - end_cmd - cmdkey S - userlist_sub - end_cmd - cmdkey A - userlist_all - end_cmd - - # fall-through for CR, Ctrl-C, etc - end_cmd - -cmdkey S - compare_ars SYSOP or exempt Q or I or N - if_true - call sysop - end_if - end_cmd - -cmdkey X - file_download_batch - if_true - end_cmd - end_if - logoff - end_cmd - -end_cmd - -############################### Message Section ############################### - -:message -cmd_home -menu major/msg -getstr 10 -compare_str "" -if_true - end_cmd - end_if -ungetstr -getkey - -# Update node status -node_action node_main -logkey_comma - -cmdkey ? - end_cmd - -cmdkey X - cmd_pop - return - end_cmd - -cmdkey R - msg_read - end_cmd - -cmdkey W - msg_post - end_cmd - -cmdkey Q - cmd_home - menu major/quickscn - getstr 10 - compare_str "" - if_true - end_cmd - end_if - ungetstr - getkey - logkey - - cmdstr S - msg_new_scan - end_cmd - - cmdstr L - msg_your_scan - end_cmd - - cmdstr K - msg_find_text - end_cmd - - cmdstr C - cmd_home - menu maincfg - async - print "\r\nyhConfig: n" - getcmd ?QNPIS - logkey - - cmdkey ? - compare_ars expert - if_true - menu maincfg - end_if - end_cmd - - cmdkey N - msg_new_scan_cfg - end_cmd - - cmdkey S - msg_your_scan_cfg - end_cmd - - cmdkey P - msg_ptrs_cfg - end_cmd - - cmdkey I - msg_ptrs_reinit - end_cmd - - cmdkey Q - cmd_pop - end_cmd - - end_cmd - cmd_pop - end_cmd - -cmdkey T - exec_bin chat_sec - end_cmd - -cmdkey S - msg_select_area - end_cmd - -cmdkey F - call transfers - end_cmd - -cmd_pop -return - -############################ Transfer Menu Commands ########################### -:transfers -cmd_home -menu major/file -getstr 10 -compare_str "" -if_true - end_cmd - end_if -ungetstr -getkey -logkey - -cmdkey F - print "\r\nchList Files\r\n" - getfilespec - if_true - file_list - end_if - end_cmd - -cmdkey D - print "\r\nchDownload File(s)\r\n" - file_download_batch - if_true - end_cmd - end_if - getfilespec - if_true - file_download - end_if - end_cmd - -cmdkey U - print "\r\nchUpload File\r\n" - chkfile "%zmenu/upload.*" - if_true - menu upload - end_if - file_upload - end_cmd - -cmdkey S - file_select_area - end_cmd - -cmdkey X - cmd_pop - return - end_cmd - -end_cmd - -############################## Sysop Commands ################################# - -:sysop -menu sysmain -print "n\r\nchSelect an option (or X to exit): n" -getstrupr 40 - -compare_str "X" -if_true - return - end_if - -exec_bin str_cmds -goto sysop - diff --git a/exec/matrix.src b/exec/matrix.src deleted file mode 100644 index 0ac3c0142f..0000000000 --- a/exec/matrix.src +++ /dev/null @@ -1,172 +0,0 @@ -# matrix.src - -# Light-bar answer module for Synchronet BBS v2.2+ - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc -!define LAST 2 -logout -node_status NODE_LOGON - -compare_ars WIP -if_true - exec_bin WIPLOGIN - return - end_if - -int c m - -:top -compare c 10 -if_greater_or_equal - hangup - return - end_if - -# Trigger scripts with old style prompt -print "NN: " -pause_reset -cls -cmd_home -compare_user_misc UM_ANSI -if_true - print "\x1b[H" -else - cls - end_if - -print " " -print "4yh" -print "������������������������������ͻn\r\n" -print " " -print "4yh" -print "� Logon Matrix �nb��n\r\n" -print " " -print "4yh" -print "������������������������������nb��n\r\n" -print " 4yh� " -compare m 0 - if_equal - print "7bh" - else - print " 4wh" - end_if -print " Existing User Account " -print "4y �nb��n\r\n 4yh� " -compare m 1 - if_equal - print "7bh" - else - print " 4wh" - end_if -print " New User Account " -print "4y �nb��n\r\n 4yh� " -compare m 2 - if_equal - print "7bh" - else - print " 4wh" - end_if -print " Guest User Account " -print "4y �nb��n\r\n 4yh" -print "������������������������������ͼnb��n\r\nnb" -print " " -print " ��������������������������������n\r\n" - -#sync -getkey - -# Down Arrow, Ctrl-J or 'D' -cmdkeys ^JD - add m 1 - compare m LAST - if_greater - set m 0 - end_if - pause_reset - end_cmd - -# Up Arrow, Ctrl-^ or 'U' -cmdkeys ^^U - sub m 1 - compare m 0 - if_less - set m LAST - end_if - pause_reset - end_cmd - -# Home or Ctrl-B -cmdkey ^B - set m 0 - end_cmd - -# End of Ctrl-E -cmdkey ^E - set m LAST - end_cmd - -cmdkeys ABCDEFGHIJKLMNOPQRSTUVWXYZ* - ungetkey - cmd_pop - end_cmd - -switch m - case 0 - cls - print "Login: " - getstr str 25 K_UPRLWR|K_LOWPRIO|K_E71DETECT - truncsp str - compare_str "" - if_true - add c 1 - goto top - end_if - login "PW: " - if_true - logon - if_true - return - end_if - end_if - pause - add c 2 - goto top - end_case - case 1 - setstr "%q" - compare_str "VERT" - if_true - yes_no Are you calling just to download Synchronet BBS software - if_true - setstr "Guest" - login "PW: " - if_true - logon - if_true - return - end_if - end_if - end_if - end_if - newuser - logon - return - end_case - - case 2 - setstr "guest" - login "PW: " - if_true - logon - if_true - return - end_if - end_if - end_case - end_switch -goto top - diff --git a/exec/mudgate.src b/exec/mudgate.src deleted file mode 100644 index 6b85412150..0000000000 --- a/exec/mudgate.src +++ /dev/null @@ -1,13 +0,0 @@ -# mudgate.src - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -printf "\r\n\1h\1hPress \1yCtrl-]\1w for a control menu anytime.\r\n\r\n" -pause -printf "\1h\1yConnecting to MUD: \1w%s\1n\r\n" str -telnet_gate str TG_ECHO|TG_CRLF|TG_LINEMODE|TG_NODESYNC|TG_CTRLKEYS -cls diff --git a/exec/nntpservice.js b/exec/nntpservice.js deleted file mode 100644 index 7695843de4..0000000000 --- a/exec/nntpservice.js +++ /dev/null @@ -1,441 +0,0 @@ -// nntpservice.js - -// Synchronet Service for the Network News Transfer Protocol (RFC 977) - -// Example configuration (in ctrl/services.cfg): - -// NNTP 119 0-unlimited 0 nntpservice.js - -// Tested clients: -// Microsoft Outlook Express 6 -// Netscape Communicator 4.77 - -load("sbbsdefs.js"); - -const VERSION = "1.00 Alpha"; - -var debug = false; -var no_anonymous = false; - -// Parse arguments -for(i=0;i<argc;i++) - if(argv[i].toLowerCase()=="-d") - debug = true; - else if(argv[i].toLowerCase()=="-na") - no_anonymous = true; - -// Write a string to the client socket -function write(str) -{ - if(debug) - log(format("rsp: %s",str)); - client.socket.send(str); -} - -function writeln(str) -{ - write(str + "\r\n"); -} - -var username=''; -var msgbase=null; -var selected=null; -var current_article=0; - -writeln(format("200 %s News (Synchronet NNTP Service v%s)",system.name,VERSION)); - -if(!no_anonymous) - login("guest"); // Login as guest/anonymous by default - -while(client.socket.is_connected) { - - // Get Request - cmdline = client.socket.recvline(512 /*maxlen*/, 300 /*timeout*/); - - if(cmdline==null) { - log("!TIMEOUT waiting for request"); - exit(); - } - - if(cmdline=="") /* ignore blank commands */ - continue; - - log(format("cmd: %s",cmdline)); - - cmd=cmdline.split(' '); - - switch(cmd[0].toUpperCase()) { - case "AUTHINFO": - switch(cmd[1].toUpperCase()) { - case "USER": - username=''; - for(i=2;cmd[i]!=undefined;i++) { - if(i>2) - username+=' '; - username+=cmd[i]; - } - writeln("381 More authentication required"); - break; - case "PASS": - if(login(username,cmd[2])) - writeln("281 Authentication successful"); - else - writeln("502 Authentication failure"); - break; - default: - writeln("500 Syntax error or unknown command"); - break; - } - continue; - case "MODE": - writeln("200 Hello, you can post"); - continue; - case "QUIT": - writeln("205 closing connection - goodbye!"); - exit(); - break; - } - - if(!logged_in) { - writeln("502 Authentication required"); - continue; - } - - /* These commands require login/authentication */ - switch(cmd[0].toUpperCase()) { - - case "LIST": - writeln("215 list of newsgroups follows"); - for(g in msg_area.grp_list) - for(s in msg_area.grp_list[g].sub_list) { - msgbase=new MsgBase(msg_area.grp_list[g].sub_list[s].code); - writeln(format("%s %u %u %s" - ,msg_area.grp_list[g].sub_list[s].newsgroup - ,msgbase.last_msg - ,msgbase.first_msg - ,msg_area.grp_list[g].sub_list[s].can_post ? "y" : "n" - )); - msgbase.close(); - } - writeln("."); // end of list - break; - - case "NEWGROUPS": - writeln("231 list of new newsgroups follows"); - writeln("."); // end of list - break; - - case "GROUP": - found=false; - for(g in msg_area.grp_list) - for(s in msg_area.grp_list[g].sub_list) - if(msg_area.grp_list[g].sub_list[s].newsgroup.toLowerCase()==cmd[1].toLowerCase()) { - found=true; - msgbase=new MsgBase(msg_area.grp_list[g].sub_list[s].code); - selected=msg_area.grp_list[g].sub_list[s]; - } - if(found) - writeln(format("211 %u %u %u %s group selected" - ,msgbase.total_msgs // articles in group - ,msgbase.first_msg - ,msgbase.last_msg - ,selected.newsgroup - )); - else { - writeln("411 no such news group"); - log("!no such group"); - } - break; - - case "XOVER": - if(msgbase==null) { - writeln("412 no news group selected"); - break; - } - writeln("224 Overview information follows"); - var first, last; - if(cmd[1].indexOf('-')>=0) { /* range */ - range=cmd[1].split('-'); - first=Number(range[0]); - last=Number(range[1]); - } else - first=last=Number(cmd[1]); - for(i=first;i<=last;i++) { - hdr=msgbase.get_msg_header(false,i); - if(hdr==null) - continue; - if(hdr.attr&MSG_DELETE) /* marked for deletion */ - continue; - writeln(format("%u\t%s\t%s\t%s\t%s\t%s\t%u\t%u" - ,i - ,hdr.subject - ,hdr.from - ,system.timestr(hdr.when_written_time) - ,hdr.id // message-id - ,hdr.reply_id // references - ,hdr.data_length // byte count - ,Math.round(hdr.data_length/79)+1 // line count - )); - } - writeln("."); // end of list - break; - - case "XHDR": - if(msgbase==null) { - writeln("412 no news group selected"); - break; - } - writeln("221 Header follows"); - var first, last; - if(cmd[2].indexOf('-')>=0) { /* range */ - range=cmd[2].split('-'); - first=Number(range[0]); - last=Number(range[1]); - } else - first=last=Number(cmd[2]); - for(i=first;i<=last;i++) { - hdr=msgbase.get_msg_header(false,i); - if(hdr==null) - continue; - if(hdr.attr&MSG_DELETE) /* marked for deletion */ - continue; - var field=""; - switch(cmd[1].toLowerCase()) { /* header */ - case "subject": - field=hdr.subject; - break; - case "from": - field=hdr.from; - break; - case "reply-to": - field=hdr.reply_to; - break; - case "date": - field=system.timestr(hdr.when_written_time); - break; - case "message-id": - field=hdr.id; - break; - case "references": - field=hdr.reply_id; - break; - case "lines": - field=Math.round(hdr.data_length/79)+1; - break; - } - - writeln(format("%u %s",i,field.toString())); - } - writeln("."); // end of list - break; - - case "ARTICLE": - case "HEAD": - case "BODY": - if(cmd[1]!='') { - if(cmd[1].indexOf('<')>=0) /* message-id */ - current_article=Number(cmd[1].slice(1,-1)); - else - current_article=Number(cmd[1]); - } - if(current_article<1) { - writeln("420 no current article has been selected"); - break; - } - - hdr=null; - body=null; - hdr=msgbase.get_msg_header(false,current_article); - if(cmd[0].toUpperCase()!="HEAD") - body=msgbase.get_msg_body(false,current_article - ,true /* remove ctrl-a codes */); - -/* Eliminate dupe loops - if(user.security.restrictions&UFLAG_Q && hdr!=null) -*/ - if(hdr==null) { - writeln("430 no such arctile found"); - break; - } - if(hdr.attr&MSG_MODERATED && !(hdr.attr&MSG_VALIDATED)) { - writeln("430 unvalidated message"); - break; - } - if(hdr.attr&MSG_DELETE) { - writeln("430 deleted message"); - break; - } - if(hdr.attr&MSG_PRIVATE - && hdr.to.toLowerCase()!=user.alias.toLowerCase() - && hdr.to.toLowerCase()!=user.name.toLowerCase()) { - writeln("430 private message"); - break; - } - - switch(cmd[0].toUpperCase()) { - case "ARTICLE": - writeln(format("220 %s article retrieved - head and body follow",hdr.id)); - break; - case "HEAD": - writeln(format("221 %s article retrieved - header follows",hdr.id)); - break; - case "BODY": - writeln(format("222 %s article retrieved - body follows",hdr.id)); - break; - } - - if(cmd[0].toUpperCase()!="BODY") { - if(hdr.from_net_type) - writeln(format("From: \"%s\" <%s@%s>" - ,hdr.from,hdr.from,hdr.from_net_addr)); - else if(hdr.from.indexOf(' ')>0) - writeln(format("From: \"%s\"@%s" - ,hdr.from,system.inetaddr)); - else - writeln(format("From: %s@%s" - ,hdr.from,system.inetaddr)); - writeln("Subject: " + hdr.subject); - writeln("Message-ID: " + hdr.id); - writeln("Date: " + system.timestr(hdr.when_written_time)); - writeln("References: " + hdr.reply_id); - writeln("Newsgroups: " + selected.newsgroup); - } - if(hdr!=null && body!=null) /* both, separate with blank line */ - writeln(""); - if(body!=null) - write(body); - writeln("."); - break; - - case "NEXT": - case "LAST": - if(msgbase==null) { - writeln("412 no news group selected"); - break; - } - if(current_article<1) { - writeln("420 no current article has been selected"); - break; - } - if(cmd[0].toUpperCase()=="NEXT") - current_article++; - else - current_article--; - writeln(format("223 %u %u article retrieved - request text separately" - ,current_article - ,current_article - )); - break; - - case "POST": -/** - if(!selected.can_post) { - writeln("440 posting not allowed"); - break; - } -**/ - writeln("340 send article to be posted. End with <CR-LF>.<CR-LF>"); - - var hdr=new Object(); - if(!(user.security.restrictions&(UFLAG_G|UFLAG_Q))) { // !Guest and !Network Node - hdr.from=user.alias; - hdr.from_ext=user.number; - } - - var posted=false; - var header=true; - var body=""; - var newsgroups=new Array(); - while(client.socket.is_connected) { - - line = client.socket.recvline(512 /*maxlen*/, 300 /*timeout*/); - - if(line==null) { - log("!TIMEOUT waiting for text line"); - break; - } - - //log(format("msgtxt: %s",line)); - - if(line==".") { - log("End of message text"); - break; - } - if(line=="" && header) { - header=false; - continue; - } - - if(!header) { /* Body text, append to 'body' */ - if(line.charAt(0)=='.') - line=line.slice(1); // Skip prepended dots - body += line; - body += "\r\n"; - continue; - } - log(line); - - /* Parse header lines */ - if((sp=line.indexOf(':'))==-1) - continue; - - data=line.slice(sp+1); - while(data.charAt(0)==' ') // skip prepended spaces - data=data.slice(1); - - line=line.substr(0,sp); - while(line.charAt(0)==' ') // skip prepended spaces - line=line.slice(1); - - switch(line.toLowerCase()) { - case "from": - if(user.security.restrictions&(UFLAG_G|UFLAG_Q)) // Guest or Network Node - hdr.from=data; - break; - case "subject": - hdr.subject=data; - break; - case "newsgroups": - newsgroups=data.split(','); - break; - } - } - - for(n in newsgroups) - for(g in msg_area.grp_list) - for(s in msg_area.grp_list[g].sub_list) - if(msg_area.grp_list[g].sub_list[s].newsgroup.toLowerCase() - ==newsgroups[n].toLowerCase()) { - if(!msg_area.grp_list[g].sub_list[s].can_post) - continue; - - if(msgbase!=null) { - msgbase.close(); - delete msgbase; - } - if(msg_area.grp_list[g].sub_list[s].settings&SUB_NAME - && !(user.security.restrictions&(UFLAG_G|UFLAG_Q))) - hdr.from=user.name; // Use real names - - msgbase=new MsgBase(msg_area.grp_list[g].sub_list[s].code); - if(msgbase.save_msg(hdr,body)) { - log(format("%s posted a message on %s",user.alias,newsgroups[n])); - writeln("240 article posted ok"); - posted=true; - } else - log(format("!ERROR saving mesage: %s",msgbase.last_error)); - } - if(!posted) { - log("!post failure"); - writeln("441 posting failed"); - } - break; - - default: - writeln("500 Syntax error or unknown command"); - log("!unknown command"); - break; - } -} - -/* End of nntpservice.js */ diff --git a/exec/nodedefs.inc b/exec/nodedefs.inc deleted file mode 100644 index 5b8d739563..0000000000 --- a/exec/nodedefs.inc +++ /dev/null @@ -1,86 +0,0 @@ -# nodedefs.inc - -# Baja include file for NODE.DAB (_NODEFILE) field values - -# $id$ - -# @format.tab-size 8, @format.use-tabs true - - # Possible values for node STATUS -!define NODE_WFC 0 # Waiting for Call -!define NODE_LOGON 1 # at logon prompt -!define NODE_NEWUSER 2 # New user applying -!define NODE_INUSE 3 # In Use -!define NODE_QUIET 4 # In Use - quiet mode -!define NODE_OFFLINE 5 # Offline -!define NODE_NETTING 6 # Networking -!define NODE_EVENT_WAITING 7 # Waiting for all nodes to be inactive -!define NODE_EVENT_RUNNING 8 # Running an external event -!define NODE_EVENT_LIMBO 9 # Allowing another node to run an event - - # Bit values for node MISC -!define NODE_ANON .0 # Anonymous User -!define NODE_LOCK .1 # Locked for sysops only -!define NODE_INTR .2 # Interrupted - hang up -!define NODE_MSGW .3 # Message is waiting (old way -!define NODE_POFF .4 # Page disabled -!define NODE_AOFF .5 # Activity Alert disabled -!define NODE_UDAT .6 # User data has been updated -!define NODE_RRUN .7 # Re-run this node when log off -!define NODE_EVENT .8 # Must run node event after log off -!define NODE_DOWN .9 # Down this node after logoff -!define NODE_RPCHT .10 # Reset private chat -!define NODE_NMSG .11 # Node message waiting (new way -!define NODE_EXT .12 # Extended info on node action - - # Possible values for node ACTION -!define NODE_MAIN 0 # Main Prompt -!define NODE_RMSG 1 # Reading Messages -!define NODE_RMAL 2 # Reading Mail -!define NODE_SMAL 3 # Sending Mail -!define NODE_RTXT 4 # Reading G-Files -!define NODE_RSML 5 # Reading Sent Mail -!define NODE_PMSG 6 # Posting Message -!define NODE_AMSG 7 # Auto-message -!define NODE_XTRN 8 # Running External Program -!define NODE_DFLT 9 # Main Defaults Section -!define NODE_XFER 10 # Transfer Prompt -!define NODE_DLNG 11 # Downloading File -!define NODE_ULNG 12 # Uploading File -!define NODE_BXFR 13 # Bidirectional Transfer -!define NODE_LFIL 14 # Listing Files -!define NODE_LOGN 15 # Logging on -!define NODE_LCHT 16 # In Local Chat with Sysop -!define NODE_MCHT 17 # In Multi-Chat with Other Nodes -!define NODE_GCHT 18 # In Local Chat with Guru -!define NODE_CHAT 19 # In Chat Section -!define NODE_SYSP 20 # Sysop Activity -!define NODE_TQWK 21 # Transferring QWK packet -!define NODE_PCHT 22 # In Private Chat -!define NODE_PAGE 23 # Paging another node for Private Chat -!define NODE_RFSD 24 # Retrieving file from seq dev (aux=dev - -# Record format: -# -# Field Length Description -# ----------------------------------------- -# status 1 Current Status of Node -# errors 1 Number of Critical Errors -# action 1 Action User is doing on Node -# useron 2 Number of User on Node -# connection 2 Current Connection (DCE) rate of Node -# misc 2 Miscellaneous bits for node -# aux 2 Auxillary word for node -# extaux 4 Extended aux dword for node - -!define NODE_STATUS_OFFSET 0 # Offset to node status -!define NODE_ERRORS_OFFSET 1 # Offset to node errors -!define NODE_ACTION_OFFSET 2 # Offset to node action -!define NODE_USERON_OFFSET 3 # Offest to node useron -!define NODE_CONNECTION_OFFSET 5 # Offset to node connection -!define NODE_MISC_OFFSET 7 # Offset to node misc -!define NODE_AUX_OFFSET 9 # Offset to node aux -!define NODE_EXTAUX_OFFSET 11 # Offset to node extaux -!define NODE_RECORD_LEN 15 # Length of node record - -# End of NODEDEFS.INC diff --git a/exec/nodelist-html.js b/exec/nodelist-html.js deleted file mode 100644 index a061d6c808..0000000000 --- a/exec/nodelist-html.js +++ /dev/null @@ -1,154 +0,0 @@ -// nodelist-html.js - -// Synchronet Service for sending a periodic HTML node list - -var refresh_rate=10 /* seconds */ -var start=new Date(); - -load("nodedefs.js"); - -var include_age_gender=true; -var include_location=false; - -// Parse arguments -for(i=0;i<argc;i++) - switch(argv[i].toLowerCase()) { - case "-r": - refresh_rate=Number(argv[++i]); - break; - case "-n": - include_age_gender=false; - break; - case "-l": - include_location=true; - break; - } - -// Write a string to the client socket -function write(str) -{ - client.socket.send(str); -} - -function writeln(str) -{ - write(str + "\r\n"); -} - -// Get HTTP Request -while(client.socket.data_waiting) { - request = client.socket.recvline(128 /*maxlen*/, 3 /*timeout*/); - - if(request==null) - break; - -// log(format("client request: '%s'",request)); -} - -// HTML Header -writeln("<html>"); -writeln("<head>"); -writeln(format("<title>%s BBS - Node List</title>",system.name)); -writeln(format("<meta http-equiv=refresh content=%d>",refresh_rate)); -writeln("</head>"); - -writeln("<body bgcolor=teal text=white link=yellow vlink=lime alink=white>"); -writeln("<font face=Arial,Helvetica,sans-serif>"); - -// Login Button - Modified by RuneMaster of RuneKeep BBS -writeln("<table border=0 width=100%>"); -writeln("<tr>"); -writeln("<td align=left>"); -writeln("<font color='lime'>"); -writeln(format("<h1><i>%s BBS - Node List</i></h1>",system.name)); -writeln("</font>"); -writeln("</td>"); -writeln("<td align=right>"); -writeln("<form>"); -writeln("<input type=button value='Login' onClick='location=\"telnet://" - + system.inetaddr + "\";'>"); -writeln("</form>"); -writeln("</td>"); -writeln("</tr>"); -writeln("</table>"); - -// Table -writeln("<table border=0 width=100%>"); - -// Header -writeln("<thead>"); -writeln("<tr bgcolor=white>"); -font_color = "<font color=black>"; - -write(format("<th align=center width=7%>%sNode",font_color)); -write(format("<th align=center width=20%>%sUser",font_color)); -write(format("<th align=left>%sAction/Status",font_color)); -if(include_location) - write(format("<th align=left>%sLocation",font_color)); -if(include_age_gender) { - write(format("<th align=center width=7%>%sAge",font_color)); - write(format("<th align=center width=10%>%sGender\r\n",font_color)); -} -write(format("<th align=center width=10%>%sTime\r\n",font_color)); -writeln("</thead>"); - -writeln("<tbody>"); -var user = new User(1); -for(n=0;n<system.node_list.length;n++) { - write("<tr>"); - write(format("<td align=right><font size=-1>%d",n+1)); - if(system.node_list[n].status==NODE_INUSE) { - user.number=system.node_list[n].useron; - if(system.node_list[n].action==NODE_XTRN && system.node_list[n].aux) - action=format("running %s",user.curxtrn); - else - action=format(NodeAction[system.node_list[n].action] - ,system.node_list[n].aux); - write(format( - "<td align=center><a href=mailto:%s>%s</a>" - ,user.email - ,user.alias - )); - write(format( - "<td><font color=yellow>%s" - ,action - )); - if(include_location) - write(format( - "<td align=left>%s" - ,user.location - )); - if(include_age_gender) - write(format( - "<td align=center>%d<td align=center>%s" - ,user.age - ,user.gender - )); - t=time()-user.logontime; - if(t&0x80000000) t=0; - write(format( - "<td align=center>%u:%02u:%02u" - ,Math.floor(t/(60*60)) - ,Math.floor(t/60)%60 - ,t%60 - )); - } else { - action=format(NodeStatus[system.node_list[n].status],system.node_list[n].aux); - write(format("<td><td>%s",action)); - } - write("\r\n"); -} -writeln("</tbody>"); -writeln("</table>"); - -writeln("<p><font color=silver><font size=-2>"); -writeln(format("Auto-refresh in %d seconds",refresh_rate)); -write(format("<br>Dynamically generated in %lu milliseconds " - ,new Date().valueOf()-start.valueOf())); -write("by <a href=http://www.synchro.net>" + system.version_notice + "</a>"); -writeln("<br>" + system.timestr()); - -writeln("</body>"); -writeln("</html>"); -sleep(1000); -/* End of nodelist-html.js */ diff --git a/exec/nodelist.js b/exec/nodelist.js deleted file mode 100644 index a7bdb9d388..0000000000 --- a/exec/nodelist.js +++ /dev/null @@ -1,16 +0,0 @@ -// nodelist.js - -load("nodedefs.js"); - -var user = new User(1); -for(n=0;n<system.node_list.length;n++) { - printf("Node %2d ",n+1); - if(system.node_list[n].status==NODE_INUSE) { - user.number=system.node_list[n].useron; - printf("%s (%u %s) ", user.alias, user.age, user.gender); - printf(NodeAction[system.node_list[n].action],system.node_list[n].aux); - } else - printf(NodeStatus[system.node_list[n].status],system.node_list[n].aux); - - printf("\r\n"); -} \ No newline at end of file diff --git a/exec/noyesbar.src b/exec/noyesbar.src deleted file mode 100644 index d95398e439..0000000000 --- a/exec/noyesbar.src +++ /dev/null @@ -1,58 +0,0 @@ -# noyesbar.src - -# Sep 28 1995 - Digital Man - -# $id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc # _question - -str tmp - -copy tmp str -setstr "N" -compare_strn 2 _question "\r\n" -if_true - crlf - shift_str _question 2 - end_if -printf "nbh[c�b] y%s? " _question -:top -compare_str "N" -if_equal - print "h4w[No]nbh Yes " -else - print "nbh No 4w[Yes]" - end_if -getkey -print "\b\b\b\b\b\b\b\b\b\1n\1h\1>" -compare_key ^M -if_true - ungetstr - copy str tmp - return - end_if - -compare_keys "YN" -if_true - ungetkey - copy str tmp - return - end_if - -compare_key ^@ -if_true - copy str tmp - return - end_if - -# Toggle -compare_str "Y" -if_true - setstr "N" -else - setstr "Y" - end_if -goto top - diff --git a/exec/pcboard.src b/exec/pcboard.src deleted file mode 100644 index 74be99d656..0000000000 --- a/exec/pcboard.src +++ /dev/null @@ -1,373 +0,0 @@ -# pcboard.src - -# PCBoard v15.1 menu/command emulation - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -menu pcboard/welcome - -cmd_home -compare_ars expert -if_false - cls - menu pcboard/brdm - end_if -node_action node_main -async -print "n\r\nyh(r@MINLEFT@y min. left) @GRP@ (@GN@) @SUB@ (@SN@) " -print "Command? n" -getstr 60 - -compare_str "" -if_true - end_cmd - end_if - -cmdstr ? - compare_ars expert - if_true - cls - menu pcboard/brdm - end_if - end_cmd - -cmdstr HELP - compare_ars expert - if_true - cls - menu pcboard/brdm - end_if - end_cmd - -cmdstr F - file_select_area - if_true - setstr "*.*" - file_list - end_if - end_cmd - -cmdstr EXT - file_select_area - if_true - setstr "*.*" - file_list_extended - end_if - end_cmd - -cmdstr VIEW - getfilespec - if_true - file_view - end_if - end_cmd - -cmdstr BATCH - file_batch_section - end_cmd - -cmdstr REMOVE - getfilespec - if_true - file_remove - end_if - end_cmd - -cmdstr D - file_download_batch - if_true - end_cmd - end_if - getfilespec - if_true - file_download - end_if - end_cmd - -cmdstr U - chkfile "%zmenu/upload.*" - if_true - menu upload - end_if - file_upload - end_cmd - -cmdstr L - file_find_name - end_cmd - -cmdstr N - print "\r\nbhUse c@LASTNEW@b for new file scan date" - yes_no "" - if_false - file_ptrs_cfg - if_false - end_cmd - end_if - end_if - file_new_scan - end_cmd - -cmdstr Z - file_find_text - end_cmd - -cmdstr T - file_temp_section - end_cmd - -cmdstr C - setstr "1" - mail_send_feedback - crlf - end_cmd - -cmdstr Y - msg_your_scan - end_cmd - -cmdstr TS - msg_find_Text - end_cmd - -cmdstr QWK - msg_qwk - end_cmd - -cmdstr AUTO - auto_message - end_cmd - -cmdstr SELECT - msg_new_scan_cfg - end_cmd - -cmdstr A - msg_ptrs_cfg - end_cmd - -cmdstr R - msg_read - end_cmd - -cmdstr S - info_system - end_cmd - -cmdstr E - msg_post - end_cmd - -cmdstr RN - msg_new_scan - end_Cmd - -cmdstr RC - msg_cont_scan - end_cmd - -cmdstr JOIN - msg_select_area - end_cmd - -compare_word "JOIN " -if_true - shift_str 5 - msg_set_area - end_cmd - end_if - -cmdstr J - msg_select_area - end_cmd - -cmdstr M - call e-mail - end_cmd - -cmdstr X - toggle_user_misc UM_EXPERT - print "\r\nExpert mode is now: " - compare_ars EXPERT - if_true - print "ON" - else - print "OFF" - end_if - crlf - end_cmd - -cmdstr B - text_file_section - end_cmd - -cmdstr V - info_user - end_cmd - -cmdstr G - file_download_batch - if_true - end_cmd - end_if - logoff - end_cmd - -cmdstr W - user_defaults - end_cmd - -cmdstr O - page_sysop - end_cmd - -cmdstr P - private_message - end_cmd - -cmdstr I - menu ../ANSWER - menu pcboard/welcome - end_cmd - -cmdstr WHO - nodelist_users - end_cmd - -cmdstr CHAT - exec_bin chat_sec - end_cmd - -cmdstr NEWS - menu logon - end_cmd - -cmdstr DOOR - xtrn_section - end_cmd - -cmdstr OPEN - xtrn_section - end_cmd - -compare_word "OPEN " -if_true - shift_str 5 - xtrn_exec - end_cmd - end_if - -compare_word "USER " -if_true - shift_str 5 - crlf - finduser - if_true - print "yhVerified: w" - printstr - crlf - end_if - end_cmd - end_If - -cmdstr USER - print "\r\nyhUsername search string (Enter=List Conferences Users): w" - getname 25 - compare_str "" - if_true - userlist_sub - else - crlf - finduser - if_true - print "yhVerified: w" - printstr - crlf - end_if - end_cmd - end_If - end_cmd - -print "\r\nrhInvalid Entry! Please try again, @FIRST@ ...\r\n" -end_cmd - -:e-mail -cmd_home -compare_ars expert -if_false - menu e-mail - end_if -async -print "\r\nyhE-mail: n" -getcmd ?SRFNUKQ\r -logkey - -cmdkey ? - compare_ars expert - if_true - menu e-mail - end_if - end_cmd - -cmdkey S - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send - end_cmd - -cmdkey U - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send_file - end_cmd - -cmdkey R - mail_read - end_cmd - -cmdkey F - setstr "1" - mail_send_feedback - end_cmd - -cmdkey N - no_yes "\r\nAttach a file" - if_true - mail_send_netmail - else - mail_send_netfile - end_if - end_cmd - -cmdkey K - mail_read_sent - end_cmd - -cmdkey Q - cmd_pop - return - end_cmd - -cmd_pop -return - diff --git a/exec/pnet.bat b/exec/pnet.bat deleted file mode 100755 index 5dfe3eebfa..0000000000 --- a/exec/pnet.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -cd \postlink -postlink caller.cfg diff --git a/exec/qnet-ftp.src b/exec/qnet-ftp.src deleted file mode 100644 index 5812b2198b..0000000000 --- a/exec/qnet-ftp.src +++ /dev/null @@ -1,177 +0,0 @@ -# qnet-ftp.src - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -############################################################################### -# Baja module for performing FTP-based QWKnet call-outs # -# Requires Synchronet v3.00d and Baja v2.30 # -# Developed 2001 by Rob Swindell # -############################################################################### - -# Usage: *QNET-FTP HUBID ADDRESSS PASSWORD -# Example: *QNET-FTP VERT vert.synchro.net YOURPASS - -# You may use the qnet-ftp.bin module INSTEAD of your normal ftp/script -# QWKnet call-out routine (exec/vert.bat). You can do this by changing -# -# SCFG->Networks->QWK->Hubs->VERT->Call-out Command Line to: -# -# *QNET-FTP VERT vert.synchro.net YOURPASS -# -# The asterisk is important! YOURPASS is your QWKnet password here on Vertrauen. -# -# No modification or recompilation of this module should be necessary. - -!include sbbsdefs.inc -!include file_io.inc - -# Must be FIRST function call (or module will immediately terminate) -set _online ON_LOCAL - -# Variables -int i argc argv sock port -str tmp rep qwk hubid addr user password -str cmdline - -set _ftp_mode FTP_PASV - -# Process command line arguments -set hubid "" -set addr "" -set password "" - -# Display command line -copy cmdline str -lprintf "QNET-FTP: %s" cmdline -set argc 0 -:process_args -compare_str "" -if_true - goto end_args - end_if -sprintf tmp "%.1s" str -shift_str 1 -compare tmp " " -if_true - add argc 1 - goto process_args - end_if -switch argc - case 0 - strcat hubid tmp - end_case - case 1 - strcat addr tmp - end_case - case 2 - strcat password tmp - end_case - default - goto usage - end_switch -goto process_args - -:usage -lprintf "QNET-FTP: !INCORRECT USAGE: %s" cmdline -return - -:end_args -compare hubid "" -if_true - goto usage - end_if -compare addr "" -if_true - goto usage - end_if -compare password "" -if_true - goto usage - end_if - -sprintf rep "%%j%s.rep" hubid -sprintf qwk "%%j%s.qwk" hubid -chkfile qwk -if_true - lprintf "QNET-FTP: %s already exists!" qwk - set i 0 - :check_qwk - sprintf qwk "%%j%s.QW%ld" hubid i - chkfile qwk - if_true - lprintf "QNET-FTP: %s already exists!" qwk - add i 1 - compare i 10 - if_equal - goto exit - end_if - goto check_qwk - end_if - end_if - -socket_open sock -if_false - lprintf "QNET-FTP: !socket_open failure socket_error=%d" _socket_error - goto exit - end_if - -set port 21 # default FTP port -lprintf "QNET-FTP: Connecting to %s ... " addr -socket_connect sock addr port -crlf -if_false - lprintf "QNET-FTP: !socket_connect failed socket_error=%d" _socket_error - goto exit - end_if -lprintf "QNET-FTP: Connected to %s" addr - -set user "%q" -lprintf "QNET-FTP: Logging in as '%s' (PW: '%s')" user password -ftp_login sock user password -if_false - lprintf "QNET-FTP: !ftp_login failed socket_error=%d" _socket_error - goto exit - end_if - -lprintf "QNET-FTP: Logged in successfully" - -chkfile rep -if_true - ################### - # Send REP packet # - ################### - lprintf "QNET-FTP: Sending REP packet: %s" rep - - sprintf str "%s.rep" hubid - - ftp_put sock rep str - if_false - lprintf "QNET-FTP: !ftp_put failed socket_error=%d\r\n" _socket_error - else - lprintf "QNET-FTP: REP packet sent successfully" - end_if - - remove_file rep - end_if - -####################### -# Download QWK packet # -####################### -sprintf str "%s.qwk" hubid -lprintf "QNET-FTP: Downloading QWK Packet: %s" str -ftp_get sock str qwk -if_true - lprintf "QNET-FTP: Downloaded %s successfully" str -else - lprintf "QNET-FTP: %s NOT downloaded (no new messages?)" str - end_if - -################# -# Exit routine # -################# -:exit -lprintf "QNET-FTP: Done." - -# End of QNET-FTP.SRC diff --git a/exec/qnet.bat b/exec/qnet.bat deleted file mode 100755 index b0294e15b2..0000000000 --- a/exec/qnet.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -cd \telix -telix sqnet q diff --git a/exec/qnet.slt b/exec/qnet.slt deleted file mode 100644 index e05859e863..0000000000 --- a/exec/qnet.slt +++ /dev/null @@ -1,29 +0,0 @@ -// Main QWK Networking SALT script for calling Synchronet QWK Network Hub(s) - -main() -{ - -// These two paths need to point to your SBBS\DATA directory - -copystr("C:\SBBS\DATA",_down_dir,0,40); -copystr("C:\SBBS\DATA",_up_dir,0,40); - -// Add additional call lines for other systems -// the first parameter must be sbbsqnet, the second is the HUB's system ID, -// the third is phone number list, the fourth is your logon name (should be -// same as your system's QWKID), the fifth is your password, and the sixth is -// the maximum retry count - -// The phone number list can either contain a list of dialing directory -// entries, or a manual phone number preceeded by an 'M'. -// Example; both of the following are valid phone number lists: -// "1 2 3" and "m1-714-529-9525" -// You can only have one number per hub using the manual dial method. - -call("sbbsqnet","VERT","m1-714-529-9721","QWKID","password","3"); - -cputs_tr("~~ATM0H1^M"); - -exittelix(0,0); -} - diff --git a/exec/qnet.src b/exec/qnet.src deleted file mode 100644 index 784219740f..0000000000 --- a/exec/qnet.src +++ /dev/null @@ -1,481 +0,0 @@ -# qnet.src - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -############################################################################### -# Baja module for performing QWKnet call-outs # -# Requires Synchronet v2.3 and Baja v2.10 # -# Copyright 1996 Digital Dynamics # -############################################################################### - -# Usage: *QNET HUBID PHONE PASSWORD ATTEMPTS -# Example: *QNET VERT 1-714-529-9721 YOURPASS 100 - -# You may use the QNET.BIN module INSTEAD of your normal terminal/script -# QWKnet call-out routine. You can do this by changing -# -# SCFG->Networks->QWK->Hubs->VERT->Call-out Command Line to: -# -# *QNET VERT 1-714-529-9721 YOURPASS 100 -# -# The asterisk is important! 100 is the number of dial attempts, YOURPASS is -# your QWKnet password here on Vertrauen. Remove 1-714 if you're in the 714 -# area code. -# -# No modification or recompilation of this module should be necessary. - -!include sbbsdefs.inc -!include file_io.inc - -# Constants (change for your preferences) - -!define INIT_ATTEMPTS 5 -!define MAX_INACTIVITY 30 # 30 seconds of host inactivity - -# Must be FIRST function call (or module will immediately terminate) -set _online ON_LOCAL -# print_local "QNET.SRC\r\n" -# Force DCD to be assumed HIGH and user online and NO screen pausing -or _sys_status SS_DCDHIGH|SS_USERON|SS_PAUSEOFF -# Turn off the ^C status flag -not _sys_status SS_ABORT -# Set console for Local Input/Output only -set _console CON_L_INPUT|CON_L_ECHO - -# Make sure there is a COM port configured -compare _DTE_RATE 0 -if_equal - print "BAJAQNET: No COM port configured.\7\r\n\r\n" - pause - return - end_if - -# Variables -int i start connect end logfile argc argv attempt result -str tmp rep qwk log hubid phone password attempts - -# Mark beginning time -time start -set connect 0 - -# Process command line arguments -set hubid "" -set phone "" -set password "" -set attempts "" - -set _lncntr 0 -cls -strupr str -# Display command line -print "BAJAQNET: %s\r\n" -set argc 0 -:process_args -compare_str "" -if_true - goto end_args - end_if -sprintf tmp "%.1s" str -shift_str 1 -compare tmp " " -if_true - add argc 1 - goto process_args - end_if -switch argc - case 0 - strcat hubid tmp - end_case - case 1 - strcat phone tmp - end_case - case 2 - strcat password tmp - end_case - case 3 - strcat attempts tmp - end_case - default - goto usage - end_switch -goto process_args - -:usage -crlf -print "Usage: QNET hubid phone password attempts\r\n\r\n" -print "Example: QNET VERT 1-714-529-9721 YOURPASS 100\r\n\r\n\7" -pause -return - -:end_args -compare hubid "" -if_true - goto usage - end_if -compare phone "" -if_true - goto usage - end_if -compare password "" -if_true - goto usage - end_if -compare attempts "" -if_true - goto usage - end_if - -sprintf log "%%j/%s.log" hubid -sprintf rep "%%j/%s.rep" hubid -sprintf qwk "%%j/%s.qwk" hubid -chkfile qwk -if_true - printf "\7BAJAQNET: %s already exists!\r\n" qwk - set i 0 - :check_qwk - sprintf qwk "%%j%s.QW%ld" hubid i - chkfile qwk - if_true - printf "\7BAJAQNET: %s already exists!\r\n" qwk - add i 1 - compare i 10 - if_equal - goto exit - end_if - goto check_qwk - end_if - end_if - -fopen logfile O_WRONLY|O_APPEND|O_CREAT log -if_false - printf "\7BAJAQNET: Error (%d) opening %s\r\n" _errno log - goto exit - end_if - -time_str str start -fprintf logfile "BAJAQNET: Launched: %s\r\n" str - -# Required for receiving responses from modem -set _online ON_REMOTE -or _console CON_R_INPUT - -set attempt 0 -:init -call flush_input -add attempt 1 -compare attempt INIT_ATTEMPTS -if_greater - setstr "BAJAQNET: Modem initialization failed!\r\n" - print str - fwrite logfile str - goto exit - end_if -print "BAJAQNET: Initializing modem\r\n" - -print_remote "ATX4E0H0M0V0\r" -getstr str 80 K_NOECHO -if_false - print "BAJAQNET: No response\r\n" - goto exit - end_if -compare_str "0" -if_false - print "BAJAQNET: Modem returned %s\r\n" - goto init - end_if - -set attempt 0 -:dial -add attempt 1 -compare attempt attempts -if_greater - fprintf logfile "BAJAQNET: No connect after %s attempts\r\n" attempts - goto exit - end_if -printf "BAJAQNET: Dialing %s at %s (Attempt: %ld of %s)\r\n" hubid phone attempt attempts -mswait 1000 -copy str phone -print_remote "ATDT%s\r" -getstr str 80 K_NOECHO -if_false - goto exit - end_if -print "BAJAQNET: " -copy result str -switch result - case 0 - print "Modem responded with '%s'\r\n" - fprintf logfile "BAJAQNET: Modem repsoned with '%s'\r\n" str - goto dial - case 2 - print "RING\r\n" - goto dial - case 3 - print "NO CARRIER\r\n" - goto dial - case 4 - print "ERROR\r\n" - goto dial - case 6 - print "NO DIALTONE\r\n" - goto dial - case 7 - print "BUSY\r\n" - goto dial - case 8 - print "NO ANSWER\r\n" - goto dial - default - print "Connection established (Result Code: %s)\r\n" - time connect - ftime_str str "%X" connect - fprintf logfile "BAJAQNET: Connected: %s\r\n" str - end_switch - -# Normal use of DCD -not _sys_status SS_DCDHIGH -# Wait a second -mswait 1000 -# Send ESC ESC for front-end mailers -print_remote "\x1b\x1b" -# Wait for NN: prompt -print "BAJAQNET: Waiting for NN: prompt " -setstr "NN:" -call waitfor -print " \r\n" -# Notify Hub of Script Type and Version -print_remote "Baja Qnet Version 1.10" -mswait 2000 -# Send our QWK ID -print_remote "\24%q\r" -# Wait for PW: prompt -print "BAJAQNET: Waiting for PW: prompt " -setstr "PW:" -call waitfor -print " \r\n" -# Send our PASSWORD -copy str password -print_remote "%s\r" -# Wait for QWK: prompt -print "BAJAQNET: Waiting for QWK: prompt " -setstr "QWK:" -call waitfor -print " \r\n" - -chkfile rep -if_true - ################### - # Send REP packet # - ################### - print "BAJAQNET: Sending REP packet\r\n" - print_remote "UZN" - mswait 1000 - call flush_input - send_file_via Z rep - get_file_length i rep - sprintf str "BAJAQNET: Upload of REP packet (%lu bytes) " i - print str - fwrite logfile str - if_true - print "successful\r\n" - fprintf logfile "successful\r\n" - remove_file rep - else - print "\7UNSUCCESSFUL!\r\n" - fprintf logfile "UNSUCCESSFUL!\r\n" - end_if - #mswait 1000 - #call flush_input - # Wait for QWK: prompt - print "BAJAQNET: Waiting for QWK: prompt " - setstr "QWK:" - call waitfor - print " \r\n" - end_if - -####################### -# Download QWK packet # -####################### -print "BAJAQNET: Scanning for new messages " -int sm nm ss - -print_remote "DL" -setstr "PROTOCOL OR " -call waitfor -print " \r\n" -if_false - setstr "BAJAQNET: No new messages.\r\n" - print str - fwrite logfile str - print_remote "Q" - goto exit - end_if -print "BAJAQNET: Receiving QWK packet\r\n" -print_remote "ZN" -mswait 1000 -call flush_input -receive_file_via Z qwk -sprintf str "BAJAQNET: Download of QWK packet " -print_local "%s" -fwrite logfile str -chkfile qwk -if_true - get_file_length i qwk - sprintf str "(%lu bytes) successful\r\n" i -else - setstr "UNSUCCESSFUL!\r\n" - end_if -print_local "%s" -fwrite logfile str -mswait 2000 -copy _sys_misc sm -copy _node_misc nm -print_remote "Q" -goto exit - -############################################################################### -# Wait for a specific text string (contained in current command string) # -# Automatically hits ENTER for HIT A KEY prompts # -# Times-out after 30 seconds of host inactivity # -# Sets logic state to TRUE if the string is located and returns # -# Sets logic state to FALSE if QWK: is found before the string and returns # -############################################################################### -:waitfor -str waitforstr waitforbuf -int cursor t1 t2 -copy waitforstr str -:waitfor_reset -set waitforbuf "" -:waitfor_nextchar -time t1 -:waitfor_checkinput -inkey -if_false - time t2 - sub t2 t1 - compare t2 MAX_INACTIVITY - if_greater - goto timeout - end_if - goto waitfor_checkinput - end_if - -# Control key? -compare_keys "^M^J^L^G^H" -if_true - :spin_cursor - and cursor 3 - switch cursor - case 0 - print_local "-" - end_case - case 1 - print_local "\\" - end_case - case 2 - print_local "|" - end_case - case 3 - print_local "/" - end_case - end_switch - print_local "\b" - add cursor 1 - # Clear input buffer and continue - goto waitfor_reset - end_if - -ungetkey -:waitfor_additional -inkey -if_true - compare_keys "^M^J^L^G^H" - if_true - # Clear ungetkey buffer - setstr "\r" - ungetstr - getstr str 0 K_NOECHO - goto spin_cursor - end_if - ungetkey - goto waitfor_additional - end_if -setstr "\r" -ungetstr -getstr str 128 K_NOECHO -if_false - fprintf logfile "getstr returned FALSE\r\n" - setlogic FALSE - return - end_if -strcat waitforbuf str -# Handle Pause Prompt -compare_substr waitforbuf "HIT A KEY" -if_true - fprintf logfile "received hit a key prompt\r\n" - print_remote "\r" - goto waitfor_reset - end_if -# Handle ANSI Cursor Position Request -compare_substr waitforbuf "[6n" -if_true - print_remote "\r" - goto waitfor_reset - end_if -# Return TRUE if string found -compare_substr waitforbuf waitforstr -if_true - setlogic TRUE - return - end_if -# Return FALSE if QWK: prompt found instead -compare waitforbuf "QWK: " -if_true - setlogic FALSE - return - end_if - -goto waitfor_nextchar - - -##################################################################### -# Flush (remove, do not process) any characters in the input buffer # -##################################################################### -:flush_input -inkey -if_true # Flush input buffer - goto flush_input - end_if -return - -################################################### -# Timeout routine (falls-through to Exit routine) # -################################################### -:timeout -print_local "\r\nBAJAQNET: \7Time-out!\7\r\n" -fprintf logfile "BAJAQNET: Time-out\r\n" - -################# -# Exit routine # -################# -:exit -print_local "BAJAQNET: Exiting...\r\n" -# Mark ending time -time end -time_str str end -fprintf logfile "BAJAQNET: Terminated: %s\r\n" str -compare connect 0 -if_not_equal - copy i end - sub i connect - second_str tmp i - fprintf logfile "BAJAQNET: Time online: %s\r\n" tmp - end_if -hangup -not _sys_status SS_DCDHIGH -mswait 2000 -return - -# End of QNET.SRC diff --git a/exec/ra_emu.src b/exec/ra_emu.src deleted file mode 100644 index 46b3951a7d..0000000000 --- a/exec/ra_emu.src +++ /dev/null @@ -1,11 +0,0 @@ -# ra_emu.src - -# Emulate RemoteAccess, Renegade, etc. Mail/Message Prompts - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -or _sys_misc SM_RA_EMU diff --git a/exec/renegade.src b/exec/renegade.src deleted file mode 100644 index ff51c9a9ef..0000000000 --- a/exec/renegade.src +++ /dev/null @@ -1,872 +0,0 @@ -# renegade.src - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -################################# Begins Here ################################# -or _sys_misc SM_RA_EMU # Swap Msg ReRead/Reply commands -:main -# Set return point for main menu commands (via end_cmd) -cmd_home - -# Display text/menu/main.* if not in expert mode -compare_ars expert -if_false - cls - menu renegade/main - end_if - -# Update node status -node_action node_main -async - -# Display main Prompt -compare_ars exempt T -if_true - print "n\r\nbhTime Used: [c@TUSED@b] " -else - print "n\r\nbhTime Left: [c@TLEFT@b] " - end_if - -print "bh(c?b=cHelpb)\r\nMain Menu m: n" - -# Get key (with / extended commands allowed) -compare_user_misc UM_COLDKEYS -if_false - getkeye -else - getstrupr 60 - endif - -# Do nothing for control keys and space -cmdkey ^@ - end_cmd -cmdkey ^M - end_cmd -cmdkey ^S - end_cmd - cmdkey " - end_cmd - -# Write command to log file -logkey_comma - -# Show the key hit -compare_user_misc UM_COLDKEYS -if_false - printkey - endif - -cmdkey F - cmd_pop - goto file_transfers - end_cmd - -compare_user_misc UM_COLDKEYS -if_false - crlf - end_if -pause_reset - -# Menu -cmdkey ? - compare_ars expert - if_true - cls - menu renegade/main - end_if - end_cmd - -# Sysop Menu -compare_ars SYSOP or exempt Q or I or N -if_true - cmdkey * - call sysop - end_cmd - end_if - -# Commands - -cmdkey A - auto_message - end_cmd - -cmdkey C - exec_bin chat_sec - end_cmd - -cmdkey E - cmd_pop - goto E-mail - end_cmd - -cmdkey G - file_download_batch - if_true - end_cmd - end_if - logoff - end_cmd - -cmdkey /G - file_download_batch - if_true - end_cmd - end_if - logoff_fast - end_cmd - -cmdkey I - call main_info - end_cmd - -cmdkey W - nodelist_users - end_cmd - -cmdkey L - userlist_logons - end_cmd - -cmdkey /L - nodelist_all - end_cmd - -cmdkey $ - minute_bank - end_cmd - -cmdkey M - cmd_pop - goto message - end_cmd - -cmdkey N - setstr "1" - mail_send_feedback - end_cmd - -cmdkey O - xtrn_section - end_cmd - -cmdkey P - user_defaults - end_cmd - -cmdkey ! - msg_qwk - end_cmd - -cmdkey S - text_file_section - end_cmd - -cmdkey U - userlist_all - end_cmd - -cmdkey X - toggle_user_misc UM_expert - end_cmd - -cmdkey Y - info_user - end_cmd - -# fall through -print "\r\nchUnrecognized command." -compare_ars expert -if_true - print " Hit 'i?nch' for a menu." - end_if -crlf -end_cmd - -# shouldn't hit next line -print "Problem in command shell." -pause -hangup - -############################### E-mail Section ################################ - -:e-mail -cmd_home -compare_ars expert -if_false - cls - menu renegade/email - end_if -async -compare_ars exempt T -if_true - print "n\r\nbhTime Used: [c@TUSED@b] " -else - print "n\r\nbhTime Left: [c@TLEFT@b] " - end_if - -print "bh(c?b=cHelpb)\r\nEmail Menu m: n" - -# Get key (with / extended commands allowed) -compare_user_misc UM_COLDKEYS -if_false - getkeye -else - getstrupr 60 - endif - -# Do nothing for control keys and space -cmdkey ^@ - end_cmd -cmdkey ^M - end_cmd -cmdkey ^S - end_cmd - cmdkey " - end_cmd - -logkey - -# Show the key hit -compare_user_misc UM_COLDKEYS -if_false - printkey - endif - -compare_user_misc UM_COLDKEYS -if_false - crlf - end_if -pause_reset - -cmdkey ? - compare_ars expert - if_true - cls - menu renegade/email - end_if - end_cmd - -cmdkey E - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send - end_cmd - -cmdkey R - mail_read - end_cmd - -cmdkey V - mail_read_sent - end_cmd - -cmdkey Q - cmd_pop - goto main - end_cmd - -cmdkey G - file_download_batch - if_true - end_cmd - end_if - logoff - end_cmd - -cmdkey /G - file_download_batch - if_true - end_cmd - end_if - logoff_fast - end_cmd - -# fall through -print "\r\nchUnrecognized command." -compare_ars expert -if_true - print " Hit 'i?nch' for a menu." - end_if -crlf -end_cmd - - -########################### Main Config Section ############################## - -:main_cfg - -compare_ars expert -if_false - menu maincfg - end_if -async -print "\r\nyhConfig: n" -getcmd ?QNPIS\r -logkey - -cmdkey ? - compare_ars expert - if_true - menu maincfg - end_if - goto main_cfg - end_cmd - -cmdkey N - msg_new_scan_cfg - return - end_cmd - -cmdkey S - msg_your_scan_cfg - return - end_cmd - -cmdkey P - msg_ptrs_cfg - return - end_cmd - -cmdkey I - msg_ptrs_reinit - return - end_cmd - -return - -########################### File Transfer Section ############################# - -:file_transfers - -cmd_home - -compare_ars expert -if_false - cls - menu renegade/transfer - end_if - -# Update node status -node_action node_xfer -async - -# Display main Prompt -print "n\r\nbh[@LIB@ @DIR@]\r\n" -compare_ars exempt T -if_true - print "bhTime Used: [c@TUSED@b] " -else - print "bhTime Left: [c@TLEFT@b] " - end_if - -print "bh(c?b=cHelpb)\r\nFile Menu m: n" - -# Get key (with / extended commands allowed) -compare_user_misc UM_COLDKEYS -if_false - getkeye -else - getstrupr 60 - endif - -# Do nothing for control keys and space -cmdkey ^@ - end_cmd -cmdkey ^M - end_cmd -cmdkey ^S - end_cmd - cmdkey " - end_cmd - -# Write command to log file -logkey_comma - -# Hitting number changes current sub-board -cmdkey digit - compare_user_misc UM_COLDKEYS - if_false - ungetkey - end_if - file_get_dir_num - end_cmd - -# Hitting /number changes current group -cmdkey edigit - compare_user_misc UM_COLDKEYS - if_false - ungetkey - else - shift_str 1 - end_if - file_get_lib_num - end_cmd - -# Show the key hit -compare_user_misc UM_COLDKEYS -if_false - printkey - endif - -# Next library -cmdkey ] - file_directory_up - end_cmd - -# Previous library -cmdkey [ - file_directory_down - end_cmd - -cmdkey Q - cmd_pop - goto main - end_cmd - -compare_user_misc UM_COLDKEYS -if_false - crlf - end_if -pause_reset - -# Menu -cmdkey ? - compare_ars expert - if_true - cls - menu renegade/transfer - end_if - end_cmd - -# Commands - -cmdkey E - file_batch_section - end_cmd - -cmdkey C - exec_bin chat_sec - end_cmd - -cmdkey D - print "\r\nchDownload File(s)\r\n" - file_download_batch - if_true - end_cmd - end_if - getfilespec - if_true - file_download - end_if - end_cmd - -cmdkey /D - file_download_user - end_cmd - -cmdkey F - print "\r\nchFind Text in File Descriptions (no wildcards)\r\n" - file_find_text - end_cmd - -cmdkey /F - file_find_text_all - end_cmd - -cmdkey A - file_show_directories - end_cmd - -cmdkey /* - file_show_libraries - end_cmd - -cmdkey J - file_select_area - end_cmd - -cmdkey L - print "\r\nchList Files\r\n" - getfilespec - if_true - file_list - end_if - end_cmd - -cmdkey /L - nodelist_all - end_cmd - -cmdkey M - cmd_pop - goto message - end_cmd - -cmdkey N - print "\r\nchNew File Scan\r\n" - file_new_scan - end_cmd - -cmdkey /N - file_new_scan_all - end_cmd - -cmdkey G - file_download_batch - if_true - end_cmd - end_if - logoff - end_cmd - -cmdkey /G - file_download_batch - if_true - end_cmd - end_if - logoff_fast - end_cmd - -cmdkey S - print "\r\nchSearch for Filename(s)\r\n" - file_find_name - end_cmd - -cmdkey /S - file_find_name_all - end_cmd - -cmdkey /A - file_temp_section - end_cmd - -cmdkey U - print "\r\nchUpload File\r\n" - chkfile "%zmenu/upload.*" - if_true - menu upload - end_if - file_upload - end_cmd - -cmdkey /U - file_upload_user - end_cmd - -cmdkey V - print "\r\nchView File(s)\r\n" - getfilespec - if_true - file_view - end_if - end_cmd - -cmdkey P - file_ptrs_cfg - end_cmd - -cmdkey Y - info_user - end_cmd - -cmdkey Z - print "\r\nchUpload File to Sysop\r\n" - file_upload_sysop - end_cmd - -cmdkey # - print "\r\nncEnter the number of the directory to change to.\r\n" - end_cmd - -cmdkey /# - print "\r\nncEnter the number of the library to change to.\r\n" - end_cmd - -# fall through -print "\r\nchUnrecognized command." -compare_ars expert -if_true - print " Hit 'i?nch' for a menu." - end_if -crlf -end_cmd - -# shouldn't hit next line -print "Problem in command shell." -pause -hangup - -############################### Message Section ############################### - -:message -cmd_home -compare_ars expert -if_false - cls - menu renegade/message - end_if - -# Update node status -node_action node_main -async - -# Display main Prompt -print "n\r\nbh[@GRP@ @SUB@]\r\n" -compare_ars exempt T -if_true - print "bhTime Used: [c@TUSED@b] " -else - print "bhTime Left: [c@TLEFT@b] " - end_if - -print "bh(c?b=cHelpb)\r\nMessage Menu m: n" - -# Get key (with / extended commands allowed) -compare_user_misc UM_COLDKEYS -if_false - getkeye -else - getstrupr 60 - endif - -# Do nothing for control keys and space -cmdkey ^@ - end_cmd -cmdkey ^M - end_cmd -cmdkey ^S - end_cmd - cmdkey " - end_cmd - -# Write command to log file -logkey_comma - -# Hitting number changes current sub-board -cmdkey digit - compare_user_misc UM_COLDKEYS - if_false - ungetkey - end_if - msg_get_sub_num - end_cmd - -# Hitting /number changes current group -cmdkey edigit - compare_user_misc UM_COLDKEYS - if_false - ungetkey - else - shift_str 1 - end_if - msg_get_grp_num - end_cmd - -# Show the key hit -compare_user_misc UM_COLDKEYS -if_false - printkey - endif - -cmdkey ? - compare_ars expert - if_true - cls - menu renegade/message - end_if - end_cmd - -cmdkey Q - cmd_pop - goto main - end_cmd - -cmdkey [ - msg_subboard_down - end_cmd - -cmdkey ] - msg_subboard_up - end_cmd - -compare_user_misc UM_COLDKEYS -if_false - crlf - end_if -pause_reset - -cmdkey A - msg_show_subboards - end_cmd - -cmdkey /A - msg_show_groups - end_cmd - -cmdkey C - exec_bin chat_sec - end_cmd - -cmdkey /L - nodelist_all - end_cmd - -cmdkey N - msg_new_scan - end_cmd - -cmdkey R - msg_read - end_cmd - -cmdkey P - msg_post - end_cmd - -cmdkey F - cmd_pop - goto file_transfers - end_cmd - -cmdkey S - print "\r\nchSearch for Text in Messages\r\n" - msg_find_text - end_cmd - -cmdkey U - userlist_sub - end_cmd - -cmdkey G - file_download_batch - if_true - end_cmd - end_if - logoff - end_cmd - -cmdkey /G - file_download_batch - if_true - end_cmd - end_if - logoff_fast - end_cmd - -cmdkey E - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send - end_cmd - -cmdkey J - msg_select_area - end_cmd - -cmdkey Y - msg_your_scan - end_cmd - -cmdkey Z - call main_cfg - end_cmd - -cmdkey # - print "\r\nncEnter the number of the sub-board to change to.\r\n" - end_cmd - -cmdkey /# - print "\r\nncEnter the number of the message group to change to.\r\n" - end_cmd - -# fall through -print "\r\nchUnrecognized command." -compare_ars expert -if_true - print " Hit 'i?nch' for a menu." - end_if -crlf -end_cmd - -############################## Sysop Commands ################################# - -:sysop -cmd_home -menu sysmain -print "n\r\nchSelect an option (or Q to quit): n" -getstrupr 40 - -cmdstr "Q" - cmd_pop - return - end_cmd - -exec_bin str_cmds - -end_cmd - - -############################ Main Info Section ############################### - -:main_info -cmd_home -compare_ars expert -if_false - menu maininfo - end_if -async -print "\r\nyhInfo: n" -getcmd ?QISVY\r -logkey - -cmdkey ? - compare_ars expert - if_true - menu maininfo - end_if - end_cmd - -cmdkey I - info_system - end_cmd - -cmdkey S - info_subboard - end_cmd - -cmdkey Y - info_user - end_cmd - -cmdkey V - info_version - end_cmd - -cmdkey Q - cmd_pop - return - end_cmd - -cmd_pop -return - diff --git a/exec/rlogin.src b/exec/rlogin.src deleted file mode 100644 index 49c7075c5c..0000000000 --- a/exec/rlogin.src +++ /dev/null @@ -1,15 +0,0 @@ -# rlogin.src - -# Telnet Gateway using RLogin protocol - Requires v3.00c - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -printf "\r\n\1h\1hPress \1yCtrl-]\1w for a control menu anytime.\r\n\r\n" -pause -printf "\1h\1yConnecting to: \1w%s\1n\r\n" str -telnet_gate str TG_RLOGIN -cls diff --git a/exec/sbbsdefs.inc b/exec/sbbsdefs.inc deleted file mode 100644 index 571f1b399c..0000000000 --- a/exec/sbbsdefs.inc +++ /dev/null @@ -1,361 +0,0 @@ -# sbbsdefs.inc - -# Baja include file defining various Synchronet related constants - -# $id$ - -# @format.tab-size 8, @format.use-tabs true - -!include nodedefs.inc -!include userdefs.inc -!include errno.inc - - # System toggle options (_SYS_MISC) -!define SM_CLOSED .0 # System is clsoed to New Users -!define SM_SYSSTAT .1 # Sysops activity included in statistics -!define SM_NOBEEP .2 # No beep sound locally -!define SM_PWEDIT .3 # Allow users to change their passwords -!define SM_RA_EMU .4 # Reverse R/A read message/mail command keys -!define SM_ANON_EM .5 # Allow anonymous e-mail -!define SM_LISTLOC .6 # Use location of caller in user lists -!define SM_WILDCAT .7 # Expand Wildcat color codes in messages -!define SM_PCBOARD .8 # Expand PCBoard color codes in messages -!define SM_WWIV .9 # Expand WWIV color codes in messages -!define SM_CELERITY .10 # Expand Celerity color codes in messages -!define SM_RENEGADE .11 # Expand Renegade color codes in messages -!define SM_ECHO_PW .12 # Echo passwords locally -!define SM_REQ_PW .13 # Require passwords locally -!define SM_L_SYSOP .14 # Allow local sysop logon/commands -!define SM_R_SYSOP .15 # Allow remote sysop logon/commands -!define SM_QUOTE_EM .16 # Allow quoting of e-mail -!define SM_EURODATE .17 # Europian date format (DD/MM/YY -!define SM_MILITARY .18 # Military time format -!define SM_TIMEBANK .19 # Allow time bank functions -!define SM_FILE_EM .20 # Allow file attachments in E-mail -!define SM_SHRTPAGE .21 # Short sysop page -!define SM_TIME_EXP .22 # Set to expired values if out-of-time -!define SM_FASTMAIL .23 # Fast e-mail storage mode -!define SM_QVALKEYS .24 # Quick validation keys enabled -!define SM_ERRALARM .25 # Error beeps on -!define SM_FWDTONET .26 # Allow forwarding of e-mail to netmail -!define SM_DELREADM .27 # Delete read mail automatically -!define SM_NOCDTCVT .28 # No credit to minute conversions allowed - - # Node toggle options (_NODE_MISC) -!define NM_ANSALARM .0 # Alarm locally on answer -!define NM_WFCSCRN .1 # Wait for call screen -!define NM_WFCMSGS .2 # Include total messages/files on WFC -!define NM_LCL_EDIT .3 # Use local editor to create messages -!define NM_EMSOVL .4 # Use expanded memory of overlays -!define NM_WINOS2 .5 # Use Windows/OS2 time slice API call -!define NM_INT28 .6 # Make int 28 DOS idle calls -!define NM_NODV .7 # Don't detect and use DESQview API -!define NM_NO_NUM .8 # Don't allow logons by user number -!define NM_LOGON_R .9 # Allow logons by user real name -!define NM_LOGON_P .10 # Secure logons (always ask for password -!define NM_NO_LKBRD .11 # No local keyboard (at all -!define NM_SYSPW .12 # Protect WFC keys and Alt keys with SY: -!define NM_NO_INACT .13 # No local inactivity alert/logoff -!define NM_NOBEEP .14 # Don't beep locally -!define NM_LOWPRIO .15 # Always use low priority input -!define NM_7BITONLY .16 # Except 7-bit input only (E71 terminals -!define NM_NOPAUSESPIN .17 # No spinning cursor at pause prompt - - # New user question toggles (_UQ) -!define UQ_ALIASES .0 # Ask for alias -!define UQ_LOCATION .1 # Ask for location -!define UQ_ADDRESS .2 # Ask for address -!define UQ_PHONE .3 # Ask for phone number -!define UQ_HANDLE .4 # Ask for chat handle -!define UQ_DUPHAND .5 # Search for duplicate handles -!define UQ_SEX .6 # Ask for sex -!define UQ_BIRTH .7 # Ask for birth date -!define UQ_COMP .8 # Ask for computer type -!define UQ_MC_COMP .9 # Multiple choice computer type -!define UQ_REALNAME .10 # Ask for real name -!define UQ_DUPREAL .11 # Search for duplicate real names -!define UQ_COMPANY .12 # Ask for company name -!define UQ_NOEXASC .13 # Don't allow ex-ASCII in user text -!define UQ_CMDSHELL .14 # Ask for command shell -!define UQ_XEDIT .15 # Ask for external editor -!define UQ_NODEF .16 # Don't ask for default settings -!define UQ_NOCOMMAS .17 # Do not require commas in location - - - # FidoNet netmail toggles (_NETMAIL_MISC) -!define NMAIL_ALLOW .0 # Allow NetMail -!define NMAIL_CRASH .1 # Default netmail to crash -!define NMAIL_HOLD .2 # Default netmail to hold -!define NMAIL_KILL .3 # Default netmail to kill after sent -!define NMAIL_ALIAS .4 # Use Aliases in NetMail -!define NMAIL_FILE .5 # Allow file attachments -!define NMAIL_DIRECT .6 # Default netmail to direct - - # Console I/O status (_CONSOLE) -!define CON_R_ECHO .0 # Echo remotely -!define CON_R_ECHOX .1 # Echo X's to remote user -!define CON_R_INPUT .2 # Accept input remotely -!define CON_L_ECHO .3 # Echo locally -!define CON_L_ECHOX .4 # Echo X's locally -!define CON_L_INPUT .5 # Accept input locally -!define CON_RAW_IN .8 # Raw input mode - no editing capabilities -!define CON_ECHO_OFF .10 # Remote & Local echo disabled for ML/MF -!define CON_UPARROW .11 # Up arrow hit - move up one line -!define CON_NO_INACT .13 # Disable user inactivity detection - - # String lengths - -!define LEN_FDESC 58 # File description -!define LEN_TITLE 70 # Message title -!define LEN_CID 25 # Caller ID (phone number -!define LEN_ARSTR 40 # Max length of Access Requirement string -!define LEN_CHATACTCMD 9 # Chat action command -!define LEN_CHATACTOUT 65 # Chat action output string - - - # Online status (0=offline) (_ONLINE) -!define ON_LOCAL 1 # Online locally -!define ON_REMOTE 2 # Online remotely - - # System status bits (_SYS_STATUS) -!define SS_LOGOPEN .0 # Node's Log file is open -!define SS_INITIAL .1 # The bbs data has been initialized. -!define SS_TMPSYSOP .2 # Temporary Sysop Status -!define SS_USERON .3 # A User is logged on to the BBS -!define SS_LCHAT .4 # Local chat in progress -!define SS_CAP .5 # Capture is on -!define SS_ANSCAP .6 # Capture ANSI codes too -!define SS_FINPUT .7 # Using file for input -!define SS_COMISR .8 # Com port ISR is installed -!define SS_DAILY .9 # Execute System Daily Event on logoff -!define SS_INUEDIT .10 # Inside Alt-Useredit section -!define SS_ABORT .11 # Global abort input or output flag -!define SS_SYSPAGE .12 # Paging sysop -!define SS_SYSALERT .13 # Notify sysop when users hangs up -!define SS_GURUCHAT .14 # Guru chat in progress -!define SS_NODEDAB .15 # NODE.DAB operations are okay -!define SS_EVENT .16 # Time shortened due to upcoming event -!define SS_PAUSEON .17 # Pause on, overriding user default -!define SS_PAUSEOFF .18 # Pause off, overriding user default -!define SS_IN_CTRLP .19 # Inside ctrl-p send node message func -!define SS_NEWUSER .20 # New User online -!define SS_MDMDEBUG .21 # Modem debug output -!define SS_NEST_PF .22 # Nested in printfile function -!define SS_DCDHIGH .23 # Assume DCD is high always -!define SS_SPLITP .24 # Split-screen private chat -!define SS_RLOGIN .26 # RLogin session (not telnet) - - # Bits in 'mode' for GETSTR function -!define K_UPPER .0 # Converts all letters to upper case -!define K_UPRLWR .1 # Upper/Lower case automatically -!define K_NUMBER .2 # Allow numbers only -!define K_WRAP .3 # Allows word wrap -!define K_MSG .4 # Allows ANSI, ^N ^A ^G -!define K_SPIN .5 # Spinning cursor (same as SPIN -!define K_LINE .6 # Input line (inverse color -!define K_EDIT .7 # Edit string passed -!define K_CHAT .8 # In chat multi-chat -!define K_NOCRLF .9 # Don't print CRLF after string input -!define K_ALPHA .10 # Only allow alphabetic characters -!define K_GETSTR .11 # getkey called from getstr -!define K_LOWPRIO .12 # low priority input -!define K_NOEXASC .13 # No extended ASCII allowed -!define K_E71DETECT .14 # Detect E-7-1 terminal type -!define K_AUTODEL .15 # Auto-delete text (used with K_EDIT -!define K_COLD .16 # Possible cold key mode -!define K_NOECHO .17 # Don't echo input -!define K_TAB .18 # Treat TAB as CR - - # Bits in 'mode' for PRINTFILE function -!define P_NOABORT .0 # Disallows abortion of a message -!define P_SAVEATR .1 # Save the new current attributres after - # msg has printed. -!define P_NOATCODES .2 # Don't allow @ codes -!define P_OPENCLOSE .3 # Open and close the file - - - # Values for USER_EVENT function -!define EVENT_NONE 0 # Only accessible by menu -!define EVENT_LOGON 1 # Execute during logon sequence -!define EVENT_NEWUSER 2 # Execute during newuser app. -!define EVENT_BIRTHDAY 3 # Execute on birthday -!define EVENT_LOGOFF 4 # Execute during normal logoff - -!define TG_ECHO .0 # Turn on telnet echo -!define TG_CRLF .1 # Expand sole CR to CRLF -!define TG_LINEMODE .2 # Send entire lines only -!define TG_NODESYNC .3 # Call Nodesync, get msgs, etc. -!define TG_CTRLKEYS .4 # Interpret ^P ^U ^T, etc locally -!define TG_PASSTHRU .5 # Pass-through telnet commands/responses -!define TG_RLOGIN .6 # Use BSD RLogin protocol - - # Bits for _FTP_MODE -!define FTP_ECHO_CMD .0 # Echo commands to user (debug) -!define FTP_ECHO_RSP .1 # Echo reply/response lines to user -!define FTP_PASV .2 # Use passive transfer mode -!define FTP_ASCII .3 # Use ASCII transfer mode -!define FTP_HASH .4 # Print hash marks during transfers - -!define BBS_OPT_KEEP_ALIVE .0 # Send keep-alives -!define BBS_OPT_XTRN_MINIMIZED .1 # Run externals minimized -!define BBS_OPT_AUTO_LOGON .2 # Auto-logon via IP -!define BBS_OPT_DEBUG_TELNET .3 # Debug telnet commands -!define BBS_OPT_SYSOP_AVAILABLE .4 # Available for chat -!define BBS_OPT_ALLOW_RLOGIN .5 # Allow logins via BSD RLogin -!define BBS_OPT_USE_2ND_RLOGIN .6 # Use 2nd username in BSD RLogin -!define BBS_OPT_NO_QWK_EVENTS .7 # Don't run QWK-related events -!define BBS_OPT_NO_HOST_LOOKUP .11 -!define BBS_OPT_LOCAL_TIMEZONE .30 # Don't force UCT/GMT -!define BBS_OPT_MUTE .31 # Mute sounds - -################################ -# System Variable Declarations # -################################ - - # String variables -!global _USERON.ALIAS -!global _USERON.NAME -!global _USERON.HANDLE -!global _USERON.COMP -!global _USERON.NOTE -!global _USERON.ADDRESS -!global _USERON.LOCATION -!global _USERON.ZIPCODE -!global _USERON.PASS -!global _USERON.BIRTH -!global _USERON.PHONE -!global _USERON.MODEM -!global _USERON.NETMAIL -!global _USERON.TMPEXT -!global _USERON.COMMENT -!global _CONNECTION -!global _CAP_FNAME -!global _CID -!global _COMSPEC -!global _QUESTION - - # Integer variables -!global _USERON.NUMBER -!global _USERON.ULS -!global _USERON.DLS -!global _USERON.POSTS -!global _USERON.EMAILS -!global _USERON.FBACKS -!global _USERON.ETODAY -!global _USERON.PTODAY -!global _USERON.TIMEON -!global _USERON.TEXTRA -!global _USERON.LOGONS -!global _USERON.TTODAY -!global _USERON.TLAST -!global _USERON.LTODAY -!global _USERON.XEDIT -!global _USERON.SHELL -!global _USERON.LEVEL -!global _USERON.SEX -!global _USERON.ROWS -!global _USERON.PROT -!global _USERON.LEECH -!global _USERON.MISC -!global _USERON.QWK -!global _USERON.CHAT -!global _USERON.FLAGS1 -!global _USERON.FLAGS2 -!global _USERON.FLAGS3 -!global _USERON.FLAGS4 -!global _USERON.EXEMPT -!global _USERON.REST -!global _USERON.ULB -!global _USERON.DLB -!global _USERON.CDT -!global _USERON.MIN -!global _USERON.FREECDT -!global _USERON.FIRSTON -!global _USERON.LASTON -!global _USERON.EXPIRE -!global _USERON.PWMOD -!global _USERON.NS_TIME -!global _CUR_RATE -!global _CUR_CPS -!global _DTE_RATE -!global _LNCNTR -!global _TOS -!global _ROWS -!global _AUTOTERM -!global _CONSOLE -!global _ANSWERTIME -!global _LOGONTIME -!global _NS_TIME -!global _LAST_NS_TIME -!global _ONLINE -!global _SYS_STATUS -!global _SYS_MISC -!global _SYS_PSNUM -!global _SYS_TIMEZONE -!global _SYS_PWDAYS -!global _SYS_DELDAYS -!global _SYS_AUTODEL -!global _SYS_NODES -!global _SYS_EXP_WARN -!global _SYS_LASTNODE -!global _SYS_AUTONODE -!global _NODE_SCRNLEN -!global _NODE_SCRNBLANK -!global _NODE_MISC -!global _NODE_VALUSER -!global _NODE_IVT -!global _NODE_SWAP -!global _NODE_MINBPS -!global _NODE_NUM -!global _NEW_LEVEL -!global _NEW_FLAGS1 -!global _NEW_FLAGS2 -!global _NEW_FLAGS3 -!global _NEW_FLAGS4 -!global _NEW_EXEMPT -!global _NEW_REST -!global _NEW_CDT -!global _NEW_MIN -!global _NEW_SHELL -!global _NEW_MISC -!global _NEW_EXPIRE -!global _NEW_PROT -!global _EXPIRED_LEVEL -!global _EXPIRED_FLAGS1 -!global _EXPIRED_FLAGS2 -!global _EXPIRED_FLAGS3 -!global _EXPIRED_FLAGS4 -!global _EXPIRED_EXEMPT -!global _EXPIRED_REST -!global _MIN_DSPACE -!global _CDT_MIN_VALUE -!global _CDT_PER_DOLLAR -!global _LEECH_PCT -!global _LEECH_SEC -!global _NETMAIL_COST -!global _NETMAIL_MISC -!global _INETMAIL_COST -!global _INETMAIL_MISC -!global _LOGON_ULB -!global _LOGON_DLB -!global _LOGON_ULS -!global _LOGON_DLS -!global _LOGON_POSTS -!global _LOGON_EMAILS -!global _LOGON_FBACKS -!global _POSTS_READ -!global _LOGFILE -!global _NODEFILE -!global _NODE_EXT -!global _TIMELEFT -!global _MAX_MINUTES -!global _MAX_QWKMSGS -!global _UQ -!global _ERRORLEVEL -!global _WORDWRAP -!global _FTP_MODE -!global _CLIENT_SOCKET -!global _SOCKET_ERROR -!global _STARTUP_OPTIONS - -# End of SBBSDEFS.INC diff --git a/exec/sbbshelp.dab b/exec/sbbshelp.dab deleted file mode 100644 index b0be5b2efd..0000000000 --- a/exec/sbbshelp.dab +++ /dev/null @@ -1,170 +0,0 @@ -��������� Synchronet Local Keyboard Commands ���������� (* - -t -o -g -g -l -e -) �� *A -l -t -- -N - -Lock This Node �� *A -l -t -- -R - -Rerun This Node After Logoff �� A -l -t -- -H - -Hang up on User Immediately �� *A -l -t -- -I - -Interrupt (Hang up) User with Message �� *A -l -t -- -A - -Alert Sysop After Logoff �� *A -l -t -- -Q - -Disable/Enable Remote Keyboard (Quiet User) �� A -l -t -- -U - -User Editor (Display [WAIT] Remotely) �� *A -l -t -- -E - -Local I/O Only (Display [WAIT] Remotely) �� *A -l -t -- -T - -Temporary Sysop Status �� A -l -t -- -D - -Shell to DOS (Display [WAIT] Remotely) �� *A -l -t -- -L - -Turn Local Text/ANSI Capture On/Off �� *A -l -t -- -C - -Pop User in and out of Local Sysop Chat �� *A -l -t -- -G - -Pop User in and out of Local Guru Chat �� A -l -t -- -P - -Turn Chat Page Off �� *A -l -t -- -X - -Exit to DOS After Logoff (Down Node) �� A -l -t -- -+ - -Add 5 Minutes to User's Time �� A -l -t -- -- - -Subtract 5 Minutes from User's Time �� A -l -t -- -0 - -through A -l -t -- -9 - -Quick Validation �� P -a -g -e - -U -p - -ASCII Upload �� C -t -r -l -- -U -p -, - -D -n -, - -H -o -m -e -, - -a -n -d - -E -n -d - -to Scroll Status Line �� *S -c -r -o -l -l -- -l -o -c -k - -On if Sysop is Available for Chat ������������������������������������������������������� \ No newline at end of file diff --git a/exec/sbbsimsg.js b/exec/sbbsimsg.js deleted file mode 100644 index 3d3f6faae2..0000000000 --- a/exec/sbbsimsg.js +++ /dev/null @@ -1,316 +0,0 @@ -// sbbsimsg.js - -load("sbbsdefs.js"); -load("nodedefs.js"); - -// Global vars -var imsg_user; -var last_user=0; - -print("\1n\1hSynchronet \1cInstant Message \1wModule \1nv1.00 Alpha\r\n"); - -// Parse arguments -for(i=0;i<argc;i++) - if(argv[i].toLowerCase()=="-l") { - list_users(true); - exit(); - } - -// Read the list of systems into list array -fname = system.ctrl_dir + "sbbsimsg.lst"; - -f = new File(fname); -if(!f.open("r")) { - alert("Error opening " + fname); - exit(); -} - -list = f.readAll(); -f.close(); -for(line=0;;) { - if(list[line]==null) - break; - while(list[line].charAt(0)==' ') // skip prepended spaces - list[line]=list[line].slice(1); - if(list[line].charAt(0)==';' || // comment - list[line]==system.inetaddr) { // local system - list.splice(line,1); // ignore - continue; - } - sp=list[line].indexOf(' '); - tab=list[line].indexOf('\t'); - if(tab>0 && tab<sp) - sp=tab; - if(sp>0) // truncate at first space or tab - list[line]=list[line].slice(0,sp); - line++; -} - - -// Truncate space off end of string -function truncsp(str) -{ - var len; - - while((len=str.length)!=0 && str.charAt(len-1)==' ') - str=str.slice(0,-1); - - return(str); -} - -function list_users(show) -{ - imsg_user = new Array(); - var users=0; - - print("\1m\1hListing Systems and Users (Ctrl-C to Abort)...\r\n"); - - for(i=0;list[i]!=null && !(bbs.sys_status&SS_ABORT);i++) { - - if(show) { - console.line_counter=0; // defeat pause - printf("\1n\1h%-25.25s\1n ",list[i]); - } - - sock = new Socket(); - if(!sock.connect(list[i],79)) { - log(format("!Finger connection to %s FAILED with error %d" - ,list[i],sock.last_error)); - alert("system not available"); - list.splice(i,1); - i--; - continue; - } - sock.send("\r\n"); // Get list of active users - var response=new Array(); - while(bbs.online && sock.is_connected) { - str=sock.readline(); - if(str==null) - break; - response.push(truncsp(str)); - } - sock.close(); - - - // Skip header - while(response.length && response[0].charAt(0)!='-') - response.shift(); - if(response.length && response[0].charAt(0)=='-') - response.shift(); // Delete the separator line - while(response.length && !response[0].length) - response.shift(); // Delete any blank lines - - if(!response.length) { - if(show) - print(); - continue; - } - - if(show) { - str = format("%lu user%s",response.length,response.length==1 ? "":"s"); - printf("\1g\1h%-40s Age Sex\r\n",str); - } - - for(j in response) { - if(response[j]=="") - continue; - - if(show) { - console.line_counter=0; // defeat pause - print(format("\1h\1y%.25s\1n\1g %.48s" - ,response[j],response[j].slice(26))); - } - var u = new Object; - u.host = list[i]; - u.name = format("%.25s",response[j]); - u.name = truncsp(u.name); - imsg_user.push(u); - users++; - } - } - printf("\1m\1h%lu systems and %lu users listed.\r\n",i+1,users); - -} - -function send_msg(dest, msg) -{ - - if((hp = dest.indexOf('@'))==-1) { - alert("Invalid user"); - exit(); - } - host = dest.slice(hp+1); - - printf("\1h\1ySending...\r\1w"); - sock = new Socket(); - //sock.debug = true; - do { - if(!sock.connect(host,25)) { - alert("Connection to " + host + " failed with error " + sock.last_error); - break; - } - - if(Number((rsp=sock.recvline()).slice(0,3))!=220) { - alert("Invalid connection response:\r\n" + rsp); - break; - } - sock.send("HELO "+system.inetaddr+"\r\n"); - if(Number((rsp=sock.recvline()).slice(0,3))!=250) { - alert("Invalid HELO response: " + rsp); - break; - } - sock.send("SOML FROM: "+user.email+"\r\n"); - if(Number((rsp=sock.recvline()).slice(0,3))!=250) { - alert("Invalid SOML response: " + rsp); - break; - } - sock.send("RCPT TO: "+dest+"\r\n"); - if(Number((rsp=sock.recvline()).slice(0,3))!=250) { - alert("Invalid RCPT TO response: " + rsp); - break; - } - sock.send("DATA\r\n"); - if(Number((rsp=sock.recvline()).slice(0,3))!=354) { - alert("Invalid DATA response: " + rsp); - break; - } - sock.send(msg); - sock.send("\r\n.\r\n"); - if(Number((rsp=sock.recvline()).slice(0,3))!=250) { - alert("Invalid end of message response: " + rsp); - break; - } - sock.send("QUIT\r\n"); - print("Message delivered successfully."); - - } while(0); - - sock.close(); -} - -function getmsg() -{ - var lines=0; - var msg=""; - const max_lines = 5; - - printf("\1n\1g\1h%lu\1n\1g lines maximum (blank line ends)\r\n",max_lines); - while(bbs.online && lines<max_lines) { - console.print("\1n: \1h"); - mode=0; - if(lines+1<max_lines) - mode|=K_WRAP; - str=console.getstr(76, mode); - if(str=="") - break; - msg+=str; - msg+="\r\n"; - lines++; - } - - if(!lines || !bbs.online || bbs.sys_status&SS_ABORT) - return(""); - - return(msg); -} - -list_users(true); // Needed to initialize imsg_user[] -console.crlf(); - -var key; -while(bbs.online) { - console.line_counter=0; // defeat pause - console.print("\1n\1h\1bInter-BBS: "); - console.mnemonics("~Telegram, ~Message, ~List, or ~Quit: "); - bbs.sys_status&=~SS_ABORT; - while(bbs.online && !(bbs.sys_status&SS_ABORT)) { - key=console.inkey(K_UPPER); - if(key=='Q' || key=='L' || key=='T' || key=='M' || key=='\r') - break; - if(system.node_list[bbs.node_num-1].misc&(NODE_MSGW|NODE_NMSG)) { - console.line_counter=0; // defeat pause - console.saveline(); - console.crlf(); - bbs.nodesync(); - console.crlf(); - console.restoreline(); - } - } -// printf("key=%s\r\n",key); - switch(key) { - case 'L': - print("\1h\1cList\r\n"); - list_users(true); - console.crlf(); - break; - case 'T': - printf("\1h\1cTelegram\r\n\r\n"); - printf("\1n\1h\1y(user@hostname): \1w"); - if(imsg_user.length) - dest=format("%s@%s",imsg_user[last_user].name,imsg_user[last_user].host); - else - dest=""; - dest=console.getstr(dest,64,K_EDIT|K_AUTODEL); - if(dest==null || dest=='' || bbs.sys_status&SS_ABORT) - break; - if((msg=getmsg())=='') - break; - send_msg(dest,msg); - console.crlf(); - break; - case 'M': - print("\1h\1cMessage\r\n"); - if(!imsg_user.length) { - alert("No users!\r\n"); - break; - } - done=false; - while(bbs.online && !done) { - printf("\r\1n\1h\x11\1n-[\1hQ\1nuit]-\1h\x10 \1y%-25s \1c%s\1>" - ,imsg_user[last_user].name,imsg_user[last_user].host); - switch(console.getkey(K_UPPER|K_NOECHO)) { - case '+': - case '>': - case ']': - case '\x06': /* right arrow */ - case 'N': - case '\n': /* dn arrrow */ - last_user++; - if(last_user>=imsg_user.length) - last_user=0; - break; - - case '-': - case '<': - case '[': - case '\x1d': /* left arrow */ - case 'P': - case '\x1e': /* up arrow */ - last_user--; - if(last_user<0) - last_user=imsg_user.length-1; - break; - case '\x1b': /* ESC */ - case 'Q': - printf("\r\1>"); - done=true; - break; - case '\r': - done=true; - dest=format("%s@%s" - ,imsg_user[last_user].name,imsg_user[last_user].host); - printf("\r\1n\1cSending message to \1h%s\1>\r\n",dest); - if((msg=getmsg())=='') - break; - send_msg(dest,msg); - console.crlf(); - break; - } - } - break; - default: - print("\1h\1cQuit"); - exit(); - break; - } -} diff --git a/exec/sbbsqnet.rs b/exec/sbbsqnet.rs deleted file mode 100644 index b7c55b450f..0000000000 --- a/exec/sbbsqnet.rs +++ /dev/null @@ -1,36 +0,0 @@ -; Synchronet QWK Network Robocom Script -; -; User account must have 'Q' restriction on host system -; -; If path to Synchronet data dir is incorrect, change it - -TITLE "Synchronet QWK Network Packet Exchange" - -WHEN "Hit a key" SEND "^M" ; if pause, hit enter -WHEN "No new messages" GOTO END ; if no new messages - -WAITFOR "NN:" FAILURE GOTO END ; wait for NN: prompt -SEND "%BBS13%^M" ; send login name -WAITFOR "PW:" FAILURE GOTO END ; wait for PW: prompt -SEND "%BBS7%^M" ; send password -IF NOT EXIST "%REPDIR%%ID%.REP" GOTO DOWNLOAD -WAITFOR "QWK: " FAILURE GOTO END ; QWK prompt -SEND "U" ; Upload -WAITFOR "Protocol" FAILURE GOTO END -SEND "ZN" ; Zmodem, don't hang up -UPLOAD "%REPDIR%%ID%.REP" -ERASE "%REPDIR%%ID%.REP" -:DOWNLOAD -WAITFOR "QWK: " FAILURE GOTO END ; QWK prompt -SEND "DL" ; Download, leave codes in -TIMEOUT 300 -WAITFOR "Protocol" FAILURE GOTO END -SEND "ZN" ; Zmodem, don't hang up -DOWNLOAD "%QWKDIR%%ID%.QWK" - -:END -SEND "Q" ; Logoff -DELAY 5 -HANGUP -EXIT - diff --git a/exec/sbbsqnet.scr b/exec/sbbsqnet.scr deleted file mode 100644 index 82280da0f9..0000000000 --- a/exec/sbbsqnet.scr +++ /dev/null @@ -1,91 +0,0 @@ -;Logon to Synchronet and transfer QWK packets using Zmodem -;This script file is for use with Qmodem! -GRAPHICS ANSI -TURNOFF NOISE -STRING SYSNAME PHONE ACCOUNT PASS RETRY DATADIR REP QWK INFO - -ASSIGN SYSNAME "XXXX" ; System being called -ASSIGN PHONE "XXXXXXX^M" ; System phone number -ASSIGN ACCOUNT "XXXXXX^M" ; Account on system -ASSIGN PASS "XXXXXXXX^M" ; Password -ASSIGN RETRY "20" ; # of times to retry -ASSIGN DATADIR "\SYNCHRO\DATA" ; Download directory -ASSIGN REP "$DATADIR\$SYSNAME.REP" ; REP is the name of the REPLY packet -ASSIGN QWK "$DATADIR\$SYSNAME.QWK" ; QWK is the name of the QWK packet -ASSIGN INFO "$DATADIR\$SYSNAME.LOG" ; INFO is the name of the LOG file - - - -CLRSCR ; Clear the screen - -LOG $INFO ; Open the log file -STAMP Qmodem QWK log opened -DISPLAYLN "SBBSQNET: Initialized " ; Display this line - -DISPLAYLN "SBBSQNET: Calling $SYSNAME" ; Information line -STAMP Calling $SYSNAME - -DISPLAYLN "SBBSQNET: Dialing $PHONE" ; Information line -DELAY 1000 -SEND "ATM0^M" - WHEN "BUSY" LOOP - WHEN "NO DIAL TONE" LOOP - TIMEOUT 45 LOOP - -LOOP: - DECR RETRY - IF "$RETRY" = "0" ENDQWK - DELAY 1000 - SEND "ATDT $PHONE" - WAITFOR "CONNECT" - DELAY 2000 - IF $ONLINE DONE - -GOTO LOOP - -DONE: - -TIMEOUT 600 ENDQWK ; wait up to 10 minutes for sucess -WHEN "HIT A KEY" "^M" -WAITFOR "NN:" -SEND "^M" -WAITFOR "NN:" -SEND "$ACCOUNT" -DELAY 100 -WAITFOR "PW:" -SEND "$PASS" -WAITFOR "QWK:" - -EXIST $REP UPREP ; If the reply exists, send it - -RECEIVE: - STAMP Download QWK packet - DELAY 1000 - SEND "DL" - WHEN "No New Messages" ENDQWK - WAITFOR "PROTOCOL" - SEND "ZN" - DOWNLOAD Z $QWK - WAITFOR "QWK:" - SEND "Q" - -ENDQWK: - SEND "Q" - HANGUP - STAMP Qmodem QWK log closed - TURNOFF LOG - SYSTEM X - -UPREP: - STAMP Upload REPly packet - DELAY 1000 - SEND "UZN" - WAITFOR "Start Transfer Now" - UPLOAD Z $REP - IF $SUCCESS DELREP - GOTO RECEIVE - -DELREP: - DOS "del $REP^M" - WAITFOR "QWK:" - GOTO RECEIVE diff --git a/exec/sbbsqnet.slt b/exec/sbbsqnet.slt deleted file mode 100644 index 70226769e1..0000000000 --- a/exec/sbbsqnet.slt +++ /dev/null @@ -1,138 +0,0 @@ -// Logon to Synchronet and transfer QWK packets using Zmodem -// Version 2.00 (updated 09/17/95) - -// This script should need no modification for most Synchronet hubs. -// The 'login name' node account must have the 'Q' restriction set on -// the hub (call-out to) system. -// arg1=system id -// arg2=dial list -// arg3=login name -// arg4=password -// arg5=retry count - -main(str arg1, str arg2, str arg3, str arg4, str arg5) -{ - str path[128],tmp[128]; - int t,tmark,tstat,nn,pw,pause,qwk,prot,qwkcnt=0; - -_zmod_auto=0; // Disable auto-zmodem (causing problems for many Qnet sysops) -_zmod_rcrash=0; // Disable zmodem receive crash recovery (resume) -clear_scr(); -printsc("SBBSQNET: Initialized "); -t=curtime(); -date(t,tmp); -printsc(tmp); -printsc(" "); -time(t,tmp); -prints(tmp); - -copystr(_up_dir,path,0,80); -strcat(path,"\"); -strcat(path,arg1); -strcat(path,".LOG"); -printsc("SBBSQNET: "); -if(usagelog(path)==-1) - printsc("ERROR OPENING "); -else - printsc("Opened "); -prints(path); - -copystr(_up_dir,path,0,80); -strcat(path,"\"); -strcat(path,arg1); -strcat(path,".REP"); - -if(filesize(path)>0) { - printsc("SBBSQNET: Attempting to send "); - prints(path); } - -printsc("SBBSQNET: "); -copystr("Calling ",tmp,0,80); -strcat(tmp,arg1); -prints(tmp); -ustamp(tmp,1,1); - -printsc("SBBSQNET: Dialing "); -prints(arg2); -if(redial(arg2,stoi(arg5),1)==-1) { // Dialing error - ustamp("Dial error.",1,1); - return; } -if(not carrier()) { - ustamp("No answer.",1,1); - return; } - -nn=track("NN:",0); -pw=track("PW:",0); -qwk=track("QWK:",0); -prot=track("PROTOCOL OR ",1); -pause=track("HIT A KEY",1); - -tmark=timer_start(18000); // wait up to 30 minutes for sucess -while(not time_up(tmark)) { - if(not carrier()) { - ustamp("No carrier.",1,1); - break; } - terminal(); - tstat=track_hit(0); // check for track hit - - if(tstat==nn) { // NN: prompt - // Show hub that we're a script - cputs("Telix Qnet Version 2.00"); - delay(10); // one second - cputs("^X"); // clear any garbage - cputs(arg3); // send login name - cputs("^M"); } - - else if(tstat==pw) { // PW: prompt - delay(1); - cputs(arg4); // send password - cputs("^M"); } - - else if(tstat==pause) // Hit a key - cputs("^M"); - - else if(tstat==qwk) { // QWK prompt - delay(1); - qwkcnt=qwkcnt+1; - if(qwkcnt==1) { - if(filesize(path)>0) { - cputs("UZN"); - delay(10); - terminal(); - flushbuf(); - if(send('Z',path)>=0) { // successful - copystr("DEL ",tmp,0,4); - strcat(tmp,path); - dos(tmp,0); } } // delete REP - else qwkcnt=2; } - if(qwkcnt==2) { - cputs("DL"); - while(not time_up(tmark)) { - if(not carrier()) - break; - terminal(); - tstat=track_hit(0); - if(tstat==qwk) { - qwkcnt=3; - break; } - if(tstat==prot) { - cputs("ZN"); - delay(10); - terminal(); - flushbuf(); - receive('Z',""); - break; } } } - if(qwkcnt==3) { - cputs("Q"); - break; } } } -delay(10); -terminal(); -if(time_up(tmark)) { - prints("SBBSQNET: Timeout."); - ustamp("Timeout.",1,1); } -hangup(); -timer_free(tmark); // free timer channel -track_free(0); // free track channels -usagelog("*CLOSE*"); // close log file -} - diff --git a/exec/sdos.src b/exec/sdos.src deleted file mode 100644 index 43f34ebb91..0000000000 --- a/exec/sdos.src +++ /dev/null @@ -1,684 +0,0 @@ -# sdos.src - -# DOS shell for Synchronet version 2 systems - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -# Thanks to Yojimbo for the BDOS shell that inspired this one - -!include sbbsdefs.inc - -# Give a bogus DOS error so they think they're in real DOS -print "nSpecified COMMAND search directory bad\r\n\r\n" -print "Microsoft(R) MS-DOS(R) Version 5.00\r\n" -print " (C)Copyright Microsoft Corp 1981-1991.\r\n" - -:root -cmd_home - -# Update node status -node_action node_main -async - -inc_main_cmds - -call display_prompt -print ">n" -getstr 128 -logstr - -compare_word "cd" -if_true - shift_str 2 - compare_word " " - if_true - shift_str 1 - end_if - compare_word "\\" - if_true - shift_str 1 - end_if - compare_word "mail" - if_true - cmd_pop - goto mail - end_if - compare_word "files" - if_true - cmd_pop - goto files - end_if - print "Invalid directory\r\n" - end_cmd - end_if - -cmdstr "dir" - menu sdos/root - end_cmd - -call global -end_cmd - -:display_prompt - -pause_reset -print "n\r\nC:\\" -return - - -############################################################################## -# This is where we go when it's not a valid command -# Let's really try to act like DOS now (i.e. fake 'em out) -############################################################################## - -:global - -# Just <CR>, so ignore -compare_str "" -if_true - return - end_if - -# String commands start with a semicolon -compare_word ";" -if_true - shift_str 1 - exec_bin str_cmds - return - end_if - -compare_str "sysop" -if_true - menu sysmain - return - end_if - -compare_str "type" -if_True - print "Required paramater missing\r\n" - return - end_if - -compare_word "type " -if_true - shift_str 5 - call type - return - end_if - -# Global BBS commands -compare_str "chat" -if_true - exec_bin chat_sec - return - end_if - -compare_str "open" -if_true - print "External program name missing\r\n" - return - end_if - -compare_word "open " -if_true - shift_str 5 - xtrn_exec - return - end_if - -compare_str "doors" -if_true - xtrn_section - return - end_if - -compare_str "gfiles" -if_true - text_file_section - return - end_if - -compare_str "automsg" -if_true - auto_message - return - end_if - -compare_str "setup" -if_true - user_defaults - return - end_if - -compare_str "logoff" -if_true - file_download_batch - if_true - return - end_if - logoff - return - end_if - -compare_str "ver" -if_True - info_version - return - end_if - -compare_str "exit" -if_true - logoff_fast - return - end_if - -# DOS Stuff -compare_word "dir" -if_true - shift_str 3 - compare_word " " - if_true - shift_str 1 - end_if - compare_str ".." - if_true - menu sdos/root - return - end_if - compare_word ".." - if_true - shift_str 2 - end_if - compare_str "" - if_true - menu sdos/root - return - end_if - compare_word "\\" - if_true - shift_str 1 - end_if - compare_str "" - if_true - menu sdos/root - return - end_if - compare_word "files" - if_true - menu sdos/files - return - end_if - compare_word "mail" - if_true - menu sdos/mail - return - end_if - shift_str 1 - compare_word ":" - if_true - print "Invalid drive specification\r\n" - return - end_if - print "\r\n Volume in drive C is BBS\r\n" - print " Volume Serial Number is 9156-8BEA\r\n" - print "Invalid directory\r\n" - return - end_if - -# Fake environment -compare_str "set" -if_true - print "COMSPEC=C:\\COMMAND.COM\r\n" - print "PROMPT=$p$g\r\n" - print "PATH=C:\\\r\n" - print "SBBSCTRL=C:\\SBBS\\CTRL\r\n" - print "SBBSNODE=C:\\BBS\\NODE@NODE@\\\r\n" - print "SBBSNNUM=@NODE@\r\n" - return - end_if - -# Pretend we set it -compare_word "set " -if_true - return - end_if - -# Echo -compare_str "echo" -if_true - print "ECHO is on\r\n" - return - end_if - -compare_word "echo " -if_true - shift_str 5 - printstr - crlf - return - end_if - -# Del, Erase, Copy -compare_str "del" -if_true - print "Required parameter missing\r\n" - return - end_if - -compare_word "del " -if_true - print "Sharing violation\r\n" - return - end_if - -compare_str "erase" -if_true - print "Required parameter missing\r\n" - return - end_if - -compare_word "erase " -if_true - print "Sharing violation\r\n" - return - end_if - -compare_str "copy" -if_true - print "Required parameter missing\r\n" - return - end_if - -compare_word "copy " -if_true - print "Sharing violation\r\n" - return - end_if - -# Changing drive letter? - -shift_str 1 -compare_word ":" -if_true - print "Invalid drive specification\r\n" - return - end_if -print "Bad command or file name\r\n" -return - -:files - -cmd_home -call display_prompt - -print "FILES>n" -getstr 128 -logstr - -compare_word "cd" -if_true - shift_str 2 - compare_word " " - if_true - shift_str 1 - end_if - compare_str ".." - if_true - cmd_pop - goto root - end_if - compare_word ".." - if_true - shift_str 2 - end_if - compare_str "\\" - if_true - cmd_pop - goto root - end_if - compare_str "\\mail" - if_true - cmd_pop - goto mail - end_if - print "Invalid directory\r\n" - end_cmd - end_if - -cmdstr "dir" - menu sdos/files - end_cmd - -cmdstr "batch" - file_batch_section - end_cmd - -cmdstr "download" - file_download_batch - if_true - end_cmd - end_if - getfilespec - if_true - file_download - end_if - end_cmd - -compare_word "download " -if_true - shift_str 9 - file_download - end_cmd - end_if - -cmdstr "extended" - getfilespec - if_true - file_list_extended - end_if - end_cmd - -compare_word "extended " -if_true - shift_str 9 - file_list_extended - end_cmd - end_If - -cmdstr "find" - file_find_text - end_cmd - -cmdstr "area" - file_select_area - end_cmd - -cmdstr "list" - getfilespec - if_true - file_list - end_if - end_cmd - -compare_word "list " -if_true - shift_str 5 - file_list - end_cmd - end_if - -cmdstr "newscan" - file_new_scan - end_cmd - -cmdstr "remove" - getfilespec - if_true - file_remove - end_if - end_cmd - -compare_word "remove " -if_True - shift_str 7 - file_remove - end_cmd - end_if - -cmdstr "search" - file_find_name - end_cmd - -cmdstr "temp" - file_temp_section - end_cmd - -cmdstr "upload" - chkfile "%zmenu/upload.*" - if_true - menu upload - end_if - file_upload - end_cmd - -cmdstr "view" - getfilespec - if_true - file_view - end_if - end_cmd - -compare_word "view " -if_True - shift_str 5 - file_view - end_cmd - end_if - -cmdstr "config" - file_ptrs_cfg - end_cmd - -call global -end_cmd - -:type - -compare_word nodes -if_true - nodelist_all - return - end_if - -compare_word logon -if_true - userlist_logons - return - end_if - -compare_word users -if_true - userlist_all - return - end_if - -compare_word system -if_true - info_system - return - end_if - -compare_word your -if_true - info_user - return - end_if - -print "File not found - " -printstr -crlf -return - - -:mail - -cmd_home - -# Update node status -node_action node_main -async - -inc_main_cmds - -call display_prompt - -print "MAIL>n" -getstr 128 -logstr - -compare_word "cd" -if_true - shift_str 2 - compare_word " " - if_true - shift_str 1 - end_if - compare_str ".." - if_true - cmd_pop - goto root - end_if - compare_word ".." - if_true - shift_str 2 - end_if - compare_str "\\" - if_true - cmd_pop - goto root - end_if - compare_str "\\files" - if_true - cmd_pop - goto files - end_if - print "Invalid directory\r\n" - end_cmd - end_if - -cmdstr "dir" - menu sdos/mail - end_cmd - -cmdstr "config" - call main_cfg - end_cmd - -cmdstr "send" - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send - end_cmd - -cmdstr "sendfile" - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send_file - end_cmd - -cmdstr "read" - mail_read - end_cmd - -cmdstr "feedback" - setstr "1" - mail_send_feedback - end_cmd - -cmdstr "netmail" - no_yes "\r\nAttach a file" - if_true - mail_send_netmail - else - mail_send_netfile - end_if - end_cmd - -cmdstr "readsent" - mail_read_sent - end_cmd - -cmdstr "area" - msg_select_area - end_cmd - -cmdstr "post" - msg_post - end_cmd - -cmdstr "newscan" - msg_new_scan - end_cmd - -cmdstr "find" - msg_find_text - end_cmd - -cmdstr "yourmsgs" - msg_your_scan - end_cmd - -cmdstr "qwk" - msg_qwk - end_cmd - -cmdstr "readmsgs" - msg_read - end_Cmd - - -call global -end_cmd - -########################### Main Config Section ############################## - -:main_cfg - -compare_user_misc UM_expert -if_false - menu maincfg - end_if -async -print "\r\nyhConfig: n" -getcmd ?QNPIS\r -logkey - -cmdkey ? - compare_user_misc UM_expert - if_true - menu maincfg - end_if - goto main_cfg - end_cmd - -cmdkey N - msg_new_scan_cfg - return - end_cmd - -cmdkey S - msg_your_scan_cfg - return - end_cmd - -cmdkey P - msg_ptrs_cfg - return - end_cmd - -cmdkey I - msg_ptrs_reinit - return - end_cmd - -return - -# End of SDOS.SRC diff --git a/exec/sendmsg.js b/exec/sendmsg.js deleted file mode 100644 index d8011797c1..0000000000 --- a/exec/sendmsg.js +++ /dev/null @@ -1,60 +0,0 @@ -// sendmsg.js - -// Send a short message (telegram) to a user on another Synchronet system -// Requires v3.10f or later - -if(argc>0 && argv[0].indexOf('@')!=-1) - dest = argv[0]; -else if((dest = prompt("User (user@hostname)"))==null) - exit(); -if((hp = dest.indexOf('@'))==-1) { - alert("Invalid user"); - exit(); -} -if((msg = prompt("Message"))==null) - exit(); -host = dest.slice(hp+1); -sock = new Socket(); -//sock.debug = true; -do { - if(!sock.connect(host,25)) { - alert("Connection to " + host + " failed with error " + sock.last_error); - break; - } - - if(Number((rsp=sock.recvline()).slice(0,3))!=220) { - alert("Invalid connection response:\r\n" + rsp); - break; - } - sock.send("HELO "+system.inetaddr+"\r\n"); - if(Number((rsp=sock.recvline()).slice(0,3))!=250) { - alert("Invalid HELO response: " + rsp); - break; - } - sock.send("SOML FROM: "+user.email+"\r\n"); - if(Number((rsp=sock.recvline()).slice(0,3))!=250) { - alert("Invalid SOML response: " + rsp); - break; - } - sock.send("RCPT TO: "+dest+"\r\n"); - if(Number((rsp=sock.recvline()).slice(0,3))!=250) { - alert("Invalid RCPT TO response: " + rsp); - break; - } - sock.send("DATA\r\n"); - if(Number((rsp=sock.recvline()).slice(0,3))!=354) { - alert("Invalid DATA response: " + rsp); - break; - } - sock.send(msg); - sock.send("\r\n.\r\n"); - if(Number((rsp=sock.recvline()).slice(0,3))!=250) { - alert("Invalid end of message response: " + rsp); - break; - } - sock.send("QUIT\r\n"); - print("Message delivered successfully."); - -} while(0); - -sock.close(); diff --git a/exec/simple.src b/exec/simple.src deleted file mode 100644 index 4b64ab88c5..0000000000 --- a/exec/simple.src +++ /dev/null @@ -1,380 +0,0 @@ -# simple.src - -# Simple Synchronet Command Shell - for beginner/first-time users - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -replace_text 563 "\1n\1h\1b{\1wContinue? Yes/No\1b} " - -# Set return point for main menu commands (via end_cmd) -cmd_home -# Update node status -node_action node_main -cls -async - -menu simple/main -menu simple/prompt -print "n" - -getstrupr 10 -crlf -pause_reset - -# Write command to log file -logstr - -# Commands - -cmdstr C - exec_bin chat_sec - end_cmd - -cmdstr CHAT - exec_bin chat_sec - end_cmd - -cmdstr Q - msg_qwk - end_cmd - -# Send Post/Email menu -cmdstr S - cmd_home - cls - async - menu simple/sendmsg - menu simple/prompt - print "n" - getstrupr 10 - crlf - pause_reset - - # Send Email - cmdstr E - call sendmail - end_cmd - - cmdstr EMAIL - call sendmail - end_cmd - - # Post Message - cmdstr P - call postmessage - end_cmd - - cmdstr POST - call postmessage - end_cmd - - # Send NetMail - cmdstr N - call sendnetmail - end_cmd - - cmdstr NETMAIL - call sendnetmail - end_cmd - - # Quit back to main - cmdstr Q - cmd_pop - end_cmd -end_cmd - -# Read messages/mail menu -cmdstr R - cmd_home - cls - async - menu simple/readmsg - menu simple/prompt - print "n" - getstrupr 10 - crlf - pause_reset - - # Read your Email - cmdstr E - mail_read - end_cmd - - cmdstr EMAIL - mail_read - end_cmd - - # Read your sent Email - cmdstr F - mail_read_sent - end_cmd - - # Read messages in a conference - cmdstr A - msg_select_area - if_true - msg_read - end_if - end_cmd - - cmdstr ALL - msg_read - end_cmd - - # Bulletins - cmdstr B - text_file_section - end_cmd - - # Read all new messages - cmdstr N - print "lbhScanning for new messages...\r\n" - msg_new_scan_all - end_cmd - - cmdstr NEW - print "lbhScanning for new messages...\r\n" - msg_new_scan_all - end_cmd - - # Read all new messages TO: YOU - cmdstr Y - print "lbhScanning for your messages...\r\n" - msg_your_scan_all - end_cmd - - cmdstr YOU - print "lbhScanning for your messages...\r\n" - msg_your_scan_all - end_cmd - - cmdstr YOUR - print "lbhScanning for your messages...\r\n" - msg_your_scan_all - end_cmd - - cmdstr C - call msg_cfg - end_cmd - - # Quit back to main menu - cmdstr Q - cmd_pop - end_cmd -end_cmd - -#Open door menu -cmdstr O - xtrn_section - end_cmd - -cmdstr OPEN - xtrn_section - end_cmd - -cmdstr DOOR - xtrn_section - end_cmd - -cmdstr DOORS - xtrn_section - end_cmd - -#Account config (user defaults) -cmdstr A - user_defaults - end_cmd - -#Page another user -cmdstr P - private_message - pause_reset - end_cmd - -#List users online -cmdstr L - cls - nodelist_users - end_cmd - -#List files -cmdstr F - cmd_home - cls - async - menu simple/filelist - menu simple/prompt - print "n" - getstrupr 10 - crlf - pause_reset - - cmdstr A - file_select_area - if_false - end_cmd - end_if - setstr "*.*" - file_list - end_cmd - - cmdstr N - print "\r\nbhUse c@NEWFILETIME@b for new file scan " - yes_no "date/time" - if_false - file_ptrs_cfg - if_false - end_cmd - end_if - end_if - file_new_scan_all - end_cmd - - cmdstr F - print "\r\nchFind Text in File Descriptions (no wildcards)\r\n" - file_find_text_all - end_cmd - - cmdstr S - print "\r\nchSearch for Filename(s)\r\n" - file_find_name_all - end_cmd - - # Quit back to main menu - cmdstr Q - cmd_pop - end_cmd -end_cmd - - -#Download file -cmdstr D - file_download_batch - if_true - end_cmd - end_if - print "\r\nEnter the filename or wildcard to download\r\n" - getfilespec - if_true - file_download - endif - end_cmd - -#Upload a file -cmdstr U - file_select_area - if_false - end_cmd - end_if - chkfile "%ztext/menu/upload.*" - if_true - menu upload - end_if - file_upload - end_cmd - -#Logoff -cmdstr G - call logoffbbs - end_cmd - -cmdstr BYE - call logoffbbs - end_cmd - -cmdstr GOODBYE - call logoffbbs - end_cmd - -cmdstr OFF - call logoffbbs - end_cmd - -cmdstr LOGOFF - call logoffbbs - end_cmd - -#fall through -end_cmd - -:logoffbbs -file_download_batch -if_false - logoff - endif -return - -:sendmail -print "\r\nbhSend E-mail to (User name or number): n" -getname 25 -compare_str "" -if_true - return - end_if -compare_str "SYSOP" -if_true - setstr "1" - end_if -no_yes "\r\nAttach a file" -if_false - mail_send_file -else - mail_send - end_if -return - -:sendnetmail -no_yes "\r\nAttach a file" -if_false - mail_send_netfile -else - mail_send_netmail - end_if -return - - -:postmessage -msg_select_area -if_true - msg_post - end_if -return - -########################### Msg Config Section ############################## - -:msg_cfg - -menu MAINCFG -async -print "\r\nyhCommand: n" -getstrupr 10 -logkey - -cmdkey N - msg_new_scan_cfg - return - end_cmd - -cmdkey S - msg_your_scan_cfg - return - end_cmd - -cmdkey P - msg_ptrs_cfg - return - end_cmd - -cmdkey I - msg_ptrs_reinit - return - end_cmd - -return - - -#end of SIMPLE.SRC diff --git a/exec/socktest.src b/exec/socktest.src deleted file mode 100644 index 263dfe903d..0000000000 --- a/exec/socktest.src +++ /dev/null @@ -1,63 +0,0 @@ -!include sbbsdefs.inc - -int sock len -str buf - -socket_open sock -if_false - print "open failure\r\n" - return - end_if -setstr "cvs.synchro.net" -socket_connect sock str 23 -if_false - print "connect failure\r\n" - return - end_if - -or _console CON_RAW_IN -loop - - inchar - if_true - compare_key ^] - if_equal - break - end_if - copy_char buf - socket_write sock buf - if_false - print "\r\nError writing to socket\r\n" - break - end_if - continue - end_if - - socket_check sock - if_false - print "\r\nSocket disconnected\r\n" - break - end_if - - socket_nread sock len - if_false - print "\r\nError getting read length\r\n" - break - end_if - - compare len 0 - if_equal - continue - end_if - -# printf "reading %d" len - - socket_read sock buf len - if_true - pause_reset - print buf - end_if - end_loop - -socket_close sock -xor _console CON_RAW_IN \ No newline at end of file diff --git a/exec/sound.js b/exec/sound.js deleted file mode 100644 index f84d052285..0000000000 --- a/exec/sound.js +++ /dev/null @@ -1,7 +0,0 @@ -/* sound.js */ - -/* Plays a sound (WAV) file on the local (server) sound system */ - -/* Sound filename must be specified on the command-line */ - -sound(argv[0]); \ No newline at end of file diff --git a/exec/str_cmds.src b/exec/str_cmds.src deleted file mode 100644 index d2e3b87df4..0000000000 --- a/exec/str_cmds.src +++ /dev/null @@ -1,453 +0,0 @@ -# str_cmds.src - -# Global String Command Module for Synchronet - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -# This is NOT a command shell, DO NOT add to SCFG->Command Shells - -# This module is loaded from command shells with the EXEC_BIN function - -# It contains mostly sysop commands (i.e. ;ERR) - -# The command string must be the current string (obtained with SETSTR, GETSTR -# or similar function) before this module is loaded. - -!include nodedefs.inc -!include file_io.inc - -str fname -int file - -# Remove any trailing spaces - -truncsp str - -logstr -compare_ars SYSOP -if_true - # Change node action to "sysop activities" - node_action NODE_SYSP - sync - - ######################## SYSOP Functions ############################## - - compare_str "ERR" - if_true - error_log - return - end_if - - compare_str "GURU" - if_true - guru_log - return - end_if - - compare_str "CHUSER" - if_true - change_user - return - end_if - - compare_str "ANSCAP" - if_true - ansi_capture - return - end_if - - compare_word "LIST" - if_true - chksyspass - if_true - shift_str 4 - call get_arg - printfile_str - end_if - return - end_if - - compare_str "EDIT" - if_true - edit_text_file - return - end_if - - compare_str "LOG" - if_true - system_log - return - end_if - - compare_str "MEM" - if_true - show_mem - return - end_if - - compare_str "YLOG" - if_true - system_ylog - return - end_if - - compare_str "SS" - if_true - system_stats - return - end_if - - compare_word "NS" - if_true - shift_str 2 - compare_word " " - if_true - shift_str 1 - end_if - node_stats - return - end_if - - compare_word "EXEC" - if_true - chksyspass - if_true - shift_str 4 - call get_arg - exec_int %s - end_if - return - end_if - - compare_word "FOSSIL" - if_true - chksyspass - if_true - shift_str 6 - call get_arg - exec %s - end_if - return - end_if - - compare_word "CALL" - if_true - chksyspass - if_true - shift_str 4 - call get_arg - set fname "%jqnet/%s.now" - fopen file O_WRONLY|O_CREAT|O_DENYNONE fname - if_true - fclose file - end_if - end_if - return - end_if - - compare_word "NODE" - if_true - strlwr str - exec_int %!%s - return - end_if - - compare_word "DOWN" - if_true - shift_str 4 - call get_arg - exec_int %!node down %s - return - end_if - - compare_word "RERUN" - if_true - shift_str 5 - call get_arg - exec_int %!node rerun %s - return - end_if - - compare_str "SLOG" - if_true - exec_int %!slog /p - return - end_if - - compare_str "NLOG" - if_true - exec_int %!slog %n /p - return - end_if - - compare_word "NLOG " - if_true - shift_str 5 - exec_int %!slog %n../node%s /p - return - end_if - - compare_word "UEDIT" - if_true - shift_str 5 - compare_word " " - if_true - shift_str 1 - end_if - user_edit - return - end_if - - compare_str "MAIL" - if_true - mail_read_all - return - end_if - - compare_str "BULKMAIL" - if_true - print "\r\nEnter ARS matches to send mail to or [CR] to send " - print "by name/number\r\nARS to match: " - getstrupr 40 - mail_send_bulk - return - end_if - - compare_str "DOS" # DOS/Windows shell - if_true - chksyspass - if_true - exec_int "command.com" - end_if - return - end_if - - compare_str "SHELL" # Unix shell (-i for interactive) - if_true - chksyspass - if_true - compare_ars "UNIX" - if_true - exec_int "%y -i" - else - exec_int "%y" - end_if - end_if - return - end_if - - compare_word "SPY" - if_true - chksyspass - if_true - shift_str 3 - call get_arg - crlf - spy - if_true - print "\1n\r\nSpy session complete.\r\n" - end_if - end_if - return - end_if - - compare_str "DIR" # directory of current lib/dir - if_true - chksyspass - if_true - exec_int command /c dir %f /p - end_if - return - end_if - - compare_word "LOAD" - if_true - shift_str 4 - call get_arg - load_text %s - return - end_if - - compare_word "DIR" # directory of user specified location - if_true - chksyspass - if_true - shift_str 3 - call get_arg - exec_int command /c dir %s /p - end_if - return - end_if - - compare_word "UPLOAD" - if_true - shift_str 7 - file_upload_bulk - return - end_if - - compare_word "ALTUL" - if_true - shift_str 6 - file_set_alt_path - return - end_if - - compare_word "RESORT" - if_true - shift_str 7 - file_resort_directory - return - end_if - - compare_word "OLDUL" - if_true - shift_str 6 - file_find_old_uploads - return - end_if - - compare_word "OLD" - if_true - shift_str 4 - file_find_old - return - end_if - - compare_word "OFFLINE" - if_true - shift_str 8 - file_find_offline - return - end_if - - compare_word "CLOSE" - if_true - shift_str 6 - file_find_open - return - end_if - - compare_word "GET" - if_true - shift_str 3 - compare_word " " - if_true - shift_str 1 - end_if - compare_str "" - if_true - print "\r\nPath and filename: " - getstr 60 - compare_str "" - if_true - return - end_if - end_if - file_get - return - end_if - - compare_word "PUT" - if_true - shift_str 3 - compare_word " " - if_true - shift_str 1 - end_if - compare_str "" - if_true - print "\r\nPath and filename: " - getstr 60 - compare_str "" - if_true - return - end_if - end_if - file_put - return - end_if - end_if - -############################# Exemption Functions ############################# - - -# Quiet Node -compare_ars exempt Q -if_true - compare_str "QUIET" - if_true - compare_ars QUIET - if_true - exec_int %!node status=3 %# - else - exec_int %!node status=4 %# - end_if - return - end_if - - compare_str "ANON" - if_true - toggle_node_misc NODE_ANON - exec_int %!node list %# - return - end_if - end_if - -# Lock Node -compare_ars exempt N -if_true - compare_word "LOCK" - if_true - shift_str 4 - call get_arg - exec_int %!node lock %s - return - end_if - end_if - -# Interrupt Node -compare_ars exempt I -if_true - compare_word "INTR" - if_true - shift_str 4 - call get_arg - exec_int %!node intr %s - return - end_if - end_if - -# Chat -compare_ars exempt C -if_true - compare_str "CHAT" - if_true - page_sysop - return - end_if - end_if - -compare_str "POFF" -if_true - toggle_node_misc NODE_POFF - end_if - -# None of the above (unrecognized) -return - -### Generic routine to ask user for parameter if one wasn't specified ### - -:get_arg - compare_word " " - if_true - shift_str 1 - end_if - compare_str "" - if_true - print "Parameter(s): " - getstr - end_if -return diff --git a/exec/telgate.src b/exec/telgate.src deleted file mode 100644 index 56365fc012..0000000000 --- a/exec/telgate.src +++ /dev/null @@ -1,13 +0,0 @@ -# telgate.src - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -printf "\r\n\1h\1hPress \1yCtrl-]\1w for a control menu anytime.\r\n\r\n" -pause -printf "\1h\1yConnecting to: \1w%s\1n\r\n" str -telnet_gate str 0 -cls diff --git a/exec/textdat.js b/exec/textdat.js deleted file mode 100644 index d3928b6904..0000000000 --- a/exec/textdat.js +++ /dev/null @@ -1,9 +0,0 @@ -load("sbbsdefs.js"); // SS_ABORT - -for(i=1;!(bbs.sys_status&SS_ABORT);i++) { - str = bbs.text(i); - if(str==null) - break; - // console.line_counter=0; /* uncomment to display continuously */ - printf("\1n\1h%d: \1n%s\1n\r\n",i,str); -} \ No newline at end of file diff --git a/exec/tone/battle.ton b/exec/tone/battle.ton deleted file mode 100644 index b100c46906..0000000000 --- a/exec/tone/battle.ton +++ /dev/null @@ -1,32 +0,0 @@ -: Battle Hymn of Republic | -t 2 -s 5 -v Mine \ -f4 133 -v eyes \ -f4 160 -v have \ -f4 100 -v seen \ -f4 160 -v the \ -D4 100 -v glor\ -d4 160 -v y \ -f4 100 -v of \ -A4 160 -v the \ -c5 100 -v com\ -d5 160 -v ing \ -d5 100 -v of \ -d5 160 -v the \ -c5 100 -v lord.\ -A4 200 -v \ No newline at end of file diff --git a/exec/tone/bouree.ton b/exec/tone/bouree.ton deleted file mode 100644 index 7e9ac3b7d7..0000000000 --- a/exec/tone/bouree.ton +++ /dev/null @@ -1,21 +0,0 @@ -: Bouree | -t 2 -b3 80 -c4 80 -d4 160 -g3 80 -F3 80 -g3 160 -g4 160 -F4 160 -e4 80 -F4 80 -d4 160 -a3 80 -b3 80 -c4 160 -F3 80 -e3 80 -F3 160 -d4 160 -b3 160 diff --git a/exec/tone/buffgals.ton b/exec/tone/buffgals.ton deleted file mode 100644 index 179146650f..0000000000 --- a/exec/tone/buffgals.ton +++ /dev/null @@ -1,22 +0,0 @@ -: Buffalo Gals | -s 5 -c3 100 -c3 100 -c3 200 -e3 200 -g3 100 -g3 100 -a3 133 -g3 200 -g3 133 -e3 200 -r 200 -g3 133 -f3 200 -f3 133 -d3 200 -r 200 -a3 133 -g3 200 -g3 133 -e3 200 diff --git a/exec/tone/camptown.ton b/exec/tone/camptown.ton deleted file mode 100644 index 9d0b420597..0000000000 --- a/exec/tone/camptown.ton +++ /dev/null @@ -1,22 +0,0 @@ -: Camptown Races | -s 5 -t 2 -a3 100 -a3 100 -F3 100 -a3 100 -b3 100 -a3 100 -F3 200 -F3 100 -e3 300 -F3 100 -e3 200 -r 15 -a3 100 -a3 100 -F3 100 -a3 100 -b3 100 -a3 100 -F3 200 diff --git a/exec/tone/clown.ton b/exec/tone/clown.ton deleted file mode 100644 index 956ab30aab..0000000000 --- a/exec/tone/clown.ton +++ /dev/null @@ -1,33 +0,0 @@ -t 200 -c5 2 -p -.50 -b4 2 -p -.50 -A4 1 -p -.50 -b4 1 -p -.50 -A4 1 -p -.50 -a4 1 -p -.50 -G4 2 -p -.50 -g4 2 -p -.50 -F4 2 -p -.50 -g4 1 -p -.10 -g4 1 -p -.10 -g4 1 -p -.10 -g4 1 -p -.10 -g4 1 -p -.10 -g4 1 -p -.10 -g4 1 - diff --git a/exec/tone/ent.ton b/exec/tone/ent.ton deleted file mode 100644 index da3eea3f71..0000000000 --- a/exec/tone/ent.ton +++ /dev/null @@ -1,299 +0,0 @@ -: Now we're going to set-up and play a song - -Visual The Entertainer - -pitch 323.50 All commands can be abreviated with just one character -t 200 -s 10 -:r 10 Rest before we begin - -:intro - -o 6 - -d 1 -e 1 -c 1 -o -1 -a 2 -b 1 -g 1 -r 1 - -d 1 -e 1 -c 1 -o -1 -a 2 -b 1 -g 1 -r 1 - -d 1 -e 1 -c 1 -o -1 -a 2 -b 1 -a 1 -G 1 -g 2 -r 2 - -g5 1 -r 1 - -: begin -o 5 - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 - -c 1 -d 1 -D 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 - -g3 1 -r 1 -g3 1 -r 1 - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 -r 1 - -a4 1 -g4 1 -F4 1 -a4 1 -c5 1 -e5 2 -d5 1 -c5 1 -b4 1 -d5 1 - -r 1 -g3 1 -r 1 -a3 1 -r 1 - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 - -c 1 -d 1 -D 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 - -g3 1 -r 1 -g3 1 -r 1 - -c 1 -d 1 -e 1 -c 1 -d 1 -e 2 - -c 1 -d 1 -c 1 -e 1 -c 1 -d 1 -e 2 - -c 1 -d 1 -c 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 -g3 1 -r 1 -a3 1 -r 1 - -: repeat - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 - -c 1 -d 1 -D 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 - -g3 1 -r 1 -g3 1 -r 1 - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 -r 1 - -a4 1 -g4 1 -F4 1 -a4 1 -c5 1 -e5 2 -d5 1 -c5 1 -b4 1 -d5 1 - -r 1 -g3 1 -r 1 -a3 1 -r 1 - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 - -c 1 -d 1 -D 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 - -g3 1 -r 1 -g3 1 -r 1 - -c 1 -d 1 -e 1 -c 1 -d 1 -e 2 - -c 1 -d 1 -c 1 -e 1 -c 1 -d 1 -e 2 - -c 1 -d 1 -c 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 -g3 1 -r 1 -c3 1 - diff --git a/exec/tone/example.ton b/exec/tone/example.ton deleted file mode 100644 index e3ec4579fd..0000000000 --- a/exec/tone/example.ton +++ /dev/null @@ -1,539 +0,0 @@ -: Example TONE (.TON) file - All lines starting with non-alphanumeric characters are ignored. - -: We're going to set the timer count value (in milliseconds). The first word - of the line must begin with a 'T' (not case sensitive). Following the 'T' - word (or letter) must be some amount of white space (tabs or space) then - a number to use for the timer count value. The default timer count value - is 1 millisecond. - -Time 200 - -: The colons you see at the beginning of the comment paragraphs are not - necessary. They are only used to visually separate comments from tone - command lines. A space, tab, or any other non-alphanumeric character would - work just as well. - -: Now we're going to display some text on the monitor using the 'V' (visual) - command. The first word of the line must begin with a 'V' (not case - sensitive). Some amount of white space must follow the 'V' word (or letter) - then text to be displayed to the user. If you do not wish a new line to be - automatically displayed, append a backslash (\) to the end of the line. - -Visual This is the beginning of our example TONE file. -Visual This text will be displayed on the same line as \ -Visual this text. - -: Now we're going to play some tones. Tones may be specified by note letter - (and optional octave number) or exact frequency (in Hz). We'll begin with - a natural 'a' (440Hz) for 1 second (1000 milliseconds). Tone lines have two - parameters, the note (or exact frequency) and duration (in time counts). - Since our time counter value is now 200, we will need a time count of 5 to - produce a 1 second duration (5 counts multiplied by 200 milliseconds equals - 1 second.) - -a 5 - -: The note is still playing right now and will continue to play until we make - another tone, give a rest command, or give a quit command. - -: Notice that we used a lower case 'a'. Note letters ARE case sensitive. Lower - case notes are naturals and upper case notes are sharps. - -: Now we're going to specify the same note by specifying the exact frequency - (in HZ) of 440, for the same duration. - -440 5 - -: There will be no audible change caused by the above command because we were - already hearing the same frequency. What you will hear is a 2 second 'a', - unaware that we actually played two 1 second 'a's. - -: To stop the note from sounding, we are now going to give a rest command. - Rest commands can be specified with a word starting with the letter 'R' - (not case sensitive) or by specifying a frequency of 0. Some amount of - white space must follow, then a duration (in time counts). The following - rest command is specifying 1 second of silence. - -Rest 5 - -: To produce an automatic sound-off or pause between notes, we must specify - a stacato duration (in milliseconds). This helps the listener to distinguish - between notes played of the same frequency. If you do not specify a stacato - duration, the result is legato (smooth transition between notes). - -: The stacato command must begin with the 'S' character (not case sensitive) - followed by white space then the duration (in milliseconds). The default - duration is 0 (disabled). - -Stacato 10 - -: To play notes from octaves other than the default octave (4), you can either - change the current default octave (with the Octave command) or specify the - octave with the note. To play a low C for 1 second, we will use the - following command: - -c1 5 - -: When we don't specify the octave number, the default octave is used. To - change the default octave number, we can use the following command: - -Octave 3 - -Visual Now we will play a C major scale (octave 3): - -c 2 Comments can follow any command (except Visual) -d 2 -e 2 -f 2 -g 2 -a 2 -b 2 - -: To adjust the current default octave, we can use the plus (+) and minus - (-) symbols: - -Octave +1 - -Visual Another C major scale (now in octave 4). - -c 2 -d 2 -e 2 -f 2 -g 2 -a 2 -b 2 - -Visual Rest a little - -Rest 5 - -: When specifying notes, the sounded frequency is based on a default pitch for - middle C. The default starts at 523.50Hz but can be adjusted with the Pitch - command. This is useful for created de-tuning or bend effects. The Pitch - command can be used to specify a default pitch or adjust the current default - pitch up (+) or down (-). - -Visual Now for a pitch variation example. - -: Lower timer count value and disable stacto for a smooth transition between - pitches - -Time 40 -Stacato 0 - -: Starting at a3 and ascend gradually. - -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 Kind of repetitive, huh? -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 -a3 1 -p +.10 - -: Now descend quickly - -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 -a3 1 -p -1.0 - -: Now we're going to set-up and play a song - -Visual The Entertainer - -pitch 323.50 All commands can be abreviated with just one character -t 200 -s 10 -r 10 Rest before we begin - -:intro - -o 6 - -d 1 -e 1 -c 1 -o -1 -a 2 -b 1 -g 1 -r 1 - -d 1 -e 1 -c 1 -o -1 -a 2 -b 1 -g 1 -r 1 - -d 1 -e 1 -c 1 -o -1 -a 2 -b 1 -a 1 -G 1 -g 2 -r 2 - -g5 1 -r 1 - -: begin -o 5 - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 - -c 1 -d 1 -D 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 - -g3 1 -r 1 -g3 1 -r 1 - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 -r 1 - -a4 1 -g4 1 -F4 1 -a4 1 -c5 1 -e5 2 -d5 1 -c5 1 -b4 1 -d5 1 - -r 1 -g3 1 -r 1 -a3 1 -r 1 - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 - -c 1 -d 1 -D 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 - -g3 1 -r 1 -g3 1 -r 1 - -c 1 -d 1 -e 1 -c 1 -d 1 -e 2 - -c 1 -d 1 -c 1 -e 1 -c 1 -d 1 -e 2 - -c 1 -d 1 -c 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 -g3 1 -r 1 -a3 1 -r 1 - -: repeat - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 - -c 1 -d 1 -D 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 - -g3 1 -r 1 -g3 1 -r 1 - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 -r 1 - -a4 1 -g4 1 -F4 1 -a4 1 -c5 1 -e5 2 -d5 1 -c5 1 -b4 1 -d5 1 - -r 1 -g3 1 -r 1 -a3 1 -r 1 - -d4 1 -D4 1 -e4 1 -c5 2 -e4 1 -c5 2 -e4 1 -c5 3 - -a3 1 -r 1 -g3 1 - -c 1 -d 1 -D 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 - -g3 1 -r 1 -g3 1 -r 1 - -c 1 -d 1 -e 1 -c 1 -d 1 -e 2 - -c 1 -d 1 -c 1 -e 1 -c 1 -d 1 -e 2 - -c 1 -d 1 -c 1 -e 1 -c 1 -d 1 -e 2 -b4 1 -d 2 -c 1 - -r 1 -g3 1 -r 1 -c3 1 - - diff --git a/exec/tone/funeral.ton b/exec/tone/funeral.ton deleted file mode 100644 index 4fc170cd21..0000000000 --- a/exec/tone/funeral.ton +++ /dev/null @@ -1,14 +0,0 @@ -: Funeral March-Marionette | -t 2 -s 10 -a2 93 -d3 93 -r 70 -d3 93 -d3 93 -C3 93 -b2 93 -C3 93 -r 70 -d3 93 -e3 93 diff --git a/exec/tone/furelise.ton b/exec/tone/furelise.ton deleted file mode 100644 index 8eeda90f2c..0000000000 --- a/exec/tone/furelise.ton +++ /dev/null @@ -1,20 +0,0 @@ -: Fur Elise | -t 2 -s 5 -e4 133 -D4 133 -e4 133 -b3 133 -d4 133 -c4 133 -a3 200 -r 100 -c3 133 -e3 133 -a3 133 -b3 200 -r 100 -e3 133 -G2 133 -b3 133 -c4 200 diff --git a/exec/tone/goodnite.ton b/exec/tone/goodnite.ton deleted file mode 100644 index e42405d592..0000000000 --- a/exec/tone/goodnite.ton +++ /dev/null @@ -1,22 +0,0 @@ -: Good-night, Ladies | -s 5 -e4 420 -c4 420 -g3 140 -c4 840 -r 210 -e4 420 -c4 420 -d4 140 -d4 840 -r 210 -e4 420 -c4 420 -f4 140 -f4 840 -f4 140 -e4 280 -c4 140 -d4 280 -b3 140 -c4 840 diff --git a/exec/tone/hatdance.ton b/exec/tone/hatdance.ton deleted file mode 100644 index 9ed6d6db7a..0000000000 --- a/exec/tone/hatdance.ton +++ /dev/null @@ -1,17 +0,0 @@ -: Mexican Hat Dance | -d3 160 -F3 160 -r 120 -d3 160 -F3 160 -r 120 -d3 160 -F3 320 -r 240 -d3 160 -F3 160 -G3 160 -F3 160 -f3 320 -F3 160 -G3 240 diff --git a/exec/tone/humor.ton b/exec/tone/humor.ton deleted file mode 100644 index e2f612ddc6..0000000000 --- a/exec/tone/humor.ton +++ /dev/null @@ -1,18 +0,0 @@ -: Humoresque | -s 5 -g2 210 -a2 140 -g2 210 -a2 140 -b2 210 -d3 140 -e3 210 -d3 140 -g3 210 -F3 140 -a3 210 -g3 140 -F3 210 -a3 140 -g3 210 -e3 210 diff --git a/exec/tone/jeanie.ton b/exec/tone/jeanie.ton deleted file mode 100644 index 8cea3248c5..0000000000 --- a/exec/tone/jeanie.ton +++ /dev/null @@ -1,14 +0,0 @@ -: Jeanie with Light Brown | -t 2 -s 5 -d4 200 -c4 300 -a3 100 -A3 100 -a3 100 -g3 100 -f3 100 -a3 200 -c3 100 -d3 100 -f3 300 diff --git a/exec/tone/la_cuca.ton b/exec/tone/la_cuca.ton deleted file mode 100644 index 954127d5ed..0000000000 --- a/exec/tone/la_cuca.ton +++ /dev/null @@ -1,21 +0,0 @@ -: La Cucaracha | -s 10 -d3 133 -d3 133 -d3 133 -g3 400 -b3 200 -r 100 -d3 133 -d3 133 -d3 133 -g3 400 -b3 200 -r 200 -g3 133 -g3 133 -F3 133 -F3 133 -e3 133 -e3 133 -d3 400 diff --git a/exec/tone/maplerag.ton b/exec/tone/maplerag.ton deleted file mode 100644 index 9db8f29dd3..0000000000 --- a/exec/tone/maplerag.ton +++ /dev/null @@ -1,24 +0,0 @@ -: Maple Leaf Rag | -t 2 -s 2 -b3 80 -d4 80 -g3 80 -b3 80 -d4 160 -F3 80 -d4 80 -F3 80 -a3 80 -d4 240 -r 80 -b3 80 -d4 80 -g3 80 -b3 80 -d4 160 -F3 80 -d4 80 -F3 80 -a3 80 -d4 240 diff --git a/exec/tone/march.ton b/exec/tone/march.ton deleted file mode 100644 index f22e3cb844..0000000000 --- a/exec/tone/march.ton +++ /dev/null @@ -1,21 +0,0 @@ -: March - Nutcracker Suite | -s 5 -t 2 -d4 200 -d4 70 -d4 70 -d4 70 -e4 200 -e4 200 -F4 200 -d4 200 -e4 400 -d4 200 -d4 70 -d4 70 -d4 70 -e4 200 -e4 200 -F4 200 -d4 200 -e4 266 diff --git a/exec/tone/mary.ton b/exec/tone/mary.ton deleted file mode 100644 index e36108d088..0000000000 --- a/exec/tone/mary.ton +++ /dev/null @@ -1,57 +0,0 @@ -: Mary had a little lamb -s 50 -v Mar\ -e4 500 -v y \ -d4 100 -v had \ -c4 300 -v a \ -d4 300 -v lit\ -e4 300 -v tle \ -e4 300 -v lamb, \ -e4 800 -v lit\ -d4 300 -v tle \ -d4 300 -v lamb, \ -d4 800 -v lit\ -e4 300 -v tle \ -g4 300 -v lamb.\ -g4 800 -v - -v Mar\ -e4 500 -v y \ -d4 100 -v had \ -c4 300 -v a \ -d4 300 -v lit\ -e4 300 -v tle \ -e4 300 -v lamb, \ -e4 300 -v her \ -e4 300 -v fleece \ -d4 300 -v was \ -d4 300 -v white \ -e4 300 -v as \ -d4 300 -v snow.\ -c4 1000 -v diff --git a/exec/tone/mountai.ton b/exec/tone/mountai.ton deleted file mode 100644 index e5e5a9a178..0000000000 --- a/exec/tone/mountai.ton +++ /dev/null @@ -1,14 +0,0 @@ -: Comin' round the mountain| -t 2 -s 5 -d3 106 -e3 106 -g3 106 -g3 106 -g3 106 -g3 106 -e3 106 -d3 106 -b2 106 -d3 106 -g3 320 diff --git a/exec/tone/sakura.ton b/exec/tone/sakura.ton deleted file mode 100644 index f785f956f4..0000000000 --- a/exec/tone/sakura.ton +++ /dev/null @@ -1,17 +0,0 @@ -: Sakura | -s 10 -t 2 -a2 140 -a2 140 -b2 280 -a2 140 -a2 140 -b2 280 -a2 140 -b2 140 -c3 140 -b2 140 -a2 140 -b2 70 -a2 70 -f2 280 diff --git a/exec/tone/sleeping.ton b/exec/tone/sleeping.ton deleted file mode 100644 index fcd520d2fe..0000000000 --- a/exec/tone/sleeping.ton +++ /dev/null @@ -1,42 +0,0 @@ -: Are You Sleeping? | -t 2 -s 1 -g3 200 -a3 200 -b3 200 -g3 200 -g3 200 -a3 200 -b3 200 -g3 200 -b3 200 -c4 200 -d4 390 -r 10 -b3 200 -c4 200 -d4 390 -r 10 -d4 100 -e4 100 -d4 100 -c4 100 -b3 200 -g3 190 -r 10 - -d4 100 -e4 100 -d4 100 -c4 100 -b3 200 -g3 190 -r 10 - -g3 200 -d3 200 -g3 400 - -g3 200 -d3 200 -g3 400 diff --git a/exec/tone/susanna.ton b/exec/tone/susanna.ton deleted file mode 100644 index 526756a0e4..0000000000 --- a/exec/tone/susanna.ton +++ /dev/null @@ -1,18 +0,0 @@ -: Oh! Susanna | -t 2 -s 5 -g3 100 -a3 100 -b3 133 -d4 133 -d4 133 -e4 133 -d4 133 -b3 133 -g3 160 -a3 100 -b3 133 -b3 133 -a3 133 -g3 133 -a3 200 diff --git a/exec/tone/swinglow.ton b/exec/tone/swinglow.ton deleted file mode 100644 index 733377797f..0000000000 --- a/exec/tone/swinglow.ton +++ /dev/null @@ -1,17 +0,0 @@ -: Swing low, Sweet Chariot | -t 3 -s 10 -a2 140 -f2 280 -a2 140 -f2 186 -f2 93 -d2 93 -c2 186 -f2 93 -f2 93 -f2 93 -f2 93 -a2 93 -c3 93 -c3 140 diff --git a/exec/tone/symph_40.ton b/exec/tone/symph_40.ton deleted file mode 100644 index 361ae2c464..0000000000 --- a/exec/tone/symph_40.ton +++ /dev/null @@ -1,23 +0,0 @@ -: Symphony #40 | -t 2 -s 10 -D3 110 -d3 110 -d3 132 -D3 110 -d3 110 -d3 132 -D3 110 -d3 110 -d3 132 -A3 110 -r 82 -A3 110 -a3 110 -g3 132 -g3 110 -f3 110 -D3 132 -D3 110 -d3 110 -c3 132 diff --git a/exec/tone/tdc.ton b/exec/tone/tdc.ton deleted file mode 100644 index 68979d4dc3..0000000000 --- a/exec/tone/tdc.ton +++ /dev/null @@ -1,190 +0,0 @@ -: Twelve days of Christmas - -Stacato 5 -Timing 80 -Rest 8 -v On \ -c4 2 -v the \ -c4 2 -v twelfth \ -c4 4 -v day \ -f4 2 -v of \ -f4 2 -v Christ\ -f4 4 -v mas \ -e4 2 -v my \ -f4 2 -v true \ -g4 2 -v love \ -a4 2 -v gave \ -A4 2 -v to \ -g4 2 -v me\ -a4 4 -Rest 4 -v - -v Twelve \ -c5 2 -v De\ -c5 2 -v scrip\ -g4 2 -v tor \ -a4 2 -v Type\ -A4 2 -v -Codes,\ -g4 4 -v - -v E\ -g4 2 -v lev\ -c5 2 -v en \ -c5 2 -v Point\ -g4 2 -v ers \ -a4 2 -v Point\ -A4 2 -v ing,\ -g4 2 -v - -v Ten \ -c5 4 -v Pipe\ -g4 2 -v lines \ -a4 2 -v Pip\ -A4 2 -v ing,\ -g4 2 -v - -v Nine \ -c5 4 -v Page \ -g4 2 -v Frames \ -a4 2 -v Pag\ -A4 2 -v ing,\ -g4 2 -v - -v Eight \ -c5 4 -v Bits \ -g4 2 -v A\ -a4 2 -v 'Shift\ -A4 2 -v ing,\ -g4 2 -v - -v Sev\ -c5 2 -v en \ -c5 2 -v Swans \ -g4 2 -v A\ -a4 2 -v 'Swim\ -A4 2 -v ming,\ -g4 2 -v - -v Six \ -c5 4 -v Sig\ -g4 2 -v nals \ -a4 2 -v Pend\ -A4 2 -v ing,\ -g4 2 -v - -v FIVE \ -c5 8 -v TRAP \ -d5 4 -b4 4 -v GATES!\ -c5 8 -a3 2 -g3 2 -a3 2 -A3 2 -v - -v Four \ -c5 2 -A4 2 -v Far \ -a4 2 -g4 2 -v Calls,\ -f4 4 -v - -v Three \ -A4 4 -v Short \ -d4 4 -v Jumps,\ -f4 4 -v - -v Two \ -g4 2 -f4 2 -v Tur\ -e4 2 -v tle \ -d4 2 -v Doves,\ -c4 4 -v - -v And \ -a4 2 -v a \ -A4 2 -v Task State \ -c5 4 -v Seg\ -d5 2 -v ment \ -A4 2 -v with \ -a4 2 -v a \ -f4 2 -v Bit \ -g4 4 -v Map\ -f4 8 -Rest 4 -v .\ -f2 3 -v diff --git a/exec/tone/trapeze.ton b/exec/tone/trapeze.ton deleted file mode 100644 index 3312e67891..0000000000 --- a/exec/tone/trapeze.ton +++ /dev/null @@ -1,21 +0,0 @@ -: Man on Flying Trapeze | -s 5 -f3 220 -f3 220 -A3 220 -c4 220 -d4 220 -D4 220 -d4 220 -d4 220 -c4 220 -g3 220 -c4 440 -e3 220 -f3 220 -a3 220 -A3 220 -c4 220 -d4 220 -c4 220 -A3 440 diff --git a/exec/tone/weasel.ton b/exec/tone/weasel.ton deleted file mode 100644 index f5215e9bc0..0000000000 --- a/exec/tone/weasel.ton +++ /dev/null @@ -1,17 +0,0 @@ -: Pop! Goes the Weasel | -s 1 -g2 200 -g2 133 -a2 200 -a2 133 -b2 133 -d3 100 -b2 133 -g2 200 -d2 133 -g2 200 -g2 133 -a2 200 -a2 133 -b2 266 -g2 200 diff --git a/exec/tone/yankee.ton b/exec/tone/yankee.ton deleted file mode 100644 index 2ba754fc80..0000000000 --- a/exec/tone/yankee.ton +++ /dev/null @@ -1,15 +0,0 @@ -: Yankee Doodle | -c3 220 -c3 220 -d3 220 -e3 220 -c3 220 -e3 220 -d3 220 -g2 220 -c3 220 -c3 220 -d3 220 -e3 220 -c3 440 -b2 220 diff --git a/exec/type.src b/exec/type.src deleted file mode 100644 index 7122da9949..0000000000 --- a/exec/type.src +++ /dev/null @@ -1,7 +0,0 @@ -# type.src - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -printfile_str diff --git a/exec/typehtml.src b/exec/typehtml.src deleted file mode 100644 index 8455e05d49..0000000000 --- a/exec/typehtml.src +++ /dev/null @@ -1,469 +0,0 @@ -# typehtml.c - -# Synchronet Baja Modules to Display HTML files to TTY/ANSI users - -# $Id$ - -# Created October 09, 2000 by Rob Swindell - -# Requires Baja v2.20+ - -# @format.tab-size 8, @format.use-tabs true - -!include file_io.inc -!include sbbsdefs.inc - -# Color Attributes for HTML type styles -!define NORMAL "\1N\1H" -!define HEADING1 "\1H\1Y" -!define HEADING2 "\1H\1C" -!define HEADING3 "\1H\1M" -!define HEADING4 "\1H\1G" -!define HEADING5 "\1H\1B" -!define HEADING6 "\1H\1R" -!define BOLD "\1H\1C\x014" -!define ITALIC "\1H\1G\x012" -!define UNDERLINE "\1H\1W\x016" -!define STRIKE_THROUGH "\1N\1K\x017" -!define LIST_ITEM " \1H\1Wo \1G" - -!define RIGHT_MARGIN 79 - -str filename # HTML filename -str tmpfname # Temporary filename -str href -int i -int ch -int len -int t -int start -int htmlfile -int tmpfile -int hlevel # header level -int col # current cursor column -int last_line_len # length of last line printed -int lines # total lines printed -int printing # printing on -int newline # new line read from html file - -copy filename str - -compare_str "" -if_true - print "usage: typehtml <filename>\r\n" - return - end_if - -# Open HTML input file -fopen htmlfile O_RDONLY|O_DENYNONE filename -if_false - printf "!Error %d opening %s\r\n" _ERRNO filename - return - end_if - -# Open Ctrl-A output file -set tmpfname "%gHTML.ASC" -fopen tmpfile O_WRONLY|O_CREAT|O_TRUNC tmpfname -if_false - printf "!Error %d creating %s\r\n" _ERRNO tmpfname - return - end_if - -set col 0 # reset column counter -set last_line_len 0 # reset last line length -set lines 0 # reset line counter -set printing 1 # printing by default - -print "Converting HTML" -time start - -:next_line - print "." - - # Read a line - fread_line htmlfile str - if_false # end of file - fclose htmlfile - fclose tmpfile - time t - sub t start -# printf "%d seconds" t -# pause - cls - printfile tmpfname P_NOATCODES - return - end_if - - set newline 1 - - # truncate whitespace off end - truncsp str - - # truncate whitespace off front - call skip_whitespace - - :next_char - compare_first_char str 0 - if_true - goto next_line - end_if - - compare_substr str "<" - if_false - compare col 0 - if_true - call skip_whitespace - end_if - set i RIGHT_MARGIN - sub i col - compare i 0 - if_equal - call crlf - set i RIGHT_MARGIN - end_if - strlen len str - compare i len - if_greater - copy i len - end_if - fprintf tmpfile "%.*s" i str - shift_str str i - add col i - compare col RIGHT_MARGIN - if_greater_or_equal - call crlf - end_if - goto next_char - end_if - - compare_first_char str '<' - if_false - compare printing 1 - if_true - # handle word wrap - compare newline 1 - if_equal - compare col 0 - if_not_equal - fprintf tmpfile " " - add col 1 - end_if - end_if - set newline 0 - - # don't start lines with white-space - compare col 0 - if_true - compare_first_char str ' ' - end_if - if_false - fwrite tmpfile str 1 - add col 1 - compare col RIGHT_MARGIN - if_greater_or_equal - call crlf - end_if - end_if - end_if - shift_str 1 - goto next_char - end_if - - shift_str 1 # skip < - - # Title - compare_word "TITLE>" - if_true - set printing 0 - call find_close_bracket - goto next_char - end_if - compare_word "/TITLE>" - if_true - set printing 1 - call find_close_bracket - goto next_char - end_if - - - # List item - compare_word "LI>" - if_false - compare_word "LI " - end_if - if_true - compare col 0 - if_not_equal - call crlf - end_if - fprintf tmpfile LIST_ITEM - set col 6 - call find_close_bracket - goto next_char - end_if - - # Strike-through - compare_word "S>" - if_false - compare_word "STRIKE>" - end_if - if_true - fprintf tmpfile STRIKE_THROUGH - call find_close_bracket - goto next_char - end_if - - # Bold - compare_word "B>" - if_false - compare_word "STRONG>" - end_if - if_true - fprintf tmpfile BOLD - call find_close_bracket - goto next_char - end_if - - # Italics - compare_word "I>" - if_false - compare_word "EM>" - end_if - if_true - fprintf tmpfile ITALIC - call find_close_bracket - goto next_char - end_if - - # Underline - compare_word "U>" - if_false - compare_word "U>" - end_if - if_true - fprintf tmpfile UNDERLINE - call find_close_bracket - goto next_char - end_if - - - # Attribute off - compare_word "/S>" - if_false - compare_word "/STRIKE>" - end_if - if_false - compare_word "/B>" - end_if - if_false - compare_word "/STRONG>" - end_if - if_false - compare_word "/I>" - end_if - if_false - compare_word "/EM>" - end_if - if_false - compare_word "/U>" - end_if - if_true - fprintf tmpfile NORMAL - call find_close_bracket - goto next_char - end_if - - # Table cell - compare_word "TD>" - if_false - compare_word "TD " - end_if - if_true - # visually separate cells - compare col 0 - if_greater - fprintf tmpfile " " - add col 1 - end_if - call find_close_bracket - goto next_char - end_if - - - # Dumb CR/LF block - compare_word "BR>" - if_false - compare_word "BR " - end_if - if_false - compare_word "P>" - end_if - if_false - compare_word "P " - end_if - if_false - compare_word "TR>" - end_if - if_false - compare_word "TR " - end_if - if_true - call crlf - call find_close_bracket - goto next_char - end_if - - - # Intelligent CR/LF block (force single blank line) - compare_word "/UL>" - if_false - compare_word "/OL>" - end_if - if_false - compare_word "/DIR>" - end_if - if_false - compare_word "/MENU>" - end_if - if_true - fprintf tmpfile NORMAL - end_if - if_false - compare_word "H" - if_true - shift_str 1 - copy hlevel str - compare hlevel 0 - if_greater - switch hlevel - case 1 - fprintf tmpfile HEADING1 - end_case - case 2 - fprintf tmpfile HEADING2 - end_case - case 3 - fprintf tmpfile HEADING3 - end_case - case 4 - fprintf tmpfile HEADING4 - end_case - case 5 - fprintf tmpfile HEADING5 - end_case - default - fprintf tmpfile HEADING6 - end_case - end_switch - setlogic TRUE - else - setlogic FALSE - end_if - end_if - end_if - if_false - compare_word "/H" - if_true - shift_str 2 - copy hlevel str - compare hlevel 0 - if_greater - fprintf tmpfile NORMAL - setlogic TRUE - else - setlogic FALSE - end_if - end_if - end_if - if_true - compare lines 0 - if_equal - compare col 0 - end_if - if_greater - compare last_line_len 0 - if_equal - compare col 0 - end_if - if_not_equal - call crlf - call crlf - end_if - end_if - call find_close_bracket - goto next_char - end_if - - # Hyper-link - compare_word "A HREF=" - if_true - shift_str 7 - set href "" - :copy_href - compare_first_char str '>' - if_false - copy_first_char ch str - strcat href ch - shift_str 1 - goto copy_href - end_if - end_if - - # Show hyper-link - compare_word "/A>" - if_true - compare href "" - if_false - strlen i href - add i 3 - add col i - compare col RIGHT_MARGIN - if_equal_or_greater - call crlf - sub i 1 - copy col i - else - fprintf tmpfile " " - end_if - fprintf tmpfile "<%s>" href - end_if - set href "" - end_if - - call find_close_bracket - goto next_char - -return - -# Carriage-return/Line-feed with column reset -:crlf - copy last_line_len col - fprintf tmpfile "\r\n" - set col 0 - add lines 1 - return - -# Shift str past first close bracket -:find_close_bracket - compare_first_char str 0 - if_true - return - end_if - - compare_first_char str '>' - shift_str 1 - if_false - goto find_close_bracket - end_if - return - -:skip_whitespace - compare_first_char str ' ' - if_false - compare_first_char str '\t' - end_if - if_true - shift_str 1 - goto skip_whitespace - end_if - return diff --git a/exec/unixgate.src b/exec/unixgate.src deleted file mode 100644 index cc7df5d8cc..0000000000 --- a/exec/unixgate.src +++ /dev/null @@ -1,15 +0,0 @@ -# unixgate.src - -# Telnet Gateway for Unix servers - Requires v3.00c - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -printf "\r\n\1h\1hPress \1yCtrl-]\1w for a control menu anytime.\r\n\r\n" -pause -printf "\1h\1yConnecting to: \1w%s\1n\r\n" str -telnet_gate str TG_PASSTHRU -cls diff --git a/exec/userdefs.inc b/exec/userdefs.inc deleted file mode 100644 index d90c38993d..0000000000 --- a/exec/userdefs.inc +++ /dev/null @@ -1,160 +0,0 @@ -# userdefs.inc - -# Baja include file defining various Synchronet USER related constants - -# $id$ - -# @format.tab-size 8, @format.use-tabs true - -!define LEN_ALIAS 25 # User alias -!define LEN_NAME 25 # User name -!define LEN_HANDLE 8 # User chat handle -!define LEN_NOTE 30 # User note -!define LEN_COMP 30 # User computer description -!define LEN_COMMENT 60 # User comment -!define LEN_NETMAIL 60 # NetMail forwarding address -!define LEN_PASS 8 # User password -!define LEN_PHONE 12 # User phone number -!define LEN_BIRTH 8 # Birthday in MM/DD/YY format -!define LEN_ADDRESS 30 # User address -!define LEN_LOCATION 30 # Location (City, State -!define LEN_ZIPCODE 10 # Zip/Postal code -!define LEN_MODEM 8 # User modem type description - -#************************************************************************** -# This is a list of offsets into the USER.DAT file for different variables -# that are stored (for each user -#************************************************************************** -!define U_ALIAS 0 # Offset to alias -!define U_NAME U_ALIAS+LEN_ALIAS # Offset to name -!define U_HANDLE U_NAME+LEN_NAME -!define U_NOTE U_HANDLE+LEN_HANDLE+2 -!define U_COMP U_NOTE+LEN_NOTE -!define U_COMMENT U_COMP+LEN_COMP+2 - -!define U_NETMAIL U_COMMENT+LEN_COMMENT+2 - -!define U_ADDRESS U_NETMAIL+LEN_NETMAIL+2 -!define U_LOCATION U_ADDRESS+LEN_ADDRESS -!define U_ZIPCODE U_LOCATION+LEN_LOCATION - -!define U_PASS U_ZIPCODE+LEN_ZIPCODE+2 -!define U_PHONE U_PASS+8 # Offset to phone-number -!define U_BIRTH U_PHONE+12 # Offset to users birthday -!define U_MODEM U_BIRTH+8 -!define U_LASTON U_MODEM+8 -!define U_FIRSTON U_LASTON+8 -!define U_EXPIRE U_FIRSTON+8 -!define U_PWMOD U_EXPIRE+8 - -!define U_LOGONS U_PWMOD+8+2 -!define U_LTODAY U_LOGONS+5 -!define U_TIMEON U_LTODAY+5 -!define U_TEXTRA U_TIMEON+5 -!define U_TTODAY U_TEXTRA+5 -!define U_TLAST U_TTODAY+5 -!define U_POSTS U_TLAST+5 -!define U_EMAILS U_POSTS+5 -!define U_FBACKS U_EMAILS+5 -!define U_ETODAY U_FBACKS+5 -!define U_PTODAY U_ETODAY+5 - -!define U_ULB U_PTODAY+5+2 -!define U_ULS U_ULB+10 -!define U_DLB U_ULS+5 -!define U_DLS U_DLB+10 -!define U_CDT U_DLS+5 -!define U_MIN U_CDT+10 - -!define U_LEVEL U_MIN+10+2 # Offset to Security Level -!define U_FLAGS1 U_LEVEL+2 # Offset to Flags -!define U_TL U_FLAGS1+8 # Offset to unused field -!define U_FLAGS2 U_TL+2 -!define U_EXEMPT U_FLAGS2+8 -!define U_REST U_EXEMPT+8 -!define U_ROWS U_REST+8+2 # Number of Rows on user's monitor -!define U_SEX U_ROWS+2 # Sex, Del, ANSI, color etc. -!define U_MISC U_SEX+1 # Miscellaneous flags in 8byte hex -!define U_OLDXEDIT U_MISC+8 # External editor Version 1 method -!define U_LEECH U_OLDXEDIT+2 # two hex digits - leech attempt count -!define U_CURSUB U_LEECH+2 # Current sub internal code -!define U_CURDIR U_CURSUB+8 # Current dir internal code -!define U_CMDSET U_CURDIR+8 # unused -!define U_MAIN_CMD U_CMDSET+2+2 # unused -!define U_XFER_CMD U_MAIN_CMD+40 # unused -!define U_SCAN_CMD U_XFER_CMD+40+2 # unused -!define U_MAIL_CMD U_SCAN_CMD+40 # unused -!define U_FREECDT U_MAIL_CMD+40+2 -!define U_FLAGS3 U_FREECDT+10 # Flag set #3 -!define U_FLAGS4 U_FLAGS3+8 # Flag set #4 -!define U_XEDIT U_FLAGS4+8 # External editor code -!define U_SHELL U_XEDIT+8 # Command shell code -!define U_QWK U_SHELL+8 # QWK settings -!define U_TMPEXT U_QWK+8 # QWK extension -!define U_CHAT U_TMPEXT+3 # Chat settings -!define U_NS_TIME U_CHAT+8 # New-file scan date/time -!define U_PROT U_NS_TIME+8 # Default transfer protocol -!define U_UNUSED U_PROT+1 -!define U_LEN U_UNUSED+28+2 - - -!define UM_DELETED .0 # Bit values for user.misc -!define UM_ANSI .1 # Supports ANSI terminal emulation -!define UM_COLOR .2 # Send color codes -!define UM_RIP .3 # Supports RIP terminal emulation -!define UM_UPAUSE .4 # Pause on every screen full -!define UM_SPIN .5 # Spinning cursor - Same as K_SPIN -!define UM_INACTIVE .6 # Inactive user slot -!define UM_EXPERT .7 # Expert menu mode -!define UM_ANFSCAN .8 # Auto New file scan -!define UM_CLRSCRN .9 # Clear screen before each message -!define UM_QUIET .10 # Quiet mode upon logon -!define UM_BATCHFLAG .11 # File list allow batch dl flags -!define UM_NETMAIL .12 # Forward e-mail to fidonet addr -!define UM_CURSUB .13 # Remember current sub-board/dir -!define UM_ASK_NSCAN .14 # Ask for newscanning upon logon -!define UM_NO_EXASCII .15 # Don't send extended ASCII -!define UM_ASK_SSCAN .16 # Ask for messages to you at logon -!define UM_AUTOTERM .17 # Autodetect terminal type -!define UM_COLDKEYS .18 # No hot-keys -!define UM_EXTDESC .19 # Extended file descriptions -!define UM_AUTOHANG .20 # Auto-hang-up after transfer -!define UM_WIP .21 # Supports WIP terminal emulation - # Bits in user.qwk -!define QWK_FILES .0 # Include new files list -!define QWK_EMAIL .1 # Include unread e-mail -!define QWK_ALLMAIL .2 # Include ALL e-mail -!define QWK_DELMAIL .3 # Delete e-mail after download -!define QWK_BYSELF .4 # Include messages from self -!define QWK_UNUSED .5 # Currently unused -!define QWK_EXPCTLA .6 # Expand ctrl-a codes to ascii -!define QWK_RETCTLA .7 # Retain ctrl-a codes -!define QWK_ATTACH .8 # Include file attachments -!define QWK_NOINDEX .9 # Do not create index files in QWK -!define QWK_TZ .10 # Include "@TZ" time zone in msgs -!define QWK_VIA .11 # Include "@VIA" seen-bys in msgs -!define QWK_NOCTRL .12 # No extraneous control files - # Bits in user.chat -!define CHAT_ECHO .0 # Multinode chat echo -!define CHAT_ACTION .1 # Chat actions -!define CHAT_NOPAGE .2 # Can't be paged -!define CHAT_NOACT .3 # No activity alerts -!define CHAT_SPLITP .4 # Split screen private chat - - # For use with SET_USER_STRING function -!define USER_STRING_ALIAS 0 -!define USER_STRING_REALNAME 1 -!define USER_STRING_HANDLE 2 -!define USER_STRING_COMPUTER 3 -!define USER_STRING_NOTE 4 -!define USER_STRING_ADDRESS 5 -!define USER_STRING_LOCATION 6 -!define USER_STRING_ZIPCODE 7 -!define USER_STRING_PASSWORD 8 -!define USER_STRING_BIRTHDAY 9 -!define USER_STRING_PHONE 10 -!define USER_STRING_MODEM 11 -!define USER_STRING_COMMENT 12 -!define USER_STRING_NETMAIL 13 # Requires v3 (03/02/00) or later - -# End of USERDEFS.INC diff --git a/exec/userlist.js b/exec/userlist.js deleted file mode 100644 index 096220deb5..0000000000 --- a/exec/userlist.js +++ /dev/null @@ -1,18 +0,0 @@ -load("sbbsdefs.js"); - -var lastuser=system.stats.total_users; -var user = new User(1); - -for(i=1;i<=lastuser;i++) { - user.number=i; - if(user.settings&USER_DELETED) - continue; - printf("%d/%d ",i,lastuser); - printf("%-30s %-30s %s\r\n" - ,user.alias - ,user.location - ,user.connection - ); - if(bbs.sys_status&SS_ABORT) - break; -} \ No newline at end of file diff --git a/exec/wildcat.src b/exec/wildcat.src deleted file mode 100644 index 6bcd1aefdf..0000000000 --- a/exec/wildcat.src +++ /dev/null @@ -1,645 +0,0 @@ -# wildcat.src - -# $id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -:main -cmd_home -async -compare_ars expert -if_false - clear_abort - menu WILDCAT\MAIN - print "\r\nwhCommand >>? n" -else - print "\r\nyh@GRP@ @SUB@, wMAIN MENUy: ? n" - end_if - -node_action node_main - -getcmd 1AEMHUQCNFTJGPIYWVSBDR?\r - -# Write command to log file -logkey_comma - -# Commands -cmdkey ? - compare_ars expert - if_true - menu WILDCAT\MAIN - end_if - end_cmd -cmdkey M - cmd_pop - goto message - end_cmd -cmdkey U - print "\r\nchList Users\r\n" - mnemonics "\r\n~Logons Today, ~Sub-board, or ~All: " - getcmd LSA\r - cmdkey L - userlist_logons - end_cmd - cmdkey S - userlist_sub - end_cmd - cmdkey A - userlist_all - end_cmd - end_cmd - -cmdkey N - menu LOGON - pause - end_cmd - -cmdkey C - setstr "1" - mail_send_feedback - end_cmd -cmdkey F - cmd_pop - goto transfers - end_cmd -cmdkey T - chat_section - end_cmd -cmdkey J - msg_select_area - end_cmd -cmdkey G - file_download_batch - if_true - end_cmd - end_if - compare_ars expert - if_false - logoff - else - logoff_fast - end_if - end_cmd - -cmdkey P - page_sysop - pause - end_cmd - -cmdkey I - menu ..\ANSWER - pause - end_cmd - -cmdkey Y - user_defaults - end_cmd - -cmdkey W - nodelist_users - crlf - pause - end_cmd - -cmdkey S - info_system - crlf - pause - end_cmd - -cmdkey B - text_file_section - end_cmd - -cmdkey D - xtrn_section - end_cmd - -cmdkey E - call E-mail - end_cmd - -cmdkey A - auto_message - end_cmd - -cmdkey V - print "\r\nyhUsername search string: w" - getname 25 - finduser - if_true - print "yhVerified: w" - printstr - crlf - end_if - end_cmd - -cmdkey H - toggle_user_misc UM_EXPERT - print "\r\nExpert mode is now: " - compare_ars EXPERT - if_true - print "ON" - else - print "OFF" - end_if - crlf - end_cmd - -cmdkey 1 - compare_ars SYSOP or exempt Q or I or N - if_true - cmd_pop - goto sysop - end_if - end_cmd - -cmdkey R - info_user - pause - end_cmd - -end_cmd - -############################### E-mail Section ################################ - -:e-mail -cmd_home -compare_ars expert -if_false - menu E-MAIL - end_if -async -print "\r\nyhE-mail: n" -getcmd ?SRFNUKQ\r -logkey - -cmdkey ? - compare_ars expert - if_true - menu E-MAIL - end_if - end_cmd - -cmdkey S - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send - end_cmd - -cmdkey U - print "_\r\nbhE-mail (User name or number): w" - getname 25 - compare_str "" - if_true - end_cmd - end_if - compare_str "SYSOP" - if_true - setstr "1" - end_if - mail_send_file - end_cmd - -cmdkey R - mail_read - end_cmd - -cmdkey F - setstr "1" - mail_send_feedback - end_cmd - -cmdkey N - no_yes "\r\nAttach a file" - if_true - mail_send_netmail - else - mail_send_netfile - end_if - end_cmd - -cmdkey K - mail_read_sent - end_cmd - -cmdkey Q - cmd_pop - return - end_cmd - -cmd_pop -return - -################################ File Section ################################# - -:transfers -cmd_home -async -compare_ars expert -if_false - clear_abort - menu WILDCAT\FILE - print "\r\nwhCommand >>? n" -else - print "\r\nyh@LIB@ @DIR@, wFILE MENUy: ? n" - end_if - -# Update node status -node_action node_xfer -getcmd 1QLDUNVMSGPIJEFH?\r -logkey_comma - -cmdkey ? - compare_ars expert - if_true - menu WILDCAT\FILE - end_if - end_cmd - -cmdkey H - toggle_user_misc UM_EXPERT - print "\r\nExpert mode is now: " - compare_ars EXPERT - if_true - print "ON" - else - print "OFF" - end_if - crlf - end_cmd - -cmdkey Q - cmd_pop - goto main - end_cmd - -cmdkey L - setstr "*.*" - file_list - end_cmd - -cmdkey D - print "\r\nchDownload File(s)\r\n" - file_download_batch - if_true - end_cmd - end_if - getfilespec - if_true - file_download - end_if - end_cmd - -cmdkey U - print "\r\nchUpload File\r\n" - chkfile "..\text\menu\upload.*" - if_true - menu upload - end_if - file_upload - end_cmd - -cmdkey N - print "\r\nbhUse c@NEWFILETIME@b for new file scan date/time" - yes_no "" - if_false - file_ptrs_cfg - if_false - end_cmd - end_if - end_if - file_new_scan - end_cmd - -cmdkey V - print "\r\nchView File(s)\r\n" - getfilespec - if_true - file_view - end_if - end_cmd - -cmdkey M - cmd_pop - goto message - end_cmd - -cmdkey S - print "\r\nchSearch for Filename(s)\r\n" - file_find_name - end_cmd - -cmdkey G - file_download_batch - if_true - end_cmd - end_if - compare_ars expert - if_false - logoff - else - logoff_fast - end_if - end_cmd - -cmdkey P - info_user - pause - end_cmd - -cmdkey I - print "\r\nchList Extended File Information\r\n" - getfilespec - if_true - file_list_extended - end_if - end_cmd - -cmdkey J - file_select_area - end_cmd - -cmdkey E - file_batch_section - end_cmd - -cmdkey F - info_xfer_policy - pause - cls - info_directory - end_cmd - -cmdkey 1 - compare_ars SYSOP or exempt Q or I or N - if_true - cmd_pop - goto sysop - end_if - end_cmd - -end_cmd - -############################### Message Section ############################### - -:message -cmd_home -async -compare_ars expert -if_false - clear_abort - menu WILDCAT\MSG - print "\r\nwhCommand >>? n" -else - print "\r\nyh@GRP@ @SUB@, wMESSAGE MENUy: ? n" - end_if - -# Update node status -node_action node_main -getcmd 1GREFSQCUHJT?\r -logkey_comma - -cmdkey ? - compare_ars expert - if_true - menu WILDCAT\MSG - end_if - end_cmd - -cmdkey Q - cmd_pop - goto main - end_cmd - -cmdkey R - cmd_home - print "n\r\nyhReading Messages: [wNy]ew messages, [wSy]earch, " - print "[wUy]nread personal,\r\n" - print "[wJy]oin, or [wENTERy] to quit? " - getstr 5 - logkey - - cmdstr N - msg_new_scan - end_cmd - - cmdstr S - msg_find_text - end_cmd - - cmdstr U - msg_your_scan - end_cmd - - cmdstr J - msg_select_area - end_cmd - - cmdstr "" - cmd_pop - end_cmd - print "Invalid command.\r\n" - cmd_pop - end_cmd - -cmdkey E - msg_select_area - if_true - msg_post - end_if - end_cmd - -cmdkey F - cmd_pop - goto transfers - end_cmd - -cmdkey S - print "\r\nchSearch for Text in Messages\r\n" - msg_find_text - end_cmd - -cmdkey C - print "\r\nchCheck for Messages Posted to You\r\n" - msg_your_scan - end_cmd - -cmdkey U - cmd_home - compare_ars expert - if_false - menu MAINCFG - end_if - async - print "\r\nyhConfig: n" - getcmd ?QNPIS - logkey - - cmdkey ? - compare_ars expert - if_true - menu MAINCFG - end_if - end_cmd - - cmdkey N - msg_new_scan_cfg - end_cmd - - cmdkey S - msg_your_scan_cfg - end_cmd - - cmdkey P - msg_ptrs_cfg - end_cmd - - cmdkey I - msg_ptrs_reinit - end_cmd - - cmdkey Q - cmd_pop - end_cmd - - end_cmd - -cmdkey H - toggle_user_misc UM_EXPERT - print "\r\nExpert mode is now: " - compare_ars EXPERT - if_true - print "ON" - else - print "OFF" - end_if - crlf - end_cmd - -cmdkey J - msg_select_area - end_cmd - -cmdkey T - msg_qwk - end_cmd - -cmdkey G - file_download_batch - if_true - end_cmd - end_if - compare_ars expert - if_false - logoff - else - logoff_fast - end_if - end_cmd - -cmdkey 1 - compare_ars SYSOP or exempt Q or I or N - if_true - cmd_pop - goto sysop - end_if - end_cmd - -end_cmd - -################################ Sysop Section ################################ - -:sysop -cmd_home -async -compare_ars expert -if_false - clear_abort - menu WILDCAT\SYSOP - print "\r\nwhCommand >>? n" -else - print "\r\nyh@GRP@ @SUB@, wSYSOP MENUy: ? n" - end_if - -# Update node status -node_action node_main -getcmd JUQ?NFD1G2A\r -logkey_comma - -cmdkey ? - compare_ars expert - if_true - menu WILDCAT\SYSOP - end_if - end_cmd - -cmdkey J - msg_select_area - end_cmd - -cmdkey U - chksyspass - if_true - setstr "1" - user_edit - end_if - end_cmd - -cmdkey Q - cmd_pop - goto main - end_cmd - -cmdkey F - cmd_pop - goto transfers - end_cmd - -cmdkey D - chksyspass - if_true - exec_int command - end_if - end_cmd - -cmdkey 1 - cmd_pop - goto message - end_cmd - -cmdkey G - file_download_batch - if_true - end_cmd - end_if - compare_ars expert - if_false - logoff - else - logoff_fast - end_if - end_cmd - -cmdkey 2 - cmd_pop - goto transfers - end_cmd - -cmdkey A - exec_int command /c %!SLOG - end_cmd - -end_cmd - - diff --git a/exec/wiplogin.src b/exec/wiplogin.src deleted file mode 100644 index d4f3152e3e..0000000000 --- a/exec/wiplogin.src +++ /dev/null @@ -1,126 +0,0 @@ -# wiplogin.src - -# $Id$ - -# ANSWER.WIP requires button press - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -getkey - -######################### -# TEXT.DAT Replacements # -######################### - -replace_text 48 "@MENU:NUMBER@" -replace_text 83 "@MENU:NUMBER@" -replace_text 86 "@MENU:NUMBER@" -replace_text 87 "@MENU:NUMBER@" -replace_text 268 "" -replace_text 292 "" -replace_text 384 "@MENU:NUMBER@" -replace_text 494 "@MENU:KEYBOARD@" -replace_text 503 "@MENU:NUMBER@" -replace_text 506 "" -replace_text 559 "@MENU:YESNO@" -replace_text 560 "" -replace_text 561 "" -replace_text 562 "@MENU:NOYES@" -replace_text 563 "@MENU:PAUSE@" -replace_text 570 "" -replace_text 652 "@MENU:NUMBER@" -replace_text 653 "@MENU:NUMBER@" -replace_text 654 "@MENU:NUMBER@" -replace_text 655 "@MENU:NUMBER@" - -############## -# Login Menu # -############## - -int c m - -:top -compare c 10 -if_greater_or_equal - hangup - return - end_if - -cmd_home -clear_abort -cls -printfile "%zmenu/login.wip" -sync -print_local "\r\n[WIP] Login Menu: " - -getkey -logkey_comma - -cmdkey L - print_local "Login\r\n" - print_local "Enter name: " - printfile "%zmenu/namepass.wip" - getstr str 25 K_UPRLWR|K_LOWPRIO|K_NOECHO - truncsp str - compare_str "" - if_true - add c 1 - end_cmd - end_if - print_local "Password: " - login "" - getkey - if_true - logon - if_true - return - end_if - end_if - pause - add c 2 - end_cmd - -cmdkey N - print_local "New\r\n" - setstr "%q" - compare_str "VERT" - if_true - yes_no "Are you calling just to download Synchronet BBS software" - if_true - setstr "Guest" - login "Password: " - if_true - logon - if_true - return - end_if - end_if - end_if - end_if - newuser - logon - return - end_cmd - -cmdkey G - print_local "Guest\r\n" - setstr "guest" - login "Password: " - if_true - logon - if_true - return - end_if - end_if - end_cmd - -cmdkey H - print_local "Hang-up\r\n" - hangup - return - end_cmd - -end_cmd - diff --git a/exec/wipshell.src b/exec/wipshell.src deleted file mode 100644 index e9bd26cfa6..0000000000 --- a/exec/wipshell.src +++ /dev/null @@ -1,378 +0,0 @@ -# wipshell.src - -# WIP Windows Interface Protocol {tm} Durand Communications Networks, Inc. -# Command Shell for Synchronet Multinode BBS Software - -# $Id$ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc - -compare_user_misc UM_COLDKEYS -if_true - toggle_user_misc UM_COLDKEYS - end_if - -str tmp - -cmd_home -clear_abort -cls -printfile_remote "%zmenu/wipmain.wip" -node_action NODE_MAIN -inc_main_cmds -sync -print_local "[WIP] Main Menu: " - -getkey -logkey_comma - -cmdkey C - print_local "Chat\r\n" - exec_bin chat_sec - end_cmd - -cmdkey D - print_local "Default Settings\r\n" - user_defaults - end_cmd - -cmdkey E - print_local "E-mail\r\n" - cmd_home - clear_abort - cls - printfile_remote "%zmenu/e-mail.wip" - sync - print_local "\r\n[WIP] E-mail Menu: " - getkey - logkey - cmdkey S - print_local "Send\r\n" - call sendmail - end_cmd - cmdkey F - print_local "Feedback\r\n" - setstr "1" - mail_send - end_cmd - cmdkey R - print_local "Read\r\n" - mail_read - end_cmd - cmdkey K - print_local "Kill\r\n" - mail_read_sent - end_cmd - cmdkey N - print_local "NetMail\r\n" - call sendnetmail - end_cmd - cmdkey Q - print_local "Quit\r\n" - cmd_pop - end_cmd - end_cmd - -cmdkey I - print_local "Info\r\n" - cmd_home - clear_abort - cls - printfile_remote "%zmenu/info.wip" - sync - print_local "\r\n[WIP] Info Menu: " - getkey - logkey - cmdkey T - print_local "Text Files\r\n" - text_file_section - end_cmd - cmdkey I - print_local "System\r\n" - info_system - end_cmd - cmdkey Y - print_local "Your Stats\r\n" - info_user - end_cmd - cmdkey L - print_local "Callers\r\n" - userlist_logons - end_cmd - cmdkey U - print_local "User List\r\n" - userlist_all - end_cmd - cmdkey Q - print_local "Quit\r\n" - cmd_pop - end_cmd - end_cmd - -cmdkey M - print_local "Messages\r\n" - cmd_home - clear_abort - cls - printfile_remote "%zmenu/msgs.wip" - sync - print_local "\r\n[WIP] Messages Menu: " - getkey - logkey - cmdkey C - print_local "Configure\r\n" - call msg_cfg - end_cmd - cmdkey R - print_local "Read\r\n" - msg_select_area - if_true - msg_read - end_if - end_cmd - cmdkey N - print_local "New Scan\r\n" - msg_new_scan_all - end_cmd - cmdkey P - print_local "Post\r\n" - msg_select_area - if_true - msg_post - end_if - end_cmd - cmdkey Q - print_local "QWK\r\n" - msg_qwk - end_cmd - cmdkey X - print_local "Quit\r\n" - cmd_pop - end_cmd - end_cmd - - -cmdkey O - print_local "Logoff\r\n" - call logoffbbs - end_cmd - -cmdkey S - print_local "Match Maker\r\n" - exec_xtrn SMM - end_cmd - -cmdkey X - print_local "Doors\r\n" - xtrn_section - end_cmd - -cmdkey F - call file_transfers - end_cmd - -end_cmd - -# End of main menu loop - -:sendmail -print "\r\nbhSend E-mail to (User name or number): n" -getname 25 -compare_str "" -if_true - return - end_if -compare_str "SYSOP" -if_true - setstr "1" - end_if -no_yes "\r\nAttach a file" -if_false - mail_send_file -else - mail_send - end_if -return - -:sendnetmail -no_yes "\r\nAttach a file" -if_false - mail_send_netfile -else - mail_send_netmail - end_if -return - -:msg_cfg -cmd_home -clear_abort -cls -printfile "%zmenu/msgcfg.wip" -sync -print_local "\r\n[WIP] Message Scan Config: " -getkey -logkey -cmdkey N - print_local "New Scan\r\n" - msg_new_scan_cfg - end_cmd - -cmdkey P - print_local "Pointers\r\n" - msg_ptrs_cfg - end_cmd - -cmdkey I - print_local "Re-init\r\n" - msg_ptrs_reinit - end_cmd -cmd_pop -return - -:file_transfers - -cmd_home -clear_abort -cls -printfile_remote "%zmenu/wipfile.wip" -node_action NODE_XFER -inc_file_cmds -sync -print_local "[WIP] File Menu: " - -getkey -logkey_comma - -cmdkey B - print_local "Batch\r\n" - file_batch_section - end_cmd - -cmdkey C - print_local "Config\r\n" - menu XFERCFG - async - print "\r\nyhConfig: n" - getcmd ?QBEP\r - logkey - - cmdkey P - file_ptrs_cfg - end_cmd - - cmdkey B - toggle_user_misc UM_BATCHFLAG - end_cmd - - cmdkey E - toggle_user_misc UM_EXTDESC - end_cmd - end_cmd - - -cmdkey D - print_local "Download\r\n" - file_download_batch - if_true - end_cmd - end_if - getfilespec - if_true - file_download - end_if - end_cmd - -cmdkey E - print_local "File Info\r\n" - getfilespec - if_true - file_list_extended - end_if - end_cmd - -cmdkey F - print_local "Find Text\r\n" - file_find_text_all - end_cmd - -cmdkey L - print_local "List Files\r\n" - file_select_area - if_false - end_cmd - end_if - setstr "*.*" - file_list - end_cmd - -cmdkey N - print_local "New Files\r\n" - date_str tmp _ns_time - sprintf str "bhUse c%sb for new file scan date/time" tmp - yes_no "%s" - if_false - file_ptrs_cfg - if_false - end_cmd - end_if - end_if - file_new_scan_all - end_cmd - -cmdkey R - print_local "Remove Files\r\n" - getfilespec - if_true - file_remove - end_if - end_cmd - -cmdkey S - print_local "Search for Filename\r\n" - file_find_name_all - end_cmd - -cmdkey U - print_local "Upload\r\n" - no_yes "Upload file to Sysop only" - if_false - file_upload_user - end_cmd - end_if - file_select_area - if_false - end_cmd - end_if - chkfile "%ztext/menu/upload.*" - if_true - menu upload - end_if - file_upload - end_cmd - -cmdkey V - print_local "View file\r\n" - getfilespec - if_true - file_view - end_if - end_cmd -cmdpop -return - - - -:logoffbbs -file_download_batch -if_false - logoff - end_if -return - - - -# End of WIPSHELL.SRC - - diff --git a/exec/yesnobar.src b/exec/yesnobar.src deleted file mode 100644 index 6f9603a636..0000000000 --- a/exec/yesnobar.src +++ /dev/null @@ -1,58 +0,0 @@ -# yesnobar.src - -# Sep 28 1995 - Digital Man - -# $id $ - -# @format.tab-size 8, @format.use-tabs true - -!include sbbsdefs.inc # _question - -str tmp - -copy tmp str -setstr "Y" -compare_strn 2 _question "\r\n" -if_true - crlf - shift_str _question 2 - end_if -printf "nbh[c�b] y%s? " _question -:top -compare_str "Y" -if_equal - print "h4w[Yes]nbh No " -else - print "nbh Yes 4w[No]" - end_if -getkey -print "\b\b\b\b\b\b\b\b\b\1n\1h\1>" -compare_key ^M -if_true - ungetstr - copy str tmp - return - end_if - -compare_keys "YN" -if_true - ungetkey - copy str tmp - return - end_if - -compare_key ^@ -if_true - copy str tmp - return - end_if - -# Toggle -compare_str "Y" -if_true - setstr "N" -else - setstr "Y" - end_if -goto top - diff --git a/node1/node.cnf b/node1/node.cnf deleted file mode 100644 index a5a4342bbb16cda5e4c84b5c42155d6669878302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3504 zcmZQ%@XJq0RWM{A3?d>TbfGwcuxbJ-gqRo@7#Wxds3IuM$e_bWP!ZJ>s4C`U7MCcf zrcupAQVr76i*XJK@`)i;A56WTUQCE<L<rgXLtK3W$kq&V1O+rS2K4k|QW8rNV^WKX z@{9Cx^3#bm5>0=4X;CRD+8NOF=j5m7=N0Sa6qgX|fKhb=8Um_{g?XtIM3$;z0Y&-; z)bpd3kA?t+Az;J6#h|KKoSc@fpqj0qU!q!0p@E~?=^6t6N5O~=0S0D<A500HkTmBQ zqUIKCU~3R;WNT<-;c5_O5MiR`Y^dg91d*pT=@{Z_7)DIb1BXK#LtH{|ND(FM7~*T- wL6QBAMA?H|5i0{DGXtm(BgtTFU;t6a%CLbYkHOFg%I9K8;C#klWCG;^0O}1t?EnA( diff --git a/node1/sbbs.bat b/node1/sbbs.bat deleted file mode 100755 index aa2b0bd10a..0000000000 --- a/node1/sbbs.bat +++ /dev/null @@ -1 +0,0 @@ -@..\exec\sbbs %1 %2 %3 %4 %5 \ No newline at end of file diff --git a/node1/sbbs.cmd b/node1/sbbs.cmd deleted file mode 100755 index e791768435..0000000000 --- a/node1/sbbs.cmd +++ /dev/null @@ -1 +0,0 @@ -@..\exec\sbbs4os2 %1 %2 %3 %4 %5 \ No newline at end of file diff --git a/node1/scfg.bat b/node1/scfg.bat deleted file mode 100755 index b406a1245e..0000000000 --- a/node1/scfg.bat +++ /dev/null @@ -1 +0,0 @@ -@..\exec\scfg ..\ctrl %1 %2 %3 \ No newline at end of file diff --git a/node1/scfg.cmd b/node1/scfg.cmd deleted file mode 100755 index 7b1905b433..0000000000 --- a/node1/scfg.cmd +++ /dev/null @@ -1 +0,0 @@ -@..\exec\scfg4os2 ..\ctrl %1 %2 %3 \ No newline at end of file diff --git a/node2/node.cnf b/node2/node.cnf deleted file mode 100644 index a5a4342bbb16cda5e4c84b5c42155d6669878302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3504 zcmZQ%@XJq0RWM{A3?d>TbfGwcuxbJ-gqRo@7#Wxds3IuM$e_bWP!ZJ>s4C`U7MCcf zrcupAQVr76i*XJK@`)i;A56WTUQCE<L<rgXLtK3W$kq&V1O+rS2K4k|QW8rNV^WKX z@{9Cx^3#bm5>0=4X;CRD+8NOF=j5m7=N0Sa6qgX|fKhb=8Um_{g?XtIM3$;z0Y&-; z)bpd3kA?t+Az;J6#h|KKoSc@fpqj0qU!q!0p@E~?=^6t6N5O~=0S0D<A500HkTmBQ zqUIKCU~3R;WNT<-;c5_O5MiR`Y^dg91d*pT=@{Z_7)DIb1BXK#LtH{|ND(FM7~*T- wL6QBAMA?H|5i0{DGXtm(BgtTFU;t6a%CLbYkHOFg%I9K8;C#klWCG;^0O}1t?EnA( diff --git a/node2/sbbs.bat b/node2/sbbs.bat deleted file mode 100755 index aa2b0bd10a..0000000000 --- a/node2/sbbs.bat +++ /dev/null @@ -1 +0,0 @@ -@..\exec\sbbs %1 %2 %3 %4 %5 \ No newline at end of file diff --git a/node2/sbbs.cmd b/node2/sbbs.cmd deleted file mode 100755 index e791768435..0000000000 --- a/node2/sbbs.cmd +++ /dev/null @@ -1 +0,0 @@ -@..\exec\sbbs4os2 %1 %2 %3 %4 %5 \ No newline at end of file diff --git a/node2/scfg.bat b/node2/scfg.bat deleted file mode 100755 index b406a1245e..0000000000 --- a/node2/scfg.bat +++ /dev/null @@ -1 +0,0 @@ -@..\exec\scfg ..\ctrl %1 %2 %3 \ No newline at end of file diff --git a/node2/scfg.cmd b/node2/scfg.cmd deleted file mode 100755 index 7b1905b433..0000000000 --- a/node2/scfg.cmd +++ /dev/null @@ -1 +0,0 @@ -@..\exec\scfg4os2 ..\ctrl %1 %2 %3 \ No newline at end of file diff --git a/node3/node.cnf b/node3/node.cnf deleted file mode 100644 index a5a4342bbb16cda5e4c84b5c42155d6669878302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3504 zcmZQ%@XJq0RWM{A3?d>TbfGwcuxbJ-gqRo@7#Wxds3IuM$e_bWP!ZJ>s4C`U7MCcf zrcupAQVr76i*XJK@`)i;A56WTUQCE<L<rgXLtK3W$kq&V1O+rS2K4k|QW8rNV^WKX z@{9Cx^3#bm5>0=4X;CRD+8NOF=j5m7=N0Sa6qgX|fKhb=8Um_{g?XtIM3$;z0Y&-; z)bpd3kA?t+Az;J6#h|KKoSc@fpqj0qU!q!0p@E~?=^6t6N5O~=0S0D<A500HkTmBQ zqUIKCU~3R;WNT<-;c5_O5MiR`Y^dg91d*pT=@{Z_7)DIb1BXK#LtH{|ND(FM7~*T- wL6QBAMA?H|5i0{DGXtm(BgtTFU;t6a%CLbYkHOFg%I9K8;C#klWCG;^0O}1t?EnA( diff --git a/node3/sbbs.bat b/node3/sbbs.bat deleted file mode 100755 index aa2b0bd10a..0000000000 --- a/node3/sbbs.bat +++ /dev/null @@ -1 +0,0 @@ -@..\exec\sbbs %1 %2 %3 %4 %5 \ No newline at end of file diff --git a/node3/sbbs.cmd b/node3/sbbs.cmd deleted file mode 100755 index e791768435..0000000000 --- a/node3/sbbs.cmd +++ /dev/null @@ -1 +0,0 @@ -@..\exec\sbbs4os2 %1 %2 %3 %4 %5 \ No newline at end of file diff --git a/node3/scfg.bat b/node3/scfg.bat deleted file mode 100755 index b406a1245e..0000000000 --- a/node3/scfg.bat +++ /dev/null @@ -1 +0,0 @@ -@..\exec\scfg ..\ctrl %1 %2 %3 \ No newline at end of file diff --git a/node3/scfg.cmd b/node3/scfg.cmd deleted file mode 100755 index 7b1905b433..0000000000 --- a/node3/scfg.cmd +++ /dev/null @@ -1 +0,0 @@ -@..\exec\scfg4os2 ..\ctrl %1 %2 %3 \ No newline at end of file diff --git a/node4/node.cnf b/node4/node.cnf deleted file mode 100644 index a5a4342bbb16cda5e4c84b5c42155d6669878302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3504 zcmZQ%@XJq0RWM{A3?d>TbfGwcuxbJ-gqRo@7#Wxds3IuM$e_bWP!ZJ>s4C`U7MCcf zrcupAQVr76i*XJK@`)i;A56WTUQCE<L<rgXLtK3W$kq&V1O+rS2K4k|QW8rNV^WKX z@{9Cx^3#bm5>0=4X;CRD+8NOF=j5m7=N0Sa6qgX|fKhb=8Um_{g?XtIM3$;z0Y&-; z)bpd3kA?t+Az;J6#h|KKoSc@fpqj0qU!q!0p@E~?=^6t6N5O~=0S0D<A500HkTmBQ zqUIKCU~3R;WNT<-;c5_O5MiR`Y^dg91d*pT=@{Z_7)DIb1BXK#LtH{|ND(FM7~*T- wL6QBAMA?H|5i0{DGXtm(BgtTFU;t6a%CLbYkHOFg%I9K8;C#klWCG;^0O}1t?EnA( diff --git a/node4/sbbs.bat b/node4/sbbs.bat deleted file mode 100755 index aa2b0bd10a..0000000000 --- a/node4/sbbs.bat +++ /dev/null @@ -1 +0,0 @@ -@..\exec\sbbs %1 %2 %3 %4 %5 \ No newline at end of file diff --git a/node4/sbbs.cmd b/node4/sbbs.cmd deleted file mode 100755 index e791768435..0000000000 --- a/node4/sbbs.cmd +++ /dev/null @@ -1 +0,0 @@ -@..\exec\sbbs4os2 %1 %2 %3 %4 %5 \ No newline at end of file diff --git a/node4/scfg.bat b/node4/scfg.bat deleted file mode 100755 index b406a1245e..0000000000 --- a/node4/scfg.bat +++ /dev/null @@ -1 +0,0 @@ -@..\exec\scfg ..\ctrl %1 %2 %3 \ No newline at end of file diff --git a/node4/scfg.cmd b/node4/scfg.cmd deleted file mode 100755 index 7b1905b433..0000000000 --- a/node4/scfg.cmd +++ /dev/null @@ -1 +0,0 @@ -@..\exec\scfg4os2 ..\ctrl %1 %2 %3 \ No newline at end of file diff --git a/src/cleanall.bat b/src/cleanall.bat deleted file mode 100755 index acefc679cd..0000000000 --- a/src/cleanall.bat +++ /dev/null @@ -1,96 +0,0 @@ -@echo off -rem -rem Deletes all intermediate files for Synchronet projects - Rob Swindell -rem -echo y | del stp\*.obj > nul -echo y | del stp\*.map > nul -echo y | del stp\*.exe > nul -echo y | del tone\*.obj > nul -echo y | del tone\*.map > nul -echo y | del tone\*.exe > nul -echo y | del sbbs\dos > nul -echo y | del sbbs\os2 > nul -echo y | del sbbs\w32 > nul -echo y | del sbbs\addfiles\dos > nul -echo y | del sbbs\addfiles\dosx > nul -echo y | del sbbs\addfiles\nt > nul -echo y | del sbbs\addfiles\os2 > nul -echo y | del sbbs\allusers\*.obj > nul -echo y | del sbbs\allusers\*.map > nul -echo y | del sbbs\allusers\*.exe > nul -echo y | del sbbs\baja\*.obj > nul -echo y | del sbbs\baja\*.map > nul -echo y | del sbbs\baja\*.exe > nul -echo y | del sbbs\dcdwatch\*.obj > nul -echo y | del sbbs\dcdwatch\*.map > nul -echo y | del sbbs\dcdwatch\*.exe > nul -echo y | del sbbs\delfiles\dos > nul -echo y | del sbbs\delfiles\dosx > nul -echo y | del sbbs\delfiles\nt > nul -echo y | del sbbs\delfiles\os2 > nul -echo y | del sbbs\dstsedit\*.obj > nul -echo y | del sbbs\dstsedit\*.map > nul -echo y | del sbbs\dstsedit\*.exe > nul -echo y | del sbbs\dupefind\dos > nul -echo y | del sbbs\dupefind\dosx > nul -echo y | del sbbs\dupefind\nt > nul -echo y | del sbbs\dupefind\os2 > nul -echo y | del sbbs\echo\*.obj > nul -echo y | del sbbs\echo\*.map > nul -echo y | del sbbs\echo\*.exe > nul -echo y | del sbbs\echo\dos > nul -echo y | del sbbs\echo\dos4G > nul -echo y | del sbbs\echo\nt > nul -echo y | del sbbs\echo\os2 > nul -echo y | del sbbs\execsbbs\dos > nul -echo y | del sbbs\execsbbs\os2 > nul -echo y | del sbbs\filelist\dos > nul -echo y | del sbbs\filelist\dosx > nul -echo y | del sbbs\filelist\nt > nul -echo y | del sbbs\filelist\os2 > nul -echo y | del sbbs\install\dos > nul -echo y | del sbbs\install\os2 > nul -echo y | del sbbs\mlabels\*.obj > nul -echo y | del sbbs\mlabels\*.map > nul -echo y | del sbbs\mlabels\*.exe > nul -echo y | del sbbs\node\dos > nul -echo y | del sbbs\node\os2 > nul -echo y | del sbbs\qwknodes\*.obj > nul -echo y | del sbbs\qwknodes\*.map > nul -echo y | del sbbs\qwknodes\*.exe > nul -echo y | del sbbs\sbl\*.obj > nul -echo y | del sbbs\sbl\*.map > nul -echo y | del sbbs\sbl\*.exe > nul -echo y | del sbbs\sbj\*.obj > nul -echo y | del sbbs\sbj\*.map > nul -echo y | del sbbs\sbj\*.exe > nul -echo y | del sbbs\scb\*.obj > nul -echo y | del sbbs\scb\*.map > nul -echo y | del sbbs\scb\*.exe > nul -echo y | del sbbs\scfg\dos > nul -echo y | del sbbs\scfg\dos32 > nul -echo y | del sbbs\scfg\os2 > nul -echo y | del sbbs\slog\dos > nul -echo y | del sbbs\slog\os2 > nul -echo y | del sbbs\smb\chksmb\dos > nul -echo y | del sbbs\smb\chksmb\os2 > nul -echo y | del sbbs\smb\fixsmb\dos > nul -echo y | del sbbs\smb\fixsmb\os2 > nul -echo y | del sbbs\smb\smbutil\dos > nul -echo y | del sbbs\smb\smbutil\dos4G > nul -echo y | del sbbs\smb\smbutil\nt > nul -echo y | del sbbs\smb\smbutil\os2 > nul -echo y | del sbbs\smbactiv\dos > nul -echo y | del sbbs\smbactiv\dosx > nul -echo y | del sbbs\smbactiv\nt > nul -echo y | del sbbs\smbactiv\os2 > nul -echo y | del sbbs\smm\*.obj > nul -echo y | del sbbs\smm\*.map > nul -echo y | del sbbs\smm\*.exe > nul -echo y | del sbbs\uti\*.obj > nul -echo y | del sbbs\uti\*.map > nul -echo y | del sbbs\uti\*.exe > nul -echo y | del sbbs\execdos\*.obj > nul -echo y | del sbbs\execdos\*.map > nul -echo y | del sbbs\execdos\*.exe > nul - diff --git a/src/makeall.bat b/src/makeall.bat deleted file mode 100755 index b73207ac58..0000000000 --- a/src/makeall.bat +++ /dev/null @@ -1,121 +0,0 @@ -@echo off -rem -rem Makes all Borland for DOS Synchronet projects - April 1997 Rob Swindell -rem -cd sbbs -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -make -DW32 %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd scfg -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -make -DDOS32 %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\addfiles -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\allusers -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\baja -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\delfiles -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\dstsedit -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\dupefind -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\echo -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\execdos -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\execsbbs -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\filelist -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\install -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\mlabels -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\node -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\qwknodes -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\sbj -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\sbl -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -call makeio.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\scb -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -make -fscbcfg.mak %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\slog -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\smb -cd chksmb -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\fixsmb -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\smbutil -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd .. -cd ..\smbactiv -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\smm -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -make -fsmmcfg.mak %1 %2 %3 %4 %5 -if errorlevel 1 goto err -call makeio.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -call makephot.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -call makeutil.batn %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\uti -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -rem -rem Non-Synchronet specific stuff -rem -cd ..\ -cd ..\tone -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\stp -call make.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -rem -rem End of makes -rem -cd .. -goto end -:err -rem Error occurred -echo. -echo There was an error! -echo. -:end diff --git a/src/makeall.cmd b/src/makeall.cmd deleted file mode 100755 index bff08dcdc7..0000000000 --- a/src/makeall.cmd +++ /dev/null @@ -1,63 +0,0 @@ -@echo off -rem -rem Makes all Borland for OS/2 Synchronet projects - April 1997 Rob Swindell -rem -cd sbbs -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd scfg -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\addfiles -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\baja -call make.cmd %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\delfiles -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\dupefind -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\echo -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\execsbbs -call make.cmd %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\filelist -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\install -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\node -call make.cmd %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\slog -call make.cmd %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\smb -cd chksmb -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\fixsmb -make %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\smbutil -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd .. -cd ..\smbactiv -make -fmakefile.bc %1 %2 %3 %4 %5 -if errorlevel 1 goto err -rem End of makes -cd ..\.. -goto end -:err -rem Error occurred -echo. -echo There was an error! -echo. -:end diff --git a/src/sbbs2/addfiles/addfiles.c b/src/sbbs2/addfiles/addfiles.c deleted file mode 100644 index 3a878b3461..0000000000 --- a/src/sbbs2/addfiles/addfiles.c +++ /dev/null @@ -1,1668 +0,0 @@ -/* ADDFILES.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Program to add files to a Synchronet file database */ - -#include "sbbs.h" - -#define ADDFILES_VER "2.24" - -char tmp[256]; -char *crlf="\r\n"; - -#ifdef __TURBOC__ -unsigned _stklen=16000; -#else -unsigned _stacksize=16000; -#endif - -int cur_altpath=0; - -long files=0,removed=0,mode=0; - -#define DEL_LIST (1L<<0) -#define NO_EXTEND (1L<<1) -#define FILE_DATE (1L<<2) -#define TODAYS_DATE (1L<<3) -#define FILE_ID (1L<<4) -#define NO_UPDATE (1L<<5) -#define NO_NEWDATE (1L<<6) -#define ASCII_ONLY (1L<<7) -#define UL_STATS (1L<<8) -#define ULDATE_ONLY (1L<<9) -#define KEEP_DESC (1L<<10) -#define AUTO_ADD (1L<<11) -#define SEARCH_DIR (1L<<12) -#define SYNC_LIST (1L<<13) -#define KEEP_SPACE (1L<<14) - -#ifndef __FLAT__ -/****************************************************************************/ -/* This function reads files that are potentially larger than 32k. */ -/* Up to one megabyte of data can be read with each call. */ -/****************************************************************************/ -long lread(int file, char HUGE16 *buf,long bytes) -{ - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(read(file,(char *)buf,32767)!=32767) - return(-1L); -if(read(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} - -/****************************************************************************/ -/* This function writes files that are potentially larger than 32767 bytes */ -/* Up to one megabytes of data can be written with each call. */ -/****************************************************************************/ -long lwrite(int file, char HUGE16 *buf, long bytes) -{ - - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(write(file,(char *)buf,32767)!=32767) - return(-1L); -if(write(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} -#endif - -long lputs(char FAR16 *str) -{ - char tmp[256]; - int i,j,k; - -j=strlen(str); -for(i=k=0;i<j;i++) /* remove CRs */ - if(str[i]==CR && str[i+1]==LF) - continue; - else - tmp[k++]=str[i]; -tmp[k]=0; -return(fputs(tmp,stdout)); -} - -/****************************************************************************/ -/* Returns string for 2 digit hex+ numbers up to 575 */ -/****************************************************************************/ -char *hexplus(uint num, char *str) -{ -sprintf(str,"%03x",num); -str[0]=num/0x100 ? 'f'+(num/0x10)-0xf : str[1]; -str[1]=str[2]; -str[2]=0; -return(str); -} - - -/****************************************************************************/ -/* Places into 'strout', 'strin' starting at 'start' and ending at */ -/* 'start'+'length' */ -/****************************************************************************/ -void putrec(char *strout,int start,int length,char *strin) -{ - int i=0,j; - -j=strlen(strin); -while(i<j && i<length) - strout[start++]=strin[i++]; -while(i++<length) - strout[start++]=ETX; -} - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) -{ - va_list argptr; - char sbuf[256]; - int chcount; - -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - int c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct find_t f; - uint i; - -i=_dos_findfirst(filespec,_A_NORMAL,&f); -#ifdef __WATCOMC__ -_dos_findclose(&f); -#endif -if(!i) - return(1); -return(0); -} - -/****************************************************************************/ -/* Returns the time/date of the file in 'filespec' in time_t (unix) format */ -/****************************************************************************/ -long fdate(char *filespec) -{ - int file; - ushort fd,ft; - struct tm t; - -if((file=nopen(filespec,O_RDONLY))==-1) - return(0); -_dos_getftime(file,&fd,&ft); -close(file); -memset(&t,0,sizeof(t)); -t.tm_year=((fd&0xfe00)>>9)+80; -t.tm_mon=((fd&0x01e0)>>5)-1; -t.tm_mday=fd&0x1f; -t.tm_hour=(ft&0xf800)>>11; -t.tm_min=(ft&0x07e0)>>5; -t.tm_sec=(ft&0x001f)<<1; -return(mktime(&t)); -} - -/*****************************************************************************/ -/* Returns command line generated from instr with %c replacments */ -/*****************************************************************************/ -char *cmdstr(char *instr, char *fpath, char *fspec, char *outstr) -{ - static char cmd[128]; - char str[256]; - int i,j,len; - -len=strlen(instr); -for(i=j=0;i<len && j<128;i++) { - if(instr[i]=='%') { - i++; - cmd[j]=0; - switch(toupper(instr[i])) { - case 'F': /* File path */ - strcat(cmd,fpath); - break; - case 'G': /* Temp directory */ - if(temp_dir[0]!='\\' && temp_dir[1]!=':') - strcat(cmd,node_dir); - strcat(cmd,temp_dir); - break; - case 'N': /* Node Directory (same as SBBSNODE environment var) */ - strcat(cmd,node_dir); - break; - case 'S': /* File Spec */ - strcat(cmd,fspec); - break; - case '!': /* EXEC Directory */ - if(exec_dir[0]!='\\' && exec_dir[1]!=':') - strcat(cmd,node_dir); - strcat(cmd,exec_dir); - break; - case '#': /* Node number (same as SBBSNNUM environment var) */ - sprintf(str,"%d",node_num); - strcat(cmd,str); - break; - case '%': /* %% for percent sign */ - strcat(cmd,"%"); - break; - default: /* unknown specification */ - break; } - j=strlen(cmd); } - else - cmd[j++]=instr[i]; } -cmd[j]=0; - -return(cmd); -} - - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - struct tm *t; - -if(!unix) - strcpy(str,"00/00/00"); -else { - t=gmtime(&unix); - sprintf(str,"%02u/%02u/%02u",t->tm_mon+1,t->tm_mday - ,TM_YEAR(t->tm_year)); } -return(str); -} - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access==O_RDONLY) share=SH_DENYWR; - else share=SH_DENYRW; -while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(access&O_WRONLY) access|=O_RDWR; /* fdopen can't open WRONLY */ - -if(((*file)=nopen(str,access))==-1) - return(NULL); - -if(access&O_APPEND) { - if(access&(O_RDONLY|O_RDWR)) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&(O_WRONLY|O_RDWR)) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - close(*file); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,16*1024); -return(stream); -} - -void allocfail(uint size) -{ -lprintf("\7Error allocating %u bytes of memory.\r\n",size); -bail(1); -} - -void bail(int code) -{ -exit(code); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct find_t f; - uint i; - -i=_dos_findfirst(filespec,_A_NORMAL,&f); -#ifdef __WATCOMC__ -_dos_findclose(&f); -#endif -if(!i) - return(f.size); -return(-1L); -} - -/****************************************************************************/ -/* Turns FILE.EXT into FILE .EXT */ -/* Called from upload */ -/****************************************************************************/ -char *padfname(char *filename, char *str) -{ - char c,d; - -for(c=0;c<8;c++) - if(filename[c]=='.' || !filename[c]) break; - else str[c]=filename[c]; -d=c; -if(filename[c]=='.') c++; -while(d<8) - str[d++]=SP; -str[d++]='.'; -while(d<12) - if(!filename[c]) break; - else str[d++]=filename[c++]; -while(d<12) - str[d++]=SP; -str[d]=0; -return(str); -} - -/****************************************************************************/ -/* Turns FILE .EXT into FILE.EXT */ -/****************************************************************************/ -char *unpadfname(char *filename, char *str) -{ - char c,d; - -for(c=0,d=0;c<strlen(filename);c++) - if(filename[c]!=SP) str[d++]=filename[c]; -str[d]=0; -return(str); -} - -/****************************************************************************/ -/* Checks directory data file for 'filename' (must be padded). If found, */ -/* it returns the 1, else returns 0. */ -/* Called from upload and bulkupload */ -/****************************************************************************/ -char findfile(uint dirnum, char *filename) -{ - char str[256],c,fname[128],HUGE16 *ixbbuf; - int file; - ulong length,l; - -strcpy(fname,filename); -for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[c]=fname[c+1]; -sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_RDONLY))==-1) return(0); -length=filelength(file); -if(!length) { - close(file); - return(0); } -if((ixbbuf=(char *)MALLOC(length))==NULL) { - close(file); - printf("ERR_ALLOC %s %lu\n",str,length); - return(0); } -if(lread(file,ixbbuf,length)!=length) { - close(file); - FREE((char *)ixbbuf); - return(0); } -close(file); -for(l=0;l<length;l+=F_IXBSIZE) { - for(c=0;c<11;c++) - if(fname[c]!=ixbbuf[l+c]) break; - if(c==11) break; } -FREE((char *)ixbbuf); -if(l<length) - return(1); -return(0); -} - - -/****************************************************************************/ -/* Adds the data for struct filedat to the directory's data base. */ -/* changes the .datoffset field only */ -/****************************************************************************/ -char addfiledat(file_t *f) -{ - char str[256],fdat[F_LEN+1],fname[128],idx[128],c,HUGE16 *ixbbuf; - int i,file; - ulong length,l,uldate; - -/************************/ -/* Add data to DAT File */ -/************************/ -sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_RDWR|O_CREAT))==-1) { - printf("ERROR opening %s\n",str); - return(0); } -length=filelength(file); -if(length==0L) - l=0L; -else { - if(length%F_LEN) { - close(file); - printf("ERR_LEN %s %lu\n",str,length); - return(0); } - for(l=0;l<length;l+=F_LEN) { /* Find empty slot */ - lseek(file,l,SEEK_SET); - read(file,&c,1); - if(c==ETX) break; } } -putrec(fdat,F_CDT,7,ultoa(f->cdt,tmp,10)); -putrec(fdat,F_CDT+7,2,crlf); -putrec(fdat,F_DESC,LEN_FDESC,f->desc); -putrec(fdat,F_DESC+LEN_FDESC,2,crlf); -putrec(fdat,F_ULER,LEN_ALIAS+5,f->uler); -putrec(fdat,F_ULER+LEN_ALIAS+5,2,crlf); -putrec(fdat,F_TIMESDLED,5,ultoa(f->timesdled,tmp,10)); -putrec(fdat,F_TIMESDLED+5,2,crlf); -putrec(fdat,F_OPENCOUNT,3,itoa(f->opencount,tmp,10)); -putrec(fdat,F_OPENCOUNT+3,2,crlf); -fdat[F_MISC]=f->misc+SP; -putrec(fdat,F_ALTPATH,2,hexplus(f->altpath,tmp)); -putrec(fdat,F_ALTPATH+2,2,crlf); -f->datoffset=l; -idx[0]=l&0xff; /* Get offset within DAT file for IXB file */ -idx[1]=(l>>8)&0xff; -idx[2]=(l>>16)&0xff; -lseek(file,l,SEEK_SET); -if(write(file,fdat,F_LEN)!=F_LEN) { - close(file); - return(0); } -length=filelength(file); -close(file); -if(length%F_LEN) - printf("ERR_LEN %s %lu\n",str,length); - -/*******************************************/ -/* Update last upload date/time stamp file */ -/*******************************************/ -sprintf(str,"%s%s.DAB",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_WRONLY|O_CREAT))==-1) - printf("ERR_OPEN %s\r\n",str); -else { - uldate=time(NULL); - write(file,&uldate,4); - close(file); } - -/************************/ -/* Add data to IXB File */ -/************************/ -strcpy(fname,f->name); -for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[i]=fname[i+1]; -sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_RDWR|O_CREAT))==-1) { - printf("ERR_OPEN %s\n",str); - return(0); } -length=filelength(file); -if(length) { /* IXB file isn't empty */ - if(length%F_IXBSIZE) { - close(file); - printf("ERR_LEN %s %lu\n",str,length); - return(0); } - if((ixbbuf=(char *)MALLOC(length))==NULL) { - close(file); - printf("ERR_ALLOC %s %lu\n",str,length); - return(0); } - if(lread(file,ixbbuf,length)!=length) { - close(file); - printf("ERR_READ %s %lu\n",str,length); - FREE((char *)ixbbuf); - return(0); } -/************************************************/ -/* Sort by Name or Date, Assending or Decending */ -/************************************************/ - if(dir[f->dir]->sort==SORT_NAME_A || dir[f->dir]->sort==SORT_NAME_D) { - for(l=0;l<length;l+=F_IXBSIZE) { - for(i=0;i<12 && fname[i]==ixbbuf[l+i];i++); - if(i==12) { /* file already in directory index */ - close(file); - printf("ERR_CHK %s\n",fname); - FREE((char *)ixbbuf); - return(0); } - if(dir[f->dir]->sort==SORT_NAME_A && fname[i]<ixbbuf[l+i]) - break; - if(dir[f->dir]->sort==SORT_NAME_D && fname[i]>ixbbuf[l+i]) - break; } } - else { /* sort by date */ - for(l=0;l<length;l+=F_IXBSIZE) { - uldate=(ixbbuf[l+15]|((long)ixbbuf[l+16]<<8) - |((long)ixbbuf[l+17]<<16)|((long)ixbbuf[l+18]<<24)); - if(dir[f->dir]->sort==SORT_DATE_A && f->dateuled>uldate) - break; - if(dir[f->dir]->sort==SORT_DATE_D && f->dateuled<uldate) - break; } } - lseek(file,l,SEEK_SET); - if(write(file,fname,11)!=11) { /* Write filename to IXB file */ - close(file); - FREE((char *)ixbbuf); - return(0); } - if(write(file,idx,3)!=3) { /* Write DAT offset into IXB file */ - close(file); - FREE((char *)ixbbuf); - return(0); } - write(file,&f->dateuled,sizeof(time_t)); - write(file,&f->datedled,4); /* Write 0 for datedled */ - if(lwrite(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */ - close(file); - FREE((char *)ixbbuf); - return(0); } - FREE((char *)ixbbuf); } -else { /* IXB file is empty... No files */ - if(write(file,fname,11)!=11) { /* Write filename it IXB file */ - close(file); - return(0); } - if(write(file,idx,3)!=3) { /* Write DAT offset into IXB file */ - close(file); - return(0); } - write(file,&f->dateuled,sizeof(time_t)); - write(file,&f->datedled,4); } -length=filelength(file); -close(file); -if(length%F_IXBSIZE) - printf("ERR_LEN %s %lu\n",str,length); -return(1); -} - -void putextdesc(uint dirnum, ulong datoffset, char *ext) -{ - char str[256],nulbuf[512]; - int file; - -sprintf(str,"%s%s.EXB",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_WRONLY|O_CREAT))==-1) - return; -lseek(file,0L,SEEK_END); -while(filelength(file)<(datoffset/F_LEN)*512L) - write(file,nulbuf,512); -lseek(file,(datoffset/F_LEN)*512L,SEEK_SET); -write(file,ext,512); -close(file); -} - -/****************************************************************************/ -/* Gets file data from dircode.IXB file */ -/* Need fields .name and .dir filled. */ -/* only fills .offset, .dateuled, and .datedled */ -/****************************************************************************/ -void getfileixb(file_t *f) -{ - uchar HUGE16 *ixbbuf,str[256],fname[128]; - int file; - ulong l,length; - -sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_RDONLY))==-1) { - printf("ERR_OPEN %s\n",str); - return; } -length=filelength(file); -if(length%F_IXBSIZE) { - close(file); - printf("ERR_LEN %s\n"); - return; } -if((ixbbuf=(uchar HUGE16 *)MALLOC(length))==NULL) { - close(file); - printf("ERR_ALLOC %s\n",str); - return; } -if(lread(file,ixbbuf,length)!=length) { - close(file); - FREE((char *)ixbbuf); - printf("ERR_READ %s\n",str); - return; } -close(file); -strcpy(fname,f->name); -for(l=8;l<12;l++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[l]=fname[l+1]; -for(l=0;l<length;l+=F_IXBSIZE) { - sprintf(str,"%11.11s",ixbbuf+l); - if(!strcmp(str,fname)) - break; } -if(l>=length) { - printf("getfileixb: ERR_CHK %s\n",fname); - FREE((char *)ixbbuf); - return; } -l+=11; -f->datoffset=ixbbuf[l]|((long)ixbbuf[l+1]<<8)|((long)ixbbuf[l+2]<<16); -f->dateuled=ixbbuf[l+3]|((long)ixbbuf[l+4]<<8) - |((long)ixbbuf[l+5]<<16)|((long)ixbbuf[l+6]<<24); -f->datedled=ixbbuf[l+7]|((long)ixbbuf[l+8]<<8) - |((long)ixbbuf[l+9]<<16)|((long)ixbbuf[l+10]<<24); -FREE((char *)ixbbuf); -} - -/****************************************************************************/ -/* Puts filedata into DIR_code.DAT file */ -/* Called from removefiles */ -/****************************************************************************/ -void putfiledat(file_t f) -{ - char buf[F_LEN+1],str[256]; - int file; - long length; - -putrec(buf,F_CDT,7,ultoa(f.cdt,tmp,10)); -putrec(buf,F_CDT+7,2,crlf); -putrec(buf,F_DESC,LEN_FDESC,f.desc); -putrec(buf,F_DESC+LEN_FDESC,2,crlf); -putrec(buf,F_ULER,LEN_ALIAS+5,f.uler); -putrec(buf,F_ULER+LEN_ALIAS+5,2,crlf); -putrec(buf,F_TIMESDLED,5,itoa(f.timesdled,tmp,10)); -putrec(buf,F_TIMESDLED+5,2,crlf); -putrec(buf,F_OPENCOUNT,3,itoa(f.opencount,tmp,10)); -putrec(buf,F_OPENCOUNT+3,2,crlf); -buf[F_MISC]=f.misc+SP; -putrec(buf,F_ALTPATH,2,hexplus(f.altpath,tmp)); -putrec(buf,F_ALTPATH+2,2,crlf); -sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_WRONLY))==-1) { - printf("ERR_OPEN %s\n",str); - return; } -length=filelength(file); -if(length%F_LEN) { - close(file); - printf("ERR_LEN %s\n",str); - return; } -if(f.datoffset>length) { - close(file); - printf("ERR_LEN %s\n",str); - return; } -lseek(file,f.datoffset,SEEK_SET); -if(write(file,buf,F_LEN)!=F_LEN) { - close(file); - printf("ERR_WRITE %s\n",str); - return; } -length=filelength(file); -close(file); -if(length%F_LEN) - printf("ERR_LEN %s\n",str); -} - -/****************************************************************************/ -/* Update the upload date for the file 'f' */ -/****************************************************************************/ -void update_uldate(file_t f) -{ - char str[256],fname[128]; - int i,file; - long l,length; - -/*******************/ -/* Update IXB File */ -/*******************/ -sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_RDWR))==-1) { - printf("ERR_OPEN %s\n",str); - return; } -length=filelength(file); -if(length%F_IXBSIZE) { - close(file); - printf("ERR_LEN %s\n",str); - return; } -strcpy(fname,f.name); -for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[i]=fname[i+1]; -for(l=0;l<length;l+=F_IXBSIZE) { - read(file,str,F_IXBSIZE); /* Look for the filename in the IXB file */ - str[11]=0; - if(!strcmp(fname,str)) break; } -if(l>=length) { - close(file); - printf("ERR_CHK %s\n",f.name); - return; } -lseek(file,l+14,SEEK_SET); -write(file,&f.dateuled,4); /* Write the current time stamp for datedled */ -close(file); - -/*******************************************/ -/* Update last upload date/time stamp file */ -/*******************************************/ -sprintf(str,"%s%s.DAB",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_WRONLY|O_CREAT))==-1) - printf("ERR_OPEN %s\r\n",str); -else { - write(file,&f.dateuled,4); - close(file); } - -} - - -void strip_ctrl(char *str) -{ - char tmp[1024]; - int i,j,k; - -k=strlen(str); -for(i=j=0;i<k;i++) - if(j && str[i]==SP && tmp[j-1]==SP && (mode&KEEP_SPACE)) - tmp[j++]=str[i]; - else if(j && str[i]<=SP && tmp[j-1]==SP) - continue; - else if(i && !isalnum(str[i]) && str[i]==str[i-1]) - continue; - else if((uchar)str[i]>=SP) - tmp[j++]=str[i]; - else if(str[i]==TAB || (str[i]==CR && str[i+1]==LF)) - tmp[j++]=SP; -tmp[j]=0; -strcpy(str,tmp); -} - - -void strip_exascii(char *str) -{ - char tmp[1024]; - int i,j,k; - -k=strlen(str); -for(i=j=0;i<k;i++) - if(!(str[i]&0x80)) - tmp[j++]=str[i]; -tmp[j]=0; -strcpy(str,tmp); -} - -/****************************************************************************/ -/* Updates dstst.dab file */ -/****************************************************************************/ -void updatestats(ulong size) -{ - char str[256]; - int i,file; - ulong l; - -sprintf(str,"%sDSTS.DAB",ctrl_dir); -if((file=nopen(str,O_RDWR))==-1) { - printf("ERR_OPEN %s\n",str); - return; } -lseek(file,20L,SEEK_SET); /* Skip timestamp, logons and logons today */ -read(file,&l,4); /* Uploads today */ -l++; -lseek(file,-4L,SEEK_CUR); -write(file,&l,4); -read(file,&l,4); /* Upload bytes today */ -l+=size; -lseek(file,-4L,SEEK_CUR); -write(file,&l,4); -close(file); -} - -void addlist(char *inpath, file_t f, char dskip, char sskip) -{ - uchar str[256],fname[256],listpath[256],filepath[256] - ,curline[256],nextline[256],*p,exist,ext[1024],tmpext[513]; - int i,file; - long l; - FILE *stream; - struct find_t ff; - -if(mode&SEARCH_DIR) { - strcpy(str,cur_altpath ? altpath[cur_altpath-1] : dir[f.dir]->path); - if(str[0]=='.') { - sprintf(tmp,"%s%s",node_dir,str); - strcpy(str,tmp); } - strcat(str,"*.*"); - printf("Searching %s\n\n",str); - for(i=_dos_findfirst(str,0,&ff);!i;i=_dos_findnext(&ff)) { - strupr(ff.name); - sprintf(filepath,"%s%s",cur_altpath ? altpath[cur_altpath-1] - : dir[f.dir]->path,ff.name); - if(filepath[0]=='.') { /* relative path */ - sprintf(tmp,"%s%s",node_dir,filepath); - strcpy(filepath,tmp); } - f.misc=0; - f.desc[0]=0; - f.cdt=flength(filepath); - padfname(ff.name,f.name); - printf("%s %10lu %s\n" - ,f.name,f.cdt,unixtodstr(fdate(filepath),str)); - exist=findfile(f.dir,f.name); - if(exist) { - if(mode&NO_UPDATE) - continue; - getfileixb(&f); - if(mode&ULDATE_ONLY) { - f.dateuled=time(NULL); - update_uldate(f); - continue; } } - - if(mode&FILE_DATE) { /* get the file date and put into desc */ - unixtodstr(fdate(filepath),f.desc); - strcat(f.desc," "); } - - if(mode&TODAYS_DATE) { /* put today's date in desc */ - unixtodstr(time(NULL),f.desc); - strcat(f.desc," "); } - - if(mode&FILE_ID) { - for(i=0;i<total_fextrs;i++) - if(!stricmp(fextr[i]->ext,f.name+9)) - break; - if(i<total_fextrs) { - sprintf(tmp,"%sFILE_ID.DIZ",temp_dir); - remove(tmp); - system(cmdstr(fextr[i]->cmd,filepath,"FILE_ID.DIZ",NULL)); - if(!fexist(tmp)) { - sprintf(tmp,"%sDESC.SDI",temp_dir); - remove(tmp); - system(cmdstr(fextr[i]->cmd,filepath,"DESC.SDI",NULL)); } - if((file=nopen(tmp,O_RDONLY))!=-1) { - memset(ext,0,513); - read(file,ext,512); - for(i=512;i;i--) - if(ext[i-1]>SP) - break; - ext[i]=0; - if(mode&ASCII_ONLY) - strip_exascii(ext); - if(!(mode&KEEP_DESC)) { - sprintf(tmpext,"%.256s",ext); - strip_ctrl(tmpext); - for(i=0;tmpext[i];i++) - if(isalpha(tmpext[i])) - break; - sprintf(f.desc,"%.*s",LEN_FDESC,tmpext+i); - for(i=0;f.desc[i]>=SP && i<LEN_FDESC;i++) - ; - f.desc[i]=0; } - close(file); - f.misc|=FM_EXTDESC; } } } - - f.dateuled=time(NULL); - f.altpath=cur_altpath; - strip_ctrl(f.desc); - if(mode&ASCII_ONLY) - strip_exascii(f.desc); - if(exist) { - putfiledat(f); - if(!(mode&NO_NEWDATE)) - update_uldate(f); } - else - addfiledat(&f); - if(f.misc&FM_EXTDESC) { - truncsp(ext); - putextdesc(f.dir,f.datoffset,ext); } - - if(mode&UL_STATS) - updatestats(f.cdt); - files++; } -#ifdef __WATCOMC__ - _dos_findclose(&ff); -#endif - return; } - - -strcpy(listpath,inpath); -if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) { - sprintf(listpath,"%s%s",cur_altpath ? altpath[cur_altpath-1] - : dir[f.dir]->path,inpath); - if(listpath[0]=='.') { /* relative path */ - sprintf(str,"%s%s",node_dir,listpath); - strcpy(listpath,str); } - if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) { - printf("Can't open: %s\n" - " or: %s\n",inpath,listpath); - return; } } - -printf("Adding %s to %s %s\n\n" - ,listpath,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname); - -fgets(nextline,255,stream); -while(!feof(stream) && !ferror(stream)) { - f.misc=0; - f.desc[0]=0; - strcpy(curline,nextline); - nextline[0]=0; - fgets(nextline,255,stream); - truncsp(curline); - if(curline[0]<=SP || (uchar)curline[0]>=0x7e) - continue; - printf("%s\n",curline); - strcpy(fname,curline); - - p=strchr(fname,'.'); - if(!p || p==fname || p>fname+8) /* no dot or invalid dot location */ - continue; - p=strchr(p,SP); - if(p) *p=0; - else /* no space after filename? */ - continue; - strupr(fname); - strcpy(fname,unpadfname(fname,tmp)); - - padfname(fname,f.name); - if(strcspn(f.name,"\\/|<>+[]:=\";,")!=strlen(f.name)) - continue; - - for(i=0;i<12;i++) - if(f.name[i]<SP || (uchar)f.name[i]>0x7e) - break; - - if(i<12) /* Ctrl chars or EX-ASCII in filename? */ - continue; - exist=findfile(f.dir,f.name); - if(exist) { - if(mode&NO_UPDATE) - continue; - getfileixb(&f); - if(mode&ULDATE_ONLY) { - f.dateuled=time(NULL); - update_uldate(f); - continue; } } - - sprintf(filepath,"%s%s",cur_altpath ? altpath[cur_altpath-1] - : dir[f.dir]->path,fname); - if(filepath[0]=='.') { /* relative path */ - sprintf(tmp,"%s%s",node_dir,filepath); - strcpy(filepath,tmp); } - - if(mode&FILE_DATE) { /* get the file date and put into desc */ - l=fdate(filepath); - unixtodstr(l,f.desc); - strcat(f.desc," "); } - - if(mode&TODAYS_DATE) { /* put today's date in desc */ - l=time(NULL); - unixtodstr(l,f.desc); - strcat(f.desc," "); } - - if(dskip && strlen(curline)>=dskip) p=curline+dskip; - else { - p++; - while(*p==SP) p++; } - sprintf(tmp,"%.*s",LEN_FDESC-strlen(f.desc),p); - strcat(f.desc,tmp); - - if(nextline[0]==SP || strlen(p)>LEN_FDESC) { /* ext desc */ - if(!(mode&NO_EXTEND)) { - memset(ext,0,513); - f.misc|=FM_EXTDESC; - sprintf(ext,"%s\r\n",p); } - - if(nextline[0]==SP) { - strcpy(str,nextline); /* tack on to end of desc */ - p=str+dskip; - i=LEN_FDESC-strlen(f.desc); - if(i>1) { - p[i-1]=0; - truncsp(p); - if(p[0]) { - strcat(f.desc," "); - strcat(f.desc,p); } } } - - while(!feof(stream) && !ferror(stream) && strlen(ext)<512) { - if(nextline[0]!=SP) - break; - truncsp(nextline); - printf("%s\n",nextline); - if(!(mode&NO_EXTEND)) { - f.misc|=FM_EXTDESC; - p=nextline+dskip; - while(*p==SP) p++; - strcat(ext,p); - strcat(ext,"\r\n"); } - nextline[0]=0; - fgets(nextline,255,stream); } } - - - if(sskip) l=atol(fname+sskip); - else { - l=flength(filepath); - if(l<1L) { - printf("%s not found.\n",filepath); - continue; } } - - if(mode&FILE_ID) { - for(i=0;i<total_fextrs;i++) - if(!stricmp(fextr[i]->ext,f.name+9)) - break; - if(i<total_fextrs) { - sprintf(tmp,"%sFILE_ID.DIZ",temp_dir); - remove(tmp); - system(cmdstr(fextr[i]->cmd,filepath,"FILE_ID.DIZ",NULL)); - if(!fexist(tmp)) { - sprintf(tmp,"%sDESC.SDI",temp_dir); - remove(tmp); - system(cmdstr(fextr[i]->cmd,filepath,"DESC.SDI",NULL)); } - if((file=nopen(tmp,O_RDONLY))!=-1) { - memset(ext,0,513); - read(file,ext,512); - for(i=512;i;i--) - if(ext[i-1]>SP) - break; - ext[i]=0; - if(mode&ASCII_ONLY) - strip_exascii(ext); - if(!(mode&KEEP_DESC)) { - sprintf(tmpext,"%.256s",ext); - strip_ctrl(tmpext); - for(i=0;tmpext[i];i++) - if(isalpha(tmpext[i])) - break; - sprintf(f.desc,"%.*s",LEN_FDESC,tmpext+i); - for(i=0;f.desc[i]>=SP && i<LEN_FDESC;i++) - ; - f.desc[i]=0; } - close(file); - f.misc|=FM_EXTDESC; } } } - - f.cdt=l; - f.dateuled=time(NULL); - f.altpath=cur_altpath; - strip_ctrl(f.desc); - if(mode&ASCII_ONLY) - strip_exascii(f.desc); - if(exist) { - putfiledat(f); - if(!(mode&NO_NEWDATE)) - update_uldate(f); } - else - addfiledat(&f); - if(f.misc&FM_EXTDESC) { - truncsp(ext); - putextdesc(f.dir,f.datoffset,ext); } - - if(mode&UL_STATS) - updatestats(l); - files++; } -fclose(stream); -if(mode&DEL_LIST && !(mode&SYNC_LIST)) { - printf("\nDeleting %s\n",listpath); - remove(listpath); } - -} - -/***********************/ -/* Hex-plus to integer */ -/***********************/ -uint hptoi(char *str) -{ - char tmp[128]; - uint i; - -if(!str[1] || toupper(str[0])<='F') - return(strtol(str,0,16)); -strcpy(tmp,str); -tmp[0]='F'; -i=strtol(tmp,0,16)+((toupper(str[0])-'F')*0x10); -return(i); -} - -/****************************************************************************/ -/* Places into 'strout' CR or ETX terminated string starting at */ -/* 'start' and ending at 'start'+'length' or terminator from 'strin' */ -/****************************************************************************/ -void getrec(char *strin,int start,int length,char *strout) -{ - int i=0,stop; - -stop=start+length; -while(start<stop) { - if(strin[start]==ETX) - break; - strout[i++]=strin[start++]; } -strout[i]=0; -} - - -/****************************************************************************/ -/* Gets filedata from dircode.DAT file */ -/* Need fields .name ,.dir and .offset to get other info */ -/* Does not fill .dateuled or .datedled fields. */ -/****************************************************************************/ -void getfiledat(file_t *f) -{ - char buf[F_LEN+1],str[256]; - int file; - long length; - -sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_RDONLY))==-1) { - printf("ERR_OPEN %s\n",str); - return; } -length=filelength(file); -if(f->datoffset>length) { - close(file); - printf("ERR_LEN %s %lu\n",str,length); - return; } -if(length%F_LEN) { - close(file); - printf("ERR_LEN %s %lu\n",str,length); - return; } -lseek(file,f->datoffset,SEEK_SET); -if(read(file,buf,F_LEN)!=F_LEN) { - close(file); - printf("ERR_READ %s %lu\n",str,F_LEN); - return; } -close(file); -getrec(buf,F_ALTPATH,2,str); -f->altpath=hptoi(str); -getrec(buf,F_CDT,7,str); -f->cdt=atol(str); -f->timetodl=0; - -getrec(buf,F_DESC,LEN_FDESC,f->desc); -getrec(buf,F_ULER,LEN_ALIAS,f->uler); -getrec(buf,F_TIMESDLED,5,str); -f->timesdled=atoi(str); -getrec(buf,F_OPENCOUNT,3,str); -f->opencount=atoi(str); -if(buf[F_MISC]!=ETX) - f->misc=buf[F_MISC]-SP; -else - f->misc=0; -} - -/****************************************************************************/ -/* Removes any files in the user transfer index (XFER.IXT) that match the */ -/* specifications of dest, or source user, or filename or any combination. */ -/****************************************************************************/ -void rmuserxfers(int fromuser, int destuser, char *fname) -{ - char str[256],*ixtbuf; - int file; - long l,length; - -sprintf(str,"%sXFER.IXT",data_dir); -if(!fexist(str)) - return; -if(!flength(str)) { - remove(str); - return; } -if((file=nopen(str,O_RDONLY))==-1) { - printf("ERR_OPEN %s\n",str); - return; } -length=filelength(file); -if((ixtbuf=(char *)MALLOC(length))==NULL) { - close(file); - printf("ERR_ALLOC %s\n",str,length); - return; } -if(read(file,ixtbuf,length)!=length) { - close(file); - FREE(ixtbuf); - printf("ERR_READ %s %lu\n",str,length); - return; } -close(file); -if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) { - FREE(ixtbuf); - printf("ERR_OPEN %s\n",str); - return; } -for(l=0;l<length;l+=24) { - if(fname!=NULL && fname[0]) { /* fname specified */ - if(!strncmp(ixtbuf+l+5,fname,12)) { /* this is the file */ - if(destuser && fromuser) { /* both dest and from user */ - if(atoi(ixtbuf+l)==destuser && atoi(ixtbuf+l+18)==fromuser) - continue; } /* both match */ - else if(fromuser) { /* from user */ - if(atoi(ixtbuf+l+18)==fromuser) /* matches */ - continue; } - else if(destuser) { /* dest user */ - if(atoi(ixtbuf+l)==destuser) /* matches */ - continue; } - else continue; } } /* no users, so match */ - else if(destuser && fromuser) { - if(atoi(ixtbuf+l+18)==fromuser && atoi(ixtbuf+l)==destuser) - continue; } - else if(destuser && atoi(ixtbuf+l)==destuser) - continue; - else if(fromuser && atoi(ixtbuf+l+18)==fromuser) - continue; - write(file,ixtbuf+l,24); } -close(file); -FREE(ixtbuf); -} - - - -/****************************************************************************/ -/* Removes DAT and IXB entries for the file in the struct 'f' */ -/****************************************************************************/ -void removefiledat(file_t f) -{ - char c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13]; - int file; - ulong l,length; - -strcpy(fname,f.name); -for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[c]=fname[c+1]; -sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_RDONLY))==-1) { - printf("ERR_OPEN %s\n",str); - return; } -length=filelength(file); -if(!length) { - close(file); - return; } -if((ixbbuf=(char *)MALLOC(length))==0) { - close(file); - printf("ERR_ALLOC %s %lu\n",str,length); - return; } -if(lread(file,ixbbuf,length)!=length) { - close(file); - printf("ERR_READ %s %lu\n",str,length); - FREE((char *)ixbbuf); - return; } -close(file); -if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) { - printf("ERR_OPEN %s\n",str); - return; } -for(l=0;l<length;l+=F_IXBSIZE) { - for(c=0;c<11;c++) - ixbname[c]=ixbbuf[l+c]; - ixbname[c]=0; - if(strcmp(ixbname,fname)) - if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) { - close(file); - printf("ERR_WRITE %s %lu\n",str,F_IXBSIZE); - FREE((char *)ixbbuf); - return; } } -FREE((char *)ixbbuf); -close(file); -sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_WRONLY))==-1) { - printf("ERR_OPEN %s\n",str); - return; } -lseek(file,f.datoffset,SEEK_SET); -c=ETX; /* If first char of record is ETX, record is unused */ -if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */ - close(file); - printf("ERR_WRITE %s 1",str); - return; } -close(file); -if(f.dir==user_dir) /* remove file from index */ - rmuserxfers(0,0,f.name); - -} - - -void synclist(char *inpath, int dirnum) -{ - uchar str[1024],fname[256],listpath[256], HUGE16 *ixbbuf,*p; - int i,file,found; - long l,m,length; - FILE *stream; - file_t f; - -sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_RDONLY))==-1) { - printf("ERR_OPEN %s\n",str); - return; } -length=filelength(file); -if(length%F_IXBSIZE) { - close(file); - printf("ERR_LEN %s\n"); - return; } -if((ixbbuf=(uchar HUGE16 *)MALLOC(length))==NULL) { - close(file); - printf("ERR_ALLOC %s\n",str); - return; } -if(lread(file,ixbbuf,length)!=length) { - close(file); - FREE((char *)ixbbuf); - printf("ERR_READ %s\n",str); - return; } -close(file); - -strcpy(listpath,inpath); -if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) { - sprintf(listpath,"%s%s",cur_altpath ? altpath[cur_altpath-1] - : dir[dirnum]->path,inpath); - if(listpath[0]=='.') { /* relative path */ - sprintf(str,"%s%s",node_dir,listpath); - strcpy(listpath,str); } - if((stream=fnopen(&file,listpath,O_RDONLY))==NULL) { - printf("Can't open: %s\n" - " or: %s\n",inpath,listpath); - return; } } - -printf("\nSynchronizing %s with %s %s\n\n" - ,listpath,lib[dir[dirnum]->lib]->sname,dir[dirnum]->sname); - -for(l=0;l<length;l+=F_IXBSIZE) { - m=l; - for(i=0;i<12 && l<length;i++) - if(i==8) - str[i]='.'; - else - str[i]=ixbbuf[m++]; /* Turns FILENAMEEXT into FILENAME.EXT */ - str[i]=0; - unpadfname(str,fname); - rewind(stream); - found=0; - while(!found) { - if(!fgets(str,1000,stream)) - break; - truncsp(str); - p=strchr(str,SP); - if(p) *p=0; - if(!stricmp(str,fname)) - found=1; } - if(found) - continue; - padfname(fname,f.name); - printf("%s not found in list - ",f.name); - f.dir=dirnum; - f.datoffset=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16); - getfiledat(&f); - if(f.opencount) { - printf("currently OPEN by %u users\n",f.opencount); - continue; } - removefiledat(f); - sprintf(str,"%s%s" - ,f.altpath>0 && f.altpath<=altpaths ? altpath[f.altpath-1] - : dir[f.dir]->path,fname); - if(str[0]=='.') { - sprintf(tmp,"%s%s",node_dir,str); - strcpy(str,tmp); } - if(remove(str)) - printf("Error removing %s\n",str); - removed++; - printf("Removed from database\n"); } - -if(mode&DEL_LIST) { - printf("\nDeleting %s\n",listpath); - remove(listpath); } -} - -char *usage="\nusage: addfiles code [.alt_path] [/opts] [\"*user\"] +list " - "[desc_off] [size_off]" - "\n or: addfiles code [.alt_path] [/opts] [\"*user\"] file " - "\"description\"\n" - "\navailable opts:" - "\n a import ASCII only (no extended ASCII)" - "\n b synchronize database with file list (use with caution)" - "\n c do not remove extra spaces from file description" - "\n d delete list after import" - "\n e do not import extended descriptions" - "\n f include file date in descriptions" - "\n t include today's date in descriptions" - "\n i include added files in upload statistics" - "\n n do not update information for existing files" - "\n o update upload date only for existing files" - "\n u do not update upload date for existing files" - "\n z check for and import FILE_ID.DIZ and DESC.SDI" - "\n k keep original short description (not DIZ)" - "\n s search directory for files (no file list)" - "\n" - "\nAuto-ADD: use * in place of code for Auto-ADD of FILES.BBS" - "\n use *filename to Auto-ADD a different filename" - "\n" - ; - -/*********************/ -/* Entry point (duh) */ -/*********************/ -int main(int argc, char **argv) -{ - uchar str[256],str2[256],*p,exist,listgiven=0,namegiven=0,ext[513] - ,auto_name[13]="FILES.BBS"; - int i,j,k,file; - long l; - read_cfg_text_t txt; - file_t f; - -putenv("TZ=UCT0"); -_fmode=O_BINARY; -setvbuf(stdout,NULL,_IONBF,0); - -fprintf(stderr,"\nADDFILES Version %s (%s) - Adds files to Synchronet " - "Filebase\n" - ,ADDFILES_VER -#if defined(__OS2__) - ,"OS/2" -#elif defined(__NT__) - ,"Win32" -#elif defined(__DOS4G__) - ,"DOS4G" -#elif defined(__FLAT__) - ,"DOS32" -#else - ,"DOS16" -#endif - ); - -if(argc<2) { - printf(usage); - return(1); } - -p=getenv("SBBSNODE"); -if(p==NULL) { - printf("\nSBBSNODE environment variable not set.\n"); - printf("\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n"); - exit(1); } - -putenv("TZ=UCT0"); - -strcpy(node_dir,p); -if(node_dir[strlen(node_dir)-1]!='\\') - strcat(node_dir,"\\"); - -txt.openerr="\7\nError opening %s for read.\n"; -txt.reading="\nReading %s..."; -txt.readit="\rRead %s "; -txt.allocerr="\7\nError allocating %u bytes of memory\n"; -txt.error="\7\nERROR: Offset %lu in %s\r\n\n"; - -read_node_cfg(txt); -if(ctrl_dir[0]=='.') { /* Relative path */ - strcpy(str,ctrl_dir); - sprintf(ctrl_dir,"%s%s",node_dir,str); } -read_main_cfg(txt); -if(data_dir[0]=='.') { /* Relative path */ - strcpy(str,data_dir); - sprintf(data_dir,"%s%s",node_dir,str); } -if(temp_dir[1]!=':' && temp_dir[0]!='\\') { - strcpy(str,temp_dir); - sprintf(temp_dir,"%s%s",node_dir,str); } -read_file_cfg(txt); -printf("\n\n"); - -if(argv[1][0]=='*') { - if(argv[1][1]) - sprintf(auto_name,"%.12s",argv[1]+1); - mode|=AUTO_ADD; - i=0; } -else { - for(i=0;i<total_dirs;i++) - if(!stricmp(dir[i]->code,argv[1])) - break; - - if(i>=total_dirs) { - printf("Directory code '%s' not found.\n",argv[1]); - exit(1); } } - -memset(&f,0,sizeof(file_t)); -f.dir=i; -strcpy(f.uler,"-> ADDFILES <-"); - -for(j=2;j<argc;j++) { - if(argv[j][0]=='*') /* set the uploader name */ - sprintf(f.uler,"%.25s",argv[j]+1); - else if(argv[j][0]=='/') { /* options */ - for(i=1;i<strlen(argv[j]);i++) - switch(toupper(argv[j][i])) { - case 'A': - mode|=ASCII_ONLY; - break; - case 'B': - mode|=(SYNC_LIST|NO_UPDATE); - break; - case 'C': - mode|=KEEP_SPACE; - break; - case 'D': - mode|=DEL_LIST; - break; - case 'E': - mode|=NO_EXTEND; - break; - case 'I': - mode|=UL_STATS; - break; - case 'Z': - mode|=FILE_ID; - break; - case 'K': - mode|=KEEP_DESC; /* Don't use DIZ for short desc */ - break; - case 'N': - mode|=NO_UPDATE; - break; - case 'O': - mode|=ULDATE_ONLY; - break; - case 'U': - mode|=NO_NEWDATE; - break; - case 'F': - mode|=FILE_DATE; - break; - case 'T': - mode|=TODAYS_DATE; - break; - case 'S': - mode|=SEARCH_DIR; - break; - default: - printf(usage); - return(1); } } - else if(argv[j][0]=='+') { /* filelist - FILES.BBS */ - listgiven=1; - if(isdigit(argv[j+1][0])) { /* skip x characters before description */ - if(isdigit(argv[j+2][0])) { /* skip x characters before size */ - addlist(argv[j]+1,f,atoi(argv[j+1]),atoi(argv[j+2])); - j+=2; } - else { - addlist(argv[j]+1,f,atoi(argv[j+1]),0); - j++; } } - else - addlist(argv[j]+1,f,0,0); - if(mode&SYNC_LIST) - synclist(argv[j]+1,f.dir); } - else if(argv[j][0]=='.') { /* alternate file path */ - cur_altpath=atoi(argv[j]+1); - if(cur_altpath>altpaths) { - printf("Invalid alternate path.\n"); - exit(1); } } - else { - namegiven=1; - padfname(argv[j],f.name); - f.desc[0]=0; - strupr(f.name); - if(j+1==argc) { - printf("%s no description given.\n",f.name); - continue; } - sprintf(str,"%s%s",cur_altpath ? altpath[cur_altpath-1] - : dir[f.dir]->path,argv[j]); - if(str[0]=='.') { - sprintf(tmp,"%s%s",node_dir,str); - strcpy(str,tmp); } - if(mode&FILE_DATE) - sprintf(f.desc,"%s ",unixtodstr(fdate(str),tmp)); - if(mode&TODAYS_DATE) - sprintf(f.desc,"%s ",unixtodstr(time(NULL),tmp)); - sprintf(tmp,"%.*s",LEN_FDESC-strlen(f.desc),argv[++j]); - strcpy(f.desc,tmp); - l=flength(str); - if(l==-1) { - printf("%s not found.\n",str); - continue; } - exist=findfile(f.dir,f.name); - if(exist) { - if(mode&NO_UPDATE) - continue; - getfileixb(&f); - if(mode&ULDATE_ONLY) { - f.dateuled=time(NULL); - update_uldate(f); - continue; } } - f.cdt=l; - f.dateuled=time(NULL); - f.altpath=cur_altpath; - strip_ctrl(f.desc); - if(mode&ASCII_ONLY) - strip_exascii(f.desc); - printf("%s %7lu %s\n",f.name,f.cdt,f.desc); - if(mode&FILE_ID) { - for(i=0;i<total_fextrs;i++) - if(!stricmp(fextr[i]->ext,f.name+9)) - break; - if(i<total_fextrs) { - sprintf(tmp,"%sFILE_ID.DIZ",temp_dir); - remove(tmp); - system(cmdstr(fextr[i]->cmd,str,"FILE_ID.DIZ",NULL)); - if(!fexist(tmp)) { - sprintf(tmp,"%sDESC.SDI",temp_dir); - remove(tmp); - system(cmdstr(fextr[i]->cmd,str,"DESC.SDI",NULL)); } - if((file=nopen(tmp,O_RDONLY))!=-1) { - memset(ext,0,513); - read(file,ext,512); - if(!(mode&KEEP_DESC)) { - sprintf(f.desc,"%.*s",LEN_FDESC,ext); - for(i=0;f.desc[i]>=SP && i<LEN_FDESC;i++) - ; - f.desc[i]=0; } - close(file); - f.misc|=FM_EXTDESC; } } } - if(exist) { - putfiledat(f); - if(!(mode&NO_NEWDATE)) - update_uldate(f); } - else - addfiledat(&f); - - if(f.misc&FM_EXTDESC) - putextdesc(f.dir,f.datoffset,ext); - - if(mode&UL_STATS) - updatestats(l); - files++; } } - -if(mode&AUTO_ADD) { - for(i=0;i<total_dirs;i++) { - if(dir[i]->misc&DIR_NOAUTO) - continue; - f.dir=i; - if(mode&SEARCH_DIR) { - addlist("",f,0,0); - continue; } - sprintf(str,"%s.LST",dir[f.dir]->code); - if(flength(str)>0L) { - printf("Auto-adding %s\n",str); - addlist(str,f,0,0); - if(mode&SYNC_LIST) - synclist(str,i); - continue; } - sprintf(str,"%s%s",dir[f.dir]->path,auto_name); - if(str[0]=='.') { - sprintf(tmp,"%s%s",node_dir,str); - strcpy(str,tmp); } - if(flength(str)>0L) { - printf("Auto-adding %s\n",str); - addlist(str,f,0,0); - if(mode&SYNC_LIST) - synclist(str,i); - continue; } } } - -else { - if(!listgiven && !namegiven) { - sprintf(str,"%s.LST",dir[f.dir]->code); - if(flength(str)<=0L) - strcpy(str,"FILES.BBS"); - addlist(str,f,0,0); - if(mode&SYNC_LIST) - synclist(str,f.dir); } } - -printf("\n%lu file(s) added.",files); -if(removed) - printf("\n%lu files(s) removed.",removed); -printf("\n"); -return(0); -} - diff --git a/src/sbbs2/addfiles/makeall.bat b/src/sbbs2/addfiles/makeall.bat deleted file mode 100755 index d68900c3d3..0000000000 --- a/src/sbbs2/addfiles/makeall.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -wmake OS=DOS %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=DOSX %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=OS2 %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=NT %1 %2 %3 %4 %5 -if errorlevel 1 goto end -:end - diff --git a/src/sbbs2/addfiles/makefile b/src/sbbs2/addfiles/makefile deleted file mode 100644 index f83c75e37a..0000000000 --- a/src/sbbs2/addfiles/makefile +++ /dev/null @@ -1,89 +0,0 @@ -############################################ -# Makefile for Synchronet ADDFILES Utility # -# For use with Watcom C/C++ # -############################################ - -!ifndef OS -OS = DOS -!endif - -!ifeq OS DOS -CC = *wcc -!else -CC = *wcc386 -!endif - -LD = *wlink -INCLUDE = \watcom\h;\watcom\h\os2;..;..\smb;..\rio - - -!ifeq OS DOS -CFLAGS = -I$(INCLUDE) -s -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -ml -!else -CFLAGS = -I$(INCLUDE) -s -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -!endif - -!ifeq OS DOS -SYSTEM = DOS -!endif -!ifeq OS OS2 -SYSTEM = OS2V2 -!endif -!ifeq OS DOSX -SYSTEM = DOS4G -!endif -!ifeq OS NT -SYSTEM = NT -!endif - -LFLAGS = option stack=16k system $(SYSTEM) - -MAIN = $(OS)\addfiles.exe -OBJS = $(OS)\addfiles.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj & - $(OS)\ars.obj $(OS)\scfglib2.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\gen_defs.h ..\scfgvars.c - -# Implicit C Compile Rule -.c.obj: - @echo Compiling (I) $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... - $(LD) $(LFLAGS) file { $(OBJS) } - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# ARS -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Shared Functions -$(OS)\scfglib1.obj: ..\scfglib1.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) & --DNO_MSGS_CFG & --DNO_TEXT_CFG & --DNO_XTRN_CFG & --DNO_CMDS_CFG & --DNO_CHAT_CFG & -$[@ - -# Shared Functions -$(OS)\scfglib2.obj: ..\scfglib2.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) & --DNO_MSGS_CFG & --DNO_TEXT_CFG & --DNO_XTRN_CFG & --DNO_CMDS_CFG & --DNO_CHAT_CFG & -$[@ - diff --git a/src/sbbs2/addfiles/makefile.bc b/src/sbbs2/addfiles/makefile.bc deleted file mode 100644 index 892ff8a196..0000000000 --- a/src/sbbs2/addfiles/makefile.bc +++ /dev/null @@ -1,76 +0,0 @@ -############################################ -# Makefile for Synchronet ADDFILES Utility # -# For use with Borland C++ for DOS or OS/2 # -############################################ - -# Macros -CC = bcc -LD = tlink -!ifdef __OS2__ -OS = OS2 -INCLUDE = c:\bcos2\include;..;..\smb;..\rio -LIB = c:\bcos2\lib -CFLAGS = -N -d -C -I$(INCLUDE) -LFLAGS = -c -!else -OS = DOS -INCLUDE = \bc31\include;..;..\smb;..\rio -LIB = \bc31\lib -MODEL = l -CFLAGS = -N -d -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = -n -c -!endif -MAIN = $(OS)\addfiles.exe -OBJS = $(OS)\addfiles.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj \ - $(OS)\scfglib2.obj $(OS)\ars.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\gen_defs.h ..\scfgvars.c - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL).obj $(OBJS) -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# ARS -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Shared Functions -$(OS)\scfglib1.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib1.c ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_MSGS_CFG --DNO_TEXT_CFG --DNO_XTRN_CFG --DNO_CMDS_CFG --DNO_CHAT_CFG -! ..\$&.c - -# Shared Functions -$(OS)\scfglib2.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib2.c ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_MSGS_CFG --DNO_TEXT_CFG --DNO_XTRN_CFG --DNO_CMDS_CFG --DNO_CHAT_CFG -! ..\$&.c diff --git a/src/sbbs2/allusers/allusers.c b/src/sbbs2/allusers/allusers.c deleted file mode 100644 index f64638bb23..0000000000 --- a/src/sbbs2/allusers/allusers.c +++ /dev/null @@ -1,367 +0,0 @@ -/* ALLUSERS.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/****************************************************************************/ -/* Makes global changes to Synchronet user database (USER.DAT) */ -/* Compatible with Version 2.1 of Synchronet BBS Software */ -/****************************************************************************/ - -#include <io.h> -#include <share.h> -#include <stdio.h> -#include <fcntl.h> -#include <errno.h> -#include <stdlib.h> -#include <sys/stat.h> - -#include "sbbsdefs.h" - -int min=0,max=99; -long reqflags[4]={0},reqrest=0,reqexempt=0; - -char *usage= -"\nusage: allusers [data\\user path] [[-require] [...]] " - "/modify [[/modify] [...]]\n" -"\nwhere require is one of:\n" -" L# set minimum level to # (default=0)\n" -" M# set maximum level to # (default=99)\n" -" F#<flags> set required flags from flag set #\n" -" E<flags> set required exemptions\n" -" R<flags> set required restrictions\n" -"\nwhere modify is one of:\n" -" L# change security level to #\n" -" F#[+|-]<flags> add or remove flags from flag set #\n" -" E[+|-]<flags> add or remove exemption flags\n" -" R[+|-]<flags> add or remove restriction flags\n" -"\nExamples:\n" -" ALLUSERS -L30 /FA add 'A' to flag set #1 for all level 30+ users\n" -" ALLUSERS /F3-G remove 'G' from flag set #3 for all users\n" -" ALLUSERS -F2B /E-P remove 'P' exemption for all users with FLAG '2B'\n" -" ALLUSERS /R+W add 'W' restriction for all users\n" -; - -/****************************************************************************/ -/* Attempts to lock a user record, retries for up to 10 seconds */ -/* Returns 0 on success, -1 on failure */ -/****************************************************************************/ -int lockuser(FILE *stream, ulong offset) -{ - time_t start; - -if(lock(fileno(stream),offset,U_LEN)==0) - return(0); -start=time(NULL); -while(1) { - if(lock(fileno(stream),offset,U_LEN)==0) - return(0); - if(time(NULL)-start>=10L) - break; } -return(-1); -} - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Returns bytes offset into user record for flag set # 'set' */ -/****************************************************************************/ -long getflagoff(int set) -{ -switch(set) { - default: - return(U_FLAGS1); - case 2: - return(U_FLAGS2); - case 3: - return(U_FLAGS3); - case 4: - return(U_FLAGS4); } -} - -/****************************************************************************/ -/* Checks a user record against the requirements set on the command line */ -/* Returns 1 if the user meets the requirements (or no requirements were */ -/* specified) or 0 if the user does not meet any of the requirements. */ -/****************************************************************************/ -int chkuser(FILE *stream, long offset) -{ - char str[128]; - int i; - -if(min || max!=99) { /* Check security level */ - fseek(stream,offset+U_LEVEL,SEEK_SET); - if(!fread(str,2,1,stream)) - return(0); - str[2]=0; - i=atoi(str); - if(i<min || i>max) /* not within range */ - return(0); } /* so skip this user */ - -for(i=0;i<4;i++) - if(reqflags[i]) { - fseek(stream,offset+getflagoff(i+1),SEEK_SET); - if(!fread(str,8,1,stream)) - return(0); - str[8]=0; - truncsp(str); - if((ahtoul(str)&reqflags[i])!=reqflags[i]) - return(0); } /* doesn't have 'em all */ - -if(reqrest) { - fseek(stream,offset+U_REST,SEEK_SET); - if(!fread(str,8,1,stream)) - return(0); - str[8]=0; - truncsp(str); - if((ahtoul(str)&reqrest)!=reqrest) - return(0); } - -if(reqexempt) { - fseek(stream,offset+U_REST,SEEK_SET); - if(!fread(str,8,1,stream)) - return(0); - str[8]=0; - truncsp(str); - if((ahtoul(str)&reqexempt)!=reqexempt) - return(0); } - -return(1); -} - -int main(int argc, char **argv) -{ - char dir[128],str[128]; - int i,j,k,file,set,sub,mod; - long l,f,flags,flagoff,length,offset; - FILE *stream; - -printf("\nALLUSERS v2.10 - Bulk User Editor for Synchronet User Database\n"); - -if(argc<2) { - printf(usage); - exit(1); } -dir[0]=0; -for(i=1;i<argc;i++) { - flags=flagoff=sub=mod=0; - if(argv[i][0]=='-') - switch(toupper(argv[i][1])) { - case 'L': /* Set minimum sec level */ - min=atoi(argv[i]+2); - break; - case 'M': /* Set maximum sec level */ - max=atoi(argv[i]+2); - break; - case 'F': /* Set required flags */ - j=3; - set=1; - if(isdigit(argv[i][2])) - set=argv[i][2]&0xf; - else - j=2; - for(;argv[i][j];j++) - if(isalpha(argv[i][j])) - reqflags[set-1]|=FLAG(toupper(argv[i][j])); - break; - case 'R': /* Set required restrictions */ - for(j=2;argv[i][j];j++) - if(isalpha(argv[i][j])) - reqrest|=FLAG(toupper(argv[i][j])); - break; - case 'E': /* Set required exemptions */ - for(j=2;argv[i][j];j++) - if(isalpha(argv[i][j])) - reqexempt|=FLAG(toupper(argv[i][j])); - break; - default: /* Unrecognized include */ - printf(usage); - exit(1); } - - else if(argv[i][0]=='/') - switch(toupper(argv[i][1])) { - case 'F': /* flags */ - j=3; - set=1; - if(isdigit(argv[i][2])) - set=argv[i][2]&0xf; - else - j=2; - if(argv[i][j]=='+') - j++; - else if(argv[i][j]=='-') { - j++; - sub=1; } - for(;argv[i][j];j++) - if(isalpha(argv[i][j])) - flags|=FLAG(toupper(argv[i][j])); - sprintf(str,"%sUSER.DAT",dir); - if((file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { - printf("Error opening %s\n",str); - exit(1); } - if((stream=fdopen(file,"w+b"))==NULL) { - printf("Error opening %s\n",str); - exit(1); } - setvbuf(stream,NULL,_IOFBF,2048); - length=filelength(file); - printf("\n%s Flags %s Set #%d\n",sub ? "Removing":"Adding" - ,sub ? "from":"to",set); - for(offset=0;offset<length;offset+=U_LEN) { - printf("%lu of %lu (%u modified)\r" - ,(offset/U_LEN)+1,length/U_LEN,mod); - if(lockuser(stream,offset)) { - printf("Error locking offset %lu\n",offset); - continue; } - if(!chkuser(stream,offset)) { - unlock(fileno(stream),offset,U_LEN); - continue; } - flagoff=getflagoff(set); - fseek(stream,offset+flagoff,SEEK_SET); - fread(str,8,1,stream); - str[8]=0; - truncsp(str); - l=f=ahtoul(str); - if(sub) - l&=~flags; - else - l|=flags; - if(l==f) { /* no change */ - unlock(fileno(stream),offset,U_LEN); - continue; } - mod++; - sprintf(str,"%lx",l); - while(strlen(str)<8) - strcat(str,"\3"); - fseek(stream,offset+flagoff,SEEK_SET); - fwrite(str,8,1,stream); - unlock(fileno(stream),offset,U_LEN); } - fclose(stream); - printf("\n"); - break; - case 'E': /* Exemptions */ - flagoff=U_EXEMPT; - case 'R': /* Restrictions */ - if(!flagoff) - flagoff=U_REST; - j=2; - if(argv[i][j]=='+') - j++; - else if(argv[i][j]=='-') { - j++; - sub=1; } - for(;argv[i][j];j++) - if(isalpha(argv[i][j])) - flags|=FLAG(toupper(argv[i][j])); - sprintf(str,"%sUSER.DAT",dir); - if((file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { - printf("Error opening %s\n",str); - exit(1); } - if((stream=fdopen(file,"w+b"))==NULL) { - printf("Error opening %s\n",str); - exit(1); } - setvbuf(stream,NULL,_IOFBF,2048); - length=filelength(file); - printf("\n%s %s\n" - ,sub ? "Removing":"Adding" - ,flagoff==U_REST ? "Restrictions":"Exemptions"); - for(offset=0;offset<length;offset+=U_LEN) { - printf("%lu of %lu (%u modified)\r" - ,(offset/U_LEN)+1,length/U_LEN,mod); - if(lockuser(stream,offset)) { - printf("Error locking offset %lu\n",offset); - continue; } - if(!chkuser(stream,offset)) { - unlock(fileno(stream),offset,U_LEN); - continue; } - fseek(stream,offset+flagoff,SEEK_SET); - fread(str,8,1,stream); - str[8]=0; - truncsp(str); - l=f=ahtoul(str); - if(sub) - l&=~flags; - else - l|=flags; - if(l==f) { /* no change */ - unlock(fileno(stream),offset,U_LEN); - continue; } - mod++; - sprintf(str,"%lx",l); - while(strlen(str)<8) - strcat(str,"\3"); - fseek(stream,offset+flagoff,SEEK_SET); - fwrite(str,8,1,stream); - unlock(fileno(stream),offset,U_LEN); } - fclose(stream); - printf("\n"); - break; - case 'L': /* Level */ - j=atoi(argv[i]+2); - if(j>99) - j=99; - if(j<0) - j=0; - sprintf(str,"%sUSER.DAT",dir); - if((file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { - printf("Error opening %s\n",str); - exit(1); } - if((stream=fdopen(file,"w+b"))==NULL) { - printf("Error opening %s\n",str); - exit(1); } - setvbuf(stream,NULL,_IOFBF,2048); - length=filelength(file); - printf("\nChanging Levels\n"); - for(offset=0;offset<length;offset+=U_LEN) { - printf("%lu of %lu (%u modified)\r" - ,(offset/U_LEN)+1,length/U_LEN,mod); - if(lockuser(stream,offset)) { - printf("Error locking offset %lu\n",offset); - continue; } - if(!chkuser(stream,offset)) { - unlock(fileno(stream),offset,U_LEN); - continue; } - fseek(stream,offset+U_LEVEL,SEEK_SET); - fread(str,2,1,stream); - str[2]=0; - truncsp(str); - if(atoi(str)==j) { /* no change */ - unlock(fileno(stream),offset,U_LEN); - continue; } - sprintf(str,"%02u",j); - fseek(stream,offset+U_LEVEL,SEEK_SET); - fwrite(str,2,1,stream); - unlock(fileno(stream),offset,U_LEN); - mod++; } - fclose(stream); - printf("\n"); - break; - default: - printf(usage); - exit(1); } - else { - strcpy(dir,argv[i]); - if(dir[strlen(dir)-1]!='\\' && dir[strlen(dir)-1]!=':') - strcat(dir,"\\"); } } -return(0); -} diff --git a/src/sbbs2/allusers/make.bat b/src/sbbs2/allusers/make.bat deleted file mode 100755 index 402dbfbb19..0000000000 --- a/src/sbbs2/allusers/make.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -I.. -w-pro allusers.c diff --git a/src/sbbs2/ans2msg/ans2msg.c b/src/sbbs2/ans2msg/ans2msg.c deleted file mode 100644 index 7ef485826b..0000000000 --- a/src/sbbs2/ans2msg/ans2msg.c +++ /dev/null @@ -1,155 +0,0 @@ -/* ANS2MSG.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Convert ANSI messages to Synchronet .MSG (Ctrl-A code) format */ - -#include <stdio.h> -#include <conio.h> - -int main(int argc, char **argv) -{ - char esc,n[25],ni; - int i,ch; - FILE *in,*out; - -if(argc<3) { - printf("\nANS2MSG v1.06\n"); - printf("\nusage: ans2msg infile.ans outfile.msg\n"); - exit(0); } - -if((in=fopen(argv[1],"rb"))==NULL) { - printf("\nerror opening %s\n",argv[1]); - exit(1); } - -if((out=fopen(argv[2],"wb"))==NULL) { - printf("\nerror opening %s\n",argv[2]); - exit(1); } - -esc=0; -while((ch=fgetc(in))!=EOF) { - if(ch=='[' && esc) { /* ANSI escape sequence */ - ni=0; /* zero number index */ - while((ch=fgetc(in))!=EOF) { - if(isdigit(ch)) { /* 1 digit */ - n[ni]=ch&0xf; - ch=fgetc(in); - if(ch==EOF) - break; - if(isdigit(ch)) { /* 2 digits */ - n[ni]*=10; - n[ni]+=ch&0xf; - ch=fgetc(in); - if(ch==EOF) - break; - if(isdigit(ch)) { /* 3 digits */ - n[ni]*=10; - n[ni]+=ch&0xf; - ch=fgetc(in); } } - ni++; } - if(ch==';') - continue; - switch(ch) { - case '=': - case '?': - ch=fgetc(in); /* First digit */ - if(isdigit(ch)) ch=fgetc(in); /* l or h ? */ - if(isdigit(ch)) ch=fgetc(in); - if(isdigit(ch)) fgetc(in); - break; - case 'J': - if(n[0]==2) /* clear screen */ - fputs("\1l",out); /* ctrl-al */ - break; - case 'K': - fputs("\1>",out); /* clear to eol */ - break; - case 'm': - for(i=0;i<ni;i++) { - fputc(1,out); /* ctrl-ax */ - switch(n[i]) { - default: - case 0: - case 2: /* no attribute */ - fputc('n',out); - break; - case 1: /* high intensity */ - fputc('h',out); - break; - case 3: - case 4: - case 5: /* blink */ - case 6: - case 7: - fputc('i',out); - break; - case 8: /* concealed */ - fputc('e',out); - break; - case 30: - fputc('k',out); - break; - case 31: - fputc('r',out); - break; - case 32: - fputc('g',out); - break; - case 33: - fputc('y',out); - break; - case 34: - fputc('b',out); - break; - case 35: - fputc('m',out); - break; - case 36: - fputc('c',out); - break; - case 37: - fputc('w',out); - break; - case 40: - fputc('0',out); - break; - case 41: - fputc('1',out); - break; - case 42: - fputc('2',out); - break; - case 43: - fputc('3',out); - break; - case 44: - fputc('4',out); - break; - case 45: - fputc('5',out); - break; - case 46: - fputc('6',out); - break; - case 47: - fputc('7',out); - break; } } - break; - case 'C': - fprintf(out,"\1%c",0x7f+n[0]); - break; - default: - printf("Unsupported ANSI code '%c'\r\n",ch); - break; } - break; } /* end of while */ - esc=0; - continue; } /* end of ANSI expansion */ - if(ch=='\x1b') - esc=1; - else { - esc=0; - fputc(ch,out); } } -fcloseall(); -return(0); -} - diff --git a/src/sbbs2/ars.c b/src/sbbs2/ars.c deleted file mode 100644 index f9dff33a27..0000000000 --- a/src/sbbs2/ars.c +++ /dev/null @@ -1,502 +0,0 @@ -/* ARS.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#ifdef __WATCOMC__ - #include <malloc.h> -#else - #include <alloc.h> -#endif -#include "ars_defs.h" - -#ifdef SBBS -#include "sbbs.h" -#endif - -char *arstr(ushort *count, char *str) -{ - static char *nular=""; - char ar[256],*p; - uint i,j,n,artype=AR_LEVEL,not=0,equal=0,x; - -for(i=j=0;str[i];i++) { - if(str[i]==SP) - continue; - - if(str[i]=='(') { - if(not) - ar[j++]=AR_NOT; - not=equal=0; - ar[j++]=AR_BEGNEST; - continue; } - - if(str[i]==')') { - ar[j++]=AR_ENDNEST; - continue; } - - if(str[i]=='|') { - ar[j++]=AR_OR; - continue; } - - if(str[i]=='!') { - not=1; - continue; } - - if(str[i]=='=') { - equal=1; - continue; } - - if(str[i]=='&') - continue; - - if(isalpha(str[i])) { - if(!strncmp(str+i,"OR",2)) { - ar[j++]=AR_OR; - i++; - continue; } - - if(!strncmp(str+i,"AND",3)) { /* AND is ignored */ - i+=2; - continue; } - - if(!strncmp(str+i,"NOT",3)) { - not=1; - i+=2; - continue; } - - if(!strncmp(str+i,"EQUAL TO",8)) { - equal=1; - i+=7; - continue; } - - if(!strncmp(str+i,"EQUAL",5)) { - equal=1; - i+=4; - continue; } - - if(!strncmp(str+i,"EQUALS",6)) { - equal=1; - i+=5; - continue; } } - - if(str[i]=='$') { - switch(str[i+1]) { - case 'A': - artype=AR_AGE; - break; - case 'B': - artype=AR_BPS; - break; - case 'C': - artype=AR_CREDIT; - break; - case 'D': - artype=AR_UDFR; - break; - case 'E': - artype=AR_EXPIRE; - break; - case 'F': - artype=AR_FLAG1; - break; - case 'G': - artype=AR_LOCAL; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - break; - case 'H': - artype=AR_SUB; - break; - case 'I': - artype=AR_LIB; - break; - case 'J': - artype=AR_DIR; - break; - case 'K': - artype=AR_UDR; - break; - case 'L': - artype=AR_LEVEL; - break; - case 'M': - artype=AR_GROUP; - break; - case 'N': - artype=AR_NODE; - break; - case 'O': - artype=AR_TUSED; - break; - case 'P': - artype=AR_PCR; - break; - case 'Q': - artype=AR_RANDOM; - break; - case 'R': - artype=AR_TLEFT; - break; - case 'S': - artype=AR_SEX; - break; - case 'T': - artype=AR_TIME; - break; - case 'U': - artype=AR_USER; - break; - case 'V': - artype=AR_LOGONS; - break; - case 'W': - artype=AR_DAY; - break; - case 'X': - artype=AR_EXEMPT; - break; - case 'Y': /* Days since last on */ - artype=AR_LASTON; - break; - case 'Z': - artype=AR_REST; - break; - case '[': - artype=AR_ANSI; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - break; - case '0': - artype=AR_NULL; - break; - case '*': - artype=AR_RIP; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - break; - - } - i++; - continue; } - - if(isalpha(str[i])) { - n=i; - if(!strncmp(str+i,"AGE",3)) { - artype=AR_AGE; - i+=2; } - else if(!strncmp(str+i,"BPS",3)) { - artype=AR_BPS; - i+=2; } - else if(!strncmp(str+i,"PCR",3)) { - artype=AR_PCR; - i+=2; } - else if(!strncmp(str+i,"SEX",3)) { - artype=AR_SEX; - i+=2; } - else if(!strncmp(str+i,"UDR",3)) { - artype=AR_UDR; - i+=2; } - else if(!strncmp(str+i,"DAY",3)) { - artype=AR_DAY; - i+=2; } - else if(!strncmp(str+i,"RIP",3)) { - artype=AR_RIP; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - i+=2; } - else if(!strncmp(str+i,"WIP",3)) { - artype=AR_WIP; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - i+=2; } - else if(!strncmp(str+i,"OS2",3)) { - artype=AR_OS2; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - i+=2; } - else if(!strncmp(str+i,"DOS",3)) { - artype=AR_DOS; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - i+=2; } - else if(!strncmp(str+i,"SUBCODE",7)) { - artype=AR_SUBCODE; - i+=6; } - else if(!strncmp(str+i,"SUB",3)) { - artype=AR_SUB; - i+=2; } - else if(!strncmp(str+i,"LIB",3)) { - artype=AR_LIB; - i+=2; } - else if(!strncmp(str+i,"DIRCODE",7)) { - artype=AR_DIRCODE; - i+=6; } - else if(!strncmp(str+i,"DIR",3)) { - artype=AR_DIR; - i+=2; } - else if(!strncmp(str+i,"ANSI",4)) { - artype=AR_ANSI; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - i+=3; } - else if(!strncmp(str+i,"UDFR",4)) { - artype=AR_UDFR; - i+=3; } - else if(!strncmp(str+i,"FLAG",4)) { - artype=AR_FLAG1; - i+=3; } - else if(!strncmp(str+i,"NODE",4)) { - artype=AR_NODE; - i+=3; } - else if(!strncmp(str+i,"NULL",4)) { - artype=AR_NULL; - i+=3; } - else if(!strncmp(str+i,"USER",4)) { - artype=AR_USER; - i+=3; } - else if(!strncmp(str+i,"TIME",4)) { - artype=AR_TIME; - i+=3; } - else if(!strncmp(str+i,"REST",4)) { - artype=AR_REST; - i+=3; } - else if(!strncmp(str+i,"LEVEL",5)) { - artype=AR_LEVEL; - i+=4; } - else if(!strncmp(str+i,"TLEFT",5)) { - artype=AR_TLEFT; - i+=4; } - else if(!strncmp(str+i,"TUSED",5)) { - artype=AR_TUSED; - i+=4; } - else if(!strncmp(str+i,"LOCAL",5)) { - artype=AR_LOCAL; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - i+=4; } - else if(!strncmp(str+i,"GROUP",5)) { - artype=AR_GROUP; - i+=4; } - else if(!strncmp(str+i,"EXPIRE",6)) { - artype=AR_EXPIRE; - i+=5; } - else if(!strncmp(str+i,"EXPERT",6)) { - artype=AR_EXPERT; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - i+=5; } - else if(!strncmp(str+i,"SYSOP",5)) { - artype=AR_SYSOP; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - i+=4; } - else if(!strncmp(str+i,"QUIET",5)) { - artype=AR_QUIET; - if(not) - ar[j++]=AR_NOT; - not=0; - ar[j++]=artype; - i+=4; } - else if(!strncmp(str+i,"EXEMPT",6)) { - artype=AR_EXEMPT; - i+=5; } - else if(!strncmp(str+i,"RANDOM",6)) { - artype=AR_RANDOM; - i+=5; } - else if(!strncmp(str+i,"LASTON",6)) { - artype=AR_LASTON; - i+=5; } - else if(!strncmp(str+i,"LOGONS",6)) { - artype=AR_LOGONS; - i+=5; } - else if(!strncmp(str+i,"CREDIT",6)) { - artype=AR_CREDIT; - i+=5; } - else if(!strncmp(str+i,"MAIN_CMDS",9)) { - artype=AR_MAIN_CMDS; - i+=8; } - else if(!strncmp(str+i,"FILE_CMDS",9)) { - artype=AR_FILE_CMDS; - i+=8; } - if(n!=i) /* one of the above */ - continue; } - - if(not) - ar[j++]=AR_NOT; - if(equal) - ar[j++]=AR_EQUAL; - not=equal=0; - - if(artype==AR_FLAG1 && isdigit(str[i])) { /* flag set specified */ - switch(str[i]) { - case '2': - artype=AR_FLAG2; - break; - case '3': - artype=AR_FLAG3; - break; - case '4': - artype=AR_FLAG4; - break; } - continue; } - - if(artype==AR_SUB && !isdigit(str[i])) - artype=AR_SUBCODE; - if(artype==AR_DIR && !isdigit(str[i])) - artype=AR_DIRCODE; - - ar[j++]=artype; - if(isdigit(str[i])) { - if(artype==AR_TIME) { - n=atoi(str+i)*60; - p=strchr(str+i,':'); - if(p) - n+=atoi(p+1); - *((short *)(ar+j))=n; - j+=2; - while(isdigit(str[i+1]) || str[i+1]==':') i++; - continue; } - n=atoi(str+i); - switch(artype) { - case AR_DAY: - if(n>6) /* not past saturday */ - n=6; - case AR_AGE: /* byte operands */ - case AR_PCR: - case AR_UDR: - case AR_UDFR: - case AR_NODE: - case AR_LEVEL: - case AR_TLEFT: - case AR_TUSED: - ar[j++]=n; - break; - case AR_BPS: /* int operands */ - if(n<300) - n*=100; - case AR_MAIN_CMDS: - case AR_FILE_CMDS: - case AR_EXPIRE: - case AR_CREDIT: - case AR_USER: - case AR_RANDOM: - case AR_LASTON: - case AR_LOGONS: - *((short *)(ar+j))=n; - j+=2; - break; - case AR_GROUP: - case AR_LIB: - case AR_DIR: - case AR_SUB: - if(n) n--; /* convert to 0 base */ - *((short *)(ar+j))=n; - j+=2; - break; - default: /* invalid numeric AR type */ - j--; - break; } - while(isdigit(str[i+1])) i++; - continue; } - if(artype==AR_SUBCODE || artype==AR_DIRCODE) { - for(n=0;n<8 - && str[i] - && str[i]!=SP - && str[i]!='(' - && str[i]!=')' - && str[i]!='=' - && str[i]!='|' - ;n++) - ar[j++]=str[i++]; - ar[j++]=0; - continue; } - switch(artype) { - case AR_FLAG1: - case AR_FLAG2: - case AR_FLAG3: - case AR_FLAG4: - case AR_EXEMPT: - case AR_SEX: - case AR_REST: - ar[j++]=str[i]; - break; -#ifdef SBBS - case AR_SUB: - for(n=0;n<total_subs;n++) - if(!strnicmp(str+i,sub[n]->code,strlen(sub[n]->code))) - break; - if(n<total_subs) { - *((short *)(ar+j))=n; - j+=2; } - else /* Unknown sub-board */ - j--; - while(isalpha(str[i+1])) i++; - break; - case AR_DIR: - for(n=0;n<total_dirs;n++) - if(!strnicmp(str+i,dir[n]->code,strlen(dir[n]->code))) - break; - if(n<total_dirs) { - *((short *)(ar+j))=n; - j+=2; } - else /* Unknown directory */ - j--; - while(isalpha(str[i+1])) i++; - break; -#endif - case AR_DAY: - if(str[i]=='S' && str[i+1]=='U') /* Sunday */ - ar[j++]=0; - else if(str[i]=='M') /* Monday */ - ar[j++]=1; - else if(str[i]=='T' && str[i+1]=='U') /* Tuesday */ - ar[j++]=2; - else if(str[i]=='W') /* Wednesday */ - ar[j++]=3; - else if(str[i]=='T' && str[i+1]=='H') /* Thursday */ - ar[j++]=4; - else if(str[i]=='F') /* Friday */ - ar[j++]=5; - else ar[j++]=6; /* Saturday */ - while(isalpha(str[i+1])) i++; - break; - } } -if(!j) - return(nular); /* Save memory */ - -ar[j++]=AR_NULL; -/** DEBUG stuff -for(i=0;i<j;i++) - lprintf("%02X ",(uint)ar[i]); -lputs("\r\n"); -***/ -if((p=(char *)MALLOC(j))==NULL) - return(NULL); -memcpy(p,ar,j); -if(count) - (*count)=j; -return(p); -} - diff --git a/src/sbbs2/ars_defs.h b/src/sbbs2/ars_defs.h deleted file mode 100644 index 2782811b82..0000000000 --- a/src/sbbs2/ars_defs.h +++ /dev/null @@ -1,72 +0,0 @@ -/* ARS_DEFS.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#ifndef _ARS_DEFS_H -#define _ARS_DEFS_H - -/************************************************************************/ -/* Synchronet Access Requirement Strings fucntion prototypes and type */ -/* definitions */ -/************************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> - -#include "gen_defs.h" - -char *arstr(ushort *count, char *str); - -enum { /* Access requirement binaries */ - AR_NULL - ,AR_OR - ,AR_NOT - ,AR_EQUAL - ,AR_BEGNEST - ,AR_ENDNEST - ,AR_LEVEL - ,AR_AGE - ,AR_BPS - ,AR_NODE - ,AR_TLEFT - ,AR_TUSED - ,AR_USER - ,AR_TIME - ,AR_PCR - ,AR_FLAG1 - ,AR_FLAG2 - ,AR_FLAG3 - ,AR_FLAG4 - ,AR_EXEMPT - ,AR_REST - ,AR_SEX - ,AR_UDR - ,AR_UDFR - ,AR_EXPIRE - ,AR_CREDIT - ,AR_DAY - ,AR_ANSI - ,AR_RIP - ,AR_LOCAL - ,AR_GROUP - ,AR_SUB - ,AR_LIB - ,AR_DIR - ,AR_EXPERT - ,AR_SYSOP - ,AR_QUIET - ,AR_MAIN_CMDS - ,AR_FILE_CMDS - ,AR_RANDOM - ,AR_LASTON - ,AR_LOGONS - ,AR_WIP - ,AR_SUBCODE - ,AR_DIRCODE - ,AR_OS2 - ,AR_DOS - }; - -#endif /* Don't add anything after this line */ diff --git a/src/sbbs2/atcodes.c b/src/sbbs2/atcodes.c deleted file mode 100644 index cd1ff94258..0000000000 --- a/src/sbbs2/atcodes.c +++ /dev/null @@ -1,514 +0,0 @@ -#line 1 "ATCODES.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -extern char *wday[]; /* 3 char days of week */ -char question[128]; - -int syncatcodes(char *sp, int len) -{ - char str2[128],*tp; - -/* Synchronet Specific */ - -if(!strncmp(sp,"SETSTR:",7)) - strcpy(main_csi.str,sp+7); - -else if(!strncmp(sp,"EXEC:",5)) - exec_bin(sp+5,&main_csi); - -else if(!strncmp(sp,"MENU:",5)) - menu(sp+5); - -else if(!strncmp(sp,"TYPE:",5)) - printfile(cmdstr(sp+5,nulstr,nulstr,str2),0); - -else if(!strcmp(sp,"QUESTION")) - bputs(question); - -else if(!strncmp(sp,"NAME-L",6)) - bprintf("%-*.*s",len,len,useron.alias); - -else if(!strncmp(sp,"NAME-R",6)) - bprintf("%*.*s",len,len,useron.alias); - -else if(!strcmp(sp,"HANDLE")) - bputs(useron.handle); - -else if(!strcmp(sp,"CID") || !strcmp(sp,"IP")) - bputs(cid); - -else if(!strcmp(sp,"GRP")) - bputs(usrgrps ? grp[usrgrp[curgrp]]->sname : nulstr); - -else if(!strncmp(sp,"GRP-L",5)) - bprintf("%-*.*s",len,len,usrgrps ? grp[usrgrp[curgrp]]->sname : nulstr); - -else if(!strncmp(sp,"GRP-R",5)) - bprintf("%*.*s",len,len,usrgrps ? grp[usrgrp[curgrp]]->sname : nulstr); - -else if(!strcmp(sp,"GRPL")) - bputs(usrgrps ? grp[usrgrp[curgrp]]->lname : nulstr); - -else if(!strncmp(sp,"GRPL-L",6)) - bprintf("%-*.*s",len,len,usrgrps ? grp[usrgrp[curgrp]]->lname : nulstr); - -else if(!strncmp(sp,"GRPL-R",6)) - bprintf("%*.*s",len,len,usrgrps ? grp[usrgrp[curgrp]]->lname : nulstr); - -else if(!strcmp(sp,"GN")) - bprintf("%u",usrgrps ? curgrp+1 : 0); - -else if(!strcmp(sp,"GL")) - bprintf("%-4u",usrgrps ? curgrp+1 : 0); - -else if(!strcmp(sp,"GR")) - bprintf("%4u",usrgrps ? curgrp+1 : 0); - -else if(!strcmp(sp,"SUB")) - bputs(usrgrps ? sub[usrsub[curgrp][cursub[curgrp]]]->sname : nulstr); - -else if(!strncmp(sp,"SUB-L",5)) - bprintf("%-*.*s",len,len,usrgrps - ? sub[usrsub[curgrp][cursub[curgrp]]]->sname : nulstr); - -else if(!strncmp(sp,"SUB-R",5)) - bprintf("%*.*s",len,len,usrgrps - ? sub[usrsub[curgrp][cursub[curgrp]]]->sname : nulstr); - -else if(!strcmp(sp,"SUBL")) - bputs(usrgrps ? sub[usrsub[curgrp][cursub[curgrp]]]->lname : nulstr); - -else if(!strncmp(sp,"SUBL-L",6)) - bprintf("%-*.*s",len,len,usrgrps - ? sub[usrsub[curgrp][cursub[curgrp]]]->lname : nulstr); - -else if(!strncmp(sp,"SUBL-R",6)) - bprintf("%*.*s",len,len,usrgrps - ? sub[usrsub[curgrp][cursub[curgrp]]]->lname : nulstr); - -else if(!strcmp(sp,"SN")) - bprintf("%u",usrgrps ? cursub[curgrp]+1 : 0); - -else if(!strcmp(sp,"SL")) - bprintf("%-4u",usrgrps ? cursub[curgrp]+1 : 0); - -else if(!strcmp(sp,"SR")) - bprintf("%4u",usrgrps ? cursub[curgrp]+1 : 0); - -else if(!strcmp(sp,"LIB")) - bputs(usrlibs ? lib[usrlib[curlib]]->sname : nulstr); - -else if(!strncmp(sp,"LIB-L",5)) - bprintf("%-*.*s",len,len,usrlibs ? lib[usrlib[curlib]]->sname : nulstr); - -else if(!strncmp(sp,"LIB-R",5)) - bprintf("%*.*s",len,len,usrlibs ? lib[usrlib[curlib]]->sname : nulstr); - -else if(!strcmp(sp,"LIBL")) - bputs(usrlibs ? lib[usrlib[curlib]]->lname : nulstr); - -else if(!strncmp(sp,"LIBL-L",6)) - bprintf("%-*.*s",len,len,usrlibs ? lib[usrlib[curlib]]->lname : nulstr); - -else if(!strncmp(sp,"LIBL-R",6)) - bprintf("%*.*s",len,len,usrlibs ? lib[usrlib[curlib]]->lname : nulstr); - -else if(!strcmp(sp,"LN")) - bprintf("%u",usrlibs ? curlib+1 : 0); - -else if(!strcmp(sp,"LL")) - bprintf("%-4u",usrlibs ? curlib+1 : 0); - -else if(!strcmp(sp,"LR")) - bprintf("%4u",usrlibs ? curlib+1 : 0); - -else if(!strcmp(sp,"DIR")) - bputs(usrlibs ? dir[usrdir[curlib][curdir[curlib]]]->sname :nulstr); - -else if(!strncmp(sp,"DIR-L",5)) - bprintf("%-*.*s",len,len,usrlibs - ? dir[usrdir[curlib][curdir[curlib]]]->sname : nulstr); - -else if(!strncmp(sp,"DIR-R",5)) - bprintf("%*.*s",len,len,usrlibs - ? dir[usrdir[curlib][curdir[curlib]]]->sname : nulstr); - -else if(!strcmp(sp,"DIRL")) - bputs(usrlibs ? dir[usrdir[curlib][curdir[curlib]]]->lname : nulstr); - -else if(!strncmp(sp,"DIRL-L",6)) - bprintf("%-*.*s",len,len,usrlibs - ? dir[usrdir[curlib][curdir[curlib]]]->lname : nulstr); - -else if(!strncmp(sp,"DIRL-R",6)) - bprintf("%*.*s",len,len,usrlibs - ? dir[usrdir[curlib][curdir[curlib]]]->lname : nulstr); - -else if(!strcmp(sp,"DN")) - bprintf("%u",usrlibs ? curdir[curlib]+1 : 0); - -else if(!strcmp(sp,"DL")) - bprintf("%-4u",usrlibs ? curdir[curlib]+1 : 0); - -else if(!strcmp(sp,"DR")) - bprintf("%4u",usrlibs ? curdir[curlib]+1 : 0); - -else if(!strcmp(sp,"NOACCESS")) { - if(noaccess_str==text[NoAccessTime]) - bprintf(noaccess_str,noaccess_val/60,noaccess_val%60); - else if(noaccess_str==text[NoAccessDay]) - bprintf(noaccess_str,wday[noaccess_val]); - else - bprintf(noaccess_str,noaccess_val); } - -else if(!strcmp(sp,"LAST")) { - tp=strrchr(useron.alias,SP); - if(tp) tp++; - else tp=useron.alias; - bputs(tp); } - -else if(!strcmp(sp,"REAL")) { - strcpy(str2,useron.name); - tp=strchr(str2,SP); - if(tp) *tp=0; - bputs(str2); } - -else if(!strcmp(sp,"FIRSTREAL")) { - strcpy(str2,useron.name); - tp=strchr(str2,SP); - if(tp) *tp=0; - bputs(str2); } - -else if(!strcmp(sp,"LASTREAL")) { - tp=strrchr(useron.name,SP); - if(tp) tp++; - else tp=useron.name; - bputs(tp); } - -else if(!strcmp(sp,"MAILW")) - bprintf("%u",getmail(useron.number,0)); - -else if(!strcmp(sp,"MAILP")) - bprintf("%u",getmail(useron.number,1)); - -else if(!strncmp(sp,"MAILW:",6)) - bprintf("%u",getmail(atoi(sp+6),0)); - -else if(!strncmp(sp,"MAILP:",6)) - bprintf("%u",getmail(atoi(sp+6),1)); - -else return(0); - -return(len); -} - -/****************************************************************************/ -/* Returns 0 if invalid @ code. Returns length of @ code if valid. */ -/****************************************************************************/ -int atcodes(char *instr) -{ - char str[64],str2[64],*p,*tp,*sp; - int i,len; - long l; - stats_t stats; - node_t node; - struct dfree d; - -sprintf(str,"%.40s",instr); -tp=strchr(str+1,'@'); -if(!tp) /* no terminating @ */ - return(0); -sp=strchr(str+1,SP); -if(sp && sp<tp) /* space before terminating @ */ - return(0); -len=(tp-str)+1; -(*tp)=0; -sp=(str+1); - -if(!strcmp(sp,"VER")) - bputs(VERSION); - -else if(!strcmp(sp,"REV")) - bprintf("%c",REVISION); - -else if(!strcmp(sp,"BBS") || !strcmp(sp,"BOARDNAME")) - bputs(sys_name); - -else if(!strcmp(sp,"BAUD") || !strcmp(sp,"BPS")) - bprintf("%lu",cur_rate); - -else if(!strcmp(sp,"CONN")) - bputs(connection); - -else if(!strcmp(sp,"SYSOP")) - bputs(sys_op); - -else if(!strcmp(sp,"LOCATION")) - bputs(sys_location); - -else if(!strcmp(sp,"NODE")) - bprintf("%u",node_num); - -else if(!strcmp(sp,"TNODE")) - bprintf("%u",sys_nodes); - -else if(!strcmp(sp,"TIME") || !strcmp(sp,"SYSTIME")) { - now=time(NULL); - unixtodos(now,&date,&curtime); - bprintf("%02d:%02d %s" - ,curtime.ti_hour==0 ? 12 - : curtime.ti_hour>12 ? curtime.ti_hour-12 - : curtime.ti_hour, curtime.ti_min, curtime.ti_hour>11 ? "pm":"am"); } - -else if(!strcmp(sp,"DATE") || !strcmp(sp,"SYSDATE")) { - now=time(NULL); - bputs(unixtodstr(now,str2)); } - -else if(!strcmp(sp,"TMSG")) { - l=0; - for(i=0;i<total_subs;i++) - l+=getposts(i); /* l=total posts */ - bprintf("%lu",l); } - -else if(!strcmp(sp,"TUSER")) - bprintf("%u",lastuser()); - -else if(!strcmp(sp,"TFILE")) { - l=0; - for(i=0;i<total_dirs;i++) - l+=getfiles(i); - bprintf("%lu",l); } - -else if(!strcmp(sp,"TCALLS") || !strcmp(sp,"NUMCALLS")) { - getstats(0,&stats); - bprintf("%lu",stats.logons); } - -else if(!strcmp(sp,"PREVON") || !strcmp(sp,"LASTCALLERNODE") - || !strcmp(sp,"LASTCALLERSYSTEM")) - bputs(lastuseron); - -else if(!strcmp(sp,"CLS")) - CLS; - -else if(!strcmp(sp,"PAUSE") || !strcmp(sp,"MORE")) - pause(); - -else if(!strcmp(sp,"NOPAUSE") || !strcmp(sp,"POFF")) - sys_status^=SS_PAUSEOFF; - -else if(!strcmp(sp,"PON") || !strcmp(sp,"AUTOMORE")) - sys_status^=SS_PAUSEON; - -/* NOSTOP */ - -/* STOP */ - -else if(!strcmp(sp,"BELL") || !strcmp(sp,"BEEP")) - outchar(7); - -// else if(!strcmp(sp,"EVENT")) -// bputs(sectostr(sys_eventtime,str2)); - -/* LASTCALL */ - -else if(!strncmp(sp,"NODE",4)) { - i=atoi(sp+4); - if(i && i<=sys_nodes) { - getnodedat(i,&node,0); - printnodedat(i,node); } } - -else if(!strcmp(sp,"WHO")) - whos_online(1); - -/* User Codes */ - -else if(!strcmp(sp,"USER") || !strcmp(sp,"ALIAS") || !strcmp(sp,"NAME")) - bputs(useron.alias); - -else if(!strcmp(sp,"FIRST")) { - strcpy(str2,useron.alias); - tp=strchr(str2,SP); - if(tp) *tp=0; - bputs(str2); } - -else if(!strcmp(sp,"PHONE") || !strcmp(sp,"HOMEPHONE") - || !strcmp(sp,"DATAPHONE") || !strcmp(sp,"DATA")) - bputs(useron.phone); - -else if(!strcmp(sp,"ADDR1")) - bputs(useron.address); - -else if(!strcmp(sp,"FROM")) - bputs(useron.location); - -else if(!strcmp(sp,"CITY")) { - strcpy(str2,useron.location); - p=strchr(str2,','); - if(p) { - *p=0; - bputs(str2); } } - -else if(!strcmp(sp,"STATE")) { - p=strchr(useron.location,','); - if(p) { - p++; - if(*p==SP) - p++; - bputs(p); } } - -else if(!strcmp(sp,"CPU") || !strcmp(sp,"HOST")) - bputs(useron.comp); - -else if(!strcmp(sp,"BDATE")) - bputs(useron.birth); - -else if(!strcmp(sp,"CALLS") || !strcmp(sp,"NUMTIMESON")) - bprintf("%u",useron.logons); - -else if(!strcmp(sp,"MEMO")) - bputs(unixtodstr(useron.pwmod,str2)); - -else if(!strcmp(sp,"SEC") || !strcmp(sp,"SECURITY")) - bprintf("%u",useron.level); - -else if(!strcmp(sp,"SINCE")) - bputs(unixtodstr(useron.firston,str2)); - -else if(!strcmp(sp,"TIMEON") || !strcmp(sp,"TIMEUSED")) { - now=time(NULL); - bprintf("%u",(now-logontime)/60); } - -else if(!strcmp(sp,"TUSED")) { /* Synchronet only */ - now=time(NULL); - bputs(sectostr(now-logontime,str2)+1); } - -else if(!strcmp(sp,"TLEFT")) { /* Synchronet only */ - gettimeleft(); - bputs(sectostr(timeleft,str2)+1); } - -else if(!strcmp(sp,"TPERD")) /* Synchronet only */ - bputs(sectostr(level_timeperday[useron.level],str)+1); - -else if(!strcmp(sp,"TPERC")) /* Synchronet only */ - bputs(sectostr(level_timepercall[useron.level],str)+1); - -else if(!strcmp(sp,"TIMELIMIT")) - bprintf("%u",level_timepercall[useron.level]); - -else if(!strcmp(sp,"MINLEFT") || !strcmp(sp,"LEFT") || !strcmp(sp,"TIMELEFT")) { - gettimeleft(); - bprintf("%u",timeleft/60); } - -else if(!strcmp(sp,"LASTON")) - bputs(timestr(&useron.laston)); - -else if(!strcmp(sp,"LASTDATEON")) - bputs(unixtodstr(useron.laston,str2)); - -else if(!strcmp(sp,"LASTTIMEON")) { - unixtodos(useron.laston,&date,&curtime); - bprintf("%02d:%02d %s" - ,curtime.ti_hour==0 ? 12 - : curtime.ti_hour>12 ? curtime.ti_hour-12 - : curtime.ti_hour, curtime.ti_min, curtime.ti_hour>11 ? "pm":"am"); } - -else if(!strcmp(sp,"MSGLEFT") || !strcmp(sp,"MSGSLEFT")) - bprintf("%u",useron.posts); - -else if(!strcmp(sp,"MSGREAD")) - bprintf("%u",posts_read); - -else if(!strcmp(sp,"FREESPACE")) { - if(temp_dir[1]==':') - i=temp_dir[0]-'A'+1; - else i=0; - getdfree(i,&d); - if(d.df_sclus!=0xffff) - bprintf("%lu",(ulong)d.df_bsec*(ulong)d.df_sclus*(ulong)d.df_avail); } - -else if(!strcmp(sp,"UPBYTES")) - bprintf("%lu",useron.ulb); - -else if(!strcmp(sp,"UPK")) - bprintf("%lu",useron.ulb/1024L); - -else if(!strcmp(sp,"UPS") || !strcmp(sp,"UPFILES")) - bprintf("%u",useron.uls); - -else if(!strcmp(sp,"DLBYTES")) - bprintf("%lu",useron.dlb); - -else if(!strcmp(sp,"DOWNK")) - bprintf("%lu",useron.dlb/1024L); - -else if(!strcmp(sp,"DOWNS") || !strcmp(sp,"DLFILES")) - bprintf("%u",useron.dls); - -else if(!strcmp(sp,"LASTNEW")) - bputs(unixtodstr(ns_time,str2)); - -else if(!strcmp(sp,"NEWFILETIME")) - bputs(timestr(&ns_time)); - -/* MAXDL */ - -else if(!strcmp(sp,"MAXDK") || !strcmp(sp,"DLKLIMIT") || !strcmp(sp,"KBLIMIT")) - bprintf("%lu",level_freecdtperday[useron.level]/1024L); - -else if(!strcmp(sp,"DAYBYTES")) /* amt of free cdts used today */ - bprintf("%lu",level_freecdtperday[useron.level]-useron.freecdt); - -else if(!strcmp(sp,"BYTELIMIT")) - bprintf("%lu",level_freecdtperday[useron.level]); - -else if(!strcmp(sp,"KBLEFT")) - bprintf("%lu",(useron.cdt+useron.freecdt)/1024L); - -else if(!strcmp(sp,"BYTESLEFT")) - bprintf("%lu",useron.cdt+useron.freecdt); - -else if(!strcmp(sp,"CONF")) - bprintf("%s %s" - ,usrgrps ? grp[usrgrp[curgrp]]->sname :nulstr - ,usrgrps ? sub[usrsub[curgrp][cursub[curgrp]]]->sname : nulstr); - -else if(!strcmp(sp,"CONFNUM")) - bprintf("%u %u",curgrp+1,cursub[curgrp]+1); - -else if(!strcmp(sp,"NUMDIR")) - bprintf("%u %u",usrlibs ? curlib+1 : 0,usrlibs ? curdir[curlib]+1 : 0); - -else if(!strcmp(sp,"EXDATE") || !strcmp(sp,"EXPDATE")) - bputs(unixtodstr(useron.expire,str2)); - -else if(!strcmp(sp,"EXPDAYS")) { - now=time(NULL); - l=useron.expire-now; - if(l<0) - l=0; - bprintf("%u",l/(1440L*60L)); } - -else if(!strcmp(sp,"MEMO1")) - bputs(useron.note); - -else if(!strcmp(sp,"MEMO2") || !strcmp(sp,"COMPANY")) - bputs(useron.name); - -else if(!strcmp(sp,"ZIP")) - bputs(useron.zipcode); - -else if(!strcmp(sp,"HANGUP")) - hangup(); - -else - return(syncatcodes(sp,len)); - -return(len); -} - - - diff --git a/src/sbbs2/autonode/autonode.c b/src/sbbs2/autonode/autonode.c deleted file mode 100644 index f8bdde37e4..0000000000 --- a/src/sbbs2/autonode/autonode.c +++ /dev/null @@ -1,193 +0,0 @@ -/* AUTONODE.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <io.h> -#include <dir.h> -#include <fcntl.h> -#include <errno.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <process.h> -#include <sys\stat.h> - -#define uchar unsigned char -#define uint unsigned int -#define ulong unsigned long -#define LOOP_NODEDAB 100 /* Retries on NODE.DAB locking/unlocking */ - -typedef struct { /* Node information kept in NODE.DAB */ - uchar status, /* Current Status of Node */ - errors, /* Number of Critical Errors */ - action; /* Action User is doing on Node */ - uint useron, /* User on Node */ - connection, /* Connection rate of Node */ - misc, /* Miscellaneous bits for node */ - aux; /* Auxillary word for node */ - ulong extaux; /* Extended aux dword for node */ - } node_t; - -enum { /* Node Status */ - NODE_WFC /* Waiting for Call */ - ,NODE_LOGON /* at logon prompt */ - ,NODE_NEWUSER /* New user applying */ - ,NODE_INUSE /* In Use */ - ,NODE_QUIET /* In Use - quiet mode */ - ,NODE_OFFLINE /* Offline */ - ,NODE_NETTING /* Networking */ - ,NODE_EVENT_WAITING /* Waiting for all nodes to be inactive */ - ,NODE_EVENT_RUNNING /* Running an external event */ - ,NODE_EVENT_LIMBO /* Allowing another node to run an event */ - }; - -int nodefile; - -void main(); -void getnodedat(uchar number, node_t *node, char lockit); -void putnodedat(uchar number, node_t node); -void truncsp(char *str); - -void main(int argc,char *argv[]) -{ - FILE *fp; - char str[256],nodepath[256],*p - ,sbbs_ctrl[256],sbbs_node[256],path[MAXPATH] - ,*arg[10]={NULL}; - int file,num_nodes,autonode,disk,x,y; - node_t node; - -printf("\nSynchronet AUTONODE v2.00\n"); - - if(!strcmp(argv[1],"/?")) { - printf("\nUsage: AUTONODE [file] [args,...]"); - printf("\n\nWhere [file] is the name of the file to run and"); - printf("\n [args,...] are the command line arguments to use"); - printf("\n\nNOTE: The default command line is 'SBBS l q'\n"); - return; } - p=getenv("SBBSCTRL"); - if(!p) { - printf("\n\7You must set the SBBSCTRL environment variable first."); - printf("\n\nExample: SET SBBSCTRL=C:\\SBBS\\CTRL\n"); - return; } - sprintf(sbbs_ctrl,"%.40s",p); - strupr(sbbs_ctrl); - if(sbbs_ctrl[strlen(sbbs_ctrl)-1]!='\\') - strcat(sbbs_ctrl,"\\"); - p=getenv("SBBSNODE"); - if(!p) { - printf("\n\7You must set the SBBSNODE environment variable first."); - printf("\n\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n"); - return; } - sprintf(sbbs_node,"%.40s",p); - strupr(sbbs_node); - if(sbbs_node[strlen(sbbs_node)-1]!='\\') - strcat(sbbs_node,"\\"); - - sprintf(str,"%sNODE.DAB",sbbs_ctrl); - if((nodefile=open(str,O_RDWR|O_BINARY|O_DENYNONE))==-1) { - printf("Error opening %s",str); exit(1); } - - sprintf(str,"%sMAIN.CNF",sbbs_ctrl); - if((file=open(str,O_RDONLY|O_DENYNONE|O_BINARY))==-1) { - printf("Error opening %s",str); - exit(1); } - lseek(file,227L,SEEK_SET); - read(file,&num_nodes,2); - printf("\nNumber of Available Nodes = %d",num_nodes); - lseek(file,64L*(long)num_nodes,SEEK_CUR); - lseek(file,328L,SEEK_CUR); - read(file,&autonode,2); - printf("\nNumber of First Autonode = %d",autonode); - for(x=autonode;x<=num_nodes;x++) { - printf("\nChecking Node #%d",x); - getnodedat(x,&node,1); - if(node.status==NODE_OFFLINE) { - printf("\nFOUND! Node #%d is OFFLINE\n",x); - node.status=NODE_WFC; - putnodedat(x,node); - lseek(file,(229L+((long)(x-1)*64L)),SEEK_SET); - read(file,nodepath,128); - truncsp(nodepath); - if(nodepath[strlen(nodepath)-1]=='\\') - nodepath[strlen(nodepath)-1]=0; /* remove '\' */ - if(nodepath[0]=='.') - sprintf(path,"%s%s",sbbs_node,nodepath); - else strcpy(path,nodepath); - if(path[1]==':') - setdisk(path[0]-'A'); - if(chdir(path)) { - printf("\nError changing into '%s'",path); - getnodedat(x,&node,1); - node.status=NODE_OFFLINE; - putnodedat(x,node); - exit(1); } - if(argc==1) { - execl(getenv("COMSPEC"),getenv("COMSPEC"),"/c","SBBS","l","q", - NULL); } - else { - arg[0]=argv[0]; - strcpy(str,"/c"); arg[1]=str; - for(x=1;x<argc;x++) arg[1+x]=argv[x]; - execv(getenv("COMSPEC"),arg); } - getnodedat(x,&node,1); - node.status=NODE_OFFLINE; - putnodedat(x,node); - return; } } - printf("\n\n\7All local nodes are in use!\n"); -} - -/****************************************************************************/ -/* Reads the data for node number 'number' into the structure 'node' */ -/* from NODE.DAB */ -/* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */ -/****************************************************************************/ -void getnodedat(uchar number, node_t *node, char lockit) -{ - char str[256]; - int count=0; - -number--; /* make zero based */ -while(count<LOOP_NODEDAB) { - lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); - if(lockit - && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) { - count++; - continue; } - if(read(nodefile,node,sizeof(node_t))==sizeof(node_t)) - break; - count++; } -if(count==LOOP_NODEDAB) - printf("\7Error unlocking and reading NODE.DAB\n"); -} - -/****************************************************************************/ -/* Write the data from the structure 'node' into NODE.DAB */ -/* getnodedat(num,&node,1); must have been called before calling this func */ -/* NOTE: ------^ the indicates the node record has been locked */ -/****************************************************************************/ -void putnodedat(uchar number, node_t node) -{ - char str[256]; - int count; - -number--; /* make zero based */ -lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); -if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) { - unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); - printf("\7Error writing NODE.DAB for node %u\n",number+1); - return; } -unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); -} -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && str[c-1]<=32) c--; -str[c]=0; -} diff --git a/src/sbbs2/baja/baja.c b/src/sbbs2/baja/baja.c deleted file mode 100644 index 32fee55011..0000000000 --- a/src/sbbs2/baja/baja.c +++ /dev/null @@ -1,3115 +0,0 @@ -/* BAJA.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <io.h> -#include <stdio.h> -#include <string.h> -#include <ctype.h> -#include <fcntl.h> -#include <share.h> -#include <alloc.h> -#include "cmdshell.h" -#include "ars_defs.h" -#include "crc32.h" - -unsigned _stklen=20000; /* Set stack size in code, not header */ - -char **label_name=NULL - ,**goto_file=NULL - ,**goto_label=NULL - ,**call_file=NULL - ,**call_label=NULL; - -ulong *var_name=NULL,vars=0; - -char **define_str=NULL - ,**define_val=NULL; - -char *linestr="%s %d: %s\n"; -char tmp[256]; - -uint *label_indx=NULL - ,*goto_indx=NULL - ,*goto_line=NULL - ,*call_indx=NULL - ,*call_line=NULL; - -uint display=0,line=0,labels=0,gotos=0,calls=0,defines=0,case_sens=0; - -FILE *out=NULL; - -void bail(void) -{ -if(out) - chsize(fileno(out),0); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - int c; - -c=strlen(str); -while(c && str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -/* C Escape char */ - -uchar cesc(char ch) -{ -switch(ch) { - case 'r': - return(CR); - case 'n': - return(LF); - case 't': - return(TAB); - case 'b': - return(BS); - case 'a': - return(7); - case 'f': - return(FF); - case 'v': - return(11); - default: - return(ch); } -} - -long val(char *src, char *p) -{ - static int inside; - long l; - -if(isdigit(*p) || *p=='-') /* Dec, Hex, or Oct */ - l=strtol(p,&p,0); -else if(*p=='\'') { /* Char */ - p++; - if(*p=='\\') { - p++; - l=cesc(*p); } - else - l=*p; - p++; } -else if(*p=='.') /* Bit */ - l=1L<<strtol(p+1,&p,0); -else { - printf("SYNTAX ERROR (expecting integer constant):\n"); - printf(linestr,src,line,*p ? p : "<end of line>"); - exit(1); - return(0); } -if(inside) { - return(l); } -inside=1; -while(*p) - switch(*(p++)) { - case '+': - l+=val(src,p); - break; - case '-': - l-=val(src,p); - break; - case '*': - l*=val(src,p); - break; - case '/': - l/=val(src,p); - break; - case '%': - l%=val(src,p); - break; - case '&': - l&=val(src,p); - break; - case '|': - l|=val(src,p); - break; - case '~': - l&=~val(src,p); - break; - case '^': - l^=val(src,p); - break; - case '>': - if(*p=='>') { - p++; - l>>=val(src,p); } - break; - case '<': - if(*p=='<') { - p++; - l<<=val(src,p); } - break; - case SP: - case '#': - inside=0; - return(l); } -inside=0; -return(l); -} - - -void writecstr(uchar *p) -{ - char str[1024]; - int j=0,inquotes=0; - -while(*p) { - if(*p=='"') { /* ignore quotes */ - if(inquotes) - break; - inquotes=1; - p++; - continue; } - if(*p=='\\') { /* escape */ - p++; - if(isdigit(*p)) { - str[j]=atoi(p); /* decimal, NOT octal */ - if(isdigit(*(++p))) /* skip up to 3 digits */ - if(isdigit(*(++p))) - p++; - j++; - continue; } - switch(*(p++)) { - case 'x': - tmp[0]=*(p++); - tmp[1]=0; - if(isxdigit(*p)) { /* if another hex digit, skip too */ - tmp[1]=*(p++); - tmp[2]=0; } - str[j]=(char)ahtoul(tmp); - break; - case 'r': - str[j]=CR; - break; - case 'n': - str[j]=LF; - break; - case 't': - str[j]=TAB; - break; - case 'b': - str[j]=BS; - break; - case 'a': - str[j]=7; /* BEL */ - break; - case 'f': - str[j]=FF; - break; - case 'v': - str[j]=11; /* VT */ - break; - default: - str[j]=*(p-1); - break; } - j++; - continue; } - str[j++]=*(p++); } -str[j]=0; -fwrite(str,1,j+1,out); -} - -void writestr(uchar *p) -{ - char str[1024]; - int j=0; - -while(*p) { - if(*p=='"') { /* ignore quotes */ - p++; - continue; } - if(*p=='\\' && *(p+1)=='"' && *(p+2)) - p++; - str[j++]=*(p++); } -str[j]=0; -fwrite(str,1,j+1,out); -} - -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - -void cvttab(char *str) -{ - int i; - -for(i=0;str[i];i++) - if(str[i]==TAB) - str[i]=SP; -} - -void newvar(uchar *in) -{ - uchar name[128]; - long i,l; - -sprintf(name,"%.80s",in); -if(!case_sens) - strupr(name); -l=crc32(name); -for(i=0;i<vars;i++) - if(var_name[i]==l) - break; -if(i<vars) - return; -if((var_name=(ulong *)REALLOC(var_name,sizeof(long)*(vars+1)))==NULL) { - printf("Too many (%lu) variables!\r\n",vars); - exit(1); } -var_name[vars]=l; -if(display) - printf("newvar(%08lX)=%s\n",l,in); -vars++; -} - -void writecrc(uchar *src, uchar *in) -{ - uchar name[128]; - long i,l; - -sprintf(name,"%.80s",in); -if(!case_sens) - strupr(name); -if(!stricmp(name,"STR") || !name[0]) - l=0; -else { - l=crc32(name); - - for(i=0;i<vars;i++) - if(var_name[i]==l) - break; - if(i==vars) { - printf("SYNTAX ERROR (expecting variable name):\n"); - printf(linestr,src,line,*in ? in : "<end of line>"); - exit(1); } - - } -fwrite(&l,4,1,out); -} - -long isvar(uchar *arg) -{ - uchar name[128],*p; - long i,l; - -if(!arg || !*arg) - return(0); - -sprintf(name,"%.80s",arg); -if((p=strchr(name,SP))!=NULL) // Truncate at first space - *p=0; -if(!case_sens) - strupr(name); -l=crc32(name); - -for(i=0;i<vars;i++) - if(var_name[i]==l) - break; -if(i==vars) - return(0); -return(l); -} - -int str_cmp(char *s1, char *s2) -{ -if(case_sens) - return(strcmp(s1,s2)); -return(stricmp(s1,s2)); -} - -void expdefs(uchar *line) -{ - uchar str[512],*p,*sp,sav[2]={0}; - int i; - -str[0]=0; -for(p=line;*p;p++) { - if(*p==SP) { - strcat(str," "); - continue; } - - if(*p=='"') { /* Skip quoted text */ - sp=strchr(p+1,'"'); - if(sp) *sp=0; - strcat(str,p); - if(!sp) - break; - strcat(str,"\""); - p+=strlen(p); - continue; } - - for(sp=p;*sp;sp++) - if(!isalnum(*sp) && *sp!='_') - break; - sav[0]=*sp; /* Save delimiter */ - sav[1]=0; - *sp=0; - for(i=0;i<defines;i++) - if(!str_cmp(define_str[i],p)) - break; - if(i<defines) - strcat(str,define_val[i]); - else - strcat(str,p); - if(!sav[0]) /* Last argument */ - break; - p+=strlen(p); - strcat(str,sav); /* Restore delimiter */ - } -strcpy(line,str); -} - - - -void compile(char *src) -{ - uchar str[1024],save[1024],*p,*sp,*tp,*arg,*arg2,*arg3,*ar,ch; - ushort i,j; - long l,v,savline; - FILE *in; - -strupr(src); -if((in=fopen(src,"rb"))==NULL) { - printf("error opening %s for read\n",src); - exit(1); } -line=0; - -while(!feof(in) && !ferror(in)) { - if(!fgets(str,1000,in)) - break; - truncsp(str); - cvttab(str); - line++; - strcpy(save,str); - p=str; - while(*p && *p<=SP) /* look for beginning of command */ - p++; - if(!*p) - continue; - if(*p=='#') /* remarks start with # */ - continue; - expdefs(p); /* expand defines */ - if(display) - printf("%s\n",p); - sp=strchr(p,SP); - arg=arg2=arg3=""; - if(sp) { - *sp=0; - arg=sp+1; - while(*arg && *arg<=SP) arg++; - sp=strchr(arg,SP); - if(sp) { - arg2=sp+1; - while(*arg2 && *arg2<=SP) arg2++; - sp=strchr(arg2,SP); - if(sp) { - arg3=sp+1; - while(*arg3 && *arg3<=SP) arg3++; } } } - - if(!stricmp(p,"!INCLUDE")) { - savline=line; - sp=strchr(arg,SP); - if(sp) *sp=0; - compile(arg); - line=savline; - continue; } - - if(!stricmp(p,"!DEFINE")) { /* define */ - sp=strchr(arg,SP); - if(sp) - *sp=0; - else - break; - tp=strrchr(arg2,'\"'); - if(!tp) - tp=arg2; - sp=strchr(tp,'#'); - if(sp) - *sp=0; - truncsp(arg2); - if((define_str=(char **)REALLOC(define_str,sizeof(char *)*defines+1)) - ==NULL) { - printf("Too many defines.\r\n"); - exit(1); } - if((define_str[defines]=(char *)MALLOC(strlen(arg)+1))==NULL) { - printf("Too many defines.\r\n"); - exit(1); } - if((define_val=(char **)REALLOC(define_val,sizeof(char *)*defines+1)) - ==NULL) { - printf("Too many defines.\r\n"); - exit(1); } - if((define_val[defines]=(char *)MALLOC(strlen(arg2)+1))==NULL) { - printf("Too many defines.\r\n"); - exit(1); } - strcpy(define_str[defines],arg); - strcpy(define_val[defines],arg2); - defines++; - continue; } - - if(!stricmp(p,"!GLOBAL")) { /* declare global variables */ - if(!*arg) break; - for(p=arg;*p && *p!='#';) { - sp=strchr(p,SP); - if(sp) *sp=0; - newvar(p); - if(!sp) - break; - p=sp+1; - while(*p && *p<=SP) - p++; } - continue; } - - if(!stricmp(p,"PATCH")) { - if(!*arg) break; - p=arg; - while(*p) { - while(*p && *p<=SP) p++; - tmp[0]=*p++; - tmp[1]=*p++; - tmp[2]=0; - if(!tmp[0]) - break; - ch=ahtoul(tmp); - fputc(ch,out); } - continue; } - - if(!stricmp(p,"SHOW_VARS")) { - fputc(CS_VAR_INSTRUCTION,out); - fputc(SHOW_VARS,out); - continue; } - - if(!stricmp(p,"COMPARE_ARS")) { - if(!*arg) break; - strupr(arg); - ar=arstr(&i,arg); - fprintf(out,"%c%c",CS_COMPARE_ARS,(uchar)i); - fwrite(ar,i,1,out); - FREE(ar); - continue; } - - if(!stricmp(p,"CHKSYSPASS")) { - fprintf(out,"%c",CS_CHKSYSPASS); - continue; } - if(!stricmp(p,"INFO_SYSTEM")) { - fprintf(out,"%c",CS_INFO_SYSTEM); - continue; } - if(!stricmp(p,"INFO_SUBBOARD")) { - fprintf(out,"%c",CS_INFO_SUBBOARD); - continue; } - if(!stricmp(p,"INFO_DIRECTORY")) { - fprintf(out,"%c",CS_INFO_DIRECTORY); - continue; } - if(!stricmp(p,"INFO_VERSION")) { - fprintf(out,"%c",CS_INFO_VERSION); - continue; } - if(!stricmp(p,"INFO_USER")) { - fprintf(out,"%c",CS_INFO_USER); - continue; } - if(!stricmp(p,"INFO_XFER_POLICY")) { - fprintf(out,"%c",CS_INFO_XFER_POLICY); - continue; } - if(!stricmp(p,"LOGKEY")) { - fprintf(out,"%c",CS_LOGKEY); - continue; } - if(!stricmp(p,"LOGKEY_COMMA")) { - fprintf(out,"%c",CS_LOGKEY_COMMA); - continue; } - if(!stricmp(p,"LOGSTR")) { - fprintf(out,"%c",CS_LOGSTR); - continue; } - - if(!stricmp(p,"ONLINE")) { - fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_ONLINE); - continue; } - if(!stricmp(p,"OFFLINE")) { - fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_OFFLINE); - continue; } - if(!stricmp(p,"NEWUSER")) { - fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_NEWUSER); - continue; } - if(!stricmp(p,"LOGON")) { - fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_LOGON); - continue; } - if(!stricmp(p,"LOGOUT")) { - fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_LOGOUT); - continue; } - if(!stricmp(p,"EXIT")) { - fprintf(out,"%c%c",CS_ONE_MORE_BYTE,CS_EXIT); - continue; } - - if(!stricmp(p,"USER_EVENT")) { - if(!*arg) - break; - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(2,out); // int offset - fputc(1,out); // int length - ch=0; } // place holder - else - ch=val(src,arg); - fprintf(out,"%c%c",CS_TWO_MORE_BYTES,CS_USER_EVENT); - fwrite(&ch,1,1,out); - continue; } - - if(!stricmp(p,"PUT_NODE")) { - fprintf(out,"%c",CS_PUT_NODE); - continue; } - if(!stricmp(p,"SYNC")) { - fprintf(out,"%c",CS_SYNC); - continue; } - if(!stricmp(p,"ASYNC")) { - fprintf(out,"%c",CS_ASYNC); - continue; } - if(!stricmp(p,"RIOSYNC")) { - fprintf(out,"%c",CS_RIOSYNC); - continue; } - if(!stricmp(p,"GETTIMELEFT")) { - fprintf(out,"%c",CS_GETTIMELEFT); - continue; } - if(!stricmp(p,"SAVELINE")) { - fprintf(out,"%c",CS_SAVELINE); - continue; } - if(!stricmp(p,"RESTORELINE")) { - fprintf(out,"%c",CS_RESTORELINE); - continue; } - if(!stricmp(p,"IF_TRUE") || !stricmp(p,"IF_EQUAL")) { - fprintf(out,"%c",CS_IF_TRUE); - continue; } - if(!stricmp(p,"IF_FALSE") || !stricmp(p,"IF_NOT_EQUAL")) { - fprintf(out,"%c",CS_IF_FALSE); - continue; } - if(!stricmp(p,"IF_GREATER")) { - fprintf(out,"%c",CS_IF_GREATER); - continue; } - if(!stricmp(p,"IF_GREATER_OR_EQUAL") - || !stricmp(p,"IF_EQUAL_OR_GREATER")) { - fprintf(out,"%c",CS_IF_GREATER_OR_EQUAL); - continue; } - if(!stricmp(p,"IF_LESS")) { - fprintf(out,"%c",CS_IF_LESS); - continue; } - if(!stricmp(p,"IF_LESS_OR_EQUAL") - || !stricmp(p,"IF_EQUAL_OR_LESS")) { - fprintf(out,"%c",CS_IF_LESS_OR_EQUAL); - continue; } - if(!stricmp(p,"ENDIF") || !stricmp(p,"END_IF")) { - fprintf(out,"%c",CS_ENDIF); - continue; } - if(!stricmp(p,"ELSE")) { - fprintf(out,"%c",CS_ELSE); - continue; } - if(p[0]==':') { /* :label */ - p++; - sp=strchr(p,SP); - if(sp) - *sp=0; - for(i=0;i<labels;i++) - if(!stricmp(label_name[i],p)) - break; - if(i<labels) { - printf("SYNTAX ERROR (duplicate label name):\n"); - printf(linestr,src,line,p); - exit(1); } - if((label_name=(char **)REALLOC(label_name,sizeof(char *)*labels+1)) - ==NULL) { - printf("Too many labels.\n"); - exit(1); } - if((label_indx=(uint *)REALLOC(label_indx,sizeof(int)*labels+1)) - ==NULL) { - printf("Too many labels.\n"); - exit(1); } - if((label_name[labels]=(char *)MALLOC(strlen(p)+1))==NULL) { - printf("Too many labels.\r\n"); - exit(1); } - strcpy(label_name[labels],p); - label_indx[labels]=ftell(out); - labels++; - continue; } - if(!stricmp(p,"GOTO")) { /* goto */ - if(!*arg) break; - sp=strchr(arg,SP); - if(sp) - *sp=0; - if((goto_label=(char **)REALLOC(goto_label,sizeof(char *)*gotos+1)) - ==NULL) { - printf("Too many gotos.\r\n"); - exit(1); } - if((goto_file=(char **)REALLOC(goto_file,sizeof(char *)*gotos+1)) - ==NULL) { - printf("Too many gotos.\r\n"); - exit(1); } - if((goto_indx=(uint *)REALLOC(goto_indx,sizeof(int)*gotos+1)) - ==NULL) { - printf("Too many gotos.\r\n"); - exit(1); } - if((goto_line=(uint *)REALLOC(goto_line,sizeof(int)*gotos+1)) - ==NULL) { - printf("Too many gotos.\r\n"); - exit(1); } - if((goto_label[gotos]=(char *)MALLOC(strlen(arg)+1))==NULL) { - printf("Too many gotos.\r\n"); - exit(1); } - if((goto_file[gotos]=(char *)MALLOC(strlen(str)+1))==NULL) { - printf("Too many gotos.\r\n"); - exit(1); } - strcpy(goto_label[gotos],arg); - strcpy(goto_file[gotos],str); - goto_indx[gotos]=ftell(out); - goto_line[gotos]=line; - gotos++; - fprintf(out,"%c%c%c",CS_GOTO,0xff,0xff); - continue; } - if(!stricmp(p,"CALL")) { /* call */ - if(!*arg) break; - sp=strchr(arg,SP); - if(sp) - *sp=0; - if((call_label=(char **)REALLOC(call_label,sizeof(char *)*(calls+1))) - ==NULL) { - printf("Too many calls.\r\n"); - exit(1); } - if((call_file=(char **)REALLOC(call_file,sizeof(char *)*(calls+1))) - ==NULL) { - printf("Too many calls.\r\n"); - exit(1); } - if((call_indx=(uint *)REALLOC(call_indx,sizeof(int)*(calls+1))) - ==NULL) { - printf("Too many calls.\r\n"); - exit(1); } - if((call_line=(uint *)REALLOC(call_line,sizeof(int)*(calls+1))) - ==NULL) { - printf("Too many calls.\r\n"); - exit(1); } - if((call_label[calls]=(char *)MALLOC(strlen(arg)+1))==NULL) { - printf("Too many calls.\r\n"); - exit(1); } - if((call_file[calls]=(char *)MALLOC(strlen(src)+1))==NULL) { - printf("Too many calls.\r\n"); - exit(1); } - - strcpy(call_label[calls],arg); - strcpy(call_file[calls],src); - call_indx[calls]=ftell(out); - call_line[calls]=line; - calls++; - fprintf(out,"%c%c%c",CS_CALL,0xff,0xff); - continue; } - - if(!stricmp(p,"RETURN")) { - fprintf(out,"%c",CS_RETURN); - continue; } - if(!stricmp(p,"CMD_HOME")) { - fprintf(out,"%c",CS_CMD_HOME); - continue; } - if(!stricmp(p,"CMDKEY")) { - if(!*arg) break; - if(!stricmp(arg,"DIGIT")) - ch=CS_DIGIT; - else if(!stricmp(arg,"EDIGIT")) - ch=CS_EDIGIT; - else - ch=toupper(*arg); - if(ch=='/') - ch=*(arg+1)|0x80; /* high bit indicates slash required */ - else if(ch=='^' && *(arg+1)>=0x40) - ch=*(arg+1)-0x40; /* ctrl char */ - else if(ch=='\\') - ch=cesc(*(arg+1)); - else if(ch=='\'') - ch=*(arg+1); - fprintf(out,"%c%c",CS_CMDKEY,ch); - continue; } - if(!stricmp(p,"SETLOGIC") || !stricmp(p,"SET_LOGIC")) { - if(!*arg) break; - if(!stricmp(arg,"TRUE") || !stricmp(arg,"EQUAL")) - ch=LOGIC_TRUE; - else if(!stricmp(arg,"GREATER")) - ch=LOGIC_GREATER; - else if(!stricmp(arg,"LESS")) - ch=LOGIC_LESS; - else - ch=LOGIC_FALSE; - fprintf(out,"%c%c",CS_SETLOGIC,ch); - continue; } - - if(!stricmp(p,"DEFINE_STR_VAR") || !stricmp(p,"STR")) { - if(!*arg) break; - for(p=arg;*p && *p!='#';) { - sp=strchr(p,SP); - if(sp) *sp=0; - fputc(CS_VAR_INSTRUCTION,out); - fputc(DEFINE_STR_VAR,out); - newvar(p); - writecrc(src,p); - if(!sp) - break; - p=sp+1; - while(*p && *p<=SP) - p++; } - continue; } - if(!stricmp(p,"DEFINE_INT_VAR") || !stricmp(p,"INT")) { - if(!*arg) break; - for(p=arg;*p && *p!='#';) { - sp=strchr(p,SP); - if(sp) *sp=0; - fputc(CS_VAR_INSTRUCTION,out); - fputc(DEFINE_INT_VAR,out); - newvar(p); - writecrc(src,p); - if(!sp) - break; - p=sp+1; - while(*p && *p<=SP) - p++; } - continue; } - if(!stricmp(p,"DEFINE_GLOBAL_STR_VAR") || !stricmp(p,"GLOBAL_STR")) { - if(!*arg) break; - for(p=arg;*p && *p!='#';) { - sp=strchr(p,SP); - if(sp) *sp=0; - fputc(CS_VAR_INSTRUCTION,out); - fputc(DEFINE_GLOBAL_STR_VAR,out); - newvar(p); - writecrc(src,p); - if(!sp) - break; - p=sp+1; - while(*p && *p<=SP) - p++; } - continue; } - if(!stricmp(p,"DEFINE_GLOBAL_INT_VAR") || !stricmp(p,"GLOBAL_INT")) { - if(!*arg) break; - for(p=arg;*p && *p!='#';) { - sp=strchr(p,SP); - if(sp) *sp=0; - fputc(CS_VAR_INSTRUCTION,out); - fputc(DEFINE_GLOBAL_INT_VAR,out); - newvar(p); - writecrc(src,p); - if(!sp) - break; - p=sp+1; - while(*p && *p<=SP) - p++; } - continue; } - - if(!stricmp(p,"LOGIN")) { - if(!*arg) break; - fputc(CS_STR_FUNCTION,out); - fputc(CS_LOGIN,out); - writecstr(arg); - continue; } - - if(!stricmp(p,"LOAD_TEXT")) { - if(!*arg) break; - fputc(CS_STR_FUNCTION,out); - fputc(CS_LOAD_TEXT,out); - writestr(arg); - continue; } - - if(!stricmp(p,"SET_STR_VAR") - || (!stricmp(p,"SET") && strchr(arg,'"'))) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(SET_STR_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecstr(arg2); - continue; } - if(!stricmp(p,"CAT_STR_VAR") - || (!stricmp(p,"STRCAT") && strchr(arg,'"'))) { - fputc(CS_VAR_INSTRUCTION,out); - fputc(CAT_STR_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecstr(arg2); - continue; } - if((!stricmp(p,"STRSTR") || !stricmp(p,"COMPARE_SUBSTR")) - && strchr(arg,'"')) { - fputc(CS_VAR_INSTRUCTION,out); - fputc(STRSTR_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecstr(arg2); - continue; } - if(!stricmp(p,"STRSTR") || !stricmp(p,"COMPARE_SUBSTR")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(STRSTR_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - if(!stricmp(p,"CAT_STR_VARS") || !stricmp(p,"STRCAT")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(CAT_STR_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - if(!stricmp(p,"FORMAT") || !stricmp(p,"SPRINTF")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(FORMAT_STR_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* Write destination variable */ - p++; - while(*p && *p<=SP) p++; - arg=p; - p=strrchr(arg,'"'); - if(!p) - break; - *p=0; - p++; - while(*p && *p<=SP) p++; - writecstr(arg); /* Write string */ - l=ftell(out); - fputc(0,out); /* Write total number of args */ - i=0; - while(p && *p) { - arg=p; - p=strchr(arg,SP); - if(p) { - *p=0; - p++; } - writecrc(src,arg); - i++; } - fseek(out,l,SEEK_SET); - fputc((char)i,out); - fseek(out,i*4,SEEK_CUR); - continue; } - - if(!stricmp(p,"STRFTIME") || !stricmp(p,"FTIME_STR")) { - if(!*arg || !*arg2 || !*arg3) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(FORMAT_TIME_STR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* Write destination variable */ - p++; - while(*p && *p<=SP) p++; - arg=p; - p=strrchr(arg,'"'); - if(!p) - break; - *p=0; - writecstr(arg); /* Write string */ - p++; - while(*p && *p<=SP) p++; - writecrc(src,p); - continue; } - - if(!stricmp(p,"TIME_STR")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(TIME_STR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"DATE_STR")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(DATE_STR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"SECOND_STR")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(SECOND_STR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - - if(!stricmp(p,"SET_INT_VAR") - || (!stricmp(p,"SET") && *arg2!='"')) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(SET_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - fwrite(&l,4,1,out); - continue; } - - if(!stricmp(p,"COMPARE_STR_VAR") || - (!stricmp(p,"COMPARE") && *arg2=='"')) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(COMPARE_STR_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecstr(arg2); - continue; } - - if(!stricmp(p,"COMPARE_STRN_VAR") || - ((!stricmp(p,"STRNCMP") || !stricmp(p,"COMPARE_STRN")) - && *arg3 && strchr(arg3,'"'))) { - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(2,out); // int offset - fputc(1,out); // int length - i=0; } // place holder - else - i=val(src,arg); - fputc(CS_VAR_INSTRUCTION,out); - fputc(STRNCMP_VAR,out); - fwrite(&i,1,1,out); /* Length */ - p=strchr(arg2,SP); - if(!p) - break; - *p=0; - p++; - while(*p && *p<=SP) p++; - writecrc(src,arg2); - writecstr(p); - continue; } - - if(!stricmp(p,"COMPARE_STRN_VARS") || !stricmp(p,"STRNCMP") - || !stricmp(p,"COMPARE_STRN")) { - if(!*arg || !*arg2 || !*arg3) - break; - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(2,out); // int offset - fputc(1,out); // int length - i=0; } // place holder - else - i=val(src,arg); - fputc(CS_VAR_INSTRUCTION,out); - fputc(STRNCMP_VARS,out); - - fwrite(&i,1,1,out); /* Length */ - p=strchr(arg2,SP); - if(!p) - break; - *p=0; - p++; - while(*p && *p<=SP) p++; - writecrc(src,arg2); - writecrc(src,p); - continue; } - - if(!stricmp(p,"COMPARE_INT_VAR") || - (!stricmp(p,"COMPARE") - && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { - if(!*arg) break; - - fputc(CS_VAR_INSTRUCTION,out); - fputc(COMPARE_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - fwrite(&l,4,1,out); - continue; } - - if(!stricmp(p,"COMPARE")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(COMPARE_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - if(!stricmp(p,"COPY")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(COPY_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - if(!stricmp(p,"SWAP")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(SWAP_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"TIME")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(TIME_INT_VAR,out); - writecrc(src,arg); - continue; } - - if(!stricmp(p,"DATE_INT")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(DATE_STR_TO_INT,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"CRC16")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(CRC16_TO_INT,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"CRC32")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(CRC32_TO_INT,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"CHKSUM")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(CHKSUM_TO_INT,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"ADD_INT_VAR") - || (!stricmp(p,"ADD") - && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(ADD_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - if(!l) - break; - fwrite(&l,4,1,out); - continue; } - if(!stricmp(p,"ADD_INT_VARS") || !stricmp(p,"ADD")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(ADD_INT_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"SUB_INT_VAR") - || (!stricmp(p,"SUB") - && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(SUB_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - if(!l) - break; - fwrite(&l,4,1,out); - continue; } - if(!stricmp(p,"SUB_INT_VARS") || !stricmp(p,"SUB")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(SUB_INT_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"MUL_INT_VAR") - || (!stricmp(p,"MUL") - && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(MUL_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - if(!l) - break; - fwrite(&l,4,1,out); - continue; } - if(!stricmp(p,"MUL_INT_VARS") || !stricmp(p,"MUL")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(MUL_INT_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"DIV_INT_VAR") - || (!stricmp(p,"DIV") - && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(DIV_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - if(!l) - break; - fwrite(&l,4,1,out); - continue; } - if(!stricmp(p,"DIV_INT_VARS") || !stricmp(p,"DIV")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(DIV_INT_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"MOD_INT_VAR") - || (!stricmp(p,"MOD") - && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(MOD_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - if(!l) - break; - fwrite(&l,4,1,out); - continue; } - if(!stricmp(p,"MOD_INT_VARS") || !stricmp(p,"MOD")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(MOD_INT_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"AND_INT_VAR") - || (!stricmp(p,"AND") - && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(AND_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - fwrite(&l,4,1,out); - continue; } - if(!stricmp(p,"AND_INT_VARS") || !stricmp(p,"AND")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(AND_INT_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"OR_INT_VAR") - || (!stricmp(p,"OR") - && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(OR_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - fwrite(&l,4,1,out); - continue; } - if(!stricmp(p,"OR_INT_VARS") || !stricmp(p,"OR")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(OR_INT_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"NOT_INT_VAR") - || (!stricmp(p,"NOT") - && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(NOT_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - fwrite(&l,4,1,out); - continue; } - if(!stricmp(p,"NOT_INT_VARS") || !stricmp(p,"NOT")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(NOT_INT_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"XOR_INT_VAR") - || (!stricmp(p,"XOR") - && (isdigit(*arg2) || atol(arg2) || *arg2=='\'' || *arg2=='.'))) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(XOR_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - l=val(src,arg2); - fwrite(&l,4,1,out); - continue; } - if(!stricmp(p,"XOR_INT_VARS") || !stricmp(p,"XOR")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(XOR_INT_VARS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - - if(!stricmp(p,"RANDOM_INT_VAR") || !stricmp(p,"RANDOM")) { - if(!*arg) break; - if((l=isvar(arg2))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(6,out); // int offset - fputc(4,out); // int length - l=0; } // place holder - else - l=val(src,arg2); - fputc(CS_VAR_INSTRUCTION,out); - fputc(RANDOM_INT_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - fwrite(&l,4,1,out); - continue; } - - if(!stricmp(p,"SWITCH")) { - if(!*arg) break; - fputc(CS_SWITCH,out); - writecrc(src,arg); - continue; } - if(!stricmp(p,"END_SWITCH")) { - fputc(CS_END_SWITCH,out); - continue; } - if(!stricmp(p,"CASE")) { - if(!*arg) break; - fputc(CS_CASE,out); - l=val(src,arg); - fwrite(&l,4,1,out); - continue; } - if(!stricmp(p,"DEFAULT")) { - fputc(CS_DEFAULT,out); - continue; } - if(!stricmp(p,"END_CASE")) { - fputc(CS_END_CASE,out); - continue; } - - if(!stricmp(p,"PRINT") && !strchr(arg,'"') && !strchr(arg,'\\') - && !strchr(arg,SP)) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(PRINT_VAR,out); - writecrc(src,arg); - continue; } - - if(!stricmp(p,"PRINTF")) { - if(!*arg) break; - fputc(CS_VAR_INSTRUCTION,out); - fputc(VAR_PRINTF,out); - p=strrchr(arg,'"'); - if(!p) - break; - *p=0; - p++; - while(*p && *p<=SP) p++; - writecstr(arg); /* Write string */ - l=ftell(out); - fputc(0,out); /* Write total number of args */ - i=0; - while(p && *p) { - arg=p; - p=strchr(arg,SP); - if(p) { - *p=0; - p++; } - writecrc(src,arg); - i++; } - fseek(out,l,SEEK_SET); - fputc((char)i,out); - fseek(out,i*4,SEEK_CUR); - continue; } - - if(!stricmp(p,"FOPEN")) { - if(!*arg || !*arg2 || !*arg3) break; - if((l=isvar(arg2))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(6,out); // int offset - fputc(2,out); // int length - i=0; } // place holder - else - i=val(src,arg2); - - fputc(CS_FIO_FUNCTION,out); - if(*arg3=='"') - fputc(FIO_OPEN,out); - else - fputc(FIO_OPEN_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - p=strchr(arg2,SP); - if(!p) - break; - *p=0; - p++; - fwrite(&i,2,1,out); - while(*p && *p<=SP) p++; - if(*p=='"') - writestr(p); - else - writecrc(src,p); - continue; } - if(!stricmp(p,"FCLOSE")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - fputc(FIO_CLOSE,out); - writecrc(src,arg); - continue; } - if(!stricmp(p,"FFLUSH")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - fputc(FIO_FLUSH,out); - writecrc(src,arg); - continue; } - if(!stricmp(p,"FREAD")) { - if(!*arg) break; - - fputc(CS_FIO_FUNCTION,out); - if(!*arg3 || isdigit(*arg3) || atoi(arg3)) - fputc(FIO_READ,out); - else - fputc(FIO_READ_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - p=strchr(arg2,SP); - if(p) - *p=0; - writecrc(src,arg2); /* Variable */ - if(isdigit(*arg3)) - i=val(src,arg3); /* Length */ - else - i=0; - if(i || !*arg3) - fwrite(&i,2,1,out); - else - writecrc(src,arg3); - continue; } - if(!stricmp(p,"FWRITE")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - if(!*arg3 || isdigit(*arg3) || atoi(arg3)) - fputc(FIO_WRITE,out); - else - fputc(FIO_WRITE_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - p=strchr(arg2,SP); - if(p) - *p=0; - writecrc(src,arg2); /* Variable */ - if(isdigit(*arg3)) - i=val(src,arg3); /* Length */ - else - i=0; - if(i || !*arg3) - fwrite(&i,2,1,out); - else - writecrc(src,arg3); - continue; } - if(!stricmp(p,"FGET_LENGTH") - || !stricmp(p,"FGETLENGTH") - || !stricmp(p,"GETFLENGTH")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(FIO_GET_LENGTH,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - writecrc(src,arg2); /* Variable */ - continue; } - if(!stricmp(p,"FREAD_LINE")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(FIO_READ_LINE,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - writecrc(src,arg2); /* Variable */ - continue; } - if(!stricmp(p,"FEOF")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - fputc(FIO_EOF,out); - writecrc(src,arg); - continue; } - if(!stricmp(p,"FGET_POS")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(FIO_GET_POS,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - writecrc(src,arg2); /* Variable */ - continue; } - if(!stricmp(p,"FSET_POS") || !stricmp(p,"FSEEK")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - if(isdigit(*arg2) || atol(arg2)) - fputc(FIO_SEEK,out); - else - fputc(FIO_SEEK_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - p=strchr(arg2,SP); - if(p) - *p=0; - if(atol(arg2) || isdigit(*arg2)) { - l=val(src,arg2); - fwrite(&l,4,1,out); } - else - writecrc(src,arg2); /* Offset variable */ - i=0; - if(p) { - p++; - while(*p && *p<=SP) p++; - i=atoi(p); - if(!stricmp(p,"CUR")) - i=SEEK_CUR; - else if(!stricmp(p,"END")) - i=SEEK_END; } - fwrite(&i,2,1,out); - continue; } - if(!stricmp(p,"FLOCK")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - if(isdigit(*arg2) || atol(arg2)) - fputc(FIO_LOCK,out); - else - fputc(FIO_LOCK_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - if(atol(arg2) || isdigit(*arg2)) { - l=val(src,arg2); - if(!l) - break; - fwrite(&l,4,1,out); } - else - writecrc(src,arg2); /* Length variable */ - continue; } - if(!stricmp(p,"FUNLOCK")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - if(isdigit(*arg2) || atol(arg2)) - fputc(FIO_UNLOCK,out); - else - fputc(FIO_UNLOCK_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - if(atol(arg2) || isdigit(*arg2)) { - l=val(src,arg2); - if(!l) - break; - fwrite(&l,4,1,out); } - else - writecrc(src,arg2); /* Length variable */ - continue; } - if(!stricmp(p,"FSET_LENGTH")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - if(isdigit(*arg2) || atol(arg2)) - fputc(FIO_SET_LENGTH,out); - else - fputc(FIO_SET_LENGTH_VAR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - if(atol(arg2) || isdigit(*arg2)) { - l=val(src,arg2); - fwrite(&l,4,1,out); } - else - writecrc(src,arg2); /* Length variable */ - continue; } - if(!stricmp(p,"FPRINTF")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - fputc(FIO_PRINTF,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* Write destination variable */ - p++; - while(*p && *p<=SP) p++; - arg=p; - p=strrchr(arg,'"'); - if(!p) - break; - *p=0; - p++; - while(*p && *p<=SP) p++; - writecstr(arg); /* Write string */ - l=ftell(out); - fputc(0,out); /* Write total number of args */ - i=0; - while(p && *p) { - arg=p; - p=strchr(arg,SP); - if(p) { - *p=0; - p++; } - writecrc(src,arg); - i++; } - fseek(out,l,SEEK_SET); - fputc((char)i,out); - fseek(out,i*4,SEEK_CUR); - continue; } - if(!stricmp(p,"FSET_ETX")) { - if(!*arg) break; - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(2,out); // int offset - fputc(1,out); // int length - ch=0; } // place holder - else - ch=val(src,arg); - - fputc(CS_FIO_FUNCTION,out); - fputc(FIO_SET_ETX,out); - fwrite(&ch,1,1,out); - continue; } - if(!stricmp(p,"FGET_TIME")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(FIO_GET_TIME,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - writecrc(src,arg2); /* Variable */ - continue; } - if(!stricmp(p,"FSET_TIME")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(FIO_SET_TIME,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* File handle */ - writecrc(src,arg2); /* Variable */ - continue; } - if(!stricmp(p,"REMOVE_FILE")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - fputc(REMOVE_FILE,out); - writecrc(src,arg); /* Str var */ - continue; } - if(!stricmp(p,"RENAME_FILE")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(RENAME_FILE,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* str var */ - writecrc(src,arg2); /* str var */ - continue; } - if(!stricmp(p,"COPY_FILE")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(COPY_FILE,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* str var */ - writecrc(src,arg2); /* str var */ - continue; } - if(!stricmp(p,"MOVE_FILE")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(MOVE_FILE,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* str var */ - writecrc(src,arg2); /* str var */ - continue; } - if(!stricmp(p,"GET_FILE_ATTRIB")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(GET_FILE_ATTRIB,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* str var */ - writecrc(src,arg2); /* int var */ - continue; } - if(!stricmp(p,"SET_FILE_ATTRIB")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(SET_FILE_ATTRIB,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* str var */ - writecrc(src,arg2); /* int var */ - continue; } - if(!stricmp(p,"RMDIR") || !stricmp(p,"REMOVE_DIR")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - fputc(REMOVE_DIR,out); - writecrc(src,arg); /* Str var */ - continue; } - if(!stricmp(p,"MKDIR") || !stricmp(p,"MAKE_DIR")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - fputc(MAKE_DIR,out); - writecrc(src,arg); /* Str var */ - continue; } - if(!stricmp(p,"CHDIR") || !stricmp(p,"CHANGE_DIR")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - fputc(CHANGE_DIR,out); - writecrc(src,arg); /* Str var */ - continue; } - if(!stricmp(p,"OPEN_DIR")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(OPEN_DIR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* int var */ - writecrc(src,arg2); /* str var */ - continue; } - if(!stricmp(p,"READ_DIR")) { - if(!*arg || !*arg2) break; - fputc(CS_FIO_FUNCTION,out); - fputc(READ_DIR,out); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); /* int var */ - writecrc(src,arg2); /* str var */ - continue; } - if(!stricmp(p,"REWIND_DIR")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - fputc(REWIND_DIR,out); - writecrc(src,arg); /* int var */ - continue; } - if(!stricmp(p,"CLOSE_DIR")) { - if(!*arg) break; - fputc(CS_FIO_FUNCTION,out); - fputc(CLOSE_DIR,out); - writecrc(src,arg); /* int var */ - continue; } - - if(!stricmp(p,"NODE_ACTION")) { - if(!*arg) break; - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(1,out); // int length - ch=0; } // place holder - else - ch=val(src,arg); - - fprintf(out,"%c%c",CS_NODE_ACTION,ch); - continue; } - if(!stricmp(p,"NODE_STATUS")) { - if(!*arg) break; - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(1,out); // int length - ch=0; } // place holder - else - ch=val(src,arg); - - fprintf(out,"%c%c",CS_NODE_STATUS,ch); - continue; } - if(!stricmp(p,"END_CMD") || !stricmp(p,"ENDCMD")) { - fprintf(out,"%c",CS_END_CMD); - continue; } - if(!stricmp(p,"CMD_POP") || !stricmp(p,"CMDPOP")) { - fprintf(out,"%c",CS_CMD_POP); - continue; } - if(!stricmp(p,"CLS")) { - fprintf(out,"%c",CS_CLS); - continue; } - if(!stricmp(p,"CRLF")) { - fprintf(out,"%c",CS_CRLF); - continue; } - if(!stricmp(p,"PAUSE")) { - fprintf(out,"%c",CS_PAUSE); - continue; } - if(!stricmp(p,"PAUSE_RESET")) { - fprintf(out,"%c",CS_PAUSE_RESET); - continue; } - if(!stricmp(p,"CLEAR_ABORT")) { - fprintf(out,"%c",CS_CLEAR_ABORT); - continue; } - if(!stricmp(p,"GETLINES")) { - fprintf(out,"%c",CS_GETLINES); - continue; } - if(!stricmp(p,"GETFILESPEC")) { - fprintf(out,"%c",CS_GETFILESPEC); - continue; } - if(!stricmp(p,"FINDUSER")) { - fprintf(out,"%c",CS_FINDUSER); - continue; } - - if(!stricmp(p,"LOG")) { - if(!*arg) break; - fprintf(out,"%c",CS_LOG); - writecstr(arg); - continue; } - if(!stricmp(p,"MNEMONICS")) { - if(!*arg) break; - fprintf(out,"%c",CS_MNEMONICS); - writecstr(arg); - continue; } - if(!stricmp(p,"PRINT")) { - if(!*arg) break; - fprintf(out,"%c",CS_PRINT); - writecstr(arg); - continue; } - if(!stricmp(p,"PRINT_LOCAL")) { - if(!*arg) break; - fprintf(out,"%c",CS_PRINT_LOCAL); - writecstr(arg); - continue; } - if(!stricmp(p,"PRINT_REMOTE")) { - if(!*arg) break; - fprintf(out,"%c",CS_PRINT_REMOTE); - writecstr(arg); - continue; } - if(!stricmp(p,"PRINTFILE")) { - if(!*arg) break; - if(*arg=='"') { - fprintf(out,"%c",CS_PRINTFILE); - writestr(arg); } - else { - if((l=isvar(arg2))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(6,out); // int offset - fputc(2,out); // int length - i=0; } // place holder - else - i=val(src,arg2); - - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,PRINTFILE_VAR_MODE); - p=strchr(arg,SP); - if(p) *p=0; - writecrc(src,arg); - fwrite(&i,2,1,out); } - continue; } - if(!stricmp(p,"PRINTTAIL")) { - if(!*arg || !*arg2) - break; - if((l=isvar(arg3))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(8,out); // int offset - fputc(1,out); // int length - j=0; } // place holder - else - j=val(src,arg3); - - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,PRINTTAIL_VAR_MODE); - p=strchr(arg,SP); - if(p) *p=0; - writecrc(src,arg); - i=val(src,arg2); - fwrite(&i,2,1,out); - fwrite(&j,1,1,out); - continue; } - - if(!stricmp(p,"PRINTFILE_STR")) { - fprintf(out,"%c",CS_PRINTFILE_STR); - continue; } - if(!stricmp(p,"PRINTFILE_LOCAL")) { - if(!*arg) break; - fprintf(out,"%c",CS_PRINTFILE_LOCAL); - writestr(arg); - continue; } - if(!stricmp(p,"PRINTFILE_REMOTE")) { - if(!*arg) break; - fprintf(out,"%c",CS_PRINTFILE_REMOTE); - writestr(arg); - continue; } - if(!stricmp(p,"EXEC")) { - if(!*arg) break; - fprintf(out,"%c",CS_EXEC); - writestr(arg); - continue; } - if(!stricmp(p,"EXEC_INT")) { - if(!*arg) break; - fprintf(out,"%c",CS_EXEC_INT); - writestr(arg); - continue; } - if(!stricmp(p,"EXEC_BIN")) { - if(!*arg) break; - fprintf(out,"%c",CS_EXEC_BIN); - writestr(arg); - continue; } - if(!stricmp(p,"EXEC_XTRN")) { - if(!*arg) break; - fprintf(out,"%c",CS_EXEC_XTRN); - writestr(arg); - continue; } - - if(!stricmp(p,"SELECT_SHELL")) { - fprintf(out,"%c",CS_SELECT_SHELL); - continue; } - if(!stricmp(p,"SET_SHELL")) { - fprintf(out,"%c",CS_SET_SHELL); - continue; } - if(!stricmp(p,"SELECT_EDITOR")) { - fprintf(out,"%c",CS_SELECT_EDITOR); - continue; } - if(!stricmp(p,"SET_EDITOR")) { - fprintf(out,"%c",CS_SET_EDITOR); - continue; } - - if(!stricmp(p,"YES_NO")) { - if(!*arg) break; - fprintf(out,"%c",CS_YES_NO); - writecstr(arg); - continue; } - if(!stricmp(p,"NO_YES")) { - if(!*arg) break; - fprintf(out,"%c",CS_NO_YES); - writecstr(arg); - continue; } - if(!stricmp(p,"MENU")) { - if(!*arg) break; - fprintf(out,"%c",CS_MENU); - writestr(arg); - continue; } - if(!stricmp(p,"SET_MENU_DIR")) { - if(!*arg) break; - fprintf(out,"%c",CS_SET_MENU_DIR); - writestr(arg); - continue; } - if(!stricmp(p,"SET_MENU_FILE")) { - if(!*arg) break; - fprintf(out,"%c",CS_SET_MENU_FILE); - writestr(arg); - continue; } - if(!stricmp(p,"SEND_FILE_VIA")) { - if(!*arg || !*arg2) break; - if(*arg2=='"') { - fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,SEND_FILE_VIA,*arg); - writestr(arg2); } - else { - fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,SEND_FILE_VIA_VAR,*arg); - writecrc(src,arg2); } - continue; } - if(!stricmp(p,"RECEIVE_FILE_VIA")) { - if(!*arg || !*arg2) break; - if(*arg2=='"') { - fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,RECEIVE_FILE_VIA,*arg); - writestr(arg2); } - else { - fprintf(out,"%c%c%c",CS_VAR_INSTRUCTION,RECEIVE_FILE_VIA_VAR,*arg); - writecrc(src,arg2); } - continue; } - if(!stricmp(p,"CHKFILE")) { - if(!*arg) break; - if(*arg=='"') { - fprintf(out,"%c",CS_CHKFILE); - writestr(arg); } - else { - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,CHKFILE_VAR); - writecrc(src,arg); } - continue; } - if(!stricmp(p,"GET_FILE_LENGTH")) { - if(!*arg || !*arg2) - break; - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,FLENGTH_TO_INT); - p=strchr(arg,SP); - if(p) *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - if(!stricmp(p,"GET_FILE_TIME")) { - if(!*arg || !*arg2) - break; - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,FTIME_TO_INT); - p=strchr(arg,SP); - if(p) *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - if(!stricmp(p,"CHARVAL")) { - if(!*arg || !*arg2) - break; - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,CHARVAL_TO_INT); - p=strchr(arg,SP); - if(p) *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - if(!stricmp(p,"SETSTR")) { - if(!*arg) break; - fprintf(out,"%c",CS_SETSTR); - writecstr(arg); - continue; } - if(!stricmp(p,"COMPARE_STR")) { - if(!*arg) break; - fprintf(out,"%c",CS_COMPARE_STR); - writecstr(arg); - continue; } - if(!stricmp(p,"GET_TEMPLATE")) { - if(!*arg) break; - fprintf(out,"%c",CS_GET_TEMPLATE); - writestr(arg); - continue; } - if(!stricmp(p,"READ_SIF")) { - if(!*arg) break; - fprintf(out,"%c",CS_READ_SIF); - writestr(arg); - continue; } - if(!stricmp(p,"CREATE_SIF")) { - if(!*arg) break; - fprintf(out,"%c",CS_CREATE_SIF); - writestr(arg); - continue; } - if(!stricmp(p,"TRASHCAN")) { - if(!*arg) break; - fprintf(out,"%c",CS_TRASHCAN); - writestr(arg); - continue; } - if(!stricmp(p,"CMDSTR")) { - if(!*arg) break; - fprintf(out,"%c",CS_CMDSTR); - writecstr(arg); - continue; } - if(!stricmp(p,"CMDKEYS")) { - if(!*arg) break; - fprintf(out,"%c",CS_CMDKEYS); - for(p=arg;*p && *p!='#';p++) { - ch=*p; - if(ch=='"') - continue; - if(ch=='/') { - p++; - ch=*p|0x80; } /* high bit indicates slash required */ - else if(ch=='^' && *(p+1)>=0x40) { - p++; - ch=*p; - ch-=0x40; } - else if(ch=='\\') { - p++; - ch=cesc(*p); } - fputc(ch,out); } - fputc(0,out); - continue; } - if(!stricmp(p,"COMPARE_WORD")) { - if(!*arg) break; - fprintf(out,"%c",CS_COMPARE_WORD); - writecstr(arg); - continue; } - if(!stricmp(p,"GETSTR")) { - p=strchr(arg,SP); - if(p) *p=0; - if((!*arg || isdigit(*arg) || !stricmp(arg,"STR")) && !*arg3) - fprintf(out,"%c%c",CS_GETSTR,atoi(arg) ? atoi(arg) - : *arg2 ? atoi(arg2) : 128); - else { - if((l=isvar(arg2))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(6,out); // int offset - fputc(1,out); // int length - i=0; } // place holder - else if(*arg2) - i=val(src,arg2); - else - i=0; - - fprintf(out,"%c%c",CS_VAR_INSTRUCTION - ,*arg3 ? GETSTR_MODE : GETSTR_VAR); - writecrc(src,arg); - - if(!i) i=128; - fwrite(&i,1,1,out); - if(*arg3) { - l=val(src,arg3); - fwrite(&l,4,1,out); } } - continue; } - if(!stricmp(p,"GETNUM")) { - if(!*arg) break; - p=strchr(arg,SP); - if(p) *p=0; - if(isdigit(*arg)) { - i=val(src,arg); - fprintf(out,"%c",CS_GETNUM); - fwrite(&i,2,1,out); } - else { - if((l=isvar(arg2))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(6,out); // int offset - fputc(2,out); // int length - i=0; } // place holder - else - i=val(src,arg2); - - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETNUM_VAR); - writecrc(src,arg); - fwrite(&i,2,1,out); } - continue; } - if(!stricmp(p,"MSWAIT")) { - if(!*arg) break; - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(2,out); // int length - i=0; } // place holder - else - i=val(src,arg); - - fprintf(out,"%c",CS_MSWAIT); - fwrite(&i,2,1,out); - continue; } - if(!stricmp(p,"GETLINE")) { - p=strchr(arg,SP); - if(p) *p=0; - if(!*arg || isdigit(*arg)) - fprintf(out,"%c%c",CS_GETLINE,*arg ? atoi(arg) :128); - else { - if((l=isvar(arg2))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(6,out); // int offset - fputc(1,out); // int length - i=0; } // place holder - else - i=val(src,arg2); - - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETLINE_VAR); - writecrc(src,arg); - if(!i) i=128; - fwrite(&i,1,1,out); } - continue; } - if(!stricmp(p,"GETSTRUPR")) { - p=strchr(arg,SP); - if(p) *p=0; - if(!*arg || isdigit(*arg)) - fprintf(out,"%c%c",CS_GETSTRUPR,*arg ? atoi(arg) :128); - else { - if((l=isvar(arg2))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(6,out); // int offset - fputc(1,out); // int length - i=0; } // place holder - else - i=val(src,arg2); - - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETSTRUPR_VAR); - writecrc(src,arg); - if(!i) i=128; - fwrite(&i,1,1,out); } - continue; } - if(!stricmp(p,"GETNAME")) { - p=strchr(arg,SP); - if(p) *p=0; - if(!*arg || isdigit(*arg)) - fprintf(out,"%c%c",CS_GETNAME,*arg ? atoi(arg) :25); - else { - if((l=isvar(arg2))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(6,out); // int offset - fputc(1,out); // int length - i=0; } // place holder - else - i=atoi(arg2); - - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,GETNAME_VAR); - writecrc(src,arg); - if(!i) i=128; - fwrite(&i,1,1,out); } - continue; } - if(!stricmp(p,"SHIFT_STR")) { - if(!*arg) break; - p=strchr(arg,SP); - if(p) *p=0; - if(!*arg || isdigit(*arg)) - fprintf(out,"%c%c",CS_SHIFT_STR,atoi(arg)); - else { - if((l=isvar(arg2))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(6,out); // int offset - fputc(1,out); // int length - i=0; } // place holder - else - i=atoi(arg2); - - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,SHIFT_STR_VAR); - writecrc(src,arg); - if(!i) i=128; - fwrite(&i,1,1,out); } - continue; } - if(!stricmp(p,"TRUNCSP")) { - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,TRUNCSP_STR_VAR); - writecrc(src,arg); - continue; } - if(!stricmp(p,"STRIP_CTRL")) { - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRIP_CTRL_STR_VAR); - writecrc(src,arg); - continue; } - if(!stricmp(p,"STRUPR")) { - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRUPR_VAR); - writecrc(src,arg); - continue; } - if(!stricmp(p,"STRLWR")) { - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRLWR_VAR); - writecrc(src,arg); - continue; } - if(!stricmp(p,"STRLEN")) { - if(!*arg) break; - fprintf(out,"%c%c",CS_VAR_INSTRUCTION,STRLEN_INT_VAR); - p=strchr(arg,SP); - if(!p) - break; - *p=0; - writecrc(src,arg); - writecrc(src,arg2); - continue; } - if(!stricmp(p,"REPLACE_TEXT")) { - if(!*arg || !*arg2) break; - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(2,out); // int length - i=0; } // place holder - else - i=val(src,arg); - - fprintf(out,"%c",CS_REPLACE_TEXT); - fwrite(&i,2,1,out); - writecstr(arg2); - continue; } - if(!stricmp(p,"REVERT_TEXT")) { - if(!*arg) break; - if(!stricmp(arg,"ALL")) - i=0xffff; - else { - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(2,out); // int length - i=0; } // place holder - else - i=val(src,arg); } - - fprintf(out,"%c",CS_REVERT_TEXT); - fwrite(&i,2,1,out); - continue; } - if(!stricmp(p,"TOGGLE_USER_MISC") - || !stricmp(p,"COMPARE_USER_MISC")) { - if(!*arg) break; - - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(4,out); // int length - l=0; } // place holder - else - l=val(src,arg); - - if(!stricmp(p,"TOGGLE_USER_MISC")) - fprintf(out,"%c",CS_TOGGLE_USER_MISC); - else - fprintf(out,"%c",CS_COMPARE_USER_MISC); - fwrite(&l,4,1,out); - continue; } - - if(!stricmp(p,"TOGGLE_USER_CHAT") - || !stricmp(p,"COMPARE_USER_CHAT")) { - if(!*arg) break; - - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(4,out); // int length - l=0; } // place holder - else - l=val(src,arg); - - if(!stricmp(p,"TOGGLE_USER_CHAT")) - fprintf(out,"%c",CS_TOGGLE_USER_CHAT); - else - fprintf(out,"%c",CS_COMPARE_USER_CHAT); - fwrite(&l,4,1,out); - continue; } - - if(!stricmp(p,"TOGGLE_USER_QWK") - || !stricmp(p,"COMPARE_USER_QWK")) { - if(!*arg) break; - - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(4,out); // int length - l=0; } // place holder - else - l=val(src,arg); - - if(!stricmp(p,"TOGGLE_USER_QWK")) - fprintf(out,"%c",CS_TOGGLE_USER_QWK); - else - fprintf(out,"%c",CS_COMPARE_USER_QWK); - fwrite(&l,4,1,out); - continue; } - - if(!stricmp(p,"TOGGLE_NODE_MISC") - || !stricmp(p,"COMPARE_NODE_MISC")) { - if(!*arg) break; - - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(2,out); // int length - i=0; } // place holder - else - i=val(src,arg); - - if(!stricmp(p,"TOGGLE_NODE_MISC")) - fprintf(out,"%c",CS_TOGGLE_NODE_MISC); - else - fprintf(out,"%c",CS_COMPARE_NODE_MISC); - fwrite(&i,2,1,out); - continue; } - - if(!stricmp(p,"TOGGLE_USER_FLAG")) { - if(!*arg) break; - p=arg; - fprintf(out,"%c%c",CS_TOGGLE_USER_FLAG,toupper(*p++)); - while(*p && *p<=SP) p++; - fprintf(out,"%c",toupper(*p)); - continue; } - - if(!stricmp(p,"SET_USER_LEVEL")) { - if(!*arg) break; - - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(1,out); // int length - ch=0; } // place holder - else - ch=val(src,arg); - - fprintf(out,"%c%c",CS_SET_USER_LEVEL,ch); - continue; } - - if(!stricmp(p,"SET_USER_STRING")) { - if(!*arg) break; - - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(1,out); // int length - ch=0; } // place holder - else - ch=val(src,arg); - - fprintf(out,"%c%c",CS_SET_USER_STRING,ch); - continue; } - - - if(!stricmp(p,"ADJUST_USER_CREDITS")) { - if(!*arg) break; - - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(2,out); // int length - i=0; } // place holder - else - i=val(src,arg); - - fprintf(out,"%c",CS_ADJUST_USER_CREDITS); - fwrite(&i,2,1,out); - continue; } - - if(!stricmp(p,"ADJUST_USER_MINUTES")) { - if(!*arg) break; - - if((l=isvar(arg))!=0) { - fputc(CS_USE_INT_VAR,out); - fwrite(&l,4,1,out); // variable - fputc(1,out); // int offset - fputc(2,out); // int length - i=0; } // place holder - else - i=val(src,arg); - - fprintf(out,"%c",CS_ADJUST_USER_MINUTES); - fwrite(&i,2,1,out); - continue; } - - if(!stricmp(p,"SHOW_MEM")) { - fprintf(out,"%c",CS_SHOW_MEM); - continue; } - if(!stricmp(p,"GURU_LOG")) { - fprintf(out,"%c",CS_GURU_LOG); - continue; } - if(!stricmp(p,"ERROR_LOG")) { - fprintf(out,"%c",CS_ERROR_LOG); - continue; } - if(!stricmp(p,"SYSTEM_LOG")) { - fprintf(out,"%c",CS_SYSTEM_LOG); - continue; } - if(!stricmp(p,"SYSTEM_YLOG")) { - fprintf(out,"%c",CS_SYSTEM_YLOG); - continue; } - if(!stricmp(p,"SYSTEM_STATS")) { - fprintf(out,"%c",CS_SYSTEM_STATS); - continue; } - if(!stricmp(p,"NODE_STATS")) { - fprintf(out,"%c",CS_NODE_STATS); - continue; } - if(!stricmp(p,"CHANGE_USER")) { - fprintf(out,"%c",CS_CHANGE_USER); - continue; } - if(!stricmp(p,"ANSI_CAPTURE")) { - fprintf(out,"%c",CS_ANSI_CAPTURE); - continue; } - if(!stricmp(p,"LIST_TEXT_FILE")) { - fprintf(out,"%c",CS_LIST_TEXT_FILE); - continue; } - if(!stricmp(p,"EDIT_TEXT_FILE")) { - fprintf(out,"%c",CS_EDIT_TEXT_FILE); - continue; } - - - if(!stricmp(p,"COMPARE_KEY")) { - if(!stricmp(arg,"DIGIT")) - ch=CS_DIGIT; - else if(!stricmp(arg,"EDIGIT")) - ch=CS_EDIGIT; - else - ch=toupper(*arg); - if(ch=='/') - ch=(*arg)|0x80; /* high bit indicates slash required */ - else if(ch=='^' && (*(arg+1))>=0x40) - ch=(*(arg+1))-0x40; /* ctrl char */ - else if(ch=='\\') - ch=cesc(*(arg+1)); - else if(ch=='\'') - ch=*(arg+1); - fprintf(out,"%c%c",CS_COMPARE_KEY,ch); - continue; } - if(!stricmp(p,"COMPARE_KEYS")) { - fputc(CS_COMPARE_KEYS,out); - for(p=arg;*p && *p!='#';p++) { - ch=*p; - if(ch=='"') - continue; - if(ch=='/') { - p++; - ch=*p|0x80; } /* high bit indicates slash required */ - else if(ch=='^' && *(p+1)>=0x40) { - p++; - ch=*p; - ch-=0x40; } - else if(ch=='\\') { - p++; - ch=cesc(*p); } - fputc(ch,out); } - fputc(0,out); - continue; } - if(!stricmp(p,"GETCMD")) { - fprintf(out,"%c",CS_GETCMD); - writecstr(arg); - continue; } - if(!stricmp(p,"INKEY")) { - fprintf(out,"%c",CS_INKEY); - continue; } - if(!stricmp(p,"GETKEY")) { - fprintf(out,"%c",CS_GETKEY); - continue; } - if(!stricmp(p,"GETKEYE")) { - fprintf(out,"%c",CS_GETKEYE); - continue; } - if(!stricmp(p,"UNGETKEY")) { - fprintf(out,"%c",CS_UNGETKEY); - continue; } - if(!stricmp(p,"UNGETSTR")) { - fprintf(out,"%c",CS_UNGETSTR); - continue; } - if(!stricmp(p,"PRINTKEY")) { - fprintf(out,"%c",CS_PRINTKEY); - continue; } - if(!stricmp(p,"PRINTSTR")) { - fprintf(out,"%c",CS_PRINTSTR); - continue; } - - /* FUNCTIONS */ - - if(!stricmp(p,"NODELIST_ALL")) { - fprintf(out,"%c",CS_NODELIST_ALL); - continue; } - if(!stricmp(p,"NODELIST_USERS")) { - fprintf(out,"%c",CS_NODELIST_USERS); - continue; } - - if(!stricmp(p,"USERLIST_ALL")) { - fprintf(out,"%c",CS_USERLIST_ALL); - continue; } - if(!stricmp(p,"USERLIST_SUB")) { - fprintf(out,"%c",CS_USERLIST_SUB); - continue; } - if(!stricmp(p,"USERLIST_DIR")) { - fprintf(out,"%c",CS_USERLIST_DIR); - continue; } - if(!stricmp(p,"USERLIST_LOGONS")) { - fprintf(out,"%c",CS_USERLIST_LOGONS); - continue; } - - if(!stricmp(p,"HANGUP")) { - fprintf(out,"%c",CS_HANGUP); - continue; } - - if(!stricmp(p,"LOGOFF")) { - fprintf(out,"%c",CS_LOGOFF); - continue; } - - if(!stricmp(p,"LOGOFF_FAST")) { - fprintf(out,"%c",CS_LOGOFF_FAST); - continue; } - - if(!stricmp(p,"AUTO_MESSAGE")) { - fprintf(out,"%c",CS_AUTO_MESSAGE); - continue; } - - if(!stricmp(p,"MINUTE_BANK")) { - fprintf(out,"%c",CS_MINUTE_BANK); - continue; } - - if(!stricmp(p,"USER_EDIT")) { - fprintf(out,"%c",CS_USER_EDIT); - continue; } - - if(!stricmp(p,"USER_DEFAULTS")) { - fprintf(out,"%c",CS_USER_DEFAULTS); - continue; } - - if(!stricmp(p,"PAGE_SYSOP")) { - fprintf(out,"%c",CS_PAGE_SYSOP); - continue; } - if(!stricmp(p,"PAGE_GURU")) { - fprintf(out,"%c",CS_PAGE_GURU); - continue; } - - if(!stricmp(p,"PRIVATE_CHAT")) { - fprintf(out,"%c",CS_PRIVATE_CHAT); - continue; } - - if(!stricmp(p,"PRIVATE_MESSAGE")) { - fprintf(out,"%c",CS_PRIVATE_MESSAGE); - continue; } - - if(!stricmp(p,"MAIL_READ")) { - fprintf(out,"%c",CS_MAIL_READ); - continue; } - if(!stricmp(p,"MAIL_READ_SENT")) { /* Kill/read sent mail */ - fprintf(out,"%c",CS_MAIL_READ_SENT); - continue; } - if(!stricmp(p,"MAIL_READ_ALL")) { - fprintf(out,"%c",CS_MAIL_READ_ALL); - continue; } - if(!stricmp(p,"MAIL_SEND")) { /* Send E-mail */ - fprintf(out,"%c",CS_MAIL_SEND); - continue; } - if(!stricmp(p,"MAIL_SEND_FEEDBACK")) { /* Feedback */ - fprintf(out,"%c",CS_MAIL_SEND_FEEDBACK); - continue; } - if(!stricmp(p,"MAIL_SEND_NETMAIL")) { - fprintf(out,"%c",CS_MAIL_SEND_NETMAIL); - continue; } - if(!stricmp(p,"MAIL_SEND_NETFILE")) { - fprintf(out,"%c",CS_MAIL_SEND_NETFILE); - continue; } - if(!stricmp(p,"MAIL_SEND_FILE")) { /* Upload Attached File to E-mail */ - fprintf(out,"%c",CS_MAIL_SEND_FILE); - continue; } - if(!stricmp(p,"MAIL_SEND_BULK")) { - fprintf(out,"%c",CS_MAIL_SEND_BULK); - continue; } - - - if(!stricmp(p,"MSG_SET_AREA")) { - fprintf(out,"%c",CS_MSG_SET_AREA); - continue; } - if(!stricmp(p,"MSG_SET_GROUP")) { - fprintf(out,"%c",CS_MSG_SET_GROUP); - continue; } - if(!stricmp(p,"MSG_SELECT_AREA")) { - fprintf(out,"%c",CS_MSG_SELECT_AREA); - continue; } - if(!stricmp(p,"MSG_SHOW_GROUPS")) { - fprintf(out,"%c",CS_MSG_SHOW_GROUPS); - continue; } - if(!stricmp(p,"MSG_SHOW_SUBBOARDS")) { - fprintf(out,"%c",CS_MSG_SHOW_SUBBOARDS); - continue; } - if(!stricmp(p,"MSG_GROUP_UP")) { - fprintf(out,"%c",CS_MSG_GROUP_UP); - continue; } - if(!stricmp(p,"MSG_GROUP_DOWN")) { - fprintf(out,"%c",CS_MSG_GROUP_DOWN); - continue; } - if(!stricmp(p,"MSG_SUBBOARD_UP")) { - fprintf(out,"%c",CS_MSG_SUBBOARD_UP); - continue; } - if(!stricmp(p,"MSG_SUBBOARD_DOWN")) { - fprintf(out,"%c",CS_MSG_SUBBOARD_DOWN); - continue; } - if(!stricmp(p,"MSG_GET_SUB_NUM")) { - fprintf(out,"%c",CS_MSG_GET_SUB_NUM); - continue; } - if(!stricmp(p,"MSG_GET_GRP_NUM")) { - fprintf(out,"%c",CS_MSG_GET_GRP_NUM); - continue; } - if(!stricmp(p,"MSG_READ")) { - fprintf(out,"%c",CS_MSG_READ); - continue; } - if(!stricmp(p,"MSG_POST")) { - fprintf(out,"%c",CS_MSG_POST); - continue; } - if(!stricmp(p,"MSG_QWK")) { - fprintf(out,"%c",CS_MSG_QWK); - continue; } - if(!stricmp(p,"MSG_PTRS_CFG")) { - fprintf(out,"%c",CS_MSG_PTRS_CFG); - continue; } - if(!stricmp(p,"MSG_PTRS_REINIT")) { - fprintf(out,"%c",CS_MSG_PTRS_REINIT); - continue; } - if(!stricmp(p,"MSG_NEW_SCAN_CFG")) { - fprintf(out,"%c",CS_MSG_NEW_SCAN_CFG); - continue; } - if(!stricmp(p,"MSG_NEW_SCAN")) { - fprintf(out,"%c",CS_MSG_NEW_SCAN); - continue; } - if(!stricmp(p,"MSG_NEW_SCAN_SUB")) { - fprintf(out,"%c",CS_MSG_NEW_SCAN_SUB); - continue; } - if(!stricmp(p,"MSG_NEW_SCAN_ALL")) { - fprintf(out,"%c",CS_MSG_NEW_SCAN_ALL); - continue; } - if(!stricmp(p,"MSG_CONT_SCAN")) { - fprintf(out,"%c",CS_MSG_CONT_SCAN); - continue; } - if(!stricmp(p,"MSG_CONT_SCAN_ALL")) { - fprintf(out,"%c",CS_MSG_CONT_SCAN_ALL); - continue; } - if(!stricmp(p,"MSG_BROWSE_SCAN")) { - fprintf(out,"%c",CS_MSG_BROWSE_SCAN); - continue; } - if(!stricmp(p,"MSG_BROWSE_SCAN_ALL")) { - fprintf(out,"%c",CS_MSG_BROWSE_SCAN_ALL); - continue; } - if(!stricmp(p,"MSG_FIND_TEXT")) { - fprintf(out,"%c",CS_MSG_FIND_TEXT); - continue; } - if(!stricmp(p,"MSG_FIND_TEXT_ALL")) { - fprintf(out,"%c",CS_MSG_FIND_TEXT_ALL); - continue; } - if(!stricmp(p,"MSG_YOUR_SCAN_CFG")) { - fprintf(out,"%c",CS_MSG_YOUR_SCAN_CFG); - continue; } - if(!stricmp(p,"MSG_YOUR_SCAN")) { - fprintf(out,"%c",CS_MSG_YOUR_SCAN); - continue; } - if(!stricmp(p,"MSG_YOUR_SCAN_ALL")) { - fprintf(out,"%c",CS_MSG_YOUR_SCAN_ALL); - continue; } - if(!stricmp(p,"CHAT_SECTION")) { - fprintf(out,"%c",CS_CHAT_SECTION); - continue; } - if(!stricmp(p,"TEXT_FILE_SECTION")) { - fprintf(out,"%c",CS_TEXT_FILE_SECTION); - continue; } - if(!stricmp(p,"XTRN_EXEC")) { - fprintf(out,"%c",CS_XTRN_EXEC); - continue; } - if(!stricmp(p,"XTRN_SECTION")) { - fprintf(out,"%c",CS_XTRN_SECTION); - continue; } - - if(!stricmp(p,"FILE_SET_AREA")) { - fprintf(out,"%c",CS_FILE_SET_AREA); - continue; } - if(!stricmp(p,"FILE_SET_LIBRARY")) { - fprintf(out,"%c",CS_FILE_SET_LIBRARY); - continue; } - if(!stricmp(p,"FILE_SELECT_AREA")) { - fprintf(out,"%c",CS_FILE_SELECT_AREA); - continue; } - if(!stricmp(p,"FILE_SHOW_LIBRARIES")) { - fprintf(out,"%c",CS_FILE_SHOW_LIBRARIES); - continue; } - if(!stricmp(p,"FILE_SHOW_DIRECTORIES")) { - fprintf(out,"%c",CS_FILE_SHOW_DIRECTORIES); - continue; } - if(!stricmp(p,"FILE_LIBRARY_UP")) { - fprintf(out,"%c",CS_FILE_LIBRARY_UP); - continue; } - if(!stricmp(p,"FILE_LIBRARY_DOWN")) { - fprintf(out,"%c",CS_FILE_LIBRARY_DOWN); - continue; } - if(!stricmp(p,"FILE_DIRECTORY_UP")) { - fprintf(out,"%c",CS_FILE_DIRECTORY_UP); - continue; } - if(!stricmp(p,"FILE_DIRECTORY_DOWN")) { - fprintf(out,"%c",CS_FILE_DIRECTORY_DOWN); - continue; } - if(!stricmp(p,"FILE_GET_DIR_NUM")) { - fprintf(out,"%c",CS_FILE_GET_DIR_NUM); - continue; } - if(!stricmp(p,"FILE_GET_LIB_NUM")) { - fprintf(out,"%c",CS_FILE_GET_LIB_NUM); - continue; } - if(!stricmp(p,"FILE_UPLOAD")) { - fprintf(out,"%c",CS_FILE_UPLOAD); - continue; } - if(!stricmp(p,"FILE_UPLOAD_USER")) { - fprintf(out,"%c",CS_FILE_UPLOAD_USER); - continue; } - if(!stricmp(p,"FILE_UPLOAD_BULK")) { - fprintf(out,"%c",CS_FILE_UPLOAD_BULK); - continue; } - if(!stricmp(p,"FILE_UPLOAD_SYSOP")) { - fprintf(out,"%c",CS_FILE_UPLOAD_SYSOP); - continue; } - if(!stricmp(p,"FILE_RESORT_DIRECTORY")) { - fprintf(out,"%c",CS_FILE_RESORT_DIRECTORY); - continue; } - if(!stricmp(p,"FILE_SET_ALT_PATH")) { - fprintf(out,"%c",CS_FILE_SET_ALT_PATH); - continue; } - if(!stricmp(p,"FILE_GET")) { - fprintf(out,"%c",CS_FILE_GET); - continue; } - if(!stricmp(p,"FILE_SEND")) { - fprintf(out,"%c",CS_FILE_SEND); - continue; } - if(!stricmp(p,"FILE_PUT")) { - fprintf(out,"%c",CS_FILE_PUT); - continue; } - if(!stricmp(p,"FILE_FIND_OLD")) { - fprintf(out,"%c",CS_FILE_FIND_OLD); - continue; } - if(!stricmp(p,"FILE_FIND_OPEN")) { - fprintf(out,"%c",CS_FILE_FIND_OPEN); - continue; } - if(!stricmp(p,"FILE_FIND_OFFLINE")) { - fprintf(out,"%c",CS_FILE_FIND_OFFLINE); - continue; } - if(!stricmp(p,"FILE_FIND_OLD_UPLOADS")) { - fprintf(out,"%c",CS_FILE_FIND_OLD_UPLOADS); - continue; } - if(!stricmp(p,"FILE_DOWNLOAD")) { - fprintf(out,"%c",CS_FILE_DOWNLOAD); - continue; } - if(!stricmp(p,"FILE_DOWNLOAD_USER")) { - fprintf(out,"%c",CS_FILE_DOWNLOAD_USER); - continue; } - if(!stricmp(p,"FILE_DOWNLOAD_BATCH")) { - fprintf(out,"%c",CS_FILE_DOWNLOAD_BATCH); - continue; } - if(!stricmp(p,"FILE_REMOVE")) { - fprintf(out,"%c",CS_FILE_REMOVE); - continue; } - if(!stricmp(p,"FILE_LIST")) { - fprintf(out,"%c",CS_FILE_LIST); - continue; } - if(!stricmp(p,"FILE_LIST_EXTENDED")) { - fprintf(out,"%c",CS_FILE_LIST_EXTENDED); - continue; } - if(!stricmp(p,"FILE_VIEW")) { - fprintf(out,"%c",CS_FILE_VIEW); - continue; } - if(!stricmp(p,"FILE_FIND_TEXT")) { - fprintf(out,"%c",CS_FILE_FIND_TEXT); - continue; } - if(!stricmp(p,"FILE_FIND_TEXT_ALL")) { - fprintf(out,"%c",CS_FILE_FIND_TEXT_ALL); - continue; } - if(!stricmp(p,"FILE_FIND_NAME")) { - fprintf(out,"%c",CS_FILE_FIND_NAME); - continue; } - if(!stricmp(p,"FILE_FIND_NAME_ALL")) { - fprintf(out,"%c",CS_FILE_FIND_NAME_ALL); - continue; } - if(!stricmp(p,"FILE_BATCH_SECTION")) { - fprintf(out,"%c",CS_FILE_BATCH_SECTION); - continue; } - if(!stricmp(p,"FILE_TEMP_SECTION")) { - fprintf(out,"%c",CS_FILE_TEMP_SECTION); - continue; } - if(!stricmp(p,"FILE_NEW_SCAN")) { - fprintf(out,"%c",CS_FILE_NEW_SCAN); - continue; } - if(!stricmp(p,"FILE_NEW_SCAN_ALL")) { - fprintf(out,"%c",CS_FILE_NEW_SCAN_ALL); - continue; } - if(!stricmp(p,"FILE_NEW_SCAN_CFG")) { - fprintf(out,"%c",CS_FILE_NEW_SCAN_CFG); - continue; } - if(!stricmp(p,"FILE_PTRS_CFG")) { - fprintf(out,"%c",CS_FILE_PTRS_CFG); - continue; } - if(!stricmp(p,"FILE_BATCH_ADD")) { - fprintf(out,"%c",CS_FILE_BATCH_ADD); - continue; } - if(!stricmp(p,"FILE_BATCH_ADD_LIST")) { - fprintf(out,"%c",CS_FILE_BATCH_ADD_LIST); - continue; } - if(!stricmp(p,"FILE_BATCH_CLEAR")) { - fprintf(out,"%c",CS_FILE_BATCH_CLEAR); - continue; } - - if(!stricmp(p,"INC_MAIN_CMDS")) { - fprintf(out,"%c",CS_INC_MAIN_CMDS); - continue; } - if(!stricmp(p,"INC_FILE_CMDS")) { - fprintf(out,"%c",CS_INC_FILE_CMDS); - continue; } - - break; } - - -if(!feof(in)) { - printf("SYNTAX ERROR:\n"); - printf(linestr,src,line,save); - exit(1); } -fclose(in); -} - -char *usage="\n" - "usage: baja [/opts] file[.src]\n" - "\n" - " opts: /d display debug during compile\n" - " /c case sensitive variables, labels, and macros\n" - " /o set output directory (e.g. /o\\sbbs\\exec)\n" - ; -int main(int argc, char **argv) -{ - uchar str[128],src[128]="",*p,outdir[128]="",outfname[128]=""; - int i,j; - -printf("\nBAJA v2.10 � Synchronet Shell/Module Compiler � " - "Developed 1995-97 Rob Swindell\n"); - -for(i=1;i<argc;i++) - if(argv[i][0]=='/') - switch(toupper(argv[i][1])) { - case 'D': - display=1; - break; - case 'C': - case_sens=1; - break; - case 'O': - strcpy(outdir,argv[i]+2); - break; - default: - printf(usage); - exit(1); } - else - strcpy(src,argv[i]); - -if(!src[0]) { - printf(usage); - exit(1); } - -strupr(src); -strcpy(str,src); -if(!strchr(str,'.')) - sprintf(src,"%s.SRC",str); - -strcpy(str,src); -p=strrchr(str,'.'); -if(p) - *p=0; -strcat(str,".BIN"); - -if(outdir[0]) { - p=strrchr(str,'\\'); - if(!p) - p=strrchr(str,':'); - if(p) - strcpy(outfname,p+1); - else - strcpy(outfname,str); - if(outdir[strlen(outdir)-1]!='\\' - && outdir[strlen(outdir)-1]!=':') - strcat(outdir,"\\"); - sprintf(str,"%s%s",outdir,outfname); } - -if((out=fopen(str,"wb"))==NULL) { - printf("error opening %s for write\n",str); - exit(1); } - -atexit(bail); - -printf("\nCompiling %s...\n",src); - -compile(src); - -/****************************/ -/* Resolve GOTOS and CALLS */ -/****************************/ - -printf("Resolving labels...\n"); - -for(i=0;i<gotos;i++) { - for(j=0;j<labels;j++) - if(!stricmp(goto_label[i],label_name[j])) - break; - if(j>=labels) { - printf("%s line %d: label (%s) not found.\n" - ,goto_file[i],goto_line[i],goto_label[i]); - exit(1); } - fseek(out,(long)(goto_indx[i]+1),SEEK_SET); - fwrite(&label_indx[j],2,1,out); } - -for(i=0;i<calls;i++) { - for(j=0;j<labels;j++) - if((!case_sens - && !strnicmp(call_label[i],label_name[j],strlen(call_label[i]))) - || (case_sens - && !strncmp(call_label[i],label_name[j],strlen(call_label[i])))) - break; - if(j>=labels) { - printf("%s line %d: label (%s) not found.\n" - ,call_file[i],call_line[i],call_label[i]); - exit(1); } - fseek(out,(long)(call_indx[i]+1),SEEK_SET); - fwrite(&label_indx[j],2,1,out); } - -fclose(out); -out=NULL; /* so bail() won't truncate */ - -printf("\nDone.\n"); -return(0); -} - - - diff --git a/src/sbbs2/baja/make.bat b/src/sbbs2/baja/make.bat deleted file mode 100755 index 8f77b60e3d..0000000000 --- a/src/sbbs2/baja/make.bat +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -bcc -ml -N -lm -I..;..\smb baja.c ..\ars.c -if errorlevel 1 goto end -bcc32 -WX -N -lm -I..;..\smb -ebaja32.exe baja.c ..\ars.c -:end diff --git a/src/sbbs2/baja/make.cmd b/src/sbbs2/baja/make.cmd deleted file mode 100755 index 34625ae386..0000000000 --- a/src/sbbs2/baja/make.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -N -I..;..\smb -eBAJA4OS2.EXE baja.c ..\ars.c diff --git a/src/sbbs2/bulkmail.c b/src/sbbs2/bulkmail.c deleted file mode 100644 index 0d6bd83a10..0000000000 --- a/src/sbbs2/bulkmail.c +++ /dev/null @@ -1,219 +0,0 @@ -#line 1 "BULKMAIL.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -int bulkmailhdr(int usernum, smbmsg_t *msg, ushort msgattr, ulong offset - , ulong length, char *title) -{ - char str[256]; - int i,j; - node_t node; - -memset(msg,0,sizeof(smbmsg_t)); -memcpy(msg->hdr.id,"SHD\x1a",4); -msg->hdr.version=smb_ver(); -msg->hdr.attr=msg->idx.attr=msgattr; -msg->hdr.when_written.time=msg->hdr.when_imported.time=time(NULL); -msg->hdr.when_written.zone=msg->hdr.when_imported.zone=sys_timezone; -msg->hdr.offset=msg->idx.offset=offset; - -username(usernum,str); -smb_hfield(msg,RECIPIENT,strlen(str),str); -strlwr(str); - -sprintf(str,"%u",usernum); -smb_hfield(msg,RECIPIENTEXT,strlen(str),str); -msg->idx.to=usernum; - -strcpy(str,useron.alias); -smb_hfield(msg,SENDER,strlen(str),str); -strlwr(str); - -sprintf(str,"%u",useron.number); -smb_hfield(msg,SENDEREXT,strlen(str),str); -msg->idx.from=useron.number; - -strcpy(str,title); -smb_hfield(msg,SUBJECT,strlen(str),str); -strlwr(str); -msg->idx.subj=crc16(str); - -smb_dfield(msg,TEXT_BODY,length); - -j=smb_addmsghdr(&smb,msg,SMB_SELFPACK); -if(j) - return(j); - -// smb_incdat(&smb,offset,length,1); Remove 04/15/96 -lncntr=0; -bprintf("Bulk Mailed %s #%d\r\n",username(usernum,tmp),usernum); -sprintf(str,"Bulk Mailed %s #%d",username(usernum,tmp),usernum); -logline("E+",str); -useron.emails++; -logon_emails++; -useron.etoday++; -for(i=1;i<=sys_nodes;i++) { /* Tell user, if online */ - getnodedat(i,&node,0); - if(node.useron==usernum && !(node.misc&NODE_POFF) - && (node.status==NODE_INUSE || node.status==NODE_QUIET)) { - sprintf(str,text[EmailNodeMsg],node_num,useron.alias); - putnmsg(i,str); - break; } } -if(i>sys_nodes) { /* User wasn't online, so leave short msg */ - sprintf(str,text[UserSentYouMail],useron.alias); - putsmsg(usernum,str); } -return(0); -} - -void bulkmail(uchar *ar) -{ - char str[256],str2[256],msgpath[256],title[LEN_TITLE+1],ch - ,buf[SDT_BLOCK_LEN],found=0; - ushort xlat=XLAT_NONE,msgattr=0; - int i,j,k,x,file; - long l,msgs=0; - ulong length,offset; - FILE *instream; - user_t user; - smbmsg_t msg; - -memset(&msg,0,sizeof(smbmsg_t)); - -title[0]=0; -action=NODE_SMAL; -nodesync(); - -if(sys_misc&SM_ANON_EM && (SYSOP || useron.exempt&FLAG('A')) - && !noyes(text[AnonymousQ])) - msgattr|=MSG_ANONYMOUS; - -sprintf(msgpath,"%sINPUT.MSG",node_dir); -sprintf(str2,"Bulk Mailing"); -if(!writemsg(msgpath,nulstr,title,WM_EMAIL,0,str2)) { - bputs(text[Aborted]); - return; } - -bputs(text[WritingIndx]); -CRLF; - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,"MAIL",i); - return; } -sprintf(smb.file,"%sMAIL",data_dir); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } - -if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ - smb.status.max_crcs=mail_maxcrcs; - smb.status.max_msgs=MAX_SYSMAIL; - smb.status.max_age=mail_maxage; - smb.status.attr=SMB_EMAIL; - if((i=smb_create(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_CREATE,smb.file,i); - return; } } - -length=flength(msgpath)+2; /* +2 for translation string */ - -if(length&0xfff00000UL) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LEN,smb.file,length); - return; } - -if((i=smb_open_da(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } -if(sys_misc&SM_FASTMAIL) - offset=smb_fallocdat(&smb,length,1); -else - offset=smb_allocdat(&smb,length,1); -smb_close_da(&smb); - -if((file=open(msgpath,O_RDONLY|O_BINARY))==-1 - || (instream=fdopen(file,"rb"))==NULL) { - smb_freemsgdat(&smb,offset,length,1); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY); - return; } - -setvbuf(instream,NULL,_IOFBF,2*1024); -fseek(smb.sdt_fp,offset,SEEK_SET); -xlat=XLAT_NONE; -fwrite(&xlat,2,1,smb.sdt_fp); -x=SDT_BLOCK_LEN-2; /* Don't read/write more than 255 */ -while(!feof(instream)) { - memset(buf,0,x); - j=fread(buf,1,x,instream); - if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) - buf[j-1]=buf[j-2]=0; - fwrite(buf,j,1,smb.sdt_fp); - x=SDT_BLOCK_LEN; } -fflush(smb.sdt_fp); -fclose(instream); - -j=lastuser(); -x=0; - -if(*ar) - for(i=1;i<=j;i++) { - user.number=i; - getuserdat(&user); - if(user.misc&(DELETED|INACTIVE)) - continue; - if(chk_ar(ar,user)) { - if(found) - smb_freemsgmem(&msg); - x=bulkmailhdr(i,&msg,msgattr,offset,length,title); - if(x) - break; - msgs++; - found=1; } } -else - while(1) { - bputs(text[EnterAfterLastDestUser]); - if(!getstr(str,LEN_ALIAS,K_UPRLWR)) - break; - if((i=finduser(str))!=0) { - if(found) - smb_freemsgmem(&msg); - x=bulkmailhdr(i,&msg,msgattr,offset,length,title); - if(x) - break; - msgs++; } - found=1; } - -if((i=smb_open_da(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } -if(!msgs) - smb_freemsgdat(&smb,offset,length,1); -else if(msgs>1) - smb_incdat(&smb,offset,length,msgs-1); -smb_close_da(&smb); - -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); - -smb_freemsgmem(&msg); -if(x) { - smb_freemsgdat(&smb,offset,length,1); - errormsg(WHERE,ERR_WRITE,smb.file,x); - return; } - -putuserrec(useron.number,U_EMAILS,5,itoa(useron.emails,tmp,10)); -putuserrec(useron.number,U_ETODAY,5,itoa(useron.etoday,tmp,10)); -} - - diff --git a/src/sbbs2/chat.c b/src/sbbs2/chat.c deleted file mode 100644 index 1621dd7955..0000000000 --- a/src/sbbs2/chat.c +++ /dev/null @@ -1,1715 +0,0 @@ -#line 1 "CHAT.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/****************************************/ -/* Local and Node-to-Node Chat routines */ -/****************************************/ - -#include "sbbs.h" - -#define PCHAT_LEN 1000 /* Size of Private chat file */ - -int getnodetopage(int all, int telegram); - - -char *weekday[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday" - ,"Saturday"}; -char *month[]={"January","February","March","April","May","June" - ,"July","August","September","October","November","December"}; - - -/****************************************************************************/ -/* Chat between local keyboard and remote user on current node. */ -/* Called from inkey (inkey is then re-entrant) */ -/****************************************************************************/ -void localchat() -{ - uchar str[256],act; - int con=console; /* save console state */ - time_t beg=time(NULL); - -console&=~(CON_L_ECHOX|CON_R_ECHOX); /* turn off X's */ -console|=(CON_L_ECHO|CON_R_ECHO); /* make sure echo is enabled */ -nosound(); -sys_status&=~SS_SYSPAGE; -act=action; /* save the user's current action */ -action=NODE_LCHT; -bprintf(text[SysopIsHere],sys_op); -while(sys_status&SS_LCHAT && online) { - SYNC; - getstr(str,78,K_WRAP|K_MSG); } -bputs(text[EndOfChat]); -now=time(NULL); -if(!(sys_status&SS_USERON)) - answertime=now; -starttime+=now-beg; /* credit user for time in chat */ -RESTORELINE; -action=act; -console=con; /* restore console */ -} - -void sysop_page(void) -{ - int i; - -for(i=0;i<total_pages;i++) - if(chk_ar(page[i]->ar,useron)) - break; -if(i<total_pages) { - bprintf(text[PagingGuru],sys_op); - external(cmdstr(page[i]->cmd,nulstr,nulstr,NULL) - ,page[i]->misc&IO_INTS ? EX_OUTL|EX_OUTR|EX_INR - : EX_OUTL); } -else if(sys_misc&SM_SHRTPAGE) { - bprintf(text[PagingGuru],sys_op); - for(i=0;i<10 && !lkbrd(1);i++) { - beep(1000,200); - mswait(200); - outchar('.'); } - CRLF; } -else { - sys_status^=SS_SYSPAGE; - bprintf(text[SysopPageIsNow] - ,sys_status&SS_SYSPAGE ? text[ON] : text[OFF]); - nosound(); } -} - -/****************************************************************************/ -/* Returns 1 if user online has access to channel "channum" */ -/****************************************************************************/ -char chan_access(uint cnum) -{ - -if(!total_chans || cnum>=total_chans || !chk_ar(chan[cnum]->ar,useron)) { - bputs(text[CantAccessThatChannel]); - return(0); } -if(!(useron.exempt&FLAG('J')) && chan[cnum]->cost>useron.cdt+useron.freecdt) { - bputs(text[NotEnoughCredits]); - return(0); } -return(1); -} - -void privchat(void) -{ - uchar str[128],ch,c,*p,localbuf[5][81],remotebuf[5][81] - ,localline=0,remoteline=0,localchar=0,remotechar=0 - ,*sep="\1w\1h�����[\1i\1r%c\1n\1h]���Ĵ " - "\1yPrivate Chat - \1rCtrl-C to Quit \1y- " - "Time Left: \1g%-8s\1w" - " �����[\1i\1b%c\1n\1h]�����"; - int in,out,i,j,n,done,echo=1,x,y,activity; - node_t node; - -n=getnodetopage(0,0); -if(!n) - return; -if(n==node_num) { - bputs(text[NoNeedToPageSelf]); - return; } -getnodedat(n,&node,0); -if(node.action==NODE_PCHT && node.aux!=node_num) { - bprintf(text[NodeNAlreadyInPChat],n); - return; } -if((node.action!=NODE_PAGE || node.aux!=node_num) - && node.misc&NODE_POFF && !SYSOP) { - bprintf(text[CantPageNode],node.misc&NODE_ANON - ? text[UNKNOWN_USER] : username(node.useron,tmp)); - return; } -if(node.action!=NODE_PAGE) { - bprintf("\r\n\1n\1mPaging \1h%s #%u\1n\1m for private chat\r\n" - ,node.misc&NODE_ANON ? text[UNKNOWN_USER] : username(node.useron,tmp) - ,node.useron); - sprintf(str,text[NodePChatPageMsg] - ,node_num,thisnode.misc&NODE_ANON - ? text[UNKNOWN_USER] : useron.alias); - putnmsg(n,str); - sprintf(str,"Paged %s on node %d to private chat" - ,username(node.useron,tmp),n); - logline("C",str); } - -getnodedat(node_num,&thisnode,1); -thisnode.action=action=NODE_PAGE; -thisnode.aux=n; -putnodedat(node_num,thisnode); - -if(node.action!=NODE_PAGE || node.aux!=node_num) { - bprintf(text[WaitingForNodeInPChat],n); - while(online && !(sys_status&SS_ABORT)) { - getnodedat(n,&node,0); - if((node.action==NODE_PAGE || node.action==NODE_PCHT) - && node.aux==node_num) { - bprintf(text[NodeJoinedPrivateChat] - ,n,node.misc&NODE_ANON ? text[UNKNOWN_USER] - : username(node.useron,tmp)); - break; } - if(!inkey(0)) - mswait(1); - action=NODE_PAGE; - checkline(); - gettimeleft(); - SYNC; } } - -getnodedat(node_num,&thisnode,1); -thisnode.action=action=NODE_PCHT; -putnodedat(node_num,thisnode); - -if(!online || sys_status&SS_ABORT) - return; - -if(useron.chat&CHAT_SPLITP && useron.misc&ANSI && rows>=24) - sys_status|=SS_SPLITP; -/* -if(!(useron.misc&EXPERT)) - menu("PRIVCHAT"); -*/ - -if(!(sys_status&SS_SPLITP)) - bputs(text[WelcomeToPrivateChat]); - -sprintf(str,"%sCHAT.DAB",node_dir); -if((out=open(str,O_RDWR|O_DENYNONE|O_CREAT|O_BINARY - ,S_IREAD|S_IWRITE))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_DENYNONE|O_CREAT); - return; } - -sprintf(str,"%sCHAT.DAB",node_path[n-1]); -if(!fexist(str)) /* Wait while it's created for the first time */ - mswait(2000); -if((in=open(str,O_RDWR|O_DENYNONE|O_CREAT|O_BINARY - ,S_IREAD|S_IWRITE))==-1) { - close(out); - errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_DENYNONE|O_CREAT); - return; } - -if((p=(char *)MALLOC(PCHAT_LEN))==NULL) { - close(in); - close(out); - errormsg(WHERE,ERR_ALLOC,str,PCHAT_LEN); - return; } -memset(p,0,PCHAT_LEN); -write(in,p,PCHAT_LEN); -write(out,p,PCHAT_LEN); -FREE(p); -lseek(in,0L,SEEK_SET); -lseek(out,0L,SEEK_SET); - -getnodedat(node_num,&thisnode,1); -thisnode.misc&=~NODE_RPCHT; /* Clear "reset pchat flag" */ -putnodedat(node_num,thisnode); - -getnodedat(n,&node,1); -node.misc|=NODE_RPCHT; /* Set "reset pchat flag" */ -putnodedat(n,node); /* on other node */ - - /* Wait for other node */ - /* to acknowledge and reset */ -while(online && !(sys_status&SS_ABORT)) { - getnodedat(n,&node,0); - if(!(node.misc&NODE_RPCHT)) - break; - getnodedat(node_num,&thisnode,0); - if(thisnode.misc&NODE_RPCHT) - break; - checkline(); - gettimeleft(); - SYNC; - inkey(0); - mswait(1); } - - -action=NODE_PCHT; -SYNC; - -if(sys_status&SS_SPLITP) { - lncntr=0; - CLS; - ANSI_SAVE(); - GOTOXY(1,13); - bprintf(sep - ,thisnode.misc&NODE_MSGW ? 'T':SP - ,sectostr(timeleft,tmp) - ,thisnode.misc&NODE_NMSG ? 'M':SP); - CRLF; } - -done=0; - -while(online && !(sys_status&SS_ABORT) && !done) { - RIOSYNC(0); - lncntr=0; - if(sys_status&SS_SPLITP) - lbuflen=0; - action=NODE_PCHT; - if(!localchar) { - if(sys_status&SS_SPLITP) { - getnodedat(node_num,&thisnode,0); - if(thisnode.misc&NODE_INTR) - break; - if(thisnode.misc&NODE_UDAT && !(useron.rest&FLAG('G'))) { - getuserdat(&useron); - getnodedat(node_num,&thisnode,1); - thisnode.misc&=~NODE_UDAT; - putnodedat(node_num,thisnode); } } - else - nodesync(); } - activity=0; - if((ch=inkey(K_GETSTR))!=0) { - activity=1; - if(echo) - attr(color[clr_chatlocal]); - else - lclatr(color[clr_chatlocal]); - if(ch==BS) { - if(localchar) { - if(echo) - bputs("\b \b"); - else - lputs("\b \b"); - localchar--; - localbuf[localline][localchar]=0; } } - else if(ch==TAB) { - if(echo) - outchar(SP); - else - lputc(SP); - localbuf[localline][localchar]=SP; - localchar++; - while(localchar<78 && localchar%8) { - if(echo) - outchar(SP); - else - lputc(SP); - localbuf[localline][localchar++]=SP; } } - else if(ch>=SP || ch==CR) { - if(ch!=CR) { - if(echo) - outchar(ch); - else - lputc(ch); - localbuf[localline][localchar]=ch; } - - if(ch==CR || (localchar>68 && ch==SP) || ++localchar>78) { - - localbuf[localline][localchar]=0; - localchar=0; - - if(sys_status&SS_SPLITP && lclwy()==24) { - GOTOXY(1,13); - bprintf(sep - ,thisnode.misc&NODE_MSGW ? 'T':SP - ,sectostr(timeleft,tmp) - ,thisnode.misc&NODE_NMSG ? 'M':SP); - attr(color[clr_chatlocal]); - for(x=13,y=0;x<rows;x++,y++) { - bprintf("\x1b[%d;1H\x1b[K",x+1); - if(y<=localline) - bprintf("%s\r\n",localbuf[y]); } - GOTOXY(1,15+localline); - localline=0; } - else { - if(localline>=4) - for(i=0;i<4;i++) - memcpy(localbuf[i],localbuf[i+1],81); - else - localline++; - if(echo) { - CRLF; - if(sys_status&SS_SPLITP) - bputs("\x1b[K"); } - else - lputs(crlf); } - // SYNC; - } } - - read(out,&c,1); - lseek(out,-1L,SEEK_CUR); - if(!c) /* hasn't wrapped */ - write(out,&ch,1); - else { - if(!tell(out)) - lseek(out,0L,SEEK_END); - lseek(out,-1L,SEEK_CUR); - ch=0; - write(out,&ch,1); - lseek(out,-1L,SEEK_CUR); } - if(tell(out)>=PCHAT_LEN) - lseek(out,0L,SEEK_SET); - } - else while(online) { - if(!(sys_status&SS_SPLITP)) - remotechar=localchar; - if(tell(in)>=PCHAT_LEN) - lseek(in,0L,SEEK_SET); - ch=0; - read(in,&ch,1); - lseek(in,-1L,SEEK_CUR); - if(!ch) break; /* char from other node */ - activity=1; - x=lclwx(); - y=lclwy(); - if(sys_status&SS_SPLITP) - ANSI_RESTORE(); - attr(color[clr_chatremote]); - if(sys_status&SS_SPLITP) - bputs("\b \b"); /* Delete fake cursor */ - if(ch==BS) { - if(remotechar) { - bputs("\b \b"); - remotechar--; - remotebuf[remoteline][remotechar]=0; } } - else if(ch==TAB) { - outchar(SP); - remotebuf[remoteline][remotechar]=SP; - remotechar++; - while(remotechar<78 && remotechar%8) { - outchar(SP); - remotebuf[remoteline][remotechar++]=SP; } } - else if(ch>=SP || ch==CR) { - if(ch!=CR) { - outchar(ch); - remotebuf[remoteline][remotechar]=ch; } - - if(ch==CR || (remotechar>68 && ch==SP) || ++remotechar>78) { - - remotebuf[remoteline][remotechar]=0; - remotechar=0; - - if(sys_status&SS_SPLITP && lclwy()==12) { - CRLF; - bprintf(sep - ,thisnode.misc&NODE_MSGW ? 'T':SP - ,sectostr(timeleft,tmp) - ,thisnode.misc&NODE_NMSG ? 'M':SP); - attr(color[clr_chatremote]); - for(i=0;i<12;i++) { - bprintf("\x1b[%d;1H\x1b[K",i+1); - if(i<=remoteline) - bprintf("%s\r\n",remotebuf[i]); } - remoteline=0; - GOTOXY(1,6); } - else { - if(remoteline>=4) - for(i=0;i<4;i++) - memcpy(remotebuf[i],remotebuf[i+1],81); - else - remoteline++; - if(echo) { - CRLF; - if(sys_status&SS_SPLITP) - bputs("\x1b[K"); } - else - lputs(crlf); } } } - if(sys_status&SS_SPLITP) { - bputs("\1i_\1n"); /* Fake cursor */ - ANSI_SAVE(); - GOTOXY(x,y); } - ch=0; - write(in,&ch,1); - - if(!(sys_status&SS_SPLITP)) - localchar=remotechar; - } - if(!activity) { /* no activity so chk node.dab */ - getnodedat(n,&node,0); - if((node.action!=NODE_PCHT && node.action!=NODE_PAGE) - || node.aux!=node_num) { - bprintf(text[NodeLeftPrivateChat] - ,n,node.misc&NODE_ANON ? text[UNKNOWN_USER] - : username(node.useron,tmp)); - break; } - getnodedat(node_num,&thisnode,0); - if(thisnode.misc&NODE_RPCHT) { /* pchat has been reset */ - lseek(in,0L,SEEK_SET); /* so seek to beginning */ - lseek(out,0L,SEEK_SET); - getnodedat(node_num,&thisnode,1); - thisnode.misc&=~NODE_RPCHT; - putnodedat(node_num,thisnode); } - mswait(0); } - checkline(); - gettimeleft(); } -if(sys_status&SS_SPLITP) - CLS; -sys_status&=~SS_SPLITP; -close(in); -close(out); -} - -/****************************************************************************/ -/* The chat section */ -/****************************************************************************/ -void chatsection() -{ - uchar line[256],str[256],ch,c,done,no_rip_menu - ,usrs,preusrs,qusrs,*gurubuf=NULL,channel,savch,*p - ,pgraph[400],buf[400] - ,usr[MAX_NODES],preusr[MAX_NODES],qusr[MAX_NODES]; - int file,in,out; - long i,j,k,n; - node_t node; - -action=NODE_CHAT; -if(useron.misc&(RIP|WIP) || !(useron.misc&EXPERT)) - menu("CHAT"); -ASYNC; -bputs(text[ChatPrompt]); -while(online) { - no_rip_menu=0; - ch=getkeys("ACDJPQST?\r",0); - if(ch>SP) - logch(ch,0); - switch(ch) { - case 'S': - useron.chat^=CHAT_SPLITP; - putuserrec(useron.number,U_CHAT,8 - ,ltoa(useron.chat,str,16)); - bprintf("\r\nPrivate split-screen chat is now: %s\r\n" - ,useron.chat&CHAT_SPLITP ? text[ON]:text[OFF]); - break; - case 'A': - CRLF; - useron.chat^=CHAT_NOACT; - putuserrec(useron.number,U_CHAT,8 - ,ltoa(useron.chat,str,16)); - getnodedat(node_num,&thisnode,1); - thisnode.misc^=NODE_AOFF; - printnodedat(node_num,thisnode); - putnodedat(node_num,thisnode); - no_rip_menu=1; - break; - case 'D': - CRLF; - useron.chat^=CHAT_NOPAGE; - putuserrec(useron.number,U_CHAT,8 - ,ltoa(useron.chat,str,16)); - getnodedat(node_num,&thisnode,1); - thisnode.misc^=NODE_POFF; - printnodedat(node_num,thisnode); - putnodedat(node_num,thisnode); - no_rip_menu=1; - break; - case 'J': - if(!chan_access(0)) - break; - if(useron.misc&(RIP|WIP) ||!(useron.misc&EXPERT)) - menu("MULTCHAT"); - getnodedat(node_num,&thisnode,1); - bputs(text[WelcomeToMultiChat]); - channel=thisnode.aux=1; /* default channel 1 */ - putnodedat(node_num,thisnode); - bprintf(text[WelcomeToChannelN],channel,chan[0]->name); - if(gurubuf) { - FREE(gurubuf); - gurubuf=NULL; } - if(chan[0]->misc&CHAN_GURU && chan[0]->guru<total_gurus - && chk_ar(guru[chan[0]->guru]->ar,useron)) { - sprintf(str,"%s%s.DAT",ctrl_dir,guru[chan[0]->guru]->code); - if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - break; } - if((gurubuf=MALLOC(filelength(file)+1))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,filelength(file)+1); - break; } - read(file,gurubuf,filelength(file)); - gurubuf[filelength(file)]=0; - close(file); } - usrs=0; - for(i=1;i<=sys_nodes && i<=sys_lastnode;i++) { - if(i==node_num) - continue; - getnodedat(i,&node,0); - if(node.action!=NODE_MCHT || node.status!=NODE_INUSE) - continue; - if(node.aux && (node.aux&0xff)!=channel) - continue; - printnodedat(i,node); - preusr[usrs]=usr[usrs++]=i; } - preusrs=usrs; - if(gurubuf) - bprintf(text[NodeInMultiChatLocally] - ,sys_nodes+1,guru[chan[channel-1]->guru]->name,channel); - bputs(text[YoureOnTheAir]); - done=0; - while(online && !done) { - checkline(); - gettimeleft(); - action=NODE_MCHT; - qusrs=usrs=0; - for(i=1;i<=sys_nodes;i++) { - if(i==node_num) - continue; - getnodedat(i,&node,0); - if(node.action!=NODE_MCHT - || (node.aux && channel && (node.aux&0xff)!=channel)) - continue; - if(node.status==NODE_QUIET) - qusr[qusrs++]=i; - else if(node.status==NODE_INUSE) - usr[usrs++]=i; } - if(preusrs>usrs) { - if(!usrs && channel && chan[channel-1]->misc&CHAN_GURU - && chan[channel-1]->guru<total_gurus) - bprintf(text[NodeJoinedMultiChat] - ,sys_nodes+1,guru[chan[channel-1]->guru]->name - ,channel); - outchar(7); - for(i=0;i<preusrs;i++) { - for(j=0;j<usrs;j++) - if(preusr[i]==usr[j]) - break; - if(j==usrs) { - getnodedat(preusr[i],&node,0); - if(node.misc&NODE_ANON) - sprintf(str,"%.80s",text[UNKNOWN_USER]); - else - username(node.useron,str); - bprintf(text[NodeLeftMultiChat] - ,preusr[i],str,channel); } } } - else if(preusrs<usrs) { - if(!preusrs && channel && chan[channel-1]->misc&CHAN_GURU - && chan[channel-1]->guru<total_gurus) - bprintf(text[NodeLeftMultiChat] - ,sys_nodes+1,guru[chan[channel-1]->guru]->name - ,channel); - outchar(7); - for(i=0;i<usrs;i++) { - for(j=0;j<preusrs;j++) - if(usr[i]==preusr[j]) - break; - if(j==preusrs) { - getnodedat(usr[i],&node,0); - if(node.misc&NODE_ANON) - sprintf(str,"%.80s",text[UNKNOWN_USER]); - else - username(node.useron,str); - bprintf(text[NodeJoinedMultiChat] - ,usr[i],str,channel); } } } - preusrs=usrs; - for(i=0;i<usrs;i++) - preusr[i]=usr[i]; - attr(color[clr_multichat]); - SYNC; - sys_status&=~SS_ABORT; - if((ch=inkey(0))!=0 || wordwrap[0]) { - if(ch=='/') { - bputs(text[MultiChatCommandPrompt]); - strcpy(str,"ACELWQ?*"); - if(SYSOP) - strcat(str,"0"); - i=getkeys(str,total_chans); - if(i&0x80000000L) { /* change channel */ - savch=i&~0x80000000L; - if(savch==channel) - continue; - if(!chan_access(savch-1)) - continue; - bprintf(text[WelcomeToChannelN] - ,savch,chan[savch-1]->name); - - usrs=0; - for(i=1;i<=sys_nodes;i++) { - if(i==node_num) - continue; - getnodedat(i,&node,0); - if(node.action!=NODE_MCHT - || node.status!=NODE_INUSE) - continue; - if(node.aux && (node.aux&0xff)!=savch) - continue; - printnodedat(i,node); - if(node.aux&0x1f00) { /* password */ - bprintf(text[PasswordProtected] - ,node.misc&NODE_ANON - ? text[UNKNOWN_USER] - : username(node.useron,tmp)); - if(!getstr(str,8,K_UPPER|K_ALPHA|K_LINE)) - break; - if(strcmp(str,unpackchatpass(tmp,node))) - break; - bputs(text[CorrectPassword]); } - preusr[usrs]=usr[usrs++]=i; } - if(i<=sys_nodes) { /* failed password */ - bputs(text[WrongPassword]); - continue; } - if(gurubuf) { - FREE(gurubuf); - gurubuf=NULL; } - if(chan[savch-1]->misc&CHAN_GURU - && chan[savch-1]->guru<total_gurus - && chk_ar(guru[chan[savch-1]->guru]->ar,useron - )) { - sprintf(str,"%s%s.DAT",ctrl_dir - ,guru[chan[savch-1]->guru]->code); - if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - break; } - if((gurubuf=MALLOC(filelength(file)+1))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str - ,filelength(file)+1); - break; } - read(file,gurubuf,filelength(file)); - gurubuf[filelength(file)]=0; - close(file); } - preusrs=usrs; - if(gurubuf) - bprintf(text[NodeInMultiChatLocally] - ,sys_nodes+1 - ,guru[chan[savch-1]->guru]->name - ,savch); - channel=savch; - if(!usrs && chan[savch-1]->misc&CHAN_PW - && !noyes(text[PasswordProtectChanQ])) { - bputs(text[PasswordPrompt]); - if(getstr(str,8,K_UPPER|K_ALPHA|K_LINE)) { - getnodedat(node_num,&thisnode,1); - thisnode.aux=channel; - packchatpass(str,&thisnode); } - else { - getnodedat(node_num,&thisnode,1); - thisnode.aux=channel; } } - else { - getnodedat(node_num,&thisnode,1); - thisnode.aux=channel; } - putnodedat(node_num,thisnode); - bputs(text[YoureOnTheAir]); - if(chan[channel-1]->cost - && !(useron.exempt&FLAG('J'))) - subtract_cdt(chan[channel-1]->cost); } - else switch(i) { /* other command */ - case '0': /* Global channel */ - if(!SYSOP) - break; - usrs=0; - for(i=1;i<=sys_nodes;i++) { - if(i==node_num) - continue; - getnodedat(i,&node,0); - if(node.action!=NODE_MCHT - || node.status!=NODE_INUSE) - continue; - printnodedat(i,node); - preusr[usrs]=usr[usrs++]=i; } - preusrs=usrs; - getnodedat(node_num,&thisnode,1); - thisnode.aux=channel=0; - putnodedat(node_num,thisnode); - break; - case 'A': /* Action commands */ - useron.chat^=CHAT_ACTION; - bprintf("\r\nAction commands are now %s\r\n" - ,useron.chat&CHAT_ACTION - ? text[ON]:text[OFF]); - putuserrec(useron.number,U_CHAT,8 - ,ltoa(useron.chat,str,16)); - break; - case 'C': /* List of action commands */ - CRLF; - for(i=0;i<total_chatacts;i++) { - if(chatact[i]->actset - !=chan[channel-1]->actset) - continue; - bprintf("%-*.*s",LEN_CHATACTCMD - ,LEN_CHATACTCMD,chatact[i]->cmd); - if(!((i+1)%8)) { - CRLF; } - else - bputs(" "); } - CRLF; - break; - case 'E': /* Toggle echo */ - useron.chat^=CHAT_ECHO; - bprintf(text[EchoIsNow] - ,useron.chat&CHAT_ECHO - ? text[ON]:text[OFF]); - putuserrec(useron.number,U_CHAT,8 - ,ltoa(useron.chat,str,16)); - break; - case 'L': /* list nodes */ - CRLF; - for(i=1;i<=sys_nodes && i<=sys_lastnode;i++) { - getnodedat(i,&node,0); - printnodedat(i,node); } - CRLF; - break; - case 'W': /* page node(s) */ - j=getnodetopage(0,0); - if(!j) - break; - for(i=0;i<usrs;i++) - if(usr[i]==j) - break; - if(i>=usrs) { - bputs(text[UserNotFound]); - break; } - - bputs(text[NodeMsgPrompt]); - if(!getstr(line,66,K_LINE|K_MSG)) - break; - - sprintf(buf,text[ChatLineFmt] - ,thisnode.misc&NODE_ANON - ? text[AnonUserChatHandle] - : useron.handle - ,node_num,'*',line); - strcat(buf,crlf); - if(useron.chat&CHAT_ECHO) - bputs(buf); - putnmsg(j,buf); - break; - case 'Q': /* quit */ - done=1; - break; - case '*': - sprintf(str,"%sMENU\\CHAN.*",text_dir); - if(fexist(str)) - menu("CHAN"); - else { - bputs(text[ChatChanLstHdr]); - bputs(text[ChatChanLstTitles]); - if(total_chans>=10) { - bputs(" "); - bputs(text[ChatChanLstTitles]); } - CRLF; - bputs(text[ChatChanLstUnderline]); - if(total_chans>=10) { - bputs(" "); - bputs(text[ChatChanLstUnderline]); } - CRLF; - if(total_chans>=10) - j=(total_chans/2)+(total_chans&1); - else - j=total_chans; - for(i=0;i<j && !msgabort();i++) { - bprintf(text[ChatChanLstFmt],i+1 - ,chan[i]->name - ,chan[i]->cost); - if(total_chans>=10) { - k=(total_chans/2) - +i+(total_chans&1); - if(k<total_chans) { - bputs(" "); - bprintf(text[ChatChanLstFmt] - ,k+1 - ,chan[k]->name - ,chan[k]->cost); } } - CRLF; } - CRLF; } - break; - case '?': /* menu */ - menu("MULTCHAT"); - break; } } - else { - ungetkey(ch); - j=0; - pgraph[0]=0; - while(j<5) { - if(!getstr(line,66,K_WRAP|K_MSG|K_CHAT)) - break; - if(j) { - sprintf(str,text[ChatLineFmt] - ,thisnode.misc&NODE_ANON - ? text[AnonUserChatHandle] - : useron.handle - ,node_num,':',nulstr); - sprintf(tmp,"%*s",bstrlen(str),nulstr); - strcat(pgraph,tmp); } - strcat(pgraph,line); - strcat(pgraph,crlf); - if(!wordwrap[0]) - break; - j++; } - if(pgraph[0]) { - if(useron.chat&CHAT_ACTION) { - for(i=0;i<total_chatacts;i++) { - if(chatact[i]->actset - !=chan[channel-1]->actset) - continue; - sprintf(str,"%s ",chatact[i]->cmd); - if(!strnicmp(str,pgraph,strlen(str))) - break; - sprintf(str,"%.*s" - ,LEN_CHATACTCMD+2,pgraph); - str[strlen(str)-2]=0; - if(!stricmp(chatact[i]->cmd,str)) - break; } - - if(i<total_chatacts) { - p=pgraph+strlen(str); - n=atoi(p); - for(j=0;j<usrs;j++) { - getnodedat(usr[j],&node,0); - if(usrs==1) /* no need to search */ - break; - if(n) { - if(usr[j]==n) - break; - continue; } - username(node.useron,str); - if(!strnicmp(str,p,strlen(str))) - break; - getuserrec(node.useron,U_HANDLE - ,LEN_HANDLE,str); - if(!strnicmp(str,p,strlen(str))) - break; } - if(!usrs - && chan[channel-1]->guru<total_gurus) - strcpy(str - ,guru[chan[channel-1]->guru]->name); - else if(j>=usrs) - strcpy(str,"everyone"); - else if(node.misc&NODE_ANON) - strcpy(str,text[UNKNOWN_USER]); - else - username(node.useron,str); - - /* Display on same node */ - bprintf(chatact[i]->out - ,thisnode.misc&NODE_ANON - ? text[UNKNOWN_USER] : useron.alias - ,str); - CRLF; - - if(usrs && j<usrs) { - /* Display to dest user */ - sprintf(buf,chatact[i]->out - ,thisnode.misc&NODE_ANON - ? text[UNKNOWN_USER] : useron.alias - ,"you"); - strcat(buf,crlf); - putnmsg(usr[j],buf); } - - - /* Display to all other users */ - sprintf(buf,chatact[i]->out - ,thisnode.misc&NODE_ANON - ? text[UNKNOWN_USER] : useron.alias - ,str); - strcat(buf,crlf); - - for(i=0;i<usrs;i++) { - if(i==j) - continue; - getnodedat(usr[i],&node,0); - putnmsg(usr[i],buf); } - for(i=0;i<qusrs;i++) { - getnodedat(qusr[i],&node,0); - putnmsg(qusr[i],buf); } - continue; } } - - sprintf(buf,text[ChatLineFmt] - ,thisnode.misc&NODE_ANON - ? text[AnonUserChatHandle] - : useron.handle - ,node_num,':',pgraph); - if(useron.chat&CHAT_ECHO) - bputs(buf); - for(i=0;i<usrs;i++) { - getnodedat(usr[i],&node,0); - putnmsg(usr[i],buf); } - for(i=0;i<qusrs;i++) { - getnodedat(qusr[i],&node,0); - putnmsg(qusr[i],buf); } - if(!usrs && channel && gurubuf - && chan[channel-1]->misc&CHAN_GURU) - guruchat(pgraph,gurubuf,chan[channel-1]->guru); - } } } - else - mswait(1); - if(sys_status&SS_ABORT) - break; } - lncntr=0; - break; - case 'P': /* private node-to-node chat */ - privchat(); - break; - case 'C': - no_rip_menu=1; - ch=kbd_state(); /* Check scroll lock */ - if(ch&16 || (sys_chat_ar[0] && chk_ar(sys_chat_ar,useron)) - || useron.exempt&FLAG('C')) { - sysop_page(); - break; } - bprintf(text[SysopIsNotAvailable],sys_op); - if(total_gurus && chk_ar(guru[0]->ar,useron)) { - sprintf(str,text[ChatWithGuruInsteadQ],guru[0]->name); - if(!yesno(str)) - break; } - else - break; - case 'T': - if(!total_gurus) { - bprintf(text[SysopIsNotAvailable],"The Guru"); - break; } - if(total_gurus==1 && chk_ar(guru[0]->ar,useron)) - i=0; - else { - for(i=0;i<total_gurus;i++) - uselect(1,i,nulstr,guru[i]->name,guru[i]->ar); - i=uselect(0,0,0,0,0); - if(i<0) - break; } - if(gurubuf) - FREE(gurubuf); - sprintf(str,"%s%s.DAT",ctrl_dir,guru[i]->code); - if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } - if((gurubuf=MALLOC(filelength(file)+1))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,filelength(file)+1); - return; } - read(file,gurubuf,filelength(file)); - gurubuf[filelength(file)]=0; - close(file); - localguru(gurubuf,i); - no_rip_menu=1; - FREE(gurubuf); - gurubuf=NULL; - break; - case '?': - if(useron.misc&EXPERT) - menu("CHAT"); - break; - default: /* 'Q' or <CR> */ - lncntr=0; - if(gurubuf) - FREE(gurubuf); - return; } - action=NODE_CHAT; - if(!(useron.misc&EXPERT) || useron.misc&WIP - || (useron.misc&RIP && !no_rip_menu)) { -#if 0 - sys_status&=~SS_ABORT; - if(lncntr) { - SYNC; - CRLF; - if(lncntr) /* CRLF or SYNC can cause pause */ - pause(); } -#endif - menu("CHAT"); } - ASYNC; - bputs(text[ChatPrompt]); } -if(gurubuf) - FREE(gurubuf); -} - -int getnodetopage(int all, int telegram) -{ - static uchar last[26]; - char str[128]; - int i,j; - ulong l; - node_t node; - -if(!lastnodemsg) - last[0]=0; -if(lastnodemsg) { - getnodedat(lastnodemsg,&node,0); - if(node.status!=NODE_INUSE && !SYSOP) - lastnodemsg=1; } -for(j=0,i=1;i<=sys_nodes && i<=sys_lastnode;i++) { - getnodedat(i,&node,0); - if(i==node_num) - continue; - if(node.status==NODE_INUSE || (SYSOP && node.status==NODE_QUIET)) { - if(!lastnodemsg) - lastnodemsg=i; - j++; } } - -if(!last[0]) - sprintf(last,"%u",lastnodemsg); - -if(!j && !telegram) { - bputs(text[NoOtherActiveNodes]); - return(0); } - -if(all) - sprintf(str,text[NodeToSendMsgTo],lastnodemsg); -else - sprintf(str,text[NodeToPrivateChat],lastnodemsg); -mnemonics(str); - -strcpy(str,last); -getstr(str,25,K_UPRLWR|K_LINE|K_EDIT|K_AUTODEL); -if(sys_status&SS_ABORT) - return(0); -if(!str[0]) - return(0); - -j=atoi(str); -if(j && j<=sys_lastnode && j<=sys_nodes) { - getnodedat(j,&node,0); - if(node.status!=NODE_INUSE && !SYSOP) { - bprintf(text[NodeNIsNotInUse],j); - return(0); } - if(telegram && node.misc&(NODE_POFF|NODE_ANON) && !SYSOP) { - bprintf(text[CantPageNode],node.misc&NODE_ANON - ? text[UNKNOWN_USER] : username(node.useron,tmp)); - return(0); } - strcpy(last,str); - if(telegram) - return(node.useron); - return(j); } -if(all && !stricmp(str,"ALL")) - return(-1); - -if(str[0]=='\'') { - j=userdatdupe(0,U_HANDLE,LEN_HANDLE,str+1,0); - if(!j) { - bputs(text[UnknownUser]); - return(0); } } -else if(str[0]=='#') - j=atoi(str+1); -else - j=finduser(str); -if(!j) - return(0); -if(j>lastuser()) - return(0); -getuserrec(j,U_MISC,8,tmp); -l=ahtoul(tmp); -if(l&(DELETED|INACTIVE)) { /* Deleted or Inactive User */ - bputs(text[UnknownUser]); - return(0); } - -for(i=1;i<=sys_nodes && i<=sys_lastnode;i++) { - getnodedat(i,&node,0); - if((node.status==NODE_INUSE || (SYSOP && node.status==NODE_QUIET)) - && node.useron==j) { - if(telegram && node.misc&NODE_POFF && !SYSOP) { - bprintf(text[CantPageNode],node.misc&NODE_ANON - ? text[UNKNOWN_USER] : username(node.useron,tmp)); - return(0); } - if(telegram) - return(j); - strcpy(last,str); - return(i); } } -if(telegram) { - strcpy(last,str); - return(j); } -bputs(text[UserNotFound]); -return(0); -} - - -/****************************************************************************/ -/* Sending single line messages between nodes */ -/****************************************************************************/ -void nodemsg() -{ - static inside; - char str[256],line[256],buf[512],logbuf[512],ch; - int i,j,usernumber,done=0; - node_t node,savenode; - -if(inside>1) /* nested once only */ - return; -sys_status|=SS_IN_CTRLP; -getnodedat(node_num,&savenode,0); -inside++; -wordwrap[0]=0; -while(online && !done) { - if(useron.rest&FLAG('C')) { - bputs(text[R_SendMessages]); - break; } - SYNC; - mnemonics(text[PrivateMsgPrompt]); - sys_status&=~SS_ABORT; - while(online) { /* Watch for incoming messages */ - ch=toupper(inkey(0)); - if(ch && strchr("TMCQ\r",ch)) - break; - if(sys_status&SS_ABORT) - break; - if(online==ON_REMOTE && rioctl(IOSTATE)&ABORT) { - sys_status|=SS_ABORT; - break; } - getnodedat(node_num,&thisnode,0); - if(thisnode.misc&(NODE_MSGW|NODE_NMSG)) { - SAVELINE; - CRLF; - if(thisnode.misc&NODE_NMSG) - getnmsg(); - if(thisnode.misc&NODE_MSGW) - getsmsg(useron.number); - CRLF; - RESTORELINE; } - else - nodesync(); - gettimeleft(); - checkline(); } - - if(!online || sys_status&SS_ABORT) { - sys_status&=~SS_ABORT; - CRLF; - break; } - - switch(toupper(ch)) { - case 'T': /* Telegram */ - bputs("Telegram\r\n"); - usernumber=getnodetopage(0,1); - if(!usernumber) - break; - - if(usernumber==1 && useron.rest&FLAG('S')) { /* ! val fback */ - bprintf(text[R_Feedback],sys_op); - break; } - if(usernumber!=1 && useron.rest&FLAG('E')) { - bputs(text[R_Email]); - break; } - now=time(NULL); - bprintf("\1n\r\n\1mSending telegram to \1h%s #%u\1n\1m (Max 5 " - "lines, Blank line ends):\r\n\r\n\1g\1h" - ,username(usernumber,tmp),usernumber); - sprintf(buf,"\1n\1g\7Telegram from \1n\1h%s\1n\1g on %s:\r\n\1h" - ,thisnode.misc&NODE_ANON ? text[UNKNOWN_USER] : useron.alias - ,timestr(&now)); - i=0; - logbuf[0]=0; - while(online && i<5) { - bprintf("%4s",nulstr); - if(!getstr(line,70,K_WRAP|K_MSG)) - break; - sprintf(str,"%4s%s\r\n",nulstr,line); - strcat(buf,str); - if(line[0]) - strcat(logbuf,line); - i++; } - if(!i) - break; - if(sys_status&SS_ABORT) { - CRLF; - break; } - putsmsg(usernumber,buf); - sprintf(str,"Sent telegram to %s #%u" - ,username(usernumber,tmp),usernumber); - logline("C",str); - logline(nulstr,logbuf); - bprintf("\1n\1mTelegram sent to \1h%s\r\n" - ,username(usernumber,tmp)); - break; - case 'M': /* Message */ - bputs("Message\r\n"); - i=getnodetopage(1,0); - if(!i) - break; - if(i!=-1) { - getnodedat(i,&node,0); - usernumber=node.useron; - if(node.misc&NODE_POFF && !SYSOP) - bprintf(text[CantPageNode],node.misc&NODE_ANON - ? text[UNKNOWN_USER] : username(node.useron,tmp)); - else { - bprintf("\r\n\1n\1mSending message to \1h%s\r\n" - ,node.misc&NODE_ANON ? text[UNKNOWN_USER] - : username(node.useron,tmp)); - bputs(text[NodeMsgPrompt]); - if(!getstr(line,69,K_LINE)) - break; - sprintf(buf,text[NodeMsgFmt],node_num - ,thisnode.misc&NODE_ANON - ? text[UNKNOWN_USER] : useron.alias,line); - putnmsg(i,buf); - if(!(node.misc&NODE_ANON)) - bprintf("\r\n\1n\1mMessage sent to \1h%s #%u\r\n" - ,username(usernumber,tmp),usernumber); - sprintf(str,"Sent message to %s on node %d:" - ,username(usernumber,tmp),i); - logline("C",str); - logline(nulstr,line); } } - else { /* ALL */ - bputs(text[NodeMsgPrompt]); - if(!getstr(line,70,K_LINE)) - break; - sprintf(buf,text[AllNodeMsgFmt],node_num - ,thisnode.misc&NODE_ANON - ? text[UNKNOWN_USER] : useron.alias,line); - for(i=1;i<=sys_nodes;i++) { - if(i==node_num) - continue; - getnodedat(i,&node,0); - if((node.status==NODE_INUSE - || (SYSOP && node.status==NODE_QUIET)) - && (SYSOP || !(node.misc&NODE_POFF))) - putnmsg(i,buf); } - logline("C","Sent message to all nodes"); - logline(nulstr,line); } - break; - case 'C': /* Chat */ - bputs("Chat\r\n"); - if(action==NODE_PCHT) { /* already in pchat */ - done=1; - break; } - privchat(); - action=savenode.action; - break; - default: - bputs("Quit\r\n"); - done=1; - break; } } -inside--; -if(!inside) - sys_status&=~SS_IN_CTRLP; -getnodedat(node_num,&thisnode,1); -thisnode.action=action=savenode.action; -thisnode.aux=savenode.aux; -thisnode.extaux=savenode.extaux; -putnodedat(node_num,thisnode); -} - -/****************************************************************************/ -/* The guru will respond from the 'guru' buffer to 'line' */ -/****************************************************************************/ -void guruchat(char *line, char *gurubuf, int gurunum) -{ - char str[256],cstr[256],*ptr,c,*answer[100],answers,theanswer[769] - ,mistakes=1,hu=0; - int i,j,k,file; - long len; - struct tm *tm; - -now=time(NULL); -tm=localtime(&now); - -for(i=0;i<100;i++) { - if((answer[i]=MALLOC(513))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,513); - while(i) { - i--; - FREE(answer[i]); } - sys_status&=~SS_GURUCHAT; - return; } } -ptr=gurubuf; -len=strlen(gurubuf); -strupr(line); -j=strlen(line); -k=0; -for(i=0;i<j;i++) { - if(!isalnum(line[i]) && !k) /* beginning non-alphanumeric */ - continue; - if(!isalnum(line[i]) && line[i]==line[i+1]) /* redundant non-alnum */ - continue; - if(!isalnum(line[i]) && line[i+1]=='?') /* fix "WHAT ?" */ - continue; - cstr[k++]=line[i]; } -cstr[k]=0; -while(--k) { - if(!isalnum(cstr[k])) - continue; - break; } -if(k<1) { - for(i=0;i<100;i++) - FREE(answer[i]); - return; } -if(cstr[k+1]=='?') - k++; -cstr[k+1]=0; -while(*ptr && ptr<gurubuf+len) { - if(*ptr=='(') { - ptr++; - if(!guruexp(&ptr,cstr)) { - while(*ptr && *ptr!='(' && ptr<gurubuf+len) - ptr++; - continue; } } - else { - while(*ptr && *ptr!=LF && ptr<gurubuf+len) /* skip LF after ')' */ - ptr++; - ptr++; - answers=0; - while(*ptr && answers<100 && ptr<gurubuf+len) { - i=0; - while(*ptr && *ptr!=CR && i<512 && ptr<gurubuf+len) { - answer[answers][i]=*ptr; - ptr++; - i++; - if(*ptr=='\\' && *(ptr+1)==CR) { /* multi-line answer */ - ptr+=3; /* skip \CRLF */ - answer[answers][i++]=CR; - answer[answers][i++]=LF; } } - answer[answers][i]=0; - if(!strlen(answer[answers]) || answer[answers][0]=='(') { - ptr-=strlen(answer[answers]); - break; } - ptr+=2; /* skip CRLF */ - answers++; } - if(answers==100) - while(*ptr && *ptr!='(' && ptr<gurubuf+len) - ptr++; - i=random(answers); - for(j=0,k=0;j<strlen(answer[i]);j++) { - if(answer[i][j]=='`') { - j++; - theanswer[k]=0; - switch(toupper(answer[i][j])) { - case 'A': - if(sys_status&SS_USERON) - strcat(theanswer,useron.alias); - else - strcat(theanswer,text[UNKNOWN_USER]); - break; - case 'B': - if(sys_status&SS_USERON) - strcat(theanswer,useron.birth); - else - strcat(theanswer,"00/00/00"); - break; - case 'C': - if(sys_status&SS_USERON) - strcat(theanswer,useron.comp); - else - strcat(theanswer,"PC Jr."); - break; - case 'D': - if(sys_status&SS_USERON) - strcat(theanswer,ultoac(useron.dlb,tmp)); - else - strcat(theanswer,"0"); - break; - case 'G': - strcat(theanswer,guru[gurunum]->name); - break; - case 'H': - hu=1; - break; - case 'I': - strcat(theanswer,sys_id); - break; - case 'J': - sprintf(tmp,"%u",tm->tm_mday); - break; - case 'L': - if(sys_status&SS_USERON) - strcat(theanswer,itoa(useron.level,tmp,10)); - else - strcat(theanswer,"0"); - break; - case 'M': - strcat(theanswer,month[tm->tm_mon]); - break; - case 'N': /* Note */ - if(sys_status&SS_USERON) - strcat(theanswer,useron.note); - else - strcat(theanswer,text[UNKNOWN_USER]); - break; - case 'O': - strcat(theanswer,sys_op); - break; - case 'P': - if(sys_status&SS_USERON) - strcat(theanswer,useron.phone); - else - strcat(theanswer,"000-000-0000"); - break; - case 'Q': - sys_status&=~SS_GURUCHAT; - break; - case 'R': - if(sys_status&SS_USERON) - strcat(theanswer,useron.name); - else - strcat(theanswer,text[UNKNOWN_USER]); - break; - case 'S': - strcat(theanswer,sys_name); - break; - case 'T': - sprintf(tmp,"%u:%02u",tm->tm_hour>12 ? tm->tm_hour-12 - : tm->tm_hour,tm->tm_min); - strcat(theanswer,tmp); - break; - case 'U': - if(sys_status&SS_USERON) - strcat(theanswer,ultoac(useron.ulb,tmp)); - else - strcat(theanswer,"0"); - break; - case 'W': - strcat(theanswer,weekday[tm->tm_wday]); - break; - case 'Y': /* Current year */ - sprintf(tmp,"%u",1900+tm->tm_year); - strcat(theanswer,tmp); - break; - case 'Z': - if(sys_status&SS_USERON) - strcat(theanswer,useron.zipcode); - else - strcat(theanswer,"90210"); - break; - case '$': /* Credits */ - if(sys_status&SS_USERON) - strcat(theanswer,ultoac(useron.cdt,tmp)); - else - strcat(theanswer,"0"); - break; - case '#': - if(sys_status&SS_USERON) - strcat(theanswer,itoa(getage(useron.birth) - ,tmp,10)); - else - strcat(theanswer,"0"); - break; - case '!': - mistakes=!mistakes; - break; - case '_': - mswait(500); - break; } - k=strlen(theanswer); } - else - theanswer[k++]=answer[i][j]; } - theanswer[k]=0; - mswait(500+random(1000)); /* thinking time */ - if(action!=NODE_MCHT) { - for(i=0;i<k;i++) { - if(mistakes && theanswer[i]!=theanswer[i-1] && - ((!isalnum(theanswer[i]) && !random(100)) - || (isalnum(theanswer[i]) && !random(30)))) { - c=j=random(3)+1; /* 1 to 3 chars */ - if(c<strcspn(theanswer+(i+1),"\0., ")) - c=j=1; - while(j) { - outchar(97+random(26)); - mswait(25+random(150)); - j--; } - if(random(100)) { - mswait(100+random(300)); - while(c) { - bputs("\b \b"); - mswait(50+random(50)); - c--; } } } - outchar(theanswer[i]); - if(theanswer[i]==theanswer[i+1]) - mswait(25+random(50)); - else - mswait(25+random(150)); - if(theanswer[i]==SP) - mswait(random(50)); } } - else { - mswait(strlen(theanswer)*100); - bprintf(text[ChatLineFmt],guru[gurunum]->name - ,sys_nodes+1,':',theanswer); } - CRLF; - sprintf(str,"%sGURU.LOG",data_dir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); - else { - if(action==NODE_MCHT) { - sprintf(str,"[Multi] "); - write(file,str,strlen(str)); } - sprintf(str,"%s:\r\n",sys_status&SS_USERON - ? useron.alias : "UNKNOWN"); - write(file,str,strlen(str)); - write(file,line,strlen(line)); - if(action!=NODE_MCHT) - write(file,crlf,2); - sprintf(str,"%s:\r\n",guru[gurunum]->name); - write(file,str,strlen(str)); - write(file,theanswer,strlen(theanswer)); - write(file,crlf,2); - close(file); } - if(hu) - hangup(); - break; } } -for(i=0;i<100;i++) - FREE(answer[i]); -} - -/****************************************************************************/ -/* An expression from the guru's buffer 'ptrptr' is evaluated and true or */ -/* false is returned. */ -/****************************************************************************/ -char guruexp(char **ptrptr, char *line) -{ - char c,*cp,str[256],true=0,and=0,or=0,nest,*ar; - -if((**ptrptr)==')') { /* expressions of () are always true */ - (*ptrptr)++; - return(1); } -while((**ptrptr)!=')' && (**ptrptr)) { - if((**ptrptr)=='[') { - (*ptrptr)++; - sprintf(str,"%.128s",*ptrptr); - while(**ptrptr && (**ptrptr)!=']') - (*ptrptr)++; - (*ptrptr)++; - cp=strchr(str,']'); - if(cp) *cp=0; - ar=arstr(NULL,str); - c=chk_ar(ar,useron); - if(ar[0]!=AR_NULL) - FREE(ar); - if(!c && and) { - true=0; - break; } - if(c && or) { - true=1; - break; } - if(c) - true=1; - continue; } - if((**ptrptr)=='(') { - (*ptrptr)++; - c=guruexp(&(*ptrptr),line); - if(!c && and) { - true=0; - break; } - if(c && or) { - true=1; - break; } - if(c) - true=1; } - if((**ptrptr)==')') - break; - c=0; - while((**ptrptr) && isspace(**ptrptr)) - (*ptrptr)++; - while((**ptrptr)!='|' && (**ptrptr)!='&' && (**ptrptr)!=')' &&(**ptrptr)) { - str[c++]=(**ptrptr); - (*ptrptr)++; } - str[c]=0; - if((**ptrptr)=='|') { - if(!c && true) - break; - and=0; - or=1; } - else if((**ptrptr)=='&') { - if(!c && !true) - break; - and=1; - or=0; } - if(!c) { /* support ((exp)op(exp)) */ - (*ptrptr)++; - continue; } - if((**ptrptr)!=')') - (*ptrptr)++; - c=0; /* c now used for start line flag */ - if(str[strlen(str)-1]=='^') { /* ^signifies start of line only */ - str[strlen(str)-1]=0; - c=1; } - if(str[strlen(str)-1]=='~') { /* ~signifies non-isolated word */ - str[strlen(str)-1]=0; - cp=strstr(line,str); - if(c && cp!=line) - cp=0; } - else { - cp=strstr(line,str); - if(cp && c) { - if(cp!=line || isalnum(*(cp+strlen(str)))) - cp=0; } - else { /* must be isolated word */ - while(cp) - if((cp!=line && isalnum(*(cp-1))) - || isalnum(*(cp+strlen(str)))) - cp=strstr(cp+strlen(str),str); - else - break; } } - if(!cp && and) { - true=0; - break; } - if(cp && or) { - true=1; - break; } - if(cp) - true=1; } -nest=0; -while((**ptrptr)!=')' && (**ptrptr)) { /* handle nested exp */ - if((**ptrptr)=='(') /* (TRUE|(IGNORE)) */ - nest++; - (*ptrptr)++; - while((**ptrptr)==')' && nest && (**ptrptr)) { - nest--; - (*ptrptr)++; } } -(*ptrptr)++; /* skip over ')' */ -return(true); -} - -/****************************************************************************/ -/* Guru chat with the appearance of Local chat with sysop. */ -/****************************************************************************/ -void localguru(char *gurubuf, int gurunum) -{ - char ch,str[256]; - int con=console; /* save console state */ - -if(sys_status&SS_GURUCHAT || !total_gurus) - return; -sys_status|=SS_GURUCHAT; -console&=~(CON_L_ECHOX|CON_R_ECHOX); /* turn off X's */ -console|=(CON_L_ECHO|CON_R_ECHO); /* make sure echo is on */ -if(action==NODE_CHAT) { /* only page if from chat section */ - bprintf(text[PagingGuru],guru[gurunum]->name); - ch=random(25)+25; - while(ch--) { - mswait(200); - outchar('.'); } } -bprintf(text[SysopIsHere],guru[gurunum]->name); -getnodedat(node_num,&thisnode,1); -thisnode.aux=gurunum; -putnodedat(node_num,thisnode); -attr(color[clr_chatlocal]); -guruchat("HELLO",gurubuf,gurunum); -while(online && (sys_status&SS_GURUCHAT)) { - checkline(); - action=NODE_GCHT; - SYNC; - if((ch=inkey(0))!=0) { - ungetkey(ch); - attr(color[clr_chatremote]); - if(getstr(str,78,K_WRAP|K_CHAT)) { - attr(color[clr_chatlocal]); - guruchat(str,gurubuf,gurunum); } } - else - mswait(1); } -bputs(text[EndOfChat]); -sys_status&=~SS_GURUCHAT; -console=con; /* restore console state */ -} - -/****************************************************************************/ -/* Packs the password 'pass' into 5bit ASCII inside node_t. 32bits in */ -/* node.extaux, and the other 8bits in the upper byte of node.aux */ -/****************************************************************************/ -void packchatpass(char *pass, node_t *node) -{ - char bits; - int i,j; - -node->aux&=~0xff00; /* clear the password */ -node->extaux=0L; -if((j=strlen(pass))==0) /* there isn't a password */ - return; -node->aux|=(int)((pass[0]-64)<<8); /* 1st char goes in low 5bits of aux */ -if(j==1) /* password is only one char, we're done */ - return; -node->aux|=(int)((pass[1]-64)<<13); /* low 3bits of 2nd char go in aux */ -node->extaux|=(long)((pass[1]-64)>>3); /* high 2bits of 2nd char go extaux */ -bits=2; -for(i=2;i<j;i++) { /* now process the 3rd char through the last */ - node->extaux|=(long)((long)(pass[i]-64)<<bits); - bits+=5; } -} - -/****************************************************************************/ -/* Unpacks the password 'pass' from the 5bit ASCII inside node_t. 32bits in */ -/* node.extaux, and the other 8bits in the upper byte of node.aux */ -/****************************************************************************/ -char *unpackchatpass(char *pass, node_t node) -{ - char bits; - int i; - -pass[0]=(node.aux&0x1f00)>>8; -pass[1]=((node.aux&0xe000)>>13)|((node.extaux&0x3)<<3); -bits=2; -for(i=2;i<8;i++) { - pass[i]=(node.extaux>>bits)&0x1f; - bits+=5; } -pass[8]=0; -for(i=0;i<8;i++) - if(pass[i]) - pass[i]+=64; -return(pass); -} diff --git a/src/sbbs2/chk_ar.c b/src/sbbs2/chk_ar.c deleted file mode 100644 index ee82da2a01..0000000000 --- a/src/sbbs2/chk_ar.c +++ /dev/null @@ -1,509 +0,0 @@ -#line 1 "CHK_AR.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -int ar_exp(char **ptrptr, user_t user) -{ - uint len,true=1,not,or,equal,artype=AR_LEVEL,n,i,age; - ulong l; - struct tm *gm; - -for(;(**ptrptr);(*ptrptr)++) { - - if((**ptrptr)==AR_ENDNEST) - break; - - not=or=equal=0; - - if((**ptrptr)==AR_OR) { - or=1; - (*ptrptr)++; } - - if((**ptrptr)==AR_NOT) { - not=1; - (*ptrptr)++; } - - if((**ptrptr)==AR_EQUAL) { - equal=1; - (*ptrptr)++; } - - if((true && or) || (!true && !or)) - break; - - if((**ptrptr)==AR_BEGNEST) { - (*ptrptr)++; - if(ar_exp(ptrptr,user)) - true=!not; - else - true=not; - while((**ptrptr)!=AR_ENDNEST && (**ptrptr)) /* in case of early exit */ - (*ptrptr)++; - if(!(**ptrptr)) - break; - continue; } - - artype=(**ptrptr); - switch(artype) { - case AR_ANSI: /* No arguments */ - case AR_RIP: - case AR_WIP: - case AR_LOCAL: - case AR_EXPERT: - case AR_SYSOP: - case AR_QUIET: - case AR_OS2: - case AR_DOS: - break; - default: - (*ptrptr)++; - break; } - - n=(**ptrptr); - i=(*(short *)*ptrptr); - switch(artype) { - case AR_LEVEL: - if((equal && user.level!=n) || (!equal && user.level<n)) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessLevel]; - noaccess_val=n; } - break; - case AR_AGE: - age=getage(user.birth); - if((equal && age!=n) || (!equal && age<n)) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessAge]; - noaccess_val=n; } - break; - case AR_BPS: - if((equal && cur_rate!=i) || (!equal && cur_rate<i)) - true=not; - else - true=!not; - (*ptrptr)++; - if(!true) { - noaccess_str=text[NoAccessBPS]; - noaccess_val=i; } - break; - case AR_ANSI: - if(!(user.misc&ANSI)) - true=not; - else true=!not; - break; - case AR_RIP: - if(!(user.misc&RIP)) - true=not; - else true=!not; - break; - case AR_WIP: - if(!(user.misc&WIP)) - true=not; - else true=!not; - break; - case AR_OS2: - #ifndef __OS2__ - true=not; - #else - true=!not; - #endif - break; - case AR_DOS: - #ifdef __FLAT__ - true=not; - #else - true=!not; - #endif - break; - case AR_EXPERT: - if(!(user.misc&EXPERT)) - true=not; - else true=!not; - break; - case AR_SYSOP: - if(!SYSOP) - true=not; - else true=!not; - break; - case AR_QUIET: - if(thisnode.status!=NODE_QUIET) - true=not; - else true=!not; - break; - case AR_LOCAL: - if(online!=ON_LOCAL) - true=not; - else true=!not; - break; - case AR_DAY: - now=time(NULL); - gm=localtime(&now); /* Qnet call out based on time */ - if((equal && gm->tm_wday!=n) || (!equal && gm->tm_wday<n)) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessDay]; - noaccess_val=n; } - break; - case AR_CREDIT: - l=(ulong)i*1024UL; - if((equal && user.cdt+user.freecdt!=l) - || (!equal && user.cdt+user.freecdt<l)) - true=not; - else - true=!not; - (*ptrptr)++; - if(!true) { - noaccess_str=text[NoAccessCredit]; - noaccess_val=l; } - break; - case AR_NODE: - if((equal && node_num!=n) || (!equal && node_num<n)) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessNode]; - noaccess_val=n; } - break; - case AR_USER: - if((equal && user.number!=i) || (!equal && user.number<i)) - true=not; - else - true=!not; - (*ptrptr)++; - if(!true) { - noaccess_str=text[NoAccessUser]; - noaccess_val=i; } - break; - case AR_GROUP: - if((equal - && (cursubnum<0 || cursubnum>=total_subs - || sub[cursubnum]->grp!=i)) - || (!equal && cursubnum>=0 && cursubnum<total_subs - && sub[cursubnum]->grp<i)) - true=not; - else - true=!not; - (*ptrptr)++; - if(!true) { - noaccess_str=text[NoAccessGroup]; - noaccess_val=i+1; } - break; - case AR_SUB: - if((equal && cursubnum!=i) || (!equal && cursubnum<i)) - true=not; - else - true=!not; - (*ptrptr)++; - if(!true) { - noaccess_str=text[NoAccessSub]; - noaccess_val=i+1; } - break; - case AR_SUBCODE: - if(cursubnum<0 || cursubnum>=total_subs - || strcmp(sub[cursubnum]->code,*ptrptr)) - true=not; - else - true=!not; - while(*(*ptrptr)) - (*ptrptr)++; - if(!true) - noaccess_str=text[NoAccessSub]; - break; - case AR_LIB: - if((equal - && (curdirnum<0 || curdirnum>=total_dirs - || dir[curdirnum]->lib!=i)) - || (!equal && curdirnum>=0 && curdirnum<total_dirs - && dir[curdirnum]->lib<i)) - true=not; - else - true=!not; - (*ptrptr)++; - if(!true) { - noaccess_str=text[NoAccessLib]; - noaccess_val=i+1; } - break; - case AR_DIR: - if((equal && curdirnum!=i) || (!equal && curdirnum<i)) - true=not; - else - true=!not; - (*ptrptr)++; - if(!true) { - noaccess_str=text[NoAccessDir]; - noaccess_val=i+1; } - break; - case AR_DIRCODE: - if(curdirnum<0 || curdirnum>=total_dirs - || strcmp(dir[curdirnum]->code,*ptrptr)) - true=not; - else - true=!not; - while(*(*ptrptr)) - (*ptrptr)++; - if(!true) - noaccess_str=text[NoAccessSub]; - break; - case AR_EXPIRE: - now=time(NULL); - if(!user.expire || now+((long)i*24L*60L*60L)>user.expire) - true=not; - else - true=!not; - (*ptrptr)++; - if(!true) { - noaccess_str=text[NoAccessExpire]; - noaccess_val=i; } - break; - case AR_RANDOM: - n=random(i+1); - if((equal && n!=i) || (!equal && n<i)) - true=not; - else - true=!not; - (*ptrptr)++; - break; - case AR_LASTON: - now=time(NULL); - if((now-user.laston)/(24L*60L*60L)<i) - true=not; - else - true=!not; - (*ptrptr)++; - break; - case AR_LOGONS: - if((equal && user.logons!=i) || (!equal && user.logons<i)) - true=not; - else - true=!not; - (*ptrptr)++; - break; - case AR_MAIN_CMDS: - if((equal && main_cmds!=i) || (!equal && main_cmds<i)) - true=not; - else - true=!not; - (*ptrptr)++; - break; - case AR_FILE_CMDS: - if((equal && xfer_cmds!=i) || (!equal && xfer_cmds<i)) - true=not; - else - true=!not; - (*ptrptr)++; - break; - case AR_TLEFT: - if(timeleft/60<n) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessTimeLeft]; - noaccess_val=n; } - break; - case AR_TUSED: - if((time(NULL)-logontime)/60<n) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessTimeUsed]; - noaccess_val=n; } - break; - case AR_TIME: - now=time(NULL); - unixtodos(now,&date,&curtime); - if((curtime.ti_hour*60)+curtime.ti_min<i) - true=not; - else - true=!not; - (*ptrptr)++; - if(!true) { - noaccess_str=text[NoAccessTime]; - noaccess_val=i; } - break; - case AR_PCR: - if(user.logons>user.posts - && (!user.posts || 100/(user.logons/user.posts)<n)) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessPCR]; - noaccess_val=n; } - break; - case AR_UDR: /* up/download byte ratio */ - l=user.dlb; - if(!l) l=1; - if(user.dlb>user.ulb - && (!user.ulb || 100/(l/user.ulb)<n)) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessUDR]; - noaccess_val=n; } - break; - case AR_UDFR: /* up/download file ratio */ - i=user.dls; - if(!i) i=1; - if(user.dls>user.uls - && (!user.uls || 100/(i/user.uls)<n)) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessUDFR]; - noaccess_val=n; } - break; - case AR_FLAG1: - if((!equal && !(user.flags1&FLAG(n))) - || (equal && user.flags1!=FLAG(n))) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessFlag1]; - noaccess_val=n; } - break; - case AR_FLAG2: - if((!equal && !(user.flags2&FLAG(n))) - || (equal && user.flags2!=FLAG(n))) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessFlag2]; - noaccess_val=n; } - break; - case AR_FLAG3: - if((!equal && !(user.flags3&FLAG(n))) - || (equal && user.flags3!=FLAG(n))) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessFlag3]; - noaccess_val=n; } - break; - case AR_FLAG4: - if((!equal && !(user.flags4&FLAG(n))) - || (equal && user.flags4!=FLAG(n))) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessFlag4]; - noaccess_val=n; } - break; - case AR_REST: - if((!equal && !(user.rest&FLAG(n))) - || (equal && user.rest!=FLAG(n))) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessRest]; - noaccess_val=n; } - break; - case AR_EXEMPT: - if((!equal && !(user.exempt&FLAG(n))) - || (equal && user.exempt!=FLAG(n))) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessExempt]; - noaccess_val=n; } - break; - case AR_SEX: - if(user.sex!=n) - true=not; - else - true=!not; - if(!true) { - noaccess_str=text[NoAccessSex]; - noaccess_val=n; } - break; } } -return(true); -} - -int chk_ar(char *str, user_t user) -{ - char *p; - -if(str==NULL) - return(1); -p=str; -return(ar_exp(&p,user)); -} - - -/****************************************************************************/ -/* This function fills the usrsub, usrsubs, usrgrps, curgrp, and cursub */ -/* variables based on the security clearance of the current user (useron) */ -/****************************************************************************/ -void getusrsubs() -{ - uint i,j,k,l; - -for(j=0,i=0;i<total_grps;i++) { - if(!chk_ar(grp[i]->ar,useron)) - continue; - for(k=0,l=0;l<total_subs;l++) { - if(sub[l]->grp!=i) continue; - if(!chk_ar(sub[l]->ar,useron)) - continue; - usrsub[j][k++]=l; } - usrsubs[j]=k; - if(!k) /* No subs accessible in group */ - continue; - usrgrp[j++]=i; } -usrgrps=j; -while((curgrp>=usrgrps || !usrsubs[curgrp]) && curgrp) curgrp--; -while(cursub[curgrp]>=usrsubs[curgrp] && cursub[curgrp]) cursub[curgrp]--; -} - -/****************************************************************************/ -/* This function fills the usrdir, usrdirs, usrlibs, curlib, and curdir */ -/* variables based on the security clearance of the current user (useron) */ -/****************************************************************************/ -void getusrdirs() -{ - uint i,j,k,l; - -if(useron.rest&FLAG('T')) { - usrlibs=0; - return; } -for(j=0,i=0;i<total_libs;i++) { - if(!chk_ar(lib[i]->ar,useron)) - continue; - for(k=0,l=0;l<total_dirs;l++) { - if(dir[l]->lib!=i) continue; - if(!chk_ar(dir[l]->ar,useron)) - continue; - usrdir[j][k++]=l; } - usrdirs[j]=k; - if(!k) /* No dirs accessible in lib */ - continue; - usrlib[j++]=i; } -usrlibs=j; -while((curlib>=usrlibs || !usrdirs[curlib]) && curlib) curlib--; -while(curdir[curlib]>=usrdirs[curlib] && curdir[curlib]) curdir[curlib]--; -} - -int dir_op(uint dirnum) -{ -return(SYSOP || (dir[dirnum]->op_ar[0] && chk_ar(dir[dirnum]->op_ar,useron))); -} - - diff --git a/src/sbbs2/cmdshell.h b/src/sbbs2/cmdshell.h deleted file mode 100644 index 8ec3c4e299..0000000000 --- a/src/sbbs2/cmdshell.h +++ /dev/null @@ -1,586 +0,0 @@ -/* CMDSHELL.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "gen_defs.h" - -/******************************/ -/* Instructions and Functions */ -/******************************/ -enum { - -/* Single byte instructions */ - - CS_IF_TRUE=0 // Same as IF_EQUAL - ,CS_IF_FALSE // Same as IF_NOT_EQUAL - ,CS_ELSE - ,CS_ENDIF - ,CS_CMD_HOME - ,CS_CMD_POP - ,CS_END_CMD - ,CS_RETURN - ,CS_GETKEY - ,CS_GETKEYE - ,CS_UNGETKEY - ,CS_UNGETSTR - ,CS_PRINTKEY - ,CS_PRINTSTR - ,CS_HANGUP - ,CS_SYNC - ,CS_ASYNC - ,CS_CHKSYSPASS - ,CS_LOGKEY - ,CS_LOGKEY_COMMA - ,CS_LOGSTR - ,CS_CLS - ,CS_CRLF - ,CS_PAUSE - ,CS_PAUSE_RESET - ,CS_GETLINES - ,CS_GETFILESPEC - ,CS_FINDUSER - ,CS_CLEAR_ABORT - ,CS_SELECT_SHELL - ,CS_SET_SHELL - ,CS_SELECT_EDITOR - ,CS_SET_EDITOR // 0x20 - ,CS_INKEY - ,CS_RIOSYNC - ,CS_GETTIMELEFT - ,CS_SAVELINE - ,CS_RESTORELINE - ,CS_IF_GREATER - ,CS_IF_GREATER_OR_EQUAL - ,CS_IF_LESS - ,CS_IF_LESS_OR_EQUAL - ,CS_DEFAULT // 0x2a - ,CS_END_SWITCH - ,CS_END_CASE - ,CS_PUT_NODE - ,CS_ONE_MORE_BYTE=0x2f - -/* Two byte instructions */ - - ,CS_CMDKEY=0x30 - ,CS_NODE_ACTION - ,CS_GETSTR - ,CS_GETNAME - ,CS_GETSTRUPR - ,CS_SHIFT_STR - ,CS_COMPARE_KEY - ,CS_SETLOGIC - ,CS_SET_USER_LEVEL - ,CS_SET_USER_STRING - ,CS_GETLINE // 0x3a - ,CS_NODE_STATUS - ,CS_TWO_MORE_BYTES=0x3f - -/* Three byte instructions */ - - ,CS_GOTO=0x40 - ,CS_CALL - ,CS_TOGGLE_NODE_MISC - ,CS_ADJUST_USER_CREDITS - ,CS_TOGGLE_USER_FLAG - ,CS_GETNUM - ,CS_COMPARE_NODE_MISC - ,CS_MSWAIT - ,CS_ADJUST_USER_MINUTES - ,CS_REVERT_TEXT - ,CS_THREE_MORE_BYTES=0x4f - -/* String arg instructions */ - - ,CS_MENU=0x50 - ,CS_PRINT - ,CS_PRINT_LOCAL - ,CS_PRINT_REMOTE - ,CS_PRINTFILE - ,CS_PRINTFILE_LOCAL - ,CS_PRINTFILE_REMOTE - ,CS_YES_NO - ,CS_NO_YES - ,CS_COMPARE_STR - ,CS_COMPARE_WORD // 0x5a - ,CS_EXEC - ,CS_EXEC_INT - ,CS_EXEC_BIN - ,CS_EXEC_XTRN - ,CS_GETCMD - ,CS_LOG // 0x60 - ,CS_MNEMONICS - ,CS_SETSTR - ,CS_SET_MENU_DIR - ,CS_SET_MENU_FILE - ,CS_CMDSTR - ,CS_CHKFILE - ,CS_GET_TEMPLATE - ,CS_TRASHCAN - ,CS_CREATE_SIF - ,CS_READ_SIF // 0x6a - ,CS_CMDKEYS - ,CS_COMPARE_KEYS - ,CS_STR_FUNCTION=0x6f - -/* Var length instructions */ - - ,CS_COMPARE_ARS=0x70 - ,CS_TOGGLE_USER_MISC - ,CS_COMPARE_USER_MISC - ,CS_REPLACE_TEXT - ,CS_TOGGLE_USER_CHAT - ,CS_COMPARE_USER_CHAT - ,CS_TOGGLE_USER_QWK - ,CS_COMPARE_USER_QWK - ,CS_SWITCH - ,CS_CASE - ,CS_USE_INT_VAR // 0x7a - -/* File I/O Functions */ - - ,CS_FIO_FUNCTION=0x7e - -/* Variable instruction sub-ops */ - - ,CS_VAR_INSTRUCTION=0x7f - -/* Functions */ - - ,CS_MAIL_READ=0x80 - ,CS_MAIL_READ_SENT - ,CS_MAIL_READ_ALL - ,CS_MAIL_SEND - ,CS_MAIL_SEND_BULK - ,CS_MAIL_SEND_FILE - ,CS_MAIL_SEND_FEEDBACK - ,CS_MAIL_SEND_NETMAIL - ,CS_MAIL_SEND_NETFILE - ,CS_LOGOFF - ,CS_LOGOFF_FAST - ,CS_AUTO_MESSAGE - ,CS_MSG_SET_AREA - ,CS_MSG_SELECT_AREA - ,CS_MSG_SHOW_GROUPS - ,CS_MSG_SHOW_SUBBOARDS - ,CS_MSG_GROUP_UP // 0x90 - ,CS_MSG_GROUP_DOWN - ,CS_MSG_SUBBOARD_UP - ,CS_MSG_SUBBOARD_DOWN - ,CS_MSG_GET_SUB_NUM - ,CS_MSG_GET_GRP_NUM - ,CS_MSG_READ - ,CS_MSG_POST - ,CS_MSG_QWK - ,CS_MSG_PTRS_CFG - ,CS_MSG_PTRS_REINIT - ,CS_MSG_NEW_SCAN_CFG - ,CS_MSG_NEW_SCAN - ,CS_MSG_NEW_SCAN_ALL - ,CS_MSG_CONT_SCAN - ,CS_MSG_CONT_SCAN_ALL - ,CS_MSG_BROWSE_SCAN // 0xA0 - ,CS_MSG_BROWSE_SCAN_ALL - ,CS_MSG_FIND_TEXT - ,CS_MSG_FIND_TEXT_ALL - ,CS_MSG_YOUR_SCAN_CFG - ,CS_MSG_YOUR_SCAN - ,CS_MSG_YOUR_SCAN_ALL - ,CS_MSG_NEW_SCAN_SUB - ,CS_MSG_SET_GROUP - ,CS_MSG_UNUSED4 - ,CS_MSG_UNUSED3 - ,CS_MSG_UNUSED2 - ,CS_MSG_UNUSED1 - ,CS_FILE_SET_AREA - ,CS_FILE_SELECT_AREA - ,CS_FILE_SHOW_LIBRARIES - ,CS_FILE_SHOW_DIRECTORIES // 0xB0 - ,CS_FILE_LIBRARY_UP - ,CS_FILE_LIBRARY_DOWN - ,CS_FILE_DIRECTORY_UP - ,CS_FILE_DIRECTORY_DOWN - ,CS_FILE_GET_DIR_NUM - ,CS_FILE_GET_LIB_NUM - ,CS_FILE_LIST - ,CS_FILE_LIST_EXTENDED - ,CS_FILE_VIEW - ,CS_FILE_UPLOAD - ,CS_FILE_UPLOAD_USER - ,CS_FILE_UPLOAD_SYSOP - ,CS_FILE_DOWNLOAD - ,CS_FILE_DOWNLOAD_USER - ,CS_FILE_DOWNLOAD_BATCH - ,CS_FILE_REMOVE //0xC0 - ,CS_FILE_BATCH_SECTION - ,CS_FILE_TEMP_SECTION - ,CS_FILE_NEW_SCAN_CFG - ,CS_FILE_NEW_SCAN - ,CS_FILE_NEW_SCAN_ALL - ,CS_FILE_FIND_TEXT - ,CS_FILE_FIND_TEXT_ALL - ,CS_FILE_FIND_NAME - ,CS_FILE_FIND_NAME_ALL - ,CS_FILE_PTRS_CFG - ,CS_FILE_BATCH_ADD - ,CS_FILE_BATCH_CLEAR - ,CS_FILE_SET_LIBRARY - ,CS_FILE_SEND //Like file_get, but no password needed - ,CS_FILE_BATCH_ADD_LIST - ,CS_FILE_UNUSED1 //0xD0 - ,CS_NODELIST_ALL - ,CS_NODELIST_USERS - ,CS_CHAT_SECTION - ,CS_USER_DEFAULTS - ,CS_USER_EDIT - ,CS_TEXT_FILE_SECTION - ,CS_INFO_SYSTEM - ,CS_INFO_SUBBOARD - ,CS_INFO_DIRECTORY - ,CS_INFO_USER - ,CS_INFO_VERSION - ,CS_INFO_XFER_POLICY - ,CS_XTRN_EXEC - ,CS_XTRN_SECTION - ,CS_USERLIST_SUB - ,CS_USERLIST_DIR //0xE0 - ,CS_USERLIST_ALL - ,CS_USERLIST_LOGONS - ,CS_PAGE_SYSOP - ,CS_PRIVATE_CHAT - ,CS_PRIVATE_MESSAGE - ,CS_MINUTE_BANK - ,CS_GURU_LOG - ,CS_ERROR_LOG - ,CS_SYSTEM_LOG - ,CS_SYSTEM_YLOG - ,CS_SYSTEM_STATS - ,CS_NODE_STATS - ,CS_SHOW_MEM - ,CS_CHANGE_USER - ,CS_ANSI_CAPTURE - ,CS_LIST_TEXT_FILE //0xF0 - ,CS_EDIT_TEXT_FILE - ,CS_FILE_SET_ALT_PATH - ,CS_FILE_RESORT_DIRECTORY - ,CS_FILE_GET - ,CS_FILE_PUT - ,CS_FILE_UPLOAD_BULK - ,CS_FILE_FIND_OLD - ,CS_FILE_FIND_OPEN - ,CS_FILE_FIND_OFFLINE - ,CS_FILE_FIND_OLD_UPLOADS - ,CS_INC_MAIN_CMDS - ,CS_INC_FILE_CMDS - ,CS_PRINTFILE_STR - ,CS_PAGE_GURU //0xFE - - }; - - /* Variable instructions (sub-op-code) */ - -enum { - - SHOW_VARS // Show all variables - ,PRINT_VAR // Print a single variable - ,VAR_PRINTF // Print a formated line of text - ,VAR_RESERVED_4 - ,VAR_RESERVED_3 - ,VAR_RESERVED_2 - ,VAR_RESERVED_1 - ,DEFINE_STR_VAR // Define Local Variable - ,DEFINE_INT_VAR - ,VAR_RESERVED_A4 - ,VAR_RESERVED_A3 - ,VAR_RESERVED_A2 - ,VAR_RESERVED_A1 - ,DEFINE_GLOBAL_STR_VAR // Define Global Variable - ,DEFINE_GLOBAL_INT_VAR - ,VAR_RESERVED_B4 - ,VAR_RESERVED_B3 // 0x10 - ,VAR_RESERVED_B2 - ,VAR_RESERVED_B1 - ,SET_STR_VAR // Set string variable - ,SET_INT_VAR // Set integer variable - ,VAR_RESERVED_C4 - ,VAR_RESERVED_C3 - ,VAR_RESERVED_C2 - ,VAR_RESERVED_C1 - ,COMPARE_STR_VAR // Compare string variable (static) - ,COMPARE_INT_VAR // Compare integer variable (static) - ,STRNCMP_VAR // Compare n chars of str var (static) - ,STRSTR_VAR // Sub-string compare of str var (static) - ,VAR_RESERVED_D2 - ,VAR_RESERVED_D1 - ,COMPARE_VARS // Compare two variables - ,STRNCMP_VARS // 0x20 // Compare n chars of str vars (dynamic) - ,STRSTR_VARS // Sub-string compare between two str vars - ,VAR_RESERVED_E2 - ,VAR_RESERVED_E1 - ,COPY_VAR // Copy from one variable to another - ,VAR_RESERVED_F4 - ,VAR_RESERVED_F3 - ,VAR_RESERVED_F2 - ,VAR_RESERVED_F1 - ,SWAP_VARS // Swap two variables - ,VAR_RESERVED_G4 - ,VAR_RESERVED_G3 - ,VAR_RESERVED_G2 - ,VAR_RESERVED_G1 - ,CAT_STR_VAR // Concatenate string variable (static) - ,CAT_STR_VARS // Concatenate strint variable (dynamic) - ,FORMAT_STR_VAR // 0x30 // Format string variable - ,TIME_STR // Write formated date/time to string - ,DATE_STR // Write MM/DD/YY to string - ,FORMAT_TIME_STR // Create custom date/time string - ,SECOND_STR // Create a string in format hh:mm:ss - ,STRUPR_VAR // Convert string to upper case - ,STRLWR_VAR // Convert string to lower case - ,ADD_INT_VAR // Add to int variable (static) - ,ADD_INT_VARS // Add to int variable (dynamic) - ,VAR_RESERVED_I4 - ,VAR_RESERVED_I3 - ,VAR_RESERVED_I2 - ,VAR_RESERVED_I1 - ,SUB_INT_VAR // Subtract from int variable (static) - ,SUB_INT_VARS // Subtract from int variable (dynamic) - ,VAR_RESERVED_J4 - ,VAR_RESERVED_J3 // 0x40 - ,VAR_RESERVED_J2 - ,VAR_RESERVED_J1 - ,MUL_INT_VAR // Multiply int variable (static) - ,MUL_INT_VARS // Multiply int variable (dynamic) - ,VAR_RESERVED_K4 - ,VAR_RESERVED_K3 - ,VAR_RESERVED_K2 - ,VAR_RESERVED_K1 - ,DIV_INT_VAR // Divide int variable (static) - ,DIV_INT_VARS // Divide int variable (dynamic) - ,MOD_INT_VAR - ,MOD_INT_VARS - ,VAR_RESERVED_L2 - ,VAR_RESERVED_L1 - ,AND_INT_VAR // Bit-wise AND int variable (static) - ,AND_INT_VARS // 0x50 // Bit-wise AND int variable (dynamic) - ,VAR_RESERVED_M4 - ,VAR_RESERVED_M3 - ,VAR_RESERVED_M2 - ,VAR_RESERVED_M1 - ,OR_INT_VAR // Bit-wise OR int variable (static) - ,OR_INT_VARS // Bit-wise OR int variable (dynamic) - ,VAR_RESERVED_N4 - ,VAR_RESERVED_N3 - ,VAR_RESERVED_N2 - ,VAR_RESERVED_N1 - ,NOT_INT_VAR // Bit-wise NOT int variable (static) - ,NOT_INT_VARS // Bit-wise NOT int variable (dynamic) - ,VAR_RESERVED_O4 - ,VAR_RESERVED_O3 - ,VAR_RESERVED_O2 - ,VAR_RESERVED_O1 // 0x60 - ,XOR_INT_VAR // XOR int variable (static) - ,XOR_INT_VARS // XOR int variable (dynamic) - ,VAR_RESERVED_P4 - ,VAR_RESERVED_P3 - ,VAR_RESERVED_P2 - ,VAR_RESERVED_P1 - ,RANDOM_INT_VAR // Set integer to random number - ,TIME_INT_VAR // Set integer to current time/date - ,DATE_STR_TO_INT // Convert a date string to integer - ,STRLEN_INT_VAR // Set integer to length of str - ,CRC16_TO_INT // Get CRC-16 of str var - ,CRC32_TO_INT // Get CRC-32 of str var - ,FLENGTH_TO_INT // Put length of str var file into int - ,CHARVAL_TO_INT // Put character val of str var into int - ,GETNUM_VAR // Get number - ,GETSTR_VAR // 0x70 // Get string - ,GETNAME_VAR // Get string (upper/lower) - ,GETSTRUPR_VAR // Get string (upper) - ,GETLINE_VAR // Get string (input bar/line) - ,SHIFT_STR_VAR // Shift str in variable - ,GETSTR_MODE // Get string with various modes - ,TRUNCSP_STR_VAR // Truncate space off end of str var - ,CHKFILE_VAR - ,PRINTFILE_VAR_MODE // Printfile str var with mode - ,PRINTTAIL_VAR_MODE // Print tail-end of str var with mode - ,CHKSUM_TO_INT // Get CHKSUM of str var - ,STRIP_CTRL_STR_VAR // Strip ctrl chars from str var - ,SEND_FILE_VIA // Send file (static) via protocol - ,SEND_FILE_VIA_VAR // Send file (dynamic) via protocol - ,FTIME_TO_INT // Put time of str var file into int - ,RECEIVE_FILE_VIA // Receive file (static) via protocol - ,RECEIVE_FILE_VIA_VAR // Receive file (dynamic) via protocol - }; - - // More string arg functions -enum { - CS_LOGIN // Login/password prompt - ,CS_LOAD_TEXT // Load alternative TEXT.DAT - }; - -enum { // More single byte instructions - CS_ONLINE // Online execution only - ,CS_OFFLINE // Offline execution allowed - ,CS_NEWUSER // New user procedure - ,CS_LOGON // Logon procedure - ,CS_LOGOUT // Logout procedure - ,CS_EXIT // Exit current module immediately - }; - -enum { // More two byte instructions - CS_USER_EVENT // External user event - }; - -enum { - FIO_OPEN // Open file (static filename) - ,FIO_CLOSE // Close file - ,FIO_READ // Read from file - ,FIO_READ_VAR // Read from file, variable # of bytes - ,FIO_WRITE // Write to file - ,FIO_WRITE_VAR // Write to file, variable # of bytes - ,FIO_GET_LENGTH // Get length - ,FIO_EOF // Set logic to TRUE if eof - ,FIO_GET_POS // Get current file position - ,FIO_SEEK // Seek within file - ,FIO_SEEK_VAR // Seek within file, variable offset - ,FIO_LOCK // Lock a region - ,FIO_LOCK_VAR // Lock a region, variable length - ,FIO_UNLOCK // Unlock a region - ,FIO_UNLOCK_VAR // Unlock a region, variable length - ,FIO_SET_LENGTH // Change size - ,FIO_SET_LENGTH_VAR // Change size, variable length - ,FIO_PRINTF // Write formated string to file - ,FIO_SET_ETX // Set end-of-text character - ,FIO_GET_TIME // Gets the current date/time of file - ,FIO_SET_TIME // Sets the current date/time of file - ,FIO_OPEN_VAR // Open a file (dynamic filename) - ,FIO_READ_LINE // Read a single line from file - ,FIO_FLUSH // Flush buffered output to disk - ,FIO_UNUSED8 - ,FIO_UNUSED7 - ,FIO_UNUSED6 - ,FIO_UNUSED5 - ,FIO_UNUSED4 - ,FIO_UNUSED3 - ,FIO_UNUSED2 - ,FIO_UNUSED1 - ,REMOVE_FILE // Remove a file - ,RENAME_FILE // Rename a file - ,COPY_FILE // Copy a file to another file - ,MOVE_FILE // Move a file to another file - ,GET_FILE_ATTRIB // Get file attributes - ,SET_FILE_ATTRIB // Set file attributes - ,MAKE_DIR // Make directory - ,CHANGE_DIR // Change current directory - ,REMOVE_DIR // Remove directory - ,OPEN_DIR // Open a directory - ,READ_DIR // Read a directory entry - ,REWIND_DIR // Rewind an open directory - ,CLOSE_DIR // Close an open directory - }; - -enum { - USER_STRING_ALIAS - ,USER_STRING_REALNAME - ,USER_STRING_HANDLE - ,USER_STRING_COMPUTER - ,USER_STRING_NOTE - ,USER_STRING_ADDRESS - ,USER_STRING_LOCATION - ,USER_STRING_ZIPCODE - ,USER_STRING_PASSWORD - ,USER_STRING_BIRTHDAY - ,USER_STRING_PHONE - ,USER_STRING_MODEM - ,USER_STRING_COMMENT - - }; - -#define CS_ONE_BYTE CS_IF_TRUE -#define CS_TWO_BYTE CS_CMDKEY -#define CS_THREE_BYTE CS_GOTO -#define CS_ASCIIZ CS_MENU -#define CS_MISC CS_COMPARE_ARS -#define CS_FUNCTIONS CS_MAIL_READ -#define CS_ELSEORENDIF 0xff -#define CS_NEXTCASE 0xfe - -#define CS_DIGIT 0xff -#define CS_EDIGIT 0xfe - - /* Bits for csi_t.misc */ -#define CS_IN_SWITCH (1L<<0) /* Inside active switch statement */ -#define CS_OFFLINE_EXEC (1L<<1) /* Offline execution */ - -#define MAX_RETS 50 /* maximum nested call depth */ -#define MAX_CMDRETS 50 /* maximum nested cmd depth */ -#define MAX_STRVARS 26 -#define MAX_INTVARS 26 -#define MAX_STRLEN 81 -#define MAX_FOPENS 10 /* maximum open files */ -#define MAX_SYSVARS 16 /* maximum system variable saves */ - -#define LOGIC_LESS -1 -#define LOGIC_EQUAL 0 -#define LOGIC_GREATER 1 -#define LOGIC_TRUE LOGIC_EQUAL -#define LOGIC_FALSE LOGIC_LESS - -typedef struct { /* Command shell image */ - - uchar *cs, /* Command shell image */ - *ip, /* Instruction pointer */ - cmd, /* Current command key */ - etx, /* End-of-text character */ - *str, /* Current string */ - *ret[MAX_RETS], /* Return address stack */ - rets, /* Returns on stack */ - *cmdret[MAX_CMDRETS], /* Command return address stack */ - cmdrets, /* Command returns on stack */ - **str_var; /* String variables */ - - - int logic, /* Current logic */ - files; /* Open files */ - - FILE *file[MAX_FOPENS]; /* Each file ptr */ - - uint str_vars, /* Total number of string variables */ - int_vars; /* Total number of integer variables */ - - long retval, /* Return value */ - misc, /* Misc bits */ - switch_val, /* Current switch value */ - *int_var, /* Integer variables */ - *str_var_name, /* String variable names (CRC-32) */ - *int_var_name; /* Integer variable names (CRC-32) */ - - ulong length; /* Length of image */ - - } csi_t; - -extern uint global_str_vars; -extern char **global_str_var; -extern long *global_str_var_name; -extern uint global_int_vars; -extern long *global_int_var; -extern long *global_int_var_name; -extern csi_t main_csi; -extern char *sysvar_p[MAX_SYSVARS]; -extern int sysvar_pi; -extern long sysvar_l[MAX_SYSVARS]; -extern int sysvar_li; - -int exec(csi_t *csi); -int exec_function(csi_t *csi); -int exec_misc(csi_t *csi, uchar *path); -int execmsg(csi_t *csi); -int execfile(csi_t *csi); -long exec_bin(uchar *mod, csi_t *csi); -void clearvars(csi_t *bin); -void freevars(csi_t *bin); -char **getstrvar(csi_t *bin, long name); -long *getintvar(csi_t *bin, long name); -char *copystrvar(csi_t *csi, char *p, char *str); -void skipto(csi_t *csi, uchar inst); - -/* End of CMDSHELL.H */ diff --git a/src/sbbs2/comio.c b/src/sbbs2/comio.c deleted file mode 100644 index 510a415ddf..0000000000 --- a/src/sbbs2/comio.c +++ /dev/null @@ -1,354 +0,0 @@ -#line 1 "COMIO.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/***********************************/ -/* COM port and modem i/o routines */ -/***********************************/ - -#include "sbbs.h" - -#ifndef __FLAT__ -extern mswtyp; -#endif - -extern char term_ret; -extern uint addrio; - -/****************************************************************************/ -/* Outputs a NULL terminated string to the COM port verbatim */ -/* Called from functions putmsg, getstr and color */ -/****************************************************************************/ -void putcom(char *str) -{ - ulong l=0; - -while(str[l]) - putcomch(str[l++]); -} - -/****************************************************************************/ -/* Outputs a single character to the COM port */ -/****************************************************************************/ -void putcomch(char ch) -{ - char lch; - int i=0; - -if(!com_port) - return; -while(outcom(ch)&TXBOF && i<1440) { /* 3 minute pause delay */ - if(lkbrd(1)) { - lch=lkbrd(0); /* ctrl-c */ - if(lch==3) { - lputs("local abort (putcomch)\r\n"); - i=1440; - break; } - ungetkey(lch); } - if(!DCDHIGH) - break; - i++; - if(sys_status&SS_SYSPAGE) - beep(i,80); - else - mswait(80); } -if(i==1440) { /* timeout - beep flush outbuf */ - i=rioctl(TXBC); - lprintf("timeout(putcomch) %04X %04X\r\n",i,rioctl(IOFO)); - outcom(7); - lputc(7); - rioctl(IOCS|PAUSE); } -} - -/****************************************************************************/ -/* Sends string of characters to COM port. Interprets ^M and ~ (pause) */ -/* Called from functions waitforcall and offhook */ -/****************************************************************************/ -void mdmcmd(char *str) -{ - int i=0; - uint lch; - -if(mdm_misc&MDM_DUMB) - return; -if(sys_status&SS_MDMDEBUG) - lputs("\r\nModem command : "); -while(str[i]) { - if(str[i]=='~') - mswait(DELAY_MDMTLD); - else { - if(i && str[i-1]=='^' && str[i]!='^') /* control character */ - putcomch(toupper(str[i])-64); - else if(str[i]!='^' || (i && str[i-1]=='^')) - putcomch(str[i]); - if(sys_status&SS_MDMDEBUG) - lputc(str[i]); } - i++; } -putcomch(CR); -i=0; -while(rioctl(TXSYNC|(1<<8)) && i<10) { /* wait for modem to receive all chars */ - if(lkbrd(1)) { - lch=lkbrd(0); /* ctrl-c */ - if(lch==0x2e03) { - lputs("local abort (mdmcmd)\r\n"); - break; } - if(lch==0xff00) - bail(1); - ungetkey(lch); } - i++; } -if(i==10) { - i=rioctl(TXBC); - lprintf("\r\ntimeout(mdmcmd) %04X %04X\r\n",i,rioctl(IOFO)); } -if(sys_status&SS_MDMDEBUG) - lputs(crlf); -} - -/****************************************************************************/ -/* Returns CR terminated string from the COM port. */ -/* Called from function waitforcall */ -/****************************************************************************/ -char getmdmstr(char *str, int sec) -{ - uchar j=0,ch; - uint lch; - time_t start; - -if(sys_status&SS_MDMDEBUG) - lputs("Modem response : "); -start=time(NULL); -while(time(NULL)-start<sec && j<81) { - if(lkbrd(1)) { - lch=lkbrd(0); /* ctrl-c */ - if(lch==0x2e03 || lch==3) { - lputs("local abort (getmdmstr)\r\n"); - break; } - if(lch==0xff00) - bail(1); - ungetkey(lch); } - if((ch=incom())==CR && j) { - if(mdm_misc&MDM_VERBAL) - incom(); /* LF */ - break; } - if(ch && (ch<0x20 || ch>0x7f)) { /* ignore ctrl characters and ex-ascii */ - if(sys_status&SS_MDMDEBUG) - lprintf("[%02X]",ch); - continue; } - if(ch) { - str[j++]=ch; - if(sys_status&SS_MDMDEBUG) - lputc(ch); } - else mswait(0); } -mswait(500); -str[j]=0; -if(sys_status&SS_MDMDEBUG) - lputs(crlf); -return(j); -} - -/****************************************************************************/ -/* Drops DTR (if COM port used), clears KEY and COM Buffers and other vars */ -/* Called from functions checkline, getkey, inkey, main, waitforcall, */ -/* main_sec, xfer_sec, gettimeleft and newuser */ -/****************************************************************************/ -void hangup() -{ - char str1[256],str2[256],c; - uint i; - -rioctl(MSR); -if(!term_ret && com_port && (rioctl(IOSTATE)&DCD)) { /* if carrier detect */ - riosync(0); - mswait(DELAY_HANGUP); /* wait for modem buffer to clear */ - if(mdm_misc&MDM_NODTR) - mdmcmd(mdm_hang); - else { - lputs("\r\nDropping DTR..."); - if(dtr(15)) { /* drop dtr, wait 15 seconds for dcd to drop */ - lputs("\rDropping DTR Failed"); - logline("@!","Dropping DTR Failed"); - mdmcmd(mdm_hang); } } - mswait(110); - rioctl(MSR); - if(rioctl(IOSTATE)&DCD) { - mswait(5000); - rioctl(MSR); - if(rioctl(IOSTATE)&DCD) { - lputs("\r\nDCD high after hang up"); - logline("@!","DCD high after hang up"); - mswait(5000); } } } -if(sys_status&SS_CAP) { /* Close capture if open */ - fclose(capfile); -#ifdef __MSDOS__ - freedosmem=farcoreleft(); /* fnopen allocates memory and fclose frees */ -#endif - sys_status^=SS_CAP; } -if(sys_status&SS_FINPUT) { /* Close file input if open */ - close(inputfile); - sys_status^=SS_FINPUT; } - -keybufbot=keybuftop=online=console=0; -sys_status&=~(SS_TMPSYSOP|SS_LCHAT|SS_SYSPAGE|SS_ABORT); -nosound(); -if(com_port) - dtr(1); -} - -/****************************************************************************/ -/* Sends 'off-hook' string to modem to pick up phone (if COM port used) */ -/* Called from function waitforcall */ -/****************************************************************************/ -void offhook() -{ -if(com_port && !(mdm_misc&MDM_DUMB)) { - mdmcmd(mdm_offh); - rioctl(TXSYNC|(2<<8)); /* wait up 2 seconds for modem to receive */ - } -} - -/****************************************************************************/ -/* Checks to see if remote user has hung up. */ -/* Called from function getkey */ -/****************************************************************************/ -void checkline() -{ -if(online!=ON_REMOTE) return; -if(!DCDHIGH) { - lprintf("\r\nHung up"); - logline(nulstr,"Hung up"); - hangup(); } -} - -/****************************************************************************/ -/* Syncronizes the remote and local machines before command prompts */ -/****************************************************************************/ -void riosync(char abortable) -{ - int i=0; - -if(useron.misc&(RIP|WIP)) /* don't allow abort with RIP or WIP */ - abortable=0; /* mainly because of ANSI cursor posistion response */ -if(sys_status&SS_ABORT) /* no need to sync if already aborting */ - return; -if(online==ON_REMOTE && console&CON_R_ECHO) { - while(rioctl(TXSYNC|(1<<8)) && i<180) { /* three minutes till tx buf empty */ - if(sys_status&SS_SYSPAGE) - beep(i,10); - if(lkbrd(1)) - break; - if(abortable && rioctl(RXBC)) { /* incoming characer */ - rioctl(IOFO); /* flush output */ - sys_status|=SS_ABORT; /* set abort flag so no pause */ - break; } /* abort sync */ - if(!DCDHIGH) - break; - mswait(0); - i++; } - if(i==180) { - i=rioctl(TXBC); - lprintf("timeout(sync) %04X %04X\r\n",i,rioctl(IOFO)); - outcom(7); - lputc(7); - rioctl(IOCS|PAUSE); } - if(rioctl(IOSTATE)&ABORT) - sys_status|=SS_ABORT; - rioctl(IOCS|ABORT); } -} - -/*****************************************************************************/ -/* Initializes com i/o routines and sets baud rate */ -/*****************************************************************************/ -void comini() -{ - int i; -#ifndef __FLAT__ - uint base=0xffff; -#endif - -if(sys_status&SS_COMISR) /* Already installed */ - return; -lprintf("\r\nInitializing COM port %u: ",com_port); -#ifndef __FLAT__ -switch(com_base) { - case 0xb: - lputs("PC BIOS"); - break; - case 0xd: - lputs("DigiBoard"); - break; - case 0xe: - lputs("PS/2 BIOS"); - break; - case 0xf: - lputs("FOSSIL"); - break; - case 0: - base=com_port; - lputs("UART I/O (BIOS), "); - if(com_irq) - lprintf("IRQ %d",com_irq); - else lputs("default IRQ"); - break; - default: - base=com_base; - lprintf("UART I/O %Xh, ",com_base); - if(com_irq) - lprintf("IRQ %d",com_irq); - else lputs("default IRQ"); - break; } - -if(base==0xffff) - lprintf(" channel %u",com_irq); -i=rioini(base,com_irq); -#else -#ifdef __OS2__ -if(rio_handle!=-1) // Already opened, prolly passed to SBBS4OS2 via cmd line - lprintf("handle %d",rio_handle); -#endif -i=rioini(com_port,0); -#endif -if(i) { - lprintf(" - Failed! (%d)\r\n",i); - bail(1); } -i=0; -if(mdm_misc&MDM_CTS) - i=CTSCK; -if(mdm_misc&MDM_RTS) - i|=RTSCK; -if(i) - rioctl(IOSM|i); /* set cts checking if hardware flow control */ - -#ifndef __FLAT__ -rioctl(TSTYPE|mswtyp); /* set time-slice API type */ -#endif - -rioctl(CPTON); /* ctrl-p translation */ - -if(addrio) { - lprintf("\r\nAdditional rioctl: %04Xh",addrio); - rioctl(addrio); } - -sys_status|=SS_COMISR; -} - -/****************************************************************************/ -/* Sets the current baud rate to either the current connect rate or the */ -/* DTE rate */ -/****************************************************************************/ -void setrate() -{ - int i; - -if(online==ON_REMOTE && !(mdm_misc&MDM_STAYHIGH)) - dte_rate=cur_rate; -else - dte_rate=com_rate; -lprintf("\r\nSetting DTE rate: %lu baud",dte_rate); -#ifdef __FLAT__ -if((i=setbaud(dte_rate))!=0) { -#else -if((i=setbaud((uint)(dte_rate&0xffffL)))!=0) { -#endif - lprintf(" - Failed! (%d)\r\n",i); - bail(1); } -lputs(crlf); -} diff --git a/src/sbbs2/con_hi.c b/src/sbbs2/con_hi.c deleted file mode 100644 index be01d3b7f3..0000000000 --- a/src/sbbs2/con_hi.c +++ /dev/null @@ -1,796 +0,0 @@ -#line 1 "CON_HI.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -extern char question[128]; - -char *mnestr; - -/****************************************************************************/ -/* Waits for remote or local user to input a CR terminated string. 'length' */ -/* is the maximum number of characters that getstr will allow the user to */ -/* input into the string. 'mode' specifies upper case characters are echoed */ -/* or wordwrap or if in message input (^A sequences allowed). ^W backspaces */ -/* a word, ^X backspaces a line, ^Gs, BSs, TABs are processed, LFs ignored. */ -/* ^N non-destructive BS, ^V center line. Valid keys are echoed. */ -/****************************************************************************/ -int getstr(char *strout, int maxlen, long mode) -{ - int i,l,x,z; /* i=current position, l=length, j=printed chars */ - /* x&z=misc */ - uchar ch,str1[256],str2[256],ins=0,atr; - -console&=~CON_UPARROW; -sys_status&=~SS_ABORT; -if(mode&K_LINE && useron.misc&ANSI && !(mode&K_NOECHO)) { - attr(color[clr_inputline]); - for(i=0;i<maxlen;i++) - outchar(SP); - bprintf("\x1b[%dD",maxlen); } -if(wordwrap[0]) { - strcpy(str1,wordwrap); - wordwrap[0]=0; } -else str1[0]=0; -if(mode&K_EDIT) - strcat(str1,strout); -if(strlen(str1)>maxlen) - str1[maxlen]=0; -atr=curatr; -if(!(mode&K_NOECHO)) { - if(mode&K_AUTODEL && str1[0]) { - i=(color[clr_inputline]&0x77)<<4; - i|=(color[clr_inputline]&0x77)>>4; - attr(i); } - rputs(str1); - if(mode&K_EDIT && !(mode&(K_LINE|K_AUTODEL)) && useron.misc&ANSI) - bputs("\x1b[K"); /* destroy to eol */ } - -i=l=strlen(str1); -if(mode&K_AUTODEL && str1[0] && !(mode&K_NOECHO)) { - ch=getkey(mode|K_GETSTR); - attr(atr); - if(isprint(ch) || ch==0x7f) { - for(i=0;i<l;i++) - bputs("\b \b"); - i=l=0; } - else { - for(i=0;i<l;i++) - outchar(BS); - rputs(str1); - i=l; } - if(ch!=SP && ch!=TAB) - ungetkey(ch); } - -while(!(sys_status&SS_ABORT) && (ch=getkey(mode|K_GETSTR))!=CR && online) { - if(sys_status&SS_ABORT) - break; - if(ch==LF) /* Ctrl-J same as CR */ - break; - if(ch==TAB && !(mode&K_WRAP)) /* TAB same as CR */ - break; - if(!i && mode&K_UPRLWR && (ch==SP || ch==TAB)) - continue; /* ignore beginning white space if upper/lower */ - if(mode&K_E71DETECT && ch==(CR|0x80) && l>1) { - if(strstr(str1,"��")) { - bputs("\r\n\r\nYou must set your terminal to NO PARITY, " - "8 DATA BITS, and 1 STOP BIT (N-8-1).\7\r\n"); - return(0); } } - switch(ch) { - case 1: /* Ctrl-A for ANSI */ - if(!(mode&K_MSG) || useron.rest&FLAG('A') || i>maxlen-3) - break; - if(ins) { - if(l<maxlen) - l++; - for(x=l;x>i;x--) - str1[x]=str1[x-1]; - rprintf("%.*s",l-i,str1+i); - rprintf("\x1b[%dD",l-i); - if(i==maxlen-1) - ins=0; } - outchar(str1[i++]=1); - break; - case 2: /* Ctrl-B Beginning of Line */ - if(useron.misc&ANSI && i && !(mode&K_NOECHO)) { - bprintf("\x1b[%dD",i); - i=0; } - break; - case 4: /* Ctrl-D Delete word right */ - if(i<l) { - x=i; - while(x<l && str1[x]!=SP) { - outchar(SP); - x++; } - while(x<l && str1[x]==SP) { - outchar(SP); - x++; } - bprintf("\x1b[%dD",x-i); /* move cursor back */ - z=i; - while(z<l-(x-i)) { /* move chars in string */ - outchar(str1[z]=str1[z+(x-i)]); - z++; } - while(z<l) { /* write over extra chars */ - outchar(SP); - z++; } - bprintf("\x1b[%dD",z-i); - l-=x-i; } /* l=new length */ - break; - case 5: /* Ctrl-E End of line */ - if(useron.misc&ANSI && i<l) { - bprintf("\x1b[%dC",l-i); /* move cursor to eol */ - i=l; } - break; - case 6: /* Ctrl-F move cursor forewards */ - if(i<l && (useron.misc&ANSI)) { - bputs("\x1b[C"); /* move cursor right one */ - i++; } - break; - case 7: - if(!(mode&K_MSG)) - break; - if(useron.rest&FLAG('B')) { - if (i+6<maxlen) { - if(ins) { - for(x=l+6;x>i;x--) - str1[x]=str1[x-6]; - if(l+5<maxlen) - l+=6; - if(i==maxlen-1) - ins=0; } - str1[i++]='('; - str1[i++]='b'; - str1[i++]='e'; - str1[i++]='e'; - str1[i++]='p'; - str1[i++]=')'; - if(!(mode&K_NOECHO)) - bputs("(beep)"); } - if(ins) - redrwstr(str1,i,l,0); - break; } - if(ins) { - if(l<maxlen) - l++; - for(x=l;x>i;x--) - str1[x]=str1[x-1]; - if(i==maxlen-1) - ins=0; } - if(i<maxlen) { - str1[i++]=7; - if(!(mode&K_NOECHO)) - outchar(7); } - break; - case 14: /* Ctrl-N Next word */ - if(i<l && (useron.misc&ANSI)) { - x=i; - while(str1[i]!=SP && i<l) - i++; - while(str1[i]==SP && i<l) - i++; - bprintf("\x1b[%dC",i-x); } - break; - case 0x1c: /* Ctrl-\ Previous word */ - if(i && (useron.misc&ANSI) && !(mode&K_NOECHO)) { - x=i; - while(str1[i-1]==SP && i) - i--; - while(str1[i-1]!=SP && i) - i--; - bprintf("\x1b[%dD",x-i); } - break; - case 18: /* Ctrl-R Redraw Line */ - if(!(mode&K_NOECHO)) - redrwstr(str1,i,l,0); - break; - case TAB: - if(!(i%TABSIZE)) { - if(ins) { - if(l<maxlen) - l++; - for(x=l;x>i;x--) - str1[x]=str1[x-1]; - if(i==maxlen-1) - ins=0; } - str1[i++]=SP; - if(!(mode&K_NOECHO)) - outchar(SP); } - while(i<maxlen && i%TABSIZE) { - if(ins) { - if(l<maxlen) - l++; - for(x=l;x>i;x--) - str1[x]=str1[x-1]; - if(i==maxlen-1) - ins=0; } - str1[i++]=SP; - if(!(mode&K_NOECHO)) - outchar(SP); } - if(ins && !(mode&K_NOECHO)) - redrwstr(str1,i,l,0); - break; - case BS: - if(!i) - break; - i--; - l--; - if(i!=l) { /* Deleting char in middle of line */ - outchar(BS); - z=i; - while(z<l) { /* move the characters in the line */ - outchar(str1[z]=str1[z+1]); - z++; } - outchar(SP); /* write over the last char */ - bprintf("\x1b[%dD",(l-i)+1); } - else if(!(mode&K_NOECHO)) - bputs("\b \b"); - break; - case 22: /* Ctrl-V Center line */ - str1[l]=0; - l=bstrlen(str1); - if(!l) break; - for(x=0;x<(maxlen-l)/2;x++) - str2[x]=SP; - str2[x]=0; - strcat(str2,str1); - strcpy(strout,str2); - l=strlen(strout); - if(mode&K_NOECHO) - return(l); - if(mode&K_MSG) - redrwstr(strout,i,l,K_MSG); - else { - while(i--) - bputs("\b"); - bputs(strout); - if(mode&K_LINE) - attr(LIGHTGRAY); } - CRLF; - return(l); - case 23: /* Ctrl-W Delete word left */ - if(i<l) { - x=i; /* x=original offset */ - while(i && str1[i-1]==SP) { - outchar(BS); - i--; } - while(i && str1[i-1]!=SP) { - outchar(BS); - i--; } - z=i; /* i=z=new offset */ - while(z<l-(x-i)) { /* move chars in string */ - outchar(str1[z]=str1[z+(x-i)]); - z++; } - while(z<l) { /* write over extra chars */ - outchar(SP); - z++; } - bprintf("\x1b[%dD",z-i); /* back to new x corridnant */ - l-=x-i; } /* l=new length */ - else { - while(i && str1[i-1]==SP) { - i--; - l--; - if(!(mode&K_NOECHO)) - bputs("\b \b"); } - while(i && str1[i-1]!=SP) { - i--; - l--; - if(!(mode&K_NOECHO)) - bputs("\b \b"); } } - break; - case 24: /* Ctrl-X Delete entire line */ - if(mode&K_NOECHO) - l=0; - else { - while(i<l) { - outchar(SP); - i++; } - while(l) { - l--; - bputs("\b \b"); } } - i=0; - break; - case 25: /* Ctrl-Y Delete to end of line */ - if(useron.misc&ANSI && !(mode&K_NOECHO)) { - bputs("\x1b[K"); - l=i; } - break; - case 31: /* Ctrl-Minus Toggles Insert/Overwrite */ - if(!(useron.misc&ANSI) || mode&K_NOECHO) - break; - if(ins) { - ins=0; - redrwstr(str1,i,l,0); } - else if(i<l) { - ins=1; - bprintf("\x1b[s\x1b[%dC",79-lclwx()); /* save pos */ - z=curatr; /* and got to EOL */ - attr(z|BLINK|HIGH); - outchar('�'); - attr(z); - bputs("\x1b[u"); } /* restore pos */ - break; - case 0x1e: /* Ctrl-^ */ - if(!(mode&K_EDIT)) - break; - if(i>l) - l=i; - str1[l]=0; - strcpy(strout,str1); - if((stripattr(strout) || ins) && !(mode&K_NOECHO)) - redrwstr(strout,i,l,K_MSG); - if(mode&K_LINE && !(mode&K_NOECHO)) - attr(LIGHTGRAY); - console|=CON_UPARROW; - return(l); - case 0x1d: /* Ctrl-] Reverse Cursor Movement */ - if(i && (useron.misc&ANSI) && !(mode&K_NOECHO)) { - bputs("\x1b[D"); /* move cursor left one */ - i--; } - break; - case 0x7f: /* Ctrl-BkSpc (DEL) Delete current char */ - if(i==l) - break; - l--; - z=i; - while(z<l) { /* move the characters in the line */ - outchar(str1[z]=str1[z+1]); - z++; } - outchar(SP); /* write over the last char */ - bprintf("\x1b[%dD",(l-i)+1); - break; - default: - if(mode&K_WRAP && i==maxlen && ch>=SP && !ins) { - str1[i]=0; - if(ch==SP && !(mode&K_CHAT)) { /* don't wrap a space */ - strcpy(strout,str1); /* as last char */ - if(stripattr(strout) && !(mode&K_NOECHO)) - redrwstr(strout,i,l,K_MSG); - if(!(mode&K_NOECHO)) - CRLF; - return(i); } - x=i-1; - z=1; - wordwrap[0]=ch; - while(str1[x]!=SP && x) - wordwrap[z++]=str1[x--]; - if(x<(maxlen/2)) { - wordwrap[1]=0; /* only wrap one character */ - strcpy(strout,str1); - if(stripattr(strout) && !(mode&K_NOECHO)) - redrwstr(strout,i,l,K_MSG); - if(!(mode&K_NOECHO)) - CRLF; - return(i); } - wordwrap[z]=0; - if(!(mode&K_NOECHO)) - while(z--) { - bputs("\b \b"); - i--; } - strrev(wordwrap); - str1[x]=0; - strcpy(strout,str1); - if(stripattr(strout) && !(mode&K_NOECHO)) - redrwstr(strout,i,x,mode); - if(!(mode&K_NOECHO)) - CRLF; - return(x); } - if(i<maxlen && ch>=SP) { - if(mode&K_UPRLWR) - if(!i || (i && (str1[i-1]==SP || str1[i-1]=='-' - || str1[i-1]=='.' || str1[i-1]=='_'))) - ch=toupper(ch); - else - ch=tolower(ch); - if(ins) { - if(l<maxlen) /* l<maxlen */ - l++; - for(x=l;x>i;x--) - str1[x]=str1[x-1]; - rprintf("%.*s",l-i,str1+i); - rprintf("\x1b[%dD",l-i); - if(i==maxlen-1) { - bputs(" \b\b"); - ins=0; } } - str1[i++]=ch; - if(!(mode&K_NOECHO)) - outchar(ch); } } - if(i>l) - l=i; - if(mode&K_CHAT && !l) - return(0); } -if(!online) - return(0); -if(i>l) - l=i; -str1[l]=0; -if(!(sys_status&SS_ABORT)) { - strcpy(strout,str1); - if((stripattr(strout) || ins) && !(mode&K_NOECHO)) - redrwstr(strout,i,l,K_MSG); } -else - l=0; -if(mode&K_LINE && !(mode&K_NOECHO)) attr(LIGHTGRAY); -if(!(mode&(K_NOCRLF|K_NOECHO))) { - outchar(CR); - if(!(mode&K_MSG && sys_status&SS_ABORT)) - outchar(LF); - lncntr=0; } -return(l); -} - -/****************************************************************************/ -/* Hot keyed number input routine. */ -/* Returns a valid number between 1 and max, 0 if no number entered, or -1 */ -/* if the user hit 'Q' or ctrl-c */ -/****************************************************************************/ -long getnum(ulong max) -{ - uchar ch,n=0; - long i=0; - -while(online) { - ch=getkey(K_UPPER); - if(ch>0x7f) - continue; - if(ch=='Q') { - outchar('Q'); - if(useron.misc&COLDKEYS) - ch=getkey(K_UPPER); - if(ch==BS) { - bputs("\b \b"); - continue; } - CRLF; - lncntr=0; - return(-1); } - else if(sys_status&SS_ABORT) { - CRLF; - lncntr=0; - return(-1); } - else if(ch==CR) { - CRLF; - lncntr=0; - return(i); } - else if(ch==BS && n) { - bputs("\b \b"); - i/=10; - n--; } - else if(isdigit(ch) && (i*10L)+(ch&0xf)<=max && (ch!='0' || n)) { - i*=10L; - n++; - i+=ch&0xf; - outchar(ch); - if(i*10L>max && !(useron.misc&COLDKEYS)) { - CRLF; - lncntr=0; - return(i); } } } -return(0); -} - -/*****************************************************************************/ -/* Displays or erases [WAIT] message */ -/*****************************************************************************/ -void waitforsysop(char on) -{ - static saveatr; - int i,j; - -if(on) { - saveatr=curatr; - bputs(text[Wait]); - lclatr(LIGHTGRAY); - return; } -j=bstrlen(text[Wait]); -attr(saveatr); -for(i=0;i<j;i++) - bputs("\b \b"); -} - -/****************************************************************************/ -/* Returns 1 if a is a valid ctrl-a code, 0 if it isn't. */ -/****************************************************************************/ -char validattr(char a) -{ - -switch(toupper(a)) { - case '-': /* clear */ - case '_': /* clear */ - case 'B': /* blue fg */ - case 'C': /* cyan fg */ - case 'G': /* green fg */ - case 'H': /* high fg */ - case 'I': /* blink */ - case 'K': /* black fg */ - case 'L': /* cls */ - case 'M': /* magenta fg */ - case 'N': /* normal */ - case 'P': /* pause */ - case 'R': /* red fg */ - case 'W': /* white fg */ - case 'Y': /* yellow fg */ - case '0': /* black bg */ - case '1': /* red bg */ - case '2': /* green bg */ - case '3': /* brown bg */ - case '4': /* blue bg */ - case '5': /* magenta bg */ - case '6': /* cyan bg */ - case '7': /* white bg */ - return(1); } -return(0); -} - -/****************************************************************************/ -/* Strips invalid Ctrl-Ax sequences from str */ -/* Returns number of ^A's in line */ -/****************************************************************************/ -char stripattr(char *strin) -{ - uchar str[256]; - uchar a,c,d,e; - -e=strlen(strin); -for(a=c=d=0;c<e;c++) { - if(strin[c]==1) { - a++; - if(!validattr(strin[c+1])) { - c++; - continue; } } - str[d++]=strin[c]; } -str[d]=0; -strcpy(strin,str); -return(a); -} - -/****************************************************************************/ -/* Redraws str using i as current cursor position and l as length */ -/****************************************************************************/ -void redrwstr(char *strin, int i, int l, char mode) -{ - char str[256],c; - -sprintf(str,"%-*.*s",l,l,strin); -c=i; -while(c--) - outchar(BS); -if(mode&K_MSG) - bputs(str); -else - rputs(str); -if(useron.misc&ANSI) { - bputs("\x1b[K"); - if(i<l) - bprintf("\x1b[%dD",l-i); } -else { - while(c<79) { /* clear to end of line */ - outchar(SP); - c++; } - while(c>l) { /* back space to end of string */ - outchar(BS); - c--; } } -} - -/****************************************************************************/ -/* Outputs a string highlighting characters preceeded by a tilde */ -/****************************************************************************/ -void mnemonics(char *str) -{ - char *ctrl_a_codes; - long l; - -if(!strchr(str,'~')) { - mnestr=str; - bputs(str); - return; } -ctrl_a_codes=strchr(str,1); -if(!ctrl_a_codes) { - if(str[0]=='@' && str[strlen(str)-1]=='@' && !strchr(str,SP)) { - mnestr=str; - bputs(str); - return; } - attr(color[clr_mnelow]); } -l=0L; -while(str[l]) { - if(str[l]=='~' && str[l+1]) { - if(!(useron.misc&ANSI)) - outchar('('); - l++; - if(!ctrl_a_codes) - attr(color[clr_mnehigh]); - outchar(str[l]); - l++; - if(!(useron.misc&ANSI)) - outchar(')'); - if(!ctrl_a_codes) - attr(color[clr_mnelow]); } - else { - if(str[l]==1) { /* ctrl-a */ - ctrl_a(str[++l]); /* skip the ctrl-a */ - l++; } /* skip the attribute code */ - else - outchar(str[l++]); } } -if(!ctrl_a_codes) - attr(color[clr_mnecmd]); -} - -/****************************************************************************/ -/* Prompts user for Y or N (yes or no) and CR is interpreted as a Y */ -/* Returns 1 for Y or 0 for N */ -/* Called from quite a few places */ -/****************************************************************************/ -char yesno(char *str) -{ - char ch; - -strcpy(question,str); -SYNC; -if(useron.misc&WIP) { - strip_ctrl(question); - menu("YESNO"); } -else - bprintf(text[YesNoQuestion],str); -while(online) { - if(sys_status&SS_ABORT) - ch=text[YN][1]; - else - ch=getkey(K_UPPER|K_COLD); - if(ch==text[YN][0] || ch==CR) { - if(bputs(text[Yes])) - CRLF; - lncntr=0; - return(1); } - if(ch==text[YN][1]) { - if(bputs(text[No])) - CRLF; - lncntr=0; - return(0); } } -return(1); -} - -/****************************************************************************/ -/* Prompts user for N or Y (no or yes) and CR is interpreted as a N */ -/* Returns 1 for N or 0 for Y */ -/* Called from quite a few places */ -/****************************************************************************/ -char noyes(char *str) -{ - char ch; - -strcpy(question,str); -SYNC; -if(useron.misc&WIP) { - strip_ctrl(question); - menu("NOYES"); } -else - bprintf(text[NoYesQuestion],str); -while(online) { - if(sys_status&SS_ABORT) - ch=text[YN][1]; - else - ch=getkey(K_UPPER|K_COLD); - if(ch==text[YN][1] || ch==CR) { - if(bputs(text[No])) - CRLF; - lncntr=0; - return(1); } - if(ch==text[YN][0]) { - if(bputs(text[Yes])) - CRLF; - lncntr=0; - return(0); } } -return(1); -} - -/****************************************************************************/ -/* Waits for remote or local user to hit a key that is contained inside str.*/ -/* 'str' should contain uppercase characters only. When a valid key is hit, */ -/* it is echoed (upper case) and is the return value. */ -/* Called from quite a few functions */ -/****************************************************************************/ -long getkeys(char *str, ulong max) -{ - uchar ch,n=0,c; - ulong i=0; - -strupr(str); -while(online) { - ch=getkey(K_UPPER); - if(max && ch>0x7f) /* extended ascii chars are digits to isdigit() */ - continue; - if(sys_status&SS_ABORT) { /* return -1 if Ctrl-C hit */ - attr(LIGHTGRAY); - CRLF; - lncntr=0; - return(-1); } - if(ch && !n && (strchr(str,ch))) { /* return character if in string */ - outchar(ch); - if(useron.misc&COLDKEYS && ch>SP) { - while(online && !(sys_status&SS_ABORT)) { - c=getkey(0); - if(c==CR || c==BS) - break; } - if(sys_status&SS_ABORT) { - CRLF; - return(-1); } - if(c==BS) { - bputs("\b \b"); - continue; } } - attr(LIGHTGRAY); - CRLF; - lncntr=0; - return(ch); } - if(ch==CR && max) { /* return 0 if no number */ - attr(LIGHTGRAY); - CRLF; - lncntr=0; - if(n) - return(i|0x80000000L); /* return number plus high bit */ - return(0); } - if(ch==BS && n) { - bputs("\b \b"); - i/=10; - n--; } - else if(max && isdigit(ch) && (i*10)+(ch&0xf)<=max && (ch!='0' || n)) { - i*=10; - n++; - i+=ch&0xf; - outchar(ch); - if(i*10>max && !(useron.misc&COLDKEYS)) { - attr(LIGHTGRAY); - CRLF; - lncntr=0; - return(i|0x80000000L); } } } -return(-1); -} - -void center(char *str) -{ - int i,j; - -j=bstrlen(str); -for(i=0;i<(80-j)/2;i++) - outchar(SP); -bputs(str); -CRLF; -} - - -int uselect(int add, int n, char *title, char *item, char *ar) -{ - static uint total,num[500]; - char str[128]; - int i,t; - -if(add) { - if(ar && !chk_ar(ar,useron)) - return(0); - if(!total) - bprintf(text[SelectItemHdr],title); - num[total++]=n; - bprintf(text[SelectItemFmt],total,item); - return(0); } - -if(!total) - return(-1); - -for(i=0;i<total;i++) - if(num[i]==n) - break; -if(i==total) - i=0; -sprintf(str,text[SelectItemWhich],i+1); -mnemonics(str); -i=getnum(total); -t=total; -total=0; -if(i<0) - return(-1); -if(!i) { /* User hit ENTER, use default */ - for(i=0;i<t;i++) - if(num[i]==n) - return(num[i]); - if(n<t) - return(num[n]); - return(-1); } -return(num[i-1]); -} diff --git a/src/sbbs2/con_in.c b/src/sbbs2/con_in.c deleted file mode 100644 index 8458335ccd..0000000000 --- a/src/sbbs2/con_in.c +++ /dev/null @@ -1,663 +0,0 @@ -#line 1 "CON_IN.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -#define LAST_STAT_LINE 16 - -#ifdef __WIN32__ - -#include <windows.h> - -uint lkbrd(int mode) -{ - uint c; - -if(mode) - return(kbhit()); -c=getch(); -if(!c) - c=(getch()<<8); -return(c); -} - -int lclaes(void) -{ -return(0); -} - -#elif defined(__OS2__) - -void fixkbdmode(void) -{ - KBDINFO kbd; - -/* Disable Ctrl-C/Ctrl-P processing by OS/2 */ -KbdGetStatus(&kbd,0); -if(kbd.fsMask&KEYBOARD_ASCII_MODE) { - kbd.fsMask|=KEYBOARD_BINARY_MODE; - kbd.fsMask&=~KEYBOARD_ASCII_MODE; - KbdSetStatus(&kbd,0); } -} - -uint lkbrd(int leave) -{ - KBDKEYINFO key; - -if(leave) - KbdPeek(&key,0); -else - KbdCharIn(&key,IO_NOWAIT,0); -if(!(key.fbStatus&KBDTRF_FINAL_CHAR_IN)) - return(0); -if(!(key.fbStatus&0x02) || key.chScan==0xE0) - return(key.chChar); -return(key.chScan<<8); -} - -#endif - -/****************************************************************************/ -/* Returns character if a key has been hit locally or remotely and responds */ -/* to local ctrl/function keys. Does not print character. */ -/* Called from functions getkey, msgabort and main_sec */ -/****************************************************************************/ -char inkey(int mode) -{ - static inside; - uchar str[512],*scrnbuf,x,y,c,atr,*gurubuf,ch=0,*helpbuf; - int file,con=console; - uint i,j; - long l,length; - -if(!(node_misc&NM_NO_LKBRD) && (lkbrd(1) || sys_status&SS_FINPUT)) { - if(sys_status&SS_FINPUT) { - if(lkbrd(1)==0xff00) { - close(inputfile); - sys_status^=SS_FINPUT; - return(0); } - if(read(inputfile,&c,1)!=1) { - close(inputfile); - sys_status^=SS_FINPUT; - return(0); } - if(c) /* Regular character */ - i=c; - else { /* Scan code */ - if(read(inputfile,&c,1)!=1) { - close(inputfile); - sys_status^=SS_FINPUT; - return(0); } - i=c<<8; } } - else - i=lkbrd(0); - if(sys_status&SS_LCHAT && curatr!=color[clr_chatlocal]) - attr(color[clr_chatlocal]); - if(i&0xff) - ch=i&0xff; - else { /* Alt or Function key hit */ - i>>=8; - /* F1 - F10 Shift-F1 - Alt-F10 F11 - Alt-F12 */ - if((i>=0x3b &&i<=0x44) || (i>=0x54 &&i<=0x71) || (i>=0x85 &&i<=0x8c)) { - if(sys_status&SS_FINPUT) - return(0); /* MACROS */ - sprintf(str,"%s%sF%d.MAC",text_dir - ,i<0x45 || (i>=0x85 && i<=0x86) ? nulstr - :i<0x5e || (i>=0x87 && i<=0x88) ? "SHFT-" - :i<0x68 || (i>=0x89 && i<=0x8a) ? "CTRL-" : "ALT-" - ,i<0x45 ? i-0x3a : i<0x5e ? i-0x53 : i<0x68 ? i-0x5d - :i<0x72 ? i-0x67 : i<0x87 ? i-0x7a : i<0x89 ? i-0x7c - :i<0x8b ? i-0x7e : i-0x80); - if((inputfile=nopen(str,O_RDONLY))!=-1) - sys_status|=SS_FINPUT; - return(0); } - if(i>=0x78 && i<=0x81) { /* Alt-# Quick Validation */ - if(!(sys_status&SS_USERON) /* can't quick-validate if not */ - || !useron.number - || !(sys_misc&SM_QVALKEYS)) { /* or not valid user number */ - beep(100,500); /* online yet */ - nosound(); - return(0); } - if((node_misc&NM_SYSPW || SYSOP) && !chksyspass(1)) - return(0); - beep(1000,100); - beep(1500,100); - nosound(); - if(i==0x81) - i=0; - else - i-=0x77; - useron.level=val_level[i]; - useron.flags1=val_flags1[i]; - useron.flags2=val_flags2[i]; - useron.flags3=val_flags3[i]; - useron.flags4=val_flags4[i]; - useron.exempt=val_exempt[i]; - useron.rest=val_rest[i]; - now=time(NULL); - if(useron.expire<now && val_expire[i]) - useron.expire=now+((long)val_expire[i]*24L*60L*60L); - else - useron.expire+=((long)val_expire[i]*24L*60L*60L); - putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,str,10)); - putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,str,16)); - putuserrec(useron.number,U_FLAGS2,8,ultoa(useron.flags2,str,16)); - putuserrec(useron.number,U_FLAGS3,8,ultoa(useron.flags3,str,16)); - putuserrec(useron.number,U_FLAGS4,8,ultoa(useron.flags4,str,16)); - putuserrec(useron.number,U_EXEMPT,8 - ,ultoa(useron.exempt,str,16)); - putuserrec(useron.number,U_REST,8 - ,ultoa(useron.rest,str,16)); - putuserrec(useron.number,U_EXPIRE,8 - ,ultoa(useron.expire,str,16)); - useron.cdt=adjustuserrec(useron.number,U_CDT,10,val_cdt[i]); - statusline(); - return(0); } - switch(i) { - case 0x16: /* Alt-U - Runs Uedit local only with user online */ - sprintf(str,"%.*s",lbuflen,lbuf); - waitforsysop(1); - if((scrnbuf=MALLOC((node_scrnlen*80L)*2L))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,(node_scrnlen*80L)*2L); - return(CR); } - gettext(1,1,80,node_scrnlen-1,scrnbuf); - x=lclwx(); - y=lclwy(); - console&=~(CON_R_ECHO|CON_R_INPUT); - i=(sys_status&SS_TMPSYSOP); - if(!SYSOP) sys_status|=SS_TMPSYSOP; - useredit(0,1); - if(!i) sys_status&=~SS_TMPSYSOP; - lputc(FF); - puttext(1,1,80,node_scrnlen-1,scrnbuf); - FREE(scrnbuf); - lclxy(x,y); - statusline(); - if(online==ON_REMOTE) - rioctl(IOFI); /* flush input buffer */ - console=con; - waitforsysop(0); - strcpy(lbuf,str); - lbuflen=strlen(lbuf); - return(0); - case 0x1f: /* Alt-S - Toggles Spinning Cursor */ - useron.misc^=SPIN; - return(0); - case 0x12: /* Alt-E - Toggle Remote echo and input */ - if(online!=ON_REMOTE) return(0); - if(console&CON_R_ECHO) { - beep(500,50); - beep(1000,50); - nosound(); - waitforsysop(1); - console&=~(CON_R_ECHO|CON_R_INPUT); - j=bstrlen(text[Wait]); - for(i=0;i<j;i++) - bputs("\b \b"); } - else { - beep(1000,50); - beep(500,50); - nosound(); - j=bstrlen(text[Wait]); - for(i=0;i<j;i++) - outchar(SP); - console|=(CON_R_ECHO|CON_R_INPUT); - rioctl(IOFI); /* flush input buffer */ - waitforsysop(0); } - return(0); - case 0x10: /* Alt-Q - Toggles remote input */ - if(online!=ON_REMOTE) - return(0); - console^=CON_R_INPUT; - if(console&CON_R_INPUT) { - beep(1000,50); - beep(500,50); - nosound(); - rioctl(IOSM|PAUSE|ABORT); } - else { - beep(500,50); - beep(1000,50); - nosound(); - rioctl(IOCM|PAUSE|ABORT); } - rioctl(IOFI); /* flush input buffer */ - return(0); - case 0x19: /* Alt-P - Turns off sysop page */ - nosound(); - sys_status&=~SS_SYSPAGE; - return(0); - case 0x23: /* Alt-H - Hangs up on user */ - hangup(); - return(0); - case 0x1e: /* Alt-A - Alert Sysop when User's done */ - sys_status^=SS_SYSALERT; - statusline(); - return(0); - case 0x82: /* Alt-- - Sub Time (5 min) */ - starttime-=300; - return(0); - case 0x83: /* Alt-+ - Add time (5 min)*/ - starttime+=300; - return(0); - case 0x14: /* Alt-T - Temp SysOp */ - if(!(sys_status&SS_TMPSYSOP) && node_misc&NM_SYSPW - && !chksyspass(1)) - return(0); - if(sys_misc&SM_L_SYSOP) - sys_status^=SS_TMPSYSOP; - statusline(); - return(0); - case 0x2c: /* Alt-Z - Menu of local keys */ - if((scrnbuf=MALLOC((node_scrnlen*80L)*2L))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,(node_scrnlen*80L)*2L); - return(CR); } - gettext(1,1,80,node_scrnlen,scrnbuf); - sprintf(str,"%sSBBSHELP.DAB",exec_dir); - if((file=nopen(str,O_RDONLY))==-1) - lputs("\7Can't open SBBSHELP"); - else { - length=filelength(file); - if((helpbuf=MALLOC(length))==NULL) - lputs("\7Can't allocate for SBBSHELP"); - else { - read(file,helpbuf,length); - close(file); - puttext(13,1,66,24,helpbuf); - FREE(helpbuf); } } - while(!lkbrd(1)) mswait(1); - if(lkbrd(1)==0x2c00) /* suck up the alt-z */ - lkbrd(0); - puttext(1,1,80,node_scrnlen,scrnbuf); - FREE(scrnbuf); - return(0); - case 0x2e: /* Alt-C - Sysop Chat */ - if(sys_status&SS_LCHAT) { - sys_status^=SS_LCHAT; - return(CR); } - else { - sys_status|=SS_LCHAT; - SAVELINE; - localchat(); - return(0); } - case 0x2d: /* Alt-X exit after logoff */ - getnodedat(node_num,&thisnode,1); - thisnode.misc^=NODE_DOWN; - putnodedat(node_num,thisnode); - statusline(); - return(0); - case 0x47: /* Home - Same as Ctrl-B */ - return(2); /* ctrl-b beginning of line */ - case 0x8d: /* Ctrl-Up Arrow - decrement statusline */ - if(statline) { - statline--; - statusline(); } - return(0); - case 0x77: /* Ctrl-Home up - top of status line info */ - statline=1; - statusline(); - return(0); - case 0x4b: /* Left Arrow - same as ctrl-] */ - return(0x1d); - case 0x4d: /* Right Arrow - same as ctrl-f */ - return(6); - case 0x48: /* Up arrow - same as ctrl-^ */ - return(0x1e); - case 0x50: /* Down arrow - same as Ctrl-J */ - return(LF); - case 0x4f: /* End - same as Ctrl-E */ - return(5); /* ctrl-e - end of line */ - case 0x91: /* Ctrl-Dn Arrow - increment statusline */ - if(statline<LAST_STAT_LINE) { - statline++; - statusline(); } - return(0); - case 0x75: /* Ctrl-End - end of status line info */ - statline=LAST_STAT_LINE; - statusline(); - return(0); - case 0x52: /* Insert */ - return(0x1f); /* ctrl-minus - insert mode */ - case 0x53: /* Delete */ - return(0x7f); /* ctrl-bkspc - del cur char */ - case 0x26: /* Alt-L - Capture to cap_fname */ - if(lclaes()) - return(0); - if(sys_status&SS_CAP) { - sys_status^=SS_CAP; - fclose(capfile); -#ifdef __MSDOS__ - freedosmem=farcoreleft(); /* fclose frees memory */ -#endif - statusline(); - return(0); } - x=lclwx(); - y=lclwy(); - atr=lclatr(LIGHTGRAY<<4); - STATUSLINE; - lclxy(1,node_scrnlen); - lputs(" Filename: "); - lputc(CLREOL); - console&=~(CON_R_INPUT|CON_R_ECHO); - getstr(cap_fname,40,K_UPPER|K_EDIT); - TEXTWINDOW; - lclxy(x,y); - lclatr(atr); - console=con; - if(cap_fname[0] && - (capfile=fopen(cap_fname,"a"))==NULL) - bprintf("Couldn't open %s.\r\n",cap_fname); - else if(cap_fname[0]) { -#ifdef __MSDOS__ - freedosmem=farcoreleft(); /* fnopen allocates memory */ -#endif - sys_status|=SS_CAP; } - statusline(); - return(0); - case 0x17: /* Alt-I - Interrupt node now */ - getnodedat(node_num,&thisnode,1); - thisnode.misc^=NODE_INTR; - putnodedat(node_num,thisnode); - return(0); - case 0x13: /* Alt-R - Rerun node when caller hangs up */ - getnodedat(node_num,&thisnode,1); - thisnode.misc^=NODE_RRUN; - putnodedat(node_num,thisnode); - statusline(); - return(0); - case 0x31: /* Alt-N - Lock this node */ - getnodedat(node_num,&thisnode,1); - thisnode.misc^=NODE_LOCK; - putnodedat(node_num,thisnode); - statusline(); - return(0); - case 0x22: /* Alt-G - Guru Chat */ - if(sys_status&SS_GURUCHAT) { - sys_status&=~SS_GURUCHAT; - return(CR); } - if(!total_gurus) - break; - for(i=0;i<total_gurus;i++) - if(chk_ar(guru[i]->ar,useron)) - break; - if(i>=total_gurus) - i=0; - sprintf(str,"%s%s.DAT",ctrl_dir,guru[i]->code); - if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return(0); } - if((gurubuf=MALLOC(filelength(file)+1L))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,filelength(file)+1L); - return(0); } - read(file,gurubuf,filelength(file)); - gurubuf[filelength(file)]=0; - close(file); - localguru(gurubuf,i); - FREE(gurubuf); - return(CR); - case 0x20: /* Alt-D - Shell to DOS */ - sprintf(str,"%.*s",lbuflen,lbuf); - waitforsysop(1); - if((scrnbuf=MALLOC((node_scrnlen*80L)*2L))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,(node_scrnlen*80L)*2L); - return(CR); } - gettext(1,1,80,node_scrnlen,scrnbuf); - lclatr(LIGHTGRAY); - x=lclwx(); - y=lclwy(); - lclini(node_scrnlen); - lputc(FF); - if(!(node_misc&NM_SYSPW) || chksyspass(1)) - external(comspec,0); - lclini(node_scrnlen-1); - puttext(1,1,80,node_scrnlen,scrnbuf); - FREE(scrnbuf); - lclxy(x,y); - if(online==ON_REMOTE) - rioctl(IOFI); /* flush input buffer */ - waitforsysop(0); - strcpy(lbuf,str); - lbuflen=strlen(lbuf); - timeout=time(NULL); - return(0); - case 0x49: /* PgUp - local ASCII upload */ - if(sys_status&SS_FINPUT || lclaes() || inside) - return(0); - inside=1; - x=lclwx(); - y=lclwy(); - atr=lclatr(LIGHTGRAY<<4); - STATUSLINE; - lclxy(1,node_scrnlen); - lputs(" Filename: "); - lputc(CLREOL); - console&=~(CON_R_INPUT|CON_R_ECHO); - getstr(str,60,K_UPPER); - if(str[0] && (inputfile=nopen(str,O_RDONLY))!=-1) - sys_status|=SS_FINPUT; - statusline(); - lclxy(x,y); - lclatr(atr); - console=con; - inside=0; - return(0); - case 0xff: /* ctrl-break - bail immediately */ - lputs("\r\nTerminate BBS (y/N) ? "); - while((i=lkbrd(0))==0); - if(toupper(i&0xff)=='Y') { /* Ctrl-brk yes/no */ - lputs("Yes\r\n"); - bail(0); } - lputs("No\r\n"); - sys_status|=SS_ABORT; - return(0); } - return(0); } } - -if(!ch && console&CON_R_INPUT && rioctl(RXBC)) { - if(sys_status&SS_LCHAT && curatr!=color[clr_chatremote]) - attr(color[clr_chatremote]); - ch=incom(); - if(node_misc&NM_7BITONLY - && (!(sys_status&SS_USERON) || useron.misc&NO_EXASCII)) - ch&=0x7f; } -if(ch) - timeout=time(NULL); -if(ch==3) { /* Ctrl-C Abort */ - sys_status|=SS_ABORT; - if(mode&K_SPIN) /* back space once if on spinning cursor */ - bputs("\b \b"); - return(0); } -if(ch==26 && action!=NODE_PCHT) { /* Ctrl-Z toggle raw input mode */ - if(mode&K_SPIN) - bputs("\b "); - SAVELINE; - attr(LIGHTGRAY); - CRLF; - bputs(text[RawMsgInputModeIsNow]); - if(console&CON_RAW_IN) - bputs(text[OFF]); - else - bputs(text[ON]); - console^=CON_RAW_IN; - CRLF; - CRLF; - RESTORELINE; - lncntr=0; - if(action!=NODE_MAIN && action!=NODE_XFER) - return(26); - return(0); } -if(console&CON_RAW_IN) { /* ignore ctrl-key commands if in raw mode */ - if(!ch && (!(mode&K_GETSTR) || mode&K_LOWPRIO || node_misc&NM_LOWPRIO)) - mswait(0); - return(ch); -} -if(ch<SP) { /* Control chars */ - if(ch==LF) /* ignore LF's in not in raw mode */ - return(0); - if(ch==15) { /* Ctrl-O toggles pause temporarily */ - useron.misc^=UPAUSE; - return(0); } - if(ch==0x10) { /* Ctrl-P Private node-node comm */ - if(!(sys_status&SS_USERON)) - return(0); /* keep from being recursive */ - if(mode&K_SPIN) - bputs("\b "); - if(sys_status&SS_SPLITP) { - if((scrnbuf=MALLOC((24L*80L)*2L))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,(24L*80L)*2L); - return(CR); } - gettext(1,1,80,24,scrnbuf); - x=lclwx(); - y=lclwy(); - CLS; } - else { - SAVELINE; - attr(LIGHTGRAY); - CRLF; } - nodesync(); /* read any waiting messages */ - nodemsg(); /* send a message */ - SYNC; - if(sys_status&SS_SPLITP) { - lncntr=0; - CLS; - for(i=0;i<((24*80)-1)*2;i+=2) { - if(scrnbuf[i+1]!=curatr) - attr(scrnbuf[i+1]); - outchar(scrnbuf[i]); } - FREE(scrnbuf); - GOTOXY(x,y); } - else { - CRLF; - RESTORELINE; } - lncntr=0; - return(0); } - - if(ch==21) { /* Ctrl-U Users online */ - if(!(sys_status&SS_USERON)) - return(0); - if(mode&K_SPIN) - bputs("\b "); - if(sys_status&SS_SPLITP) { - if((scrnbuf=MALLOC((24L*80L)*2L))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,(24L*80L)*2L); - return(CR); } - gettext(1,1,80,24,scrnbuf); - x=lclwx(); - y=lclwy(); - CLS; } - else { - SAVELINE; - attr(LIGHTGRAY); - CRLF; } - whos_online(1); /* list users */ - ASYNC; - if(sys_status&SS_SPLITP) { - CRLF; - nodesync(); - pause(); - CLS; - for(i=0;i<((24*80)-1)*2;i+=2) { - if(scrnbuf[i+1]!=curatr) - attr(scrnbuf[i+1]); - outchar(scrnbuf[i]); } - FREE(scrnbuf); - GOTOXY(x,y); } - else { - CRLF; - RESTORELINE; } - lncntr=0; - return(0); } - if(ch==20 && !(sys_status&SS_SPLITP)) { /* Ctrl-T Time information */ - if(!(sys_status&SS_USERON)) - return(0); - if(mode&K_SPIN) - bputs("\b "); - SAVELINE; - attr(LIGHTGRAY); - now=time(NULL); - bprintf(text[TiLogon],timestr(&logontime)); - bprintf(text[TiNow],timestr(&now)); - bprintf(text[TiTimeon] - ,sectostr(now-logontime,tmp)); - bprintf(text[TiTimeLeft] - ,sectostr(timeleft,tmp)); - SYNC; - RESTORELINE; - lncntr=0; - return(0); } - if(ch==11 && !(sys_status&SS_SPLITP)) { /* Ctrl-k Control key menu */ - if(!(sys_status&SS_USERON)) - return(0); - if(mode&K_SPIN) - bputs("\b "); - SAVELINE; - attr(LIGHTGRAY); - lncntr=0; - bputs(text[ControlKeyMenu]); - ASYNC; - RESTORELINE; - lncntr=0; - return(0); } - - if(ch==ESC && console&CON_R_INPUT) { - for(i=0;i<20 && !rioctl(RXBC);i++) - mswait(1); - if(i==20) - return(ESC); - ch=incom(); - if(ch!='[') { - ungetkey(ESC); - ungetkey(ch); - return(0); } - i=j=0; - autoterm|=ANSI; /* <ESC>[x means they have ANSI */ - if(!(useron.misc&ANSI) && useron.misc&AUTOTERM && sys_status&SS_USERON - && useron.number) { - useron.misc|=ANSI; - putuserrec(useron.number,U_MISC,8,ultoa(useron.misc,str,16)); } - while(i<10 && j<30) { /* up to 3 seconds */ - if(rioctl(RXBC)) { - ch=incom(); - if(ch!=';' && !isdigit(ch) && ch!='R') { /* other ANSI */ - switch(ch) { - case 'A': - return(0x1e); /* ctrl-^ (up arrow) */ - case 'B': - return(LF); /* ctrl-j (dn arrow) */ - case 'C': - return(0x6); /* ctrl-f (rt arrow) */ - case 'D': - return(0x1d); /* ctrl-] (lf arrow) */ - case 'H': - return(0x2); /* ctrl-b (beg line) */ - case 'K': - return(0x5); /* ctrl-e (end line) */ - } - ungetkey(ESC); - ungetkey('['); - for(j=0;j<i;j++) - ungetkey(str[j]); - ungetkey(ch); - return(0); } - if(ch=='R') { /* cursor position report */ - if(i && !(useron.rows)) { /* auto-detect rows */ - str[i]=0; - rows=atoi(str); - if(rows<5 || rows>99) rows=24; } - return(0); } - str[i++]=ch; } - else { - mswait(100); - j++; } } - - ungetkey(ESC); /* should only get here if time-out */ - ungetkey('['); - for(j=0;j<i;j++) - ungetkey(str[j]); - return(0); } - - } /* end of control chars */ - -if(!ch && (!(mode&K_GETSTR) || mode&K_LOWPRIO || node_misc&NM_LOWPRIO)) - mswait(0); -return(ch); -} - diff --git a/src/sbbs2/con_mid.c b/src/sbbs2/con_mid.c deleted file mode 100644 index 1925c4d173..0000000000 --- a/src/sbbs2/con_mid.c +++ /dev/null @@ -1,813 +0,0 @@ -#line 1 "CON_MID.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -extern char *wday[]; /* 3 char days of week */ - -/****************************************************************************/ -/* Waits for remote or local user to hit a key. Inactivity timer is checked */ -/* and hangs up if inactive for 4 minutes. Returns key hit, or uppercase of */ -/* key hit if mode&K_UPPER or key out of KEY BUFFER. Does not print key. */ -/* Called from functions all over the place. */ -/****************************************************************************/ -char getkey(long mode) -{ - char ch,coldkey,c=0,spin=random(5); - -if(!online) - return(0); -sys_status&=~SS_ABORT; -if((sys_status&SS_USERON || action==NODE_DFLT) && !(mode&K_GETSTR)) - mode|=(useron.misc&SPIN); -lncntr=0; -timeout=time(NULL); -if(mode&K_SPIN) - outchar(' '); -do { - checkline(); /* check to make sure remote user is still online */ - if(online==ON_REMOTE && console&CON_R_INPUT && rioctl(IOSTATE)&ABORT) { - rioctl(IOCS|ABORT); - sys_status|=SS_ABORT; - if(mode&K_SPIN) /* back space once if on spinning cursor */ - bputs("\b \b"); - return(0); } - if(sys_status&SS_SYSPAGE) - beep(random(800),100); - if(mode&K_SPIN) - switch(spin) { - case 0: - switch(c++) { - case 0: - outchar(BS); - outchar('�'); - break; - case 10: - outchar(BS); - outchar('/'); - break; - case 20: - outchar(BS); - outchar('�'); - break; - case 30: - outchar(BS); - outchar('\\'); - break; - case 40: - c=0; - break; - default: - if(!inDV && !(node_misc&NM_WINOS2)) - mswait(DELAY_SPIN); - break; } - break; - case 1: - switch(c++) { - case 0: - outchar(BS); - outchar('�'); - break; - case 10: - outchar(BS); - outchar('�'); - break; - case 20: - outchar(BS); - outchar('�'); - break; - case 30: - outchar(BS); - outchar('�'); - break; - case 40: - outchar(BS); - outchar('�'); - break; - case 50: - outchar(BS); - outchar('�'); - break; - case 60: - c=0; - break; - default: - if(!inDV && !(node_misc&NM_WINOS2)) - mswait(DELAY_SPIN); - break; } - break; - case 2: - switch(c++) { - case 0: - outchar(BS); - outchar('-'); - break; - case 10: - outchar(BS); - outchar('='); - break; - case 20: - outchar(BS); - outchar('�'); - break; - case 30: - outchar(BS); - outchar('='); - break; - case 40: - c=0; - break; - default: - if(!inDV && !(node_misc&NM_WINOS2)) - mswait(DELAY_SPIN); - break; } - break; - case 3: - switch(c++) { - case 0: - outchar(BS); - outchar('�'); - break; - case 10: - outchar(BS); - outchar('�'); - break; - case 20: - outchar(BS); - outchar('�'); - break; - case 30: - outchar(BS); - outchar('�'); - break; - case 40: - c=0; - break; - default: - if(!inDV && !(node_misc&NM_WINOS2)) - mswait(DELAY_SPIN); - break; } - break; - case 4: - switch(c++) { - case 0: - outchar(BS); - outchar('�'); - break; - case 10: - outchar(BS); - outchar('�'); - break; - case 20: - outchar(BS); - outchar('�'); - break; - case 30: - outchar(BS); - outchar('�'); - break; - case 40: - c=0; - break; - default: - if(!inDV && !(node_misc&NM_WINOS2)) - mswait(DELAY_SPIN); - break; } - break; } - if(keybuftop!=keybufbot) { - ch=keybuf[keybufbot++]; - if(keybufbot==KEY_BUFSIZE) - keybufbot=0; } - else - ch=inkey(mode); - if(sys_status&SS_ABORT) - return(0); - now=time(NULL); - if(ch) { - if(mode&K_NUMBER && isprint(ch) && !isdigit(ch)) - continue; - if(mode&K_ALPHA && isprint(ch) && !isalpha(ch)) - continue; - if(mode&K_NOEXASC && ch&0x80) - continue; - if(mode&K_SPIN) - bputs("\b \b"); - if(mode&K_COLD && ch>SP && useron.misc&COLDKEYS) { - if(mode&K_UPPER) - outchar(toupper(ch)); - else - outchar(ch); - while((coldkey=inkey(mode))==0 && online && !(sys_status&SS_ABORT)) - checkline(); - bputs("\b \b"); - if(coldkey==BS) - continue; - if(coldkey>SP) - ungetkey(coldkey); } - if(mode&K_UPPER) - return(toupper(ch)); - return(ch); } - if(sys_status&SS_USERON && !(sys_status&SS_LCHAT)) gettimeleft(); - else if(online && - ((node_dollars_per_call && now-answertime>SEC_BILLING) - || (now-answertime>SEC_LOGON && !(sys_status&SS_LCHAT)))) { - console&=~(CON_R_ECHOX|CON_L_ECHOX); - console|=(CON_R_ECHO|CON_L_ECHO); - bputs(text[TakenTooLongToLogon]); - hangup(); } - if(sys_status&SS_USERON && online && (timeleft/60)<(5-timeleft_warn) - && !SYSOP && !(sys_status&SS_LCHAT)) { - timeleft_warn=5-(timeleft/60); - SAVELINE; - attr(LIGHTGRAY); - bprintf(text[OnlyXminutesLeft] - ,((ushort)timeleft/60)+1,(timeleft/60) ? "s" : nulstr); - RESTORELINE; } - - if(online==ON_LOCAL && node_misc&NM_NO_INACT) - timeout=now; - if(now-timeout>=sec_warn) { /* warning */ - if(sys_status&SS_USERON) { - SAVELINE; - bputs(text[AreYouThere]); } - else - bputs("\7\7"); - while(!inkey(0) && online && now-timeout>=sec_warn) { - now=time(NULL); - if(now-timeout>=sec_hangup) { - if(online==ON_REMOTE) { - console|=CON_R_ECHO; - console&=~CON_R_ECHOX; } - bputs(text[CallBackWhenYoureThere]); - logline(nulstr,"Inactive"); - hangup(); - return(0); } - mswait(100); } - if(sys_status&SS_USERON) { - bputs("\r\1n\1>"); - RESTORELINE; } - timeout=now; } - - } while(online); -return(0); -} - -/****************************************************************************/ -/* This function lists users that are online. */ -/* If listself is true, it will list the current node. */ -/* Returns number of active nodes (not including current node). */ -/****************************************************************************/ -int whos_online(char listself) -{ - int i,j; - node_t node; - -CRLF; -bputs(text[NodeLstHdr]); -for(j=0,i=1;i<=sys_nodes && i<=sys_lastnode;i++) { - getnodedat(i,&node,0); - if(i==node_num) { - if(listself) - printnodedat(i,node); - continue; } - if(node.status==NODE_INUSE || (SYSOP && node.status==NODE_QUIET)) { - printnodedat(i,node); - if(!lastnodemsg) - lastnodemsg=i; - j++; } } -if(!j) - bputs(text[NoOtherActiveNodes]); -return(j); -} - -/****************************************************************************/ -/* Displays the information for node number 'number' contained in 'node' */ -/****************************************************************************/ -void printnodedat(uint number, node_t node) -{ - uint i; - char hour,mer[3]; - -attr(color[clr_nodenum]); -bprintf("%3d ",number); -attr(color[clr_nodestatus]); -switch(node.status) { - case NODE_WFC: - bputs("Waiting for call"); - break; - case NODE_OFFLINE: - bputs("Offline"); - break; - case NODE_NETTING: - bputs("Networking"); - break; - case NODE_LOGON: - bputs("At logon prompt"); - break; - case NODE_EVENT_WAITING: - bputs("Waiting for all nodes to become inactive"); - break; - case NODE_EVENT_LIMBO: - bprintf("Waiting for node %d to finish external event",node.aux); - break; - case NODE_EVENT_RUNNING: - bputs("Running external event"); - break; - case NODE_NEWUSER: - attr(color[clr_nodeuser]); - bputs("New user"); - attr(color[clr_nodestatus]); - bputs(" applying for access "); - if(!node.connection) - bputs("Locally"); - else - bprintf("at %ubps",node.connection); - break; - case NODE_QUIET: - if(!SYSOP) { - bputs("Waiting for call"); - break; } - case NODE_INUSE: - if(node.misc&NODE_EXT) { - getnodeext(number,tmp); - bputs(tmp); - break; } - attr(color[clr_nodeuser]); - if(node.misc&NODE_ANON && !SYSOP) - bputs("UNKNOWN USER"); - else - bputs(username(node.useron,tmp)); - attr(color[clr_nodestatus]); - bputs(" "); - switch(node.action) { - case NODE_MAIN: - bputs("at main menu"); - break; - case NODE_RMSG: - bputs("reading messages"); - break; - case NODE_RMAL: - bputs("reading mail"); - break; - case NODE_RSML: - bputs("reading sent mail"); - break; - case NODE_RTXT: - bputs("reading text files"); - break; - case NODE_PMSG: - bputs("posting message"); - break; - case NODE_SMAL: - bputs("sending mail"); - break; - case NODE_AMSG: - bputs("posting auto-message"); - break; - case NODE_XTRN: - if(!node.aux) - bputs("at external program menu"); - else { - bputs("running "); - i=node.aux-1; - if(SYSOP || chk_ar(xtrn[i]->ar,useron)) - bputs(xtrn[node.aux-1]->name); - else - bputs("external program"); } - break; - case NODE_DFLT: - bputs("changing defaults"); - break; - case NODE_XFER: - bputs("at transfer menu"); - break; - case NODE_RFSD: - bprintf("retrieving from device #%d",node.aux); - break; - case NODE_DLNG: - bprintf("downloading"); - break; - case NODE_ULNG: - bputs("uploading"); - break; - case NODE_BXFR: - bputs("transferring bidirectional"); - break; - case NODE_LFIL: - bputs("listing files"); - break; - case NODE_LOGN: - bputs("logging on"); - break; - case NODE_LCHT: - bprintf("in local chat with %s",sys_op); - break; - case NODE_MCHT: - if(node.aux) { - bprintf("in multinode chat channel %d",node.aux&0xff); - if(node.aux&0x1f00) { /* password */ - outchar('*'); - if(SYSOP) - bprintf(" %s",unpackchatpass(tmp,node)); } } - else - bputs("in multinode global chat channel"); - break; - case NODE_PAGE: - bprintf("paging node %u for private chat",node.aux); - break; - case NODE_PCHT: - bprintf("in private chat with node %u",node.aux); - break; - case NODE_GCHT: - i=node.aux; - if(i>=total_gurus) - i=0; - bprintf("chatting with %s",guru[i]->name); - break; - case NODE_CHAT: - bputs("in chat section"); - break; - case NODE_TQWK: - bputs("transferring QWK packet"); - break; - case NODE_SYSP: - bputs("performing sysop activities"); - break; - default: - bputs(itoa(node.action,tmp,10)); - break; } - if(!node.connection) - bputs(" locally"); - else - bprintf(" at %ubps",node.connection); - if(node.action==NODE_DLNG) { - if(sys_misc&SM_MILITARY) { - hour=node.aux/60; - mer[0]=0; } - else if((node.aux/60)>=12) { - if(node.aux/60==12) - hour=12; - else - hour=(node.aux/60)-12; - strcpy(mer,"pm"); } - else { - if((node.aux/60)==0) /* 12 midnite */ - hour=12; - else hour=node.aux/60; - strcpy(mer,"am"); } - bprintf(" ETA %02d:%02d %s" - ,hour,node.aux%60,mer); } - break; } -i=NODE_LOCK; -if(node.status==NODE_INUSE || SYSOP) - i|=NODE_POFF|NODE_AOFF|NODE_MSGW|NODE_NMSG; -if(node.misc&i) { - bputs(" ("); - if(node.misc&(i&NODE_AOFF)) - outchar('A'); - if(node.misc&NODE_LOCK) - outchar('L'); - if(node.misc&(i&(NODE_MSGW|NODE_NMSG))) - outchar('M'); - if(node.misc&(i&NODE_POFF)) - outchar('P'); - outchar(')'); } -if(SYSOP && ((node.misc - &(NODE_ANON|NODE_UDAT|NODE_INTR|NODE_RRUN|NODE_EVENT|NODE_DOWN)) - || node.status==NODE_QUIET)) { - bputs(" ["); - if(node.misc&NODE_ANON) - outchar('A'); - if(node.misc&NODE_INTR) - outchar('I'); - if(node.misc&NODE_RRUN) - outchar('R'); - if(node.misc&NODE_UDAT) - outchar('U'); - if(node.status==NODE_QUIET) - outchar('Q'); - if(node.misc&NODE_EVENT) - outchar('E'); - if(node.misc&NODE_DOWN) - outchar('D'); - outchar(']'); } -if(node.errors && SYSOP) { - attr(color[clr_err]); - bprintf(" %d error%c",node.errors, node.errors>1 ? 's' : '\0' ); } -attr(LIGHTGRAY); -CRLF; -} - -/****************************************************************************/ -/* Prints/updates the local status line (line #25) with the user/system */ -/* information. Which info depends on value of statline. */ -/* Called from several functions */ -/****************************************************************************/ -void statusline() -{ - int row,col,atr; - char tmp1[128],tmp2[256],tmp3[256],age; - -#ifndef __OS2__ -if(lclaes()) - return; -#endif -col=lclwx(); -row=lclwy(); -STATUSLINE; -lclxy(1,node_scrnlen); -age=getage(useron.birth); -if(sys_status&(SS_CAP|SS_TMPSYSOP)) { - atr=lclatr((LIGHTGRAY<<4)|BLINK); - sys_status&SS_CAP ? lputc('C') : lputc(SP); - sys_status&SS_TMPSYSOP ? lputc('*') : lputc(SP); - lclatr(LIGHTGRAY<<4); } -else { - atr=lclatr(LIGHTGRAY<<4); - lputs(" "); } -switch(statline) { - case -1: - lputs("Terminal: Alt-X Exit Alt-D DOS Alt-H Hangup " - "Alt-L Logon Alt-U User Edit"); - break; - case 0: /* Alias ML Password Modem Birthday Age Sex Phone */ - lprintf("%-24.24s %02d %-8.8s %-8.8s %-8.8s %02d %c %s" - ,useron.alias,useron.level,sys_misc&SM_ECHO_PW ? useron.pass:"XXXX" - ,useron.modem,useron.birth,age,useron.sex,useron.phone); - break; - case 1: /* Alias ML RealName Alt-Z for Help */ - lprintf("%-24.24s %02d %-25.25s " - ,useron.alias,useron.level,useron.name); - lputs("Alt-Z for Help"); - break; - case 2: /* Alias ML RealName Age Sex Phone */ - lprintf("%-24.24s %02d %-25.25s %02d %c %s" - ,useron.alias,useron.level,useron.name,age,useron.sex,useron.phone); - break; - case 3: /* Alias ML Location Phone */ - lprintf("%-24.24s %02d %-30.30s %s" - ,useron.alias,useron.level,useron.location,useron.phone); - break; - case 4: /* Alias ML Note Phone */ - lprintf("%-24.24s %02d %-30.30s %s" - ,useron.alias,useron.level,useron.note,useron.phone); - break; - case 5: /* Alias ML MF Age Sex Phone */ - lprintf("%-24.24s %02d %-26.26s %02d %c %s" - ,useron.alias,useron.level,ltoaf(useron.flags1,tmp1) - ,age,useron.sex,useron.phone); - break; - case 6: /* Alias ML MF Expiration */ - lprintf("%-24.24s %02d %-26.26s Exp: %s" - ,useron.alias,useron.level,ltoaf(useron.flags1,tmp1) - ,unixtodstr(useron.expire,tmp2)); - break; - case 7: /* Alias ML Firston Laston Expire */ - lprintf("%-24.24s %02d First: %s Last: %s Exp: %s" - ,useron.alias,useron.level,unixtodstr(useron.firston,tmp1) - ,unixtodstr(useron.laston,tmp2),unixtodstr(useron.expire,tmp3)); - break; - case 8: /* Alias Credits Minutes Expire */ - lprintf("%-24.24s Cdt: %-13.13s Min: %-10luExp: %s" - ,useron.alias,ultoac(useron.cdt,tmp1),useron.min - ,unixtodstr(useron.expire,tmp2)); - break; - case 9: /* Exemptions Restrictions */ - lprintf(" Exempt:%-26.26s Restrict:%s" - ,ltoaf(useron.exempt,tmp1),ltoaf(useron.rest,tmp2)); - break; - case 10: /* Computer Modem Handle*/ - lprintf("Comp: %-30.30s Modem: %-8.8s Handle: %s" - ,useron.comp,connection,useron.handle); - break; - case 11: /* StreetAddress Location Zip */ - lprintf("%-30.30s %-30.30s %s" - ,useron.address,useron.location,useron.zipcode); - break; - case 12: /* UploadBytes Uploads DownloadBytes Downloads Leeches */ - lprintf("Uloads: %-13.13s / %-5u Dloads: %-13.13s / %-5u Leech: %u" - ,ultoac(useron.ulb,tmp1),useron.uls - ,ultoac(useron.dlb,tmp2),useron.dls,useron.leech); - break; - case 13: /* Posts Emails Fbacks Waiting Logons Timeon */ - lprintf("P: %-5u E: %-5u F: %-5u W: %-5u L: %-5u T: %-5u" - ,useron.posts,useron.emails,useron.fbacks,getmail(useron.number,0) - ,useron.logons,useron.timeon); - break; - case 14: /* NetMail forwarding address */ - lprintf("NetMail: %s",useron.netmail); - break; - case 15: /* Comment */ - lprintf("Comment: %s",useron.comment); - break; - } -lputc(CLREOL); -lclxy(75,lclwy()); -getnodedat(node_num,&thisnode,0); -if(sys_status&SS_SYSALERT - || thisnode.misc&(NODE_RRUN|NODE_DOWN|NODE_LOCK|NODE_EVENT)) { - lclatr((LIGHTGRAY<<4)|BLINK); - sys_status&SS_SYSALERT ? lputc('A'):lputc(SP); - thisnode.misc&NODE_RRUN ? lputc('R'):lputc(SP); - thisnode.misc&NODE_DOWN ? lputc('D'):lputc(SP); - thisnode.misc&NODE_LOCK ? lputc('L'):lputc(SP); - thisnode.misc&NODE_EVENT ? lputc('E'):lputc(SP); } -TEXTWINDOW; -lclxy(col,row); -lclatr(atr); -} - -/****************************************************************************/ -/* Prints PAUSE message and waits for a key stoke */ -/****************************************************************************/ -void pause() -{ - char ch; - uchar tempattrs=curatr; /* was lclatr(-1) */ - int i,j; - long l=K_UPPER; - -RIOSYNC(0); -if(sys_status&SS_ABORT) - return; -lncntr=0; -if(online==ON_REMOTE) - rioctl(IOFI); -bputs(text[Pause]); -j=bstrlen(text[Pause]); -if(sys_status&SS_USERON && !(useron.misc&NO_EXASCII) && !(useron.misc&WIP)) - l|=K_SPIN; - -ch=getkey(l); -if(ch==text[YN][1] || ch=='Q') - sys_status|=SS_ABORT; -else if(ch==LF) - lncntr=rows-2; /* down arrow == display one more line */ -if(text[Pause][0]!='@') - for(i=0;i<j;i++) - bputs("\b \b"); -getnodedat(node_num,&thisnode,0); -nodesync(); -attr(tempattrs); -} - -void getlines() -{ -if(useron.misc&ANSI && !useron.rows /* Auto-detect rows */ - && online==ON_REMOTE) { /* Remote */ - SYNC; - putcom("\x1b[s\x1b[99B\x1b[6n\x1b[u"); - while(online && !rioctl(RXBC) && !lkbrd(1)) - checkline(); - inkey(0); } - -} - - -/****************************************************************************/ -/* Prints a file remotely and locally, interpreting ^A sequences, checks */ -/* for pauses, aborts and ANSI. 'str' is the path of the file to print */ -/* Called from functions menu and text_sec */ -/****************************************************************************/ -void printfile(char *str, int mode) -{ - char HUGE16 *buf; - int file,wip=0,rip=0; - long length,savcon=console; - FILE *stream; - -if(strstr(str,".WIP")) - wip=1; -if(strstr(str,".RIP")) - rip=1; - -if(mode&P_NOABORT || wip || rip) { - if(online==ON_REMOTE && console&CON_R_ECHO) { - rioctl(IOCM|ABORT); - rioctl(IOCS|ABORT); } - sys_status&=~SS_ABORT; } - -if(!tos && !wip && !rip) - CRLF; - -if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - bputs(text[FileNotFound]); - if(SYSOP) bputs(str); - CRLF; - return; } - -if(wip || rip || !(console&CON_L_ECHO)) { - if(online!=ON_REMOTE || !(console&CON_R_ECHO)) { - fclose(stream); - return; } - console&=~CON_L_ECHO; - lprintf("PRINTFILE (Remote Only): %s\r\n",str); } -if(mode&P_OPENCLOSE) { - length=filelength(file); - if((buf=MALLOC(length+1L))==NULL) { - close(file); - console=savcon; - errormsg(WHERE,ERR_ALLOC,str,length+1L); - return; } - buf[lread(file,buf,length)]=0; - fclose(stream); - putmsg(buf,mode); - FREE((char *)buf); } -else { - putmsg_fp(stream,filelength(file),mode); - fclose(stream); } -if((mode&P_NOABORT || wip || rip) && online==ON_REMOTE) { - SYNC; - rioctl(IOSM|ABORT); } -if(rip) - getlines(); -console=savcon; -} - -void printtail(char *str, int lines, int mode) -{ - char HUGE16 *buf,HUGE16 *p; - int file,cur=0; - ulong length,l; - -if(mode&P_NOABORT) { - if(online==ON_REMOTE) { - rioctl(IOCM|ABORT); - rioctl(IOCS|ABORT); } - sys_status&=~SS_ABORT; } -strupr(str); -if(!tos) { - CRLF; } -if((file=nopen(str,O_RDONLY))==-1) { - bputs(text[FileNotFound]); - if(SYSOP) bputs(str); - CRLF; - return; } -length=filelength(file); -if((buf=MALLOC(length+1L))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length+1L); - return; } -l=lread(file,buf,length); -buf[l]=0; -close(file); -p=(buf+l)-1; -if(*p==LF) p--; -while(*p && p>buf) { - if(*p==LF) - cur++; - if(cur>=lines) { - p++; - break; } - p--; } -putmsg(p,mode); -if(mode&P_NOABORT && online==ON_REMOTE) { - SYNC; - rioctl(IOSM|ABORT); } -FREE((char *)buf); -} - -/****************************************************************************/ -/* Prints the menu number 'menunum' from the text directory. Checks for ^A */ -/* ,ANSI sequences, pauses and aborts. Usually accessed by user inputing '?'*/ -/* Called from every function that has an available menu. */ -/* The code definitions are as follows: */ -/****************************************************************************/ -void menu(char *code) -{ - char str[256],path[256]; - int c,i,l; - -sys_status&=~SS_ABORT; -if(menu_file[0]) - strcpy(path,menu_file); -else { - sprintf(str,"%sMENU\\",text_dir); - if(menu_dir[0]) { - strcat(str,menu_dir); - strcat(str,"\\"); } - strcat(str,code); - strcat(str,"."); - sprintf(path,"%s%s",str,useron.misc&WIP ? "WIP":"RIP"); - if(!(useron.misc&(RIP|WIP)) || !fexist(path)) { - sprintf(path,"%sMON",str); - if((useron.misc&(COLOR|ANSI))!=ANSI || !fexist(path)) { - sprintf(path,"%sANS",str); - if(!(useron.misc&ANSI) || !fexist(path)) - sprintf(path,"%sASC",str); } } } - -printfile(path,P_OPENCLOSE); -} - -/****************************************************************************/ -/* Puts a character into the input buffer */ -/****************************************************************************/ -void ungetkey(char ch) -{ - -keybuf[keybuftop++]=ch; -if(keybuftop==KEY_BUFSIZE) - keybuftop=0; -} - diff --git a/src/sbbs2/con_out.c b/src/sbbs2/con_out.c deleted file mode 100644 index 6384088dd9..0000000000 --- a/src/sbbs2/con_out.c +++ /dev/null @@ -1,1043 +0,0 @@ -#line 1 "CON_OUT.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/**********************************************************************/ -/* Functions that pertain to console i/o - color, strings, chars etc. */ -/* Called from functions everywhere */ -/**********************************************************************/ - -#include "sbbs.h" - -extern char *mnestr; - -/***************************************************/ -/* Seven bit table for EXASCII to ASCII conversion */ -/***************************************************/ -char *sbtbl="CUeaaaaceeeiiiAAEaAooouuyOUcLYRfaiounNao?--24!<>" - "###||||++||++++++--|-+||++--|-+----++++++++##[]#" - "abrpEout*ono%0ENE+><rj%=o..+n2* "; - -char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec"}; - -uchar outchar_esc=0; - -#ifdef __WIN32__ - -int lclatr(int atr) -{ - -textattr(atr); -return(curatr); -} - -void lputc(ch) -{ -switch(ch) { - case CLREOL: - clreol(); - break; - case FF: - clrscr(); - break; - case TAB: - if(!(wherex()%8)) - putchar(SP); - while(wherex()%8) - putchar(SP); - break; - default: - putchar(ch); - break; } -} - -#endif - -#ifdef __OS2__ - -HEV con_out_sem; /* Console command semaphore */ - -#define CON_OUT_BUFLEN 8192 /* Console output (ANSI) buffer */ -#define CON_BLK_BUFLEN 4096 /* Console block (all same atr) buffer */ - -uchar conoutbuf[CON_OUT_BUFLEN]; -uchar conblkbuf[CON_BLK_BUFLEN]; -volatile uint conblkcnt=0; -volatile uint conoutbot=0; -volatile uint conouttop=0; - -uchar lcl_curatr=LIGHTGRAY; - -/****************************************************************************/ -/* Prints one block of text (all same attribute) at current cursor position */ -/****************************************************************************/ -void print_conblkbuf() -{ -conblkbuf[conblkcnt]=0; -cputs(conblkbuf); -conblkcnt=0; -} - -void con_outch(int ch) -{ - static uchar ansi_esc; - static uchar ansi_curval; - static uchar ansi_val[3]; - static uchar ansi_x; - static uchar ansi_y; - int x,y; - -if(ch==ESC) { - ansi_esc=1; - ansi_val[0]=ansi_val[1]=ansi_val[2]=ansi_curval=0; - return; } - -if(ansi_esc==1) { /* Received ESC already */ - if(ch=='[') { - ansi_esc++; - return; } - ansi_esc=ansi_val[0]=ansi_val[1]=ansi_val[2]=ansi_curval=0; } - -if(ansi_esc==2) { /* Received ESC[ already */ - - if(isdigit(ch)) { - if(ansi_curval>2) ansi_curval=0; - ansi_val[ansi_curval]*=10; - ansi_val[ansi_curval]+=ch&0xf; - return; } - - if(ch==';') { - ansi_curval++; - return; } - - /* looks like valid ANSI, so purge the output block */ - if(conblkcnt) - print_conblkbuf(); - switch(ch) { - case 'A': // Move cursor up - y=wherey(); - if(ansi_val[0]) - y-=ansi_val[0]; - else - y--; - if(y<1) y=1; - gotoxy(wherex(),y); - break; - case 'B': // Move cursor down - y=wherey(); - if(ansi_val[0]) - y+=ansi_val[0]; - else - y++; - if(y>node_scrnlen) y=node_scrnlen; - gotoxy(wherex(),y); - break; - case 'C': // Move cursor right - x=wherex(); - if(ansi_val[0]) - x+=ansi_val[0]; - else - x++; - if(x>80) x=80; - gotoxy(x,wherey()); - break; - case 'D': // Move cursor left - x=wherex(); - if(ansi_val[0]) - x-=ansi_val[0]; - else - x--; - if(x<1) x=1; - gotoxy(x,wherey()); - break; - case 'J': // clear screen - if(ansi_val[0]==2) - clrscr(); - break; - case 'K': // clearn from cursor to end of line - clreol(); - break; - case 'H': // Position cursor - case 'f': - y=ansi_val[0]; - x=ansi_val[1]; - if(x<1) x=1; - if(x>80) x=80; - if(y<1) y=1; - if(y>node_scrnlen) y=node_scrnlen; - gotoxy(x,y); - break; - case 's': // Save cursor position - ansi_x=wherex(); - ansi_y=wherey(); - break; - case 'u': // Restore cursor position - if(ansi_x) - gotoxy(ansi_x,ansi_y); - break; - case 'm': // Select character attributes - for(x=0;x<=ansi_curval;x++) - switch(ansi_val[x]) { - case 0: // no special attributes - case 8: // concealed text (no display) - lcl_curatr=LIGHTGRAY; - break; - case 1: // high intensity - case 3: // italic - case 4: // underline - lcl_curatr|=HIGH; - break; - case 2: // low intensity - lcl_curatr&=~HIGH; - break; - case 5: // blink - case 6: // rapid blink - case 7: // reverse video - lcl_curatr|=BLINK; - break; - case 30: // foreground black - lcl_curatr&=0xf8; - lcl_curatr|=BLACK; - break; - case 31: // foreground red - lcl_curatr&=0xf8; - lcl_curatr|=RED; - break; - case 32: // foreground green - lcl_curatr&=0xf8; - lcl_curatr|=GREEN; - break; - case 33: // foreground yellow - lcl_curatr&=0xf8; - lcl_curatr|=BROWN; - break; - case 34: // foreground blue - lcl_curatr&=0xf8; - lcl_curatr|=BLUE; - break; - case 35: // foreground magenta - lcl_curatr&=0xf8; - lcl_curatr|=MAGENTA; - break; - case 36: // foreground cyan - lcl_curatr&=0xf8; - lcl_curatr|=CYAN; - break; - case 37: // foreground white - lcl_curatr&=0xf8; - lcl_curatr|=LIGHTGRAY; - break; - case 40: // background black - lcl_curatr&=0x8f; - lcl_curatr|=(BLACK<<4); - break; - case 41: // background red - lcl_curatr&=0x8f; - lcl_curatr|=(RED<<4); - break; - case 42: // background green - lcl_curatr&=0x8f; - lcl_curatr|=(GREEN<<4); - break; - case 43: // background yellow - lcl_curatr&=0x8f; - lcl_curatr|=(BROWN<<4); - break; - case 44: // background blue - lcl_curatr&=0x8f; - lcl_curatr|=(BLUE<<4); - break; - case 45: // background magenta - lcl_curatr&=0x8f; - lcl_curatr|=(MAGENTA<<4); - break; - case 46: // background cyan - lcl_curatr&=0x8f; - lcl_curatr|=(CYAN<<4); - break; - case 47: // background white - lcl_curatr&=0x8f; - lcl_curatr|=(LIGHTGRAY<<4); - break; } - textattr(lcl_curatr); - break; } - - ansi_esc=ansi_val[0]=ansi_val[1]=ansi_val[2]=ansi_curval=0; - return; } - -if(conblkcnt+1>=CON_BLK_BUFLEN) - print_conblkbuf(); -switch(ch) { - case CLREOL: - if(conblkcnt) print_conblkbuf(); - clreol(); - break; - case FF: - if(conblkcnt) print_conblkbuf(); - clrscr(); - break; - case TAB: - if(conblkcnt) print_conblkbuf(); - if(!(wherex()%8)) - putch(SP); - while(wherex()%8) - putch(SP); - break; - default: - conblkbuf[conblkcnt++]=ch; - break; } -} - - -/****************************************************************************/ -/* Thread that services the console output buffer (conoutbuf) which */ -/* contains ANSI escape sequences */ -/* All output is for the text window (mirroring the remote console) */ -/****************************************************************************/ -void con_out_thread(void *unused) -{ - int i,top,cnt; - ulong l; - -while(1) { - /* mswait(1); Removed 12/99 via Enigma */ - if(conoutbot==conouttop) { - DosWaitEventSem(con_out_sem,10000); /* every 10 seconds */ - DosResetEventSem(con_out_sem,&l); - continue; } - top=conouttop; - if(top<conoutbot) - cnt=CON_OUT_BUFLEN-conoutbot; - else - cnt=top-conoutbot; - for(i=conoutbot;i<conoutbot+cnt;i++) - con_outch(conoutbuf[i]); - conoutbot=i; - if(conblkcnt) - print_conblkbuf(); - if(conoutbot==CON_OUT_BUFLEN) - conoutbot=0; } -} - - - -void outcon(char ch) -{ - int i=conouttop+1; - -if(i==CON_OUT_BUFLEN) - i=0; -while(conoutbot==i) // Wait for thread to service queue - mswait(1); -conoutbuf[conouttop++]=ch; -if(conouttop==CON_OUT_BUFLEN) - conouttop=0; -DosPostEventSem(con_out_sem); // Enable output -} - -int outcon_pending() -{ -if(conoutbot!=conouttop) - return(1); -if(conblkcnt) { - print_conblkbuf(); - return(1); } -return(0); -} - -int conaes() -{ -return(outchar_esc==2); -} - -void lputc(int ch) -{ - -while(outcon_pending()) - mswait(1); -switch(ch) { - case CLREOL: - clreol(); - break; - case FF: - clrscr(); - break; - case TAB: - if(!(wherex()%8)) - putch(SP); - while(wherex()%8) - putch(SP); - break; - default: - putch(ch); - break; } -} - -long lputs(char *str) -{ -while(outcon_pending()) - mswait(1); -return(cputs(str)); -} - -int lclwx(void) -{ -while(outcon_pending()) - mswait(1); -return(wherex()); -} - -int lclwy(void) -{ -while(outcon_pending()) - mswait(1); -return(wherey()); -} - -void lclxy(int x, int y) -{ -while(outcon_pending()) - mswait(1); -gotoxy(x,y); -} - -int lclatr(int x) -{ - int i; - -while(conoutbot!=conouttop) /* wait for output buf to empty */ - mswait(1); -if(x==-1) - return(lcl_curatr); - -textattr(x); -i=lcl_curatr; -lcl_curatr=x; -return(i); /* Return previous attribute */ -} - -#endif - -/****************************************************************************/ -/* Outputs a NULL terminated string locally and remotely (if applicable) */ -/* Handles ctrl-a characters */ -/****************************************************************************/ -int bputs(char *str) -{ - int i; - ulong l=0; - -while(str[l]) { - if(str[l]==1) { /* ctrl-a */ - ctrl_a(str[++l]); /* skip the ctrl-a */ - l++; /* skip the attribute code */ - continue; } - if(str[l]=='@') { /* '@' */ - if(str==mnestr /* Mnemonic string or */ - || (str>=text[0] /* Straight out of TEXT.DAT */ - && str<=text[TOTAL_TEXT-1])) { - i=atcodes(str+l); /* return 0 if not valid @ code */ - l+=i; /* i is length of code string */ - if(i) /* if valid string, go to top */ - continue; } - for(i=0;i<TOTAL_TEXT;i++) - if(str==text[i]) - break; - if(i<TOTAL_TEXT) { /* Replacement text */ - //lputc(7); - i=atcodes(str+l); - l+=i; - if(i) - continue; } } - outchar(str[l++]); } -return(l); -} - -/****************************************************************************/ -/* Outputs a NULL terminated string locally and remotely (if applicable) */ -/* Does not expand ctrl-a characters (raw) */ -/* Max length of str is 64 kbytes */ -/****************************************************************************/ -int rputs(char *str) -{ - ulong l=0; - -while(str[l]) - outchar(str[l++]); -return(l); -} - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) -{ - va_list argptr; - char sbuf[256]; - int chcount; - -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); -} - -/****************************************************************************/ -/* Performs printf() using bbs bputs function */ -/****************************************************************************/ -int bprintf(char *fmt, ...) -{ - va_list argptr; - char sbuf[1024]; - -if(!strchr(fmt,'%')) - return(bputs(fmt)); -va_start(argptr,fmt); -vsprintf(sbuf,fmt,argptr); -va_end(argptr); -return(bputs(sbuf)); -} - -/****************************************************************************/ -/* Performs printf() using bbs rputs function */ -/****************************************************************************/ -int rprintf(char *fmt, ...) -{ - va_list argptr; - char sbuf[1024]; - -va_start(argptr,fmt); -vsprintf(sbuf,fmt,argptr); -va_end(argptr); -return(rputs(sbuf)); -} - -/****************************************************************************/ -/* Outputs character locally and remotely (if applicable), preforming echo */ -/* translations (X's and r0dent emulation) if applicable. */ -/****************************************************************************/ -void outchar(char ch) -{ - char lch; - int i; - -if(console&CON_ECHO_OFF) - return; -if(ch==ESC) - outchar_esc=1; -else if(outchar_esc==1) { - if(ch=='[') - outchar_esc++; - else - outchar_esc=0; } -else - outchar_esc=0; -if(useron.misc&NO_EXASCII && ch&0x80) - ch=sbtbl[(uchar)ch^0x80]; /* seven bit table */ -if(ch==FF && lncntr>1 && !tos) { - lncntr=0; - CRLF; - pause(); - while(lncntr && online && !(sys_status&SS_ABORT)) - pause(); } -if(sys_status&SS_CAP /* Writes to Capture File */ - && (sys_status&SS_ANSCAP || (ch!=ESC && !lclaes()))) - fwrite(&ch,1,1,capfile); -if(console&CON_L_ECHO) { - if(console&CON_L_ECHOX && (uchar)ch>=SP) - outcon('X'); - else if(node_misc&NM_NOBEEP && ch==7); /* Do nothing if beep */ - else if(ch==7) { - beep(2000,110); - nosound(); } - else outcon(ch); } -if(online==ON_REMOTE && console&CON_R_ECHO) { - if(console&CON_R_ECHOX && (uchar)ch>=SP) - ch='X'; - i=0; - while(outcom(ch)&TXBOF && i<1440) { /* 3 minute pause delay */ - - if(lkbrd(1)) { - lch=lkbrd(0); /* ctrl-c */ - if(lch==3) { - lputs("local abort (outchar)\r\n"); - i=1440; - break; } - ungetkey(lch); } - if(!DCDHIGH) - break; - i++; - if(sys_status&SS_SYSPAGE) - beep(i,80); - else - mswait(80); } - if(i==1440) { /* timeout - beep flush outbuf */ - i=rioctl(TXBC); - lprintf("timeout(outchar) %04X %04X\r\n",i,rioctl(IOFO)); - outcom(7); - lputc(7); - rioctl(IOCS|PAUSE); } } -if(ch==LF) { - lncntr++; - lbuflen=0; - tos=0; } -else if(ch==FF) { - lncntr=0; - lbuflen=0; - tos=1; } - -else { - if(!lbuflen) - latr=curatr; - if(lbuflen<LINE_BUFSIZE) - lbuf[lbuflen++]=ch; } - -if(lncntr==rows-1 && ((useron.misc&UPAUSE && !(sys_status&SS_PAUSEOFF)) - || sys_status&SS_PAUSEON)) { - lncntr=0; - pause(); } - -} - - -/****************************************************************************/ -/* performs the correct attribute modifications for the Ctrl-A code */ -/****************************************************************************/ -void ctrl_a(char x) -{ - int i,j; - char tmp1[128],atr=curatr; - -if(x && (uchar)x<ESC) { /* Ctrl-A through Ctrl-Z for users with MF only */ - if(!(useron.flags1&FLAG(x+64))) - console^=(CON_ECHO_OFF); - return; } -if((uchar)x>=0x7f) { - if(useron.misc&ANSI) - bprintf("\x1b[%uC",(uchar)x-0x7f); - else - for(i=0;i<(uchar)x-0x7f;i++) - outchar(SP); - return; } -switch(toupper(x)) { - case '!': /* level 10 or higher */ - if(useron.level<10) - console^=CON_ECHO_OFF; - break; - case '@': /* level 20 or higher */ - if(useron.level<20) - console^=CON_ECHO_OFF; - break; - case '#': /* level 30 or higher */ - if(useron.level<30) - console^=CON_ECHO_OFF; - break; - case '$': /* level 40 or higher */ - if(useron.level<40) - console^=CON_ECHO_OFF; - break; - case '%': /* level 50 or higher */ - if(useron.level<50) - console^=CON_ECHO_OFF; - break; - case '^': /* level 60 or higher */ - if(useron.level<60) - console^=CON_ECHO_OFF; - break; - case '&': /* level 70 or higher */ - if(useron.level<70) - console^=CON_ECHO_OFF; - break; - case '*': /* level 80 or higher */ - if(useron.level<80) - console^=CON_ECHO_OFF; - break; - case '(': /* level 90 or higher */ - if(useron.level<90) - console^=CON_ECHO_OFF; - break; - case ')': /* turn echo back on */ - console&=~CON_ECHO_OFF; - break; - case '-': /* turn off all attributes if */ - if(atr&(HIGH|BLINK|(LIGHTGRAY<<4))) /* high intensity, blink or */ - attr(LIGHTGRAY); /* background bits are set */ - break; - case '_': /* turn off all attributes if */ - if(atr&(BLINK|(LIGHTGRAY<<4))) /* blink or background is set */ - attr(LIGHTGRAY); - break; - case 'P': /* Pause */ - pause(); - break; - case 'Q': /* Pause reset */ - lncntr=0; - break; - case 'T': /* Time */ - now=time(NULL); - unixtodos(now,&date,&curtime); - bprintf("%02d:%02d %s" - ,curtime.ti_hour==0 ? 12 - : curtime.ti_hour>12 ? curtime.ti_hour-12 - : curtime.ti_hour, curtime.ti_min, curtime.ti_hour>11 ? "pm":"am"); - break; - case 'D': /* Date */ - now=time(NULL); - bputs(unixtodstr(now,tmp1)); - break; - case ',': /* Delay 1/10 sec */ - mswait(100); - break; - case ';': /* Delay 1/2 sec */ - mswait(500); - break; - case '.': /* Delay 2 secs */ - mswait(2000); - break; - case 'S': /* Synchronize */ - ASYNC; - break; - case 'L': /* CLS (form feed) */ - CLS; - break; - case '>': /* CLREOL */ - if(useron.misc&ANSI) - bputs("\x1b[K"); - else { - i=j=lclwx(); - while(i++<79) - outchar(SP); - while(j++<79) - outchar(BS); } - break; - case '<': /* Non-destructive backspace */ - outchar(BS); - break; - case '[': /* Carriage return */ - outchar(CR); - break; - case ']': /* Line feed */ - outchar(LF); - break; - case 'A': /* Ctrl-A */ - outchar(1); - break; - case 'H': /* High intensity */ - atr|=HIGH; - attr(atr); - break; - case 'I': /* Blink */ - atr|=BLINK; - attr(atr); - break; - case 'N': /* Normal */ - attr(LIGHTGRAY); - break; - case 'R': - atr=(atr&0xf8)|RED; - attr(atr); - break; - case 'G': - atr=(atr&0xf8)|GREEN; - attr(atr); - break; - case 'B': - atr=(atr&0xf8)|BLUE; - attr(atr); - break; - case 'W': /* White */ - atr=(atr&0xf8)|LIGHTGRAY; - attr(atr); - break; - case 'C': - atr=(atr&0xf8)|CYAN; - attr(atr); - break; - case 'M': - atr=(atr&0xf8)|MAGENTA; - attr(atr); - break; - case 'Y': /* Yellow */ - atr=(atr&0xf8)|BROWN; - attr(atr); - break; - case 'K': /* Black */ - atr=(atr&0xf8)|BLACK; - attr(atr); - break; - case '0': /* Black Background */ - atr=(atr&0x8f)|(BLACK<<4); - attr(atr); - break; - case '1': /* Red Background */ - atr=(atr&0x8f)|(RED<<4); - attr(atr); - break; - case '2': /* Green Background */ - atr=(atr&0x8f)|(GREEN<<4); - attr(atr); - break; - case '3': /* Yellow Background */ - atr=(atr&0x8f)|(BROWN<<4); - attr(atr); - break; - case '4': /* Blue Background */ - atr=(atr&0x8f)|(BLUE<<4); - attr(atr); - break; - case '5': /* Magenta Background */ - atr=(atr&0x8f)|(MAGENTA<<4); - attr(atr); - break; - case '6': /* Cyan Background */ - atr=(atr&0x8f)|(CYAN<<4); - attr(atr); - break; - case '7': /* White Background */ - atr=(atr&0x8f)|(LIGHTGRAY<<4); - attr(atr); - break; } -} - -/***************************************************************************/ -/* Changes local and remote text attributes accounting for monochrome */ -/***************************************************************************/ -/****************************************************************************/ -/* Sends ansi codes to change remote ansi terminal's colors */ -/* Only sends necessary codes - tracks remote terminal's current attributes */ -/* through the 'curatr' variable */ -/****************************************************************************/ -void attr(int atr) -{ - -if(!(useron.misc&ANSI)) - return; -if(!(useron.misc&COLOR)) { /* eliminate colors if user doesn't have them */ - if(atr&LIGHTGRAY) /* if any foreground bits set, set all */ - atr|=LIGHTGRAY; - if(atr&(LIGHTGRAY<<4)) /* if any background bits set, set all */ - atr|=(LIGHTGRAY<<4); - if(atr&LIGHTGRAY && atr&(LIGHTGRAY<<4)) - atr&=~LIGHTGRAY; /* if background is solid, foreground is black */ - if(!atr) - atr|=LIGHTGRAY; } /* don't allow black on black */ -if(curatr==atr) /* text hasn't changed. don't send codes */ - return; - -if((!(atr&HIGH) && curatr&HIGH) || (!(atr&BLINK) && curatr&BLINK) - || atr==LIGHTGRAY) { - bputs("\x1b[0m"); - curatr=LIGHTGRAY; } - -if(atr==LIGHTGRAY) /* no attributes */ - return; - -if(atr&BLINK) { /* special attributes */ - if(!(curatr&BLINK)) - bputs(ansi(BLINK)); } -if(atr&HIGH) { - if(!(curatr&HIGH)) - bputs(ansi(HIGH)); } - -if((atr&0x7)==BLACK) { /* foreground colors */ - if((curatr&0x7)!=BLACK) - bputs(ansi(BLACK)); } -else if((atr&0x7)==RED) { - if((curatr&0x7)!=RED) - bputs(ansi(RED)); } -else if((atr&0x7)==GREEN) { - if((curatr&0x7)!=GREEN) - bputs(ansi(GREEN)); } -else if((atr&0x7)==BROWN) { - if((curatr&0x7)!=BROWN) - bputs(ansi(BROWN)); } -else if((atr&0x7)==BLUE) { - if((curatr&0x7)!=BLUE) - bputs(ansi(BLUE)); } -else if((atr&0x7)==MAGENTA) { - if((curatr&0x7)!=MAGENTA) - bputs(ansi(MAGENTA)); } -else if((atr&0x7)==CYAN) { - if((curatr&0x7)!=CYAN) - bputs(ansi(CYAN)); } -else if((atr&0x7)==LIGHTGRAY) { - if((curatr&0x7)!=LIGHTGRAY) - bputs(ansi(LIGHTGRAY)); } - -if((atr&0x70)==(BLACK<<4)) { /* background colors */ - if((curatr&0x70)!=(BLACK<<4)) - bputs("\x1b[40m"); } -else if((atr&0x70)==(RED<<4)) { - if((curatr&0x70)!=(RED<<4)) - bputs(ansi(RED<<4)); } -else if((atr&0x70)==(GREEN<<4)) { - if((curatr&0x70)!=(GREEN<<4)) - bputs(ansi(GREEN<<4)); } -else if((atr&0x70)==(BROWN<<4)) { - if((curatr&0x70)!=(BROWN<<4)) - bputs(ansi(BROWN<<4)); } -else if((atr&0x70)==(BLUE<<4)) { - if((curatr&0x70)!=(BLUE<<4)) - bputs(ansi(BLUE<<4)); } -else if((atr&0x70)==(MAGENTA<<4)) { - if((curatr&0x70)!=(MAGENTA<<4)) - bputs(ansi(MAGENTA<<4)); } -else if((atr&0x70)==(CYAN<<4)) { - if((curatr&0x70)!=(CYAN<<4)) - bputs(ansi(CYAN<<4)); } -else if((atr&0x70)==(LIGHTGRAY<<4)) { - if((curatr&0x70)!=(LIGHTGRAY<<4)) - bputs(ansi(LIGHTGRAY<<4)); } - -curatr=atr; -} - -/****************************************************************************/ -/* Returns the ANSI code to obtain the value of atr. Mixed attributes */ -/* high intensity colors, or background/forground cobinations don't work. */ -/* A call to attr is more appropriate, being it is intelligent */ -/****************************************************************************/ -char *ansi(char atr) -{ - -switch(atr) { - case (char)BLINK: - return("\x1b[5m"); - case HIGH: - return("\x1b[1m"); - case BLACK: - return("\x1b[30m"); - case RED: - return("\x1b[31m"); - case GREEN: - return("\x1b[32m"); - case BROWN: - return("\x1b[33m"); - case BLUE: - return("\x1b[34m"); - case MAGENTA: - return("\x1b[35m"); - case CYAN: - return("\x1b[36m"); - case LIGHTGRAY: - return("\x1b[37m"); - case (RED<<4): - return("\x1b[41m"); - case (GREEN<<4): - return("\x1b[42m"); - case (BROWN<<4): - return("\x1b[43m"); - case (BLUE<<4): - return("\x1b[44m"); - case (MAGENTA<<4): - return("\x1b[45m"); - case (CYAN<<4): - return("\x1b[46m"); - case (LIGHTGRAY<<4): - return("\x1b[47m"); } - -return("-Invalid use of ansi()-"); -} - - -/****************************************************************************/ -/* Checks to see if user has hit Pause or Abort. Returns 1 if user aborted. */ -/* If the user hit Pause, waits for a key to be hit. */ -/* Emulates remote XON/XOFF flow control on local console */ -/* Preserves SS_ABORT flag state, if already set. */ -/* Called from various listing procedures that wish to check for abort */ -/****************************************************************************/ -char msgabort() -{ - char ch; - -if(sys_status&SS_SYSPAGE) - beep(random(800),1); -if(lkbrd(1)) { - ch=inkey(0); - if(sys_status&SS_ABORT) { /* ^c */ - keybufbot=keybuftop=0; - return(1); } - else if(ch==17 && online==ON_REMOTE) /* ^q */ - rioctl(IOCS|PAUSE); - else if(ch==19) /* ^s */ - while(online) { - if((ch=inkey(0))!=0) { - if(ch==17) /* ^q */ - return(0); - ungetkey(ch); } - if(sys_status&SS_ABORT) { /* ^c */ - keybufbot=keybuftop=0; - return(1); } - checkline(); } - else if(ch) - ungetkey(ch); } -checkline(); -if(sys_status&SS_ABORT) - return(1); -if(online==ON_REMOTE && rioctl(IOSTATE)&ABORT) { - rioctl(IOCS|ABORT); - sys_status|=SS_ABORT; - return(1); } -if(!online) - return(1); -return(0); -} - - -/****************************************************************************/ -/* Takes the value 'sec' and makes a string the format HH:MM:SS */ -/****************************************************************************/ -char *sectostr(uint sec,char *str) -{ - uchar hour,min,sec2; - -hour=(sec/60)/60; -min=(sec/60)-(hour*60); -sec2=sec-((min+(hour*60))*60); -sprintf(str,"%2.2d:%2.2d:%2.2d",hour,min,sec2); -return(str); -} - - -/****************************************************************************/ -/* Generates a 24 character ASCII string that represents the time_t pointer */ -/* Used as a replacement for ctime() */ -/****************************************************************************/ -char *timestr(time_t *intime) -{ - static char str[256]; - char mer[3],hour; - struct tm *gm; - -gm=localtime(intime); -if(gm==NULL) { - strcpy(str,"Invalid Time"); - return(str); } -if(sys_misc&SM_MILITARY) { - sprintf(str,"%s %s %02d %4d %02d:%02d:%02d" - ,wday[gm->tm_wday],mon[gm->tm_mon],gm->tm_mday,1900+gm->tm_year - ,gm->tm_hour,gm->tm_min,gm->tm_sec); - return(str); } -if(gm->tm_hour>=12) { - if(gm->tm_hour==12) - hour=12; - else - hour=gm->tm_hour-12; - strcpy(mer,"pm"); } -else { - if(gm->tm_hour==0) - hour=12; - else - hour=gm->tm_hour; - strcpy(mer,"am"); } -sprintf(str,"%s %s %02d %4d %02d:%02d %s" - ,wday[gm->tm_wday],mon[gm->tm_mon],gm->tm_mday,1900+gm->tm_year - ,hour,gm->tm_min,mer); -return(str); -} - diff --git a/src/sbbs2/data.c b/src/sbbs2/data.c deleted file mode 100644 index 537358a8bf..0000000000 --- a/src/sbbs2/data.c +++ /dev/null @@ -1,177 +0,0 @@ -#line 1 "DATA.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/**************************************************************/ -/* Functions that store and retrieve data from disk or memory */ -/**************************************************************/ - -#include "sbbs.h" - -/****************************************************************************/ -/* Looks for a perfect match amoung all usernames (not deleted users) */ -/* Returns the number of the perfect matched username or 0 if no match */ -/* Called from functions waitforcall and newuser */ -/****************************************************************************/ -uint matchuser(char *str) -{ - int file; - char str2[256],c; - ulong l,length; - FILE *stream; - -sprintf(str2,"%sUSER\\NAME.DAT",data_dir); -if((stream=fnopen(&file,str2,O_RDONLY))==NULL) - return(0); -length=filelength(file); -for(l=0;l<length;l+=LEN_ALIAS+2) { - fread(str2,LEN_ALIAS+2,1,stream); - for(c=0;c<LEN_ALIAS;c++) - if(str2[c]==ETX) break; - str2[c]=0; - if(!stricmp(str,str2)) { - fclose(stream); - return((l/(LEN_ALIAS+2))+1); } } -fclose(stream); -return(0); -} - -/****************************************************************************/ -/* Looks for close or perfect matches between str and valid usernames and */ -/* numbers and prompts user for near perfect matches in names. */ -/* Returns the number of the matched user or 0 if unsuccessful */ -/* Called from functions main_sec, useredit and readmailw */ -/****************************************************************************/ -uint finduser(char *instr) -{ - int file,i; - char str[128],str2[256],str3[256],ynq[25],c,pass=1; - ulong l,length; - FILE *stream; - -i=atoi(instr); -if(i>0) { - username(i,str2); - if(str2[0] && strcmp(str2,"DELETED USER")) - return(i); } -strcpy(str,instr); -strupr(str); -sprintf(str3,"%sUSER\\NAME.DAT",data_dir); -if(flength(str3)<1L) - return(0); -if((stream=fnopen(&file,str3,O_RDONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str3,O_RDONLY); - return(0); } -sprintf(ynq,"%.2s",text[YN]); -ynq[2]='Q'; -ynq[3]=0; -length=filelength(file); -while(pass<3) { - fseek(stream,0L,SEEK_SET); /* seek to beginning for each pass */ - for(l=0;l<length;l+=LEN_ALIAS+2) { - if(!online) break; - fread(str2,LEN_ALIAS+2,1,stream); - for(c=0;c<LEN_ALIAS;c++) - if(str2[c]==ETX) break; - str2[c]=0; - if(!c) /* deleted user */ - continue; - strcpy(str3,str2); - strupr(str2); - if(pass==1 && !strcmp(str,str2)) { - fclose(stream); - return((l/(LEN_ALIAS+2))+1); } - if(pass==2 && strstr(str2,str)) { - bprintf(text[DoYouMeanThisUserQ],str3 - ,(uint)(l/(LEN_ALIAS+2))+1); - c=getkeys(ynq,0); - if(sys_status&SS_ABORT) { - fclose(stream); - return(0); } - if(c==text[YN][0]) { - fclose(stream); - return((l/(LEN_ALIAS+2))+1); } - if(c=='Q') { - fclose(stream); - return(0); } } } - pass++; } -bputs(text[UnknownUser]); -fclose(stream); -return(0); -} - -/****************************************************************************/ -/* Returns the number of files in the directory 'dirnum' */ -/****************************************************************************/ -int getfiles(uint dirnum) -{ - char str[256]; - long l; - -sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); -l=flength(str); -if(l>0L) - return(l/F_IXBSIZE); -return(0); -} - -/****************************************************************************/ -/* Returns the number of user transfers in XFER.IXT for either a dest user */ -/* source user, or filename. */ -/****************************************************************************/ -int getuserxfers(int fromuser, int destuser, char *fname) -{ - char str[256]; - int file,found=0; - FILE *stream; - -sprintf(str,"%sXFER.IXT",data_dir); -if(!fexist(str)) - return(0); -if(!flength(str)) { - remove(str); - return(0); } -if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return(0); } -while(!ferror(stream)) { - if(!fgets(str,81,stream)) - break; - str[22]=0; - if(fname!=NULL && fname[0] && !strncmp(str+5,fname,12)) - found++; - else if(fromuser && atoi(str+18)==fromuser) - found++; - else if(destuser && atoi(str)==destuser) - found++; } -fclose(stream); -return(found); -} - -/****************************************************************************/ -/* Returns the number of the last user in USER.DAT (deleted ones too) */ -/* Called from function useredit */ -/****************************************************************************/ -uint lastuser() -{ - char str[256]; - long length; - -sprintf(str,"%sUSER\\USER.DAT",data_dir); -if((length=flength(str))>0) - return((uint)(length/U_LEN)); -return(0); -} - -/****************************************************************************/ -/* Returns the number of files in the database for 'dir' */ -/****************************************************************************/ -uint gettotalfiles(uint dirnum) -{ - char str[81]; - -sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); -return((uint)(flength(str)/F_IXBSIZE)); -} - - diff --git a/src/sbbs2/data_ovl.c b/src/sbbs2/data_ovl.c deleted file mode 100644 index 95f81f1d47..0000000000 --- a/src/sbbs2/data_ovl.c +++ /dev/null @@ -1,439 +0,0 @@ -#line 1 "DATA_OVL.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -/****************************************************************************/ -/* Writes into user.number's slot in USER.DAT data in structure 'user' */ -/* Called from functions newuser, useredit and main */ -/****************************************************************************/ -void putuserdat(user_t user) -{ - int i,file; - char userdat[U_LEN+1],str[U_LEN+1]; - node_t node; - -if(!user.number) { - errormsg(WHERE,ERR_CHK,"user number",0); - return; } -memset(userdat,ETX,U_LEN); -putrec(userdat,U_ALIAS,LEN_ALIAS+5,user.alias); -putrec(userdat,U_NAME,LEN_NAME,user.name); -putrec(userdat,U_HANDLE,LEN_HANDLE,user.handle); -putrec(userdat,U_HANDLE+LEN_HANDLE,2,crlf); - -putrec(userdat,U_NOTE,LEN_NOTE,user.note); -putrec(userdat,U_COMP,LEN_COMP,user.comp); -putrec(userdat,U_COMP+LEN_COMP,2,crlf); - -putrec(userdat,U_COMMENT,LEN_COMMENT,user.comment); -putrec(userdat,U_COMMENT+LEN_COMMENT,2,crlf); - -putrec(userdat,U_NETMAIL,LEN_NETMAIL,user.netmail); -putrec(userdat,U_NETMAIL+LEN_NETMAIL,2,crlf); - -putrec(userdat,U_ADDRESS,LEN_ADDRESS,user.address); -putrec(userdat,U_LOCATION,LEN_LOCATION,user.location); -putrec(userdat,U_ZIPCODE,LEN_ZIPCODE,user.zipcode); -putrec(userdat,U_ZIPCODE+LEN_ZIPCODE,2,crlf); - -putrec(userdat,U_PASS,LEN_PASS,user.pass); -putrec(userdat,U_PHONE,LEN_PHONE,user.phone); -putrec(userdat,U_BIRTH,LEN_BIRTH,user.birth); -putrec(userdat,U_MODEM,LEN_MODEM,user.modem); -putrec(userdat,U_LASTON,8,ultoa(user.laston,str,16)); -putrec(userdat,U_FIRSTON,8,ultoa(user.firston,str,16)); -putrec(userdat,U_EXPIRE,8,ultoa(user.expire,str,16)); -putrec(userdat,U_PWMOD,8,ultoa(user.pwmod,str,16)); -putrec(userdat,U_PWMOD+8,2,crlf); - -putrec(userdat,U_LOGONS,5,itoa(user.logons,str,10)); -putrec(userdat,U_LTODAY,5,itoa(user.ltoday,str,10)); -putrec(userdat,U_TIMEON,5,itoa(user.timeon,str,10)); -putrec(userdat,U_TEXTRA,5,itoa(user.textra,str,10)); -putrec(userdat,U_TTODAY,5,itoa(user.ttoday,str,10)); -putrec(userdat,U_TLAST,5,itoa(user.tlast,str,10)); -putrec(userdat,U_POSTS,5,itoa(user.posts,str,10)); -putrec(userdat,U_EMAILS,5,itoa(user.emails,str,10)); -putrec(userdat,U_FBACKS,5,itoa(user.fbacks,str,10)); -putrec(userdat,U_ETODAY,5,itoa(user.etoday,str,10)); -putrec(userdat,U_PTODAY,5,itoa(user.ptoday,str,10)); -putrec(userdat,U_PTODAY+5,2,crlf); - -putrec(userdat,U_ULB,10,ultoa(user.ulb,str,10)); -putrec(userdat,U_ULS,5,itoa(user.uls,str,10)); -putrec(userdat,U_DLB,10,ultoa(user.dlb,str,10)); -putrec(userdat,U_DLS,5,itoa(user.dls,str,10)); -putrec(userdat,U_CDT,10,ultoa(user.cdt,str,10)); -putrec(userdat,U_MIN,10,ultoa(user.min,str,10)); -putrec(userdat,U_MIN+10,2,crlf); - -putrec(userdat,U_LEVEL,2,itoa(user.level,str,10)); -putrec(userdat,U_FLAGS1,8,ultoa(user.flags1,str,16)); -putrec(userdat,U_TL,2,nulstr); /* unused */ -putrec(userdat,U_FLAGS2,8,ultoa(user.flags2,str,16)); -putrec(userdat,U_EXEMPT,8,ultoa(user.exempt,str,16)); -putrec(userdat,U_REST,8,ultoa(user.rest,str,16)); -putrec(userdat,U_REST+8,2,crlf); - -putrec(userdat,U_ROWS,2,itoa(user.rows,str,10)); -userdat[U_SEX]=user.sex; -userdat[U_PROT]=user.prot; -putrec(userdat,U_MISC,8,ultoa(user.misc,str,16)); -putrec(userdat,U_LEECH,2,itoa(user.leech,str,16)); - -putrec(userdat,U_CURSUB,8,user.cursub); -putrec(userdat,U_CURDIR,8,user.curdir); - -// putrec(userdat,U_CMDSET,2,itoa(user.cmdset,str,16)); /* Unused */ -putrec(userdat,U_CMDSET+2,2,crlf); - -putrec(userdat,U_XFER_CMD+LEN_XFER_CMD,2,crlf); - -putrec(userdat,U_MAIL_CMD+LEN_MAIL_CMD,2,crlf); - -putrec(userdat,U_FREECDT,10,ultoa(user.freecdt,str,10)); - -putrec(userdat,U_FLAGS3,8,ultoa(user.flags3,str,16)); -putrec(userdat,U_FLAGS4,8,ultoa(user.flags4,str,16)); - -if(user.xedit) - putrec(userdat,U_XEDIT,8,xedit[user.xedit-1]->code); -else - putrec(userdat,U_XEDIT,8,nulstr); - -putrec(userdat,U_SHELL,8,shell[user.shell]->code); - -putrec(userdat,U_QWK,8,ultoa(user.qwk,str,16)); -putrec(userdat,U_TMPEXT,3,user.tmpext); -putrec(userdat,U_CHAT,8,ultoa(user.chat,str,16)); -putrec(userdat,U_NS_TIME,8,ultoa(user.ns_time,str,16)); - -putrec(userdat,U_UNUSED,29,crlf); -putrec(userdat,U_UNUSED+29,2,crlf); - -sprintf(str,"%sUSER\\USER.DAT",data_dir); -if((file=nopen(str,O_WRONLY|O_CREAT|O_DENYNONE))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_DENYNONE); - return; } - -/*** This shouldn't be necessary -if(filelength(file)<(long)((long)user.number*U_LEN)) - lseek(file,0L,SEEK_END); -else -***/ - -lseek(file,(long)((long)((long)user.number-1)*U_LEN),SEEK_SET); - -i=0; -while(i<LOOP_NODEDAB - && lock(file,(long)((long)(user.number-1)*U_LEN),U_LEN)==-1) { - if(i>10) - mswait(55); - i++; } - -if(i>=LOOP_NODEDAB) { - close(file); - errormsg(WHERE,ERR_LOCK,"USER.DAT",user.number); - return; } - -if(write(file,userdat,U_LEN)!=U_LEN) { - unlock(file,(long)((long)(user.number-1)*U_LEN),U_LEN); - close(file); - errormsg(WHERE,ERR_WRITE,str,U_LEN); - return; } -unlock(file,(long)((long)(user.number-1)*U_LEN),U_LEN); -close(file); -for(i=1;i<=sys_nodes;i++) { /* instant user data update */ - if(i==node_num) - continue; - getnodedat(i,&node,0); - if(node.useron==user.number && (node.status==NODE_INUSE - || node.status==NODE_QUIET)) { - getnodedat(i,&node,1); - node.misc|=NODE_UDAT; - putnodedat(i,node); - break; } } -} - - -/****************************************************************************/ -/* Puts 'name' into slot 'number' in USER\\NAME.DAT */ -/****************************************************************************/ -void putusername(int number, char *name) -{ - char str[256]; - int file; - long length,l; - -sprintf(str,"%sUSER\\NAME.DAT",data_dir); -if((file=nopen(str,O_RDWR|O_CREAT))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT); - return; } -length=filelength(file); -if(length && length%(LEN_ALIAS+2)) { - close(file); - errormsg(WHERE,ERR_LEN,str,length); - return; } -if(length<(((long)number-1)*(LEN_ALIAS+2))) { - sprintf(str,"%*s",LEN_ALIAS,nulstr); - strset(str,ETX); - strcat(str,crlf); - lseek(file,0L,SEEK_END); - while(filelength(file)<((long)number*(LEN_ALIAS+2))) - write(file,str,(LEN_ALIAS+2)); } -lseek(file,(long)(((long)number-1)*(LEN_ALIAS+2)),SEEK_SET); -putrec(str,0,LEN_ALIAS,name); -putrec(str,LEN_ALIAS,2,crlf); -write(file,str,LEN_ALIAS+2); -close(file); -} - -/****************************************************************************/ -/* Fills the 'ptr' element of the each element of the sub[] array of sub_t */ -/* and the sub_misc and sub_ptr global variables */ -/* Called from function main */ -/****************************************************************************/ -void getmsgptrs() -{ - char str[256]; - ushort ch; - uint i; - int file; - long length; - FILE *stream; - -now=time(NULL); -if(!useron.number) - return; -bputs(text[LoadingMsgPtrs]); -sprintf(str,"%sUSER\\PTRS\\%4.4u.IXB",data_dir,useron.number); -if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - for(i=0;i<total_subs;i++) { - sub_ptr[i]=sub[i]->ptr=sub_last[i]=sub[i]->last=0; - if(sub[i]->misc&SUB_NSDEF) - sub[i]->misc|=SUB_NSCAN; - else - sub[i]->misc&=~SUB_NSCAN; - if(sub[i]->misc&SUB_SSDEF) - sub[i]->misc|=SUB_SSCAN; - else - sub[i]->misc&=~SUB_SSCAN; - sub_misc[i]=sub[i]->misc; } - bputs(text[LoadedMsgPtrs]); - return; } -length=filelength(file); -for(i=0;i<total_subs;i++) { - if(length<(sub[i]->ptridx+1)*10L) { - sub[i]->ptr=sub[i]->last=0L; - if(sub[i]->misc&SUB_NSDEF) - sub[i]->misc|=SUB_NSCAN; - else - sub[i]->misc&=~SUB_NSCAN; - if(sub[i]->misc&SUB_SSDEF) - sub[i]->misc|=SUB_SSCAN; - else - sub[i]->misc&=~SUB_SSCAN; } - else { - fseek(stream,(long)sub[i]->ptridx*10L,SEEK_SET); - fread(&sub[i]->ptr,4,1,stream); - fread(&sub[i]->last,4,1,stream); - fread(&ch,2,1,stream); - if(ch&5) /* Either bit 0 or 2 */ - sub[i]->misc|=SUB_NSCAN; - else - sub[i]->misc&=~SUB_NSCAN; - if(ch&2) - sub[i]->misc|=SUB_SSCAN; - else - sub[i]->misc&=~SUB_SSCAN; - if(ch&0x100) - sub[i]->misc|=SUB_YSCAN; - else - sub[i]->misc&=~SUB_YSCAN; } - sub_ptr[i]=sub[i]->ptr; - sub_last[i]=sub[i]->last; - sub_misc[i]=sub[i]->misc; } -fclose(stream); -bputs(text[LoadedMsgPtrs]); -} - -/****************************************************************************/ -/* Writes to DATA\USER\PTRS\xxxx.DAB the msgptr array for the current user */ -/* Called from functions main and newuser */ -/****************************************************************************/ -void putmsgptrs() -{ - char str[256]; - ushort idx,ch; - uint i,j; - int file; - ulong l=0L,length; - -if(!useron.number) - return; -sprintf(str,"%sUSER\\PTRS\\%4.4u.IXB",data_dir,useron.number); -if((file=nopen(str,O_WRONLY|O_CREAT))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT); - return; } -length=filelength(file); -for(i=0;i<total_subs;i++) { - if(sub[i]->ptr==sub_ptr[i] && sub[i]->last==sub_last[i] - && length>=((long)(sub[i]->ptridx+1)*10) - && ((sub[i]->misc&(SUB_NSCAN|SUB_SSCAN|SUB_YSCAN)) - ==(sub_misc[i]&(SUB_NSCAN|SUB_SSCAN|SUB_YSCAN)))) - continue; - while(filelength(file)<(long)(sub[i]->ptridx)*10) { - lseek(file,0L,SEEK_END); - idx=tell(file)/10; - for(j=0;j<total_subs;j++) - if(sub[j]->ptridx==idx) - break; - write(file,&l,4); - write(file,&l,4); - ch=0xff; /* default to scan ON for new sub */ - if(j<total_subs) { - if(!(sub[j]->misc&SUB_NSCAN)) - ch&=~5; - if(!(sub[j]->misc&SUB_SSCAN)) - ch&=~2; - if(sub[j]->misc&SUB_YSCAN) - ch|=0x100; } - write(file,&ch,2); } - lseek(file,(long)((long)(sub[i]->ptridx)*10),SEEK_SET); - write(file,&(sub[i]->ptr),4); - write(file,&(sub[i]->last),4); - ch=0xff; - if(!(sub[i]->misc&SUB_NSCAN)) - ch&=~5; - if(!(sub[i]->misc&SUB_SSCAN)) - ch&=~2; - if(sub[i]->misc&SUB_YSCAN) - ch|=0x100; - write(file,&ch,2); } -close(file); -if(!flength(str)) /* Don't leave 0 byte files */ - remove(str); -} - -/****************************************************************************/ -/* Checks for a duplicate user filed starting at user record offset */ -/* 'offset', reading in 'datlen' chars, comparing to 'str' for each user */ -/* except 'usernumber' if it is non-zero. Comparison is NOT case sensitive. */ -/* del is 1 if the search is to included deleted/inactive users 0 otherwise */ -/* Returns the usernumber of the dupe if found, 0 if not */ -/****************************************************************************/ -uint userdatdupe(uint usernumber, uint offset, uint datlen, char *dat - , char del) -{ - char str[256]; - int i,file; - long l,length; - -truncsp(dat); -sprintf(str,"%sUSER\\USER.DAT",data_dir); -if((file=nopen(str,O_RDONLY|O_DENYNONE))==-1) - return(0); -length=filelength(file); -bputs(text[SearchingForDupes]); -for(l=0;l<length && online;l+=U_LEN) { - checkline(); - if(usernumber && l/U_LEN==usernumber-1) - continue; - lseek(file,l+offset,SEEK_SET); - i=0; - while(i<LOOP_NODEDAB && lock(file,l,U_LEN)==-1) { - if(i>10) - mswait(55); - i++; } - - if(i>=LOOP_NODEDAB) { - close(file); - errormsg(WHERE,ERR_LOCK,"USER.DAT",l); - return(0); } - - read(file,str,datlen); - for(i=0;i<datlen;i++) - if(str[i]==ETX) break; - str[i]=0; - truncsp(str); - if(!stricmp(str,dat)) { - if(!del) { /* Don't include deleted users in search */ - lseek(file,l+U_MISC,SEEK_SET); - read(file,str,8); - getrec(str,0,8,str); - if(ahtoul(str)&(DELETED|INACTIVE)) { - unlock(file,l,U_LEN); - continue; } } - unlock(file,l,U_LEN); - close(file); - bputs(text[SearchedForDupes]); - return((l/U_LEN)+1); } - else - unlock(file,l,U_LEN); } -close(file); -bputs(text[SearchedForDupes]); -return(0); -} - - -/****************************************************************************/ -/* Removes any files in the user transfer index (XFER.IXT) that match the */ -/* specifications of dest, or source user, or filename or any combination. */ -/****************************************************************************/ -void rmuserxfers(int fromuser, int destuser, char *fname) -{ - char str[256],*ixtbuf; - int file; - long l,length; - -sprintf(str,"%sXFER.IXT",data_dir); -if(!fexist(str)) - return; -if(!flength(str)) { - remove(str); - return; } -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -length=filelength(file); -if((ixtbuf=(char *)MALLOC(length))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - return; } -if(read(file,ixtbuf,length)!=length) { - close(file); - FREE(ixtbuf); - errormsg(WHERE,ERR_READ,str,length); - return; } -close(file); -if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) { - FREE(ixtbuf); - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC); - return; } -for(l=0;l<length;l+=24) { - if(fname!=NULL && fname[0]) { /* fname specified */ - if(!strncmp(ixtbuf+l+5,fname,12)) { /* this is the file */ - if(destuser && fromuser) { /* both dest and from user */ - if(atoi(ixtbuf+l)==destuser && atoi(ixtbuf+l+18)==fromuser) - continue; } /* both match */ - else if(fromuser) { /* from user */ - if(atoi(ixtbuf+l+18)==fromuser) /* matches */ - continue; } - else if(destuser) { /* dest user */ - if(atoi(ixtbuf+l)==destuser) /* matches */ - continue; } - else continue; } } /* no users, so match */ - else if(destuser && fromuser) { - if(atoi(ixtbuf+l+18)==fromuser && atoi(ixtbuf+l)==destuser) - continue; } - else if(destuser && atoi(ixtbuf+l)==destuser) - continue; - else if(fromuser && atoi(ixtbuf+l+18)==fromuser) - continue; - write(file,ixtbuf+l,24); } -close(file); -FREE(ixtbuf); -} - diff --git a/src/sbbs2/dcdwatch/dcdwatch.c b/src/sbbs2/dcdwatch/dcdwatch.c deleted file mode 100644 index 6ee6a3fa42..0000000000 --- a/src/sbbs2/dcdwatch/dcdwatch.c +++ /dev/null @@ -1,102 +0,0 @@ -/* DCDWATCH.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Program to execute another program, but terminate if carrier detect is */ -/* lost */ - -/* Compile small memory model */ - -#include <stdio.h> -#include <stdlib.h> -#include <process.h> -#include <dos.h> -#include <io.h> -#include <alloc.h> - -extern unsigned _heaplen=2048; - -#define uint unsigned int - -#pragma warn -par - -char hungup=0; -uint far *msr; - -void interrupt (*old_int21)(void); - -struct REGPACK r; - -void interrupt new_int21(uint bp, uint di, uint si, uint ds, uint es, - uint dx, uint cx, uint bx, uint ax, uint ip, uint cs, uint flags) -{ - -r.r_ax=ax; -r.r_bx=bx; -r.r_cx=cx; -r.r_dx=dx; -r.r_bp=bp; -r.r_si=si; -r.r_di=di; -r.r_flags=flags; -r.r_ds=ds; -r.r_es=es; - -intr(0xaa,&r); - -ax=r.r_ax; -bx=r.r_bx; -cx=r.r_cx; -dx=r.r_dx; -bp=r.r_bp; -si=r.r_si; -di=r.r_di; -flags=r.r_flags; -ds=r.r_ds; -es=r.r_es; - -if(!(*(msr)&0x8000) && !hungup) { - hungup=1; - r.r_ax=0x4c00; - intr(0xaa,&r); } /* so exit */ -} - -#pragma warn +par - - -int main(int argc, char **argv) -{ - char str[256],*arg[30],*comspec; - int i; - FILE *stream; - -if(argc<3) { - printf("usage: %%!dcdwatch %%& <program> <arguments>\n"); - exit(1) ;} - -msr=(uint far *)atol(argv[1]); - -if((stream=fopen("INTRSBBS.DAT","r"))!=NULL) { - fgets(str,81,stream); - msr=(uint far *)atol(str); - fclose(stream); - remove("INTRSBBS.DAT"); } - -if(msr) { - old_int21=getvect(0x21); - setvect(0xAA,old_int21); - setvect(0x21,new_int21); } - -comspec=getenv("COMSPEC"); - -arg[0]=comspec; -arg[1]="/c"; -for(i=2;i<30;i++) - arg[i]=argv[i]; - -i=spawnvp(P_WAIT,arg[0],arg); - -if(msr) - setvect(0x21,old_int21); -return(i); -} diff --git a/src/sbbs2/delfiles/delfiles.c b/src/sbbs2/delfiles/delfiles.c deleted file mode 100644 index e4f45ffe7d..0000000000 --- a/src/sbbs2/delfiles/delfiles.c +++ /dev/null @@ -1,763 +0,0 @@ -#line 1 "DELFILES.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -#define DELFILES_VER "1.01" - -char tmp[256]; - -#define MAX_NOTS 25 - -#define ALL (1L<<0) -#define OFFLINE (1L<<1) -#define NO_LINK (1L<<2) -#define REPORT (1L<<3) - -void bail(int code) -{ -exit(code); -} - -long lputs(char FAR16 *str) -{ - char tmp[256]; - int i,j,k; - -j=strlen(str); -for(i=k=0;i<j;i++) /* remove CRs */ - if(str[i]==CR && str[i+1]==LF) - continue; - else - tmp[k++]=str[i]; -tmp[k]=0; -return(fputs(tmp,stdout)); -} - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) -{ - va_list argptr; - char sbuf[256]; - int chcount; - -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - int c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is aREADy open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access==O_RDONLY) share=SH_DENYWR; - else share=SH_DENYRW; -while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(((*file)=nopen(str,access))==-1) { - printf("nopen -1\n"); - return(NULL); } - -if(access&O_APPEND) { - if(access&O_RDONLY) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&O_WRONLY) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - printf("fdopen NULL mode='%s'\n",mode); - close(*file); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,16*1024); -return(stream); -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct find_t f; - uint i; - -i=_dos_findfirst(filespec,_A_NORMAL,&f); -#ifdef __WATCOMC__ -_dos_findclose(&f); -#endif -if(!i) - return(1); -return(0); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct find_t f; - uint i; - -i=_dos_findfirst(filespec,_A_NORMAL,&f); -#ifdef __WATCOMC__ -_dos_findclose(&f); -#endif -if(!i) - return(f.size); -return(-1L); -} - -#ifndef __FLAT__ -/****************************************************************************/ -/* This function reads files that are potentially larger than 32k. */ -/* Up to one megabyte of data can be read with each call. */ -/****************************************************************************/ -long lread(int file, char HUGE16 *buf,long bytes) -{ - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(read(file,(char *)buf,32767)!=32767) - return(-1L); -if(read(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} - -/****************************************************************************/ -/* This function writes files that are potentially larger than 32767 bytes */ -/* Up to one megabytes of data can be written with each call. */ -/****************************************************************************/ -long lwrite(int file, char HUGE16 *buf, long bytes) -{ - - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(write(file,(char *)buf,32767)!=32767) - return(-1L); -if(write(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} -#endif - -/****************************************************************************/ -/* Removes any files in the user transfer index (XFER.IXT) that match the */ -/* specifications of dest, or source user, or filename or any combination. */ -/****************************************************************************/ -void rmuserxfers(int fromuser, int destuser, char *fname) -{ - char str[256],*ixtbuf; - int file; - long l,length; - -sprintf(str,"%sXFER.IXT",data_dir); -if(!fexist(str)) - return; -if(!flength(str)) { - remove(str); - return; } -if((file=nopen(str,O_RDONLY))==-1) { - printf("ERROR opening %s\r\n",str); - return; } -length=filelength(file); -if((ixtbuf=(char *)MALLOC(length))==NULL) { - close(file); - printf("ERROR allocating %lu bytes for %s\r\n",length,str); - return; } -if(read(file,ixtbuf,length)!=length) { - close(file); - FREE(ixtbuf); - printf("ERROR reading %lu bytes from %s\r\n",length,str); - return; } -close(file); -if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) { - FREE(ixtbuf); - printf("ERROR opening %s\r\n",str); - return; } -for(l=0;l<length;l+=24) { - if(fname!=NULL && fname[0]) { /* fname specified */ - if(!strncmp(ixtbuf+l+5,fname,12)) { /* this is the file */ - if(destuser && fromuser) { /* both dest and from user */ - if(atoi(ixtbuf+l)==destuser && atoi(ixtbuf+l+18)==fromuser) - continue; } /* both match */ - else if(fromuser) { /* from user */ - if(atoi(ixtbuf+l+18)==fromuser) /* matches */ - continue; } - else if(destuser) { /* dest user */ - if(atoi(ixtbuf+l)==destuser) /* matches */ - continue; } - else continue; } } /* no users, so match */ - else if(destuser && fromuser) { - if(atoi(ixtbuf+l+18)==fromuser && atoi(ixtbuf+l)==destuser) - continue; } - else if(destuser && atoi(ixtbuf+l)==destuser) - continue; - else if(fromuser && atoi(ixtbuf+l+18)==fromuser) - continue; - write(file,ixtbuf+l,24); } -close(file); -FREE(ixtbuf); -} - -/****************************************************************************/ -/* Removes DAT and IXB entries for the file in the struct 'f' */ -/****************************************************************************/ -void removefiledat(file_t f) -{ - char c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13]; - int file; - ulong l,length; - -strcpy(fname,f.name); -for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[c]=fname[c+1]; -sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_RDONLY))==-1) { - printf("ERROR opening %s\r\n",str); - return; } -length=filelength(file); -if(!length) { - close(file); - return; } -if((ixbbuf=(char *)MALLOC(length))==0) { - close(file); - printf("ERROR allocating %lu bytes for %s\r\n",length,str); - return; } -if(lread(file,ixbbuf,length)!=length) { - close(file); - printf("ERROR reading %lu bytes from %s\r\n",length,str); - FREE((char *)ixbbuf); - return; } -close(file); -if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) { - printf("ERROR opening %s\r\n",str); - return; } -for(l=0;l<length;l+=F_IXBSIZE) { - for(c=0;c<11;c++) - ixbname[c]=ixbbuf[l+c]; - ixbname[c]=0; - if(strcmp(ixbname,fname)) - if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) { - close(file); - printf("ERROR writing %lu bytes to %s\r\n",F_IXBSIZE,str); - FREE((char *)ixbbuf); - return; } } -FREE((char *)ixbbuf); -close(file); -sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_WRONLY))==-1) { - printf("ERROR opening %s\r\n",str); - return; } -lseek(file,f.datoffset,SEEK_SET); -c=ETX; /* If first char of record is ETX, record is unused */ -if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */ - close(file); - printf("ERROR writing to %s\r\n",str); - return; } -close(file); -if(f.dir==user_dir) /* remove file from index */ - rmuserxfers(0,0,f.name); -} - -/****************************************************************************/ -/* Places into 'strout' CR or ETX terminated string starting at */ -/* 'start' and ending at 'start'+'length' or terminator from 'strin' */ -/****************************************************************************/ -void getrec(char *strin,int start,int length,char *strout) -{ - int i=0,stop; - -stop=start+length; -while(start<stop) { - if(strin[start]==ETX) - break; - strout[i++]=strin[start++]; } -strout[i]=0; -} - -/****************************************************************************/ -/* Turns FILE .EXT into FILE.EXT */ -/****************************************************************************/ -char *unpadfname(char *filename, char *str) -{ - char c,d; - -for(c=0,d=0;c<strlen(filename);c++) - if(filename[c]!=SP) str[d++]=filename[c]; -str[d]=0; -return(str); -} - -/****************************************************************************/ -/* Returns the time/date of the file in 'filespec' in time_t (unix) format */ -/****************************************************************************/ -long fdate(char *filespec) -{ - int file; -#ifdef __WATCOMC__ - unsigned short ft,fd; -#else - unsigned ft,fd; -#endif - struct tm t; - -if((file=nopen(filespec,O_RDONLY))==-1) - return(0); -_dos_getftime(file,&fd,&ft); -close(file); -memset(&t,0,sizeof(t)); -t.tm_year=((fd&0xfe00)>>9)+80; -t.tm_mon=((fd&0x01e0)>>5)-1; -t.tm_mday=fd&0x1f; -t.tm_hour=(ft&0xf800)>>11; -t.tm_min=(ft&0x07e0)>>5; -t.tm_sec=(ft&0x001f)<<1; -return(mktime(&t)); -} - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -uint hptoi(char *str) -{ - char tmp[128]; - uint i; - -if(!str[1] || toupper(str[0])<='F') - return(ahtoul(str)); -strcpy(tmp,str); -tmp[0]='F'; -i=ahtoul(tmp)+((toupper(str[0])-'F')*0x10); -return(i); -} - -/****************************************************************************/ -/* Gets filedata from dircode.DAT file */ -/* Need fields .name ,.dir and .offset to get other info */ -/* Does not fill .dateuled or .datedled fields. */ -/****************************************************************************/ -void getfiledat(file_t *f) -{ - char buf[F_LEN+1],str[256],tmp[256]; - int file; - long length; - -sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_RDONLY))==-1) { - printf("ERROR opening %s\r\n",str); - return; } -length=filelength(file); -if(f->datoffset>length) { - close(file); - printf("ERROR %s filelength %ld is less than offset\r\n",str,length); - return; } -if(length%F_LEN) { - close(file); - printf("ERROR %s filelength %ld is not evenly divisible\r\n",str,length); - return; } -lseek(file,f->datoffset,SEEK_SET); -if(read(file,buf,F_LEN)!=F_LEN) { - close(file); - printf("ERROR reading %ld bytes from %s\r\n",F_LEN,str); - return; } -close(file); -getrec(buf,F_ALTPATH,2,str); -f->altpath=hptoi(str); -getrec(buf,F_CDT,7,str); -f->cdt=atol(str); - -if(!f->size) { /* only read disk if this is null */ - if(dir[f->dir]->misc&DIR_FCHK) { - sprintf(str,"%s%s" - ,f->altpath>0 && f->altpath<=altpaths ? altpath[f->altpath-1] - : dir[f->dir]->path,unpadfname(f->name,tmp)); - f->size=flength(str); - f->date=fdate(str); } - else { - f->size=f->cdt; - f->date=0; } } -//if((f->size>0L) && cur_cps) -// f->timetodl=(f->size/(ulong)cur_cps); -//else - f->timetodl=0; - -getrec(buf,F_DESC,LEN_FDESC,f->desc); -getrec(buf,F_ULER,LEN_ALIAS,f->uler); -getrec(buf,F_TIMESDLED,5,str); -f->timesdled=atoi(str); -getrec(buf,F_OPENCOUNT,3,str); -f->opencount=atoi(str); -if(buf[F_MISC]!=ETX) - f->misc=buf[F_MISC]-SP; -else - f->misc=0; -} - -/****************************************************************************/ -/* Checks directory data file for 'filename' (must be padded). If found, */ -/* it returns the 1, else returns 0. */ -/* Called from upload and bulkupload */ -/****************************************************************************/ -char findfile(uint dirnum, char *filename) -{ - char str[256],c,fname[128],HUGE16 *ixbbuf; - int file; - ulong length,l; - -strcpy(fname,filename); -for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[c]=fname[c+1]; -sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_RDONLY))==-1) return(0); -length=filelength(file); -if(!length) { - close(file); - return(0); } -if((ixbbuf=(char *)MALLOC(length))==NULL) { - close(file); - printf("ERR_ALLOC %s %lu\n",str,length); - return(0); } -if(lread(file,ixbbuf,length)!=length) { - close(file); - FREE((char *)ixbbuf); - return(0); } -close(file); -for(l=0;l<length;l+=F_IXBSIZE) { - for(c=0;c<11;c++) - if(fname[c]!=ixbbuf[l+c]) break; - if(c==11) break; } -FREE((char *)ixbbuf); -if(l<length) - return(1); -return(0); -} - -/****************************************************************************/ -/* Turns FILE.EXT into FILE .EXT */ -/* Called from upload */ -/****************************************************************************/ -char *padfname(char *filename, char *str) -{ - char c,d; - -for(c=0;c<8;c++) - if(filename[c]=='.' || !filename[c]) break; - else str[c]=filename[c]; -d=c; -if(filename[c]=='.') c++; -while(d<8) - str[d++]=SP; -str[d++]='.'; -while(d<12) - if(!filename[c]) break; - else str[d++]=filename[c++]; -while(d<12) - str[d++]=SP; -str[d]=0; -return(str); -} - -void main(int argc, char **argv) -{ - char str[256],fname[256],not[MAX_NOTS][9],nots=0,*p; - uchar HUGE16 *ixbbuf; - int i,j,dirnum,libnum,file; - ulong l,m,n,length; - long misc=0; - time_t now; - read_cfg_text_t txt; - file_t workfile; - struct find_t ff; - -putenv("TZ=UCT0"); -_fmode=O_BINARY; -setvbuf(stdout,NULL,_IONBF,0); - -fprintf(stderr,"\nDELFILES Version %s (%s) - Removes files from Synchronet " - "Filebase\n" - ,DELFILES_VER -#if defined(__OS2__) - ,"OS/2" -#elif defined(__NT__) - ,"Win32" -#elif defined(__DOS4G__) - ,"DOS4G" -#elif defined(__FLAT__) - ,"DOS32" -#else - ,"DOS16" -#endif - ); - -if(argc<2) { - printf("\n usage: DELFILES <dir_code or * for ALL> [switches]\n"); - printf("\nswitches: /LIB name All directories of specified library\n"); - printf(" /NOT code Exclude specific directory\n"); - printf(" /OFF Remove files that are offline " - "(don't exist on disk)\n"); - printf(" /NOL Remove files with no link " - "(don't exist in database)\n"); - printf(" /RPT Report findings only " - "(don't delete any files)\n"); - exit(0); } - -p=getenv("SBBSNODE"); -if(p==NULL) { - printf("\nSBBSNODE environment variable not set.\n"); - printf("\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n"); - exit(1); } - -putenv("TZ=UCT0"); - -strcpy(node_dir,p); -if(node_dir[strlen(node_dir)-1]!='\\') - strcat(node_dir,"\\"); - -txt.openerr="\7\nError opening %s for read.\n"; -txt.reading="\nReading %s..."; -txt.readit="\rRead %s "; -txt.allocerr="\7\nError allocating %u bytes of memory\n"; -txt.error="\7\nERROR: Offset %lu in %s\r\n\n"; - -read_node_cfg(txt); -if(ctrl_dir[0]=='.') { /* Relative path */ - strcpy(str,ctrl_dir); - sprintf(ctrl_dir,"%s%s",node_dir,str); } -read_main_cfg(txt); -if(data_dir[0]=='.') { /* Relative path */ - strcpy(str,data_dir); - sprintf(data_dir,"%s%s",node_dir,str); } -if(temp_dir[1]!=':' && temp_dir[0]!='\\') { - strcpy(str,temp_dir); - sprintf(temp_dir,"%s%s",node_dir,str); } -read_file_cfg(txt); -printf("\n\n"); - -dirnum=libnum=-1; -if(argv[1][0]=='*') - misc|=ALL; -else if(argv[1][0]!='/') { - strupr(argv[1]); - for(i=0;i<total_dirs;i++) - if(!stricmp(argv[1],dir[i]->code)) - break; - if(i>=total_dirs) { - printf("\nDirectory code '%s' not found.\n",argv[1]); - exit(1); } - dirnum=i; } -for(i=1;i<argc;i++) { - if(!stricmp(argv[i],"/LIB")) { - if(dirnum!=-1) { - printf("\nBoth directory code and /LIB parameters were used.\n"); - exit(1); } - i++; - if(i>=argc) { - printf("\nLibrary short name must follow /LIB parameter.\n"); - exit(1); } - strupr(argv[i]); - for(j=0;j<total_libs;j++) - if(!stricmp(lib[j]->sname,argv[i])) - break; - if(j>=total_libs) { - printf("\nLibrary short name '%s' not found.\n",argv[i]); - exit(1); } - libnum=j; } - else if(!stricmp(argv[i],"/NOT")) { - if(nots>=MAX_NOTS) { - printf("\nMaximum number of /NOT options (%u) exceeded.\n" - ,MAX_NOTS); - exit(1); } - i++; - if(i>=argc) { - printf("\nDirectory internal code must follow /NOT parameter.\n"); - exit(1); } - sprintf(not[nots++],"%.8s",argv[i]); } - else if(!stricmp(argv[i],"/OFF")) - misc|=OFFLINE; - else if(!stricmp(argv[i],"/NOL")) - misc|=NO_LINK; - else if(!stricmp(argv[i],"/RPT")) - misc|=REPORT; - else if(!stricmp(argv[i],"/ALL")) { - if(dirnum!=-1) { - printf("\nBoth directory code and /ALL parameters were used.\n"); - exit(1); } - if(libnum!=-1) { - printf("\nBoth library name and /ALL parameters were used.\n"); - exit(1); } - misc|=ALL; } } - -for(i=0;i<total_dirs;i++) { - if(!(misc&ALL) && i!=dirnum && dir[i]->lib!=libnum) - continue; - for(j=0;j<nots;j++) - if(!stricmp(not[j],dir[i]->code)) - break; - if(j<nots) - continue; - - if(misc&NO_LINK && dir[i]->misc&DIR_FCHK) { - strcpy(tmp,dir[i]->path); - if(tmp[0]=='.') { - sprintf(str,"%s%s",node_dir,tmp); - strcpy(tmp,str); } - sprintf(str,"%s*.*",tmp); - printf("\nSearching %s for unlinked files\n",str); - for(j=_dos_findfirst(str,_A_NORMAL,&ff);!j - ;j=_dos_findnext(&ff)) { - strupr(ff.name); - padfname(ff.name,str); - if(!findfile(i,str)) { - sprintf(str,"%s%s",tmp,ff.name); - printf("Removing %s (not in database)\n",ff.name); - if(!(misc&REPORT) && remove(str)) - printf("Error removing %s\n",str); } } -#ifdef __WATCOMC__ - _dos_findclose(&ff); -#endif - } - - if(!dir[i]->maxage && !(misc&OFFLINE)) - continue; - - printf("\nScanning %s %s\n",lib[dir[i]->lib]->sname,dir[i]->lname); - - sprintf(str,"%s%s.IXB",dir[i]->data_dir,dir[i]->code); - if((file=nopen(str,O_RDONLY))==-1) - continue; - l=filelength(file); - if(!l) { - close(file); - continue; } - if((ixbbuf=(char *)MALLOC(l))==NULL) { - close(file); - printf("\7ERR_ALLOC %s %lu\n",str,l); - continue; } - if(read(file,ixbbuf,l)!=l) { - close(file); - printf("\7ERR_READ %s %lu\n",str,l); - FREE((char *)ixbbuf); - continue; } - close(file); - - m=0L; - now=time(NULL); - while(m<l) { - memset(&workfile,0,sizeof(file_t)); - for(j=0;j<12 && m<l;j++) - if(j==8) - fname[j]='.'; - else - fname[j]=ixbbuf[m++]; - fname[j]=0; - strcpy(workfile.name,fname); - unpadfname(workfile.name,fname); - workfile.dir=i; - sprintf(str,"%s%s" - ,workfile.altpath>0 && workfile.altpath<=altpaths - ? altpath[workfile.altpath-1] - : dir[workfile.dir]->path,fname); - if(str[0]=='.') { - sprintf(tmp,"%s%s",node_dir,str); - strcpy(str,tmp); } - workfile.datoffset=ixbbuf[m]|((long)ixbbuf[m+1]<<8) - |((long)ixbbuf[m+2]<<16); - workfile.dateuled=(ixbbuf[m+3]|((long)ixbbuf[m+4]<<8) - |((long)ixbbuf[m+5]<<16)|((long)ixbbuf[m+6]<<24)); - workfile.datedled=(ixbbuf[m+7]|((long)ixbbuf[m+8]<<8) - |((long)ixbbuf[m+9]<<16)|((long)ixbbuf[m+10]<<24)); - m+=11; - if(dir[i]->maxage && dir[i]->misc&DIR_SINCEDL && workfile.datedled - && (now-workfile.datedled)/86400L>dir[i]->maxage) { - printf("Deleting %s (%ld days since last download)\n",fname - ,(now-workfile.datedled)/86400L); - getfiledat(&workfile); - if(!(misc&REPORT)) { - removefiledat(workfile); - if(remove(str)) - printf("Error removing %s\n",str); } } - else if(dir[i]->maxage - && !(workfile.datedled && dir[i]->misc&DIR_SINCEDL) - && (now-workfile.dateuled)/86400L>dir[i]->maxage) { - printf("Deleting %s (uploaded %ld days ago)\n",fname - ,(now-workfile.dateuled)/86400L); - getfiledat(&workfile); - if(!(misc&REPORT)) { - removefiledat(workfile); - if(remove(str)) - printf("Error removing %s\n",str); } } - else if(misc&OFFLINE && dir[i]->misc&DIR_FCHK && !fexist(str)) { - printf("Removing %s (doesn't exist)\n",fname); - getfiledat(&workfile); - if(!(misc&REPORT)) - removefiledat(workfile); } } - - FREE((char *)ixbbuf); } -} diff --git a/src/sbbs2/delfiles/makeall.bat b/src/sbbs2/delfiles/makeall.bat deleted file mode 100755 index d68900c3d3..0000000000 --- a/src/sbbs2/delfiles/makeall.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -wmake OS=DOS %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=DOSX %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=OS2 %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=NT %1 %2 %3 %4 %5 -if errorlevel 1 goto end -:end - diff --git a/src/sbbs2/delfiles/makefile b/src/sbbs2/delfiles/makefile deleted file mode 100644 index 4b9781ebda..0000000000 --- a/src/sbbs2/delfiles/makefile +++ /dev/null @@ -1,89 +0,0 @@ -############################################ -# Makefile for Synchronet DELFILES Utility # -# For use with Watcom C/C++ # -############################################ - -!ifndef OS -OS = DOS -!endif - -!ifeq OS DOS -CC = *wcc -!else -CC = *wcc386 -!endif - -LD = *wlink -INCLUDE = \watcom\h;\watcom\h\os2;..;..\smb;..\rio - - -!ifeq OS DOS -CFLAGS = -I$(INCLUDE) -s -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -ml -!else -CFLAGS = -I$(INCLUDE) -s -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -!endif - -!ifeq OS DOS -SYSTEM = DOS -!endif -!ifeq OS OS2 -SYSTEM = OS2V2 -!endif -!ifeq OS DOSX -SYSTEM = DOS4G -!endif -!ifeq OS NT -SYSTEM = NT -!endif - -LFLAGS = option stack=16k system $(SYSTEM) - -MAIN = $(OS)\delfiles.exe -OBJS = $(OS)\delfiles.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj & - $(OS)\ars.obj $(OS)\scfglib2.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\gen_defs.h ..\scfgvars.c - -# Implicit C Compile Rule -.c.obj: - @echo Compiling (I) $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... - $(LD) $(LFLAGS) file { $(OBJS) } - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# ARS -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Shared Functions -$(OS)\scfglib1.obj: ..\scfglib1.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) & --DNO_MSGS_CFG & --DNO_TEXT_CFG & --DNO_XTRN_CFG & --DNO_CMDS_CFG & --DNO_CHAT_CFG & -$[@ - -# Shared Functions -$(OS)\scfglib2.obj: ..\scfglib2.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) & --DNO_MSGS_CFG & --DNO_TEXT_CFG & --DNO_XTRN_CFG & --DNO_CMDS_CFG & --DNO_CHAT_CFG & -$[@ - diff --git a/src/sbbs2/delfiles/makefile.bc b/src/sbbs2/delfiles/makefile.bc deleted file mode 100644 index 2350abeb74..0000000000 --- a/src/sbbs2/delfiles/makefile.bc +++ /dev/null @@ -1,77 +0,0 @@ -############################################ -# Makefile for Synchronet ADDFILES Utility # -# For use with Borland C++ for DOS or OS/2 # -############################################ - -# Macros -CC = bcc -LD = tlink -!ifdef __OS2__ -OS = OS2 -INCLUDE = c:\bcos2\include;..;..\smb;..\rio -LIB = c:\bcos2\lib -CFLAGS = -N -d -C -I$(INCLUDE) -LFLAGS = -c -!else -OS = DOS -INCLUDE = \bc31\include;..;..\smb;..\rio -LIB = \bc31\lib -MODEL = l -CFLAGS = -N -d -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = -n -c -!endif -MAIN = $(OS)\delfiles.exe -OBJS = $(OS)\delfiles.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj \ - $(OS)\ars.obj $(OS)\scfglib2.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\gen_defs.h ..\scfgvars.c - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL).obj $(OBJS) -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# ARS -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Shared Functions -$(OS)\scfglib1.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib1.c ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_MSGS_CFG --DNO_TEXT_CFG --DNO_XTRN_CFG --DNO_CMDS_CFG --DNO_CHAT_CFG -! ..\$&.c - -# Shared Functions -$(OS)\scfglib2.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib2.c ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_MSGS_CFG --DNO_TEXT_CFG --DNO_XTRN_CFG --DNO_CMDS_CFG --DNO_CHAT_CFG -! ..\$&.c - diff --git a/src/sbbs2/dos/rciol.obj b/src/sbbs2/dos/rciol.obj deleted file mode 100644 index 9d4feb5ec5850d5991c8a550c0527ceac20db4a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9339 zcmZqRX5cJJ&dkrza}4%%nWoLaz~<r}<R2Qq;^G+M$l~np;>s1|?CI|lAL1Gj!Ws_} zWpncM4|Z`pH-n3T(Sd=1fq|WoQDg=?gU2c%Ru;x!5bM4I8#AN8EEWc)|IBd{#2FZv z*y3}tlZsN385r2&GxL)3bNzW3R!!h#U}R>CFUrhMDyU#!NQ0>?C@o2@Vq{>8&q>ZH zuei>@@Di#rJE^3yV7>x_;DjcKnaMfjmG?nr<|OA-RIUcI3Q9|gl~@?qLAn!Di~le{ zn3;K*Ah&`=ONyR@L^I1Wl1p-G`54$iZph5bi~(sY%FItL$@$2}z#gApT9TZf+rY!X z5nr5Il9X7Q!Xn7P5}#61)GNrq-NC}Zu!!;Ef*J;9P%t24X$DmWZ-!|MI*bua8(0!J z4+u4=I#@7xHx%$N2r(!!7%?1TT)@DvVF5#X<NyEc44j<*k+s9vaKZooUobN;z_|>Z zU={!Wi!-cV#K*u~!N9}7$iT?Jz`)3G3?$HkB(Mu4FoA(d0IFic50Jnl0l2`%rwjZU zn5QT(@-VRYOE567gAIohEKF>Stjz4W9*$1VF2$u@-aft#0cmh)tc)*nvKWr&GB7b+ zXF8(Kz{C{8e8iA}iK&PAh%o~b(^BRmrVLC>hnbI<GcYkdWIkfaz{K>6`G_?G6B9Gb z5nBc(CLWd}_6$r+k}O9Y8JL*lS&leEC|3yO4xv23M$cIApP7k)VaI==?i**t{v9Y` zJ;uhsAQ0O9rrV8;>q!aQg*P2)3=IEHRPxIiALzTWpoN9&Kq=D(3He0~3|sim3j8|* zlJBr%VA#TZR=~=PfuV?{%Z!0x3)5MFPB8`sqbCa(82%lIJ>8|oz|e4p@vK-Wv+;q` zHV;Zc#xofm09ob77R!C0lz9ik|Hq7{OZfsoYR`)8VBk5c7;!pa3;S6`t^=hkAUfhS zNPQUFzf&Dz3=9@x3=G9AU1AIj-EJKJPAp<z==#tFathN~0pkO)r=ga^>Co;sV4?0X zHm+}_EFdGGicarP;Ov%TVCdpwV9?@YV5ngGchKnVS%Jgf*cccXA)&$ma+Z}E14EHe zDgO>eHjqumC%eTM7|seD{>R3^aCip;ieM)nC>%h_K#D+)En+$=a5!uq1A{6%1M`P2 zk+{Pk@3^tqGBB31y<lK?$-n@zkfp?;!H$7}u}Hjx`6UB`O>_zSKRyPA*GdyW)__E$ zOT~;2EMj0-3`74wyw^1oY<SCEN;yE0$nZL5f(?5q&klAzkk8Hvy!M%3!&wq*!%@n& zfPsPQK#3pNP_qd(JYdUT+fA_Hg0Pe(z+7C+5%7Y6;RORj#1?P>?PO#)D*$rE7AAC$ zfkGVQdZv;?3m6zw*f(-$oiKX4LxCYMU=}E)M?`kXF)&!jF)$QedGz}A1sj8+Gd5Pm zN=E-d;yMOh7rNRR7?=)}aCALjI>2;*=?K%Ij&=ry*UN0IOL;*7!dlD%vikK@u>W>5 zFzn=KaJFE7@Vm5mHy?xcP3GJGmoqRpgRCfKeaXOJd>dq<4M(|0DSLw&14GB_$2N@R z0!8c%d<+a6udjiOVSjzzhNYAT<l+t<#zhPaulL)qmV#9@yxwBNUb+DyRREG&q9a$d zz=oqpT8FD>h7CvYlot#P8(A(r0x9X|Is{VE_=14}#Qg#0z65i)4wNwcJ7K}bz);M* zfPrBV4nar)0LM)!)4u~<Hx@83XdNzQG6Ki#LsSW-!^q~nK8#m(DXJ{O(4K`G=EN}{ z;T2$Hp0993PJoelp286m0Y>JT3P<b&7@21%9B~q0WS*;V#0w%A0HGoT7@21&9EpYS zQX$$WLa40}xt$R0`yteE0Y>K83P;XD47&wU@(3dMR)CRtj>3^25bD1GBl7}<qwHYb zQEssIqx@hEM`gecJgN-gX@IpK)d4%=s5wM~EkuJ0M9v2y7z7c7xcX=u*bzsQAf}{2 z<njd=nO7;awlOd<F)_AwGB7c@G9B%O*f$02q}DkMOiZOrN0)$kM^}TX)^!k-+XWbz z7b_gyCBVqMMB(UO0Y>I!3P%qJFfy-DIC>PU^5`XqeGef{`Uv6u1XFFy3`|V!jBUIO zOiWUY$3(z_$0WcmYm;MOVp3#mQ)FObiefwl^7I^qV}=kVAWzR#IA#su*@HD4^9H;6 zSRh#NTp|M#Qx)T}Ofc_QE<{Nq*ty3#!OlH48$vCG2(E!po4~F<woQPMd85Ly(*lgl z2NjN80L!&q1$+9~ZHT_7U>_a(1ff7anxk->8O%G*1))Gbnxk+Wl)&aF99IPkwp%eU zG37EIcLei}dw{8SUx*+moy}1=9u5(VVqjuA%XA!++?FUDPX|Z%@f-*Rin!Sd$BP6Q znU^XYuL1k-ILLo96ppumJ>A|84!ZU(u&a-QB6W$v@fqM0a(p3#S_byY@r@83C^ly* z9Nz=60hEMiD;z%pQF0z^=JBf#i$E!PhQjf?5J6CaUZQXul%QuR9RCIuOjy9c!t|RN zTu{GcU|0xaEMQ=;VJc;YWO@ksl7S(#`wd&S8%K8>Ti*erZ)#oQT$f5jolDt!4zMx^ z^c@He0vDxG(XXF$yRmhLaj?gpUU-(_e5hV$X!o12aJFtYHtquzW(ye@O8G#AaYKn9 z_kj}jmkbQt2TD|T{Qv)wfdN#MGMDm#iufH2{AWeBu$~n$z727kL+Ne39ytaE;{%YY zWf8czTFk((gMp#%fZBp&hK<aZUZ`+zurV<FJ9+8FzXM$lAS%_m<h&Tv7PK%x8VKJW zUxZ5RVAS5}>ar^^_^jf$3yZ*&$#HiM1l=9S)_vK#BBuE_OR-e*V`k>tYTe@8mrD6w zGBE7^2XgT4zyDwVc*(#Z$G)F|;kYXkBg3TClNxOQm$L6*WnOK3U^T=?f?HU2|M`Db z#5P2-^d#74JN`4D6|wpMI-xs^1EhwbbWhL@Mz*seQ4N3CiWh+zC|h{WiZuM;DV`0g ztvlsF9%VTzvPI7LHi&apWDDn6ksXYzo0-pw>|l`YzHwFrB))@D8p7DZ4ATC;lx_E4 zkW1S@em>5|!0`XS@qw2N3?Lht53z!%E;kMp{!+HCV=9a+%r=~*OdFUMF)*y)*rmX* znWKbt*8+yk1t4`!D(p-*I^-A_HZo4UbRb|61H;5O3TzAvTnFC;O@6_^0J0vWuIJQl za2SH3vH1|on?(!^8@S(jZD4-qwZZ+J7mWYL$?1*CheZqwAa!pSGcZI&zxj4q>F_(4 zD_@6#WI!gUFoPNjAl|zLaHE~xaIrBkyaS0kEnr}H*L;W>)DC*1%J`4#$UEcPubFp) z{0d0}5Yl5Y1H)wY__)~99q>eHqgX81b;IcY#m69%xW4IuYU-B^3>7B-&Qx$MWME)s z12=ybGB79|DKUBhNu>-WtP2?!UT1CLIx8}HAp--~w~9FC!>^<Momt4hP!bGL3|8W9 zeBib7zcUp!r952U7BVnYg0jGCL#}TX3OoM)Z((C#C{Y2YfD-l>3=AfWuf<+4Fl-Sz zEApCmHv>brJC`>5YfxSUJDWp|fdSMu@O{np?TUgL*k0Bb3=FR&KsCEU2_MK0+?Pt& zyxyoV@ic(iooe6!14(}XwPqR~^K%^r1>Ea(-;OYO&Ix5c!T>G}j)2O=g$gZf;Iill zrvM}KLWLtdV7V541}3I9<|9Jjf~G|hTqm^1fK|50gDa*MB?wOyOq~HW;;R^sfQmpD zh9ji{jLh*2E%gjcOw-s}Kvmdlwj-d@E{ov^s0xc?Xj#O-#B_u02&klwV>q&wfr%-U z<p`*x4`Vn2s<$H;j_eR%WR7AuvRi<WIhx_fJ^@DNB8C$OSr{3QTohnrHf1<+M}U#p zg5k)00Y+v^h9h4E7@3V2z?HWd!%+?aM&?|GR&E9+rUl$b1q2wGCor@MgGz7iqoC?+ zl0d5o0~6C#wpLK#e}k>niGhjfBkNIj0Y>IHhNJNUjLcaKN1GwkG>G700Y>H&hNH^` z7@5-;j&2cPWX@nXdPabeIf3CQs1#0OXng|q*3p*&jLc;WM?uAJ7(?q91}3K0Y)3)O z3Kxc>pk{>|!!c0-MrIF&W9kBo%w7z~3<MaNeHe~e3NSLqFdPF_pD_$=pbk<g_c2f{ z%E55VUx1OBi{V%Z0~1pXZ(BG66H^`cv1kECW*3HIpcaHb!!c0R<HvBUUVxF=m*E)5 z@oo&q+QDu)Hd%m?IgH`hT!;pcA2=9}ftn6n49C`kZExEIF%wkLdNCXW)j2T?#|}a? zfSL||497stCVz%w4+I#Q-58ENhR8jG7!C3CF_5R@7><M5OK}Xxg&3HaHgdL$GB7bM zVh2~dNesu81Q?l{7}`N;XA%2x4FN{xP=<C;7c-mdxUm2z<d1_wqJrVLvj8J=1;cSr zCEUbtJQS?*cnm}k)PhK00N1yD497v94r4gp3fA7<&A`OO%iTVSfr%-b>o}-c(ZbNa z6fAgrod6?q1jBJqVsmCV4oY4T4DE*)n3x2)j)Pi<5e&ycRjV7raZmz_W;hP=Z3IL6 zV+JOsFPz6gzAa}s{sx>nkAqTO2ty30YW>b$!V2o6M0`8KSOUtzpyCPK-YwyN0qO&A z%P}yN9%(qk_<BDmW52!+%G$w@j15tDmg`&P$%ZFPrAI)Sd_P3$_4eP!2S8c4L>^rC z?aN`<$;_bECGrAXmvX&eU{JFXDf#&5%}WLbP+y4ae~BW<Xg{OdTu(~)Kuq_p`&{2D zL5>2I+QtW7Gw=BS|Mhv}1MO^(5+>^Pp$axo9rBtDRHit+>3Yz{#=!7;O{FN9@6_;z zv52pf)%d`>*E2S_zcW7YTEpncn~f}&UVxnTTDn7xf#LN_F!`A4Nd+62b#noz<NcC> z0WNZU0RzM9H<NdWGyFSW@vMZW;XhN6aOp;ncW*$N2}?l*EvQ)KK2UiSq<UZ1kqQHl z9Al|j*NctJN-vFXUwU!j@`V@0Y$}ZZ4s`wK(1UcCL4Mo8zyc~uL5}9WRKn%urDFdM zTmynU{KE*;nt1&lLcIXH@zF~Lh7F)@A!YbD$VRSj6(S&){x9JT00kzv7B)T*0q(v3 zFZlr}_`zLB<`NZ9Pmuqx@$Cf+3@eyQn6@*n5GY}8I4!V30Youvkvl7Lcn1SNs2Klt zn5l$m1LL>D5UH~whoRObAnZ|LEC~cz&Qj_X92UNhfuWnl+J&pwY75g@k%lLHB^;nc z_n!^ij<R7cRR^mrQ3wR}_g^qDut$Ot3JchYrK~#`#m|bw$3;gR1`9yyEannfkS3-Q zF&n{Ba7Xs<Ye5^~Qg)C|rq^uyz;zGY<0_0Ldm)WEt|t|GAf5k9)Pp8L4CDtXYj~ot zgOQ<x(Ie_Gv=*GSkbyz_P}Jdt3=D_o1PA>BdGqZGg%UYXi{RT8rN`fn2$TwbJI++f z1F@}$rTG=>yQt{7huOB6o>gRvVm~Yw)OV}<@)p&zic#_)gSZb=@PREYWe=LPMc}MR z)NTfb<L+!G3_F+vHU_<5U}*mgBJQCoz7;fSiy&Na99VJ4oL`;pT*e1F**o2tI^9|3 z9`0u0K2Rdj9m70l3Udn!0~1p>cMGWZw1fMIpa3ItB*PI<mm`d!MVf($DV^(xBDnB6 z0_rP9G8{1yU}Sb?I07o|A{ma@fD6(V9|k5SH|`@L;1UMhwGCr9k;KBt*iry4!CJ~0 zn3zh0S{lKH>Jd<p7tR2#U!56_fO-?okowh)`v|Bv0j*Js7><B?!p;mwPJm1ABcLu+ zIm3|~;6fZ+Z~8JE`3EjykFp3bGKVl6<r83J&Sp3&45nHo!1f(g5MX4^VK@rvJLNF6 zg2ww+3LFLXo#Gjef~rp!hNGa~ZXCnWU~nCG6x3VFVmMkQz{s4+aI_9mi#9=OQBbSE zjiGfm#Ar}+V2Z*~P{(hY!ckBOoyE|)9U`}jfr;rR`_VlNOiat!kM3h&V%o%h^Z)}B z(<6?fpwgR-<LD7k2bJUKF$N|kb&jJa7?_w8IFFtJ72E7b&wv^+97oSFFfj?SAHBf9 z#1zkd^b!LTlRwANE1;e!$I)vHOiU{{j^1EkVp_|2^cDjX(|?YmcNmzMwsIW3$H2sN zn&apLP&L7M^brFS(@&10pxWM#^XM~(BVItLR}ktAgn9>|K0v5X5DL^FSk8I$8v_&5 zOwOY}Ky4JxqrVuKm_BoWn+I_W$3UYFVGQ67cp1Yn&~QT-!!gisLl(m^EpQzN?s-Qr z9J2sdXU9N83K0y)^1w}%W1!w=8N)G9w=<IA7$}e{7><E@m{APJK!IGuaBPJDBXbGE zu?=ADZ971Y;BMQ^z{IqJ8(ir}G8{VwvFJL4x(A^^o$LsPV;{hY``B+Vb(|5Ls@p;7 zUx?>8XcVW6p<RT5iK&_ExH#BJ$K}C^8(iCGF|>omhqJkkyMkL!$3f|(1yaAeF&qaC zi$pLS2Q?;J7}|?Kttal|Qz52++AmoQ$5%n@10{`H-0h$=p~-Xn5Jbr-use@~T;0NO z2vjqF=H}?GVd-LYx31wTVlw{US;O+5hwH%MpNG3;tYf%}zjw!Qbk{I-ASqz_&+_AN z0Jv7Jlu=<SmFQ-%1`V4D1c6E<uQxnQprJdacTo|C!@}9-Kso@@FBlm1F);jk!2lkj zE#hx@^7jP;!(8_GIM}eW(Sg?=Lc8D02@7ZYg=imGfDGmOR_XNZ2urCpsOXmAzFn&I z?Fdt;DoE;$ib9Eu)0=M>l-L*;RtS^|fCRhT*xs?n$IXp3I&iwn4OEI3CBJ_68)`Yo zq=%p~SD{22WRBPt#x6HDP)*QK!m@?q^-+-RulIvn6#Jnq3R%bqD@X>UeGy0>JJ^iU zgKAc?B@Z6metqQkP6md)gWwj3SPp1F7N%ST5|{#De}VLanj0@cjT5mPhLUTK&Trv( z{UIPYFeofsPOnc6(h=-F<>UnFA%Z*v>J+wLT)|l4rosp6*011s(|)nk5Y%OqV_^7p zoTXIz+hLXxEgR-iHHb?=^$yGH;t3#{>9r@QLjC*N2~@|uws{@%+8R`Ca@Yu$+_w=d zc?791idjJs2b#FyI#4OD!c-y*iP<7<uQw`x!6v+OdfR?+g+hrma-G8ms&hCYW)v}k zyP;sWuV5?{1BHMpKmTF|2GFQ5cm(_<#CsbQ-dSBJVS1(@A0HPL869z6F%&U6Qp))f zG~@9f)IK^;@(mQw!lmzRm`XT67IXbCc?=!_Sp*r27bwx&!C-t=5j0uw@4zO;vx*x) zT}M!x2h<DK12ObKELeXWWFB*g4v1nZ5dcT@0tN=PHntYf!0!f4EM0ix1FwTX?Id5& z^aIz)lF#1`3Y3U}Tmy<9uzfoijY0DqXBEF4WG*=mmjamvv55z6)1npz@Z12nD|^4; zk6<}Z34g;MffBBUKa6FpdjIvn!%UFG5EdQ`&RU>087Mp(&M?mTFUP=8A_Ov)u`~}P z2o`yr4r&pBvu24JsO`j3!oP!=q2V!ODL4iEe(lEftpb$zKpBaJTXT*q^AS)f8O?CS zO@NVkn!*uZNDT<;Ped~uNd(t<Eg1|<OvzkFvcW}5OFp>RIZ_NR-&(2}n3yzqjzG%O zBh$fxM`nRbv?Gha#m*5>x1xpN2x!FBjo}EW5Q<<p0vc*{VQ2wW6udkwpgJL&>j<Ri zJOUb@EMqtd>Ig<MoRnf=WNg&{SM06Y;BL!NeXuo0K?BKU3@3d-3P9tJB|_kV<4A_1 zpb|2Yp%v5|;O1$q0##8wM<;{((nmpVbYVC;Ux1Ohl;J3->*@ySx|T5<-3)G7fCq<5 z7><H^co7V(pt^7YcPnT_^(^<%n-IG}W5kgRM_)jA@4<cWW31p1YU5yFV&djG25KWj zF&qPp6+|-}12qn&D1fV|Xn5V^DZt3w!q5h4*SzLF25J?!FdRz&yX+Wf)Z32XSe5`I zb0NbqkdGV~+CXLg6y9TH;LdT|3<f49W&XB#3`|S~{Kr5|ngE7lpaIe_hGU>sK`6_y zy#kEP0g%pW0Hl|i&(H>{$V<78-4S7A2KQK*7>+$<U}6eqIR>huBUz5UXJBF~<8K4i z%5~hwK%=Aq49EV0jXKTD!pL|WG>R}&;W%jcAddmui7n+mE-Aps%))S7R)CS2jo~<G z9K=8X+?TE6J`QTn1uz`97hz-u_g$G7+C9L%>f@m9dp^VQD2QfI701TVo(z!#jUxvz zoX!PV3F^b=F&wW3yW;qCuzQa$0LSTZP?a6Wa2(V;3S>AAs<{Ihj_&~31sWX*WH=7$ zr3W$`KLrv3HSYo$j$Z~R(&M1v;Yfz#ufP%64r+j8a~=N<j>x$S_A@cP=RZ)&-SC*P zWL1M7o5O4EIlsVlB1;z|B>RD?mlvSUoQ*&!Cs?S2X@lI{hBUVQQPJ^n^0DX7%Yh5^ z;J}~&kUUc<J0!Pq+OU_ff(MI1!i*)}pz%H#Ca_4u6OIyVP{wXJ1GYz?l;y10YgVwv zQnvqm3=E~$K_hT#3=DsFurolW@4!02L_|bXWVHNwP}#(NsX__d#xG$3bsa#1sa*$c zgo>?aTzoLOyPbjI;)9D1z?~-UOC@UEr<xBjzu{?^^Xpyvskht*N`wR2PrXs8e-}B| z_|guBhu=S5d~kTK@d4<p=we7=&h@Rr3N+Uz#BlM&#TVY**6a^{l^S&LLCR;w627j3 z8(A+s;9)j;a#rNEQ<okC1E_q2^hk}n`4||uPnNRA8XxdDees1YLt-g&!<mN35DPyC zbYFzH>0SG&i1!fJfI<p1rWt$sWoY-Ca5iwsx<3azg35iVA{-Q;|4TtLvmmcCmV5(I z%q1E-7+BAWOl)}kugi^1h2Ms$n2GB~zz#;%vmy~TOhpl04;mgel!m^x2X(<Fg4G1r zFcmQw9oWKlR^;_<NO+b6dA(8j*OkWB@PxnN4^uHa*O7Nd2VUEO3g34Pj~hxwz-<6f zn*r1|`0?no(Sg?rJB1k3x<Fzew>6Z!0S`{dmb`oP^52=#M;rckJ!q(7V=NH{4U|CY zaPXw!A_j&C_W0P-0Sg%zRxp+@oz>uaQo_B0rBq-CgTPtQh{G$GN?3O^h@I7sIQ$Yc zs2%L0U|^zeXsT~%^8f#;IR%VIqy!k50~uNrKuvS*7G+3*tqbnC9B~EbA8@fBz;Faq z?6WYOi37Fz8IPoZa~inV4`Mh2>R~nT906s&`3grsos<BEBYh%_%tt^2mq83IGZ{cF z<RhSVXe7fK(2!CC&zV&WOiT?tXV!zMBcPG9IEEvjX__oZO~Au&1T-<j$8ZERdgQ_Y zo<HPa0C%P07><Gl0gV`rT0we7py|#mNarb);V5Y0DUAU<N9e+E6x0e1V>r2lg^}^- zT5!E{6f{~I#?T6Cxd#g!1x*oUF&u@q+(E;+ZjcT`IYS$0g+_@`8)#zd3nzG1uABip ykXRzr2J&||cUv*ocWq^$J`?9LP$)z)90T>(q96l_ISg$ezb;~D=wf1EC;<Q|S?8Ak diff --git a/src/sbbs2/dstsedit/dstsedit.c b/src/sbbs2/dstsedit/dstsedit.c deleted file mode 100644 index 87cf898f7e..0000000000 --- a/src/sbbs2/dstsedit/dstsedit.c +++ /dev/null @@ -1,227 +0,0 @@ -/* DSTSEDIT.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <dos.h> -#include <dir.h> -#include <stdio.h> -#include <io.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> -#include <stdlib.h> - -#include "..\sbbsdefs.h" - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access==O_RDONLY) share=O_DENYWRITE; - else share=O_DENYALL; -while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN) -#ifndef __OS2__ - if(count>10) - delay(50); -#else - ; -#endif -if(file==-1 && errno==EACCES) - puts("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -/****************************************************************************/ -/* Converts a date string in format MM/DD/YY into unix time format */ -/****************************************************************************/ -time_t dstrtounix(char *str) -{ - struct time curtime; - struct date date; - -if(!strcmp(str,"00/00/00")) - return(0); -curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0; -if(str[6]<'7') - date.da_year=2000+((str[6]&0xf)*10)+(str[7]&0xf); -else - date.da_year=1900+((str[6]&0xf)*10)+(str[7]&0xf); -date.da_mon=((str[0]&0xf)*10)+(str[1]&0xf); -date.da_day=((str[3]&0xf)*10)+(str[4]&0xf); -return(dostounix(&date,&curtime)); -} - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - struct time curtime; - struct date date; - -if(!unix) - strcpy(str,"00/00/00"); -else { - unixtodos(unix,&date,&curtime); - if((unsigned)date.da_mon>12) { /* DOS leap year bug */ - date.da_mon=1; - date.da_year++; } - if((unsigned)date.da_day>31) - date.da_day=1; - sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day - ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); } -return(str); -} - - -int main(int argc, char **argv) -{ - char ch, str[512], path[256] - ,*lst="%c) %-25s: %13lu\n" - ,*nv="\nNew value: "; - int file; - stats_t stats; - time_t t; - -if(argc>1) - strcpy(path,argv[1]); -else - getcwd(path,MAXDIR); -if(path[strlen(path)-1]!='\\') - strcat(path,"\\"); - -sprintf(str,"%sDSTS.DAB",path); -if((file=nopen(str,O_RDONLY))==-1) { - printf("Can't open %s\r\n",str); - exit(1); } -read(file,&t,4L); -if(read(file,&stats,sizeof(stats_t))!=sizeof(stats_t)) { - close(file); - printf("Error reading %u bytes from %s\r\n",sizeof(stats_t),str); - exit(1); } -close(file); -while(1) { - clrscr(); - printf("Synchronet Daily Statistics Editor v1.01\r\n\r\n"); - printf("S) %-25s: %13s\n","Date Stamp",unixtodstr(t,str)); - printf(lst,'L',"Total Logons",stats.logons); - printf(lst,'O',"Logons Today",stats.ltoday); - printf(lst,'T',"Total Time on",stats.timeon); - printf(lst,'I',"Time on Today",stats.ttoday); - printf(lst,'U',"Uploaded Files Today",stats.uls); - printf(lst,'B',"Uploaded Bytes Today",stats.ulb); - printf(lst,'D',"Downloaded Files Today",stats.dls); - printf(lst,'W',"Downloaded Bytes Today",stats.dlb); - printf(lst,'P',"Posts Today",stats.ptoday); - printf(lst,'E',"E-Mails Today",stats.etoday); - printf(lst,'F',"Feedback Today",stats.ftoday); - printf("%c) %-25s: %13u\r\n",'N',"New Users Today",stats.nusers); - - printf("Q) Quit and save changes\r\n"); - printf("X) Quit and don't save changes\r\n"); - - printf("\r\nWhich: "); - - ch=toupper(getch()); - printf("%c\r\n",ch); - - switch(ch) { - case 'S': - printf("Date stamp (MM/DD/YY): "); - gets(str); - if(str[0]) - t=dstrtounix(str); - break; - case 'L': - printf(nv); - gets(str); - if(str[0]) - stats.logons=atol(str); - break; - case 'O': - printf(nv); - gets(str); - if(str[0]) - stats.ltoday=atol(str); - break; - case 'T': - printf(nv); - gets(str); - if(str[0]) - stats.timeon=atol(str); - break; - case 'I': - printf(nv); - gets(str); - if(str[0]) - stats.ttoday=atol(str); - break; - case 'U': - printf(nv); - gets(str); - if(str[0]) - stats.uls=atol(str); - break; - case 'B': - printf(nv); - gets(str); - if(str[0]) - stats.ulb=atol(str); - break; - case 'D': - printf(nv); - gets(str); - if(str[0]) - stats.dls=atol(str); - break; - case 'W': - printf(nv); - gets(str); - if(str[0]) - stats.dlb=atol(str); - break; - case 'P': - printf(nv); - gets(str); - if(str[0]) - stats.ptoday=atol(str); - break; - case 'E': - printf(nv); - gets(str); - if(str[0]) - stats.etoday=atol(str); - break; - case 'F': - printf(nv); - gets(str); - if(str[0]) - stats.ftoday=atol(str); - break; - case 'N': - printf(nv); - gets(str); - if(str[0]) - stats.nusers=atoi(str); - break; - case 'Q': - sprintf(str,"%sDSTS.DAB",path); - if((file=nopen(str,O_WRONLY))==-1) { - printf("Error opening %s\r\n",str); - exit(1); } - write(file,&t,4L); - write(file,&stats,sizeof(stats_t)); - close(file); - case 'X': - exit(0); - default: - putchar(7); - break; } } -} diff --git a/src/sbbs2/dstsedit/make.bat b/src/sbbs2/dstsedit/make.bat deleted file mode 100755 index b2a462a029..0000000000 --- a/src/sbbs2/dstsedit/make.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -I.. -w-pro dstsedit.c diff --git a/src/sbbs2/dupefind/dupefind.c b/src/sbbs2/dupefind/dupefind.c deleted file mode 100644 index 4d86818218..0000000000 --- a/src/sbbs2/dupefind/dupefind.c +++ /dev/null @@ -1,311 +0,0 @@ -/* DUPEFIND.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "crc32.h" - -#define DUPEFIND_VER "1.01" - -void bail(int code) -{ -exit(code); -} -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} -long lputs(char FAR16 *str) -{ - char tmp[256]; - int i,j,k; - -j=strlen(str); -for(i=k=0;i<j;i++) /* remove CRs */ - if(str[i]==CR && str[i+1]==LF) - continue; - else - tmp[k++]=str[i]; -tmp[k]=0; -return(fputs(tmp,stderr)); -} - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access==O_RDONLY) share=SH_DENYWR; - else share=SH_DENYRW; -while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) -{ - va_list argptr; - char sbuf[256]; - int chcount; - -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); -} - -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(access&O_WRONLY) access|=O_RDWR; /* fdopen can't open WRONLY */ - -if(((*file)=nopen(str,access))==-1) - return(NULL); - -if(access&O_APPEND) { - if(access&(O_RDONLY|O_RDWR)) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&(O_WRONLY|O_RDWR)) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - close(*file); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,16*1024); -return(stream); -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - int c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} -char *display_filename(ushort dir_num,ushort fil_off) -{ - static char str[256]; - char fname[13]; - int file; - - sprintf(str,"%s%s.IXB",dir[dir_num]->data_dir,dir[dir_num]->code); - if((file=nopen(str,O_RDONLY))==-1) - return("UNKNOWN"); - lseek(file,(long)(22*(fil_off-1)),SEEK_SET); - read(file,fname,11); - close(file); - - sprintf(str,"%-8.8s.%c%c%c",fname,fname[8],fname[9],fname[10]); - return(str); -} - -void main(int argc,char **argv) -{ - char str[256],*ixbbuf,*p; - ulong **fcrc,*foundcrc,total_found=0L; - ushort i,j,k,h,g,start_lib=0,end_lib=0,found=-1; - int file; - long l,m; - read_cfg_text_t txt; - -putenv("TZ=UCT0"); -_fmode=O_BINARY; -setvbuf(stdout,NULL,_IONBF,0); - -fprintf(stderr,"\nDUPEFIND Version %s (%s) - Synchronet Duplicate File " - "Finder\n" - ,DUPEFIND_VER -#if defined(__OS2__) - ,"OS/2" -#elif defined(__NT__) - ,"Win32" -#elif defined(__DOS4G__) - ,"DOS4G" -#elif defined(__FLAT__) - ,"DOS32" -#else - ,"DOS16" -#endif - ); - - p=getenv("SBBSNODE"); - if(p==NULL) { - fprintf(stderr,"\nSBBSNODE environment variable must be set.\n"); - fprintf(stderr,"\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n"); - exit(1); } - - if(!stricmp(argv[1],"/?") || !stricmp(argv[1],"?")) { - fprintf(stderr,"\n"); - fprintf(stderr,"usage: DUPEFIND [start] [end]\n"); - fprintf(stderr,"where: [start] is the starting library number to check\n"); - fprintf(stderr," [end] is the final library number to check\n"); - return; } - - - strcpy(node_dir,p); - if(node_dir[strlen(node_dir)-1]!='\\') - strcat(node_dir,"\\"); - - txt.openerr="\7\nError opening %s for read.\n"; - txt.reading="\nReading %s..."; - txt.readit="\rRead %s "; - txt.allocerr="\7\nError allocating %u bytes of memory\n"; - txt.error="\7\nERROR: Offset %lu in %s\r\n\n"; - - read_node_cfg(txt); - if(ctrl_dir[0]=='.') { - strcpy(str,ctrl_dir); - sprintf(ctrl_dir,"%s%s",node_dir,str); - if(_fullpath(str,ctrl_dir,40)) - strcpy(ctrl_dir,str); } - backslash(ctrl_dir); - read_main_cfg(txt); - if(data_dir[0]=='.') { - strcpy(str,data_dir); - sprintf(data_dir,"%s%s",node_dir,str); - if(_fullpath(str,data_dir,40)) - strcpy(data_dir,str); } - backslash(data_dir); - read_file_cfg(txt); - lputs("\n"); - - start_lib=0; - end_lib=total_libs-1; - if(argc>1) - start_lib=end_lib=atoi(argv[1])-1; - if(argc>2) - end_lib=atoi(argv[2])-1; - - if((fcrc=(ulong **)MALLOC(total_dirs*sizeof(ulong *)))==NULL) { - printf("Not enough memory for CRCs.\r\n"); - exit(1); } - - for(i=0;i<total_dirs;i++) { - fprintf(stderr,"Reading directory index %u of %u\r",i+1,total_dirs); - sprintf(str,"%s%s.IXB",dir[i]->data_dir,dir[i]->code); - if((file=nopen(str,O_RDONLY))==-1) { - fcrc[i]=(ulong *)MALLOC(1*sizeof(ulong)); - fcrc[i][0]=0; - continue; } - l=filelength(file); - if(!l || (dir[i]->lib<start_lib || dir[i]->lib>end_lib)) { - close(file); - fcrc[i]=(ulong *)MALLOC(1*sizeof(ulong)); - fcrc[i][0]=0; - continue; } - if((fcrc[i]=(ulong *)MALLOC((l/22+2)*sizeof(ulong)))==NULL) { - printf("Not enough memory for CRCs.\r\n"); - exit(1); } - fcrc[i][0]=(ulong)(l/22); - if((ixbbuf=(char *)MALLOC(l))==NULL) { - close(file); - printf("\7Error allocating memory for index %s.\r\n",str); - continue; } - if(read(file,ixbbuf,l)!=l) { - close(file); - printf("\7Error reading %s.\r\n",str); - FREE(ixbbuf); - continue; } - close(file); - j=1; - m=0L; - while(m<l) { - sprintf(str,"%-11.11s",(ixbbuf+m)); - strupr(str); - fcrc[i][j++]=crc32(str); - m+=22; } - FREE(ixbbuf); } - lputs("\n"); - - foundcrc=0L; - for(i=0;i<total_dirs;i++) { - if(dir[i]->lib<start_lib || dir[i]->lib>end_lib) - continue; - lprintf("Scanning %s %s\n",lib[dir[i]->lib]->sname,dir[i]->sname); - for(k=1;k<fcrc[i][0];k++) { - for(j=i+1;j<total_dirs;j++) { - if(dir[j]->lib<start_lib || dir[j]->lib>end_lib) - continue; - for(h=1;h<fcrc[j][0];h++) { - if(fcrc[i][k]==fcrc[j][h]) { - if(found!=k) { - found=k; - for(g=0;g<total_found;g++) { - if(foundcrc[g]==fcrc[i][k]) - g=total_found+1; } - if(g==total_found) { - ++total_found; - if((foundcrc=(ulong *)REALLOC(foundcrc - ,total_found*sizeof(ulong)))==NULL) { - printf("Out of memory reallocating\r\n"); - exit(1); } } - else - found=0; - printf("\n%-12s is located in : %-*s %s\n" - "%-12s and : %-*s %s\n" - ,display_filename(i,k) - ,LEN_GSNAME - ,lib[dir[i]->lib]->sname - ,dir[i]->sname - ,"" - ,LEN_GSNAME - ,lib[dir[j]->lib]->sname - ,dir[j]->sname - ); } - else - printf("%-12s and : %-*s %s\n" - ,"" - ,LEN_GSNAME - ,lib[dir[j]->lib]->sname - ,dir[j]->sname - ); } } } } } -} - diff --git a/src/sbbs2/dupefind/makeall.bat b/src/sbbs2/dupefind/makeall.bat deleted file mode 100755 index d68900c3d3..0000000000 --- a/src/sbbs2/dupefind/makeall.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -wmake OS=DOS %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=DOSX %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=OS2 %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=NT %1 %2 %3 %4 %5 -if errorlevel 1 goto end -:end - diff --git a/src/sbbs2/dupefind/makefile b/src/sbbs2/dupefind/makefile deleted file mode 100644 index 9af7a2f85f..0000000000 --- a/src/sbbs2/dupefind/makefile +++ /dev/null @@ -1,89 +0,0 @@ -############################################ -# Makefile for Synchronet DUPEFIND Utility # -# For use with Watcom C/C++ # -############################################ - -!ifndef OS -OS = DOS -!endif - -!ifeq OS DOS -CC = *wcc -!else -CC = *wcc386 -!endif - -LD = *wlink -INCLUDE = \watcom\h;\watcom\h\os2;..;..\smb;..\rio - - -!ifeq OS DOS -CFLAGS = -I$(INCLUDE) -s -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -ml -!else -CFLAGS = -I$(INCLUDE) -s -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -!endif - -!ifeq OS DOS -SYSTEM = DOS -!endif -!ifeq OS OS2 -SYSTEM = OS2V2 -!endif -!ifeq OS DOSX -SYSTEM = DOS4G -!endif -!ifeq OS NT -SYSTEM = NT -!endif - -LFLAGS = option stack=16k system $(SYSTEM) - -MAIN = $(OS)\dupefind.exe -OBJS = $(OS)\dupefind.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj & - $(OS)\ars.obj $(OS)\scfglib2.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\gen_defs.h ..\scfgvars.c - -# Implicit C Compile Rule -.c.obj: - @echo Compiling (I) $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... - $(LD) $(LFLAGS) file { $(OBJS) } - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# ARS -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Shared Functions -$(OS)\scfglib1.obj: ..\scfglib1.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) & --DNO_MSGS_CFG & --DNO_TEXT_CFG & --DNO_XTRN_CFG & --DNO_CMDS_CFG & --DNO_CHAT_CFG & -$[@ - -# Shared Functions -$(OS)\scfglib2.obj: ..\scfglib2.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) & --DNO_MSGS_CFG & --DNO_TEXT_CFG & --DNO_XTRN_CFG & --DNO_CMDS_CFG & --DNO_CHAT_CFG & -$[@ - diff --git a/src/sbbs2/dupefind/makefile.bc b/src/sbbs2/dupefind/makefile.bc deleted file mode 100644 index 22b00d8a8e..0000000000 --- a/src/sbbs2/dupefind/makefile.bc +++ /dev/null @@ -1,74 +0,0 @@ -############################################ -# Makefile for Synchronet FILELIST Utility # -# For use with Borland C++ for DOS or OS/2 # -############################################ - -# Macros -CC = bcc -LD = tlink -!ifdef __OS2__ -OS = OS2 -INCLUDE = c:\bcos2\include;..;..\smb;..\rio -LIB = c:\bcos2\lib -CFLAGS = -d -C -I$(INCLUDE) -LFLAGS = -c -!else -OS = DOS -INCLUDE = \bc31\include;..;..\smb;..\rio -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -N -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = -n -c -!endif -MAIN = $(OS)\dupefind.exe -OBJS = $(OS)\dupefind.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj \ - $(OS)\scfglib2.obj $(OS)\ars.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL).obj $(OBJS) -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Global Variables -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Shared Functions -$(OS)\scfglib1.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib1.c ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_MSGS_CFG --DNO_XTRN_CFG --DNO_TEXT_CFG --DNO_CHAT_CFG -! ..\$&.c - -# Shared Functions -$(OS)\scfglib2.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib2.c ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_MSGS_CFG --DNO_XTRN_CFG --DNO_TEXT_CFG --DNO_CHAT_CFG -! ..\$&.c diff --git a/src/sbbs2/echo/docs/fidostep.doc b/src/sbbs2/echo/docs/fidostep.doc deleted file mode 100644 index c6bf69e6df..0000000000 --- a/src/sbbs2/echo/docs/fidostep.doc +++ /dev/null @@ -1,321 +0,0 @@ -Step-by-Step instructions for setting up FidoNet using SBBSecho and InterMail -============================================================================= - -One of the most difficult tasks that the novice sysop will encounter is the -setting up of FidoNet. These instructions will take you step by step through -the process of setting up FidoNet on your BBS. Be warned that these steps are -very basic, just enough to get FidoNet up and running on your system, but it -may still be necessary for you to refer to the documentation which accompanies -the programs referred to in these steps. For any advanced operations you will -definitely need to refer to the documentation of programs referred to in these -steps. If you know of anyone who is already on FidoNet that is willing to help -you out, by all means ask them for their help! - -NOTE that while it doesn't cost anything to have a node number (for sending -and receiving netmail) or to receive local conferences, there is usually a -nominal fee (called "cost recovery") to receive conferences from the FidoNet -backbone or files from the FidoNet filebone. - - 1) First of all you will need to obtain a copy of FidoNet's Policy 4 document - (the filename is usually POLICY4.ZIP or POLICY4.TXT), a recent nodelist - (usually named NODELIST.???), AND a front-end mailer program. All three of - these can normally be downloaded from any local BBS which carries FidoNet - (if not, an e-mail to the sysop of a FidoNet BBS can usually point you in - the right direction). There are several front-end mailers available such - as FrontDoor, InterMail, D'Bridge, SEAdog, Dutchie, BinkleyTerm, and Portal - of Power to name a few (the latter two are referred to as "FLO-Style" - mailers and the others are referred to as "Attach-Style" mailers). Most - front-end mailers offer a limited evaluation version which you can try out - before you decide to purchase the program. - - 2) Read the Policy 4 document, it will give you information about FidoNet as - well as some specifics on how to obtain a node number for your system. - - 3) If you do not plan to run InterMail (or FrontDoor which is very similar) - you must set up the front-end mailer you plan to use by following the - directions which accompany the program and then skip to step number 9. - The documentation will also tell you how to "compile" the nodelist file - you've downloaded so that your front-end mailer can use it. Use the - temporary address specified in Policy 4 when specifying your node address - in the front-end mailer. - -Setting up InterMail v2.xx or FrontDoor v2.xx -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - 4) Install InterMail per IM.DOC (included with InterMail). - - a) If using FrontDoor, follow the FD.DOC file and substitute the letters FD - where ever you see an IM in this section. - - 5) Copy the MAILER.BAT included with SBBSecho and the EXEBBS.BAT from the - Synchronet DOCS directory into the InterMail directory (C:\IM). - - 6) Change into the InterMail directory, run IMSETUP, and perform the - following: - - a) Under Global->Address->Main, enter your FidoNet address (or the - temporary address specified in Policy 4 until such time as you have - received your own address). - - b) Under Global->Filenames, verify that the paths are set similar to the - following: - - ������������������������������������������������������� Filenames and paths � - � � - � System C:\IM\SYSTEM\ (or C:\FD\ for FrontDoor) � - � Netmail C:\IM\MAIL\ � - � Files C:\IM\INBOUND\ � - � Sec Files C:\IM\INBOUND\ � - �*Packets C:\IM\PACKETS\ � - �*Log file C:\IM\IM.LOG � - � Banner � - � Nodelist C:\IM\NODELIST\ � - � In-event � - � Hudsonfmt � - � Wildcat! � - � Swapping C:\IM\ � - � Semaphore C:\IM\ � - � � - � * = Must be unique for each Mail Server � - ���������������������������������������������������������������������������ͼ - - c) Under Modem->Advanced Setup->Connect Strings set ALL "BBSexit" levels - to 100. (For FrontDoor under Mailer->Errorlevels set all baud rates to - 100, Received Mail to 50, and Create .BAT file to Yes). - - d) Under Manager->Events, make sure all your events are set to exit when - mail is received (under Event Behavior). This allows for the immediate - importation of new messages into the BBS. - - e) Under Manager->Events, add the following event: - - ���������������������������������������������������������������������� Edit � - � Tag X � - � Days -------A � - � Modifier Ignore eventbase (*) � - � Start time 04:30 � - � Length 00:01 � - � Errorlevel 75 � - � Not used � - � Behavior � - � Use alias 1:103/705 � - � Retry delay 0 � - � Comment Synchronet exclusive event � - ���������������������������������������������������������������������������ĺ - � Event tag A..YZ - eXternal event, errorlevel is required � - ���������������������������������������������������������������������������ͼ - - f) Under Mailer->Misc, set "Trigger exit upon receipt of netmail" and - "Upon receipt of ANY file" to Yes. This will allow for the immediate - importation of NetMail and any File Distribution Echoes you may carry. - - g) Under Modem->Hardware, set "Lower DTR when busy" to "No". - - h) Under Modem->Command strings, set the "Down" string to "ATM0H1|". - - i) Exit IMSETUP. - - 7) Unarc the nodelist file (NODELIST.???) that you downloaded previously - into your nodelist directory. - - 8) Now run IMNC to compile the nodelist. - -Settup up FidoNet in SCFG -~~~~~~~~~~~~~~~~~~~~~~~~~ - 9) Run SCFG from one of your node directories, or hit 'C' from the waiting for - caller screen. Then select Networks->FidoNet EchoMail and NetMail. - You'll then be brought to a menu that should be set up similar to this: - - �[�][?]���������������������������������������������������ͻ - � FidoNet EchoMail and NetMail � - ���������������������������������������������������������� - � �System Addresses 1:103/705 � - � �Default Outbound Address No � - � �Default Origin Line � - � �NetMail Semaphore C:\IM\IMRESCAN.NOW � - � �EchoMail Semaphore C:\IM\IMEXIT.025 � - � �Inbound File Directory C:\IM\INBOUND\ � - � �EchoMail Base Directory � - � �NetMail Directory C:\IM\MAIL\ � - � �Allow Sending of NetMail Yes � - � �Allow File Attachments Yes � - � �Send NetMail Using Alias No � - � �NetMail Defaults to Crash No � - � �NetMail Defaults to Direct No � - � �NetMail Defaults to Hold No � - � �Kill NetMail After Sent Yes � - � �Cost to Send NetMail 102400 � - ����������������������������������������������������������ͼ - - a) For FrontDoor the NetMail Semaphore file should be set to - C:\FD\FDRESCAN.NOW and the EchoMail Semaphore file should be set - to C:\FD\FDEXIT.025. - - b) For FrontDoor version 2.11, the EchoMail Semaphore file should be - set to C:\FD\FDXIT.025. - - c) For FrontDoor version 2.20 (commercial, multinode), the EchoMail - Semaphore file should be set to C:\FD\FDXIT#.025, where # is the - node number (0 based). - -10) Set your address to your system's FidoNet address (or the temporary address - specified in Policy 4 until such time as you have received your own - address). This is the address used for sending and receiving NetMail. It - will also be used as the default address for message sub-boards. - -11) Create an origin line for your system that most likely contains your BBS - name and phone number. - -12) Following is an overview of the remaining options available on this menu: - - a) System Addresses: - This option will bring you to a sub-menu to allow you to configure - different addresses (AKAs) for your system. Following is an example - for a BBS configured for two fido type networks. - - �[�][?]���������������������ͻ - � System Addresses � - ���������������������������� - � �Main 1:103/705 � - � �AKA 1 1:103/706 � - � �AKA 2 85:805/205 � - � � � - ����������������������������ͼ - - b) Default Outbound Address: - When a user sends netmail, this is the 'send to' address that is used - as a default (useful for FidoNet<->Internet gateways). - - c) NetMail Semaphore: - This is the name of the trigger file which will cause your front-end - mailer to exit and scan for outgoing netmail. - - d) EchoMail Semaphore: - This is the name of the trigger file which will cause your front-end - mailer to exit and scan for outgoing echomail. - - e) Inbound File Directory: - This is the name of the directory where your front-end mailer stores - incoming files. - - f) EchoMail Base Directory: - This is the base directory for your echomail subdirectories - - g) NetMail Directory: - This is the name of the directory where your front-end mailer looks for - and places netmail. - - h) Allow Sending of NetMail: - When set to 'Yes' users can send netmail from your system. - - i) Allow File Attachments: - When set to 'Yes' users can send netmail file attachments from your - system. - - j) Send NetMail Using Alias: - When set to 'Yes' the user alias will be used (rather than their - real name) on outgoing netmail. - - k) NetMail Defaults to Crash: - If set to 'Yes' netmail sent from your system will default to crash - status (send immediately and directly). - - l) NetMail Defaults to Direct: - If set to 'Yes' netmail sent from your system will default to direct - status (send directly). - - m) NetMail Defaults to Hold: - If set to 'Yes', netmail sent from your system will default to hold - status. - - n) Kill NetMail After Sent: - Setting this to 'Yes' will delete outgoing netmail after it has been - sent. - - o) Cost to Send NetMail: - This is the cost (in credits) that a user will be charged when sending - netmail. - -13) Setup SBBSecho by running the ECHOCFG program and reading the documentation - for information on the available options. - - a) Under Paths...->Outbound Directory be sure to enter the path where - outgoing mail packets and bundles should be placed (ie: C:\IM\OUTBOUND). - - b) Select the appropriate Mailer Type. - - c) Enter your registration number (if you are a registered owner of the - SBBSecho program). - -14) Once you have done this you must now run the file MAILER.BAT (if using an - Attach-Style mailer) to use Synchronet with your front-end mailer. - MAILER.BAT must be run from your front-end mailer's directory (e.g. C:\IM). - You will no longer run the file SBBS.BAT to start this node (if you run a - multi-node system, you will still use SBBS.BAT to start those nodes which - are not using a front-end mailer). - - a) If you are NOT using InterMail as your front-end mailer, be sure to - modify your MAILER.BAT file to reflect the front-end mailer that you - are using. - -15) Follow the instructions given in the Policy 4 document to determine who - you should send netmail to in order to obtain your own node number. - -16) Now, from your front end mailer, send a netmail to this person following - the instructions contained in the Policy 4 document. Once you have done - this and the netmail has been sent, you should patiently await a netmail - reply containing your node number and the node number of your hub (where - you will send/receive your echomail and netmail to/from). - -17) Once you have received your node number, you'll want to replace the - temporary node number you used in your front-end mailer as well as in - SCFG->Networks->FidoNet Echomail and Netmail->System Addresses to it. - -18) Send your hub a message with the Area Manager (for the backbone <echomail>) - and Areafix (for the filebone <files>) passwords you wish to use on their - systems. You will need to remember these passwords as you will be using - them to do remote maintenance (such as adding and removing conferences and - file areas that you wish to receive). - -19) Your hub should respond with Area Manager instructions and a list of areas - available for you to connect to. If not, contact your hub for more - information. - -20) Look through the list of areas available to you and determine which - conferences you'd like to carry. In SCFG->Message Areas create a - message group(s) for the conferences you'd like to carry. When setting - up a sub-board for a conference, be sure to use the "Area Tag" name - given in the area list as the sub-board Short Name. - - a) Under Network Options... for each sub-board toggle the FidoNet - Echomail option toggled to YES. - - b) If the conference requires a different address, configure the address - under Network Options... - - c) If you allow aliases on your system, under Toggle Options... set Use - Real Names to YES. - - d) If you are unfamiliar with adding message groups and/or sub-boards, - consult that section of the Synchronet System Operator's Manual. - - e) For a more complete list of conferences available on the FidoNet - backbone you may wish to download the file FIDONET.NA from either your - hub or a local FidoNet BBS. This file contains a list of ALL - conferences carried on the backbone. - -21) Once you have set up all of the conferences you'd like to carry, you'll - need to go to SCFG->Message Areas-><group>->Export Areas...->AREAS.BBS - (SBBSecho) to create an AREAS.BBS file for SBBSecho to use. - -22) Now following the Area Manager instructions, send a message to your hub's - Area Manager and turn on all of the conferences you wish to carry. Note - that there are some administrative conferences for FidoNet that your - users shouldn't be able to read or post on, and some that even you - shouldn't post on, there is also usually a "test" conference which you may - want to set up to post messages on and insure that echomail is being sent - and received properly. - -23) That's about all there is to it. You are now set up on FidoNet and should - be able to send and receive FidoNet echomail and netmail. - - diff --git a/src/sbbs2/echo/docs/man.c b/src/sbbs2/echo/docs/man.c deleted file mode 100644 index f87fa9b3c9..0000000000 --- a/src/sbbs2/echo/docs/man.c +++ /dev/null @@ -1,189 +0,0 @@ -/* MAN.C */ - -/* Synchronet docs convert to paged format for printing */ - -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <dos.h> -#include <io.h> -#include <alloc.h> - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (unsigned char)str[c-1]<=32) c--; -str[c]=0; -} - -int main(int argc, char **argv) -{ - char str[256],str2[256],infile[128],outfile[128],idxfile[128] - ,*invbuf,*outvbuf,*idxvbuf,*tempvbuf,*p,*p2 - ,chap[128]="SBBSecho" - ,pagetag[250][9] - ,idxtag[512][9]; - int i,j,page=1,line=0,pagetags=0,idxtags=0; - long pageidx[250],idx[512],l; - FILE *in, *out, *index, *tempfile; - -if(argc<3) { - printf("usage: man infile outfile indexfile\r\n"); - exit(1); } - -strcpy(infile,argv[1]); -strcpy(outfile,argv[2]); -strcpy(idxfile,argv[3]); - -if((in=fopen(infile,"rb"))==NULL) { - printf("error opening %s\r\n",infile); - exit(1); } - -if((out=fopen(outfile,"wb"))==NULL) { - printf("error opening %s\r\n",outfile); - exit(1); } - -//if((index=fopen(idxfile,"rb"))==NULL) { -// printf("error opening %s\r\n",idxfile); -// exit(1); } - -//if((tempfile=fopen("TEMPFILE","w+b"))==NULL) { -// printf("error opening TEMPFILE\r\n"); -// exit(1); } - -if((invbuf=(char *)malloc(8*1024))==NULL) { - printf("error allocating input buffer\n"); - exit(1); } - -if((outvbuf=(char *)malloc(8*1024))==NULL) { - printf("error allocating output buffer\n"); - exit(1); } - -//if((idxvbuf=(char *)malloc(8*1024))==NULL) { -// printf("error allocating index buffer\n"); -// exit(1); } - -//if((tempvbuf=(char *)malloc(8*1024))==NULL) { -// printf("error allocating temp buffer\n"); -// exit(1); } - -setvbuf(in,invbuf,_IOFBF,8*1024); -setvbuf(out,outvbuf,_IOFBF,8*1024); -//setvbuf(index,idxvbuf,_IOFBF,8*1024); -//setvbuf(tempfile,tempvbuf,_IOFBF,8*1024); - -//while(!ferror(index) && !feof(index)) { -// p=fgets(str,128,index); -// fputs(str,tempfile); -// while((p2=strstr(str,"@@"))!=NULL) { -// p2[0]=32; -// p2[1]=32; -// sprintf(idxtag[idxtags],"%-.8s",p2+2); -// idx[idxtags++]=ftell(index)-strlen(p2); } } - -while(!ferror(in) && !feof(in)) { - p=fgets(str,128,in); - if(str[0]=='&' && str[1]=='&') { - truncsp(str+2); - strcpy(chap,str+2); - continue; } - if(str[0]=='$' && str[1]=='$') { - truncsp(str+2); - -// for(i=0;i<idxtags;i++) { -// if(!stricmp(str+2,idxtag[i])) { -// fseek(tempfile,idx[i],SEEK_SET); -// sprintf(str2,"%-10d",page); -// fprintf(tempfile,"%s",str2); } } - - for(i=0;i<pagetags;i++) - if(!stricmp(str+2,pagetag[i])) - break; - if(i<pagetags) { - l=ftell(out); - fseek(out,pageidx[i]-1,SEEK_SET); - sprintf(str,"%10d",page); - for(i=0;i<10;i++) - if(str[i]==0x20) - str[i]='.'; - fprintf(out,"%s",str); - fseek(out,l,SEEK_SET); } - continue; } - - line++; - if(!p) - break; - if(!p || str[0]==0xc || line==55) { - while(line<55) { - fprintf(out,"\r\n"); - line++; } - line=1; - if(page!=1) /* no tag on page 1 */ - fprintf(out,"\r\n___________________________________________" - "____________________________________\r\n" - "%-35s %3u %39s" - ,"SBBSecho",page,chap); - fprintf(out,"\r\n\xc\r\n\r\n"); - page++; } - - if((p2=strstr(str,"@@"))!=NULL) { - sprintf(pagetag[pagetags],"%-.8s",p2+2); - pageidx[pagetags++]=ftell(out)+(p2-str)+1; } - - if(!p) - break; - if(str[0]!=0xc) - fprintf(out,"%s",str); - else - line=0; - } - -//fseek(tempfile,0L,SEEK_SET); -//while(!ferror(tempfile) && !feof(tempfile)) { -// j=0; -// p=fgets(str2,128,tempfile); -// for(i=0;i<strlen(str2);i++) { -// str[j++]=str2[i]; -// if(str2[i]==',') { -// i++; -// str[j++]=str2[i++]; -// while(1) { -// if(str2[i]>32 && isdigit(str2[i])) -// str[j++]=str2[i++]; -// else -// break; } -// while(str2[i++]==32); -// i-=2; } } -// str[j]=0; - -// line++; -// if(!p || str[0]==0xc || line==55) { -// while(line<55) { -// fprintf(out,"\r\n"); -// line++; } -// line=1; -// if(page!=1) /* no tag on page 1 */ -// fprintf(out,"\r\n\t___________________________________________" -// "____________________________________\r\n" -// "\t%-35s %3u %39s" -// ,"Synchronet",page,"Index"); -// fprintf(out,"\r\n\xc\r\n\r\n"); -// page++; } - -// if(!p) -// break; -// if(str[0]!=0xc) -// fprintf(out,"\t%s",str); -// else -// line=0; -// } -return(0); -} - - diff --git a/src/sbbs2/echo/docs/sbbsecho.src b/src/sbbs2/echo/docs/sbbsecho.src deleted file mode 100644 index 61366df30d..0000000000 --- a/src/sbbs2/echo/docs/sbbsecho.src +++ /dev/null @@ -1,838 +0,0 @@ - - - - - - - - - - - - - - - - - - - - SBBSecho - Version 1.22 - Updated 02/15/96 - - FidoNet Packet Tosser for Synchronet BBS Version 2 - - Copyright 1995 Digital Dynamics - - PO Box 501 - Yorba Linda, CA 92686 - - Voice: 714-529-6328 BBS: 714-529-9525 V.32/V.32bis - FAX: 714-529-9721 714-529-9547 V.FC - Fido: 1:103/705 ftp: netcom.com /pub/sb/sbbs - - -Table of Contents -================= -&&Contents - -Introduction....................................................@@INTRO___ -Terminology.....................................................@@TERMS___ -Installation....................................................@@INSTALL_ -AREAS.BBS Format................................................@@AREASBBS -Configuration...................................................@@CONFIG__ -Running SBBSecho................................................@@EXECUTE_ -Command Line Switches...........................................@@SWITCHES -Area Manager Remote Commands....................................@@AREAFIX_ - -Introduction -============ -&&Introduction -$$INTRO___ - -SBBSecho is a full-blown FTN echomail program (tosser/scanner) for Synchronet -BBS version 2. SBBSecho is level III implementation of the SMB v2.00 -specification including support for HyperAllocated and LZH compressed message -bases. - -It is intended to replace FTSC-1 (*.MSG) compatible echomail programs (GEcho, -Squish, FastEcho, Alexi/Mail, etc.) and SBBSFIDO with a single program -incorporating the standard features of echomail programs without the .MSG -phase (consuming disk space and time). - -You will not need to use SBBSFIDO (*.MSG import/export utility for Synchronet) -or any echomail programs after you have installed SBBSecho. - -Terminology -============ -&&Terminology -$$TERMS___ - -FTN -~~~ -FidoNet Technology Network: Any network using FidoNet standards for addressing, -mail packets, mail sessions, node lists, etc. - -Zones, Nets, Nodes, and Points? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -FTN node addresses are like phone numbers, they are made up of multiple -components (four to be exact). The components are: zone, net, node, and point. -Each component is specified by a decimal (base-10) number, separated by symbols -(no spaces): - - Zone:Net/Node.Point - -The zone represents the continent (if FidoNet) or the network number (if other -FTN network). All FidoNet nodes in North America have a zone 1 address. When -the zone is specified in an address, it is the first component and must be -followed by a colon. If the zone is not present in an address, the local -system's zone is assumed. - -The net represents the network number of the FTN node. Duplicate net numbers -may exist between zones. If the net number is not present, the local system's -net is assumed. - -The node number specifies an exact FTN node within a network. The node number -is the only required element of an FTN node address. - -The point is an optional component which specifies a sub-node that does not -directly receive mail and is also not listed in the main FTN node list, but -instead gets all its mail from its boss-node (zone:net/node.0). When the point -is not specified, 0 (zero) is assumed (i.e. 1:2/3 and 1:2/3.0 are identical) -which indicates the system is not a point node address. - -A 2D (2 dimensional) address refers to an FTN address containing just the -net and node numbers (i.e. 103/705). - -A 3D (3 dimensional) address refers to an FTN address containing the zone, -net, and node numbers (i.e. 1:103/705), specifically excluding the point number -if it exists. - -A 4D (4 dimensional) address refers to an FTN address containing the zone, -net, node, and optional point numbers (i.e. 1:103/705.1). - -A 5D (5 dimensional) address refers to an FTN address consisting of a standard -3D or 4D address with an appended "@domain" (i.e. 1:103/705@fidonet.org). - -Attach or FLO Mailer? -~~~~~~~~~~~~~~~~~~~~~ -If you are using FrontDoor, InterMail, D'bridge, SEAdog, Dutchie, or any other -ArcMail *.MSG attach-style mailer, you are using what we will refer to as an -"Attach Mailer". - -If you are using BinkleyTerm, Portal of Power, or any other FLO/CLO/HLO/DLO -style mailer, you are using what we will refer to as a "FLO Mailer". - -Both types are supported equally by SBBSecho. - -NetMail -~~~~~~~ -Point-to-point (usually person-to-person) direct or routed messages. - -EchoMail -~~~~~~~~ -Group or conference messages of a particular subject matter. Usually -distributed on a regional or continental (e.g. FidoNet Zone 1 backbone) scale. -FTN style echomail areas have a unique area tag (name) associated with them to -distinguish each area from the others. - -Packet -~~~~~~ -An FTN packet is a group of one or more messages contained in a single -uncompressed file. Packets may contain echomail and/or netmail messages. -Packets usually have a .PKT extension, although outbound NetMail packets for -FLO Mailers will have .?UT extensions (where ? is either O, C, D, or H). The -first eight characters of the filename may be anything, but are usually decimal -digits representing the date and time the packet was created. SBBSecho creates -temporary outbound packet files with a .PK_ extension and then renames them to -.PKT when they're completed. If you find any .PK_ files in your outbound -directory, don't worry. SBBSecho will find them the next time it is run and -continue packing them and sending them on their way. - -Bundle -~~~~~~ -An FTN bundle is a single file archive of one or more (usually compressed) -packets. Bundles will have file extensions where the first two characters -represent the day of the week the bundle was created (MO, TU, WE, TH, FR, SA, -and SU) and the third character of the extension is a number or letter. The -first eight characters of the filename may be anything, but are usually -hexadecimal digits representing the FTN node address (or relative address) of -the system that created the bundle. SBBSecho changes the file extension of bad -inbound bundles to .MO_, .MO-, or .MO. - -Areafix/Area Manager -~~~~~~~~~~~~~~~~~~~~ -Areafix is a synonym for area manager (the very first FTN area manager -program was called AreaFix). Area manager capabilities (remote adding/removing -of areas, changing compression type, etc) are built into SBBSecho, so therefore -no external area manager program is required. If you are not an FTN hub, then -the area manager portion of SBBSecho will probably not get any use on your -system. - -Installation -============ -&&Installing SBBSecho -$$INSTALL_ - -To begin, copy the SBBSECHO.EXE, ECHOCFG.EXE, and AREAMGR.HLP files into your -Synchronet EXEC directory (usually C:\SBBS\EXEC), copy the SBBSECHO.CFG file -into your Synchronet CTRL directory (usually C:\SBBS\CTRL), and copy the -SBBSECHO.DOC file into your Synchronet DOCS directory (usually C:\SBBS\DOCS). - -If you plan on using the 32-bit DOS, OS/2, or Windows 95/NT version of -SBBSecho, you will need to put the appropriate SBBSECHO.EXE file into your -Synchronet EXEC directory (unzip OS2.ZIP for the OS/2 version, DOS4G.ZIP for -the 32-bit DOS version, or WIN32.ZIP for the Windows 95/NT version). If -you get memory allocation errors running the 16-bit DOS version or desire -improved performance, you will want to run one of the 32-bit versions. - -Add the SBBSCTRL and SBBSNODE environment variables to your AUTOEXEC.BAT. -Example: - -SET SBBSCTRL=C:\SBBS\CTRL -SET SBBSNODE=C:\SBBS\NODE1 - -Note: The node number used for the SBBSNODE environment variable is not - important, use your NODE1 directory. - -These environment variables must be present for SBBSECHO and ECHOCFG to -function correctly. Type "SET" at the DOS prompt to be sure they are listed -correctly. - -You will also need to modify your existing MAILER.BAT (or FDRUN.BAT, IMRUN.BAT, -etc) file to accomodate the use of SBBSecho, or replace it with the MAILER.BAT -included with SBBSecho. If this is your first time setting up FidoNet, you will -not currently have a MAILER.BAT file set up, so use the one that is included -and modify it so that it reflects the proper drive letters and directories. - -Next, SBBSecho expects to find the file AREAS.BBS in your Synchronet DATA -directory (usually C:\SBBS\DATA) unless you have overridden the default name -and/or location using the ECHOCFG program. The format of this file is very -similar to the standard AREAS.BBS (which many echomail programs use, or can -at least export their native area file to this format - i.e. GEcho's GSETUP). - -SCFG can also export your sub-boards to AREAS.BBS, but you're probably better -off modifying the AREAS.BBS file you're already using (if you are) or -converting your current echomail program's area file to AREAS.BBS. This is -because SCFG assumes the sub-board short name will be the same as the area's -tag (as shown in your echo list), but this may not always be the case - unless -you imported an AREAS.BBS or FIDONET.NA file into SCFG to begin with). - -AREAS.BBS Format -================ -&&AREAS.BBS Format -$$AREASBBS - -Lines beginning with a semicolon (;) are considered comments, and are ignored. - -Each line is in the following format: - -CODE TAG UPLINKS - -Where: - CODE is the internal code of the sub-board. Any unrecognized internal - codes are considered "Passthru" (not imported to your BBS). - - TAG is the FidoNet tag as shown in your echo list (i.e. FIDONET.NA). - If this is '*', then it will be considered a "badecho" area - and will receive all messages for areas not otherwise specified - in this file. - - UPLINKS is a list of FidoNet addresses which you wish to export mail - to. At the very least, your hub's address should be listed - here. Your address should NOT be listed here. If multiple - addresses are specified, you should specify the full 3D address - for each. - -AREAS.BBS Example: - -SBBS SYNCHRONET 1:3615/50 -SYNCDATA SYNCDATA 1:3615/50 -SYNC_SYS SYNC_SYSOPS 1:3615/50 - -The amount of spacing between each element in the line is not important. Each -line can be up to 1000 characters in length. - -So if your OLD AREAS.BBS file is in .MSG format (for example): - -C:\FD\ECHO\SBBS SYNCHRONET 1:3615/50 - -It must be changed to match the example given above! - -Configuration -============= -&&Configuring SBBSecho -$$CONFIG__ - -In order to set up SBBSecho for your system you must run the included ECHOCFG -program. It should already be located in your EXEC directory. You may want to -put your EXEC directory in your DOS search path so you can execute SBBSECHO and -ECHOCFG from any drive and directory on your system. - -Multiple configuration files can be used (but isn't usually required) for -multi-mailer systems. The default configuration filename is SBBSECHO.CFG -located in your Synchronet CTRL directory. You can override this by specifying -the name and location of the configuration file on the SBBSECHO and ECHOCFG -command lines. Example: - -ECHOCFG D:\ECHO1.CFG -SBBSECHO D:\ECHO1.CFG - -If you do not specify a configuration file, ECHOCFG and SBBSECHO will use -SBBSECHO.CFG located in your Synchronet CTRL directory. - -Upon running ECHOCFG you will be brought to the main menu of the configuration -program. The path and filename of the configuration file being modified will -appear at the top of the menu. Following are screen captures of available menus -within the configuration program and an explanation of the options contained on -each of them. - - �[�][?]�������������������������������������������ͻ - � C:\SBBS\CTRL\SBBSECHO.CFG � - �������������������������������������������������� - � �Mailer Type FrontDoor/Attach � - � �Maximum Packet Size 250K � - � �Maximum Bundle Size 250K � - � �Areafix Failure Notification User #1 � - � �Registration Number UNREGISTERED � - � �Nodes... � - � �Paths... � - � �Log Options... � - � �Toggle Options... � - � �Archive Programs... � - � �Additional Echo Lists... � - ��������������������������������������������������ͼ - -Mailer Type: - Selecting this option will toggle between the mailer types supported - by SBBSecho, either FrontDoor (message attach) type mailers or Binkley - (FLO file) type mailers. Choose the one that matches your front-end - mailer type. - -Maximum Packet Size: - This option allows you to set the maximum size of each outgoing - echomail packet. - -Maximum Bundle Size: - Mail packets are normally packed into what are called "bundles" (unless - a node is set up to receive uncompressed mail packets). This option - allows you to specify the maximum size of each outgoing mail bundle. - -Areafix Failure Notification: - This is the user number of the person where notification of Areafix - failures should be sent. Such failures include nodes which are not - configured for areafix, nodes using incorrect areafix passwords, and - the like. Setting this to 0 will disable this option. - -Registration Number: - Upon registering SBBSecho with Digital Dynamics, you will be given a - registration number. You should select this option and enter the - registration number you are given here. If you have not yet registered - the program, this should say "Unregistered". - -Nodes... - This option allows you to add, remove, and configure nodes that you - will be sending mail to. Selecting this option will bring you to - a sub-menu which will look similar to the following: - - �[�][?]�����ͻ - � Nodes � - ������������ - � �ALL � - � �1:100/ALL � - � �1:200/300 � - � �2:ALL � - � � � - ������������ͼ - - At the Nodes... sub-menu, pressing the INSert key will allow you to - add a new node, pressing the DELete key will remove the currently - highlighted node number, and pressing ENTER on the currently - highlighted node will allow you to edit the options for that particular - node from a menu like the following (note that the node number you are - editing appears at the top of the window): - - �[�][?]�������������������������������ͻ - � 1:200/300 � - �������������������������������������� - � �Address 1:200/300 � - � �Archive Type ZIP � - � �Packet Type 2+ � - � �Packet Password � - � �Areafix Password � - � �Areafix Flags � - � �Status None � - � �Direct No � - � �Passive No � - � �Send Notify List No � - ��������������������������������������ͼ - - Address: - This is the address of the node you are editing, selecting it - will allow you to change this to a different address. Using - the "ALL" wildcard in place of one of the address components - will allow you to configure settings for all nodes that meet - that specication (e.g. all nodes in zone 1 can be specified - as 1:ALL or all nodes in zone 1, net 103 can be specified - as 1:103/ALL). - - Archive Type: - This is the compression type to be used when packing mail - bundles for this node. Selecting this option will allow you - to choose from a menu of currently configured archive types, - like the following: - - �[�][?]���������ͻ - � Archive Type � - ���������������� - � �ZIP � - � �ARC � - � �LZH � - � �ARJ � - � �PAK � - � �SQZ � - � �ZOO � - � �None � - ����������������ͼ - - Selecting "None" will specify that this node is to receive - uncompressed packets (no bundles). - - Packet Type: - This is the packet type that will be used when creating mail - packets for this node. The default packet type used by SBBSecho - is 2+. If you are a "point" address (e.g. 1:100/100.1) you - should use either a type 2+ or 2.2 packet since type 2 packets - do not support point numbers. Selecting this option will allow - you to choose from a menu of currently supported packet types: - - �[�][?]��������ͻ - � Packet Type � - ��������������� - � �2+ � - � �2.2 � - � �2 � - ���������������ͼ - - Packet Password: - This is a password that will be placed into each outgoing mail - packet for this node. Passwords are normally used for extra - security when sending and receiving mail packets. This node - must also have the same packet password defined for your - address and SBBSecho must be set up for secure operation (set - in the 'Toggle Options' sub-menu) in order for this feature to - function properly. - - Areafix Password: - This is the password that will be required by this node (in - the subject field) when it sends messages to the area manager - (AreaFix). - - Areafix Flags: - When additional echo lists have been defined (from the - 'Additional Echo Lists...' sub-menu) these flags determine - which echo lists can be used by this node when processing area - manager add requests. - - Status: - This option determines the netmail status that will be set - when SBBSecho sends out an areafix message or a file attach. - Selecting this option toggles between None, Crash, and Hold - status. - - Direct: - When set to 'Yes' this option will add a Direct kludge line - to messages that SBBSecho sends out (or create DLO/DUT files - for FLO mailers). - - Passive: - Setting this option to 'Yes' will prevent messages from being - sent to this node without the need for altering the AREAS.BBS - file. This is useful for temporarily shutting off the messages - to this node. This option can be toggled on and off remotely - via an area manager request. - - Send Notify List: - This determines whether or not this node is sent a Notify List - when using that command line option in SBBSecho. - A Notify List is a netmail sent to the system operator of the - node showing options set for the node as well as connected - areas. - -Paths... - This option allows you to configure the paths and filenames which are - used by SBBSecho. Selecting this option will bring you to the - following sub-menu: - - �[�][?]���������������������������������������������������ͻ - � Paths and Filenames � - ���������������������������������������������������������� - � �Inbound Directory <Specified in SCFG> � - � �Secure Inbound (optional) None Specified � - � �Outbound Directory C:\IM\OUTBOUND\ � - � �Area File SCFG->DATA\AREAS.BBS � - � �Log File SCFG->DATA\SBBSECHO.LOG � - ����������������������������������������������������������ͼ - - Inbound Directory: - This is the directory where SBBSecho should look for inbound - mail packets. This is normally taken from whatever has been - set in the SCFG program. - - Secure Inbound (optional): - This is an optional directory where SBBSecho should look for - secure inbound mail packets. - - Outbound Directory: - This is the directory where SBBSecho will place outgoing mail - packets and bundles. - - Area File: - This is the path and filename of the file that SBBSecho will - use as it's AREAS.BBS file. By default SBBSecho looks for - the file AREAS.BBS in the data directory defined in SCFG. - - Log File: - This is the path and filename of the file that SBBSecho will - use when logging events. By default SBBSecho uses the file - SBBSECHO.LOG in the data directory defined in SCFG. - -Log Options... - This list allows you to toggle what events SBBSecho should place into - the logfile. Selecting this option will bring you to the following - sub-menu: - - �[�][?]����������������������������������ͻ - � Log Options � - ����������������������������������������� - � �ALL � - � �NONE � - � �DEFAULT � - � �Ignored NetMail Messages No � - � �NetMail for Unknown Users No � - � �Areafix NetMail Messages Yes � - � �Imported NetMail Messages Yes � - � �Packing Out-bound NetMail Yes � - � �Routing Out-bound NetMail Yes � - � �In-bound Packet Information Yes � - � �In-bound Security Violations Yes � - � �In-bound Grunged Messages Yes � - � �Disallowed Private EchoMail Yes � - � �Circular EchoMail Messages No � - � �Duplicate EchoMail Messages No � - � �Area Totals Yes � - � �Over-All Totals Yes � - �����������������������������������������ͼ - - Selecting ALL, NONE, or DEFAULT will toggle all of the options to - 'Yes', 'No', or to their default states, respectively. - - -Toggle Options... - These options allow you to toggle various features in SBBSecho. - Selecting this option will bring you to the following sub-menu: - - �[�][?]�������������������������������������������������ͻ - � Toggle Options � - �������������������������������������������������������� - � �Secure Operation Yes � - � �Swap for Executables Yes � - � �Fuzzy Zone Operation No � - � �Store PATH Lines in Message Base Yes � - � �Store SEEN-BY Lines in Message Base Yes � - � �Store Unknown Kludge Lines in Message Base Yes � - � �Allow Nodes to Add Areas in the AREAS.BBS List Yes � - ��������������������������������������������������������ͼ - - Secure Operation: - When set to 'Yes', SBBSecho will compare the origin of any - incoming mail packets to the nodes in the AREAS.BBS file - as messages are imported. If a packet password has been - defined for that node, it will also be compared to the - password contained in the mail packet. Packets and messages - failing this security will not be imported. - - Swap for Executables: - SBBSecho relies on external executable programs for extracting - and compressing mail bundles. This option tells SBBSecho to - swap out of memory when running any of these executables, - giving the executable programs more free memory to run in. - This option is only used in the 16-bit DOS flavor of SBBSecho. - - Fuzzy Zone Operation: - Some mail programs do not create netmail messages with zone - information (INTL kludge line) or may only do so when sending - between zones. This is a problem for systems that receive - netmail for multiple addresses with different zones (AKAs with - different zone numbers). Setting this option to "Yes" allows - SBBSecho to guess what the correct originating and destination - zone is based on the net and node portions of the destination - address in netmail message. - - Store PATH Lines in Message Base: - When set to 'Yes', SBBSecho will store the PATH lines from - incoming echomail in the Synchronet message base headers (not - the body text). This option is useful for troubleshooting - routing/duplicate message problems. - - Store SEEN-BY Lines in Message Base: - When set to 'Yes', SBBSecho will store the SEEN-BY lines from - incoming echomail in the Synchronet message base headers (not - the body text). This option is useful for troubleshooting - routing/duplicate message problems. - - Store Unknown Kludge Lines in Message Base: - When set to 'Yes', SBBSecho will store any unknown kludge lines - from incoming echomail in the Synchronet message base headers. - This option is useful for troubleshooting problems. - - Allow Nodes to Add Areas in the AREAS.BBS List: - When set to 'Yes', SBBSecho will allow nodes to add areas - (via area manager) which are listed in the AREAS.BBS list. - When set to 'No', SBBSecho will only allow nodes to add areas - from any additionally configured echo lists which they have - access to. - -Archive Programs... - This option allows you to add or remove archive programs from SBBSecho. - Selecting this option will bring you to the following menu: - - �[�][?]�������������ͻ - � Archive Programs � - �������������������� - � �ZIP � - � �ARC � - � �LZH � - � �ARJ � - � �PAK � - � �SQZ � - � �ZOO � - � � � - ��������������������ͼ - - At the Archive Programs... sub-menu, pressing the INSert key will allow - you to add a new archive program. Pressing the DELete key will remove - the currently highlighted archive program. And pressing ENTER on the - currently highlighted archive program will allow you to edit the - options for that particular prgram from a menu like the following (note - that the name of the archive program you are editing appears at the top - of the window): - - �[�][?]���������������������������������������������������ͻ - � ZIP � - ���������������������������������������������������������� - � �Packer Name ZIP � - � �Hexadecimal ID 504B � - � �Offset to Hex ID 0 � - � �Pack Command Line PKZIP %f %s � - � �Unpack Command Line PKUNZIP %f %s � - ����������������������������������������������������������ͼ - - Packer Name: - This is the name that will be used to reference this particular - archiving program. This is also the name that should be used - by nodes using areamanger to change their compression type - remotely. - - Hexadecimal ID: - This is a hexadecimal identifier that SBBSecho should look for - when determining the compression type used on incoming bundles. - In this example we are looking for the ID 'PK', '50' is the - hexadecimal value for the letter 'P' and '4B' is the - hexadecimal value for the letter 'K'. - - Offset to Hex ID: - This is the byte offset (from the beginning of the file) where - the hexadecimal ID for this archive program can be located. - In this example we are looking at an offset of 0 bytes from the - beginning of the file. - - Pack Command Line: - This is the command line used by this archiving program for - compressing files. The '%f' command line specifier will expand - to the name of the compressed file, the '%s' command line - specifier will expand to the name of the file being compressed. - - Unpack Command Line: - This is the command line used by the archiving program for - UNcompressing files. The '%f' command line specifier will - expand to the name of the compressed file, the '%s' command - line specifier will expand to the path where the file is - being extracted to. - -Additional Echo Lists... - This option allows you to add and remove additional echo lists which - can be used by SBBSecho for area manager add requests. Normally these - will be used in addition to your AREAS.BBS file. If you have the - toggle option 'Allow Nodes to Add Areas in the AREAS.BBS List' set to - 'No', you MUST create at least one additional echo list if you wish - to allow other nodes to add areas via area manager requests. - - Selecting this option will bring you to a sub-menu listing any - additional echo lists you currently have defined: - - �[�][?]������������������ͻ - � Additional Echo Lists � - ������������������������� - � �C:\BACKBONE\FIDONET.NA � - � � � - �������������������������ͼ - - Pressing the INSert key will allow you to add a new echo list, pressing - the DELete key will remove the currently highlighted echo list, and - pressing ENTER on the currently highlighted echo list will allow you to - edit information about that list: - - �[�][?]���������������������������������������������������ͻ - � Echo List � - ���������������������������������������������������������� - � �Echo List Path/Name C:\BACKBONE\FIDONET.NA � - � �Hub Address None � - � �Forward Password None � - � �Forward Requests No � - � �Echo List Flags BACK � - ����������������������������������������������������������ͼ - - Echo List Path/Name: - This is the full path and filename of the echo list you are - defining. This list should contain the areatag names of areas, - one per line, with any comments seperated from the areatag by - at least one space. - - Hub Address: - This is the address of the hub of the conferences contained - in this list. If an area is remotely added from this list - (using Areafix) this address is automatically added to the - AREAS.BBS file. - - Forward Password: - This is the area manager password to use when forwarding - requests. - - Forward Requests: - Setting this option to 'Yes' will cause SBBSecho to send a - request to the Hub Address specified to turn on an area from - this list. This happens when users remotely add areas using - Areafix and is not necessary if you are already receiving the - conferences in this list (ie: from Planet Connect). - - - Echo List Flags: - These are the flags required for a node to be able to gain - access to this particular echo list. These flags are defined - for each node from the 'Nodes...' sub-menu. - - Selecting this option will bring you to a sub-menu where you - may add and remove flags for this echo list. - - �[�][?]������������ͻ - � Echo List Flags � - ������������������� - � �BACK � - � � � - �������������������ͼ - -Running SBBSecho -================ -&&Running SBBSecho -$$EXECUTE_ - -The command line for executing SBBSECHO is very similar to SBBSFIDO, although -some command line switches have been eliminated. - -We suggest you use the following command lines: - -For importing: - - C:\SBBS\EXEC\SBBSECHO /LES! - -For exporting (Attach Mailer): - - C:\SBBS\EXEC\SBBSECHO /LIN - -For exporting (FLO Mailer): - - C:\SBBS\EXEC\SBBSECHO /LINF - -Remove all references to SBBSFIDO from your batch files (if you have any). -See the included MAILER.BAT as an example. - -Command Lines Switches -====================== -&&Command Lines Switches -$$SWITCHES - -usage: sbbsecho [cfg_file] [/switches] [sub_code] - -where: cfg_file is the filename of config file (default is ctrl\sbbsecho.cfg) - sub_code is the internal code for a sub-board (default is ALL subs) - -SBBSecho will execute normally (for Attach Mailer operation) with NO command -line switches required. Command lines switches are used to cause SBBSecho to -_do_ or _not_ do specific operations. When used, command line switches -are prepended by a slash (/) character. Multiple switches can be specified -in one grouping (multiple /switch sets are supported, but not required). -Switch letters are not case sensitive. The available switch letters and their -descriptions are: - -P: Do not import inbound packets or extract inbound bundles -X: Do not delete inbound packets (*.PKT) after they're imported -N: Do not import inbound netmail (packetized netmail and *.MSG) -D: Do not delete inbound netmail (*.MSG) after they're imported -I: Do not import inbound echomail -E: Do not export outbound echomail -M: Ignore echomail pointers (export all locally created echomail messages) -U: Update echomail pointers only (export no echomail messages) -T: Do not update echomail pointers (test export) -H: Export all echomail messages (including messages imported from FidoNet) -J: Ignore recieved bit on netmail (import even though flagged as received) -L: Create log file (data\sbbsecho.log) -R: Create report of import totals (text\sbbsecho.msg) -B: Import locally created netmail too (ignore the local flag) -A: Export ASCII characters only (override individual sub-board ex-ASCII strip) -F: Create packets for outbound netmail (necessary for FLO Mailer operation) -G: Generate notify lists -Y: Import netmail for unknown users to sysop (user #1) -O: Import all netmail regardless of destination address (unless flagged local) -S: Import private echomail override (strip private flag) -=: Change existing tear lines to === when exporting -!: Notify users via telegram of received echomail messages - -AREAFIX Commands -================ -&&Areafix Commands -$$AREAFIX_ - -Remote area manager, or areafix, commands are used by uplinks to be able to -turn echo areas off and on, list currently connected areas, and more. - -The following text is from the file AREAMGR.HLP which, after installation of -SBBSecho, should be located in your Synchronet EXEC directory. It lists the -area manager commands available to the nodes which have been configured using -the ECHOCFG program: - -Address all requests to 'SBBSecho' or 'AreaFix' (without quotes). -Your Area Manager password goes on the subject line. - -In the body of the message to Area Manager: - -[+]<areaname> Connect an area --<areaname> Disconnect an area -%HELP Request this message -%LIST Request a list of areas available to you -%QUERY Request a list of areas to which you are connected -%UNLINKED Request a list of areas to which you are not connected -%COMPRESSION <type> Change the compression type (ARC/ARJ/LZH/PAK/SQZ/ZIP/ZOO) -%PASSWORD <password> Change your AreaMgr password -%RESCAN Request a rescan of newly added areas -%ACTIVE Reconnect all temporarily disconnected areas -%PASSIVE Temporarily disconnect all connected areas -%FROM <address> Remote maintenance, must be the first command -%+ALL Connect all available areas -%-ALL Disconnect all areas -[---] Everything below the tear line is ignored - -NOTE: A compression type of NONE is also supported for uncompressed packets. - - diff --git a/src/sbbs2/echo/echocfg.c b/src/sbbs2/echo/echocfg.c deleted file mode 100644 index e7f1b3eb31..0000000000 --- a/src/sbbs2/echo/echocfg.c +++ /dev/null @@ -1,1127 +0,0 @@ -/* ECHOCFG.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Portions written by Allen Christiansen 1994-1996 */ - -#include <uifc.h> -#include <sys\stat.h> -#include "gen_defs.h" -#include "sbbsdefs.h" -#include "sbbsecho.h" - -char **opt; - -void bail(int code); -void main(); -char fexist(char *filespec); -char *faddrtoa(faddr_t addr); - -uchar node_swap=1; -long misc=0; -config_t cfg; - -unsigned _stklen=16000; - -void bail(int code) -{ - -if(code) - getch(); -uifcbail(); -exit(code); -} - -#define lprintf cprintf - -void main(int argc, char **argv) -{ - char str[256],*p; - int i,j,k,x,file,dflt,nodeop=0; - FILE *stream; - echolist_t savlistcfg; - nodecfg_t savnodecfg; - arcdef_t savarcdef; - -fprintf(stderr,"\nSBBSecho Configuration Version %s Developed 1995-1997 " - "Rob Swindell\n\n",SBBSECHO_VER); - -memset(&cfg,0,sizeof(config_t)); -if(argc>1) - strcpy(str,argv[1]); -else { - p=getenv("SBBSCTRL"); - if(!p) { - p=getenv("SBBSNODE"); - if(!p) { - printf("usage: echocfg [cfg_file]\n"); - exit(1); } - strcpy(str,p); - if(str[strlen(str)-1]!='\\') - strcat(str,"\\"); - strcat(str,"..\\CTRL\\SBBSECHO.CFG"); } - else { - strcpy(str,p); - if(str[strlen(str)-1]!='\\') - strcat(str,"\\"); - strcat(str,"SBBSECHO.CFG"); } } -strcpy(cfg.cfgfile,str); -strupr(cfg.cfgfile); - -read_cfg(); - -savnum=0; -if((opt=(char **)MALLOC(sizeof(char *)*300))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } -for(i=0;i<300;i++) - if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } -uifcini(); -sprintf(str,"SBBSecho Configuration v%s",SBBSECHO_VER); -uscrn(str); - -dflt=0; -while(1) { - helpbuf= -" SBBSecho Configuration \r\n\r\n" -"Move through the various options using the arrow keys. Select the\r\n" -"highlighted options by pressing ENTER.\r\n\r\n"; - i=0; - sprintf(opt[i++],"%-30.30s %s","Mailer Type" - ,misc&FLO_MAILER ? "Binkley/FLO":"FrontDoor/Attach"); - sprintf(opt[i++],"%-30.30s %luK","Maximum Packet Size" - ,cfg.maxpktsize/1024UL); - sprintf(opt[i++],"%-30.30s %luK","Maximum Bundle Size" - ,cfg.maxbdlsize/1024UL); - if(cfg.notify) - sprintf(str,"User #%u",cfg.notify); - else - strcpy(str,"Disabled"); - sprintf(opt[i++],"%-30.30s %s","Areafix Failure Notification",str); - sprintf(opt[i++],"Nodes..."); - sprintf(opt[i++],"Paths..."); - sprintf(opt[i++],"Log Options..."); - sprintf(opt[i++],"Toggle Options..."); - sprintf(opt[i++],"Archive Programs..."); - sprintf(opt[i++],"Additional Echo Lists..."); - opt[i][0]=NULL; - switch(ulist(WIN_ORG|WIN_MID|WIN_ACT|WIN_ESC,0,0,52,&dflt,0 - ,cfg.cfgfile,opt)) { - - case 0: - misc^=FLO_MAILER; - break; - - case 1: -helpbuf= -" Maximum Packet Size \r\n\r\n" -"This is the maximum file size that SBBSecho will create when placing\r\n" -"outgoing messages into packets. The default size is 250k.\r\n"; - sprintf(str,"%lu",cfg.maxpktsize); - uinput(WIN_MID|WIN_BOT,0,0,"Maximum Packet Size",str - ,9,K_EDIT|K_NUMBER); - cfg.maxpktsize=atol(str); - break; - - case 2: -helpbuf= -" Maximum Bundle Size \r\n\r\n" -"This is the maximum file size that SBBSecho will create when placing\r\n" -"outgoing packets into bundles. The default size is 250k.\r\n"; - sprintf(str,"%lu",cfg.maxbdlsize); - uinput(WIN_MID|WIN_BOT,0,0,"Maximum Bundle Size",str - ,9,K_EDIT|K_NUMBER); - cfg.maxbdlsize=atol(str); - break; - - case 3: -helpbuf= -" Areafix Failure Notification \r\n\r\n" -"Setting this option to a user number (usually #1), enables the\r\n" -"automatic notification of that user, via e-mail, of failed areafix\r\n" -"attempts. Setting this option to 0, disables this feature.\r\n"; - sprintf(str,"%u",cfg.notify); - uinput(WIN_MID|WIN_BOT,0,0,"Areafix Notification User Number",str - ,5,K_EDIT|K_NUMBER); - cfg.notify=atoi(str); - break; - - case 4: -helpbuf= -" Nodes... \r\n\r\n" -"From this menu you can configure the area manager options for your\r\n" -"uplink nodes.\r\n"; - i=0; - while(1) { - for(j=0;j<cfg.nodecfgs;j++) - strcpy(opt[j],faddrtoa(cfg.nodecfg[j].faddr)); - opt[j][0]=0; - i=ulist(WIN_ORG|WIN_INS|WIN_DEL|WIN_ACT|WIN_GET|WIN_PUT - |WIN_INSACT|WIN_DELACT|WIN_XTR - ,0,0,0,&i,0,"Nodes",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - str[0]=0; -helpbuf= -" Address \r\n\r\n" -"This is the FidoNet style address of the node you wish to add\r\n"; - if(uinput(WIN_MID,0,0 - ,"Node Address (ALL wildcard allowed)",str - ,25,K_EDIT)<1) - continue; - if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg - ,sizeof(nodecfg_t)*(cfg.nodecfgs+1)))==NULL) { - printf("\nMemory Allocation Error\n"); - exit(1); } - for(j=cfg.nodecfgs;j>i;j--) - memcpy(&cfg.nodecfg[j],&cfg.nodecfg[j-1] - ,sizeof(nodecfg_t)); - cfg.nodecfgs++; - memset(&cfg.nodecfg[i],0,sizeof(nodecfg_t)); - cfg.nodecfg[i].faddr=atofaddr(str); - continue; } - - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - cfg.nodecfgs--; - if(cfg.nodecfgs<=0) { - cfg.nodecfgs=0; - continue; } - for(j=i;j<cfg.nodecfgs;j++) - memcpy(&cfg.nodecfg[j],&cfg.nodecfg[j+1] - ,sizeof(nodecfg_t)); - if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg - ,sizeof(nodecfg_t)*(cfg.nodecfgs)))==NULL) { - printf("\nMemory Allocation Error\n"); - exit(1); } - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - memcpy(&savnodecfg,&cfg.nodecfg[i],sizeof(nodecfg_t)); - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - memcpy(&cfg.nodecfg[i],&savnodecfg,sizeof(nodecfg_t)); - continue; } - while(1) { -helpbuf= -" Node Options \r\n\r\n" -"These are the configurable options available for this node.\r\n"; - j=0; - sprintf(opt[j++],"%-20.20s %s","Address" - ,faddrtoa(cfg.nodecfg[i].faddr)); - sprintf(opt[j++],"%-20.20s %s","Archive Type" - ,cfg.nodecfg[i].arctype>cfg.arcdefs ? - "None":cfg.arcdef[cfg.nodecfg[i].arctype].name); - sprintf(opt[j++],"%-20.20s %s","Packet Type" - ,cfg.nodecfg[i].pkt_type==PKT_TWO ? "2" - :cfg.nodecfg[i].pkt_type==PKT_TWO_TWO ? "2.2":"2+"); - sprintf(opt[j++],"%-20.20s %s","Packet Password" - ,cfg.nodecfg[i].pktpwd); - sprintf(opt[j++],"%-20.20s %s","Areafix Password" - ,cfg.nodecfg[i].password); - str[0]=0; - for(k=0;k<cfg.nodecfg[i].numflags;k++) { - strcat(str,cfg.nodecfg[i].flag[k].flag); - strcat(str," "); } - sprintf(opt[j++],"%-20.20s %s","Areafix Flags",str); - sprintf(opt[j++],"%-20.20s %s","Status" - ,cfg.nodecfg[i].attr&ATTR_CRASH ? "Crash" - :cfg.nodecfg[i].attr&ATTR_HOLD ? "Hold" : "None"); - sprintf(opt[j++],"%-20.20s %s","Direct" - ,cfg.nodecfg[i].attr&ATTR_DIRECT ? "Yes":"No"); - sprintf(opt[j++],"%-20.20s %s","Passive" - ,cfg.nodecfg[i].attr&ATTR_PASSIVE ? "Yes":"No"); - sprintf(opt[j++],"%-20.20s %s","Send Notify List" - ,cfg.nodecfg[i].attr&SEND_NOTIFY ? "Yes" : "No"); - if(misc&FLO_MAILER) - sprintf(opt[j++],"%-20.20s %s","Route To" - ,cfg.nodecfg[i].route.zone - ? faddrtoa(cfg.nodecfg[i].route) : "Disabled"); - opt[j][0]=0; - k=ulist(WIN_MID|WIN_ACT,0,0,40,&nodeop,0 - ,faddrtoa(cfg.nodecfg[i].faddr),opt); - if(k==-1) - break; - switch(k) { - case 0: -helpbuf= -" Address \r\n\r\n" -"This is the FidoNet style address of this node.\r\n"; - strcpy(str,faddrtoa(cfg.nodecfg[i].faddr)); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Node Address (ALL wildcard allowed)",str - ,25,K_EDIT|K_UPPER); - cfg.nodecfg[i].faddr=atofaddr(str); - break; - case 1: -helpbuf= -" Archive Type \r\n\r\n" -"This is the compression type that will be used for compressing packets\r\n" -"to and decompressing packets from this node.\r\n"; - for(j=0;j<cfg.arcdefs;j++) - strcpy(opt[j],cfg.arcdef[j].name); - strcpy(opt[j++],"None"); - opt[j][0]=0; - if(cfg.nodecfg[i].arctype<j) - j=cfg.nodecfg[i].arctype; - k=ulist(WIN_RHT|WIN_SAV,0,0,0,&j,0 - ,"Archive Type",opt); - if(k==-1) - break; - if(k>=cfg.arcdefs) - cfg.nodecfg[i].arctype=0xffff; - else - cfg.nodecfg[i].arctype=k; - break; - case 2: -helpbuf= -" Packet Type \r\n\r\n" -"This is the packet header type that will be used in mail packets to\r\n" -"this node. SBBSecho defaults to using type 2.2.\r\n"; - j=0; - strcpy(opt[j++],"2+"); - strcpy(opt[j++],"2.2"); - strcpy(opt[j++],"2"); - opt[j][0]=0; - j=cfg.nodecfg[i].pkt_type; - k=ulist(WIN_RHT|WIN_SAV,0,0,0,&j,0,"Packet Type" - ,opt); - if(k==-1) - break; - cfg.nodecfg[i].pkt_type=k; - break; - case 3: -helpbuf= -" Packet Password \r\n\r\n" -"This is an optional password that SBBSecho will place into packets\r\n" -"destined for this node.\r\n"; - uinput(WIN_MID|WIN_SAV,0,0 - ,"Packet Password (optional)" - ,cfg.nodecfg[i].pktpwd,8,K_EDIT|K_UPPER); - break; - case 4: -helpbuf= -" Areafix Password \r\n\r\n" -"This is the password that will be used by this node when doing remote\r\n" -"areamanager functions.\r\n"; - uinput(WIN_MID|WIN_SAV,0,0 - ,"Areafix Password" - ,cfg.nodecfg[i].password,8,K_EDIT|K_UPPER); - break; - case 5: -helpbuf= -" Areafix Flag \r\n\r\n" -"This is a flag to to be given to this node allowing access to one or\r\n" -"more of the configured echo lists\r\n"; - while(1) { - for(j=0;j<cfg.nodecfg[i].numflags;j++) - strcpy(opt[j],cfg.nodecfg[i].flag[j].flag); - opt[j][0]=0; - k=ulist(WIN_SAV|WIN_INS|WIN_DEL|WIN_ACT| - WIN_XTR|WIN_INSACT|WIN_DELACT|WIN_RHT - ,0,0,0,&k,0,"Areafix Flags",opt); - if(k==-1) - break; - if((k&MSK_ON)==MSK_INS) { - k&=MSK_OFF; - str[0]=0; - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Areafix Flag",str,4 - ,K_EDIT|K_UPPER)<1) - continue; - if((cfg.nodecfg[i].flag=(flag_t *) - REALLOC(cfg.nodecfg[i].flag - ,sizeof(flag_t)* - (cfg.nodecfg[i].numflags+1)))==NULL) { - printf("\nMemory Allocation Error\n"); - exit(1); } - for(j=cfg.nodecfg[i].numflags;j>i;j--) - memcpy(&cfg.nodecfg[i].flag[j] - ,&cfg.nodecfg[i].flag[j-1] - ,sizeof(flag_t)); - cfg.nodecfg[i].numflags++; - memset(&cfg.nodecfg[i].flag[k].flag - ,0,sizeof(flag_t)); - strcpy(cfg.nodecfg[i].flag[k].flag,str); - continue; } - - if((k&MSK_ON)==MSK_DEL) { - k&=MSK_OFF; - cfg.nodecfg[i].numflags--; - if(cfg.nodecfg[i].numflags<=0) { - cfg.nodecfg[i].numflags=0; - continue; } - for(j=k;j<cfg.nodecfg[i].numflags;j++) - strcpy(cfg.nodecfg[i].flag[j].flag - ,cfg.nodecfg[i].flag[j+1].flag); - if((cfg.nodecfg[i].flag=(flag_t *) - REALLOC(cfg.nodecfg[i].flag - ,sizeof(flag_t)* - (cfg.nodecfg[i].numflags)))==NULL) { - printf("\nMemory Allocation Error\n"); - exit(1); } - continue; } - strcpy(str,cfg.nodecfg[i].flag[k].flag); - uinput(WIN_MID|WIN_SAV,0,0,"Areafix Flag" - ,str,4,K_EDIT|K_UPPER); - strcpy(cfg.nodecfg[i].flag[k].flag,str); - continue; } - break; - case 6: - if(cfg.nodecfg[i].attr&ATTR_CRASH) { - cfg.nodecfg[i].attr^=ATTR_CRASH; - cfg.nodecfg[i].attr|=ATTR_HOLD; - break; } - if(cfg.nodecfg[i].attr&ATTR_HOLD) { - cfg.nodecfg[i].attr^=ATTR_HOLD; - break; } - cfg.nodecfg[i].attr|=ATTR_CRASH; - break; - case 7: - cfg.nodecfg[i].attr^=ATTR_DIRECT; - break; - case 8: - cfg.nodecfg[i].attr^=ATTR_PASSIVE; - break; - case 9: - cfg.nodecfg[i].attr^=SEND_NOTIFY; - break; - case 10: -helpbuf= -" Route To \r\n\r\n" -"When using a FLO type mailer, this is the node number of an address\r\n" -"to route mail to for this node.\r\n"; - strcpy(str,faddrtoa(cfg.nodecfg[i].route)); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Node Address to Route To",str - ,25,K_EDIT); - if(str[0]) - cfg.nodecfg[i].route=atofaddr(str); - break; - } } } - break; - - case 5: -helpbuf= -" Paths... \r\n\r\n" -"From this menu you can configure the paths that SBBSecho will use\r\n" -"when importing and exporting.\r\n"; - j=0; - while(1) { - i=0; - sprintf(opt[i++],"%-30.30s %s","Inbound Directory" - ,cfg.inbound[0] ? cfg.inbound : "<Specified in SCFG>"); - sprintf(opt[i++],"%-30.30s %s","Secure Inbound (optional)" - ,cfg.secure[0] ? cfg.secure : "None Specified"); - sprintf(opt[i++],"%-30.30s %s","Outbound Directory" - ,cfg.outbound); - sprintf(opt[i++],"%-30.30s %s","Area File" - ,cfg.areafile[0] ? cfg.areafile - : "SCFG->DATA\\AREAS.BBS"); - sprintf(opt[i++],"%-30.30s %s","Log File" - ,cfg.logfile[0] ? cfg.logfile - : "SCFG->DATA\\SBBSECHO.LOG"); - opt[i][0]=NULL; - j=ulist(WIN_MID|WIN_ACT,0,0,60,&j,0 - ,"Paths and Filenames",opt); - if(j==-1) - break; - switch(j) { - case 0: -helpbuf= -" Inbound Directory \r\n\r\n" -"This is the complete path (drive and directory) where your front\r\n" -"end mailer stores, and where SBBSecho will look for, incoming message\r\n" -"bundles and packets."; - uinput(WIN_MID|WIN_SAV,0,0,"Inbound",cfg.inbound - ,50,K_EDIT|K_UPPER); - break; - - case 1: -helpbuf= -" Secure Inbound Directory \r\n\r\n" -"This is the complete path (drive and directory) where your front\r\n" -"end mailer stores, and where SBBSecho will look for, incoming message\r\n" -"bundles and packets for SECURE sessions."; - uinput(WIN_MID|WIN_SAV,0,0,"Secure Inbound",cfg.secure - ,50,K_EDIT|K_UPPER); - break; - - case 2: -helpbuf= -" Outbound Directory \r\n\r\n" -"This is the complete path (drive and directory) where your front\r\n" -"end mailer will look for, and where SBBSecho will place, outgoing\r\n" -"message bundles and packets."; - uinput(WIN_MID|WIN_SAV,0,0,"Outbound",cfg.outbound - ,50,K_EDIT|K_UPPER); - break; - - case 3: -helpbuf= -" Area File \r\n\r\n" -"This is the complete path (drive, directory, and filename) of the\r\n" -"file SBBSecho will use as your AREAS.BBS file."; - uinput(WIN_MID|WIN_SAV,0,0,"Areafile",cfg.areafile - ,50,K_EDIT|K_UPPER); - break; - - case 4: -helpbuf= -" Log File \r\n\r\n" -"This is the complete path (drive, directory, and filename) of the\r\n" -"file SBBSecho will use to log information each time it is run."; - uinput(WIN_MID|WIN_SAV,0,0,"Logfile",cfg.logfile - ,50,K_EDIT|K_UPPER); - break; } } - break; - case 6: -helpbuf= -" Log Options \r\n" -"\r\n" -"Each loggable item can be toggled off or on from this menu. You must run\r\n" -"SBBSecho with the /L command line option for any of these items to be\r\n" -"logged."; - j=0; - while(1) { - i=0; - strcpy(opt[i++],"ALL"); - strcpy(opt[i++],"NONE"); - strcpy(opt[i++],"DEFAULT"); - sprintf(opt[i++],"%-35.35s%-3.3s","Ignored NetMail Messages" - ,cfg.log&LOG_IGNORED ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","NetMail for Unknown Users" - ,cfg.log&LOG_UNKNOWN ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","Areafix NetMail Messages" - ,cfg.log&LOG_AREAFIX ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","Imported NetMail Messages" - ,cfg.log&LOG_IMPORTED ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","Packing Out-bound NetMail" - ,cfg.log&LOG_PACKING ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","Routing Out-bound NetMail" - ,cfg.log&LOG_ROUTING ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","In-bound Packet Information" - ,cfg.log&LOG_PACKETS ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","In-bound Security Violations" - ,cfg.log&LOG_SECURITY ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","In-bound Grunged Messages" - ,cfg.log&LOG_GRUNGED ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","Disallowed Private EchoMail" - ,cfg.log&LOG_PRIVATE ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","Circular EchoMail Messages" - ,cfg.log&LOG_CIRCULAR ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","Duplicate EchoMail Messages" - ,cfg.log&LOG_DUPES ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","Area Totals" - ,cfg.log&LOG_AREA_TOTALS ? "Yes":"No"); - sprintf(opt[i++],"%-35.35s%-3.3s","Over-All Totals" - ,cfg.log&LOG_TOTALS ? "Yes":"No"); - opt[i][0]=NULL; - j=ulist(0,0,0,43,&j,0,"Log Options",opt); - if(j==-1) - break; - switch(j) { - case 0: - cfg.log=~0L; - break; - case 1: - cfg.log=0; - break; - case 2: - cfg.log=LOG_DEFAULTS; - break; - case 3: - cfg.log^=LOG_IGNORED; - break; - case 4: - cfg.log^=LOG_UNKNOWN; - break; - case 5: - cfg.log^=LOG_AREAFIX; - break; - case 6: - cfg.log^=LOG_IMPORTED; - break; - case 7: - cfg.log^=LOG_PACKING; - break; - case 8: - cfg.log^=LOG_ROUTING; - break; - case 9: - cfg.log^=LOG_PACKETS; - break; - case 10: - cfg.log^=LOG_SECURITY; - break; - case 11: - cfg.log^=LOG_GRUNGED; - break; - case 12: - cfg.log^=LOG_PRIVATE; - break; - case 13: - cfg.log^=LOG_CIRCULAR; - break; - case 14: - cfg.log^=LOG_DUPES; - break; - case 15: - cfg.log^=LOG_AREA_TOTALS; - break; - case 16: - cfg.log^=LOG_TOTALS; - break; } } - break; - - - case 7: -helpbuf= -"Secure Operation tells SBBSecho to check the AREAS.BBS file to insure\r\n" -" that the packet origin exists there as well as check the password of\r\n" -" that node (if configured).\r\n\r\n" -"Swap for Executables tells SBBSecho whether or not it should swap\r\n" -" out of memory when executing external executables.\r\n\r\n" -"Fuzzy Zone Operation when set to yes if SBBSecho receives an inbound\r\n" -" netmail with no international zone information, it will compare the\r\n" -" net/node of the destination to the net/node information in your AKAs\r\n" -" and assume the zone of a matching AKA.\r\n\r\n" -"Store PATH/SEEN-BY/Unkown Kludge Lines in Message Base allows you to\r\n" -" determine whether or not SBBSecho will store this information from\r\n" -" incoming messages in the Synchronet message base.\r\n\r\n" -"Allow Nodes to Add Areas in the AREAS.BBS List when set to YES allows\r\n" -" uplinks to add areas listed in the AREAS.BBS file\r\n"; - j=0; - while(1) { - i=0; - sprintf(opt[i++],"%-50.50s%-3.3s","Secure Operation" - ,misc&SECURE ? "Yes":"No"); - sprintf(opt[i++],"%-50.50s%-3.3s","Swap for Executables" - ,node_swap ? "Yes":"No"); - sprintf(opt[i++],"%-50.50s%-3.3s","Fuzzy Zone Operation" - ,misc&FUZZY_ZONE ? "Yes":"No"); - sprintf(opt[i++],"%-50.50s%-3.3s","Store PATH Lines in " - "Message Base",misc&STORE_SEENBY ? "Yes":"No"); - sprintf(opt[i++],"%-50.50s%-3.3s","Store SEEN-BY Lines in " - "Message Base",misc&STORE_PATH ? "Yes":"No"); - sprintf(opt[i++],"%-50.50s%-3.3s","Store Unknown Kludge Lines " - "in Message Base",misc&STORE_KLUDGE ? "Yes":"No"); - sprintf(opt[i++],"%-50.50s%-3.3s","Allow Nodes to Add Areas " - "in the AREAS.BBS List",misc&ELIST_ONLY?"No":"Yes"); - sprintf(opt[i++],"%-50.50s%-3.3s","Kill/Ignore Empty NetMail " - "Messages",misc&KILL_EMPTY_MAIL ? "Yes":"No"); - opt[i][0]=NULL; - j=ulist(0,0,0,60,&j,0,"Toggle Options",opt); - if(j==-1) - break; - switch(j) { - case 0: - misc^=SECURE; - break; - case 1: - if(node_swap) - node_swap=0; - else - node_swap=1; - break; - case 2: - misc^=FUZZY_ZONE; - break; - case 3: - misc^=STORE_SEENBY; - break; - case 4: - misc^=STORE_PATH; - break; - case 5: - misc^=STORE_KLUDGE; - break; - case 6: - misc^=ELIST_ONLY; - break; - case 7: - misc^=KILL_EMPTY_MAIL; - } } - break; - case 8: -helpbuf= -" Archive Programs \r\n\r\n" -"These are the archiving programs (types) which are available for\r\n" -"compressing outgoing packets.\r\n"; - i=0; - while(1) { - for(j=0;j<cfg.arcdefs;j++) - sprintf(opt[j],"%-30.30s",cfg.arcdef[j].name); - opt[j][0]=0; - i=ulist(WIN_ORG|WIN_INS|WIN_DEL|WIN_ACT|WIN_GET|WIN_PUT - |WIN_INSACT|WIN_DELACT|WIN_XTR - ,0,0,0,&i,0,"Archive Programs",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - str[0]=0; -helpbuf= -" Packer Name \r\n\r\n" -"This is the identifying name of the archiving program\r\n"; - if(uinput(WIN_MID,0,0 - ,"Packer Name",str,25,K_EDIT|K_UPPER)<1) - continue; - if((cfg.arcdef=(arcdef_t *)REALLOC(cfg.arcdef - ,sizeof(arcdef_t)*(cfg.arcdefs+1)))==NULL) { - printf("\nMemory Allocation Error\n"); - exit(1); } - for(j=cfg.arcdefs;j>i;j--) - memcpy(&cfg.arcdef[j],&cfg.arcdef[j-1] - ,sizeof(arcdef_t)); - strcpy(cfg.arcdef[j].name - ,cfg.arcdef[j-1].name); - cfg.arcdefs++; - memset(&cfg.arcdef[i],0,sizeof(arcdef_t)); - strcpy(cfg.arcdef[i].name,str); - continue; } - - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - cfg.arcdefs--; - if(cfg.arcdefs<=0) { - cfg.arcdefs=0; - continue; } - for(j=i;j<cfg.arcdefs;j++) - memcpy(&cfg.arcdef[j],&cfg.arcdef[j+1] - ,sizeof(arcdef_t)); - if((cfg.arcdef=(arcdef_t *)REALLOC(cfg.arcdef - ,sizeof(arcdef_t)*(cfg.arcdefs)))==NULL) { - printf("\nMemory Allocation Error\n"); - exit(1); } - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - memcpy(&savarcdef,&cfg.arcdef[i],sizeof(arcdef_t)); - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - memcpy(&cfg.arcdef[i],&savarcdef,sizeof(arcdef_t)); - continue; } - while(1) { - j=0; - sprintf(opt[j++],"%-20.20s %s","Packer Name" - ,cfg.arcdef[i].name); - sprintf(opt[j++],"%-20.20s %s","Hexadecimal ID" - ,cfg.arcdef[i].hexid); - sprintf(opt[j++],"%-20.20s %u","Offset to Hex ID" - ,cfg.arcdef[i].byteloc); - sprintf(opt[j++],"%-20.20s %s","Pack Command Line" - ,cfg.arcdef[i].pack); - sprintf(opt[j++],"%-20.20s %s","Unpack Command Line" - ,cfg.arcdef[i].unpack); - opt[j][0]=0; - sprintf(str,"%.30s",cfg.arcdef[i].name); - k=ulist(WIN_MID|WIN_ACT,0,0,60,&nodeop,0,str,opt); - if(k==-1) - break; - switch(k) { - case 0: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Packer Name",cfg.arcdef[i].name,25 - ,K_EDIT|K_UPPER); - break; - case 1: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Hexadecimal ID",cfg.arcdef[i].hexid,25 - ,K_EDIT|K_UPPER); - break; - case 2: - sprintf(str,"%u",cfg.arcdef[i].byteloc); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Offset to Hex ID",str,5 - ,K_NUMBER|K_EDIT); - cfg.arcdef[i].byteloc=atoi(str); - break; - case 3: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Pack Command Line",cfg.arcdef[i].pack,50 - ,K_EDIT); - break; - case 4: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Unpack Command Line",cfg.arcdef[i].unpack,50 - ,K_EDIT); - break; - } } } - break; - case 9: -helpbuf= -" Additional Echo Lists \r\n\r\n" -"This feature allows you to specify echo lists (in addition to your\r\n" -"AREAS.BBS file) for SBBSecho to search for area add requests.\r\n"; - i=0; - while(1) { - for(j=0;j<cfg.listcfgs;j++) - sprintf(opt[j],"%-50.50s",cfg.listcfg[j].listpath); - opt[j][0]=0; - i=ulist(WIN_ORG|WIN_INS|WIN_DEL|WIN_ACT|WIN_GET|WIN_PUT - |WIN_INSACT|WIN_DELACT|WIN_XTR - ,0,0,0,&i,0,"Additional Echo Lists",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - str[0]=0; -helpbuf= -" Echo List \r\n\r\n" -"This is the path and filename of the echo list file you wish\r\n" -"to add.\r\n"; - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Echo List Path/Name",str,50,K_EDIT|K_UPPER)<1) - continue; - if((cfg.listcfg=(echolist_t *)REALLOC(cfg.listcfg - ,sizeof(echolist_t)*(cfg.listcfgs+1)))==NULL) { - printf("\nMemory Allocation Error\n"); - exit(1); } - for(j=cfg.listcfgs;j>i;j--) - memcpy(&cfg.listcfg[j],&cfg.listcfg[j-1] - ,sizeof(echolist_t)); - cfg.listcfgs++; - memset(&cfg.listcfg[i],0,sizeof(echolist_t)); - strcpy(cfg.listcfg[i].listpath,str); - continue; } - - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - cfg.listcfgs--; - if(cfg.listcfgs<=0) { - cfg.listcfgs=0; - continue; } - for(j=i;j<cfg.listcfgs;j++) - memcpy(&cfg.listcfg[j],&cfg.listcfg[j+1] - ,sizeof(echolist_t)); - if((cfg.listcfg=(echolist_t *)REALLOC(cfg.listcfg - ,sizeof(echolist_t)*(cfg.listcfgs)))==NULL) { - printf("\nMemory Allocation Error\n"); - exit(1); } - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - memcpy(&savlistcfg,&cfg.listcfg[i],sizeof(echolist_t)); - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - memcpy(&cfg.listcfg[i],&savlistcfg,sizeof(echolist_t)); - continue; } - while(1) { - j=0; - sprintf(opt[j++],"%-20.20s %.19s","Echo List Path/Name" - ,cfg.listcfg[i].listpath); - sprintf(opt[j++],"%-20.20s %s","Hub Address" - ,(cfg.listcfg[i].forward.zone) ? - faddrtoa(cfg.listcfg[i].forward) : "None"); - sprintf(opt[j++],"%-20.20s %s","Forward Password" - ,(cfg.listcfg[i].password[0]) ? - cfg.listcfg[i].password : "None"); - sprintf(opt[j++],"%-20.20s %s","Forward Requests" - ,(cfg.listcfg[i].misc&NOFWD) ? "No" : "Yes"); - str[0]=0; - for(k=0;k<cfg.listcfg[i].numflags;k++) { - strcat(str,cfg.listcfg[i].flag[k].flag); - strcat(str," "); } - sprintf(opt[j++],"%-20.20s %s","Echo List Flags",str); - opt[j][0]=0; - k=ulist(WIN_MID|WIN_ACT,0,0,60,&nodeop,0,"Echo List",opt); - if(k==-1) - break; - switch(k) { - case 0: - strcpy(str,cfg.listcfg[i].listpath); - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Echo List Path/Name",str,50 - ,K_EDIT|K_UPPER)<1) - continue; - strcpy(cfg.listcfg[i].listpath,str); - break; - case 1: - if(cfg.listcfg[i].forward.zone) - strcpy(str,faddrtoa(cfg.listcfg[i].forward)); - else - str[0]=0; - uinput(WIN_MID|WIN_SAV,0,0 - ,"Hub Address",str - ,25,K_EDIT); - if(str[0]) - cfg.listcfg[i].forward=atofaddr(str); - else - memset(&cfg.listcfg[i].forward,0 - ,sizeof(faddr_t)); - break; - case 2: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Password to use when forwarding requests" - ,cfg.listcfg[i].password,25,K_EDIT|K_UPPER); - break; - case 3: - cfg.listcfg[i].misc^=NOFWD; - if(cfg.listcfg[i].misc&NOFWD) - cfg.listcfg[i].password[0]=0; - break; - case 4: - while(1) { - for(j=0;j<cfg.listcfg[i].numflags;j++) - strcpy(opt[j],cfg.listcfg[i].flag[j].flag); - opt[j][0]=0; - x=ulist(WIN_SAV|WIN_INS|WIN_DEL|WIN_ACT| - WIN_XTR|WIN_INSACT|WIN_DELACT|WIN_RHT - ,0,0,0,&x,0,"Echo List Flags",opt); - if(x==-1) - break; - if((x&MSK_ON)==MSK_INS) { - x&=MSK_OFF; - str[0]=0; -helpbuf= -" Echo List Flag \r\n\r\n" -"These flags determine which nodes have access to the current\r\n" -"echolist file\r\n"; - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Echo List Flag",str,4 - ,K_EDIT|K_UPPER)<1) - continue; - if((cfg.listcfg[i].flag=(flag_t *) - REALLOC(cfg.listcfg[i].flag - ,sizeof(flag_t)* - (cfg.listcfg[i].numflags+1)))==NULL) { - printf("\nMemory Allocation Error\n"); - exit(1); } - for(j=cfg.listcfg[i].numflags;j>x;j--) - memcpy(&cfg.listcfg[i].flag[j] - ,&cfg.listcfg[i].flag[j-1] - ,sizeof(flag_t)); - cfg.listcfg[i].numflags++; - memset(&cfg.listcfg[i].flag[x].flag - ,0,sizeof(flag_t)); - strcpy(cfg.listcfg[i].flag[x].flag,str); - continue; } - - if((x&MSK_ON)==MSK_DEL) { - x&=MSK_OFF; - cfg.listcfg[i].numflags--; - if(cfg.listcfg[i].numflags<=0) { - cfg.listcfg[i].numflags=0; - continue; } - for(j=x;j<cfg.listcfg[i].numflags;j++) - strcpy(cfg.listcfg[i].flag[j].flag - ,cfg.listcfg[i].flag[j+1].flag); - if((cfg.listcfg[i].flag=(flag_t *) - REALLOC(cfg.listcfg[i].flag - ,sizeof(flag_t)* - (cfg.listcfg[i].numflags)))==NULL) { - printf("\nMemory Allocation Error\n"); - exit(1); } - continue; } - strcpy(str,cfg.listcfg[i].flag[x].flag); -helpbuf= -" Echo List Flag \r\n\r\n" -"These flags determine which nodes have access to the current\r\n" -"echolist file\r\n"; - uinput(WIN_MID|WIN_SAV,0,0,"Echo List Flag" - ,str,4,K_EDIT|K_UPPER); - strcpy(cfg.listcfg[i].flag[x].flag,str); - continue; } - break; - } } } - break; - - case -1: -helpbuf= -" Save Configuration File \r\n\r\n" -"Select Yes to save the config file, No to quit without saving,\r\n" -"or hit ESC to go back to the menu.\r\n\r\n"; - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=ulist(WIN_MID,0,0,0,&i,0,"Save Config File",opt); - if(i==-1) break; - if(i) bail(0); - if((file=open(cfg.cfgfile - ,O_WRONLY|O_BINARY|O_CREAT|O_DENYALL|O_TRUNC,S_IWRITE))==-1) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error opening %s\r\n",cfg.cfgfile); - bail(1); } - if((stream=fdopen(file,"wb"))==NULL) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error fdopen %s\r\n",cfg.cfgfile); - bail(1); } - if(!node_swap) - fprintf(stream,"NOSWAP\r\n"); - if(cfg.notify) - fprintf(stream,"NOTIFY %u\r\n",cfg.notify); - if(misc&SECURE) - fprintf(stream,"SECURE_ECHOMAIL\r\n"); - if(misc&KILL_EMPTY_MAIL) - fprintf(stream,"KILL_EMPTY\r\n"); - if(misc&STORE_SEENBY) - fprintf(stream,"STORE_SEENBY\r\n"); - if(misc&STORE_PATH) - fprintf(stream,"STORE_PATH\r\n"); - if(misc&STORE_KLUDGE) - fprintf(stream,"STORE_KLUDGE\r\n"); - if(misc&FUZZY_ZONE) - fprintf(stream,"FUZZY_ZONE\r\n"); - if(misc&FLO_MAILER) - fprintf(stream,"FLO_MAILER\r\n"); - if(misc&ELIST_ONLY) - fprintf(stream,"ELIST_ONLY\r\n"); - if(cfg.areafile[0]) - fprintf(stream,"AREAFILE %s\r\n",cfg.areafile); - if(cfg.logfile[0]) - fprintf(stream,"LOGFILE %s\r\n",cfg.logfile); - if(cfg.log!=LOG_DEFAULTS) { - if(cfg.log==0xffffffffUL) - fprintf(stream,"LOG ALL\r\n"); - else if(cfg.log==0L) - fprintf(stream,"LOG NONE\r\n"); - else - fprintf(stream,"LOG %08lX\r\n",cfg.log); } - if(cfg.inbound[0]) - fprintf(stream,"INBOUND %s\r\n",cfg.inbound); - if(cfg.secure[0]) - fprintf(stream,"SECURE_INBOUND %s\r\n",cfg.secure); - if(cfg.outbound[0]) - fprintf(stream,"OUTBOUND %s\r\n",cfg.outbound); - if(cfg.maxbdlsize!=DFLT_BDL_SIZE) - fprintf(stream,"ARCSIZE %lu\r\n",cfg.maxbdlsize); - if(cfg.maxpktsize!=DFLT_PKT_SIZE) - fprintf(stream,"PKTSIZE %lu\r\n",cfg.maxpktsize); - for(i=j=0;i<cfg.nodecfgs;i++) - if(cfg.nodecfg[i].attr&SEND_NOTIFY) { - if(!j) fprintf(stream,"SEND_NOTIFY"); - fprintf(stream," %s",faddrtoa(cfg.nodecfg[i].faddr)); - j++; } - if(j) fprintf(stream,"\r\n"); - for(i=j=0;i<cfg.nodecfgs;i++) - if(cfg.nodecfg[i].attr&ATTR_HOLD) { - if(!j) fprintf(stream,"HOLD"); - fprintf(stream," %s",faddrtoa(cfg.nodecfg[i].faddr)); - j++; } - if(j) fprintf(stream,"\r\n"); - for(i=j=0;i<cfg.nodecfgs;i++) - if(cfg.nodecfg[i].attr&ATTR_DIRECT) { - if(!j) fprintf(stream,"DIRECT"); - fprintf(stream," %s",faddrtoa(cfg.nodecfg[i].faddr)); - j++; } - if(j) fprintf(stream,"\r\n"); - for(i=j=0;i<cfg.nodecfgs;i++) - if(cfg.nodecfg[i].attr&ATTR_CRASH) { - if(!j) fprintf(stream,"CRASH"); - fprintf(stream," %s",faddrtoa(cfg.nodecfg[i].faddr)); - j++; } - if(j) fprintf(stream,"\r\n"); - for(i=j=0;i<cfg.nodecfgs;i++) - if(cfg.nodecfg[i].attr&ATTR_PASSIVE) { - if(!j) fprintf(stream,"PASSIVE"); - fprintf(stream," %s",faddrtoa(cfg.nodecfg[i].faddr)); - j++; } - if(j) fprintf(stream,"\r\n"); - - for(i=0;i<cfg.nodecfgs;i++) - if(cfg.nodecfg[i].pktpwd[0]) - fprintf(stream,"PKTPWD %s %s\r\n" - ,faddrtoa(cfg.nodecfg[i].faddr),cfg.nodecfg[i].pktpwd); - - for(i=0;i<cfg.nodecfgs;i++) - if(cfg.nodecfg[i].pkt_type) - fprintf(stream,"PKTTYPE %s %s\r\n" - ,cfg.nodecfg[i].pkt_type==PKT_TWO_TWO ? "2.2":"2" - ,faddrtoa(cfg.nodecfg[i].faddr)); - - for(i=0;i<cfg.arcdefs;i++) - fprintf(stream,"PACKER %s %u %s\r\n PACK %s\r\n" - " UNPACK %s\r\nEND\r\n" - ,cfg.arcdef[i].name - ,cfg.arcdef[i].byteloc - ,cfg.arcdef[i].hexid - ,cfg.arcdef[i].pack - ,cfg.arcdef[i].unpack - ); - for(i=0;i<cfg.arcdefs;i++) { - for(j=k=0;j<cfg.nodecfgs;j++) - if(cfg.nodecfg[j].arctype==i) { - if(!k) - fprintf(stream,"%-10s %s","USEPACKER" - ,cfg.arcdef[i].name); - k++; - fprintf(stream," %s",faddrtoa(cfg.nodecfg[j].faddr)); } - if(k) - fprintf(stream,"\r\n"); } - - for(i=j=0;i<cfg.nodecfgs;i++) - if(cfg.nodecfg[i].arctype==0xffff) { - if(!j) - fprintf(stream,"%-10s %s","USEPACKER","NONE"); - j++; - fprintf(stream," %s",faddrtoa(cfg.nodecfg[i].faddr)); } - if(j) - fprintf(stream,"\r\n"); - - for(i=0;i<cfg.listcfgs;i++) { - fprintf(stream,"%-10s","ECHOLIST"); - if(cfg.listcfg[i].password[0]) - fprintf(stream," FORWARD %s %s" - ,faddrtoa(cfg.listcfg[i].forward) - ,cfg.listcfg[i].password); - else if(cfg.listcfg[i].misc&NOFWD && - cfg.listcfg[i].forward.zone) - fprintf(stream," HUB %s" - ,faddrtoa(cfg.listcfg[i].forward)); - fprintf(stream," %s",cfg.listcfg[i].listpath); - for(j=0;j<cfg.listcfg[i].numflags;j++) - fprintf(stream," %s",cfg.listcfg[i].flag[j].flag); - fprintf(stream,"\r\n"); } - - for(i=0;i<cfg.nodecfgs;i++) - if(cfg.nodecfg[i].password[0]) { - fprintf(stream,"%-10s %s %s","AREAFIX" - ,faddrtoa(cfg.nodecfg[i].faddr) - ,cfg.nodecfg[i].password); - for(j=0;j<cfg.nodecfg[i].numflags;j++) - fprintf(stream," %s",cfg.nodecfg[i].flag[j].flag); - fprintf(stream,"\r\n"); } - - for(i=0;i<cfg.nodecfgs;i++) - if(cfg.nodecfg[i].route.zone) { - fprintf(stream,"%-10s %s","ROUTE_TO" - ,faddrtoa(cfg.nodecfg[i].route)); - fprintf(stream," %s" - ,faddrtoa(cfg.nodecfg[i].faddr)); - for(j=i+1;j<cfg.nodecfgs;j++) - if(!memcmp(&cfg.nodecfg[j].route,&cfg.nodecfg[i].route - ,sizeof(faddr_t))) { - fprintf(stream," %s" - ,faddrtoa(cfg.nodecfg[j].faddr)); - cfg.nodecfg[j].route.zone=0; } - fprintf(stream,"\r\n"); } - - fclose(stream); - bail(0); - } -} -} -/****************************************************************************/ -/* Checks the disk drive for the existance of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/* Called from upload */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==NULL) - return(1); -return(0); -} diff --git a/src/sbbs2/echo/echocfg.mak b/src/sbbs2/echo/echocfg.mak deleted file mode 100644 index 6af1ffce79..0000000000 --- a/src/sbbs2/echo/echocfg.mak +++ /dev/null @@ -1,34 +0,0 @@ - -# Macros -CC = bcc -LD = tlink -UIFC = ..\..\uifc -MSWAIT = ..\..\mswait -INCLUDE = \bc45\include;$(UIFC);..;..\smb -LIB = \bc45\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -w-pro -LDFLAGS = /n /c -OBJS = $(MSWAIT)\dos\mswait$(MODEL).obj uifc.obj read_cfg.obj -HEADERS = $(UIFC)\uifc.h sbbsecho.h - -# Implicit C Compile Rule -.c.obj: - @echo Compiling $*.c to $*.obj ... - $(CC) $(CFLAGS) -c $*.c - -# Main EXE Link Rule -echocfg.exe: $(OBJS) echocfg.obj - @echo Linking $< ... - $(LD) $(LDFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) echocfg.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - - -# All .obj modules -echocfg.obj: $(HEADERS) - -uifc.obj: $(UIFC)\uifc.h $(UIFC)\uifc.c - @echo Compiling $(UIFC)\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c $(UIFC)\$*.c - diff --git a/src/sbbs2/echo/makeall.bat b/src/sbbs2/echo/makeall.bat deleted file mode 100755 index d6b6d6ff75..0000000000 --- a/src/sbbs2/echo/makeall.bat +++ /dev/null @@ -1,9 +0,0 @@ -@echo off -make -if errorlevel 1 goto end -wmake -f sbbsecho.wat OS=OS2 -if errorlevel 1 goto end -wmake -f sbbsecho.wat OS=DOS4G -if errorlevel 1 goto end -wmake -f sbbsecho.wat OS=NT -:end \ No newline at end of file diff --git a/src/sbbs2/echo/makecfg.bat b/src/sbbs2/echo/makecfg.bat deleted file mode 100755 index 5f6ed1e474..0000000000 --- a/src/sbbs2/echo/makecfg.bat +++ /dev/null @@ -1 +0,0 @@ -@make -fechocfg %1 %2 %3 %4 diff --git a/src/sbbs2/echo/makefile b/src/sbbs2/echo/makefile deleted file mode 100644 index 82f3398b87..0000000000 --- a/src/sbbs2/echo/makefile +++ /dev/null @@ -1,94 +0,0 @@ -############################################ -# Makefile for Synchronet SBBSecho Utility # -# For use with Borland C++ for DOS or OS/2 # -############################################ - -# Macros - -!ifdef __OS2__ -OS = OS2 -CC = c:\bcos2\bin\bcc -LD = c:\bcos2\bin\tlink -INCLUDE = c:\bcos2\include;..;..\smb;..\rio -LIB = c:\bcos2\lib -CFLAGS = -d -C -I$(INCLUDE) -w-prot -LFLAGS = -c - -!elif $d(DOSX) -OS = DOSX -CC = \bc4\bin\bcc32 -LD = \bc4\bin\tlink32 -INCLUDE = \bc4\include;..;..\smb;..\rio -LIB = \bc4\lib -CFLAGS = -w-pro -d -C -WX -I$(INCLUDE) -w-prot -LFLAGS = -Tpe -ax -n -c -L$(LIB) - -!else -OS = DOS -CC = \bc45\bin\bcc -LD = \bc45\bin\tlink -INCLUDE = \bc45\include;..\smb;..\rio;.. -LIB = \bc45\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -DLZH_DYNAMIC_BUF -DSMB_GETMSGTXT -w-pro - -LFLAGS = -c -L$(LIB) -!endif -MAIN = $(OS)\sbbsecho.exe -OBJS = $(OS)\sbbsecho.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj \ - $(OS)\smblib.obj $(OS)\ars.obj $(OS)\lzh.obj \ - $(OS)\read_cfg.obj -HEADERS = ..\sbbsdefs.h ..\scfgvars.c ..\smb\smbdefs.h ..\smb\smblib.h - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) $(HEADERS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -c02.obj $(OBJS) -+, $*, $*, os2.lib c2.lib -!elif $d(DOSX) - $(LD) $(LFLAGS) @&&+ -c0X32.obj $(OBJS) -+, $*, $*, DPMI32 CW32 -!else - $(LD) $(LFLAGS) @&&+ -c0$(MODEL) $(OBJS) -+, $*, $*, ..\..\spawno\spawnl.lib mathl emu cl -!endif - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Shared Functions -$(OS)\scfglib1.obj: ..\sbbsdefs.h ..\scfglib1.c ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_FILE_CFG --DNO_XTRN_CFG --DNO_CMDS_CFG --DNO_CHAT_CFG -! ..\$&.c - -$(OS)\smblib.obj: ..\smb\smblib.c ..\smb\smblib.h ..\smb\smbdefs.h - @echo Compiling SMBLIB ... - $(CC) -DSMB_GETMSGTXT $(CFLAGS) -n$(OS) -c ..\smb\smblib.c - -$(OS)\lzh.obj: ..\smb\lzh.c ..\smb\lzh.h - @echo Compiling LZH ... - $(CC) $(CFLAGS) -n$(OS) -c ..\smb\lzh.c - -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -n$(OS) -c ..\ars.c - -$(OS)\sbbsecho.obj: sbbsecho.c sbbsecho.h - @echo Compiling $&.c to $< ... - $(CC) $(CFLAGS) -n$(OS) -c sbbsecho.c diff --git a/src/sbbs2/echo/read_cfg.c b/src/sbbs2/echo/read_cfg.c deleted file mode 100644 index 0db669b236..0000000000 --- a/src/sbbs2/echo/read_cfg.c +++ /dev/null @@ -1,681 +0,0 @@ -/* READ_CFG.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Portions written by Allen Christiansen 1994-1996 */ - -#include <dos.h> -#include <mem.h> -#include <time.h> -#include <errno.h> -#include <stdio.h> -#include <conio.h> -#include <ctype.h> -#include <fcntl.h> -#include <share.h> -#include <malloc.h> -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> -#include <process.h> -#include <sys\stat.h> - -#include "crc32.h" -#include "sbbsdefs.h" -#include "sbbsecho.h" - -#ifdef __WATCOMC__ - #define O_DENYNONE SH_DENYNO -#endif - -extern uchar node_swap; -extern long misc; -extern config_t cfg; - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access&O_DENYNONE) { - access&=~O_DENYNONE; - share=SH_DENYNO; } -else if(access==O_RDONLY) share=SH_DENYWR; -else share=SH_DENYRW; -while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - printf("\7\nNOPEN: ACCESS DENIED\n\7"); -return(file); -} - -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(access&O_WRONLY) { - access&=~O_WRONLY; - access|=O_RDWR; } /* fdopen can't open WRONLY */ - -if(((*file)=nopen(str,access))==-1) - return(NULL); - -if(access&O_APPEND) { - if(access&(O_RDONLY|O_RDWR)) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&(O_WRONLY|O_RDWR)) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - printf("\7\nFDOPEN(%s) FAILED\n",mode); - close(*file); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,16*1024); -return(stream); -} -/****************************************************************************** - Here we take a string and put a terminator in place of the first TAB or SPACE -******************************************************************************/ -char *cleanstr(char *instr) -{ - int i; - -for(i=0;instr[i];i++) - if((uchar)instr[i]<=SP) - break; -instr[i]=0; -return(instr); -} -/****************************************************************************/ -/* Returns the FidoNet address kept in str as ASCII. */ -/****************************************************************************/ -faddr_t atofaddr(char *instr) -{ - char *p,str[51]; - faddr_t addr; - -sprintf(str,"%.50s",instr); -cleanstr(str); -if(!stricmp(str,"ALL")) { - addr.zone=addr.net=addr.node=addr.point=0xffff; - return(addr); } -addr.zone=addr.net=addr.node=addr.point=0; -if((p=strchr(str,':'))!=NULL) { - if(!strnicmp(str,"ALL:",4)) - addr.zone=0xffff; - else - addr.zone=atoi(str); - p++; - if(!strnicmp(p,"ALL",3)) - addr.net=0xffff; - else - addr.net=atoi(p); } -else { -#ifdef SCFG - if(total_faddrs) - addr.zone=faddr[0].zone; - else -#endif - addr.zone=1; - addr.net=atoi(str); } -if(!addr.zone) /* no such thing as zone 0 */ - addr.zone=1; -if((p=strchr(str,'/'))!=NULL) { - p++; - if(!strnicmp(p,"ALL",3)) - addr.node=0xffff; - else - addr.node=atoi(p); } -else { - if(!addr.net) { -#ifdef SCFG - if(total_faddrs) - addr.net=faddr[0].net; - else -#endif - addr.net=1; } - addr.node=atoi(str); } -if((p=strchr(str,'.'))!=NULL) { - p++; - if(!strnicmp(p,"ALL",3)) - addr.point=0xffff; - else - addr.point=atoi(p); } -return(addr); -} - -/****************************************************************************/ -/* Returns an ASCII string for FidoNet address 'addr' */ -/****************************************************************************/ -char *faddrtoa(faddr_t addr) -{ - static char str[25]; - char tmp[25]; - -if(addr.zone==0xffff) - strcpy(str,"ALL"); -else { - sprintf(str,"%u:",addr.zone); - if(addr.net==0xffff) - strcat(str,"ALL"); - else { - sprintf(tmp,"%u/",addr.net); - strcat(str,tmp); - if(addr.node==0xffff) - strcat(str,"ALL"); - else { - sprintf(tmp,"%u",addr.node); - strcat(str,tmp); - if(addr.point==0xffff) - strcat(str,".ALL"); - else if(addr.point) { - sprintf(tmp,".%u",addr.point); - strcat(str,tmp); } } } } -return(str); -} -/****************************************************************************** - This function returns the number of the node in the SBBSECHO.CFG file which - matches the address passed to it (or cfg.nodecfgs if no match). - ******************************************************************************/ -int matchnode(faddr_t addr, int exact) -{ - int i; - -if(exact!=2) { - for(i=0;i<cfg.nodecfgs;i++) /* Look for exact match */ - if(!memcmp(&cfg.nodecfg[i].faddr,&addr,sizeof(faddr_t))) - break; - if(exact || i<cfg.nodecfgs) - return(i); } - -for(i=0;i<cfg.nodecfgs;i++) /* Look for point match */ - if(cfg.nodecfg[i].faddr.point==0xffff - && addr.zone==cfg.nodecfg[i].faddr.zone - && addr.net==cfg.nodecfg[i].faddr.net - && addr.node==cfg.nodecfg[i].faddr.node) - break; -if(i<cfg.nodecfgs) - return(i); - -for(i=0;i<cfg.nodecfgs;i++) /* Look for node match */ - if(cfg.nodecfg[i].faddr.node==0xffff - && addr.zone==cfg.nodecfg[i].faddr.zone - && addr.net==cfg.nodecfg[i].faddr.net) - break; -if(i<cfg.nodecfgs) - return(i); - -for(i=0;i<cfg.nodecfgs;i++) /* Look for net match */ - if(cfg.nodecfg[i].faddr.net==0xffff - && addr.zone==cfg.nodecfg[i].faddr.zone) - break; -if(i<cfg.nodecfgs) - return(i); - -for(i=0;i<cfg.nodecfgs;i++) /* Look for total wild */ - if(cfg.nodecfg[i].faddr.zone==0xffff) - break; -return(i); -} -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - -void read_cfg() -{ - uchar str[1025],tmp[512],*p,*tp; - short attr; - int i,j,file; - FILE *stream; - faddr_t addr,route_addr; - - -/****** READ IN SBBSECHO.CFG FILE *******/ - -printf("\n\nReading %s\n",cfg.cfgfile); -if((stream=fnopen(&file,cfg.cfgfile,O_RDONLY))==NULL) { - printf("Unable to open %s for read.\n",cfg.cfgfile); - exit(1); } - -cfg.maxpktsize=DFLT_PKT_SIZE; -cfg.maxbdlsize=DFLT_BDL_SIZE; -cfg.badecho=-1; -cfg.log=LOG_DEFAULTS; - -while(1) { - if(!fgets(str,256,stream)) - break; - truncsp(str); - p=str; - while(*p && *p<=SP) p++; - if(*p==';') - continue; - sprintf(tmp,"%-.25s",p); - tp=strchr(tmp,SP); - if(tp) - *tp=0; /* Chop off at space */ - strupr(tmp); /* Convert code to uppercase */ - while(*p>SP) p++; /* Skip code */ - while(*p && *p<=SP) p++; /* Skip white space */ - - if(!strcmp(tmp,"PACKER")) { /* Archive Definition */ - if((cfg.arcdef=(arcdef_t *)REALLOC(cfg.arcdef - ,sizeof(arcdef_t)*(cfg.arcdefs+1)))==NULL) { - printf("\nError allocating %u bytes of memory for arcdef #%u.\n" - ,sizeof(arcdef_t)*(cfg.arcdefs+1),cfg.arcdefs+1); - exit(1); } - sprintf(cfg.arcdef[cfg.arcdefs].name,"%-.25s",p); - tp=cfg.arcdef[cfg.arcdefs].name; - while(*tp && *tp>SP) tp++; - *tp=0; - while(*p && *p>SP) p++; - while(*p && *p<=SP) p++; - cfg.arcdef[cfg.arcdefs].byteloc=atoi(p); - while(*p && *p>SP) p++; - while(*p && *p<=SP) p++; - sprintf(cfg.arcdef[cfg.arcdefs].hexid,"%-.25s",p); - tp=cfg.arcdef[cfg.arcdefs].hexid; - while(*tp && *tp>SP) tp++; - *tp=0; - while(fgets(str,256,stream) && strnicmp(str,"END",3)) { - p=str; - while(*p && *p<=SP) p++; - if(!strnicmp(p,"PACK ",5)) { - p+=5; - while(*p && *p<=SP) p++; - sprintf(cfg.arcdef[cfg.arcdefs].pack,"%-.80s",p); - truncsp(cfg.arcdef[cfg.arcdefs].pack); - continue; } - if(!strnicmp(p,"UNPACK ",7)) { - p+=7; - while(*p && *p<=SP) p++; - sprintf(cfg.arcdef[cfg.arcdefs].unpack,"%-.80s",p); - truncsp(cfg.arcdef[cfg.arcdefs].unpack); } } - ++cfg.arcdefs; - continue; } - - if(!strcmp(tmp,"REGNUM")) - continue; - - if(!strcmp(tmp,"NOTIFY")) { - cfg.notify=atoi(cleanstr(p)); - continue; } - - if(!strcmp(tmp,"LOG")) { - cleanstr(p); - if(!stricmp(p,"ALL")) - cfg.log=0xffffffffUL; - else if(!stricmp(p,"DEFAULT")) - cfg.log=LOG_DEFAULTS; - else if(!stricmp(p,"NONE")) - cfg.log=0L; - else - cfg.log=strtol(cleanstr(p),0,16); - continue; } - - if(!strcmp(tmp,"NOSWAP")) { - node_swap=0; - continue; } - - if(!strcmp(tmp,"SECURE_ECHOMAIL")) { - misc|=SECURE; - continue; } - - if(!strcmp(tmp,"CHECKMEM")) { - misc|=CHECKMEM; - continue; } - - if(!strcmp(tmp,"STORE_SEENBY")) { - misc|=STORE_SEENBY; - continue; } - - if(!strcmp(tmp,"STORE_PATH")) { - misc|=STORE_PATH; - continue; } - - if(!strcmp(tmp,"STORE_KLUDGE")) { - misc|=STORE_KLUDGE; - continue; } - - if(!strcmp(tmp,"FUZZY_ZONE")) { - misc|=FUZZY_ZONE; - continue; } - - if(!strcmp(tmp,"FAST_OPEN")) { - continue; } - - if(!strcmp(tmp,"FLO_MAILER")) { - misc|=FLO_MAILER; - continue; } - - if(!strcmp(tmp,"ELIST_ONLY")) { - misc|=ELIST_ONLY; - continue; } - - if(!strcmp(tmp,"KILL_EMPTY")) { - misc|=KILL_EMPTY_MAIL; - continue; } - - if(!strcmp(tmp,"AREAFILE")) { - sprintf(cfg.areafile,"%-.80s",cleanstr(p)); - continue; } - - if(!strcmp(tmp,"LOGFILE")) { - sprintf(cfg.logfile,"%-.80s",cleanstr(p)); - continue; } - - if(!strcmp(tmp,"INBOUND")) { /* Inbound directory */ - sprintf(cfg.inbound,"%-.80s",cleanstr(p)); - if(cfg.inbound[strlen(cfg.inbound)-1]!='\\') - strcat(cfg.inbound,"\\"); - continue; } - - if(!strcmp(tmp,"SECURE_INBOUND")) { /* Secure Inbound directory */ - sprintf(cfg.secure,"%-.80s",cleanstr(p)); - if(cfg.secure[strlen(cfg.secure)-1]!='\\') - strcat(cfg.secure,"\\"); - continue; } - - if(!strcmp(tmp,"OUTBOUND")) { /* Outbound directory */ - sprintf(cfg.outbound,"%-.80s",cleanstr(p)); - if(cfg.outbound[strlen(cfg.outbound)-1]!='\\') - strcat(cfg.outbound,"\\"); - continue; } - - if(!strcmp(tmp,"ARCSIZE")) { /* Maximum bundle size */ - cfg.maxbdlsize=atol(p); - continue; } - - if(!strcmp(tmp,"PKTSIZE")) { /* Maximum packet size */ - cfg.maxpktsize=atol(p); - continue; } - - if(!strcmp(tmp,"USEPACKER")) { /* Which packer to use */ - if(!*p) - continue; - strcpy(str,p); - p=str; - while(*p && *p>SP) p++; - if(!*p) - continue; - *p=0; - p++; - for(i=0;i<cfg.arcdefs;i++) - if(!strnicmp(cfg.arcdef[i].name,str - ,strlen(cfg.arcdef[i].name))) - break; - if(i==cfg.arcdefs) /* i = number of arcdef til done */ - i=0xffff; /* Uncompressed type if not found */ - while(*p) { - while(*p && *p<=SP) p++; - if(!*p) - break; - addr=atofaddr(p); - while(*p && *p>SP) p++; - j=matchnode(addr,1); - if(j==cfg.nodecfgs) { - cfg.nodecfgs++; - if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg - ,sizeof(nodecfg_t)*(j+1)))==NULL) { - printf("\nError allocating memory for nodecfg #%u.\n" - ,j+1); - exit(1); } - memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); - cfg.nodecfg[j].faddr=addr; } - cfg.nodecfg[j].arctype=i; } } - - if(!strcmp(tmp,"PKTPWD")) { /* Packet Password */ - if(!*p) - continue; - addr=atofaddr(p); - while(*p && *p>SP) p++; /* Skip address */ - while(*p && *p<=SP) p++; /* Find beginning of password */ - j=matchnode(addr,1); - if(j==cfg.nodecfgs) { - cfg.nodecfgs++; - if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg - ,sizeof(nodecfg_t)*(j+1)))==NULL) { - printf("\nError allocating memory for nodecfg #%u.\n" - ,j+1); - exit(1); } - memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); - cfg.nodecfg[j].faddr=addr; } - sprintf(cfg.nodecfg[j].pktpwd,"%.8s",p); } - - if(!strcmp(tmp,"PKTTYPE")) { /* Packet Type to Use */ - if(!*p) - continue; - strcpy(str,p); - p=str; - while(*p && *p>SP) p++; - *p=0; - p++; - while(*p) { - while(*p && *p<=SP) p++; - if(!*p) - break; - addr=atofaddr(p); - while(*p && *p>SP) p++; - j=matchnode(addr,1); - if(j==cfg.nodecfgs) { - cfg.nodecfgs++; - if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg - ,sizeof(nodecfg_t)*(j+1)))==NULL) { - printf("\nError allocating memory for nodecfg #%u.\n" - ,j+1); - exit(1); } - memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); - cfg.nodecfg[j].faddr=addr; } - if(!strcmp(str,"2+")) - cfg.nodecfg[j].pkt_type=PKT_TWO_PLUS; - else if(!strcmp(str,"2.2")) - cfg.nodecfg[j].pkt_type=PKT_TWO_TWO; - else if(!strcmp(str,"2")) - cfg.nodecfg[j].pkt_type=PKT_TWO; } } - - if(!strcmp(tmp,"SEND_NOTIFY")) { /* Nodes to send notify lists to */ - while(*p) { - while(*p && *p<=SP) p++; - if(!*p) - break; - addr=atofaddr(p); - while(*p && *p>SP) p++; - j=matchnode(addr,1); - if(j==cfg.nodecfgs) { - cfg.nodecfgs++; - if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg - ,sizeof(nodecfg_t)*(j+1)))==NULL) { - printf("\nError allocating memory for nodecfg #%u.\n" - ,j+1); - exit(1); } - memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); - cfg.nodecfg[j].faddr=addr; } - cfg.nodecfg[j].attr|=SEND_NOTIFY; } } - - if(!strcmp(tmp,"PASSIVE") - || !strcmp(tmp,"HOLD") - || !strcmp(tmp,"CRASH") - || !strcmp(tmp,"DIRECT")) { /* Set node attributes */ - if(!strcmp(tmp,"PASSIVE")) - attr=ATTR_PASSIVE; - else if(!strcmp(tmp,"CRASH")) - attr=ATTR_CRASH; - else if(!strcmp(tmp,"HOLD")) - attr=ATTR_HOLD; - else if(!strcmp(tmp,"DIRECT")) - attr=ATTR_DIRECT; - while(*p) { - while(*p && *p<=SP) p++; - if(!*p) - break; - addr=atofaddr(p); - while(*p && *p>SP) p++; - j=matchnode(addr,1); - if(j==cfg.nodecfgs) { - cfg.nodecfgs++; - if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg - ,sizeof(nodecfg_t)*(j+1)))==NULL) { - printf("\nError allocating memory for nodecfg #%u.\n" - ,j+1); - exit(1); } - memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); - cfg.nodecfg[j].faddr=addr; } - cfg.nodecfg[j].attr|=attr; } } - - if(!strcmp(tmp,"ROUTE_TO")) { - while(*p && *p<=SP) p++; - if(*p) { - route_addr=atofaddr(p); - while(*p && *p>SP) p++; } - while(*p) { - while(*p && *p<=SP) p++; - if(!*p) - break; - addr=atofaddr(p); - while(*p && *p>SP) p++; - j=matchnode(addr,1); - if(j==cfg.nodecfgs) { - cfg.nodecfgs++; - if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg - ,sizeof(nodecfg_t)*(j+1)))==NULL) { - printf("\nError allocating memory for nodecfg #%u.\n" - ,j+1); - exit(1); } - memset(&cfg.nodecfg[j],0,sizeof(nodecfg_t)); - cfg.nodecfg[j].faddr=addr; } - cfg.nodecfg[j].route=route_addr; } } - - if(!strcmp(tmp,"AREAFIX")) { /* Areafix stuff here */ - if(!*p) - continue; - addr=atofaddr(p); - i=matchnode(addr,1); - if(i==cfg.nodecfgs) { - cfg.nodecfgs++; - if((cfg.nodecfg=(nodecfg_t *)REALLOC(cfg.nodecfg - ,sizeof(nodecfg_t)*(i+1)))==NULL) { - printf("\nError allocating memory for nodecfg #%u.\n" - ,i+1); - exit(1); } - memset(&cfg.nodecfg[i],0,sizeof(nodecfg_t)); - cfg.nodecfg[i].faddr=addr; } - cfg.nodecfg[i].flag=NULL; - while(*p && *p>SP) p++; /* Get to the end of the address */ - while(*p && *p<=SP) p++; /* Skip over whitespace chars */ - tp=p; - while(*p && *p>SP) p++; /* Find end of password */ - *p=0; /* and terminate the string */ - ++p; - sprintf(cfg.nodecfg[i].password,"%-.25s",tp); - while(*p && *p<=SP) p++; /* Search for more chars */ - if(!*p) /* Nothing else there */ - continue; - while(*p) { - tp=p; - while(*p && *p>SP) p++; /* Find end of this flag */ - *p=0; /* and terminate it */ - ++p; - for(j=0;j<cfg.nodecfg[i].numflags;j++) - if(!strnicmp(cfg.nodecfg[i].flag[j].flag,tp - ,strlen(cfg.nodecfg[i].flag[j].flag))) - break; - if(j==cfg.nodecfg[i].numflags) { - if((cfg.nodecfg[i].flag= - (flag_t *)REALLOC(cfg.nodecfg[i].flag - ,sizeof(flag_t)*(j+1)))==NULL) { - printf("\nError allocating memory for nodecfg #%u " - "flag #%u.\n",cfg.nodecfgs,j+1); - exit(1); } - cfg.nodecfg[i].numflags++; - sprintf(cfg.nodecfg[i].flag[j].flag,"%.4s",tp); } - while(*p && *p<=SP) p++; } } - - if(!strcmp(tmp,"ECHOLIST")) { /* Echolists go here */ - if((cfg.listcfg=(echolist_t *)REALLOC(cfg.listcfg - ,sizeof(echolist_t)*(cfg.listcfgs+1)))==NULL) { - printf("\nError allocating memory for echolist cfg #%u.\n" - ,cfg.listcfgs+1); - exit(1); } - memset(&cfg.listcfg[cfg.listcfgs],0,sizeof(echolist_t)); - ++cfg.listcfgs; - /* Need to forward requests? */ - if(!strnicmp(p,"FORWARD ",8) || !strnicmp(p,"HUB ",4)) { - if(!strnicmp(p,"HUB ",4)) - cfg.listcfg[cfg.listcfgs-1].misc|=NOFWD; - while(*p && *p>SP) p++; - while(*p && *p<=SP) p++; - if(*p) - cfg.listcfg[cfg.listcfgs-1].forward=atofaddr(p); - while(*p && *p>SP) p++; - while(*p && *p<=SP) p++; - if(*p && !(cfg.listcfg[cfg.listcfgs-1].misc&NOFWD)) { - tp=p; - while(*p && *p>SP) p++; - *p=0; - ++p; - while(*p && *p<=SP) p++; - sprintf(cfg.listcfg[cfg.listcfgs-1].password,"%.71s",tp); } } - else - cfg.listcfg[cfg.listcfgs-1].misc|=NOFWD; - if(!*p) - continue; - tp=p; - while(*p && *p>SP) p++; - *p=0; - p++; - - sprintf(cfg.listcfg[cfg.listcfgs-1].listpath,"%-.128s",tp); - cfg.listcfg[cfg.listcfgs-1].numflags=0; - cfg.listcfg[cfg.listcfgs-1].flag=NULL; - while(*p && *p<=SP) p++; /* Skip over whitespace chars */ - while(*p) { - tp=p; - while(*p && *p>SP) p++; /* Find end of this flag */ - *p=0; /* and terminate it */ - ++p; - for(j=0;j<cfg.listcfg[cfg.listcfgs-1].numflags;j++) - if(!strnicmp(cfg.listcfg[cfg.listcfgs-1].flag[j].flag,tp - ,strlen(cfg.listcfg[cfg.listcfgs-1].flag[j].flag))) - break; - if(j==cfg.listcfg[cfg.listcfgs-1].numflags) { - if((cfg.listcfg[cfg.listcfgs-1].flag= - (flag_t *)REALLOC(cfg.listcfg[cfg.listcfgs-1].flag - ,sizeof(flag_t)*(j+1)))==NULL) { - printf("\nError allocating memory for listcfg #%u " - "flag #%u.\n",cfg.listcfgs,j+1); - exit(1); } - cfg.listcfg[cfg.listcfgs-1].numflags++; - sprintf(cfg.listcfg[cfg.listcfgs-1].flag[j].flag,"%.4s",tp); } - while(*p && *p<=SP) p++; } } - -// printf("Unrecognized line in SBBSECHO.CFG file.\n"); -} -fclose(stream); -printf("\n"); -} - diff --git a/src/sbbs2/echo/sbbsecho.c b/src/sbbs2/echo/sbbsecho.c deleted file mode 100644 index dad5ece110..0000000000 --- a/src/sbbs2/echo/sbbsecho.c +++ /dev/null @@ -1,5060 +0,0 @@ -/* SBBSECHO.C */ - -/* Developed 1990-2000 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Portions written by Allen Christiansen 1994-1996 */ - -/* Synchronet FidoNet EchoMail Scanning/Tossing and NetMail Tossing Utility */ - -#include <dos.h> -#include <mem.h> -#include <time.h> -#include <errno.h> -#include <stdio.h> -#include <conio.h> -#include <ctype.h> -#include <fcntl.h> -#include <share.h> -#include <malloc.h> -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> -#include <process.h> -#include <sys\stat.h> - -#include "sbbsdefs.h" -#include "smblib.h" -#include "scfglib.h" -#define GLOBAL extern /* turn vars.c and scfgvars.c files into headers */ -#include "scfgvars.c" -#include "post.h" -#include "lzh.h" -#include "sbbsecho.h" - -extern long crc32tbl[]; -ulong crc32(char *str); - -#ifndef __FLAT__ - #include "..\..\spawno\spawno.h" -#endif - -#ifdef __TURBOC__ - unsigned _stklen=20000; -#endif - -#ifdef __WATCOMC__ - #define O_DENYNONE SH_DENYNO -#endif - -char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec"}; - -smb_t *smb,*email; -long misc=(IMPORT_PACKETS|IMPORT_NETMAIL|IMPORT_ECHOMAIL|EXPORT_ECHOMAIL - |DELETE_NETMAIL|DELETE_PACKETS); -ulong netmail=0; -char tmp[256],pkt_type=0; -faddr_t sys_faddr; -config_t cfg; -int nodefile,secure,cur_smb=0; -FILE *fidologfile=NULL; -two_two_t two_two; -two_plus_t two_plus; - -#ifdef __WATCOMC__ -/****************************************************************************** - A DOS to Unix function - because WATCOM doesn't have one -******************************************************************************/ -time_t dostounix(struct date *d,struct time *t) -{ - struct tm tm; - -tm.tm_sec=t->ti_sec; -tm.tm_min=t->ti_min; -tm.tm_hour=t->ti_hour; -tm.tm_mday=d->da_day; -tm.tm_mon=(d->da_mon-1); -tm.tm_year=d->da_year-1900; -tm.tm_isdst=0; - -return(mktime(&tm)); -} -#endif - -#ifndef __NT__ -#define delfile(x) remove(x) -#else -int delfile(char *filename) -{ - int i=0; - -while(remove(filename) && i++<120) /* Wait up to 60 seconds to delete file */ - delay(500); /* for Win95 bug fix */ -return(i); -} -#endif - -/****************************************************************************** - This turns the DOS file date garbage into a long -******************************************************************************/ -long ddtol(ushort ftim, ushort fdat) -{ - struct date date; - struct time time; - - date.da_year=((fdat&0xfe00)>>9)+1980; - date.da_mon=((fdat&0x01e0)>>5); - date.da_day=(fdat&0x001f); - time.ti_hour=((ftim&0xf800)>>11); - time.ti_min=((ftim&0x07e0)>>5); - time.ti_sec=((ftim&0x001f)<<1); - time.ti_hund=0; - return(dostounix(&date,&time)); -} -void checkmem(void) -{ -#ifdef __WATCOMC__ - char *p=NULL; - long size=640L*1024L,over; - - while(size>0) { - p=(char *)LMALLOC(size); - if(p) - break; - size-=1024L; } - - printf("\nAvailable Memory = %ld bytes",size); - if(p) - LFREE(p); -#elif !defined(__OS2__) - printf("\nAvailable Memory = %ld bytes",farcoreleft()); -#endif -} - -/**********************/ -/* Log print function */ -/**********************/ -void logprintf(char *str, ...) -{ - va_list argptr; - char buf[256]; - time_t now; - struct tm *gm; - -if(!(misc&LOGFILE) || fidologfile==NULL) - return; -va_start(argptr,str); -vsprintf(buf,str,argptr); -va_end(argptr); -now=time(NULL); -gm=localtime(&now); -fseek(fidologfile,0L,SEEK_END); -fprintf(fidologfile,"%02u/%02u/%02u %02u:%02u:%02u %s\r\n" - ,gm->tm_mon+1,gm->tm_mday,TM_YEAR(gm->tm_year),gm->tm_hour,gm->tm_min,gm->tm_sec - ,buf); -fflush(fidologfile); -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} - -/*****************************************************************************/ -/* Returns command line generated from instr with %c replacments */ -/*****************************************************************************/ -char *cmdstr(char *instr, char *fpath, char *fspec) -{ - static char cmd[128]; - char str[256],str2[128]; - int i,j,len; - -len=strlen(instr); -for(i=j=0;i<len && j<128;i++) { - if(instr[i]=='%') { - i++; - cmd[j]=0; - switch(toupper(instr[i])) { - case 'F': /* File path */ - strcat(cmd,fpath); - break; - case 'G': /* Temp directory */ - if(temp_dir[0]!='\\' && temp_dir[1]!=':') { - strcpy(str,node_dir); - strcat(str,temp_dir); - if(_fullpath(str2,str,40)) - strcpy(str,str2); - backslash(str); - strcat(cmd,str);} - else - strcat(cmd,temp_dir); - break; - case 'J': - if(data_dir[0]!='\\' && data_dir[1]!=':') { - strcpy(str,node_dir); - strcat(str,data_dir); - if(_fullpath(str2,str,40)) - strcpy(str,str2); - backslash(str); - strcat(cmd,str); } - else - strcat(cmd,data_dir); - break; - case 'K': - if(ctrl_dir[0]!='\\' && ctrl_dir[1]!=':') { - strcpy(str,node_dir); - strcat(str,ctrl_dir); - if(_fullpath(str2,str,40)) - strcpy(str,str2); - backslash(str); - strcat(cmd,str); } - else - strcat(cmd,ctrl_dir); - break; - case 'N': /* Node Directory (same as SBBSNODE environment var) */ - strcat(cmd,node_dir); - break; - case 'O': /* SysOp */ - strcat(cmd,sys_op); - break; - case 'Q': /* QWK ID */ - strcat(cmd,sys_id); - break; - case 'S': /* File Spec */ - strcat(cmd,fspec); - break; - case '!': /* EXEC Directory */ - if(exec_dir[0]!='\\' && exec_dir[1]!=':') { - strcpy(str,node_dir); - strcat(str,exec_dir); - if(_fullpath(str2,str,40)) - strcpy(str,str2); - backslash(str); - strcat(cmd,str); } - else - strcat(cmd,exec_dir); - break; - case '#': /* Node number (same as SBBSNNUM environment var) */ - sprintf(str,"%d",node_num); - strcat(cmd,str); - break; - case '*': - sprintf(str,"%03d",node_num); - strcat(cmd,str); - break; - case '%': /* %% for percent sign */ - strcat(cmd,"%"); - break; - default: /* unknown specification */ - printf("ERROR Checking Command Line '%s'\n",instr); - logprintf("ERROR line %d Checking Command Line '%s'",__LINE__ - ,instr); - exit(1); - break; } - j=strlen(cmd); } - else - cmd[j++]=instr[i]; } -cmd[j]=0; - -return(cmd); -} - -/****************************************************************************/ -/* Runs an external program directly using spawnvp */ -/****************************************************************************/ -int execute(char *cmdline) -{ - char c,d,e,cmdlen,*arg[30],str[256]; - int i; - -strcpy(str,cmdline); -arg[0]=str; /* point to the beginning of the string */ -cmdlen=strlen(str); -for(c=0,d=1,e=0;c<cmdlen;c++,e++) /* Break up command line */ - if(str[c]==SP) { - str[c]=0; /* insert nulls */ - arg[d++]=str+c+1; /* point to the beginning of the next arg */ - e=0; } -arg[d]=0; -#ifndef __FLAT__ -if(node_swap) { - printf("Swapping...\n"); - i=spawnvpo(".\\",(const char *)arg[0],(const char **)arg); } -else -#endif - i=spawnvp(P_WAIT,arg[0],arg); -return(i); -} -/****************************************************************************** - Returns the system address with the same zone as the address passed -******************************************************************************/ -faddr_t getsysfaddr(short zone) -{ - int i; - faddr_t sysfaddr; - -sysfaddr.zone=sysfaddr.net=sysfaddr.node=1; -sysfaddr.point=0; -if(!total_faddrs) - return(sys_faddr); -sysfaddr=faddr[0]; -if(total_faddrs==1) - return(sysfaddr); -for(i=0;i<total_faddrs;i++) - if(faddr[i].zone==zone) - return(faddr[i]); -return(sysfaddr); -} -/****************************************************************************** - This function creates or appends on existing Binkley compatible .?LO file - attach file. - Returns 0 on success. -******************************************************************************/ -int write_flofile(char *attachment, faddr_t dest) -{ - char fname[256],outbound[128],str[128],ch; - ushort attr=0; - int i,file; - FILE *stream; - -i=matchnode(dest,0); -if(i<cfg.nodecfgs) - attr=cfg.nodecfg[i].attr; - -if(attr&ATTR_CRASH) ch='C'; -else if(attr&ATTR_HOLD) ch='H'; -else if(attr&ATTR_DIRECT) ch='D'; -else ch='F'; -if(dest.zone==faddr[0].zone) /* Default zone, use default outbound */ - strcpy(outbound,cfg.outbound); -else /* Inter-zone outbound is OUTBOUND.XXX */ - sprintf(outbound,"%.*s.%03X\\" - ,strlen(cfg.outbound)-1,cfg.outbound,dest.zone); -if(dest.point) { /* Point destination is OUTBOUND\*.PNT */ - sprintf(str,"%04X%04X.PNT" - ,dest.net,dest.node); - strcat(outbound,str); } -if(outbound[strlen(outbound)-1]=='\\') - outbound[strlen(outbound)-1]=0; -mkdir(outbound); -strcat(outbound,"\\"); -if(dest.point) - sprintf(fname,"%s%08X.%cLO",outbound,dest.point,ch); -else - sprintf(fname,"%s%04X%04X.%cLO",outbound,dest.net,dest.node,ch); -if((stream=fnopen(&file,fname,O_WRONLY|O_CREAT))==NULL) { - printf("\7ERROR opening %s %s\n",fname,sys_errlist[errno]); - logprintf("ERROR line %d opening %s %s",__LINE__,fname,sys_errlist[errno]); - return(-1); } - -fseek(stream,0L,SEEK_END); -fprintf(stream,"^%s\r\n",attachment); -fclose(stream); -return(0); -} - -/****************************************************************************** - This function will create a netmail message (.MSG format). - If file is non-zero, will set file attachment bit (for bundles). - Returns 0 on success. -******************************************************************************/ -int create_netmail(char *to,char *subject,char *body,faddr_t dest,int file) -{ - FILE *fstream; - char str[256],fname[256]; - ushort attr=0; - int fmsg; - uint i; - static uint startmsg; - time_t t; - faddr_t faddr; - fmsghdr_t hdr; - struct tm *tm; - -if(!startmsg) startmsg=1; -i=matchnode(dest,0); -if(i<cfg.nodecfgs) { - attr=cfg.nodecfg[i].attr; - if(!attr) { - i=matchnode(dest,2); - if(i<cfg.nodecfgs) - attr=cfg.nodecfg[i].attr; } } - -do { - for(i=startmsg;i;i++) { - sprintf(fname,"%s%u.MSG",netmail_dir,i); - if(!fexist(fname)) - break; } - if(!i) { - printf("\7%s directory full!\n",netmail_dir); - logprintf("Directory full: %s",netmail_dir); - return(-1); } - startmsg=i+1; - strupr(fname); - if((fstream=fnopen(&fmsg,fname,O_RDWR|O_CREAT))==NULL) { - printf("\7ERROR opening %s %s\n",fname,sys_errlist[errno]); - logprintf("ERROR line %d opening %s %s",__LINE__,fname,sys_errlist[errno]); - return(-1); } - - faddr=getsysfaddr(dest.zone); - memset(&hdr,0,sizeof(fmsghdr_t)); - hdr.origzone=faddr.zone; - hdr.orignet=faddr.net; - hdr.orignode=faddr.node; - hdr.origpoint=faddr.point; - hdr.destzone=dest.zone; - hdr.destnet=dest.net; - hdr.destnode=dest.node; - hdr.destpoint=dest.point; - - hdr.attr=(FIDO_PRIVATE|FIDO_KILLSENT|FIDO_LOCAL); - if(file) - hdr.attr|=FIDO_FILE; - - if(attr&ATTR_HOLD) - hdr.attr|=FIDO_HOLD; - if(attr&ATTR_CRASH) - hdr.attr|=FIDO_CRASH; - - sprintf(hdr.from,"SBBSecho"); - - t=time(NULL); - tm=gmtime(&t); - sprintf(hdr.time,"%02u %3.3s %02u %02u:%02u:%02u" - ,tm->tm_mday,mon[tm->tm_mon],TM_YEAR(tm->tm_year) - ,tm->tm_hour,tm->tm_min,tm->tm_sec); - - if(to) - sprintf(hdr.to,"%s",to); - else - sprintf(hdr.to,"SYSOP"); - - sprintf(hdr.subj,"%.71s",subject); - - fwrite(&hdr,sizeof(fmsghdr_t),1,fstream); - sprintf(str,"\1INTL %u:%u/%u %u:%u/%u\r" - ,hdr.destzone,hdr.destnet,hdr.destnode - ,hdr.origzone,hdr.orignet,hdr.orignode); - fwrite(str,strlen(str),1,fstream); - if(attr&ATTR_DIRECT) { - fwrite("\1FLAGS DIR",10,1,fstream); - if(file) - fwrite(" KFS\r",5,1,fstream); - else - fwrite("\r",1,1,fstream); } - if(hdr.destpoint) { - sprintf(str,"\1TOPT %u\r",hdr.destpoint); - fwrite(str,strlen(str),1,fstream); } - if(hdr.origpoint) { - sprintf(str,"\1FMPT %u\r",hdr.origpoint); - fwrite(str,strlen(str),1,fstream); } - if(!file || (!(attr&ATTR_DIRECT) && file)) - fwrite(body,strlen(body)+1,1,fstream); /* Write additional NULL */ - else - fwrite("\0",1,1,fstream); /* Write NULL */ - fclose(fstream); -} while(!fexist(fname)); -return(0); -} - -/****************************************************************************** - This function takes the contents of 'infile' and puts it into a netmail - message bound for addr. -******************************************************************************/ -void file_to_netmail(FILE *infile,char *title,faddr_t addr,char *to) -{ - char *buf,*p; - long l,m,len; - -l=len=ftell(infile); -if(len>8192L) - len=8192L; -rewind(infile); -if((buf=(char *)MALLOC(len+1))==NULL) { - printf("ERROR allocating %lu bytes for file to netmail buffer.\n",len); - logprintf("ERROR line %d allocating %lu for file to netmail buf",__LINE__ - ,len); - return; } -while((m=fread(buf,1,(len>8064L) ? 8064L:len,infile))>0) { - buf[m]=0; - if(l>8064L && (p=strrchr(buf,'\n'))!=NULL) { - p++; - if(*p) { - *p=0; - p++; - fseek(infile,-1L,SEEK_CUR); - while(*p) { /* Seek back to end of last line */ - p++; - fseek(infile,-1L,SEEK_CUR); } } } - if(ftell(infile)<l) - strcat(buf,"\r\nContinued in next message...\r\n"); - create_netmail(to,title,buf,addr,0); } -FREE(buf); -} -/****************************************************************************** - This function sends a notify list to applicable nodes, this list includes the - settings configured for the node, as well as a list of areas the node is - connected to. -******************************************************************************/ -void notify_list(void) -{ - FILE *tmpf; - char str[256]; - int i,j,k; - -for(k=0;k<cfg.nodecfgs;k++) { - - if(!(cfg.nodecfg[k].attr&SEND_NOTIFY)) - continue; - - if((tmpf=tmpfile())==NULL) { - printf("\7ERROR couldn't open tmpfile.\n"); - logprintf("ERROR line %d couldn't open tmpfile",__LINE__); - return; } - - fprintf(tmpf,"Following are the options set for your system and a list " - "of areas\r\nyou are connected to. Please make sure everything " - "is correct.\r\n\r\n"); - fprintf(tmpf,"Packet Type %s\r\n" - ,cfg.nodecfg[k].pkt_type==PKT_TWO ? "2" - :cfg.nodecfg[k].pkt_type==PKT_TWO_TWO ? "2.2":"2+"); - fprintf(tmpf,"Archive Type %s\r\n" - ,(cfg.nodecfg[k].arctype>cfg.arcdefs) ? - "None":cfg.arcdef[cfg.nodecfg[k].arctype].name); - fprintf(tmpf,"Mail Status %s\r\n" - ,cfg.nodecfg[k].attr&ATTR_CRASH ? "Crash" - :cfg.nodecfg[k].attr&ATTR_HOLD ? "Hold" : "None"); - fprintf(tmpf,"Direct %s\r\n" - ,cfg.nodecfg[k].attr&ATTR_DIRECT ? "Yes":"No"); - fprintf(tmpf,"Passive %s\r\n" - ,cfg.nodecfg[k].attr&ATTR_PASSIVE ? "Yes":"No"); - fprintf(tmpf,"Remote AreaMgr %s\r\n\r\n" - ,cfg.nodecfg[k].password[0] ? "Yes" : "No"); - - fprintf(tmpf,"Connected Areas\r\n---------------\r\n"); - for(i=0;i<cfg.areas;i++) { - sprintf(str,"%s\r\n",cfg.area[i].name); - if(str[0]=='*') - continue; - for(j=0;j<cfg.area[i].uplinks;j++) - if(!memcmp(&cfg.nodecfg[k].faddr,&cfg.area[i].uplink[j] - ,sizeof(faddr_t))) - break; - if(j<cfg.area[i].uplinks) - fprintf(tmpf,"%s",str); } - - if(ftell(tmpf)) - file_to_netmail(tmpf,"SBBSecho Notify List",cfg.nodecfg[k].faddr,0); - fclose(tmpf); } -} -/****************************************************************************** - This function creates a netmail to addr showing a list of available areas (0), - a list of connected areas (1), or a list of removed areas (2). -******************************************************************************/ -void netmail_arealist(char type,faddr_t addr) -{ - FILE *stream,*tmpf; - char str[256],temp[256],title[81],match,*p; - int file,i,j,k,x,y; - -if(!type) - strcpy(title,"List of Available Areas"); -else if(type==1) - strcpy(title,"List of Connected Areas"); -else - strcpy(title,"List of Unlinked Areas"); - -if((tmpf=tmpfile())==NULL) { - printf("\7ERROR couldn't open tmpfile.\n"); - logprintf("ERROR line %d couldn't open tmpfile",__LINE__); - return; } - -if(type==1 || (type!=1 && !(misc&ELIST_ONLY))) { - for(i=0;i<cfg.areas;i++) { - sprintf(str,"%s\r\n",cfg.area[i].name); - if(type) { - for(j=0;j<cfg.area[i].uplinks;j++) - if(!memcmp(&addr,&cfg.area[i].uplink[j],sizeof(faddr_t))) - break; - if((type==1 && j<cfg.area[i].uplinks) || - (type==2 && j==cfg.area[i].uplinks)) - fprintf(tmpf,"%s",str); } - else - fprintf(tmpf,"%s",str); } } - -if(!type) { - i=matchnode(addr,0); - if(i<cfg.nodecfgs) { - for(j=0;j<cfg.listcfgs;j++) { - match=0; - for(k=0;k<cfg.listcfg[j].numflags;k++) { - if(match) break; - for(x=0;x<cfg.nodecfg[i].numflags;x++) - if(!stricmp(cfg.listcfg[j].flag[k].flag - ,cfg.nodecfg[i].flag[x].flag)) { - if((stream=fnopen(&file - ,cfg.listcfg[j].listpath,O_RDONLY))==NULL) { - printf("\7ERROR couldn't open %s.\n" - ,cfg.listcfg[j].listpath); - logprintf("ERROR line %d couldn't open %s %s" - ,__LINE__,cfg.listcfg[j].listpath - ,sys_errlist[errno]); - match=1; - break; } - while(!feof(stream)) { - if(!fgets(str,255,stream)) - break; - truncsp(str); - strcat(str,"\r\n"); - p=str; - while(*p && *p<=SP) p++; - if(*p==';') /* Ignore Comment Lines */ - continue; - strcpy(temp,p); - p=temp; - while(*p && *p>SP) p++; - *p=0; - if(!(misc&ELIST_ONLY)) { - for(y=0;y<cfg.areas;y++) - if(!stricmp(cfg.area[y].name,temp)) - break; - if(y==cfg.areas) - fprintf(tmpf,"%s",str); } - else - fprintf(tmpf,"%s",str); } - fclose(stream); - match=1; - break; } } } } } - -if(!ftell(tmpf)) - create_netmail(0,title,"None.",addr,0); -else - file_to_netmail(tmpf,title,addr,0); -fclose(tmpf); -} -/****************************************************************************** - Imitation of Borland's tempnam function because Watcom doesn't have it -******************************************************************************/ -//#ifdef __WATCOMC__ -char *tempname(char *dir, char *prefix) -{ - char str[256],*p; - int i; - -for(i=0;i<1000;i++) { - sprintf(str,"%s%s%03u.$$$",dir,prefix,i); - if(!fexist(str)) - break; } -if(i>=1000) { - logprintf("tempnam: too many files"); - return(NULL); } -p=malloc(strlen(str)+1); -if(!p) { - logprintf("tempnam: couldn't malloc %u",strlen(str)+1); - return(NULL); } -strcpy(p,str); -return(p); -} -//#endif - -char check_elists(char *areatag,faddr_t addr) -{ - FILE *stream; - char str[1025],quit=0,match=0,*p; - int i,j,k,x,file; - -i=matchnode(addr,0); -if(i<cfg.nodecfgs) { - for(j=0;j<cfg.listcfgs;j++) { - quit=0; - for(k=0;k<cfg.listcfg[j].numflags;k++) { - if(quit) break; - for(x=0;x<cfg.nodecfg[i].numflags;x++) - if(!stricmp(cfg.listcfg[j].flag[k].flag - ,cfg.nodecfg[i].flag[x].flag)) { - if((stream=fnopen(&file - ,cfg.listcfg[j].listpath,O_RDONLY))==NULL) { - printf("\7ERROR couldn't open %s.\n" - ,cfg.listcfg[j].listpath); - logprintf("ERROR line %d opening %s" - ,__LINE__,cfg.listcfg[j].listpath); - quit=1; - break; } - while(!feof(stream)) { - if(!fgets(str,255,stream)) - break; - truncsp(str); - strcat(str,"\r\n"); - p=str; - while(*p && *p<=SP) p++; - if(*p==';') /* Ignore Comment Lines */ - continue; - strcpy(str,p); - p=str; - while(*p && *p>SP) p++; - *p=0; - if(!stricmp(areatag,str)) { - match=1; - break; } } - fclose(stream); - quit=1; - if(match) - return(match); - break; } } } } -return(match); -} -/****************************************************************************** - Used by AREAFIX to add/remove/change areas in the areas file -******************************************************************************/ -void alter_areas(area_t add_area,area_t del_area,faddr_t addr) -{ - FILE *nmfile,*afilein,*afileout,*reqfile,*fwdfile; - char str[1025],fields[1025],field1[81],field2[81],field3[81] - ,drive[3],dir[66],name[9],ext[5],outpath[128] - ,*outname,*p,*tp,nomatch=0,match=0; - int i,j,k,x,y,file; - ulong tagcrc; - -_splitpath(cfg.areafile,drive,dir,name,ext); -sprintf(outpath,"%s%s",drive,dir); -if((outname=tempname(outpath,"AREAS"))==NULL) { - printf("\7ERROR creating temp file name for %s.\n",outpath); - logprintf("ERROR tempnam(%s,AREAS)",outpath); - return; } -if((nmfile=tmpfile())==NULL) { - printf("\7ERROR couldn't open NetMail temp file.\n"); - logprintf("ERROR in tmpfile()"); - free(outname); - return; } -if((afileout=fopen(outname,"w+b"))==NULL) { - printf("\7ERROR couldn't open %s.\n",outname); - logprintf("ERROR line %d opening %s %s",__LINE__,outname - ,sys_errlist[errno]); - fclose(nmfile); - free(outname); - return; } -if((afilein=fnopen(&file,cfg.areafile,O_RDONLY))==NULL) { - printf("\7ERROR couldn't open %s.\n",cfg.areafile); - logprintf("ERROR line %d opening %s %s",__LINE__,cfg.areafile - ,sys_errlist[errno]); - fclose(afileout); - fclose(nmfile); - free(outname); - return; } -while(!feof(afilein)) { - if(!fgets(fields,1024,afilein)) - break; - truncsp(fields); - strcat(fields,"\r\n"); - p=fields; - while(*p && *p<=SP) p++; - if(*p==';') { /* Skip Comment Lines */ - fprintf(afileout,"%s",fields); - continue; } - sprintf(field1,"%-.81s",p); /* Internal Code Field */ - tp=field1; - while(*tp && *tp>SP) tp++; - *tp=0; - while(*p && *p>SP) p++; - while(*p && *p<=SP) p++; - sprintf(field2,"%-.81s",p); /* Areatag Field */ - tp=field2; - while(*tp && *tp>SP) tp++; - *tp=0; - while(*p && *p>SP) p++; - while(*p && *p<=SP) p++; - if((tp=strchr(p,';'))!=NULL) { - sprintf(field3,"%-.81s",p); /* Comment Field (if any) */ - while(*tp && *tp>SP) tp++; - *tp=0; } - else - field3[0]=0; - if(del_area.tags) { /* Check for areas to remove */ - for(i=0;i<del_area.tags;i++) { - if(!stricmp(del_area.tag[i],field2) || - !stricmp(del_area.tag[0],"-ALL")) /* Match Found */ - break; } - if(i<del_area.tags) { - for(i=0;i<cfg.areas;i++) { - if(!stricmp(field2,cfg.area[i].name)) { - for(j=0;j<cfg.area[i].uplinks;j++) - if(!memcmp(&cfg.area[i].uplink[j],&addr - ,sizeof(faddr_t))) - break; - if(j==cfg.area[i].uplinks && - stricmp(del_area.tag[0],"-ALL")) { - fprintf(afileout,"%s",fields); - fprintf(nmfile,"%s not connected.\r\n",field2); - break; } - - /* Added 12/4/95 to remove uplink from connected uplinks */ - - for(k=j;k<cfg.area[i].uplinks-1;k++) - memcpy(&cfg.area[i].uplink[k],&cfg.area[i].uplink[k+1] - ,sizeof(faddr_t)); - --cfg.area[i].uplinks; - if((cfg.area[i].uplink=(faddr_t *) - REALLOC(cfg.area[i].uplink,sizeof(faddr_t) - *(cfg.area[i].uplinks)))==NULL) { - printf("ERROR allocating memory for area #%u " - "uplinks.\n",i+1); - logprintf("ERROR line %d allocating memory for area " - "#%u uplinks.\n",__LINE__,i+1); - exit(1); } - - fprintf(afileout,"%-16s%-23s ",field1,field2); - for(j=0;j<cfg.area[i].uplinks;j++) { - if(!memcmp(&cfg.area[i].uplink[j],&addr - ,sizeof(faddr_t))) - continue; - fprintf(afileout,"%s " - ,faddrtoa(cfg.area[i].uplink[j])); } - if(field3[0]) - fprintf(afileout,"%s",field3); - fprintf(afileout,"\r\n"); - fprintf(nmfile,"%s removed.\r\n",field2); - break; } } - if(i==cfg.areas) /* Something screwy going on */ - fprintf(afileout,"%s",fields); - continue; } } /* Area match so continue on */ - if(add_area.tags) { /* Check for areas to add */ - for(i=0;i<add_area.tags;i++) - if(!stricmp(add_area.tag[i],field2) || - !stricmp(add_area.tag[0],"+ALL")) /* Match Found */ - break; - if(i<add_area.tags) { - if(stricmp(add_area.tag[i],"+ALL")) - add_area.tag[i][0]=0; /* So we can check other lists */ - for(i=0;i<cfg.areas;i++) { - if(!stricmp(field2,cfg.area[i].name)) { - for(j=0;j<cfg.area[i].uplinks;j++) - if(!memcmp(&cfg.area[i].uplink[j],&addr - ,sizeof(faddr_t))) - break; - if(j<cfg.area[i].uplinks) { - fprintf(afileout,"%s",fields); - fprintf(nmfile,"%s already connected.\r\n",field2); - break; } - if(misc&ELIST_ONLY && !check_elists(field2,addr)) { - fprintf(afileout,"%s",fields); - break; } - - /* Added 12/4/95 to add uplink to connected uplinks */ - - ++cfg.area[i].uplinks; - if((cfg.area[i].uplink=(faddr_t *) - REALLOC(cfg.area[i].uplink,sizeof(faddr_t) - *(cfg.area[i].uplinks)))==NULL) { - printf("ERROR allocating memory for area #%u " - "uplinks.\n",i+1); - logprintf("ERROR line %d allocating memory for area " - "#%u uplinks.\n",__LINE__,i+1); - exit(1); } - memcpy(&cfg.area[i].uplink[j],&addr,sizeof(faddr_t)); - - fprintf(afileout,"%-16s%-23s ",field1,field2); - for(j=0;j<cfg.area[i].uplinks;j++) - fprintf(afileout,"%s " - ,faddrtoa(cfg.area[i].uplink[j])); -#if 0 // Removed (02/26/96) rrs - fprintf(afileout,"%s ",faddrtoa(addr)); -#endif - if(field3[0]) - fprintf(afileout,"%s",field3); - fprintf(afileout,"\r\n"); - fprintf(nmfile,"%s added.\r\n",field2); - break; } } - if(i==cfg.areas) /* Something screwy going on */ - fprintf(afileout,"%s",fields); - continue; } /* Area match so continue on */ - nomatch=1; } /* This area wasn't in there */ - fprintf(afileout,"%s",fields); } /* No match so write back line */ -fclose(afilein); -if(nomatch || (add_area.tags && !stricmp(add_area.tag[0],"+ALL"))) { - i=matchnode(addr,0); - if(i<cfg.nodecfgs) { - for(j=0;j<cfg.listcfgs;j++) { - match=0; - for(k=0;k<cfg.listcfg[j].numflags;k++) { - if(match) break; - for(x=0;x<cfg.nodecfg[i].numflags;x++) - if(!stricmp(cfg.listcfg[j].flag[k].flag - ,cfg.nodecfg[i].flag[x].flag)) { - if((fwdfile=tmpfile())==NULL) { - printf("\7ERROR couldn't open forwarding temp " - "file.\n"); - logprintf("ERROR line %d opening forward temp " - "file",__LINE__); - match=1; - break; } - if((afilein=fnopen(&file - ,cfg.listcfg[j].listpath,O_RDONLY))==NULL) { - printf("\7ERROR couldn't open %s.\n" - ,cfg.listcfg[j].listpath); - logprintf("ERROR line %d opening %s" - ,__LINE__,cfg.listcfg[j].listpath); - fclose(fwdfile); - match=1; - break; } - while(!feof(afilein)) { - if(!fgets(str,255,afilein)) - break; - truncsp(str); - strcat(str,"\r\n"); - p=str; - while(*p && *p<=SP) p++; - if(*p==';') /* Ignore Comment Lines */ - continue; - strcpy(str,p); - p=str; - while(*p && *p>SP) p++; - *p=0; - if(!stricmp(add_area.tag[0],"+ALL")) { - sprintf(fields,"%.1024s",str); - tagcrc=crc32(strupr(fields)); - for(y=0;y<cfg.areas;y++) - if(tagcrc==cfg.area[y].tag) - break; - if(y<cfg.areas) - continue; } - for(y=0;y<add_area.tags;y++) - if((!stricmp(add_area.tag[y],str) && - add_area.tag[y][0]) || - !stricmp(add_area.tag[0],"+ALL")) - break; - if(y<add_area.tags) { - fprintf(afileout,"%-16s%-23s","P",str); - if(cfg.listcfg[j].forward.zone) - fprintf(afileout," %s" - ,faddrtoa(cfg.listcfg[j].forward)); - fprintf(afileout," %s\r\n",faddrtoa(addr)); - fprintf(nmfile,"%s added.\r\n",str); - if(stricmp(add_area.tag[0],"+ALL")) - add_area.tag[y][0]=0; - if(!(cfg.listcfg[j].misc&NOFWD) - && cfg.listcfg[j].forward.zone) - fprintf(fwdfile,"%s\r\n",str); } } - fclose(afilein); - if(!(cfg.listcfg[j].misc&NOFWD) && ftell(fwdfile)>0) - file_to_netmail(fwdfile,cfg.listcfg[j].password - ,cfg.listcfg[j].forward,"Areafix"); - fclose(fwdfile); - match=1; - break; } } } } } -if(add_area.tags && stricmp(add_area.tag[0],"+ALL")) { - for(i=0;i<add_area.tags;i++) - if(add_area.tag[i][0]) - fprintf(nmfile,"%s not found.\r\n",add_area.tag[i]); } -if(!ftell(nmfile)) - create_netmail(0,"Area Change Request","No changes made.",addr,0); -else - file_to_netmail(nmfile,"Area Change Request",addr,0); -fclose(nmfile); -fclose(afileout); -if(delfile(cfg.areafile)) /* Delete AREAS.BBS */ - logprintf("ERROR line %d removing %s %s",__LINE__,cfg.areafile - ,sys_errlist[errno]); -if(rename(outname,cfg.areafile)) /* Rename new AREAS.BBS file */ - logprintf("ERROR line %d renaming %s to %s",__LINE__,outname,cfg.areafile); -free(outname); -} -/****************************************************************************** - Used by AREAFIX to add/remove/change uplink info in the configuration file - old = the old setting for this option, new = what the setting is changing to - option = 0 for compression type change - 1 for areafix password change - 2 to set this node to passive - 3 to set this node to active (remove passive) -******************************************************************************/ -void alter_config(faddr_t addr,char *old,char *new,char option) -{ - FILE *outfile,*cfgfile; - char str[257],outpath[128],tmp[257],tmp2[257],*outname,*p,*tp - ,drive[3],dir[66],name[9],ext[5],match=0; - int i,j,k,file; - faddr_t taddr; - -i=matchnode(addr,0); /* i = config number from here on */ -_splitpath(cfg.cfgfile,drive,dir,name,ext); -sprintf(outpath,"%s%s",drive,dir); -if((outname=tempname(outpath,"CFG"))==NULL) { - printf("\7ERROR creating temporary file name for %s.\n",outpath); - logprintf("ERROR tempnam(%s,CFG)",outpath); - return; } -if((outfile=fopen(outname,"w+b"))==NULL) { - printf("\7ERROR couldn't open %s.\n",outname); - logprintf("ERROR line %d opening %s %s",__LINE__,outname - ,sys_errlist[errno]); - free(outname); - return; } -if((cfgfile=fnopen(&file,cfg.cfgfile,O_RDONLY))==NULL) { - printf("\7ERROR couldn't open %s.\n",cfg.cfgfile); - logprintf("ERROR line %d opening %s",__LINE__,cfg.cfgfile - ,sys_errlist[errno]); - fclose(outfile); - free(outname); - return; } - -while(!feof(cfgfile)) { - if(!fgets(str,256,cfgfile)) - break; - truncsp(str); - p=str; - while(*p && *p<=SP) p++; - if(*p==';') { - fprintf(outfile,"%s\r\n",str); - continue; } - sprintf(tmp,"%-.25s",p); - tp=strchr(tmp,SP); - if(tp) - *tp=0; /* Chop off at space */ - strupr(tmp); /* Convert code to uppercase */ - while(*p>SP) p++; /* Skip code */ - while(*p && *p<=SP) p++; /* Skip white space */ - - if(option==0 && !strcmp(tmp,"USEPACKER")) { /* Change Compression */ - if(!*p) - continue; - strcpy(tmp2,p); - p=tmp2; - while(*p && *p>SP) p++; - *p=0; - p++; - if(!stricmp(new,tmp2)) { /* Add to new definition */ - fprintf(outfile,"%-10s %s %s %s\r\n",tmp,tmp2 - ,faddrtoa(cfg.nodecfg[i].faddr) - ,(*p) ? p : ""); - match=1; - continue; } - else if(!stricmp(old,tmp2)) { /* Remove from old def */ - for(j=k=0;j<cfg.nodecfgs;j++) { - if(j==i) - continue; - if(!stricmp(cfg.arcdef[cfg.nodecfg[j].arctype].name,tmp2)) { - if(!k) { - fprintf(outfile,"%-10s %s",tmp,tmp2); - k++; } - fprintf(outfile," %s" - ,faddrtoa(cfg.nodecfg[j].faddr)); } } - fprintf(outfile,"\r\n"); - continue; } } - - if(option==1 && !strcmp(tmp,"AREAFIX")) { /* Change Password */ - if(!*p) - continue; - taddr=atofaddr(p); - if(!memcmp(&cfg.nodecfg[i].faddr,&taddr,sizeof(faddr_t))) { - while(*p && *p>SP) p++; /* Skip over address */ - while(*p && *p<=SP) p++; /* Skip over whitespace */ - while(*p && *p>SP) p++; /* Skip over password */ - while(*p && *p<=SP) p++; /* Skip over whitespace */ - fprintf(outfile,"%-10s %s %s %s\r\n",tmp - ,faddrtoa(cfg.nodecfg[i].faddr),new,p); - continue; } } - - if(option>1 && !strcmp(tmp,"PASSIVE")) { /* Toggle Passive Areas */ - match=1; - for(j=k=0;j<cfg.nodecfgs;j++) { - if(option==2 && j==i) { - if(!k) fprintf(outfile,"%-10s",tmp); - fprintf(outfile," %s",faddrtoa(cfg.nodecfg[j].faddr)); - k++; - continue; } - if(option==3 && j==i) - continue; - if(cfg.nodecfg[j].attr&ATTR_PASSIVE) { - if(!k) fprintf(outfile,"%-10s",tmp); - fprintf(outfile," %s",faddrtoa(cfg.nodecfg[j].faddr)); - k++; } } - if(k) fprintf(outfile,"\r\n"); - continue; } - fprintf(outfile,"%s\r\n",str); } - -if(!match) { - if(option==0) - fprintf(outfile,"%-10s %s %s\r\n","USEPACKER",new - ,faddrtoa(cfg.nodecfg[i].faddr)); - if(option==2) - fprintf(outfile,"%-10s %s\r\n","PASSIVE" - ,faddrtoa(cfg.nodecfg[i].faddr)); } - -fclose(cfgfile); -fclose(outfile); -if(delfile(cfg.cfgfile)) - logprintf("ERROR line %d removing %s %s",__LINE__,cfg.cfgfile - ,sys_errlist[errno]); -if(rename(outname,cfg.cfgfile)) - logprintf("ERROR line %d renaming %s to %s",__LINE__,outname,cfg.cfgfile); -free(outname); -} -/****************************************************************************** - Used by AREAFIX to process any '%' commands that come in via netmail -******************************************************************************/ -void command(char *instr,faddr_t addr) -{ - FILE *stream,*tmpf; - char str[256],temp[256],match,*buf,*p; - int file,i,j,node; - long l; - area_t add_area,del_area; - -node=matchnode(addr,0); -if(node>=cfg.nodecfgs) - return; -memset(&add_area,0,sizeof(area_t)); -memset(&del_area,0,sizeof(area_t)); -strupr(instr); -if((p=strstr(instr,"HELP"))!=NULL) { - sprintf(str,"%s%sAREAMGR.HLP",(exec_dir[0]=='.') ? node_dir:"",exec_dir); - if(!fexist(str)) - return; - if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - printf("\7ERROR couldn't open %s.\n",str); - logprintf("ERROR line %d opening %s %s",__LINE__,str - ,sys_errlist[errno]); - return; } - l=filelength(file); - if((buf=(char *)LMALLOC(l+1L))==NULL) { - printf("ERROR line %d allocating %lu bytes for %s\n",__LINE__,l,str); - return; } - fread(buf,l,1,stream); - fclose(stream); - buf[l]=0; - create_netmail(0,"Area Manager Help",buf,addr,0); - LFREE(buf); - return; } - -if((p=strstr(instr,"LIST"))!=NULL) { - netmail_arealist(0,addr); - return; } - -if((p=strstr(instr,"QUERY"))!=NULL) { - netmail_arealist(1,addr); - return; } - -if((p=strstr(instr,"UNLINKED"))!=NULL) { - netmail_arealist(2,addr); - return; } - -if((p=strstr(instr,"COMPRESSION"))!=NULL) { - while(*p && *p>SP) p++; - while(*p && *p<=SP) p++; - for(i=0;i<cfg.arcdefs;i++) - if(!stricmp(p,cfg.arcdef[i].name)) - break; - if(!stricmp(p,"NONE")) - i=0xffff; - if(i==cfg.arcdefs) { - if((tmpf=tmpfile())==NULL) { - printf("\7ERROR couldn't open tmpfile.\n"); - logprintf("ERROR line %d opening tmpfile()",__LINE__); - return; } - fprintf(tmpf,"Compression type unavailable.\r\n\r\n" - "Available types are:\r\n"); - for(i=0;i<cfg.arcdefs;i++) - fprintf(tmpf," %s\r\n",cfg.arcdef[i].name); - file_to_netmail(tmpf,"Compression Type Change",addr,0); - fclose(tmpf); - LFREE(buf); - return; } - alter_config(addr,cfg.arcdef[cfg.nodecfg[node].arctype].name - ,cfg.arcdef[i].name,0); - cfg.nodecfg[node].arctype=i; - sprintf(str,"Compression type changed to %s.",cfg.arcdef[i].name); - create_netmail(0,"Compression Type Change",str,addr,0); - return; } - -if((p=strstr(instr,"PASSWORD"))!=NULL) { - while(*p && *p>SP) p++; - while(*p && *p<=SP) p++; - sprintf(temp,"%-.25s",p); - p=temp; - while(*p && *p>SP) p++; - *p=0; - if(node==cfg.nodecfgs) /* Should never happen */ - return; - if(!stricmp(temp,cfg.nodecfg[node].password)) { - sprintf(str,"Your password was already set to %s." - ,cfg.nodecfg[node].password); - create_netmail(0,"Password Change Request",str,addr,0); - return; } - alter_config(addr,cfg.nodecfg[node].password,temp,1); - sprintf(str,"Your password has been changed from %s to %.25s." - ,cfg.nodecfg[node].password,temp); - sprintf(cfg.nodecfg[node].password,"%.25s",temp); - create_netmail(0,"Password Change Request",str,addr,0); - return; } - -if((p=strstr(instr,"RESCAN"))!=NULL) { - export_echomail("",addr); - create_netmail(0,"Rescan Areas" - ,"All connected areas carried by your hub have been rescanned." - ,addr,0); - return; } - -if((p=strstr(instr,"ACTIVE"))!=NULL) { - if(!(cfg.nodecfg[node].attr&ATTR_PASSIVE)) { - create_netmail(0,"Reconnect Disconnected Areas" - ,"Your areas are already connected.",addr,0); - return; } - alter_config(addr,0,0,3); - create_netmail(0,"Reconnect Disconnected Areas" - ,"Temporarily disconnected areas have been reconnected.",addr,0); - return; } - -if((p=strstr(instr,"PASSIVE"))!=NULL) { - if(cfg.nodecfg[node].attr&ATTR_PASSIVE) { - create_netmail(0,"Temporarily Disconnect Areas" - ,"Your areas are already temporarily disconnected.",addr,0); - return; } - alter_config(addr,0,0,2); - create_netmail(0,"Temporarily Disconnect Areas" - ,"Your areas have been temporarily disconnected.",addr,0); - return; } - -if((p=strstr(instr,"FROM"))!=NULL); - -if((p=strstr(instr,"+ALL"))!=NULL) { - if((add_area.tag=(char **)REALLOC(add_area.tag - ,sizeof(char *)*add_area.tags+1))==NULL) { - printf("ERROR allocating memory for add area tag #%u.\n" - ,add_area.tags+1); - logprintf("ERROR line %d allocating memory for add area tag #%u" - ,__LINE__,add_area.tags+1); - exit(1); } - if((add_area.tag[add_area.tags]=(char *)LMALLOC(strlen(instr)+1))==NULL) { - printf("ERROR allocating memory for add area tag #%u.\n" - ,add_area.tags+1); - logprintf("ERROR line %d allocating memory for add area tag #%u" - ,__LINE__,add_area.tags+1); - exit(1); } - strcpy(add_area.tag[add_area.tags],instr); - add_area.tags++; - alter_areas(add_area,del_area,addr); - for(i=0;i<add_area.tags;i++) - LFREE(add_area.tag[i]); - FREE(add_area.tag); - return; } - -if((p=strstr(instr,"-ALL"))!=NULL) { - if((del_area.tag=(char **)REALLOC(del_area.tag - ,sizeof(char *)*del_area.tags+1))==NULL) { - printf("ERROR allocating memory for del area tag #%u.\n" - ,del_area.tags+1); - logprintf("ERROR line %d allocating memory for del area tag #%u" - ,__LINE__,del_area.tags+1); - exit(1); } - if((del_area.tag[del_area.tags]=(char *)LMALLOC(strlen(instr)+1))==NULL) { - printf("ERROR allocating memory for del area tag #%u.\n" - ,del_area.tags+1); - logprintf("ERROR line %d allocating memory for del area tag #%u" - ,__LINE__,del_area.tags+1); - exit(1); } - strcpy(del_area.tag[del_area.tags],instr); - del_area.tags++; - alter_areas(add_area,del_area,addr); - for(i=0;i<del_area.tags;i++) - LFREE(del_area.tag[i]); - FREE(del_area.tag); - return; } -} -/****************************************************************************** - This is where we're gonna process any netmail that comes in for areafix. - Returns text for message body for the local sysop if necessary. -******************************************************************************/ -char *process_areafix(faddr_t addr,char HUGE16 *inbuf,char *password) -{ - static char body[512],str[81]; - char *p,*tp,action,percent=0; - int i; - ulong l,m; - area_t add_area,del_area; - -p=(char *)inbuf; - -while(*p==1) { /* Skip kludge lines 11/05/95 */ - while(*p && *p!=CR) - p++; /* Skip meat */ - if(*p) - p++; } /* Skip CR */ - -#if 0 // Removed 11/05/95 -while(*p && (tp=strchr(p,'\1'))!=NULL) { /* Remove ^A kludge lines */ - p=tp; - while(*p && *p!=CR) p++; } -if(*p==CR) - p++; -#endif - -if(((tp=strstr(p,"---\r"))!=NULL || (tp=strstr(p,"--- "))!=NULL) && - (*(tp-1)==10 || *(tp-1)==13)) - *tp=0; - -if(!strnicmp(p,"%FROM",5)) { /* Remote Remote Maintenance (must be first) */ - sprintf(str,"%.80s",p+6); - if((tp=strchr(str,CR))!=NULL) - *tp=0; - logprintf("Remote maintenance for %s requested via %s",str,faddrtoa(addr)); - addr=atofaddr(str); } - -i=matchnode(addr,0); -if(i==cfg.nodecfgs) { - sprintf(body,"Your node is not configured for Areafix, please " - "contact your hub.\r\n"); - create_netmail(0,"Areafix Request",body,addr,0); - sprintf(body,"An areafix request was made by node %s.\r\nThis node " - "is not currently configured for areafix.\r\n",faddrtoa(addr)); - return(body); } - -if(stricmp(cfg.nodecfg[i].password,password)) { - create_netmail(0,"Areafix Request","Invalid Password.",addr,0); - sprintf(body,"Node %s attempted an areafix request using an invalid " - "password.\r\nThe password attempted was %s.\r\nThe correct password " - "for this node is %s.\r\n",faddrtoa(addr),password - ,(cfg.nodecfg[i].password[0]) ? cfg.nodecfg[i].password - : "[None Defined]"); - return(body); } - -m=strlen(p); -add_area.tags=0; -add_area.tag=NULL; -del_area.tags=0; -del_area.tag=NULL; -for(l=0;l<m;l++) { - while(*(p+l) && *(p+l)<=SP) l++; - if(!(*(p+l))) break; - if(*(p+l)=='+' || *(p+l)=='-' || *(p+l)=='%') { - action=*(p+l); - l++; } - else - action='+'; - sprintf(str,"%.80s",p+l); - if((tp=strchr(str,CR))!=NULL) - *tp=0; - switch(action) { - case '+': /* Add Area */ - if((add_area.tag=(char **)REALLOC(add_area.tag - ,sizeof(char *)*add_area.tags+1))==NULL) { - printf("ERROR allocating memory for add area tag #%u.\n" - ,add_area.tags+1); - logprintf("ERROR line %d allocating memory for add area " - "tag #%u",__LINE__,add_area.tags+1); - exit(1); } - if((add_area.tag[add_area.tags]=(char *)LMALLOC(strlen(str)+1)) - ==NULL) { - printf("ERROR allocating memory for add area tag #%u.\n" - ,add_area.tags+1); - logprintf("ERROR line %d allocating memory for add area " - "tag #%u",__LINE__,add_area.tags+1); - exit(1); } - strcpy(add_area.tag[add_area.tags],str); - add_area.tags++; - break; - case '-': /* Remove Area */ - if((del_area.tag=(char **)REALLOC(del_area.tag - ,sizeof(char *)*del_area.tags+1))==NULL) { - printf("ERROR allocating memory for del area tag #%u.\n" - ,del_area.tags+1); - logprintf("ERROR line %d allocating memory for del area " - "tag #%u",__LINE__,del_area.tags+1); - exit(1); } - if((del_area.tag[del_area.tags]=(char *)LMALLOC(strlen(str)+1)) - ==NULL) { - printf("ERROR allocating memory for del area tag #%u.\n" - ,del_area.tags+1); - logprintf("ERROR line %d allocating memory for del area " - "tag #%u",__LINE__,del_area.tags+1); - exit(1); } - strcpy(del_area.tag[del_area.tags],str); - del_area.tags++; - break; - case '%': /* Process Command */ - command(str,addr); - percent++; - break; } - - while(*(p+l) && *(p+l)!=CR) l++; } - -if(!percent && !add_area.tags && !del_area.tags) { - create_netmail(0,"Areafix Request","No commands to process.",addr,0); - sprintf(body,"Node %s attempted an areafix request with an empty message " - "body or with no valid commands.\r\n",faddrtoa(addr)); - return(body); } -if(add_area.tags || del_area.tags) - alter_areas(add_area,del_area,addr); -if(add_area.tags) { - for(i=0;i<add_area.tags;i++) - LFREE(add_area.tag[i]); - FREE(add_area.tag); } -if(del_area.tags) { - for(i=0;i<del_area.tags;i++) - LFREE(del_area.tag[i]); - FREE(del_area.tag); } -return(0); -} -/****************************************************************************** - This function will compare the archive signatures defined in the CFG file and - extract 'infile' using the appropriate de-archiver. -******************************************************************************/ -int unpack(char *infile) -{ - FILE *stream; - char str[256],tmp[3]; - int i,j,k,ch,file; - -if((stream=fnopen(&file,infile,O_RDONLY))==NULL) { - printf("\7ERROR couldn't open %s.\n",infile); - logprintf("ERROR line %d opening %s %s",__LINE__,infile - ,sys_errlist[errno]); - exit(1); } -for(i=0;i<cfg.arcdefs;i++) { - str[0]=0; - fseek(stream,cfg.arcdef[i].byteloc,SEEK_SET); - for(j=0;j<strlen(cfg.arcdef[i].hexid)/2;j++) { - ch=fgetc(stream); - if(ch==EOF) { - i=cfg.arcdefs; - break; } - sprintf(tmp,"%02X",ch); - strcat(str,tmp); } - if(!stricmp(str,cfg.arcdef[i].hexid)) - break; } -fclose(stream); - -if(i==cfg.arcdefs) { - printf("\7ERROR couldn't determine filetype of %s.\n",infile); - logprintf("ERROR line %d determining filetype of %s",__LINE__,infile); - return(1); } - -j=execute(cmdstr(cfg.arcdef[i].unpack,infile - ,secure ? cfg.secure : cfg.inbound)); -if(j) { - printf("\7ERROR %d (%d) executing %s\n" - ,j,errno,cmdstr(cfg.arcdef[i].unpack,infile - ,secure ? cfg.secure : cfg.inbound)); - logprintf("ERROR %d (%d) line %d executing %s" - ,j,errno,__LINE__,cmdstr(cfg.arcdef[i].unpack,infile - ,secure ? cfg.secure : cfg.inbound)); - return(j); } -return(0); -} -/****************************************************************************** - This function will check the 'dest' for the type of archiver to use (as - defined in the CFG file) and compress 'srcfile' into 'destfile' using the - appropriate archive program. -******************************************************************************/ -void pack(char *srcfile,char *destfile,faddr_t dest) -{ - int i,j; - uint use=0; - -i=matchnode(dest,0); -if(i<cfg.nodecfgs) - use=cfg.nodecfg[i].arctype; - -j=execute(cmdstr(cfg.arcdef[use].pack,destfile,srcfile)); -if(j) { - printf("\7ERROR %d (%d) executing %s\n" - ,j,errno,cmdstr(cfg.arcdef[use].pack,destfile,srcfile)); - logprintf("ERROR %d (%d) line %d executing %s" - ,j,errno,__LINE__,cmdstr(cfg.arcdef[use].pack,destfile,srcfile)); } -} - -char attachment(char *bundlename,faddr_t dest,char cleanup) -{ - FILE *fidomsg,*stream; - char str[1025],path[512],fname[129],*p; - int last,fmsg,file,error=0L; - long fncrc,*mfncrc=0L,num_mfncrc=0L; - struct find_t ff; - attach_t attach; - fmsghdr_t hdr; - -sprintf(fname,"%sBUNDLES.SBE",cfg.outbound); -if((stream=fnopen(&file,fname,O_RDWR|O_CREAT))==NULL) { - printf("\7ERROR opening %s %s\n",fname,sys_errlist[errno]); - logprintf("ERROR line %d opening %s %s",__LINE__,fname,sys_errlist[errno]); - return(1); } - -if(cleanup==2) { /* Check for existance in BUNDLES.SBE */ - while(!feof(stream)) { - if(!fread(&attach,1,sizeof(attach_t),stream)) - break; - if(!stricmp(attach.fname,bundlename)) { - fclose(stream); - return(1); } } - fclose(stream); - return(0); } - -if(cleanup==1) { /* Create netmail attaches */ - -if(!filelength(file)) { - fclose(stream); - return(0); } - /* Get attach names from existing MSGs */ -sprintf(str,"%s*.MSG",netmail_dir); -for(last=_dos_findfirst(str,0,&ff);!last;last=_dos_findnext(&ff)) { - sprintf(path,"%s%s",netmail_dir,ff.name); - strupr(path); - if((fidomsg=fnopen(&fmsg,path,O_RDWR))==NULL) { - printf("\7ERROR opening %s\n",path); - logprintf("ERROR line %d opening %s %s",__LINE__,path - ,sys_errlist[errno]); - continue; } - if(filelength(fmsg)<sizeof(fmsghdr_t)) { - printf("\7ERROR %s has invalid length of %u bytes\n",path - ,filelength(fmsg)); - logprintf("ERROR line %d %s has invalid length of %u bytes" - ,__LINE__,path,filelength(fmsg)); - fclose(fidomsg); - continue; } - if(fread(&hdr,sizeof(fmsghdr_t),1,fidomsg)!=1) { - fclose(fidomsg); - printf("\7ERROR reading %u bytes from %s" - ,sizeof(fmsghdr_t),path); - logprintf("ERROR line %d reading %u bytes from %s" - ,__LINE__,sizeof(fmsghdr_t),path); - continue; } - fclose(fidomsg); - if(!(hdr.attr&FIDO_FILE)) /* Not a file attach */ - continue; - num_mfncrc++; - if((p=strrchr(hdr.subj,'\\'))!=NULL) - p++; - else - p=hdr.subj; - if((mfncrc=(long *)REALLOC(mfncrc,num_mfncrc*sizeof(long)))==NULL) { - printf("ERROR allocating %lu bytes for bundle name crc.\n" - ,num_mfncrc*sizeof(long)); - logprintf("ERROR line %d allocating %lu for bundle name crc" - ,__LINE__,num_mfncrc*sizeof(long)); - continue; } - mfncrc[num_mfncrc-1]=crc32(strupr(p)); } - - while(!feof(stream)) { - if(!fread(&attach,1,sizeof(attach_t),stream)) - break; - sprintf(str,"%s%s",cfg.outbound,attach.fname); - if(!fexist(str)) - continue; - fncrc=crc32(strupr(attach.fname)); - for(last=0;last<num_mfncrc;last++) - if(mfncrc[last]==fncrc) - break; - if(last==num_mfncrc) - if(create_netmail(0,str,"\1FLAGS KFS\r",attach.dest,1)) - error=1; } - if(!error) /* don't truncate if an error occured */ - chsize(file,0L); - fclose(stream); - if(num_mfncrc) - FREE(mfncrc); -#ifdef __WATCOMC__ - _dos_findclose(&ff); -#endif - return(0); } - -while(!feof(stream)) { - if(!fread(&attach,1,sizeof(attach_t),stream)) - break; - if(!stricmp(attach.fname,bundlename)) { - fclose(stream); - return(0); } } - -memcpy(&attach.dest,&dest,sizeof(faddr_t)); -strcpy(attach.fname,bundlename); -fwrite(&attach,sizeof(attach_t),1,stream); -fclose(stream); -return(0); -} - -/****************************************************************************** - This function is called when a message packet has reached it's maximum size. - It places packets into a bundle until that bundle is full, at which time the - last character of the extension increments (1 thru 0 and then A thru Z). If - all bundles have reached their maximum size remaining packets are placed into - the Z bundle. -******************************************************************************/ -void pack_bundle(char *infile,faddr_t dest) -{ - char str[256],fname[256],outbound[128],day[3],ch,*p; - int i,j,file,node; - time_t now; - -node=matchnode(dest,0); -strcpy(str,infile); -str[strlen(str)-1]='T'; -if(rename(infile,str)) /* Change .PK_ file to .PKT file */ - logprintf("ERROR line %d renaming %s to %s",__LINE__,infile,str); -infile[strlen(infile)-1]='T'; -time(&now); -sprintf(day,"%-.2s",ctime(&now)); -strupr(day); -if(misc&FLO_MAILER) { - if(node<cfg.nodecfgs && cfg.nodecfg[node].route.zone) - dest=cfg.nodecfg[node].route; - if(dest.zone==faddr[0].zone) /* Default zone, use default outbound */ - strcpy(outbound,cfg.outbound); - else /* Inter-zone outbound is OUTBOUND.XXX */ - sprintf(outbound,"%.*s.%03X\\" - ,strlen(cfg.outbound)-1,cfg.outbound,dest.zone); - if(dest.point) { /* Point destination is OUTBOUND\*.PNT */ - sprintf(str,"%04X%04X.PNT" - ,dest.net,dest.node); - strcat(outbound,str); } - } -else - strcpy(outbound,cfg.outbound); -if(outbound[strlen(outbound)-1]=='\\') - outbound[strlen(outbound)-1]=0; -mkdir(outbound); -strcat(outbound,"\\"); - -if(node<cfg.nodecfgs) - if(cfg.nodecfg[node].arctype==0xffff) { /* Uncompressed! */ - if(misc&FLO_MAILER) - i=write_flofile(infile,dest); - else - i=create_netmail(0,infile,"\1FLAGS KFS\r",dest,1); - if(i) exit(1); - return; } - -sprintf(fname,"%s%04hX%04hX.%s",outbound,(short)(faddr[0].net-dest.net) - ,(short)(faddr[0].node-dest.node),day); -if(dest.point && !(misc&FLO_MAILER)) - sprintf(fname,"%s%04hXP%03hX.%s",outbound,0,(short)dest.point,day); -for(i='0';i<='Z';i++) { - if(i==':') - i='A'; - sprintf(str,"%s%c",fname,i); - if(flength(str)==0) - if(delfile(str)) - logprintf("ERROR line %d removing %s %s",__LINE__,str - ,sys_errlist[errno]); - if(fexist(str)) { - if((p=strrchr(str,'\\'))!=NULL) - p++; - else - p=str; - if(flength(str)>=cfg.maxbdlsize) - continue; - file=sopen(str,O_WRONLY,SH_DENYRW); - if(file==-1) /* Can't open?!? Probably being sent */ - continue; - close(file); - if(!attachment(p,dest,2)) - attachment(p,dest,0); - pack(infile,str,dest); - if(delfile(infile)) - logprintf("ERROR line %d removing %s %s",__LINE__,infile - ,sys_errlist[errno]); - return; } - else { - if(misc&FLO_MAILER) - j=write_flofile(str,dest); - else { - if((p=strrchr(str,'\\'))!=NULL) - p++; - else - p=str; - j=attachment(p,dest,0); } - if(j) - exit(1); - pack(infile,str,dest); - if(delfile(infile)) - logprintf("ERROR line %d removing %s %s",__LINE__,infile - ,sys_errlist[errno]); - return; } } - -pack(infile,str,dest); /* Won't get here unless all bundles are full */ -} - -/****************************************************************************** - This function checks the inbound directory for the first bundle it finds, it - will then unpack and delete the bundle. If no bundles exist this function - returns a 0, otherwise a 1 is returned. -******************************************************************************/ -int unpack_bundle(void) -{ - char str[256]; - static char fname[256]; - int i,j; - static struct find_t ff; - -for(i=0;i<7;i++) { - sprintf(str,"%s*.%s?",secure ? cfg.secure : cfg.inbound - ,(i==0) ? "SU" : (i==1) ? "MO" : (i==2) ? "TU" : (i==3) ? "WE" : (i==4) - ? "TH" : (i==5) ? "FR" : "SA"); - if(!ff.name[0]) - j=_dos_findfirst(str,0,&ff); - else { - j=_dos_findnext(&ff); - if(j) { -#ifdef __WATCOMC__ - _dos_findclose(&ff); -#endif - j=_dos_findfirst(str,0,&ff); } } - if(!j) { - sprintf(fname,"%s%s",secure ? cfg.secure : cfg.inbound,ff.name); - if(unpack(fname)) { - if((ddtol(ff.wr_time,ff.wr_date)+(48L*60L*60L))>time(NULL)) { - strcpy(str,fname); - str[strlen(str)-2]='_'; - if(fexist(str)) - str[strlen(str)-2]='-'; - if(fexist(str)) - delfile(str); - if(rename(fname,str)) - logprintf("ERROR line %d renaming %s to %s" - ,__LINE__,fname,str); } } - else if(delfile(fname)) - logprintf("ERROR line %d removing %s %s",__LINE__,fname - ,sys_errlist[errno]); - return(1); } } - -#ifdef __WATCOMC__ -_dos_findclose(&ff); -#endif -return(0); -} - - -/****************************************************************************** - Displays characters locally -******************************************************************************/ -long lputs(char *str) -{ - char tmp[256]; - int i,j,k; - - -j=strlen(str); -for(i=k=0;i<j;i++) /* remove CRs */ - if(str[i]==CR && str[i+1]==LF) - continue; - else - tmp[k++]=str[i]; -tmp[k]=0; -return(fputs(tmp,stdout)); -} - -/******************************************/ -/* CRC-16 routines required for SMB index */ -/******************************************/ - -/***********************************************)**********************)*****/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) -{ - va_list argptr; - char sbuf[256]; - int chcount; - -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); -} - -/****************************************************************************/ -/* Reads the data for node number 'number' into the structure 'node' */ -/* from NODE.DAB */ -/* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */ -/****************************************************************************/ -void getnodedat(uint number, node_t *node, char lockit) -{ - char str[256]; - int count=0; - -number--; /* make zero based */ -while(count<LOOP_NODEDAB) { - lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); - if(lockit - && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) { - count++; - continue; } - if(read(nodefile,node,sizeof(node_t))==sizeof(node_t)) - break; - count++; } -if(count==LOOP_NODEDAB) { - printf("\7ERROR unlocking and reading NODE.DAB\n"); - logprintf("ERROR line %d unlocking and reading NODE.DAB",__LINE__); } -} - -/****************************************************************************/ -/* Write the data from the structure 'node' into NODE.DAB */ -/* getnodedat(num,&node,1); must have been called before calling this func */ -/* NOTE: ------^ the indicates the node record has been locked */ -/****************************************************************************/ -void putnodedat(uint number, node_t node) -{ - char str[256]; - int count; - -number--; /* make zero based */ -lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); -if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) { - unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); - printf("\7ERROR writing NODE.DAB for node %u\n",number+1); - logprintf("ERROR line %d writing NODE.DAB for node %u",__LINE__,number+1); - return; } -unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); -} - -/****************************************************************************/ -/* Creates a short message for 'usernumber' than contains 'strin' */ -/****************************************************************************/ -void putsmsg(int usernumber, char *strin) -{ - char str[256]; - int file,i; - node_t node; - -sprintf(str,"%sMSGS\\%4.4u.MSG",data_dir,usernumber); -if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - printf("\7ERROR opening/creating %s for create/append access\n",str); - logprintf("ERROR line %d opening/creating %s",__LINE__,str); - return; } -i=strlen(strin); -if(write(file,strin,i)!=i) { - close(file); - printf("\7ERROR writing %u bytes to %s\n",i,str); - logprintf("ERROR line %d writing to %s",__LINE__,str); - return; } -close(file); -for(i=1;i<=sys_nodes;i++) { /* flag node if user on that msg waiting */ - getnodedat(i,&node,0); - if(node.useron==usernumber - && (node.status==NODE_INUSE || node.status==NODE_QUIET) - && !(node.misc&NODE_MSGW)) { - getnodedat(i,&node,1); - node.misc|=NODE_MSGW; - putnodedat(i,node); } } -} - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - int c; - -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - - -void remove_re(char *str) -{ -while(!strnicmp(str,"RE:",3)) { - strcpy(str,str+3); - while(str[0]==SP) - strcpy(str,str+1); } -} - -/****************************************************************************/ -/* Moves or copies a file from one dir to another */ -/* both 'src' and 'dest' must contain full path and filename */ -/* returns 0 if successful, -1 if error */ -/****************************************************************************/ -int mv(char *src, char *dest, char copy) -{ - char buf[4096],str[256]; - int ind,outd; - long length,chunk=4096,l; -#ifdef __WATCOMC__ - unsigned short ftime,fdate; -#else - unsigned ftime,fdate; -#endif - FILE *inp,*outp; - -if(!strcmp(src,dest)) /* source and destination are the same! */ - return(0); -if(!fexist(src)) { - logprintf("MV ERROR: Source doesn't exist '%s",src); - return(-1); } -if(!copy && fexist(dest)) { - logprintf("MV ERROR: Destination already exists '%s'",dest); - return(-1); } -if(!copy && ((src[1]!=':' && dest[1]!=':') - || (src[1]==':' && dest[1]==':' && toupper(src[0])==toupper(dest[0])))) { - if(rename(src,dest)) { /* same drive, so move */ - logprintf("MV ERROR: Error renaming %s to %s",src,dest); - return(-1); } - return(0); } -if((ind=nopen(src,O_RDONLY))==-1) { - logprintf("MV ERROR: ERR_OPEN %s",src); - return(-1); } -if((inp=fdopen(ind,"rb"))==NULL) { - close(ind); - logprintf("MV ERROR: ERR_FDOPEN %s",str); - return(-1); } -setvbuf(inp,NULL,_IOFBF,8*1024); -if((outd=nopen(dest,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - fclose(inp); - logprintf("MV ERROR: ERR_OPEN %s",dest); - return(-1); } -if((outp=fdopen(outd,"wb"))==NULL) { - close(outd); - fclose(inp); - logprintf("MV ERROR: ERR_FDOPEN %s",str); - return(-1); } -setvbuf(outp,NULL,_IOFBF,8*1024); -length=filelength(ind); -l=0L; -while(l<length) { - if(l+chunk>length) - chunk=length-l; - fread(buf,chunk,1,inp); - fwrite(buf,chunk,1,outp); - l+=chunk; } -_dos_getftime(ind,&fdate,&ftime); -_dos_setftime(outd,fdate,ftime); -fclose(inp); -fclose(outp); -if(!copy && delfile(src)) { - logprintf("ERROR line %d removing %s %s",__LINE__,src,sys_errlist[errno]); - return(-1); } -return(0); -} - -/****************************************************************************/ -/* Returns the total number of msgs in the sub-board and sets 'ptr' to the */ -/* date of the last message in the sub (0) if no messages. */ -/****************************************************************************/ -ulong getlastmsg(uint subnum, ulong *ptr, time_t *t) -{ - char str[256]; - int i; - smb_t smbfile; - -if(subnum>=total_subs) { - printf("\nERROR getlastmsg, subnum=%d\n",subnum); - logprintf("ERROR line %d getlastmsg %d",__LINE__,subnum); - exit(1); } -sprintf(smbfile.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smbfile.retry_time=smb_retry_time; -if((i=smb_open(&smbfile))!=0) { - printf("ERROR %d opening %s\n",i,smbfile.file); - logprintf("ERROR %d line %d opening %s",i,__LINE__,smbfile.file); - return(0); } - -if(!filelength(fileno(smbfile.shd_fp))) { /* Empty base */ - if(ptr) (*ptr)=0; - smb_close(&smbfile); - return(0); } -#if 0 // Not necessary with SMBLIB v2.0 -if((i=smb_locksmbhdr(&smbfile))!=0) { - smb_close(&smbfile); - printf("ERROR %d locking %s\n",i,smbfile.file); - logprintf("ERROR %d line %d locking %s smbhdr",i,__LINE__ - ,smbfile.file); - return(0); } -if((i=smb_getstatus(&smbfile))!=0) { - smb_unlocksmbhdr(&smbfile); - smb_close(&smbfile); - printf("ERROR %d reading %s\n",i,smbfile.file); - logprintf("ERROR %d line %d reading %s",i,__LINE__,smbfile.file); - return(0); } -smb_unlocksmbhdr(&smbfile); -#endif -smb_close(&smbfile); -if(ptr) (*ptr)=smbfile.status.last_msg; -return(smbfile.status.total_msgs); -} - - -ulong loadmsgs(post_t HUGE16 **post, ulong ptr) -{ - int i; - long l=0,total; - idxrec_t idx; - - -if((i=smb_locksmbhdr(&smb[cur_smb]))!=0) { - printf("ERROR %d locking %s\n",i,smb[cur_smb].file); - logprintf("ERROR %d line %d locking %s",i,__LINE__,smb[cur_smb].file); - return(0L); } - -/* total msgs in sub */ -total=filelength(fileno(smb[cur_smb].sid_fp))/sizeof(idxrec_t); - -if(!total) { /* empty */ - smb_unlocksmbhdr(&smb[cur_smb]); - return(0); } - -if(((*post)=(post_t HUGE16 *)LMALLOC(sizeof(post_t)*total)) /* alloc for max */ - ==NULL) { - smb_unlocksmbhdr(&smb[cur_smb]); - printf("ERROR allocating %lu bytes for %s\n",sizeof(post_t *)*total - ,smb[cur_smb].file); - logprintf("ERROR line %d allocating %lu bytes for %s",__LINE__ - ,sizeof(post_t *)*total,smb[cur_smb].file); - return(0); } - -fseek(smb[cur_smb].sid_fp,0L,SEEK_SET); -while(!feof(smb[cur_smb].sid_fp)) { - if(!fread(&idx,sizeof(idxrec_t),1,smb[cur_smb].sid_fp)) - break; - - if(idx.number<=ptr || idx.attr&MSG_DELETE) - continue; - - if(idx.attr&MSG_MODERATED && !(idx.attr&MSG_VALIDATED)) - break; - - (*post)[l].offset=idx.offset; - (*post)[l].number=idx.number; - (*post)[l].to=idx.to; - (*post)[l].from=idx.from; - (*post)[l].subj=idx.subj; - l++; } -smb_unlocksmbhdr(&smb[cur_smb]); -if(!l) - LFREE(*post); -return(l); -} - -void allocfail(uint size) -{ -printf("\7ERROR allocating %u bytes of memory.\n",size); -bail(1); -} - -void bail(int code) -{ -exit(code); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct find_t f; - uint i; - -i=_dos_findfirst(filespec,0,&f); -#ifdef __WATCOMC__ -_dos_findclose(&f); -#endif -if(!i) - return(f.size); -return(-1L); -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/* Called from upload */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct find_t f; - uint i; - -i=_dos_findfirst(filespec,0,&f); -#ifdef __WATCOMC__ -_dos_findclose(&f); -#endif -if(!i) - return(1); -return(0); -} - -typedef struct { - ulong alias, - real; - } username_t; - -/****************************************************************************/ -/* Note: Wrote another version of this function that read all userdata into */ -/****************************************************************************/ -/* Looks for a perfect match amoung all usernames (not deleted users) */ -/* Returns the number of the perfect matched username or 0 if no match */ -/* Called from functions waitforcall and newuser */ -/* memory then scanned it from memory... took longer - always. */ -/****************************************************************************/ -ulong matchname(char *inname) -{ - static ulong total_users; - static username_t *username; - ulong last_user; - int userdat,i; - char str[256],name[LEN_NAME+1],alias[LEN_ALIAS+1],c; - ulong l,crc; - -if(!total_users) { /* Load CRCs */ - fprintf(stderr,"\n%-25s","Loading user names..."); - sprintf(str,"%sUSER\\USER.DAT",data_dir); - if((userdat=nopen(str,O_RDONLY|O_DENYNONE))==-1) - return(0); - last_user=filelength(userdat)/U_LEN; - for(total_users=0;total_users<last_user;total_users++) { - printf("%5ld\b\b\b\b\b",total_users); - if((username=(username_t *)REALLOC(username - ,(total_users+1L)*sizeof(username_t)))==NULL) - break; - username[total_users].alias=0; - username[total_users].real=0; - i=0; - while(i<LOOP_NODEDAB - && lock(userdat,(long)((long)(total_users)*U_LEN)+U_ALIAS - ,LEN_ALIAS+LEN_NAME)==-1) - i++; - if(i>=LOOP_NODEDAB) { /* Couldn't lock USER.DAT record */ - logprintf("ERROR locking USER.DAT record #%ld",total_users); - continue; } - lseek(userdat,(long)((long)(total_users)*U_LEN)+U_ALIAS,SEEK_SET); - read(userdat,alias,LEN_ALIAS); - read(userdat,name,LEN_NAME); - lseek(userdat,(long)(((long)total_users)*U_LEN)+U_MISC,SEEK_SET); - read(userdat,tmp,8); - for(c=0;c<8;c++) - if(tmp[c]==ETX || tmp[c]==CR) break; - tmp[c]=0; - unlock(userdat,(long)((long)(total_users)*U_LEN)+U_ALIAS - ,LEN_ALIAS+LEN_NAME); - if(ahtoul(tmp)&DELETED) - continue; - for(c=0;c<LEN_ALIAS;c++) - if(alias[c]==ETX || alias[c]==CR) break; - alias[c]=0; - strupr(alias); - for(c=0;c<LEN_NAME;c++) - if(name[c]==ETX || name[c]==CR) break; - name[c]=0; - strupr(name); - username[total_users].alias=crc32(alias); - username[total_users].real=crc32(name); } - close(userdat); - fprintf(stderr," \b\b\b\b\b"); // Clear counter - fprintf(stderr, - "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" - "%25s" - "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" - ,""); } - -strcpy(str,inname); -strupr(str); -crc=crc32(str); -for(l=0;l<total_users;l++) - if((crc==username[l].alias || crc==username[l].real)) - return(l+1); -return(0); -} - -/****************************************************************************/ -/* Converts goofy FidoNet time format into Unix format */ -/****************************************************************************/ -time_t fmsgtime(char *str) -{ - char month[4]; - struct tm tm; - -memset(&tm,0,sizeof(tm)); -if(isdigit(str[1])) { /* Regular format: "01 Jan 86 02:34:56" */ - tm.tm_mday=atoi(str); - sprintf(month,"%3.3s",str+3); - if(!stricmp(month,"jan")) - tm.tm_mon=0; - else if(!stricmp(month,"feb")) - tm.tm_mon=1; - else if(!stricmp(month,"mar")) - tm.tm_mon=2; - else if(!stricmp(month,"apr")) - tm.tm_mon=3; - else if(!stricmp(month,"may")) - tm.tm_mon=4; - else if(!stricmp(month,"jun")) - tm.tm_mon=5; - else if(!stricmp(month,"jul")) - tm.tm_mon=6; - else if(!stricmp(month,"aug")) - tm.tm_mon=7; - else if(!stricmp(month,"sep")) - tm.tm_mon=8; - else if(!stricmp(month,"oct")) - tm.tm_mon=9; - else if(!stricmp(month,"nov")) - tm.tm_mon=10; - else - tm.tm_mon=11; - tm.tm_year=atoi(str+7); - if(tm.tm_year<Y2K_2DIGIT_WINDOW) - tm.tm_year+=100; - tm.tm_hour=atoi(str+11); - tm.tm_min=atoi(str+14); - tm.tm_sec=atoi(str+17); } - -else { /* SEAdog format: "Mon 1 Jan 86 02:34" */ - tm.tm_mday=atoi(str+4); - sprintf(month,"%3.3s",str+7); - if(!stricmp(month,"jan")) - tm.tm_mon=0; - else if(!stricmp(month,"feb")) - tm.tm_mon=1; - else if(!stricmp(month,"mar")) - tm.tm_mon=2; - else if(!stricmp(month,"apr")) - tm.tm_mon=3; - else if(!stricmp(month,"may")) - tm.tm_mon=4; - else if(!stricmp(month,"jun")) - tm.tm_mon=5; - else if(!stricmp(month,"jul")) - tm.tm_mon=6; - else if(!stricmp(month,"aug")) - tm.tm_mon=7; - else if(!stricmp(month,"sep")) - tm.tm_mon=8; - else if(!stricmp(month,"oct")) - tm.tm_mon=9; - else if(!stricmp(month,"nov")) - tm.tm_mon=10; - else - tm.tm_mon=11; - tm.tm_year=atoi(str+11); - if(tm.tm_year<Y2K_2DIGIT_WINDOW) - tm.tm_year+=100; - tm.tm_hour=atoi(str+14); - tm.tm_min=atoi(str+17); - tm.tm_sec=0; } -return(mktime(&tm)); -} - -#if 1 /* Old way */ - -char HUGE16 *getfmsg(FILE *stream, ulong *outlen) -{ - uchar HUGE16 *fbuf; - int ch; - ulong l,length,start; - -length=0L; -start=ftell(stream); /* Beginning of Message */ -while(1) { - ch=fgetc(stream); /* Look for Terminating NULL */ - if(!ch || ch==EOF) /* Found end of message */ - break; - length++; } /* Increment the Length */ - -if((fbuf=(char *)LMALLOC(length+1))==NULL) { - printf("Unable to allocate %lu bytes for message.\n",length+1); - logprintf("ERROR line %d allocating %lu bytes of memory",__LINE__,length+1); - exit(0); } - -fseek(stream,start,SEEK_SET); -for(l=0;l<length;l++) - fbuf[l]=fgetc(stream); -fbuf[length]=0; -if(!ch) - fgetc(stream); /* Read NULL */ -if(outlen) - *outlen=length; -return(fbuf); -} - -#else - -#define FBUF_BLOCK 4096 - -char *getfmsg(FILE *stream) -{ - uchar *fbuf,*p; - ulong l,n,length,start; - -length=0L; -start=ftell(stream); /* Beginning of Message */ -if((fbuf=LMALLOC(FBUF_BLOCK))==NULL) - return(fbuf); -while(!feof(stream)) { - l=fread(fbuf+length,1,FBUF_BLOCK,stream); - if(l<1) - break; - *(fbuf+length+l)=0; - n=strlen(fbuf+length); - if(n<l) { - length+=(n+1); - break; } - printf(","); - length+=l; - if(l<FBUF_BLOCK) - break; - printf("<"); - if((p=REALLOC(fbuf,length+FBUF_BLOCK+1))==NULL) { - LFREE(fbuf); - printf("!"); - fseek(stream,-l,SEEK_CUR); - return(NULL); } - fbuf=p; - printf(">"); - } -printf("."); - -fseek(stream,start+length,SEEK_SET); -return(fbuf); -} - -#endif - -#define MAX_TAILLEN 1024 - -/****************************************************************************/ -/* Coverts a FidoNet message into a Synchronet message */ -/* Returns 1 on success, 0 on failure, -1 on dupe. */ -/****************************************************************************/ -int fmsgtosmsg(uchar HUGE16 *fbuf, fmsghdr_t fmsghdr, uint user, uint subnum) -{ - uchar ch,HUGE16 *sbody,HUGE16 *stail,HUGE16 *outbuf - ,done,col,esc,cr,*p,str[128]; - int i,chunk,lzh=0,storage; - ushort xlat,net; - ulong l,m,length,lzhlen,bodylen,taillen,crc; - faddr_t faddr,origaddr,destaddr; - smbmsg_t msg; - smb_t *smbfile; - -memset(&msg,0,sizeof(smbmsg_t)); -memcpy(msg.hdr.id,"SHD\x1a",4); -msg.hdr.version=smb_ver(); -if(fmsghdr.attr&FIDO_PRIVATE) - msg.idx.attr|=MSG_PRIVATE; -msg.hdr.attr=msg.idx.attr; - -if(fmsghdr.attr&FIDO_FILE) - msg.hdr.auxattr|=MSG_FILEATTACH; - -msg.hdr.when_imported.time=time(NULL); -msg.hdr.when_imported.zone=sys_timezone; -msg.hdr.when_written.time=fmsgtime(fmsghdr.time); - -origaddr.zone=fmsghdr.origzone; /* only valid if NetMail */ -origaddr.net=fmsghdr.orignet; -origaddr.node=fmsghdr.orignode; -origaddr.point=fmsghdr.origpoint; - -destaddr.zone=fmsghdr.destzone; /* only valid if NetMail */ -destaddr.net=fmsghdr.destnet; -destaddr.node=fmsghdr.destnode; -destaddr.point=fmsghdr.destpoint; - -smb_hfield(&msg,SENDER,strlen(fmsghdr.from),fmsghdr.from); -strlwr(fmsghdr.from); -if(subnum==INVALID_SUB) - msg.idx.from=0; -else - msg.idx.from=crc16(fmsghdr.from); - -smb_hfield(&msg,RECIPIENT,strlen(fmsghdr.to),fmsghdr.to); -strlwr(fmsghdr.to); -msg.idx.to=crc16(fmsghdr.to); - -if(user) { - sprintf(str,"%u",user); - smb_hfield(&msg,RECIPIENTEXT,strlen(str),str); - msg.idx.to=user; } - -smb_hfield(&msg,SUBJECT,strlen(fmsghdr.subj),fmsghdr.subj); -remove_re(fmsghdr.subj); -strlwr(fmsghdr.subj); -msg.idx.subj=crc16(fmsghdr.subj); -if(fbuf==NULL) { - printf("ERROR allocating fbuf\n"); - logprintf("ERROR line %d allocating fbuf",__LINE__); - smb_freemsgmem(&msg); - return(0); } -length=strlen((char *)fbuf); -if((sbody=(char HUGE16 *)LMALLOC((length+1)*2))==NULL) { - printf("ERROR allocating %lu bytes for body",(length+1)*2L); - logprintf("ERROR line %d allocating %lu bytes for body",__LINE__ - ,(length+1)*2L); - smb_freemsgmem(&msg); - return(0); } -if((stail=(char HUGE16 *)LMALLOC(MAX_TAILLEN))==NULL) { - printf("ERROR allocating %lu bytes\n",MAX_TAILLEN); - logprintf("ERROR line %d allocating %lu bytes for tail",__LINE__ - ,MAX_TAILLEN); - LFREE(sbody); - smb_freemsgmem(&msg); - return(0); } - -for(col=l=esc=done=bodylen=taillen=0,cr=1;l<length;l++) { - - if(!l && !strncmp((char *)fbuf,"AREA:",5)) { - l+=5; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOAREA,m-l,fbuf+l); - while(l<length && fbuf[l]!=CR) l++; - continue; } - - ch=fbuf[l]; - if(ch==1 && cr) { /* kludge line */ - - if(!strncmp((char *)fbuf+l+1,"TOPT ",5)) - destaddr.point=atoi((char *)fbuf+l+6); - - else if(!strncmp((char *)fbuf+l+1,"FMPT ",5)) - origaddr.point=atoi((char *)fbuf+l+6); - - else if(!strncmp((char *)fbuf+l+1,"INTL ",5)) { - faddr=atofaddr((char *)fbuf+l+6); - destaddr.zone=faddr.zone; - destaddr.net=faddr.net; - destaddr.node=faddr.node; - l+=6; - while(l<length && fbuf[l]!=SP) l++; - faddr=atofaddr((char *)fbuf+l+1); - origaddr.zone=faddr.zone; - origaddr.net=faddr.net; - origaddr.node=faddr.node; } - - else if(!strncmp((char *)fbuf+l+1,"MSGID:",6)) { - l+=7; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOMSGID,m-l,fbuf+l); } - - else if(!strncmp((char *)fbuf+l+1,"REPLY:",6)) { - l+=7; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOREPLYID,m-l,fbuf+l); } - - else if(!strncmp((char *)fbuf+l+1,"FLAGS:",6)) { - l+=7; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOFLAGS,m-l,fbuf+l); } - - else if(!strncmp((char *)fbuf+l+1,"PATH:",5)) { - l+=6; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l && misc&STORE_PATH) - smb_hfield(&msg,FIDOPATH,m-l,fbuf+l); } - - else if(!strncmp((char *)fbuf+l+1,"PID:",4)) { - l+=5; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOPID,m-l,fbuf+l); } - - else { /* Unknown kludge line */ - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l && misc&STORE_KLUDGE) - smb_hfield(&msg,FIDOCTRL,m-l,fbuf+l); } - - while(l<length && fbuf[l]!=CR) l++; - continue; } - - if(ch!=LF && ch!=0x8d) { /* ignore LF and soft CRs */ - if(cr && (!strncmp((char *)fbuf+l,"--- ",4) - || !strncmp((char *)fbuf+l,"---\r",4))) - done=1; /* tear line and down go into tail */ - if(done && cr && !strncmp((char *)fbuf+l,"SEEN-BY:",8)) { - l+=8; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l && misc&STORE_SEENBY) - smb_hfield(&msg,FIDOSEENBY,m-l,fbuf+l); - while(l<length && fbuf[l]!=CR) l++; - continue; } - if(done) { - if(taillen<MAX_TAILLEN) - stail[taillen++]=ch; } - else - sbody[bodylen++]=ch; - col++; - if(ch==CR) { - cr=1; - col=0; - if(done) { - if(taillen<MAX_TAILLEN) - stail[taillen++]=LF; } - else - sbody[bodylen++]=LF; } - else { - cr=0; - if(col==1 && !strncmp((char *)fbuf+l," * Origin: ",11)) { - p=(char *)fbuf+l+11; - while(*p && *p!=CR) p++; /* Find CR */ - while(p && *p!='(') p--; /* rewind to '(' */ - if(p) - origaddr=atofaddr(p+1); /* get orig address */ - done=1; } - if(done) - continue; - - if(ch==ESC) esc=1; /* ANSI codes */ - if(ch==SP && col>40 && !esc) { /* word wrap */ - for(m=l+1;m<length;m++) /* find next space */ - if(fbuf[m]<=SP) - break; - if(m<length && m-l>80-col) { /* if it's beyond the eol */ - sbody[bodylen++]=CR; - sbody[bodylen++]=LF; - col=0; } } - } } } - -if(bodylen>=2 && sbody[bodylen-2]==CR && sbody[bodylen-1]==LF) - bodylen-=2; /* remove last CRLF if present */ - -if(smb[cur_smb].status.max_crcs) { - for(l=0,crc=0xffffffff;l<bodylen;l++) - crc=ucrc32(sbody[l],crc); - crc=~crc; - i=smb_addcrc(&smb[cur_smb],crc); - if(i) { - if(i==1) - printf("Duplicate "); - else - printf("smb_addcrc returned %d ",i); - smb_freemsgmem(&msg); - LFREE(sbody); - LFREE(stail); - if(i==1) - return(-1); - return(0); } } - -while(taillen && stail[taillen-1]<=SP) /* trim all garbage off the tail */ - taillen--; - -if(!origaddr.zone && subnum==INVALID_SUB) - net=NET_NONE; /* Message from SBBSecho */ -else - net=NET_FIDO; /* Record origin address */ - -if(net) { - smb_hfield(&msg,SENDERNETTYPE,sizeof(ushort),&net); - smb_hfield(&msg,SENDERNETADDR,sizeof(fidoaddr_t),&origaddr); } - -if(subnum==INVALID_SUB) { - smbfile=email; - if(net) { - smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(ushort),&net); - smb_hfield(&msg,RECIPIENTNETADDR,sizeof(fidoaddr_t),&destaddr); } } -else - smbfile=&smb[cur_smb]; - -if(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_LZH - && bodylen+2L+taillen+2L>=SDT_BLOCK_LEN && bodylen) { - if((outbuf=(char *)LMALLOC(bodylen*2L))==NULL) { - printf("ERROR allocating %lu bytes for lzh\n",bodylen*2); - logprintf("ERROR line %d allocating %lu bytes for lzh",__LINE__ - ,bodylen*2); - smb_freemsgmem(&msg); - LFREE(sbody); - LFREE(stail); - return(0); } - lzhlen=lzh_encode((uchar *)sbody,bodylen,(uchar *)outbuf); - if(lzhlen>1 && - smb_datblocks(lzhlen+4L+taillen+2L)< - smb_datblocks(bodylen+2L+taillen+2L)) { - bodylen=lzhlen; /* Compressable */ - l=bodylen+4; - LFREE(sbody); - lzh=1; - sbody=outbuf; } - else { /* Uncompressable */ - l=bodylen+2; - LFREE(outbuf); } } -else - l=bodylen+2; - -if(taillen) - l+=(taillen+2); - -if(l&0xfff00000) { - printf("ERROR checking msg len %lu\n",l); - logprintf("ERROR line %d checking msg len %lu",__LINE__,l); - smb_freemsgmem(&msg); - LFREE(sbody); - LFREE(stail); - return(0); } - -if(smbfile->status.attr&SMB_HYPERALLOC) { - if((i=smb_locksmbhdr(smbfile))!=0) { - printf("ERROR %d locking %s\n",i,smbfile->file); - logprintf("ERROR %d line %d locking %s",i,__LINE__,smbfile->file); - smb_freemsgmem(&msg); - LFREE(sbody); - LFREE(stail); - return(0); } - msg.hdr.offset=smb_hallocdat(smbfile); - storage=SMB_HYPERALLOC; } -else { - if((i=smb_open_da(smbfile))!=0) { - smb_freemsgmem(&msg); - printf("ERROR %d opening %s.SDA\n",i,smbfile->file); - logprintf("ERROR %d line %d opening %s.SDA",i,__LINE__ - ,smbfile->file); - LFREE(sbody); - LFREE(stail); - return(0); } - if(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_FAST) { - msg.hdr.offset=smb_fallocdat(smbfile,l,1); - storage=SMB_FASTALLOC; } - else { - msg.hdr.offset=smb_allocdat(smbfile,l,1); - storage=SMB_SELFPACK; } - smb_close_da(smbfile); } - -if(msg.hdr.offset && msg.hdr.offset<1L) { - if(smbfile->status.attr&SMB_HYPERALLOC) - smb_unlocksmbhdr(smbfile); - smb_freemsgmem(&msg); - LFREE(sbody); - LFREE(stail); - printf("ERROR %ld allocating records\n",msg.hdr.offset); - logprintf("ERROR line %d %ld allocating records",__LINE__,msg.hdr.offset); - return(0); } -fseek(smbfile->sdt_fp,msg.hdr.offset,SEEK_SET); -if(lzh) { - xlat=XLAT_LZH; - fwrite(&xlat,2,1,smbfile->sdt_fp); } -xlat=XLAT_NONE; -fwrite(&xlat,2,1,smbfile->sdt_fp); -chunk=30000; -for(l=0;l<bodylen;l+=chunk) { - if(l+chunk>bodylen) - chunk=bodylen-l; - fwrite(sbody+l,1,chunk,smbfile->sdt_fp); } -if(taillen) { - fwrite(&xlat,2,1,smbfile->sdt_fp); - fwrite(stail,1,taillen,smbfile->sdt_fp); } -LFREE(sbody); -LFREE(stail); -fflush(smbfile->sdt_fp); -if(smbfile->status.attr&SMB_HYPERALLOC) - smb_unlocksmbhdr(smbfile); - -if(lzh) - bodylen+=2; -bodylen+=2; -smb_dfield(&msg,TEXT_BODY,bodylen); -if(taillen) - smb_dfield(&msg,TEXT_TAIL,taillen+2); - -i=smb_addmsghdr(smbfile,&msg,storage); -smb_freemsgmem(&msg); -if(i) { - printf("ERROR smb_addmsghdr returned %d\n",i); - logprintf("ERROR line %d smb_addmsghdr returned %d" - ,__LINE__,i); - return(0); } -return(1); -} - -/***********************************************************************/ -/* Get zone and point from kludge lines from the stream if they exist */ -/***********************************************************************/ -void getzpt(FILE *stream, fmsghdr_t *hdr) -{ - char buf[0x1000]; - int i,len,cr=0; - long pos; - faddr_t faddr; - -pos=ftell(stream); -len=fread(buf,1,0x1000,stream); -for(i=0;i<len;i++) { - if((!i || cr) && buf[i]==1) { /* kludge */ - if(!strncmp(buf+i+1,"TOPT ",5)) - hdr->destpoint=atoi(buf+i+6); - else if(!strncmp(buf+i+1,"FMPT ",5)) - hdr->origpoint=atoi(buf+i+6); - else if(!strncmp(buf+i+1,"INTL ",5)) { - faddr=atofaddr(buf+i+6); - hdr->destzone=faddr.zone; - hdr->destnet=faddr.net; - hdr->destnode=faddr.node; - i+=6; - while(buf[i] && buf[i]!=SP) i++; - faddr=atofaddr(buf+i+1); - hdr->origzone=faddr.zone; - hdr->orignet=faddr.net; - hdr->orignode=faddr.node; } - while(i<len && buf[i]!=CR) i++; - cr=1; - continue; } - if(buf[i]==CR) - cr=1; - else - cr=0; } -fseek(stream,pos,SEEK_SET); -} -/****************************************************************************** - This function will seek to the next NULL found in stream -******************************************************************************/ -void seektonull(FILE *stream) -{ - char ch; - -while(!feof(stream)) { - if(!fread(&ch,1,1,stream)) - break; - if(!ch) - break; } - -} - -/****************************************************************************** - This function returns a packet name - used for outgoing packets -******************************************************************************/ -char *pktname(void) -{ - static char str[128]; - int i; - time_t now; - struct tm *tm; - -now=time(NULL); -for(i=0;i<MAX_TOTAL_PKTS*2;i++) { - now+=i; - tm=gmtime(&now); - sprintf(str,"%s%02u%02u%02u%02u.PK_",cfg.outbound,tm->tm_mday,tm->tm_hour - ,tm->tm_min,tm->tm_sec); - if(!fexist(str)) /* Add 1 second if name exists */ - break; } -return(str); -} -/****************************************************************************** - This function puts a message into a Fido packet, writing both the header - information and the message body -******************************************************************************/ -void putfmsg(FILE *stream,uchar HUGE16 *fbuf,fmsghdr_t fmsghdr,areasbbs_t area - ,addrlist_t seenbys,addrlist_t paths) -{ - char str[256],seenby[256],*p; - short i,j,lastlen=0,net_exists=0; - faddr_t addr,sysaddr; - -addr=getsysfaddr(fmsghdr.destzone); - -i=0x0002; -fwrite(&i,2,1,stream); -fwrite(&addr.node,2,1,stream); -fwrite(&fmsghdr.destnode,2,1,stream); -fwrite(&addr.net,2,1,stream); -fwrite(&fmsghdr.destnet,2,1,stream); -fwrite(&fmsghdr.attr,2,1,stream); -fwrite(&fmsghdr.cost,2,1,stream); -fwrite(fmsghdr.time,strlen(fmsghdr.time)+1,1,stream); -fwrite(fmsghdr.to,strlen(fmsghdr.to)+1,1,stream); -fwrite(fmsghdr.from,strlen(fmsghdr.from)+1,1,stream); -fwrite(fmsghdr.subj,strlen(fmsghdr.subj)+1,1,stream); -if(area.name) - if(strncmp((char *)fbuf,"AREA:",5)) /* No AREA: Line */ - fprintf(stream,"AREA:%s\r",area.name); /* So add one */ -fwrite(fbuf,strlen((char *)fbuf),1,stream); -lastlen=9; -if(fbuf[strlen((char *)fbuf)-1]!=CR) - fputc(CR,stream); - -if(area.name && addr.zone!=fmsghdr.destzone) /* Zone Gate */ - fprintf(stream,"SEEN-BY: %d/%d\r",fmsghdr.destnet,fmsghdr.destnode); - -if(area.name && addr.zone==fmsghdr.destzone) { /* Not NetMail */ - fprintf(stream,"SEEN-BY:"); - for(i=0;i<seenbys.addrs;i++) { /* Put back original SEEN-BYs */ - strcpy(seenby," "); - if(seenbys.addr[i].zone!=addr.zone) - continue; - if(seenbys.addr[i].net!=addr.net || !net_exists) { - net_exists=1; - addr.net=seenbys.addr[i].net; - sprintf(str,"%d/",addr.net); - strcat(seenby,str); } - sprintf(str,"%d",seenbys.addr[i].node); - strcat(seenby,str); - if(lastlen+strlen(seenby)<80) { - fwrite(seenby,strlen(seenby),1,stream); - lastlen+=strlen(seenby); } - else { - --i; - lastlen=9; /* +strlen(seenby); */ - net_exists=0; - fprintf(stream,"\rSEEN-BY:"); } } - - for(i=0;i<area.uplinks;i++) { /* Add all uplinks to SEEN-BYs */ - strcpy(seenby," "); - if(area.uplink[i].zone!=addr.zone || area.uplink[i].point) - continue; - for(j=0;j<seenbys.addrs;j++) - if(!memcmp(&area.uplink[i],&seenbys.addr[j],sizeof(faddr_t))) - break; - if(j==seenbys.addrs) { - if(area.uplink[i].net!=addr.net || !net_exists) { - net_exists=1; - addr.net=area.uplink[i].net; - sprintf(str,"%d/",addr.net); - strcat(seenby,str); } - sprintf(str,"%d",area.uplink[i].node); - strcat(seenby,str); - if(lastlen+strlen(seenby)<80) { - fwrite(seenby,strlen(seenby),1,stream); - lastlen+=strlen(seenby); } - else { - --i; - lastlen=9; /* +strlen(seenby); */ - net_exists=0; - fprintf(stream,"\rSEEN-BY:"); } } } - - for(i=0;i<total_faddrs;i++) { /* Add AKAs to SEEN-BYs */ - strcpy(seenby," "); - if(faddr[i].zone!=addr.zone || faddr[i].point) - continue; - for(j=0;j<seenbys.addrs;j++) - if(!memcmp(&faddr[i],&seenbys.addr[j],sizeof(faddr_t))) - break; - if(j==seenbys.addrs) { - if(faddr[i].net!=addr.net || !net_exists) { - net_exists=1; - addr.net=faddr[i].net; - sprintf(str,"%d/",addr.net); - strcat(seenby,str); } - sprintf(str,"%d",faddr[i].node); - strcat(seenby,str); - if(lastlen+strlen(seenby)<80) { - fwrite(seenby,strlen(seenby),1,stream); - lastlen+=strlen(seenby); } - else { - --i; - lastlen=9; /* +strlen(seenby); */ - net_exists=0; - fprintf(stream,"\rSEEN-BY:"); } } } - - lastlen=7; - net_exists=0; - fprintf(stream,"\r\1PATH:"); - addr=getsysfaddr(fmsghdr.destzone); - for(i=0;i<paths.addrs;i++) { /* Put back the original PATH */ - strcpy(seenby," "); - if(paths.addr[i].zone!=addr.zone || paths.addr[i].point) - continue; - if(paths.addr[i].net!=addr.net || !net_exists) { - net_exists=1; - addr.net=paths.addr[i].net; - sprintf(str,"%d/",addr.net); - strcat(seenby,str); } - sprintf(str,"%d",paths.addr[i].node); - strcat(seenby,str); - if(lastlen+strlen(seenby)<80) { - fwrite(seenby,strlen(seenby),1,stream); - lastlen+=strlen(seenby); } - else { - --i; - lastlen=7; /* +strlen(seenby); */ - net_exists=0; - fprintf(stream,"\r\1PATH:"); } } - - strcpy(seenby," "); /* Add first address with same zone to PATH */ - sysaddr=getsysfaddr(fmsghdr.destzone); - if(!sysaddr.point) { - if(sysaddr.net!=addr.net || !net_exists) { - net_exists=1; - addr.net=sysaddr.net; - sprintf(str,"%d/",addr.net); - strcat(seenby,str); } - sprintf(str,"%d",sysaddr.node); - strcat(seenby,str); - if(lastlen+strlen(seenby)<80) - fwrite(seenby,strlen(seenby),1,stream); - else { - fprintf(stream,"\r\1PATH:"); - fwrite(seenby,strlen(seenby),1,stream); } } - - fputc(CR,stream); } - -fputc(0,stream); -} - -/****************************************************************************** - This function creates a binary list of the message seen-bys and path from - inbuf. -******************************************************************************/ -void gen_psb(addrlist_t *seenbys,addrlist_t *paths,char HUGE16 *inbuf - ,ushort zone) -{ - char str[128],seenby[256],*p,*p1,*p2,HUGE16 *fbuf; - int i,j,len; - faddr_t addr; - -if(!inbuf) - return; -fbuf=strstr((char *)inbuf,"\r * Origin: "); -if(!fbuf) -fbuf=strstr((char *)inbuf,"\n * Origin: "); -if(!fbuf) - fbuf=inbuf; -if(seenbys->addr) { - FREE(seenbys->addr); - seenbys->addr=0; - seenbys->addrs=0; } -addr.zone=addr.net=addr.node=addr.point=seenbys->addrs=0; -p=strstr((char *)fbuf,"\rSEEN-BY:"); -if(!p) p=strstr((char *)fbuf,"\nSEEN-BY:"); -if(p) { - while(1) { - sprintf(str,"%-.100s",p+10); - if((p1=strchr(str,CR))!=NULL) - *p1=0; - p1=str; - i=j=0; - len=strlen(str); - while(i<len) { - j=i; - while(i<len && *(p1+i)!=SP) - ++i; - if(j>len) - break; - sprintf(seenby,"%-.*s",(i-j),p1+j); - if((p2=strchr(seenby,':'))!=NULL) { - addr.zone=atoi(seenby); - addr.net=atoi(p2+1); } - else if((p2=strchr(seenby,'/'))!=NULL) - addr.net=atoi(seenby); - if((p2=strchr(seenby,'/'))!=NULL) - addr.node=atoi(p2+1); - else - addr.node=atoi(seenby); - if((p2=strchr(seenby,'.'))!=NULL) - addr.point=atoi(p2+1); - if(!addr.zone) - addr.zone=zone; /* Was 1 */ - if((seenbys->addr=(faddr_t *)REALLOC(seenbys->addr - ,sizeof(faddr_t)*(seenbys->addrs+1)))==NULL) { - printf("ERROR allocating memory for seenbys\n"); - logprintf("ERROR line %d allocating memory for message " - "seenbys.",__LINE__); - exit(1); } - memcpy(&seenbys->addr[seenbys->addrs],&addr,sizeof(faddr_t)); - seenbys->addrs++; - ++i; } - p1=strstr(p+10,"\rSEEN-BY:"); - if(!p1) - p1=strstr(p+10,"\nSEEN-BY:"); - if(!p1) - break; - p=p1; } } -else { - if((seenbys->addr=(faddr_t *)REALLOC(seenbys->addr - ,sizeof(faddr_t)))==NULL) { - printf("ERROR allocating memory for seenbys\n"); - logprintf("ERROR line %d allocating memory for message seenbys." - ,__LINE__); - exit(1); } - memset(&seenbys->addr[0],0,sizeof(faddr_t)); } - -if(paths->addr) { - FREE(paths->addr); - paths->addr=0; - paths->addrs=0; } -addr.zone=addr.net=addr.node=addr.point=paths->addrs=0; -if((p=strstr((char *)fbuf,"\1PATH:"))!=NULL) { - while(1) { - sprintf(str,"%-.100s",p+7); - if((p1=strchr(str,CR))!=NULL) - *p1=0; - p1=str; - i=j=0; - len=strlen(str); - while(i<len) { - j=i; - while(i<len && *(p1+i)!=SP) - ++i; - if(j>len) - break; - sprintf(seenby,"%-.*s",(i-j),p1+j); - if((p2=strchr(seenby,':'))!=NULL) { - addr.zone=atoi(seenby); - addr.net=atoi(p2+1); } - else if((p2=strchr(seenby,'/'))!=NULL) - addr.net=atoi(seenby); - if((p2=strchr(seenby,'/'))!=NULL) - addr.node=atoi(p2+1); - else - addr.node=atoi(seenby); - if((p2=strchr(seenby,'.'))!=NULL) - addr.point=atoi(p2+1); - if(!addr.zone) - addr.zone=zone; /* Was 1 */ - if((paths->addr=(faddr_t *)REALLOC(paths->addr - ,sizeof(faddr_t)*(paths->addrs+1)))==NULL) { - printf("ERROR allocating memory for paths\n"); - logprintf("ERROR line %d allocating memory for message " - "paths.",__LINE__); - exit(1); } - memcpy(&paths->addr[paths->addrs],&addr,sizeof(faddr_t)); - paths->addrs++; - ++i; } - if((p1=strstr(p+7,"\1PATH:"))==NULL) - break; - p=p1; } } -else { - if((paths->addr=(faddr_t *)REALLOC(paths->addr - ,sizeof(faddr_t)))==NULL) { - printf("ERROR allocating memory for paths\n"); - logprintf("ERROR line %d allocating memory for message paths." - ,__LINE__); - exit(1); } - memset(&paths->addr[0],0,sizeof(faddr_t)); } -} - -/****************************************************************************** - This function takes the addrs passed to it and compares them to the address - passed in inaddr. 1 is returned if inaddr matches any of the addrs - otherwise a 0 is returned. -******************************************************************************/ -char check_psb(addrlist_t addrlist,faddr_t inaddr) -{ - int i; - -for(i=0;i<addrlist.addrs;i++) { - if(!memcmp(&addrlist.addr[i],&inaddr,sizeof(faddr_t))) - return(1); } -return(0); -} -/****************************************************************************** - This function strips the message seen-bys and path from inbuf. -******************************************************************************/ -void strip_psb(char HUGE16 *inbuf) -{ - char *p,HUGE16 *fbuf; - -if(!inbuf) - return; -fbuf=strstr((char *)inbuf,"\r * Origin: "); -if(!fbuf) - fbuf=inbuf; -if((p=strstr((char *)fbuf,"\rSEEN-BY:"))!=NULL) - *(p)=0; -if((p=strstr((char *)fbuf,"\r\1PATH:"))!=NULL) - *(p)=0; -} -void attach_bundles() -{ - FILE *fidomsg; - char str[1025],path[512],packet[128]; - int fmsg; - ulong l; - faddr_t pkt_faddr; - pkthdr_t pkthdr; - struct find_t ff; - -sprintf(path,"%s*.PK_",cfg.outbound); -for(l=_dos_findfirst(path,0,&ff);!l && !kbhit();l=_dos_findnext(&ff)) { - sprintf(packet,"%s%s",cfg.outbound,ff.name); - printf("%21s: %s ","Outbound Packet",packet); - if((fmsg=sopen(packet,O_RDWR,SH_DENYRW))==-1) { - printf("ERROR opening.\n"); - logprintf("ERROR line %d opening %s",__LINE__,packet); - continue; } - if((fidomsg=fdopen(fmsg,"r+b"))==NULL) { - close(fmsg); - printf("\7ERROR fdopening.\n"); - logprintf("ERROR line %d fdopening %s",__LINE__,packet); - continue; } - if(filelength(fmsg)<sizeof(pkthdr_t)) { - printf("ERROR invalid length of %u bytes for %s\n",filelength(fmsg) - ,packet); - logprintf("ERROR line %d invalid length of %u bytes for %s" - ,__LINE__,filelength(fmsg),packet); - fclose(fidomsg); - if(delfile(packet)) - logprintf("ERROR line %d removing %s %s",__LINE__,packet - ,sys_errlist[errno]); - continue; } - if(fread(&pkthdr,sizeof(pkthdr_t),1,fidomsg)!=1) { - fclose(fidomsg); - printf("\7ERROR reading %u bytes from %s\n",sizeof(pkthdr_t),packet); - logprintf("ERROR line %d reading %u bytes from %s",__LINE__ - ,sizeof(pkthdr_t),packet); - continue; } - fseek(fidomsg,-2L,SEEK_END); - fread(str,2,1,fidomsg); - fclose(fidomsg); - if(!str[0] && !str[1]) { /* Check for two nulls at end of packet */ - pkt_faddr.zone=pkthdr.destzone; - pkt_faddr.net=pkthdr.destnet; - pkt_faddr.node=pkthdr.destnode; - pkt_faddr.point=0; /* No point info in the 2.0 hdr! */ - memcpy(&two_plus,&pkthdr.empty,20); - if(two_plus.cword==_rotr(two_plus.cwcopy,8) /* 2+ Packet Header */ - && two_plus.cword && two_plus.cword&1) - pkt_faddr.point=two_plus.destpoint; - else if(pkthdr.baud==2) { /* Type 2.2 Packet Header */ - memcpy(&two_two,&pkthdr.empty,20); - pkt_faddr.point=pkthdr.month; } - printf("Sending to %s\n",faddrtoa(pkt_faddr)); - pack_bundle(packet,pkt_faddr); } - else { - fclose(fidomsg); - printf("Possibly still in use\n"); } } -#ifdef __WATCOMC__ -_dos_findclose(&ff); -#endif -} -/****************************************************************************** - This is where we put outgoing messages into packets. Set the 'cleanup' - parameter to 1 to force all the remaining packets closed and stuff them into - a bundle. -******************************************************************************/ -void pkt_to_pkt(uchar HUGE16 *fbuf,areasbbs_t area,faddr_t faddr - ,fmsghdr_t fmsghdr,addrlist_t seenbys,addrlist_t paths,char cleanup) -{ - int i,j,k,file; - short node; - time_t now; - struct tm *tm; - pkthdr_t pkthdr; - static ushort openpkts,totalpkts; - static outpkt_t outpkt[MAX_TOTAL_PKTS]; - faddr_t sysaddr; - two_two_t two; - two_plus_t two_p; - - -if(cleanup==1) { - for(i=0;i<totalpkts;i++) { - if(i>=MAX_TOTAL_PKTS) { - printf("MAX_TOTAL_PKTS (%d) REACHED!\n",MAX_TOTAL_PKTS); - logprintf("MAX_TOTAL_PKTS (%d) REACHED!\n",MAX_TOTAL_PKTS); - break; - } - if(outpkt[i].curopen) { - fputc(0,outpkt[i].stream); - fputc(0,outpkt[i].stream); - fclose(outpkt[i].stream); } - else { - if((outpkt[i].stream=fnopen(&file,outpkt[i].filename - ,O_WRONLY|O_APPEND))==NULL) { - printf("ERROR opening %s for write.\n",outpkt[i].filename); - logprintf("ERROR line %d opening %s %s",__LINE__ - ,outpkt[i].filename,sys_errlist[errno]); - continue; } - fputc(0,outpkt[i].stream); - fputc(0,outpkt[i].stream); - fclose(outpkt[i].stream); } -// pack_bundle(outpkt[i].filename,outpkt[i].uplink); - memset(&outpkt[i],0,sizeof(outpkt_t)); } - totalpkts=openpkts=0; - attach_bundles(); - attachment(0,faddr,1); - return; } - -if(fbuf==NULL) { - printf("ERROR allocating fbuf\n"); - logprintf("ERROR line %d allocating fbuf",__LINE__); - return; } -/* We want to see if there's already a packet open for this area. */ -/* If not, we'll open a new one. Once we have a packet, we'll add */ -/* messages to it as they come in. If necessary, we'll close an */ -/* open packet to open a new one. */ - -for(j=0;j<area.uplinks;j++) { - if((cleanup==2 && memcmp(&faddr,&area.uplink[j],sizeof(faddr_t))) || - (!cleanup && (!memcmp(&faddr,&area.uplink[j],sizeof(faddr_t)) || - check_psb(seenbys,area.uplink[j])))) - continue; - node=matchnode(area.uplink[j],0); - if(node<cfg.nodecfgs && cfg.nodecfg[node].attr&ATTR_PASSIVE) - continue; - sysaddr=getsysfaddr(area.uplink[j].zone); - printf("%s ",faddrtoa(area.uplink[j])); - for(i=0;i<totalpkts;i++) { - if(i>=MAX_TOTAL_PKTS) { - printf("MAX_TOTAL_PKTS (%d) REACHED!\n",MAX_TOTAL_PKTS); - logprintf("MAX_TOTAL_PKTS (%d) REACHED!\n",MAX_TOTAL_PKTS); - break; - } - if(!memcmp(&area.uplink[j],&outpkt[i].uplink,sizeof(faddr_t))) { - if(!outpkt[i].curopen) { - if(openpkts==DFLT_OPEN_PKTS) - for(k=0;k<totalpkts;k++) { - if(outpkt[k].curopen) { - fclose(outpkt[k].stream); - outpkt[k].curopen=0; - break; } } - if((outpkt[i].stream=fnopen(&file,outpkt[i].filename - ,O_WRONLY|O_APPEND))==NULL) { - printf("Unable to open %s for write.\n" - ,outpkt[i].filename); - logprintf("ERROR line %d opening %s %s",__LINE__ - ,outpkt[i].filename,sys_errlist[errno]); - exit(1); } - outpkt[i].curopen=1; } - if((strlen((char *)fbuf)+1+ftell(outpkt[i].stream)) - <=cfg.maxpktsize) { - fmsghdr.destnode=area.uplink[j].node; - fmsghdr.destnet=area.uplink[j].net; - fmsghdr.destzone=area.uplink[j].zone; - putfmsg(outpkt[i].stream,fbuf,fmsghdr,area,seenbys,paths); } - else { - fputc(0,outpkt[i].stream); - fputc(0,outpkt[i].stream); - fclose(outpkt[i].stream); -// pack_bundle(outpkt[i].filename,outpkt[i].uplink); - outpkt[i].stream=outpkt[totalpkts-1].stream; - memcpy(&outpkt[i],&outpkt[totalpkts-1],sizeof(outpkt_t)); - memset(&outpkt[totalpkts-1],0,sizeof(outpkt_t)); - --totalpkts; - --openpkts; - i=totalpkts; } - break; } } - if(i==totalpkts) { - if(openpkts==DFLT_OPEN_PKTS) - for(k=0;k<totalpkts;k++) { - if(outpkt[k].curopen) { - fclose(outpkt[k].stream); - outpkt[k].curopen=0; - --openpkts; - break; } } - strcpy(outpkt[i].filename,pktname()); - now=time(NULL); - tm=gmtime(&now); - if((outpkt[i].stream=fnopen(&file,outpkt[i].filename - ,O_WRONLY|O_CREAT))==NULL) { - printf("Unable to open %s for write.\n" - ,outpkt[i].filename); - logprintf("ERROR line %d opening %s %s" - ,__LINE__,outpkt[i].filename,sys_errlist[errno]); - exit(1); } - pkthdr.orignode=sysaddr.node; - fmsghdr.destnode=pkthdr.destnode=area.uplink[j].node; - if(node<cfg.nodecfgs && cfg.nodecfg[node].pkt_type==PKT_TWO_TWO) { - pkthdr.year=sysaddr.point; - pkthdr.month=area.uplink[j].point; - pkthdr.day=0; - pkthdr.hour=0; - pkthdr.min=0; - pkthdr.sec=0; - pkthdr.baud=0x0002; } - else { - pkthdr.year=tm->tm_year+1900; - pkthdr.month=tm->tm_mon; - pkthdr.day=tm->tm_mday; - pkthdr.hour=tm->tm_hour; - pkthdr.min=tm->tm_min; - pkthdr.sec=tm->tm_sec; - pkthdr.baud=0; - } - pkthdr.pkttype=0x0002; - pkthdr.orignet=sysaddr.net; - fmsghdr.destnet=pkthdr.destnet=area.uplink[j].net; - pkthdr.prodcode=0; - pkthdr.sernum=0; - if(node<cfg.nodecfgs) - memcpy(pkthdr.password,cfg.nodecfg[node].pktpwd,8); - else - memset(pkthdr.password,0,8); - pkthdr.origzone=sysaddr.zone; - fmsghdr.destzone=pkthdr.destzone=area.uplink[j].zone; - memset(pkthdr.empty,0,sizeof(two_two_t)); - - if(node<cfg.nodecfgs) { - if(cfg.nodecfg[node].pkt_type==PKT_TWO_TWO) { - memset(&two,0,20); - strcpy(two.origdomn,"fidonet"); - strcpy(two.destdomn,"fidonet"); - memcpy(&pkthdr.empty,&two,20); } - else if(cfg.nodecfg[node].pkt_type==PKT_TWO_PLUS) { - memset(&two_p,0,20); - if(sysaddr.point) { - pkthdr.orignet=-1; - two_p.auxnet=sysaddr.net; } - two_p.cwcopy=0x0100; - two_p.prodcode=pkthdr.prodcode; - two_p.revision=pkthdr.sernum; - two_p.cword=0x0001; - two_p.origzone=pkthdr.origzone; - two_p.destzone=pkthdr.destzone; - two_p.origpoint=sysaddr.point; - two_p.destpoint=area.uplink[j].point; - memcpy(&pkthdr.empty,&two_p,sizeof(two_plus_t)); - } - } - - fwrite(&pkthdr,sizeof(pkthdr_t),1,outpkt[totalpkts].stream); - putfmsg(outpkt[totalpkts].stream,fbuf,fmsghdr,area,seenbys,paths); - outpkt[totalpkts].curopen=1; - memcpy(&outpkt[totalpkts].uplink,&area.uplink[j] - ,sizeof(faddr_t)); - ++openpkts; - ++totalpkts; - if(totalpkts>=MAX_TOTAL_PKTS) { - fclose(outpkt[totalpkts-1].stream); -// pack_bundle(outpkt[totalpkts-1].filename -// ,outpkt[totalpkts-1].uplink); - --totalpkts; - --openpkts; } - } } -} - -/**************************************/ -/* Send netmail, returns 0 on success */ -/**************************************/ -int import_netmail(char *path,fmsghdr_t hdr, FILE *fidomsg) -{ - uchar info[512],str[256],tmp[256],subj[256] - ,HUGE16 *fmsgbuf=NULL,*p,*tp,*sp; - int i,match,usernumber; - ulong l; - faddr_t addr; - -hdr.destzone=hdr.origzone=sys_faddr.zone; -hdr.destpoint=hdr.origpoint=0; -getzpt(fidomsg,&hdr); /* use kludge if found */ -for(match=0;match<total_faddrs;match++) - if((hdr.destzone==faddr[match].zone || misc&FUZZY_ZONE) - && hdr.destnet==faddr[match].net - && hdr.destnode==faddr[match].node - && hdr.destpoint==faddr[match].point) - break; -if(match<total_faddrs && misc&FUZZY_ZONE) - hdr.origzone=hdr.destzone=faddr[match].zone; -if(hdr.origpoint) - sprintf(tmp,".%u",hdr.origpoint); -else - tmp[0]=0; -if(hdr.destpoint) - sprintf(str,".%u",hdr.destpoint); -else - str[0]=0; -sprintf(info,"%s%s%s (%u:%u/%u%s) To: %s (%u:%u/%u%s)" - ,path,path[0] ? " ":"" - ,hdr.from,hdr.origzone,hdr.orignet,hdr.orignode,tmp - ,hdr.to,hdr.destzone,hdr.destnet,hdr.destnode,str); -printf("%s ",info); - -if(!(misc&IMPORT_NETMAIL)) { - if(!path[0]) { - fmsgbuf=getfmsg(fidomsg,&l); - if(!fmsgbuf) { - printf("ERROR Netmail allocation"); - logprintf("ERROR line %d netmail allocation",__LINE__); - return(2); } - - if(!l && misc&KILL_EMPTY_MAIL) - printf("Empty NetMail - "); - else { - for(i=1;i;i++) { - sprintf(str,"%s%u.MSG",netmail_dir,i); - if(!fexist(str)) - break; } - if(!i) { - printf("Too many netmail messages"); - logprintf("Too many netmail messages"); - return(2); } - if((i=nopen(str,O_WRONLY|O_CREAT))==-1) { - printf("ERROR opening %s",str); - logprintf("ERROR opening %s",str); - return(2); } - write(i,&hdr,sizeof(hdr)); - write(i,fmsgbuf,strlen((char *)fmsgbuf)+1); /* Write the NULL too */ - close(i); } - FREE(fmsgbuf); } - printf("Ignored"); - if(cfg.log&LOG_IGNORED) - logprintf("%s Ignored",info); - return(-1); } - -if(hdr.attr&FIDO_ORPHAN) { - printf("Orphaned"); - return(1); } -if(!(misc&IGNORE_ADDRESS) && match==total_faddrs && path[0]) { - printf("Skipped"); - return(2); } -if(!(misc&IGNORE_RECV) && hdr.attr&FIDO_RECV) { - printf("Already received"); - return(3); } -if(hdr.attr&FIDO_LOCAL && !(misc&LOCAL_NETMAIL)) { - printf("Created locally"); - return(4); } - -if(email->shd_fp==NULL) { - sprintf(email->file,"%sMAIL",data_dir); - email->retry_time=smb_retry_time; - if((i=smb_open(email))!=0) { - printf("ERROR %d opening %s\n",i,email->file); - logprintf("ERROR %d line %d opening %s",i,__LINE__,email->file); - exit(1); } } - -if(!filelength(fileno(email->shd_fp))) { - email->status.max_crcs=mail_maxcrcs; - email->status.max_msgs=MAX_SYSMAIL; - email->status.max_age=mail_maxage; - email->status.attr=SMB_EMAIL; - if((i=smb_create(email))!=0) { - sprintf(str,"ERROR %d creating %s",i,email->file); - printf("%s\n",str); - logprintf(str); - exit(1); } } - -if(!stricmp(hdr.to,"AREAFIX") || !stricmp(hdr.to,"SBBSECHO")) { - fmsgbuf=getfmsg(fidomsg,NULL); - if(path[0]) { - if(misc&DELETE_NETMAIL) { - fclose(fidomsg); - if(delfile(path)) - logprintf("ERROR line %d removing %s %s",__LINE__,path - ,sys_errlist[errno]); } - else { - hdr.attr|=FIDO_RECV; - fseek(fidomsg,0L,SEEK_SET); - fwrite(&hdr,sizeof(fmsghdr_t),1,fidomsg); - fclose(fidomsg); } } /* Gotta close it here for areafix stuff */ - addr.zone=hdr.origzone; - addr.net=hdr.orignet; - addr.node=hdr.orignode; - addr.point=hdr.origpoint; - strcpy(hdr.to,sys_op); - strcpy(hdr.from,"SBBSecho"); - strcpy(str,hdr.subj); - strcpy(hdr.subj,"Areafix Request"); - hdr.origzone=hdr.orignet=hdr.orignode=hdr.origpoint=0; - p=process_areafix(addr,fmsgbuf,str); -#if 0 // Not necessary with SMBLIB v2.0 - if((i=smb_locksmbhdr(email))!=0) { - printf("ERROR %d locking %s smbhdr",i,email->file); - logprintf("ERROR %d line %d locking %s smbhdr",i,__LINE__,email->file); - exit(1); } - if((i=smb_getstatus(email))!=0) { - printf("ERROR %d reading %s status header",i,email->file); - logprintf("ERROR %d line %d reading %s status header",i,__LINE__ - ,email->file); - exit(1); } -#endif - if(p && cfg.notify) - if(fmsgtosmsg(p,hdr,cfg.notify,INVALID_SUB)==1) { - sprintf(str,"\7\1n\1hSBBSecho \1n\1msent you mail\r\n"); - putsmsg(cfg.notify,str); } -// smb_unlocksmbhdr(email); - if(fmsgbuf) - FREE(fmsgbuf); - if(cfg.log&LOG_AREAFIX) - logprintf(info); - return(-2); } - -usernumber=atoi(hdr.to); -if(!stricmp(hdr.to,"SYSOP")) /* NetMail to "sysop" goes to #1 */ - usernumber=1; -if(!usernumber && match<total_faddrs) - usernumber=matchname(hdr.to); -if(!usernumber) { - if(misc&UNKNOWN_NETMAIL && match<total_faddrs) /* receive unknown user */ - usernumber=1; /* mail to 1 */ - else { - if(match<total_faddrs) { - printf("Unknown user "); - if(cfg.log&LOG_UNKNOWN) - logprintf("%s Unknown user",info); } -/*** - hdr.attr|=FIDO_ORPHAN; - fseek(fidomsg,0L,SEEK_SET); - fwrite(&hdr,sizeof(fmsghdr_t),1,fidomsg); -***/ - if(!path[0]) { - fmsgbuf=getfmsg(fidomsg,&l); - if(!fmsgbuf) { - printf("ERROR Netmail allocation"); - logprintf("ERROR line %d netmail allocation",__LINE__); - return(2); } - if(!l && misc&KILL_EMPTY_MAIL) { - printf("Empty NetMail - Ignored"); - if(cfg.log&LOG_IGNORED) - logprintf("%s Empty - Ignored",info); } - else { - for(i=1;i;i++) { - sprintf(str,"%s%u.MSG",netmail_dir,i); - if(!fexist(str)) - break; } - if(!i) { - printf("Too many netmail messages"); - logprintf("Too many netmail messages"); - return(2); } - if((i=nopen(str,O_WRONLY|O_CREAT))==-1) { - printf("ERROR opening %s",str); - logprintf("ERROR opening %s",str); - return(2); } - write(i,&hdr,sizeof(hdr)); - write(i,fmsgbuf,strlen((char *)fmsgbuf)+1); /* Write the NULL too */ - close(i); } - FREE(fmsgbuf); } - return(2); } } - -/*********************/ -/* Importing NetMail */ -/*********************/ - -fmsgbuf=getfmsg(fidomsg,&l); - -#if 0 // Unnecessary with SMBLIB v2.0 -if((i=smb_locksmbhdr(email))!=0) { - printf("ERROR %d locking %s smbhdr",i,email->file); - logprintf("ERROR %d line %d locking %s smbhdr",i,__LINE__,email->file); - exit(1); } -if((i=smb_getstatus(email))!=0) { - printf("ERROR %d reading %s status header",i,email->file); - logprintf("ERROR %d line %d reading %s status header" - ,i,__LINE__,email->file); - exit(1); } -#endif - -if(!l && misc&KILL_EMPTY_MAIL) { - printf("Empty NetMail - Ignored"); - if(cfg.log&LOG_IGNORED) - logprintf("%s Empty - Ignored",info); - if(fmsgbuf) - FREE(fmsgbuf); - return(0); } - -i=fmsgtosmsg(fmsgbuf,hdr,usernumber,INVALID_SUB); -if(i!=1) { - printf("ERROR (%d) Importing",i); - logprintf("ERROR (%d) Importing %s",i,info); - if(fmsgbuf) - FREE(fmsgbuf); - return(10); } - -addr.zone=hdr.origzone; -addr.net=hdr.orignet; -addr.node=hdr.orignode; -addr.point=hdr.origpoint; -sprintf(str,"\7\1n\1hSBBSecho: \1m%.36s \1n\1msent you NetMail from " - "\1h%s\1n\r\n",hdr.from,faddrtoa(addr)); -putsmsg(usernumber,str); - -if(hdr.attr&FIDO_FILE) { /* File attachment */ - strcpy(subj,hdr.subj); - tp=subj; - while(1) { - p=strchr(tp,SP); - if(p) *p=0; - sp=strrchr(tp,'/'); /* sp is slash pointer */ - if(!sp) sp=strrchr(tp,'\\'); - if(sp) tp=sp+1; - sprintf(str,"%s%s",fidofile_dir,tp); - sprintf(tmp,"%sFILE\\%04u.IN",data_dir,usernumber); - mkdir(tmp); - strcat(tmp,"\\"); - strcat(tmp,tp); - mv(str,tmp,0); - if(!p) - break; - tp=p+1; } } -netmail++; - -if(fmsgbuf) - FREE(fmsgbuf); - -/***************************/ -/* Updating message header */ -/***************************/ -/*** NOT packet compatible -if(!(misc&DONT_SET_RECV)) { - hdr.attr|=FIDO_RECV; - fseek(fidomsg,0L,SEEK_SET); - fwrite(&hdr,sizeof(fmsghdr_t),1,fidomsg); } -***/ -if(cfg.log&LOG_IMPORTED) - logprintf("%s Imported",info); -return(0); -} - -/****************************************************************************** - This is where we export echomail. This was separated from function main so - it could be used for the remote rescan function. Passing anything but an - empty address as 'addr' designates that a rescan should be done for that - address. -******************************************************************************/ -void export_echomail(char *sub_code,faddr_t addr) -{ - char str[1025],tear,cr,HUGE16 *buf; - uchar HUGE16 *fmsgbuf=NULL; - int g,i,j,k,file; - ulong f,l,m,exp,ptr,msgs,lastmsg,posts,exported=0; - float export_time; - smbmsg_t msg; - fmsghdr_t hdr; - struct tm *tm; - faddr_t pkt_faddr; - post_t HUGE16 *post; - areasbbs_t fakearea,curarea; - addrlist_t msg_seen,msg_path; - clock_t start_tick=0,export_ticks=0; - -memset(&msg_seen,0,sizeof(addrlist_t)); -memset(&msg_path,0,sizeof(addrlist_t)); -memset(&pkt_faddr,0,sizeof(faddr_t)); -start_tick=0; - -printf("\nScanning for Outbound EchoMail...\n"); - -for(g=0;g<total_grps;g++) -for(i=0;i<total_subs;i++) - if(sub[i]->misc&SUB_FIDO && sub[i]->grp==g) { - for(j=0;j<cfg.areas;j++) /* Skip areas with no uplinks */ - if(cfg.area[j].sub==i) - break; - if(j==cfg.areas || (j<cfg.areas && !cfg.area[j].uplinks)) - continue; - if(addr.zone) { /* Skip areas not meant for this address */ - if(j<cfg.areas) - for(k=0;k<cfg.area[j].uplinks;k++) - if(!memcmp(&cfg.area[j].uplink[k],&addr,sizeof(faddr_t))) - break; - if(k==cfg.area[j].uplinks) - continue; } - if(sub_code[0] && stricmp(sub_code,sub[i]->code)) - continue; - printf("\nScanning %-15.15s %s\n" - ,grp[sub[i]->grp]->sname,sub[i]->lname); - ptr=0; - if(!addr.zone && !(misc&IGNORE_MSGPTRS)) { - sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code); - if((file=nopen(str,O_RDONLY))!=-1) { - read(file,&ptr,sizeof(time_t)); - close(file); } } - - msgs=getlastmsg(i,&lastmsg,0); - if(!msgs || (!addr.zone && !(misc&IGNORE_MSGPTRS) && ptr>=lastmsg)) { - printf("No new messages."); - if(ptr>lastmsg && !addr.zone && !(misc&LEAVE_MSGPTRS)) { - printf("Fixing new-scan pointer."); - sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code); - if((file=nopen(str,O_WRONLY|O_CREAT))==-1) { - printf("\7ERROR opening/creating %s",str); - logprintf("ERROR line %d opening/creating %s" - ,__LINE__,str); } - else { - write(file,&lastmsg,4); - close(file); } } - continue; } - - sprintf(smb[cur_smb].file,"%s%s" - ,sub[i]->data_dir,sub[i]->code); - smb[cur_smb].retry_time=smb_retry_time; - if((j=smb_open(&smb[cur_smb]))!=0) { - printf("ERROR %d opening %s\n",j,smb[cur_smb].file); - logprintf("ERROR %d line %d opening %s",j,__LINE__ - ,smb[cur_smb].file); - continue; } - - post=NULL; - posts=loadmsgs(&post,ptr); - - if(!posts) { /* no new messages */ - smb_close(&smb[cur_smb]); - if(post) - LFREE(post); - continue; } - - if(start_tick) - export_ticks+=clock()-start_tick; - start_tick=clock(); - - for(m=exp=0;m<posts;m++) { - printf("\r%8s %5lu of %-5lu " - ,sub[i]->code,m+1,posts); - msg.idx.offset=post[m].offset; - if((k=smb_lockmsghdr(&smb[cur_smb],&msg))!=0) { - printf("ERROR %d locking %s msghdr\n",k,smb[cur_smb].file); - logprintf("ERROR %d line %d locking %s msghdr\n" - ,k,__LINE__,smb[cur_smb].file); - continue; } - k=smb_getmsghdr(&smb[cur_smb],&msg); - if(k || msg.hdr.number!=post[m].number) { - smb_unlockmsghdr(&smb[cur_smb],&msg); - smb_freemsgmem(&msg); - - msg.hdr.number=post[m].number; - if((k=smb_getmsgidx(&smb[cur_smb],&msg))!=0) { - printf("ERROR %d reading %s index\n",k,smb[cur_smb].file); - logprintf("ERROR %d line %d reading %s index",k,__LINE__ - ,smb[cur_smb].file); - continue; } - if((k=smb_lockmsghdr(&smb[cur_smb],&msg))!=0) { - printf("ERROR %d locking %s msghdr\n",k,smb[cur_smb].file); - logprintf("ERROR %d line %d locking %s msghdr",k,__LINE__ - ,smb[cur_smb].file); - continue; } - if((k=smb_getmsghdr(&smb[cur_smb],&msg))!=0) { - smb_unlockmsghdr(&smb[cur_smb],&msg); - printf("ERROR %d reading %s msghdr\n",k,smb[cur_smb].file); - logprintf("ERROR %d line %d reading %s msghdr",k,__LINE__ - ,smb[cur_smb].file); - continue; } } - - if((!addr.zone && !(misc&EXPORT_ALL) - && msg.from_net.type==NET_FIDO) - || !strnicmp(msg.subj,"NE:",3)) { /* no echo */ - smb_unlockmsghdr(&smb[cur_smb],&msg); - smb_freemsgmem(&msg); - continue; } /* From a Fido node, ignore it */ - - if(msg.from_net.type && msg.from_net.type!=NET_FIDO - && !(sub[i]->misc&SUB_GATE)) { - smb_unlockmsghdr(&smb[cur_smb],&msg); - smb_freemsgmem(&msg); - continue; } - - memset(&hdr,0,sizeof(fmsghdr_t)); /* Zero the header */ - hdr.origzone=sub[i]->faddr.zone; - hdr.orignet=sub[i]->faddr.net; - hdr.orignode=sub[i]->faddr.node; - hdr.origpoint=sub[i]->faddr.point; - - hdr.attr=FIDO_LOCAL; - if(msg.hdr.attr&MSG_PRIVATE) - hdr.attr|=FIDO_PRIVATE; - - sprintf(hdr.from,"%.35s",msg.from); - - tm=gmtime((time_t *)&msg.hdr.when_written.time); - sprintf(hdr.time,"%02u %3.3s %02u %02u:%02u:%02u" - ,tm->tm_mday,mon[tm->tm_mon],TM_YEAR(tm->tm_year) - ,tm->tm_hour,tm->tm_min,tm->tm_sec); - - sprintf(hdr.to,"%.35s",msg.to); - - sprintf(hdr.subj,"%.71s",msg.subj); - - buf=smb_getmsgtxt(&smb[cur_smb],&msg,GETMSGTXT_TAILS); - if(!buf) { - smb_unlockmsghdr(&smb[cur_smb],&msg); - smb_freemsgmem(&msg); - continue; } - fmsgbuf=MALLOC(strlen((char *)buf)+512); - if(!fmsgbuf) { - printf("ERROR allocating %lu bytes for fmsgbuf\n"); - logprintf("ERROR line %d allocating %lu bytes for fmsgbuf" - ,__LINE__,strlen((char *)buf)+512); - smb_unlockmsghdr(&smb[cur_smb],&msg); - smb_freemsgmem(&msg); - continue; } - - tear=0; - for(l=f=0,cr=1;buf[l];l++) { - if(buf[l]==1) { /* Ctrl-A, so skip it and the next char */ - l++; - if(!buf[l]) - break; - continue; } - if(buf[l]==LF) /* Ignore line feeds */ - continue; - if(cr) { - if(buf[l]=='-' && buf[l+1]=='-' - && buf[l+2]=='-' - && (buf[l+3]==SP || buf[l+3]==CR)) { - if(misc&CONVERT_TEAR) /* Convert to === */ - buf[l]=buf[l+1]=buf[l+2]='='; - else - tear=1; } - else if(!strncmp((char *)buf+l," * Origin: ",11)) - buf[l+1]='#'; } /* Convert * Origin into # Origin */ - - if(buf[l]==CR) - cr=1; - else - cr=0; - if(sub[i]->misc&SUB_ASCII || misc&ASCII_ONLY) { - if(buf[l]<SP && buf[l]!=CR) /* Ctrl ascii */ - buf[l]='.'; /* converted to '.' */ - if((uchar)buf[l]>0x7f) /* extended ASCII */ - buf[l]='*'; } /* converted to '*' */ - - fmsgbuf[f++]=buf[l]; } - - FREE(buf); - fmsgbuf[f]=0; - - if(!(sub[i]->misc&SUB_NOTAG)) { - if(!tear) { /* No previous tear line */ - sprintf(str,"--- Synchronet+SBBSecho v%s\r",SBBSECHO_VER); - strcat((char *)fmsgbuf,str); } - - sprintf(str," * Origin: %s (%s)\r" - ,sub[i]->origline[0] ? sub[i]->origline : origline - ,faddrtoa(sub[i]->faddr)); - strcat((char *)fmsgbuf,str); } - - for(k=0;k<cfg.areas;k++) - if(cfg.area[k].sub==i) { - cfg.area[k].exported++; - pkt_to_pkt(fmsgbuf,cfg.area[k] - ,(addr.zone) ? addr:pkt_faddr,hdr,msg_seen - ,msg_path,(addr.zone) ? 2:0); - break; } - FREE(fmsgbuf); - exported++; - exp++; - printf("Exp: %lu ",exp); - smb_unlockmsghdr(&smb[cur_smb],&msg); - smb_freemsgmem(&msg); } - - smb_close(&smb[cur_smb]); - LFREE(post); - - /***********************/ - /* Update FIDO_PTR.DAB */ - /***********************/ - if(!addr.zone && !(misc&LEAVE_MSGPTRS) && lastmsg>ptr) { - sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code); - if((file=nopen(str,O_WRONLY|O_CREAT))==-1) { - printf("\7ERROR opening/creating %s",str); - logprintf("ERROR line %d opening/creating %s",__LINE__,str); } - else { - write(file,&lastmsg,4); - close(file); } } } - -printf("\n"); -if(start_tick) /* Last possible increment of export_ticks */ - export_ticks+=clock()-start_tick; - -pkt_to_pkt(buf,fakearea,pkt_faddr,hdr,msg_seen,msg_path,1); - -if(!addr.zone && cfg.log&LOG_AREA_TOTALS && exported) - for(i=0;i<cfg.areas;i++) - if(cfg.area[i].exported) - logprintf("Exported: %5u msgs %8s -> %s" - ,cfg.area[i].exported,sub[cfg.area[i].sub]->code - ,cfg.area[i].name); - -export_time=((float)export_ticks)/(float)CLK_TCK; -if(cfg.log&LOG_TOTALS && exported && export_time) { - printf("\nExported %lu EchoMail messages in %.1f seconds " - ,exported,export_time); - logprintf("Exported: %5lu msgs in %.1f sec (%.1f/min %.1f/sec)" - ,exported,export_time - ,export_time/60.0 ? (float)exported/(export_time/60.0) :(float)exported - ,(float)exported/export_time); - if(export_time/60.0) - printf("(%.1f/min) ",(float)exported/(export_time/60.0)); - printf("(%.1f/sec)\n",(float)exported/export_time); } - -} -/***********************************/ -/* Synchronet/FidoNet Message util */ -/***********************************/ -int main(int argc, char **argv) -{ - FILE *fidomsg; - char ch,str[1025],fname[256],path[512],sub_code[9] - ,*p,*tp,*sp,*buf,cr,tear,lzh - ,areatagstr[129],packet[128],outbound[128] - ,password[16]; - uchar HUGE16 *fmsgbuf=NULL; - ushort xlat,attr; - int i,j,k,n,x,y,z,last,file,fmsg,g,grunged; - uint subnum[MAX_OPEN_SMBS]={INVALID_SUB}; - ulong files,msgfiles,echomail=0,crc,ptr, - l,m,f,length,lastmsg,posts,msgs,exp,areatag; - time_t now; - float import_time; - clock_t start_tick=0,import_ticks=0; - read_cfg_text_t txt; - struct find_t ff; - struct tm *tm; - fmsghdr_t hdr; - faddr_t addr,pkt_faddr; - post_t HUGE16 *post; - FILE *stream,*fstream; - smbmsg_t msg; - pkthdr_t pkthdr; - addrlist_t msg_seen,msg_path; - areasbbs_t fakearea,curarea; - char *usage="\n" -"usage: sbbsecho [cfg_file] [/switches] [sub_code]\n" -"\n" -"where: cfg_file is the filename of config file (default is ctrl\\sbbsecho.cfg)\n" -" sub_code is the internal code for a sub-board (default is ALL subs)\n" -"\n" -"valid switches:\n" -"\n" -"p: do not import packets x: do not delete packets after import\n" -"n: do not import netmail d: do not delete netmail after import\n" -"i: do not import echomail e: do not export echomail\n" -"m: ignore echomail ptrs (export all) u: update echomail ptrs (export none)\n" -"j: ignore recieved bit on netmail t: do not update echomail ptrs\n" -"l: create log file (data\\sbbsecho.log) r: create report of import totals\n" -"h: export all echomail (hub rescan) b: import locally created netmail too\n" -"a: export ASCII characters only f: create packets for outbound netmail\n" -"g: generate notify lists =: change existing tear lines to ===\n" -"y: import netmail for unknown users to sysop\n" -"o: import all netmail regardless of destination address\n" -"s: import private echomail override (strip private status)\n" -"!: notify users of received echomail\n"; - -if((email=(smb_t *)MALLOC(sizeof(smb_t)))==NULL) { - printf("ERROR allocating memory for email.\n"); - exit(1); } -memset(email,0,sizeof(smb_t)); -if((smb=(smb_t *)MALLOC(MAX_OPEN_SMBS*sizeof(smb_t)))==NULL) { - printf("ERROR allocating memory for smbs.\n"); - exit(1); } -for(i=0;i<MAX_OPEN_SMBS;i++) - memset(&smb[i],0,sizeof(smb_t)); -memset(&cfg,0,sizeof(config_t)); -memset(&msg_seen,0,sizeof(addrlist_t)); -memset(&msg_path,0,sizeof(addrlist_t)); -printf("\nSBBSecho Version %s (%s) SMBLIB %s � Synchronet FidoNet Packet " - "Tosser\n" - ,SBBSECHO_VER -#if defined(__OS2__) - ,"OS/2" -#elif defined(__NT__) - ,"Win32" -#elif defined(__DOS4G__) - ,"DOS4G" -#elif defined(__FLAT__) - ,"DOS32" -#else - ,"DOS16" -#endif - ,smb_lib_ver() - ); - -putenv("TZ=UCT0"); -putenv("TMP="); -_fmode=O_BINARY; -setvbuf(stdout,NULL,_IONBF,0); - -txt.openerr="\7\nError opening %s for read.\n"; -txt.reading="\nReading %s..."; -txt.readit="\rRead %s "; -txt.allocerr="\7\nError allocating %u bytes of memory\n"; -txt.error="\7\nERROR: Offset %lu in %s\n\n"; - -node_dir[0]=sub_code[0]=0; -for(i=1;i<argc;i++) { - if(argv[i][0]=='/') { - j=1; - while(argv[i][j]) { - switch(toupper(argv[i][j])) { - case 'A': - misc|=ASCII_ONLY; - break; - case 'B': - misc|=LOCAL_NETMAIL; - break; - case 'D': - misc&=~DELETE_NETMAIL; - break; - case 'E': - misc&=~EXPORT_ECHOMAIL; - break; - case 'F': - misc|=PACK_NETMAIL; - break; - case 'G': - misc|=GEN_NOTIFY_LIST; - break; - case 'H': - misc|=EXPORT_ALL; - break; - case 'I': - misc&=~IMPORT_ECHOMAIL; - break; - case 'J': - misc|=IGNORE_RECV; - break; - case 'L': - misc|=LOGFILE; - break; - case 'M': - misc|=IGNORE_MSGPTRS; - break; - case 'N': - misc&=~IMPORT_NETMAIL; - break; - case 'O': - misc|=IGNORE_ADDRESS; - break; - case 'P': - misc&=~IMPORT_PACKETS; - break; - case 'R': - misc|=REPORT; - break; - case 'S': - misc|=IMPORT_PRIVATE; - break; - case 'T': - misc|=LEAVE_MSGPTRS; - break; - case 'U': - misc|=UPDATE_MSGPTRS; - misc&=~EXPORT_ECHOMAIL; - break; - case 'X': - misc&=~DELETE_PACKETS; - break; - case 'Y': - misc|=UNKNOWN_NETMAIL; - break; - case '=': - misc|=CONVERT_TEAR; - break; - case '!': - misc|=NOTIFY_RECEIPT; - break; - case 'Q': - exit(0); - default: - printf(usage); - exit(0); } - j++; } } - else { - if(strchr(argv[i],'\\') || argv[i][1]==':' || strchr(argv[i],'.')) - sprintf(cfg.cfgfile,"%.100s",argv[i]); - else - sprintf(sub_code,"%.8s",argv[i]); } } - -if(!(misc&(IMPORT_NETMAIL|IMPORT_ECHOMAIL))) - misc&=~IMPORT_PACKETS; -if(!node_dir[0]) { - p=getenv("SBBSNODE"); - if(p==NULL) { - printf("\7\nSBBSNODE environment variable not set.\n"); - exit(1); } - strcpy(node_dir,p); } - -strupr(node_dir); - -if(node_dir[strlen(node_dir)-1]!='\\') - strcat(node_dir,"\\"); - -read_node_cfg(txt); -if(ctrl_dir[0]=='.') { /* Relative path */ - strcpy(str,ctrl_dir); - sprintf(ctrl_dir,"%s%s",node_dir,str); - if(_fullpath(str,ctrl_dir,40)) - strcpy(ctrl_dir,str); } -backslash(ctrl_dir); - -read_main_cfg(txt); -if(data_dir[0]=='.') { /* Relative path */ - strcpy(str,data_dir); - sprintf(data_dir,"%s%s",node_dir,str); - if(_fullpath(str,data_dir,40)) - strcpy(data_dir,str); } -backslash(data_dir); -if(text_dir[0]=='.') { /* Relative path */ - strcpy(str,text_dir); - sprintf(text_dir,"%s%s",node_dir,str); - if(_fullpath(str,text_dir,40)) - strcpy(text_dir,str); } -backslash(text_dir); -read_msgs_cfg(txt); - -#ifndef __FLAT__ - -__spawn_ext = (node_swap & SWAP_EXT) != 0 ; -__spawn_ems = (node_swap & SWAP_EMS) != 0 ; -__spawn_xms = (node_swap & SWAP_XMS) != 0 ; - -#endif - -if(total_faddrs<1) { - sys_faddr.zone=sys_faddr.net=sys_faddr.node=1; - sys_faddr.point=0; } -else - sys_faddr=faddr[0]; - -sprintf(str,"%s%s",ctrl_dir,"NODE.DAB"); -if((nodefile=sopen(str,O_BINARY|O_RDWR,SH_DENYNO))==-1) { - printf("\n\7ERROR opening %s\n",str); - exit(1); } - -if(!cfg.cfgfile[0]) - sprintf(cfg.cfgfile,"%sSBBSECHO.CFG",ctrl_dir); -strcpy(cfg.inbound,fidofile_dir); -sprintf(cfg.areafile,"%sAREAS.BBS",data_dir); -sprintf(cfg.logfile,"%sSBBSECHO.LOG",data_dir); - -read_cfg(); - -if(misc&LOGFILE) - if((fidologfile=_fsopen(cfg.logfile,"ab",SH_DENYNO))==NULL) { - printf("\7ERROR opening %s\n",cfg.logfile); - exit(1); } - -if(exec_dir[0]!='\\' && exec_dir[1]!=':') { - strcpy(path,node_dir); - strcat(path,exec_dir); - if(_fullpath(str,path,40)) - strcpy(path,str); - backslash(path); } -else - strcpy(path,exec_dir); - -/******* READ IN AREAS.BBS FILE *********/ - -printf("Reading %s",cfg.areafile); -if((stream=fnopen(&file,cfg.areafile,O_RDONLY))==NULL) { - printf("Unable to open %s for read.\n",cfg.areafile); - exit(1); } -cfg.areas=0; /* Total number of areas in AREAS.BBS */ -cfg.area=NULL; -while(1) { - if(!fgets(str,1024,stream)) - break; - truncsp(str); - p=str; - while(*p && *p<=SP) p++; /* Find first printable char */ - if(*p==';' || !*p) /* Ignore blank lines or start with ; */ - continue; - if((cfg.area=(areasbbs_t *)REALLOC(cfg.area,sizeof(areasbbs_t)* - (cfg.areas+1)))==NULL) { - printf("ERROR allocating memory for area #%u.\n",cfg.areas+1); - exit(1); } - memset(&cfg.area[cfg.areas],0,sizeof(areasbbs_t)); - - cfg.area[cfg.areas].sub=INVALID_SUB; /* Default to passthru */ - - sprintf(tmp,"%-.8s",p); - tp=tmp; - while(*tp>SP) tp++; - *tp=0; - for(i=0;i<total_subs;i++) - if(!stricmp(tmp,sub[i]->code)) - break; - if(i<total_subs) - cfg.area[cfg.areas].sub=i; - else if(stricmp(tmp,"P")) { - printf("\n%s: Unrecongized internal code, assumed passthru",tmp); - logprintf("%s: Unrecognized internal code, assumed passthru",tmp); } - - while(*p>SP) p++; /* Skip code */ - while(*p && *p<=SP) p++; /* Skip white space */ - sprintf(tmp,"%-.50s",p); /* Area tag */ - if((tp=strchr(tmp,TAB))!=NULL) /* Chop off any TABs */ - *tp=0; - if((tp=strchr(tmp,SP))!=NULL) /* Chop off any spaces */ - *tp=0; - strupr(tmp); - if(tmp[0]=='*') /* UNKNOWN-ECHO area */ - cfg.badecho=cfg.areas; - if((cfg.area[cfg.areas].name=(char *)MALLOC(strlen(tmp)+1))==NULL) { - printf("ERROR allocating memory for area #%u tag name.\n" - ,cfg.areas+1); - exit(1); } - strcpy(cfg.area[cfg.areas].name,tmp); - strupr(tmp); - cfg.area[cfg.areas].tag=crc32(tmp); - - while(*p>SP) p++; /* Skip tag */ - while(*p && *p<=SP) p++; /* Skip white space */ - - while(*p && *p!=';') { - if((cfg.area[cfg.areas].uplink=(faddr_t *) - REALLOC(cfg.area[cfg.areas].uplink - ,sizeof(faddr_t)*(cfg.area[cfg.areas].uplinks+1)))==NULL) { - printf("ERROR allocating memory for area #%u uplinks.\n" - ,cfg.areas+1); - exit(1); } - cfg.area[cfg.areas].uplink[cfg.area[cfg.areas].uplinks]=atofaddr(p); - while(*p>SP) p++; /* Skip address */ - while(*p && *p<=SP) p++; /* Skip white space */ - cfg.area[cfg.areas].uplinks++; } - - if(cfg.area[cfg.areas].sub!=INVALID_SUB || cfg.area[cfg.areas].uplinks) - cfg.areas++; /* Don't allocate if no tossing */ - } -fclose(stream); - -printf("\n"); - -if(!cfg.areas) { - printf("No areas defined!\n"); - exit(1); } - -#if 0 - /* AREAS.BBS DEBUG */ - for(i=0;i<cfg.areas;i++) { - printf("%4u: %-8s" - ,i+1 - ,cfg.area[i].sub==INVALID_SUB ? "Passthru" : - sub[cfg.area[i].sub]->code); - for(j=0;j<cfg.area[i].uplinks;j++) - printf(" %s",faddrtoa(cfg.area[i].uplink[j])); - printf("\n"); } -#endif - -if(misc&GEN_NOTIFY_LIST) { -printf("\nGenerating Notify Lists...\n"); -notify_list(); } - -/* Find any packets that have been left behind in the OUTBOUND directory */ -printf("\nScanning for Stray Outbound Packets...\n"); -sprintf(path,"%s*.PK_",cfg.outbound); -for(l=_dos_findfirst(path,0,&ff);!l && !kbhit();l=_dos_findnext(&ff)) { - sprintf(packet,"%s%s",cfg.outbound,ff.name); - printf("%21s: %s ","Outbound Packet",packet); - if((fmsg=sopen(packet,O_RDWR,SH_DENYRW))==-1) { - printf("ERROR opening.\n"); - logprintf("ERROR line %d opening %s",__LINE__,packet); - continue; } - if((fidomsg=fdopen(fmsg,"r+b"))==NULL) { - close(fmsg); - printf("\7ERROR fdopening.\n"); - logprintf("ERROR line %d fdopening %s",__LINE__,packet); - continue; } - if(filelength(fmsg)<sizeof(pkthdr_t)) { - printf("ERROR invalid length of %u bytes for %s\n",filelength(fmsg) - ,packet); - logprintf("ERROR line %d invalid length of %u bytes for %s" - ,__LINE__,filelength(fmsg),packet); - fclose(fidomsg); - if(delfile(packet)) - logprintf("ERROR line %d removing %s %s",__LINE__,packet - ,sys_errlist[errno]); - continue; } - if(fread(&pkthdr,sizeof(pkthdr_t),1,fidomsg)!=1) { - fclose(fidomsg); - printf("\7ERROR reading %u bytes from %s\n",sizeof(pkthdr_t),packet); - logprintf("ERROR line %d reading %u bytes from %s",__LINE__ - ,sizeof(pkthdr_t),packet); - continue; } - if((ddtol(ff.wr_time,ff.wr_date)+(60L*60L))<=time(NULL)) { - fseek(fidomsg,-3L,SEEK_END); - fread(str,3,1,fidomsg); - if(str[2]) /* No ending NULL, probably junk */ - fputc(0,fidomsg); - if(str[1]) - fputc(0,fidomsg); - if(str[0]) - fputc(0,fidomsg); - fclose(fidomsg); - pkt_faddr.zone=pkthdr.destzone; - pkt_faddr.net=pkthdr.destnet; - pkt_faddr.node=pkthdr.destnode; - pkt_faddr.point=0; /* No point info in the 2.0 hdr! */ - memcpy(&two_plus,&pkthdr.empty,20); - if(two_plus.cword==_rotr(two_plus.cwcopy,8) /* 2+ Packet Header */ - && two_plus.cword && two_plus.cword&1) - pkt_faddr.point=two_plus.destpoint; - else if(pkthdr.baud==2) { /* Type 2.2 Packet Header */ - memcpy(&two_two,&pkthdr.empty,20); - pkt_faddr.point=pkthdr.month; } - printf("Sending to %s\n",faddrtoa(pkt_faddr)); - pack_bundle(packet,pkt_faddr); } - else { - fclose(fidomsg); - printf("Possibly still in use (%u minutes old)\n" - ,(time(NULL)-ddtol(ff.wr_time,ff.wr_date))/60); } } -#ifdef __WATCOMC__ -_dos_findclose(&ff); -#endif - -if(misc&IMPORT_PACKETS) { - -printf("\nScanning for Inbound Packets...\n"); - -/* We want to loop while there are bundles waiting for us, but first we want */ -/* to take care of any packets that may already be hanging around for some */ -/* reason or another (thus the do/while loop) */ - -echomail=0; -for(secure=0;secure<2;secure++) { - if(secure && !cfg.secure[0]) - break; -do { -/****** START OF IMPORT PKT ROUTINE ******/ - -sprintf(path,"%s*.PKT",secure ? cfg.secure : cfg.inbound); -for(l=_dos_findfirst(path,0,&ff);!l && !kbhit();l=_dos_findnext(&ff)) { - - sprintf(packet,"%s%s",secure ? cfg.secure : cfg.inbound,ff.name); - - if((fidomsg=fnopen(&fmsg,packet,O_RDWR))==NULL) { - printf("\7ERROR opening %s\n",packet); - logprintf("ERROR line %d opening %s %s",__LINE__,packet - ,sys_errlist[errno]); - continue; } - if(filelength(fmsg)<sizeof(pkthdr_t)) { - printf("\7Invalid length of %u bytes\n",filelength(fmsg)); - fclose(fidomsg); - continue; } - - fseek(fidomsg,-2L,SEEK_END); - fread(str,2,1,fidomsg); - if((str[0] || str[1]) && - (ddtol(ff.wr_time,ff.wr_date)+(48L*60L*60L))<=time(NULL)) { - fclose(fidomsg); - printf("\7ERROR packet %s not terminated correctly\n",packet); - logprintf("ERROR line %d packet %s not terminated correctly",__LINE__ - ,packet); - continue; } - fseek(fidomsg,0L,SEEK_SET); - if(fread(&pkthdr,sizeof(pkthdr_t),1,fidomsg)!=1) { - fclose(fidomsg); - printf("\7ERROR reading %u bytes\n",sizeof(pkthdr_t)); - logprintf("ERROR line %d reading %u bytes from %s",__LINE__ - ,sizeof(pkthdr_t),packet); - continue; } - - pkt_faddr.zone=pkthdr.origzone ? pkthdr.origzone:sys_faddr.zone; - pkt_faddr.net=pkthdr.orignet; - pkt_faddr.node=pkthdr.orignode; - pkt_faddr.point=0; - - printf("%21s: %s " - ,secure ? "Importing Secure Pkt" : "Importing Packet",ff.name); - memcpy(&two_plus,&pkthdr.empty,20); - if(two_plus.cword==_rotr(two_plus.cwcopy,8) /* 2+ Packet Header */ - && two_plus.cword && two_plus.cword&1) { - pkt_type=PKT_TWO_PLUS; - pkt_faddr.point=two_plus.origpoint ? two_plus.origpoint:0; - if(pkt_faddr.point && pkthdr.orignet==-1) - pkt_faddr.net=two_plus.auxnet ? two_plus.auxnet:sys_faddr.zone; - printf("(Type 2+)"); - if(cfg.log&LOG_PACKETS) - logprintf("Importing %s%s (Type 2+) from %s" - ,secure ? "(secure) ":"",ff.name,faddrtoa(pkt_faddr)); } - else if(pkthdr.baud==2) { /* Type 2.2 Packet Header */ - pkt_type=PKT_TWO_TWO; - memcpy(&two_two,&pkthdr.empty,20); - pkt_faddr.point=pkthdr.year ? pkthdr.year:0; - printf("(Type 2.2)"); - if(cfg.log&LOG_PACKETS) - logprintf("Importing %s%s (Type 2.2) from %s" - ,secure ? "(secure) ":"",ff.name,faddrtoa(pkt_faddr)); } - else { - pkt_type=PKT_TWO; - printf("(Type 2)"); - if(cfg.log&LOG_PACKETS) - logprintf("Importing %s%s (Type 2) from %s" - ,secure ? "(secure) ":"",ff.name,faddrtoa(pkt_faddr)); } - - printf(" from %s\n",faddrtoa(pkt_faddr)); - - if(misc&SECURE) { - k=matchnode(pkt_faddr,1); - sprintf(password,"%.8s",pkthdr.password); - if(k<cfg.nodecfgs && cfg.nodecfg[k].pktpwd[0] && - stricmp(password,cfg.nodecfg[k].pktpwd)) { - sprintf(str,"Packet %s from %s - " - "Incorrect password ('%s' instead of '%s')" - ,ff.name,faddrtoa(pkt_faddr) - ,password,cfg.nodecfg[k].pktpwd); - printf("Security Violation (Incorrect Password)\n"); - if(cfg.log&LOG_SECURITY) - logprintf(str); - fclose(fidomsg); - continue; } } - - while(!feof(fidomsg)) { - - memset(&hdr,0,sizeof(fmsghdr_t)); - - if(start_tick) - import_ticks+=clock()-start_tick; - start_tick=clock(); - - if(fmsgbuf) { - FREE(fmsgbuf); - fmsgbuf=0; } - if(misc&CHECKMEM) - checkmem(); - if(!fread(&ch,1,1,fidomsg)) /* Message type (0200h) */ - break; - if(ch!=02) - continue; - if(!fread(&ch,1,1,fidomsg)) - break; - if(ch!=00) - continue; - fread(&hdr.orignode,2,1,fidomsg); - fread(&hdr.destnode,2,1,fidomsg); - fread(&hdr.orignet,2,1,fidomsg); - fread(&hdr.destnet,2,1,fidomsg); - fread(&hdr.attr,2,1,fidomsg); - fread(&hdr.cost,2,1,fidomsg); - - grunged=0; - - for(i=0;i<sizeof(hdr.time);i++) /* Read in the Date/Time */ - if(!fread(hdr.time+i,1,1,fidomsg) || !hdr.time[i]) - break; - if(i==sizeof(hdr.time)) grunged=1; - - for(i=0;!grunged && i<sizeof(hdr.to);i++) /* Read in the 'To' Field */ - if(!fread(hdr.to+i,1,1,fidomsg) || !hdr.to[i]) - break; - if(i==sizeof(hdr.to)) grunged=1; - - for(i=0;!grunged && i<sizeof(hdr.from);i++) /* Read in 'From' Field */ - if(!fread(hdr.from+i,1,1,fidomsg) || !hdr.from[i]) - break; - if(i==sizeof(hdr.from)) grunged=1; - - for(i=0;!grunged && i<sizeof(hdr.subj);i++) /* Read in 'Subj' Field */ - if(!fread(hdr.subj+i,1,1,fidomsg) || !hdr.subj[i]) - break; - if(i==sizeof(hdr.subj)) grunged=1; - - str[0]=0; - for(i=0;!grunged && i<sizeof(str);i++) /* Read in the 'AREA' Field */ - if(!fread(str+i,1,1,fidomsg) || str[i]==CR) - break; - if(i<sizeof(str)) - str[i]=0; - else - grunged=1; - - if(!str[0] || grunged) { - start_tick=0; - if(cfg.log&LOG_GRUNGED) - logprintf("Grunged message"); - seektonull(fidomsg); - printf("Grunged message!\n"); - continue; } - - if(i) - fseek(fidomsg,(long)-(i+1),SEEK_CUR); - - truncsp(str); - strupr(str); - p=strstr(str,"AREA:"); - if(!p) { /* Netmail */ - start_tick=0; - if(import_netmail("",hdr,fidomsg)) - seektonull(fidomsg); - printf("\n"); - continue; } - - if(!(misc&IMPORT_ECHOMAIL)) { - start_tick=0; - printf("EchoMail Ignored"); - seektonull(fidomsg); - printf("\n"); - continue; } - - p+=5; /* Skip "AREA:" */ - while(*p && *p<=SP) p++; /* Skip any white space */ - printf("%21s: ",p); /* Show areaname: */ - sprintf(areatagstr,"%.128s",p); - strupr(p); - areatag=crc32(p); - - for(i=0;i<cfg.areas;i++) /* Do we carry this area? */ - if(cfg.area[i].tag==areatag) { - if(cfg.area[i].sub!=INVALID_SUB) - printf("%s ",sub[cfg.area[i].sub]->code); - else - printf("(Passthru) "); - fmsgbuf=getfmsg(fidomsg,NULL); - gen_psb(&msg_seen,&msg_path,fmsgbuf,pkthdr.destzone); - break; } - - if(i==cfg.areas) { - printf("(Unknown) "); - if(cfg.badecho>=0) { - i=cfg.badecho; - if(cfg.area[i].sub!=INVALID_SUB) - printf("%s ",sub[cfg.area[i].sub]->code); - else - printf("(Passthru) "); - fmsgbuf=getfmsg(fidomsg,NULL); - gen_psb(&msg_seen,&msg_path,fmsgbuf,pkthdr.destzone); } - else { - start_tick=0; - printf("Skipped\n"); - seektonull(fidomsg); - continue; } } - - if(misc&SECURE && cfg.area[i].sub!=INVALID_SUB) { - for(j=0;j<cfg.area[i].uplinks;j++) - if(!memcmp(&cfg.area[i].uplink[j],&pkt_faddr,sizeof(faddr_t))) - break; - if(j==cfg.area[i].uplinks) { - if(cfg.log&LOG_SECURITY) - logprintf("%s: Security violation - %s not in AREAS.BBS" - ,areatagstr,faddrtoa(pkt_faddr)); - printf("Security Violation (Not in AREAS.BBS)\n"); - seektonull(fidomsg); - continue; } } - - /* From here on out, i = area number and area[i].sub = sub number */ - - memcpy(&curarea,&cfg.area[i],sizeof(areasbbs_t)); - curarea.name=areatagstr; - - if(cfg.area[i].sub==INVALID_SUB) { /* Passthru */ - start_tick=0; - strip_psb(fmsgbuf); - pkt_to_pkt(fmsgbuf,curarea,pkt_faddr,hdr,msg_seen,msg_path,0); - printf("\n"); - continue; } /* On to the next message */ - - - for(j=0;j<total_faddrs;j++) - if(check_psb(msg_path,faddr[j])) - break; - if(j<total_faddrs) { - start_tick=0; - printf("Circular path (%s) ",faddrtoa(faddr[j])); - cfg.area[i].circular++; - if(cfg.log&LOG_CIRCULAR) - logprintf("%s: Circular path detected for %s" - ,areatagstr,faddrtoa(faddr[j])); - strip_psb(fmsgbuf); - pkt_to_pkt(fmsgbuf,curarea,pkt_faddr,hdr,msg_seen,msg_path,0); - printf("\n"); - continue; } - -#if 0 // Allen's way (broken?) - for(j=0;j<num_open;j++) - if(openbase[j]==cfg.area[i].sub) - break; - if(j && j<num_open) { - cur_smb=j; - k=openbase[0]; - openbase[0]=openbase[j]; - openbase[j]=k; } - else if(j && j==num_open && j<MAX_OPEN_SMBS) { - cur_smb=j; - openbase[j]=openbase[0]; - openbase[0]=INVALID_SUB; } - else if(j==num_open && j>=MAX_OPEN_SMBS) { - cur_smb=j-1; - k=openbase[0]; - openbase[0]=openbase[j-1]; - openbase[j-1]=k; } - - if(openbase[0]!=cfg.area[i].sub) { - if(openbase[0]!=INVALID_SUB) { - smb_close(&smb[cur_smb]); - --num_open; } -#endif - - // Rob's way - for(j=0;j<MAX_OPEN_SMBS;j++) - if(subnum[j]==cfg.area[i].sub) - break; - if(j<MAX_OPEN_SMBS) /* already open */ - cur_smb=j; - else { - if(smb[cur_smb].shd_fp) /* If open */ - cur_smb=!cur_smb; /* toggle between 0 and 1 */ - smb_close(&smb[cur_smb]); /* close, if open */ - subnum[cur_smb]=INVALID_SUB; } /* reset subnum (just incase) */ - - if(smb[cur_smb].shd_fp==NULL) { /* Currently closed */ - sprintf(smb[cur_smb].file,"%s%s",sub[cfg.area[i].sub]->data_dir - ,sub[cfg.area[i].sub]->code); - smb[cur_smb].retry_time=smb_retry_time; - if((j=smb_open(&smb[cur_smb]))!=0) { - sprintf(str,"ERROR %d opening %s area #%d, sub #%d)" - ,j,smb[cur_smb].file,i+1,cfg.area[i].sub+1); - printf(str); - logprintf(str); - strip_psb(fmsgbuf); - pkt_to_pkt(fmsgbuf,curarea,pkt_faddr,hdr,msg_seen - ,msg_path,0); - printf("\n"); - continue; } - if(!filelength(fileno(smb[cur_smb].shd_fp))) { - smb[cur_smb].status.max_crcs=sub[cfg.area[i].sub]->maxcrcs; - smb[cur_smb].status.max_msgs=sub[cfg.area[i].sub]->maxmsgs; - smb[cur_smb].status.max_age=sub[cfg.area[i].sub]->maxage; - smb[cur_smb].status.attr=sub[cfg.area[i].sub]->misc&SUB_HYPER - ? SMB_HYPERALLOC:0; - if((j=smb_create(&smb[cur_smb]))!=0) { - sprintf(str,"ERROR %d creating %s",j,smb[cur_smb].file); - printf(str); - logprintf(str); - smb_close(&smb[cur_smb]); - strip_psb(fmsgbuf); - pkt_to_pkt(fmsgbuf,curarea,pkt_faddr,hdr,msg_seen - ,msg_path,0); - printf("\n"); - continue; } } - -#if 0 // Unnecessary with SMBLIB v2.0 - - if((j=smb_locksmbhdr(&smb[cur_smb]))!=0) { - printf("ERROR %d locking %s smbhdr\n",j,smb[cur_smb].file); - logprintf("ERROR %d line %d locking %s smbhdr",j,__LINE__ - ,smb[cur_smb].file); - smb_close(&smb[cur_smb]); - strip_psb(fmsgbuf); - pkt_to_pkt(fmsgbuf,curarea,pkt_faddr,hdr,msg_seen - ,msg_path,0); - printf("\n"); - continue; } - - if((j=smb_getstatus(&smb[cur_smb]))!=0) { - sprintf(str,"ERROR %d reading %s SMB header",j - ,smb[cur_smb].file); - printf(str); - logprintf(str); - smb_unlocksmbhdr(&smb[cur_smb]); - smb_close(&smb[cur_smb]); - strip_psb(fmsgbuf); - pkt_to_pkt(fmsgbuf,curarea,pkt_faddr,hdr,msg_seen - ,msg_path,0); - printf("\n"); - continue; } - - smb_unlocksmbhdr(&smb[cur_smb]); -#endif - //openbase[0]=cfg.area[i].sub; - //++num_open; - subnum[cur_smb]=cfg.area[i].sub; - } - - if(hdr.attr&FIDO_PRIVATE && !(sub[cfg.area[i].sub]->misc&SUB_PRIV)) { - if(misc&IMPORT_PRIVATE) - hdr.attr&=~FIDO_PRIVATE; - else { - start_tick=0; - printf("Private posts disallowed."); - if(cfg.log&LOG_PRIVATE) - logprintf("%s: Private posts disallowed" - ,areatagstr); - strip_psb(fmsgbuf); - pkt_to_pkt(fmsgbuf,curarea,pkt_faddr,hdr,msg_seen - ,msg_path,0); - printf("\n"); - continue; } } - - if(!(hdr.attr&FIDO_PRIVATE) && sub[cfg.area[i].sub]->misc&SUB_PONLY) - hdr.attr|=MSG_PRIVATE; - - /**********************/ - /* Importing EchoMail */ - /**********************/ - j=fmsgtosmsg(fmsgbuf,hdr,0,cfg.area[i].sub); - - if(start_tick) { - import_ticks+=clock()-start_tick; - start_tick=0; } - - if(j==-1) { - if(cfg.log&LOG_DUPES) - logprintf("%s Duplicate message",areatagstr); - cfg.area[i].dupes++; } - else { /* Not a dupe */ - strip_psb(fmsgbuf); - pkt_to_pkt(fmsgbuf,curarea,pkt_faddr - ,hdr,msg_seen,msg_path,0); } - - if(j==1) { /* Successful import */ - echomail++; - cfg.area[i].imported++; - if(misc&NOTIFY_RECEIPT && (m=matchname(hdr.to))!=0) { - sprintf(str - ,"\7\1n\1hSBBSecho: \1m%.36s \1n\1msent you EchoMail on " - "\1h%s \1n\1m%s\1n\r\n" - ,hdr.from - ,grp[sub[cfg.area[i].sub]->grp]->sname - ,sub[cfg.area[i].sub]->sname); - putsmsg(m,str); } } - printf("\n"); - } - fclose(fidomsg); - - if(misc&DELETE_PACKETS) - if(delfile(packet)) - logprintf("ERROR line %d removing %s %s",__LINE__,packet - ,sys_errlist[errno]); } -#ifdef __WATCOMC__ -_dos_findclose(&ff); -#endif - -if(start_tick) { - import_ticks+=clock()-start_tick; - start_tick=0; } - -} while(!kbhit() && unpack_bundle()); - -if(kbhit()) printf("\nKey pressed - premature termination\n"); -while(kbhit()) getch(); - -} /* End of Secure : Inbound loop */ - -if(start_tick) /* Last possible increment of import_ticks */ - import_ticks+=clock()-start_tick; - -for(j=MAX_OPEN_SMBS-1;(int)j>=0;j--) /* Close open bases */ - if(smb[j].shd_fp) - smb_close(&smb[j]); - -pkt_to_pkt(fmsgbuf,fakearea,pkt_faddr,hdr,msg_seen,msg_path,1); - -/******* END OF IMPORT PKT ROUTINE *******/ - -if(cfg.log&LOG_AREA_TOTALS) { - for(i=0;i<cfg.areas;i++) { - if(cfg.area[i].imported) - logprintf("Imported: %5u msgs %8s <- %s" - ,cfg.area[i].imported,sub[cfg.area[i].sub]->code - ,cfg.area[i].name); } - for(i=0;i<cfg.areas;i++) { - if(cfg.area[i].circular) - logprintf("Circular: %5u detected in %s" - ,cfg.area[i].circular,cfg.area[i].name); } - for(i=0;i<cfg.areas;i++) { - if(cfg.area[i].dupes) - logprintf("Duplicate: %5u detected in %s" - ,cfg.area[i].dupes,cfg.area[i].name); } } - -import_time=((float)import_ticks)/(float)CLK_TCK; -if(cfg.log&LOG_TOTALS && import_time && echomail) { - printf("\nImported %lu EchoMail messages in %.1f seconds " - ,echomail,import_time); - logprintf("Imported: %5lu msgs in %.1f sec (%.1f/min %.1f/sec)" - ,echomail,import_time - ,import_time/60.0 ? (float)echomail/(import_time/60.0) :(float)echomail - ,(float)echomail/import_time); - if(import_time/60.0) - printf("(%.1f/min) ",(float)echomail/(import_time/60.0)); - printf("(%.1f/sec)\n",(float)echomail/import_time); } -if(fmsgbuf) { - FREE(fmsgbuf); - fmsgbuf=0; } - -} - -if(misc&IMPORT_NETMAIL) { - -printf("\nScanning for Inbound NetMail Messages...\n"); - -sprintf(str,"%s*.MSG",netmail_dir); - -for(last=_dos_findfirst(str,0,&ff);!last;last=_dos_findnext(&ff)) { - sprintf(path,"%s%s",netmail_dir,ff.name); - strupr(path); - if((fidomsg=fnopen(&fmsg,path,O_RDWR))==NULL) { - printf("\7ERROR opening %s\n",path); - logprintf("ERROR line %d opening %s %s",__LINE__,path - ,sys_errlist[errno]); - continue; } - if(filelength(fmsg)<sizeof(fmsghdr_t)) { - printf("\7ERROR invalid length of %u bytes for %s\n",filelength(fmsg) - ,path); - logprintf("ERROR line %d invalid length of %u bytes for %s",__LINE__ - ,filelength(fmsg),path); - fclose(fidomsg); - continue; } - if(fread(&hdr,sizeof(fmsghdr_t),1,fidomsg)!=1) { - fclose(fidomsg); - printf("\7ERROR reading %u bytes from %s" - ,sizeof(fmsghdr_t),path); - logprintf("ERROR line %d reading %u bytes from %s",__LINE__ - ,sizeof(fmsghdr_t),path); - continue; } - i=import_netmail(path,hdr,fidomsg); - /**************************************/ - /* Delete source netmail if specified */ - /**************************************/ - if(i==0) { - if(misc&DELETE_NETMAIL) { - fclose(fidomsg); - if(delfile(path)) - logprintf("ERROR line %d removing %s %s",__LINE__,path - ,sys_errlist[errno]); } - else { - hdr.attr|=FIDO_RECV; - fseek(fidomsg,0L,SEEK_SET); - fwrite(&hdr,sizeof(fmsghdr_t),1,fidomsg); - fclose(fidomsg); } } - else if(i!=-2) - fclose(fidomsg); - printf("\n"); - } -#ifdef __WATCOMC__ -_dos_findclose(&ff); -#endif -} - - -if(misc&EXPORT_ECHOMAIL) { - memset(&addr,0,sizeof(faddr_t)); - export_echomail(sub_code,addr); -} - - -if(misc&PACK_NETMAIL) { - -memset(&msg_seen,0,sizeof(addrlist_t)); -memset(&msg_path,0,sizeof(addrlist_t)); -memset(&fakearea,0,sizeof(areasbbs_t)); - -printf("\nPacking Outbound NetMail...\n"); - -sprintf(str,"%s*.MSG",netmail_dir); - -for(last=_dos_findfirst(str,0,&ff);!last;last=_dos_findnext(&ff)) { - sprintf(path,"%s%s",netmail_dir,ff.name); - strupr(path); - if((fidomsg=fnopen(&fmsg,path,O_RDWR))==NULL) { - printf("\7ERROR opening %s\n",path); - logprintf("ERROR line %d opening %s %s",__LINE__,path - ,sys_errlist[errno]); - continue; } - if(filelength(fmsg)<sizeof(fmsghdr_t)) { - printf("\7%s Invalid length of %u bytes\n",path,filelength(fmsg)); - fclose(fidomsg); - continue; } - if(fread(&hdr,sizeof(fmsghdr_t),1,fidomsg)!=1) { - fclose(fidomsg); - printf("\7ERROR reading %u bytes from %s" - ,sizeof(fmsghdr_t),path); - logprintf("ERROR line %d reading %u bytes from %s",__LINE__ - ,sizeof(fmsghdr_t),path); - continue; } - hdr.destzone=hdr.origzone=sys_faddr.zone; - hdr.destpoint=hdr.origpoint=0; - getzpt(fidomsg,&hdr); /* use kludge if found */ - addr.zone=hdr.destzone; - addr.net=hdr.destnet; - addr.node=hdr.destnode; - addr.point=hdr.destpoint; - for(i=0;i<total_faddrs;i++) - if(!memcmp(&addr,&faddr[i],sizeof(faddr_t))) - break; - if(i<total_faddrs) { /* In-bound, so ignore */ - fclose(fidomsg); - continue; - } - printf("\n%s to %s ",path,faddrtoa(addr)); - if(cfg.log&LOG_PACKING) - logprintf("Packing %s (%s)",path,faddrtoa(addr)); - fmsgbuf=getfmsg(fidomsg,NULL); - if(!fmsgbuf) { - printf("ERROR allocating memory for NetMail fmsgbuf\n"); - logprintf("ERROR line %d allocating memory for NetMail fmsgbuf" - ,__LINE__); - exit(1); } - fclose(fidomsg); - - if(misc&FLO_MAILER) { - attr=0; - i=matchnode(addr,0); - if(i<cfg.nodecfgs) - if(cfg.nodecfg[i].route.zone - && !(hdr.attr&(FIDO_CRASH|FIDO_HOLD))) { - addr=cfg.nodecfg[i].route; /* Routed */ - if(cfg.log&LOG_ROUTING) - logprintf("Routing %s to %s",path,faddrtoa(addr)); - i=matchnode(addr,0); } - if(i<cfg.nodecfgs) - attr=cfg.nodecfg[i].attr; - if(hdr.attr&FIDO_CRASH) - attr|=ATTR_CRASH; - else if(hdr.attr&FIDO_HOLD) - attr|=ATTR_HOLD; - if(attr&ATTR_CRASH) ch='C'; - else if(attr&ATTR_HOLD) ch='H'; - else if(attr&ATTR_DIRECT) ch='D'; - else ch='O'; - if(addr.zone==faddr[0].zone) /* Default zone, use default outbound */ - strcpy(outbound,cfg.outbound); - else /* Inter-zone outbound is OUTBOUND.XXX */ - sprintf(outbound,"%.*s.%03X\\" - ,strlen(cfg.outbound)-1,cfg.outbound,addr.zone); - if(addr.point) { /* Point destination is OUTBOUND.PNT */ - sprintf(str,"%04X%04X.PNT" - ,addr.net,addr.node); - strcat(outbound,str); } - if(outbound[strlen(outbound)-1]=='\\') - outbound[strlen(outbound)-1]=0; - mkdir(outbound); - strcat(outbound,"\\"); - if(addr.point) - sprintf(packet,"%s%08X.%cUT",outbound,addr.point,ch); - else - sprintf(packet,"%s%04X%04X.%cUT",outbound,addr.net,addr.node,ch); - if(hdr.attr&FIDO_FILE) - if(write_flofile(hdr.subj,addr)) - exit(1); } - else - strcpy(packet,pktname()); - - now=time(NULL); - tm=gmtime(&now); - if((stream=fnopen(&file,packet,O_WRONLY|O_APPEND|O_CREAT))==NULL) { - printf("Unable to open %s for write.\n" - ,packet); - logprintf("ERROR line %d opening %s %s",__LINE__,packet - ,sys_errlist[errno]); - exit(1); } - - if(!filelength(file)) { - pkthdr.orignode=hdr.orignode; - pkthdr.destnode=hdr.destnode; - pkthdr.year=tm->tm_year+1900; - pkthdr.month=tm->tm_mon; - pkthdr.day=tm->tm_mday; - pkthdr.hour=tm->tm_hour; - pkthdr.min=tm->tm_min; - pkthdr.sec=tm->tm_sec; - pkthdr.baud=0x00; - pkthdr.pkttype=0x0002; - pkthdr.orignet=hdr.orignet; - pkthdr.destnet=hdr.destnet; - pkthdr.prodcode=0x00; - pkthdr.sernum=0; - i=matchnode(addr,0); - if(i<cfg.nodecfgs) - memcpy(pkthdr.password,cfg.nodecfg[i].pktpwd,8); - else - memset(pkthdr.password,0,8); - pkthdr.origzone=hdr.origzone; - pkthdr.destzone=hdr.destzone; - memset(pkthdr.empty,0,20); - fwrite(&pkthdr,sizeof(pkthdr_t),1,stream); } - - putfmsg(stream,fmsgbuf,hdr,fakearea,msg_seen,msg_path); - - FREE(fmsgbuf); - fclose(stream); - /**************************************/ - /* Delete source netmail if specified */ - /**************************************/ - if(misc&DELETE_NETMAIL) - if(delfile(path)) - logprintf("ERROR line %d removing %s %s",__LINE__,path - ,sys_errlist[errno]); - printf("\n"); } -#ifdef __WATCOMC__ -_dos_findclose(&ff); -#endif -} - - -if(misc&UPDATE_MSGPTRS) { - -printf("\nUpdating Message Pointers to Last Posted Message...\n"); - -for(g=0;g<total_grps;g++) -for(i=0;i<total_subs;i++) - if(sub[i]->misc&SUB_FIDO && sub[i]->grp==g) { - printf("\n%-15.15s %s\n" - ,grp[sub[i]->grp]->sname,sub[i]->lname); - getlastmsg(i,&l,0); - sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code); - if((file=nopen(str,O_WRONLY|O_CREAT))==-1) { - printf("\7ERROR opening/creating %s",str); - logprintf("ERROR line %d opening/creating %s",__LINE__,str); } - else { - write(file,&l,sizeof(time_t)); - close(file); } } -} - -if(misc&(IMPORT_NETMAIL|IMPORT_ECHOMAIL) && misc&REPORT) { - now=time(NULL); - sprintf(str,"%sSBBSECHO.MSG",text_dir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - printf("ERROR opening %s\n",str); - logprintf("ERROR line %d opening %s",__LINE__,str); - exit(1); } - sprintf(fname,"\1c\1h " - "���������������������������������������������������\r\n"); - sprintf(path,"\1c\1h " - "���������������������������������������������������\r\n"); - write(file,fname,strlen(fname)); - sprintf(str," \1n\1k\0016" - " Last FidoNet Transfer on %.24s \1n\r\n",ctime(&now)); - write(file,str,strlen(str)); - write(file,path,strlen(path)); - write(file,fname,strlen(fname)); - sprintf(tmp,"Imported %lu EchoMail and %lu NetMail Messages" - ,echomail,netmail); - sprintf(str," \1n\1k\0016 %-50.50s\1n\r\n",tmp); - write(file,str,strlen(str)); - write(file,path,strlen(path)); - close(file); } - -pkt_to_pkt(buf,fakearea,pkt_faddr,hdr,msg_seen,msg_path,1); -if(email->shd_fp) - smb_close(email); - -FREE(smb); -FREE(email); -return(0); -} diff --git a/src/sbbs2/echo/sbbsecho.h b/src/sbbs2/echo/sbbsecho.h deleted file mode 100644 index e01a0ca34c..0000000000 --- a/src/sbbs2/echo/sbbsecho.h +++ /dev/null @@ -1,244 +0,0 @@ -/* SBBSECHO.H */ - -/* Developed 1990-2000 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Portions written by Allen Christiansen 1994-1996 */ - -#define SBBSECHO_VER "1.32" - -#define IMPORT_NETMAIL (1L<<0) -#define IMPORT_PACKETS (1L<<1) -#define IMPORT_ECHOMAIL (1L<<2) -#define EXPORT_ECHOMAIL (1L<<3) -#define DELETE_NETMAIL (1L<<4) -#define DELETE_PACKETS (1L<<5) -#define STORE_SEENBY (1L<<6) /* Store SEEN-BYs in SMB */ -#define STORE_PATH (1L<<7) /* Store PATHs in SMB */ -#define STORE_KLUDGE (1L<<8) /* Store unknown kludges in SMB */ -#define IGNORE_MSGPTRS (1L<<9) -#define UPDATE_MSGPTRS (1L<<10) -#define LEAVE_MSGPTRS (1L<<11) -#define CHECKMEM (1L<<12) /* Display available memory */ -#define ASCII_ONLY (1L<<13) -#define LOGFILE (1L<<14) -#define REPORT (1L<<15) -#define EXPORT_ALL (1L<<16) -#define UNKNOWN_NETMAIL (1L<<17) -#define IGNORE_ADDRESS (1L<<18) -#define IGNORE_RECV (1L<<19) -#define CONVERT_TEAR (1L<<20) -#define IMPORT_PRIVATE (1L<<21) -#define LOCAL_NETMAIL (1L<<22) -#define NOTIFY_RECEIPT (1L<<23) -#define FLO_MAILER (1L<<24) /* Binkley .FLO style mailer */ -#define PACK_NETMAIL (1L<<25) /* Pack *.MSG NetMail into packets */ -#define FUZZY_ZONE (1L<<26) -#define FAST_OPEN (1L<<27) -#define SECURE (1L<<28) /* Secure operation */ -#define ELIST_ONLY (1L<<29) /* Allow adding from AREAS.BBS */ -#define GEN_NOTIFY_LIST (1L<<30) /* Generate Notify Lists */ -#define KILL_EMPTY_MAIL (1L<<31) /* Kill empty netmail messages */ - -#define ATTR_HOLD (1<<0) /* Hold */ -#define ATTR_CRASH (1<<1) /* Crash */ -#define ATTR_DIRECT (1<<2) /* Direct */ -#define ATTR_PASSIVE (1<<3) /* Used to temp disconnect */ -#define SEND_NOTIFY (1<<4) /* Send Notify Lists */ - - -#define LOG_AREAFIX (1L<<0) /* Log areafix messages */ -#define LOG_IMPORTED (1L<<1) /* Log imported netmail messages */ -#define LOG_PACKETS (1L<<2) /* Log imported packet names/types */ -#define LOG_SECURITY (1L<<3) /* Log security violations */ -#define LOG_GRUNGED (1L<<4) /* Log grunged messages */ -#define LOG_PRIVATE (1L<<5) /* Log disallowed private msgs */ -#define LOG_AREA_TOTALS (1L<<6) /* Log totals for each area */ -#define LOG_TOTALS (1L<<7) /* Log over-all totals */ -#define LOG_PACKING (1L<<8) /* Log packing of out-bound netmail */ -#define LOG_ROUTING (1L<<9) /* Log routing of out-bound netmail */ - -#define LOG_DUPES (1L<<24) /* Log individual dupe messages */ -#define LOG_CIRCULAR (1L<<25) /* Log individual circ paths */ -#define LOG_IGNORED (1L<<26) /* Log ignored netmail */ -#define LOG_UNKNOWN (1L<<27) /* Log netmail for unknown users */ - -#define LOG_DEFAULTS 0xffffffL /* Low 24 bits default to ON */ - -#define PKT_TWO_PLUS 0 /* Type 2+ Packet Header */ -#define PKT_TWO_TWO 1 /* Type 2.2 Packet Header */ -#define PKT_TWO 2 /* Old Type Packet Header */ - -#define MAX_OPEN_SMBS 2 -#define DFLT_OPEN_PKTS 4 -#define MAX_TOTAL_PKTS 100 -#define DFLT_PKT_SIZE 250*1024L -#define DFLT_BDL_SIZE 250*1024L - -#define NOFWD (1<<0) /* Do not forward requests */ - -typedef struct { /* Fidonet Packet Header */ - short orignode, /* Origination Node of Packet */ - destnode, /* Destination Node of Packet */ - year, /* Year of Packet Creation e.g. 1995 */ - month, /* Month of Packet Creation 0-11 */ - day, /* Day of Packet Creation 1-31 */ - hour, /* Hour of Packet Creation 0-23 */ - min, /* Minute of Packet Creation 0-59 */ - sec, /* Second of Packet Creation 0-59 */ - baud, /* Max Baud Rate of Orig & Dest */ - pkttype, /* Packet Type (-1 is obsolete) */ - orignet, /* Origination Net of Packet */ - destnet; /* Destination Net of Packet */ - uchar prodcode, /* Product Code (00h is Fido) */ - sernum, /* Binary Serial Number or NULL */ - password[8]; /* Session Password or NULL */ - short origzone, /* Origination Zone of Packet or NULL */ - destzone; /* Destination Zone of Packet or NULL */ - uchar empty[20]; /* Fill Characters */ - } pkthdr_t; - -typedef struct { /* Type 2+ Packet Header Info */ - short auxnet, /* Orig Net if Origin is a Point */ - cwcopy; /* Must be Equal to cword */ - uchar prodcode, /* Product Code */ - revision; /* Revision */ - short cword, /* Compatibility Word */ - origzone, /* Zone of Packet Sender or NULL */ - destzone, /* Zone of Packet Receiver or NULL */ - origpoint, /* Origination Point of Packet */ - destpoint; /* Destination Point of Packet */ - uchar empty[4]; - } two_plus_t; - -typedef struct { /* Type 2.2 Packet Header Info */ - uchar origdomn[8], /* Origination Domain */ - destdomn[8], /* Destination Domain */ - empty[4]; /* Product Specific Data */ - } two_two_t; - -typedef struct { - uint sub; /* Set to INVALID_SUB if pass-thru */ - ulong tag; /* CRC-32 of tag name */ - char *name; /* Area tag name */ - uint uplinks; /* Total number of uplinks for this echo */ - uint imported; /* Total messages imported this run */ - uint exported; /* Total messages exported this run */ - uint circular; /* Total circular paths detected */ - uint dupes; /* Total duplicate messages detected */ - faddr_t *uplink; /* Each uplink */ - } areasbbs_t; - -typedef struct { - char flag[5]; - } flag_t; - -typedef struct { - uint tags; /* Number of area tags */ - char **tag; /* Name of each area tag */ - } area_t; - -typedef struct { - FILE *stream; /* The stream associated with this packet */ - faddr_t uplink; /* The current uplink for this packet */ - uchar filename[128],curopen;/* Name of the file and if it's open or not */ - } outpkt_t; - -typedef struct { - uint addrs; /* Total number of uplinks */ - faddr_t *addr; /* Each uplink */ - } addrlist_t; - -typedef struct { - char name[26] /* Short name of archive type */ - ,hexid[26] /* Hexadecimal ID to search for */ - ,pack[81] /* Pack command line */ - ,unpack[81]; /* Unpack command line */ - uint byteloc; /* Offset to Hex ID */ - } arcdef_t; - -typedef struct { - faddr_t faddr /* Fido address of this node */ - ,route; /* Address to route FLO stuff through */ - ushort arctype /* De/archiver to use for this node */ - ,numflags /* Number of flags defined for this node */ - ,pkt_type; /* Packet type to use for outgoing PKTs */ - ushort attr; /* Message bits to set for this node */ - char password[26]; /* Areafix password for this node */ - char pktpwd[9]; /* Packet password for this node */ - flag_t *flag; /* Areafix flags for this node */ - } nodecfg_t; - -typedef struct { - char listpath[129]; /* Path to this echolist */ - uint numflags,misc; /* Number of flags for this echolist */ - flag_t *flag; /* Flags to access this echolist */ - faddr_t forward; /* Where to forward requests */ - char password[72]; /* Password to use for forwarding req's */ - } echolist_t; - -typedef struct { - faddr_t dest; - char fname[13]; - } attach_t; - -typedef struct { - char inbound[82] /* Inbound directory */ - ,secure[82] /* Secure Inbound directory */ - ,outbound[82] /* Outbound directory */ - ,areafile[128] /* AREAS.BBS path/filename */ - ,logfile[128] /* LOG path/filename */ - ,cfgfile[128]; /* Configuration path/filename */ - ulong maxpktsize /* Maximum size for packets */ - ,maxbdlsize /* Maximum size for bundles */ - ,log; /* What do we log? */ - int badecho; /* Area to store bad echomail msgs */ - uint arcdefs /* Number of archive definitions */ - ,nodecfgs /* Number of nodes with configs */ - ,listcfgs /* Number of echolists defined */ - ,areas /* Number of areas defined */ - ,notify; /* User number (sysop) to notify */ - arcdef_t *arcdef; /* Each archive definition */ - nodecfg_t *nodecfg; /* Each node configuration */ - echolist_t *listcfg; /* Each echolist configuration */ - areasbbs_t *area; /* Each area configuration */ - } config_t; - -#ifdef __WATCOMC__ -struct time { - unsigned char ti_min; /* Minutes */ - unsigned char ti_hour; /* Hours */ - unsigned char ti_hund; /* Hundredths of seconds */ - unsigned char ti_sec; /* Seconds */ -}; - -struct date { - int da_year; /* Year - 1980 */ - char da_day; /* Day of the month */ - char da_mon; /* Month (1 = Jan) */ -}; -#endif - -/***********************/ -/* Function prototypes */ -/***********************/ -void bail(int code); -char *ultoac(ulong l,char *str); -int bstrlen(char *str); -int nopen(char *str, int access); -FILE *fnopen(int *file, char *str,int access); -char *sectostr(uint sec, char *str); -void truncsp(char *str); -ulong ahtoul(char *str); -int mv(char *src, char *dest, char copy); /* fast file move/copy function */ -char *timestr(time_t *intime); /* ASCII representation of time_t */ -time_t dstrtounix(char *str); /* ASCII date (MM/DD/YY) to unix conversion */ -char *unixtodstr(time_t unix, char *str); /* Unix time to ASCII date */ -int chk_ar(char *str, user_t user); /* checks access requirements */ -ushort crc16(char *str); -void ucrc16(uchar ch, ushort *rcrc); -char fexist(char *filespec); -long flength(char *filespec); -long fdate(char *filespec); -faddr_t atofaddr(char *str); -int matchnode(faddr_t addr, int exact); -void export_echomail(char *sub_code,faddr_t addr); diff --git a/src/sbbs2/echo/sbbsecho.wat b/src/sbbs2/echo/sbbsecho.wat deleted file mode 100644 index e155042c58..0000000000 --- a/src/sbbs2/echo/sbbsecho.wat +++ /dev/null @@ -1,81 +0,0 @@ -############################################ -# Makefile for Synchronet SBBSECHO Utility # -# For use with Watcom C/C++ # -############################################ - -!ifndef OS -OS = DOS -!endif - -!ifeq OS DOS -CC = *wcc -!else -CC = *wcc386 -!endif - -LD = *wlink -INCLUDE = \watcom\h;\watcom\h\os2;..\smb;..\rio;.. -!ifeq OS DOS -CFLAGS = -s -I$(INCLUDE) -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -ml -DLZH_DYNAMIC_BUF -!else -CFLAGS = -s -I$(INCLUDE) -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -!endif - -!ifeq OS NT -SYSTEM = NT -!endif -!ifeq OS DOS -SYSTEM = DOS -!endif -!ifeq OS OS2 -SYSTEM = OS2V2 -!endif -!ifeq OS DOS4G -SYSTEM = DOS4G -!endif - -LFLAGS = option stack=20k system $(SYSTEM) - -MAIN = $(OS)\sbbsecho.exe -OBJS = $(OS)\sbbsecho.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj & - $(OS)\smblib.obj $(OS)\ars.obj $(OS)\lzh.obj & - $(OS)\read_cfg.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\smb\smbdefs.h ..\smb\smblib.h - -# Implicit C Compile Rule -.c.obj: - @echo Compiling (I) $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $[@ ... - $(LD) $(LFLAGS) file { $(OBJS) } option map - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Shared Functions -$(OS)\scfglib1.obj: ..\scfglib1.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -$(OS)\smblib.obj: ..\smb\smblib.c ..\smb\smblib.h ..\smb\smbdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) -DSMB_GETMSGTXT $(CFLAGS) $[@ - -$(OS)\lzh.obj: ..\smb\lzh.c ..\smb\lzh.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -$(OS)\sbbsecho.obj: sbbsecho.c sbbsecho.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ diff --git a/src/sbbs2/email.c b/src/sbbs2/email.c deleted file mode 100644 index 236bd0d8af..0000000000 --- a/src/sbbs2/email.c +++ /dev/null @@ -1,276 +0,0 @@ -#line 1 "EMAIL.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -/****************************************************************************/ -/* Mails a message to usernumber. 'top' is a buffer to place at beginning */ -/* of message. */ -/* Called from functions main_sec, newuser, readmail and scanposts */ -/****************************************************************************/ -void email(int usernumber, char *top, char *subj, char mode) -{ - char str[256],str2[256],msgpath[256],title[LEN_TITLE+1],ch - ,buf[SDT_BLOCK_LEN]; - ushort xlat=XLAT_NONE,msgattr=0; - int i,j,x,file; - long l; - ulong length,offset,crc=0xffffffffUL; - FILE *instream; - node_t node; - smbmsg_t msg; - -sprintf(title,"%.*s",LEN_TITLE,subj); - -if(useron.etoday>=level_emailperday[useron.level] && !SYSOP) { - bputs(text[TooManyEmailsToday]); - return; } - -if(usernumber==1 && useron.rest&FLAG('S') - && (node_valuser!=1 || useron.fbacks || useron.emails)) { /* ! val fback */ - bprintf(text[R_Feedback],sys_op); - return; } -if(usernumber!=1 && useron.rest&FLAG('E') - && (node_valuser!=usernumber || useron.fbacks || useron.emails)) { - bputs(text[R_Email]); - return; } -if(!usernumber) { - bputs(text[UnknownUser]); - return; } -getuserrec(usernumber,U_MISC,8,str); -l=ahtoul(str); -if(l&(DELETED|INACTIVE)) { /* Deleted or Inactive User */ - bputs(text[UnknownUser]); - return; } -if(l&NETMAIL && sys_misc&SM_FWDTONET - && yesno(text[ForwardMailQ])) { /* Forward to netmail address */ - getuserrec(usernumber,U_NETMAIL,LEN_NETMAIL,str); - netmail(str,subj,mode); - return; } -bprintf(text[Emailing],username(usernumber,tmp),usernumber); -action=NODE_SMAL; -nodesync(); - -sprintf(str,"%sFEEDBACK.BIN",exec_dir); -if(usernumber==1 && useron.fbacks && fexist(str)) { - exec_bin("FEEDBACK",&main_csi); - if(main_csi.logic!=LOGIC_TRUE) - return; } - -if(sys_misc&SM_ANON_EM && (SYSOP || useron.exempt&FLAG('A')) - && !noyes(text[AnonymousQ])) - msgattr|=MSG_ANONYMOUS; - -if(sys_misc&SM_DELREADM) - msgattr|=MSG_KILLREAD; - -sprintf(msgpath,"%sINPUT.MSG",node_dir); -sprintf(str2,"%s #%u",username(usernumber,tmp),usernumber); -if(!writemsg(msgpath,top,title,mode,0,str2)) { - bputs(text[Aborted]); - return; } - -if(mode&WM_FILE) { - sprintf(str2,"%sFILE\\%04u.IN",data_dir,usernumber); - mkdir(str2); - sprintf(str2,"%sFILE\\%04u.IN\\%s",data_dir,usernumber,title); - if(fexist(str2)) { - bputs(text[FileAlreadyThere]); - remove(msgpath); - return; } - if(online==ON_LOCAL) { /* Local upload */ - bputs(text[EnterPath]); - if(!getstr(str,60,K_LINE|K_UPPER)) { - bputs(text[Aborted]); - remove(msgpath); - return; } - backslash(str); - strcat(str,title); - mv(str,str2,1); } - else { /* Remote */ - menu("ULPROT"); - mnemonics(text[ProtocolOrQuit]); - strcpy(str,"Q"); - for(x=0;x<total_prots;x++) - if(prot[x]->ulcmd[0] && chk_ar(prot[x]->ar,useron)) { - sprintf(tmp,"%c",prot[x]->mnemonic); - strcat(str,tmp); } - ch=getkeys(str,0); - if(ch=='Q' || sys_status&SS_ABORT) { - bputs(text[Aborted]); - remove(msgpath); - return; } - for(x=0;x<total_prots;x++) - if(prot[x]->ulcmd[0] && prot[x]->mnemonic==ch - && chk_ar(prot[x]->ar,useron)) - break; - if(x<total_prots) /* This should be always */ - protocol(cmdstr(prot[x]->ulcmd,str2,nulstr,NULL),0); } - l=flength(str2); - if(l>0) - bprintf(text[FileNBytesReceived],title,ultoac(l,tmp)); - else { - bprintf(text[FileNotReceived],title); - remove(msgpath); - return; } } - -bputs(text[WritingIndx]); - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,"MAIL",i); - return; } -sprintf(smb.file,"%sMAIL",data_dir); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } - -if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ - smb.status.max_crcs=mail_maxcrcs; - smb.status.max_age=mail_maxage; - smb.status.max_msgs=MAX_SYSMAIL; - smb.status.attr=SMB_EMAIL; - if((i=smb_create(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_CREATE,smb.file,i); - return; } } - -if((i=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return; } - -length=flength(msgpath)+2; /* +2 for translation string */ - -if(length&0xfff00000UL) { - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LEN,msgpath,length); - return; } - -if((i=smb_open_da(&smb))!=0) { - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } -if(sys_misc&SM_FASTMAIL) - offset=smb_fallocdat(&smb,length,1); -else - offset=smb_allocdat(&smb,length,1); -smb_close_da(&smb); - -if((file=open(msgpath,O_RDONLY|O_BINARY))==-1 - || (instream=fdopen(file,"rb"))==NULL) { - smb_freemsgdat(&smb,offset,length,1); - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY); - return; } - -setvbuf(instream,NULL,_IOFBF,2*1024); -fseek(smb.sdt_fp,offset,SEEK_SET); -xlat=XLAT_NONE; -fwrite(&xlat,2,1,smb.sdt_fp); -x=SDT_BLOCK_LEN-2; /* Don't read/write more than 255 */ -while(!feof(instream)) { - memset(buf,0,x); - j=fread(buf,1,x,instream); - if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) - buf[j-1]=buf[j-2]=0; - if(mail_maxcrcs) { - for(i=0;i<j;i++) - crc=ucrc32(buf[i],crc); } - fwrite(buf,j,1,smb.sdt_fp); - x=SDT_BLOCK_LEN; } -fflush(smb.sdt_fp); -fclose(instream); -crc=~crc; - -memset(&msg,0,sizeof(smbmsg_t)); -memcpy(msg.hdr.id,"SHD\x1a",4); -msg.hdr.version=smb_ver(); -msg.hdr.attr=msg.idx.attr=msgattr; -if(mode&WM_FILE) - msg.hdr.auxattr|=MSG_FILEATTACH; -msg.hdr.when_written.time=msg.hdr.when_imported.time=time(NULL); -msg.hdr.when_written.zone=msg.hdr.when_imported.zone=sys_timezone; - -if(mail_maxcrcs) { - i=smb_addcrc(&smb,crc); - if(i) { - smb_freemsgdat(&smb,offset,length,1); - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - bputs("\1r\1h\1iDuplicate message!\r\n"); - return; } } - -msg.hdr.offset=offset; - -username(usernumber,str); -smb_hfield(&msg,RECIPIENT,strlen(str),str); - -sprintf(str,"%u",usernumber); -smb_hfield(&msg,RECIPIENTEXT,strlen(str),str); -msg.idx.to=usernumber; - -strcpy(str,useron.alias); -smb_hfield(&msg,SENDER,strlen(str),str); - -sprintf(str,"%u",useron.number); -smb_hfield(&msg,SENDEREXT,strlen(str),str); -msg.idx.from=useron.number; - -smb_hfield(&msg,SUBJECT,strlen(title),title); -strlwr(title); -msg.idx.subj=crc16(title); - -smb_dfield(&msg,TEXT_BODY,length); - -smb_unlocksmbhdr(&smb); -i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK); -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); - -smb_freemsgmem(&msg); -if(i) { - smb_freemsgdat(&smb,offset,length,1); - errormsg(WHERE,ERR_WRITE,smb.file,i); - return; } - -if(usernumber==1) { - useron.fbacks++; - logon_fbacks++; - putuserrec(useron.number,U_FBACKS,5,itoa(useron.fbacks,tmp,10)); } -else { - useron.emails++; - logon_emails++; - putuserrec(useron.number,U_EMAILS,5,itoa(useron.emails,tmp,10)); } -useron.etoday++; -putuserrec(useron.number,U_ETODAY,5,itoa(useron.etoday,tmp,10)); -bprintf(text[Emailed],username(usernumber,tmp),usernumber); -sprintf(str,"E-mailed %s #%d",username(usernumber,tmp),usernumber); -logline("E+",str); -if(mode&WM_FILE && online==ON_REMOTE) - autohangup(); -if(msgattr&MSG_ANONYMOUS) /* Don't tell user if anonymous */ - return; -for(i=1;i<=sys_nodes;i++) { /* Tell user, if online */ - getnodedat(i,&node,0); - if(node.useron==usernumber && !(node.misc&NODE_POFF) - && (node.status==NODE_INUSE || node.status==NODE_QUIET)) { - sprintf(str,text[EmailNodeMsg],node_num,useron.alias); - putnmsg(i,str); - break; } } -if(i>sys_nodes) { /* User wasn't online, so leave short msg */ - sprintf(str,text[UserSentYouMail],useron.alias); - putsmsg(usernumber,str); } -} diff --git a/src/sbbs2/etext.c b/src/sbbs2/etext.c deleted file mode 100644 index 3a25776c2c..0000000000 --- a/src/sbbs2/etext.c +++ /dev/null @@ -1,12 +0,0 @@ -/* ETEXT.C */ - -#include "etext.h" - -unsigned long VersionNoticeDOS[]={ 3356835823UL,3314249220UL,374396000UL,3922003403UL,2881467347UL,2486246197UL,3111832648UL,4155039507UL,42307UL }; -unsigned long VersionNoticeOS2[]={ 3356835822UL,3314249220UL,374396000UL,3922003403UL,1532953555UL,2026511120UL,3143769178UL,3289372253UL,5547459UL }; -unsigned long VersionNoticeW32[]={ 3356835809UL,3314249220UL,374396000UL,3922003403UL,1586398163UL,88738067UL,3070891308UL,395014492UL,726984154UL }; -unsigned long CopyrightNotice[]={ 2870097002UL,1320491556UL,3387089248UL,1175526980UL,47313347UL,3589138741UL,3110223426UL,207123671UL }; -unsigned long CopyrightAddress[]={ 2870096911UL,1320491556UL,3387089248UL,1175526980UL,47313347UL,3589138741UL,3110223426UL,1280865495UL,730555715UL,2860505763UL,506422981UL,3822509617UL,1593759605UL,2730878830UL,2073372242UL,94853UL }; -unsigned long Unregistered[]={ 4089925185UL,456418497UL }; -unsigned long Synchronet[]={ 3356835779UL,3314249220UL,5216UL }; -unsigned long QWKheader[]={ 3090677251UL,1335831276UL,2558259650UL,3930102115UL,921508403UL,3652942133UL,2169713010UL,4229477056UL,3478431186UL,2126281968UL,510119879UL,3510789355UL,3377605456UL,2160545622UL,2276673404UL,236723209UL,580UL }; diff --git a/src/sbbs2/etext.dat b/src/sbbs2/etext.dat deleted file mode 100644 index 60a479552e..0000000000 --- a/src/sbbs2/etext.dat +++ /dev/null @@ -1,16 +0,0 @@ -VersionNoticeDOS: -Synchronet_BBS_for_DOS__Version_2.30__ -VersionNoticeOS2: -Synchronet_BBS_for_OS/2__Version_2.30__ -VersionNoticeW32: -Synchronet_BBS_for_Win32__Version_2.30__ -CopyrightNotice: -Developed 1990-2000 by Rob Swindell -CopyrightAddress: -Developed 1990-2000 by Rob Swindell;_PO_Box_501,_Yorba_Linda,_CA_92885 -Unregistered: -00000000 -Synchronet: -Synchronet -QWKheader: -Produced_by_Synchronet_BBS__Version_2__Developed 1990-2000 by Rob Swindell diff --git a/src/sbbs2/etext.h b/src/sbbs2/etext.h deleted file mode 100644 index f08e15773d..0000000000 --- a/src/sbbs2/etext.h +++ /dev/null @@ -1,10 +0,0 @@ -/* ETEXT.H */ - -extern unsigned long VersionNoticeDOS[]; -extern unsigned long VersionNoticeOS2[]; -extern unsigned long VersionNoticeW32[]; -extern unsigned long CopyrightNotice[]; -extern unsigned long CopyrightAddress[]; -extern unsigned long Unregistered[]; -extern unsigned long Synchronet[]; -extern unsigned long QWKheader[]; diff --git a/src/sbbs2/exec.c b/src/sbbs2/exec.c deleted file mode 100644 index e62230eb3e..0000000000 --- a/src/sbbs2/exec.c +++ /dev/null @@ -1,1557 +0,0 @@ -#line 1 "EXEC.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -char *readtext(long *line, FILE *stream); - -extern csi_t main_csi; -extern FILE *nodefile_fp,*node_ext_fp,*logfile_fp; - -uint global_str_vars=0; -char **global_str_var=0; -long *global_str_var_name=0; -uint global_int_vars=0; -long *global_int_var=0; -long *global_int_var_name=0; - -char *sysvar_p[MAX_SYSVARS]={NULL}; -int sysvar_pi=0; -long sysvar_l[MAX_SYSVARS]={0L}; -int sysvar_li=0; - -char **getstrvar(csi_t *bin, long name) -{ - int i; - -if(sysvar_pi>=MAX_SYSVARS) sysvar_pi=0; -switch(name) { - case 0: - return((char **)&(bin->str)); - case 0x490873f1: - sysvar_p[sysvar_pi]=useron.alias; - break; - case 0x5de44e8b: - sysvar_p[sysvar_pi]=useron.name; - break; - case 0x979ef1de: - sysvar_p[sysvar_pi]=useron.handle; - break; - case 0xc8cd5fb7: - sysvar_p[sysvar_pi]=useron.comp; - break; - case 0xcc7aca99: - sysvar_p[sysvar_pi]=useron.note; - break; - case 0xa842c43b: - sysvar_p[sysvar_pi]=useron.address; - break; - case 0x4ee1ff3a: - sysvar_p[sysvar_pi]=useron.location; - break; - case 0xf000aa78: - sysvar_p[sysvar_pi]=useron.zipcode; - break; - case 0xcdb7e4a9: - sysvar_p[sysvar_pi]=useron.pass; - break; - case 0x94d59a7a: - sysvar_p[sysvar_pi]=useron.birth; - break; - case 0xec2b8fb8: - sysvar_p[sysvar_pi]=useron.phone; - break; - case 0x08f65a2a: - sysvar_p[sysvar_pi]=useron.modem; - break; - case 0xc7e0e8ce: - sysvar_p[sysvar_pi]=useron.netmail; - break; - case 0xd3606303: - sysvar_p[sysvar_pi]=useron.tmpext; - break; - case 0x3178f9d6: - sysvar_p[sysvar_pi]=useron.comment; - break; - - case 0x41239e21: - sysvar_p[sysvar_pi]=connection; - break; - case 0xe9f1fad0: - sysvar_p[sysvar_pi]=cap_fname; - break; - case 0x90fc82b4: - sysvar_p[sysvar_pi]=cid; - break; - case 0x15755030: - return((char **)&comspec); - - case 0xf19cd046: - sysvar_p[sysvar_pi]=wordwrap; - break; - - default: - if(bin->str_var && bin->str_var_name) - for(i=0;i<bin->str_vars;i++) - if(bin->str_var_name[i]==name) - return((char **)&(bin->str_var[i])); - if(global_str_var && global_str_var_name) - for(i=0;i<global_str_vars;i++) - if(global_str_var_name[i]==name) - return(&(global_str_var[i])); - return(NULL); } - -return((char **)&sysvar_p[sysvar_pi++]); -} - -long *getintvar(csi_t *bin, long name) -{ - int i; - -if(sysvar_li==MAX_SYSVARS) sysvar_li=0; -switch(name) { - case 0: - sysvar_l[sysvar_li]=strtol(bin->str,0,0); - break; - case 0x908ece53: - sysvar_l[sysvar_li]=useron.number; - break; - case 0xdcedf626: - sysvar_l[sysvar_li]=useron.uls; - break; - case 0xc1093f61: - sysvar_l[sysvar_li]=useron.dls; - break; - case 0x2039a29f: - sysvar_l[sysvar_li]=useron.posts; - break; - case 0x4a9f3955: - sysvar_l[sysvar_li]=useron.emails; - break; - case 0x0c8dcf3b: - sysvar_l[sysvar_li]=useron.fbacks; - break; - case 0x9a13bf95: - sysvar_l[sysvar_li]=useron.etoday; - break; - case 0xc9082cbd: - sysvar_l[sysvar_li]=useron.ptoday; - break; - case 0x7c72376d: - sysvar_l[sysvar_li]=useron.timeon; - break; - case 0xac72c50b: - sysvar_l[sysvar_li]=useron.textra; - break; - case 0x04807a11: - sysvar_l[sysvar_li]=useron.logons; - break; - case 0x52996eab: - sysvar_l[sysvar_li]=useron.ttoday; - break; - case 0x098bdfcb: - sysvar_l[sysvar_li]=useron.tlast; - break; - case 0xbd1cee5d: - sysvar_l[sysvar_li]=useron.ltoday; - break; - case 0x07954570: - sysvar_l[sysvar_li]=useron.xedit; - break; - case 0xedf6aa98: - sysvar_l[sysvar_li]=useron.shell; - break; - case 0x328ed476: - sysvar_l[sysvar_li]=useron.level; - break; - case 0x9e70e855: - sysvar_l[sysvar_li]=useron.sex; - break; - case 0x094cc42c: - sysvar_l[sysvar_li]=useron.rows; - break; - case 0xabc4317e: - sysvar_l[sysvar_li]=useron.prot; - break; - case 0x7dd9aac0: - sysvar_l[sysvar_li]=useron.leech; - break; - case 0x7c602a37: - return((long *)&useron.misc); - case 0x61be0d36: - return((long *)&useron.qwk); - case 0x665ac227: - return((long *)&useron.chat); - case 0x951341ab: - return((long *)&useron.flags1); - case 0x0c1a1011: - return((long *)&useron.flags2); - case 0x7b1d2087: - return((long *)&useron.flags3); - case 0xe579b524: - return((long *)&useron.flags4); - case 0x12e7d6d2: - return((long *)&useron.exempt); - case 0xfed3115d: - return((long *)&useron.rest); - case 0xb65dd6d4: - return((long *)&useron.ulb); - case 0xabb91f93: - return((long *)&useron.dlb); - case 0x92fb364f: - return((long *)&useron.cdt); - case 0xd0a99c72: - return((long *)&useron.min); - case 0xd7ae3022: - return((long *)&useron.freecdt); - case 0x1ef214ef: - return((long *)&useron.firston); - case 0x0ea515b1: - return((long *)&useron.laston); - case 0x2aaf9bd3: - return((long *)&useron.expire); - case 0x89c91dc8: - return((long *)&useron.pwmod); - case 0x5b0d0c54: - return((long *)&useron.ns_time); - - case 0xae256560: - return((long *)&cur_rate); - case 0x2b3c257f: - return((long *)&cur_cps); - case 0x1c4455ee: - return((long *)&dte_rate); - case 0x7fbf958e: - return((long *)&lncntr); - case 0x5c1c1500: - return((long *)&tos); - case 0x613b690e: - return((long *)&rows); - case 0x205ace36: - return((long *)&autoterm); - case 0x7d0ed0d1: - return((long *)&console); - case 0xbf31a280: - return((long *)&answertime); - case 0x83aa2a6a: - return((long *)&logontime); - case 0xb50cb889: - return((long *)&ns_time); - case 0xae92d249: - return((long *)&last_ns_time); - case 0x97f99eef: - return((long *)&online); - case 0x381d3c2a: - return((long *)&sys_status); - case 0x7e29c819: - return((long *)&sys_misc); - case 0x11c83294: - return((long *)&sys_psnum); - case 0x02408dc5: - sysvar_l[sysvar_li]=sys_timezone; - break; - case 0x78afeaf1: - sysvar_l[sysvar_li]=sys_pwdays; - break; - case 0xd859385f: - sysvar_l[sysvar_li]=sys_deldays; - break; - case 0x6392dc62: - sysvar_l[sysvar_li]=sys_autodel; - break; - case 0x698d59b4: - sysvar_l[sysvar_li]=sys_nodes; - break; - case 0x6fb1c46e: - sysvar_l[sysvar_li]=sys_exp_warn; - break; - case 0xdf391ca7: - sysvar_l[sysvar_li]=sys_lastnode; - break; - case 0xdd982780: - sysvar_l[sysvar_li]=sys_autonode; - break; - case 0xf53db6c7: - sysvar_l[sysvar_li]=node_scrnlen; - break; - case 0xa1f0fcb7: - sysvar_l[sysvar_li]=node_scrnblank; - break; - case 0x709c07da: - return((long *)&node_misc); - case 0xb17e7914: - sysvar_l[sysvar_li]=node_valuser; - break; - case 0xadae168a: - sysvar_l[sysvar_li]=node_ivt; - break; - case 0x2aa89801: - sysvar_l[sysvar_li]=node_swap; - break; - case 0x4f02623a: - sysvar_l[sysvar_li]=node_minbps; - break; - case 0xe7a7fb07: - sysvar_l[sysvar_li]=node_num; - break; - case 0x6c8e350a: - sysvar_l[sysvar_li]=new_level; - break; - case 0xccfe7c5d: - return((long *)&new_flags1); - case 0x55f72de7: - return((long *)&new_flags2); - case 0x22f01d71: - return((long *)&new_flags3); - case 0xbc9488d2: - return((long *)&new_flags4); - case 0x4b0aeb24: - return((long *)&new_exempt); - case 0x20cb6325: - return((long *)&new_rest); - case 0x31178ba2: - return((long *)&new_cdt); - case 0x7345219f: - return((long *)&new_min); - case 0xb3f64be4: - sysvar_l[sysvar_li]=new_shell; - break; - case 0xa278584f: - return((long *)&new_misc); - case 0x7342a625: - sysvar_l[sysvar_li]=new_expire; - break; - case 0x75dc4306: - sysvar_l[sysvar_li]=new_prot; - break; - case 0xfb394e27: - sysvar_l[sysvar_li]=expired_level; - break; - case 0x89b69753: - return((long *)&expired_flags1); - case 0x10bfc6e9: - return((long *)&expired_flags2); - case 0x67b8f67f: - return((long *)&expired_flags3); - case 0xf9dc63dc: - return((long *)&expired_flags4); - case 0x0e42002a: - return((long *)&expired_exempt); - case 0x4569c62e: - return((long *)&expired_rest); - case 0xfcf3542e: - sysvar_l[sysvar_li]=min_dspace; - break; - case 0xcf9ce02c: - sysvar_l[sysvar_li]=cdt_min_value; - break; - case 0xfcb5b274: - return((long *)&cdt_per_dollar); - case 0x4db200d2: - sysvar_l[sysvar_li]=leech_pct; - break; - case 0x9a7d9cca: - sysvar_l[sysvar_li]=leech_sec; - break; - case 0x396b7167: - return((long *)&netmail_cost); - case 0x5eeaff21: - sysvar_l[sysvar_li]=netmail_misc; - break; - case 0x82d9484e: - return((long *)&inetmail_cost); - case 0xe558c608: - return((long *)&inetmail_misc); - - case 0xc6e8539d: - return((long *)&logon_ulb); - case 0xdb0c9ada: - return((long *)&logon_dlb); - case 0xac58736f: - return((long *)&logon_uls); - case 0xb1bcba28: - return((long *)&logon_dls); - case 0x9c5051c9: - return((long *)&logon_posts); - case 0xc82ba467: - return((long *)&logon_emails); - case 0x8e395209: - return((long *)&logon_fbacks); - case 0x8b12ba9d: - return((long *)&posts_read); - case 0xe51c1956: - sysvar_l[sysvar_li]=(ulong)logfile_fp; - break; - case 0x5a22d4bd: - sysvar_l[sysvar_li]=(ulong)nodefile_fp; - break; - case 0x3a37c26b: - sysvar_l[sysvar_li]=(ulong)node_ext_fp; - break; - - case 0xeb6c9c73: - sysvar_l[sysvar_li]=errorlevel; - break; - - case 0x5aaccfc5: - sysvar_l[sysvar_li]=errno; - break; - - case 0x057e4cd4: - sysvar_l[sysvar_li]=timeleft; - break; - - case 0x1e5052a7: - return((long *)&max_minutes); - case 0xedc643f1: - return((long *)&max_qwkmsgs); - - case 0x430178ec: - return((long *)&uq); - - default: - if(bin->int_var && bin->int_var_name) - for(i=0;i<bin->int_vars;i++) - if(bin->int_var_name[i]==name) - return(&bin->int_var[i]); - if(global_int_var && global_int_var_name) - for(i=0;i<global_int_vars;i++) - if(global_int_var_name[i]==name) - return(&global_int_var[i]); - return(NULL); } - -return(&sysvar_l[sysvar_li++]); -} - -void clearvars(csi_t *bin) -{ -bin->str_vars=0; -bin->str_var=NULL; -bin->str_var_name=NULL; -bin->int_vars=0; -bin->int_var=NULL; -bin->int_var_name=NULL; -bin->files=0; -bin->retval=0; -} - -void freevars(csi_t *bin) -{ - int i; - -if(bin->str_var) { - for(i=0;i<bin->str_vars;i++) - if(bin->str_var[i]) - FREE(bin->str_var[i]); - FREE(bin->str_var); } -if(bin->int_var) - FREE(bin->int_var); -if(bin->str_var_name) - FREE(bin->str_var_name); -if(bin->int_var_name) - FREE(bin->int_var_name); -for(i=0;i<bin->files;i++) - if(bin->file[i]) { - fclose((FILE *)bin->file[i]); - bin->file[i]=0; } -} - -/****************************************************************************/ -/* Copies a new value (str) into the string variable pointed to by p */ -/* re-allocating if necessary */ -/****************************************************************************/ -char *copystrvar(csi_t *csi, char *p, char *str) -{ - char *np; /* New pointer after realloc */ - int i; - -if(p!=csi->str) { - if(p) - for(i=0;i<MAX_SYSVARS;i++) - if(p==sysvar_p[i]) - break; - if(!p || i==MAX_SYSVARS) { /* Not system variable */ - if((np=REALLOC(p,strlen(str)+1))==NULL) - errormsg(WHERE,ERR_ALLOC,"variable",strlen(str)+1); - else - p=np; } } -if(p) - strcpy(p,str); -return(p); -} - - -long exec_bin(uchar *mod, csi_t *csi) -{ - char str[128]; - int i,file; - csi_t bin; - -//lprintf("%s %d\r\n",__FILE__,__LINE__); -memcpy(&bin,csi,sizeof(csi_t)); -clearvars(&bin); - -sprintf(str,"%s%s.BIN",exec_dir,mod); -if((file=nopen(str,O_RDONLY|O_BINARY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY|O_BINARY); - return(-1); } - -//lprintf("%s %d\r\n",__FILE__,__LINE__); -bin.length=filelength(file); -if((bin.cs=(uchar *)MALLOC(bin.length))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,bin.length); - return(-1); } -if(lread(file,bin.cs,bin.length)!=bin.length) { - close(file); - errormsg(WHERE,ERR_READ,str,bin.length); - FREE(bin.cs); - return(-1); } -close(file); - -bin.ip=bin.cs; -bin.rets=bin.cmdrets=bin.misc=0; -//lprintf("%s %d\r\n",__FILE__,__LINE__); -while(exec(&bin)==0) - if(!(bin.misc&CS_OFFLINE_EXEC)) { - checkline(); - if(!online) - break; } -//lprintf("%s %d logic=%d\r\n",__FILE__,__LINE__,bin.logic); -freevars(&bin); -FREE(bin.cs); -csi->logic=bin.logic; -return(bin.retval); -} - -/****************************************************************************/ -/* Skcsi->ip to a specific instruction */ -/****************************************************************************/ -void skipto(csi_t *csi, uchar inst) -{ - int i,j; - -while(csi->ip<csi->cs+csi->length && ((inst&0x80) || *csi->ip!=inst)) { - - if(*csi->ip==CS_IF_TRUE || *csi->ip==CS_IF_FALSE - || (*csi->ip>=CS_IF_GREATER && *csi->ip<=CS_IF_LESS_OR_EQUAL)) { - csi->ip++; - skipto(csi,CS_ENDIF); - csi->ip++; - continue; } - - if(inst==CS_ELSEORENDIF - && (*csi->ip==CS_ELSE || *csi->ip==CS_ENDIF)) - break; - - if(inst==CS_NEXTCASE - && (*csi->ip==CS_CASE || *csi->ip==CS_DEFAULT - || *csi->ip==CS_END_SWITCH)) - break; - - if(*csi->ip==CS_SWITCH) { - csi->ip++; - csi->ip+=4; /* Skip variable name */ - skipto(csi,CS_END_SWITCH); - csi->ip++; - continue; } - - if(*csi->ip==CS_CASE) { - csi->ip++; - csi->ip+=4; /* Skip value */ - skipto(csi,CS_NEXTCASE); - continue; } - - if(*csi->ip==CS_CMDKEY) { - csi->ip+=2; - skipto(csi,CS_END_CMD); - csi->ip++; - continue; } - if(*csi->ip==CS_CMDSTR || *csi->ip==CS_CMDKEYS) { - csi->ip++; /* skip inst */ - while(*(csi->ip++)); /* skip string */ - skipto(csi,CS_END_CMD); - csi->ip++; - continue; } - - if(*csi->ip>=CS_FUNCTIONS) { - csi->ip++; - continue; } - - if(*csi->ip>=CS_MISC) { - switch(*csi->ip) { - case CS_VAR_INSTRUCTION: - csi->ip++; - switch(*(csi->ip++)) { - case SHOW_VARS: - continue; - case PRINT_VAR: - case DEFINE_STR_VAR: - case DEFINE_INT_VAR: - case DEFINE_GLOBAL_STR_VAR: - case DEFINE_GLOBAL_INT_VAR: - case TIME_INT_VAR: - case STRUPR_VAR: - case STRLWR_VAR: - case TRUNCSP_STR_VAR: - case CHKFILE_VAR: - case STRIP_CTRL_STR_VAR: - csi->ip+=4; /* Skip variable name */ - continue; - case GETSTR_VAR: - case GETNAME_VAR: - case GETLINE_VAR: - case GETSTRUPR_VAR: - case SHIFT_STR_VAR: - case SEND_FILE_VIA_VAR: - case RECEIVE_FILE_VIA_VAR: - csi->ip+=4; /* Skip variable name */ - csi->ip++; /* Skip char */ - continue; - case PRINTTAIL_VAR_MODE: - csi->ip++; /* Skip length */ - case PRINTFILE_VAR_MODE: - case GETNUM_VAR: - csi->ip+=4; /* Skip variable name */ - csi->ip+=2; /* Skip max num */ - continue; - case STRNCMP_VAR: - csi->ip++; /* Skip length */ - case SET_STR_VAR: - case COMPARE_STR_VAR: - case CAT_STR_VAR: - case STRSTR_VAR: - csi->ip+=4; /* Skip variable name */ - while(*(csi->ip++)); /* skip string */ - continue; - case FORMAT_TIME_STR: - csi->ip+=4; /* Skip destination variable */ - while(*(csi->ip++)); /* Skip string */ - csi->ip+=4; /* Skip int variable */ - continue; - case FORMAT_STR_VAR: /* SPRINTF */ - csi->ip+=4; /* Skip destination variable */ - case VAR_PRINTF: - while(*(csi->ip++)); /* Skip string */ - j=*(csi->ip++); /* Skip number of arguments */ - for(i=0;i<j;i++) - csi->ip+=4; /* Skip arguments */ - continue; - case SEND_FILE_VIA: - case RECEIVE_FILE_VIA: - csi->ip++; /* Skip prot */ - while(*(csi->ip++)); /* Skip filepath */ - continue; - case GETSTR_MODE: - case STRNCMP_VARS: - csi->ip++; /* Skip length */ - default: - csi->ip+=8; /* Skip two variable names or var & val */ - continue; } - - case CS_FIO_FUNCTION: - csi->ip++; - switch(*(csi->ip++)) { - case FIO_OPEN: - csi->ip+=4; /* File handle */ - csi->ip+=2; /* Access */ - while(*(csi->ip++)); /* path/filename */ - continue; - case FIO_CLOSE: - case FIO_FLUSH: - case FIO_EOF: - case REMOVE_FILE: - case REMOVE_DIR: - case CHANGE_DIR: - case MAKE_DIR: - case REWIND_DIR: - case CLOSE_DIR: - csi->ip+=4; /* File handle */ - continue; - case FIO_SET_ETX: - csi->ip++; - continue; - case FIO_PRINTF: - csi->ip+=4; /* File handle */ - while(*(csi->ip++)); /* String */ - j=*(csi->ip++); /* Number of arguments */ - for(i=0;i<j;i++) - csi->ip+=4; /* Arguments */ - continue; - case FIO_READ: - case FIO_WRITE: - case FIO_SEEK: - case FIO_SEEK_VAR: - case FIO_OPEN_VAR: - csi->ip+=4; /* File handle */ - csi->ip+=4; /* Variable */ - csi->ip+=2; /* Length/access */ - continue; - case FIO_READ_VAR: - case FIO_WRITE_VAR: - csi->ip+=4; /* File handle */ - csi->ip+=4; /* Buf Variable */ - csi->ip+=4; /* Length Variable */ - continue; - default: - csi->ip+=4; /* File handle */ - csi->ip+=4; /* Variable */ - continue; } - - case CS_COMPARE_ARS: - csi->ip++; - csi->ip+=(*csi->ip); - csi->ip++; - break; - case CS_TOGGLE_USER_MISC: - case CS_COMPARE_USER_MISC: - case CS_TOGGLE_USER_CHAT: - case CS_COMPARE_USER_CHAT: - case CS_TOGGLE_USER_QWK: - case CS_COMPARE_USER_QWK: - csi->ip+=5; - break; - case CS_REPLACE_TEXT: - csi->ip+=3; /* skip inst and text # */ - while(*(csi->ip++)); /* skip string */ - break; - case CS_USE_INT_VAR: - csi->ip+=7; // inst, var, offset, len - break; - default: - csi->ip++; } - continue; } - - if(*csi->ip==CS_ONE_MORE_BYTE) { - csi->ip++; /* skip extension */ - csi->ip++; /* skip instruction */ - continue; } - - if(*csi->ip==CS_TWO_MORE_BYTES) { - csi->ip++; /* skip extension */ - csi->ip++; /* skip instruction */ - csi->ip++; /* skip argument */ - continue; } - - if(*csi->ip==CS_THREE_MORE_BYTES) { - csi->ip++; /* skip extension */ - csi->ip++; /* skip instruction */ - csi->ip+=2; /* skip argument */ - continue; } - - if(*csi->ip==CS_STR_FUNCTION) { - csi->ip++; /* skip extension */ - csi->ip++; /* skip instruction */ - while(*(csi->ip++)); /* skip string */ - continue; } - - if(*csi->ip>=CS_ASCIIZ) { - csi->ip++; /* skip inst */ - while(*(csi->ip++)); /* skip string */ - continue; } - - if(*csi->ip>=CS_THREE_BYTE) { - csi->ip+=3; - continue; } - - if(*csi->ip>=CS_TWO_BYTE) { - csi->ip+=2; - continue; } - - csi->ip++; } -} - - -int exec(csi_t *csi) -{ - uchar str[256],tmp2[128],buf[1025],*path,ch,*p,**pp,**pp1,**pp2; - int i,j,k,s,file,x,y; - long l,*lp,*lp1,*lp2; - stats_t stats; - time_t t; - FILE *stream; - -//lprintf("line %d (%d %d %d)\r\n",__LINE__,curgrp,cursub[curgrp],usrsub[curgrp]); -#if 0 -if(curgrp>=total_grps) - curgrp=0; -if(cursub[curgrp]>=total_subs) - cursub[curgrp]=0; -if(curlib>=total_libs) - curlib=0; -if(curdir[curlib]>=total_dirs) - curdir[curlib]=0; -#endif - -if(usrgrps) - cursubnum=usrsub[curgrp][cursub[curgrp]]; /* Used for ARS */ -else - cursubnum=INVALID_SUB; -if(usrlibs) { - curdirnum=usrdir[curlib][curdir[curlib]]; /* Used for ARS */ - path=dir[usrdir[curlib][curdir[curlib]]]->path; } -else { - curdirnum=INVALID_DIR; - path=nulstr; } -now=time(NULL); - -if(csi->ip>=csi->cs+csi->length) - return(1); - -//lprintf("%04X: %02X ",(uint)(csi->ip-csi->cs),*csi->ip); - -if(*csi->ip>=CS_FUNCTIONS) - return(exec_function(csi)); - -/**********************************************/ -/* Miscellaneous variable length instructions */ -/**********************************************/ - -if(*csi->ip>=CS_MISC) - return(exec_misc(csi,path)); - -/********************************/ -/* ASCIIZ argument instructions */ -/********************************/ - -if(*csi->ip>=CS_ASCIIZ) { - switch(*(csi->ip++)) { - case CS_STR_FUNCTION: - switch(*(csi->ip++)) { - case CS_LOGIN: - csi->logic=login(csi->str,csi->ip); - break; - case CS_LOAD_TEXT: - csi->logic=LOGIC_FALSE; - for(i=0;i<TOTAL_TEXT;i++) - if(text[i]!=text_sav[i]) { - if(text[i]!=nulstr) - FREE(text[i]); - text[i]=text_sav[i]; } - sprintf(str,"%s%s.DAT" - ,ctrl_dir,cmdstr(csi->ip,path,csi->str,buf)); - if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - break; } - for(i=0;i<TOTAL_TEXT && !feof(stream);i++) { - if((text[i]=readtext((long *)NULL,stream))==NULL) { - i--; - continue; } - if(!strcmp(text[i],text_sav[i])) { /* If identical */ - FREE(text[i]); /* Don't alloc */ - text[i]=text_sav[i]; } - else if(text[i][0]==0) { - FREE(text[i]); - text[i]=nulstr; } } - if(i<TOTAL_TEXT) { - fclose(stream); - errormsg(WHERE,ERR_READ,str,TOTAL_TEXT); - break; } - fclose(stream); - csi->logic=LOGIC_TRUE; - break; - default: - errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); - break; } - while(*(csi->ip++)); /* Find NULL */ - return(0); - case CS_LOG: - log(cmdstr(csi->ip,path,csi->str,buf)); - break; - case CS_GETCMD: - csi->cmd=getkeys(csi->ip,0); - if((char)csi->cmd==-1) - csi->cmd=3; - break; - case CS_CMDSTR: - if(stricmp(csi->str,csi->ip)) { - while(*(csi->ip++)); /* Find NULL */ - skipto(csi,CS_END_CMD); - csi->ip++; - return(0); } - break; - case CS_CMDKEYS: - for(i=0;csi->ip[i];i++) - if(csi->cmd==csi->ip[i]) - break; - if(!csi->ip[i]) { - while(*(csi->ip++)); /* Find NULL */ - skipto(csi,CS_END_CMD); - csi->ip++; - return(0); } - break; - case CS_GET_TEMPLATE: - gettmplt(csi->str,csi->ip,K_LINE); - if(sys_status&SS_ABORT) - csi->str[0]=0; - csi->cmd=csi->str[0]; - break; - case CS_TRASHCAN: - csi->logic=!trashcan(csi->str,csi->ip); - break; - case CS_CREATE_SIF: - create_sif_dat(csi->ip,csi->str); - break; - case CS_READ_SIF: - read_sif_dat(csi->ip,csi->str); - break; - case CS_MNEMONICS: - mnemonics(csi->ip); - break; - case CS_PRINT: - putmsg(cmdstr(csi->ip,path,csi->str,buf),P_SAVEATR|P_NOABORT); - break; - case CS_PRINT_LOCAL: - lputs(cmdstr(csi->ip,path,csi->str,buf)); - break; - case CS_PRINT_REMOTE: - putcom(cmdstr(csi->ip,path,csi->str,buf)); - break; - case CS_PRINTFILE: - printfile(cmdstr(csi->ip,path,csi->str,buf),P_SAVEATR); - break; - case CS_PRINTFILE_REMOTE: - if(online!=ON_REMOTE || !(console&CON_R_ECHO)) - break; - console&=~CON_L_ECHO; - printfile(cmdstr(csi->ip,path,csi->str,buf),P_SAVEATR); - console|=CON_L_ECHO; - break; - case CS_PRINTFILE_LOCAL: - if(!(console&CON_L_ECHO)) - break; - console&=~CON_R_ECHO; - printfile(cmdstr(csi->ip,path,csi->str,buf),P_SAVEATR); - console|=CON_R_ECHO; - break; - case CS_CHKFILE: - csi->logic=!fexist(cmdstr(csi->ip,path,csi->str,buf)); - break; - case CS_EXEC: - external(cmdstr(csi->ip,path,csi->str,buf),0); - break; - case CS_EXEC_INT: - external(cmdstr(csi->ip,path,csi->str,buf),EX_OUTR|EX_INR|EX_OUTL); - break; - case CS_EXEC_XTRN: - for(i=0;i<total_xtrns;i++) - if(!stricmp(xtrn[i]->code,csi->ip)) - break; - if(i<total_xtrns) - exec_xtrn(i); - break; - case CS_EXEC_BIN: - exec_bin(cmdstr(csi->ip,path,csi->str,buf),csi); - break; - case CS_YES_NO: - csi->logic=!yesno(cmdstr(csi->ip,path,csi->str,buf)); - break; - case CS_NO_YES: - csi->logic=!noyes(cmdstr(csi->ip,path,csi->str,buf)); - break; - case CS_MENU: - menu(cmdstr(csi->ip,path,csi->str,buf)); - break; - case CS_SETSTR: - strcpy(csi->str,cmdstr(csi->ip,path,csi->str,buf)); - break; - case CS_SET_MENU_DIR: - cmdstr(csi->ip,path,csi->str,menu_dir); - break; - case CS_SET_MENU_FILE: - cmdstr(csi->ip,path,csi->str,menu_file); - break; - case CS_COMPARE_STR: - csi->logic=stricmp(csi->str,cmdstr(csi->ip,path,csi->str,buf)); - break; - case CS_COMPARE_KEYS: - for(i=0;csi->ip[i];i++) - if(csi->cmd==csi->ip[i]) - break; - if(csi->ip[i]) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - break; - case CS_COMPARE_WORD: - csi->logic=strnicmp(csi->str,csi->ip,strlen(csi->ip)); - break; - default: - errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); - break; } - while(*(csi->ip++)); /* Find NULL */ - return(0); } - -if(*csi->ip>=CS_THREE_BYTE) { - switch(*(csi->ip++)) { - case CS_THREE_MORE_BYTES: - switch(*(csi->ip++)) { - } - errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); - return(0); - case CS_GOTO: - csi->ip=csi->cs+*((ushort *)(csi->ip)); - return(0); - case CS_CALL: - csi->ret[csi->rets++]=csi->ip+2; - csi->ip=csi->cs+*((ushort *)(csi->ip)); - return(0); - case CS_MSWAIT: - mswait(*(ushort *)csi->ip); - csi->ip+=2; - return(0); - case CS_TOGGLE_NODE_MISC: - getnodedat(node_num,&thisnode,1); - thisnode.misc^=*(ushort *)csi->ip; - csi->ip+=2; - putnodedat(node_num,thisnode); - return(0); - case CS_COMPARE_NODE_MISC: - getnodedat(node_num,&thisnode,0); - if((thisnode.misc&*(ushort *)csi->ip)==*(ushort *)csi->ip) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - csi->ip+=2; - return(0); - case CS_ADJUST_USER_CREDITS: - i=*(short *)csi->ip; - l=i*1024L; - if(l<0) - subtract_cdt(-l); - else - useron.cdt=adjustuserrec(useron.number,U_CDT,10,l); - csi->ip+=2; - return(0); - case CS_ADJUST_USER_MINUTES: - i=*(short *)csi->ip; - useron.min=adjustuserrec(useron.number,U_MIN,10,i); - csi->ip+=2; - return(0); - case CS_GETNUM: - i=*(short *)csi->ip; - csi->ip+=2; - l=getnum(i); - if(l<=0) { - csi->str[0]=0; - csi->logic=LOGIC_FALSE; } - else { - sprintf(csi->str,"%lu",l); - csi->logic=LOGIC_TRUE; } - return(0); - - case CS_TOGGLE_USER_FLAG: - i=*(csi->ip++); - ch=*(csi->ip++); - switch(i) { - case '1': - useron.flags1^=FLAG(ch); - putuserrec(useron.number,U_FLAGS1,8 - ,ultoa(useron.flags1,tmp,16)); - break; - case '2': - useron.flags2^=FLAG(ch); - putuserrec(useron.number,U_FLAGS2,8 - ,ultoa(useron.flags2,tmp,16)); - break; - case '3': - useron.flags3^=FLAG(ch); - putuserrec(useron.number,U_FLAGS3,8 - ,ultoa(useron.flags3,tmp,16)); - break; - case '4': - useron.flags4^=FLAG(ch); - putuserrec(useron.number,U_FLAGS4,8 - ,ultoa(useron.flags4,tmp,16)); - break; - case 'R': - useron.rest^=FLAG(ch); - putuserrec(useron.number,U_REST,8 - ,ultoa(useron.rest,tmp,16)); - break; - case 'E': - useron.exempt^=FLAG(ch); - putuserrec(useron.number,U_EXEMPT,8 - ,ultoa(useron.exempt,tmp,16)); - break; - default: - errormsg(WHERE,ERR_CHK,"user flag type",*(csi->ip-2)); - return(0); } - statusline(); - return(0); - case CS_REVERT_TEXT: - i=*(ushort *)csi->ip; - csi->ip+=2; - if((ushort)i==0xffff) { - for(i=0;i<TOTAL_TEXT;i++) { - if(text[i]!=text_sav[i] && text[i]!=nulstr) - FREE(text[i]); - text[i]=text_sav[i]; } - return(0); } - i--; - if(i>=TOTAL_TEXT) { - errormsg(WHERE,ERR_CHK,"revert text #",i); - return(0); } - if(text[i]!=text_sav[i] && text[i]!=nulstr) - FREE(text[i]); - text[i]=text_sav[i]; - return(0); - default: - errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); - return(0); } } - -if(*csi->ip>=CS_TWO_BYTE) { - switch(*(csi->ip++)) { - case CS_TWO_MORE_BYTES: - switch(*(csi->ip++)) { - case CS_USER_EVENT: - user_event(*(csi->ip++)); - return(0); - } - errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); - return(0); - case CS_SETLOGIC: - csi->logic=*csi->ip++; - return(0); - case CS_CMDKEY: - if( ((*csi->ip)==CS_DIGIT && isdigit(csi->cmd)) - || ((*csi->ip)==CS_EDIGIT && csi->cmd&0x80 - && isdigit(csi->cmd&0x7f))) { - csi->ip++; - return(0); } - if(csi->cmd!=*csi->ip) { - csi->ip++; - skipto(csi,CS_END_CMD); } /* skip code */ - csi->ip++; /* skip key */ - return(0); - case CS_NODE_ACTION: - action=*csi->ip++; - return(0); - case CS_NODE_STATUS: - getnodedat(node_num,&thisnode,1); - thisnode.status=*csi->ip++; - putnodedat(node_num,thisnode); - return(0); - case CS_GETSTR: - csi->logic=LOGIC_TRUE; - getstr(csi->str,*csi->ip++,0); - if(sys_status&SS_ABORT) { - csi->str[0]=0; - csi->logic=LOGIC_FALSE; } - if(csi->str[0]=='/' && csi->str[1]) - csi->cmd=csi->str[1]|0x80; - else - csi->cmd=csi->str[0]; - return(0); - case CS_GETLINE: - getstr(csi->str,*csi->ip++,K_LINE); - if(sys_status&SS_ABORT) - csi->str[0]=0; - if(csi->str[0]=='/' && csi->str[1]) - csi->cmd=csi->str[1]|0x80; - else - csi->cmd=csi->str[0]; - return(0); - case CS_GETSTRUPR: - getstr(csi->str,*csi->ip++,K_UPPER); - if(sys_status&SS_ABORT) - csi->str[0]=0; - if(csi->str[0]=='/' && csi->str[1]) - csi->cmd=csi->str[1]|0x80; - else - csi->cmd=csi->str[0]; - return(0); - case CS_GETNAME: - getstr(csi->str,*csi->ip++,K_UPRLWR); - if(sys_status&SS_ABORT) - csi->str[0]=0; - return(0); - case CS_SHIFT_STR: - if(strlen(csi->str)>=*csi->ip) - memmove(csi->str,csi->str+(*csi->ip) - ,strlen(csi->str)+1); - csi->ip++; - return(0); - case CS_COMPARE_KEY: - if( ((*csi->ip)==CS_DIGIT && isdigit(csi->cmd)) - || ((*csi->ip)==CS_EDIGIT && csi->cmd&0x80 - && isdigit(csi->cmd&0x7f))) { - csi->ip++; - csi->logic=LOGIC_TRUE; } - else { - if(csi->cmd==*(csi->ip++)) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; } - return(0); - case CS_SET_USER_LEVEL: - useron.level=*(csi->ip++); - putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,tmp,10)); - statusline(); - return(0); - case CS_SET_USER_STRING: - csi->logic=LOGIC_FALSE; - if(!csi->str[0]) { - csi->ip++; - return(0); } - switch(*(csi->ip++)) { - case USER_STRING_ALIAS: - if(!isalpha(csi->str[0]) || trashcan(csi->str,"NAME")) - break; - i=matchuser(csi->str); - if(i && i!=useron.number) - break; - sprintf(useron.alias,"%.*s",LEN_ALIAS,csi->str); - putuserrec(useron.number,U_ALIAS,LEN_ALIAS,useron.alias); - putusername(useron.number,useron.alias); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_REALNAME: - if(trashcan(csi->str,"NAME")) - break; - if(uq&UQ_DUPREAL - && userdatdupe(useron.number,U_NAME,LEN_NAME - ,csi->str,0)) - break; - sprintf(useron.name,"%.*s",LEN_NAME,csi->str); - putuserrec(useron.number,U_NAME,LEN_NAME - ,useron.name); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_HANDLE: - if(trashcan(csi->str,"NAME")) - break; - if(uq&UQ_DUPHAND - && userdatdupe(useron.number,U_HANDLE,LEN_HANDLE - ,csi->str,0)) - break; - sprintf(useron.handle,"%.*s",LEN_HANDLE,csi->str); - putuserrec(useron.number,U_HANDLE,LEN_HANDLE - ,useron.handle); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_COMPUTER: - sprintf(useron.comp,"%.*s",LEN_COMP,csi->str); - putuserrec(useron.number,U_COMP,LEN_COMP - ,useron.comp); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_NOTE: - sprintf(useron.note,"%.*s",LEN_NOTE,csi->str); - putuserrec(useron.number,U_NOTE,LEN_NOTE - ,useron.note); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_ADDRESS: - sprintf(useron.address,"%.*s",LEN_ADDRESS,csi->str); - putuserrec(useron.number,U_ADDRESS,LEN_ADDRESS - ,useron.address); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_LOCATION: - sprintf(useron.location,"%.*s",LEN_LOCATION,csi->str); - putuserrec(useron.number,U_LOCATION,LEN_LOCATION - ,useron.location); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_ZIPCODE: - sprintf(useron.zipcode,"%.*s",LEN_ZIPCODE,csi->str); - putuserrec(useron.number,U_ZIPCODE,LEN_ZIPCODE - ,useron.zipcode); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_PASSWORD: - sprintf(useron.pass,"%.*s",LEN_PASS,csi->str); - putuserrec(useron.number,U_PASS,LEN_PASS - ,useron.pass); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_BIRTHDAY: - if(!getage(csi->str)) - break; - sprintf(useron.birth,"%.*s",LEN_BIRTH,csi->str); - putuserrec(useron.number,U_BIRTH,LEN_BIRTH - ,useron.birth); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_PHONE: - if(trashcan(csi->str,"PHONE")) - break; - sprintf(useron.phone,"%.*s",LEN_PHONE,csi->str); - putuserrec(useron.number,U_PHONE,LEN_PHONE - ,useron.phone); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_MODEM: - sprintf(useron.modem,"%.*s",LEN_MODEM,csi->str); - putuserrec(useron.number,U_MODEM,LEN_MODEM - ,useron.phone); - csi->logic=LOGIC_TRUE; - break; - case USER_STRING_COMMENT: - sprintf(useron.comment,"%.*s",LEN_COMMENT,csi->str); - putuserrec(useron.number,U_COMMENT,LEN_COMMENT - ,useron.comment); - csi->logic=LOGIC_TRUE; - break; - default: - errormsg(WHERE,ERR_CHK,"user string type",*(csi->ip-1)); - return(0); } - statusline(); - return(0); - default: - errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); - return(0); } } - - -/*********************************/ -/* Single Byte Instrcutions ONLY */ -/*********************************/ - -switch(*(csi->ip++)) { - case CS_ONE_MORE_BYTE: /* Just one MORE byte */ - switch(*(csi->ip++)) { - case CS_OFFLINE: - csi->misc|=CS_OFFLINE_EXEC; - return(0); - case CS_ONLINE: - csi->misc&=~CS_OFFLINE_EXEC; - return(0); - case CS_NEWUSER: - newuser(); - return(0); - case CS_LOGON: - if(logon()) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - return(0); - case CS_LOGOUT: - logout(); - return(0); - case CS_EXIT: - return(1); - default: - errormsg(WHERE,ERR_CHK,"one byte extended function" - ,*(csi->ip-1)); - return(0); } - case CS_CRLF: - CRLF; - return(0); - case CS_CLS: - CLS; - return(0); - case CS_PAUSE: - pause(); - return(0); - case CS_PAUSE_RESET: - lncntr=0; - return(0); - case CS_GETLINES: - getlines(); - return(0); - case CS_HANGUP: - hangup(); - return(0); - case CS_LOGKEY: - logch(csi->cmd,0); - return(0); - case CS_LOGKEY_COMMA: - logch(csi->cmd,1); - return(0); - case CS_LOGSTR: - log(csi->str); - return(0); - case CS_CHKSYSPASS: - csi->logic=!chksyspass(0); - return(0); - case CS_PUT_NODE: - getnodedat(node_num,&thisnode,1); - putnodedat(node_num,thisnode); - return(0); - case CS_SYNC: - SYNC; - return(0); - case CS_ASYNC: - ASYNC; - return(0); - case CS_RIOSYNC: - RIOSYNC(0); - return(0); - case CS_GETTIMELEFT: - gettimeleft(); - return(0); - case CS_RETURN: - if(!csi->rets) - return(1); - csi->ip=csi->ret[--csi->rets]; - return(0); - case CS_GETKEY: - csi->cmd=getkey(K_UPPER); - return(0); - case CS_INKEY: - csi->cmd=toupper(inkey(K_GETSTR)); - if(csi->cmd) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - return(0); - case CS_GETKEYE: - csi->cmd=getkey(K_UPPER); - if(csi->cmd=='/') { - outchar('/'); - csi->cmd=getkey(K_UPPER); - csi->cmd|=0x80; } - return(0); - case CS_GETFILESPEC: - if(getfilespec(csi->str)) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - return(0); - case CS_SAVELINE: - SAVELINE; - return(0); - case CS_RESTORELINE: - RESTORELINE; - return(0); - case CS_SELECT_SHELL: - csi->logic=LOGIC_TRUE; - for(i=0;i<total_shells;i++) - uselect(1,i,"Command Shell",shell[i]->name,shell[i]->ar); - if((i=uselect(0,useron.shell,0,0,0))>=0) { - useron.shell=i; - putuserrec(useron.number,U_SHELL,8,shell[i]->code); } - else - csi->logic=LOGIC_FALSE; - return(0); - case CS_SET_SHELL: - csi->logic=LOGIC_TRUE; - for(i=0;i<total_shells;i++) - if(!stricmp(csi->str,shell[i]->code) - && chk_ar(shell[i]->ar,useron)) - break; - if(i<total_shells) { - useron.shell=i; - putuserrec(useron.number,U_SHELL,8,shell[i]->code); } - else - csi->logic=LOGIC_FALSE; - return(0); - - case CS_SELECT_EDITOR: - csi->logic=LOGIC_TRUE; - for(i=0;i<total_xedits;i++) - uselect(1,i,"External Editor",xedit[i]->name,xedit[i]->ar); - if(useron.xedit) useron.xedit--; - if((i=uselect(0,useron.xedit,0,0,0))>=0) { - useron.xedit=i+1; - putuserrec(useron.number,U_XEDIT,8,xedit[i]->code); } - else - csi->logic=LOGIC_FALSE; - return(0); - case CS_SET_EDITOR: - csi->logic=LOGIC_TRUE; - for(i=0;i<total_xedits;i++) - if(!stricmp(csi->str,xedit[i]->code) - && chk_ar(xedit[i]->ar,useron)) - break; - if(i<total_xedits) { - useron.xedit=i+1; - putuserrec(useron.number,U_XEDIT,8,xedit[i]->code); } - else - csi->logic=LOGIC_FALSE; - return(0); - - case CS_CLEAR_ABORT: - sys_status&=~SS_ABORT; - return(0); - case CS_FINDUSER: - i=finduser(csi->str); - if(i) { - csi->logic=LOGIC_TRUE; - username(i,csi->str); } - else - csi->logic=LOGIC_FALSE; - return(0); - case CS_UNGETKEY: - ungetkey(csi->cmd&0x7f); - return(0); - case CS_UNGETSTR: - j=strlen(csi->str); - for(i=0;i<j;i++) - ungetkey(csi->str[i]); - return(0); - case CS_PRINTKEY: - if((csi->cmd&0x7f)>=SP) - outchar(csi->cmd&0x7f); - return(0); - case CS_PRINTSTR: - putmsg(csi->str,P_SAVEATR|P_NOABORT); - return(0); - case CS_CMD_HOME: - csi->cmdret[csi->cmdrets++]=(csi->ip-1); - return(0); - case CS_END_CMD: - if(csi->cmdrets) - csi->ip=csi->cmdret[--csi->cmdrets]; -/* Removed 06/07/95 - else - errormsg(WHERE,ERR_CHK,"misplaced end_cmd",(csi->ip-csi->cs)-1); -*/ - return(0); - case CS_CMD_POP: - if(csi->cmdrets) - csi->cmdrets--; - return(0); - case CS_IF_TRUE: - if(csi->logic!=LOGIC_TRUE) { - skipto(csi,CS_ELSEORENDIF); - csi->ip++; } - return(0); - case CS_IF_GREATER: - if(csi->logic!=LOGIC_GREATER) { - skipto(csi,CS_ELSEORENDIF); - csi->ip++; } - return(0); - case CS_IF_GREATER_OR_EQUAL: - if(csi->logic!=LOGIC_GREATER && csi->logic!=LOGIC_EQUAL) { - skipto(csi,CS_ELSEORENDIF); - csi->ip++; } - return(0); - case CS_IF_LESS: - if(csi->logic!=LOGIC_LESS) { - skipto(csi,CS_ELSEORENDIF); - csi->ip++; } - return(0); - case CS_IF_LESS_OR_EQUAL: - if(csi->logic!=LOGIC_LESS && csi->logic!=LOGIC_EQUAL) { - skipto(csi,CS_ELSEORENDIF); - csi->ip++; } - return(0); - case CS_IF_FALSE: - if(csi->logic==LOGIC_TRUE) { - skipto(csi,CS_ELSEORENDIF); - csi->ip++; } - return(0); - case CS_ELSE: - skipto(csi,CS_ENDIF); - csi->ip++; - return(0); - case CS_END_CASE: - skipto(csi,CS_END_SWITCH); - csi->misc&=~CS_IN_SWITCH; - csi->ip++; - return(0); - case CS_DEFAULT: - case CS_END_SWITCH: - csi->misc&=~CS_IN_SWITCH; - return(0); - case CS_ENDIF: - return(0); - default: - errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); - return(0); } -} - diff --git a/src/sbbs2/execdos/execdos.c b/src/sbbs2/execdos/execdos.c deleted file mode 100644 index 30091ddcec..0000000000 --- a/src/sbbs2/execdos/execdos.c +++ /dev/null @@ -1,271 +0,0 @@ -/* EXECDOS.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Execute DOS external BBS programs from OS/2 BBS */ - -#include "sbbs.h" - -extern unsigned _heaplen=2048; - -extern uint riobp; - -ulong user_misc; - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - uint c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - -void interrupt (*oldfunc)(void); - -/*****************************************************************************/ -/* Interrupt routine to expand WWIV Ctrl-C# codes into ANSI escape sequences */ -/*****************************************************************************/ -void interrupt wwiv_expand() -{ - char str[256],al; - static int ctrl_c; - int i,j; - -al=_AL; -if(al!=3 && !ctrl_c) - oldfunc(); -else if(al!=3 && ctrl_c) { - ctrl_c=0; - if(user_misc&ANSI) { - switch(al) { - default: - strcpy(str,"\x1b[0m"); /* low grey */ - break; - case '1': - strcpy(str,"\x1b[0;1;36m"); /* high cyan */ - break; - case '2': - strcpy(str,"\x1b[0;1;33m"); /* high yellow */ - break; - case '3': - strcpy(str,"\x1b[0;35m"); /* low magenta */ - break; - case '4': - strcpy(str,"\x1b[0;1;44m"); /* white on blue */ - break; - case '5': - strcpy(str,"\x1b[0;32m"); /* low green */ - break; - case '6': - strcpy(str,"\x1b[0;1;5;31m"); /* high blinking red */ - break; - case '7': - strcpy(str,"\x1b[0;1;34m"); /* high blue */ - break; - case '8': - strcpy(str,"\x1b[0;34m"); /* low blue */ - break; - case '9': - strcpy(str,"\x1b[0;36m"); /* low cyan */ - break; } - j=strlen(str); - for(i=0;i<j;i++) { - _AL=str[i]; - oldfunc(); } } } -else - ctrl_c=1; -} - -int main(int argc, char **argv) -{ - char str[256],commandline[128],sbbsnode[81],sbbsnnum[81],msr[31]="0" - ,user_name[LEN_NAME+1] - ,user_alias[LEN_ALIAS+1] - ,user_phone[LEN_PHONE+1] - ,user_location[LEN_LOCATION+1] - ,user_age - ,user_sex - ,user_level - ,node_scrnlen - ,*envvar[30],*arg[30],c,d; - int i,file,base,com_base=0,com_irq,dte_rate,rmode,mode,node_num,col,row; - FILE *stream; - -if(argc<2) { - printf("This program is for the internal use of Synchronet.\r\n"); - return(-1); } - -sprintf(sbbsnode,"SBBSNODE=%s",argv[1]); -putenv(sbbsnode); -sprintf(str,"%sEXECDOS.DAT",argv[1]); -if((file=open(str,O_RDONLY|O_BINARY))!=-1) { - stream=fdopen(file,"rb"); - str[0]=0; - fgets(str,128,stream); - truncsp(str); - if(strcmp(str,"V1.00")) { - printf("\7EXECDOS: SBBS VERSION MISMATCH!\7\r\n"); - delay(5000); - return(-1); } - str[0]=0; - fgets(str,128,stream); - com_base=strtoul(str,0,16); - str[0]=0; - fgets(str,128,stream); - com_irq=atoi(str); - str[0]=0; - fgets(str,128,stream); - dte_rate=atoi(str); - str[0]=0; - fgets(str,128,stream); - rmode=strtoul(str,0,16); - str[0]=0; - fgets(str,128,stream); - mode=strtoul(str,0,16); - str[0]=0; - fgets(str,128,stream); - user_misc=strtoul(str,0,16); - str[0]=0; - fgets(str,128,stream); - node_num=atoi(str); - if(node_num) { - sprintf(sbbsnnum,"SBBSNNUM=%u",node_num); - putenv(sbbsnnum); } - fgets(commandline,128,stream); - truncsp(commandline); - str[0]=0; - fgets(str,128,stream); - i=atoi(str); /* total env vars */ - while(i--) { - str[0]=0; - fgets(str,128,stream); - truncsp(str); - if((envvar[i]=MALLOC(strlen(str)+1))!=NULL) { - strcpy(envvar[i],str); - putenv(envvar[i]); } } - str[0]=0; - fgets(str,128,stream); - truncsp(str); - sprintf(user_alias,"%.*s",LEN_ALIAS,str); - str[0]=0; - fgets(str,128,stream); - truncsp(str); - sprintf(user_name,"%.*s",LEN_NAME,str); - str[0]=0; - fgets(str,128,stream); - user_level=atoi(str); - str[0]=0; - fgets(str,128,stream); - user_age=atoi(str); - str[0]=0; - fgets(str,128,stream); - user_sex=str[0]; - str[0]=0; - fgets(str,128,stream); - truncsp(str); - sprintf(user_phone,"%.*s",LEN_PHONE,str); - str[0]=0; - fgets(str,128,stream); - truncsp(str); - sprintf(user_location,"%.*s",LEN_LOCATION,str); - fclose(stream); } - -printf("\nEXECDOS: %s\n",commandline); - -if(rmode && com_base) { /* Capture the port and intercept I/O */ - base=0xffff; - switch(com_base) { - case 0xb: - rioctl(I14PC); - break; - case 0xffff: - case 0xd: - rioctl(I14DB); - break; - case 0xe: - rioctl(I14PS); - break; - case 0xf: - rioctl(I14FO); - break; - default: - base=com_base; - break; } - - if(rioini(base,com_irq)) { - printf("\7EXECDOS: Error initializing COM port (%x,%d)\7\r\n" - ,base,com_irq); - return(-1); } - rioctl(IOSM|CTSCK|RTSCK|PAUSE|ABORT); - rioctl(CPTON); /* Cvt ^p to ^^ */ - - sprintf(msr,"%lu",&riobp-1); - - sprintf(str,"%sINTRSBBS.DAT",argv[1]); - if((stream=fopen(str,"wb"))!=NULL) { - fprintf(stream,"%lu\r\n",&riobp-1); - fclose(stream); } } - -setbaud(dte_rate); - -if(rmode) { - ivhctl(rmode); - - if(mode&EX_WWIV) { /* WWIV code expansion */ - rioctl(CPTOFF); /* turn off ctrl-p translation */ - oldfunc=getvect(0x29); - setvect(0x29,wwiv_expand); } } - - -if(rmode&INT29L && user_alias[0]) { - node_scrnlen=lclini(0xd<<8); /* Tab expansion, no CRLF expansion */ - lclini(node_scrnlen-1); - col=lclwx(); - row=lclwy(); - lclxy(1,node_scrnlen); - lclatr(CYAN|HIGH|(BLUE<<4)); - lputs(" "); - sprintf(str,"%-25.25s %02d %-25.25s %02d %c %s" - ,user_alias,user_level,user_name[0] ? user_name : user_location - ,user_age - ,user_sex ? user_sex : SP - ,user_phone); - lputs(str); - lputc(CLREOL); - lclatr(LIGHTGRAY); - lclxy(col,row); } - -/* separate args */ - -arg[0]=commandline; /* point to the beginning of the string */ -for(c=0,d=1;commandline[c];c++) /* Break up command line */ - if(commandline[c]==SP) { - commandline[c]=0; /* insert nulls */ - if(!strncmp(commandline+c+1,"%& ",3)) - arg[d++]=msr; - else /* point to the beginning of the next arg */ - arg[d++]=commandline+c+1; } -arg[d]=0; - -/* spawn it */ - -i=spawnvp(P_WAIT,arg[0],arg); - -if(rmode) { - rioctl(TXSYNC|(3<<8)); - rioctl(IOFB); - if(mode&EX_WWIV) - setvect(0x29,oldfunc); - ivhctl(0); /* replace DOS output interrupt vectors */ - if(com_base) - rioini(0,0); } /* replace com port */ - -//if(i) // debug -// getch(); -return(i); -} diff --git a/src/sbbs2/execdos/make.bat b/src/sbbs2/execdos/make.bat deleted file mode 100755 index fcacf79816..0000000000 --- a/src/sbbs2/execdos/make.bat +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -bcc -w-pro -I..;..\rio;..\smb -ml execdos.c ..\dos\rciol.obj -if errorlevel 1 goto end -rem exe2bin execdos.exe execdos.com -:end diff --git a/src/sbbs2/execfile.c b/src/sbbs2/execfile.c deleted file mode 100644 index 966b7279a9..0000000000 --- a/src/sbbs2/execfile.c +++ /dev/null @@ -1,481 +0,0 @@ -#line 1 "EXECFILE.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -int execfile(csi_t *csi) -{ - uchar str[256],tmp2[128],*path,ch,*p; - int i,j,k,s,file,x,y; - long l; - stats_t stats; - node_t node; - file_t f; - time_t t; - csi_t bin; - -switch(*(csi->ip++)) { - - case CS_FILE_SELECT_AREA: - csi->logic=LOGIC_FALSE; - if(!usrlibs) return(0); - while(online) { - j=0; - if(usrlibs>1) { - sprintf(str,"%sMENU\\LIBS.*",text_dir); - if(fexist(str)) - menu("LIBS"); - else { - bputs(text[CfgLibLstHdr]); - for(i=0;i<usrlibs && !msgabort();i++) { - if(i==curlib) - outchar('*'); - else outchar(SP); - if(i<9) outchar(SP); - if(i<99) outchar(SP); - bprintf(text[CfgLibLstFmt] - ,i+1,lib[usrlib[i]]->lname); } } - sprintf(str,text[JoinWhichLib],curlib+1); - mnemonics(str); - j=getnum(usrlibs); - if((int)j==-1) - return(0); - if(!j) - j=curlib; - else - j--; } - sprintf(str,"%sMENU\\DIRS%u.*",text_dir,usrlib[j]+1); - if(fexist(str)) { - sprintf(str,"DIRS%u",usrlib[j]+1); - menu(str); } - else { - CLS; - bprintf(text[DirLstHdr],lib[usrlib[j]]->lname); - for(i=0;i<usrdirs[j] && !msgabort();i++) { - if(i==curdir[j]) outchar('*'); - else outchar(SP); - sprintf(str,text[DirLstFmt],i+1 - ,dir[usrdir[j][i]]->lname,nulstr - ,getfiles(usrdir[j][i])); - if(i<9) outchar(SP); - if(i<99) outchar(SP); - bputs(str); } } - sprintf(str,text[JoinWhichDir],curdir[j]+1); - mnemonics(str); - i=getnum(usrdirs[j]); - if((int)i==-1) { - if(usrlibs==1) - return(0); - continue; } - if(!i) - i=curdir[j]; - else - i--; - curlib=j; - curdir[curlib]=i; - csi->logic=LOGIC_TRUE; - return(0); } - return(0); - - case CS_FILE_GET_DIR_NUM: - - if(useron.misc&COLDKEYS) { - i=atoi(csi->str); - if(i && i<=usrdirs[curlib] && usrlibs) - curdir[curlib]=i-1; - return(0); } - - ch=getkey(K_UPPER); - outchar(ch); - if((ch&0xf)*10<=usrdirs[curlib] && (ch&0xf) && usrlibs) { - i=(ch&0xf)*10; - ch=getkey(K_UPPER); - if(!isdigit(ch) && ch!=CR) { - ungetkey(ch); - curdir[curlib]=(i/10)-1; - return(0); } - outchar(ch); - if(ch==CR) { - curdir[curlib]=(i/10)-1; - return(0); } - logch(ch,0); - i+=ch&0xf; - if(i*10<=usrdirs[curlib]) { /* 100+ dirs */ - i*=10; - ch=getkey(K_UPPER); - if(!isdigit(ch) && ch!=CR) { - ungetkey(ch); - curdir[curlib]=(i/10)-1; - return(0); } - outchar(ch); - if(ch==CR) { - curdir[curlib]=(i/10)-1; - return(0); } - logch(ch,0); - i+=ch&0xf; } - if(i<=usrdirs[curlib]) - curdir[curlib]=i-1; - return(0); } - if((ch&0xf)<=usrdirs[curlib] && (ch&0xf) && usrlibs) - curdir[curlib]=(ch&0xf)-1; - return(0); - - case CS_FILE_GET_LIB_NUM: - - if(useron.misc&COLDKEYS) { - i=atoi(csi->str); - if(i && i<=usrlibs) - curlib=i-1; - return(0); } - - ch=getkey(K_UPPER); - outchar(ch); - if((ch&0xf)*10<=usrlibs && (ch&0xf)) { - i=(ch&0xf)*10; - ch=getkey(K_UPPER); - if(!isdigit(ch) && ch!=CR) { - ungetkey(ch); - curlib=(i/10)-1; - return(0); } - outchar(ch); - if(ch==CR) { - curlib=(i/10)-1; - return(0); } - logch(ch,0); - i+=ch&0xf; - if(i<=usrlibs) - curlib=i-1; - return(0); } - if((ch&0xf)<=usrlibs && (ch&0xf)) - curlib=(ch&0xf)-1; - return(0); - - case CS_FILE_SHOW_LIBRARIES: - if(!usrlibs) return(0); - sprintf(str,"%sMENU\\LIBS.*",text_dir); - if(fexist(str)) { - menu("LIBS"); - return(0); } - bputs(text[LibLstHdr]); - for(i=0;i<usrlibs && !msgabort();i++) { - if(i==curlib) - outchar('*'); - else outchar(SP); - if(i<9) outchar(SP); - bprintf(text[LibLstFmt],i+1 - ,lib[usrlib[i]]->lname,nulstr,usrdirs[i]); } - return(0); - - case CS_FILE_SHOW_DIRECTORIES: - if(!usrlibs) return(0); - sprintf(str,"%sMENU\\DIRS%u.*",text_dir,usrlib[curlib]+1); - if(fexist(str)) { - sprintf(str,"DIRS%u",usrlib[curlib]+1); - menu(str); - return(0); } - CRLF; - bprintf(text[DirLstHdr],lib[usrlib[curlib]]->lname); - for(i=0;i<usrdirs[curlib] && !msgabort();i++) { - if(i==curdir[curlib]) outchar('*'); - else outchar(SP); - sprintf(str,text[DirLstFmt],i+1 - ,dir[usrdir[curlib][i]]->lname,nulstr - ,getfiles(usrdir[curlib][i])); - if(i<9) outchar(SP); - if(i<99) outchar(SP); - bputs(str); } - return(0); - - case CS_FILE_LIBRARY_UP: - curlib++; - if(curlib>=usrlibs) - curlib=0; - return(0); - case CS_FILE_LIBRARY_DOWN: - if(!curlib) - curlib=usrlibs-1; - else curlib--; - return(0); - case CS_FILE_DIRECTORY_UP: - if(!usrlibs) return(0); - curdir[curlib]++; - if(curdir[curlib]>=usrdirs[curlib]) - curdir[curlib]=0; - return(0); - case CS_FILE_DIRECTORY_DOWN: - if(!usrlibs) return(0); - if(!curdir[curlib]) - curdir[curlib]=usrdirs[curlib]-1; - else curdir[curlib]--; - return(0); - case CS_FILE_SET_AREA: - csi->logic=LOGIC_TRUE; - for(i=0;i<usrlibs;i++) - for(j=0;j<usrdirs[i];j++) - if(!stricmp(csi->str,dir[usrdir[i][j]]->code)) { - curlib=i; - curdir[i]=j; - return(0); } - csi->logic=LOGIC_FALSE; - return(0); - case CS_FILE_SET_LIBRARY: - csi->logic=LOGIC_TRUE; - for(i=0;i<usrlibs;i++) - if(!stricmp(lib[usrlib[i]]->sname,csi->str)) - break; - if(i<usrlibs) - curlib=i; - else - csi->logic=LOGIC_FALSE; - return(0); - - case CS_FILE_UPLOAD: - csi->logic=LOGIC_FALSE; - if(useron.rest&FLAG('U')) { - bputs(text[R_Upload]); - return(0); } - if(usrlibs) { - i=usrdir[curlib][curdir[curlib]]; - if(upload_dir!=INVALID_DIR - && !chk_ar(dir[i]->ul_ar,useron)) - i=upload_dir; } - else - i=upload_dir; - - if((uint)i==INVALID_DIR || !chk_ar(dir[i]->ul_ar,useron)) { - bputs(text[CantUploadHere]); - return(0); } - - if(gettotalfiles(i)>=dir[i]->maxfiles) - bputs(text[DirFull]); - else { - upload(i); - csi->logic=LOGIC_TRUE; } - return(0); - case CS_FILE_UPLOAD_USER: - csi->logic=LOGIC_FALSE; - if(user_dir==INVALID_DIR) { - bputs(text[NoUserDir]); - return(0); } - if(gettotalfiles(user_dir)>=dir[user_dir]->maxfiles) - bputs(text[UserDirFull]); - else if(useron.rest&FLAG('U')) - bputs(text[R_Upload]); - else if(!chk_ar(dir[user_dir]->ul_ar,useron)) - bputs(text[CantUploadToUser]); - else { - upload(user_dir); - csi->logic=LOGIC_TRUE; } - return(0); - case CS_FILE_UPLOAD_SYSOP: - csi->logic=LOGIC_FALSE; - if(sysop_dir==INVALID_DIR) { - bputs(text[NoSysopDir]); - return(0); } - if(gettotalfiles(sysop_dir)>=dir[sysop_dir]->maxfiles) - bputs(text[DirFull]); - else if(useron.rest&FLAG('U')) - bputs(text[R_Upload]); - else if(!chk_ar(dir[sysop_dir]->ul_ar,useron)) - bputs(text[CantUploadToSysop]); - else { - upload(sysop_dir); - csi->logic=LOGIC_TRUE; } - return(0); - case CS_FILE_DOWNLOAD: - if(!usrlibs) return(0); - if(useron.rest&FLAG('D')) { - bputs(text[R_Download]); - return(0); } - padfname(csi->str,str); - strupr(str); - if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_DOWNLOAD)) { - bputs(text[SearchingAllDirs]); - for(i=0;i<usrdirs[curlib];i++) - if(i!=curdir[curlib] && - (s=listfileinfo(usrdir[curlib][i],str,FI_DOWNLOAD))!=0) - if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) - return(0); - bputs(text[SearchingAllLibs]); - for(i=0;i<usrlibs;i++) { - if(i==curlib) continue; - for(j=0;j<usrdirs[i];j++) - if((s=listfileinfo(usrdir[i][j],str,FI_DOWNLOAD))!=0) - if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) - return(0); } } - return(0); - case CS_FILE_DOWNLOAD_USER: /* Download from user dir */ - csi->logic=LOGIC_FALSE; - if(user_dir==INVALID_DIR) { - bputs(text[NoUserDir]); - return(0); } - if(useron.rest&FLAG('D')) { - bputs(text[R_Download]); - return(0); } - CRLF; - if(!listfileinfo(user_dir,nulstr,FI_USERXFER)) - bputs(text[NoFilesForYou]); - else - csi->logic=LOGIC_TRUE; - return(0); - case CS_FILE_DOWNLOAD_BATCH: - if(batdn_total && yesno(text[DownloadBatchQ])) { - start_batch_download(); - csi->logic=LOGIC_TRUE; } - else - csi->logic=LOGIC_FALSE; - return(0); - case CS_FILE_BATCH_ADD_LIST: - batch_add_list(csi->str); - return(0); - case CS_FILE_BATCH_ADD: - csi->logic=LOGIC_FALSE; - if(!csi->str[0]) - return(0); - padfname(csi->str,f.name); - strupr(f.name); - for(x=0;x<usrlibs;x++) { - for(y=0;y<usrdirs[x];y++) - if(findfile(usrdir[x][y],f.name)) - break; - if(y<usrdirs[x]) - break; } - if(x>=usrlibs) - return(0); - f.dir=usrdir[x][y]; - getfileixb(&f); - f.size=0; - getfiledat(&f); - addtobatdl(f); - csi->logic=LOGIC_TRUE; - return(0); - case CS_FILE_BATCH_CLEAR: - if(!batdn_total) { - csi->logic=LOGIC_FALSE; - return(0); } - csi->logic=LOGIC_TRUE; - for(i=0;i<batdn_total;i++) { - f.dir=batdn_dir[i]; - f.datoffset=batdn_offset[i]; - f.size=batdn_size[i]; - strcpy(f.name,batdn_name[i]); - closefile(f); } - batdn_total=0; - return(0); - - case CS_FILE_VIEW: - if(!usrlibs) return(0); - padfname(csi->str,str); - strupr(str); - csi->logic=LOGIC_TRUE; - if(listfiles(usrdir[curlib][curdir[curlib]],str,0,FL_VIEW)) - return(0); - bputs(text[SearchingAllDirs]); - for(i=0;i<usrdirs[curlib];i++) { - if(i==curdir[curlib]) continue; - if(listfiles(usrdir[curlib][i],str,0,FL_VIEW)) - break; } - if(i<usrdirs[curlib]) - return(0); - bputs(text[SearchingAllLibs]); - for(i=0;i<usrlibs;i++) { - if(i==curlib) continue; - for(j=0;j<usrdirs[i];j++) - if(listfiles(usrdir[i][j],str,0,FL_VIEW)) - return(0); } - csi->logic=LOGIC_FALSE; - bputs(text[FileNotFound]); - return(0); - case CS_FILE_LIST: /* List files in current dir */ - if(!usrlibs) return(0); - csi->logic=LOGIC_FALSE; - if(!getfiles(usrdir[curlib][curdir[curlib]])) { - bputs(text[EmptyDir]); - return(0); } - padfname(csi->str,str); - strupr(str); - s=listfiles(usrdir[curlib][curdir[curlib]],str,0,0); - if(s>1) { - bprintf(text[NFilesListed],s); } - csi->logic=!s; - return(0); - case CS_FILE_LIST_EXTENDED: /* Extended Information on files */ - if(!usrlibs) return(0); - padfname(csi->str,str); - strupr(str); - if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_INFO)) { - bputs(text[SearchingAllDirs]); - for(i=0;i<usrdirs[curlib];i++) - if(i!=curdir[curlib] && (s=listfileinfo(usrdir[curlib][i] - ,str,FI_INFO))!=0) - if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) - return(0); - bputs(text[SearchingAllLibs]); - for(i=0;i<usrlibs;i++) { - if(i==curlib) continue; - for(j=0;j<usrdirs[i];j++) - if((s=listfileinfo(usrdir[i][j],str,FI_INFO))!=0) - if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) - return(0); } } - return(0); - case CS_FILE_FIND_TEXT: /* Find text in descriptions */ - scandirs(FL_FINDDESC); - return(0); - case CS_FILE_FIND_TEXT_ALL: /* Find text in descriptions */ - scanalldirs(FL_FINDDESC); - return(0); - case CS_FILE_FIND_NAME: /* Find text in descriptions */ - scandirs(FL_NO_HDR); - return(0); - case CS_FILE_FIND_NAME_ALL: /* Find text in descriptions */ - scanalldirs(FL_NO_HDR); - return(0); - case CS_FILE_BATCH_SECTION: - batchmenu(); - return(0); - case CS_FILE_TEMP_SECTION: - temp_xfer(); - return(0); - case CS_FILE_PTRS_CFG: - csi->logic=!inputnstime(&ns_time); - return(0); - case CS_FILE_NEW_SCAN: - scandirs(FL_ULTIME); - return(0); - case CS_FILE_NEW_SCAN_ALL: - scanalldirs(FL_ULTIME); - return(0); - case CS_FILE_REMOVE: - if(!usrlibs) return(0); - if(useron.rest&FLAG('R')) { - bputs(text[R_RemoveFiles]); - return(0); } - padfname(csi->str,str); - strupr(str); - if(!listfileinfo(usrdir[curlib][curdir[curlib]],str,FI_REMOVE)) { - if(user_dir!=INVALID_DIR - && user_dir!=usrdir[curlib][curdir[curlib]]) - if((s=listfileinfo(user_dir,str,FI_REMOVE))!=0) - if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) - return(0); - bputs(text[SearchingAllDirs]); - for(i=0;i<usrdirs[curlib];i++) - if(i!=curdir[curlib] && i!=user_dir - && (s=listfileinfo(usrdir[curlib][i],str,FI_REMOVE))!=0) - if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) - return(0); - bputs(text[SearchingAllLibs]); - for(i=0;i<usrlibs;i++) { - if(i==curlib || i==user_dir) continue; - for(j=0;j<usrdirs[i]; j++) - if((s=listfileinfo(usrdir[i][j],str,FI_REMOVE))!=0) - if(s==-1 || (!strchr(str,'?') && !strchr(str,'*'))) - return(0); } } - return(0); - } - -errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1)); -return(0); -} diff --git a/src/sbbs2/execfunc.c b/src/sbbs2/execfunc.c deleted file mode 100644 index e84805da10..0000000000 --- a/src/sbbs2/execfunc.c +++ /dev/null @@ -1,665 +0,0 @@ -#line 1 "EXECFUNC.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -int exec_function(csi_t *csi) -{ - uchar str[256],tmp2[128],ch,*p; - int i,j,k,s,file; - long l; - stats_t stats; - node_t node; - file_t f; - time_t t; - -switch(*(csi->ip++)) { - - - case CS_PRINTFILE_STR: - printfile(csi->str,P_NOATCODES); - return(0); - -/********************************/ -/* General Main Menu Type Stuff */ -/********************************/ - case CS_AUTO_MESSAGE: - automsg(); - return(0); - case CS_MINUTE_BANK: - if(sys_misc&SM_TIMEBANK) { /* Allow users to deposit free time */ - s=(level_timeperday[useron.level]-useron.ttoday)+useron.textra; - if(s<0) s=0; - if(s>level_timepercall[useron.level]) - s=level_timepercall[useron.level]; - s-=(now-starttime)/60; - if(s<0) s=0; - bprintf(text[FreeMinLeft],s); - bprintf(text[UserMinutes],ultoac(useron.min,tmp)); - if(max_minutes && useron.min>=max_minutes) { - bputs(text[YouHaveTooManyMinutes]); - return(0); } - if(max_minutes) - while(s>0 && s+useron.min>max_minutes) s--; - bprintf(text[FreeMinToDeposit],s); - s=getnum(s); - if(s>0) { - logline(" ","Minute Bank Deposit"); - useron.min=adjustuserrec(useron.number,U_MIN,10,s); - useron.ttoday=adjustuserrec(useron.number,U_TTODAY,10,s); - sprintf(str,"Minute Adjustment: %u",s*cdt_min_value); - logline("*+",str); } } - - if(!(sys_misc&SM_NOCDTCVT)) { - bprintf(text[ConversionRate],cdt_min_value); - bprintf(text[UserCredits] - ,ultoac(useron.cdt,tmp) - ,ultoac(useron.freecdt,tmp2) - ,ultoac(level_freecdtperday[useron.level],str)); - bprintf(text[UserMinutes],ultoac(useron.min,tmp)); - if(useron.cdt/102400L<1L) { - bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt,tmp)); - return(0); } - if(max_minutes && useron.min>=max_minutes) { - bputs(text[YouHaveTooManyMinutes]); - return(0); } - s=useron.cdt/102400L; - if(max_minutes) - while(s>0 && (s*cdt_min_value)+useron.min>max_minutes) s--; - bprintf(text[CreditsToMin],s); - s=getnum(s); - if(s>0) { - logline(" ","Credit to Minute Conversion"); - useron.cdt=adjustuserrec(useron.number,U_CDT,10,-(s*102400L)); - useron.min=adjustuserrec(useron.number,U_MIN,10,s*cdt_min_value); - sprintf(str,"Credit Adjustment: %ld",-(s*102400L)); - logline("$-",str); - sprintf(str,"Minute Adjustment: %u",s*cdt_min_value); - logline("*+",str); } } - return(0); - case CS_CHAT_SECTION: - if(useron.rest&FLAG('C')) - bputs(text[R_Chat]); - else - chatsection(); - return(0); - case CS_USER_DEFAULTS: - maindflts(useron); - if(!(useron.rest&FLAG('G'))) /* not guest */ - getuserdat(&useron); - return(0); - case CS_TEXT_FILE_SECTION: - text_sec(); - return(0); - case CS_INFO_SYSTEM: /* System information */ - bputs(text[SiHdr]); - getstats(0,&stats); - bprintf(text[SiSysName],sys_name); - bprintf(text[SiSysID],sys_id); /* QWK ID */ - for(i=0;i<total_faddrs;i++) - bprintf(text[SiSysFaddr],faddrtoa(faddr[i])); - if(sys_psname[0]) /* PostLink/PCRelay */ - bprintf(text[SiSysPsite],sys_psname,sys_psnum); - bprintf(text[SiSysLocation],sys_location); - bprintf(text[SiSysop],sys_op); - bprintf(text[SiSysNodes],sys_nodes); - bprintf(text[SiNodeNumberName],node_num,node_name); - bprintf(text[SiNodePhone],node_phone); - bprintf(text[SiTotalLogons],ultoac(stats.logons,tmp)); - bprintf(text[SiLogonsToday],ultoac(stats.ltoday,tmp)); - bprintf(text[SiTotalTime],ultoac(stats.timeon,tmp)); - bprintf(text[SiTimeToday],ultoac(stats.ttoday,tmp)); - ver(); - if(yesno(text[ViewSysInfoFileQ])) { - CLS; - sprintf(str,"%sSYSTEM.MSG",text_dir); - printfile(str,0); } - if(yesno(text[ViewLogonMsgQ])) { - CLS; - menu("LOGON"); } - return(0); - case CS_INFO_SUBBOARD: /* Sub-board information */ - if(!usrgrps) return(0); - subinfo(usrsub[curgrp][cursub[curgrp]]); - return(0); - case CS_INFO_DIRECTORY: /* Sub-board information */ - if(!usrlibs) return(0); - dirinfo(usrdir[curlib][curdir[curlib]]); - return(0); - case CS_INFO_VERSION: /* Version */ - ver(); - return(0); - case CS_INFO_USER: /* User's statistics */ - bprintf(text[UserStats],useron.alias,useron.number); - unixtodos(useron.laston,&date,&curtime); - bprintf(text[UserDates] - ,unixtodstr(useron.firston,str) - ,unixtodstr(useron.expire,tmp) - ,unixtodstr(useron.laston,tmp2) - ,curtime.ti_hour,curtime.ti_min); - bprintf(text[UserTimes] - ,useron.timeon,useron.ttoday - ,level_timeperday[useron.level] - ,useron.tlast - ,level_timepercall[useron.level] - ,useron.textra); - bprintf(text[UserLogons] - ,useron.logons,useron.ltoday - ,level_callsperday[useron.level],useron.posts - ,i ? 100/i : useron.posts>useron.logons ? 100 : 0 - ,useron.ptoday); - bprintf(text[UserEmails] - ,useron.emails,useron.fbacks - ,getmail(useron.number,0),useron.etoday); - CRLF; - bprintf(text[UserUploads] - ,ultoac(useron.ulb,tmp),useron.uls); - bprintf(text[UserDownloads] - ,ultoac(useron.dlb,tmp),useron.dls,nulstr); - bprintf(text[UserCredits],ultoac(useron.cdt,tmp) - ,ultoac(useron.freecdt,tmp2) - ,ultoac(level_freecdtperday[useron.level],str)); - bprintf(text[UserMinutes],ultoac(useron.min,tmp)); - return(0); - case CS_INFO_XFER_POLICY: - if(!usrlibs) return(0); - sprintf(str,"%sMENU\\TPOLICY.*",text_dir); - if(fexist(str)) - menu("TPOLICY"); - else { - bprintf(text[TransferPolicyHdr],sys_name); - bprintf(text[TpUpload] - ,dir[usrdir[curlib][curdir[curlib]]]->up_pct); - bprintf(text[TpDownload] - ,dir[usrdir[curlib][curdir[curlib]]]->dn_pct); - } - return(0); - case CS_XTRN_EXEC: - csi->logic=LOGIC_TRUE; - for(i=0;i<total_xtrns;i++) - if(!stricmp(xtrn[i]->code,csi->str)) - break; - if(i<total_xtrns) - exec_xtrn(i); - else - csi->logic=LOGIC_FALSE; - return(0); - case CS_XTRN_SECTION: - if(useron.rest&FLAG('X')) - bputs(text[R_ExternalPrograms]); - else - xtrn_sec(); /* If external available, don't pause */ - return(0); - case CS_LOGOFF: - if(!noyes(text[LogOffQ])) { - if(logoff_mod[0]) - exec_bin(logoff_mod,csi); - user_event(EVENT_LOGOFF); - menu("LOGOFF"); - SYNC; - hangup(); } - return(0); - case CS_LOGOFF_FAST: - SYNC; - if(online==ON_REMOTE && !(mdm_misc&MDM_NODTR)) - dtr(0); - hangup(); - return(0); - case CS_NODELIST_ALL: - CRLF; - bputs(text[NodeLstHdr]); - for(i=1;i<=sys_nodes && i<=sys_lastnode;i++) { - getnodedat(i,&node,0); - printnodedat(i,node); } - return(0); - case CS_NODELIST_USERS: - whos_online(1); - return(0); - case CS_USERLIST_SUB: - userlist(UL_SUB); - return(0); - case CS_USERLIST_DIR: - userlist(UL_DIR); - return(0); - case CS_USERLIST_ALL: - userlist(UL_ALL); - return(0); - case CS_USERLIST_LOGONS: - sprintf(str,"%sLOGON.LST",data_dir); - if(flength(str)<1) { - bputs("\r\n\r\n"); - bputs(text[NoOneHasLoggedOnToday]); } - else { - bputs(text[CallersToday]); - printfile(str,P_NOATCODES|P_OPENCLOSE); - CRLF; } - return(0); - case CS_PAGE_SYSOP: - ch=kbd_state(); /* Check scroll lock */ - if(ch&16 || (sys_chat_ar[0] && chk_ar(sys_chat_ar,useron)) - || useron.exempt&FLAG('C')) { - sysop_page(); - return(0); } - bprintf(text[SysopIsNotAvailable],sys_op); - return(0); - case CS_PAGE_GURU: - csi->logic=LOGIC_FALSE; - for(i=0;i<total_gurus;i++) - if(!stricmp(csi->str,guru[i]->code) - && chk_ar(guru[i]->ar,useron)) - break; - if(i>=total_gurus) - return(0); - sprintf(str,"%s%s.DAT",ctrl_dir,guru[i]->code); - if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return(0); } - if((p=MALLOC(filelength(file)+1))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,filelength(file)+1); - return(0); } - read(file,p,filelength(file)); - p[filelength(file)]=0; - close(file); - localguru(p,i); - FREE(p); - csi->logic=LOGIC_TRUE; - return(0); - case CS_PRIVATE_CHAT: - privchat(); - return(0); - case CS_PRIVATE_MESSAGE: - nodemsg(); - return(0); - -/*******************/ -/* Sysop Functions */ -/*******************/ - case CS_USER_EDIT: - useredit(csi->str[0] ? finduser(csi->str) : 0,0); - return(0); - - -/******************/ -/* Mail Functions */ -/******************/ - - case CS_MAIL_READ: /* Read E-mail */ - readmail(useron.number,MAIL_YOUR); - return(0); - case CS_MAIL_READ_SENT: /* Kill/read sent mail */ - if(useron.rest&FLAG('K')) - bputs(text[R_ReadSentMail]); - else - readmail(useron.number,MAIL_SENT); - return(0); - case CS_MAIL_READ_ALL: - readmail(useron.number,MAIL_ALL); - return(0); - case CS_MAIL_SEND: /* Send E-mail */ - if(strchr(csi->str,'@')) { - i=1; - netmail(csi->str,nulstr,0); } - else if((i=finduser(csi->str))!=0) - email(i,nulstr,nulstr,WM_EMAIL); - csi->logic=!i; - return(0); - case CS_MAIL_SEND_FEEDBACK: /* Feedback */ - if((i=finduser(csi->str))!=0) - email(i,text[ReFeedback],nulstr,WM_EMAIL); - csi->logic=!i; - return(0); - case CS_MAIL_SEND_NETMAIL: - bputs(text[EnterNetMailAddress]); - if(getstr(str,60,K_LINE)) { - netmail(str,nulstr,0); - csi->logic=LOGIC_TRUE; } - else - csi->logic=LOGIC_FALSE; - return(0); - - case CS_MAIL_SEND_NETFILE: - bputs(text[EnterNetMailAddress]); - if(getstr(str,60,K_LINE)) { - netmail(str,nulstr,WM_FILE); - csi->logic=LOGIC_TRUE; } - else - csi->logic=LOGIC_FALSE; - return(0); - - case CS_MAIL_SEND_FILE: /* Upload Attached File to E-mail */ - if(strchr(csi->str,'@')) { - i=1; - netmail(csi->str,nulstr,WM_FILE); } - else if((i=finduser(csi->str))!=0) - email(i,nulstr,nulstr,WM_EMAIL|WM_FILE); - csi->logic=!i; - return(0); - case CS_MAIL_SEND_BULK: - if(csi->str[0]) - p=arstr(0,csi->str); - else - p=nulstr; - bulkmail(p); - if(p && p[0]) - FREE(p); - return(0); - - case CS_INC_MAIN_CMDS: - main_cmds++; - return(0); - - case CS_INC_FILE_CMDS: - xfer_cmds++; - return(0); - - case CS_SYSTEM_LOG: /* System log */ - if(!chksyspass(0)) - return(0); - unixtodos(now,&date,&curtime); - sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG",data_dir - ,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900)); - printfile(str,0); - return(0); - case CS_SYSTEM_YLOG: /* Yesterday's log */ - if(!chksyspass(0)) - return(0); - now-=(ulong)60L*24L*60L; - unixtodos(now,&date,&curtime); - sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG",data_dir - ,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900)); - printfile(str,0); - return(0); - case CS_SYSTEM_STATS: /* System Statistics */ - bputs(text[SystemStatsHdr]); - getstats(0,&stats); - bprintf(text[StatsTotalLogons],ultoac(stats.logons,tmp)); - bprintf(text[StatsLogonsToday],ultoac(stats.ltoday,tmp)); - bprintf(text[StatsTotalTime],ultoac(stats.timeon,tmp)); - bprintf(text[StatsTimeToday],ultoac(stats.ttoday,tmp)); - bprintf(text[StatsUploadsToday],ultoac(stats.ulb,tmp) - ,stats.uls); - bprintf(text[StatsDownloadsToday],ultoac(stats.dlb,tmp) - ,stats.dls); - bprintf(text[StatsPostsToday],ultoac(stats.ptoday,tmp)); - bprintf(text[StatsEmailsToday],ultoac(stats.etoday,tmp)); - bprintf(text[StatsFeedbacksToday],ultoac(stats.ftoday,tmp)); - return(0); - case CS_NODE_STATS: /* Node Statistics */ - i=atoi(csi->str); - if(i>sys_nodes) { - bputs(text[InvalidNode]); - return(0); } - if(!i) i=node_num; - bprintf(text[NodeStatsHdr],i); - getstats(i,&stats); - bprintf(text[StatsTotalLogons],ultoac(stats.logons,tmp)); - bprintf(text[StatsLogonsToday],ultoac(stats.ltoday,tmp)); - bprintf(text[StatsTotalTime],ultoac(stats.timeon,tmp)); - bprintf(text[StatsTimeToday],ultoac(stats.ttoday,tmp)); - bprintf(text[StatsUploadsToday],ultoac(stats.ulb,tmp) - ,stats.uls); - bprintf(text[StatsDownloadsToday],ultoac(stats.dlb,tmp) - ,stats.dls); - bprintf(text[StatsPostsToday],ultoac(stats.ptoday,tmp)); - bprintf(text[StatsEmailsToday],ultoac(stats.etoday,tmp)); - bprintf(text[StatsFeedbacksToday],ultoac(stats.ftoday,tmp)); - return(0); - case CS_CHANGE_USER: /* Change to another user */ - if(!chksyspass(0)) - return(0); - bputs(text[ChUserPrompt]); - if(!getstr(str,LEN_ALIAS,K_UPPER)) - return(0); - if((i=finduser(str))==0) - return(0); - if(online==ON_REMOTE) { - getuserrec(i,U_LEVEL,2,str); - if(atoi(str)>logon_ml) { - getuserrec(i,U_PASS,8,tmp); - bputs(text[ChUserPwPrompt]); - console|=CON_R_ECHOX; - if(!(sys_misc&SM_ECHO_PW)) - console|=CON_L_ECHOX; - getstr(str,8,K_UPPER); - console&=~(CON_R_ECHOX|CON_L_ECHOX); - if(strcmp(str,tmp)) - return(0); } } - putmsgptrs(); - putuserrec(useron.number,U_CURSUB,8 - ,sub[usrsub[curgrp][cursub[curgrp]]]->code); - putuserrec(useron.number,U_CURDIR,8 - ,dir[usrdir[curlib][curdir[curlib]]]->code); - useron.number=i; - getuserdat(&useron); - getnodedat(node_num,&thisnode,1); - thisnode.useron=useron.number; - putnodedat(node_num,thisnode); - getmsgptrs(); - if(REALSYSOP) sys_status&=~SS_TMPSYSOP; - else sys_status|=SS_TMPSYSOP; - statline=sys_def_stat; - statusline(); - sprintf(str,"Changed into %s #%u",useron.alias,useron.number); - logline("S+",str); - return(0); - case CS_SHOW_MEM: -#ifdef __MSDOS__ - bprintf(text[NBytesFreeMemory],farcoreleft()); -#endif - return(0); - case CS_ERROR_LOG: - sprintf(str,"%sERROR.LOG",data_dir); - if(fexist(str)) { - bputs(text[ErrorLogHdr]); - printfile(str,0); - if(!noyes(text[DeleteErrorLogQ])) - remove(str); } - else - bputs(text[NoErrorLogExists]); - for(i=1;i<=sys_nodes;i++) { - getnodedat(i,&node,0); - if(node.errors) - break; } - if(i<=sys_nodes || criterrs) { - if(!noyes(text[ClearErrCounter])) { - for(i=1;i<=sys_nodes;i++) { - getnodedat(i,&node,1); - node.errors=0; - putnodedat(i,node); } - criterrs=0; } } - return(0); - case CS_ANSI_CAPTURE: /* Capture ANSI codes */ - sys_status^=SS_ANSCAP; - bprintf(text[ANSICaptureIsNow] - ,sys_status&SS_ANSCAP ? text[ON] : text[OFF]); - return(0); - case CS_LIST_TEXT_FILE: /* View ASCII/ANSI/Ctrl-A file */ - if(!chksyspass(0)) - return(0); - bputs(text[Filename]); - if(getstr(str,60,K_UPPER)) - printfile(str,0); - return(0); - case CS_EDIT_TEXT_FILE: /* Edit ASCII/Ctrl-A file */ - if(!chksyspass(0)) - return(0); - bputs(text[Filename]); - if(getstr(str,60,K_UPPER)) - editfile(str); - return(0); - case CS_GURU_LOG: - sprintf(str,"%sGURU.LOG",data_dir); - if(fexist(str)) { - printfile(str,0); - CRLF; - if(!noyes(text[DeleteGuruLogQ])) - remove(str); } - return(0); - case CS_FILE_SET_ALT_PATH: - altul=atoi(csi->str); - if(altul>altpaths) - altul=0; - bprintf(text[AltULPathIsNow],altul ? altpath[altul-1] : text[OFF]); - return(0); - case CS_FILE_RESORT_DIRECTORY: - for(i=1;i<=sys_nodes;i++) - if(i!=node_num) { - getnodedat(i,&node,0); - if(node.status==NODE_INUSE - || node.status==NODE_QUIET) - break; } - - if(i<=sys_nodes) { - bputs(text[ResortWarning]); - return(0); } - - if(!stricmp(csi->str,"ALL")) { /* all libraries */ - for(i=0;i<usrlibs;i++) - for(j=0;j<usrdirs[i];j++) - resort(usrdir[i][j]); - return(0); } - if(!stricmp(csi->str,"LIB")) { /* current library */ - for(i=0;i<usrdirs[curlib];i++) - resort(usrdir[curlib][i]); - return(0); } - resort(usrdir[curlib][curdir[curlib]]); - return(0); - - case CS_FILE_GET: - - if(!fexist(csi->str)) { - bputs(text[FileNotFound]); - return(0); } - if(!chksyspass(0)) - return(0); - - case CS_FILE_SEND: - - menu("DLPROT"); - mnemonics(text[ProtocolOrQuit]); - strcpy(str,"Q"); - for(i=0;i<total_prots;i++) - if(prot[i]->dlcmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(str,tmp); } - ch=getkeys(str,0); - if(ch=='Q' || sys_status&SS_ABORT) { - return(0); } - for(i=0;i<total_prots;i++) - if(prot[i]->mnemonic==ch && chk_ar(prot[i]->ar,useron)) - break; - if(i<total_prots) { - protocol(cmdstr(prot[i]->dlcmd,csi->str,csi->str,str),0); - autohangup(); } - return(0); - - case CS_FILE_PUT: - if(!chksyspass(0)) - return(0); - menu("ULPROT"); - mnemonics(text[ProtocolOrQuit]); - strcpy(str,"Q"); - for(i=0;i<total_prots;i++) - if(prot[i]->ulcmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(str,tmp); } - ch=getkeys(str,0); - if(ch=='Q' || sys_status&SS_ABORT) { - lncntr=0; - return(0); } - for(i=0;i<total_prots;i++) - if(prot[i]->mnemonic==ch && chk_ar(prot[i]->ar,useron)) - break; - if(i<total_prots) { - protocol(cmdstr(prot[i]->ulcmd,csi->str,csi->str,str),0); - autohangup(); } - return(0); - - case CS_FILE_UPLOAD_BULK: - - if(!usrlibs) return(0); - - if(!stricmp(csi->str,"ALL")) { /* all libraries */ - for(i=0;i<usrlibs;i++) - for(j=0;j<usrdirs[i];j++) { - if(lib[i]->offline_dir==usrdir[i][j]) - continue; - if(bulkupload(usrdir[i][j])) return(0); } - return(0); } - if(!stricmp(csi->str,"LIB")) { /* current library */ - for(i=0;i<usrdirs[curlib];i++) { - if(lib[usrlib[curlib]]->offline_dir - ==usrdir[curlib][i]) - continue; - if(bulkupload(usrdir[curlib][i])) return(0); } - return(0); } - bulkupload(usrdir[curlib][curdir[curlib]]); /* current dir */ - return(0); - - case CS_FILE_FIND_OLD: - case CS_FILE_FIND_OPEN: - case CS_FILE_FIND_OFFLINE: - case CS_FILE_FIND_OLD_UPLOADS: - if(!usrlibs) return(0); - if(!getfilespec(tmp)) - return(0); - padfname(tmp,str); - k=0; - bputs("\r\nSearching "); - if(!stricmp(csi->str,"ALL")) - bputs("all libraries"); - else if(!stricmp(csi->str,"LIB")) - bputs("library"); - else - bputs("directory"); - bputs(" for files "); - if(*(csi->ip-1)==CS_FILE_FIND_OLD_UPLOADS) { - l=FI_OLDUL; - bprintf("uploaded before %s\r\n",timestr(&ns_time)); } - else if(*(csi->ip-1)==CS_FILE_FIND_OLD) { /* go by download date */ - l=FI_OLD; - bprintf("not downloaded since %s\r\n",timestr(&ns_time)); } - else if(*(csi->ip-1)==CS_FILE_FIND_OFFLINE) { - l=FI_OFFLINE; - bputs("not online...\r\n"); } - else { - l=FI_CLOSE; - bputs("currently open...\r\n"); } - if(!stricmp(csi->str,"ALL")) { - for(i=0;i<usrlibs;i++) - for(j=0;j<usrdirs[i];j++) { - if(lib[i]->offline_dir==usrdir[i][j]) - continue; - if((s=listfileinfo(usrdir[i][j],str,l))==-1) - return(0); - else k+=s; } } - else if(!stricmp(csi->str,"LIB")) { - for(i=0;i<usrdirs[curlib];i++) { - if(lib[usrlib[curlib]]->offline_dir==usrdir[curlib][i]) - continue; - if((s=listfileinfo(usrdir[curlib][i],str,l))==-1) - return(0); - else k+=s; } } - else { - s=listfileinfo(usrdir[curlib][curdir[curlib]],str,l); - if(s==-1) - return(0); - k=s; } - if(k>1) { - bprintf(text[NFilesListed],k); } - return(0); } - -if(*(csi->ip-1)>=CS_MSG_SET_AREA && *(csi->ip-1)<=CS_MSG_UNUSED1) { - csi->ip--; - return(execmsg(csi)); } - -if(*(csi->ip-1)>=CS_FILE_SET_AREA && *(csi->ip-1)<=CS_FILE_UNUSED1) { - csi->ip--; - return(execfile(csi)); } - -errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1)); -return(0); -} diff --git a/src/sbbs2/execmisc.c b/src/sbbs2/execmisc.c deleted file mode 100644 index 9b0f98bf43..0000000000 --- a/src/sbbs2/execmisc.c +++ /dev/null @@ -1,1373 +0,0 @@ -#line 1 "EXECMISC.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" -#include <sys/locking.h> -#include <dirent.h> - - -int exec_misc(csi_t *csi, uchar *path) -{ - uchar str[256],tmp2[128],buf[1025],ch,*p,**pp,**pp1,**pp2; - ushort w; - int i,j,k,s,file; - long l,*lp,*lp1,*lp2; - void *vp; - va_list arglist[64]; - struct dirent *de; - struct tm *tm_p; - struct ftime ft; - FILE *fp; - -switch(*(csi->ip++)) { - case CS_VAR_INSTRUCTION: - switch(*(csi->ip++)) { /* sub-op-code stored as next byte */ - case PRINT_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - if(!pp || !*pp) { - lp=getintvar(csi,*(long *)csi->ip); - if(lp) - bprintf("%ld",*lp); } - else - putmsg(cmdstr(*pp,path,csi->str,buf) - ,P_SAVEATR|P_NOABORT); - csi->ip+=4; - return(0); - case VAR_PRINTF: - strcpy(str,csi->ip); - while(*(csi->ip++)); /* Find NULL */ - j=*(csi->ip++); /* total args */ - for(i=0;i<j;i++) { - vp=getstrvar(csi,*(long *)csi->ip); - if(!vp) { - lp=getintvar(csi,*(long *)csi->ip); - if(!lp) - arglist[i]=0; - else - arglist[i]=(void *)*lp; } - else - arglist[i]=*(char **)vp; - csi->ip+=4; } - vsprintf(tmp,str,arglist); - putmsg(cmdstr(tmp,path,csi->str,buf),P_SAVEATR|P_NOABORT); - return(0); - case SHOW_VARS: - bprintf("shell str=(%08lX) %s\r\n" - ,csi->str,csi->str); - for(i=0;i<csi->str_vars;i++) - bprintf("local str[%d]=(%08lX) (%08lX) %s\r\n" - ,i,csi->str_var_name[i] - ,csi->str_var[i] - ,csi->str_var[i]); - for(i=0;i<csi->int_vars;i++) - bprintf("local int[%d]=(%08lX) (%08lX) %ld\r\n" - ,i,csi->int_var_name[i] - ,csi->int_var[i] - ,csi->int_var[i]); - for(i=0;i<global_str_vars;i++) - bprintf("global str[%d]=(%08lX) (%08lX) %s\r\n" - ,i,global_str_var_name[i] - ,global_str_var[i] - ,global_str_var[i]); - for(i=0;i<global_int_vars;i++) - bprintf("global int[%d]=(%08lX) (%08lX) %ld\r\n" - ,i,global_int_var_name[i] - ,global_int_var[i] - ,global_int_var[i]); - return(0); - case DEFINE_STR_VAR: - if(getstrvar(csi,*(long *)csi->ip)) { - csi->ip+=4; - return(0); } - csi->str_vars++; - csi->str_var=REALLOC(csi->str_var - ,sizeof(char *)*csi->str_vars); - csi->str_var_name=REALLOC(csi->str_var_name - ,sizeof(long)*csi->str_vars); - if(csi->str_var==NULL - || csi->str_var_name==NULL) { /* REALLOC failed */ - errormsg(WHERE,ERR_ALLOC,"local str var" - ,sizeof(char *)*csi->str_vars); - if(csi->str_var_name) { - FREE(csi->str_var_name); - csi->str_var_name=0; } - if(csi->str_var) { - FREE(csi->str_var); - csi->str_var=0; } - csi->str_vars=0; } - else { - csi->str_var_name[csi->str_vars-1]=*(long *)csi->ip; - csi->str_var[csi->str_vars-1]=0; } - csi->ip+=4; /* Skip variable name */ - return(0); - case DEFINE_INT_VAR: - if(getintvar(csi,*(long *)csi->ip)) { - csi->ip+=4; - return(0); } - csi->int_vars++; - csi->int_var=REALLOC(csi->int_var - ,sizeof(char *)*csi->int_vars); - csi->int_var_name=REALLOC(csi->int_var_name - ,sizeof(long)*csi->int_vars); - if(csi->int_var==NULL - || csi->int_var_name==NULL) { /* REALLOC failed */ - errormsg(WHERE,ERR_ALLOC,"local int var" - ,sizeof(char *)*csi->int_vars); - if(csi->int_var_name) { - FREE(csi->int_var_name); - csi->int_var_name=0; } - if(csi->int_var) { - FREE(csi->int_var); - csi->int_var=0; } - csi->int_vars=0; } - else { - csi->int_var_name[csi->int_vars-1]=*(long *)csi->ip; - csi->int_var[csi->int_vars-1]=0; } - csi->ip+=4; /* Skip variable name */ - return(0); - case DEFINE_GLOBAL_STR_VAR: - if(getstrvar(csi,*(long *)csi->ip)) { - csi->ip+=4; - return(0); } - global_str_vars++; - global_str_var=REALLOC(global_str_var - ,sizeof(char *)*global_str_vars); - global_str_var_name=REALLOC(global_str_var_name - ,sizeof(long)*global_str_vars); - if(global_str_var==NULL - || global_str_var_name==NULL) { /* REALLOC failed */ - errormsg(WHERE,ERR_ALLOC,"global str var" - ,sizeof(char *)*global_str_vars); - if(global_str_var_name) { - FREE(global_str_var_name); - global_str_var_name=0; } - if(global_str_var) { - FREE(global_str_var); - global_str_var=0; } - global_str_vars=0; } - else { - global_str_var_name[global_str_vars-1]= - *(long *)csi->ip; - global_str_var[global_str_vars-1]=0; } - csi->ip+=4; /* Skip variable name */ - return(0); - case DEFINE_GLOBAL_INT_VAR: - if(getintvar(csi,*(long *)csi->ip)) { - csi->ip+=4; - return(0); } - global_int_vars++; - global_int_var=REALLOC(global_int_var - ,sizeof(char *)*global_int_vars); - global_int_var_name=REALLOC(global_int_var_name - ,sizeof(long)*global_int_vars); - if(global_int_var==NULL - || global_int_var_name==NULL) { /* REALLOC failed */ - errormsg(WHERE,ERR_ALLOC,"local int var" - ,sizeof(char *)*global_int_vars); - if(global_int_var_name) { - FREE(global_int_var_name); - global_int_var_name=0; } - if(global_int_var) { - FREE(global_int_var); - global_int_var=0; } - global_int_vars=0; } - else { - global_int_var_name[global_int_vars-1] - =*(long *)csi->ip; - global_int_var[global_int_vars-1]=0; } - csi->ip+=4; /* Skip variable name */ - return(0); - - case SET_STR_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - if(pp) - *pp=copystrvar(csi,*pp - ,cmdstr(csi->ip,path,csi->str,buf)); - while(*(csi->ip++)); /* Find NULL */ - return(0); - case SET_INT_VAR: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - if(lp) - *lp=*(long *)csi->ip; - csi->ip+=4; /* Skip value */ - return(0); - case COMPARE_STR_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - if(pp) - csi->logic=stricmp(*pp - ,cmdstr(csi->ip,path,csi->str,buf)); - else { /* Uninitialized str var */ - if(*(csi->ip)==0) /* Blank static str */ - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; } - while(*(csi->ip++)); /* Find NULL */ - return(0); - case STRSTR_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - if(pp && *pp && strstr(*pp - ,cmdstr(csi->ip,path,csi->str,buf))) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - while(*(csi->ip++)); /* Find NULL */ - return(0); - case STRNCMP_VAR: - i=*csi->ip++; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - if(pp && *pp) - csi->logic=strnicmp(*pp - ,cmdstr(csi->ip,path,csi->str,buf),i); - else - csi->logic=LOGIC_FALSE; - while(*(csi->ip++)); /* Find NULL */ - return(0); - case STRNCMP_VARS: - i=*csi->ip++; - (char **)pp1=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - (char **)pp2=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp1 && *pp1 && pp2 && *pp2) - csi->logic=strnicmp(*pp1,*pp2,i); - else - csi->logic=LOGIC_FALSE; - return(0); - case STRSTR_VARS: - (char **)pp1=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - (char **)pp2=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp1 && *pp1 && pp2 && *pp2 && strstr(*pp1,*pp2)) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - return(0); - case COMPARE_INT_VAR: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - l=*(long *)csi->ip; - csi->ip+=4; /* Skip static value */ - if(!lp) { /* Unknown variable */ - csi->logic=LOGIC_FALSE; - return(0); } - if(*lp>l) - csi->logic=LOGIC_GREATER; - else if(*lp<l) - csi->logic=LOGIC_LESS; - else - csi->logic=LOGIC_EQUAL; - return(0); - case COMPARE_VARS: - lp1=lp2=0; - (char **)pp1=getstrvar(csi,*(long *)csi->ip); - if(!pp1) - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - (char **)pp2=getstrvar(csi,*(long *)csi->ip); - if(!pp2) - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - - if(((!pp1 || !*pp1) && !lp1) - || ((!pp2 || !*pp2) && !lp2)) { - if(pp1 && pp2) /* Both unitialized or blank */ - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - return(0); } - - if(pp1) { /* ASCII */ - if(!pp2) { - ltoa(*lp2,tmp,10); - csi->logic=stricmp(*pp1,tmp); } - else - csi->logic=stricmp(*pp1,*pp2); - return(0); } - - /* Binary */ - if(!lp2) { - l=strtol(*pp2,0,0); - if(*lp1>l) - csi->logic=LOGIC_GREATER; - else if(*lp1<l) - csi->logic=LOGIC_LESS; - else - csi->logic=LOGIC_EQUAL; - return(0); } - if(*lp1>*lp2) - csi->logic=LOGIC_GREATER; - else if(*lp1<*lp2) - csi->logic=LOGIC_LESS; - else - csi->logic=LOGIC_EQUAL; - return(0); - case COPY_VAR: - lp1=lp2=0; - (char **)pp1=getstrvar(csi,*(long *)csi->ip); - if(!pp1) - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - (char **)pp2=getstrvar(csi,*(long *)csi->ip); - if(!pp2) - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - - if((!pp1 && !lp1) - || ((!pp2 || !*pp2) && !lp2)) { - csi->logic=LOGIC_FALSE; - return(0); } - csi->logic=LOGIC_TRUE; - - if(pp1) { /* ASCII */ - if(!pp2) - ltoa(*lp2,tmp,10); - else - strcpy(tmp,*pp2); - *pp1=copystrvar(csi,*pp1,tmp); - return(0); } - if(!lp2) - *lp1=strtol(*pp2,0,0); - else - *lp1=*lp2; - return(0); - case SWAP_VARS: - lp1=lp2=0; - (char **)pp1=getstrvar(csi,*(long *)csi->ip); - if(!pp1) - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - (char **)pp2=getstrvar(csi,*(long *)csi->ip); - if(!pp2) - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - - if(((!pp1 || !*pp1) && !lp1) - || ((!pp2 || !*pp2) && !lp2)) { - csi->logic=LOGIC_FALSE; - return(0); } - - csi->logic=LOGIC_TRUE; - - if(pp1) { /* ASCII */ - if(!pp2) { - if(!strnicmp(*pp2,"0x",2)) { - l=strtol((*pp1)+2,0,16); - ltoa(*lp2,tmp,16); } - else { - l=atol(*pp1); - ltoa(*lp2,tmp,10); } - *pp1=copystrvar(csi,*pp1,tmp); - *lp2=l; } - else { - p=*pp1; - *pp1=*pp2; - *pp2=p; } - return(0); } - - /* Binary */ - if(!lp2) { - if(!strnicmp(*pp2,"0x",2)) { - l=strtol((*pp2)+2,0,16); - ltoa(*lp1,tmp,16); } - else { - l=atol(*pp2); - ltoa(*lp1,tmp,10); } - *pp2=copystrvar(csi,*pp2,tmp); - *lp1=l; } - else { - l=*lp1; - *lp1=*lp2; - *lp2=l; } - return(0); - case CAT_STR_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - strcpy(tmp,csi->ip); - while(*(csi->ip++)); - if(pp && *pp) - for(i=0;i<MAX_SYSVARS;i++) - if(*pp==sysvar_p[i]) - break; - if(pp && *pp!=csi->str && i==MAX_SYSVARS) { - if(*pp) - *pp=REALLOC(*pp,strlen(*pp)+strlen(tmp)+1); - else - *pp=REALLOC(*pp,strlen(tmp)+1); } - if(pp && *pp) - strcat(*pp,tmp); - return(0); - case CAT_STR_VARS: - (char **)pp1=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip dest variable name */ - (char **)pp2=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip source variable name */ - if(!pp1 || !pp2 || !*pp2) { - csi->logic=LOGIC_FALSE; - return(0); } - csi->logic=LOGIC_TRUE; - if(*pp1) - for(i=0;i<MAX_SYSVARS;i++) - if(*pp1==sysvar_p[i]) - break; - if(*pp1!=csi->str && (!*pp1 || i==MAX_SYSVARS)) { - if(*pp1) - *pp1=REALLOC(*pp1,strlen(*pp1)+strlen(*pp2)+1); - else - *pp1=REALLOC(*pp1,strlen(*pp2)+1); } - strcat(*pp1,*pp2); - return(0); - case FORMAT_STR_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - strcpy(str,csi->ip); - while(*(csi->ip++)); /* Find NULL */ - j=*(csi->ip++); /* total args */ - for(i=0;i<j;i++) { - vp=getstrvar(csi,*(long *)csi->ip); - if(!vp) { - lp=getintvar(csi,*(long *)csi->ip); - if(!lp) - arglist[i]=0; - else - arglist[i]=(void *)*lp; } - else - arglist[i]=*(char **)vp; - csi->ip+=4; } - vsprintf(tmp,str,arglist); - cmdstr(tmp,path,csi->str,str); - if(pp) - *pp=copystrvar(csi,*pp,str); - return(0); - case FORMAT_TIME_STR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - strcpy(str,csi->ip); - while(*(csi->ip++)); /* Find NULL */ - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp && lp) { - tm_p=gmtime(lp); - strftime(buf,128,str,tm_p); - *pp=copystrvar(csi,*pp,buf); } - return(0); - case TIME_STR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip str variable name */ - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip int variable name */ - if(pp && lp) { - strcpy(str,timestr(lp)); - *pp=copystrvar(csi,*pp,str); } - return(0); - case DATE_STR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip str variable name */ - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip int variable name */ - if(pp && lp) { - unixtodstr(*lp,str); - *pp=copystrvar(csi,*pp,str); } - return(0); - case SECOND_STR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip str variable name */ - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip int variable name */ - if(pp && lp) { - sectostr(*lp,str); - *pp=copystrvar(csi,*pp,str); } - return(0); - case STRUPR_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp && *pp) - strupr(*pp); - return(0); - case STRLWR_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp && *pp) - strlwr(*pp); - return(0); - case TRUNCSP_STR_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp && *pp) - truncsp(*pp); - return(0); - case STRIP_CTRL_STR_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp && *pp) - strip_ctrl(*pp); - return(0); - - case ADD_INT_VAR: - case SUB_INT_VAR: - case MUL_INT_VAR: - case DIV_INT_VAR: - case MOD_INT_VAR: - case AND_INT_VAR: - case OR_INT_VAR: - case NOT_INT_VAR: - case XOR_INT_VAR: - i=*(csi->ip-1); - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - l=*(long *)csi->ip; - csi->ip+=4; - if(!lp) - return(0); - switch(i) { - case ADD_INT_VAR: - *lp+=l; - break; - case SUB_INT_VAR: - *lp-=l; - break; - case MUL_INT_VAR: - *lp*=l; - break; - case DIV_INT_VAR: - *lp/=l; - break; - case MOD_INT_VAR: - *lp%=l; - break; - case AND_INT_VAR: - *lp&=l; - break; - case OR_INT_VAR: - *lp|=l; - break; - case NOT_INT_VAR: - *lp&=~l; - break; - case XOR_INT_VAR: - *lp^=l; - break; } - return(0); - case ADD_INT_VARS: - case SUB_INT_VARS: - case MUL_INT_VARS: - case DIV_INT_VARS: - case MOD_INT_VARS: - case AND_INT_VARS: - case OR_INT_VARS: - case NOT_INT_VARS: - case XOR_INT_VARS: - i=*(csi->ip-1); - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(!lp1) - return(0); - if(!lp2) { - (char **)pp=getstrvar(csi,*(long *)csi->ip); - if(!pp || !*pp) - return(0); - l=strtol(*pp,0,0); } - else - l=*lp2; - switch(i) { - case ADD_INT_VARS: - *lp1+=l; - break; - case SUB_INT_VARS: - *lp1-=l; - break; - case MUL_INT_VARS: - *lp1*=l; - break; - case DIV_INT_VARS: - *lp1/=l; - break; - case MOD_INT_VARS: - *lp1%=l; - break; - case AND_INT_VARS: - *lp1&=l; - break; - case OR_INT_VARS: - *lp1|=l; - break; - case NOT_INT_VARS: - *lp1&=~l; - break; - case XOR_INT_VARS: - *lp1^=l; - break; } - return(0); - case RANDOM_INT_VAR: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - l=*(long *)csi->ip; - csi->ip+=4; - if(lp) - *lp=random(l); - return(0); - case TIME_INT_VAR: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp) - *lp=time(NULL); - return(0); - case DATE_STR_TO_INT: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp && pp && *pp) - *lp=dstrtounix(*pp); - return(0); - case STRLEN_INT_VAR: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp) { - if(pp && *pp) - *lp=strlen(*pp); - else - *lp=0; } - return(0); - case CRC16_TO_INT: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp) { - if(pp && *pp) - *lp=crc16(*pp); - else - *lp=0; } - return(0); - case CRC32_TO_INT: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp) { - if(pp && *pp) - *lp=crc32(*pp,strlen(*pp)); - else - *lp=0; } - return(0); - case CHKSUM_TO_INT: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp) { - *lp=0; - if(pp && *pp) { - i=0; - while(*((*pp)+i)) - *lp+=(uchar)*((*pp)+(i++)); } } - return(0); - case FLENGTH_TO_INT: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp) { - if(pp && *pp) - *lp=flength(*pp); - else - *lp=0; } - return(0); - case FTIME_TO_INT: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp) { - if(pp && *pp) - *lp=fdate_dir(*pp); - else - *lp=0; } - return(0); - case CHARVAL_TO_INT: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp) { - if(pp && *pp) - *lp=**pp; - else - *lp=0; } - return(0); - case GETSTR_VAR: - case GETLINE_VAR: - case GETNAME_VAR: - case GETSTRUPR_VAR: - case GETSTR_MODE: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - i=*(csi->ip++); - csi->logic=LOGIC_FALSE; - switch(*(csi->ip-6)) { - case GETNAME_VAR: - getstr(buf,i,K_UPRLWR); - break; - case GETSTRUPR_VAR: - getstr(buf,i,K_UPPER); - break; - case GETLINE_VAR: - getstr(buf,i,K_LINE); - break; - case GETSTR_MODE: - l=*(long *)csi->ip; - csi->ip+=4; - if(l&K_EDIT) { - if(pp && *pp) - strcpy(buf,*pp); - else - buf[0]=0; } - getstr(buf,i,l); - break; - default: - getstr(buf,i,0); } - if(sys_status&SS_ABORT) - return(0); - if(pp) { - *pp=copystrvar(csi,*pp,buf); - csi->logic=LOGIC_TRUE; } - return(0); - case GETNUM_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - if(!pp) - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - i=*(short *)csi->ip; - csi->ip+=2; - csi->logic=LOGIC_FALSE; - l=getnum(i); - if(!pp && !lp) - return(0); - if(pp) { - if(l<=0) - str[0]=0; - else - ltoa(l,str,10); - *pp=copystrvar(csi,*pp,str); - csi->logic=LOGIC_TRUE; - return(0); } - if(lp) { - *lp=l; - csi->logic=LOGIC_TRUE; } - return(0); - - case SHIFT_STR_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - i=*(csi->ip++); - if(!pp || !*pp) - return(0); - if(strlen(*pp)>=i) - memmove(*pp,*pp+i,strlen(*pp)+1); - return(0); - - case CHKFILE_VAR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp && *pp && fexist(cmdstr(*pp,path,csi->str,buf))) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - return(0); - case PRINTFILE_VAR_MODE: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - i=*(short *)(csi->ip); - csi->ip+=2; - if(pp && *pp) - printfile(*pp,i); - return(0); - case PRINTTAIL_VAR_MODE: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - i=*(short *)(csi->ip); - csi->ip+=2; - j=*csi->ip; - csi->ip++; - if(pp && *pp) - printtail(*pp,j,i); - return(0); - case SEND_FILE_VIA: - case RECEIVE_FILE_VIA: - j=*(csi->ip-1); - ch=*(csi->ip++); /* Protocol */ - cmdstr(csi->ip,csi->str,csi->str,str); - while(*(csi->ip++)); /* Find NULL */ - for(i=0;i<total_prots;i++) - if(prot[i]->mnemonic==ch && chk_ar(prot[i]->ar,useron)) - break; - csi->logic=LOGIC_FALSE; - if(i<total_prots) - if(external(cmdstr(j==SEND_FILE_VIA - ? prot[i]->dlcmd : prot[i]->ulcmd,str,str,buf) - ,EX_OUTL)==0) - csi->logic=LOGIC_TRUE; - return(0); - case SEND_FILE_VIA_VAR: - case RECEIVE_FILE_VIA_VAR: - j=*(csi->ip-1); - ch=*(csi->ip++); /* Protocol */ - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - for(i=0;i<total_prots;i++) - if(prot[i]->mnemonic==ch && chk_ar(prot[i]->ar,useron)) - break; - csi->logic=LOGIC_FALSE; - if(!pp || !(*pp)) - return(0); - if(i<total_prots) - if(external(cmdstr(j==SEND_FILE_VIA_VAR - ? prot[i]->dlcmd : prot[i]->ulcmd,*pp,*pp,buf) - ,EX_OUTL)==0) - csi->logic=LOGIC_TRUE; - return(0); - - default: - errormsg(WHERE,ERR_CHK,"var sub-instruction",*(csi->ip-1)); - return(0); } - - case CS_FIO_FUNCTION: - switch(*(csi->ip++)) { /* sub-op-code stored as next byte */ - case FIO_OPEN: - case FIO_OPEN_VAR: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - w=*(ushort *)csi->ip; - csi->ip+=2; - csi->logic=LOGIC_FALSE; - if(*(csi->ip-7)==FIO_OPEN) { - cmdstr(csi->ip,path,csi->str,str); - while(*(csi->ip++)); } /* skip filename */ - else { - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(!pp || !*pp) - return(0); - strcpy(str,*pp); } - if(csi->files>=MAX_FOPENS) - return(0); - if(lp) { - /* Access flags are not cross-platform, so convert */ - i=0; - if(w&1) i|=O_RDONLY; - if(w&2) i|=O_WRONLY; - if(w&4) i|=O_RDWR; - if(w&0x040) i|=O_DENYNONE; - if(w&0x100) i|=O_CREAT; - if(w&0x200) i|=O_TRUNC; - if(w&0x400) i|=O_EXCL; - if(w&0x800) i|=O_APPEND; - *lp=(long)fnopen(&j,str,i); - if(*lp) { - for(i=0;i<csi->files;i++) - if(!csi->file[i]) - break; - csi->file[i]=(FILE *)*lp; - if(i==csi->files) - csi->files++; - csi->logic=LOGIC_TRUE; } } - return(0); - case FIO_CLOSE: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp && *lp) { - csi->logic=fclose((FILE *)*lp); - for(i=0;i<csi->files;i++) - if(csi->file[i]==(FILE *)*lp) - csi->file[i]=0; } - else - csi->logic=LOGIC_FALSE; - return(0); - case FIO_FLUSH: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp && *lp) - csi->logic=fflush((FILE *)*lp); - else - csi->logic=LOGIC_FALSE; - return(0); - case FIO_READ: - case FIO_READ_VAR: - lp1=getintvar(csi,*(long *)csi->ip); /* Handle */ - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - if(!pp) - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - csi->logic=LOGIC_FALSE; - if(*(csi->ip-9)==FIO_READ) { - i=*(short *)csi->ip; - csi->ip+=2; /* Length */ } - else { /* FIO_READ_VAR */ - vp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(!vp) - return(0); - i=*(short *)vp; } - if(i>1024) - i=1024; - if(!lp1 || !(*lp1) || (!pp && !lp2)) - return(0); - if(pp) { - if(i<1) { - if(*pp && **pp) - i=strlen(*pp); - else - i=128; } - if((j=fread(buf,1,i,(FILE *)*lp1))==i) - csi->logic=LOGIC_TRUE; - buf[j]=0; - if(csi->etx) { - p=strchr(buf,csi->etx); - if(p) *p=0; } - *pp=copystrvar(csi,*pp,buf); } - else { - *lp2=0; - if(i>4 || i<1) i=4; - if(fread(lp2,1,i,(FILE *)*lp1)==i) - csi->logic=LOGIC_TRUE; } - return(0); - case FIO_READ_LINE: - lp1=getintvar(csi,*(long *)csi->ip); /* Handle */ - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - if(!pp) - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - csi->logic=LOGIC_FALSE; - if(!lp1 || !(*lp1) || feof((FILE *)*lp1) || (!pp && !lp2)) - return(0); - csi->logic=LOGIC_TRUE; - for(i=0;i<1024 /* && !eof(*lp1) removed 1/23/96 */;i++) { - if(!fread(buf+i,1,1,(FILE *)*lp1)) - break; - if(*(buf+i)==LF) { - i++; - break; } } - buf[i]=0; - if(csi->etx) { - p=strchr(buf,csi->etx); - if(p) *p=0; } - if(pp) - *pp=copystrvar(csi,*pp,buf); - else - *lp2=strtol(buf,0,0); - return(0); - case FIO_WRITE: - case FIO_WRITE_VAR: - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - if(!pp) - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - csi->logic=LOGIC_FALSE; - if(*(csi->ip-9)==FIO_WRITE) { - i=*(short *)csi->ip; - csi->ip+=2; /* Length */ } - else { /* FIO_WRITE_VAR */ - vp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(!vp) - return(0); - i=*(short *)vp; } - if(i>1024) - i=1024; - if(!lp1 || !(*lp1) || (!pp && !lp2) || (pp && !*pp)) - return(0); - if(pp) { - j=strlen(*pp); - if(i<1) i=j; - if(j>i) j=i; - j=fwrite(*pp,1,j,(FILE *)*lp1); - if(j<i) { - memset(buf,csi->etx,i-j); - fwrite(buf,1,i-j,(FILE *)*lp1); } - csi->logic=LOGIC_TRUE; } - else { - if(i<1 || i>4) i=4; - if(fwrite(lp2,1,i,(FILE *)*lp1)==i) - csi->logic=LOGIC_TRUE; } - return(0); - case FIO_GET_LENGTH: - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp1 && *lp1 && lp2) - *lp2=filelength(fileno((FILE *)*lp1)); - return(0); - case FIO_GET_TIME: - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp1 && *lp1 && lp2) { - getftime(fileno((FILE *)*lp1),&ft); - *lp2=ftimetounix(ft); } - return(0); - case FIO_SET_TIME: - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp1 && *lp1 && lp2) { - ft=unixtoftime(*lp2); - setftime(fileno((FILE *)*lp1),&ft); } - return(0); - case FIO_EOF: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - csi->logic=LOGIC_FALSE; - if(lp && *lp) - if(ftell((FILE *)*lp)>=filelength(fileno((FILE *)*lp))) - csi->logic=LOGIC_TRUE; - return(0); - case FIO_GET_POS: - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp1 && *lp1 && lp2) - *lp2=ftell((FILE *)*lp1); - return(0); - case FIO_SEEK: - case FIO_SEEK_VAR: - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - csi->logic=LOGIC_FALSE; - if(*(csi->ip-5)==FIO_SEEK) { - l=*(long *)csi->ip; - csi->ip+=4; } - else { - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(!lp2) { - csi->ip+=2; - return(0); } - l=*lp2; } - i=*(short *)csi->ip; - csi->ip+=2; - if(lp1 && *lp1) - if(fseek((FILE *)*lp1,l,i)!=-1) - csi->logic=LOGIC_TRUE; - return(0); - case FIO_LOCK: - case FIO_LOCK_VAR: - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - csi->logic=LOGIC_FALSE; - if(*(csi->ip-5)==FIO_LOCK) { - l=*(long *)csi->ip; - csi->ip+=4; } - else { - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(!lp2) - return(0); - l=*lp2; } - if(lp1 && *lp1) { - fflush((FILE *)*lp1); - lseek(fileno((FILE *)*lp1),ftell((FILE *)*lp1),SEEK_SET); - csi->logic=locking(fileno((FILE *)*lp1),LK_LOCK,l); } - return(0); - case FIO_UNLOCK: - case FIO_UNLOCK_VAR: - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - csi->logic=LOGIC_FALSE; - if(*(csi->ip-5)==FIO_UNLOCK) { - l=*(long *)csi->ip; - csi->ip+=4; } - else { - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(!lp2) - return(0); - l=*lp2; } - if(lp1 && *lp1) { - fflush((FILE *)*lp1); - lseek(fileno((FILE *)*lp1),ftell((FILE *)*lp1),SEEK_SET); - csi->logic=locking(fileno((FILE *)*lp1),LK_UNLCK,l); } - return(0); - case FIO_SET_LENGTH: - case FIO_SET_LENGTH_VAR: - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - csi->logic=LOGIC_FALSE; - if(*(csi->ip-5)==FIO_SET_LENGTH) { - l=*(long *)csi->ip; - csi->ip+=4; } - else { - lp2=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(!lp2) - return(0); - l=*lp2; } - if(lp1 && *lp1) - csi->logic=chsize(fileno((FILE *)*lp1),l); - return(0); - case FIO_PRINTF: - lp1=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - strcpy(str,csi->ip); - while(*(csi->ip++)); /* Find NULL */ - j=*(csi->ip++); /* total args */ - for(i=0;i<j;i++) { - vp=getstrvar(csi,*(long *)csi->ip); - if(!vp) { - lp2=getintvar(csi,*(long *)csi->ip); - if(!lp2) - arglist[i]=0; - else - arglist[i]=(void *)*lp2; } - else - arglist[i]=*(char **)vp; - csi->ip+=4; } - vsprintf(tmp,str,arglist); - if(lp1 && *lp1) { - cmdstr(tmp,path,csi->str,str); - fwrite(str,1,strlen(str),(FILE *)*lp1); } - return(0); - case FIO_SET_ETX: - csi->etx=*(csi->ip++); - return(0); - case REMOVE_FILE: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp && *pp && remove(*pp)==0) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - return(0); - case RENAME_FILE: - case COPY_FILE: - case MOVE_FILE: - (char **)pp1=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; /* Skip variable name */ - (char **)pp2=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp1 && *pp1 && pp2 && *pp2) - switch(*(csi->ip-9)) { - case RENAME_FILE: - csi->logic=rename(*pp1,*pp2); - break; - case COPY_FILE: - csi->logic=mv(*pp1,*pp2,1); - break; - case MOVE_FILE: - csi->logic=mv(*pp1,*pp2,0); - break; } - else - csi->logic=LOGIC_FALSE; - return(0); - case GET_FILE_ATTRIB: - case SET_FILE_ATTRIB: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp && *pp && lp) { - if(*(csi->ip-9)==GET_FILE_ATTRIB) - *lp=_chmod(*pp,0,0); - else - *lp=_chmod(*pp,1,(int)*lp); } - return(0); - case MAKE_DIR: - case REMOVE_DIR: - case CHANGE_DIR: - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(pp && *pp) - switch(*(csi->ip-5)) { - case MAKE_DIR: - csi->logic=mkdir(*pp); - break; - case REMOVE_DIR: - csi->logic=rmdir(*pp); - break; - case CHANGE_DIR: - csi->logic=chdir(*pp); - break; } - else - csi->logic=LOGIC_FALSE; - return(0); - case OPEN_DIR: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - csi->logic=LOGIC_FALSE; - if(pp && *pp && lp) { - *lp=(long)opendir((char *)*pp); - if(*lp) - csi->logic=LOGIC_TRUE; } - return(0); - case READ_DIR: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - (char **)pp=getstrvar(csi,*(long *)csi->ip); - csi->ip+=4; - csi->logic=LOGIC_FALSE; - if(pp && lp) { - de=readdir((DIR *)(*lp)); - if(de!=NULL) { - csi->logic=LOGIC_TRUE; - *pp=copystrvar(csi,*pp,de->d_name); } } - return(0); - case REWIND_DIR: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp) { - rewinddir((DIR *)(*lp)); - csi->logic=LOGIC_TRUE; } - else - csi->logic=LOGIC_FALSE; - return(0); - case CLOSE_DIR: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(lp && closedir((DIR *)(*lp))==0) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - return(0); - default: - errormsg(WHERE,ERR_CHK,"fio sub-instruction",*(csi->ip-1)); - return(0); } - - - case CS_SWITCH: - lp=getintvar(csi,*(long *)csi->ip); - csi->ip+=4; - if(!lp) { - skipto(csi,CS_END_SWITCH); - csi->ip++; } - else { - csi->misc|=CS_IN_SWITCH; - csi->switch_val=*lp; } - return(0); - case CS_CASE: - l=*(long *)csi->ip; - csi->ip+=4; - if(csi->misc&CS_IN_SWITCH && csi->switch_val!=l) - skipto(csi,CS_NEXTCASE); - else - csi->misc&=~CS_IN_SWITCH; - return(0); - case CS_COMPARE_ARS: - i=*(csi->ip++); /* Length of ARS stored as byte before ARS */ - csi->logic=!chk_ar(csi->ip,useron); - csi->ip+=i; - return(0); - case CS_TOGGLE_USER_MISC: - useron.misc^=*(long *)csi->ip; - putuserrec(useron.number,U_MISC,8,ultoa(useron.misc,tmp,16)); - csi->ip+=4; - return(0); - case CS_COMPARE_USER_MISC: - if((useron.misc&*(long *)csi->ip)==*(long *)csi->ip) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - csi->ip+=4; - return(0); - case CS_TOGGLE_USER_CHAT: - useron.chat^=*(long *)csi->ip; - putuserrec(useron.number,U_CHAT,8,ultoa(useron.chat,tmp,16)); - csi->ip+=4; - return(0); - case CS_COMPARE_USER_CHAT: - if((useron.chat&*(long *)csi->ip)==*(long *)csi->ip) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - csi->ip+=4; - return(0); - case CS_TOGGLE_USER_QWK: - useron.qwk^=*(long *)csi->ip; - putuserrec(useron.number,U_QWK,8,ultoa(useron.qwk,tmp,16)); - csi->ip+=4; - return(0); - case CS_COMPARE_USER_QWK: - if((useron.qwk&*(long *)csi->ip)==*(long *)csi->ip) - csi->logic=LOGIC_TRUE; - else - csi->logic=LOGIC_FALSE; - csi->ip+=4; - return(0); - case CS_REPLACE_TEXT: - i=*(ushort *)csi->ip; - csi->ip+=2; - i--; - if(i>=TOTAL_TEXT) { - errormsg(WHERE,ERR_CHK,"replace text #",i); - while(*(csi->ip++)); /* Find NULL */ - return(0); } - if(text[i]!=text_sav[i] && text[i]!=nulstr) - FREE(text[i]); - j=strlen(cmdstr(csi->ip,path,csi->str,buf)); - if(!j) - text[i]=nulstr; - else - text[i]=MALLOC(j+1); - if(!text[i]) { - errormsg(WHERE,ERR_ALLOC,"replacement text",j); - while(*(csi->ip++)); /* Find NULL */ - text[i]=text_sav[i]; - return(0); } - if(j) - strcpy(text[i],buf); - while(*(csi->ip++)); /* Find NULL */ - return(0); - case CS_USE_INT_VAR: // Self-modifying code! - (char **)pp=getstrvar(csi,*(long *)csi->ip); - if(pp && *pp) - l=strtol(*pp,0,0); - else { - lp=getintvar(csi,*(long *)csi->ip); - if(lp) - l=*lp; - else - l=0; } - csi->ip+=4; // Variable - i=*(csi->ip++); // Offset - if(i<1 || csi->ip+1+i>=csi->cs+csi->length) { - errormsg(WHERE,ERR_CHK,"offset",i); - csi->ip++; - return(0); } - switch(*(csi->ip++)) { // Length - case sizeof(char): - *(csi->ip+i)=(char)l; - break; - case sizeof(short): - *((short *)(csi->ip+i))=(short)l; - break; - case sizeof(long): - *((long *)(csi->ip+i))=l; - break; - default: - errormsg(WHERE,ERR_CHK,"length",*(csi->ip-1)); - break; } - return(0); - default: - errormsg(WHERE,ERR_CHK,"shell instruction",*(csi->ip-1)); - return(0); } -} diff --git a/src/sbbs2/execmsg.c b/src/sbbs2/execmsg.c deleted file mode 100644 index 510a24ce73..0000000000 --- a/src/sbbs2/execmsg.c +++ /dev/null @@ -1,301 +0,0 @@ -#line 1 "EXECMSG.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -int execmsg(csi_t *csi) -{ - uchar str[256],tmp2[128],*path,ch,*p; - int s,file,x,y; - long i,j,k; // Changes from ints - 03/25/96 - long l; - stats_t stats; - node_t node; - file_t f; - time_t t; - csi_t bin; - - -switch(*(csi->ip++)) { - - case CS_MSG_SELECT_AREA: - csi->logic=LOGIC_FALSE; - if(!usrgrps) return(0); - while(online) { - j=0; - if(usrgrps>1) { - sprintf(str,"%sMENU\\GRPS.*",text_dir); - if(fexist(str)) - menu("GRPS"); - else { - bputs(text[CfgGrpLstHdr]); - for(i=0;i<usrgrps && !msgabort();i++) { - if(i==curgrp) - outchar('*'); - else outchar(SP); - if(i<9) outchar(SP); - if(i<99) outchar(SP); - bprintf(text[CfgGrpLstFmt] - ,i+1,grp[usrgrp[i]]->lname); } } - sprintf(str,text[JoinWhichGrp],curgrp+1); - mnemonics(str); - j=getnum(usrgrps); - if((int)j==-1) - return(0); - if(!j) - j=curgrp; - else - j--; } - sprintf(str,"%sMENU\\SUBS%u.*",text_dir,usrgrp[j]+1); - if(fexist(str)) { - sprintf(str,"SUBS%u",usrgrp[j]+1); - menu(str); } - else { - CLS; - bprintf(text[SubLstHdr],grp[usrgrp[j]]->lname); - for(i=0;i<usrsubs[j] && !msgabort();i++) { - if(i==cursub[j]) outchar('*'); - else outchar(SP); - sprintf(str,text[SubLstFmt],i+1 - ,sub[usrsub[j][i]]->lname,nulstr - ,getposts(usrsub[j][i])); - if(i<9) outchar(SP); - if(i<99) outchar(SP); - bputs(str); } } - sprintf(str,text[JoinWhichSub],cursub[j]+1); - mnemonics(str); - i=getnum(usrsubs[j]); - if((int)i==-1) { - if(usrgrps==1) - return(0); - continue; } - if(!i) - i=cursub[j]; - else - i--; - curgrp=j; - cursub[curgrp]=i; - csi->logic=LOGIC_TRUE; - return(0); } - return(0); - - case CS_MSG_GET_SUB_NUM: - - if(useron.misc&COLDKEYS) { - i=atoi(csi->str); - if(i && usrgrps && i<=usrsubs[curgrp]) - cursub[curgrp]=i-1; - return(0); } - - ch=getkey(K_UPPER); - outchar(ch); - if(usrgrps && (ch&0xf)*10<=usrsubs[curgrp] && (ch&0xf)) { - i=(ch&0xf)*10; - ch=getkey(K_UPPER); - if(!isdigit(ch) && ch!=CR) { - ungetkey(ch); - cursub[curgrp]=(i/10)-1; - return(0); } - outchar(ch); - if(ch==CR) { - cursub[curgrp]=(i/10)-1; - return(0); } - logch(ch,0); - i+=ch&0xf; - if(i*10<=usrsubs[curgrp]) { /* 100+ subs */ - i*=10; - ch=getkey(K_UPPER); - if(!isdigit(ch) && ch!=CR) { - ungetkey(ch); - cursub[curgrp]=(i/10)-1; - return(0); } - outchar(ch); - if(ch==CR) { - cursub[curgrp]=(i/10)-1; - return(0); } - logch(ch,0); - i+=ch&0xf; } - if(i<=usrsubs[curgrp]) - cursub[curgrp]=i-1; - return(0); } - if((ch&0xf)<=usrsubs[curgrp] && (ch&0xf) && usrgrps) - cursub[curgrp]=(ch&0xf)-1; - return(0); - - case CS_MSG_GET_GRP_NUM: - - if(useron.misc&COLDKEYS) { - i=atoi(csi->str); - if(i && i<=usrgrps) - curgrp=i-1; - return(0); } - - ch=getkey(K_UPPER); - outchar(ch); - if((ch&0xf)*10<=usrgrps && (ch&0xf)) { - i=(ch&0xf)*10; - ch=getkey(K_UPPER); - if(!isdigit(ch) && ch!=CR) { - ungetkey(ch); - curgrp=(i/10)-1; - return(0); } - outchar(ch); - if(ch==CR) { - curgrp=(i/10)-1; - return(0); } - logch(ch,0); - i+=ch&0xf; - if(i<=usrgrps) - curgrp=i-1; - return(0); } - if((ch&0xf)<=usrgrps && (ch&0xf)) - curgrp=(ch&0xf)-1; - return(0); - - case CS_MSG_SET_GROUP: - csi->logic=LOGIC_TRUE; - for(i=0;i<usrgrps;i++) - if(!stricmp(grp[usrgrp[i]]->sname,csi->str)) - break; - if(i<usrgrps) - curgrp=i; - else - csi->logic=LOGIC_FALSE; - return(0); - - case CS_MSG_SHOW_GROUPS: - if(!usrgrps) return(0); - sprintf(str,"%sMENU\\GRPS.*",text_dir); - if(fexist(str)) { - menu("GRPS"); - return(0); } - bputs(text[GrpLstHdr]); - for(i=0;i<usrgrps && !msgabort();i++) { - if(i==curgrp) - outchar('*'); - else outchar(SP); - if(i<9) outchar(SP); - bprintf(text[GrpLstFmt],i+1 - ,grp[usrgrp[i]]->lname,nulstr,usrsubs[i]); } - return(0); - - case CS_MSG_SHOW_SUBBOARDS: - if(!usrgrps) return(0); - sprintf(str,"%sMENU\\SUBS%u.*",text_dir,usrgrp[curgrp]+1); - if(fexist(str)) { - sprintf(str,"SUBS%u",usrgrp[curgrp]+1); - menu(str); - return(0); } - CRLF; - bprintf(text[SubLstHdr],grp[usrgrp[curgrp]]->lname); - for(i=0;i<usrsubs[curgrp] && !msgabort();i++) { - if(i==cursub[curgrp]) outchar('*'); - else outchar(SP); - sprintf(str,text[SubLstFmt],i+1 - ,sub[usrsub[curgrp][i]]->lname,nulstr - ,getposts(usrsub[curgrp][i])); - if(i<9) outchar(SP); - if(i<99) outchar(SP); - bputs(str); } - return(0); - - case CS_MSG_GROUP_UP: - curgrp++; - if(curgrp>=usrgrps) - curgrp=0; - return(0); - case CS_MSG_GROUP_DOWN: - if(!curgrp) - curgrp=usrgrps-1; - else curgrp--; - return(0); - case CS_MSG_SUBBOARD_UP: - if(!usrgrps) return(0); - cursub[curgrp]++; - if(cursub[curgrp]>=usrsubs[curgrp]) - cursub[curgrp]=0; - return(0); - case CS_MSG_SUBBOARD_DOWN: - if(!usrgrps) return(0); - if(!cursub[curgrp]) - cursub[curgrp]=usrsubs[curgrp]-1; - else cursub[curgrp]--; - return(0); - case CS_MSG_SET_AREA: - csi->logic=LOGIC_TRUE; - for(i=0;i<usrgrps;i++) - for(j=0;j<usrsubs[i];j++) - if(!stricmp(csi->str,sub[usrsub[i][j]]->code)) { - curgrp=i; - cursub[i]=j; - return(0); } - csi->logic=LOGIC_FALSE; - return(0); - case CS_MSG_READ: - if(!usrgrps) return(0); - csi->logic=scanposts(usrsub[curgrp][cursub[curgrp]],0,nulstr); - return(0); - case CS_MSG_POST: - if(!usrgrps) return(0); - csi->logic=LOGIC_FALSE; - if(!chk_ar(sub[usrsub[curgrp][cursub[curgrp]]]->post_ar,useron)) { - bputs(text[CantPostOnSub]); - return(0); } - csi->logic=!postmsg(usrsub[curgrp][cursub[curgrp]],0,0); - return(0); - case CS_MSG_QWK: - qwk_sec(); - return(0); - case CS_MSG_PTRS_CFG: - new_scan_ptr_cfg(); - return(0); - case CS_MSG_PTRS_REINIT: - for(i=0;i<total_subs;i++) { - sub[i]->ptr=sub_ptr[i]; - sub[i]->last=sub_last[i]; } - bputs(text[MsgPtrsInitialized]); - return(0); - case CS_MSG_NEW_SCAN_CFG: - new_scan_cfg(SUB_NSCAN); - return(0); - case CS_MSG_NEW_SCAN: - scansubs(SCAN_NEW); - return(0); - case CS_MSG_NEW_SCAN_SUB: - csi->logic=scanposts(usrsub[curgrp][cursub[curgrp]],SCAN_NEW,nulstr); - return(0); - case CS_MSG_NEW_SCAN_ALL: - scanallsubs(SCAN_NEW); - return(0); - case CS_MSG_CONT_SCAN: - scansubs(SCAN_NEW|SCAN_CONST); - return(0); - case CS_MSG_CONT_SCAN_ALL: - scanallsubs(SCAN_NEW|SCAN_CONST); - return(0); - case CS_MSG_BROWSE_SCAN: - scansubs(SCAN_NEW|SCAN_BACK); - return(0); - case CS_MSG_BROWSE_SCAN_ALL: - scanallsubs(SCAN_BACK|SCAN_NEW); - return(0); - case CS_MSG_FIND_TEXT: - scansubs(SCAN_FIND); - return(0); - case CS_MSG_FIND_TEXT_ALL: - scanallsubs(SCAN_FIND); - return(0); - case CS_MSG_YOUR_SCAN_CFG: - new_scan_cfg(SUB_SSCAN); - return(0); - case CS_MSG_YOUR_SCAN: - scansubs(SCAN_TOYOU); - return(0); - case CS_MSG_YOUR_SCAN_ALL: - scanallsubs(SCAN_TOYOU); - return(0); } -errormsg(WHERE,ERR_CHK,"shell function",*(csi->ip-1)); -return(0); -} diff --git a/src/sbbs2/execsbbs/execsbbs.c b/src/sbbs2/execsbbs/execsbbs.c deleted file mode 100644 index 7c491cb17b..0000000000 --- a/src/sbbs2/execsbbs/execsbbs.c +++ /dev/null @@ -1,59 +0,0 @@ -/* execbbs.c */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <dos.h> -#include <dir.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <process.h> - -extern unsigned _heaplen=2048; - -/* usage: execsbbs start_dir "program parms" sbbspath [r] */ - -int main(int argc, char *argv[]) -{ - char path[129],*comspec,*p,*arg[30],c; - int disk; - -if(argc<4) { - printf("This program is for the internal use of Synchronet.\r\n"); -/*** Debug stuff - printf("argc=%d\r\n",argc); - for(c=0;c<argc;c++) - printf("argv[%d]='%s'\n",c,argv[c]); -***/ - return(0); } -disk=getdisk(); -getcwd(path,128); -comspec=getenv("COMSPEC"); - -/*** /* Removed */ -strcpy(str,comspec); /* save comspec */ -strcpy(comspec,""); /* destroy comspec */ -***/ - -if(argv[1][1]==':') /* drive letter specified */ - setdisk(toupper(argv[1][0])-'A'); -chdir(argv[1]); - -p=strchr(argv[2],' '); -if(p) - p++; -if(spawnlpe(P_WAIT,comspec,comspec,"/c",argv[2],NULL,environ)) - printf("EXECSBBS: Error %d spawning %s\r\n",errno,argv[2]); -/*** -strcpy(comspec,str); /* restore comspec */ -***/ -setdisk(disk); -if(chdir(path)) - printf("\7\r\nEXECBBS: Error changing directory to %s\r\n",path); -for(c=0;c<30;c++) - arg[c]=argv[c+3]; -if(execve(arg[0],arg,environ)) - printf("EXECSBBS: Error %d executing %s\r\n",errno,arg[0]); -return(1); -} diff --git a/src/sbbs2/execsbbs/make.bat b/src/sbbs2/execsbbs/make.bat deleted file mode 100755 index a972501c13..0000000000 --- a/src/sbbs2/execsbbs/make.bat +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -bcc -w-pro -C -mt -ndos execsbbs.c -if errorlevel 1 goto end -exe2bin dos\execsbbs.exe dos\execsbbs.com -:end diff --git a/src/sbbs2/execsbbs/make.cmd b/src/sbbs2/execsbbs/make.cmd deleted file mode 100755 index 6791ea0b84..0000000000 --- a/src/sbbs2/execsbbs/make.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -w-pro -C -nos2 execsbbs.c diff --git a/src/sbbs2/fido.c b/src/sbbs2/fido.c deleted file mode 100644 index eddef53a58..0000000000 --- a/src/sbbs2/fido.c +++ /dev/null @@ -1,818 +0,0 @@ -#line 1 "FIDO.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/*********************************************/ -/* Functions that pertain solely to FidoNet */ -/*********************************************/ - -#include "sbbs.h" - -extern char *mon[]; -void inetmail(char *into, char *subj, char mode); -void qnetmail(char *into, char *subj, char mode); -int qwk_route(char *inaddr, char *fulladdr); - -void pt_zone_kludge(fmsghdr_t hdr,int fido) -{ - char str[256]; - -sprintf(str,"\1INTL %u:%u/%u %u:%u/%u\r" - ,hdr.destzone,hdr.destnet,hdr.destnode - ,hdr.origzone,hdr.orignet,hdr.orignode); -write(fido,str,strlen(str)); - -if(hdr.destpoint) { - sprintf(str,"\1TOPT %u\r" - ,hdr.destpoint); - write(fido,str,strlen(str)); } - -if(hdr.origpoint) { - sprintf(str,"\1FMPT %u\r" - ,hdr.origpoint); - write(fido,str,strlen(str)); } -} - -int lookup_netuser(char *into) -{ - char to[128],name[26],str[256],q[128]; - int i; - FILE *stream; - -if(strchr(into,'@')) - return(0); -strcpy(to,into); -strupr(to); -sprintf(str,"%sQNET\\USERS.DAT",data_dir); -if((stream=fnopen(&i,str,O_RDONLY))==NULL) - return(0); -while(!feof(stream)) { - if(!fgets(str,250,stream)) - break; - str[25]=0; - truncsp(str); - strcpy(name,str); - strupr(name); - str[35]=0; - truncsp(str+27); - sprintf(q,"Do you mean %s @%s",str,str+27); - if(strstr(name,to) && yesno(q)) { - fclose(stream); - sprintf(into,"%s@%s",str,str+27); - return(0); } - if(sys_status&SS_ABORT) - break; } -fclose(stream); -return(1); -} - -/****************************************************************************/ -/* Send FidoNet NetMail from BBS */ -/****************************************************************************/ -void netmail(char *into, char *title, char mode) -{ - char str[256],subj[128],to[256],fname[128],*buf,*p,ch; - int file,fido,x,cc_found,cc_sent; - uint i; - long length,l; - faddr_t addr; - fmsghdr_t hdr; - -sprintf(subj,"%.127s",title); - - -strcpy(to,into); - -lookup_netuser(to); - -p=strrchr(to,'@'); /* Find '@' in name@addr */ -if(p && !isdigit(*(p+1)) && !strchr(p,'.') && !strchr(p,':')) { - mode&=~WM_FILE; - qnetmail(to,title,mode|WM_NETMAIL); - return; } -if(p==NULL || !strchr(p+1,'/') || !total_faddrs) { - if(!p && dflt_faddr.zone) - addr=dflt_faddr; - else if(inetmail_misc&NMAIL_ALLOW) { - if(mode&WM_FILE && !SYSOP && !(inetmail_misc&NMAIL_FILE)) - mode&=~WM_FILE; - inetmail(into,title,mode|WM_NETMAIL); - return; } - else if(dflt_faddr.zone) - addr=dflt_faddr; - else { - bprintf("\1n\r\nInvalid NetMail address.\r\n"); - return; } } -else { - addr=atofaddr(p+1); /* Get fido address */ - *p=0; /* Chop off address */ - } - -if(mode&WM_FILE && !SYSOP && !(netmail_misc&NMAIL_FILE)) - mode&=~WM_FILE; - -if((!SYSOP && !(netmail_misc&NMAIL_ALLOW)) || useron.rest&FLAG('M') - || !total_faddrs) { - bputs(text[NoNetMailAllowed]); - return; } - -truncsp(to); /* Truncate off space */ - -memset(&hdr,0,sizeof(hdr)); /* Initialize header to null */ -strcpy(hdr.from,netmail_misc&NMAIL_ALIAS ? useron.alias : useron.name); -sprintf(hdr.to,"%.35s",to); - -/* Look-up in nodelist? */ - -if(netmail_cost && !(useron.exempt&FLAG('S'))) { - if(useron.cdt+useron.freecdt<netmail_cost) { - bputs(text[NotEnoughCredits]); - return; } - sprintf(str,text[NetMailCostContinueQ],netmail_cost); - if(noyes(str)) - return; } - - -now=time(NULL); -unixtodos(now,&date,&curtime); -sprintf(hdr.time,"%02u %3.3s %02u %02u:%02u:%02u" - ,date.da_day,mon[date.da_mon-1],TM_YEAR(date.da_year-1900) - ,curtime.ti_hour,curtime.ti_min,curtime.ti_sec); - -hdr.destzone =addr.zone; -hdr.destnet =addr.net; -hdr.destnode =addr.node; -hdr.destpoint =addr.point; - -for(i=0;i<total_faddrs;i++) - if(addr.zone==faddr[i].zone && addr.net==faddr[i].net) - break; -if(i==total_faddrs) { - for(i=0;i<total_faddrs;i++) - if(addr.zone==faddr[i].zone) - break; } -if(i==total_faddrs) - i=0; -hdr.origzone =faddr[i].zone; -hdr.orignet =faddr[i].net; -hdr.orignode =faddr[i].node; -hdr.origpoint =faddr[i].point; - -strcpy(str,faddrtoa(faddr[i])); -bprintf(text[NetMailing],hdr.to,faddrtoa(addr),hdr.from,str); - -hdr.attr=(FIDO_LOCAL|FIDO_PRIVATE); - -if(netmail_misc&NMAIL_CRASH) hdr.attr|=FIDO_CRASH; -if(netmail_misc&NMAIL_HOLD) hdr.attr|=FIDO_HOLD; -if(netmail_misc&NMAIL_KILL) hdr.attr|=FIDO_KILLSENT; -if(mode&WM_FILE) hdr.attr|=FIDO_FILE; - -sprintf(str,"%sNETMAIL.MSG",node_dir); -remove(str); /* Just incase it's already there */ -// mode&=~WM_FILE; -if(!writemsg(str,nulstr,subj,WM_NETMAIL|mode,INVALID_SUB,into)) { - bputs(text[Aborted]); - return; } - -if(mode&WM_FILE) { - strcpy(fname,subj); - sprintf(str,"%sFILE\\%04u.OUT",data_dir,useron.number); - mkdir(str); - strcpy(tmp,data_dir); - if(tmp[0]=='.') /* Relative path */ - sprintf(tmp,"%s%s",node_dir,data_dir); - sprintf(str,"%sFILE\\%04u.OUT\\%s",tmp,useron.number,fname); - strcpy(subj,str); - if(fexist(str)) { - bputs(text[FileAlreadyThere]); - return; } - if(online==ON_LOCAL) { /* Local upload */ - bputs(text[EnterPath]); - if(!getstr(str,60,K_LINE|K_UPPER)) { - bputs(text[Aborted]); - return; } - backslash(str); - strcat(str,fname); - if(mv(str,subj,1)) - return; } - else { /* Remote */ - menu("ULPROT"); - mnemonics(text[ProtocolOrQuit]); - strcpy(str,"Q"); - for(x=0;x<total_prots;x++) - if(prot[x]->ulcmd[0] && chk_ar(prot[x]->ar,useron)) { - sprintf(tmp,"%c",prot[x]->mnemonic); - strcat(str,tmp); } - ch=getkeys(str,0); - if(ch=='Q' || sys_status&SS_ABORT) { - bputs(text[Aborted]); - return; } - for(x=0;x<total_prots;x++) - if(prot[x]->ulcmd[0] && prot[x]->mnemonic==ch - && chk_ar(prot[x]->ar,useron)) - break; - if(x<total_prots) /* This should be always */ - protocol(cmdstr(prot[x]->ulcmd,subj,nulstr,NULL),0); } - l=flength(subj); - if(l>0) - bprintf(text[FileNBytesReceived],fname,ultoac(l,tmp)); - else { - bprintf(text[FileNotReceived],fname); - return; } } - -p=subj; -if((SYSOP || useron.exempt&FLAG('F')) - && !strncmpi(p,"CR:",3)) { /* Crash over-ride by sysop */ - p+=3; /* skip CR: */ - if(*p==SP) p++; /* skip extra space if it exists */ - hdr.attr|=FIDO_CRASH; } - -if((SYSOP || useron.exempt&FLAG('F')) - && !strncmpi(p,"FR:",3)) { /* File request */ - p+=3; /* skip FR: */ - if(*p==SP) p++; - hdr.attr|=FIDO_FREQ; } - -if((SYSOP || useron.exempt&FLAG('F')) - && !strncmpi(p,"RR:",3)) { /* Return receipt request */ - p+=3; /* skip RR: */ - if(*p==SP) p++; - hdr.attr|=FIDO_RRREQ; } - -if((SYSOP || useron.exempt&FLAG('F')) - && !strncmpi(p,"FA:",3)) { /* File Attachment */ - p+=3; /* skip FA: */ - if(*p==SP) p++; - hdr.attr|=FIDO_FILE; } - -sprintf(hdr.subj,"%.71s",p); - -sprintf(str,"%sNETMAIL.MSG",node_dir); -if((file=nopen(str,O_RDONLY))==-1) { - close(fido); - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -length=filelength(file); -if((buf=(char *)MALLOC(length))==NULL) { - close(fido); - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - return; } -read(file,buf,length); -close(file); - -cc_sent=0; -while(1) { - for(i=1;i;i++) { - sprintf(str,"%s%u.MSG",netmail_dir,i); - if(!fexist(str)) - break; } - if(!i) { - bputs(text[TooManyEmailsToday]); - return; } - if((fido=nopen(str,O_WRONLY|O_CREAT|O_EXCL))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_EXCL); - return; } - write(fido,&hdr,sizeof(hdr)); - - pt_zone_kludge(hdr,fido); - - if(netmail_misc&NMAIL_DIRECT) { - sprintf(str,"\1FLAGS DIR\r\n"); - write(fido,str,strlen(str)); } - if(mode&WM_FILE) { - sprintf(str,"\1FLAGS KFS\r\n"); - write(fido,str,strlen(str)); } - - if(cc_sent) { - sprintf(str,"* Originally to: %s\r\n\r\n",into); - write(fido,str,strlen(str)); } - - l=0L; - while(l<length) { - if(buf[l]==1) /* Ctrl-A, so skip it and the next char */ - l++; - else if(buf[l]!=LF) { - if((uchar)buf[l]==0x8d) /* r0dent i converted to normal i */ - buf[l]='i'; - write(fido,buf+l,1); } - l++; } - l=0; - write(fido,&l,1); /* Null terminator */ - close(fido); - - if(!(useron.exempt&FLAG('S'))) - subtract_cdt(netmail_cost); - if(mode&WM_FILE) - sprintf(str,"Sent NetMail file attachment to %s (%s)" - ,hdr.to,faddrtoa(addr)); - else - sprintf(str,"Sent NetMail to %s (%s)" - ,hdr.to,faddrtoa(addr)); - logline("EN",str); - - cc_found=0; - for(l=0;l<length && cc_found<=cc_sent;l++) - if(l+3<length && !strnicmp(buf+l,"CC:",3)) { - cc_found++; - l+=2; } - else { - while(l<length && *(buf+l)!=LF) - l++; } - if(!cc_found) - break; - while(l<length && *(buf+l)==SP) l++; - for(i=0;l<length && *(buf+l)!=LF && i<128;i++,l++) - str[i]=buf[l]; - if(!i) - break; - str[i]=0; - p=strrchr(str,'@'); - if(p) { - addr=atofaddr(p+1); - *p=0; - sprintf(hdr.to,"%.35s",str); } - else { - atofaddr(str); - strcpy(hdr.to,"Sysop"); } - hdr.destzone =addr.zone; - hdr.destnet =addr.net; - hdr.destnode =addr.node; - hdr.destpoint =addr.point; - cc_sent++; } - -if(netmail_sem[0]) /* update semaphore file */ - if((file=nopen(netmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(file); - -FREE(buf); -} - -/****************************************************************************/ -/* Send FidoNet NetMail from QWK REP Packet */ -/****************************************************************************/ -void qwktonetmail(FILE *rep, char *block, char *into, uchar fromhub) -{ - char HUGE16 *qwkbuf,to[129],name[129],sender[129],senderaddr[129] - ,str[256],*p,*cp,*addr,fulladdr[129],ch,buf[SDT_BLOCK_LEN]; - int i,fido,inet=0,qnet=0,x; - ushort net,xlat; - long l,offset,length,m,n; - faddr_t fidoaddr; - fmsghdr_t hdr; - smbmsg_t msg; - -if(useron.rest&FLAG('M')) { - bputs(text[NoNetMailAllowed]); - return; } - -sprintf(str,"%.6s",block+116); -n=atol(str); /* i = number of 128 byte records */ - -if(n<2L || n>999999L) { - errormsg(WHERE,ERR_CHK,"QWK blocks",n); - return; } -if((qwkbuf=MALLOC(n*128L))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,n*128L); - return; } -memcpy((char *)qwkbuf,block,128); -fread(qwkbuf+128,n-1,128,rep); - -if(into==NULL) - sprintf(to,"%-128.128s",(char *)qwkbuf+128); /* To user on first line */ -else - strcpy(to,into); - -p=strchr(to,0xe3); /* chop off at first CR */ -if(p) *p=0; - -strcpy(name,to); -p=strchr(name,'@'); -if(p) *p=0; -truncsp(name); - - -p=strrchr(to,'@'); /* Find '@' in name@addr */ -if(p && !isdigit(*(p+1)) && !strchr(p,'.') && !strchr(p,':')) { /* QWKnet */ - qnet=1; - *p=0; } -else if(p==NULL || !isdigit(*(p+1)) || !total_faddrs) { - if(p==NULL && dflt_faddr.zone) - fidoaddr=dflt_faddr; - else if(inetmail_misc&NMAIL_ALLOW) { /* Internet */ - inet=1; -/* - if(p) - *p=0; /* Chop off address */ -*/ - } - else if(dflt_faddr.zone) - fidoaddr=dflt_faddr; - else { - bprintf("\1n\r\nInvalid NetMail address.\r\n"); - FREE(qwkbuf); - return; } } -else { - fidoaddr=atofaddr(p+1); /* Get fido address */ - *p=0; /* Chop off address */ - } - - -if(!inet && !qnet && /* FidoNet */ - ((!SYSOP && !(netmail_misc&NMAIL_ALLOW)) || !total_faddrs)) { - bputs(text[NoNetMailAllowed]); - FREE(qwkbuf); - return; } - -truncsp(to); /* Truncate off space */ - -if(!stricmp(to,"SBBS") && !SYSOP && qnet) { - FREE(qwkbuf); - return; } - -l=128; /* Start of message text */ - -if(qnet || inet) { - - if(into==NULL) { /* If name@addr on first line, skip first line */ - while(l<(n*128L) && (uchar)qwkbuf[l]!=0xe3) l++; - l++; } - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=smb_ver(); - msg.hdr.when_imported.time=time(NULL); - msg.hdr.when_imported.zone=sys_timezone; - - if(fromhub || useron.rest&FLAG('Q')) { - net=NET_QWK; - smb_hfield(&msg,SENDERNETTYPE,sizeof(net),&net); - if(!strncmp((uchar *)qwkbuf+l,"@VIA:",5)) { - sprintf(str,"%.128s",qwkbuf+l+5); - cp=strchr(str,0xe3); - if(cp) *cp=0; - l+=strlen(str)+1; - cp=str; - while(*cp && *cp<=SP) cp++; - sprintf(senderaddr,"%s/%s" - ,fromhub ? qhub[fromhub-1]->id : useron.alias,cp); - strupr(senderaddr); - smb_hfield(&msg,SENDERNETADDR,strlen(senderaddr),senderaddr); } - else { - if(fromhub) - strcpy(senderaddr,qhub[fromhub-1]->id); - else - strcpy(senderaddr,useron.alias); - strupr(senderaddr); - smb_hfield(&msg,SENDERNETADDR,strlen(senderaddr),senderaddr); } - sprintf(sender,"%.25s",block+46); } /* From name */ - else { /* Not Networked */ - msg.hdr.when_written.zone=sys_timezone; - sprintf(str,"%u",useron.number); - smb_hfield(&msg,SENDEREXT,strlen(str),str); - strcpy(sender,(qnet || inetmail_misc&NMAIL_ALIAS) - ? useron.alias : useron.name); - } - truncsp(sender); - smb_hfield(&msg,SENDER,strlen(sender),sender); - if(fromhub) - msg.idx.from=0; - else - msg.idx.from=useron.number; - if(!strncmp((uchar *)qwkbuf+l,"@TZ:",4)) { - sprintf(str,"%.128s",qwkbuf+l); - cp=strchr(str,0xe3); - if(cp) *cp=0; - l+=strlen(str)+1; - cp=str+4; - while(*cp && *cp<=SP) cp++; - msg.hdr.when_written.zone=(short)ahtoul(cp); } - else - msg.hdr.when_written.zone=sys_timezone; - - date.da_mon=((qwkbuf[8]&0xf)*10)+(qwkbuf[9]&0xf); - date.da_day=((qwkbuf[11]&0xf)*10)+(qwkbuf[12]&0xf); - date.da_year=((qwkbuf[14]&0xf)*10)+(qwkbuf[15]&0xf); - if(date.da_year<Y2K_2DIGIT_WINDOW) - date.da_year+=100; - date.da_year+=1900; - curtime.ti_hour=((qwkbuf[16]&0xf)*10)+(qwkbuf[17]&0xf); - curtime.ti_min=((qwkbuf[19]&0xf)*10)+(qwkbuf[20]&0xf); /* From QWK time */ - curtime.ti_sec=0; - - msg.hdr.when_written.time=dostounix(&date,&curtime); - - sprintf(str,"%.25s",block+71); /* Title */ - smb_hfield(&msg,SUBJECT,strlen(str),str); - strlwr(str); - msg.idx.subj=crc16(str); } - -if(qnet) { - - p++; - addr=p; - msg.idx.to=qwk_route(addr,fulladdr); - if(!fulladdr[0]) { /* Invalid address, so BOUNCE it */ - /** - errormsg(WHERE,ERR_CHK,addr,0); - FREE(qwkbuf); - smb_freemsgmem(msg); - return; - **/ - smb_hfield(&msg,SENDER,strlen(sys_id),sys_id); - msg.idx.from=0; - msg.idx.to=useron.number; - strcpy(to,sender); - strcpy(fulladdr,senderaddr); - sprintf(str,"BADADDR: %s",addr); - smb_hfield(&msg,SUBJECT,strlen(str),str); - strlwr(str); - msg.idx.subj=crc16(str); - net=NET_NONE; - smb_hfield(&msg,SENDERNETTYPE,sizeof(net),&net); - } - - smb_hfield(&msg,RECIPIENT,strlen(name),name); - net=NET_QWK; - smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net); - - truncsp(fulladdr); - smb_hfield(&msg,RECIPIENTNETADDR,strlen(fulladdr),fulladdr); - - bprintf(text[NetMailing],to,fulladdr,sender,sys_id); } - -if(inet) { /* Internet E-mail */ - - if(inetmail_cost && !(useron.exempt&FLAG('S'))) { - if(useron.cdt+useron.freecdt<inetmail_cost) { - bputs(text[NotEnoughCredits]); - FREE(qwkbuf); - smb_freemsgmem(&msg); - return; } - sprintf(str,text[NetMailCostContinueQ],inetmail_cost); - if(noyes(str)) { - FREE(qwkbuf); - smb_freemsgmem(&msg); - return; } } - - net=NET_INTERNET; - smb_hfield(&msg,RECIPIENT,strlen(name),name); - msg.idx.to=0; /* Out-bound NetMail set to 0 */ - smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net); - smb_hfield(&msg,RECIPIENTNETADDR,strlen(to),to); - - bprintf(text[NetMailing],name,to - ,inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name - ,sys_inetaddr); } - -if(qnet || inet) { - - bputs(text[WritingIndx]); - - if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,"MAIL",i); - FREE(qwkbuf); - smb_freemsgmem(&msg); - return; } - sprintf(smb.file,"%sMAIL",data_dir); - smb.retry_time=smb_retry_time; - if((i=smb_open(&smb))!=0) { - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - FREE(qwkbuf); - smb_freemsgmem(&msg); - return; } - - if(filelength(fileno(smb.shd_fp))<1L) { /* Create it if it doesn't exist */ - smb.status.max_crcs=mail_maxcrcs; - smb.status.max_msgs=MAX_SYSMAIL; - smb.status.max_age=mail_maxage; - smb.status.attr=SMB_EMAIL; - if((i=smb_create(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_CREATE,smb.file,i); - FREE(qwkbuf); - smb_freemsgmem(&msg); - return; } } - - length=n*256L; // Extra big for CRLF xlat, was (n-1L)*256L (03/16/96) - - - if(length&0xfff00000UL || !length) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - sprintf(str,"REP msg (%ld)",n); - errormsg(WHERE,ERR_LEN,str,length); - FREE(qwkbuf); - smb_freemsgmem(&msg); - return; } - - if((i=smb_open_da(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - FREE(qwkbuf); - smb_freemsgmem(&msg); - return; } - if(sys_misc&SM_FASTMAIL) - offset=smb_fallocdat(&smb,length,1); - else - offset=smb_allocdat(&smb,length,1); - smb_close_da(&smb); - - fseek(smb.sdt_fp,offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,smb.sdt_fp); - m=2; - for(;l<n*128L && m<length;l++) { - if(qwkbuf[l]==0 || qwkbuf[l]==LF) - continue; - if((uchar)qwkbuf[l]==0xe3) { - fwrite(crlf,2,1,smb.sdt_fp); - m+=2; - continue; } - fputc(qwkbuf[l],smb.sdt_fp); - m++; } - - for(ch=0;m<length;m++) /* Pad out with NULLs */ - fputc(ch,smb.sdt_fp); - fflush(smb.sdt_fp); - - msg.hdr.offset=offset; - - smb_dfield(&msg,TEXT_BODY,length); - - i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - - smb_freemsgmem(&msg); - if(i) { - smb_freemsgdat(&smb,offset,length,1); - errormsg(WHERE,ERR_WRITE,smb.file,i); } - else { /* Successful */ - if(inet) { - if(inetmail_sem[0]) /* update semaphore file */ - if((fido=nopen(inetmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(fido); - if(!(useron.exempt&FLAG('S'))) - subtract_cdt(inetmail_cost); } - sprintf(str,"Sent %s NetMail to %s (%s) via QWK" - ,qnet ? "QWK":"Internet",name,qnet ? fulladdr : to); - logline("EN",str); } - - FREE((char *)qwkbuf); - return; } - - -/****************************** FidoNet **********************************/ - -if(!fidoaddr.zone || !netmail_dir[0]) { // No fido netmail allowed - bprintf("\1n\r\nInvalid NetMail address.\r\n"); - FREE(qwkbuf); - return; } - -memset(&hdr,0,sizeof(hdr)); /* Initialize header to null */ - -if(fromhub || useron.rest&FLAG('Q')) { - sprintf(str,"%.25s",block+46); /* From */ - truncsp(str); - sprintf(tmp,"@%s",fromhub ? qhub[fromhub-1]->id : useron.alias); - strupr(tmp); - strcat(str,tmp); } -else - strcpy(str,netmail_misc&NMAIL_ALIAS ? useron.alias : useron.name); -sprintf(hdr.from,"%.35s",str); - -sprintf(hdr.to,"%.35s",to); - -/* Look-up in nodelist? */ - -if(netmail_cost && !(useron.exempt&FLAG('S'))) { - if(useron.cdt+useron.freecdt<netmail_cost) { - bputs(text[NotEnoughCredits]); - FREE(qwkbuf); - return; } - sprintf(str,text[NetMailCostContinueQ],netmail_cost); - if(noyes(str)) { - FREE(qwkbuf); - return; } } - -hdr.destzone =fidoaddr.zone; -hdr.destnet =fidoaddr.net; -hdr.destnode =fidoaddr.node; -hdr.destpoint =fidoaddr.point; - -for(i=0;i<total_faddrs;i++) - if(fidoaddr.zone==faddr[i].zone && fidoaddr.net==faddr[i].net) - break; -if(i==total_faddrs) { - for(i=0;i<total_faddrs;i++) - if(fidoaddr.zone==faddr[i].zone) - break; } -if(i==total_faddrs) - i=0; -hdr.origzone =faddr[i].zone; -hdr.orignet =faddr[i].net; -hdr.orignode =faddr[i].node; -hdr.origpoint =faddr[i].point; - -strcpy(str,faddrtoa(faddr[i])); -bprintf(text[NetMailing],hdr.to,faddrtoa(fidoaddr),hdr.from,str); - -date.da_mon=((qwkbuf[8]&0xf)*10)+(qwkbuf[9]&0xf); -date.da_day=((qwkbuf[11]&0xf)*10)+(qwkbuf[12]&0xf); -date.da_year=((qwkbuf[14]&0xf)*10)+(qwkbuf[15]&0xf); -if(date.da_year<Y2K_2DIGIT_WINDOW) - date.da_year+=100; -date.da_year+=1900; -curtime.ti_hour=((qwkbuf[16]&0xf)*10)+(qwkbuf[17]&0xf); -curtime.ti_min=((qwkbuf[19]&0xf)*10)+(qwkbuf[20]&0xf); /* From QWK time */ -curtime.ti_sec=0; -sprintf(hdr.time,"%02u %3.3s %02u %02u:%02u:%02u" /* To FidoNet */ - ,date.da_day,mon[date.da_mon-1],TM_YEAR(date.da_year-1900) - ,curtime.ti_hour,curtime.ti_min,curtime.ti_sec); - -hdr.attr=(FIDO_LOCAL|FIDO_PRIVATE); - -if(netmail_misc&NMAIL_CRASH) hdr.attr|=FIDO_CRASH; -if(netmail_misc&NMAIL_HOLD) hdr.attr|=FIDO_HOLD; -if(netmail_misc&NMAIL_KILL) hdr.attr|=FIDO_KILLSENT; - -sprintf(str,"%.25s",block+71); /* Title */ -truncsp(str); -p=str; -if((SYSOP || useron.exempt&FLAG('F')) - && !strncmpi(p,"CR:",3)) { /* Crash over-ride by sysop */ - p+=3; /* skip CR: */ - if(*p==SP) p++; /* skip extra space if it exists */ - hdr.attr|=FIDO_CRASH; } - -if((SYSOP || useron.exempt&FLAG('F')) - && !strncmpi(p,"FR:",3)) { /* File request */ - p+=3; /* skip FR: */ - if(*p==SP) p++; - hdr.attr|=FIDO_FREQ; } - -if((SYSOP || useron.exempt&FLAG('F')) - && !strncmpi(p,"RR:",3)) { /* Return receipt request */ - p+=3; /* skip RR: */ - if(*p==SP) p++; - hdr.attr|=FIDO_RRREQ; } - -if((SYSOP || useron.exempt&FLAG('F')) - && !strncmpi(p,"FA:",3)) { /* File attachment */ - p+=3; /* skip FA: */ - if(*p==SP) p++; - hdr.attr|=FIDO_FILE; } - -sprintf(hdr.subj,"%.71s",p); - -for(i=1;i;i++) { - sprintf(str,"%s%u.MSG",netmail_dir,i); - if(!fexist(str)) - break; } -if(!i) { - bputs(text[TooManyEmailsToday]); - return; } -if((fido=nopen(str,O_WRONLY|O_CREAT|O_EXCL))==-1) { - FREE(qwkbuf); - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_EXCL); - return; } -write(fido,&hdr,sizeof(hdr)); - -pt_zone_kludge(hdr,fido); - -if(netmail_misc&NMAIL_DIRECT) { - sprintf(str,"\1FLAGS DIR\r\n"); - write(fido,str,strlen(str)); } - -l=128L; - -if(into==NULL) { /* If name@addr on first line, skip first line */ - while(l<n*128L && (uchar)qwkbuf[l]!=0xe3) l++; - l++; } - -while(l<n*128L) { - if(qwkbuf[l]==1) /* Ctrl-A, so skip it and the next char */ - l++; - else if(qwkbuf[l]!=LF) { - if((uchar)qwkbuf[l]==0xe3) /* QWK cr/lf char converted to hard CR */ - qwkbuf[l]=CR; - write(fido,(char *)qwkbuf+l,1); } - l++; } -l=0; -write(fido,&l,1); /* Null terminator */ -close(fido); -FREE((char *)qwkbuf); -if(netmail_sem[0]) /* update semaphore file */ - if((fido=nopen(netmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(fido); -if(!(useron.exempt&FLAG('S'))) - subtract_cdt(netmail_cost); -sprintf(str,"Sent NetMail to %s @%s via QWK",hdr.to,faddrtoa(fidoaddr)); -logline("EN",str); -} - diff --git a/src/sbbs2/fido/crc16.c b/src/sbbs2/fido/crc16.c deleted file mode 100644 index dc89962940..0000000000 --- a/src/sbbs2/fido/crc16.c +++ /dev/null @@ -1,37 +0,0 @@ -/* CRC16.C */ - -/* 16-bit CRC routines */ - -#include "smblib.h" - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - diff --git a/src/sbbs2/fido/crc32.h b/src/sbbs2/fido/crc32.h deleted file mode 100644 index a5d5162fb2..0000000000 --- a/src/sbbs2/fido/crc32.h +++ /dev/null @@ -1,40 +0,0 @@ -/* 32-bit CRC */ - -long crc32tbl[]={ /* CRC polynomial 0xedb88320 */ -0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, -0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, -0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, -0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, -0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, -0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, -0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, -0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, -0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, -0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, -0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, -0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, -0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, -0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, -0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, -0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, -0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, -0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, -0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, -0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, -0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, -0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, -0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, -0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, -0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, -0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, -0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, -0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, -0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, -0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -#define ucrc32(ch,crc) (crc32tbl[(crc^ch)&0xff]^(crc>>8)) - - diff --git a/src/sbbs2/fido/file_id.diz b/src/sbbs2/fido/file_id.diz deleted file mode 100644 index b03fe6269f..0000000000 --- a/src/sbbs2/fido/file_id.diz +++ /dev/null @@ -1,3 +0,0 @@ -SBBSFIDO v2.23 - Fixes 32-bit LZH decoding -and OS/2 NOPEN error. No change for DOS16. -Includes DOS, OS/2, and 32-bit DOS versions. diff --git a/src/sbbs2/fido/lzh.c b/src/sbbs2/fido/lzh.c deleted file mode 100644 index 2d21e4d55f..0000000000 --- a/src/sbbs2/fido/lzh.c +++ /dev/null @@ -1,785 +0,0 @@ -/* LZH.C */ - -/* Digital Dynamics conversion of 1988 LZH (LHarc) encoding functions */ -/* Based on Japanese version 29-NOV-1988 */ -/* LZSS coded by Haruhiko Okumura */ -/* Adaptive Huffman Coding coded by Haruyasu Yoshizaki */ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#ifndef __WATCOMC__ - #include <alloc.h> -#endif - -/****************************************************************************/ -/* Memory allocation macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) - #if defined(__TURBOC__) - #define REALLOC(x,y) farrealloc(x,y) - #define LMALLOC(x) farmalloc(x) - #define MALLOC(x) farmalloc(x) - #define LFREE(x) farfree(x) - #define FREE(x) farfree(x) - #elif defined(__WATCOMC__) - #define REALLOC realloc - #define LMALLOC(x) halloc(x,1) /* far heap, but slow */ - #define MALLOC malloc /* far heap, but 64k max */ - #define LFREE hfree - #define FREE free - #else /* Other 16-bit Compiler */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free - #endif -#else /* 32-bit Compiler or Small Memory Model */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free -#endif - - - -typedef unsigned char uchar; - -/* LZSS Parameters */ - -#define LZH_N 4096 /* Size of string buffer */ -#define LZH_F 60 /* Size of look-ahead buffer */ -#define LZH_THRESHOLD 2 -#define LZH_NIL LZH_N /* End of tree's node */ - -#ifdef LZH_DYNAMIC_BUF - -unsigned char *lzh_text_buf; -short int lzh_match_position, lzh_match_length, - *lzh_lson, *lzh_rson, *lzh_dad; - -#else - -unsigned char lzh_text_buf[LZH_N + LZH_F - 1]; -short int lzh_match_position, lzh_match_length, - lzh_lson[LZH_N + 1], lzh_rson[LZH_N + 257], lzh_dad[LZH_N + 1]; - -#endif - - -void lzh_init_tree(void) /* Initializing tree */ -{ - short int i; - - for (i = LZH_N + 1; i <= LZH_N + 256; i++) - lzh_rson[i] = LZH_NIL; /* root */ - for (i = 0; i < LZH_N; i++) - lzh_dad[i] = LZH_NIL; /* node */ -} - -/******************************/ -/* Inserting node to the tree */ -/* Only used during encoding */ -/******************************/ -void lzh_insert_node(short int r) -{ - short int i, p, cmp; - unsigned char *key; - unsigned c; - - cmp = 1; - key = lzh_text_buf+r; - p = LZH_N + 1 + key[0]; - lzh_rson[r] = lzh_lson[r] = LZH_NIL; - lzh_match_length = 0; - for ( ; ; ) { - if (cmp >= 0) { - if (lzh_rson[p] != LZH_NIL) - p = lzh_rson[p]; - else { - lzh_rson[p] = r; - lzh_dad[r] = p; - return; - } - } else { - if (lzh_lson[p] != LZH_NIL) - p = lzh_lson[p]; - else { - lzh_lson[p] = r; - lzh_dad[r] = p; - return; - } - } - for (i = 1; i < LZH_F; i++) - if ((cmp = key[i] - lzh_text_buf[p + i]) != 0) - break; - if (i > LZH_THRESHOLD) { - if (i > lzh_match_length) { - lzh_match_position = ((r - p) & (LZH_N - 1)) - 1; - if ((lzh_match_length = i) >= LZH_F) - break; - } - if (i == lzh_match_length) { - if ((c = ((r - p) & (LZH_N - 1)) - 1) < lzh_match_position) { - lzh_match_position = c; - } - } - } - } - lzh_dad[r] = lzh_dad[p]; - lzh_lson[r] = lzh_lson[p]; - lzh_rson[r] = lzh_rson[p]; - lzh_dad[lzh_lson[p]] = r; - lzh_dad[lzh_rson[p]] = r; - if (lzh_rson[lzh_dad[p]] == p) - lzh_rson[lzh_dad[p]] = r; - else - lzh_lson[lzh_dad[p]] = r; - lzh_dad[p] = LZH_NIL; /* remove p */ -} - -void lzh_delete_node(short int p) /* Deleting node from the tree */ -{ - short int q; - - if (lzh_dad[p] == LZH_NIL) - return; /* unregistered */ - if (lzh_rson[p] == LZH_NIL) - q = lzh_lson[p]; - else - if (lzh_lson[p] == LZH_NIL) - q = lzh_rson[p]; - else { - q = lzh_lson[p]; - if (lzh_rson[q] != LZH_NIL) { - do { - q = lzh_rson[q]; - } while (lzh_rson[q] != LZH_NIL); - lzh_rson[lzh_dad[q]] = lzh_lson[q]; - lzh_dad[lzh_lson[q]] = lzh_dad[q]; - lzh_lson[q] = lzh_lson[p]; - lzh_dad[lzh_lson[p]] = q; - } - lzh_rson[q] = lzh_rson[p]; - lzh_dad[lzh_rson[p]] = q; - } - lzh_dad[q] = lzh_dad[p]; - if (lzh_rson[lzh_dad[p]] == p) - lzh_rson[lzh_dad[p]] = q; - else - lzh_lson[lzh_dad[p]] = q; - lzh_dad[p] = LZH_NIL; -} - -/* Huffman coding parameters */ - -#define LZH_N_CHAR (256 - LZH_THRESHOLD + LZH_F) - /* character code (= 0..LZH_N_CHAR-1) */ -#define LZH_T (LZH_N_CHAR * 2 - 1) /* Size of table */ -#define LZH_R (LZH_T - 1) /* root position */ -#define MAX_FREQ 0x8000 - /* update when cumulative frequency */ - /* reaches to this value */ - -/* - * Tables for encoding/decoding upper 6 bits of - * sliding dictionary pointer - */ -/* encoder table */ -uchar lzh_p_len[64] = { - 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 -}; - -uchar lzh_p_code[64] = { - 0x00, 0x20, 0x30, 0x40, 0x50, 0x58, 0x60, 0x68, - 0x70, 0x78, 0x80, 0x88, 0x90, 0x94, 0x98, 0x9C, - 0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC, - 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, - 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE, - 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, - 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -}; - -/* decoder table */ -uchar lzh_d_code[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, - 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, - 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, - 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, - 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, - 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, - 0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, - 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F, - 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, - 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, - 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, - 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, -}; - -uchar lzh_d_len[256] = { - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -}; - -#ifdef LZH_DYNAMIC_BUF - -unsigned short *lzh_freq=NULL; /* cumulative freq table */ - -/* - * pointing parent nodes. - * area [LZH_T..(LZH_T + LZH_N_CHAR - 1)] are pointers for leaves - */ -short int *lzh_prnt=NULL; - -/* pointing children nodes (son[], son[] + 1)*/ -short int *lzh_son=NULL; - -#else /* STATIC */ - -unsigned short lzh_freq[LZH_T + 1]; /* cumulative freq table */ -short int lzh_prnt[LZH_T + LZH_N_CHAR]; -short int lzh_son[LZH_T + 1]; /* bug fixed by Digital Dynamics */ - -#endif - - -unsigned short lzh_getbuf = 0; /* Was just "unsigned" fixed 04/12/95 */ -uchar lzh_getlen = 0; - -int lzh_getbit(uchar *inbuf, long *incnt, long inlen) /* get one bit */ -{ - short int i; - - while (lzh_getlen <= 8) { - if((*incnt)>=inlen) - i=0; - else - i=inbuf[(*incnt)++]; - lzh_getbuf |= i << (8 - lzh_getlen); - lzh_getlen += 8; - } - i = lzh_getbuf; - lzh_getbuf <<= 1; - lzh_getlen--; - return (i < 0); -} - -short int lzh_getbyte(uchar *inbuf, long *incnt, long inlen) /* get a byte */ -{ - unsigned short i; - - while (lzh_getlen <= 8) { - if((*incnt)>=inlen) - i=0; - else - i=inbuf[(*incnt)++]; - lzh_getbuf |= i << (8 - lzh_getlen); - lzh_getlen += 8; - } - i = lzh_getbuf; - lzh_getbuf <<= 8; - lzh_getlen -= 8; - return i >> 8; -} - -unsigned lzh_putbuf = 0; -uchar lzh_putlen = 0; - -/* output c bits */ -void lzh_putcode(short int l, unsigned short c, uchar *outbuf, long *outlen) -{ - lzh_putbuf |= c >> lzh_putlen; - if ((lzh_putlen += l) >= 8) { - outbuf[(*outlen)++]=(lzh_putbuf >> 8); - if ((lzh_putlen -= 8) >= 8) { - outbuf[(*outlen)++]=lzh_putbuf; - lzh_putlen -= 8; - lzh_putbuf = c << (l - lzh_putlen); - } else { - lzh_putbuf <<= 8; - } - } -} - - -/* initialize freq tree */ - -void lzh_start_huff() -{ - short int i, j; - -lzh_getbuf = 0; /* Added by Digital Dynamics for repeating operations */ -lzh_getlen = 0; -lzh_putbuf = 0; -lzh_putlen = 0; - - for (i = 0; i < LZH_N_CHAR; i++) { - lzh_freq[i] = 1; - lzh_son[i] = i + LZH_T; - lzh_prnt[i + LZH_T] = i; - } - i = 0; j = LZH_N_CHAR; - while (j <= LZH_R) { - lzh_freq[j] = lzh_freq[i] + lzh_freq[i + 1]; - lzh_son[j] = i; - lzh_prnt[i] = lzh_prnt[i + 1] = j; - i += 2; j++; - } - lzh_freq[LZH_T] = 0xffff; - lzh_prnt[LZH_R] = 0; -} - - -/* reconstruct freq tree */ - -void lzh_reconst() -{ - short int i, j, k; - unsigned short f, l; - - /* halven cumulative freq for leaf nodes */ - j = 0; - for (i = 0; i < LZH_T; i++) { - if (lzh_son[i] >= LZH_T) { - lzh_freq[j] = (lzh_freq[i] + 1) / 2; - lzh_son[j] = lzh_son[i]; - j++; - } - } - /* make a tree : first, connect children nodes */ - for (i = 0, j = LZH_N_CHAR; j < LZH_T; i += 2, j++) { - k = i + 1; - f = lzh_freq[j] = lzh_freq[i] + lzh_freq[k]; - for (k = j - 1; f < lzh_freq[k]; k--); - k++; - l = (j - k) * 2; - - /* movmem() is Turbo-C dependent - rewritten to memmove() by Kenji */ - - /* movmem(&lzh_freq[k], &lzh_freq[k + 1], l); */ - (void)memmove(lzh_freq+k+1,lzh_freq+k, l); - lzh_freq[k] = f; - /* movmem(&lzh_son[k], &lzh_son[k + 1], l); */ - (void)memmove(lzh_son+k+1,lzh_son+k, l); - lzh_son[k] = i; - } - /* connect parent nodes */ - for (i = 0; i < LZH_T; i++) { - if ((k = lzh_son[i]) >= LZH_T) { - lzh_prnt[k] = i; - } else { - lzh_prnt[k] = lzh_prnt[k + 1] = i; - } - } -} - -/* update freq tree */ - -void lzh_update(short int c) -{ - short int i, j, k, l; - - if (lzh_freq[LZH_R] == MAX_FREQ) { - lzh_reconst(); - } - c = lzh_prnt[c + LZH_T]; - do { - k = ++lzh_freq[c]; - - /* swap nodes to keep the tree freq-ordered */ - if (k > lzh_freq[l = c + 1]) { - while (k > lzh_freq[++l]); - l--; - lzh_freq[c] = lzh_freq[l]; - lzh_freq[l] = k; - - i = lzh_son[c]; - lzh_prnt[i] = l; - if (i < LZH_T) lzh_prnt[i + 1] = l; - - j = lzh_son[l]; - lzh_son[l] = i; - - lzh_prnt[j] = c; - if (j < LZH_T) lzh_prnt[j + 1] = c; - lzh_son[c] = j; - - c = l; - } - } while ((c = lzh_prnt[c]) != 0); /* do it until reaching the root */ -} - -unsigned short lzh_code, lzh_len; - -void lzh_encode_char(unsigned short c, uchar *outbuf, long *outlen) -{ - unsigned short i; - short int j, k; - - i = 0; - j = 0; - k = lzh_prnt[c + LZH_T]; - - /* search connections from leaf node to the root */ - do { - i >>= 1; - - /* - if node's address is odd, output 1 - else output 0 - */ - if (k & 1) i += 0x8000; - - j++; - } while ((k = lzh_prnt[k]) != LZH_R); - lzh_putcode(j, i, outbuf, outlen); - lzh_code = i; - lzh_len = j; - lzh_update(c); -} - -void lzh_encode_position(unsigned short c, uchar *outbuf, long *outlen) -{ - unsigned short i; - - /* output upper 6 bits with encoding */ - i = c >> 6; - lzh_putcode(lzh_p_len[i], (unsigned)lzh_p_code[i] << 8, outbuf, outlen); - - /* output lower 6 bits directly */ - lzh_putcode(6, (c & 0x3f) << 10, outbuf, outlen); -} - -void lzh_encode_end(uchar *outbuf, long *outlen) -{ - if (lzh_putlen) { - outbuf[(*outlen)++]=(lzh_putbuf >> 8); - } -} - -short int lzh_decode_char(uchar *inbuf, long *incnt, long inlen) -{ - unsigned short c; - - c = lzh_son[LZH_R]; - - /* - * start searching tree from the root to leaves. - * choose node #(lzh_son[]) if input bit == 0 - * else choose #(lzh_son[]+1) (input bit == 1) - */ - while (c < LZH_T) { - c += lzh_getbit(inbuf,incnt,inlen); - c = lzh_son[c]; - } - c -= LZH_T; - lzh_update(c); - return c; -} - -short int lzh_decode_position(uchar *inbuf, long *incnt, long inlen) -{ - unsigned short i, j, c; - - /* decode upper 6 bits from given table */ - i = lzh_getbyte(inbuf,incnt,inlen); - c = (unsigned)lzh_d_code[i] << 6; - j = lzh_d_len[i]; - - /* input lower 6 bits directly */ - j -= 2; - while (j--) { - i = (i << 1) + lzh_getbit(inbuf,incnt,inlen); - } - return c | i & 0x3f; -} - -/* Compression */ - -/* Encoding/Compressing */ -/* Returns length of outbuf */ -long lzh_encode(uchar *inbuf, long inlen, uchar *outbuf) -{ - short int i, c, len, r, s, last_match_length; - long incnt,outlen; /* textsize=0; */ - -#ifdef LZH_DYNAMIC_BUF - - if((lzh_text_buf=(uchar *)MALLOC(LZH_N + LZH_F - 1))==NULL) - return(-1); - if((lzh_freq=(unsigned short*)MALLOC((LZH_T + 1)*sizeof(unsigned short)))==NULL) { - FREE(lzh_text_buf); - return(-1); } - if((lzh_prnt=(short *)MALLOC((LZH_T + LZH_N_CHAR)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_freq); - return(-1); } - if((lzh_son=(short *)MALLOC((LZH_T + 1) * sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - return(-1); } - if((lzh_lson=(short *)MALLOC((LZH_N + 1)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - return(-1); } - if((lzh_rson=(short *)MALLOC((LZH_N + 257)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - return(-1); } - if((lzh_dad=(short *)MALLOC((LZH_N + 1)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - FREE(lzh_rson); - return(-1); } -#endif - - incnt=0; - memcpy(outbuf,&inlen,sizeof(inlen)); - outlen=sizeof(inlen); - if(!inlen) { -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - FREE(lzh_rson); - FREE(lzh_dad); -#endif - return(outlen); } - lzh_start_huff(); - lzh_init_tree(); - s = 0; - r = LZH_N - LZH_F; - for (i = s; i < r; i++) - lzh_text_buf[i] = ' '; - for (len = 0; len < LZH_F && incnt<inlen; len++) - lzh_text_buf[r + len] = inbuf[incnt++]; - /* textsize = len; */ - for (i = 1; i <= LZH_F; i++) - lzh_insert_node(r - i); - lzh_insert_node(r); - do { - if (lzh_match_length > len) - lzh_match_length = len; - if (lzh_match_length <= LZH_THRESHOLD) { - lzh_match_length = 1; - lzh_encode_char(lzh_text_buf[r],outbuf,&outlen); - } else { - lzh_encode_char(255 - LZH_THRESHOLD + lzh_match_length - ,outbuf,&outlen); - lzh_encode_position(lzh_match_position - ,outbuf,&outlen); - } - last_match_length = lzh_match_length; - for (i = 0; i < last_match_length && incnt<inlen; i++) { - lzh_delete_node(s); - c=inbuf[incnt++]; - lzh_text_buf[s] = c; - if (s < LZH_F - 1) - lzh_text_buf[s + LZH_N] = c; - s = (s + 1) & (LZH_N - 1); - r = (r + 1) & (LZH_N - 1); - lzh_insert_node(r); - } -/*** - if ((textsize += i) > printcount) { - printf("%12ld\r", textsize); - printcount += 1024; - } -***/ - while (i++ < last_match_length) { - lzh_delete_node(s); - s = (s + 1) & (LZH_N - 1); - r = (r + 1) & (LZH_N - 1); - if (--len) lzh_insert_node(r); - } - } while (len > 0); - lzh_encode_end(outbuf,&outlen); -/* - printf("input: %ld (%ld) bytes\n", inlen,textsize); - printf("output: %ld bytes\n", outlen); - printf("output/input: %.3f\n", (double)outlen / inlen); -*/ - -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - FREE(lzh_rson); - FREE(lzh_dad); -#endif - - return(outlen); -} - -/* Decoding/Uncompressing */ -/* Returns length of outbuf */ -long lzh_decode(uchar *inbuf, long inlen, uchar *outbuf) -{ - short int i, j, k, r, c; - unsigned long int count; - long incnt,textsize; - -#ifdef LZH_DYNAMIC_BUF - - if((lzh_text_buf=(uchar *)MALLOC((LZH_N + LZH_F - 1)*2))==NULL) - return(-1); - if((lzh_freq=(unsigned short *)MALLOC((LZH_T + 1)*sizeof(unsigned short))) - ==NULL) { - FREE(lzh_text_buf); - return(-1); } - if((lzh_prnt=(short *)MALLOC((LZH_T + LZH_N_CHAR)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_freq); - return(-1); } - if((lzh_son=(short *)MALLOC((LZH_T + 1) * sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - return(-1); } - -#endif - - incnt=0; - memcpy(&textsize,inbuf,sizeof(textsize)); - incnt+=sizeof(textsize); - if (textsize == 0) { -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); -#endif - return(textsize); } - lzh_start_huff(); - for (i = 0; i < LZH_N - LZH_F; i++) - *(lzh_text_buf+i) = ' '; - r = LZH_N - LZH_F; - for (count = 0; count < textsize; ) { - c = lzh_decode_char(inbuf,&incnt,inlen); - if (c < 256) { - outbuf[count]=c; -#if 0 - if(r>(LZH_N + LZH_F - 1) || r<0) { - printf("Overflow! (%d)\n",r); - getch(); - exit(-1); } -#endif - *(lzh_text_buf+r) = c; - r++; - r &= (LZH_N - 1); - count++; - } else { - i = (r - lzh_decode_position(inbuf,&incnt,inlen) - 1) - & (LZH_N - 1); - j = c - 255 + LZH_THRESHOLD; - for (k = 0; k < j && count<textsize; k++) { - c = lzh_text_buf[(i + k) & (LZH_N - 1)]; - outbuf[count]=c; -#if 0 - if(r>(LZH_N + LZH_F - 1) || r<0) { - printf("Overflow! (%d)\n",r); - exit(-1); } -#endif - *(lzh_text_buf+r) = c; - r++; - r &= (LZH_N - 1); - count++; - } - } - } -/*** - printf("%12ld\n", count); -***/ - -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); -#endif - -return(count); -} - - diff --git a/src/sbbs2/fido/lzh.h b/src/sbbs2/fido/lzh.h deleted file mode 100644 index 68a71dd90c..0000000000 --- a/src/sbbs2/fido/lzh.h +++ /dev/null @@ -1,5 +0,0 @@ -/* LZH.H */ - -long lzh_encode(uchar *inbuf, long inlen, uchar *outbuf); -long lzh_decode(uchar *inbuf, long inlen, uchar *outbuf); - diff --git a/src/sbbs2/fido/makeall.bat b/src/sbbs2/fido/makeall.bat deleted file mode 100755 index d8896214fe..0000000000 --- a/src/sbbs2/fido/makeall.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -wmake -if errorlevel 1 goto end -wmake OS=DOSX -if errorlevel 1 goto end -wmake OS=OS2 -:end diff --git a/src/sbbs2/fido/makefile b/src/sbbs2/fido/makefile deleted file mode 100644 index 472e9e275d..0000000000 --- a/src/sbbs2/fido/makefile +++ /dev/null @@ -1,78 +0,0 @@ -############################################ -# Makefile for Synchronet SBBSFIDO Utility # -# For use with Watcom C/C++ # -############################################ - -!ifndef OS -OS = DOS -!endif - -!ifeq OS DOS -CC = *wcc -!else -CC = *wcc386 -!endif - -LD = *wlink -INCLUDE = \watcom\h;..;..\smb -!ifeq OS DOS -CFLAGS = -I$(INCLUDE) -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -s -ml -!else -CFLAGS = -I$(INCLUDE) -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -s -!endif - -!ifeq OS DOS -SYSTEM = DOS -!endif -!ifeq OS OS2 -SYSTEM = OS2V2 -!endif -!ifeq OS DOSX -SYSTEM = DOS4G -!endif - -LFLAGS = option stack=16k system $(SYSTEM) - -MAIN = $(OS)\sbbsfido.exe -OBJS = $(OS)\sbbsfido.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj & - $(OS)\smblib.obj $(OS)\smbvars.obj $(OS)\ars.obj $(OS)\lzh.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\smb\smbdefs.h ..\smb\smblib.h ..\smb\smbvars.c - -# Implicit C Compile Rule -.c.obj: - @echo Compiling (I) $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $[@ ... - $(LD) $(LFLAGS) file { $(OBJS) } - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Shared Functions -$(OS)\scfglib1.obj: ..\scfglib1.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -$(OS)\smblib.obj: ..\smb\smblib.c ..\smb\smblib.h ..\smb\smbdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -$(OS)\smbvars.obj: ..\smb\smbvars.c ..\smb\smblib.h ..\smb\smbdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -$(OS)\lzh.obj: ..\smb\lzh.c ..\smb\lzh.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - diff --git a/src/sbbs2/fido/makefile.bc b/src/sbbs2/fido/makefile.bc deleted file mode 100644 index 27f1c3e387..0000000000 --- a/src/sbbs2/fido/makefile.bc +++ /dev/null @@ -1,88 +0,0 @@ -############################################ -# Makefile for Synchronet SBBSFIDO Utility # -# For use with Borland C++ for DOS or OS/2 # -############################################ - -# Macros -CC = bcc -LD = tlink -!ifdef __OS2__ -OS = OS2 -INCLUDE = c:\bcos2\include;..;..\smb;..\rio -LIB = c:\bcos2\lib -CFLAGS = -d -C -I$(INCLUDE) -LFLAGS = -c -!else -OS = DOS -INCLUDE = \bc31\include;..;..\smb;..\rio -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -N -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = -n -c -!endif -MAIN = $(OS)\sbbsfido.exe -OBJS = $(OS)\sbbsfido.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj\ - $(OS)\scfglib2.obj\ - $(OS)\smblib.obj $(OS)\smbvars.obj $(OS)\ars.obj $(OS)\lzh.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c \ - ..\smb\smbdefs.h ..\smb\smblib.h ..\smb\smbvars.c - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Shared Functions -$(OS)\scfglib1.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib1.c ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_FILE_CFG --DNO_XTRN_CFG --DNO_CMDS_CFG --DNO_CHAT_CFG -! ..\$&.c - -# Shared Functions -$(OS)\scfglib2.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib2.c ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_FILE_CFG --DNO_XTRN_CFG --DNO_CMDS_CFG --DNO_CHAT_CFG -! ..\$&.c - -#$(OS)\smblib.obj: ..\smb\smblib.c ..\smb\smblib.h ..\smb\smbdefs.h -# @echo Compiling SMBLIB ... -# $(CC) $(CFLAGS) -n$(OS) -c ..\smb\smblib.c - -#$(OS)\smbvars.obj: ..\smb\smbvars.c ..\smb\smblib.h ..\smb\smbdefs.h -# @echo Compiling SMBVARS ... -# $(CC) $(CFLAGS) -n$(OS) -c ..\smb\smbvars.c - -#$(OS)\lzh.obj: ..\smb\lzh.c ..\smb\lzh.h -# @echo Compiling LZH ... -# $(CC) $(CFLAGS) -n$(OS) -c ..\smb\lzh.c - -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -n$(OS) -c ..\ars.c - diff --git a/src/sbbs2/fido/sbbsfido.c b/src/sbbs2/fido/sbbsfido.c deleted file mode 100644 index 35ed292f76..0000000000 --- a/src/sbbs2/fido/sbbsfido.c +++ /dev/null @@ -1,1909 +0,0 @@ -/* SBBSFIDO.C */ - -/* Synchronet FidoNet EchoMail Scanning/Tossing and NetMail Tossing Utility */ - -#define VER "2.24" - -#include "sbbs.h" -#include "crc32.h" -#include "lzh.h" -#include "post.h" -#include "scfglib.h" - -#define IMPORT_NETMAIL (1L<<0) -#define IMPORT_ECHOMAIL (1L<<1) -#define EXPORT_ECHOMAIL (1L<<2) -#define DELETE_NETMAIL (1L<<3) -#define DELETE_ECHOMAIL (1L<<4) -#define IGNORE_POINT (1L<<5) -#define IGNORE_ZONE (1L<<6) -#define IGNORE_MSGPTRS (1L<<7) -#define UPDATE_MSGPTRS (1L<<8) -#define LEAVE_MSGPTRS (1L<<9) -#define KILL_ECHOMAIL (1L<<10) -#define ASCII_ONLY (1L<<11) -#define LOGFILE (1L<<12) -#define REPORT (1L<<13) -#define EXPORT_ALL (1L<<14) -#define PURGE_ECHOMAIL (1L<<15) -#define UNKNOWN_NETMAIL (1L<<16) -#define IGNORE_ADDRESS (1L<<17) -#define IMPORT_LOCAL (1L<<18) -#define IMPORT_NEW_ONLY (1L<<19) -#define DONT_SET_RECV (1L<<20) -#define IGNORE_RECV (1L<<21) -#define CONVERT_TEAR (1L<<22) -#define IMPORT_PRIVATE (1L<<23) -#define LOCAL_NETMAIL (1L<<24) -#define NOTIFY_RECEIPT (1L<<25) - -char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec"}; - -long misc=(IMPORT_NETMAIL|IMPORT_ECHOMAIL|EXPORT_ECHOMAIL - |DELETE_NETMAIL|DELETE_ECHOMAIL|KILL_ECHOMAIL); -char tmp[256]; - -FILE *fidologfile=NULL; -#ifdef __TURBOC__ - unsigned _stklen=20000; -#endif -int startmsg=1; -int nodefile; - -#ifdef __WATCOMC__ - #define O_DENYNONE SH_DENYNO -#endif - -long lputs(char FAR16 *str) -{ - char tmp[256]; - int i,j,k; - -if(misc&LOGFILE && fidologfile!=NULL) - fputs(str,fidologfile); -j=strlen(str); -for(i=k=0;i<j;i++) /* remove CRs */ - if(str[i]==CR && str[i+1]==LF) - continue; - else - tmp[k++]=str[i]; -tmp[k]=0; -return(fputs(tmp,stdout)); -} - -/******************************************/ -/* CRC-16 routines required for SMB index */ -/******************************************/ - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - - - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) -{ - va_list argptr; - char sbuf[256]; - int chcount; - -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); -} - -/****************************************************************************/ -/* Reads the data for node number 'number' into the structure 'node' */ -/* from NODE.DAB */ -/* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */ -/****************************************************************************/ -void getnodedat(uint number, node_t *node, char lockit) -{ - char str[256]; - int count=0; - -number--; /* make zero based */ -while(count<LOOP_NODEDAB) { - lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); - if(lockit - && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) { - count++; - continue; } - if(read(nodefile,node,sizeof(node_t))==sizeof(node_t)) - break; - count++; } -if(count==LOOP_NODEDAB) - lprintf("\7Error unlocking and reading NODE.DAB\r\n"); -} - -/****************************************************************************/ -/* Write the data from the structure 'node' into NODE.DAB */ -/* getnodedat(num,&node,1); must have been called before calling this func */ -/* NOTE: ------^ the indicates the node record has been locked */ -/****************************************************************************/ -void putnodedat(uint number, node_t node) -{ - char str[256]; - int count; - -number--; /* make zero based */ -lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); -if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) { - unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); - lprintf("\7Error writing NODE.DAB for node %u\r\n",number+1); - return; } -unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); -} - - -/****************************************************************************/ -/* Creates a short message for 'usernumber' than contains 'strin' */ -/****************************************************************************/ -void putsmsg(int usernumber, char *strin) -{ - char str[256]; - int file,i; - node_t node; - -sprintf(str,"%sMSGS\\%4.4u.MSG",data_dir,usernumber); -if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - lprintf("\7Error opening/creating %s for creat/append access\r\n",str); - return; } -i=strlen(strin); -if(write(file,strin,i)!=i) { - close(file); - lprintf("\7Error writing %u bytes to %s\r\n",i,str); - return; } -close(file); -for(i=1;i<=sys_nodes;i++) { /* flag node if user on that msg waiting */ - getnodedat(i,&node,0); - if(node.useron==usernumber - && (node.status==NODE_INUSE || node.status==NODE_QUIET) - && !(node.misc&NODE_MSGW)) { - getnodedat(i,&node,1); - node.misc|=NODE_MSGW; - putnodedat(i,node); } } -} - - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} - -void remove_re(char *str) -{ -while(!strnicmp(str,"RE:",3)) { - strcpy(str,str+3); - while(str[0]==SP) - strcpy(str,str+1); } -} - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access&O_DENYNONE) { - share=SH_DENYNO; - access&=~O_DENYNONE; } -else if(access==O_RDONLY) share=SH_DENYWR; -else share=SH_DENYRW; -while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(((*file)=nopen(str,access))==-1) - return(NULL); - -if(access&O_APPEND) { - if(access&O_RDONLY) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&O_WRONLY) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - close(*file); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,16*1024); -return(stream); -} - - -/****************************************************************************/ -/* Moves or copies a file from one dir to another */ -/* both 'src' and 'dest' must contain full path and filename */ -/* returns 0 if successful, -1 if error */ -/****************************************************************************/ -int mv(char *src, char *dest, char copy) -{ - char buf[4096],str[256]; - int ind,outd; - long length,chunk=4096,l; - ushort ftime,fdate; - FILE *inp,*outp; - -if(!strcmp(src,dest)) /* source and destination are the same! */ - return(0); -if(!fexist(src)) { - lprintf("\r\nMV ERROR: Source doesn't exist\r\n'%s'\r\n" - ,src); - return(-1); } -if(!copy && fexist(dest)) { - lprintf("\r\nMV ERROR: Destination already exists\r\n'%s'\r\n" - ,dest); - return(-1); } -if(!copy && ((src[1]!=':' && dest[1]!=':') - || (src[1]==':' && dest[1]==':' && toupper(src[0])==toupper(dest[0])))) { - if(rename(src,dest)) { /* same drive, so move */ - lprintf("\r\nMV ERROR: Error renaming '%s'" - "\r\n to '%s'\r\n",src,dest); - return(-1); } - return(0); } -if((ind=nopen(src,O_RDONLY))==-1) { - lprintf("\r\nMV ERROR: ERR_OPEN %s\r\n",src); - return(-1); } -if((inp=fdopen(ind,"rb"))==NULL) { - close(ind); - lprintf("\r\nMV ERROR: ERR_FDOPEN %s\r\n",str); - return(-1); } -setvbuf(inp,NULL,_IOFBF,8*1024); -if((outd=nopen(dest,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - fclose(inp); - lprintf("\r\nMV ERROR: ERR_OPEN %s\r\n",dest); - return(-1); } -if((outp=fdopen(outd,"wb"))==NULL) { - close(outd); - fclose(inp); - lprintf("\r\nMV ERROR: ERR_FDOPEN %s\r\n",str); - return(-1); } -setvbuf(outp,NULL,_IOFBF,8*1024); -length=filelength(ind); -l=0L; -while(l<length) { - if(l+chunk>length) - chunk=length-l; - fread(buf,chunk,1,inp); - fwrite(buf,chunk,1,outp); - l+=chunk; } -_dos_getftime(ind,&fdate,&ftime); -_dos_setftime(outd,fdate,ftime); -fclose(inp); -fclose(outp); -if(!copy && remove(src)) { - lprintf("MV ERROR: ERR_REMOVE %s\r\n",src); - return(-1); } -return(0); -} - -/****************************************************************************/ -/* Returns the total number of msgs in the sub-board and sets 'ptr' to the */ -/* date of the last message in the sub (0) if no messages. */ -/****************************************************************************/ -ulong getlastmsg(uint subnum, ulong *ptr, time_t *t) -{ - char str[256]; - int i; - smbstatus_t status; - -sprintf(smb_file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -if((i=smb_open(10))!=0) { - lprintf("ERR_OPEN %s %d\r\n",smb_file,i); - return(0); } - -if(!filelength(fileno(shd_fp))) { /* Empty base */ - if(ptr) (*ptr)=0; - smb_close(); - return(0); } -if((i=smb_locksmbhdr(10))!=0) { - smb_close(); - lprintf("ERR_LOCK %s %d\r\n",smb_file,i); - return(0); } -if((i=smb_getstatus(&status))!=0) { - smb_unlocksmbhdr(); - smb_close(); - lprintf("ERR_READ %s %d\r\n",smb_file,i); - return(0); } -smb_unlocksmbhdr(); -smb_close(); -if(ptr) (*ptr)=status.last_msg; -return(status.total_msgs); -} - - -ulong loadmsgs(post_t HUGE16 **post, ulong ptr) -{ - int i; - long l=0; - idxrec_t idx; - - -if((i=smb_locksmbhdr(10))!=0) { /* Be sure noone deletes or */ - lprintf("ERR_LOCK %s %d\r\n",smb_file,i); /* adds while we're reading */ - return(0L); } - -fseek(sid_fp,0L,SEEK_SET); -while(!feof(sid_fp)) { - if(!fread(&idx,sizeof(idxrec_t),1,sid_fp)) - break; - - if(idx.number<=ptr || idx.attr&MSG_DELETE) - continue; - - if(idx.attr&MSG_MODERATED && !(idx.attr&MSG_VALIDATED)) - break; - - if(((*post)=(post_t HUGE16 *)REALLOC((*post),sizeof(post_t)*(l+1))) - ==NULL) { - smb_unlocksmbhdr(); - lprintf("ERR_ALLOC %s %lu\r\n",smb_file,sizeof(post_t *)*(l+1)); - return(l); } - (*post)[l].offset=idx.offset; - (*post)[l].number=idx.number; - l++; } -smb_unlocksmbhdr(); -return(l); -} - - -void allocfail(uint size) -{ -lprintf("\7Error allocating %u bytes of memory.\r\n",size); -bail(1); -} - -void bail(int code) -{ -exit(code); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct find_t f; - -if(!findfirst(filespec,&f,0)) - return(f.size); -return(-1L); -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/* Called from upload */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct find_t f; - -if(!findfirst(filespec,&f,0)) - return(1); -return(0); -} - -typedef struct { - ulong alias, - real; - } username_t; - -/****************************************************************************/ -/* Note: Wrote another version of this function that read all userdata into */ -/****************************************************************************/ -/* Looks for a perfect match amoung all usernames (not deleted users) */ -/* Returns the number of the perfect matched username or 0 if no match */ -/* Called from functions waitforcall and newuser */ -/* memory then scanned it from memory... took longer - always. */ -/****************************************************************************/ -ulong matchname(char *inname) -{ - static ulong total_users; - static username_t *username; - int userdat,file,i; - char str[256],c; - ulong l,crc; - FILE *namedat; - -if(!total_users) { /* Load CRCs */ - fprintf(stderr,"%-25s","Loading user names..."); - sprintf(str,"%sUSER\\NAME.DAT",data_dir); - if((namedat=fnopen(&file,str,O_RDONLY))==NULL) - return(0); - sprintf(str,"%sUSER\\USER.DAT",data_dir); - if((userdat=nopen(str,O_RDONLY|O_DENYNONE))==-1) { - fclose(namedat); - return(0); } - while(!feof(namedat) && !eof(userdat)) { - if(!fread(str,LEN_ALIAS+2,1,namedat)) - break; - if((username=(username_t *)REALLOC(username - ,(total_users+1)*sizeof(username_t)))==NULL) - break; - - for(c=0;c<LEN_ALIAS;c++) - if(str[c]==ETX) break; - str[c]=0; - strlwr(str); - username[total_users].alias=crc32(str); - i=0; - while(i<LOOP_NODEDAB - && lock(userdat,(long)((long)(total_users)*U_LEN)+U_NAME - ,LEN_NAME)==-1) { - i++; } - if(i>=LOOP_NODEDAB) /* Couldn't lock USER.DAT record */ - continue; - lseek(userdat,(long)((long)(total_users)*U_LEN)+U_NAME,SEEK_SET); - read(userdat,str,LEN_NAME); - unlock(userdat,(long)((long)(total_users)*U_LEN)+U_NAME,LEN_NAME); - for(c=0;c<LEN_NAME;c++) - if(str[c]==ETX || str[c]==CR) break; - str[c]=0; - strlwr(str); - username[total_users].real=crc32(str); - total_users++; } - fclose(namedat); - close(userdat); - fprintf(stderr, - "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" - "%25s" - "\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b" - ,""); } - -strcpy(str,inname); -strlwr(str); -crc=crc32(str); -for(l=0;l<total_users;l++) - if(crc==username[l].alias || crc==username[l].real) - return(l+1); -return(0); -} - -/****************************************************************************/ -/* Converts goofy FidoNet time format into Unix format */ -/****************************************************************************/ -time_t fmsgtime(char *str) -{ - char month[4]; - struct tm tm; - -memset(&tm,0,sizeof(tm)); -if(isdigit(str[1])) { /* Regular format: "01 Jan 86 02:34:56" */ - tm.tm_mday=atoi(str); - sprintf(month,"%3.3s",str+3); - if(!stricmp(month,"jan")) - tm.tm_mon=0; - else if(!stricmp(month,"feb")) - tm.tm_mon=1; - else if(!stricmp(month,"mar")) - tm.tm_mon=2; - else if(!stricmp(month,"apr")) - tm.tm_mon=3; - else if(!stricmp(month,"may")) - tm.tm_mon=4; - else if(!stricmp(month,"jun")) - tm.tm_mon=5; - else if(!stricmp(month,"jul")) - tm.tm_mon=6; - else if(!stricmp(month,"aug")) - tm.tm_mon=7; - else if(!stricmp(month,"sep")) - tm.tm_mon=8; - else if(!stricmp(month,"oct")) - tm.tm_mon=9; - else if(!stricmp(month,"nov")) - tm.tm_mon=10; - else - tm.tm_mon=11; - tm.tm_year=atoi(str+7); - tm.tm_hour=atoi(str+11); - tm.tm_min=atoi(str+14); - tm.tm_sec=atoi(str+17); } - -else { /* SEAdog format: "Mon 1 Jan 86 02:34" */ - tm.tm_mday=atoi(str+4); - sprintf(month,"%3.3s",str+7); - if(!stricmp(month,"jan")) - tm.tm_mon=0; - else if(!stricmp(month,"feb")) - tm.tm_mon=1; - else if(!stricmp(month,"mar")) - tm.tm_mon=2; - else if(!stricmp(month,"apr")) - tm.tm_mon=3; - else if(!stricmp(month,"may")) - tm.tm_mon=4; - else if(!stricmp(month,"jun")) - tm.tm_mon=5; - else if(!stricmp(month,"jul")) - tm.tm_mon=6; - else if(!stricmp(month,"aug")) - tm.tm_mon=7; - else if(!stricmp(month,"sep")) - tm.tm_mon=8; - else if(!stricmp(month,"oct")) - tm.tm_mon=9; - else if(!stricmp(month,"nov")) - tm.tm_mon=10; - else - tm.tm_mon=11; - tm.tm_year=atoi(str+11); - tm.tm_hour=atoi(str+14); - tm.tm_min=atoi(str+17); - tm.tm_sec=0; } - -if(tm.tm_year<70) - tm.tm_year+=100; - -return(mktime(&tm)); -} - -/****************************************************************************/ -/* Returns the FidoNet address kept in str as ASCII. */ -/****************************************************************************/ -faddr_t atofaddr(char *str) -{ - char *p; - faddr_t addr; - -addr.zone=addr.net=addr.node=addr.point=0; -if((p=strchr(str,':'))!=NULL) { - addr.zone=atoi(str); - addr.net=atoi(p+1); } -else { - if(total_faddrs) - addr.zone=faddr[0].zone; - else - addr.zone=1; - addr.net=atoi(str); } -if(!addr.zone) /* no such thing as zone 0 */ - addr.zone=1; -if((p=strchr(str,'/'))!=NULL) - addr.node=atoi(p+1); -else { - if(total_faddrs) - addr.net=faddr[0].net; - else - addr.net=1; - addr.node=atoi(str); } -if((p=strchr(str,'.'))!=NULL) - addr.point=atoi(p+1); -return(addr); -} - -/****************************************************************************/ -/* Returns an ASCII string for FidoNet address 'addr' */ -/****************************************************************************/ -char *faddrtoa(faddr_t addr) -{ - static char str[25]; - char point[25]; - -sprintf(str,"%u:%u/%u",addr.zone,addr.net,addr.node); -if(addr.point) { - sprintf(point,".%u",addr.point); - strcat(str,point); } -return(str); -} - -#ifndef __OS2__ -/****************************************************************************/ -/* This function reads files that are potentially larger than 32k. */ -/* Up to one megabyte of data can be read with each call. */ -/****************************************************************************/ -long lread(int file, char HUGE16 *buf,long bytes) -{ - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(read(file,(char *)buf,32767)!=32767) - return(-1L); -if(read(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} -#endif - -/****************************************************************************/ -/* Coverts a FidoNet message into a Synchronet message */ -/****************************************************************************/ -void fmsgtosmsg(int file, fmsghdr_t fmsghdr, smbstatus_t status, uint user - ,uint subnum) -{ - uchar ch,HUGE16 *fbuf,HUGE16 *sbody,HUGE16 *stail,HUGE16 *outbuf - ,done,col,esc,cr,*p,str[128]; - int i,chunk,lzh=0,storage; - ushort xlat,net; - ulong l,m,length,lzhlen,bodylen,taillen,crc; - faddr_t faddr,origaddr,destaddr; - smbmsg_t msg; - -memset(&msg,0,sizeof(smbmsg_t)); -memcpy(msg.hdr.id,"SHD\x1a",4); -msg.hdr.version=SMB_VERSION; -if(fmsghdr.attr&FIDO_PRIVATE) - msg.idx.attr|=MSG_PRIVATE; -msg.hdr.attr=msg.idx.attr; - -if(fmsghdr.attr&FIDO_FILE) - msg.hdr.auxattr|=MSG_FILEATTACH; - -msg.hdr.when_imported.time=time(NULL); -msg.hdr.when_imported.zone=sys_timezone; -msg.hdr.when_written.time=fmsgtime(fmsghdr.time); - -origaddr.zone=fmsghdr.origzone; /* only valid if NetMail */ -origaddr.net=fmsghdr.orignet; -origaddr.node=fmsghdr.orignode; -origaddr.point=fmsghdr.origpoint; - -destaddr.zone=fmsghdr.destzone; /* only valid if NetMail */ -destaddr.net=fmsghdr.destnet; -destaddr.node=fmsghdr.destnode; -destaddr.point=fmsghdr.destpoint; - -smb_hfield(&msg,SENDER,strlen(fmsghdr.from),fmsghdr.from); -strlwr(fmsghdr.from); -msg.idx.from=crc16(fmsghdr.from); - -smb_hfield(&msg,RECIPIENT,strlen(fmsghdr.to),fmsghdr.to); -strlwr(fmsghdr.to); -msg.idx.to=crc16(fmsghdr.to); - -if(user) { - sprintf(str,"%u",user); - smb_hfield(&msg,RECIPIENTEXT,strlen(str),str); - msg.idx.to=user; - msg.idx.from=0; } - -smb_hfield(&msg,SUBJECT,strlen(fmsghdr.subj),fmsghdr.subj); -remove_re(fmsghdr.subj); -strlwr(fmsghdr.subj); -msg.idx.subj=crc16(fmsghdr.subj); - -length=filelength(file)-sizeof(fmsghdr_t); -if((fbuf=(char *)LMALLOC(length+1))==NULL) { - printf("alloc error\r\n"); - smb_freemsgmem(msg); - return; } -if((sbody=(char *)LMALLOC((length+1)*2L))==NULL) { - printf("alloc error\n"); - LFREE((char *)fbuf); - smb_freemsgmem(msg); - return; } -if((stail=(char *)LMALLOC((length+1)*2L))==NULL) { - printf("alloc error\n"); - LFREE((char *)fbuf); - LFREE((char *)sbody); - smb_freemsgmem(msg); - return; } -lread(file,fbuf,length); - -for(col=l=esc=done=bodylen=taillen=0,cr=1;l<length;l++) { - ch=fbuf[l]; - if(ch==1 && cr) { /* kludge line */ - - if(!strncmp((char *)fbuf+l+1,"TOPT ",5)) - destaddr.point=atoi((char *)fbuf+l+6); - - else if(!strncmp((char *)fbuf+l+1,"FMPT ",5)) - origaddr.point=atoi((char *)fbuf+l+6); - - else if(!strncmp((char *)fbuf+l+1,"INTL ",5)) { - faddr=atofaddr((char *)fbuf+l+6); - destaddr.zone=faddr.zone; - destaddr.net=faddr.net; - destaddr.node=faddr.node; - l+=6; - while(l<length && fbuf[l]!=SP) l++; - faddr=atofaddr((char *)fbuf+l+1); - origaddr.zone=faddr.zone; - origaddr.net=faddr.net; - origaddr.node=faddr.node; } - - else if(!strncmp((char *)fbuf+l+1,"MSGID:",6)) { - l+=7; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOMSGID,m-l,fbuf+l); } - - else if(!strncmp((char *)fbuf+l+1,"REPLY:",6)) { - l+=7; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOREPLYID,m-l,fbuf+l); } - - else if(!strncmp((char *)fbuf+l+1,"FLAGS:",6)) { - l+=7; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOFLAGS,m-l,fbuf+l); } - - else if(!strncmp((char *)fbuf+l+1,"PATH:",5)) { - l+=6; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOPATH,m-l,fbuf+l); } - - else if(!strncmp((char *)fbuf+l+1,"PID:",4)) { - l+=5; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOPID,m-l,fbuf+l); } - - else { /* Unknown kludge line */ - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOCTRL,m-l,fbuf+l); } - - while(l<length && fbuf[l]!=CR) l++; - continue; } - - if(ch!=LF && ch!=0x8d) { /* ignore LF and soft CRs */ - if(cr && (!strncmp((char *)fbuf+l,"--- ",4) - || !strncmp((char *)fbuf+l,"---\r",4))) - done=1; /* tear line and down go into tail */ - if(done && cr && !strncmp((char *)fbuf+l,"SEEN-BY:",8)) { - l+=8; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOSEENBY,m-l,fbuf+l); - while(l<length && fbuf[l]!=CR) l++; - continue; } - if(done) - stail[taillen++]=ch; - else - sbody[bodylen++]=ch; - col++; - if(ch==CR) { - cr=1; - col=0; - if(done) - stail[taillen++]=LF; - else - sbody[bodylen++]=LF; } - else { - cr=0; - if(col==1 && !strncmp((char *)fbuf+l," * Origin: ",11)) { - p=strchr((char *)fbuf+l+11,CR); /* find carriage return */ - while(p && *p!='(') p--; /* rewind to '(' */ - if(p) - origaddr=atofaddr(p+1); /* get orig address */ - done=1; } - if(done) - continue; - - if(ch==ESC) esc=1; /* ANSI codes */ - if(ch==SP && col>40 && !esc) { /* word wrap */ - for(m=l+1;m<length;m++) /* find next space */ - if(fbuf[m]<=SP) - break; - if(m<length && m-l>80-col) { /* if it's beyond the eol */ - sbody[bodylen++]=CR; - sbody[bodylen++]=LF; - col=0; } } - } } } - -LFREE(fbuf); - -if(bodylen>=2 && sbody[bodylen-2]==CR && sbody[bodylen-1]==LF) - bodylen-=2; /* remove last CRLF if present */ - -if(status.max_crcs) { - for(l=0,crc=0xffffffff;l<bodylen;l++) - crc=ucrc32(sbody[l],crc); - crc=~crc; - - i=smb_addcrc(status.max_crcs,crc,10); - if(i) { - if(i==1) - lprintf("Duplicate message\r\n"); - else - lprintf("smb_addcrc returned %d\r\n",i); - smb_freemsgmem(msg); - LFREE(sbody); - LFREE(stail); - return; } } - -while(taillen && stail[taillen-1]<=SP) /* trim all garbage off the tail */ - taillen--; - -net=NET_FIDO; /* Record origin address */ -smb_hfield(&msg,SENDERNETTYPE,sizeof(ushort),&net); -smb_hfield(&msg,SENDERNETADDR,sizeof(fidoaddr_t),&origaddr); - -if(subnum==INVALID_SUB) { /* No origin line means NetMail, so add dest addr */ - smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(ushort),&net); - smb_hfield(&msg,RECIPIENTNETADDR,sizeof(fidoaddr_t),&destaddr); } - -if(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_LZH - && bodylen+2+taillen+2>=SDT_BLOCK_LEN && bodylen) { - if((outbuf=(char *)LMALLOC(bodylen*2))==NULL) { - printf("alloc error for lzh: %lu\n",bodylen*2); - smb_freemsgmem(msg); - LFREE(sbody); - LFREE(stail); - return; } - lzhlen=lzh_encode((uchar *)sbody,bodylen,(uchar *)outbuf); - if(lzhlen>1 && - smb_datblocks(lzhlen+4+taillen+2)<smb_datblocks(bodylen+2+taillen+2)) { - bodylen=lzhlen; /* Compressable */ - l=bodylen+4; - LFREE(sbody); - lzh=1; - sbody=outbuf; } - else { /* Uncompressable */ - l=bodylen+2; - LFREE(outbuf); } } -else - l=bodylen+2; - -if(taillen) - l+=(taillen+2); - - -if(status.attr&SMB_HYPERALLOC) { - if((i=smb_locksmbhdr(10))!=0) { - printf("smb_locksmbhdr returned %d\n",i); - smb_freemsgmem(msg); - LFREE(sbody); - LFREE(stail); - return; } - msg.hdr.offset=smb_hallocdat(); - storage=SMB_HYPERALLOC; } -else { - if(smb_open_da(10)) { - smb_freemsgmem(msg); - printf("error opening %s.SDA\r\n",smb_file); - LFREE(sbody); - LFREE(stail); - return; } - if(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_FAST) { - msg.hdr.offset=smb_fallocdat(l,1); - storage=SMB_FASTALLOC; } - else { - msg.hdr.offset=smb_allocdat(l,1); - storage=SMB_SELFPACK; } - fclose(sda_fp); } - -if(msg.hdr.offset && msg.hdr.offset<1L) { - smb_unlocksmbhdr(); - smb_freemsgmem(msg); - LFREE(sbody); - LFREE(stail); - printf("error %ld allocating records\r\n",msg.hdr.offset); - return; } -fseek(sdt_fp,msg.hdr.offset,SEEK_SET); -if(lzh) { - xlat=XLAT_LZH; - fwrite(&xlat,2,1,sdt_fp); } -xlat=XLAT_NONE; -fwrite(&xlat,2,1,sdt_fp); -chunk=30000; -for(l=0;l<bodylen;l+=chunk) { - if(l+chunk>bodylen) - chunk=bodylen-l; - fwrite(sbody+l,1,chunk,sdt_fp); } -if(taillen) { - fwrite(&xlat,2,1,sdt_fp); - fwrite(stail,1,taillen,sdt_fp); } -fflush(sdt_fp); -LFREE(sbody); -LFREE(stail); - -if(status.attr&SMB_HYPERALLOC) - smb_unlocksmbhdr(); - -if(lzh) - bodylen+=2; -bodylen+=2; -smb_dfield(&msg,TEXT_BODY,bodylen); -if(taillen) - smb_dfield(&msg,TEXT_TAIL,taillen+2); - -smb_addmsghdr(&msg,&status,storage,10); -smb_freemsgmem(msg); -} - -/****************************************************************/ -/* Get zone and point from kludge lines in 'file' if they exist */ -/****************************************************************/ -void getzpt(int file, fmsghdr_t *hdr) -{ - char buf[0x1000]; - int i,len,cr=0; - faddr_t faddr; - -len=read(file,buf,0x1000); -for(i=0;i<len;i++) { - if((!i || cr) && buf[i]==1) { /* kludge */ - if(!strncmp(buf+i+1,"TOPT ",5)) - hdr->destpoint=atoi(buf+i+6); - else if(!strncmp(buf+i+1,"FMPT ",5)) - hdr->origpoint=atoi(buf+i+6); - else if(!strncmp(buf+i+1,"INTL ",5)) { - faddr=atofaddr(buf+i+6); - hdr->destzone=faddr.zone; - hdr->destnet=faddr.net; - hdr->destnode=faddr.node; - i+=6; - while(buf[i] && buf[i]!=SP) i++; - faddr=atofaddr(buf+i+1); - hdr->origzone=faddr.zone; - hdr->orignet=faddr.net; - hdr->orignode=faddr.node; } - while(i<len && buf[i]!=CR) i++; - cr=1; - continue; } - if(buf[i]==CR) - cr=1; - else - cr=0; } -lseek(file,sizeof(fmsghdr_t),SEEK_SET); -} - -/***********************************/ -/* Synchronet/FidoNet Message util */ -/***********************************/ -int main(int argc, char **argv) -{ - char ch,str[512],fname[256],touser[512],subj[512],path[512],sub_code[9] - ,*p,*tp,*sp,*buf,*outbuf,cr,tear,lzh; - ushort xlat; - int i,j,k,n,x,last,file,fmsg,nextmsg,g; - ulong files,msgfiles,echomail=0,netmail=0,exported=0,crc, - l,m,length,lastmsg,posts,msgs,exp; - time_t ptr,now,start,lastimport; - read_cfg_text_t txt; - struct find_t ff; - struct tm tm,*tm_p; - fmsghdr_t hdr; - faddr_t addr,sys_faddr; - post_t HUGE16 *post; - FILE *stream,*fstream; - smbstatus_t status; - smbmsg_t msg; - -lprintf("\nSynchronet <=> FidoNet Utility Version %s " - "Developed by Rob Swindell\n",VER); - -putenv("TZ=UCT0"); -_fmode=O_BINARY; -setvbuf(stdout,NULL,_IONBF,0); - -txt.openerr="\7\r\nError opening %s for read.\r\n"; -txt.reading="\r\nReading %s..."; -txt.readit="\rRead %s "; -txt.allocerr="\7\r\nError allocating %u bytes of memory\r\n"; -txt.error="\7\r\nERROR: Offset %lu in %s\r\n\r\n"; - -node_dir[0]=sub_code[0]=0; -for(i=1;i<argc;i++) { - if(argv[i][0]=='/') { - j=1; - while(argv[i][j]) { - switch(toupper(argv[i][j])) { - case 'A': - misc|=ASCII_ONLY; - break; - case 'B': - misc|=LOCAL_NETMAIL; - break; - case 'C': - misc|=PURGE_ECHOMAIL; - break; - case 'D': - misc&=~DELETE_NETMAIL; - break; - case 'E': - misc&=~EXPORT_ECHOMAIL; - break; - case 'F': - misc|=IMPORT_LOCAL; - break; - case 'G': - misc|=IMPORT_NEW_ONLY; - break; - case 'H': - misc|=EXPORT_ALL; - break; - case 'I': - misc&=~IMPORT_ECHOMAIL; - break; - case 'J': - misc|=IGNORE_RECV; - break; - case 'K': - misc&=~KILL_ECHOMAIL; - break; - case 'L': - misc|=LOGFILE; - break; - case 'M': - misc|=IGNORE_MSGPTRS; - break; - case 'N': - misc&=~IMPORT_NETMAIL; - break; - case 'O': - misc|=IGNORE_ADDRESS; - break; - case 'P': - misc|=IGNORE_POINT; - break; - case 'Q': - misc|=DONT_SET_RECV; - break; - case 'R': - misc|=REPORT; - break; - case 'S': - misc|=IMPORT_PRIVATE; - break; - case 'T': - misc|=LEAVE_MSGPTRS; - break; - case 'U': - misc|=UPDATE_MSGPTRS; - misc&=~EXPORT_ECHOMAIL; - break; - case 'X': - misc&=~DELETE_ECHOMAIL; - break; - case 'Y': - misc|=UNKNOWN_NETMAIL; - break; - case 'Z': - misc|=IGNORE_ZONE; - break; - - case '=': - misc|=CONVERT_TEAR; - break; - case '!': - misc|=NOTIFY_RECEIPT; - break; - case '2': - startmsg=2; - break; - default: - printf("\nusage: sbbsfido [sbbsnode] [/switches] " - "[sub_code]"); - printf("\nwhere: sbbsnode is the path for your " - "NODE1 directory (example: c:\\sbbs\\node1)\n"); - printf(" sub_code is the internal code for a " - "sub-board (default is ALL subs)\n"); - printf("\nvalid switches:\n\n"); - printf("n:do not import netmail " - "i:do not import echomail\n"); - printf("p:ignore point in netmail address " - "e:do not export echomail\n"); - printf("z:ignore zone in netmail address " - "h:export all echomail (hub rescan)\n"); - printf("o:ignore entire netmail address " - "m:ignore message pointers (export all)\n"); - printf("y:import netmail for unknown users " - "u:update message pointers (export none)\n"); - printf("d:do not delete netmail after import " - "x:do not delete echomail after import\n"); - printf("l:output to SBBSFIDO.LOG (verbose) " - "k:do not kill echomail after export\n"); - printf("r:create report of import totals " - "t:do not update message pointers\n"); - printf("a:export ASCII characters only " - "c:delete all messages (echomail purge)\n"); - printf("j:ignore recieved bit on import " - "s:import private override (strip pvt)\n"); - printf("q:do not set received bit on import " - "g:import new echomail only\n"); - printf("b:import locally created netmail too " - "f:import locally created echomail too\n"); - printf("=:change existing tear lines to === " - "2:export/import/delete starting at 2.MSG\n"); - printf("!:notify users of received echomail\n"); - exit(0); } - j++; } } - else { - if(strchr(argv[i],'\\') || argv[i][1]==':') - sprintf(node_dir,"%.40s",argv[i]); - else - sprintf(sub_code,"%.8s",argv[i]); } } - -if(!node_dir[0]) { - p=getenv("SBBSNODE"); - if(p==NULL) { - printf("\7\nSBBSNODE environment variable not set.\n"); - exit(1); } - strcpy(node_dir,p); } - -strupr(node_dir); - -if(node_dir[strlen(node_dir)-1]!='\\') - strcat(node_dir,"\\"); - -read_node_cfg(txt); -if(ctrl_dir[0]=='.') { /* Relative path */ - strcpy(str,ctrl_dir); - sprintf(ctrl_dir,"%s%s",node_dir,str); - if(_fullpath(str,ctrl_dir,40)) - strcpy(ctrl_dir,str); } -backslash(ctrl_dir); - -read_main_cfg(txt); -if(data_dir[0]=='.') { /* Relative path */ - strcpy(str,data_dir); - sprintf(data_dir,"%s%s",node_dir,str); - if(_fullpath(str,data_dir,40)) - strcpy(data_dir,str); } -backslash(data_dir); -if(text_dir[0]=='.') { /* Relative path */ - strcpy(str,text_dir); - sprintf(text_dir,"%s%s",node_dir,str); - if(_fullpath(str,text_dir,40)) - strcpy(text_dir,str); } -backslash(text_dir); -read_msgs_cfg(txt); - -if(total_faddrs<1) { - sys_faddr.zone=sys_faddr.net=sys_faddr.node=1; - sys_faddr.point=0; } -else - sys_faddr=faddr[0]; - - -if(misc&LOGFILE) - if((fidologfile=fnopen(&i,"SBBSFIDO.LOG" - ,O_WRONLY|O_APPEND|O_CREAT))==NULL) { - lprintf("\7ERROR opening SBBSFIDO.LOG\r\n"); - exit(1); } - -sprintf(str,"%s%s",ctrl_dir,"NODE.DAB"); -if((nodefile=sopen(str,O_BINARY|O_RDWR,SH_DENYNO))==-1) { - lprintf("\r\n\7Error opening %s\r\n",str); - exit(1); } - -if(misc&IMPORT_NETMAIL) { - -lputs("\r\n\r\nScanning for Inbound NetMail...\r\n"); - -sprintf(smb_file,"%sMAIL",data_dir); -if((i=smb_open(10))!=0) { - lprintf("Error %d opening %s\r\n",i,smb_file); - exit(1); } - -if(!filelength(fileno(shd_fp))) - if((i=smb_create(mail_maxcrcs,MAX_SYSMAIL,mail_maxage,SMB_EMAIL,10))!=0) { - lprintf("Error %d creating %s\r\n",i,smb_file); - exit(1); } - -if((i=smb_locksmbhdr(10))!=0) { - lprintf("Error %d locking %s\r\n",i,smb_file); - exit(1); } -if((i=smb_getstatus(&status))!=0) { - lprintf("Error %d reading %s status header\r\n",i,smb_file); - exit(1); } -smb_unlocksmbhdr(); - -sprintf(str,"%s*.MSG",netmail_dir); - -for(last=findfirst(str,&ff,0);!last;last=findnext(&ff)) { - sprintf(path,"%s%s",netmail_dir,ff.name); - strupr(path); - lprintf("\r%s ",path); - if((fmsg=nopen(path,O_RDWR))==-1) { - lprintf("\7ERROR opening"); - continue; } - if(filelength(fmsg)<sizeof(fmsghdr_t)) { - lprintf("\7Invalid length of %u bytes\r\n",filelength(fmsg)); - close(fmsg); - continue; } - if(read(fmsg,&hdr,sizeof(fmsghdr_t))!=sizeof(fmsghdr_t)) { - close(fmsg); - lprintf("\7ERROR reading %u bytes" - ,sizeof(fmsghdr_t)); - continue; } - if(hdr.attr&FIDO_ORPHAN) { - close(fmsg); - lprintf("Orphan (%s).\r\n",hdr.to); - continue; } - if(misc&IGNORE_ZONE) /* default to system's zone */ - hdr.destzone=hdr.origzone=sys_faddr.zone; - if(misc&IGNORE_POINT) /* default to no point */ - hdr.destpoint=hdr.origpoint=0; - getzpt(fmsg,&hdr); /* use kludge if found */ - for(i=0;i<total_faddrs;i++) - if(hdr.destzone==faddr[i].zone - && hdr.destnet==faddr[i].net - && hdr.destnode==faddr[i].node - && hdr.destpoint==faddr[i].point) - break; - lprintf("%u:%u/%u.%u " - ,hdr.destzone,hdr.destnet,hdr.destnode,hdr.destpoint); - if(misc&IGNORE_ADDRESS || i<total_faddrs) { - if(!(misc&IGNORE_RECV) && hdr.attr&FIDO_RECV) { - close(fmsg); - lputs("Already received.\r\n"); - continue; } - if(hdr.attr&FIDO_LOCAL && !(misc&LOCAL_NETMAIL)) { - close(fmsg); - lputs("Created locally.\r\n"); - continue; } - i=atoi(hdr.to); - if(!stricmp(hdr.to,"SYSOP")) /* NetMail to "sysop" goes to #1 */ - i=1; - if(!i) - i=matchname(hdr.to); - if(!i) { - if(misc&UNKNOWN_NETMAIL) /* receive unknown user mail to 1 */ - i=1; - else { - lprintf("\7ERROR unknown user '%s'\r\n",hdr.to); - hdr.attr|=FIDO_ORPHAN; - lseek(fmsg,0L,SEEK_SET); - write(fmsg,&hdr,sizeof(fmsghdr_t)); - close(fmsg); - continue; } } - lprintf("%s\r\n",hdr.to); - - /*********************/ - /* Importing NetMail */ - /*********************/ - - fmsgtosmsg(fmsg,hdr,status,i,INVALID_SUB); - - addr.zone=hdr.origzone; - addr.net=hdr.orignet; - addr.node=hdr.orignode; - addr.point=hdr.origpoint; - sprintf(str,"\7\1n\1hSBBSFIDO: \1m%.36s \1n\1msent you NetMail from " - "\1h%s\1n\r\n" - ,hdr.from,faddrtoa(addr)); - putsmsg(i,str); - - if(hdr.attr&FIDO_FILE) { /* File attachment */ - strcpy(subj,hdr.subj); - tp=subj; - while(1) { - p=strchr(tp,SP); - if(p) *p=0; - sp=strrchr(tp,'/'); /* sp is slash pointer */ - if(!sp) sp=strrchr(tp,'\\'); - if(sp) tp=sp+1; - sprintf(str,"%s%s",fidofile_dir,tp); - sprintf(tmp,"%sFILE\\%04u.IN",data_dir,i); - mkdir(tmp); - strcat(tmp,"\\"); - strcat(tmp,tp); - mv(str,tmp,0); - if(!p) - break; - tp=p+1; } } - netmail++; - - /***************************/ - /* Updating message header */ - /***************************/ - if(!(misc&DONT_SET_RECV)) { - hdr.attr|=FIDO_RECV; - lseek(fmsg,0L,SEEK_SET); - write(fmsg,&hdr,sizeof(fmsghdr_t)); } - - /**************************************/ - /* Delete source netmail if specified */ - /**************************************/ - close(fmsg); - if(misc&DELETE_NETMAIL) - remove(path); } - else - close(fmsg); } -smb_close(); } - - -if(misc&IMPORT_ECHOMAIL) { - -start=time(NULL); - -lputs("\r\n\r\nScanning for Inbound EchoMail...\r\n"); - -sprintf(path,"%sSBBSFIDO.DAB",data_dir); -if((file=nopen(path,O_RDWR|O_CREAT))==-1) - lastimport=0L; -else { - read(file,&lastimport,4); - now=time(NULL); - lseek(file,0L,SEEK_SET); - write(file,&now,4); - close(file); } - -for(g=files=0;g<total_grps;g++) -for(i=0;i<total_subs;i++) - if(sub[i]->misc&SUB_FIDO && sub[i]->grp==g) { - if(sub_code[0] && stricmp(sub_code,sub[i]->code)) - continue; - if(!sub[i]->echopath[0]) - sprintf(sub[i]->echopath,"%s%s\\",echomail_dir,sub[i]->code); - if(files) { - lputs("\r\n"); - files=0; } - lprintf("\r\n%-15.15s %s\r\n" - ,grp[sub[i]->grp]->sname,sub[i]->lname); - - sprintf(path,"%s*.MSG",sub[i]->echopath); - l=findfirst(path,&ff,0); - if(startmsg==2 && !strcmp(ff.name,"1.MSG")) - l=findnext(&ff); - if(l) - continue; - lprintf("Counting %s",path); - msgfiles=0; - while(!l) { - memset(&tm,0,sizeof(tm)); - tm.tm_mday=ff.wr_date&31; - tm.tm_mon=(ff.wr_date>>5)&15; - tm.tm_year=80+((ff.wr_date>>9)&127); - tm.tm_hour=(ff.wr_time>>11)&31; - tm.tm_min=(ff.wr_time>>5)&63; - tm.tm_sec=(ff.wr_time&0x1f)<<1; - if(isdigit(ff.name[0]) - && !(startmsg==2 && !strcmp(ff.name,"1.MSG")) - && !(misc&IMPORT_NEW_ONLY && mktime(&tm)<=lastimport)) - msgfiles++; /* msgfiles= messages to import */ - l=findnext(&ff); } - - lprintf("\r\n%u messages.\r\n",msgfiles); - if(!msgfiles) /* no messages, so continue. */ - continue; - - sprintf(smb_file,"%s%s",sub[i]->data_dir,sub[i]->code); - if((j=smb_open(10))!=0) { - lprintf("Error %d opening %s\r\n",j,smb_file); - continue; } - if(!filelength(fileno(shd_fp))) - if((j=smb_create(sub[i]->maxcrcs,sub[i]->maxmsgs - ,sub[i]->maxage - ,sub[i]->misc&SUB_HYPER ? SMB_HYPERALLOC:0 - ,10))!=0) { - lprintf("Error %d creating %s\r\n",j,smb_file); - smb_close(); - continue; } - - if((j=smb_locksmbhdr(10))!=0) { - lprintf("Error %d locking SMB header\r\n",j); - smb_close(); - continue; } - if((j=smb_getstatus(&status))!=0) { - lprintf("Error %d reading SMB header\r\n",j); - smb_close(); - continue; } - smb_unlocksmbhdr(); - - for(l=startmsg;l<0x8000 && msgfiles;l++) { - sprintf(path,"%s%lu.MSG",sub[i]->echopath,l); - if(findfirst(path,&ff,0)) /* doesn't exist */ - continue; /* was break */ - tm.tm_mday=ff.wr_date&31; - tm.tm_mon=(ff.wr_date>>5)&15; - tm.tm_year=80+((ff.wr_date>>9)&127); - tm.tm_hour=(ff.wr_time>>11)&31; - tm.tm_min=(ff.wr_time>>5)&63; - tm.tm_sec=(ff.wr_time&0x1f)<<1; - if(misc&IMPORT_NEW_ONLY && mktime(&tm)<=lastimport) - continue; - if(startmsg==2 && !strcmp(ff.name,"1.MSG")) - continue; - msgfiles--; /* so we only look for as many as are there */ - strupr(path); - lprintf("\r%s ",path); - files++; - if((fmsg=nopen(path,O_RDWR))==-1) { - lprintf("\7ERROR opening\r\n"); - continue; } - if(filelength(fmsg)<sizeof(fmsghdr_t)) { - lprintf("\7Invalid length of %u bytes\r\n",filelength(fmsg)); - close(fmsg); - continue; } - if(read(fmsg,&hdr,sizeof(fmsghdr_t))!=sizeof(fmsghdr_t)) { - close(fmsg); - lprintf("\7ERROR reading %u bytes\r\n" - ,sizeof(fmsghdr_t)); - continue; } - if(misc&IMPORT_LOCAL || !(hdr.attr&FIDO_LOCAL)) { - - if(!(misc&IGNORE_RECV) && hdr.attr&FIDO_RECV) { - close(fmsg); - lputs("Already received.\r\n"); - continue; } - - if(hdr.attr&FIDO_SENT) { - close(fmsg); - lputs("Sent."); - if(hdr.attr&FIDO_KILLSENT) - if(!remove(path)) - lputs(" Killed."); - lputs("\r\n"); - continue; } - - if(hdr.attr&FIDO_PRIVATE && !(sub[i]->misc&SUB_PRIV)) { - if(misc&IMPORT_PRIVATE) - hdr.attr&=~FIDO_PRIVATE; - else { - close(fmsg); - lputs("Private posts disallowed.\r\n"); - continue; } } - - if(!(hdr.attr&FIDO_PRIVATE) && sub[i]->misc&SUB_PONLY) - hdr.attr|=MSG_PRIVATE; - - /**********************/ - /* Importing EchoMail */ - /**********************/ - - fmsgtosmsg(fmsg,hdr,status,0,i); - - echomail++; - - /* Updating message header */ - if(!(misc&DONT_SET_RECV)) { - hdr.attr|=FIDO_RECV; - lseek(fmsg,0L,SEEK_SET); - write(fmsg,&hdr,sizeof(fmsghdr_t)); } - - close(fmsg); - if(misc&NOTIFY_RECEIPT && (m=matchname(hdr.to))!=0) { - sprintf(str - ,"\7\1n\1hSBBSFIDO: \1m%.36s \1n\1msent you EchoMail on " - "\1h%s \1n\1m%s\1n\r\n" - ,hdr.from,grp[sub[i]->grp]->sname,sub[i]->sname); - putsmsg(m,str); } - - /* Delete source EchoMail if specified */ - if(misc&DELETE_ECHOMAIL) - remove(path); } - else - close(fmsg); } - smb_close(); - } - -now=time(NULL); -if(now-start) - lprintf("\r\nImported %lu EchoMail messages in %lu seconds " - "(%lu messages/second).\r\n" - ,echomail,now-start,echomail/(now-start)); -} - -if(misc&EXPORT_ECHOMAIL) { - -start=time(NULL); - -lputs("\r\n\r\nScanning for Outbound EchoMail...\r\n"); - -for(g=files=0;g<total_grps;g++) -for(i=0;i<total_subs;i++) - if(sub[i]->misc&SUB_FIDO && sub[i]->grp==g) { - if(sub_code[0] && stricmp(sub_code,sub[i]->code)) - continue; - if(!sub[i]->echopath[0]) - sprintf(sub[i]->echopath,"%s%s\\",echomail_dir,sub[i]->code); - if(files) { - lputs("\r\n"); - files=0; } - lprintf("\r\n%-15.15s %s\r\n" - ,grp[sub[i]->grp]->sname,sub[i]->lname); - ptr=0; - if(!(misc&IGNORE_MSGPTRS)) { - sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code); - if((file=nopen(str,O_RDONLY))!=-1) { - read(file,&ptr,sizeof(time_t)); - close(file); } } - - msgs=getlastmsg(i,&lastmsg,0); - if(!msgs || (!(misc&IGNORE_MSGPTRS) && ptr>=lastmsg)) { - if(ptr>lastmsg && !(misc&LEAVE_MSGPTRS)) { /* fix ptr */ - sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code); - if((file=nopen(str,O_WRONLY|O_CREAT))==-1) - lprintf("\7ERROR opening/creating %s",str); - else { - write(file,&lastmsg,4); - close(file); } } - continue; } - nextmsg=startmsg; - - sprintf(smb_file,"%s%s" - ,sub[i]->data_dir,sub[i]->code); - if((j=smb_open(10))!=0) { - lprintf("Error %d opening %s\r\n",j,smb_file); - continue; } - - post=NULL; - posts=loadmsgs(&post,ptr); - - if(!posts) { /* no new messages */ - smb_close(); - if(post) - FREE(post); - continue; } - - for(m=exp=0;m<posts;m++) { - printf("\rScanning: %lu of %lu " - ,m+1,posts); - - msg.idx.offset=post[m].offset; - if((k=smb_lockmsghdr(msg,10))!=0) { - lprintf("ERR_LOCK %s %d\r\n",smb_file,k); - continue; } - k=smb_getmsghdr(&msg); - if(k || msg.hdr.number!=post[m].number) { - smb_unlockmsghdr(msg); - smb_freemsgmem(msg); - - msg.hdr.number=post[m].number; - if((k=smb_getmsgidx(&msg))!=0) { - lprintf("ERR_READ %s %d\r\n",smb_file,k); - continue; } - if((k=smb_lockmsghdr(msg,10))!=0) { - lprintf("ERR_LOCK %s %d\r\n",smb_file,k); - continue; } - if((k=smb_getmsghdr(&msg))!=0) { - smb_unlockmsghdr(msg); - lprintf("ERR_READ %s %d\r\n",smb_file,k); - continue; } } - - if((!(misc&EXPORT_ALL) && msg.from_net.type==NET_FIDO) - || !strnicmp(msg.subj,"NE:",3)) { /* no echo */ - smb_unlockmsghdr(msg); - smb_freemsgmem(msg); - continue; } /* From a Fido node, ignore it */ - - if(msg.from_net.type && msg.from_net.type!=NET_FIDO - && !(sub[i]->misc&SUB_GATE)) { - smb_unlockmsghdr(msg); - smb_freemsgmem(msg); - continue; } - - for(j=nextmsg;j;j++) { - sprintf(fname,"%s%u.MSG",sub[i]->echopath,j); - if(!fexist(fname)) - break; } - if(!j) { - lputs("\7EchoMail dir full!"); - smb_unlockmsghdr(msg); - smb_freemsgmem(msg); - continue; } - nextmsg=j+1; - strupr(fname); - if((fmsg=nopen(fname,O_WRONLY|O_CREAT))==-1) { - smb_unlockmsghdr(msg); - smb_freemsgmem(msg); - lprintf("\7ERROR creating %s\r\n",fname); - continue; } - if((fstream=fdopen(fmsg,"wb"))==NULL) { - close(fmsg); - smb_unlockmsghdr(msg); - smb_freemsgmem(msg); - lprintf("\7ERROR fdopen %s\r\n",fname); - continue; } - setvbuf(fstream,NULL,_IOFBF,2048); - - files++; - - memset(&hdr,0,sizeof(fmsghdr_t)); /* Zero the header */ - hdr.origzone=sub[i]->faddr.zone; - hdr.orignet=sub[i]->faddr.net; - hdr.orignode=sub[i]->faddr.node; - hdr.origpoint=sub[i]->faddr.point; - - hdr.attr=FIDO_LOCAL; - if(misc&KILL_ECHOMAIL) - hdr.attr|=FIDO_KILLSENT; - if(msg.hdr.attr&MSG_PRIVATE) - hdr.attr|=FIDO_PRIVATE; - - sprintf(hdr.from,"%.35s",msg.from); - - tm_p=gmtime((time_t *)&msg.hdr.when_written.time); - sprintf(hdr.time,"%02u %3.3s %02u %02u:%02u:%02u" - ,tm_p->tm_mday,mon[tm_p->tm_mon],tm_p->tm_year%100 - ,tm_p->tm_hour,tm_p->tm_min,tm_p->tm_sec); - - sprintf(hdr.to,"%.35s",msg.to); - - sprintf(hdr.subj,"%.71s",msg.subj); - - fwrite(&hdr,sizeof(fmsghdr_t),1,fstream); - - for(j=0;j<msg.hdr.total_dfields;j++) { - - if(msg.dfield[j].type!=TEXT_BODY - && msg.dfield[j].type!=TEXT_TAIL) - continue; /* skip non-text data fields */ - - if(msg.dfield[j].length<3) /* need at least 3 bytes */ - continue; - - fseek(sdt_fp,msg.hdr.offset+msg.dfield[j].offset,SEEK_SET); - - lzh=0; - fread(&xlat,2,1,sdt_fp); - if(xlat==XLAT_LZH) { - lzh=1; - fread(&xlat,2,1,sdt_fp); } - if(xlat!=XLAT_NONE) /* no other translations supported */ - continue; - - length=msg.dfield[j].length-2; - if(lzh) - length-=2; - - if((buf=LMALLOC(length))==NULL) { - lprintf("Error allocating %lu bytes\r\n",length); - continue; } - - fread(buf,length,1,sdt_fp); - - if(lzh) { - l=*(long *)buf; - if((outbuf=LMALLOC(l))==NULL) { - lprintf("Error allocationg %lu for lzh\r\n",l); - LFREE(buf); - continue; } - length=lzh_decode(buf,length,outbuf); - LFREE(buf); - buf=outbuf; } - - tear=0; - for(l=0,cr=1;l<length;l++) { - if(buf[l]==1) { /* Ctrl-A, so skip it and the next char */ - l++; - continue; } - if(buf[l]==LF || buf[l]==0) /* Ignore line feeds */ - continue; - if(cr) { - if(l+3<length && buf[l]=='-' && buf[l+1]=='-' - && buf[l+2]=='-' - && (buf[l+3]==SP || buf[l+3]==CR)) { - if(misc&CONVERT_TEAR) /* Convert to === */ - buf[l]=buf[l+1]=buf[l+2]='='; - else - tear=1; } - else if(l+10<length - && !strncmp(buf+l," * Origin: ",11)) - buf[l+1]='#'; } /* Convert * Origin into # Origin */ - - if(buf[l]==CR) - cr=1; - else - cr=0; - if(sub[i]->misc&SUB_ASCII || misc&ASCII_ONLY) { - if(buf[l]<SP && buf[l]!=CR) /* Ctrl ascii */ - buf[l]='.'; /* converted to '.' */ - if((uchar)buf[l]>0x7f) /* extended ASCII */ - buf[l]='*'; } /* converted to '*' */ - fputc(buf[l],fstream); } - fprintf(fstream,"\r\n"); - LFREE(buf); } - - if(!(sub[i]->misc&SUB_NOTAG)) { - if(!tear) /* No previous tear line */ - fprintf(fstream,"--- Synchronet+SBBSfido v%s\r\n" - ,VER); /* so add ours */ - fprintf(fstream," * Origin: %s (%s)\r\n" - ,sub[i]->origline[0] ? sub[i]->origline : origline - ,faddrtoa(sub[i]->faddr)); } - - fputc(0,fstream); /* Null terminator */ - fclose(fstream); - exported++; - exp++; - printf("Exported: %lu of %lu",exp,exported); - smb_unlockmsghdr(msg); - smb_freemsgmem(msg); } - - smb_close(); - FREE(post); - - /***********************/ - /* Update FIDO_PTR.DAB */ - /***********************/ - if(!(misc&LEAVE_MSGPTRS) && lastmsg>ptr) { - sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code); - if((file=nopen(str,O_WRONLY|O_CREAT))==-1) - lprintf("\7ERROR opening/creating %s",str); - else { - write(file,&lastmsg,4); - close(file); } } } - -now=time(NULL); -if(now-start) - lprintf("\r\nExported %lu EchoMail messages in %lu seconds " - "(%lu messages/second).\r\n" - ,exported,now-start,exported/(now-start)); - -} - -if(misc&UPDATE_MSGPTRS) { - -lputs("\r\n\r\nUpdating Message Pointers to Last Posted Message...\r\n"); - -for(g=0;g<total_grps;g++) -for(i=0;i<total_subs;i++) - if(sub[i]->misc&SUB_FIDO && sub[i]->grp==g) { - lprintf("\r\n%-15.15s %s\r\n" - ,grp[sub[i]->grp]->sname,sub[i]->lname); - getlastmsg(i,&l,0); - sprintf(str,"%s%s.SFP",sub[i]->data_dir,sub[i]->code); - if((file=nopen(str,O_WRONLY|O_CREAT))==-1) - lprintf("\7ERROR opening/creating %s",str); - else { - write(file,&l,sizeof(time_t)); - close(file); } } } - -if(misc&PURGE_ECHOMAIL) { - -lputs("\r\n\r\nPurging EchoMail...\r\n"); - -for(g=0;g<total_grps;g++) -for(i=0;i<total_subs;i++) - if(sub[i]->misc&SUB_FIDO && sub[i]->grp==g) { - if(sub_code[0] && stricmp(sub_code,sub[i]->code)) - continue; - if(!sub[i]->echopath[0]) - sprintf(sub[i]->echopath,"%s%s\\",echomail_dir,sub[i]->code); - sprintf(str,"%s*.MSG",sub[i]->echopath); - last=findfirst(str,&ff,0); - while(!last) { - sprintf(str,"%s%s",sub[i]->echopath,ff.name); - if(startmsg!=2 || strcmp(ff.name,"1.MSG")) { - lprintf("\r\nDeleting %s",str); - remove(str); } - last=findnext(&ff); } } } - - -if(misc&(IMPORT_NETMAIL|IMPORT_ECHOMAIL) && misc&REPORT) { - sprintf(str,"%sSBBSFIDO.MSG",text_dir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - lprintf("Error opening %s\r\n",str); - exit(1); } - sprintf(fname,"\1c\1h " - "���������������������������������������������������\r\n"); - sprintf(path,"\1c\1h " - "���������������������������������������������������\r\n"); - write(file,fname,strlen(fname)); - sprintf(str," \1n\1k\0016" - " Last FidoNet Transfer on %.24s \1n\r\n",ctime(&start)); - write(file,str,strlen(str)); - write(file,path,strlen(path)); - write(file,fname,strlen(fname)); - sprintf(subj,"Imported %lu EchoMail and %lu NetMail Messages" - ,echomail,netmail); - sprintf(str," \1n\1k\0016 %-50.50s\1n\r\n",subj); - write(file,str,strlen(str)); - write(file,path,strlen(path)); - close(file); } - -return(0); -} - diff --git a/src/sbbs2/fido/smbdefs.h b/src/sbbs2/fido/smbdefs.h deleted file mode 100644 index 71791e6952..0000000000 --- a/src/sbbs2/fido/smbdefs.h +++ /dev/null @@ -1,449 +0,0 @@ -/* SMBDEFS.H */ - -#ifndef _SMBDEFS_H -#define _SMBDEFS_H - -/**********/ -/* Macros */ -/**********/ - -#define SMB_VERSION 0x0121 /* SMB format version */ - /* High byte major, low byte minor */ -#define SMBLIB_VERSION "1.21a" /* SMB library version */ - - /* Control characters */ -#define TAB 0x09 /* Horizontal tabulation ^I */ -#define LF 0x0a /* Line feed ^J */ -#define FF 0x0c /* Form feed ^L */ -#define CR 0x0d /* Carriage return ^M */ -#define ESC 0x1b /* Escape ^[ */ -#define SP 0x20 /* Space */ - -#define ulong unsigned long -#define ushort unsigned short -#define uchar unsigned char -#define uint unsigned int - -/****************************************************************************/ -/* Memory allocation macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) -# define HUGE16 huge -# define FAR16 far -# if defined(__TURBOC__) -# define REALLOC(x,y) farrealloc(x,y) -# define LMALLOC(x) farmalloc(x) -# define MALLOC(x) farmalloc(x) -# define LFREE(x) farfree(x) -# define FREE(x) farfree(x) -# elif defined(__WATCOMC__) -# define REALLOC realloc -# define LMALLOC(x) halloc(x,1) /* far heap, but slow */ -# define MALLOC malloc /* far heap, but 64k max */ -# define LFREE hfree -# define FREE free -# else /* Other 16-bit Compiler */ -# define REALLOC realloc -# define LMALLOC malloc -# define MALLOC malloc -# define LFREE free -# define FREE free -# endif -#else /* 32-bit Compiler or Small Memory Model */ -# define HUGE16 -# define FAR16 -# define REALLOC realloc -# define LMALLOC malloc -# define MALLOC malloc -# define LFREE free -# define FREE free -#endif - - -#define SDT_BLOCK_LEN 256 /* Size of data blocks */ -#define SHD_BLOCK_LEN 256 /* Size of header blocks */ - -#define SMB_SELFPACK 0 /* Self-packing storage allocation */ -#define SMB_FASTALLOC 1 /* Fast allocation */ -#define SMB_HYPERALLOC 2 /* No allocation */ - -#define SMB_EMAIL 1 /* User numbers stored in Indexes */ - - /* Time zone macros for when_t.zone */ -#define DAYLIGHT 0x8000 /* Daylight savings is active */ -#define US_ZONE 0x4000 /* U.S. time zone */ -#define WESTERN_ZONE 0x2000 /* Non-standard zone west of UT */ -#define EASTERN_ZONE 0x1000 /* Non-standard zone east of UT */ - - /* US Time Zones (standard) */ -#define AST 0x40F0 // Atlantic (-04:00) -#define EST 0x412C // Eastern (-05:00) -#define CST 0x4168 // Central (-06:00) -#define MST 0x41A4 // Mountain (-07:00) -#define PST 0x41E0 // Pacific (-08:00) -#define YST 0x421C // Yukon (-09:00) -#define HST 0x4258 // Hawaii/Alaska (-10:00) -#define BST 0x4294 // Bering (-11:00) - - /* US Time Zones (daylight) */ -#define ADT 0xC0F0 // Atlantic (-03:00) -#define EDT 0xC12C // Eastern (-04:00) -#define CDT 0xC168 // Central (-05:00) -#define MDT 0xC1A4 // Mountain (-06:00) -#define PDT 0xC1E0 // Pacific (-07:00) -#define YDT 0xC21C // Yukon (-08:00) -#define HDT 0xC258 // Hawaii/Alaska (-09:00) -#define BDT 0xC294 // Bering (-10:00) - - /* Non-standard Time Zones */ -#define MID 0x2294 // Midway (-11:00) -#define VAN 0x21E0 // Vancouver (-08:00) -#define EDM 0x21A4 // Edmonton (-07:00) -#define WIN 0x2168 // Winnipeg (-06:00) -#define BOG 0x212C // Bogota (-05:00) -#define CAR 0x20F0 // Caracas (-04:00) -#define RIO 0x20B4 // Rio de Janeiro (-03:00) -#define FER 0x2078 // Fernando de Noronha (-02:00) -#define AZO 0x203C // Azores (-01:00) -#define LON 0x1000 // London (+00:00) -#define BER 0x103C // Berlin (+01:00) -#define ATH 0x1078 // Athens (+02:00) -#define MOS 0x10B4 // Moscow (+03:00) -#define DUB 0x10F0 // Dubai (+04:00) -#define KAB 0x110E // Kabul (+04:30) -#define KAR 0x112C // Karachi (+05:00) -#define BOM 0x114A // Bombay (+05:30) -#define KAT 0x1159 // Kathmandu (+05:45) -#define DHA 0x1168 // Dhaka (+06:00) -#define BAN 0x11A4 // Bangkok (+07:00) -#define HON 0x11E0 // Hong Kong (+08:00) -#define TOK 0x121C // Tokyo (+09:00) -#define SYD 0x1258 // Sydney (+10:00) -#define NOU 0x1294 // Noumea (+11:00) -#define WEL 0x12D0 // Wellington (+12:00) - - /* Valid hfield_t.types */ -#define SENDER 0x00 -#define SENDERAGENT 0x01 -#define SENDERNETTYPE 0x02 -#define SENDERNETADDR 0x03 -#define SENDEREXT 0x04 -#define SENDERPOS 0x05 -#define SENDERORG 0x06 - -#define AUTHOR 0x10 -#define AUTHORAGENT 0x11 -#define AUTHORNETTYPE 0x12 -#define AUTHORNETADDR 0x13 -#define AUTHOREXT 0x14 -#define AUTHORPOS 0x15 -#define AUTHORORG 0x16 - -#define REPLYTO 0x20 -#define REPLYTOAGENT 0x21 -#define REPLYTONETTYPE 0x22 -#define REPLYTONETADDR 0x23 -#define REPLYTOEXT 0x24 -#define REPLYTOPOS 0x25 -#define REPLYTOORG 0x26 - -#define RECIPIENT 0x30 -#define RECIPIENTAGENT 0x31 -#define RECIPIENTNETTYPE 0x32 -#define RECIPIENTNETADDR 0x33 -#define RECIPIENTEXT 0x34 -#define RECIPIENTPOS 0x35 -#define RECIPIENTORG 0x36 - -#define FORWARDTO 0x40 -#define FORWARDTOAGENT 0x41 -#define FORWARDTONETTYPE 0x42 -#define FORWARDTONETADDR 0x43 -#define FORWARDTOEXT 0x44 -#define FORWARDTOPOS 0x45 -#define FORWARDTOORG 0x46 - -#define FORWARDED 0x48 - -#define RECEIVEDBY 0x50 -#define RECEIVEDBYAGENT 0x51 -#define RECEIVEDBYNETTYPE 0x52 -#define RECEIVEDBYNETADDR 0x53 -#define RECEIVEDBYEXT 0x54 -#define RECEIVEDBYPOS 0x55 -#define RECEIVEDBYORG 0x56 - -#define RECEIVED 0x58 - -#define SUBJECT 0x60 -#define SUMMARY 0x61 -#define COMMENT 0x62 -#define CARBONCOPY 0x63 -#define GROUP 0x64 -#define EXPIRATION 0x65 -#define PRIORITY 0x66 - -#define FILEATTACH 0x70 -#define DESTFILE 0x71 -#define FILEATTACHLIST 0x72 -#define DESTFILELIST 0x73 -#define FILEREQUEST 0x74 -#define FILEPASSWORD 0x75 -#define FILEREQUESTLIST 0x76 -#define FILEPASSWORDLIST 0x77 - -#define IMAGEATTACH 0x80 -#define ANIMATTACH 0x81 -#define FONTATTACH 0x82 -#define SOUNDATTACH 0x83 -#define PRESENTATTACH 0x84 -#define VIDEOATTACH 0x85 -#define APPDATAATTACH 0x86 - -#define IMAGETRIGGER 0x90 -#define ANIMTRIGGER 0x91 -#define FONTTRIGGER 0x92 -#define SOUNDTRIGGER 0x93 -#define PRESENTTRIGGER 0x94 -#define VIDEOTRIGGER 0x95 -#define APPDATATRIGGER 0x96 - -#define FIDOCTRL 0xa0 -#define FIDOAREA 0xa1 -#define FIDOSEENBY 0xa2 -#define FIDOPATH 0xa3 -#define FIDOMSGID 0xa4 -#define FIDOREPLYID 0xa5 -#define FIDOPID 0xa6 -#define FIDOFLAGS 0xa7 - -#define RFC822HEADER 0xb0 -#define RFC822MSGID 0xb1 -#define RFC822REPLYID 0xb2 - -#define UNKNOWN 0xf1 -#define UNKNOWNASCII 0xf2 -#define UNUSED 0xff - - /* Valid dfield_t.types */ -#define TEXT_BODY 0x00 -#define TEXT_SOUL 0x01 -#define TEXT_TAIL 0x02 -#define TEXT_WING 0x03 -#define IMAGEEMBED 0x20 -#define ANIMEMBED 0x21 -#define FONTEMBED 0x22 -#define SOUNDEMBED 0x23 -#define PRESENTEMBED 0x24 -#define VIDEOEMBED 0x25 -#define APPDATAEMBED 0x26 -#define UNUSED 0xff - - - /* Message attributes */ -#define MSG_PRIVATE (1<<0) -#define MSG_READ (1<<1) -#define MSG_PERMANENT (1<<2) -#define MSG_LOCKED (1<<3) -#define MSG_DELETE (1<<4) -#define MSG_ANONYMOUS (1<<5) -#define MSG_KILLREAD (1<<6) -#define MSG_MODERATED (1<<7) -#define MSG_VALIDATED (1<<8) - - /* Auxillary header attributes */ -#define MSG_FILEREQUEST (1<<0) // File request -#define MSG_FILEATTACH (1<<1) // File(s) attached to Msg -#define MSG_TRUNCFILE (1<<2) // Truncate file(s) when sent -#define MSG_KILLFILE (1<<3) // Delete file(s) when sent -#define MSG_RECEIPTREQ (1<<4) // Return receipt requested -#define MSG_CONFIRMREQ (1<<5) // Confirmation receipt requested -#define MSG_NODISP (1<<6) // Msg may not be displayed to user - - /* Message network attributes */ -#define MSG_LOCAL (1<<0) // Msg created locally -#define MSG_INTRANSIT (1<<1) // Msg is in-transit -#define MSG_SENT (1<<2) // Sent to remote -#define MSG_KILLSENT (1<<3) // Kill when sent -#define MSG_ARCHIVESENT (1<<4) // Archive when sent -#define MSG_HOLD (1<<5) // Hold for pick-up -#define MSG_CRASH (1<<6) // Crash -#define MSG_IMMEDIATE (1<<7) // Send Msg now, ignore restrictions -#define MSG_DIRECT (1<<8) // Send directly to destination -#define MSG_GATE (1<<9) // Send via gateway -#define MSG_ORPHAN (1<<10) // Unknown destination -#define MSG_FPU (1<<11) // Force pickup -#define MSG_TYPELOCAL (1<<12) // Msg is for local use only -#define MSG_TYPEECHO (1<<13) // Msg is for conference distribution -#define MSG_TYPENET (1<<14) // Msg is direct network mail - - -enum { - NET_NONE - ,NET_UNKNOWN - ,NET_FIDO - ,NET_POSTLINK - ,NET_QWK - ,NET_INTERNET - ,NET_WWIV - ,NET_MHS - -/* Add new ones here */ - - ,NET_TYPES - }; - -enum { - AGENT_PERSON - ,AGENT_PROCESS - -/* Add new ones here */ - - ,AGENT_TYPES - }; - -enum { - XLAT_NONE // No translation/End of translation list - ,XLAT_ENCRYPT // Encrypted data - ,XLAT_ESCAPED // 7-bit ASCII escaping for ctrl and 8-bit data - ,XLAT_HUFFMAN // Static and adaptive Huffman coding compression - ,XLAT_LZW // Limpel/Ziv/Welch compression - ,XLAT_MLZ78 // Modified LZ78 compression - ,XLAT_RLE // Run length encoding compression - ,XLAT_IMPLODE // Implode compression (PkZIP) - ,XLAT_SHRINK // Shrink compression (PkZIP) - ,XLAT_LZH // LHarc (LHA) Dynamic Huffman coding - -/* Add new ones here */ - - ,XLAT_TYPES - }; - - -/************/ -/* Typedefs */ -/************/ - -typedef struct { - - ulong time; // Local time (unix format) - short zone; // Time zone - - } when_t; - -typedef struct { - - ushort to; // 16-bit CRC of recipient name (lower case) - ushort from; // 16-bit CRC of sender name (lower case) - ushort subj; // 16-bit CRC of subject (lower case, w/o RE:) - ushort attr; // attributes (read, permanent, etc.) - ulong offset; // offset into header file - ulong number; // number of message (1 based) - ulong time; // time/date message was imported/posted - - } idxrec_t; - -typedef struct { - - uchar id[4]; // text or binary unique hdr ID - ushort version; // version number (initially 100h for 1.00) - ushort length; // length including this struct - - } smbhdr_t; - -typedef struct { - - ulong last_msg; // last message number - ulong total_msgs; // total messages - ulong header_offset; // byte offset to first header record - ulong max_crcs; // Maximum number of CRCs to keep in history - ulong max_msgs; // Maximum number of message to keep in sub - ushort max_age; // Maximum age of message to keep in sub (in days) - ushort attr; // Attributes for this message base (SMB_HYPER,etc) - - } smbstatus_t; - -typedef struct { - - uchar id[4]; // SHD<^Z> - ushort type; // Message type (normally 0) - ushort version; // Version of type (initially 100h for 1.00) - ushort length; // Total length of fixed record + all fields - ushort attr; // Attributes (bit field) (duped in SID) - ulong auxattr; // Auxillary attributes (bit field) - ulong netattr; // Network attributes - when_t when_written; // Time message was written (unix format) - when_t when_imported; // Time message was imported - ulong number; // Message number - ulong thread_orig; // Original message number in thread - ulong thread_next; // Next message in thread - ulong thread_first; // First reply to this message - uchar reserved[16]; // Reserved for future use - ulong offset; // Offset for buffer into data file (0 or mod 256) - ushort total_dfields; // Total number of data fields - - } msghdr_t; - -typedef struct { - - ushort type; // Type of data field - ulong offset; // Offset into buffer - ulong length; // Length of data field - - } dfield_t; - -typedef struct { - - ushort type; - ushort length; // Length of buffer - - } hfield_t; - -typedef struct { - - ushort zone; - ushort net; - ushort node; - ushort point; - - } fidoaddr_t; - -typedef struct { - - ushort type; - void *addr; - - } net_t; - -typedef struct { - - idxrec_t idx; // Index - msghdr_t hdr; // Header record (fixed portion) - uchar *to, // To name - *to_ext, // To extension - *from, // From name - *from_ext, // From extension - *replyto, // Reply-to name - *replyto_ext, // Reply-to extension */ - *subj; // Subject - ushort to_agent, // Type of agent message is to - from_agent, // Type of agent message is from - replyto_agent; // Type of agent replies should be sent to - net_t to_net, // Destination network type and address - from_net, // Origin network address - replyto_net; // Network type and address for replies - ushort total_hfields; // Total number of header fields - hfield_t *hfield; // Header fields (fixed length portion) - void **hfield_dat; // Header fields (variable length portion) - dfield_t *dfield; // Data fields (fixed length portion) - ulong offset; // Offset (number of records) into index - uchar forwarded; // Forwarded from agent to another - - } smbmsg_t; - -#endif /* Don't add anything after this #endif statement */ diff --git a/src/sbbs2/fido/smblib.c b/src/sbbs2/fido/smblib.c deleted file mode 100644 index e2d8a474b8..0000000000 --- a/src/sbbs2/fido/smblib.c +++ /dev/null @@ -1,1121 +0,0 @@ -/* SMBLIB.C */ - -#include "smblib.h" - -/****************************************************************************/ -/* Open a message base of name 'smb_file' */ -/* If retry_time is 0, fast open method (no compatibility/validity check) */ -/* Opens files for READing messages or updating message indices only */ -/****************************************************************************/ -int smb_open(int retry_time) -{ - int file; - char str[128]; - smbhdr_t hdr; - -shd_fp=sdt_fp=sid_fp=NULL; -sprintf(str,"%s.SHD",smb_file); -if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO,S_IWRITE|S_IREAD))==-1 - || (shd_fp=fdopen(file,"r+b"))==NULL) { - if(file!=-1) - close(file); - return(2); } - -if(retry_time && filelength(file)>=sizeof(smbhdr_t)) { - setvbuf(shd_fp,shd_buf,_IONBF,SHD_BLOCK_LEN); - if(smb_locksmbhdr(retry_time)) { - smb_close(); - return(-1); } - memset(&hdr,0,sizeof(smbhdr_t)); - fread(&hdr,sizeof(smbhdr_t),1,shd_fp); - if(memcmp(hdr.id,"SMB\x1a",4)) { - smb_close(); - return(-2); } - if(hdr.version<0x110) { /* Compatibility check */ - smb_close(); - return(-3); } - smb_unlocksmbhdr(); - rewind(shd_fp); } - -setvbuf(shd_fp,shd_buf,_IOFBF,SHD_BLOCK_LEN); - -sprintf(str,"%s.SDT",smb_file); -if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO,S_IWRITE|S_IREAD))==-1 - || (sdt_fp=fdopen(file,"r+b"))==NULL) { - if(file!=-1) - close(file); - smb_close(); - return(1); } -setvbuf(sdt_fp,NULL,_IOFBF,2*1024); - -sprintf(str,"%s.SID",smb_file); -if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO,S_IWRITE|S_IREAD))==-1 - || (sid_fp=fdopen(file,"r+b"))==NULL) { - if(file!=-1) - close(file); - smb_close(); - return(3); } -setvbuf(sid_fp,NULL,_IOFBF,2*1024); - -return(0); -} - -/****************************************************************************/ -/* Closes the currently open message base */ -/****************************************************************************/ -void smb_close(void) -{ -if(shd_fp!=NULL) { - smb_unlocksmbhdr(); /* In case it's been locked */ - fclose(shd_fp); } -if(sid_fp!=NULL) - fclose(sid_fp); -if(sdt_fp!=NULL) - fclose(sdt_fp); -sid_fp=shd_fp=sdt_fp=NULL; -} - -/****************************************************************************/ -/* Opens the data block allocation table message base 'smb_file' */ -/* Retrys for retry_time number of seconds */ -/* Return 0 on success, non-zero otherwise */ -/****************************************************************************/ -int smb_open_da(int retry_time) -{ - int file; - char str[128]; - long start; - -start=time(NULL); -sprintf(str,"%s.SDA",smb_file); -while(1) { - if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IWRITE|S_IREAD))!=-1) - break; - if(errno!=EACCES) - return(-1); - if(time(NULL)-start>=retry_time) - return(-2); } -if((sda_fp=fdopen(file,"r+b"))==NULL) - return(-3); -setvbuf(sda_fp,NULL,_IOFBF,2*1024); -return(0); -} - -/****************************************************************************/ -/* Opens the header block allocation table for message base 'smb_file' */ -/* Retrys for retry_time number of seconds */ -/* Return 0 on success, non-zero otherwise */ -/****************************************************************************/ -int smb_open_ha(int retry_time) -{ - int file; - char str[128]; - long start; - -start=time(NULL); -sprintf(str,"%s.SHA",smb_file); -while(1) { - if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IWRITE|S_IREAD))!=-1) - break; - if(errno!=EACCES) - return(-1); - if(time(NULL)-start>=retry_time) - return(-2); } -if((sha_fp=fdopen(file,"r+b"))==NULL) - return(-3); -setvbuf(sha_fp,NULL,_IOFBF,2*1024); -return(0); -} - -/****************************************************************************/ -/* If the parameter 'push' is non-zero, this function stores the currently */ -/* open message base to the "virtual" smb stack. Up to SMB_STACK_LEN */ -/* message bases may be stored (defined in SMBDEFS.H). */ -/* The parameter 'op' is the operation to perform on the stack. Either */ -/* SMB_STACK_PUSH, SMB_STACK_POP, or SMB_STACK_XCHNG */ -/* If the operation is SMB_STACK_POP, this function restores a message base */ -/* previously saved with a SMB_STACK_PUSH call to this same function. */ -/* If the operation is SMB_STACK_XCHNG, then the current message base is */ -/* exchanged with the message base on the top of the stack (most recently */ -/* pushed. */ -/* If the current message base is not open, the SMB_STACK_PUSH and */ -/* SMB_STACK_XCHNG operations do nothing */ -/* Returns 0 on success, non-zero if stack full. */ -/* If operation is SMB_STACK_POP or SMB_STACK_XCHNG, it always returns 0. */ -/****************************************************************************/ -int smb_stack(int op) -{ - static char stack_file[SMB_STACK_LEN][128]; - static FILE *stack_sdt[SMB_STACK_LEN], - *stack_shd[SMB_STACK_LEN], - *stack_sid[SMB_STACK_LEN], - *stack_sda[SMB_STACK_LEN], - *stack_sha[SMB_STACK_LEN]; - static int stack_idx; - char tmp_file[128]; - FILE *tmp_sdt, - *tmp_shd, - *tmp_sid, - *tmp_sda, - *tmp_sha; - -if(op==SMB_STACK_PUSH) { - if(stack_idx>=SMB_STACK_LEN) - return(1); - if(shd_fp==NULL || sdt_fp==NULL || sid_fp==NULL) /* Msg base not open */ - return(0); - memcpy(stack_file[stack_idx],smb_file,128); - stack_sdt[stack_idx]=sdt_fp; - stack_shd[stack_idx]=shd_fp; - stack_sid[stack_idx]=sid_fp; - stack_sda[stack_idx]=sda_fp; - stack_sha[stack_idx]=sha_fp; - stack_idx++; - return(0); } -/* pop or xchng */ -if(!stack_idx) /* Nothing on the stack, so do nothing */ - return(0); -if(op==SMB_STACK_XCHNG) { - if(!shd_fp) - return(0); - memcpy(tmp_file,smb_file,128); - tmp_sdt=sdt_fp; - tmp_shd=shd_fp; - tmp_sid=sid_fp; - tmp_sda=sda_fp; - tmp_sha=sha_fp; } - -stack_idx--; -memcpy(smb_file,stack_file[stack_idx],128); -sdt_fp=stack_sdt[stack_idx]; -shd_fp=stack_shd[stack_idx]; -sid_fp=stack_sid[stack_idx]; -sda_fp=stack_sda[stack_idx]; -sha_fp=stack_sha[stack_idx]; -if(op==SMB_STACK_XCHNG) { - stack_idx++; - memcpy(stack_file[stack_idx-1],tmp_file,128); - stack_sdt[stack_idx-1]=tmp_sdt; - stack_shd[stack_idx-1]=tmp_shd; - stack_sid[stack_idx-1]=tmp_sid; - stack_sda[stack_idx-1]=tmp_sda; - stack_sha[stack_idx-1]=tmp_sha; } -return(0); -} - -/****************************************************************************/ -/* Truncates header file */ -/* Retrys for retry_time number of seconds */ -/* Return 0 on success, non-zero otherwise */ -/****************************************************************************/ -int smb_trunchdr(int retry_time) -{ - long start; - -start=time(NULL); -rewind(shd_fp); -while(1) { - if(!chsize(fileno(shd_fp),0L)) - break; - if(errno!=EACCES) - return(-1); - if(time(NULL)-start>=retry_time) /* Time-out */ - return(-2); } -return(0); -} - -/*********************************/ -/* Message Base Header Functions */ -/*********************************/ - -/****************************************************************************/ -/* Attempts for retry_time number of seconds to lock the message base hdr */ -/****************************************************************************/ -int smb_locksmbhdr(int retry_time) -{ - ulong start; - -start=time(NULL); -while(1) { - if(!lock(fileno(shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t))) - return(0); - if(time(NULL)-start>=retry_time) - break; /* Incase we've already locked it */ - unlock(fileno(shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t)); } -return(-1); -} - -/****************************************************************************/ -/* Read the SMB header from the header file and place into "status" */ -/****************************************************************************/ -int smb_getstatus(smbstatus_t *status) -{ - char str[128]; - int i; - -setvbuf(shd_fp,shd_buf,_IONBF,SHD_BLOCK_LEN); -clearerr(shd_fp); -fseek(shd_fp,sizeof(smbhdr_t),SEEK_SET); -i=fread(status,1,sizeof(smbstatus_t),shd_fp); -setvbuf(shd_fp,shd_buf,_IOFBF,SHD_BLOCK_LEN); -if(i==sizeof(smbstatus_t)) - return(0); -return(1); -} - -/****************************************************************************/ -/* Writes message base header */ -/****************************************************************************/ -int smb_putstatus(smbstatus_t status) -{ - int i; - -clearerr(shd_fp); -fseek(shd_fp,sizeof(smbhdr_t),SEEK_SET); -i=fwrite(&status,1,sizeof(smbstatus_t),shd_fp); -fflush(shd_fp); -if(i==sizeof(smbstatus_t)) - return(0); -return(1); -} - -/****************************************************************************/ -/* Unlocks previously locks message base header */ -/****************************************************************************/ -int smb_unlocksmbhdr() -{ -return(unlock(fileno(shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t))); -} - -/********************************/ -/* Individual Message Functions */ -/********************************/ - -/****************************************************************************/ -/* Attempts for retry_time number of seconds to lock the header for 'msg' */ -/****************************************************************************/ -int smb_lockmsghdr(smbmsg_t msg, int retry_time) -{ - ulong start; - -start=time(NULL); -while(1) { - if(!lock(fileno(shd_fp),msg.idx.offset,sizeof(msghdr_t))) - return(0); - if(time(NULL)-start>=retry_time) - break; - unlock(fileno(shd_fp),msg.idx.offset,sizeof(msghdr_t)); } -return(-1); -} - -/****************************************************************************/ -/* Fills msg->idx with message index based on msg->hdr.number */ -/* OR if msg->hdr.number is 0, based on msg->offset (record offset). */ -/* if msg.hdr.number does not equal 0, then msg->offset is filled too. */ -/* Either msg->hdr.number or msg->offset must be initialized before */ -/* calling this function */ -/* Returns 1 if message number wasn't found, 0 if it was */ -/****************************************************************************/ -int smb_getmsgidx(smbmsg_t *msg) -{ - idxrec_t idx; - ulong l,length,total,bot,top; - -clearerr(sid_fp); -if(!msg->hdr.number) { - fseek(sid_fp,msg->offset*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg->idx,sizeof(idxrec_t),1,sid_fp)) - return(1); - return(0); } - -length=filelength(fileno(sid_fp)); -if(!length) - return(1); -total=length/sizeof(idxrec_t); -if(!total) - return(1); - -bot=0; -top=total; -l=total/2; /* Start at middle index */ -while(1) { - fseek(sid_fp,l*sizeof(idxrec_t),SEEK_SET); - if(!fread(&idx,sizeof(idxrec_t),1,sid_fp)) - return(1); - if(bot==top-1 && idx.number!=msg->hdr.number) - return(1); - if(idx.number>msg->hdr.number) { - top=l; - l=bot+((top-bot)/2); - continue; } - if(idx.number<msg->hdr.number) { - bot=l; - l=top-((top-bot)/2); - continue; } - break; } -msg->idx=idx; -msg->offset=l; -return(0); -} - -/****************************************************************************/ -/* Reads the last index record in the open message base */ -/****************************************************************************/ -int smb_getlastidx(idxrec_t *idx) -{ - long length; - -clearerr(sid_fp); -length=filelength(fileno(sid_fp)); -if(length<sizeof(idxrec_t)) - return(-1); -fseek(sid_fp,length-sizeof(idxrec_t),SEEK_SET); -if(!fread(idx,sizeof(idxrec_t),1,sid_fp)) - return(-2); -return(0); -} - -/****************************************************************************/ -/* Figures out the total length of the header record for 'msg' */ -/* Returns length */ -/****************************************************************************/ -uint smb_getmsghdrlen(smbmsg_t msg) -{ - int i; - -/* fixed portion */ -msg.hdr.length=sizeof(msghdr_t); -/* data fields */ -msg.hdr.length+=msg.hdr.total_dfields*sizeof(dfield_t); -/* header fields */ -for(i=0;i<msg.total_hfields;i++) { - msg.hdr.length+=sizeof(hfield_t); - msg.hdr.length+=msg.hfield[i].length; } -return(msg.hdr.length); -} - -/****************************************************************************/ -/* Figures out the total length of the data buffer for 'msg' */ -/* Returns length */ -/****************************************************************************/ -ulong smb_getmsgdatlen(smbmsg_t msg) -{ - int i; - ulong length=0L; - -for(i=0;i<msg.hdr.total_dfields;i++) - length+=msg.dfield[i].length; -return(length); -} - -/****************************************************************************/ -/* Read header information into 'msg' structure */ -/* msg->idx.offset must be set before calling this function */ -/* Must call smb_freemsgmem() to free memory allocated for var len strs */ -/* Returns 0 on success, non-zero if error */ -/****************************************************************************/ -int smb_getmsghdr(smbmsg_t *msg) -{ - ushort i; - ulong l,offset; - idxrec_t idx; - -rewind(shd_fp); -fseek(shd_fp,msg->idx.offset,SEEK_SET); -idx=msg->idx; -offset=msg->offset; -memset(msg,0,sizeof(smbmsg_t)); -msg->idx=idx; -msg->offset=offset; -if(!fread(&msg->hdr,sizeof(msghdr_t),1,shd_fp)) - return(-1); -if(memcmp(msg->hdr.id,"SHD\x1a",4)) - return(-2); -if(msg->hdr.version<0x110) - return(-9); -l=sizeof(msghdr_t); -if(msg->hdr.total_dfields && (msg->dfield - =(dfield_t *)MALLOC(sizeof(dfield_t)*msg->hdr.total_dfields))==NULL) { - smb_freemsgmem(*msg); - return(-3); } -i=0; -while(i<msg->hdr.total_dfields && l<msg->hdr.length) { - if(!fread(&msg->dfield[i],sizeof(dfield_t),1,shd_fp)) { - smb_freemsgmem(*msg); - return(-4); } - i++; - l+=sizeof(dfield_t); } -if(i<msg->hdr.total_dfields) { - smb_freemsgmem(*msg); - return(-8); } - -while(l<msg->hdr.length) { - i=msg->total_hfields; - if((msg->hfield_dat=(void **)REALLOC(msg->hfield_dat,sizeof(void *)*(i+1))) - ==NULL) { - smb_freemsgmem(*msg); - return(-3); } - if((msg->hfield=(hfield_t *)REALLOC(msg->hfield - ,sizeof(hfield_t)*(i+1)))==NULL) { - smb_freemsgmem(*msg); - return(-3); } - msg->total_hfields++; - if(!fread(&msg->hfield[i],sizeof(hfield_t),1,shd_fp)) { - smb_freemsgmem(*msg); - return(-5); } - l+=sizeof(hfield_t); - if((msg->hfield_dat[i]=(char *)MALLOC(msg->hfield[i].length+1)) - ==NULL) { /* Allocate 1 extra for NULL terminator */ - smb_freemsgmem(*msg); /* or 0 length field */ - return(-3); } - memset(msg->hfield_dat[i],0,msg->hfield[i].length+1); /* init to NULL */ - if(msg->hfield[i].length - && !fread(msg->hfield_dat[i],msg->hfield[i].length,1,shd_fp)) { - smb_freemsgmem(*msg); - return(-6); } - - switch(msg->hfield[i].type) { /* convenience variables */ - case SENDER: - if(!msg->from) { - msg->from=msg->hfield_dat[i]; - break; } - case FORWARDED: /* fall through */ - msg->forwarded=1; - break; - case SENDERAGENT: - if(!msg->forwarded) - msg->from_agent=*(ushort *)msg->hfield_dat[i]; - break; - case SENDEREXT: - if(!msg->forwarded) - msg->from_ext=msg->hfield_dat[i]; - break; - case SENDERNETTYPE: - if(!msg->forwarded) - msg->from_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case SENDERNETADDR: - if(!msg->forwarded) - msg->from_net.addr=msg->hfield_dat[i]; - break; - case REPLYTO: - msg->replyto=msg->hfield_dat[i]; - break; - case REPLYTOEXT: - msg->replyto_ext=msg->hfield_dat[i]; - break; - case REPLYTOAGENT: - msg->replyto_agent=*(ushort *)msg->hfield_dat[i]; - break; - case REPLYTONETTYPE: - msg->replyto_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case REPLYTONETADDR: - msg->replyto_net.addr=msg->hfield_dat[i]; - break; - case RECIPIENT: - msg->to=msg->hfield_dat[i]; - break; - case RECIPIENTEXT: - msg->to_ext=msg->hfield_dat[i]; - break; - case RECIPIENTAGENT: - msg->to_agent=*(ushort *)msg->hfield_dat[i]; - break; - case RECIPIENTNETTYPE: - msg->to_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case RECIPIENTNETADDR: - msg->to_net.addr=msg->hfield_dat[i]; - break; - case SUBJECT: - msg->subj=msg->hfield_dat[i]; - break; } - l+=msg->hfield[i].length; } - -if(!msg->from || !msg->to || !msg->subj) { - smb_freemsgmem(*msg); - return(-7); } -return(0); -} - -/****************************************************************************/ -/* Frees memory allocated for 'msg' */ -/****************************************************************************/ -void smb_freemsgmem(smbmsg_t msg) -{ - ushort i; - -if(msg.dfield) - FREE(msg.dfield); -for(i=0;i<msg.total_hfields;i++) - if(msg.hfield_dat[i]) - FREE(msg.hfield_dat[i]); -if(msg.hfield) - FREE(msg.hfield); -if(msg.hfield_dat) - FREE(msg.hfield_dat); -} - -/****************************************************************************/ -/* Unlocks header for 'msg' */ -/****************************************************************************/ -int smb_unlockmsghdr(smbmsg_t msg) -{ -return(unlock(fileno(shd_fp),msg.idx.offset,sizeof(msghdr_t))); -} - - -/****************************************************************************/ -/* Adds a header field to the 'msg' structure (in memory only) */ -/****************************************************************************/ -int smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data) -{ - int i; - -i=msg->total_hfields; -if((msg->hfield=(hfield_t *)REALLOC(msg->hfield,sizeof(hfield_t)*(i+1))) - ==NULL) - return(1); -if((msg->hfield_dat=(void **)REALLOC(msg->hfield_dat,sizeof(void *)*(i+1))) - ==NULL) - return(2); -msg->total_hfields++; -msg->hfield[i].type=type; -msg->hfield[i].length=length; -if(length) { - if((msg->hfield_dat[i]=(void *)MALLOC(length))==NULL) - return(4); - memcpy(msg->hfield_dat[i],data,length); } -else - msg->hfield_dat[i]=NULL; -return(0); -} - -/****************************************************************************/ -/* Adds a data field to the 'msg' structure (in memory only) */ -/* Automatically figures out the offset into the data buffer from existing */ -/* dfield lengths */ -/****************************************************************************/ -int smb_dfield(smbmsg_t *msg, ushort type, ulong length) -{ - int i,j; - -i=msg->hdr.total_dfields; -if((msg->dfield=(dfield_t *)REALLOC(msg->dfield,sizeof(dfield_t)*(i+1))) - ==NULL) - return(1); -msg->hdr.total_dfields++; -msg->dfield[i].type=type; -msg->dfield[i].length=length; -for(j=msg->dfield[i].offset=0;j<i;j++) - msg->dfield[i].offset+=msg->dfield[j].length; -return(0); -} - -/****************************************************************************/ -/* Checks CRC history file for duplicate crc. If found, returns 1. */ -/* If no dupe, adds to CRC history and returns 0, or negative if error. */ -/****************************************************************************/ -int smb_addcrc(ulong max_crcs, ulong crc, int retry_time) -{ - char str[128]; - int file; - long length; - ulong l,*buf; - time_t start; - -if(!max_crcs) - return(0); -start=time(NULL); -sprintf(str,"%s.SCH",smb_file); -while(1) { - if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IWRITE|S_IREAD))!=-1) - break; - if(errno!=EACCES) - return(-1); - if(time(NULL)-start>=retry_time) - return(-2); } -length=filelength(file); -if(length<0L) { - close(file); - return(-4); } -if((buf=(ulong *)MALLOC(max_crcs*4))==NULL) { - close(file); - return(-3); } -if(length>=max_crcs*4) { /* Reached or exceeds max crcs */ - read(file,buf,max_crcs*4); - for(l=0;l<max_crcs;l++) - if(crc==buf[l]) - break; - if(l<max_crcs) { /* Dupe CRC found */ - close(file); - FREE(buf); - return(1); } - chsize(file,0L); /* truncate it */ - lseek(file,0L,SEEK_SET); - write(file,buf+4,(max_crcs-1)*4); } - -else if(length/4) { /* Less than max crcs */ - read(file,buf,length); - for(l=0;l<length/4;l++) - if(crc==buf[l]) - break; - if(l<length/4) { /* Dupe CRC found */ - close(file); - FREE(buf); - return(1); } } - -lseek(file,0L,SEEK_END); -write(file,&crc,4); /* Write to the end */ -FREE(buf); -close(file); -return(0); -} - - -/****************************************************************************/ -/* Creates a new message header record in the header file. */ -/* If storage is SMB_SELFPACK, self-packing conservative allocation is used */ -/* If storage is SMB_FASTALLOC, fast allocation is used */ -/* If storage is SMB_HYPERALLOC, no allocation tables are used (fastest) */ -/****************************************************************************/ -int smb_addmsghdr(smbmsg_t *msg, smbstatus_t *status, int storage - ,int retry_time) -{ - int i; - long l; - -if(smb_locksmbhdr(retry_time)) - return(1); -if(smb_getstatus(status)) - return(2); - -if(storage!=SMB_HYPERALLOC && (i=smb_open_ha(retry_time))!=0) - return(i); - -msg->hdr.length=smb_getmsghdrlen(*msg); -if(storage==SMB_HYPERALLOC) - l=smb_hallochdr(status->header_offset); -else if(storage==SMB_FASTALLOC) - l=smb_fallochdr(msg->hdr.length); -else - l=smb_allochdr(msg->hdr.length); -if(l==-1L) { - smb_unlocksmbhdr(); - fclose(sha_fp); - return(-1); } - -status->last_msg++; -msg->idx.number=msg->hdr.number=status->last_msg; -msg->idx.offset=status->header_offset+l; -msg->idx.time=msg->hdr.when_imported.time; -msg->idx.attr=msg->hdr.attr; -msg->offset=status->total_msgs; -status->total_msgs++; -smb_putstatus(*status); - -if(storage!=SMB_HYPERALLOC) - fclose(sha_fp); -i=smb_putmsg(*msg); -smb_unlocksmbhdr(); -return(i); -} - -/****************************************************************************/ -/* Writes both header and index information for msg 'msg' */ -/****************************************************************************/ -int smb_putmsg(smbmsg_t msg) -{ - int i; - -i=smb_putmsghdr(msg); -if(i) - return(i); -return(smb_putmsgidx(msg)); -} - -/****************************************************************************/ -/* Writes index information for 'msg' */ -/* msg.idx */ -/* and msg.offset must be set prior to calling to this function */ -/* Returns 0 if everything ok */ -/****************************************************************************/ -int smb_putmsgidx(smbmsg_t msg) -{ - -clearerr(sid_fp); -fseek(sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET); -if(!fwrite(&msg.idx,sizeof(idxrec_t),1,sid_fp)) - return(1); -fflush(sid_fp); -return(0); -} - -/****************************************************************************/ -/* Writes header information for 'msg' */ -/* msg.hdr.length */ -/* msg.idx.offset */ -/* and msg.offset must be set prior to calling to this function */ -/* Returns 0 if everything ok */ -/****************************************************************************/ -int smb_putmsghdr(smbmsg_t msg) -{ - ushort i; - ulong l; - -clearerr(shd_fp); -if(fseek(shd_fp,msg.idx.offset,SEEK_SET)) - return(-1); - -/************************************************/ -/* Write the fixed portion of the header record */ -/************************************************/ -if(!fwrite(&msg.hdr,sizeof(msghdr_t),1,shd_fp)) - return(-2); - -/************************************************/ -/* Write the data fields (each is fixed length) */ -/************************************************/ -for(i=0;i<msg.hdr.total_dfields;i++) - if(!fwrite(&msg.dfield[i],sizeof(dfield_t),1,shd_fp)) - return(-3); - -/*******************************************/ -/* Write the variable length header fields */ -/*******************************************/ -for(i=0;i<msg.total_hfields;i++) { - if(!fwrite(&msg.hfield[i],sizeof(hfield_t),1,shd_fp)) - return(-4); - if(msg.hfield[i].length /* more then 0 bytes long */ - && !fwrite(msg.hfield_dat[i],msg.hfield[i].length,1,shd_fp)) - return(-5); } - -l=smb_getmsghdrlen(msg); -while(l%SHD_BLOCK_LEN) { - if(fputc(0,shd_fp)==EOF) - return(-6); /* pad block with NULL */ - l++; } -fflush(shd_fp); -return(0); -} - -/****************************************************************************/ -/* Creates a sub-board's initial header file */ -/* Truncates and deletes other associated SMB files */ -/****************************************************************************/ -int smb_create(ulong max_crcs, ulong max_msgs, ushort max_age, ushort attr - ,int retry_time) -{ - char str[128]; - smbhdr_t hdr; - smbstatus_t status; - -if(filelength(fileno(shd_fp))>=sizeof(smbhdr_t)+sizeof(smbstatus_t) - && smb_locksmbhdr(retry_time)) /* header exists, so lock it */ - return(1); -memset(&hdr,0,sizeof(smbhdr_t)); -memset(&status,0,sizeof(smbstatus_t)); -memcpy(hdr.id,"SMB\x1a",4); /* <S> <M> <B> <^Z> */ -hdr.version=SMB_VERSION; -hdr.length=sizeof(smbhdr_t)+sizeof(smbstatus_t); -status.last_msg=status.total_msgs=0; -status.header_offset=sizeof(smbhdr_t)+sizeof(smbstatus_t); -status.max_crcs=max_crcs; -status.max_msgs=max_msgs; -status.max_age=max_age; -status.attr=attr; -rewind(shd_fp); -fwrite(&hdr,1,sizeof(smbhdr_t),shd_fp); -fwrite(&status,1,sizeof(smbstatus_t),shd_fp); -rewind(shd_fp); -chsize(fileno(shd_fp),sizeof(smbhdr_t)+sizeof(smbstatus_t)); -fflush(shd_fp); - -rewind(sdt_fp); -chsize(fileno(sdt_fp),0L); -rewind(sid_fp); -chsize(fileno(sid_fp),0L); - -sprintf(str,"%s.SDA",smb_file); -remove(str); /* if it exists, delete it */ -sprintf(str,"%s.SHA",smb_file); -remove(str); /* if it exists, delete it */ -sprintf(str,"%s.SCH",smb_file); -remove(str); -smb_unlocksmbhdr(); -return(0); -} - -/****************************************************************************/ -/* Returns number of data blocks required to store "length" amount of data */ -/****************************************************************************/ -ulong smb_datblocks(ulong length) -{ - ulong blocks; - -blocks=length/SDT_BLOCK_LEN; -if(length%SDT_BLOCK_LEN) - blocks++; -return(blocks); -} - -/****************************************************************************/ -/* Returns number of header blocks required to store "length" size header */ -/****************************************************************************/ -ulong smb_hdrblocks(ulong length) -{ - ulong blocks; - -blocks=length/SHD_BLOCK_LEN; -if(length%SHD_BLOCK_LEN) - blocks++; -return(blocks); -} - -/****************************************************************************/ -/* Finds unused space in data file based on block allocation table and */ -/* marks space as used in allocation table. */ -/* File must be opened read/write DENY ALL */ -/* Returns offset to beginning of data (in bytes, not blocks) */ -/* Assumes smb_open_da() has been called */ -/* fclose(sda_fp) should be called after */ -/* Returns negative on error */ -/****************************************************************************/ -long smb_allocdat(ulong length, ushort headers) -{ - ushort i,j; - ulong l,blocks,offset=0L; - -blocks=smb_datblocks(length); -j=0; /* j is consecutive unused block counter */ -fflush(sda_fp); -rewind(sda_fp); -while(!feof(sda_fp)) { - if(!fread(&i,2,1,sda_fp)) - break; - offset+=SDT_BLOCK_LEN; - if(!i) j++; - else j=0; - if(j==blocks) { - offset-=(blocks*SDT_BLOCK_LEN); - break; } } -clearerr(sda_fp); -fseek(sda_fp,(offset/SDT_BLOCK_LEN)*2L,SEEK_SET); -for(l=0;l<blocks;l++) - if(!fwrite(&headers,2,1,sda_fp)) - return(-1); -fflush(sda_fp); -return(offset); -} - -/****************************************************************************/ -/* Allocates space for data, but doesn't search for unused blocks */ -/* Returns negative on error */ -/****************************************************************************/ -long smb_fallocdat(ulong length, ushort headers) -{ - ulong l,blocks,offset; - -fflush(sda_fp); -clearerr(sda_fp); -blocks=smb_datblocks(length); -fseek(sda_fp,0L,SEEK_END); -offset=(ftell(sda_fp)/2L)*SDT_BLOCK_LEN; -for(l=0;l<blocks;l++) - if(!fwrite(&headers,2,1,sda_fp)) - break; -fflush(sda_fp); -if(l<blocks) - return(-1L); -return(offset); -} - -/****************************************************************************/ -/* De-allocates space for data */ -/* Returns non-zero on error */ -/****************************************************************************/ -int smb_freemsgdat(ulong offset, ulong length, ushort headers) -{ - ushort i; - ulong l,blocks; - -blocks=smb_datblocks(length); - -clearerr(sda_fp); -for(l=0;l<blocks;l++) { - if(fseek(sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET)) - return(1); - if(!fread(&i,2,1,sda_fp)) - return(2); - if(headers>i) - i=0; /* don't want to go negative */ - else - i-=headers; - if(fseek(sda_fp,-2L,SEEK_CUR)) - return(3); - if(!fwrite(&i,2,1,sda_fp)) - return(4); } -fflush(sda_fp); -return(0); -} - -/****************************************************************************/ -/* Adds to data allocation records for blocks starting at 'offset' */ -/* Returns non-zero on error */ -/****************************************************************************/ -int smb_incdat(ulong offset, ulong length, ushort headers) -{ - ushort i; - ulong l,blocks; - -clearerr(sda_fp); -blocks=smb_datblocks(length); -for(l=0;l<blocks;l++) { - fseek(sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET); - if(!fread(&i,2,1,sda_fp)) - return(1); - i+=headers; - fseek(sda_fp,-2L,SEEK_CUR); - if(!fwrite(&i,2,1,sda_fp)) - return(2); } -fflush(sda_fp); -return(0); -} - -/****************************************************************************/ -/* De-allocates blocks for header record */ -/* Returns non-zero on error */ -/****************************************************************************/ -int smb_freemsghdr(ulong offset, ulong length) -{ - uchar c=0; - ulong l,blocks; - -clearerr(sha_fp); -blocks=smb_hdrblocks(length); -fseek(sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET); -for(l=0;l<blocks;l++) - if(!fwrite(&c,1,1,sha_fp)) - return(1); -fflush(sha_fp); -return(0); -} - -/****************************************************************************/ -/* Frees all allocated header and data blocks for 'msg' */ -/****************************************************************************/ -int smb_freemsg(smbmsg_t msg, smbstatus_t status) -{ - int i; - ushort x; - -if(status.attr&SMB_HYPERALLOC) /* Nothing to do */ - return(0); - -for(x=0;x<msg.hdr.total_dfields;x++) { - if((i=smb_freemsgdat(msg.hdr.offset+msg.dfield[x].offset - ,msg.dfield[x].length,1))!=0) - return(i); } -return(smb_freemsghdr(msg.idx.offset-status.header_offset,msg.hdr.length)); -} - -/****************************************************************************/ -/* Finds unused space in header file based on block allocation table and */ -/* marks space as used in allocation table. */ -/* File must be opened read/write DENY ALL */ -/* Returns offset to beginning of header (in bytes, not blocks) */ -/* Assumes smb_open_ha() has been called */ -/* fclose(sha_fp) should be called after */ -/* Returns -1L on error */ -/****************************************************************************/ -long smb_allochdr(ulong length) -{ - uchar c; - ushort i; - ulong l,blocks,offset=0; - -blocks=smb_hdrblocks(length); -i=0; /* i is consecutive unused block counter */ -fflush(sha_fp); -rewind(sha_fp); -while(!feof(sha_fp)) { - if(!fread(&c,1,1,sha_fp)) - break; - offset+=SHD_BLOCK_LEN; - if(!c) i++; - else i=0; - if(i==blocks) { - offset-=(blocks*SHD_BLOCK_LEN); - break; } } -clearerr(sha_fp); -fseek(sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET); -c=1; -for(l=0;l<blocks;l++) - if(!fwrite(&c,1,1,sha_fp)) - return(-1L); -fflush(sha_fp); -return(offset); -} - -/****************************************************************************/ -/* Allocates space for index, but doesn't search for unused blocks */ -/* Returns -1L on error */ -/****************************************************************************/ -long smb_fallochdr(ulong length) -{ - uchar c=1; - ulong l,blocks,offset; - -blocks=smb_hdrblocks(length); -fflush(sha_fp); -clearerr(sha_fp); -fseek(sha_fp,0L,SEEK_END); -offset=ftell(sha_fp)*SHD_BLOCK_LEN; -for(l=0;l<blocks;l++) - if(!fwrite(&c,1,1,sha_fp)) - return(-1L); -fflush(sha_fp); -return(offset); -} - -/************************************************************************/ -/* Allocate header blocks using Hyper Allocation */ -/* this function should be most likely not be called from anywhere but */ -/* smb_addmsghdr() */ -/************************************************************************/ -long smb_hallochdr(ulong header_offset) -{ - long l; - -fflush(shd_fp); -fseek(shd_fp,0L,SEEK_END); -l=ftell(shd_fp); -if(l<header_offset) /* Header file truncated?!? */ - return(header_offset); -while((l-header_offset)%SHD_BLOCK_LEN) /* Make sure even block boundry */ - l++; -return(l-header_offset); -} - -/************************************************************************/ -/* Allocate data blocks using Hyper Allocation */ -/* smb_locksmbhdr() should be called before this function and not */ -/* unlocked until all data fields for this message have been written */ -/* to the SDT file */ -/************************************************************************/ -long smb_hallocdat() -{ - long l; - -fflush(sdt_fp); -fseek(sdt_fp,0L,SEEK_END); -l=ftell(sdt_fp); -if(l<=0) - return(l); -while(l%SDT_BLOCK_LEN) /* Make sure even block boundry */ - l++; -return(l); -} - -/* End of SMBLIB.C */ diff --git a/src/sbbs2/fido/smblib.h b/src/sbbs2/fido/smblib.h deleted file mode 100644 index b682f74f03..0000000000 --- a/src/sbbs2/fido/smblib.h +++ /dev/null @@ -1,80 +0,0 @@ -/* SMBLIB.H */ - -#ifndef _SMBLIB_H -#define _SMBLIB_H - -#if defined(__WATCOMC__) || defined(__TURBOC__) -# include <io.h> -# include <mem.h> -# include <share.h> -#else -# include <memory.h> -#endif - -#ifdef __WATCOMC__ -# include <dos.h> -#elif defined(__TURBOC__) -# include <dir.h> -#endif - -#include <malloc.h> -#include <time.h> -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <sys/types.h> - -#define GLOBAL extern /* turn smbvars.c files into header */ - -#include "smbvars.c" - -#define SMB_STACK_LEN 4 /* Max msg bases in smb_stack() */ -#define SMB_STACK_POP 0 /* Pop a msg base off of smb_stack() */ -#define SMB_STACK_PUSH 1 /* Push a msg base onto smb_stack() */ -#define SMB_STACK_XCHNG 2 /* Exchange msg base w/last pushed */ - -int smb_open(int retry_time); -void smb_close(void); -int smb_open_da(int retry_time); -int smb_open_ha(int retry_time); -int smb_create(ulong max_crcs, ulong max_msgs, ushort max_age, ushort attr - ,int retry_time); -int smb_stack(int op); -int smb_trunchdr(int retry_time); -int smb_locksmbhdr(int retry_time); -int smb_getstatus(smbstatus_t *status); -int smb_putstatus(smbstatus_t status); -int smb_unlocksmbhdr(void); -int smb_getmsgidx(smbmsg_t *msg); -int smb_getlastidx(idxrec_t *idx); -uint smb_getmsghdrlen(smbmsg_t msg); -ulong smb_getmsgdatlen(smbmsg_t msg); -int smb_lockmsghdr(smbmsg_t msg, int retry_time); -int smb_getmsghdr(smbmsg_t *msg); -int smb_unlockmsghdr(smbmsg_t msg); -int smb_addcrc(ulong max_crcs, ulong crc, int retry_time); -int smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data); -int smb_dfield(smbmsg_t *msg, ushort type, ulong length); -int smb_addmsghdr(smbmsg_t *msg, smbstatus_t *status, int storage - ,int retry_time); -int smb_putmsg(smbmsg_t msg); -int smb_putmsgidx(smbmsg_t msg); -int smb_putmsghdr(smbmsg_t msg); -void smb_freemsgmem(smbmsg_t msg); -ulong smb_hdrblocks(ulong length); -ulong smb_datblocks(ulong length); -long smb_allochdr(ulong length); -long smb_fallochdr(ulong length); -long smb_hallochdr(ulong header_offset); -long smb_allocdat(ulong length, ushort headers); -long smb_fallocdat(ulong length, ushort headers); -long smb_hallocdat(void); -int smb_incdat(ulong offset, ulong length, ushort headers); -int smb_freemsg(smbmsg_t msg, smbstatus_t status); -int smb_freemsgdat(ulong offset, ulong length, ushort headers); -int smb_freemsghdr(ulong offset, ulong length); - -#endif /* Don't add anything after this #endif statement */ diff --git a/src/sbbs2/fido/smbvars.c b/src/sbbs2/fido/smbvars.c deleted file mode 100644 index 9b80d699e6..0000000000 --- a/src/sbbs2/fido/smbvars.c +++ /dev/null @@ -1,22 +0,0 @@ -/* SMBVARS.C */ - -/*************************************************************************/ -/* Global variables for SMBLIB. Same file used for both header and code. */ -/*************************************************************************/ - -#ifndef GLOBAL -#define GLOBAL -#endif - -#include "smbdefs.h" -#include <stdio.h> - -GLOBAL char smb_file[128]; /* path and filename for SMB file (no ext) */ -GLOBAL char shd_buf[SHD_BLOCK_LEN]; -GLOBAL FILE *sdt_fp; -GLOBAL FILE *shd_fp; -GLOBAL FILE *sid_fp; -GLOBAL FILE *sda_fp; -GLOBAL FILE *sha_fp; -GLOBAL FILE *sch_fp; - diff --git a/src/sbbs2/file.c b/src/sbbs2/file.c deleted file mode 100644 index 2ae1b479dd..0000000000 --- a/src/sbbs2/file.c +++ /dev/null @@ -1,325 +0,0 @@ -#line 1 "FILE.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/*************************************************************************/ -/* Add/delete/edit/view/retrieve the file information for struct file_t */ -/* Called only from functions within xfer.c */ -/*************************************************************************/ - -#include "sbbs.h" - -long fdate_dir(char *filespec); - -void getextdesc(uint dirnum, ulong datoffset, char *ext) -{ - char str[256]; - int file; - -memset(ext,0,513); -sprintf(str,"%s%s.EXB",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_RDONLY))==-1) - return; -lseek(file,(datoffset/F_LEN)*512L,SEEK_SET); -read(file,ext,512); -close(file); -} - -void putextdesc(uint dirnum, ulong datoffset, char *ext) -{ - char str[256],nulbuf[512]; - int file; - -memset(nulbuf,0,512); -sprintf(str,"%s%s.EXB",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_WRONLY|O_CREAT))==-1) - return; -lseek(file,0L,SEEK_END); -while(filelength(file)<(datoffset/F_LEN)*512L) - write(file,nulbuf,512); -lseek(file,(datoffset/F_LEN)*512L,SEEK_SET); -write(file,ext,512); -close(file); -} - -/****************************************************************************/ -/* Prints all information of file in file_t structure 'f' */ -/****************************************************************************/ -void fileinfo(file_t f) -{ - char str[256],fname[13],ext[513]; - uint i,j; - long t; - -for(i=0;i<usrlibs;i++) - if(usrlib[i]==dir[f.dir]->lib) - break; -for(j=0;j<usrdirs[i];j++) - if(usrdir[i][j]==f.dir) - break; -unpadfname(f.name,fname); -bprintf(text[FiLib],i+1,lib[dir[f.dir]->lib]->lname); -bprintf(text[FiDir],j+1,dir[f.dir]->lname); -bprintf(text[FiFilename],fname); -if(f.size!=-1L) - bprintf(text[FiFileSize],ultoac(f.size,tmp)); -bprintf(text[FiCredits] - ,(dir[f.dir]->misc&DIR_FREE || !f.cdt) ? "FREE" : ultoac(f.cdt,tmp)); -bprintf(text[FiDescription],f.desc); -bprintf(text[FiUploadedBy],f.misc&FM_ANON ? text[UNKNOWN_USER] : f.uler); -if(f.date) - bprintf(text[FiFileDate],timestr(&f.date)); -bprintf(text[FiDateUled],timestr(&f.dateuled)); -bprintf(text[FiDateDled],f.datedled ? timestr(&f.datedled) : "Never"); -bprintf(text[FiTimesDled],f.timesdled); -if(f.size!=-1L) - bprintf(text[FiTransferTime],sectostr(f.timetodl,tmp)); -if(f.altpath) { - if(f.altpath<=altpaths) { - if(SYSOP) - bprintf(text[FiAlternatePath],altpath[f.altpath-1]); } - else - bprintf(text[InvalidAlternatePathN],f.altpath); } -CRLF; -if(f.misc&FM_EXTDESC) { - getextdesc(f.dir,f.datoffset,ext); - CRLF; - putmsg(ext,P_NOATCODES); - CRLF; } -if(f.size==-1L) - bprintf(text[FileIsNotOnline],f.name); -if(f.opencount) - bprintf(text[FileIsOpen],f.opencount,f.opencount>1 ? "s" : nulstr); - -} - -/****************************************************************************/ -/* Gets file data from dircode.IXB file */ -/* Need fields .name and .dir filled. */ -/* only fills .offset, .dateuled, and .datedled */ -/****************************************************************************/ -void getfileixb(file_t *f) -{ - uchar HUGE16 *ixbbuf,str[256],fname[13]; - int file; - ulong l,length; - -sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -length=filelength(file); -if(length%F_IXBSIZE) { - close(file); - errormsg(WHERE,ERR_LEN,str,length); - return; } -if((ixbbuf=MALLOC(length))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - return; } -if(lread(file,ixbbuf,length)!=length) { - close(file); - FREE((char *)ixbbuf); - errormsg(WHERE,ERR_READ,str,length); - return; } -close(file); -strcpy(fname,f->name); -for(l=8;l<12;l++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[l]=fname[l+1]; -for(l=0;l<length;l+=F_IXBSIZE) { - sprintf(str,"%11.11s",ixbbuf+l); - if(!strcmp(str,fname)) - break; } -if(l>=length) { - errormsg(WHERE,ERR_CHK,str,0); - FREE((char *)ixbbuf); - return; } -l+=11; -f->datoffset=ixbbuf[l]|((long)ixbbuf[l+1]<<8)|((long)ixbbuf[l+2]<<16); -f->dateuled=ixbbuf[l+3]|((long)ixbbuf[l+4]<<8) - |((long)ixbbuf[l+5]<<16)|((long)ixbbuf[l+6]<<24); -f->datedled=ixbbuf[l+7]|((long)ixbbuf[l+8]<<8) - |((long)ixbbuf[l+9]<<16)|((long)ixbbuf[l+10]<<24); -FREE((char *)ixbbuf); -} - -/****************************************************************************/ -/* Gets filedata from dircode.DAT file */ -/* Need fields .name ,.dir and .offset to get other info */ -/* Does not fill .dateuled or .datedled fields. */ -/****************************************************************************/ -void getfiledat(file_t *f) -{ - char buf[F_LEN+1],str[256]; - int file; - long length; - -sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -length=filelength(file); -if(f->datoffset>length) { - close(file); - errormsg(WHERE,ERR_LEN,str,length); - return; } -if(length%F_LEN) { - close(file); - errormsg(WHERE,ERR_LEN,str,length); - return; } -lseek(file,f->datoffset,SEEK_SET); -if(read(file,buf,F_LEN)!=F_LEN) { - close(file); - errormsg(WHERE,ERR_READ,str,F_LEN); - return; } -close(file); -getrec(buf,F_ALTPATH,2,str); -f->altpath=hptoi(str); -getrec(buf,F_CDT,LEN_FCDT,str); -f->cdt=atol(str); - -if(!f->size) { /* only read disk if this is null */ -// if(dir[f->dir]->misc&DIR_FCHK) { - sprintf(str,"%s%s" - ,f->altpath>0 && f->altpath<=altpaths ? altpath[f->altpath-1] - : dir[f->dir]->path,unpadfname(f->name,tmp)); - f->size=flength(str); - f->date=fdate_dir(str); -/* - } - else { - f->size=f->cdt; - f->date=0; } -*/ - } -if((f->size>0L) && cur_cps) - f->timetodl=(f->size/(ulong)cur_cps); -else - f->timetodl=0; - -getrec(buf,F_DESC,LEN_FDESC,f->desc); -getrec(buf,F_ULER,LEN_ALIAS,f->uler); -getrec(buf,F_TIMESDLED,5,str); -f->timesdled=atoi(str); -getrec(buf,F_OPENCOUNT,3,str); -f->opencount=atoi(str); -if(buf[F_MISC]!=ETX) - f->misc=buf[F_MISC]-SP; -else - f->misc=0; -} - -/****************************************************************************/ -/* Increments the opencount on the file data 'f' and adds the transaction */ -/* to the backout.dab */ -/****************************************************************************/ -void openfile(file_t f) -{ - char str1[256],str2[4],str3[4],ch; - int file; - -/************************************/ -/* Increment open count in dat file */ -/************************************/ -sprintf(str1,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str1,O_RDWR))==-1) { - errormsg(WHERE,ERR_OPEN,str1,O_RDWR); - return; } -lseek(file,f.datoffset+F_OPENCOUNT,SEEK_SET); -if(read(file,str2,3)!=3) { - close(file); - errormsg(WHERE,ERR_READ,str1,3); - return; } -str2[3]=0; -itoa(atoi(str2)+1,str3,10); -putrec(str2,0,3,str3); -lseek(file,f.datoffset+F_OPENCOUNT,SEEK_SET); -if(write(file,str2,3)!=3) { - close(file); - errormsg(WHERE,ERR_WRITE,str1,3); - return; } -close(file); -/**********************************/ -/* Add transaction to BACKOUT.DAB */ -/**********************************/ -sprintf(str1,"%sBACKOUT.DAB",node_dir); -if((file=nopen(str1,O_WRONLY|O_APPEND|O_CREAT))==-1) { - errormsg(WHERE,ERR_OPEN,str1,O_WRONLY|O_APPEND|O_CREAT); - return; } -ch=BO_OPENFILE; -write(file,&ch,1); /* backout type */ -write(file,dir[f.dir]->code,8); /* directory code */ -write(file,&f.datoffset,4); /* offset into .dat file */ -write(file,&ch,BO_LEN-(1+8+4)); /* pad it */ -close(file); -} - -/****************************************************************************/ -/* Decrements the opencount on the file data 'f' and removes the backout */ -/* from the backout.dab */ -/****************************************************************************/ -void closefile(file_t f) -{ - uchar str1[256],str2[4],str3[4],ch,*buf; - int file; - long length,l,offset; - -/************************************/ -/* Decrement open count in dat file */ -/************************************/ -sprintf(str1,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str1,O_RDWR))==-1) { - errormsg(WHERE,ERR_OPEN,str1,O_RDWR); - return; } -lseek(file,f.datoffset+F_OPENCOUNT,SEEK_SET); -if(read(file,str2,3)!=3) { - close(file); - errormsg(WHERE,ERR_READ,str1,3); - return; } -str2[3]=0; -ch=atoi(str2); -if(ch) ch--; -itoa(ch,str3,10); -putrec(str2,0,3,str3); -lseek(file,f.datoffset+F_OPENCOUNT,SEEK_SET); -if(write(file,str2,3)!=3) { - close(file); - errormsg(WHERE,ERR_WRITE,str1,3); - return; } -close(file); -/*****************************************/ -/* Removing transaction from BACKOUT.DAB */ -/*****************************************/ -sprintf(str1,"%sBACKOUT.DAB",node_dir); -if(flength(str1)<1L) /* file is not there or empty */ - return; -if((file=nopen(str1,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str1,O_RDONLY); - return; } -length=filelength(file); -if((buf=MALLOC(length))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str1,length); - return; } -if(read(file,buf,length)!=length) { - close(file); - FREE(buf); - errormsg(WHERE,ERR_READ,str1,length); - return; } -close(file); -if((file=nopen(str1,O_WRONLY|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str1,O_WRONLY|O_TRUNC); - return; } -ch=0; /* 'ch' is a 'file already removed' flag */ -for(l=0;l<length;l+=BO_LEN) { /* in case file is in backout.dab > 1 */ - if(!ch && buf[l]==BO_OPENFILE) { - memcpy(str1,buf+l+1,8); - str1[8]=0; - memcpy(&offset,buf+l+9,4); - if(!stricmp(str1,dir[f.dir]->code) && offset==f.datoffset) { - ch=1; - continue; } } - write(file,buf+l,BO_LEN); } -FREE(buf); -close(file); -} diff --git a/src/sbbs2/file_ovl.c b/src/sbbs2/file_ovl.c deleted file mode 100644 index aa7eb5963c..0000000000 --- a/src/sbbs2/file_ovl.c +++ /dev/null @@ -1,580 +0,0 @@ -#line 1 "FILE_OVL.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -/****************************************************************************/ -/* Adds file data in 'f' to DIR#.DAT and DIR#.IXB and updates user */ -/* info for uploader. Must have .name, .desc and .dir fields filled prior */ -/* to a call to this function. */ -/* Returns 1 if file uploaded sucessfully, 0 if not. */ -/****************************************************************************/ -char uploadfile(file_t *f) -{ - uchar path[256],str[256],fname[25],ext[513],desc[513],tmp[128],*p; - static uchar sbbsfilename[128],sbbsfiledesc[128]; - int file; - uint i; - long length; - FILE *stream; - -f->misc=0; -curdirnum=f->dir; -if(findfile(f->dir,f->name)) { - errormsg(WHERE,ERR_CHK,f->name,f->dir); - return(0); } -sprintf(path,"%s%s",f->altpath>0 && f->altpath<=altpaths - ? altpath[f->altpath-1] - : dir[f->dir]->path,unpadfname(f->name,fname)); -if(!fexist(path)) { - bprintf(text[FileNotReceived],f->name); - sprintf(str,"Attempted to upload %s to %s %s (Not received)",f->name - ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname); - logline("U!",str); - return(0); } -strcpy(tmp,f->name); -truncsp(tmp); -for(i=0;i<total_ftests;i++) - if(ftest[i]->ext[0]=='*' || !strcmp(tmp+9,ftest[i]->ext)) { - if(!chk_ar(ftest[i]->ar,useron)) - continue; - attr(LIGHTGRAY); - bputs(ftest[i]->workstr); - - sprintf(sbbsfilename,"SBBSFILENAME=%.12s",unpadfname(f->name,fname)); - putenv(sbbsfilename); - sprintf(sbbsfiledesc,"SBBSFILEDESC=%.*s",LEN_FDESC,f->desc); - putenv(sbbsfiledesc); - sprintf(str,"%sSBBSFILE.NAM",node_dir); - if((stream=fopen(str,"w"))!=NULL) { - fwrite(fname,1,strlen(fname),stream); - fclose(stream); } - sprintf(str,"%sSBBSFILE.DES",node_dir); - if((stream=fopen(str,"w"))!=NULL) { - fwrite(f->desc,1,strlen(f->desc),stream); - fclose(stream); } - if(external(cmdstr(ftest[i]->cmd,path,f->desc,NULL),0)) { /* EX_OUTL */ - bprintf(text[FileHadErrors],f->name,ftest[i]->ext); - if(SYSOP) { - if(!yesno(text[DeleteFileQ])) return(0); } - remove(path); - sprintf(str,"Attempted to upload %s to %s %s (%s Errors)",f->name - ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname,ftest[i]->ext); - logline("U!",str); - return(0); } - else { - sprintf(str,"%sSBBSFILE.NAM",node_dir); - if((stream=fopen(str,"r"))!=NULL) { - if(fgets(str,128,stream)) { - truncsp(str); - strupr(str); - padfname(str,f->name); - strcpy(tmp,f->name); - truncsp(tmp); - sprintf(path,"%s%s",f->altpath>0 && f->altpath<=altpaths - ? altpath[f->altpath-1] : dir[f->dir]->path - ,unpadfname(f->name,fname)); } - fclose(stream); - } - sprintf(str,"%sSBBSFILE.DES",node_dir); - if((stream=fopen(str,"r"))!=NULL) { - if(fgets(str,128,stream)) { - truncsp(str); - sprintf(f->desc,"%.*s",LEN_FDESC,str); } - fclose(stream); } - CRLF; } } - -if((length=flength(path))<=0L) { - bprintf(text[FileZeroLength],f->name); - remove(path); - sprintf(str,"Attempted to upload %s to %s %s (Zero length)",f->name - ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname); - logline("U!",str); - return(0); } -if(dir[f->dir]->misc&DIR_DIZ) { - for(i=0;i<total_fextrs;i++) - if(!stricmp(fextr[i]->ext,tmp+9) && chk_ar(fextr[i]->ar,useron)) - break; - if(i<total_fextrs) { - sprintf(str,"%sFILE_ID.DIZ",temp_dir); - remove(str); - external(cmdstr(fextr[i]->cmd,path,"FILE_ID.DIZ",NULL),EX_OUTL); - if(!fexist(str)) { - sprintf(str,"%sDESC.SDI",temp_dir); - remove(str); - external(cmdstr(fextr[i]->cmd,path,"DESC.SDI",NULL),EX_OUTL); } - if((file=nopen(str,O_RDONLY))!=-1) { - memset(ext,0,513); - read(file,ext,512); - for(i=512;i;i--) - if(ext[i-1]>SP) - break; - ext[i]=0; - if(!f->desc[0]) { - strcpy(desc,ext); - strip_exascii(desc); - strip_ctrl(desc); - for(i=0;desc[i];i++) - if(isalnum(desc[i])) - break; - sprintf(f->desc,"%.*s",LEN_FDESC,desc+i); } - close(file); - remove(str); - f->misc|=FM_EXTDESC; } } } - -logon_ulb+=length; /* Update 'this call' stats */ -logon_uls++; -if(dir[f->dir]->misc&DIR_AONLY) /* Forced anonymous */ - f->misc|=FM_ANON; -f->cdt=length; -f->dateuled=time(NULL); -f->timesdled=0; -f->datedled=0L; -f->opencount=0; -strcpy(f->uler,useron.alias); -bprintf(text[FileNBytesReceived],f->name,ultoac(length,tmp)); -if(!f->desc[0]) - sprintf(f->desc,"%.*s",LEN_FDESC,text[NoDescription]); -if(!addfiledat(f)) - return(0); - -if(f->misc&FM_EXTDESC) - putextdesc(f->dir,f->datoffset,ext); - -sprintf(str,"Uploaded %s to %s %s",f->name,lib[dir[f->dir]->lib]->sname - ,dir[f->dir]->sname); -if(dir[f->dir]->upload_sem[0]) - if((file=nopen(dir[f->dir]->upload_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(file); -logline("U+",str); -/**************************/ -/* Update Uploader's Info */ -/**************************/ -useron.uls=adjustuserrec(useron.number,U_ULS,5,1); -useron.ulb=adjustuserrec(useron.number,U_ULB,10,length); -if(dir[f->dir]->up_pct && dir[f->dir]->misc&DIR_CDTUL) { /* credit for upload */ - if(dir[f->dir]->misc&DIR_CDTMIN && cur_cps) /* Give min instead of cdt */ - useron.min=adjustuserrec(useron.number,U_MIN,10 - ,((ulong)(length*(dir[f->dir]->up_pct/100.0))/cur_cps)/60); - else - useron.cdt=adjustuserrec(useron.number,U_CDT,10 - ,(ulong)(f->cdt*(dir[f->dir]->up_pct/100.0))); } -return(1); -} - - -/****************************************************************************/ -/* Updates downloader, uploader and downloaded file data */ -/* Must have offset, dir and name fields filled prior to call. */ -/****************************************************************************/ -void downloadfile(file_t f) -{ - char str[256],str2[256],fname[13]; - int i,file; - long length,mod; - ulong l; - user_t uploader; - -getfiledat(&f); /* Get current data - right after download */ -if((length=f.size)<0L) - length=0L; -logon_dlb+=length; /* Update 'this call' stats */ -logon_dls++; -bprintf(text[FileNBytesSent],f.name,ultoac(length,tmp)); -sprintf(str,"Downloaded %s from %s %s",f.name,lib[dir[f.dir]->lib]->sname - ,dir[f.dir]->sname); -logline("D-",str); -/****************************/ -/* Update Downloader's Info */ -/****************************/ -useron.dls=adjustuserrec(useron.number,U_DLS,5,1); -useron.dlb=adjustuserrec(useron.number,U_DLB,10,length); -if(!(dir[f.dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D'))) - subtract_cdt(f.cdt); -/**************************/ -/* Update Uploader's Info */ -/**************************/ -i=matchuser(f.uler); -uploader.number=i; -getuserdat(&uploader); -if(i && i!=useron.number && uploader.firston<f.dateuled) { - l=f.cdt; - if(!(dir[f.dir]->misc&DIR_CDTDL)) /* Don't give credits on d/l */ - l=0; - if(dir[f.dir]->misc&DIR_CDTMIN && cur_cps) { /* Give min instead of cdt */ - mod=((ulong)(l*(dir[f.dir]->dn_pct/100.0))/cur_cps)/60; - adjustuserrec(i,U_MIN,10,mod); - sprintf(tmp,"%lu minute",mod); - sprintf(str,text[DownloadUserMsg] - ,!strcmp(dir[f.dir]->code,"TEMP") ? temp_file : f.name - ,!strcmp(dir[f.dir]->code,"TEMP") ? text[Partially] : nulstr - ,useron.alias,tmp); } - else { - mod=(ulong)(l*(dir[f.dir]->dn_pct/100.0)); - adjustuserrec(i,U_CDT,10,mod); - ultoac(mod,tmp); - sprintf(str,text[DownloadUserMsg] - ,!strcmp(dir[f.dir]->code,"TEMP") ? temp_file : f.name - ,!strcmp(dir[f.dir]->code,"TEMP") ? text[Partially] : nulstr - ,useron.alias,tmp); } - putsmsg(i,str); } -/*******************/ -/* Update IXB File */ -/*******************/ -f.datedled=time(NULL); -sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_RDWR))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR); - return; } -length=filelength(file); -if(length%F_IXBSIZE) { - close(file); - errormsg(WHERE,ERR_LEN,str,length); - return; } -strcpy(fname,f.name); -for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[i]=fname[i+1]; -for(l=0;l<length;l+=F_IXBSIZE) { - read(file,str,F_IXBSIZE); /* Look for the filename in the IXB file */ - str[11]=0; - if(!strcmp(fname,str)) break; } -if(l>=length) { - close(file); - errormsg(WHERE,ERR_CHK,f.name,0); - return; } -lseek(file,l+18,SEEK_SET); -write(file,&f.datedled,4); /* Write the current time stamp for datedled */ -close(file); -/*******************/ -/* Update DAT File */ -/*******************/ -f.timesdled++; -putfiledat(f); -/******************************************/ -/* Update User to User index if necessary */ -/******************************************/ -if(f.dir==user_dir) { - rmuserxfers(0,useron.number,f.name); - if(!getuserxfers(0,0,f.name)) { /* check if any ixt entries left */ - sprintf(str,"%s%s",f.altpath>0 && f.altpath<=altpaths ? - altpath[f.altpath-1] : dir[f.dir]->path,unpadfname(f.name,tmp)); - remove(str); - removefiledat(f); } } -} - -/****************************************************************************/ -/* Removes DAT and IXB entries for the file in the struct 'f' */ -/****************************************************************************/ -void removefiledat(file_t f) -{ - char c,str[256],ixbname[12],HUGE16 *ixbbuf,fname[13]; - int file; - ulong l,length; - -strcpy(fname,f.name); -for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[c]=fname[c+1]; -sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -length=filelength(file); -if(!length) { - close(file); - return; } -if((ixbbuf=(char *)MALLOC(length))==0) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - return; } -if(lread(file,ixbbuf,length)!=length) { - close(file); - errormsg(WHERE,ERR_READ,str,length); - FREE((char *)ixbbuf); - return; } -close(file); -if((file=nopen(str,O_WRONLY|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC); - return; } -for(l=0;l<length;l+=F_IXBSIZE) { - for(c=0;c<11;c++) - ixbname[c]=ixbbuf[l+c]; - ixbname[c]=0; - if(strcmp(ixbname,fname)) - if(lwrite(file,&ixbbuf[l],F_IXBSIZE)!=F_IXBSIZE) { - close(file); - errormsg(WHERE,ERR_WRITE,str,F_IXBSIZE); - FREE((char *)ixbbuf); - return; } } -FREE((char *)ixbbuf); -close(file); -sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_WRONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY); - return; } -lseek(file,f.datoffset,SEEK_SET); -c=ETX; /* If first char of record is ETX, record is unused */ -if(write(file,&c,1)!=1) { /* So write a D_T on the first byte of the record */ - close(file); - errormsg(WHERE,ERR_WRITE,str,1); - return; } -close(file); -if(f.dir==user_dir) /* remove file from index */ - rmuserxfers(0,0,f.name); - -} - -/****************************************************************************/ -/* Puts filedata into DIR_code.DAT file */ -/* Called from removefiles */ -/****************************************************************************/ -void putfiledat(file_t f) -{ - char buf[F_LEN+1],str[256]; - int file; - long length; - -putrec(buf,F_CDT,LEN_FCDT,ultoa(f.cdt,tmp,10)); -putrec(buf,F_DESC,LEN_FDESC,f.desc); -putrec(buf,F_DESC+LEN_FDESC,2,crlf); -putrec(buf,F_ULER,LEN_ALIAS+5,f.uler); -putrec(buf,F_ULER+LEN_ALIAS+5,2,crlf); -putrec(buf,F_TIMESDLED,5,itoa(f.timesdled,tmp,10)); -putrec(buf,F_TIMESDLED+5,2,crlf); -putrec(buf,F_OPENCOUNT,3,itoa(f.opencount,tmp,10)); -putrec(buf,F_OPENCOUNT+3,2,crlf); -buf[F_MISC]=f.misc+SP; -putrec(buf,F_ALTPATH,2,hexplus(f.altpath,tmp)); -putrec(buf,F_ALTPATH+2,2,crlf); -sprintf(str,"%s%s.DAT",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_WRONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY); - return; } -length=filelength(file); -if(length%F_LEN) { - close(file); - errormsg(WHERE,ERR_LEN,str,length); - return; } -if(f.datoffset>length) { - close(file); - errormsg(WHERE,ERR_LEN,str,length); - return; } -lseek(file,f.datoffset,SEEK_SET); -if(write(file,buf,F_LEN)!=F_LEN) { - close(file); - errormsg(WHERE,ERR_WRITE,str,F_LEN); - return; } -length=filelength(file); -close(file); -if(length%F_LEN) - errormsg(WHERE,ERR_LEN,str,length); -} - -/****************************************************************************/ -/* Adds the data for struct filedat to the directory's data base. */ -/* changes the .datoffset field only */ -/* returns 1 if added successfully, 0 if not. */ -/****************************************************************************/ -char addfiledat(file_t *f) -{ - uchar str[256],fdat[F_LEN+1],fname[13],idx[3],c,HUGE16 *ixbbuf; - int i,file; - ulong length,l; - time_t uldate; - -/************************/ -/* Add data to DAT File */ -/************************/ -sprintf(str,"%s%s.DAT",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_RDWR|O_CREAT))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT); - return(0); } -length=filelength(file); -if(length==0L) - l=0L; -else { - if(length%F_LEN) { - close(file); - errormsg(WHERE,ERR_LEN,str,length); - return(0); } - for(l=0;l<length;l+=F_LEN) { /* Find empty slot */ - lseek(file,l,SEEK_SET); - read(file,&c,1); - if(c==ETX) break; } - if(l/F_LEN>=MAX_FILES || l/F_LEN>=dir[f->dir]->maxfiles) { - bputs(text[DirFull]); - close(file); - sprintf(str,"Directory Full: %s %s" - ,lib[dir[f->dir]->lib]->sname,dir[f->dir]->sname); - logline("U!",str); - return(0); } } -putrec(fdat,F_CDT,LEN_FCDT,ultoa(f->cdt,tmp,10)); -putrec(fdat,F_DESC,LEN_FDESC,f->desc); -putrec(fdat,F_DESC+LEN_FDESC,2,crlf); -putrec(fdat,F_ULER,LEN_ALIAS+5,f->uler); -putrec(fdat,F_ULER+LEN_ALIAS+5,2,crlf); -putrec(fdat,F_TIMESDLED,5,ultoa(f->timesdled,tmp,10)); -putrec(fdat,F_TIMESDLED+5,2,crlf); -putrec(fdat,F_OPENCOUNT,3,itoa(f->opencount,tmp,10)); -putrec(fdat,F_OPENCOUNT+3,2,crlf); -fdat[F_MISC]=f->misc+SP; -putrec(fdat,F_ALTPATH,2,hexplus(f->altpath,tmp)); -putrec(fdat,F_ALTPATH+2,2,crlf); -f->datoffset=l; -idx[0]=l&0xff; /* Get offset within DAT file for IXB file */ -idx[1]=(l>>8)&0xff; -idx[2]=(l>>16)&0xff; -lseek(file,l,SEEK_SET); -if(write(file,fdat,F_LEN)!=F_LEN) { - close(file); - errormsg(WHERE,ERR_WRITE,str,F_LEN); - return(0); } -length=filelength(file); -close(file); -if(length%F_LEN) - errormsg(WHERE,ERR_LEN,str,length); - -/*******************************************/ -/* Update last upload date/time stamp file */ -/*******************************************/ -sprintf(str,"%s%s.DAB",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_WRONLY|O_CREAT))==-1) - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT); -else { - now=time(NULL); - write(file,&now,4); - close(file); } - -/************************/ -/* Add data to IXB File */ -/************************/ -strcpy(fname,f->name); -for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[i]=fname[i+1]; -sprintf(str,"%s%s.IXB",dir[f->dir]->data_dir,dir[f->dir]->code); -if((file=nopen(str,O_RDWR|O_CREAT))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT); - return(0); } -length=filelength(file); -if(length) { /* IXB file isn't empty */ - if(length%F_IXBSIZE) { - close(file); - errormsg(WHERE,ERR_LEN,str,length); - return(0); } - if((ixbbuf=(char *)MALLOC(length))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - return(0); } - if(lread(file,ixbbuf,length)!=length) { - close(file); - errormsg(WHERE,ERR_READ,str,length); - FREE((char *)ixbbuf); - return(0); } -/************************************************/ -/* Sort by Name or Date, Assending or Decending */ -/************************************************/ - if(dir[f->dir]->sort==SORT_NAME_A || dir[f->dir]->sort==SORT_NAME_D) { - for(l=0;l<length;l+=F_IXBSIZE) { - for(i=0;i<12 && fname[i]==ixbbuf[l+i];i++); - if(i==12) { /* file already in directory index */ - close(file); - errormsg(WHERE,ERR_CHK,str,0); - FREE((char *)ixbbuf); - return(0); } - if(dir[f->dir]->sort==SORT_NAME_A && fname[i]<ixbbuf[l+i]) - break; - if(dir[f->dir]->sort==SORT_NAME_D && fname[i]>ixbbuf[l+i]) - break; } } - else { /* sort by date */ - for(l=0;l<length;l+=F_IXBSIZE) { - uldate=(ixbbuf[l+14]|((long)ixbbuf[l+15]<<8) - |((long)ixbbuf[l+16]<<16)|((long)ixbbuf[l+17]<<24)); - if(dir[f->dir]->sort==SORT_DATE_A && f->dateuled<uldate) - break; - if(dir[f->dir]->sort==SORT_DATE_D && f->dateuled>uldate) - break; } } - lseek(file,l,SEEK_SET); - if(write(file,fname,11)!=11) { /* Write filename to IXB file */ - close(file); - errormsg(WHERE,ERR_WRITE,str,11); - FREE((char *)ixbbuf); - return(0); } - if(write(file,idx,3)!=3) { /* Write DAT offset into IXB file */ - close(file); - errormsg(WHERE,ERR_WRITE,str,3); - FREE((char *)ixbbuf); - return(0); } - write(file,&f->dateuled,sizeof(time_t)); - write(file,&f->datedled,4); /* Write 0 for datedled */ - if(lwrite(file,&ixbbuf[l],length-l)!=length-l) { /* Write rest of IXB */ - close(file); - errormsg(WHERE,ERR_WRITE,str,length-l); - FREE((char *)ixbbuf); - return(0); } - FREE((char *)ixbbuf); } -else { /* IXB file is empty... No files */ - if(write(file,fname,11)!=11) { /* Write filename it IXB file */ - close(file); - errormsg(WHERE,ERR_WRITE,str,11); - return(0); } - if(write(file,idx,3)!=3) { /* Write DAT offset into IXB file */ - close(file); - errormsg(WHERE,ERR_WRITE,str,3); - return(0); } - write(file,&f->dateuled,sizeof(time_t)); - write(file,&f->datedled,4); } -length=filelength(file); -close(file); -if(length%F_IXBSIZE) - errormsg(WHERE,ERR_LEN,str,length); -return(1); -} - -/****************************************************************************/ -/* Update the upload date for the file 'f' */ -/****************************************************************************/ -void update_uldate(file_t f) -{ - char str[256],fname[13]; - int i,file; - long l,length; - -/*******************/ -/* Update IXB File */ -/*******************/ -sprintf(str,"%s%s.IXB",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_RDWR))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR); - return; } -length=filelength(file); -if(length%F_IXBSIZE) { - close(file); - errormsg(WHERE,ERR_LEN,str,length); - return; } -strcpy(fname,f.name); -for(i=8;i<12;i++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[i]=fname[i+1]; -for(l=0;l<length;l+=F_IXBSIZE) { - read(file,str,F_IXBSIZE); /* Look for the filename in the IXB file */ - str[11]=0; - if(!strcmp(fname,str)) break; } -if(l>=length) { - close(file); - errormsg(WHERE,ERR_CHK,f.name,length); - return; } -lseek(file,l+14,SEEK_SET); -write(file,&f.dateuled,4); -close(file); - -/*******************************************/ -/* Update last upload date/time stamp file */ -/*******************************************/ -sprintf(str,"%s%s.DAB",dir[f.dir]->data_dir,dir[f.dir]->code); -if((file=nopen(str,O_WRONLY|O_CREAT))==-1) - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT); -else { - write(file,&f.dateuled,4); - close(file); } - -} - diff --git a/src/sbbs2/filelist/filelist.c b/src/sbbs2/filelist/filelist.c deleted file mode 100644 index 01eba9d912..0000000000 --- a/src/sbbs2/filelist/filelist.c +++ /dev/null @@ -1,657 +0,0 @@ -/* FILELIST.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Utility to create list of files from Synchronet file directories */ -/* Default list format is FILES.BBS, but file size, uploader, upload date */ -/* and other information can be included. */ - -#include "sbbs.h" - -#define FILELIST_VER "2.12" - -#define MAX_NOTS 25 - -#ifdef lputs -#undef lputs -#endif - -long lputs(char FAR16 *str) -{ - char tmp[256]; - int i,j,k; - -j=strlen(str); -for(i=k=0;i<j;i++) /* remove CRs */ - if(str[i]==CR && str[i+1]==LF) - continue; - else - tmp[k++]=str[i]; -tmp[k]=0; -return(fputs(tmp,stdout)); -} - - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) -{ - va_list argptr; - char sbuf[256]; - int chcount; - -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); -} - -/****************************************************************************/ -/* Turns FILE .EXT into FILE.EXT */ -/* Called from upload */ -/****************************************************************************/ -char *unpadfname(char *filename, char *str) -{ - char c,d; - -for(c=0,d=0;c<strlen(filename);c++) - if(filename[c]!=SP) str[d++]=filename[c]; -str[d]=0; -return(str); -} - -#ifndef __FLAT__ -/****************************************************************************/ -/* This function reads files that are potentially larger than 32k. */ -/* Up to one megabyte of data can be read with each call. */ -/****************************************************************************/ -long lread(int file, char huge *buf,long bytes) -{ - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(read(file,(char *)buf,32767)!=32767) - return(-1L); -if(read(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} -#endif -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct find_t f; - uint i; - -i=_dos_findfirst(filespec,_A_NORMAL,&f); -#ifdef __WATCOMC__ -_dos_findclose(&f); -#endif -if(!i) - return(1); -return(0); -} - -/****************************************************************************/ -/* Returns the time/date of the file in 'filespec' in time_t (unix) format */ -/****************************************************************************/ -long fdate(char *filespec) -{ - int file; - ushort fd,ft; - struct tm t; - -if((file=nopen(filespec,O_RDONLY))==-1) - return(0); -_dos_getftime(file,&fd,&ft); -close(file); -memset(&t,0,sizeof(t)); -t.tm_year=((fd&0xfe00)>>9)+80; -t.tm_mon=((fd&0x01e0)>>5)-1; -t.tm_mday=fd&0x1f; -t.tm_hour=(ft&0xf800)>>11; -t.tm_min=(ft&0x07e0)>>5; -t.tm_sec=(ft&0x001f)<<1; -return(mktime(&t)); -} - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - int c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - -void stripctrlz(char *str) -{ - char tmp[1024]; - int i,j,k; - -k=strlen(str); -for(i=j=0;i<k;i++) - if(str[i]!=0x1a) - tmp[j++]=str[i]; -tmp[j]=0; -strcpy(str,tmp); -} - - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} - - -/****************************************************************************/ -/* Places into 'strout' CR or ETX terminated string starting at */ -/* 'start' and ending at 'start'+'length' or terminator from 'strin' */ -/****************************************************************************/ -void getrec(char *strin,int start,int length,char *strout) -{ - int i=0,stop; - -stop=start+length; -while(start<stop) { - if(strin[start]==ETX) - break; - strout[i++]=strin[start++]; } -strout[i]=0; -} - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access==O_RDONLY) share=SH_DENYWR; - else share=SH_DENYRW; -while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(access&O_WRONLY) access|=O_RDWR; /* fdopen can't open WRONLY */ - -if(((*file)=nopen(str,access))==-1) - return(NULL); - -if(access&O_APPEND) { - if(access&(O_RDONLY|O_RDWR)) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&(O_WRONLY|O_RDWR)) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - close(*file); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,16*1024); -return(stream); -} - -void allocfail(uint size) -{ -lprintf("\7Error allocating %u bytes of memory.\r\n",size); -bail(1); -} - -void bail(int code) -{ -exit(code); -} - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - struct tm *t; - -if(!unix) - strcpy(str,"00/00/00"); -else { - t=gmtime(&unix); - sprintf(str,"%02u/%02u/%02u",t->tm_mon+1,t->tm_mday - ,t->tm_year%100); } -return(str); -} - -#define ALL (1L<<0) -#define PAD (1L<<1) -#define HDR (1L<<2) -#define CDT_ (1L<<3) -#define EXT (1L<<4) -#define ULN (1L<<5) -#define ULD (1L<<6) -#define DLS (1L<<7) -#define DLD (1L<<8) -#define NOD (1L<<9) -#define PLUS (1L<<10) -#define MINUS (1L<<11) -#define JST (1L<<12) -#define NOE (1L<<13) -#define DFD (1L<<14) -#define TOT (1L<<15) -#define AUTO (1L<<16) - -/*********************/ -/* Entry point (duh) */ -/*********************/ -int main(int argc, char **argv) -{ - char *p,str[256],fname[256],ext,not[MAX_NOTS][9],nots=0; - uchar HUGE16 *datbuf,HUGE16 *ixbbuf; - int i,j,file,dirnum,libnum,desc_off,lines - ,omode=O_WRONLY|O_CREAT|O_TRUNC; - ulong l,m,n,cdt,misc=0,total_cdt=0,total_files=0,datbuflen; - time_t uld,dld; - read_cfg_text_t txt; - FILE *in,*out=NULL; - -putenv("TZ=UCT0"); -_fmode=O_BINARY; -setvbuf(stdout,NULL,_IONBF,0); - -fprintf(stderr,"\nFILELIST Version %s (%s) - Generate Synchronet File " - "Directory Lists\n" - ,FILELIST_VER -#if defined(__OS2__) - ,"OS/2" -#elif defined(__NT__) - ,"Win32" -#elif defined(__DOS4G__) - ,"DOS4G" -#elif defined(__FLAT__) - ,"DOS32" -#else - ,"DOS16" -#endif - ); - -if(argc<2) { - printf("\n usage: FILELIST <dir_code or * for ALL> [switches] [outfile]\n"); - printf("\nswitches: /LIB name All directories of specified library\n"); - printf(" /NOT code Exclude specific directory\n"); - printf(" /CAT Concatenate to existing outfile\n"); - printf(" /PAD Pad filename with spaces\n"); - printf(" /HDR Include directory headers\n"); - printf(" /CDT Include credit value\n"); - printf(" /TOT Include credit totals\n"); - printf(" /ULN Include uploader's name\n"); - printf(" /ULD Include upload date\n"); - printf(" /DFD Include DOS file date\n"); - printf(" /DLD Include download date\n"); - printf(" /DLS Include total downloads\n"); - printf(" /NOD Exclude normal descriptions\n"); - printf(" /NOE Exclude normal descriptions, if extended " - "exists\n"); - printf(" /EXT Include extended descriptions\n"); - printf(" /JST Justify extended descriptions under normal\n"); - printf(" /+ Include extended description indicator (+)\n"); - printf(" /- Include offline file indicator (-)\n"); - printf(" /* Short-hand for /PAD /HDR /CDT /+ /-\n"); - exit(0); } - -p=getenv("SBBSNODE"); -if(p==NULL) { - printf("\nSBBSNODE environment variable not set.\n"); - printf("\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n"); - exit(1); } - -strcpy(node_dir,p); -if(node_dir[strlen(node_dir)-1]!='\\') - strcat(node_dir,"\\"); - -txt.openerr="\7\nError opening %s for read.\n"; -txt.reading="\nReading %s..."; -txt.readit="\rRead %s "; -txt.allocerr="\7\nError allocating %u bytes of memory\n"; -txt.error="\7\nERROR: Offset %lu in %s\r\n\n"; - -read_node_cfg(txt); -if(ctrl_dir[0]=='.') { /* Relative path */ - strcpy(str,ctrl_dir); - sprintf(ctrl_dir,"%s%s",node_dir,str); } -read_main_cfg(txt); -if(data_dir[0]=='.') { /* Relative path */ - strcpy(str,data_dir); - sprintf(data_dir,"%s%s",node_dir,str); } -read_file_cfg(txt); -printf("\n"); - - -dirnum=libnum=-1; -if(argv[1][0]=='*') - misc|=ALL; -else if(argv[1][0]!='/') { - strupr(argv[1]); - for(i=0;i<total_dirs;i++) - if(!stricmp(argv[1],dir[i]->code)) - break; - if(i>=total_dirs) { - printf("\nDirectory code '%s' not found.\n",argv[1]); - exit(1); } - dirnum=i; } -for(i=1;i<argc;i++) { - if(!stricmp(argv[i],"/LIB")) { - if(dirnum!=-1) { - printf("\nBoth directory code and /LIB parameters were used.\n"); - exit(1); } - i++; - if(i>=argc) { - printf("\nLibrary short name must follow /LIB parameter.\n"); - exit(1); } - strupr(argv[i]); - for(j=0;j<total_libs;j++) - if(!stricmp(lib[j]->sname,argv[i])) - break; - if(j>=total_libs) { - printf("\nLibrary short name '%s' not found.\n",argv[i]); - exit(1); } - libnum=j; } - else if(!stricmp(argv[i],"/NOT")) { - if(nots>=MAX_NOTS) { - printf("\nMaximum number of /NOT options (%u) exceeded.\n" - ,MAX_NOTS); - exit(1); } - i++; - if(i>=argc) { - printf("\nDirectory internal code must follow /NOT parameter.\n"); - exit(1); } - sprintf(not[nots++],"%.8s",argv[i]); } - else if(!stricmp(argv[i],"/ALL")) { - if(dirnum!=-1) { - printf("\nBoth directory code and /ALL parameters were used.\n"); - exit(1); } - if(libnum!=-1) { - printf("\nBoth library name and /ALL parameters were used.\n"); - exit(1); } - misc|=ALL; } - else if(!stricmp(argv[i],"/PAD")) - misc|=PAD; - else if(!stricmp(argv[i],"/CAT")) - omode=O_WRONLY|O_CREAT|O_APPEND; - else if(!stricmp(argv[i],"/HDR")) - misc|=HDR; - else if(!stricmp(argv[i],"/CDT")) - misc|=CDT_; - else if(!stricmp(argv[i],"/TOT")) - misc|=TOT; - else if(!stricmp(argv[i],"/EXT")) - misc|=EXT; - else if(!stricmp(argv[i],"/ULN")) - misc|=ULN; - else if(!stricmp(argv[i],"/ULD")) - misc|=ULD; - else if(!stricmp(argv[i],"/DLD")) - misc|=DLD; - else if(!stricmp(argv[i],"/DFD")) - misc|=DFD; - else if(!stricmp(argv[i],"/DLS")) - misc|=DLS; - else if(!stricmp(argv[i],"/NOD")) - misc|=NOD; - else if(!stricmp(argv[i],"/JST")) - misc|=(EXT|JST); - else if(!stricmp(argv[i],"/NOE")) - misc|=(EXT|NOE); - else if(!stricmp(argv[i],"/+")) - misc|=PLUS; - else if(!stricmp(argv[i],"/-")) - misc|=MINUS; - else if(!stricmp(argv[i],"/*")) - misc|=(HDR|PAD|CDT_|PLUS|MINUS); - - else if(i!=1) { - if(argv[i][0]=='*') { - misc|=AUTO; - continue; } - if((j=nopen(argv[i],omode))==-1) { - printf("\nError opening/creating %s for output.\n",argv[i]); - exit(1); } - out=fdopen(j,"wb"); } } - -if(!out && !(misc&AUTO)) { - printf("\nOutput file not specified, using FILES.BBS in each " - "directory.\n"); - misc|=AUTO; } - -for(i=0;i<total_dirs;i++) { - if(!(misc&ALL) && i!=dirnum && dir[i]->lib!=libnum) - continue; - for(j=0;j<nots;j++) - if(!stricmp(not[j],dir[i]->code)) - break; - if(j<nots) - continue; - if(misc&AUTO && dir[i]->seqdev) /* CD-ROM */ - continue; - printf("\n%-*s %s",LEN_GSNAME,lib[dir[i]->lib]->sname,dir[i]->lname); - sprintf(str,"%s%s.IXB",dir[i]->data_dir,dir[i]->code); - if((file=nopen(str,O_RDONLY))==-1) - continue; - l=filelength(file); - if(misc&AUTO) { - sprintf(str,"%sFILES.BBS",dir[i]->path); - if((j=nopen(str,omode))==-1) { - printf("\nError opening/creating %s for output.\n",str); - exit(1); } - out=fdopen(j,"wb"); } - if(misc&HDR) { - sprintf(fname,"%-*s %-*s Files: %4u" - ,LEN_GSNAME,lib[dir[i]->lib]->sname - ,LEN_SLNAME,dir[i]->lname,l/F_IXBSIZE); - fprintf(out,"%s\r\n",fname); - strset(fname,'-'); - fprintf(out,"%s\r\n",fname); } - if(!l) { - close(file); - if(misc&AUTO) fclose(out); - continue; } - if((ixbbuf=(char *)MALLOC(l))==NULL) { - close(file); - if(misc&AUTO) fclose(out); - printf("\7ERR_ALLOC %s %lu\n",str,l); - continue; } - if(read(file,ixbbuf,l)!=l) { - close(file); - if(misc&AUTO) fclose(out); - printf("\7ERR_READ %s %lu\n",str,l); - FREE((char *)ixbbuf); - continue; } - close(file); - sprintf(str,"%s%s.DAT",dir[i]->data_dir,dir[i]->code); - if((file=nopen(str,O_RDONLY))==-1) { - printf("\7ERR_OPEN %s %lu\n",str,O_RDONLY); - FREE((char *)ixbbuf); - if(misc&AUTO) fclose(out); - continue; } - datbuflen=filelength(file); - if((datbuf=MALLOC(datbuflen))==NULL) { - close(file); - printf("\7ERR_ALLOC %s %lu\n",str,datbuflen); - FREE((char *)ixbbuf); - if(misc&AUTO) fclose(out); - continue; } - if(lread(file,datbuf,datbuflen)!=datbuflen) { - close(file); - printf("\7ERR_READ %s %lu\n",str,datbuflen); - FREE((char *)datbuf); - FREE((char *)ixbbuf); - if(misc&AUTO) fclose(out); - continue; } - close(file); - m=0L; - while(m<l && !ferror(out)) { - for(j=0;j<12 && m<l;j++) - if(j==8) - str[j]='.'; - else - str[j]=ixbbuf[m++]; /* Turns FILENAMEEXT into FILENAME.EXT */ - str[j]=0; - unpadfname(str,fname); - fprintf(out,"%-12.12s",misc&PAD ? str : fname); - total_files++; - n=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16); - uld=(ixbbuf[m+3]|((long)ixbbuf[m+4]<<8)|((long)ixbbuf[m+5]<<16) - |((long)ixbbuf[m+6]<<24)); - dld=(ixbbuf[m+7]|((long)ixbbuf[m+8]<<8)|((long)ixbbuf[m+9]<<16) - |((long)ixbbuf[m+10]<<24)); - m+=11; - - if(n>=datbuflen /* index out of bounds */ - || datbuf[n+F_DESC+LEN_FDESC]!=CR) { /* corrupted data */ - fprintf(stderr,"\n\7%s%s is corrupted!\n" - ,dir[i]->data_dir,dir[i]->code); - exit(-1); } - - - if(misc&PLUS && datbuf[n+F_MISC]!=ETX - && (datbuf[n+F_MISC]-SP)&FM_EXTDESC) - fputc('+',out); - else - fputc(SP,out); - - desc_off=12; - if(misc&(CDT_|TOT)) { - getrec((char *)&datbuf[n],F_CDT,LEN_FCDT,str); - cdt=atol(str); - total_cdt+=cdt; - if(misc&CDT_) { - fprintf(out,"%7lu",cdt); - desc_off+=7; } } - - if(misc&MINUS) { - sprintf(str,"%s%s",dir[i]->path,fname); - if(!fexist(str)) - fputc('-',out); - else - fputc(SP,out); } - else - fputc(SP,out); - desc_off++; - - if(misc&DFD) { - sprintf(str,"%s%s",dir[i]->path,fname); - fprintf(out,"%s ",unixtodstr(fdate(str),str)); - desc_off+=9; } - - if(misc&ULD) { - fprintf(out,"%s ",unixtodstr(uld,str)); - desc_off+=9; } - - if(misc&ULN) { - getrec((char *)&datbuf[n],F_ULER,25,str); - fprintf(out,"%-25s ",str); - desc_off+=26; } - - if(misc&DLD) { - fprintf(out,"%s ",unixtodstr(dld,str)); - desc_off+=9; } - - if(misc&DLS) { - getrec((char *)&datbuf[n],F_TIMESDLED,5,str); - j=atoi(str); - fprintf(out,"%5u ",j); - desc_off+=6; } - - if(datbuf[n+F_MISC]!=ETX && (datbuf[n+F_MISC]-SP)&FM_EXTDESC) - ext=1; /* extended description exists */ - else - ext=0; /* it doesn't */ - - if(!(misc&NOD) && !(misc&NOE && ext)) { - getrec((char *)&datbuf[n],F_DESC,LEN_FDESC,str); - fprintf(out,"%s",str); } - - if(misc&EXT && ext) { /* Print ext desc */ - - sprintf(str,"%s%s.EXB",dir[i]->data_dir,dir[i]->code); - if(!fexist(str)) - continue; - if((j=nopen(str,O_RDONLY))==-1) { - printf("\7ERR_OPEN %s %lu\n",str,O_RDONLY); - continue; } - if((in=fdopen(j,"rb"))==NULL) { - close(j); - continue; } - fseek(in,(n/F_LEN)*512L,SEEK_SET); - lines=0; - if(!(misc&NOE)) { - fprintf(out,"\r\n"); - lines++; } - while(!feof(in) && !ferror(in) - && ftell(in)<((n/F_LEN)+1)*512L) { - if(!fgets(str,128,in) || !str[0]) - break; - stripctrlz(str); - if(lines) { - if(misc&JST) - fprintf(out,"%*s",desc_off,""); - fputc(SP,out); /* indent one character */ } - fprintf(out,"%s",str); - lines++; } - fclose(in); } - fprintf(out,"\r\n"); } - FREE((char *)datbuf); - FREE((char *)ixbbuf); - fprintf(out,"\r\n"); /* blank line at end of dir */ - if(misc&AUTO) fclose(out); } - -if(misc&TOT && !(misc&AUTO)) - fprintf(out,"TOTALS\n------\n%lu credits/bytes in %lu files.\r\n" - ,total_cdt,total_files); -printf("\nDone.\n"); -return(0); -} diff --git a/src/sbbs2/filelist/makeall.bat b/src/sbbs2/filelist/makeall.bat deleted file mode 100755 index d68900c3d3..0000000000 --- a/src/sbbs2/filelist/makeall.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -wmake OS=DOS %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=DOSX %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=OS2 %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=NT %1 %2 %3 %4 %5 -if errorlevel 1 goto end -:end - diff --git a/src/sbbs2/filelist/makefile b/src/sbbs2/filelist/makefile deleted file mode 100644 index 3621cb7c94..0000000000 --- a/src/sbbs2/filelist/makefile +++ /dev/null @@ -1,89 +0,0 @@ -############################################ -# Makefile for Synchronet FILELIST Utility # -# For use with Watcom C/C++ # -############################################ - -!ifndef OS -OS = DOS -!endif - -!ifeq OS DOS -CC = *wcc -!else -CC = *wcc386 -!endif - -LD = *wlink -INCLUDE = \watcom\h;\watcom\h\os2;..;..\smb;..\rio - - -!ifeq OS DOS -CFLAGS = -I$(INCLUDE) -s -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -ml -!else -CFLAGS = -I$(INCLUDE) -s -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -!endif - -!ifeq OS DOS -SYSTEM = DOS -!endif -!ifeq OS OS2 -SYSTEM = OS2V2 -!endif -!ifeq OS DOSX -SYSTEM = DOS4G -!endif -!ifeq OS NT -SYSTEM = NT -!endif - -LFLAGS = option stack=16k system $(SYSTEM) - -MAIN = $(OS)\filelist.exe -OBJS = $(OS)\filelist.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj & - $(OS)\ars.obj $(OS)\scfglib2.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\gen_defs.h ..\scfgvars.c - -# Implicit C Compile Rule -.c.obj: - @echo Compiling (I) $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... - $(LD) $(LFLAGS) file { $(OBJS) } - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# ARS -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Shared Functions -$(OS)\scfglib1.obj: ..\scfglib1.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) & --DNO_MSGS_CFG & --DNO_TEXT_CFG & --DNO_XTRN_CFG & --DNO_CMDS_CFG & --DNO_CHAT_CFG & -$[@ - -# Shared Functions -$(OS)\scfglib2.obj: ..\scfglib2.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) & --DNO_MSGS_CFG & --DNO_TEXT_CFG & --DNO_XTRN_CFG & --DNO_CMDS_CFG & --DNO_CHAT_CFG & -$[@ - diff --git a/src/sbbs2/filelist/makefile.bc b/src/sbbs2/filelist/makefile.bc deleted file mode 100644 index accee0fd8e..0000000000 --- a/src/sbbs2/filelist/makefile.bc +++ /dev/null @@ -1,76 +0,0 @@ -############################################ -# Makefile for Synchronet FILELIST Utility # -# For use with Borland C++ for DOS or OS/2 # -############################################ - -# Macros -CC = bcc -LD = tlink -!ifdef __OS2__ -OS = OS2 -INCLUDE = c:\bcos2\include;..;..\smb;..\rio -LIB = c:\bcos2\lib -CFLAGS = -d -C -I$(INCLUDE) -LFLAGS = -c -!else -OS = DOS -INCLUDE = \bc31\include;..;..\smb;..\rio -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = -n -c -!endif -MAIN = $(OS)\filelist.exe -OBJS = $(OS)\filelist.obj $(OS)\scfgvars.obj $(OS)\ars.obj \ - $(OS)\scfglib1.obj $(OS)\scfglib2.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL).obj $(OBJS) -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Global Variables -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Shared Functions -$(OS)\scfglib1.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib1.c ..\scfgvars.c \ - ..\scfglib.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_MSGS_CFG --DNO_XTRN_CFG --DNO_TEXT_CFG --DNO_CHAT_CFG -! ..\$&.c - -# Shared Functions -$(OS)\scfglib2.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib2.c ..\scfgvars.c \ - ..\scfglib.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_MSGS_CFG --DNO_XTRN_CFG --DNO_TEXT_CFG --DNO_CHAT_CFG -! ..\$&.c diff --git a/src/sbbs2/gen_defs.h b/src/sbbs2/gen_defs.h deleted file mode 100644 index 48f343082f..0000000000 --- a/src/sbbs2/gen_defs.h +++ /dev/null @@ -1,73 +0,0 @@ -/* GEN_DEFS.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#ifndef _GEN_DEFS_H -#define _GEN_DEFS_H - -/************************************************************************/ -/* General (application independant) type definitions and macros */ -/* tabstop: 4 (as usual) */ -/************************************************************************/ - - /* Control characters */ -#define STX 0x02 /* Start of text ^B */ -#define ETX 0x03 /* End of text ^C */ -#define BS 0x08 /* Back space ^H */ -#define TAB 0x09 /* Horizontal tabulation ^I */ -#define LF 0x0a /* Line feed ^J */ -#define FF 0x0c /* Form feed ^L */ -#define CR 0x0d /* Carriage return ^M */ -#define ESC 0x1b /* Escape ^[ */ -#define SP 0x20 /* Space */ - - /* Unsigned type short-hands */ -#define uchar unsigned char -#define ushort unsigned short -#define uint unsigned int -#define ulong unsigned long - -/****************************************************************************/ -/* MALLOC/FREE Macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/* FAR16 is used to create a far (32-bit) pointer in 16-bit compilers */ -/* HUGE16 is used to create a huge (32-bit) pointer in 16-bit compilers */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) - #define HUGE16 huge - #define FAR16 far - #if defined(__TURBOC__) - #define REALLOC(x,y) farrealloc(x,y) - #define LMALLOC(x) farmalloc(x) - #define MALLOC(x) farmalloc(x) - #define LFREE(x) farfree(x) - #define FREE(x) farfree(x) - #elif defined(__WATCOMC__) - #define REALLOC realloc - #define LMALLOC(x) halloc(x,1) /* far heap, but slow */ - #define MALLOC malloc /* far heap, but 64k max */ - #define LFREE hfree - #define FREE free - #else /* Other 16-bit Compiler */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free - #endif -#else /* 32-bit Compiler or Small Memory Model */ - #define HUGE16 - #define FAR16 - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free -#endif - - -#endif /* Don't add anything after this #endif statement */ diff --git a/src/sbbs2/genetext.c b/src/sbbs2/genetext.c deleted file mode 100644 index 4f2b8e928e..0000000000 --- a/src/sbbs2/genetext.c +++ /dev/null @@ -1,69 +0,0 @@ -/* GENETEXT.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Creates the file ETEXT.C which has the encrypted text strings for use in */ -/* Synchronet */ - -#include <stdio.h> - -void cvtusc(char *str) -{ - int i; - -for(i=0;str[i];i++) - if(str[i]=='_') - str[i]=' '; -} - -void main() -{ - unsigned char str[129],bits,len; - unsigned int i,j; - unsigned long l,m; - FILE *in,*cout,*hout; - -if((in=fopen("ETEXT.DAT","rb"))==NULL) { - printf("can't open ETEXT.DAT\n"); - return; } - -if((cout=fopen("ETEXT.C","wb"))==NULL) { - printf("can't create ETEXT.C\n"); - return; } - -if((hout=fopen("ETEXT.H","wb"))==NULL) { - printf("can't create ETEXT.H\n"); - return; } - -fprintf(cout,"/* ETEXT.C */\r\n\r\n#include \"etext.h\"\r\n\r\n"); -fprintf(hout,"/* ETEXT.H */\r\n\r\n"); -while(!feof(in)) { - if(!fgets(str,127,in)) - break; - str[strlen(str)-3]=0; /* chop off :crlf */ - if(!str[0]) - break; - fprintf(hout,"extern unsigned long %s[];\r\n",str); - fprintf(cout,"unsigned long %s[]={ ",str); - if(!fgets(str,127,in)) - break; - str[strlen(str)-2]=0; /* chop off crlf */ - if(!str[0]) - break; - cvtusc(str); - len=strlen(str); - l=len^0x49; - bits=7; - for(i=0,j=1;i<len;i++) { - m=(unsigned long)(str[i]^(i^0x2c)); - l|=(m<<bits); - bits+=7; - if(bits>=32) { - fprintf(cout,"%luUL,",l); - j++; - l=0UL; - bits-=32; - if(bits) - l=(unsigned long)(str[i]^(i^0x2c))>>(7-bits); } } - fprintf(cout,"%luUL };\r\n",l); } -} diff --git a/src/sbbs2/genetext.exe b/src/sbbs2/genetext.exe deleted file mode 100755 index c32166f2a87e36f619d76773a88708fe7ab01ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9698 zcmeZ`dc-Kqz{sG$z{l|azY9|X0|eMHFfcGO{0_(}g7C4EjM#-oMTblX?E1r~*D1D- zX^X*G#cn+&hHg0>hQ3>iCo%M}O<?Gh>tX2BTfy+6g>hjIL*D`81Kl^ef9(8U|L4=X z$BE8r7ObV;8qPL+zuC#x#jul+;qv3=!yL_ze{{<AG4$Nhe${Q4!`%3vfvK2%KLb-I zh;zJzrAUL>j)l2MX(P+!_wLs3izJ)va+n!P*qiNGm>Ej>_A>}rzb|L+{`;EwB^Oio zedb%8atjzb<(4okoWP)cqwl~Lukf>q@t2?f>buna{I~G|y*{>mO#78sc9yVcpa1iD zRkPhSCXq7t2D?cN%ta36><xC48RUx0cQ8imW@0$2SfsTjy<6@Y(^<tLg)JVt89_qg z4vSYXc=R3E;(1oFhzq2Wf#IxTG4sn##w`qIr8>o?F?90HVBk7X!n4DHq3^)%0tU5X z?2N{5!FKPHVcD<5^5O!+f3psT|7L9r|IJz$Ui2~sypU%BD+mkUrvz5=ks&_ra9B84 z(D*?2hn@NiYD_E*R~XzLeb<fQE#cfL$*@bG;RP3CeB9ygH(PwV+?dWP?&M?G<-zch znNe;BgXvktPPr0>9=0-u9V}o@1w#*86~hizFsFv0hpmob2OF5vz|h0i#IS=wwdYjd ztzC;5&nn6vmfOLgdQ_~0;jE&(+zuAiqhb{hCadaEu^I@IP4%c)1BiKe2LogG_3nGt z_e&(z8tng<@TqnAGa9|MK2glleX#p-^I^8vkFBqlNO#{-Yp@4}$bYsHcD4WUOzf|Z zsQnLTVt>8&@D>KB5#nGYc+@P?8H?D|y3!dT20X=Kz;TEH2M%v>07u*5opKDj!Wi`W z<n}SWc=dk=Gef|O^Gu*JDzy7ecNmNDf!BiFx0r7<*vFT$gBZuy6&yfxgFQp(v)IF- z-ESJ-OkxNN-?4=uV8<$kfER^=k&)d$xDS+a@7T@|@WNg!^5uTU9ak9wcARAhco8fZ z8QJOfiTgk)>y8@?ukY{p#t^XM9YeqiE3m`|u*6S>*T;77GY0%G`}D$5Ffww7If(t? zg{fd<<jV}k@E!FG0ljT`{{vq9<ZC{{#(kia`DHXCL}a>DWbd@>|ICNFZyaN1=xWRR zzl8y;zzU*ZhbP3Wmjca4*uYwLq=7^}y|@k%K{9(T-0c4hV1+NNL1yP*G5a1=!Kr_d z5S4;bksWUTy4?P4VKDV%nAsWjtJCerF}MHh#@~*+{b6Ky+04+@1aeyUHRB7-pLCA9 zePdwg4Exd@_O09POPAmO7iEl`Za+A~es#J1XJPMf``=LaU!lnNf7!49Wj}V*KwPXU z(0qjBzuTYVZoe29j=TL}U;wFp08!0QA`h`5p!-;q@gY+k2IET`*|q%szp!D1xW^6b zKI>y;%r6W7Lrrdmn0%VQ`3T2%S0)99Qs$R^|Kj7ipMvAM*{+XKp_Fw8Bg1RqZn-|j zi;uhASUTI4SpKv1F&ZBLtJ&ggbf7zo<*Z^6XLlT1C%^H5*DL`q6d9qC8yLI8Si1e# z&MFpxQWs0W3pU2s!-qq=--LCSad3Ytm3z(ipRbP*V*LN<N-Q8t8A@Nj;QaGnYy#tp zNq=4l{b{aaV<;8o{#MHIUu+WNf3Ycy|I1ijDE*0yi#^1~5Ze95_&`7aNNCxAu)RAN z83K$CfJLVKk3DRBAOI@zqV@k_5ECT(qVoUYXujZvp8~}K-8U{jxcunb&4z;lmtS*V zKHczAV3P5H%a2aO72LY~;_@qqg2&v4Aqp;CesLP&6Bh1oHKNV`BI=m;g)?-Tu`zeG za4^s4{_vXj`@QCW2K6tGv#~M%|KDjgg<;44|8cR0m_V)$>n>vnd$H$#_c55r4hEO* zIF_@DlT;fRz&>eyqZAg-)?LRX$KD;s(fnJbJfh(@Q&DiY8&9_%ANR>x!G=0Eh7#^$ zth(;sZ+^ege3PNK?A~MkiQ1RGf1ddLbBBoAW6swfLA(wTH|_(aUwi%TeZR?k?vGy= ziw;*Y3yaljW+pe5Rgd0pU|7Z8?ZyR;{X;w;_kn|u?SC1|4lag(4GaMr5(8dj{f|Aw z0+Q^GW4ZXaarq6V|9`hQb-8hM$FX$#add})qMGS7Yru;q|7L={0E+1DFgEUQrOf-1 zSpJu>a9=8A-I2unnyLFxK-ddrw#dkU7Zd*PNMjBNd(kTv83_&!aI`kRVG0ZHE@SJi zV+k`p5YTM<zm#<c6T@rf9gGZ&tlg{uFXsL4{?P08FCgqi(cj2O?gJ&)yN^M9fN<pZ z_8Ux03?*zkSQ!Fd3vIDSbty~03#)&zhj+0uSc_d_D%S44b@B1>_8UwL4BfXjvRr<A ztbG>a|L#MVAFxhi?7nsRacBDyMkkQcqN@vLG0q5h;r=g@`#>pMquLC{|9^KdFa>;P zo59GyR07U7OvVR5X>G?e#()=3MVgOrELa87BMj5C0<LETL=O|gYnYy8i~%n;g7kp0 z%NECOa4v)9qV~VBhr5owU}ESxbVZ=;!3!pawg)T|)I}WBR~-hI($g5i!jHSX1C<nS z0vL|Fy<%W^?H0cC|9_(cpVoc9=ox?5tb^74pWmBO{oueLw%)d^|Jpx5WI*`;GLHXY zT%fY~xZ5j6hU0E;0vH(U-u3Rw`p+H}8GV@T4~W@W_out=Pj?yH8m<E+LN=-;f=~nN z-@RD#|Mkn4x0pN2KCH1(EqUHq_s95Tr{AYezkeNmUyr-}`2YX7+qeJ!Uo);TdeVKN z`$ofSg@)e=#ll_lOPQO0i<dFK>}9_ASnvOGLEe|m%ng4T%6~Nb{bPK60mOXU?Dvo9 z^-&P>QA6EV?GomWu&=MTHmCi&|C*)Q@1Md}*4N8HvcBKl{xLC>YBu}*<Jijhdh$yP z=I%Ncvu@UAHx{Obzf8qK+y^SzzTW_u*Xj0SEAz|z{|$dxO0RdiefxLxWfF)}d}=Gp zf46ThL;p|GF__Wtm#JKGD^t7M5AFjs7cV~OzHsru#RtrX7~OunGzKXzo!##Cjr%~! zR%E$vFU9{i`~4Gmnfkxc?;itWbK1Z6FC+hN=XlMvo$EE%c7e?=nQk3(`^wM}_S^VU zN7yfjD_;w2=Q`&0i?Ji@H$-5jyL)FD+jqBr0t_XrX5FIh?wxfky>+{}50naVUn=Em zuKUJN%42qnm7)9iYvE?Ue=I=(;a$gP1a!Im3J89&;kOujci1=XOSQ}|KQX-g3$m`W zjIFnBS9ctX*?)6q=gv5m?{5DT7)k`py2Zg<G4>ZT{%){ZCB`20qW>?*=woib7@E`m z{qFVKrTw%0e0SJ4>x=bF-4|cZXXq?rgS!<J#A58db-Rt8n02!5WMp`G2q6!)q?FgJ z+ZLouj-C7eYi_e6AP!5<0q*0ata9x8^O#=*{I&M`R>s`z_w8jXLUXs@H|~?Q%sbf_ z!UKEbb_WOTU}R8s`xnsd_HQKvV+rRD4u)no7OvOq&2B6lJJ=WkUVLH!yX3puKMsZx ziSDo;+?VPEUwrzb)?lk!%IK+mv5vVj>=TGr!rkTemFqx>h`(9~YjfQvhB_{&b^rZ7 zy*Tiv`#UJf$NkvB3bN9cm7!F)EA4l~pZro@km`EY<8GfA8D2{_{HZ8mZTJ&WD%kAz z&%xWfIqwrwEl84qf!Xg9Bw6yjX4|0fqVkWo_09Tk-`)N>FqCj_FnE#ir_1g4i=;o@ zVV}4!)v0Tr(!QnE#bTpd!eOIO!eXOc%C5HNh4UXz@AgxV**6%xu=w-nXZxwgLfSXg z*1$3#^9$`ik3MkUuH)=Jy+PrH=$}VFUxxna1ec?bu;+${{cCn;$nOYX&~kgj?DkHr zlNFN2*xlXLj<Yf_ycGM>UG|~7?#~9*7bkzO;W|+IqoM9iKrQo&Bfr_3>s~RGu<rQ( z|21>B+dD|n%fV2>8OOPjGn4Z==MzpPE=?{yu1TEXT&7%>T((@>xRSZqxYf9q@;n5? z7S1kCP%RqXUB~jjjP1o?fynL;4gvqm*ur1%a5W!c>psqWEItlgmvp<abYE$F#lU2J zsF;2690ub9uQ`viO<~{wRjY6nVQkE7a~PU0F?65czEmpEc#wgqh|Bs+F<U#^90qg^ zpk~98|B*1wGlK$NZ2un_8GCrwHRjjMyKXb@WMzOhpLeP=?0Uew#o?^t%dKC)EoP1_ zE?sVH-Jq(E>#SlC54fSi(tYSP8>kiZ=zHwpu<-6L-7##<uUU%ttmU{^N?2bwF}!Ae z!3^rfSjus*lqh$XGks%WEMe<3<6?QOU~R_1Qo`GP??nhhw>#5fE|%B4-S><SEaqTY z%*C>phb8#Mw|~)x|MOde^h$J>Gj+49U@YZlX76O_wrBp`S<2LX?=|xaBL)z!n{@?a z3FBc#_U`Y@A39^0y6<<_vsvFS;p?>HVd*Ys=`3aGtYJHRoQ;Qtf#Gns84nBhw-SNw z8n(_Dw$50V&U&`aa+brLay%@Z@hqM3Y!L6buyG$K31VesC^A$1_urO-p_mzz>+CpK z7)s>3<#<@QZ<p|PU$$f~mg<gYv%XdO^+g)PYsD8`46kKg$S}MXH$L!Mxcfu%F%C=f z;+HS7|Nm$2KFrDj3K39c8SujFUv#u8BSQ(N@ui@E7aISfqay;0ZwCjwko^}OZTtU! ziAeX2PB{*iPB|`?2!~Gg=EE%AhYv>^A2<wA_U$i3nOOIYg<LG1?o6l(Ba9Cm)@1Mg z%xvEMkNJl~Crf7xQ)ekt^D&n0V~4xn1P25Lyb%2#-F<`mK#9B@`=9O~-DUr}d76*0 zgf+ipz4-F;(oVO3FI4_TcgOu}KEigm`%v>C4(p5Mrrj4oQC!O3$^M_6`EYQ+3-7<t z(XZvYe>4B+jAhckpef${o%vH|4U<!+X!q&v`!CG@b>D10%yKv^9F&~mIJ(`qxDS+= zbKfq}ZGO$t&F|TLq4^MN^P_*wzc`AScX2RSpDN-hXKg;r@|xpC`~TO>FZ};^AAZdn z@FMl!YqsDQ6aE?>h>neqJN#cwgau@zAIBDFPznXN9hfJAQl-yVNLmkL0k>i}!DXcR z*Vp`rmQT<NW(G)(*kT86j~4O38by%yJqN^$<~J<eZY<Vp*O-dfK*qd|2Db`94K7#% z$OqP>EwcM|sG-z!2cwhm$?l716^rzO0(LM#Ih}5QI>Y`&MHWf!U~oFCSR`Z}_OFPu zoYmUxPZ87W?GQ^Rf9ZzwOTs`!#lHXlx&N1>Sl05D#y8ipF_g$O+cMO0hQA170JX=w zzq>NAFqE+WFXebq^(V5SmW82)yUUejM!*Zk|B>Avj=M53FdTPfV_*OkamQR){x{e1 zFqDXZdlIEQFI>L{ylDRxdEAwUfdSN{1cw>eV($N?tS`<nyiT*M<%5)bam}_2HJaaD znK&3qxw?<DvNBk@a+SJ)42JV8x?MRsUAbNxyw>Y>Wn*S_=>DK-8UPUtfVk@kck>Z8 z>tiLn-(8s)m`d52eVGJa&o@2*E&Ia4jW2cAvAkyP5Or_<#Z{vA-;b?Mu{)0AKYtBR zcRAO8cdjm$Eex;O|Ce#R;A4sGzF_<Rf9a*>U;j%vt?O7yK`loSP~#wu<GVYP07D5# zfVta^1!_LHv3=a_9|J?T-8H6t(->b1eRpAEW+>qZd%^TS^1s`^=3@fg$Njkvls@lv zL+T|$8tEJmt@qrz_`43;6qR!9Vr1CQ$naXB;b(a%>n<kd*BlK$6H9q_F>xMu``5s* zpNZi$$OV~QJZ=p?wM+OLY_v<|8-A9Qur~ZmDiv+`sa?v{#nb%gPxC1jkPgQE%nS`b zOG?=qPcb;WmIWySF&kd<FJxd=WjMfnq5IHEhK3U6=JO86*(NdO$b&kh;-JFW?O!K* z_i;$&1npR`gmss3{V!t!bsl=%{sg=*`QPcn#C@Pdp`nI_p;rBW*`IE=f81^?0ifVK z$J~5`t;2<d>p(5<F&CEq$6c5hK$VYUmkTIGxqJe3Jy;ukm>8JAJpdObSo()H=EGh* z=V(5{!F`~FJ?w?`-^ka8j=O+U7O1a%h=U<)-!w*$#WlhUuQ6?8f%G=6H6IhOK2-i3 zECC8DrtV{LpyvIH^Z&aqa326iDR0pKGElu~d?4V33bgyXK?>CO1^bR8;KjSou*6%& z(rm*}%hesi#w_C0{p&S%H_J@pL)wSBFLeL-?!x52P^#1I!v#_!`<m0U`(}eZS1F@= z_aQIt1En8c3v}OfL=gc6DXc3S-d)DhUB?yn;`$$OSb$mt?#=%hO9h&380xsgUex@b zsp-Zh8OG6=!W94SI12+qw+lz73m3S%QN{)d$Ymd!k8preEEg#4f}0gg@C?xWh6B`N z2KC>K4;Wtx2!iM-0_o`t``79A2c(k&q?7q&3j@d-B_JgiA9UXU7fBo?;X9Z>BLfJ{ zrV!1b0UMBJR#4>vs)PQQ{rg|`2c$dTg&;@`NR}65G{>(0|3RM9>UR6p9rmNs?O$iu zpRgBm|IK7{`y&|k?=^SWiwXZ`YP$WA4Exs|_OILR4=9cghlTGKVF2YS;cgcuRR(5T z2If-Muoo+SN5Zq!vv_dqf;{;hoPwBNocRC0gbfl<0T9<*XKg;h*2%(sppK(Ch3UTW zf!A`)HVmbFAXDrA@hUKMx-h-w0EKU}50e1eXv2S&uoo;0k#Ud&(Ot&E{jHR3$N&E? zr-Op4j`u%LcMR8m7p^Y$m(3uNnvm}<OahFhzTaJ#7#T|38hw}=7@BL?7)p4;UIhQ= zK2UP@^?}zXVXl?>4~m=}1uRgvYJ=R$eV|ks;`B2=BW)QOO4vXSd)<lb;FneZ8|(^L zcuU#A$*^P{$ZHD<Shg_4#U2KCp8ftuf>M51xEy<T9Sdkoz>nkN%Rir&7BenElwsX| zEL&_~V-PF>FB0A%Mk};WYF`4i-JmJ9`3(znY=PtZF@^)B9MDqa19;Sf<;8&?ps~w; z-;XgcmQ*O)F)?=^U)jJ|$`1133yycqb^rdCDmUA)F*B8L{WoJ{e(~k)%eM^Qk2gRI z)*Xxtoo@eL^L#(Xz*1tqBY+{`^_}m>J}{I>{x4$zWmf<Hpn=m`=9gO;!e31O5&2pO zoRR;%FoQ_syqv=j25OzoWq^#a)<hW}2nc`C`W57`KPwv;O5_^PF(`aL#?VkAr~03P zSAhXM&K3S5>1*>5w%1(Wk1;Tnu!O((_wT#gKSqWUDX?cmz^>o}`2$o+ytw`yG^+Z) zM*sUU2Idmh9Sj1X5s2<<jgS8S;Jy$9(F!Vkn0GKRMsZ*0zJKv?=kyy)pxh6wkelBy zZD8#7WBY!PiJ_Eh1Jn0|EDWVg8yLF7ST=r8@?+yVxW)FYVv$s*+rMr%Hr4+-co`bH z<NjTI+}VDEsoU)zs9Cc04b-q58>9kuEMo+@t=Ek$;D!EsSZZba&lA?=1}bn_86shc zIJ~=#t;>yNQ4veC?f+V<|E%4yT>o9UI@lrgG4sps3=MWgEL<gAAd0ty`Q<Z)@E3+Z zK#c_Em$yJ2hnF`QUS4GQ?#eWQp%kQzi2+*qK5q17VqgTfE?k>!8A>?AU;OwE(s-)d zmF@eDPN-cAidYcVbwI6S2U}NK75?HVNJ~lK>#47EK@~kxaU_aV9D$oA%ic5};Q(pm zDwY543M!B#K=HJLj|JLBIL6X^gw2+bp%fxs1QTBe6))j}G#;2=+Wucq#Il6}TDe05 z^u?Kfpsr15_Zx6+56VeyY@KfZz+qLQ`C2L*)ShtT=whD{@M6Kg$VgC$$7+1wWh7&_ z8{2<B(CGV}m!6Cew=utb%m50UQs$Sl7`k2Atlij(1EJw`;TtHNjuP_l*4Lmx?J~Ci zWgH--0WY3{YFcYIwo>Moj~HIJzP!uO&C2Y?RwLbP%TUU-<NtqcSGG>p*F51b@<29} zFuzRr{~xUXe<|0CJHJ8wMUaM0)^0a8Mpv$va~MDd;|p{{bT=eI-B6PFlKKDZ7?2lB zY+vjDXRQ^1B(Cl<j{j~PT`V2!TNqyR!^14#Mc7|RkTJhJ1xo3V06YF#65>LTLjqp> zWdt?z+}KK(UoQOzYe+$cu_0v=v_;LegN-5J#k`j<mos#`aX8pAF%<ElG_Q>hyzF5B z4c39Y&+>x*HK<~6`-iU5p_CPr#ge-H{&knJ$+36;>%RAAjg3@^t_^Pq>#9dzUdufC zz!nTjXT5HJLD}xbkyp(}*rM70bh-UqW&OL9>GjOl3Sb4_Z%Q8s2m}>Me_l2p;Q%|Q zvHu1W15>p2@9E$M7NnGhv<56o_)2-2>o}O|*&6@<uP*~vHOm;9?SxnuO8FZ9En_U@ zIL;=-0-9iGwi94sDCKGVH;u8B?KqnN3nQokDiH*^3sT*Oy_otPG*RIKY1o%=yjb`l zvN?t6^Kln8P$Qj{m7x>dqyX7iV#ocz%<4GX1jb47;9j{z_zTC6k)3X!B+UG>^nbGt z6U%GnmpT8t-Pk%^xIj8<*qZA&7)x22eV91lt&XtpKizdKa_rsLjSlSm|Nqmv-qQcw zb!=ef_lw#;+rNK5#>h~@w8RtCF)U_WG6|aH!h3G?9q6uOF+T7Ita#%03m);{qO9>v z2Lre((Ot%7ZFh~S2olwspTB$vi|S%frn}4lDr=!l7ePc>5&oj?1t|3IUwjOfbSUNf zU&av@{$d3~^AWa}bHLglL-U<wzq;KxKoybif4_g-alih%{pw=xaQkb+RmyUVh1adi z?QaK*TW?#%|L$wr7aD&xFx04Pe+UZ*e-RBbtowrXu@WIr;|JUrv+Z`{(02Rx+OT(9 z#sB8Ie+;E7L0YvxbRXkBP^K6L;sk`hP=IUYYyS1W<Y>1W2lFBAW1t}-4tOE~CmxXd zK}`bi*u4A}2T*GrHjBU?09FD{Ujh-JI%488(142Z|9#UKLE%;`2I-)%hP`<45!8%w z2Z<KF0?!ZcX92gi1mH^SK1KRB9~0pIU-~9K?l8vM0;l|<oW#5o1!rw-1ziQ_{DR7& z%=C;B1w%_qLj{<mXI@E;9)n+LPL4uBer8@tYLP->adBpPUT$h$2``sRW?5!RszPc} zQGO9Gmt#_1eo<~>jzU3EetJ=2u0ly_QEp~lVo7Fx9xoS$1F#B|u#~VMOSp!(Muh0O zIEFA3B{3u?=Bbw`<QJsoDZs_K7$8h%hH{vK<f7EXl2oV?XP5#H911+R81%JZiWRi< zdAWGGlr!^^b4pWE6_ip-QY%XIGL%4~2z4G%bquK$C8<Su3Z;3VFiA~O$jQ%3S5PgE zj<x3HV!#x&tyW-A%_$A_(ScA3wIFp23<j(q$iTqKgz)<`Mg|5hCd68qWsD3AOiTy` z+ZY)boSB&68jdkCFgP(G0`D3^D_qU+W{5B_CNL#1C9o`DT0p?34*&myRR}XNv9Pjn zaBzr-vI_Hwu?jNDY3gWz0GMKB)f5-!Lk9dh%1k=^S{fP}!qPHKOsxD&;u>1QT2Lj* zd@>s1%BsQ|3?aS&40<XmDhvz^0vdUxIXRjP3?d?oBBCN9A|gx-BFrozoUAYa5`$uX zaefXF5fOF~F{pru2rrx^BEZGZ&(FanBElvj#LXunA}GRxkY^|;%FHWKC{9kyOH;5? xNXyAjEXmAEhh$uZG*H$oDOSkKFHy+J%*#$qfoDlxa8O+3y#<C0Oo!PS7y!xTr=0)* diff --git a/src/sbbs2/getnode.c b/src/sbbs2/getnode.c deleted file mode 100644 index fdfb3be4dc..0000000000 --- a/src/sbbs2/getnode.c +++ /dev/null @@ -1,248 +0,0 @@ -#line 1 "GETNODE.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -/****************************************************************************/ -/* Reads the data for node number 'number' into the structure 'node' */ -/* from NODE.DAB */ -/* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */ -/****************************************************************************/ -void getnodedat(uint number, node_t *node, char lockit) -{ - char str[256]; - int count=0; - -if(!(sys_status&SS_NODEDAB)) - return; -if(!number || number>sys_nodes) { - errormsg(WHERE,ERR_CHK,"node number",number); - return; } -number--; /* make zero based */ -while(count<LOOP_NODEDAB) { - if(count>10) - mswait(55); - lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); - if(lockit - && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) { - count++; - continue; } - if(read(nodefile,node,sizeof(node_t))==sizeof(node_t)) - break; - count++; } -if(count>(LOOP_NODEDAB/2) && count!=LOOP_NODEDAB) { - sprintf(str,"NODE.DAB COLLISION - Count: %d",count); - logline("!!",str); } -if(count==LOOP_NODEDAB) { - errormsg(WHERE,ERR_READ,"NODE.DAB",number+1); - return; } -} - -/****************************************************************************/ -/* Synchronizes all the nodes knowledge of the other nodes' actions, mode, */ -/* status and other flags. */ -/* Assumes that getnodedat(node_num,&thisnode,0) was called right before it */ -/* is called. */ -/****************************************************************************/ -void nodesync() -{ - static user_t user; - static int inside; - char str[256],today[32]; - int i,j,atr=curatr; /* was lclatr(-1) 01/29/96 */ - node_t node; - -if(inside) return; -inside=1; - -if(thisnode.action!=action) { - getnodedat(node_num,&thisnode,1); - thisnode.action=action; - putnodedat(node_num,thisnode); } - -criterrs=thisnode.errors; - -if(sys_status&SS_USERON) { - if(!(sys_status&SS_NEWDAY)) { - now=time(NULL); - unixtodstr(logontime,str); - unixtodstr(now,today); - if(strcmp(str,today)) { /* New day, clear "today" user vars */ - sys_status|=SS_NEWDAY; // So we don't keep doing this over&over - putuserrec(useron.number,U_ETODAY,5,"0"); - putuserrec(useron.number,U_PTODAY,5,"0"); - putuserrec(useron.number,U_TTODAY,5,"0"); - putuserrec(useron.number,U_LTODAY,5,"0"); - putuserrec(useron.number,U_TEXTRA,5,"0"); - putuserrec(useron.number,U_FREECDT,10 - ,ultoa(level_freecdtperday[useron.level],str,10)); - getuserdat(&useron); } } - if(thisnode.misc&NODE_UDAT && !(useron.rest&FLAG('G'))) { /* not guest */ - getuserdat(&useron); - getnodedat(node_num,&thisnode,1); - thisnode.misc&=~NODE_UDAT; - putnodedat(node_num,thisnode); } - if(thisnode.misc&NODE_MSGW) - getsmsg(useron.number); /* getsmsg clears MSGW flag */ - if(thisnode.misc&NODE_NMSG) - getnmsg(); } /* getnmsg clears NMSG flag */ - -if(sync_mod[0]) - exec_bin(sync_mod,&main_csi); - -if(thisnode.misc&NODE_INTR) { - bputs(text[NodeLocked]); - logline(nulstr,"Interrupted"); - hangup(); - inside=0; - return; } - -if(sys_status&SS_USERON && memcmp(&user,&useron,sizeof(user_t))) { -// lputc(7); - getusrdirs(); - getusrsubs(); - user=useron; } - -if(sys_status&SS_USERON && online && (timeleft/60)<(5-timeleft_warn) - && !SYSOP) { - timeleft_warn=5-(timeleft/60); - attr(LIGHTGRAY); - bprintf(text[OnlyXminutesLeft] - ,((ushort)timeleft/60)+1,(timeleft/60) ? "s" : nulstr); } - -attr(atr); /* replace original attributes */ -inside=0; -} - -/****************************************************************************/ -/* Prints short messages waiting for this node, if any... */ -/****************************************************************************/ -void getnmsg() -{ - char str[256], HUGE16 *buf; - int file; - long length; - -getnodedat(node_num,&thisnode,1); -thisnode.misc&=~NODE_NMSG; /* clear the NMSG flag */ -putnodedat(node_num,thisnode); - -#if 0 -/* Only for v1b rev 2-5 and XSDK v2.1x compatibility */ -sprintf(str,"%sMSGS\\N%3.3u.IXB",data_dir,node_num); -if((ixb=nopen(str,O_RDONLY))!=-1) { - read(ixb,&offset,4); - chsize(ixb,0L); - close(ixb); - remove(str); } -#endif - -sprintf(str,"%sMSGS\\N%3.3u.MSG",data_dir,node_num); -if(flength(str)<1L) - return; -if((file=nopen(str,O_RDWR))==-1) { - /** - errormsg(WHERE,ERR_OPEN,str,O_RDWR); - **/ - return; } -length=filelength(file); -if(!length) { - close(file); - return; } -if((buf=LMALLOC(length+1))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length+1); - return; } -if(lread(file,buf,length)!=length) { - close(file); - FREE(buf); - errormsg(WHERE,ERR_READ,str,length); - return; } -chsize(file,0L); -close(file); -buf[length]=0; - -if(thisnode.action==NODE_MAIN || thisnode.action==NODE_XFER - || sys_status&SS_IN_CTRLP) { - CRLF; } -putmsg(buf,P_NOATCODES); -LFREE(buf); -} - -/****************************************************************************/ -/* 'ext' must be at least 128 bytes! */ -/****************************************************************************/ -void getnodeext(uint number, char *ext) -{ - char str[256]; - int count=0; - -if(!(sys_status&SS_NODEDAB)) - return; -if(!number || number>sys_nodes) { - errormsg(WHERE,ERR_CHK,"node number",number); - return; } -number--; /* make zero based */ -while(count<LOOP_NODEDAB) { - if(count>10) - mswait(55); - if(lock(node_ext,(long)number*128L,128)==-1) { - count++; - continue; } - lseek(node_ext,(long)number*128L,SEEK_SET); - if(read(node_ext,ext,128)==128) - break; - count++; } -unlock(node_ext,(long)number*128L,128); -if(count>(LOOP_NODEDAB/2) && count!=LOOP_NODEDAB) { - sprintf(str,"NODE.EXB COLLISION - Count: %d",count); - logline("!!",str); } -if(count==LOOP_NODEDAB) { - errormsg(WHERE,ERR_READ,"NODE.EXB",number+1); - return; } -} - - -/****************************************************************************/ -/* Prints short messages waiting for 'usernumber', if any... */ -/* then deletes them. */ -/****************************************************************************/ -void getsmsg(int usernumber) -{ - char str[256], HUGE16 *buf; - int file; - long length; - -sprintf(str,"%sMSGS\\%4.4u.MSG",data_dir,usernumber); -if(flength(str)<1L) - return; -if((file=nopen(str,O_RDWR))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR); - return; } -length=filelength(file); -if((buf=LMALLOC(length+1))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length+1); - return; } -if(lread(file,buf,length)!=length) { - close(file); - FREE(buf); - errormsg(WHERE,ERR_READ,str,length); - return; } -chsize(file,0L); -close(file); -buf[length]=0; -getnodedat(node_num,&thisnode,0); -if(thisnode.action==NODE_MAIN || thisnode.action==NODE_XFER - || sys_status&SS_IN_CTRLP) { - CRLF; } -if(thisnode.misc&NODE_MSGW) { - getnodedat(node_num,&thisnode,1); - thisnode.misc&=~NODE_MSGW; - putnodedat(node_num,thisnode); } -putmsg(buf,P_NOATCODES); -LFREE(buf); -} - diff --git a/src/sbbs2/getuser.c b/src/sbbs2/getuser.c deleted file mode 100644 index 313dbce0b0..0000000000 --- a/src/sbbs2/getuser.c +++ /dev/null @@ -1,429 +0,0 @@ -#line 1 "GETUSER.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -/****************************************************************************/ -/* Fills the structure 'user' with info for user.number from USER.DAT */ -/* Called from functions useredit, waitforcall and main_sec */ -/****************************************************************************/ -void getuserdat(user_t *user) -{ - uchar userdat[U_LEN+1],str[U_LEN+1]; - int i,file; - -if(!user->number || user->number>lastuser()) { - memset(user,0L,sizeof(user_t)); - user->number=0; - return; } -sprintf(userdat,"%sUSER\\USER.DAT",data_dir); -if((file=nopen(userdat,O_RDONLY|O_DENYNONE))==-1) { - close(file); - memset(user,0L,sizeof(user_t)); - user->number=0; - return; } -lseek(file,(long)((long)(user->number-1)*U_LEN),SEEK_SET); -i=0; -while(i<LOOP_NODEDAB - && lock(file,(long)((long)(user->number-1)*U_LEN),U_LEN)==-1) { - if(i>10) - mswait(55); - i++; } - -if(i>=LOOP_NODEDAB) { - close(file); - errormsg(WHERE,ERR_LOCK,"USER.DAT",user->number); - memset(user,0L,sizeof(user_t)); - user->number=0; - return; } - -if(read(file,userdat,U_LEN)!=U_LEN) { - unlock(file,(long)((long)(user->number-1)*U_LEN),U_LEN); - close(file); - errormsg(WHERE,ERR_READ,"USER.DAT",U_LEN); - memset(user,0L,sizeof(user_t)); - user->number=0; - return; } - -unlock(file,(long)((long)(user->number-1)*U_LEN),U_LEN); -close(file); -getrec(userdat,U_ALIAS,LEN_ALIAS,user->alias); -/* order of these function */ -getrec(userdat,U_NAME,LEN_NAME,user->name); -/* calls is irrelevant */ -getrec(userdat,U_HANDLE,LEN_HANDLE,user->handle); -getrec(userdat,U_NOTE,LEN_NOTE,user->note); -getrec(userdat,U_COMP,LEN_COMP,user->comp); -getrec(userdat,U_COMMENT,LEN_COMMENT,user->comment); -getrec(userdat,U_NETMAIL,LEN_NETMAIL,user->netmail); -getrec(userdat,U_ADDRESS,LEN_ADDRESS,user->address); -getrec(userdat,U_LOCATION,LEN_LOCATION,user->location); -getrec(userdat,U_ZIPCODE,LEN_ZIPCODE,user->zipcode); -getrec(userdat,U_PASS,LEN_PASS,user->pass); -getrec(userdat,U_PHONE,LEN_PHONE,user->phone); -getrec(userdat,U_BIRTH,LEN_BIRTH,user->birth); -getrec(userdat,U_MODEM,LEN_MODEM,user->modem); -getrec(userdat,U_LASTON,8,str); user->laston=ahtoul(str); -getrec(userdat,U_FIRSTON,8,str); user->firston=ahtoul(str); -getrec(userdat,U_EXPIRE,8,str); user->expire=ahtoul(str); -getrec(userdat,U_PWMOD,8,str); user->pwmod=ahtoul(str); -getrec(userdat,U_NS_TIME,8,str); -user->ns_time=ahtoul(str); -if(user->ns_time<0x20000000L) - user->ns_time=user->laston; /* Fix for v2.00->v2.10 */ - -getrec(userdat,U_LOGONS,5,str); user->logons=atoi(str); -getrec(userdat,U_LTODAY,5,str); user->ltoday=atoi(str); -getrec(userdat,U_TIMEON,5,str); user->timeon=atoi(str); -getrec(userdat,U_TEXTRA,5,str); user->textra=atoi(str); -getrec(userdat,U_TTODAY,5,str); user->ttoday=atoi(str); -getrec(userdat,U_TLAST,5,str); user->tlast=atoi(str); -getrec(userdat,U_POSTS,5,str); user->posts=atoi(str); -getrec(userdat,U_EMAILS,5,str); user->emails=atoi(str); -getrec(userdat,U_FBACKS,5,str); user->fbacks=atoi(str); -getrec(userdat,U_ETODAY,5,str); user->etoday=atoi(str); -getrec(userdat,U_PTODAY,5,str); user->ptoday=atoi(str); -getrec(userdat,U_ULB,10,str); user->ulb=atol(str); -getrec(userdat,U_ULS,5,str); user->uls=atoi(str); -getrec(userdat,U_DLB,10,str); user->dlb=atol(str); -getrec(userdat,U_DLS,5,str); user->dls=atoi(str); -getrec(userdat,U_CDT,10,str); user->cdt=atol(str); -getrec(userdat,U_MIN,10,str); user->min=atol(str); -getrec(userdat,U_LEVEL,2,str); user->level=atoi(str); -getrec(userdat,U_FLAGS1,8,str); user->flags1=ahtoul(str); /*** -getrec(userdat,U_TL,2,str); user->tl=atoi(str); ***/ -getrec(userdat,U_FLAGS2,8,str); user->flags2=ahtoul(str); -getrec(userdat,U_FLAGS3,8,str); user->flags3=ahtoul(str); -getrec(userdat,U_FLAGS4,8,str); user->flags4=ahtoul(str); -getrec(userdat,U_EXEMPT,8,str); user->exempt=ahtoul(str); -getrec(userdat,U_REST,8,str); user->rest=ahtoul(str); -getrec(userdat,U_ROWS,2,str); user->rows=atoi(str); -if(user->rows && user->rows<10) - user->rows=10; -user->sex=userdat[U_SEX]; -if(!user->sex) - user->sex=SP; /* fix for v1b04 that could save as 0 */ -user->prot=userdat[U_PROT]; -if(user->prot<SP) - user->prot=SP; -getrec(userdat,U_MISC,8,str); user->misc=ahtoul(str); -if(user->rest&FLAG('Q')) - user->misc&=~SPIN; - -getrec(userdat,U_LEECH,2,str); -user->leech=(uchar)ahtoul(str); -getrec(userdat,U_CURSUB,8,useron.cursub); -getrec(userdat,U_CURDIR,8,useron.curdir); - -getrec(userdat,U_FREECDT,10,str); -user->freecdt=atol(str); - -getrec(userdat,U_XEDIT,8,str); -for(i=0;i<total_xedits;i++) - if(!stricmp(str,xedit[i]->code) && chk_ar(xedit[i]->ar,*user)) - break; -user->xedit=i+1; -if(user->xedit>total_xedits) - user->xedit=0; - -getrec(userdat,U_SHELL,8,str); -for(i=0;i<total_shells;i++) - if(!stricmp(str,shell[i]->code)) - break; -if(i==total_shells) - i=0; -user->shell=i; - -getrec(userdat,U_QWK,8,str); -if(str[0]<SP) { /* v1c, so set defaults */ - if(user->rest&FLAG('Q')) - user->qwk=(QWK_RETCTLA); - else - user->qwk=(QWK_FILES|QWK_ATTACH|QWK_EMAIL|QWK_DELMAIL); } -else - user->qwk=ahtoul(str); - -getrec(userdat,U_TMPEXT,3,user->tmpext); -if((!user->tmpext[0] || !strcmp(user->tmpext,"0")) && total_fcomps) - strcpy(user->tmpext,fcomp[0]->ext); /* For v1x to v2x conversion */ - -getrec(userdat,U_CHAT,8,str); -user->chat=ahtoul(str); - -if(useron.number==user->number) { - useron=*user; - - if(online) { - -#if 0 - getusrdirs(); - getusrsubs(); -#endif - if(useron.misc&AUTOTERM) { - useron.misc&=~(ANSI|RIP|WIP); - useron.misc|=autoterm; } - statusline(); } } -} - - -/****************************************************************************/ -/* Returns the username in 'str' that corresponds to the 'usernumber' */ -/* Called from functions everywhere */ -/****************************************************************************/ -char *username(int usernumber,char *strin) -{ - char str[256]; - char c; - int file; - -if(usernumber<1) { - strin[0]=0; - return(strin); } -sprintf(str,"%sUSER\\NAME.DAT",data_dir); -if(flength(str)<1L) { - strin[0]=0; - return(strin); } -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - strin[0]=0; - return(strin); } -if(filelength(file)<(long)((long)usernumber*(LEN_ALIAS+2))) { - close(file); - strin[0]=0; - return(strin); } -lseek(file,(long)((long)(usernumber-1)*(LEN_ALIAS+2)),SEEK_SET); -read(file,strin,LEN_ALIAS); -close(file); -for(c=0;c<LEN_ALIAS;c++) - if(strin[c]==ETX) break; -strin[c]=0; -if(!c) - strcpy(strin,"DELETED USER"); -return(strin); -} - -/****************************************************************************/ -/* Fills the timeleft variable with the correct value. Hangs up on the */ -/* user if their time is up. */ -/* Called from functions main_sec and xfer_sec */ -/****************************************************************************/ -void gettimeleft(void) -{ - static inside; - char str[128]; - int i; - time_t eventtime=0,thisevent; - long tleft; - struct date lastdate; - struct tm *gm; - -now=time(NULL); - -gm=localtime(&now); -if(useron.exempt&FLAG('T')) { /* Time online exemption */ - timeleft=level_timepercall[useron.level]*60; - if(timeleft<10) /* never get below 10 for exempt users */ - timeleft=10; } -else { - tleft=(((long)level_timeperday[useron.level]-useron.ttoday) - +useron.textra)*60L; - if(tleft<0) tleft=0; - if(tleft>level_timepercall[useron.level]*60) - tleft=level_timepercall[useron.level]*60; - tleft+=useron.min*60L; - tleft-=now-starttime; - if(tleft>0x7fffL) - timeleft=0x7fff; - else - timeleft=tleft; } - -/* Timed event time reduction handler */ - -for(i=0;i<total_events;i++) { - if(!event[i]->node || event[i]->node>sys_nodes) - continue; - if(!(event[i]->misc&EVENT_FORCE) - || (!(event[i]->misc&EVENT_EXCL) && event[i]->node!=node_num) - || !(event[i]->days&(1<<gm->tm_wday))) - continue; - unixtodos(event[i]->last,&lastdate,&curtime); - unixtodos(now,&date,&curtime); - curtime.ti_hour=event[i]->time/60; /* hasn't run yet today */ - curtime.ti_min=event[i]->time-(curtime.ti_hour*60); - curtime.ti_sec=0; - thisevent=dostounix(&date,&curtime); - if(date.da_day==lastdate.da_day && date.da_mon==lastdate.da_mon) - thisevent+=24L*60L*60L; /* already ran today, so add 24hrs */ - if(!eventtime || thisevent<eventtime) - eventtime=thisevent; } -if(eventtime && now+timeleft>eventtime) { /* less time, set flag */ - sys_status|=SS_EVENT; - timeleft=eventtime-now; } - -/* Event time passed by front-end */ -if(next_event && (next_event<now || next_event-now<timeleft)) { - timeleft=next_event-now; - sys_status|=SS_EVENT; } - -if(timeleft<0) /* timeleft can't go negative */ - timeleft=0; -if(thisnode.status==NODE_NEWUSER) { - timeleft=level_timepercall[new_level]; - if(timeleft<10*60L) - timeleft=10*60L; } - -if(inside) /* The following code is not recursive */ - return; -inside=1; - -if(!timeleft && !SYSOP && !(sys_status&SS_LCHAT)) { - logline(nulstr,"Ran out of time"); - SAVELINE; - bputs(text[TimesUp]); - if(!(sys_status&(SS_EVENT|SS_USERON)) && useron.cdt>=100L*1024L - && !(sys_misc&SM_NOCDTCVT)) { - sprintf(tmp,text[Convert100ktoNminQ],cdt_min_value); - if(yesno(tmp)) { - logline(" ","Credit to Minute Conversion"); - useron.min=adjustuserrec(useron.number,U_MIN,10,cdt_min_value); - useron.cdt=adjustuserrec(useron.number,U_CDT,10,-(102400L)); - sprintf(str,"Credit Adjustment: %ld",-(102400L)); - logline("$-",str); - sprintf(str,"Minute Adjustment: %u",cdt_min_value); - logline("*+",str); - RESTORELINE; - gettimeleft(); - inside=0; - return; } } - if(sys_misc&SM_TIME_EXP && !(sys_status&SS_EVENT) - && !(useron.exempt&FLAG('E'))) { - /* set to expired values */ - bputs(text[AccountHasExpired]); - sprintf(str,"%s Expired",useron.alias); - logentry("!%",str); - if(level_misc[useron.level]&LEVEL_EXPTOVAL - && level_expireto[useron.level]<10) { - useron.flags1=val_flags1[level_expireto[useron.level]]; - useron.flags2=val_flags2[level_expireto[useron.level]]; - useron.flags3=val_flags3[level_expireto[useron.level]]; - useron.flags4=val_flags4[level_expireto[useron.level]]; - useron.exempt=val_exempt[level_expireto[useron.level]]; - useron.rest=val_rest[level_expireto[useron.level]]; - if(val_expire[level_expireto[useron.level]]) - useron.expire=now - +(val_expire[level_expireto[useron.level]]*24*60*60); - else - useron.expire=0; - useron.level=val_level[level_expireto[useron.level]]; } - else { - if(level_misc[useron.level]&LEVEL_EXPTOLVL) - useron.level=level_expireto[useron.level]; - else - useron.level=expired_level; - useron.flags1&=~expired_flags1; /* expired status */ - useron.flags2&=~expired_flags2; /* expired status */ - useron.flags3&=~expired_flags3; /* expired status */ - useron.flags4&=~expired_flags4; /* expired status */ - useron.exempt&=~expired_exempt; - useron.rest|=expired_rest; - useron.expire=0; } - putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,str,10)); - putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,str,16)); - putuserrec(useron.number,U_FLAGS2,8,ultoa(useron.flags2,str,16)); - putuserrec(useron.number,U_FLAGS3,8,ultoa(useron.flags3,str,16)); - putuserrec(useron.number,U_FLAGS4,8,ultoa(useron.flags4,str,16)); - putuserrec(useron.number,U_EXPIRE,8,ultoa(useron.expire,str,16)); - putuserrec(useron.number,U_EXEMPT,8,ultoa(useron.exempt,str,16)); - putuserrec(useron.number,U_REST,8,ultoa(useron.rest,str,16)); - if(expire_mod[0]) - exec_bin(expire_mod,&main_csi); - RESTORELINE; - gettimeleft(); - inside=0; - return; } - SYNC; - hangup(); } -inside=0; -} - -/****************************************************************************/ -/* Places into 'strout' CR or ETX terminated string starting at */ -/* 'start' and ending at 'start'+'length' or terminator from 'strin' */ -/****************************************************************************/ -void getrec(char *strin,int start,int length,char *strout) -{ - int i=0,stop; - -stop=start+length; -while(start<stop) { - if(strin[start]==ETX || strin[start]==CR || strin[start]==LF) - break; - strout[i++]=strin[start++]; } -strout[i]=0; -} - -/****************************************************************************/ -/* Places into 'strout', 'strin' starting at 'start' and ending at */ -/* 'start'+'length' */ -/****************************************************************************/ -void putrec(char *strout,int start,int length,char *strin) -{ - int i=0,j; - -j=strlen(strin); -while(i<j && i<length) - strout[start++]=strin[i++]; -while(i++<length) - strout[start++]=ETX; -} - - -/****************************************************************************/ -/* Returns the age derived from the string 'birth' in the format MM/DD/YY */ -/* Called from functions statusline, main_sec, xfer_sec, useredit and */ -/* text files */ -/****************************************************************************/ -char getage(char *birth) -{ - char age; - -if(!atoi(birth) || !atoi(birth+3)) /* Invalid */ - return(0); -getdate(&date); -age=(date.da_year-1900)-(((birth[6]&0xf)*10)+(birth[7]&0xf)); -if(age>90) - age-=90; -if(sys_misc&SM_EURODATE) { /* DD/MM/YY format */ - if(atoi(birth)>31 || atoi(birth+3)>12) - return(0); - if(((birth[3]&0xf)*10)+(birth[4]&0xf)>date.da_mon || - (((birth[3]&0xf)*10)+(birth[4]&0xf)==date.da_mon && - ((birth[0]&0xf)*10)+(birth[1]&0xf)>date.da_day)) - age--; } -else { /* MM/DD/YY format */ - if(atoi(birth)>12 || atoi(birth+3)>31) - return(0); - if(((birth[0]&0xf)*10)+(birth[1]&0xf)>date.da_mon || - (((birth[0]&0xf)*10)+(birth[1]&0xf)==date.da_mon && - ((birth[3]&0xf)*10)+(birth[4]&0xf)>date.da_day)) - age--; } -if(age<0) - return(0); -return(age); -} - - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - diff --git a/src/sbbs2/initdata.c b/src/sbbs2/initdata.c deleted file mode 100644 index c02305fd6d..0000000000 --- a/src/sbbs2/initdata.c +++ /dev/null @@ -1,239 +0,0 @@ -#line 1 "INITDATA.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/**************************************************************************/ -/* This file contains the function initdata() and its exclusive functions */ -/**************************************************************************/ - -#include "sbbs.h" - -/****************************************************************/ -/* Prototypes of functions that are called only by initdata() */ -/****************************************************************/ -void md(char *path); -char *readtext(long *line, FILE *stream); - -/****************************************************************************/ -/* Initializes system and node configuration information and data variables */ -/****************************************************************************/ -void initdata() -{ - char str[256],str2[LEN_ALIAS+1],fname[13]; - int file; - uint i,j; - long l,line=0L; - FILE *instream; - read_cfg_text_t txt; - -txt.openerr="\7\r\nError opening %s for read.\r\n"; -txt.reading="\r\nReading %s..."; -txt.readit="\rRead %s "; -txt.allocerr="\7\r\nError allocating %u bytes of memory\r\n"; -txt.error="\7\r\nERROR: Offset %lu in %s\r\n\r\n"; - -read_node_cfg(txt); -read_main_cfg(txt); -read_msgs_cfg(txt); -read_file_cfg(txt); -read_xtrn_cfg(txt); -read_chat_cfg(txt); -read_attr_cfg(txt); - -strcpy(fname,"TEXT.DAT"); -sprintf(str,"%s%s",ctrl_dir,fname); -if((instream=fnopen(&file,str,O_RDONLY))==NULL) { - lprintf(txt.openerr,str); - bail(1); } -lprintf(txt.reading,fname); -for(i=0;i<TOTAL_TEXT && !feof(instream) && !ferror(instream);i++) - if((text[i]=text_sav[i]=readtext(&line,instream))==NULL) - i--; -if(i<TOTAL_TEXT) { - lprintf(txt.error,line,fname); - lprintf("Less than TOTAL_TEXT (%u) strings defined in %s\r\n" - ,TOTAL_TEXT,fname); - bail(1); } -/****************************/ -/* Read in static text data */ -/****************************/ -fclose(instream); -lprintf(txt.readit,fname); - -strcpy(str,temp_dir); -if(strcmp(str+1,":\\")) /* not root directory */ - str[strlen(str)-1]=0; /* chop off '\' */ -md(str); - -for(i=0;i<=sys_nodes;i++) { - sprintf(str,"%sDSTS.DAB",i ? node_path[i-1] : ctrl_dir); - if(flength(str)<DSTSDABLEN) { - if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - lprintf("\7\r\nError creating %s\r\n",str); - bail(1); } - while(filelength(file)<DSTSDABLEN) - if(write(file,"\0",1)!=1) - break; /* Create NULL system dsts.dab */ - close(file); } } - -j=0; -sprintf(str,"%sUSER\\USER.DAT",data_dir); -if((l=flength(str))>0L) { - if(l%U_LEN) { - lprintf("\7\r\n%s is not evenly divisable by U_LEN (%d)\r\n" - ,str,U_LEN); - bail(1); } - j=lastuser(); } -if(node_valuser>j) /* j still equals last user */ - node_valuser=1; -sys_status|=SS_INITIAL; -#ifdef __MSDOS__ -freedosmem=farcoreleft(); -#endif -} - -/****************************************************************************/ -/* If the directory 'path' doesn't exist, create it. */ -/****************************************************************************/ -void md(char *path) -{ - struct ffblk ff; - -if(findfirst(path,&ff,FA_DIREC)) { - lprintf("\r\nCreating Directory %s... ",path); - if(mkdir(path)) { - lprintf("\7failed!\r\nFix configuration or make directory by " - "hand.\r\n"); - bail(1); } - lputs(crlf); } -} - -/****************************************************************************/ -/* Reads special TEXT.DAT printf style text lines, splicing multiple lines, */ -/* replacing escaped characters, and allocating the memory */ -/****************************************************************************/ -char *readtext(long *line,FILE *stream) -{ - char buf[2048],str[2048],*p,*p2; - int i,j,k; - -if(!fgets(buf,256,stream)) - return(NULL); -if(line) - (*line)++; -if(buf[0]=='#') - return(NULL); -p=strrchr(buf,'"'); -if(!p) { - if(line) { - lprintf("\7\r\nNo quotation marks in line %d of TEXT.DAT\r\n",*line); - bail(1); } - return(NULL); } -if(*(p+1)=='\\') /* merge multiple lines */ - while(strlen(buf)<2000) { - if(!fgets(str,255,stream)) - return(NULL); - if(line) - (*line)++; - p2=strchr(str,'"'); - if(!p2) - continue; - strcpy(p,p2+1); - p=strrchr(p,'"'); - if(p && *(p+1)=='\\') - continue; - break; } -*(p)=0; -k=strlen(buf); -for(i=1,j=0;i<k;j++) { - if(buf[i]=='\\') { /* escape */ - i++; - if(isdigit(buf[i])) { - str[j]=atoi(buf+i); /* decimal, NOT octal */ - if(isdigit(buf[++i])) /* skip up to 3 digits */ - if(isdigit(buf[++i])) - i++; - continue; } - switch(buf[i++]) { - case '\\': - str[j]='\\'; - break; - case '?': - str[j]='?'; - break; - case 'x': - tmp[0]=buf[i++]; /* skip next character */ - tmp[1]=0; - if(isxdigit(buf[i])) { /* if another hex digit, skip too */ - tmp[1]=buf[i++]; - tmp[2]=0; } - str[j]=(char)ahtoul(tmp); - break; - case '\'': - str[j]='\''; - break; - case '"': - str[j]='"'; - break; - case 'r': - str[j]=CR; - break; - case 'n': - str[j]=LF; - break; - case 't': - str[j]=TAB; - break; - case 'b': - str[j]=BS; - break; - case 'a': - str[j]=7; /* BEL */ - break; - case 'f': - str[j]=FF; - break; - case 'v': - str[j]=11; /* VT */ - break; - default: - str[j]=buf[i]; - break; } - continue; } - str[j]=buf[i++]; } -str[j]=0; -if((p=(char *)MALLOC(j+1))==NULL) { - lprintf("\7\r\nError allocating %u bytes of memory from TEXT.DAT\r\n",j); - bail(1); } -strcpy(p,str); -return(p); -} - -/****************************************************************************/ -/* Reads in ATTR.CFG and initializes the associated variables */ -/****************************************************************************/ -void read_attr_cfg(read_cfg_text_t txt) -{ - char str[256],fname[13]; - int file,i; - long offset=0; - FILE *instream; - -strcpy(fname,"ATTR.CFG"); -sprintf(str,"%s%s",ctrl_dir,fname); -if((instream=fnopen(&file,str,O_RDONLY))==NULL) { - lprintf(txt.openerr,str); - bail(1); } -lprintf(txt.reading,fname); -for(i=0;i<TOTAL_COLORS && !feof(instream) && !ferror(instream);i++) { - readline(&offset,str,4,instream); - color[i]=attrstr(str); } -if(i<TOTAL_COLORS) { - lprintf(txt.error,offset,fname); - lprintf("Less than TOTAL_COLORS (%u) defined in %s\r\n" - ,TOTAL_COLORS,fname); - bail(1); } -fclose(instream); -lprintf(txt.readit,fname); -} - diff --git a/src/sbbs2/install/install.c b/src/sbbs2/install/install.c deleted file mode 100644 index bb24972c03..0000000000 --- a/src/sbbs2/install/install.c +++ /dev/null @@ -1,1048 +0,0 @@ -/* install.c */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Synchronet BBS Installation program */ - -unsigned int _stklen=0x8000; - -#include <io.h> -#include <dir.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <process.h> -#include <errno.h> -#include "uifc.h" - -/* OS Specific */ -#if defined(__FLAT__) // 32-bit - #define FAR16 - #define HUGE16 - #define lread(f,b,l) read(f,b,l) - #define lfread(b,l,f) fread(b,l,f) - #define lwrite(f,b,l) write(f,b,l) - #define lfwrite(b,l,f) fwrite(b,l,f) -#else // 16-bit - #define FAR16 far - #define HUGE16 huge -#endif - -void bail(int code); - -char **opt; - -#define EXEC (1<<1) -#define CFGS (1<<2) -#define TEXT (1<<3) -#define DOCS (1<<4) - -#define DISK1 (EXEC|CFGS|TEXT|DOCS) - -#define UTIL (1<<10) -#define XTRN (1<<11) -#define XSDK (1<<12) - -#define DISK2 (UTIL|XTRN|XSDK) - -#define UPGRADE (1<<13) - -#define LOOP_NOPEN 100 - -int mode=(DISK1|DISK2); - -enum { /* Upgrade FROM version */ - NONE - ,SBBS20 - ,SBBS21 - ,SBBS22 - ,SBBS23 - }; - -char tmp[256]; -char install_to[129],install_from[256]; - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} - - -/****************************************************************************/ -/* If the directory 'path' doesn't exist, create it. */ -/* returns 1 if successful, 0 otherwise */ -/****************************************************************************/ -int md(char *path) -{ - char str[128]; - struct ffblk ff; - -if(strlen(path)<2) { - umsg("Invalid path"); - return(0); } -strcpy(str,path); -if(strcmp(str+1,":\\") && str[strlen(str)-1]=='\\') - str[strlen(str)-1]=0; /* Chop of \ if not root directory */ -if(findfirst(str,&ff,FA_DIREC)) { - if(mkdir(str)) { - sprintf(str,"Unable to Create Directory '%s'",path); - umsg(str); - return(0); } } -return(1); -} - -long fdate_dir(char *filespec) -{ - struct ffblk f; - struct date fd; - struct time ft; - -if(findfirst(filespec,&f,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC)==0) { - fd.da_day=f.ff_fdate&0x1f; - fd.da_mon=(f.ff_fdate>>5)&0xf; - fd.da_year=1980+((f.ff_fdate>>9)&0x7f); - ft.ti_hour=0; - ft.ti_min=0; - ft.ti_sec=0; - return(dostounix(&fd,&ft)); } -else return(0); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(f.ff_fsize); -return(-1L); -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC)==0) - return(1); -return(0); -} - -#ifndef __OS2__ -/****************************************************************************/ -/* This function reads files that are potentially larger than 32k. */ -/* Up to one megabyte of data can be read with each call. */ -/****************************************************************************/ -long lread(int file, char huge *buf,long bytes) -{ - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(read(file,(char *)buf,32767)!=32767) - return(-1L); -if(read(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} - -/****************************************************************************/ -/* This function writes files that are potentially larger than 32767 bytes */ -/* Up to one megabytes of data can be written with each call. */ -/****************************************************************************/ -long lwrite(int file, char huge *buf, long bytes) -{ - - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(write(file,(char *)buf,32767)!=32767) - return(-1L); -if(write(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} -#endif - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access==O_RDONLY) share=O_DENYWRITE; - else share=O_DENYALL; -while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - cputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -int copy(char *src, char *dest) -{ - char c,HUGE16 *buf,str[256],str2[128],*scrnsave; - int in,out; - long length,chunk,l; - struct ftime ftime; - -if(!strcmp(src,dest)) /* copy from and to are same, so return */ - return(0); - -if((scrnsave=MALLOC(scrn_len*80*2))==NULL) - return(-1); -hidemouse(); -gettext(1,1,80,scrn_len,scrnsave); - -#define width 72 -#define top 10 -#define left 0 - -sprintf(str2,"Copying %s to %s...",src,dest); -sprintf(str," %-64.64s",str2); /* Make sure it's no more than 60 */ - -gotoxy(SCRN_LEFT+left,SCRN_TOP+top); -textattr(hclr|(bclr<<4)); -putch('�'); -for(c=1;c<width-1;c++) - putch('�'); -putch('�'); -gotoxy(SCRN_LEFT+left,SCRN_TOP+top+1); -putch('�'); -textattr(lclr|(bclr<<4)); -cprintf("%-*.*s",width-2,width-2,str); -gotoxy(SCRN_LEFT+left+(width-1),SCRN_TOP+top+1); -textattr(hclr|(bclr<<4)); -putch('�'); -gotoxy(SCRN_LEFT+left,SCRN_TOP+top+2); -putch('�'); -for(c=1;c<width-1;c++) - putch('�'); -putch('�'); -gotoxy(SCRN_LEFT+left+(width-5),SCRN_TOP+top+1); -textattr(lclr|(bclr<<4)); - -if((in=nopen(src,O_RDONLY))==-1) { - cprintf("\r\nERR_OPEN %s",src); - getch(); - puttext(1,1,80,scrn_len,scrnsave); - FREE(scrnsave); - showmouse(); - return(-1); } -if((out=nopen(dest,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - close(in); - sprintf(str,"ERROR OPENING %s",dest); - umsg(str); - puttext(1,1,80,scrn_len,scrnsave); - FREE(scrnsave); - showmouse(); - return(-1); } -length=filelength(in); -if(!length) { - close(in); - close(out); - sprintf(str,"ZERO LENGTH %s",src); - umsg(str); - puttext(1,1,80,scrn_len,scrnsave); - showmouse(); - FREE(scrnsave); - return(-1); } -#if __OS2__ -chunk=1000000; -#else -chunk=0x8000; /* use 32k chunks */ -#endif -if(chunk>length) /* leave space for stack expansion */ - chunk=length; -if((buf=MALLOC(chunk))==NULL) { - close(in); - close(out); - sprintf(str,"ERROR ALLOC %s %lu",src,chunk); - umsg(str); - puttext(1,1,80,scrn_len,scrnsave); - FREE(scrnsave); - showmouse(); - return(-1); } -l=0L; -while(l<length) { - cprintf("%2lu%%",l ? (long)(100.0/((float)length/l)) : 0L); - if(l+chunk>length) - chunk=length-l; - lread(in,buf,chunk); - lwrite(out,buf,chunk); - l+=chunk; - cputs("\b\b\b"); - } -// cputs(" \b\b\b"); /* erase it */ -FREE((char *)buf); -getftime(in,&ftime); -setftime(out,&ftime); -close(in); -close(out); -puttext(1,1,80,scrn_len,scrnsave); -FREE(scrnsave); -showmouse(); -return(0); -} - -int unarc(int timestamp, char *src, char *dir, char *arg) -{ - int i,atr; - char str[128],cmd[128],*scrnsave; - -if((scrnsave=MALLOC((scrn_len+1)*80*2))==NULL) - return(-1); -hidemouse(); -gettext(1,1,80,scrn_len+1,scrnsave); -//lclini(scrn_len+1); -textattr(LIGHTGRAY); -clrscr(); -sprintf(cmd,"%sLHA.EXE",install_from); -sprintf(str,"/c%d",timestamp); -i=spawnlp(P_WAIT,cmd,cmd,"x",str,"/s","/m1",src,dir,arg,NULL); -if(i==-1) { - printf("\r\nCannot execute %s. Hit any key to continue.",cmd); - getch(); } -else if(i) { - printf("\r\n%s returned error level %d. Hit any key to continue.",cmd,i); - getch(); } -clrscr(); -puttext(1,1,80,scrn_len+1,scrnsave); -showmouse(); -FREE(scrnsave); -//lclini(scrn_len); -//textattr(atr); -return(i); -} - - -void main(int argc, char **argv) -{ - int i,j,k,ver; - long l; - char str[128],*p; - char text_dir[64],docs_dir[64],exec_dir[64],ctrl_dir[64]; - struct text_info txt; - struct ffblk ff; - -timezone=0; -daylight=0; -uifcini(); -if(argc>1) { /* user specified install path */ - sprintf(install_to,"%.20s",argv[1]); - strupr(install_to); - if(strlen(install_to)==1) { - if(!isalpha(install_to[0])) { - cprintf("\7\r\nInvalid install path - '%s'\r\n",install_to); - bail(1); } - strcat(install_to,":"); } - backslash(install_to); - if(strlen(install_to)<4) /* user says C, C:, or C:\, make C:\SBBS */ - strcat(install_to,"SBBS\\"); } -else - strcpy(install_to,"C:\\SBBS\\"); - -strcpy(install_from,argv[0]); -strupr(install_from); -p=strrchr(install_from,'\\'); -if(p) - *(p+1)=0; -else { /* incase of A:INSTALL */ - p=strchr(install_from,':'); - if(p) - *(p+1)=0; } - -if((opt=(char **)MALLOC(sizeof(char *)*MAX_OPTS))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } -for(i=0;i<MAX_OPTS;i++) - if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } - -/*** -if(findfirst("MENU.ZIP",&ff,0)) { - cprintf("\7\r\nCan't find MENU.ZIP\r\n"); - bail(1); } -if(findfirst("TEXT.ZIP",&ff,0)) { - cprintf("\7\r\nCan't find TEXT.ZIP\r\n"); - bail(1); } -if(findfirst("DOCS.ZIP",&ff,0)) { - cprintf("\7\r\nCan't find DOCS.ZIP\r\n"); - bail(1); } -if(findfirst("EXEC.ZIP",&ff,0)) { - cprintf("\7\r\nCan't find EXEC.ZIP\r\n"); - bail(1); } -if(findfirst("PKUNZIP.EXE",&ff,0)) { - cprintf("\7\r\nCan't find PKUNZIP.EXE\r\n"); - bail(1); } -***/ -uscrn("Synchronet Installation Utility Version 2.3"); - -i=0; -while(1) { - - helpbuf= -" Synchronet Installation \r\n\r\n" -"If you are installing Synchronet for evaluation or demonstration\r\n" -"purposes, be sure to set Install Registration Key to No.\r\n\r\n" -"If do not have the Synchronet Utilities Disk (Distribution Disk 2), be\r\n" -"sure to set Install Distribution Disk 2 to None.\r\n\r\n" -"When you are happy with the installation settings and the destination\r\n" -"path, select Start Installation to continue or hit ESC to abort."; - - j=0; - str[0]=0; - if((mode&DISK1)==DISK1) - strcpy(str,"All"); - else { - if(!(mode&DISK1)) - strcpy(str,"None"); - else { - strcat(str,"Selected: "); - if(mode&EXEC) - strcat(str,"EXEC "); - if(mode&CFGS) - strcat(str,"CFGS "); - if(mode&TEXT) - strcat(str,"TEXT "); - if(mode&DOCS) - strcat(str,"DOCS "); } } - sprintf(opt[j++],"%-30.30s%s","Install Distribution Disk 1",str); - str[0]=0; - if((mode&DISK2)==DISK2) - strcpy(str,"All"); - else { - if(!(mode&DISK2)) - strcpy(str,"None"); - else { - strcat(str,"Selected: "); - if(mode&UTIL) - strcat(str,"UTIL "); - if(mode&XTRN) - strcat(str,"XTRN "); - if(mode&XSDK) - strcat(str,"XSDK "); } } - sprintf(opt[j++],"%-30.30s%s","Install Distribution Disk 2",str); - sprintf(opt[j++],"%-30.30s%s","Source Path",install_from); - sprintf(opt[j++],"%-30.30s%s","Target Path",install_to); - strcpy(opt[j++],"Start Installation"); - opt[j][0]=0; - switch(ulist(WIN_ORG|WIN_MID|WIN_ACT|WIN_ESC,0,0,60,&i,0 - ,"Synchronet Multinode BBS Installation",opt)) { - case 0: - j=0; - while(1) { - k=0; - sprintf(opt[k++],"%-30.30s%3s","Main Executables" - ,mode&EXEC ? "Yes":"No"); - sprintf(opt[k++],"%-30.30s%3s","Default Configuration" - ,mode&CFGS ? "Yes":"No"); - sprintf(opt[k++],"%-30.30s%3s","Text and Menus" - ,mode&TEXT ? "Yes":"No"); - sprintf(opt[k++],"%-30.30s%3s","Documentation" - ,mode&DOCS ? "Yes":"No"); - strcpy(opt[k++],"All"); - strcpy(opt[k++],"None"); - opt[k][0]=0; -helpbuf= -" Distribution Disk 1 \r\n\r\n" -"If you are a installing Synchronet for the first time, it is suggested\r\n" -"that you install All of Disk 1.\r\n\r\n" -"If for some reason, you wish to partially install Synchronet or update\r\n" -"a previously installed version, you can toggle the installation of the\r\n" -"following file sets:\r\n\r\n" -"EXEC: Main executable files necessary for Synchronet to run\r\n\r\n" -"CFGS: Default configuration files\r\n\r\n" -"TEXT: Text and menu files\r\n\r\n" -"DOCS: Online ASCII documentation for the system operator"; - j=ulist(0,0,0,0,&j,0,"Distribution Disk 1",opt); - if(j==-1) - break; - switch(j) { - case 0: - mode^=EXEC; - break; - case 1: - mode^=CFGS; - break; - case 2: - mode^=TEXT; - break; - case 3: - mode^=DOCS; - break; - case 4: - mode|=DISK1; - break; - case 5: - mode&=~DISK1; - break; } } - break; - case 1: - j=0; - while(1) { - k=0; - sprintf(opt[k++],"%-30.30s%3s","Utilities" - ,mode&UTIL ? "Yes":"No"); - sprintf(opt[k++],"%-30.30s%3s","Online External Programs" - ,mode&XTRN ? "Yes":"No"); - sprintf(opt[k++],"%-30.30s%3s","External Program SDK" - ,mode&XSDK ? "Yes":"No"); - strcpy(opt[k++],"All"); - strcpy(opt[k++],"None"); - opt[k][0]=0; -helpbuf= -" Distribution Disk 2 \r\n\r\n" -"This disk is optional for the execution of Synchronet. This disk is\r\n" -"also referred to as the Synchronet Utilities Disk.\r\n\r\n" -"If for some reason, you wish to partially install Synchronet or update\r\n" -"a previously installed version, you can toggle the installation of the\r\n" -"following file sets:\r\n\r\n" -"UTIL: Utilities to enhance the operation of Synchronet\r\n\r\n" -"XTRN: Online External Program Samples\r\n\r\n" -"XSDK: External Program Software Development Kit (for programmers)"; - j=ulist(WIN_RHT,0,0,0,&j,0,"Distribution Disk 2",opt); - if(j==-1) - break; - switch(j) { - case 0: - mode^=UTIL; - break; - case 1: - mode^=XTRN; - break; - case 2: - mode^=XSDK; - break; - case 3: - mode|=DISK2; - break; - case 4: - mode&=~DISK2; - break; } } - break; - case 2: -helpbuf= -" Source Path \r\n\r\n" -"This is the complete path (drive and directory) to install Synchronet\r\n" -"from. The suggested path is A:\\, but any valid DOS drive and\r\n" -"directory may be used."; - uinput(WIN_L2R,0,0,"Source Path",install_from - ,30,K_EDIT|K_UPPER); - backslash(install_from); - break; - case 3: -helpbuf= -" Target Path \r\n\r\n" -"This is the complete path (drive and directory) to install Synchronet\r\n" -"to. The suggested path is C:\\SBBS\\, but any valid DOS drive and\r\n" -"directory may be used."; - uinput(WIN_L2R|WIN_BOT,0,0,"Target Path",install_to - ,20,K_EDIT|K_UPPER); - backslash(install_to); - break; - case 4: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - j=1; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Are you upgrading from an older version (already installed)" - ,opt); - if(j==-1) - break; - if(j==0) { - helpbuf= -" Upgrade Back-up \r\n" -"\r\n" -"INSTALL will take care to only overwrite files that have been changed\r\n" -"in this new version, but it is always a good idea to do a complete\r\n" -"system back-up before upgrading, just to be safe.\r\n" -"\r\n" -"If you have customized (with an editor) any of the following files, you\r\n" -"will want to back them up (copy to another disk or directory) before\r\n" -"you begin the upgrade procedure:\r\n" -"\r\n" -"TEXT.DAT (CTRL\\TEXT.DAT)\r\n" -"Command Shells and Loadable Modules (EXEC\\*.SRC)\r\n" -"Menus (TEXT\\MENU\\*.ASC)\r\n" -"Match Maker Questionnaires (XTRN\\SMM\\*.QUE)\r\n" -"External Program Menus (XTRN\\SMM\\*.ASC, XTRN\\SCB\\*.ASC, etc)\r\n"; - help(); - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - j=0; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Continue with upgrade" - ,opt); - if(j) - break; - mode|=UPGRADE; - mode&=~CFGS; } - else - mode&=~UPGRADE; - strcpy(str,install_to); - if(str[1]==':') /* drive letter specified */ - setdisk(toupper(str[0])-'A'); - if(!md(str)) - break; - sprintf(exec_dir,"%sEXEC\\",install_to); - if(mode&UPGRADE) - if(uinput(WIN_L2R|WIN_SAV,0,0,"EXEC Directory",exec_dir - ,30,K_EDIT|K_UPPER)<1) - break; - backslash(exec_dir); - if(!md(exec_dir)) - break; - if(mode&UPGRADE) { - sprintf(str,"%sSBBS.EXE",exec_dir); - l=fdate_dir(str); - ver=NONE; - switch(l) { - case 0x3044fb80: /* 08/31/95 v2.20a */ - ver=SBBS22; - break; - case 0x2f6a2280: /* 03/18/95 v2.11a */ - case 0x2f43e700: /* 02/17/95 v2.10a */ - ver=SBBS21; - break; - case 0x2e6fa580: /* 09/09/94 v2.00g */ - case 0x2e627680: /* 08/30/94 v2.00f */ - case 0x2e5a8d80: /* 08/24/94 v2.00e */ - case 0x2e569900: /* 08/21/94 v2.00d */ - case 0x2e554780: /* 08/20/94 v2.00c */ - case 0x2e0b7380: /* 06/25/94 v2.00b */ - case 0x2ded2100: /* 06/02/94 v2.00a */ - ver=SBBS20; - break; } - if(ver==NONE && flength(str)==642448UL) - ver=SBBS22; /* v2.20b - possibly patched */ - if(ver==NONE) { - strcpy(opt[0],"Version 1"); - strcpy(opt[1],"Version 2.0"); - strcpy(opt[2],"Version 2.1"); - strcpy(opt[3],"Version 2.2"); - strcpy(opt[4],"Version 2.3 beta"); - opt[5][0]=0; - j=0; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Which version are you upgrading from?" - ,opt); - if(j<0) - break; - ver=j; - if(ver==NONE) { // Version 1 - umsg("INSTALL can only upgrade from Version 2.0 or later"); - umsg("See the file UPGRADE.DOC for UPGRADE instructions"); - break; } } } - - if(mode&EXEC) { - strcpy(opt[0],"Skip This Disk"); - strcpy(opt[1],"Okay, Try Again"); - strcpy(opt[2],"Change Source Path..."); - opt[3][0]=0; - j=1; - while(1) { - sprintf(str,"%sEXEC.LZH",install_from); - if(!findfirst(str,&ff,0)) - break; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Insert Distribution Disk 1",opt); - if(j==-1) - break; - if(j==0) { - mode&=~DISK1; - break; } - if(j==2) { - uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from - ,30,K_EDIT|K_UPPER); - backslash(install_from); } } - if(j==-1) - break; - - /* If they already exist, flag as read/write */ - if(mode&DISK1) { - sprintf(str,"%sSBBS.EXE",exec_dir); - chmod(str,S_IREAD|S_IWRITE); - sprintf(str,"%sSCFG.EXE",exec_dir); - chmod(str,S_IREAD|S_IWRITE); - - sprintf(str,"%sEXEC.LZH",install_from); - sprintf(tmp,"%sEXEC.LZH",exec_dir); - if(copy(str,tmp)) - break; - if(mode&UPGRADE) { - sprintf(str,"@%sEXEC.UPG",install_from); - if(fexist(str+1)) - if(unarc(1,tmp,exec_dir,str)) { - remove(tmp); - break; } - if(unarc(0,tmp,exec_dir,NULL)) { - remove(tmp); - break; } } - else - if(unarc(1,tmp,exec_dir,NULL)) { - remove(tmp); - break; } - remove(tmp); - - /* now set to READ ONLY */ - sprintf(str,"%sSBBS.EXE",exec_dir); - if(chmod(str,S_IREAD)) - umsg("Error setting SBBS.EXE to READ ONLY"); - sprintf(str,"%sSCFG.EXE",exec_dir); - if(chmod(str,S_IREAD)) - umsg("Error setting SCFG.EXE to READ ONLY"); } } - - if(mode&CFGS) { - sprintf(str,"%sCTRL",install_to); - if(!md(str)) - break; - strcpy(opt[0],"Skip This Disk"); - strcpy(opt[1],"Okay, Try Again"); - strcpy(opt[2],"Change Source Path..."); - opt[3][0]=0; - j=1; - while(1) { - sprintf(str,"%sCFGS.LZH",install_from); - if(!findfirst(str,&ff,0)) - break; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Insert Distribution Disk 1",opt); - if(j==-1) - break; - if(j==0) { - mode&=~DISK1; - break; } - if(j==2) { - uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from - ,30,K_EDIT|K_UPPER); - backslash(install_from); } } - if(j==-1) - break; - if(mode&DISK1) { /* not skip */ - sprintf(str,"%sCFGS.LZH",install_from); - sprintf(tmp,"%sCFGS.LZH",install_to); - if(copy(str,tmp)) - break; - sprintf(str,"%sCTRL",install_to); - if(unarc(1,tmp,install_to,NULL)) { - remove(tmp); - break; } - remove(tmp); } } - - if(mode&TEXT) { - sprintf(ctrl_dir,"%sCTRL\\",install_to); - if(!md(ctrl_dir)) - break; - sprintf(text_dir,"%sTEXT\\",install_to); - if(!md(text_dir)) - break; - strcpy(opt[0],"Skip This Disk"); - strcpy(opt[1],"Okay, Try Again"); - strcpy(opt[2],"Change Source Path..."); - opt[3][0]=0; - j=1; - while(1) { - sprintf(str,"%sTEXT.LZH",install_from); - if(!findfirst(str,&ff,0)) - break; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Insert Distribution Disk 1",opt); - if(j==-1) - break; - if(j==0) { - mode&=~DISK1; - break; } - if(j==2) { - uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from - ,30,K_EDIT|K_UPPER); - backslash(install_from); } } - if(j==-1) - break; - if(mode&DISK1) { - sprintf(str,"%sTEXT.LZH",install_from); - sprintf(tmp,"%sTEXT.LZH",install_to); - if(copy(str,tmp)) - break; - if(mode&UPGRADE) { - sprintf(str,"@%sTEXT.UPG",install_from); - if(fexist(str+1)) - if(unarc(1,tmp,install_to,str)) { - remove(tmp); - break; } - if(unarc(0,tmp,install_to,NULL)) { - remove(tmp); - break; } } - else - if(unarc(1,tmp,install_to,NULL)) { - remove(tmp); - break; } - remove(tmp); } } - - if(mode&DOCS) { - sprintf(docs_dir,"%sDOCS\\",install_to); - if(mode&UPGRADE) - if(uinput(WIN_L2R|WIN_SAV,0,0,"DOCS Directory",docs_dir - ,30,K_EDIT|K_UPPER)<1) - break; - backslash(docs_dir); - if(!md(docs_dir)) - break; - strcpy(opt[0],"Skip This Disk"); - strcpy(opt[1],"Okay, Try Again"); - strcpy(opt[2],"Change Source Path..."); - opt[3][0]=0; - j=1; - while(1) { - sprintf(str,"%sDOCS.LZH",install_from); - if(!findfirst(str,&ff,0)) - break; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Insert Distribution Disk 1",opt); - if(j==-1) - break; - if(j==0) { - mode&=~DISK1; - break; } - if(j==2) { - uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from - ,30,K_EDIT|K_UPPER); - backslash(install_from); } } - if(j==-1) - break; - if(mode&DISK1) { - sprintf(str,"%sDOCS.LZH",install_from); - sprintf(tmp,"%sDOCS.LZH",install_to); - if(copy(str,tmp)) - break; - if(unarc(1,tmp,docs_dir,NULL)) { - remove(tmp); - break; } - remove(tmp); } } - - if(mode&UTIL) { - strcpy(opt[0],"Skip This Disk"); - strcpy(opt[1],"Okay, Try Again"); - strcpy(opt[2],"Change Source Path..."); - opt[3][0]=0; - j=1; - while(1) { - sprintf(str,"%sUTIL.LZH",install_from); - if(!findfirst(str,&ff,0)) - break; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Insert Distribution Disk 2 (Utilities Disk)",opt); - if(j==-1) - break; - if(j==0) { - mode&=~DISK2; - break; } - if(j==2) { - uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from - ,30,K_EDIT|K_UPPER); - backslash(install_from); } } - if(j==-1) - break; - - if(mode&DISK2) { - sprintf(str,"%sUTIL.LZH",install_from); - sprintf(tmp,"%sUTIL.LZH",exec_dir); - if(copy(str,tmp)) - break; - if(mode&UPGRADE) { - sprintf(str,"@%sUTIL.UPG",install_from); - if(fexist(str+1)) - if(unarc(1,tmp,exec_dir,str)) { - remove(tmp); - break; } - if(unarc(0,tmp,exec_dir,NULL)) { - remove(tmp); - break; } } - else - if(unarc(1,tmp,exec_dir,NULL)) { - remove(tmp); - break; } - remove(tmp); } } - - if(mode&XTRN) { - sprintf(str,"%sXTRN",install_to); - if(!md(str)) - break; - strcpy(opt[0],"Skip This Disk"); - strcpy(opt[1],"Okay, Try Again"); - strcpy(opt[2],"Change Source Path..."); - opt[3][0]=0; - j=1; - while(1) { - sprintf(str,"%sXTRN.LZH",install_from); - if(!findfirst(str,&ff,0)) - break; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Insert Distribution Disk 2 (Utilities Disk)",opt); - if(j==-1) - break; - if(j==0) { - mode&=~DISK2; - break; } - if(j==2) { - uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from - ,30,K_EDIT|K_UPPER); - backslash(install_from); } } - if(j==-1) - break; - - if(mode&DISK2) { - sprintf(str,"%sXTRN.LZH",install_from); - sprintf(tmp,"%sXTRN.LZH",install_to); - if(copy(str,tmp)) - break; - if(mode&UPGRADE) { - sprintf(str,"@%sXTRN.UPG",install_from); - if(fexist(str+1)) - if(unarc(1,tmp,install_to,str)) { - remove(tmp); - break; } - if(unarc(0,tmp,install_to,NULL)) { - remove(tmp); - break; } } - else - if(unarc(1,tmp,install_to,NULL)) { - remove(tmp); - break; } - remove(tmp); } } - - if(mode&XSDK) { - sprintf(str,"%sXTRN",install_to); - if(!md(str)) - break; - sprintf(str,"%sXTRN\\SDK",install_to); - if(!md(str)) - break; - strcpy(opt[0],"Skip This Disk"); - strcpy(opt[1],"Okay, Try Again"); - strcpy(opt[2],"Change Source Path..."); - opt[3][0]=0; - j=1; - while(1) { - sprintf(str,"%sXSDK.LZH",install_from); - if(!findfirst(str,&ff,0)) - break; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Insert Distribution Disk 2 (Utilities Disk)",opt); - if(j==-1) - break; - if(j==0) { - mode&=~DISK2; - break; } - if(j==2) { - uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from - ,30,K_EDIT|K_UPPER); - backslash(install_from); } } - if(j==-1) - break; - - if(mode&DISK2) { - sprintf(str,"%sXSDK.LZH",install_from); - sprintf(tmp,"%sXTRN\\XSDK.LZH",install_to); - if(copy(str,tmp)) - break; - sprintf(str,"%sXTRN\\SDK\\",install_to); - if(unarc(1,tmp,str,NULL)) { - remove(tmp); - break; } - remove(tmp); } } - sprintf(str,"%sNODE1",install_to); - chdir(str); - if(mode&UPGRADE) { - helpbuf= -" Additional Upgrade Instructions \r\n" -"\r\n" -"If you were previously running version 1.1 of SyncEdit, you'll need to\r\n" -"change your command lines and toggle options in SCFG for this new\r\n" -"version (2.0). See DOCS\\SYNCEDIT.DOC for details.\r\n" -"\r\n" -"Make sure you have SCFG->System->Loadable Modules->Login set to LOGIN\r\n" -"and SCFG->System->Loadable Modules->Logon set to LOGON.\r\n" -"\r\n" -"If you want your users to be able to use WIP compatible terminals with\r\n" -"your BBS, add WIPSHELL to SCFG->Command Shells with an Access\r\n" -"Requirement String of \"WIP\"."; - help(); } - uifcbail(); - if(mode&UPGRADE) { - cprintf("Synchronet Upgrade Complete.\r\n"); - exit(0); } - if(mode&CFGS) - p="/F"; - else - p=NULL; - spawnl(P_WAIT,"..\\EXEC\\SCFG.EXE" - ,"..\\EXEC\\SCFG","..\\CTRL",p,NULL); - textattr(LIGHTGRAY); - cprintf( -"Synchronet BBS and its utilities use file and record locking to maintain\r\n" -"data integrity in a multinode environment. File and record locking under DOS\r\n" -"requires the use of SHARE.\r\n" -"\r\n" - ); - cprintf( -"SHARE is a program that is distributed with MS-DOS and PC-DOS v3.0 and higher\r\n" -"and must be executed prior to running SBBS. SHARE.EXE should be located in the\r\n" -"DOS directory of your hard disk.\r\n" -"\r\n" - ); - cprintf( -"If you are running Microsoft Windows, you must exit Windows and load SHARE\r\n" -"before reloading Windows.\r\n" -"\r\n" - ); - cprintf( -"It is not necessary to run SHARE if using a single node on a Novell NetWare\r\n" -"workstation or in an OS/2 DOS window.\r\n" -"\r\n" - ); - cprintf( -"SHARE.EXE can be automatically loaded in your AUTOEXEC.BAT or CONFIG.SYS.\r\n" -"\r\n" - ); - textattr(WHITE); - cprintf( -"After you have loaded SHARE, type SBBS from THIS directory.\r\n" - ); - textattr(LIGHTGRAY); - exit(0); - case -1: - j=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - if(!(ulist(WIN_MID,0,0,20,&j,0,"Abort Installation",opt))) - bail(0); - break; } } -} - -void bail(int code) -{ - -if(code) - getch(); -uifcbail(); -exit(code); -} diff --git a/src/sbbs2/install/makefile b/src/sbbs2/install/makefile deleted file mode 100644 index f277d18b8b..0000000000 --- a/src/sbbs2/install/makefile +++ /dev/null @@ -1,52 +0,0 @@ -############################################### -# Makefile for Synchronet BBS Install Program # -# For use with Borland C++ for DOS or OS/2 # -############################################### - -# Macros -CC = bcc -LD = tlink -!ifdef __OS2__ -OS = OS2 -INCLUDE = c:\bcos2\include;..;..\..\uifc -LIB = c:\bcos2\lib -CFLAGS = -d -C -I$(INCLUDE) -w-pro -LFLAGS = -c -!else -OS = DOS -INCLUDE = \bc45\include;..;..\..\uifc -LIB = \bc45\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -w-pro -LFLAGS = -n -c -OBJS = ..\..\mswait\$(OS)\mswait.obj -!endif -MAIN = $(OS)\install.exe -OBJS = $(OBJS) $(OS)\uifc.obj $(OS)\install.obj -HEADERS = ..\..\uifc\uifc.h - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL).obj $(OBJS) -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib\ - $(LIB)\emu.lib -!endif - -# Local Menu Routines -$(OS)\uifc.obj: ..\..\uifc\uifc.c ..\..\uifc\uifc.h - @echo Compiling ..\..\uifc\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\..\uifc\$&.c - -install.obj: $(HEADERS) diff --git a/src/sbbs2/listfile.c b/src/sbbs2/listfile.c deleted file mode 100644 index d0c4582032..0000000000 --- a/src/sbbs2/listfile.c +++ /dev/null @@ -1,782 +0,0 @@ -#line 1 "LISTFILE.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -int listfile(char *fname, char HUGE16 *buf, uint dirnum - , char *search, char letter, ulong datoffset); - -void clearline(void) -{ - int i; - -outchar(CR); -if(useron.misc&ANSI) - bputs("\x1b[K"); -else { - for(i=0;i<79;i++) - outchar(SP); - outchar(CR); } -} - -/****************************************************************************/ -/* Remove credits from uploader of file 'f' */ -/****************************************************************************/ -void removefcdt(file_t f) -{ - char str[128]; - int u; - long cdt; - -if((u=matchuser(f.uler))==0) { - bputs(text[UnknownUser]); - return; } -cdt=0L; -if(dir[f.dir]->misc&DIR_CDTMIN && cur_cps) { - if(dir[f.dir]->misc&DIR_CDTUL) - cdt=((ulong)(f.cdt*(dir[f.dir]->up_pct/100.0))/cur_cps)/60; - if(dir[f.dir]->misc&DIR_CDTDL - && f.timesdled) /* all downloads */ - cdt+=((ulong)((long)f.timesdled - *f.cdt*(dir[f.dir]->dn_pct/100.0))/cur_cps)/60; - adjustuserrec(u,U_MIN,10,-cdt); - sprintf(str,"%lu minute",cdt); - sprintf(tmp,text[FileRemovedUserMsg] - ,f.name,cdt ? str : text[No]); - putsmsg(u,tmp); } -else { - if(dir[f.dir]->misc&DIR_CDTUL) - cdt=(ulong)(f.cdt*(dir[f.dir]->up_pct/100.0)); - if(dir[f.dir]->misc&DIR_CDTDL - && f.timesdled) /* all downloads */ - cdt+=(ulong)((long)f.timesdled - *f.cdt*(dir[f.dir]->dn_pct/100.0)); - adjustuserrec(u,U_CDT,10,-cdt); - sprintf(tmp,text[FileRemovedUserMsg] - ,f.name,cdt ? ultoac(cdt,str) : text[No]); - putsmsg(u,tmp); } - -adjustuserrec(u,U_ULB,10,-f.size); -adjustuserrec(u,U_ULS,5,-1); -} - -/****************************************************************************/ -/* Move file 'f' from f.dir to newdir */ -/****************************************************************************/ -void movefile(file_t f, int newdir) -{ - char str[256],path[256],fname[128],ext[1024]; - int olddir=f.dir; - -if(findfile(newdir,f.name)) { - bprintf(text[FileAlreadyThere],f.name); - return; } -getextdesc(olddir,f.datoffset,ext); -if(dir[olddir]->misc&DIR_MOVENEW) - f.dateuled=time(NULL); -unpadfname(f.name,fname); -removefiledat(f); -f.dir=newdir; -addfiledat(&f); -bprintf(text[MovedFile],f.name - ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname); -sprintf(str,"Moved %s to %s %s",f.name - ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname); -logline(nulstr,str); -if(!f.altpath) { /* move actual file */ - sprintf(str,"%s%s",dir[olddir]->path,fname); - if(fexist(str)) { - sprintf(path,"%s%s",dir[f.dir]->path,fname); - mv(str,path,0); } } -if(f.misc&FM_EXTDESC) - putextdesc(f.dir,f.datoffset,ext); -} - -/****************************************************************************/ -/* Batch flagging prompt for download, extended info, and archive viewing */ -/* Returns -1 if 'Q' or Ctrl-C, 0 if skip, 1 if [Enter], 2 otherwise */ -/* or 3, backwards. */ -/****************************************************************************/ -char batchflagprompt(int dirnum, file_t bf[26], char total, long totalfiles) -{ - char ch,c,d,str[256],fname[128],*p,remcdt,remfile; - int i,j,u,ml,md,udir,ulib; - long cdt; - file_t f; - -for(ulib=0;ulib<usrlibs;ulib++) - if(usrlib[ulib]==dir[dirnum]->lib) - break; -for(udir=0;udir<usrdirs[ulib];udir++) - if(usrdir[ulib][udir]==dirnum) - break; - -CRLF; -while(online) { - bprintf(text[BatchFlagPrompt] - ,ulib+1 - ,lib[dir[dirnum]->lib]->sname - ,udir+1 - ,dir[dirnum]->sname - ,totalfiles); - ch=getkey(K_UPPER); - clearline(); - if(ch=='?') { - menu("BATFLAG"); - if(lncntr) - pause(); - return(2); } - if(ch=='Q' || sys_status&SS_ABORT) - return(-1); - if(ch=='S') - return(0); - if(ch=='P') - return(3); - if(ch=='B') { /* Flag for batch download */ - if(useron.rest&FLAG('D')) { - bputs(text[R_Download]); - return(2); } - if(total==1) { - f.dir=dirnum; - strcpy(f.name,bf[0].name); - f.datoffset=bf[0].datoffset; - f.size=0; - getfiledat(&f); - addtobatdl(f); - CRLF; - return(2); } - bputs(text[BatchDlFlags]); - d=getstr(str,26,K_UPPER|K_LOWPRIO|K_NOCRLF); - lncntr=0; - if(sys_status&SS_ABORT) - return(-1); - if(d) { /* d is string length */ - CRLF; - lncntr=0; - for(c=0;c<d;c++) { - if(batdn_total>=max_batdn) { - bprintf(text[BatchDlQueueIsFull],str+c); - break; } - if(strchr(str+c,'.')) { /* filename or spec given */ - f.dir=dirnum; - p=strchr(str+c,SP); - if(!p) p=strchr(str+c,','); - if(p) *p=0; - for(i=0;i<total;i++) { - if(batdn_total>=max_batdn) { - bprintf(text[BatchDlQueueIsFull],str+c); - break; } - padfname(str+c,tmp); - if(filematch(bf[i].name,tmp)) { - strcpy(f.name,bf[i].name); - f.datoffset=bf[i].datoffset; - f.size=0; - getfiledat(&f); - addtobatdl(f); } } } - if(strchr(str+c,'.')) - c+=strlen(str+c); - else if(str[c]<'A'+total && str[c]>='A') { - f.dir=dirnum; - strcpy(f.name,bf[str[c]-'A'].name); - f.datoffset=bf[str[c]-'A'].datoffset; - f.size=0; - getfiledat(&f); - addtobatdl(f); } } - CRLF; - return(2); } - clearline(); - continue; } - - if(ch=='E' || ch=='V') { /* Extended Info */ - if(total==1) { - f.dir=dirnum; - strcpy(f.name,bf[0].name); - f.datoffset=bf[0].datoffset; - f.dateuled=bf[0].dateuled; - f.datedled=bf[0].datedled; - f.size=0; - getfiledat(&f); - if(!viewfile(f,ch=='E')) - return(-1); - return(2); } - bputs(text[BatchDlFlags]); - d=getstr(str,26,K_UPPER|K_LOWPRIO|K_NOCRLF); - lncntr=0; - if(sys_status&SS_ABORT) - return(-1); - if(d) { /* d is string length */ - CRLF; - lncntr=0; - for(c=0;c<d;c++) { - if(strchr(str+c,'.')) { /* filename or spec given */ - f.dir=dirnum; - p=strchr(str+c,SP); - if(!p) p=strchr(str+c,','); - if(p) *p=0; - for(i=0;i<total;i++) { - padfname(str+c,tmp); - if(filematch(bf[i].name,tmp)) { - strcpy(f.name,bf[i].name); - f.datoffset=bf[i].datoffset; - f.dateuled=bf[i].dateuled; - f.datedled=bf[i].datedled; - f.size=0; - getfiledat(&f); - if(!viewfile(f,ch=='E')) - return(-1); } } } - if(strchr(str+c,'.')) - c+=strlen(str+c); - else if(str[c]<'A'+total && str[c]>='A') { - f.dir=dirnum; - strcpy(f.name,bf[str[c]-'A'].name); - f.datoffset=bf[str[c]-'A'].datoffset; - f.dateuled=bf[str[c]-'A'].dateuled; - f.datedled=bf[str[c]-'A'].datedled; - f.size=0; - getfiledat(&f); - if(!viewfile(f,ch=='E')) - return(-1); } } - return(2); } - clearline(); - continue; } - - if((ch=='D' || ch=='M') /* Delete or Move */ - && !(useron.rest&FLAG('R')) - && (dir_op(dirnum) || useron.exempt&FLAG('R'))) { - if(total==1) { - strcpy(str,"A"); - d=1; } - else { - bputs(text[BatchDlFlags]); - d=getstr(str,26,K_UPPER|K_LOWPRIO|K_NOCRLF); } - lncntr=0; - if(sys_status&SS_ABORT) - return(-1); - if(d) { /* d is string length */ - CRLF; - if(ch=='D') { - if(noyes(text[AreYouSureQ])) - return(2); - remcdt=remfile=1; - if(dir_op(dirnum)) { - remcdt=!noyes(text[RemoveCreditsQ]); - remfile=!noyes(text[DeleteFileQ]); } } - else if(ch=='M') { - CRLF; - for(i=0;i<usrlibs;i++) - bprintf(text[MoveToLibLstFmt],i+1,lib[usrlib[i]]->lname); - SYNC; - bprintf(text[MoveToLibPrompt],dir[dirnum]->lib+1); - if((ml=getnum(usrlibs))==-1) - return(2); - if(!ml) - ml=dir[dirnum]->lib; - else - ml--; - CRLF; - for(j=0;j<usrdirs[ml];j++) - bprintf(text[MoveToDirLstFmt] - ,j+1,dir[usrdir[ml][j]]->lname); - SYNC; - bprintf(text[MoveToDirPrompt],usrdirs[ml]); - if((md=getnum(usrdirs[ml]))==-1) - return(2); - if(!md) - md=usrdirs[ml]-1; - else md--; - CRLF; } - lncntr=0; - for(c=0;c<d;c++) { - if(strchr(str+c,'.')) { /* filename or spec given */ - f.dir=dirnum; - p=strchr(str+c,SP); - if(!p) p=strchr(str+c,','); - if(p) *p=0; - for(i=0;i<total;i++) { - padfname(str+c,tmp); - if(filematch(bf[i].name,tmp)) { - strcpy(f.name,bf[i].name); - unpadfname(f.name,fname); - f.datoffset=bf[i].datoffset; - f.dateuled=bf[i].dateuled; - f.datedled=bf[i].datedled; - f.size=0; - getfiledat(&f); - if(f.opencount) { - bprintf(text[FileIsOpen] - ,f.opencount,f.opencount>1 ? "s":nulstr); - continue; } - if(ch=='D') { - removefiledat(f); - if(remfile) { - sprintf(tmp,"%s%s",dir[f.dir]->path,fname); - remove(tmp); } - if(remcdt) - removefcdt(f); } - else if(ch=='M') - movefile(f,usrdir[ml][md]); } } } - if(strchr(str+c,'.')) - c+=strlen(str+c); - else if(str[c]<'A'+total && str[c]>='A') { - f.dir=dirnum; - strcpy(f.name,bf[str[c]-'A'].name); - unpadfname(f.name,fname); - f.datoffset=bf[str[c]-'A'].datoffset; - f.dateuled=bf[str[c]-'A'].dateuled; - f.datedled=bf[str[c]-'A'].datedled; - f.size=0; - getfiledat(&f); - if(f.opencount) { - bprintf(text[FileIsOpen] - ,f.opencount,f.opencount>1 ? "s":nulstr); - continue; } - if(ch=='D') { - removefiledat(f); - if(remfile) { - sprintf(tmp,"%s%s",dir[f.dir]->path,fname); - remove(tmp); } - if(remcdt) - removefcdt(f); } - else if(ch=='M') - movefile(f,usrdir[ml][md]); } } - return(2); } - clearline(); - continue; } - - return(1); } - -return(-1); -} - -/*****************************************************************************/ -/* List files in directory 'dir' that match 'filespec'. Filespec must be */ -/* padded. ex: FILE* .EXT, not FILE*.EXT. 'mode' determines other critiria */ -/* the files must meet before they'll be listed. 'mode' bit FL_NOHDR doesn't */ -/* list the directory header. */ -/* Returns -1 if the listing was aborted, otherwise total files listed */ -/*****************************************************************************/ -int listfiles(uint dirnum, char *filespec, int tofile, char mode) -{ - uchar str[256],hdr[256],cmd[129],c,d,letter='A',*buf,*p,ext[513]; - uchar HUGE16 *datbuf,HUGE16 *ixbbuf,flagprompt=0; - int i,j,file,found=0,lastbat=0,disp; - ulong l,m=0,n,length,anchor,next,datbuflen; - file_t f,bf[26]; /* bf is batch flagged files */ - -if(mode&FL_ULTIME) { - last_ns_time=now; - sprintf(str,"%s%s.DAB",dir[dirnum]->data_dir,dir[dirnum]->code); - if((file=nopen(str,O_RDONLY))!=-1) { - read(file,&l,4); - close(file); - if(ns_time>l) - return(0); } } -sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_RDONLY))==-1) - return(0); -l=filelength(file); -if(!l) { - close(file); - return(0); } -if((ixbbuf=(char *)MALLOC(l))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,l); - return(0); } -if(lread(file,ixbbuf,l)!=l) { - close(file); - errormsg(WHERE,ERR_READ,str,l); - FREE((char *)ixbbuf); - return(0); } -close(file); -sprintf(str,"%s%s.DAT",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - FREE((char *)ixbbuf); - return(0); } -datbuflen=filelength(file); -if((datbuf=MALLOC(datbuflen))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,datbuflen); - FREE((char *)ixbbuf); - return(0); } -if(lread(file,datbuf,datbuflen)!=datbuflen) { - close(file); - errormsg(WHERE,ERR_READ,str,datbuflen); - FREE((char *)datbuf); - FREE((char *)ixbbuf); - return(0); } -close(file); -if(!tofile) { - action=NODE_LFIL; - getnodedat(node_num,&thisnode,0); - if(thisnode.action!=NODE_LFIL) { /* was a sync */ - getnodedat(node_num,&thisnode,1); - thisnode.action=NODE_LFIL; - putnodedat(node_num,thisnode); } } -while(online && found<MAX_FILES) { - if(found<0) - found=0; - if(m>=l || flagprompt) { /* End of list */ - if(useron.misc&BATCHFLAG && !tofile && found && found!=lastbat - && !(mode&(FL_EXFIND|FL_VIEW))) { - flagprompt=0; - lncntr=0; - if((i=batchflagprompt(dirnum,bf,letter-'A',l/F_IXBSIZE))==2) { - m=anchor; - found-=letter-'A'; - letter='A'; } - else if(i==3) { - if((long)anchor-((letter-'A')*F_IXBSIZE)<0) { - m=0; - found=0; } - else { - m=anchor-((letter-'A')*F_IXBSIZE); - found-=letter-'A'; } - letter='A'; } - else if(i==-1) { - FREE((char *)ixbbuf); - FREE((char *)datbuf); - return(-1); } - else - break; - getnodedat(node_num,&thisnode,0); - nodesync(); } - else - break; } - - if(letter>'Z') - letter='A'; - if(letter=='A') - anchor=m; - - if(msgabort()) { /* used to be !tofile && msgabort() */ - FREE((char *)ixbbuf); - FREE((char *)datbuf); - return(-1); } - for(j=0;j<12 && m<l;j++) - if(j==8) - str[j]='.'; - else - str[j]=ixbbuf[m++]; /* Turns FILENAMEEXT into FILENAME.EXT */ - str[j]=0; - if(!(mode&(FL_FINDDESC|FL_EXFIND)) && filespec[0] - && !filematch(str,filespec)) { - m+=11; - continue; } - n=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16); - if(n>=datbuflen) { /* out of bounds */ - m+=11; - continue; } - if(mode&(FL_FINDDESC|FL_EXFIND)) { - getrec((char *)&datbuf[n],F_DESC,LEN_FDESC,tmp); - strupr(tmp); - p=strstr(tmp,filespec); - if(!(mode&FL_EXFIND) && p==NULL) { - m+=11; - continue; } - getrec((char *)&datbuf[n],F_MISC,1,tmp); - j=tmp[0]; /* misc bits */ - if(j) j-=SP; - if(mode&FL_EXFIND && j&FM_EXTDESC) { /* search extended description */ - getextdesc(dirnum,n,ext); - strupr(ext); - if(!strstr(ext,filespec) && !p) { /* not in description or */ - m+=11; /* extended description */ - continue; } } - else if(!p) { /* no extended description and not in desc */ - m+=11; - continue; } } - if(mode&FL_ULTIME) { - if(ns_time>(ixbbuf[m+3]|((long)ixbbuf[m+4]<<8)|((long)ixbbuf[m+5]<<16) - |((long)ixbbuf[m+6]<<24))) { - m+=11; - continue; } } - if(useron.misc&BATCHFLAG && letter=='A' && found && !tofile - && !(mode&(FL_EXFIND|FL_VIEW)) - && (!mode || !(useron.misc&EXPERT))) - bputs(text[FileListBatchCommands]); - m+=11; - if(!found && !(mode&(FL_EXFIND|FL_VIEW))) { - for(i=0;i<usrlibs;i++) - if(usrlib[i]==dir[dirnum]->lib) - break; - for(j=0;j<usrdirs[i];j++) - if(usrdir[i][j]==dirnum) - break; /* big header */ - if((!mode || !(useron.misc&EXPERT)) && !tofile && (!filespec[0] - || (strchr(filespec,'*') || strchr(filespec,'?')))) { - sprintf(hdr,"%s%s.HDR",dir[dirnum]->data_dir,dir[dirnum]->code); - if(fexist(hdr)) - printfile(hdr,0); /* Use DATA\DIRS\<CODE>.HDR */ - else { - if(useron.misc&BATCHFLAG) - bputs(text[FileListBatchCommands]); - else { - CLS; - d=strlen(lib[usrlib[i]]->lname)>strlen(dir[dirnum]->lname) ? - strlen(lib[usrlib[i]]->lname)+17 - : strlen(dir[dirnum]->lname)+17; - if(i>8 || j>8) d++; - attr(color[clr_filelsthdrbox]); - bputs("��"); /* use to start with \r\n */ - for(c=0;c<d;c++) - outchar('�'); - bputs("�\r\n� "); - sprintf(hdr,text[BoxHdrLib],i+1,lib[usrlib[i]]->lname); - bputs(hdr); - for(c=bstrlen(hdr);c<d;c++) - outchar(SP); - bputs("�\r\n� "); - sprintf(hdr,text[BoxHdrDir],j+1,dir[dirnum]->lname); - bputs(hdr); - for(c=bstrlen(hdr);c<d;c++) - outchar(SP); - bputs("�\r\n� "); - sprintf(hdr,text[BoxHdrFiles],l/F_IXBSIZE); - bputs(hdr); - for(c=bstrlen(hdr);c<d;c++) - outchar(SP); - bputs("�\r\n��"); - for(c=0;c<d;c++) - outchar('�'); - bputs("�\r\n"); } } } - else { /* short header */ - if(tofile) { - sprintf(hdr,"(%u) %s ",i+1,lib[usrlib[i]]->sname); - write(tofile,crlf,2); - write(tofile,hdr,strlen(hdr)); } - else { - sprintf(hdr,text[ShortHdrLib],i+1,lib[usrlib[i]]->sname); - bputs("\r\1>\r\n"); - bputs(hdr); } - c=bstrlen(hdr); - if(tofile) { - sprintf(hdr,"(%u) %s",j+1,dir[dirnum]->lname); - write(tofile,hdr,strlen(hdr)); } - else { - sprintf(hdr,text[ShortHdrDir],j+1,dir[dirnum]->lname); - bputs(hdr); } - c+=bstrlen(hdr); - if(tofile) { - write(tofile,crlf,2); - sprintf(hdr,"%*s",c,nulstr); - strset(hdr,'�'); - strcat(hdr,crlf); - write(tofile,hdr,strlen(hdr)); } - else { - CRLF; - attr(color[clr_filelstline]); - while(c--) - outchar('�'); - CRLF; } } } - next=m; - disp=1; - if(mode&(FL_EXFIND|FL_VIEW)) { - f.dir=dirnum; - strcpy(f.name,str); - m-=11; - f.datoffset=n; - f.dateuled=ixbbuf[m+3]|((long)ixbbuf[m+4]<<8) - |((long)ixbbuf[m+5]<<16)|((long)ixbbuf[m+6]<<24); - f.datedled=ixbbuf[m+7]|((long)ixbbuf[m+8]<<8) - |((long)ixbbuf[m+9]<<16)|((long)ixbbuf[m+10]<<24); - m+=11; - f.size=0; - getfiledat(&f); - if(!found) - bputs("\r\1>"); - if(mode&FL_EXFIND) { - if(!viewfile(f,1)) { - FREE((char *)ixbbuf); - FREE((char *)datbuf); - return(-1); } } - else { - if(!viewfile(f,0)) { - FREE((char *)ixbbuf); - FREE((char *)datbuf); - return(-1); } } } - - else if(tofile) - listfiletofile(str,&datbuf[n],dirnum,tofile); - else if(mode&FL_FINDDESC) - disp=listfile(str,&datbuf[n],dirnum,filespec,letter,n); - else - disp=listfile(str,&datbuf[n],dirnum,nulstr,letter,n); - if(!disp && letter>'A') { - next=m-F_IXBSIZE; - letter--; } - else { - disp=1; - found++; } - if(sys_status&SS_ABORT) { - FREE((char *)ixbbuf); - FREE((char *)datbuf); - return(-1); } - if(mode&(FL_EXFIND|FL_VIEW)) - continue; - if(useron.misc&BATCHFLAG && !tofile) { - if(disp) { - strcpy(bf[letter-'A'].name,str); - m-=11; - bf[letter-'A'].datoffset=n; - bf[letter-'A'].dateuled=ixbbuf[m+3]|((long)ixbbuf[m+4]<<8) - |((long)ixbbuf[m+5]<<16)|((long)ixbbuf[m+6]<<24); - bf[letter-'A'].datedled=ixbbuf[m+7]|((long)ixbbuf[m+8]<<8) - |((long)ixbbuf[m+9]<<16)|((long)ixbbuf[m+10]<<24); } - m+=11; - if(flagprompt || letter=='Z' || !disp || - (filespec[0] && !strchr(filespec,'*') && !strchr(filespec,'?') - && !(mode&FL_FINDDESC)) - || (useron.misc&BATCHFLAG && !tofile && lncntr>=rows-2) - ) { - flagprompt=0; - lncntr=0; - lastbat=found; - if((i=batchflagprompt(dirnum,bf,letter-'A'+1,l/F_IXBSIZE))<1) { - FREE((char *)ixbbuf); - FREE((char *)datbuf); - if(i==-1) - return(-1); - else - return(found); } - if(i==2) { - next=anchor; - found-=(letter-'A')+1; } - else if(i==3) { - if((long)anchor-((letter-'A'+1)*F_IXBSIZE)<0) { - next=0; - found=0; } - else { - next=anchor-((letter-'A'+1)*F_IXBSIZE); - found-=letter-'A'+1; } } - getnodedat(node_num,&thisnode,0); - nodesync(); - letter='A'; } - else letter++; } - if(useron.misc&BATCHFLAG && !tofile - && lncntr>=rows-2) { - lncntr=0; /* defeat pause() */ - flagprompt=1; } - m=next; - if(mode&FL_FINDDESC) continue; - if(filespec[0] && !strchr(filespec,'*') && !strchr(filespec,'?') && m) - break; } - -FREE((char *)ixbbuf); -FREE((char *)datbuf); -return(found); -} - -int cntlines(char *str) -{ - int i,lc,last; - -for(i=lc=last=0;str[i];i++) - if(str[i]==LF || i-last>LEN_FDESC) { - lc++; - last=i; } -return(lc); -} - -/****************************************************************************/ -/* Prints one file's information on a single line */ -/* Return 1 if displayed, 0 otherwise */ -/****************************************************************************/ -int listfile(char *fname, char HUGE16 *buf, uint dirnum - , char *search, char letter, ulong datoffset) -{ - char str[256],ext[513]="",*ptr,*cr,*lf,exist=1; - uchar alt; - int i,j; - ulong cdt; - -if(buf[F_MISC]!=ETX && (buf[F_MISC]-SP)&FM_EXTDESC && useron.misc&EXTDESC) { - getextdesc(dirnum,datoffset,ext); - if(useron.misc&BATCHFLAG && lncntr+cntlines(ext)>=rows-2 && letter!='A') - return(0); } -attr(color[clr_filename]); -bputs(fname); -if(buf[F_MISC]!=ETX && (buf[F_MISC]-SP)&FM_EXTDESC) { - if(!(useron.misc&EXTDESC)) - outchar('+'); - else - outchar(SP); } -else - outchar(SP); -if(useron.misc&BATCHFLAG) { - attr(color[clr_filedesc]); - bprintf("%c",letter); } -getrec((char *)buf,F_ALTPATH,2,str); -alt=(uchar)ahtoul(str); -sprintf(str,"%s%s",alt>0 && alt<=altpaths ? altpath[alt-1]:dir[dirnum]->path - ,unpadfname(fname,tmp)); -if(dir[dirnum]->misc&DIR_FCHK && !fexist(str)) { - exist=0; - attr(color[clr_err]); } -else - attr(color[clr_filecdt]); -getrec((char *)buf,F_CDT,LEN_FCDT,str); -cdt=atol(str); -if(useron.misc&BATCHFLAG) { - if(!cdt) { - attr(curatr^(HIGH|BLINK)); - bputs(" FREE"); } - else { - if(cdt<1024) /* 1k is smallest size */ - cdt=1024; - bprintf("%5luk",cdt/1024L); } } -else { - if(!cdt) { /* FREE file */ - attr(curatr^(HIGH|BLINK)); - bputs(" FREE"); } - else if(cdt>9999999L) - bprintf("%6luk",cdt/1024L); - else - bprintf("%7lu",cdt); } -if(exist) - outchar(SP); -else - outchar('-'); -getrec((char *)buf,F_DESC,LEN_FDESC,str); -attr(color[clr_filedesc]); -if(!ext[0]) { - if(search[0]) { /* high-light string in string */ - strcpy(tmp,str); - strupr(tmp); - ptr=strstr(tmp,search); - i=strlen(search); - j=ptr-tmp; - bprintf("%.*s",j,str); - attr(color[clr_filedesc]^HIGH); - bprintf("%.*s",i,str+j); - attr(color[clr_filedesc]); - bprintf("%.*s",strlen(str)-(j+i),str+j+i); } - else - bputs(str); - CRLF; } -ptr=ext; -while(*ptr && ptr<ext+512 && !msgabort()) { - cr=strchr(ptr,CR); - lf=strchr(ptr,LF); - if(lf && (lf<cr || !cr)) cr=lf; - if(cr>ptr+LEN_FDESC) - cr=ptr+LEN_FDESC; - else if(cr) - *cr=0; -// bprintf("%.*s\r\n",LEN_FDESC,ptr); - sprintf(str,"%.*s\r\n",LEN_FDESC,ptr); - putmsg(str,P_NOATCODES|P_SAVEATR); - if(!cr) { - if(strlen(ptr)>LEN_FDESC) - cr=ptr+LEN_FDESC; - else - break; } - if(!(*(cr+1)) || !(*(cr+2))) - break; - bprintf("%21s",nulstr); - ptr=cr; - if(!(*ptr)) ptr++; - while(*ptr==LF || *ptr==CR) ptr++; } -return(1); -} diff --git a/src/sbbs2/login.c b/src/sbbs2/login.c deleted file mode 100644 index 7a5c2de012..0000000000 --- a/src/sbbs2/login.c +++ /dev/null @@ -1,92 +0,0 @@ -#line 1 "LOGIN.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -extern char qwklogon; - -int login(char *str, char *pw) -{ - long useron_misc=useron.misc; - -useron.number=0; -if(node_dollars_per_call && noyes(text[AreYouSureQ])) - return(LOGIC_FALSE); - -if(str[0]=='*') { - memmove(str,str+1,strlen(str)); - qwklogon=1; } -else - qwklogon=0; - -if(!(node_misc&NM_NO_NUM) && isdigit(str[0])) { - useron.number=atoi(str); - getuserdat(&useron); - if(useron.number && useron.misc&(DELETED|INACTIVE)) - useron.number=0; } - -if(!useron.number) { - useron.number=matchuser(str); - if(!useron.number && (uchar)str[0]<0x7f && str[1] - && isalpha(str[0]) && strchr(str,SP) && node_misc&NM_LOGON_R) - useron.number=userdatdupe(0,U_NAME,LEN_NAME,str,0); - if(useron.number) { - getuserdat(&useron); - if(useron.number && useron.misc&(DELETED|INACTIVE)) - useron.number=0; } } - -if(!useron.number) { - if(node_misc&NM_LOGON_P) { - strcpy(useron.alias,str); - bputs(pw); - console|=CON_R_ECHOX; - if(!(sys_misc&SM_ECHO_PW)) - console|=CON_L_ECHOX; - getstr(str,LEN_PASS,K_UPPER|K_LOWPRIO); - console&=~(CON_R_ECHOX|CON_L_ECHOX); - bputs(text[InvalidLogon]); - sprintf(tmp,"(%04u) %-25s Password: '%s'" - ,0,useron.alias,str); - logline("+!",tmp); } - else { - bputs(text[UnknownUser]); - sprintf(tmp,"Unknown User '%s'",str); - logline("+!",tmp); } - useron.misc=useron_misc; - return(LOGIC_FALSE); } - -if(!online) { - useron.number=0; - return(LOGIC_FALSE); } -statline=0; -statusline(); -if((online==ON_REMOTE || sys_misc&SM_REQ_PW || node_misc&NM_SYSPW) - && (useron.pass[0] || REALSYSOP) - && (!node_dollars_per_call || sys_misc&SM_REQ_PW)) { - bputs(pw); - console|=CON_R_ECHOX; - if(!(sys_misc&SM_ECHO_PW)) - console|=CON_L_ECHOX; - getstr(str,LEN_PASS,K_UPPER|K_LOWPRIO); - console&=~(CON_R_ECHOX|CON_L_ECHOX); - if(!online) { - useron.number=0; - return(LOGIC_FALSE); } - if(stricmp(useron.pass,str)) { - bputs(text[InvalidLogon]); - sprintf(tmp,"(%04u) %-25s Password: '%s' Attempt: '%s'" - ,useron.number,useron.alias,useron.pass,str); - logline("+!",tmp); - useron.number=0; - useron.misc=useron_misc; - return(LOGIC_FALSE); } - if(REALSYSOP && !chksyspass(0)) { - bputs(text[InvalidLogon]); - useron.number=0; - useron.misc=useron_misc; - return(LOGIC_FALSE); } } - -return(LOGIC_TRUE); -} diff --git a/src/sbbs2/logio.c b/src/sbbs2/logio.c deleted file mode 100644 index 37bb5562a4..0000000000 --- a/src/sbbs2/logio.c +++ /dev/null @@ -1,81 +0,0 @@ -#line 1 "LOGIO.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/********************************/ -/* Log file reading and writing */ -/********************************/ - -#include "sbbs.h" - -void logentry(char *code, char *entry) -{ - char str[512]; - -now=time(NULL); -sprintf(str,"Node %2d %s\r\n %s",node_num,timestr(&now),entry); -logline(code,str); -} - -/****************************************************************************/ -/* Writes 'str' verbatim into node.log */ -/****************************************************************************/ -void log(char *str) -{ -if(!(sys_status&SS_LOGOPEN) || online==ON_LOCAL) return; -if(logcol>=78 || (78-logcol)<strlen(str)) { - write(logfile,crlf,2); - logcol=1; } -if(logcol==1) { - write(logfile," ",3); - logcol=4; } -write(logfile,str,strlen(str)); -if(str[strlen(str)-1]==LF) - logcol=1; -else - logcol+=strlen(str); -} - -/****************************************************************************/ -/* Writes 'str' on it's own line in node.log */ -/****************************************************************************/ -void logline(char *code, char *str) -{ - char line[1024]; - -if(!(sys_status&SS_LOGOPEN) || (online==ON_LOCAL && strcmp(code,"!!"))) return; -if(logcol!=1) - write(logfile,crlf,2); -sprintf(line,"%-2.2s %s\r\n",code,str); -write(logfile,line,strlen(line)); -logcol=1; -} - -/****************************************************************************/ -/* Writes a comma then 'ch' to log, tracking column. */ -/****************************************************************************/ -void logch(char ch, char comma) -{ - char slash='/'; - -if(!(sys_status&SS_LOGOPEN) || (online==ON_LOCAL)) return; -if((uchar)ch<SP) /* Don't log control chars */ - return; -if(logcol==1) { - logcol=4; - write(logfile," ",3); } -else if(logcol>=78) { - logcol=4; - write(logfile,"\r\n ",5); } -if(comma && logcol!=4) { - write(logfile,",",1); - logcol++; } -if(ch&0x80) { - ch&=0x7f; - if(ch<SP) - return; - write(logfile,&slash,1); } -write(logfile,&ch,1); -logcol++; -} - diff --git a/src/sbbs2/logon.c b/src/sbbs2/logon.c deleted file mode 100644 index 47e6d7afc4..0000000000 --- a/src/sbbs2/logon.c +++ /dev/null @@ -1,569 +0,0 @@ -#line 1 "LOGON.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/****************************************************************************/ -/* Functions pertaining to the logging on and off of a user */ -/****************************************************************************/ - -#include "sbbs.h" -#include "cmdshell.h" - -extern char qwklogon,onquiet; - -/****************************************************************************/ -/* Called once upon each user logging on the board */ -/* Returns 1 if user passed logon, 0 if user failed. */ -/****************************************************************************/ -char logon() -{ - char str[256],c; - int file; - uint i,j,k,mailw; - ulong totallogons; - node_t node; - FILE *stream; - struct tm *gm; - -now=time(NULL); -gm=localtime(&now); -if(!useron.number) - return(0); - -if(useron.rest&FLAG('Q')) - qwklogon=1; -if(SYSOP && ((online==ON_REMOTE && !(sys_misc&SM_R_SYSOP)) - || (online==ON_LOCAL && !(sys_misc&SM_L_SYSOP)))) - return(0); -if(cur_rate<node_minbps && !(useron.exempt&FLAG('M'))) { - bprintf(text[MinimumModemSpeed],node_minbps); - sprintf(str,"%sTOOSLOW.MSG",text_dir); - if(fexist(str)) - printfile(str,0); - sprintf(str,"(%04u) %-25s Modem speed: %u<%u" - ,useron.number,useron.alias,cur_rate,node_minbps); - logline("+!",str); - return(0); } - -if(useron.rest&FLAG('G')) { /* Guest account */ - useron.misc=(new_misc&(~ASK_NSCAN)); - useron.rows=0; - useron.misc&=~(ANSI|RIP|WIP|NO_EXASCII|COLOR); - useron.misc|=autoterm; - if(!(useron.misc&ANSI) && yesno(text[AnsiTerminalQ])) - useron.misc|=ANSI; - if(useron.misc&(RIP|WIP) - || (useron.misc&ANSI && yesno(text[ColorTerminalQ]))) - useron.misc|=COLOR; - if(!yesno(text[ExAsciiTerminalQ])) - useron.misc|=NO_EXASCII; - for(i=0;i<total_xedits;i++) - if(!stricmp(xedit[i]->code,new_xedit) - && chk_ar(xedit[i]->ar,useron)) - break; - if(i<total_xedits) - useron.xedit=i+1; - else - useron.xedit=0; - useron.prot=new_prot; - useron.shell=new_shell; } - -if(node_dollars_per_call) { - adjustuserrec(useron.number,U_CDT,10 - ,cdt_per_dollar*node_dollars_per_call); - bprintf(text[CreditedAccount] - ,cdt_per_dollar*node_dollars_per_call); - sprintf(str,"%s #%u was billed $%d T: %u seconds" - ,useron.alias,useron.number - ,node_dollars_per_call,(uint)now-answertime); - logline("$+",str); - hangup(); - return(0); } - -//lclini(node_scrnlen-1); - -if(!chk_ar(node_ar,useron)) { - bputs(text[NoNodeAccess]); - sprintf(str,"(%04u) %-25s Insufficient node access" - ,useron.number,useron.alias); - logline("+!",str); - return(0); } - -getnodedat(node_num,&thisnode,1); -if(thisnode.misc&NODE_LOCK) { - putnodedat(node_num,thisnode); /* must unlock! */ - if(!SYSOP && !(useron.exempt&FLAG('N'))) { - bputs(text[NodeLocked]); - sprintf(str,"(%04u) %-25s Locked node logon attempt" - ,useron.number,useron.alias); - logline("+!",str); - return(0); } - if(yesno(text[RemoveNodeLockQ])) { - getnodedat(node_num,&thisnode,1); - logline("S-","Removed Node Lock"); - thisnode.misc&=~NODE_LOCK; } - else - getnodedat(node_num,&thisnode,1); } - -if(onquiet || (useron.exempt&FLAG('Q') && useron.misc&QUIET)) - thisnode.status=NODE_QUIET; -else - thisnode.status=NODE_INUSE; -onquiet=0; -action=thisnode.action=NODE_LOGN; -if(online==ON_LOCAL) - thisnode.connection=0; -else - thisnode.connection=cur_rate; -thisnode.misc&=~(NODE_ANON|NODE_INTR|NODE_MSGW|NODE_POFF|NODE_AOFF); -if(useron.chat&CHAT_NOACT) - thisnode.misc|=NODE_AOFF; -if(useron.chat&CHAT_NOPAGE) - thisnode.misc|=NODE_POFF; -thisnode.useron=useron.number; -putnodedat(node_num,thisnode); - -getusrsubs(); -getusrdirs(); - -if(useron.misc&CURSUB && !(useron.rest&FLAG('G'))) { - for(i=0;i<usrgrps;i++) { - for(j=0;j<usrsubs[i];j++) { - if(!strcmp(sub[usrsub[i][j]]->code,useron.cursub)) - break; } - if(j<usrsubs[i]) { - curgrp=i; - cursub[i]=j; - break; } } - for(i=0;i<usrlibs;i++) { - for(j=0;j<usrdirs[i];j++) - if(!strcmp(dir[usrdir[i][j]]->code,useron.curdir)) - break; - if(j<usrdirs[i]) { - curlib=i; - curdir[i]=j; - break; } } } - - -if(useron.misc&AUTOTERM) { - useron.misc&=~(ANSI|RIP|WIP); - useron.misc|=autoterm; } - -if(!chk_ar(shell[useron.shell]->ar,useron)) { - useron.shell=new_shell; - if(!chk_ar(shell[useron.shell]->ar,useron)) { - for(i=0;i<total_shells;i++) - if(chk_ar(shell[i]->ar,useron)) - break; - if(i==total_shells) - useron.shell=0; } } - -statline=sys_def_stat; -statusline(); -logon_ml=useron.level; -logontime=time(NULL); -starttime=logontime; -last_ns_time=ns_time=useron.ns_time; -// ns_time-=(useron.tlast*60); /* file newscan time == last logon time */ -delfiles(temp_dir,"*.*"); -sprintf(str,"%sMSGS\\N%3.3u.MSG",data_dir,node_num); -remove(str); /* remove any pending node messages */ -sprintf(str,"%sMSGS\\N%3.3u.IXB",data_dir,node_num); -remove(str); /* remove any pending node message indices */ - -if(!SYSOP && online==ON_REMOTE) { - rioctl(IOCM|ABORT); /* users can't abort anything */ - rioctl(IOCS|ABORT); } - -CLS; -if(useron.rows) - rows=useron.rows; -else if(online==ON_LOCAL) - rows=node_scrnlen-1; -unixtodstr(logontime,str); -if(!strncmp(str,useron.birth,5) && !(useron.rest&FLAG('Q'))) { - bputs(text[HappyBirthday]); - pause(); - CLS; - user_event(EVENT_BIRTHDAY); } -unixtodstr(useron.laston,tmp); -if(strcmp(str,tmp)) { /* str still equals logon time */ - useron.ltoday=1; - useron.ttoday=useron.etoday=useron.ptoday=useron.textra=0; - useron.freecdt=level_freecdtperday[useron.level]; } -else - useron.ltoday++; - -gettimeleft(); -sprintf(str,"%sFILE\\%04u.DWN",data_dir,useron.number); -batch_add_list(str); -if(!qwklogon) { /* QWK Nodes don't go through this */ - - if(sys_pwdays - && logontime>(useron.pwmod+((ulong)sys_pwdays*24UL*60UL*60UL))) { - bprintf(text[TimeToChangePw],sys_pwdays); - - c=0; - while(c<LEN_PASS) { /* Create random password */ - str[c]=random(43)+48; - if(isalnum(str[c])) - c++; } - str[c]=0; - bprintf(text[YourPasswordIs],str); - - if(sys_misc&SM_PWEDIT && yesno(text[NewPasswordQ])) - while(online) { - bputs(text[NewPassword]); - getstr(str,LEN_PASS,K_UPPER|K_LINE); - truncsp(str); - if(chkpass(str,useron)) - break; - CRLF; } - - while(online) { - if(sys_misc&SM_PWEDIT) { - CRLF; - bputs(text[VerifyPassword]); } - else - bputs(text[NewUserPasswordVerify]); - console|=CON_R_ECHOX; - if(!(sys_misc&SM_ECHO_PW)) - console|=CON_L_ECHOX; - getstr(tmp,LEN_PASS,K_UPPER); - console&=~(CON_R_ECHOX|CON_L_ECHOX); - if(strcmp(str,tmp)) { - bputs(text[Wrong]); - continue; } - break; } - strcpy(useron.pass,str); - useron.pwmod=time(NULL); - putuserrec(useron.number,U_PWMOD,8,ultoa(useron.pwmod,str,16)); - bputs(text[PasswordChanged]); - pause(); } - if(useron.ltoday>level_callsperday[useron.level] - && !(useron.exempt&FLAG('L'))) { - bputs(text[NoMoreLogons]); - sprintf(str,"(%04u) %-25s Out of logons" - ,useron.number,useron.alias); - logline("+!",str); - hangup(); - return(0); } - if(useron.rest&FLAG('L') && useron.ltoday>1) { - bputs(text[R_Logons]); - sprintf(str,"(%04u) %-25s Out of logons" - ,useron.number,useron.alias); - logline("+!",str); - hangup(); - return(0); } - if(!useron.name[0] && ((uq&UQ_ALIASES && uq&UQ_REALNAME) - || uq&UQ_COMPANY)) - while(online) { - if(uq&UQ_ALIASES && uq&UQ_REALNAME) - bputs(text[EnterYourRealName]); - else - bputs(text[EnterYourCompany]); - getstr(useron.name,LEN_NAME,K_UPRLWR|(uq&UQ_NOEXASC)); - if(uq&UQ_ALIASES && uq&UQ_REALNAME) { - if(trashcan(useron.name,"NAME") || !useron.name[0] - || !strchr(useron.name,SP) - || strchr(useron.name,0xff) - || (uq&UQ_DUPREAL - && userdatdupe(useron.number,U_NAME,LEN_NAME - ,useron.name,0))) - bputs(text[YouCantUseThatName]); - else - break; } - else - break; } - if(uq&UQ_HANDLE && !useron.handle[0]) { - sprintf(useron.handle,"%.*s",LEN_HANDLE,useron.alias); - while(online) { - bputs(text[EnterYourHandle]); - if(!getstr(useron.handle,LEN_HANDLE - ,K_LINE|K_EDIT|K_AUTODEL|(uq&UQ_NOEXASC)) - || strchr(useron.handle,0xff) - || (uq&UQ_DUPHAND - && userdatdupe(useron.number,U_HANDLE,LEN_HANDLE - ,useron.handle,0)) - || trashcan(useron.handle,"NAME")) - bputs(text[YouCantUseThatName]); - else - break; } } - if(uq&UQ_LOCATION && !useron.location[0]) - while(online) { - bputs(text[EnterYourCityState]); - if(getstr(useron.location,LEN_LOCATION,K_UPRLWR|(uq&UQ_NOEXASC))) - break; } - if(uq&UQ_ADDRESS && !useron.address[0]) - while(online) { - bputs(text[EnterYourAddress]); - if(getstr(useron.address,LEN_ADDRESS,K_UPRLWR|(uq&UQ_NOEXASC))) - break; } - if(uq&UQ_ADDRESS && !useron.zipcode[0]) - while(online) { - bputs(text[EnterYourZipCode]); - if(getstr(useron.zipcode,LEN_ZIPCODE,K_UPPER|(uq&UQ_NOEXASC))) - break; } - if(uq&UQ_PHONE && !useron.phone[0]) { - i=yesno(text[CallingFromNorthAmericaQ]); - while(online) { - bputs(text[EnterYourPhoneNumber]); - if(i) { - if(gettmplt(useron.phone,sys_phonefmt - ,K_LINE|(uq&UQ_NOEXASC))<strlen(sys_phonefmt)) - continue; } - else { - if(getstr(useron.phone,LEN_PHONE - ,K_UPPER|(uq&UQ_NOEXASC))<5) - continue; } - if(!trashcan(useron.phone,"PHONE")) - break; } } - if(uq&UQ_COMP && !useron.comp[0]) - getcomputer(useron.comp); - if(new_sif[0]) { - sprintf(str,"%sUSER\\%4.4u.DAT",data_dir,useron.number); - if(flength(str)<1L) - create_sif_dat(new_sif,str); } } -if(!online) { - sprintf(str,"(%04u) %-25s Unsuccessful logon" - ,useron.number,useron.alias); - logline("+!",str); - return(0); } -strcpy(useron.modem,connection); -useron.logons++; -putuserdat(useron); -getmsgptrs(); -sys_status|=SS_USERON; /* moved from further down */ - -if(useron.rest&FLAG('Q')) { - sprintf(str,"(%04u) %-25s QWK Network Connection" - ,useron.number,useron.alias); - logline("++",str); - return(1); } - -/********************/ -/* SUCCESSFUL LOGON */ -/********************/ -totallogons=logonstats(); -sprintf(str,"(%04u) %-25s Logon %lu - %u" - ,useron.number,useron.alias,totallogons,useron.ltoday); -logline("++",str); - -if(!qwklogon && logon_mod[0]) - exec_bin(logon_mod,&main_csi); - -if(thisnode.status!=NODE_QUIET) { - sprintf(str,"%sLOGON.LST",data_dir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR|O_CREAT|O_APPEND); - return(0); } - sprintf(str,text[LastFewCallersFmt],node_num - ,totallogons,useron.alias - ,sys_misc&SM_LISTLOC ? useron.location : useron.note - ,gm->tm_hour,gm->tm_min - ,connection,useron.ltoday); - write(file,str,strlen(str)); - close(file); } - -if(sys_logon[0]) /* execute system logon event */ - external(cmdstr(sys_logon,nulstr,nulstr,NULL),EX_OUTR|EX_OUTL); /* EX_CC */ - -if(qwklogon) - return(1); - -sys_status|=SS_PAUSEON; /* always force pause on during this section */ -main_cmds=xfer_cmds=posts_read=0; -mailw=getmail(useron.number,0); -bprintf(text[SiSysName],sys_name); -bprintf(text[SiNodeNumberName],node_num,node_name); -bprintf(text[LiUserNumberName],useron.number,useron.alias); -bprintf(text[LiLogonsToday],useron.ltoday - ,level_callsperday[useron.level]); -bprintf(text[LiTimeonToday],useron.ttoday - ,level_timeperday[useron.level]+useron.min); -bprintf(text[LiMailWaiting],mailw); -strcpy(str,text[LiSysopIs]); -i=kbd_state(); /* Check scroll lock */ -if(i&16 || (sys_chat_ar[0] && chk_ar(sys_chat_ar,useron))) - strcat(str,text[LiSysopAvailable]); -else - strcat(str,text[LiSysopNotAvailable]); -bprintf("%s\r\n\r\n",str); -if(sys_status&SS_EVENT) - bputs(text[ReducedTime]); -getnodedat(node_num,&thisnode,1); -thisnode.misc&=~(NODE_AOFF|NODE_POFF); -if(useron.chat&CHAT_NOACT) - thisnode.misc|=NODE_AOFF; -if(useron.chat&CHAT_NOPAGE) - thisnode.misc|=NODE_POFF; -putnodedat(node_num,thisnode); -getsmsg(useron.number); /* Moved from further down */ -SYNC; -c=0; -for(i=1;i<=sys_nodes;i++) - if(i!=node_num) { - getnodedat(i,&node,0); - if(node.status==NODE_INUSE - || ((node.status==NODE_QUIET || node.errors) && SYSOP)) { - if(!c) - bputs(text[NodeLstHdr]); - printnodedat(i,node); - c=1; } - if(node.status==NODE_INUSE && i!=node_num && node.useron==useron.number - && !SYSOP && !(useron.exempt&FLAG('G'))) { - strcpy(tmp,"On two nodes at the same time"); - sprintf(str,"(%04u) %-25s %s" - ,useron.number,useron.alias,tmp); - logline("+!",str); - errorlog(tmp); - bputs(text[UserOnTwoNodes]); - hangup(); - return(0); } - if(thisnode.status!=NODE_QUIET - && (node.status==NODE_INUSE || node.status==NODE_QUIET) - && !(node.misc&NODE_AOFF) && node.useron!=useron.number) { - sprintf(str,text[NodeLoggedOnAtNbps] - ,node_num - ,thisnode.misc&NODE_ANON ? text[UNKNOWN_USER] : useron.alias - ,connection); - putnmsg(i,str); } } - -if(sys_exp_warn && useron.expire && useron.expire>now /* Warn user of coming */ - && (useron.expire-now)/(1440L*60L)<=sys_exp_warn) /* expiration */ - bprintf(text[AccountWillExpireInNDays],(useron.expire-now)/(1440L*60L)); - -if(criterrs && SYSOP) - bprintf(text[CriticalErrors],criterrs); -if((i=getuserxfers(0,useron.number,0))!=0) { - bprintf(text[UserXferForYou],i,i>1 ? "s" : nulstr); } -if((i=getuserxfers(useron.number,0,0))!=0) { - bprintf(text[UnreceivedUserXfer],i,i>1 ? "s" : nulstr); } -SYNC; -sys_status&=~SS_PAUSEON; /* Turn off the pause override flag */ -if(online==ON_REMOTE) - rioctl(IOSM|ABORT); /* Turn abort ability on */ -if(mailw) { - if(yesno(text[ReadYourMailNowQ])) - readmail(useron.number,MAIL_YOUR); } -lastnodemsg=0; -if(useron.misc&ASK_NSCAN && yesno(text[NScanAllGrpsQ])) - scanallsubs(SCAN_NEW); -if(useron.misc&ASK_SSCAN && yesno(text[SScanAllGrpsQ])) - scanallsubs(SCAN_TOYOU); -return(1); -} - -/****************************************************************************/ -/* Checks the system DSTS.DAB to see if it is a new day, if it is, all the */ -/* nodes' and the system's CSTS.DAB are added to, and the DSTS.DAB's daily */ -/* stats are cleared. Also increments the logon values in DSTS.DAB if */ -/* applicable. */ -/****************************************************************************/ -ulong logonstats() -{ - char str[256]; - int dsts,csts; - uint i; - struct date update; - time_t update_t; - stats_t stats; - node_t node; - -sprintf(str,"%sDSTS.DAB",ctrl_dir); -if((dsts=nopen(str,O_RDWR))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR); - return(0L); } -read(dsts,&update_t,4); /* Last updated */ -read(dsts,&stats.logons,4); /* Total number of logons on system */ -close(dsts); -if(update_t>now+(24L*60L*60L)) /* More than a day in the future? */ - errormsg(WHERE,ERR_CHK,"Daily stats time stamp",update_t); -unixtodos(update_t,&update,&curtime); -unixtodos(now,&date,&curtime); -if((date.da_day>update.da_day && date.da_mon==update.da_mon) - || date.da_mon>update.da_mon || date.da_year>update.da_year) { - - sprintf(str,"New Day - Prev: %s ",timestr(&update_t)); - logentry("!=",str); - - sys_status|=SS_DAILY; /* New Day !!! */ - sprintf(str,"%sLOGON.LST",data_dir); /* Truncate logon list */ - if((dsts=nopen(str,O_TRUNC|O_CREAT|O_WRONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_TRUNC|O_CREAT|O_WRONLY); - return(0L); } - close(dsts); - for(i=0;i<=sys_nodes;i++) { - if(i) { /* updating a node */ - getnodedat(i,&node,1); - node.misc|=NODE_EVENT; - putnodedat(i,node); } - sprintf(str,"%sDSTS.DAB",i ? node_path[i-1] : ctrl_dir); - if((dsts=nopen(str,O_RDWR))==-1) /* node doesn't have stats yet */ - continue; - sprintf(str,"%sCSTS.DAB",i ? node_path[i-1] : ctrl_dir); - if((csts=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) { - close(dsts); - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT); - continue; } - lseek(dsts,8L,SEEK_SET); /* Skip time and logons */ - write(csts,&now,4); - read(dsts,&stats.ltoday,4); - write(csts,&stats.ltoday,4); - lseek(dsts,4L,SEEK_CUR); /* Skip total time on */ - read(dsts,&stats.ttoday,4); - write(csts,&stats.ttoday,4); - read(dsts,&stats.uls,4); - write(csts,&stats.uls,4); - read(dsts,&stats.ulb,4); - write(csts,&stats.ulb,4); - read(dsts,&stats.dls,4); - write(csts,&stats.dls,4); - read(dsts,&stats.dlb,4); - write(csts,&stats.dlb,4); - read(dsts,&stats.ptoday,4); - write(csts,&stats.ptoday,4); - read(dsts,&stats.etoday,4); - write(csts,&stats.etoday,4); - read(dsts,&stats.ftoday,4); - write(csts,&stats.ftoday,4); - close(csts); - lseek(dsts,0L,SEEK_SET); /* Go back to beginning */ - write(dsts,&now,4); /* Update time stamp */ - lseek(dsts,4L,SEEK_CUR); /* Skip total logons */ - stats.ltoday=0; - write(dsts,&stats.ltoday,4); /* Logons today to 0 */ - lseek(dsts,4L,SEEK_CUR); /* Skip total time on */ - stats.ttoday=0; /* Set all other today variables to 0 */ - write(dsts,&stats.ttoday,4); /* Time on today to 0 */ - write(dsts,&stats.ttoday,4); /* Uploads today to 0 */ - write(dsts,&stats.ttoday,4); /* U/L Bytes today */ - write(dsts,&stats.ttoday,4); /* Download today */ - write(dsts,&stats.ttoday,4); /* Download bytes */ - write(dsts,&stats.ttoday,4); /* Posts today */ - write(dsts,&stats.ttoday,4); /* Emails today */ - write(dsts,&stats.ttoday,4); /* Feedback today */ - write(dsts,&stats.ttoday,2); /* New users Today */ - close(dsts); } } - -if(thisnode.status==NODE_QUIET) /* Quiet users aren't counted */ - return(0L); - -for(i=0;i<2;i++) { - sprintf(str,"%sDSTS.DAB",i ? ctrl_dir : node_dir); - if((dsts=nopen(str,O_RDWR))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR); - return(0L); } - lseek(dsts,4L,SEEK_SET); /* Skip time stamp */ - read(dsts,&stats.logons,4); - read(dsts,&stats.ltoday,4); - stats.logons++; - stats.ltoday++; - lseek(dsts,4L,SEEK_SET); /* Rewind back and overwrite */ - write(dsts,&stats.logons,4); - write(dsts,&stats.ltoday,4); - close(dsts); } -return(stats.logons); -} - - diff --git a/src/sbbs2/logout.c b/src/sbbs2/logout.c deleted file mode 100644 index e3c2ddf10b..0000000000 --- a/src/sbbs2/logout.c +++ /dev/null @@ -1,245 +0,0 @@ -#line 1 "LOGOUT.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -/****************************************************************************/ -/* Function that is called after a user hangs up or logs off */ -/****************************************************************************/ -void logout() -{ - char str[256]; - int done,i,j; - ushort ttoday; - file_t f; - node_t node; - struct date logondate; - struct time lt; - FILE *stream; - -now=time(NULL); -unixtodos(now,&date,&curtime); - -if(!useron.number) { /* Not logged in, so do nothing */ - if(!online) { - sprintf(str,"%02d:%02d%c T:%3u sec\r\n" - ,curtime.ti_hour>12 ? curtime.ti_hour-12 - : curtime.ti_hour==0 ? 12 : curtime.ti_hour, curtime.ti_min - , curtime.ti_hour>=12 ? 'p' : 'a' - ,(uint)(now-answertime)); - logline("@-",str); } - return; } - -strcpy(lastuseron,useron.alias); /* for use with WFC status display */ - -if(useron.rest&FLAG('G')) { /* Reset guest's msg scan cfg */ - putuserrec(useron.number,U_NAME,LEN_NAME,nulstr); - for(i=0;i<total_subs;i++) { - if(sub[i]->misc&SUB_NSDEF) - sub[i]->misc|=SUB_NSCAN; - else - sub[i]->misc&=~SUB_NSCAN; - if(sub[i]->misc&SUB_SSDEF) - sub[i]->misc|=SUB_SSCAN; - else - sub[i]->misc&=~SUB_SSCAN; } - batdn_total=0; } - -if(batdn_total) { - sprintf(str,"%sFILE\\%04u.DWN",data_dir,useron.number); - if((stream=fnopen(&i,str,O_WRONLY|O_TRUNC|O_CREAT))!=NULL) { - for(i=0;i<batdn_total;i++) - fprintf(stream,"%s\r\n",batdn_name[i]); - fclose(stream); } } - -if(sys_status&SS_USERON && thisnode.status!=NODE_QUIET - && !(useron.rest&FLAG('Q'))) - for(i=1;i<=sys_nodes;i++) - if(i!=node_num) { - getnodedat(i,&node,0); - if((node.status==NODE_INUSE || node.status==NODE_QUIET) - && !(node.misc&NODE_AOFF) && node.useron!=useron.number) { - sprintf(str,text[NodeLoggedOff],node_num - ,thisnode.misc&NODE_ANON - ? text[UNKNOWN_USER] : useron.alias); - putnmsg(i,str); } } - -if(!online) { /* NOT re-login */ - - getnodedat(node_num,&thisnode,1); - thisnode.status=NODE_WFC; - thisnode.misc&=~(NODE_INTR|NODE_MSGW|NODE_NMSG - |NODE_UDAT|NODE_POFF|NODE_AOFF|NODE_EXT); - putnodedat(node_num,thisnode); - - if(sys_status&SS_SYSALERT) { - mswait(500); - if(com_port) - dtr(1); - mswait(500); - offhook(); - CLS; - lputs("\r\n\r\nAlerting Sysop..."); - while(!lkbrd(1)) { - beep(1000,200); - nosound(); - mswait(200); } - lkbrd(0); } - - sys_status&=~SS_SYSALERT; - if(sys_logout[0]) /* execute system logoff event */ - external(cmdstr(sys_logout,nulstr,nulstr,NULL),EX_OUTL); /* EX_CC */ - } - -if(logout_mod[0]) - exec_bin(logout_mod,&main_csi); -backout(); -sprintf(str,"%sMSGS\\%4.4u.MSG",data_dir,useron.number); -if(!flength(str)) /* remove any 0 byte message files */ - remove(str); - -delfiles(temp_dir,"*.*"); -putmsgptrs(); -if(!REALSYSOP) - logofflist(); -useron.laston=now; - -ttoday=useron.ttoday-useron.textra; /* billable time used prev calls */ -if(ttoday>=level_timeperday[useron.level]) - i=0; -else - i=level_timeperday[useron.level]-ttoday; -if(i>level_timepercall[useron.level]) /* i=amount of time without min */ - i=level_timepercall[useron.level]; -j=(now-starttime)/60; /* j=billable time online in min */ -if(i<0) i=0; -if(j<0) j=0; - -if(useron.min && j>i) { - j-=i; /* j=time to deduct from min */ - sprintf(str,"Minute Adjustment: %d",-j); - logline(">>",str); - if(useron.min>j) - useron.min-=j; - else - useron.min=0L; - putuserrec(useron.number,U_MIN,10,ultoa(useron.min,str,10)); } - -useron.tlast=(now-logontime)/60; -useron.timeon+=useron.tlast; -useron.ttoday+=useron.tlast; - -if(timeleft>0 && starttime-logontime>0) /* extra time */ - useron.textra+=(starttime-logontime)/60; - -unixtodos(logontime,&logondate,<); -if(logondate.da_day!=date.da_day) { /* date has changed while online */ - putuserrec(useron.number,U_LTODAY,5,"0"); - useron.ttoday=0; /* so zero logons today and time on today */ - useron.textra=0; } /* and extra time */ - - - -putuserrec(useron.number,U_NS_TIME,8,ultoa(last_ns_time,str,16)); -putuserrec(useron.number,U_LASTON,8,ultoa(useron.laston,str,16)); -putuserrec(useron.number,U_TIMEON,5,itoa(useron.timeon,str,10)); -putuserrec(useron.number,U_TTODAY,5,itoa(useron.ttoday,str,10)); -putuserrec(useron.number,U_TEXTRA,5,itoa(useron.textra,str,10)); -putuserrec(useron.number,U_TLAST,5,itoa(useron.tlast,str,10)); - -getusrsubs(); -getusrdirs(); -putuserrec(useron.number,U_CURSUB,8,sub[usrsub[curgrp][cursub[curgrp]]]->code); -putuserrec(useron.number,U_CURDIR,8,dir[usrdir[curlib][curdir[curlib]]]->code); - -sprintf(str,"%02d:%02d%c ",curtime.ti_hour>12 ? curtime.ti_hour-12 - : curtime.ti_hour==0 ? 12 : curtime.ti_hour, curtime.ti_min - , curtime.ti_hour>=12 ? 'p' : 'a'); -if(sys_status&SS_USERON) - sprintf(tmp,"T:%3u R:%3lu P:%3lu E:%3lu F:%3lu " - "U:%3luk %lu D:%3luk %lu" - ,(uint)(now-logontime)/60,posts_read,logon_posts - ,logon_emails,logon_fbacks,logon_ulb/1024UL,logon_uls - ,logon_dlb/1024UL,logon_dls); -else - sprintf(tmp,"T:%3u sec",(uint)(now-answertime)); -strcat(str,tmp); -strcat(str,"\r\n"); -logline("@-",str); -sys_status&=~SS_USERON; -answertime=now; // Incase we're relogging on -} - -/****************************************************************************/ -/* Backout of transactions and statuses for this node */ -/****************************************************************************/ -void backout() -{ - char str[256],code[128],*buf; - int i,file; - long length,l; - file_t f; - -sprintf(str,"%sBACKOUT.DAB",node_dir); -if(flength(str)<1L) { - remove(str); - return; } -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -length=filelength(file); -if((buf=MALLOC(length))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - return; } -if(read(file,buf,length)!=length) { - close(file); - FREE(buf); - errormsg(WHERE,ERR_READ,str,length); - return; } -close(file); -for(l=0;l<length;l+=BO_LEN) { - switch(buf[l]) { - case BO_OPENFILE: /* file left open */ - memcpy(code,buf+l+1,8); - code[8]=0; - for(i=0;i<total_dirs;i++) /* search by code */ - if(!stricmp(dir[i]->code,code)) - break; - if(i<total_dirs) { /* found internal code */ - f.dir=i; - memcpy(&f.datoffset,buf+l+9,4); - closefile(f); } - break; - default: - errormsg(WHERE,ERR_CHK,str,buf[l]); } } -FREE(buf); -remove(str); /* always remove the backout file */ -} - -/****************************************************************************/ -/* Detailed usage stats for each logon */ -/****************************************************************************/ -void logofflist() -{ - char str[256]; - int file; - struct time ontime; - -unixtodos(logontime,&date,&ontime); -sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOL",data_dir,date.da_mon,date.da_day - ,TM_YEAR(date.da_year-1900)); -if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); - return; } -unixtodos(now,&date,&curtime); -sprintf(str,"%-*.*s %-2d %-8.8s %2.2d:%2.2d %2.2d:%2.2d %3d%3ld%3ld%3ld%3ld" - "%3ld%3ld\r\n",LEN_ALIAS,LEN_ALIAS,useron.alias,node_num,connection - ,ontime.ti_hour,ontime.ti_min,curtime.ti_hour,curtime.ti_min - ,(int)(now-logontime)/60,posts_read,logon_posts,logon_emails - ,logon_fbacks,logon_uls,logon_dls); -write(file,str,strlen(str)); -close(file); -} diff --git a/src/sbbs2/mail.c b/src/sbbs2/mail.c deleted file mode 100644 index 4a3adcbe41..0000000000 --- a/src/sbbs2/mail.c +++ /dev/null @@ -1,899 +0,0 @@ -#line 1 "MAIL.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -/****************************************************************************/ -/* Returns the number of pieces of mail waiting for usernumber */ -/* If sent is non-zero, it returns the number of mail sent by usernumber */ -/* If usernumber is 0, it returns all mail on the system */ -/****************************************************************************/ -int getmail(int usernumber, char sent) -{ - char str[128]; - int i=0; - long l; - idxrec_t idx; - -smb_stack(&smb,SMB_STACK_PUSH); -sprintf(smb.file,"%sMAIL",data_dir); -smb.retry_time=smb_retry_time; -sprintf(str,"%s.SID",smb.file); -l=flength(str); -if(l<sizeof(idxrec_t)) - return(0); -if(!usernumber) { - smb_stack(&smb,SMB_STACK_POP); - return(l/sizeof(idxrec_t)); } /* Total system e-mail */ -if(smb_open(&smb)) { - smb_stack(&smb,SMB_STACK_POP); - return(0); } -while(!feof(smb.sid_fp)) { - if(!fread(&idx,sizeof(idxrec_t),1,smb.sid_fp)) - break; - if(idx.attr&MSG_DELETE) - continue; - if((!sent && idx.to==usernumber) - || (sent && idx.from==usernumber)) - i++; } -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); -return(i); -} - -/***************************/ -/* Delete file attachments */ -/***************************/ -void delfattach(uint to, char *title) -{ - char str[128],str2[128],*tp,*sp,*p; - uint i; - -strcpy(str,title); -tp=str; -while(1) { - p=strchr(tp,SP); - if(p) *p=0; - sp=strrchr(tp,'/'); /* sp is slash pointer */ - if(!sp) sp=strrchr(tp,'\\'); - if(sp) tp=sp+1; - sprintf(str2,"%sFILE\\%04u.IN\\%s" /* str2 is path/fname */ - ,data_dir,to,tp); - remove(str2); - if(!p) - break; - tp=p+1; } -sprintf(str,"%sFILE\\%04u.IN",data_dir,to); -rmdir(str); /* remove the dir if it's empty */ -} - - -/****************************************************************************/ -/* Deletes all mail messages for usernumber that have been marked 'deleted' */ -/* smb_locksmbhdr() should be called prior to this function */ -/****************************************************************************/ -int delmail(uint usernumber, int which) -{ - ulong i,l,now; - idxrec_t HUGE16 *idxbuf; - smbmsg_t msg; - -now=time(NULL); -if((i=smb_getstatus(&smb))!=0) { - errormsg(WHERE,ERR_READ,smb.file,i); - return(2); } -if(!smb.status.total_msgs) - return(0); -if((idxbuf=(idxrec_t *)LMALLOC(smb.status.total_msgs*sizeof(idxrec_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,smb.file,smb.status.total_msgs*sizeof(idxrec_t)); - return(-1); } -if((i=smb_open_da(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - LFREE(idxbuf); - return(i); } -if((i=smb_open_ha(&smb))!=0) { - smb_close_da(&smb); - errormsg(WHERE,ERR_OPEN,smb.file,i); - LFREE(idxbuf); - return(i); } -rewind(smb.sid_fp); -for(l=0;l<smb.status.total_msgs;) { - if(!fread(&msg.idx,sizeof(idxrec_t),1,smb.sid_fp)) - break; - if(which==MAIL_ALL && !(msg.idx.attr&MSG_PERMANENT) - && smb.status.max_age && now>msg.idx.time - && (now-msg.idx.time)/(24L*60L*60L)>smb.status.max_age) - msg.idx.attr|=MSG_DELETE; - if(msg.idx.attr&MSG_DELETE && !(msg.idx.attr&MSG_PERMANENT) - && ((which==MAIL_SENT && usernumber==msg.idx.from) - || (which==MAIL_YOUR && usernumber==msg.idx.to) - || (which==MAIL_ANY - && (usernumber==msg.idx.to || usernumber==msg.idx.from)) - || which==MAIL_ALL)) { - /* Don't need to lock message because base is locked */ - if(which==MAIL_ALL && !online) - lprintf(" #%lu",msg.idx.number); - if((i=smb_getmsghdr(&smb,&msg))!=0) - errormsg(WHERE,ERR_READ,smb.file,i); - else { - if(msg.hdr.attr!=msg.idx.attr) { - msg.hdr.attr=msg.idx.attr; - if((i=smb_putmsghdr(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); } - if((i=smb_freemsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_REMOVE,smb.file,i); - if(msg.hdr.auxattr&MSG_FILEATTACH) - delfattach(msg.idx.to,msg.subj); - smb_freemsgmem(&msg); } - continue; } - idxbuf[l]=msg.idx; - l++; } -rewind(smb.sid_fp); -chsize(fileno(smb.sid_fp),0); -for(i=0;i<l;i++) - fwrite(&idxbuf[i],sizeof(idxrec_t),1,smb.sid_fp); -LFREE(idxbuf); -smb.status.total_msgs=l; -smb_putstatus(&smb); -fflush(smb.sid_fp); -smb_close_ha(&smb); -smb_close_da(&smb); -return(0); -} - - -/***********************************************/ -/* Tell the user that so-and-so read your mail */ -/***********************************************/ -void telluser(smbmsg_t msg) -{ - char str[256],*p; - uint usernumber,n; - node_t node; - -if(msg.from_net.type) - return; -if(msg.from_ext) - usernumber=atoi(msg.from_ext); -else { - usernumber=matchuser(msg.from); - if(!usernumber) - return; } -for(n=1;n<=sys_nodes;n++) { /* Tell user */ - getnodedat(n,&node,0); - if(node.useron==usernumber - && (node.status==NODE_INUSE - || node.status==NODE_QUIET)) { - sprintf(str - ,text[UserReadYourMailNodeMsg] - ,node_num,useron.alias); - putnmsg(n,str); - break; } } -if(n>sys_nodes) { - now=time(NULL); - sprintf(str,text[UserReadYourMail] - ,useron.alias,timestr(&now)); - putsmsg(usernumber,str); } -} - -/****************************************************************************/ -/* Loads mail waiting for user number 'usernumber' into the mail array of */ -/* of pointers to mail_t (message numbers and attributes) */ -/* smb_open(&smb) must be called prior */ -/****************************************************************************/ -ulong loadmail(mail_t **mail, uint usernumber, int which, int mode) -{ - int i; - ulong l=0; - idxrec_t idx; - -if((i=smb_locksmbhdr(&smb))!=0) { /* Be sure noone deletes or */ - errormsg(WHERE,ERR_LOCK,smb.file,i); /* adds while we're reading */ - return(0); } -(*mail)=NULL; -rewind(smb.sid_fp); -while(!feof(smb.sid_fp)) { - if(!fread(&idx,sizeof(idxrec_t),1,smb.sid_fp)) - break; - if((which==MAIL_SENT && idx.from!=usernumber) - || (which==MAIL_YOUR && idx.to!=usernumber) - || (which==MAIL_ANY && idx.from!=usernumber && idx.to!=usernumber)) - continue; - if(idx.attr&MSG_DELETE) { - if(mode&LM_QWK) /* Don't included deleted msgs */ - continue; /* in QWK packet */ - if(!(sys_misc&SM_SYSVDELM)) /* Noone can view deleted msgs */ - continue; - if(!SYSOP /* not sysop */ - && !(sys_misc&SM_USRVDELM)) /* users can't view deleted msgs */ - continue; } - if(mode&LM_UNREAD && idx.attr&MSG_READ) - continue; - if(((*mail)=(mail_t *)REALLOC((*mail),sizeof(mail_t)*(l+1))) - ==NULL) { - smb_unlocksmbhdr(&smb); - errormsg(WHERE,ERR_ALLOC,smb.file,sizeof(mail_t)*(l+1)); - return(0); } - (*mail)[l].offset=idx.offset; - (*mail)[l].number=idx.number; - (*mail)[l].to=idx.to; - (*mail)[l].from=idx.from; - (*mail)[l].subj=idx.subj; - (*mail)[l].time=idx.time; - (*mail)[l].attr=idx.attr; - l++; } -smb_unlocksmbhdr(&smb); -return(l); -} - -/************************************************************************/ -/* Deletes all mail waiting for user number 'usernumber' */ -/************************************************************************/ -void delallmail(uint usernumber) -{ - int i; - ulong l,msgs,deleted=0; - mail_t *mail; - smbmsg_t msg; - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,"MAIL",i); - return; } -sprintf(smb.file,"%sMAIL",data_dir); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - smb_stack(&smb,SMB_STACK_POP); - return; } - -msgs=loadmail(&mail,usernumber,MAIL_ANY,0); -if(!msgs) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - return; } -if((i=smb_locksmbhdr(&smb))!=0) { /* Lock the base, so nobody */ - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - FREE(mail); - errormsg(WHERE,ERR_LOCK,smb.file,i); /* messes with the index */ - return; } -for(l=0;l<msgs;l++) { - msg.idx.offset=0; /* search by number */ - if(loadmsg(&msg,mail[l].number)) { /* message still there */ - msg.hdr.attr|=MSG_DELETE; - msg.hdr.attr&=~MSG_PERMANENT; - msg.idx.attr=msg.hdr.attr; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - else - deleted++; - smb_freemsgmem(&msg); - smb_unlockmsghdr(&smb,&msg); } } - -if(msgs) - FREE(mail); -if(deleted && sys_misc&SM_DELEMAIL) - delmail(usernumber,MAIL_ANY); -smb_unlocksmbhdr(&smb); -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); -} - -/****************************************************************************/ -/* Reads mail waiting for usernumber. */ -/****************************************************************************/ -void readmail(uint usernumber, int which) -{ - char str[256],str2[256],str3[256],done=0,domsg=1 - ,*buf,*p,*tp,*sp,ch; - int file,msgs,curmsg,i,j,k,n,m,mismatches=0,act; - long length,l; - ulong last; - file_t fd; - mail_t *mail; - smbmsg_t msg; - -msg.total_hfields=0; /* init to NULL, cause not allocated yet */ - -fd.dir=total_dirs+1; /* temp dir for file attachments */ - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,"MAIL",i); - return; } -sprintf(smb.file,"%sMAIL",data_dir); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } - -msgs=loadmail(&mail,usernumber,which,0); -if(!msgs) { - if(which==MAIL_SENT) - bputs(text[NoMailSent]); - else if(which==MAIL_ALL) - bputs(text[NoMailOnSystem]); - else - bputs(text[NoMailWaiting]); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - return; } - -last=smb.status.last_msg; - -if(which==MAIL_SENT) - act=NODE_RSML; -else if(which==MAIL_ALL) - act=NODE_SYSP; -else - act=NODE_RMAL; -action=act; -if(msgs>1 && which!=MAIL_ALL) { - if(which==MAIL_SENT) - bputs(text[MailSentLstHdr]); - else - bputs(text[MailWaitingLstHdr]); - - for(curmsg=0;curmsg<msgs && !msgabort();curmsg++) { - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=mail[curmsg].offset; - if(!loadmsg(&msg,mail[curmsg].number)) - continue; - smb_unlockmsghdr(&smb,&msg); - bprintf(text[MailWaitingLstFmt],curmsg+1 - ,which==MAIL_SENT ? msg.to - : (msg.hdr.attr&MSG_ANONYMOUS) && !SYSOP ? text[Anonymous] - : msg.from - ,msg.hdr.attr&MSG_DELETE ? '-' : msg.hdr.attr&MSG_READ ? ' ' - : msg.from_net.type || msg.to_net.type ? 'N':'*' - ,msg.subj); - smb_freemsgmem(&msg); - msg.total_hfields=0; } - - ASYNC; - if(!(sys_status&SS_ABORT)) { - bprintf(text[StartWithN],1L); - if((curmsg=getnum(msgs))>0) - curmsg--; - else if(curmsg==-1) { - FREE(mail); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - return; } } - sys_status&=~SS_ABORT; } -else { - curmsg=0; - if(which==MAIL_ALL) - domsg=0; } -if(which==MAIL_SENT) - logline("E","Read sent mail"); -else if(which==MAIL_ALL) - logline("S+","Read all mail"); -else - logline("E","Read mail"); -if(useron.misc&RIP) { - strcpy(str,which==MAIL_YOUR ? "MAILREAD" : which==MAIL_ALL ? - "ALLMAIL" : "SENTMAIL"); - menu(str); } -while(online && !done) { - action=act; - - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - - msg.idx.offset=mail[curmsg].offset; - msg.idx.number=mail[curmsg].number; - msg.idx.to=mail[curmsg].to; - msg.idx.from=mail[curmsg].from; - msg.idx.subj=mail[curmsg].subj; - - if((i=smb_locksmbhdr(&smb))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); - break; } - - if((i=smb_getstatus(&smb))!=0) { - smb_unlocksmbhdr(&smb); - errormsg(WHERE,ERR_READ,smb.file,i); - break; } - smb_unlocksmbhdr(&smb); - - if(smb.status.last_msg!=last) { /* New messages */ - last=smb.status.last_msg; - FREE(mail); - msgs=loadmail(&mail,usernumber,which,0); /* So re-load */ - if(!msgs) - break; - for(curmsg=0;curmsg<msgs;curmsg++) - if(mail[curmsg].number==msg.idx.number) - break; - if(curmsg>=msgs) - curmsg=(msgs-1); - continue; } - - if(!loadmsg(&msg,mail[curmsg].number)) { /* Message header gone */ - if(mismatches>5) { /* We can't do this too many times in a row */ - errormsg(WHERE,ERR_CHK,"message number",mail[curmsg].number); - break; } - FREE(mail); - msgs=loadmail(&mail,usernumber,which,0); - if(!msgs) - break; - if(curmsg>(msgs-1)) - curmsg=(msgs-1); - mismatches++; - continue; } - smb_unlockmsghdr(&smb,&msg); - msg.idx.attr=msg.hdr.attr; - - mismatches=0; - - if(domsg && !(sys_status&SS_ABORT)) { - - show_msg(msg - ,msg.from_ext && msg.idx.from==1 && !msg.from_net.type - ? 0:P_NOATCODES); - - if(msg.hdr.auxattr&MSG_FILEATTACH) { /* Attached file */ - smb_getmsgidx(&smb,&msg); - strcpy(str,msg.subj); /* filenames in title */ - strupr(str); - tp=str; - while(online) { - p=strchr(tp,SP); - if(p) *p=0; - sp=strrchr(tp,'/'); /* sp is slash pointer */ - if(!sp) sp=strrchr(tp,'\\'); - if(sp) tp=sp+1; - padfname(tp,fd.name); - sprintf(str2,"%sFILE\\%04u.IN\\%s" /* str2 is path/fname */ - ,data_dir,msg.idx.to,tp); - length=flength(str2); - if(length<1) - bputs(text[FileNotFound]); - else if(!(useron.exempt&FLAG('T')) && cur_cps && !SYSOP - && length/(ulong)cur_cps>timeleft) - bputs(text[NotEnoughTimeToDl]); - else { - sprintf(str3,text[DownloadAttachedFileQ] - ,tp,ultoac(length,tmp)); - if(length>0L && yesno(str3)) { - if(online==ON_LOCAL) { - bputs(text[EnterPath]); - if(getstr(str3,60,K_LINE|K_UPPER)) { - backslashcolon(str3); - sprintf(tmp,"%s%s",str3,tp); - if(!mv(str2,tmp,which!=MAIL_YOUR)) { - logon_dlb+=length; - logon_dls++; - useron.dls=adjustuserrec(useron.number - ,U_DLS,5,1); - useron.dlb=adjustuserrec(useron.number - ,U_DLB,10,length); - bprintf(text[FileNBytesSent] - ,fd.name,ultoac(length,tmp)); } } } - - else { /* Remote User */ - menu("DLPROT"); - mnemonics(text[ProtocolOrQuit]); - strcpy(str3,"Q"); - for(i=0;i<total_prots;i++) - if(prot[i]->dlcmd[0] - && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(str3,tmp); } - ch=getkeys(str3,0); - for(i=0;i<total_prots;i++) - if(prot[i]->dlcmd[0] && ch==prot[i]->mnemonic - && chk_ar(prot[i]->ar,useron)) - break; - if(i<total_prots) { - j=protocol(cmdstr(prot[i]->dlcmd,str2,nulstr - ,NULL),0); - if((prot[i]->misc&PROT_DSZLOG - && checkprotlog(fd)) - || (!(prot[i]->misc&PROT_DSZLOG) && !j)) { - if(which==MAIL_YOUR) - remove(str2); - logon_dlb+=length; /* Update stats */ - logon_dls++; - useron.dls=adjustuserrec(useron.number - ,U_DLS,5,1); - useron.dlb=adjustuserrec(useron.number - ,U_DLB,10,length); - bprintf(text[FileNBytesSent] - ,fd.name,ultoac(length,tmp)); - sprintf(str3 - ,"Downloaded attached file: %s" - ,fd.name); - logline("D-",str3); } - autohangup(); } } } } - if(!p) - break; - tp=p+1; - while(*tp==SP) tp++; } - sprintf(str,"%sFILE\\%04u.IN",data_dir,usernumber); - rmdir(str); } - if(which==MAIL_YOUR && !(msg.hdr.attr&MSG_READ)) { - mail[curmsg].attr|=MSG_READ; - if(thisnode.status==NODE_INUSE) - telluser(msg); - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=0; /* Search by number */ - if(!smb_locksmbhdr(&smb)) { /* Lock the entire base */ - if(loadmsg(&msg,msg.idx.number)) { - msg.hdr.attr|=MSG_READ; - msg.idx.attr=msg.hdr.attr; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - smb_unlockmsghdr(&smb,&msg); } - smb_unlocksmbhdr(&smb); } - if(!msg.total_hfields) { /* unsuccessful reload */ - domsg=0; - continue; } } - } - else domsg=1; - - if(useron.misc&WIP) { - strcpy(str,which==MAIL_YOUR ? "MAILREAD" : which==MAIL_ALL ? - "ALLMAIL" : "SENTMAIL"); - menu(str); } - - ASYNC; - if(which==MAIL_SENT) - bprintf(text[ReadingSentMail],curmsg+1,msgs); - else if(which==MAIL_ALL) - bprintf(text[ReadingAllMail],curmsg+1,msgs); - else - bprintf(text[ReadingMail],curmsg+1,msgs); - sprintf(str,"ADFLNQRT?<>[]{}-+"); - if(SYSOP) - strcat(str,"CUSP"); - if(which!=MAIL_YOUR) - strcat(str,"E"); - l=getkeys(str,msgs); - if(l&0x80000000L) { - if(l==-1) /* ctrl-c */ - break; - curmsg=(l&~0x80000000L)-1; - continue; } - switch(l) { - case 'A': /* Auto-reply to last piece */ - if(which==MAIL_SENT) - break; - if((msg.hdr.attr&MSG_ANONYMOUS) && !SYSOP) { - bputs(text[CantReplyToAnonMsg]); - break; } - - quotemsg(msg,1); - - if(msg.from_net.type==NET_FIDO) /* FidoNet type */ - sprintf(str,"%s @%s",msg.from - ,faddrtoa(*(faddr_t *)msg.from_net.addr)); - else if(msg.from_net.type==NET_INTERNET) - strcpy(str,msg.from_net.addr); - else if(msg.from_net.type) - sprintf(str,"%s@%s",msg.from,msg.from_net.addr); - else /* No net */ - strcpy(str,msg.from); - - strcpy(str2,str); - - bputs(text[Email]); - if(!getstr(str,64,K_EDIT|K_AUTODEL)) - break; - msg.hdr.number=msg.idx.number; - smb_getmsgidx(&smb,&msg); - - if(!stricmp(str2,str)) /* Reply to sender */ - sprintf(str2,text[Regarding],msg.subj); - else /* Reply to other */ - sprintf(str2,text[RegardingBy],msg.subj,msg.from - ,timestr((time_t *)&msg.hdr.when_written.time)); - - p=strrchr(str,'@'); - if(p) { /* name @addr */ - netmail(str,msg.subj,WM_QUOTE); - sprintf(str2,text[DeleteMailQ],msg.from); } - else { - if(!msg.from_net.type && !stricmp(str,msg.from)) - email(msg.idx.from,str2,msg.subj,WM_EMAIL|WM_QUOTE); - else if(!stricmp(str,"SYSOP")) - email(1,str2,msg.subj,WM_EMAIL|WM_QUOTE); - else if((i=finduser(str))!=0) - email(i,str2,msg.subj,WM_EMAIL|WM_QUOTE); - sprintf(str2,text[DeleteMailQ],msg.from); } - if(!yesno(str2)) { - if(curmsg<msgs-1) curmsg++; - else done=1; - break; } - /* Case 'D': must follow! */ - case 'D': /* Delete last piece (toggle) */ - if(msg.hdr.attr&MSG_PERMANENT) { - bputs("\r\nPermanent message.\r\n"); - domsg=0; - break; } - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=0; - if(loadmsg(&msg,msg.idx.number)) { - msg.hdr.attr^=MSG_DELETE; - msg.idx.attr=msg.hdr.attr; -// mail[curmsg].attr=msg.hdr.attr; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - smb_unlockmsghdr(&smb,&msg); } - if(curmsg<msgs-1) curmsg++; - else done=1; - break; - case 'F': /* Forward last piece */ - domsg=0; - bputs(text[ForwardMailTo]); - if(!getstr(str,LEN_ALIAS,K_UPRLWR)) - break; - i=finduser(str); - if(!i) - break; - domsg=1; - if(curmsg<msgs-1) curmsg++; - else done=1; - smb_getmsgidx(&smb,&msg); - forwardmail(&msg,i); - if(msg.hdr.attr&MSG_PERMANENT) - break; - sprintf(str2,text[DeleteMailQ],msg.from); - if(!yesno(str2)) - break; - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=0; - if(loadmsg(&msg,msg.idx.number)) { - msg.hdr.attr|=MSG_DELETE; - msg.idx.attr=msg.hdr.attr; -// mail[curmsg].attr=msg.hdr.attr; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - smb_unlockmsghdr(&smb,&msg); } - - break; - case 'L': /* List mail */ - domsg=0; - bprintf(text[StartWithN],(long)curmsg+1); - if((i=getnum(msgs))>0) - i--; - else if(i==-1) - break; - else - i=curmsg; - if(which==MAIL_SENT) - bputs(text[MailSentLstHdr]); - else if(which==MAIL_ALL) - bputs(text[MailOnSystemLstHdr]); - else - bputs(text[MailWaitingLstHdr]); - for(;i<msgs && !msgabort();i++) { - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=mail[i].offset; - if(!loadmsg(&msg,mail[i].number)) - continue; - smb_unlockmsghdr(&smb,&msg); - if(which==MAIL_ALL) - bprintf(text[MailOnSystemLstFmt] - ,i+1,msg.from,msg.to - ,msg.hdr.attr&MSG_DELETE ? '-' - : msg.hdr.attr&MSG_READ ? SP - : msg.from_net.type || msg.to_net.type ? 'N':'*' - ,msg.subj); - else - bprintf(text[MailWaitingLstFmt],i+1 - ,which==MAIL_SENT ? msg.to - : (msg.hdr.attr&MSG_ANONYMOUS) && !SYSOP - ? text[Anonymous] : msg.from - ,msg.hdr.attr&MSG_DELETE ? '-' - : msg.hdr.attr&MSG_READ ? SP - : msg.from_net.type || msg.to_net.type ? 'N':'*' - ,msg.subj); - smb_freemsgmem(&msg); - msg.total_hfields=0; } - break; - case 'Q': - done=1; - break; - case 'C': /* Change attributes of last piece */ - i=chmsgattr(msg.hdr.attr); - if(msg.hdr.attr==i) - break; - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=0; - if(loadmsg(&msg,msg.idx.number)) { - msg.hdr.attr=msg.idx.attr=i; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - smb_unlockmsghdr(&smb,&msg); } - break; - case '>': - for(i=curmsg+1;i<msgs;i++) - if(mail[i].subj==msg.idx.subj) - break; - if(i<msgs) - curmsg=i; - else - domsg=0; - break; - case '<': /* Search Title backward */ - for(i=curmsg-1;i>-1;i--) - if(mail[i].subj==msg.idx.subj) - break; - if(i>-1) - curmsg=i; - else - domsg=0; - break; - case '}': /* Search Author forward */ - strcpy(str,msg.from); - for(i=curmsg+1;i<msgs;i++) - if(mail[i].from==msg.idx.from) - break; - if(i<msgs) - curmsg=i; - else - domsg=0; - break; - case 'N': /* Got to next un-read message */ - for(i=curmsg+1;i<msgs;i++) - if(!(mail[i].attr&MSG_READ)) - break; - if(i<msgs) - curmsg=i; - else - domsg=0; - break; - case '{': /* Search Author backward */ - strcpy(str,msg.from); - for(i=curmsg-1;i>-1;i--) - if(mail[i].from==msg.idx.from) - break; - if(i>-1) - curmsg=i; - else - domsg=0; - break; - case ']': /* Search To User forward */ - strcpy(str,msg.to); - for(i=curmsg+1;i<msgs;i++) - if(mail[i].to==msg.idx.to) - break; - if(i<msgs) - curmsg=i; - else - domsg=0; - break; - case '[': /* Search To User backward */ - strcpy(str,msg.to); - for(i=curmsg-1;i>-1;i--) - if(mail[i].to==msg.idx.to) - break; - if(i>-1) - curmsg=i; - else - domsg=0; - break; - case 0: - case '+': - if(curmsg<msgs-1) curmsg++; - else done=1; - break; - case '-': - if(curmsg>0) curmsg--; - break; - case 'S': - domsg=0; -/* - if(!yesno(text[SaveMsgToFile])) - break; -*/ - bputs(text[FileToWriteTo]); - if(getstr(str,40,K_LINE|K_UPPER)) - msgtotxt(msg,str,1,1); - break; - case 'E': - editmsg(&msg,INVALID_SUB); - break; - case 'T': - domsg=0; - i=curmsg; - if(i) i++; - j=i+10; - if(j>msgs) - j=msgs; - - if(which==MAIL_SENT) - bputs(text[MailSentLstHdr]); - else if(which==MAIL_ALL) - bputs(text[MailOnSystemLstHdr]); - else - bputs(text[MailWaitingLstHdr]); - for(;i<j;i++) { - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=mail[i].offset; - if(!loadmsg(&msg,mail[i].number)) - continue; - smb_unlockmsghdr(&smb,&msg); - if(which==MAIL_ALL) - bprintf(text[MailOnSystemLstFmt] - ,i+1,msg.from,msg.to - ,msg.hdr.attr&MSG_DELETE ? '-' - : msg.hdr.attr&MSG_READ ? SP - : msg.from_net.type || msg.to_net.type ? 'N':'*' - ,msg.subj); - else - bprintf(text[MailWaitingLstFmt],i+1 - ,which==MAIL_SENT ? msg.to - : (msg.hdr.attr&MSG_ANONYMOUS) && !SYSOP - ? text[Anonymous] : msg.from - ,msg.hdr.attr&MSG_DELETE ? '-' - : msg.hdr.attr&MSG_READ ? SP - : msg.from_net.type || msg.to_net.type ? 'N':'*' - ,msg.subj); - smb_freemsgmem(&msg); - msg.total_hfields=0; } - curmsg=(i-1); - break; - case 'U': /* user edit */ - msg.hdr.number=msg.idx.number; - smb_getmsgidx(&smb,&msg); - useredit(which==MAIL_SENT ? msg.idx.to : msg.idx.from,0); - break; - case 'P': /* Purge author and all mail to/from */ - if(noyes(text[AreYouSureQ])) - break; - msg.hdr.number=msg.idx.number; - smb_getmsgidx(&smb,&msg); - purgeuser(msg.idx.from); - if(curmsg<msgs-1) curmsg++; - break; - case '?': - strcpy(str,which==MAIL_YOUR ? "MAILREAD" : which==MAIL_ALL - ? "ALLMAIL" : "SENTMAIL"); - menu(str); - if(SYSOP && which==MAIL_SENT) - menu("SYSSMAIL"); - else if(SYSOP && which==MAIL_YOUR) - menu("SYSMAILR"); /* Sysop Mail Read */ - domsg=0; - break; - } } - -if(msg.total_hfields) - smb_freemsgmem(&msg); - -if(msgs) - FREE(mail); - -/***************************************/ -/* Delete messages marked for deletion */ -/***************************************/ - -if(sys_misc&SM_DELEMAIL) { - if((i=smb_locksmbhdr(&smb))!=0) /* Lock the base, so nobody */ - errormsg(WHERE,ERR_LOCK,smb.file,i); /* messes with the index */ - else - delmail(usernumber,which); } - -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); -} - diff --git a/src/sbbs2/main.c b/src/sbbs2/main.c deleted file mode 100644 index ce05b9bf90..0000000000 --- a/src/sbbs2/main.c +++ /dev/null @@ -1,307 +0,0 @@ -#line 1 "MAIN.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/*********************************************************/ -/* Entry point to the BBS and the waitforcall() function */ -/*********************************************************/ - -#include "sbbs.h" -#include "cmdshell.h" - -csi_t main_csi; -uint curshell=0; - -char onquiet=0,qwklogon; -char term_ret=0; -ulong connect_rate=0; /* already connected at xbps */ - -#if __OS2__ -void cbreakh(int sig) /* Ctrl-C */ -{ -sys_status|=SS_ABORT; -signal(sig,cbreakh); -} - -#else - -int cbreakh() /* ctrl-break handler */ -{ -sys_status|=SS_ABORT; -return(1); /* 1 to continue, 0 to abort */ -} -#endif - -/****************************************************************************/ -/* This is the entry point to the BBS from dos */ -/* No arguments are defined as of yet. */ -/****************************************************************************/ -main(int argc, char *argv[]) -{ - char str[256]; - int i,j,file,twenty; - node_t node; - -startup(argc,argv); /* startup code overlaid */ - -while(1) { - - while(1) { - qwklogon=0; - twenty=0; - - /* Reset TEXT.DAT */ - - for(i=0;i<TOTAL_TEXT;i++) - if(text[i]!=text_sav[i]) { - if(text[i]!=nulstr) - FREE(text[i]); - text[i]=text_sav[i]; } - - /* Reset COMMAND SHELL */ - - if(main_csi.cs) - FREE(main_csi.cs); - if(main_csi.str) - FREE(main_csi.str); - freevars(&main_csi); - memset(&main_csi,0,sizeof(csi_t)); - main_csi.str=MALLOC(1024); - if(!main_csi.str) { - errormsg(WHERE,ERR_ALLOC,"command shell",1024); - bail(1); } - memset(main_csi.str,0,1024); - menu_dir[0]=0; - twenty+=10; - - /* Reset Global Variables */ - - if(global_str_var) - for(i=0;i<global_str_vars;i++) - if(global_str_var[i]) { - FREE(global_str_var[i]); - global_str_var[i]=0; } - if(global_str_var) { - FREE(global_str_var); - global_str_var=0; } - if(global_str_var_name) { - FREE(global_str_var_name); - global_str_var_name=0; } - global_str_vars=0; - if(global_int_var) { - FREE(global_int_var); - global_int_var=0; } - if(global_int_var_name) { - FREE(global_int_var_name); - global_int_var_name=0; } - global_int_vars=0; - twenty*=2; - - if(waitforcall()) /* Got caller/logon */ - break; } - - if(qwklogon) { - getsmsg(useron.number); - qwk_sec(); - hangup(); - logout(); - continue; } - - while(useron.number && (main_csi.misc&CS_OFFLINE_EXEC || online)) { - - if(!main_csi.cs || curshell!=useron.shell) { - if(useron.shell>=total_shells) - useron.shell=0; - sprintf(str,"%s%s.BIN",exec_dir,shell[useron.shell]->code); - if((file=nopen(str,O_RDONLY|O_BINARY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY|O_BINARY); - hangup(); - break; } - if(main_csi.cs) - FREE(main_csi.cs); - freevars(&main_csi); - clearvars(&main_csi); - - main_csi.length=filelength(file); - if((main_csi.cs=(uchar *)MALLOC(main_csi.length))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,main_csi.length); - hangup(); - break; } - - if(lread(file,main_csi.cs,main_csi.length)!=main_csi.length) { - errormsg(WHERE,ERR_READ,str,main_csi.length); - close(file); - FREE(main_csi.cs); - main_csi.cs=NULL; - hangup(); - break; } - close(file); - - main_csi.ip=main_csi.cs; - curshell=useron.shell; - menu_dir[0]=0; - menu_file[0]=0; - #ifdef __MSDOS__ - freedosmem=farcoreleft(); - #endif - } - if(exec(&main_csi)) - break; - - if(!(main_csi.misc&CS_OFFLINE_EXEC)) - checkline(); - -#if 0 - if(freedosmem!=farcoreleft()) { - if(freedosmem>farcoreleft()) - errormsg(WHERE,ERR_CHK,"memory",freedosmem-farcoreleft()); - freedosmem=farcoreleft(); } -#endif - } - logout(); - catsyslog(0); - if(!REALSYSOP || sys_misc&SM_SYSSTAT) - logoffstats(); /* Updates both system and node dsts.dab files */ - if(qoc) { - while(!wfc_events(time(NULL))) - ; - catsyslog(0); - if(qoc==1) - offhook(); - lclini(node_scrnlen); - lputc(FF); - bail(0); } - } -} - -/************************************/ -/* encrypted string output function */ -/************************************/ -char *decrypt(ulong l[], char *instr) -{ - static char str[128]; - uchar ch,bits,len; - ushort i,j,lc=0; - -len=(uchar)(l[0]&0x7f)^0x49; -bits=7; -for(i=0,j=0;i<len;i++) { - ch=(char)((l[j]>>bits)&0x7fL); - ch^=(i^0x2c); - str[lc++]=ch; - bits+=7; - if(bits>=26 && i+1<len) { - if(bits==32) - ch=0; - else - ch=(char)((l[j]>>bits)&0x7fL); - bits=(32-bits); - j++; - ch|=((l[j]&0x7f)<<(bits))&0x7f; - i++; - ch^=(i^0x2c); - bits=7-bits; - str[lc++]=ch; } } -str[lc]=0; -if(instr) { - strcpy(instr,str); - return(instr); } -else - return(str); -} - -/****************************************************************************/ -/* Writes NODE.LOG at end of SYSTEM.LOG */ -/****************************************************************************/ -void catsyslog(int crash) -{ - char str[256]; - char HUGE16 *buf; - int i,file; - ulong length; - -if(sys_status&SS_LOGOPEN) { - if(close(logfile)) { - errormsg(WHERE,ERR_CLOSE,"logfile",0); - return; } - sys_status&=~SS_LOGOPEN; } -sprintf(str,"%sNODE.LOG",node_dir); -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -length=filelength(file); -if(length) { - if((buf=(char HUGE16 *)LMALLOC(length))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - return; } - if(lread(file,buf,length)!=length) { - close(file); - errormsg(WHERE,ERR_READ,str,length); - FREE((char *)buf); - return; } - close(file); - now=time(NULL); - unixtodos(now,&date,&curtime); - sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG",data_dir,date.da_mon,date.da_day - ,TM_YEAR(date.da_year-1900)); - if((file=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT); - FREE((char *)buf); - return; } - if(lwrite(file,buf,length)!=length) { - close(file); - errormsg(WHERE,ERR_WRITE,str,length); - FREE((char *)buf); - return; } - close(file); - if(crash) { - for(i=0;i<2;i++) { - sprintf(str,"%sCRASH.LOG",i ? data_dir : node_dir); - if((file=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT); - FREE((char *)buf); - return; } - if(lwrite(file,buf,length)!=length) { - close(file); - errormsg(WHERE,ERR_WRITE,str,length); - FREE((char *)buf); - return; } - close(file); } } - FREE((char *)buf); } -else - close(file); -sprintf(str,"%sNODE.LOG",node_dir); -if((logfile=nopen(str,O_WRONLY|O_TRUNC))==-1) /* Truncate NODE.LOG */ - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC); -else sys_status|=SS_LOGOPEN; -} - -void quicklogonstuff() -{ - int i; - node_t node; - -reset_logon_vars(); - -lclini(node_scrnlen-1); -if(com_port && !DCDHIGH) /* don't take phone offhook if */ - offhook(); /* connected */ -useron.number=1; -getuserdat(&useron); -autoterm=ANSI; -if(!useron.number) - useron.level=99; -console=CON_L_ECHO|CON_L_INPUT; -online=ON_LOCAL; -statline=sys_def_stat; -statusline(); -answertime=logontime=time(NULL); -sprintf(connection,"%.*s",LEN_MODEM,text[Locally]); -cur_rate=14400; -cur_cps=1750; -sys_status|=SS_USERON; -} - - diff --git a/src/sbbs2/main_ovl.c b/src/sbbs2/main_ovl.c deleted file mode 100644 index df989db688..0000000000 --- a/src/sbbs2/main_ovl.c +++ /dev/null @@ -1,839 +0,0 @@ -#line 1 "MAIN_OVL.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "etext.h" -#include <signal.h> - -#ifndef __FLAT__ -#include "spawno.h" -#endif - -uint asmrev; // RCIOL.OBJ revision -char llo=0 // Local logon only - ,nmi=0; // No modem init -char cidarg[65]; // Caller ID arguments -uint addrio; // Additional RIOCTL call on init - -FILE *nodefile_fp,*node_ext_fp,*logfile_fp; - -char prompt[128]; - -extern char *compile_time,*compile_date; - -#ifdef __FLAT__ -int mswtyp=0; -#else -extern mswtyp; -extern uint riobp; -#endif - -extern char onquiet; -extern char term_ret; -extern ulong connect_rate; /* already connected at xbps */ -extern char *wday[],*mon[]; - -#ifdef __OS2__ -extern long _timezone=0L; -extern int _daylight=0L; -#else -extern long timezone=0L; -extern int daylight=0L; -#endif - -#ifdef __OS2__ - extern HEV con_out_sem; - void con_out_thread(void *); -#endif - - -#ifdef __OS2__ -void cbreakh(int sig); -#else -int cbreakh(); -#endif - -void reset_logon_vars(void); - -time_t checktime(void) -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - -void console_test(void) -{ - int i; - time_t start=time(NULL);; - -lclxy(1,1); -online=ON_LOCAL; -console=CON_L_ECHO; -useron.misc=ANSI|COLOR; -for(i=0;i<500;i++) - bprintf("\1n%05d\t\1hWhite\1rRed\1bBlue\1gGreen\001\x82" - "\1mMagenta\t\b\b\1cCyan\1nNormal\1gGreen" - "\1yBrown\1hYellow\1rR\1gG\1bB\1cC\1mM\1yY\1kK" - "\1>\r\n" - ,i); -bprintf("\r\n%lu secs\r\n",time(NULL)-start); -getch(); -lputc(FF); -} - - - - -void startup(int argc, char *argv[]) -{ - char str[256],HUGE16 *buf,c; - void *v; - int i,j,events_only=0; - int file; - ulong l; - node_t node; - struct ffblk ff; - struct tm *gm; -#ifdef __FLAT__ - uchar *cptab; /* unused */ -#else - uchar cptab[1024]; - union REGS reg; -#endif - -#ifdef __MSDOS__ -setcbrk(0); -#endif - -#ifndef __FLAT__ -if((asmrev=*(&riobp-1))!=23) { - printf("Wrong rciol.obj\n"); - exit(1); } -#endif - -#ifdef __OS2__ -signal(SIGINT,cbreakh); -signal(SIGBREAK,cbreakh); -fixkbdmode(); -#elif defined(__MSDOS__) -ctrlbrk(cbreakh); -#endif - -#ifndef __FLAT__ /* no DESQview under OS/2 */ -inDV = 0; -_CX = 0x4445; /* 'DE' */ /* set CX to 4445H; DX to 5351H */ -_DX = 0x5351; /* 'SQ' */ /* (an invalid date) */ -_AX = 0x2B01; /* DOS' set data function */ -geninterrupt( 0x21 ); /* call DOS */ -if ( _AL != 0xFF ) /* if DOS didn't see as invalid */ - _AX = _BX; /* AH=major ver; AL=minor ver */ -else /* DOS saw as invalid */ - _AX = 0; /* no desqview */ -inDV = _AX; /* Save version in inDV flag */ -#endif - -#ifdef __FLAT__ -if(putenv("TZ=UCT0")) - printf("putenv() failed!\n"); -tzset(); -#endif - -if((l=checktime())!=0) { /* Check binary time */ - printf("Time problem (%08lx)\n",l); - exit(1); } - -directvideo=1; /* default to direct video */ - -_fmode=O_BINARY; -nulstr=""; -crlf="\r\n"; -strcpy(cap_fname,"CAPTURE.TXT"); -sys_status=lncntr=tos=criterrs=keybufbot=keybuftop=lbuflen=slcnt=0L; -debug=1; -curatr=LIGHTGRAY; -errorlevel=0; -logcol=1; -next_event=0; -lastuseron[0]=0; -emsver=0; -emshandle=0xffff; -randomize(); -srand(clock()); - -for(i=0;i<127 && environ[i];i++) /* save original environment for execl() */ - envp[i]=environ[i]; -envp[i]=0; - -strcpy(str,getenv("PROMPT")); -if(!strstr(str,"[SBBS]")) { - sprintf(prompt,"PROMPT=[SBBS] %s",str); - putenv(prompt); } - -comspec=getenv("COMSPEC"); - -lputc(FF); - -#ifndef __FLAT__ -node_scrnlen=lclini(0xd<<8); /* Tab expansion, no CRLF expansion */ -#else -node_scrnlen=25; -#endif -lclini(node_scrnlen); -lclatr(LIGHTGRAY); - -#ifdef __OS2__ // Test console speed - -if(DosCreateEventSem(NULL,&con_out_sem,0,0)) { - printf("Can't create console output semaphore.\n"); - exit(2); } - -if(_beginthread(con_out_thread,1024,NULL)==-1) { - printf("Can't start console output thread.\n"); - exit(3); } -//console_test(); -#endif - -#if defined(__OS2__) -lputs(decrypt(VersionNoticeOS2,0)); -#elif defined(__WIN32__) -lputs(decrypt(VersionNoticeW32,0)); -#else -lputs(decrypt(VersionNoticeDOS,0)); -#endif -lputs(decrypt(CopyrightNotice,0)); /* display copyright notice */ -lputc(CR); -lputc(LF); -cidarg[0]=0; -addrio=0; -strcpy(orgcmd,argv[0]); /* build up original command line */ -strcat(orgcmd," "); -for(i=1;i<argc;i++) { - for(c=0;c<strlen(argv[i]);c++) - switch(toupper(argv[i][c])) { - case '/': /* ignore these characters */ - case '-': - break; - case 'B': /* desqview or other that needs bios video only */ - directvideo=0; - strcat(orgcmd,"B"); - break; - case 'C': /* connected at xbps */ - connect_rate=atol(argv[i]+c+1); - c=strlen(argv[i]); - break; - case 'D': /* assume DCD is always high */ - sys_status|=SS_DCDHIGH; - strcat(orgcmd,"D"); - break; - case 'E': - next_event=time(NULL)+(atol(argv[i]+c+1)*60L); - c=strlen(argv[i]); - break; - case 'F': - sys_status|=SS_DAILY; - break; -#ifdef __OS2__ - case 'H': - rio_handle=atoi(argv[i]+c+1); - c=strlen(argv[i]); - break; -#endif - case 'I': /* no modem init */ - strcat(orgcmd,"I"); - nmi=1; - break; - case 'L': /* local logon only */ - strcat(orgcmd,"L"); - llo=1; - break; - case 'M': /* modem debug info */ - strcat(orgcmd,"M"); - sys_status|=SS_MDMDEBUG; - break; - case 'O': /* execute events only */ - events_only=1; - break; - case 'Q': /* quit after one caller - phone off hook */ - strcat(orgcmd,"Q"); - qoc=1; - break; - case 'R': /* additional rioctl call */ - addrio=ahtoul(argv[i]+c+1); - c=strlen(argv[i]); - break; - case 'X': /* quit after one caller - phone on hook */ - strcat(orgcmd,"X"); - qoc=2; - break; - case 'Z': - sprintf(cidarg,"%-.64s",argv[i]+c+1); - c=strlen(argv[i]); - break; - case 'V': - lputs(crlf); - lprintf("Revision %c%s %s %.5s " - #ifdef __FLAT__ - "RIOLIB %u.%02u" - #else - "RCIOL %u" - #endif - " SMBLIB %s BCC %X.%02X" - ,REVISION,BETA,compile_date,compile_time - #ifdef __FLAT__ - ,rioctl(GVERS)/100,rioctl(GVERS)%100 - #else - ,rioctl(GVERS) - #endif - ,smb_lib_ver() - ,__BORLANDC__>>8 - ,__BORLANDC__&0xff); - lputs(crlf); - bail(0); - default: - lputs("\r\nusage: sbbs [bdmoqxfliv] [c#] [e#] [zs] [r#] [h#]" - "\r\n\r\n" - "b = use bios for video\r\n" - "d = assume DCD is always high\r\n" - "m = modem debug output\r\n" - "q = quit after one call (phone off hook)\r\n" - "x = quit after one call\r\n" - "o = execute events only and then quit\r\n" - "c# = connected at # bps (ex: c2400)\r\n" - "e# = external event in # minutes (ex: e30)\r\n" - "f = force daily event\r\n" - "l = local logon only\r\n" - "i = no modem initialization\r\n" - "zs = use s for caller-id information\r\n" - "r# = additional rioctl call during port init\r\n" - "h# = open port handle (SBBS4OS2 only)\r\n" - "v = version information\r\n" - ); - bail(0); } } - - -node_disk=getdisk(); -getcwd(node_dir,MAXDIR); /* Get current Directory */ -if(strlen(node_dir)>40) { - lputs("\r\n\7Current Directory is too long for bbs to run reliably.\r\n"); - bail(1); } -strcat(node_dir,"\\"); -initdata(); /* auto-sense scrnlen can be overridden */ - -mswtyp=0; -if(node_misc&NM_INT28) - mswtyp|=TS_INT28; -if(node_misc&NM_WINOS2) - mswtyp|=TS_WINOS2; -if(node_misc&NM_NODV) - mswtyp|=TS_NODV; - -#ifndef __FLAT__ - -__spawn_ext = (node_swap & SWAP_EXT) != 0 ; -__spawn_ems = (node_swap & SWAP_EMS) != 0 ; -__spawn_xms = (node_swap & SWAP_XMS) != 0 ; - -#endif - -#ifndef __FLAT__ /* no EMS under OS/2 */ -if(node_misc&NM_EMSOVL) { - lputs("\r\nEMS: "); - if((i=open("EMMXXXX0",O_RDONLY))==-1) - lputs("not installed."); - else { - close(i); - reg.h.ah=0x46; /* Get EMS version */ - int86(0x67,®,®); - if(reg.h.ah) - lputs("\7error getting version."); - else { - lprintf("Version %u.%u ",(reg.h.al&0xf0)>>4,reg.h.al&0xf); - emsver=reg.h.al; - reg.h.ah=0x4b; /* get handle count */ - int86(0x67,®,®); - if(reg.h.ah) - lputs("\7error getting handle count."); - else { - if(_OvrInitEms(0,0,23)) /* use up to 360K */ - lprintf("allocation failed."); - else - emshandle=reg.x.bx; } } } } -#endif - -sprintf(str,"%s%s",ctrl_dir,"NODE.DAB"); -if((nodefile_fp=fnopen(&nodefile,str - ,O_DENYNONE|O_RDWR|O_CREAT))==NULL) { - lprintf("\r\n\7Error opening/creating %s\r\n",str); - exit(1); } -sprintf(str,"%s%s",ctrl_dir,"NODE.EXB"); -if((node_ext_fp=fnopen(&node_ext,str,O_DENYNONE|O_RDWR|O_CREAT))==NULL) { - lprintf("\r\n\7Error opening/creating %s\r\n",str); - exit(1); } -memset(&node,0,sizeof(node_t)); /* write NULL to node struct */ -node.status=NODE_OFFLINE; -while(filelength(nodefile)<sys_nodes*sizeof(node_t)) { - lseek(nodefile,0L,SEEK_END); - write(nodefile,&node,sizeof(node_t)); } -if(lock(nodefile,(node_num-1)*sizeof(node_t),sizeof(node_t)) - || unlock(nodefile,(node_num-1)*sizeof(node_t),sizeof(node_t))) { - lprintf("\r\n\7File locking failed.\r\n"); - -#ifndef __FLAT__ /* no SHARE under Win32 and OS/2 */ - reg.x.ax=0x1000; - int86(0x2f,®,®); - if(!reg.h.al) { - lputs("SHARE is not installed. Must run SHARE before SBBS.\r\n"); - lputs("SHARE.EXE is included with DOS v3.0 and higher.\r\n"); } - else if(reg.h.al==1) - lputs("SHARE is not installed and NOT OKAY to install.\r\n"); - else if(reg.h.al==0xff) - lputs("SHARE is installed.\r\n"); - else - lprintf("INT 2F returned %xh in AL.\r\n",reg.h.al); -#endif - - bail(1); } -sys_status|=SS_NODEDAB; /* says that node.dab is okay to use */ -getnodedat(node_num,&thisnode,1); - -/* if not returning, clear node.dab record */ -if(!connect_rate) { - thisnode.status=thisnode.action=thisnode.useron=0; - thisnode.aux=0; /* use to always clear */ - thisnode.misc&=NODE_EVENT; } /* turn off all misc bits but event */ -criterrs=thisnode.errors; -putnodedat(node_num,thisnode); - -if(com_base==0xb) - rioctl(I14PC); -else if(com_base==0xd) - rioctl(I14DB); -else if(com_base==0xe) - rioctl(I14PS); -else if(com_base==0xf) - rioctl(I14FO); -if(com_port) { - comini(); - setrate(); } - -for(i=0;i<total_qhubs;i++) { - if(qhub[i]->node!=node_num) - continue; - for(j=0;j<10;j++) { - sprintf(str,"%s%s.QW%c",data_dir,qhub[i]->id,j ? (j-1)+'0' : 'K'); - if(fexist(str)) { - lclini(node_scrnlen-1); - delfiles(temp_dir,"*.*"); - unpack_qwk(str,i); } } } - -sprintf(str,"%sTIME.DAB",ctrl_dir); -if((file=nopen(str,O_RDWR|O_CREAT))==-1) { - lprintf("Error opening/creating %s\r\n",str); - bail(1); } -for(i=0;i<total_events;i++) { - event[i]->last=0; - if(filelength(file)<sizeof(time_t)*(i+1)) - write(file,&event[i]->last,sizeof(time_t)); - else - read(file,&event[i]->last,sizeof(time_t)); } - -close(file); - -sprintf(str,"%sQNET.DAB",ctrl_dir); -if((file=nopen(str,O_RDWR|O_CREAT))==-1) { - lprintf("Error opening/creating %s\r\n",str); - bail(1); } - -for(i=0;i<total_qhubs;i++) { - qhub[i]->last=0; - if(filelength(file)<sizeof(time_t)*(i+1)) - write(file,&qhub[i]->last,sizeof(time_t)); - else - read(file,&qhub[i]->last,sizeof(time_t)); } - -close(file); - -sprintf(str,"%sPNET.DAB",ctrl_dir); -if((file=nopen(str,O_RDWR|O_CREAT))==-1) { - lprintf("Error opening/creating %s\r\n",str); - bail(1); } - -for(i=0;i<total_phubs;i++) { - phub[i]->last=0; - if(filelength(file)<sizeof(time_t)*(i+1)) - write(file,&phub[i]->last,sizeof(time_t)); - else - read(file,&phub[i]->last,sizeof(time_t)); } - -close(file); - -sprintf(str,"%sNODE.LOG",node_dir); -lprintf("\r\nOpening %s...",str); -if((logfile_fp=fnopen(&logfile,str,O_WRONLY|O_CREAT|O_APPEND|O_DENYALL))==NULL) { - lprintf("\r\n\7Error opening %s\r\n\r\n" - "Perhaps this node is already running.\r\n",str); - bail(1); } -lprintf("\r%s opened.",str); -sys_status|=SS_LOGOPEN; -if(filelength(logfile)) { - log(crlf); - now=time(NULL); - gm=localtime(&now); - sprintf(str,"%02d:%02d%c %s %s %02d %u " - "End of preexisting log entry (possible crash)" - ,gm->tm_hour>12 ? gm->tm_hour-12 : gm->tm_hour==0 ? 12 : gm->tm_hour - ,gm->tm_min,gm->tm_hour>=12 ? 'p' : 'a',wday[gm->tm_wday] - ,mon[gm->tm_mon],gm->tm_mday,gm->tm_year+1900); - logline("L!",str); - log(crlf); - catsyslog(1); } -lputc(CLREOL); -sprintf(dszlog,"DSZLOG=%sPROTOCOL.LOG",node_dir); -putenv(dszlog); /* Makes the DSZ LOG active */ -sprintf(sbbsnode,"SBBSNODE=%s",node_dir); -putenv(sbbsnode); /* create enviornment var to contain node num */ -sprintf(sbbsnnum,"SBBSNNUM=%d",node_num); -putenv(sbbsnnum); /* create enviornment var to contain node num */ -backout(); -if(events_only) { - reset_logon_vars(); - while(!wfc_events(time(NULL))) - ; - bail(0); } -} - -/****************************************************************************/ -/* Reads data from DSTS.DAB into stats structure */ -/* If node is zero, reads from ctrl\dsts.dab, otherwise from each node */ -/****************************************************************************/ -void getstats(char node,stats_t *stats) -{ - char str[256]; - int file; - -sprintf(str,"%sDSTS.DAB",node ? node_path[node-1] : ctrl_dir); -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -lseek(file,4L,SEEK_SET); /* Skip update time/date */ -read(file,stats,sizeof(stats_t)); -close(file); -} - - -/****************************************************************************/ -/* Updates dstst.dab file upon user logoff. */ -/* First node, then system stats. */ -/****************************************************************************/ -void logoffstats() -{ - char str[256]; - int i,file; - stats_t stats; - -for(i=0;i<2;i++) { - sprintf(str,"%sDSTS.DAB",i ? ctrl_dir : node_dir); - if((file=nopen(str,O_RDWR))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR); - return; } - lseek(file,12L,SEEK_SET); /* Skip timestamp, logons and logons today */ - read(file,&stats.timeon,4); /* Total time on system */ - stats.timeon+=(now-logontime)/60; - read(file,&stats.ttoday,4); /* Time today on system */ - stats.ttoday+=(now-logontime)/60; - read(file,&stats.uls,4); /* Uploads today */ - stats.uls+=logon_uls; - read(file,&stats.ulb,4); /* Upload bytes today */ - stats.ulb+=logon_ulb; - read(file,&stats.dls,4); /* Downloads today */ - stats.dls+=logon_dls; - read(file,&stats.dlb,4); /* Download bytes today */ - stats.dlb+=logon_dlb; - read(file,&stats.ptoday,4); /* Posts today */ - if(!(useron.rest&FLAG('Q'))) - stats.ptoday+=logon_posts; - read(file,&stats.etoday,4); /* Emails today */ - stats.etoday+=logon_emails; - read(file,&stats.ftoday,4); /* Feedback sent today */ - stats.ftoday+=logon_fbacks; - read(file,&stats.nusers,2); /* New users today */ - if(sys_status&SS_NEWUSER) - stats.nusers++; - lseek(file,12L,SEEK_SET); - write(file,&stats.timeon,4); /* Total time on system */ - write(file,&stats.ttoday,4); /* Time today on system */ - write(file,&stats.uls,4); /* Uploads today */ - write(file,&stats.ulb,4); /* Upload bytes today */ - write(file,&stats.dls,4); /* Downloads today */ - write(file,&stats.dlb,4); /* Download bytes today */ - write(file,&stats.ptoday,4); /* Posts today */ - write(file,&stats.etoday,4); /* Emails today */ - write(file,&stats.ftoday,4); /* Feedback sent today */ - write(file,&stats.nusers,2); /* New users today */ - close(file); } - -} - -/****************************************************************************/ -/* Lists system statistics for everyday the bbs has been running. */ -/* Either for the current node (node=1) or the system (node=0) */ -/****************************************************************************/ -void printstatslog(uint node) -{ - char str[256]; - uchar *buf; - int file; - time_t timestamp; - long l; - ulong length, - logons, - timeon, - posts, - emails, - fbacks, - ulb, - uls, - dlb, - dls; - -if(node) - bprintf(text[NodeStatsLogHdr],node); -else - bputs(text[SysStatsLogHdr]); -sprintf(str,"%sCSTS.DAB",node ? node_path[node-1] : ctrl_dir); -if((file=nopen(str,O_RDONLY))==-1) - return; -length=filelength(file); -if(length<40) { - close(file); - return; } -if((buf=(char *)MALLOC(length))==0) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - return; } -read(file,buf,length); -close(file); -l=length-4; -while(l>-1L && !msgabort()) { - fbacks=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - emails=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - posts=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - dlb=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - dls=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - ulb=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - uls=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - timeon=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - logons=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - timestamp=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - unixtodos(timestamp-(24*60*60),&date,&curtime); /* 1 day less than stamp */ - bprintf(text[SlogFmt] - ,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900),timeon,logons,posts,emails - ,fbacks,ulb/1024,uls,dlb/1024,dls); } -FREE(buf); -} - -#ifdef __OS2__ -#define INPUT_LOOP 1000 -#else -#define INPUT_LOOP 1000 -#endif - -/****************************************************************************/ -/* Terminal mode */ -/* Returns 1 if it is to logon locally, 0 if it is done. */ -/****************************************************************************/ -char terminal() -{ - char str[256],c,x,y,*p; - int file; - uint i,l; - -lclini(node_scrnlen-1); -statline=-1; -statusline(); -if(!term_ret) { -#ifdef __FLAT__ - setbaud(com_rate); -#else - setbaud((uint)(com_rate&0xffffL)); -#endif - mdmcmd(mdm_term); } -else - lputs("\r\nReturned.\r\n"); - -l=0; /* l is the ansi response code counter */ - -while(1) { - if(lkbrd(1)) { - i=lkbrd(0); - if((i&0xff)==0) { - i>>=8; - if(i==45) { /* Alt-X */ - rioctl(0x11); - if(DCDHIGH) { - lputs("\r\nHang up (Yes/No/Abort) ? "); - c=toupper(getch()); - if(c!='Y' && c!='N') { /* Hang-up Y/N/Abort */ - lputs("Abort\r\n"); - continue; } - if(c=='Y') { /* Yes, hang-up */ - if(mdm_misc&MDM_NODTR) - mdmcmd(mdm_hang); - else - if(dtr(15)) - lputs("Dropping DTR Failed"); } } - break; } - else if(i==35) { /* Alt-H */ - if(mdm_misc&MDM_NODTR) - mdmcmd(mdm_hang); - else - if(dtr(15)) - lputs("Dropping DTR Failed\r\n"); - dtr(1); } - else if((i>=0x3b &&i<=0x44) || (i>=0x54 &&i<=0x71) - || (i>=0x85 &&i<=0x8c)) { - sprintf(str,"%s%sF%d.MAC",text_dir - ,i<0x45 || (i>=0x85 && i<=0x86) ? nulstr - :i<0x5e || (i>=0x87 && i<=0x88) ? "SHFT-" - :i<0x68 || (i>=0x89 && i<=0x8a) ? "CTRL-" : "ALT-" - ,i<0x45 ? i-0x3a : i<0x5e ? i-0x53 : i<0x68 ? i-0x5d - :i<0x72 ? i-0x67 : i<0x87 ? i-0x7a : i<0x89 ? i-0x7c - :i<0x8b ? i-0x7e : i-0x80); - if((file=nopen(str,O_RDONLY))==-1) - continue; - i=filelength(file); - while(i--) { - read(file,&c,1); - if(c!=LF) - putcomch(c); } - close(file); } - else if(i==0x48) /* up arrow */ - putcom("\x1b[A"); - else if(i==0x50) /* dn arrow */ - putcom("\x1b[B"); - else if(i==0x4b) /* left */ - putcom("\x1b[D"); - else if(i==0x4d) /* right */ - putcom("\x1b[C"); - else if(i==0x16) { /* Alt-U User Edit */ - if((p=MALLOC((node_scrnlen*80)*2))==NULL) { - lputs("Allocation error.\r\n"); - continue; } - gettext(1,1,80,node_scrnlen,p); - x=lclwx(); - y=lclwy(); - quicklogonstuff(); - useredit(0,1); - puttext(1,1,80,node_scrnlen,p); - FREE(p); - lclxy(x,y); } - else if(i==0x26) { /* Alt-L logon locally */ - lputc(FF); - quicklogonstuff(); - if(!useron.number) { - lputc(7); - lputs("A Sysop account hasn't been created"); - continue; } - term_ret=1; - return(1); } - else if(i==0x20) { /* Alt-D Shell to DOS */ - if((p=MALLOC((node_scrnlen*80)*2))==NULL) { - lputs("Allocation error.\r\n"); - continue; } - gettext(1,1,80,node_scrnlen,p); - x=lclwx(); - y=lclwy(); - lclini(node_scrnlen); - lputc(FF); - external(comspec,0); - puttext(1,1,80,node_scrnlen,p); - FREE(p); - lclxy(x,y); } } - else { - putcomch(i); - continue; } } - for(i=0;i<INPUT_LOOP;i++) { - if((c=incom())!=0) { - if(c==ESC) - l=!l; - else if(l) { - if(c=='[') { - if(l!=1) l=0; else l++; } - else if(c=='6') { - if(l!=2) l=0; else l++; } - else if(c=='n') { - if(l==3) { - sprintf(str,"\x1b[%u;%uR" - ,lclwy(),lclwx()); - putcom(str); } - l=0; } - else l=0; } - outcon(c); } - else - break; } - if(!c) - mswait(0); } -term_ret=0; -return(0); -} - - -/****************************************************************************/ -/* Exits bbs to DOS with appropriate error code after setting COM port isr */ -/* back to normal. */ -/****************************************************************************/ -void bail(int code) -{ - -if(sys_status&SS_COMISR) - rioini(0,0); - -lclatr(LIGHTGRAY); -if(code) { - getnodedat(node_num,&thisnode,1); - criterrs=++thisnode.errors; - putnodedat(node_num,thisnode); - now=time(NULL); - lprintf("\r\nExiting with errorlevel (%d) on %s\r\n",code,timestr(&now)); - if(sys_misc&SM_ERRALARM) { - beep(500,220); beep(250,220); - beep(500,220); beep(250,220); - beep(500,220); beep(250,220); - nosound(); } } - -if(sys_status&SS_INITIAL) { - getnodedat(node_num,&thisnode,1); - thisnode.status=NODE_OFFLINE; - putnodedat(node_num,thisnode); - close(nodefile); - close(node_ext); } - -exit(code); -} - - diff --git a/src/sbbs2/main_sec.c b/src/sbbs2/main_sec.c deleted file mode 100644 index deb0e7e510..0000000000 --- a/src/sbbs2/main_sec.c +++ /dev/null @@ -1,330 +0,0 @@ -#line 1 "MAIN_SEC.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/******************************************************/ -/* This file contains the single function, main_sec() */ -/******************************************************/ - -#include "sbbs.h" - -extern void logoff(); - -void main_cfg_cmd(); -void main_ext_cmd(char ch); -void main_str_cmd(char *str); -void sysop_page(void); -ulong getposts(uint subnum); - -char no_rip_menu=0; - -void new_scan_ptr_cfg() -{ - char str[128]; - long i,j,s; - ulong l; - time_t t,lt; - -while(online) { - bputs(text[CfgGrpLstHdr]); - for(i=0;i<usrgrps && online;i++) { - checkline(); - if(i<9) outchar(SP); - if(i<99) outchar(SP); - bprintf(text[CfgGrpLstFmt],i+1,grp[usrgrp[i]]->lname); } - SYNC; - mnemonics(text[WhichOrAll]); - s=getkeys("AQ",i); - if(!s || s==-1 || s=='Q') - break; - if(s=='A') { - mnemonics("\r\nEnter number of messages from end, ~Date, ~Quit, or" - " [Last Message]: "); - s=getkeys("DLQ",9999); - if(s==-1 || s=='Q') - continue; - if(s=='D') { - t=time(NULL); - if(inputnstime(&t) && !(sys_status&SS_ABORT)) { - bputs(text[LoadingMsgPtrs]); - for(i=0;i<usrgrps && online;i++) - for(j=0;j<usrsubs[i] && online;j++) { - checkline(); - sub[usrsub[i][j]]->ptr=getmsgnum(usrsub[i][j],t); } } - continue; } - if(s=='L') - s=0; - if(s) - s&=~0x80000000L; - bputs(text[LoadingMsgPtrs]); - for(i=0;i<usrgrps;i++) - for(j=0;j<usrsubs[i] && online;j++) { - checkline(); - getlastmsg(usrsub[i][j],&l,0); - if(s>l) - sub[usrsub[i][j]]->ptr=0; - else - sub[usrsub[i][j]]->ptr=l-s; } - continue; } - i=(s&~0x80000000L)-1; - while(online) { - l=0; - bprintf(text[CfgSubLstHdr],grp[usrgrp[i]]->lname); - for(j=0;j<usrsubs[i] && online;j++) { - checkline(); - if(j<9) outchar(SP); - if(j<99) outchar(SP); - t=getmsgtime(usrsub[i][j],sub[usrsub[i][j]]->ptr); - if(t>l) - l=t; - bprintf(text[SubPtrLstFmt],j+1,sub[usrsub[i][j]]->lname - ,timestr(&t),nulstr); } - SYNC; - mnemonics(text[WhichOrAll]); - s=getkeys("AQ",j); - if(sys_status&SS_ABORT) { - lncntr=0; - return; } - if(s==-1 || !s || s=='Q') - break; - if(s=='A') { /* The entire group */ - mnemonics("\r\nEnter number of messages from end, ~Date, ~Quit, or" - " [Last Message]: "); - s=getkeys("DLQ",9999); - if(s==-1 || s=='Q') - continue; - if(s=='D') { - t=l; - if(inputnstime(&t) && !(sys_status&SS_ABORT)) { - bputs(text[LoadingMsgPtrs]); - for(j=0;j<usrsubs[i] && online;j++) { - checkline(); - sub[usrsub[i][j]]->ptr=getmsgnum(usrsub[i][j],t); } } - continue; } - if(s=='L') - s=0; - if(s) - s&=~0x80000000L; - bputs(text[LoadingMsgPtrs]); - for(j=0;j<usrsubs[i] && online;j++) { - checkline(); - getlastmsg(usrsub[i][j],&l,0); - if(s>l) - sub[usrsub[i][j]]->ptr=0; - else - sub[usrsub[i][j]]->ptr=l-s; } - continue; } - else { - j=(s&~0x80000000L)-1; - mnemonics("\r\nEnter number of messages from end, ~Date, ~Quit, or" - " [Last Message]: "); - s=getkeys("DLQ",9999); - if(s==-1 || s=='Q') - continue; - if(s=='D') { - t=getmsgtime(usrsub[i][j],sub[usrsub[i][j]]->ptr); - if(inputnstime(&t) && !(sys_status&SS_ABORT)) { - bputs(text[LoadingMsgPtrs]); - sub[usrsub[i][j]]->ptr=getmsgnum(usrsub[i][j],t); } - continue; } - if(s=='L') - s=0; - if(s) - s&=~0x80000000L; - getlastmsg(usrsub[i][j],&l,0); - if(s>l) - sub[usrsub[i][j]]->ptr=0; - else - sub[usrsub[i][j]]->ptr=l-s; } - } } -} - -void new_scan_cfg(ulong misc) -{ - long s; - ulong i,j; - ulong t; - -while(online) { - bputs(text[CfgGrpLstHdr]); - for(i=0;i<usrgrps && online;i++) { - checkline(); - if(i<9) outchar(SP); - if(i<99) outchar(SP); - bprintf(text[CfgGrpLstFmt],i+1,grp[usrgrp[i]]->lname); } - SYNC; - if(misc&SUB_NSCAN) - mnemonics(text[NScanCfgWhichGrp]); - else - mnemonics(text[SScanCfgWhichGrp]); - s=getnum(i); - if(s<1) - break; - i=s-1; - while(online) { - if(misc&SUB_NSCAN) - misc&=~SUB_YSCAN; - bprintf(text[CfgSubLstHdr],grp[usrgrp[i]]->lname); - for(j=0;j<usrsubs[i] && online;j++) { - checkline(); - if(j<9) outchar(SP); - if(j<99) outchar(SP); - bprintf(text[CfgSubLstFmt],j+1 - ,sub[usrsub[i][j]]->lname - ,sub[usrsub[i][j]]->misc&misc ? - (misc&SUB_NSCAN && sub[usrsub[i][j]]->misc&SUB_YSCAN) ? - "To You Only" : text[On] : text[Off]); - } - SYNC; - if(misc&SUB_NSCAN) - mnemonics(text[NScanCfgWhichSub]); - else - mnemonics(text[SScanCfgWhichSub]); - s=getkeys("AQ",j); - if(sys_status&SS_ABORT) { - lncntr=0; - return; } - if(!s || s==-1 || s=='Q') - break; - if(s=='A') { - t=sub[usrsub[i][0]]->misc&misc; - if(misc&SUB_NSCAN && !t) - if(!noyes("Messages to you only")) - misc|=SUB_YSCAN; - for(j=0;j<usrsubs[i] && online;j++) { - checkline(); - if(t) sub[usrsub[i][j]]->misc&=~misc; - else { - if(misc&SUB_NSCAN) - sub[usrsub[i][j]]->misc&=~SUB_YSCAN; - sub[usrsub[i][j]]->misc|=misc; } } - continue; } - j=(s&~0x80000000L)-1; - if(misc&SUB_NSCAN && !(sub[usrsub[i][j]]->misc&misc)) { - if(!noyes("Messages to you only")) - sub[usrsub[i][j]]->misc|=SUB_YSCAN; - else - sub[usrsub[i][j]]->misc&=~SUB_YSCAN; } - sub[usrsub[i][j]]->misc^=misc; } } -} - -/****************************************************************************/ -/* Performs a new message scan all all sub-boards */ -/****************************************************************************/ -void scanallsubs(char mode) -{ - char str[256]; - int i,j,found=0; - -if(/* action==NODE_MAIN && */ mode&(SCAN_FIND|SCAN_TOYOU)) { - i=yesno(text[DisplayTitlesOnlyQ]); - if(mode&SCAN_FIND) { - bputs(text[SearchStringPrompt]); - if(!getstr(str,40,K_LINE|K_UPPER)) - return; - if(i) { /* if titles only */ - for(i=0;i<usrgrps;i++) { - for(j=0;j<usrsubs[i] && !msgabort();j++) - found=searchsub(usrsub[i][j],str); - if(j<usrsubs[i]) - break; } - if(!found) - CRLF; - sprintf(tmp,"Searched messages for '%s'",str); - logline(nulstr,tmp); - return; } } - else if(mode&SCAN_TOYOU && i) { - for(i=0;i<usrgrps;i++) { - for(j=0;j<usrsubs[i] && !msgabort();j++) - found=searchsub_toyou(usrsub[i][j]); - if(j<usrsubs[i]) - break; } - if(!found) - CRLF; - return; } } - -if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT)) { - menu("MSGSCAN"); } -for(i=0;i<usrgrps;i++) { - for(j=0;j<usrsubs[i] && !msgabort();j++) - if(((mode&SCAN_NEW && sub[usrsub[i][j]]->misc&(SUB_NSCAN|SUB_FORCED)) - || mode&SCAN_FIND - || (mode&SCAN_TOYOU && sub[usrsub[i][j]]->misc&SUB_SSCAN)) - && scanposts(usrsub[i][j],mode,str)) break; - if(j<usrsubs[i]) - break; } -bputs(text[MessageScan]); -if(i<usrgrps) { - bputs(text[MessageScanAborted]); - return; } -bputs(text[MessageScanComplete]); -if(mode&SCAN_NEW && !(mode&(SCAN_BACK|SCAN_TOYOU)) - && useron.misc&ANFSCAN && !(useron.rest&FLAG('T'))) { - xfer_cmds++; - scanalldirs(FL_ULTIME); } -} - -/****************************************************************************/ -/* Used to scan single or multiple sub-boards. 'mode' is the scan type. */ -/****************************************************************************/ -void scansubs(char mode) -{ - char ch,str[256]; - int i=0,j,found=0; - -mnemonics(text[SubGroupOrAll]); -ch=getkeys("SGA\r",0); -if(sys_status&SS_ABORT || ch==CR) - return; - -if(ch!='A' && mode&(SCAN_FIND|SCAN_TOYOU)) { - if(yesno(text[DisplayTitlesOnlyQ])) i=1; - if(mode&SCAN_FIND) { - bputs(text[SearchStringPrompt]); - if(!getstr(str,40,K_LINE|K_UPPER)) - return; - if(i) { /* if titles only */ - if(ch=='S') - found=searchsub(usrsub[curgrp][cursub[curgrp]],str); - else if(ch=='G') - for(i=0;i<usrsubs[curgrp] && !msgabort();i++) - found=searchsub(usrsub[curgrp][i],str); - sprintf(tmp,"Searched messages for '%s'",str); - logline(nulstr,tmp); - if(!found) - CRLF; - return; } } - else if(mode&SCAN_TOYOU && i) { - if(ch=='S') - found=searchsub_toyou(usrsub[curgrp][cursub[curgrp]]); - else if(ch=='G') - for(i=0;i<usrsubs[curgrp] && !msgabort();i++) - found=searchsub_toyou(usrsub[curgrp][i]); - if(!found) - CRLF; - return; } } - -if(ch=='S') { - if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT)) { - menu("MSGSCAN"); } - i=scanposts(usrsub[curgrp][cursub[curgrp]],mode,str); - bputs(text[MessageScan]); - if(i) bputs(text[MessageScanAborted]); - else bputs(text[MessageScanComplete]); - return; } -if(ch=='G') { - if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT)) { - menu("MSGSCAN"); } - for(i=0;i<usrsubs[curgrp] && !msgabort();i++) - if(((mode&SCAN_NEW && - sub[usrsub[curgrp][i]]->misc&(SUB_NSCAN|SUB_FORCED)) - || (mode&SCAN_TOYOU && sub[usrsub[curgrp][i]]->misc&SUB_SSCAN) - || mode&SCAN_FIND) - && scanposts(usrsub[curgrp][i],mode,str)) break; - bputs(text[MessageScan]); - if(i==usrsubs[curgrp]) bputs(text[MessageScanComplete]); - else bputs(text[MessageScanAborted]); - return; } - -scanallsubs(mode); -} diff --git a/src/sbbs2/main_wfc.c b/src/sbbs2/main_wfc.c deleted file mode 100644 index 9d459961b4..0000000000 --- a/src/sbbs2/main_wfc.c +++ /dev/null @@ -1,1543 +0,0 @@ -#line 1 "MAIN_WFC.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "etext.h" -#include "cmdshell.h" -#include "qwk.h" - -extern char onquiet,nmi,llo,qwklogon; -extern char term_ret; -extern ulong connect_rate; /* already connected at xbps */ -extern char *wday[],*mon[]; -extern char *hungupstr; -extern char cidarg[]; - -void reset_logon_vars(void) -{ - int i; - -sys_status&=~(SS_USERON|SS_TMPSYSOP|SS_LCHAT|SS_ABORT - |SS_PAUSEON|SS_PAUSEOFF|SS_EVENT|SS_NEWUSER|SS_NEWDAY); -keybufbot=keybuftop=lbuflen=slcnt=altul=timeleft_warn=0; -logon_uls=logon_ulb=logon_dls=logon_dlb=0; -logon_posts=logon_emails=logon_fbacks=0; -posts_read=0; -batdn_total=batup_total=0; -usrgrps=usrlibs=0; -curgrp=curlib=0; -for(i=0;i<total_libs;i++) - curdir[i]=0; -for(i=0;i<total_grps;i++) - cursub[i]=0; -} - -void mail_maint(void) -{ - int i; - -lprintf("\r\n\r\nPurging deleted/expired e-mail..."); -sprintf(smb.file,"%sMAIL",data_dir); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) - errormsg(WHERE,ERR_OPEN,smb.file,i); -else { - if((i=smb_locksmbhdr(&smb))!=0) - errormsg(WHERE,ERR_LOCK,smb.file,i); - else - delmail(0,MAIL_ALL); - smb_close(&smb); } -} - -/*************************************************************/ -/* Returns 0 to reinitialize modem and start WFC cycle again */ -/* Returns 1 to continue checking things peacefully */ -/*************************************************************/ -char wfc_events(time_t lastnodechk) -{ - char str[256],str2[256],*buf; - int i,j,k,file,ret=1,chunk; - ulong l,m; - user_t user; - node_t node; - struct ffblk ff; - struct tm *gm; - struct date lastdate; - -for(i=0;i<total_qhubs;i++) { - gm=localtime(&now); /* Qnet call out based on time */ - unixtodos(qhub[i]->last,&date,&curtime); - if(node_num==qhub[i]->node /* or frequency */ - && (qhub[i]->last==-1L - || ((qhub[i]->freq - && (now-qhub[i]->last)/60>qhub[i]->freq) - || (qhub[i]->time - && (gm->tm_hour*60)+gm->tm_min>=qhub[i]->time - && (gm->tm_mday!=date.da_day || gm->tm_mon!=date.da_mon-1))) - && qhub[i]->days&(1<<gm->tm_wday))) { - offhook(); - lputc(FF); - sprintf(str,"%sQNET\\%s.NOW" - ,data_dir,qhub[i]->id); - remove(str); /* Remove semaphore file */ - sprintf(str,"%sQNET\\%s.PTR" - ,data_dir,qhub[i]->id); - file=nopen(str,O_RDONLY); - for(j=0;j<qhub[i]->subs;j++) { - sub[qhub[i]->sub[j]]->ptr=0; - lseek(file,sub[qhub[i]->sub[j]]->ptridx*4L,SEEK_SET); - read(file,&sub[qhub[i]->sub[j]]->ptr,4); } - if(file!=-1) - close(file); - if(pack_rep(i)) { - if((file=nopen(str,O_WRONLY|O_CREAT))==-1) - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT); - else { - for(j=l=0;j<qhub[i]->subs;j++) { - while(filelength(file)<sub[qhub[i]->sub[j]]->ptridx*4L) - write(file,&l,4); /* initialize ptrs to null */ - lseek(file,sub[qhub[i]->sub[j]]->ptridx*4L,SEEK_SET); - write(file,&sub[qhub[i]->sub[j]]->ptr,4); } - close(file); } } - delfiles(temp_dir,"*.*"); - - qhub[i]->last=time(NULL); - sprintf(str,"%sQNET.DAB",ctrl_dir); - if((file=nopen(str,O_WRONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY); - bail(1); } - lseek(file,sizeof(time_t)*i,SEEK_SET); - write(file,&qhub[i]->last,sizeof(time_t)); - close(file); - - if(qhub[i]->call[0]) { - getnodedat(node_num,&thisnode,1); - thisnode.status=NODE_NETTING; - putnodedat(node_num,thisnode); - lputc(FF); - external(cmdstr(qhub[i]->call,nulstr,nulstr,NULL),EX_SWAP); - ret=0; } - for(j=0;j<10;j++) { - sprintf(str,"%s%s.QW%c",data_dir,qhub[i]->id,j ? (j-1)+'0' : 'K'); - if(fexist(str)) { - lclini(node_scrnlen-1); - delfiles(temp_dir,"*.*"); - unpack_qwk(str,i); } } - lputc(FF); } } - -for(i=0;i<total_phubs;i++) { - gm=localtime(&now); /* PostLink call out based on time */ - unixtodos(phub[i]->last,&date,&curtime); - if(node_num==phub[i]->node /* or frequency */ - && ((phub[i]->freq - && (now-phub[i]->last)/60>phub[i]->freq) - || (phub[i]->time - && (gm->tm_hour*60)+gm->tm_min>=phub[i]->time - && (gm->tm_mday!=date.da_day || gm->tm_mon!=date.da_mon-1))) - && phub[i]->days&(1<<gm->tm_wday)) { - offhook(); - lputc(FF); - - phub[i]->last=time(NULL); - sprintf(str,"%sPNET.DAB",ctrl_dir); - if((file=nopen(str,O_WRONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY); - bail(1); } - lseek(file,sizeof(time_t)*i,SEEK_SET); - write(file,&phub[i]->last,sizeof(time_t)); - close(file); - - if(phub[i]->call[0]) { - getnodedat(node_num,&thisnode,1); - thisnode.status=NODE_NETTING; - putnodedat(node_num,thisnode); - lputc(FF); - external(cmdstr(phub[i]->call,nulstr,nulstr,NULL),EX_SWAP); - ret=0; } } } - -for(i=0;i<total_events;i++) { - if(!event[i]->node || event[i]->node>sys_nodes) - continue; - gm=localtime(&now); - unixtodos(event[i]->last,&date,&curtime); - if(event[i]->last==-1 - || ((gm->tm_hour*60)+gm->tm_min>=event[i]->time - && (gm->tm_mday!=date.da_day || gm->tm_mon!=date.da_mon-1) - && event[i]->days&(1<<gm->tm_wday))) { - - if(event[i]->misc&EVENT_EXCL) { /* exclusive event */ - offhook(); - lputc(FF); - if(event[i]->node!=node_num) { - lprintf("Waiting for node %d to run timed event.\r\n\r\n" - ,event[i]->node); - lputs("Hit any key to abort wait..."); - getnodedat(node_num,&thisnode,1); - thisnode.status=NODE_EVENT_LIMBO; - thisnode.aux=event[i]->node; - putnodedat(node_num,thisnode); - lastnodechk=0; /* really last event time check */ - while(!lkbrd(0)) { - mswait(1); - now=time(NULL); - if(now-lastnodechk<10) - continue; - getnodedat(node_num,&thisnode,0); - if(thisnode.misc&NODE_DOWN) - return(0); - lastnodechk=now; - sprintf(str,"%sTIME.DAB",ctrl_dir); - if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - event[i]->last=now; - return(0); } - lseek(file,(long)i*4L,SEEK_SET); - read(file,&event[i]->last,sizeof(time_t)); - close(file); - if(now-event[i]->last<(60*60)) /* event is done */ - break; } - sprintf(str,"%s%s.NOW",data_dir,event[i]->code); - remove(str); - event[i]->last=now; - ret=0; } - else { - lputs("Waiting for all nodes to become inactive before " - "running timed event.\r\n\r\n"); - lputs("Hit any key to abort wait and run event now...\r\n\r\n"); - getnodedat(node_num,&thisnode,1); - thisnode.status=NODE_EVENT_WAITING; - putnodedat(node_num,thisnode); - lastnodechk=0; - while(!lkbrd(0)) { - mswait(1); - now=time(NULL); - if(now-lastnodechk<10) - continue; - lastnodechk=now; - getnodedat(node_num,&thisnode,0); - if(thisnode.misc&NODE_DOWN) - return(0); - for(j=1;j<=sys_nodes;j++) { - if(j==node_num) - continue; - getnodedat(j,&node,0); - if(node.status!=NODE_OFFLINE - && node.status!=NODE_EVENT_LIMBO) - break; } - if(j>sys_nodes) /* all nodes either offline or in limbo */ - break; - lprintf("\rWaiting for node %d (status=%d)" - ,j,node.status); - lputc(CLREOL); } } } - if(event[i]->node!=node_num) - event[i]->last=now; - else { - sprintf(str,"%s%s.NOW",data_dir,event[i]->code); - remove(str); - offhook(); - lputc(FF); - getnodedat(node_num,&thisnode,1); - thisnode.status=NODE_EVENT_RUNNING; - putnodedat(node_num,thisnode); - if(event[i]->dir[0]) { - if(event[i]->dir[1]==':') /* drive letter specified */ - setdisk(toupper(event[i]->dir[0])-'A'); - if(chdir(event[i]->dir)) - errormsg(WHERE,ERR_CHDIR,event[i]->dir,0); } - - external(cmdstr(event[i]->cmd,nulstr,nulstr,NULL),0); /* EX_CC */ - event[i]->last=time(NULL); - sprintf(str,"%sTIME.DAB",ctrl_dir); - if((file=nopen(str,O_WRONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY); - return(ret); } - lseek(file,(long)i*4L,SEEK_SET); - write(file,&event[i]->last,sizeof(time_t)); - close(file); - ret=0; } } } - - -if(sys_status&SS_DAILY || thisnode.misc&NODE_EVENT) { /* daily events */ - - offhook(); - lputc(FF); - - if(sys_status&SS_DAILY) { - - getnodedat(node_num,&thisnode,1); - now=time(NULL); - j=lastuser(); - thisnode.status=NODE_EVENT_RUNNING; - putnodedat(node_num,thisnode); - - lprintf("Running system daily maintenance...\r\n\r\n"); - logentry("!:","Ran system daily maintenance"); - for(i=1;i<=j;i++) { - - lprintf("\rChecking user %5u of %-5u",i,j); - user.number=i; - getuserdat(&user); - - /***********************************************/ - /* Fix name (NAME.DAT and USER.DAT) mismatches */ - /***********************************************/ - if(user.misc&DELETED) { - if(strcmp(username(i,str2),"DELETED USER")) - putusername(i,nulstr); - continue; } - - if(strcmp(user.alias,username(i,str2))) - putusername(i,user.alias); - - if(!(user.misc&(DELETED|INACTIVE)) - && user.expire && (ulong)user.expire<=(ulong)now) { - putsmsg(i,text[AccountHasExpired]); - sprintf(str,"%s #%u Expired",user.alias,user.number); - logentry("!%",str); - if(level_misc[user.level]&LEVEL_EXPTOVAL - && level_expireto[user.level]<10) { - user.flags1=val_flags1[level_expireto[user.level]]; - user.flags2=val_flags2[level_expireto[user.level]]; - user.flags3=val_flags3[level_expireto[user.level]]; - user.flags4=val_flags4[level_expireto[user.level]]; - user.exempt=val_exempt[level_expireto[user.level]]; - user.rest=val_rest[level_expireto[user.level]]; - if(val_expire[level_expireto[user.level]]) - user.expire=now - +(val_expire[level_expireto[user.level]]*24*60*60); - else - user.expire=0; - user.level=val_level[level_expireto[user.level]]; } - else { - if(level_misc[user.level]&LEVEL_EXPTOLVL) - user.level=level_expireto[user.level]; - else - user.level=expired_level; - user.flags1&=~expired_flags1; /* expired status */ - user.flags2&=~expired_flags2; /* expired status */ - user.flags3&=~expired_flags3; /* expired status */ - user.flags4&=~expired_flags4; /* expired status */ - user.exempt&=~expired_exempt; - user.rest|=expired_rest; - user.expire=0; } - putuserrec(i,U_LEVEL,2,itoa(user.level,str,10)); - putuserrec(i,U_FLAGS1,8,ultoa(user.flags1,str,16)); - putuserrec(i,U_FLAGS2,8,ultoa(user.flags2,str,16)); - putuserrec(i,U_FLAGS3,8,ultoa(user.flags3,str,16)); - putuserrec(i,U_FLAGS4,8,ultoa(user.flags4,str,16)); - putuserrec(i,U_EXPIRE,8,ultoa(user.expire,str,16)); - putuserrec(i,U_EXEMPT,8,ultoa(user.exempt,str,16)); - putuserrec(i,U_REST,8,ultoa(user.rest,str,16)); - if(expire_mod[0]) { - useron=user; - online=ON_LOCAL; - exec_bin(expire_mod,&main_csi); - online=0; } - } - - /***********************************************************/ - /* Auto deletion based on expiration date or days inactive */ - /***********************************************************/ - if(!(user.exempt&FLAG('P')) /* Not a permanent account */ - && !(user.misc&(DELETED|INACTIVE)) /* alive */ - && (sys_autodel && (now-user.laston)/(long)(24L*60L*60L) - > sys_autodel)) { /* Inactive too long */ - sprintf(str,"Auto-Deleted %s #%u",user.alias,user.number); - logentry("!*",str); - delallmail(i); - putusername(i,nulstr); - putuserrec(i,U_MISC,8,ultoa(user.misc|DELETED,str,16)); } - - if(!(user.misc&(DELETED|INACTIVE)) - && preqwk_ar[0] && chk_ar(preqwk_ar,user)) { /* Pre-QWK */ - for(k=1;k<=sys_nodes;k++) { - getnodedat(k,&node,0); - if((node.status==NODE_INUSE || node.status==NODE_QUIET - || node.status==NODE_LOGON) && node.useron==i) - break; } - if(k<=sys_nodes) /* Don't pre-pack with user online */ - continue; - lclini(node_scrnlen-1); - lclatr(LIGHTGRAY); - lputc(FF); - console|=CON_L_ECHO; - lprintf("Pre-packing QWK for %s...\r\n" - ,user.alias); - useron=user; - online=ON_LOCAL; - statline=sys_def_stat; - statusline(); - useron.qwk&=~QWK_FILES; /* turn off for pre-packing */ - useron.misc|=(ANSI|COLOR); - delfiles(temp_dir,"*.*"); - getmsgptrs(); - getusrsubs(); - batdn_total=0; - sprintf(str,"%sFILE\\%04u.QWK" - ,data_dir,useron.number); - if(pack_qwk(str,&l,1)) { - qwk_success(l,0,1); - putmsgptrs(); } - delfiles(temp_dir,"*.*"); - lclatr(LIGHTGRAY); - lclini(node_scrnlen); - online=0; - lputc(FF); } } - - mail_maint(); - - lprintf("\r\n\r\nRunning system daily event...\r\n"); - logentry("!:","Ran system daily event"); - sys_status&=~SS_DAILY; - if(sys_daily[0]) - external(cmdstr(sys_daily,nulstr,nulstr,NULL),0); } /* EX_CC */ - - if(thisnode.misc&NODE_EVENT) { - getnodedat(node_num,&thisnode,1); - thisnode.status=NODE_EVENT_RUNNING; - putnodedat(node_num,thisnode); - if(node_daily[0]) - external(cmdstr(node_daily,nulstr,nulstr,NULL),0); /* EX_CC */ - getnodedat(node_num,&thisnode,1); - thisnode.misc&=~NODE_EVENT; - putnodedat(node_num,thisnode); } - ret=0; } -return(ret); -} - -/****************************************************************************/ -/* This function waits for either a caller or a local logon. It returns 0 */ -/* if the user failed the logon procedure, a 1 if the user succeeded */ -/* Called from function main */ -/****************************************************************************/ -char waitforcall() -{ - static uint calls; - uchar str[256],str2[256],cname[LEN_CID+1],c,gotcaller=0,x,y,dcd,*p - ,ans=0,hbeat=0,menuon=0,blank=0 - ,*ok=mdm_misc&MDM_VERBAL ? "OK":"0" - - /* IP logging vars added by enigma */ - , ipstr[256], *ips; - - uint i,j,k,nodes,lastnodes=0; - long l,m; - int file,result_code=0; - time_t start,lastnodechk=0,laststatchk=0,laststatfdate=0; - node_t node; - struct tm *gm; - struct dfree d; - stats_t stats,node_stats; - -reset_logon_vars(); -ipstr[0]=cid[0]=cname[0]=0; -online=console=0; -start=time(NULL); - -getnodedat(node_num,&thisnode,1); -thisnode.status=NODE_WFC; -thisnode.misc&=~(NODE_INTR|NODE_MSGW|NODE_NMSG|NODE_UDAT|NODE_POFF|NODE_AOFF); -putnodedat(node_num,thisnode); -catsyslog(0); -if(term_ret) - return(terminal()); -/*** -if(com_port) - rioctl(0x10f); /* for blanking debug line */ -***/ - -if(qoc && calls) { - if(qoc==1) - offhook(); - lclini(node_scrnlen); - lputc(FF); - bail(0); } -useron.misc=0; -rows=24; -lputc(FF); -if(node_misc&NM_RESETVID) { - textmode(C40); - textmode(C80); - _setcursortype(_NORMALCURSOR); } - -lclatr(curatr=LIGHTGRAY); -lclini(node_scrnlen); - - -lputc(FF); -if(com_port && !connect_rate) { /* Initialize the modem */ - lprintf("\rSetting DTE rate: %lu baud",com_rate); - lputc(CLREOL); -#ifdef __OS2__ - if((i=setbaud(com_rate))!=0) { -#else - if((i=setbaud((uint)(com_rate&0xffffL)))!=0) { -#endif - lprintf(" - Failed! (%d)\r\n",i); - bail(1); } - c=0; - if(!nmi && !(mdm_misc&MDM_DUMB)) /* if not dumb */ - while(c<4) { - rioctl(IOFB); - rioctl(IOCM|PAUSE|ABORT); - rioctl(IOCS|PAUSE|ABORT); - - if(mdm_misc&MDM_CTS) - if(!(rioctl(IOSTATE)&CTS)) { - lputs("\rWaiting up to 30 seconds for CTS to raise ( )\b\b\b"); - for(i=0;i<30 && !lkbrd(0);i++) { /* wait upto 15 seconds */ - lprintf("%2d\b\b",i+1); - mswait(1000); - if(rioctl(IOSTATE)&CTS) - break; } - if(i==30) { - lputs("\r\n\r\nModem configured for hardware flow " - "control and CTS is stuck low.\r\n"); - logline("@!","CTS stuck low. Can't initialize."); - bail(1); } } - - lputs("\rInitializing modem..."); - lputc(CLREOL); - - dtr(5); /* in case we're still connected to somebody */ - dtr(1); - mswait(750); /* DTR is sometimes slow */ - rioctl(IOFB); /* crap comes in when dtr is raised ? */ - if(rioctl(IOSTATE)&DCD && mdm_hang[0]) { - mdmcmd(mdm_hang); - if(strcmp(str,"0") && strcmp(str,"OK")) - getmdmstr(str,SEC_OK); } - - /******************************************/ - /* Take phone off-hook while initializing */ - /******************************************/ - offhook(); - getmdmstr(str,SEC_OK); - if(strcmp(str,"0") && strcmp(str,"OK")) - getmdmstr(str,SEC_OK); - - /*********************************************************/ - /* Send User Configured (broken?) initialization strings */ - /*********************************************************/ - mdmcmd(mdm_init); - if(mdm_spec[0]) { - getmdmstr(str,SEC_OK); - if(strcmp(str,"0") && strcmp(str,"OK")) - getmdmstr(str,SEC_OK); - mdmcmd(mdm_spec); } - getmdmstr(str,SEC_OK); - if(strcmp(str,"0") && strcmp(str,"OK")) - getmdmstr(str,SEC_OK); - - /*****************************/ - /* Send AT&C1 if DCD is high */ - /*****************************/ - if(rioctl(IOSTATE)&DCD) { - lputs("\r\nDCD is high. Sending AT&C1 to modem..."); - mdmcmd("AT&C1"); - getmdmstr(str,SEC_OK); - if(strcmp(str,ok)) - getmdmstr(str,SEC_OK); } - - /**********************************************/ - /* DCD still high? Pause and try dropping DTR */ - /**********************************************/ - if(rioctl(IOSTATE)&DCD) { - lputs("\r\nDCD is high. Pausing..."); - dtr(0); - mswait(2000); - rioctl(MSR); - if(rioctl(IOSTATE)&DCD) { - lputs("\rDCD was high after modem init.\r\n"); - logentry("@!","DCD was high after modem init"); - if(mdm_misc&MDM_NODTR) - mdmcmd(mdm_hang); - else - dtr(15); - if(rioctl(IOSTATE)&DCD) { - lputs("Hanging up failed to lower DCD.\r\n"); - logentry("@!","Hanging up failed to lower DCD"); - if(++c==4) - break; - continue; } } - dtr(1); } - - /************************************************************/ - /* Let's repair any damage the user configured init strings */ - /* may have caused */ - /************************************************************/ - for(i=0;i<4;i++) { - rioctl(IOFB); - mdmcmd("AT"); - if(!getmdmstr(str,SEC_OK) || !strcmp(str,ok)) - break; - if(!strcmp(str,"AT")) { /* Echoing commands? */ - getmdmstr(str,SEC_OK); /* Get OK */ - lputs("\r\nCommand echoed. Sending ATE0 to modem..."); - mdmcmd("ATE0"); } - else if(mdm_misc&MDM_VERBAL && !strcmp(str,"0")) { /* numeric? */ - lputs("\r\nNumeric response. Sending ATV1 to modem..."); - mdmcmd("ATV1"); } - else if(!(mdm_misc&MDM_VERBAL) && !strcmp(str,"OK")) { - lputs("\r\nVerbal response. Sending ATV0 to modem..."); - mdmcmd("ATV0"); } - else { - lprintf("\r\nUnrecognized response '%s'. Sending AT to modem..." - ,str); - mdmcmd("AT"); } - if(getmdmstr(str,SEC_OK) && !strcmp(str,ok)) - break; } - - /************************************************/ - /* Put phone back on-hook and check result code */ - /************************************************/ - if(!mdm_hang[0]) - mdmcmd("ATH"); - else - mdmcmd(mdm_hang); - if(!getmdmstr(str,SEC_OK)) { - lputs("\r\nNo response.\r\n"); - logentry("@!","No response"); } - else { - if(!strcmp(str,ok)) - break; - lprintf("\r\nInvalid result code: '%s' " - "instead of '%s'.\r\n",str,ok); - sprintf(tmp,"Invalid result code: '%s' instead of '%s'.",str,ok); - logentry("@!",tmp); } - if(++c==4) - break; - rioini(0,0); /* remove com routines */ - sys_status&=~SS_COMISR; - comini(); - setrate(); } - if(c==4) { - lputs("\r\nModem failed initialization.\r\n"); - errorlog("Modem failed initialization."); - offhook(); - bail(1); } - lputc(FF); } - -else if(com_port && connect_rate) { - gotcaller=1; - console=CON_R_ECHO|CON_L_ECHO|CON_R_INPUT|CON_L_INPUT; - online=ON_REMOTE; - sprintf(connection,"%lu",connect_rate); - cur_rate=connect_rate; - cur_cps=connect_rate/10; - connect_rate=0; - if(cidarg[0]) { /* Caller-id passed as argument */ - mdm_misc|=MDM_CALLERID; - p=strstr(cidarg,"NUMBER:"); - if(p) p+=8; - else { - p=strstr(cidarg,"NMBR"); - if(p) p+=7; } - if(p) { /* 3 message format */ - sprintf(cid,"%.*s",LEN_CID,p); - for(i=strlen(cid);!isdigit(cid[i]) && i;i--) - ; - cid[i+1]=0; /* chop off non-numbers */ - p=strstr(cidarg,"NAME:"); - if(p) p+=6; - else { - p=strstr(cidarg,"NAME"); - if(p) p+=7; } - if(p) - sprintf(cname,"%.*s",LEN_CID,p); } - else if(strlen(cidarg)>12) /* Single message format */ - sprintf(cid,"%.*s",LEN_CID,cidarg+12); - else - sprintf(cid,"ERROR: '%s'",cidarg); } } - - -if(!online) { - /*******************************************************/ - /* To make sure that BBS print routines work correctly */ - /*******************************************************/ - useron.number=1; - getuserdat(&useron); - if(!useron.number) - useron.misc=ANSI|COLOR; } - -useron.misc&=~UPAUSE; /* make sure pause is off */ - -if(llo) { - quicklogonstuff(); - sys_status&=~SS_USERON; - gotcaller=1; } - -if(!(useron.misc&EXPERT) && !gotcaller) { /* Novice sysop */ - console=CON_L_ECHO; - online=ON_LOCAL; - lputc(FF); - tos=1; - lncntr=0; - menu("WFC"); - menuon=1; - online=0; } - -while(!gotcaller) { - mswait(0); /* give up rest of time slice */ - - console=CON_L_ECHO; - now=time(NULL); - - if(node_scrnblank && (now-start)/60>node_scrnblank - && !blank) { /* blank screen */ - lputc(FF); - menuon=0; - blank=1; } - if(mdm_reinit && (now-start)/60>mdm_reinit) /* reinitialize modem */ - return(0); - if(now-lastnodechk>node_sem_check) { /* check node.dab every x seconds */ - -#if 1 - if((i=heapcheck())!=_HEAPOK) { - lputc(FF); - offhook(); - errormsg(WHERE,ERR_CHK,"heap",i); - bail(1); } -#endif - - for(i=0;i<total_qhubs;i++) - if(node_num==qhub[i]->node) { - sprintf(str,"%sQNET\\%s.NOW",data_dir,qhub[i]->id); - if(fexist(str)) - qhub[i]->last=-1; } - - for(i=0;i<total_events;i++) - if(node_num==event[i]->node || event[i]->misc&EVENT_EXCL) { - sprintf(str,"%s%s.NOW",data_dir,event[i]->code); - if(fexist(str)) - event[i]->last=-1; } - - lastnodechk=now; - getnodedat(node_num,&thisnode,0); - if(thisnode.misc&NODE_DOWN) { - lputc(FF); - offhook(); - bail(0); } - if(thisnode.status!=NODE_WFC) { - getnodedat(node_num,&thisnode,1); - thisnode.status=NODE_WFC; - putnodedat(node_num,thisnode); } - if(thisnode.misc&NODE_RRUN) { /* Re-run the node */ - offhook(); - lputc(FF); - getnodedat(node_num,&thisnode,1); - thisnode.status=NODE_OFFLINE; - thisnode.misc=0; - putnodedat(node_num,thisnode); - close(nodefile); - close(node_ext); - sys_status&=~SS_NODEDAB; - if(sys_status&SS_LOGOPEN) - close(logfile); - if(sys_status&SS_COMISR) - rioini(0,0); - sys_status&=~(SS_COMISR|SS_INITIAL|SS_LOGOPEN); - p=strchr(orgcmd,' '); - if(p) - p++; - close(5); - if(execle(orgcmd,orgcmd,p,NULL,envp)) { - lprintf("\r\nCouldn't execute %s!\r\n",orgcmd); - bail(1); } } } - - if(!wfc_events(lastnodechk)) - return(0); - - if(!menuon) { - /******************/ - /* Roaming cursor */ - /******************/ - x=lclwx(); - y=lclwy(); - switch(random(5)) { - case 0: - if(x>1) - x--; - break; - case 1: - if(x<79) - x++; - break; - case 2: - if(y>1) - y--; - break; - case 4: - if(y<node_scrnlen-2) - y++; - break; } } - else { /* across the bottom */ - y=25; - x=lclwx(); - if(x%2) x+=2; - else x-=2; - if(x<1) - x=1; - else if(x>80) - x=80; -/* - lclxy(x,y); - gettext(x,y,x,y,&i); - lclatr(random(0xf)+1); - lputc(i); - lclatr(LIGHTGRAY); -*/ -/** - mswait(100); - puttext(x,y,x,y,&i); -**/ } - -#ifndef __FLAT__ // Heart beat always for 32-bit OSs - if(inDV) { -#endif - lclxy(80,1); - if(hbeat) { - lclatr(RED|HIGH); - lputc(3); } - else - lputc(0); - hbeat=!hbeat; - lclatr(LIGHTGRAY); -#ifndef __FLAT__ - } -#endif - - lclxy(x,y); - mswait(100); - - /* Wait for call screen */ - /* check every 10 seconds */ - - if(node_misc&NM_WFCSCRN && now-laststatchk>node_stat_check - && !menuon && !blank) { - laststatchk=now; - sprintf(str,"%sDSTS.DAB",ctrl_dir); - if(fdate(str)!=laststatfdate) { /* system statistics */ - lclxy(1,1); - lclatr(LIGHTGRAY); - lputs("Retrieving Statistics."); - lputc(CLREOL); - if(!laststatfdate) /* First time this WFC */ - getstats(node_num,&node_stats); - lputc('.'); - laststatfdate=fdate(str); - getstats(0,&stats); - lputc('.'); - l=m=0; - if(node_misc&NM_WFCMSGS) { - for(i=0;i<total_subs;i++) - l+=getposts(i); /* l=total posts */ - lputc('.'); - for(i=0;i<total_dirs;i++) - m+=getfiles(i); /* m=total files */ - lputc('.'); } - i=getmail(0,0); /* i=total email */ - lputc('.'); - j=getmail(1,0); /* j=total fback */ - lclxy(1,1); - lclatr(GREEN); - lprintf("Node #: "); - lclatr(GREEN|HIGH); - gm=localtime(&now); - lprintf("%-3u ",node_num); - lclatr(GREEN); - lprintf("%-3.3s %-2u Space: ",mon[gm->tm_mon],gm->tm_mday); - if(temp_dir[1]==':') - k=temp_dir[0]-'A'+1; - else k=0; - getdfree(k,&d); - if((ulong)d.df_bsec*(ulong)d.df_sclus - *(ulong)d.df_avail<((ulong)min_dspace*1024L)*2L) - lclatr(RED|HIGH|BLINK); - else - lclatr(GREEN|HIGH); - sprintf(str,"%sk",ultoac(((ulong)d.df_bsec - *(ulong)d.df_sclus*(ulong)d.df_avail)/1024UL,tmp)); - lprintf("%-12.12s",str); - if(lastuseron[0]) { - lclatr(GREEN); - lprintf("Laston: "); - lclatr(GREEN|HIGH); - lprintf(lastuseron); - lclatr(GREEN); - if(thisnode.connection) - lprintf(" %u",thisnode.connection); - else - lprintf(" Local"); } - lprintf("\r\n"); - lclatr(GREEN); - lprintf("Logons: "); - lclatr(GREEN|HIGH); - sprintf(tmp,"%lu/%lu",node_stats.ltoday,stats.ltoday); - lprintf("%-12.12s",tmp); - lclatr(GREEN); - lprintf("Total: "); - lclatr(GREEN|HIGH); - lprintf("%-12.12s",ultoac(stats.logons,tmp)); - lclatr(GREEN); - lprintf("Timeon: "); - lclatr(GREEN|HIGH); - sprintf(tmp,"%lu/%lu",node_stats.ttoday,stats.ttoday); - lprintf("%-12.12s",tmp); - lclatr(GREEN); - lprintf("Total: "); - lclatr(GREEN|HIGH); - lprintf("%-12.12s\r\n",ultoac(stats.timeon,tmp)); - lclatr(GREEN); - lprintf("Emails: "); - lclatr(GREEN|HIGH); - sprintf(str,"%u/%u",(uint)stats.etoday,i); - lprintf("%-12.12s",str); - lclatr(GREEN); - lprintf("Posts: "); - lclatr(GREEN|HIGH); - sprintf(str,"%u",(uint)stats.ptoday); - if(node_misc&NM_WFCMSGS) { - strcat(str,"/"); - strcat(str,ultoa(l,tmp,10)); } - lprintf("%-12.12s",str); - lclatr(GREEN); - lprintf("Fbacks: "); - lclatr(GREEN|HIGH); - sprintf(str,"%u/%u",(uint)stats.ftoday,j); - lprintf("%-12.12s",str); - lclatr(GREEN); - lprintf("Users: "); - lclatr(GREEN|HIGH); - sprintf(str,"%u/%u",stats.nusers,lastuser()); - lprintf("%-12.12s\r\n",str); - lclatr(GREEN); - lprintf("Uloads: "); - lclatr(GREEN|HIGH); - ultoac(stats.ulb/1024UL,tmp); - strcat(tmp,"k"); - lprintf("%-12.12s",tmp); - lclatr(GREEN); - lprintf("Files: "); - lclatr(GREEN|HIGH); - sprintf(str,"%u",(uint)stats.uls); - if(node_misc&NM_WFCMSGS) { - strcat(str,"/"); - strcat(str,ultoa(m,tmp,10)); } - lprintf("%-12.12s",str); - lclatr(GREEN); - lprintf("Dloads: "); - lclatr(GREEN|HIGH); - ultoac(stats.dlb/1024UL,tmp); - strcat(tmp,"k"); - lprintf("%-12.12s",tmp); - lclatr(GREEN); - lprintf("Files: "); - lclatr(GREEN|HIGH); - lprintf("%-12.12s\r\n",ultoac(stats.dls,tmp)); } - lclatr(curatr=LIGHTGRAY); - lclxy(1,6); - nodes=0; - for(i=1;i<=sys_nodes;i++) { - getnodedat(i,&node,0); - if((node.status!=NODE_WFC && node.status!=NODE_OFFLINE) - || node.errors) { - lputc(CLREOL); - printnodedat(i,node); - nodes++; } } - if(nodes<lastnodes) { - i=j=lclwy(); - j+=(lastnodes-nodes)+1; - for(;i<=node_scrnlen && i<j;i++) { - lclxy(1,i); - lputc(CLREOL); } } - lastnodes=nodes; - lclatr(curatr=LIGHTGRAY); } - - - if(!(node_misc&NM_NO_LKBRD) && lkbrd(1)) { - start=time(NULL); - /* menuon=0; */ - lputc(FF); - tos=1; - lncntr=0; - i=lkbrd(0); - if(!(i&0xff) && (i>=0x3b00 && i<=0x4400) - || i==0x8500 || i==0x8600) { /* F1-F12 */ - if(i>=0x3b00 && i<=0x4400) - i=((i-0x3b00)>>8); - else if(i==0x8500) - i=10; - else - i=11; - offhook(); - external(cmdstr(wfc_scmd[i],nulstr,nulstr,NULL),EX_SWAP); - return(0); } - - if(isdigit(i&0xff)) { - offhook(); - external(cmdstr(wfc_cmd[i&0xf],nulstr,nulstr,NULL),0); - return(0); } - - switch(toupper(i)) { - case 'A': /* forced answer */ - ans=1; - break; - case 'C': /* configure */ - if(node_misc&NM_SYSPW) { - quicklogonstuff(); - if(!chksyspass(1)) - return(0); } - offhook(); - if(sys_status&SS_LOGOPEN) { - close(logfile); - sys_status&=~SS_LOGOPEN; } - if(sys_status&SS_COMISR) { - rioini(0,0); /* replace COM i/o vectors */ - sys_status&=~SS_COMISR; } - close(nodefile); - close(node_ext); - sys_status&=~SS_NODEDAB; - sprintf(str,"%sEXECSBBS.%s",exec_dir, -#ifdef __OS2__ - "EXE" -#else - "COM" -#endif - ); - sprintf(tmp,"\"%s \"",cmdstr(scfg_cmd,nulstr,nulstr,NULL)); - if(execl(str,str,".",tmp,orgcmd,NULL,envp)) { - errormsg(WHERE,ERR_EXEC,str,0); - bail(1); } - case 'D': /* Dos shell */ - offhook(); - external(comspec,0); - return(0); - case 'F': /* Force Network Call-out */ - quicklogonstuff(); - lclatr(YELLOW); - lputs("QWK Hub ID: "); - lclatr(WHITE); - if(!getstr(str,8,K_UPPER)) - return(0); - for(i=0;i<total_qhubs;i++) - if(!stricmp(str,qhub[i]->id)) { - if(qhub[i]->node==node_num) - qhub[i]->last=-1; - else { - sprintf(tmp,"%sQNET\\%s.NOW",data_dir,str); - if((file=nopen(tmp,O_CREAT|O_TRUNC|O_WRONLY)) - !=-1) - close(file); } - break; } - return(0); - case 'L': /* Log */ - if(node_misc&NM_SYSPW) { - quicklogonstuff(); - if(!chksyspass(1)) - return(0); } - offhook(); - now=time(NULL); - unixtodos(now,&date,&curtime); - sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG" - ,data_dir,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900)); - external(cmdstr(node_viewer,str,nulstr,NULL),0); - return(0); - case 'M': /* Read all mail */ - quicklogonstuff(); - if(node_misc&NM_SYSPW && !chksyspass(1)) - return(0); - readmail(1,MAIL_ALL); - online=console=0; - return(0); - case 'N': /* Node statistics */ - quicklogonstuff(); - if(node_misc&NM_SYSPW && !chksyspass(1)) - return(0); - useron.misc|=UPAUSE; - printstatslog(node_num); - pause(); - return(0); - case 'Q': /* Quit */ - offhook(); - bail(0); - case 'R': /* Read feedback */ - quicklogonstuff(); - if(node_misc&NM_SYSPW && !chksyspass(1)) - return(0); - readmail(1,MAIL_YOUR); - return(0); - case 'K': /* Sent mail */ - quicklogonstuff(); - if(node_misc&NM_SYSPW && !chksyspass(1)) - return(0); - readmail(1,MAIL_SENT); - return(0); - case 'S': /* System Statistics */ - quicklogonstuff(); - if(node_misc&NM_SYSPW && !chksyspass(1)) - return(0); - useron.misc|=UPAUSE; - printstatslog(0); - pause(); - return(0); - case 'T': /* Terminal mode */ - if(!com_port) { - lprintf("No COM port configured."); - getch(); - lputc(FF); - return(0); } - if(node_misc&NM_SYSPW) { - quicklogonstuff(); - if(!chksyspass(1)) - return(0); } - return(terminal()); - case 'U': /* User edit */ - quicklogonstuff(); - useredit(0,1); - return(0); - case 'E': - case 'W': /* Write e-mail */ - quicklogonstuff(); - if(node_misc&NM_SYSPW && !chksyspass(1)) - return(0); - bputs(text[Email]); - if(!getstr(str,50,0)) - return(0); - if(!strchr(str,'@') && (i=finduser(str))!=0) - email(i,nulstr,nulstr,WM_EMAIL); - else - netmail(str,nulstr,0); - return(0); - case 'X': /* Exit with phone on-hook */ - bail(0); - case 'Y': /* Yesterday's log */ - if(node_misc&NM_SYSPW) { - quicklogonstuff(); - if(!chksyspass(1)) - return(0); } - offhook(); - now=time(NULL); - now-=(ulong)60L*24L*60L; - unixtodos(now,&date,&curtime); - sprintf(str,"%sLOGS\\%2.2d%2.2d%2.2d.LOG" - ,data_dir,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900)); - external(cmdstr(node_viewer,str,nulstr,NULL),0); - return(0); - case 'Z': - mail_maint(); - return(0); - case '?': /* Menu */ - if(menuon) { - menuon=0; - lputc(FF); - laststatchk=0; - laststatfdate=0; } - else { - online=ON_LOCAL; - menu("WFC"); - menuon=1; - blank=0; - online=0; } - continue; - case SP: /* Log on */ - lclatr(WHITE|HIGH); lputc('Y'); lclatr(GREEN); - lputs(" Yes\r\n"); - lclatr(WHITE|HIGH); lputc('Z'); lclatr(GREEN); - lputs(" Yes, Quiet\r\n"); - lclatr(WHITE|HIGH); lputc('F'); lclatr(GREEN); - lputs(" Fast User #1\r\n"); - lclatr(WHITE|HIGH); lputc('Q'); lclatr(GREEN); - lputs(" Fast User #1, Quiet\r\n"); - lclatr(BROWN|HIGH); - lputs("\r\nLog on? [No]: "); - lclatr(LIGHTGRAY); - i=getch(); - switch(toupper(i)) { - case 'Z': - onquiet=1; - case 'Y': /* Yes, logon */ - lputc(FF); - quicklogonstuff(); - sys_status&=~SS_USERON; - useron.misc=(UPAUSE|ANSI|COLOR); - gotcaller=1; - continue; - case 'Q': - onquiet=1; - case 'F': - lputc(FF); - quicklogonstuff(); - if(sys_misc&SM_REQ_PW || node_misc&NM_SYSPW) { - useron.misc=(UPAUSE|ANSI|COLOR); - gotcaller=1; - continue; } - if(!useron.number) { - lputc(7); - lputs("A Sysop account hasn't been created"); - getch(); - return(0); } - return(logon()); - default: - return(0); } - default: - lputs("Hit '?' for a menu."); - continue; } } - if(com_port) { - if(mdm_misc&MDM_VERBAL) { - if(rioctl(RXBC)) { - lputc(FF); - getmdmstr(str,SEC_RING); - if(!strcmp(str,"RING")) - ans=1; } } - else { /* numeric */ - if(incom()=='2') - ans=1; } - if(mdm_misc&MDM_DUMB && DCDHIGH) - ans=1; } - if(ans && com_port) { - lputc(FF); - if(mdm_misc&MDM_CALLERID) { - lputs("Obtaining Caller-ID..."); - getmdmstr(str,SEC_CID); - lprintf("\r\nCID: %s",str); - if(!strncmpi(str,"TIME:",5)) { /* 3 message format */ - getmdmstr(str,SEC_CID); - lprintf("\r\nCID: %s",str); - p=strchr(str,':'); - if(p) - strcpy(cid,p+2); /* Phone Number */ - getmdmstr(str,SEC_CID); - lprintf("\r\nCID: %s",str); - p=strchr(str,':'); - if(p) - sprintf(cname,"%.*s",LEN_CID,p+2); } /* Caller Name */ - else if(!strncmpi(str,"DATE =",6)) { /* Supra format */ - getmdmstr(str,SEC_CID); - lprintf("\r\nCID: %s",str); /* TIME = line */ - getmdmstr(str,SEC_CID); - lprintf("\r\nCID: %s",str); /* NMBR = line */ - p=strchr(str,'='); - if(p) - sprintf(strstr(str,"NAME") ? cname:cid,"%.*s",LEN_CID,p+2); - getmdmstr(str,SEC_CID); /* NAME = line */ - lprintf("\r\nCID: %s",str); - p=strchr(str,'='); - if(p) - sprintf(strstr(str,"NAME") ? cname:cid,"%.*s",LEN_CID,p+2); - } - else if(strlen(str)>12) /* Single message format */ - sprintf(cid,"%.*s",LEN_CID,str+12); - else - sprintf(cid,"ERROR: '%s'",str); - lputs(crlf); } - cur_rate=cur_cps=0; - connection[0]=0; - result_code=0; - if(!(mdm_misc&MDM_DUMB)) { - if(mdm_rings>1) { - lputs("Ring\r\n"); - for(i=1;i<mdm_rings;i++) - if(!getmdmstr(str,10)) - break; - else - lputs("Ring\r\n"); - if(i<mdm_rings) - return(0); - lputs(crlf); } - lputs("Answering..."); - mdmcmd(mdm_answ); - rioctl(IOFI); // flush extra ring results - while(!cur_rate || rioctl(RXBC)) { // no connect or more rsults - if(!getmdmstr(str,SEC_ANSWER)) { - if(cur_rate) - break; - lprintf("\r\nNO CARRIER\r\n"); - if(!(mdm_misc&MDM_NODTR)) { - dtr(15); - dtr(1); - mswait(500); } - mdmcmd(nulstr); - hangup(); - return(0); } - i=0; - while(i<2 - && (!strcmp(str,"2") - || !strcmp(str,"RING"))) { /* Ring? Get next result */ - lputs("Ring\r\n"); - if(i) { - mdmcmd(mdm_answ); /* Give a second ATA */ - rioctl(IOFI); } - if(!getmdmstr(str,SEC_ANSWER)) { - if(!(mdm_misc&MDM_NODTR)) { - dtr(15); - dtr(1); - mswait(500); } - mdmcmd(nulstr); - hangup(); /* Get next result code from modem */ - return(0); } - i++; } - if(!strcmp(str,"3") || !strcmp(str,"NO CARRIER")) { - lprintf("\r\nNO CARRIER\r\n"); - hangup(); - return(0); } - - lprintf("\r\nResult Code: %s\r\n",str); - - /* IP (vmodem) logging additions by enigma */ - ips = strstr(str, "TEL FROM "); - if(ips) { - strcpy(ipstr, ips+9); - } - - if(strstr(str,"FAX") || strstr(str,"+FCO")) { - /* Just for the ZyXEL's */ - mswait(1500); /* 1 and a half second wait for ZyXEL */ - sys_misc&=~SM_ERRALARM; - bail(100); } - - if(mdm_misc&MDM_VERBAL) { - if(!cur_rate - && (!strnicmp(str,"CONNECT ",8) - || !strnicmp(str,"CARRIER ",8))) { - cur_rate=atol(str+8); - // build description - for(i=8,j=0;str[i] && j<LEN_MODEM;i++) { - if(j==2 && isdigit(str[i]) - && str[i+1]=='0' && str[i+2]=='0' - && !isdigit(str[i+3]) && j+1<LEN_MODEM) { - connection[j++]='.'; - connection[j++]=str[i]; - i+=2; } - else - connection[j++]=str[i]; } - connection[j]=0; } - if(!cur_rate && !strcmp(str,"CONNECT")) - cur_rate=com_rate; - if(cur_rate - && (strstr(str,"ARQ") || strstr(str,"MNP") - || strstr(str,"V42") || strstr(str,"LAPM") - || strstr(str,"REL"))) - cur_cps=cur_rate/9; } - else { /* numeric */ - j=atoi(str); - for(i=0;i<mdm_results;i++) - if(mdm_result[i].code==j) break; - if(!cur_rate) { - if(i==mdm_results) { - lprintf("Unknown result code: '%s'\r\n",str); - sprintf(tmp,"Unknown modem result code: '%s'",str); - errorlog(tmp); - if(mdm_misc&MDM_KNOWNRES || !mdm_results) { - hangup(); - return(0); } /* Don't allow invalid codes */ - i--; } /* Use last configured result code */ - else - result_code=mdm_result[i].code; } - if(!strncmpi(mdm_result[i].str,"EXIT ",5)) - bail(atoi(mdm_result[i].str+5)); - if(!strcmpi(mdm_result[i].str,"FAX")) { - lputs("FAX Connection\r\n"); - bail(100); } - if(!strcmpi(mdm_result[i].str,"IGNORE") || cur_rate) - lputs("Ignored\r\n"); - else { - cur_rate=mdm_result[i].rate; - cur_cps=mdm_result[i].cps; - strcpy(connection,mdm_result[i].str); } } } } - else /* dumb modem */ - cur_rate=com_rate; - - if(!connection[0]) - sprintf(connection,"%lu",cur_rate); - lprintf("Logging Caller in at %s\r\n",connection); - if(!cur_cps) - cur_cps=cur_rate/10L; - - rioctl(IOCE|((RXLOST|FERR|PERR|OVRR)<<8)); /* clear error flags */ - console=CON_R_ECHO|CON_L_ECHO|CON_R_INPUT|CON_L_INPUT; - online=ON_REMOTE; - gotcaller=1; - putcom(crlf); -#if defined(__OS2__) - putcom(decrypt(VersionNoticeOS2,0)); -#elif defined(__WIN32__) - putcom(decrypt(VersionNoticeW32,0)); -#else - putcom(decrypt(VersionNoticeDOS,0)); -#endif - putcom(crlf); - lprintf("Pausing %u Seconds...",mdm_ansdelay); - if(node_misc&NM_ANSALARM) { - now=time(NULL); - while(time(NULL)-now<mdm_ansdelay) - for(x=0;x<10;x++) - for(y=0;y<10;y++) - beep((x*100)+(y*5),10); } - else - secwait(mdm_ansdelay); - nosound(); - rioctl(IOFI); } } /* flush input buffer */ - -reset_logon_vars(); -calls++; -useron.misc=0; -answertime=logontime=starttime=time(NULL); -if(online==ON_REMOTE) { - setrate(); - - now=time(NULL); - gm=localtime(&now); - sprintf(str,"%02d:%02d%c %s %s %02d %u Node %3u %5lubps (%s)" - ,gm->tm_hour>12 ? gm->tm_hour-12 : gm->tm_hour==0 ? 12 : gm->tm_hour - ,gm->tm_min,gm->tm_hour>=12 ? 'p' : 'a',wday[gm->tm_wday] - ,mon[gm->tm_mon],gm->tm_mday,gm->tm_year+1900,node_num,cur_rate - ,connection); - if(result_code) { - sprintf(tmp," [%d]",result_code); - strcat(str,tmp); } - logline("@",str); - - /* IP trashcan modification by enigma */ - if(trashcan(ipstr,"IP")) { - sprintf(tmp, "IP Trashcan: %s, hanging up!\r\n", ipstr); - logline("@!",tmp); - hangup(); - return(0); } - - if(mdm_misc&MDM_CALLERID) { - outcom(0xC); -#if defined(__OS2__) - putcom(decrypt(VersionNoticeOS2,0)); -#elif defined(__WIN32__) - putcom(decrypt(VersionNoticeW32,0)); -#else - putcom(decrypt(VersionNoticeDOS,0)); -#endif - putcom(crlf); - sprintf(str,"CID: %-*s %s",LEN_CID,cid,cname); - logline("@*",str); - if(trashcan(cid,"CID")) { - hangup(); - return(0); } } } -lclini(node_scrnlen-1); -if(online==ON_REMOTE) { - if(node_dollars_per_call) { /* Billing node stuff */ - now=time(NULL); - bprintf(text[BillingNodeMsg],sys_name,node_dollars_per_call); - while(online && now-answertime<30) { - if(incom()!=NOINP) { - if(!(mdm_misc&MDM_NODTR)) - dtr(15); - else - mdmcmd(mdm_hang); } - checkline(); - now=time(NULL); } - if(!online) - return(0); } - rioctl(IOFI); - putcom("\x1b[99B\x1b[6n\x1b[!_\x1b[0t_\x1b[0m_\xC"); - lputc(FF); - i=l=lncntr=autoterm=0; - tos=1; -#if defined(__OS2__) - strcpy(str,decrypt(VersionNoticeOS2,0)); -#elif defined(__WIN32__) - strcpy(str,decrypt(VersionNoticeW32,0)); -#else - strcpy(str,decrypt(VersionNoticeDOS,0)); -#endif - strcat(str,decrypt(CopyrightNotice,0)); - center(str); - mswait(500); - while(i++<30 && l<40) { /* wait up to 3 seconds for response */ - if((c=(incom()&0x7f))=='R') { /* break immediately if response */ - str[l++]=c; - mswait(110); - break; } - if(c) { - str[l++]=c; - if(l==1 && c!=ESC) - break; } - else - mswait(100); } - - if(rioctl(RXBC)) /* wait a bit for extra RIP reply chars */ - mswait(550); - - while((i=(incom()&0x7f))!=NOINP && l<40) - str[l++]=i; - str[l]=0; - -#if 0 - for(i=0;str[i];i++) - lprintf("%02X ",str[i]); - lputs(crlf); -#endif - - if(l) { - if(str[0]==ESC && str[1]=='[') { - useron.misc|=(ANSI|COLOR); - autoterm|=ANSI; - rows=((str[2]&0xf)*10)+(str[3]&0xf); - if(rows<10 || rows>99) rows=24; } - truncsp(str); - if(strstr(str,"RIPSCRIP")) { - logline("@R",strstr(str,"RIPSCRIP")); - useron.misc|=(RIP|COLOR|ANSI); - autoterm|=(RIP|COLOR|ANSI); } - else if(strstr(str,"DC-TERM") - && toupper(*(strstr(str,"DC-TERM")+12))=='W') { - logline("@W",strstr(str,"DC-TERM")); - useron.misc|=(WIP|COLOR|ANSI); - autoterm|=(WIP|COLOR|ANSI); } } - rioctl(IOFI); /* flush left-over or late response chars */ - sprintf(str,"%sANSWER",text_dir); - sprintf(tmp,"%s.%s",str,autoterm&WIP ? "WIP":"RIP"); - sprintf(str2,"%s.ANS",str); - if(autoterm&(RIP|WIP) && fexist(tmp)) - strcat(str,autoterm&WIP ? ".WIP":".RIP"); - else if(autoterm&ANSI && fexist(str2)) - strcat(str,".ANS"); - else - strcat(str,".ASC"); - rioctl(IOSM|PAUSE); - sys_status|=SS_PAUSEON; - tos=1; - printfile(str,P_NOABORT); - sys_status&=~SS_PAUSEON; - CRLF; } -else - useron.misc=(UPAUSE|ANSI|COLOR); - -useron.number=0; - -exec_bin(login_mod,&main_csi); - -if(!useron.number) - hangup(); -if(!online) { - logout(); - return(0); } - -if(online==ON_REMOTE && mdm_misc&MDM_CALLERID) { - strcpy(useron.note,cid); - putuserrec(useron.number,U_NOTE,LEN_NOTE,useron.note); } - -/* log the IP by enigma */ - -if(online==ON_REMOTE && ipstr[0]!='\0') { - sprintf(useron.note, "Telnet: %s", ipstr); - putuserrec(useron.number,U_NOTE,LEN_NOTE,useron.note); - logline("@*", useron.note); } - -if(!(sys_status&SS_USERON)) { - errormsg(WHERE,ERR_CHK,"User not logged on",0); - hangup(); - logout(); - return(0); } - -return(1); -} - diff --git a/src/sbbs2/makefile b/src/sbbs2/makefile deleted file mode 100644 index 1a2595638b..0000000000 --- a/src/sbbs2/makefile +++ /dev/null @@ -1,225 +0,0 @@ -######################################################################### -# Makefile for Synchronet BBS # -# For use with Borland c++ for DOS/Win32 or Borland C++ for OS/2 # -# Tabstop=8 # -# usage: make (under DOS/Windows to build DOS\SBBS.EXE) # -# make (under OS/2 to build OS2\SBBS4OS2.EXE) # -# make -DW32 (under Windows 95/NT to build W32\SBBS4W32.EXE) # -######################################################################### - -# Macros -BCDIR = e:\bc31 -CC = $(BCDIR)\bin\bcc -LD = $(BCDIR)\bin\tlink -INCLUDE = $(BCDIR)\include;smb;rio;..\spawno -LIB = $(BCDIR)\lib -DEFINES = -DSBBS - -!if $d(__OS2__) -CC = c:\bcos2\bin\bcc -LD = c:\bcos2\bin\tlink -INCLUDE = c:\bcos2\include;smb;rio -LIB = c:\bcos2\lib -OS = OS2 -CFLAGS = -N -d -C -sm -I$(INCLUDE) $(DEFINES) -n$(OS) -w-pro -LFLAGS = -m -s -c -Toe -ap -S:18000 -#16k still caused stack overflows? -#-w-srf? -MAIN = $(OS)\sbbs4os2.exe - -!elif $d(W32) - -OS = W32 -CC = \bc45\bin\bcc32 -LD = \bc45\bin\tlink32 -INCLUDE = \bc45\include;smb;rio -LIB = \bc45\lib -CFLAGS = -N -d -C -H -tWC -tWM -I$(INCLUDE) $(DEFINES) -n$(OS) -w-pro -LFLAGS = -m -n -c -Tpe -ax -S:18000 -MAIN = $(OS)\sbbs4w32.exe - -!else -OS = DOS -MODEL = l -CFLAGS = -N -d -C -Y -O1 -m$(MODEL) -I$(INCLUDE) $(DEFINES) -n$(OS) -w-pro -LFLAGS = -l -m -n -c -MAIN = $(OS)\sbbs.exe -!endif - - -!if $d(__OS2__) -OBJS = OS2\riolib.obj -!elif $d(W32) -OBJS = W32\riolib.obj -!else -OBJS = DOS\rciol.obj ..\mswait\DOS\mswait$(MODEL).obj -!endif -OBJS = $(OBJS) $(OS)\etext.obj $(OS)\scfgvars.obj $(OS)\vars.obj \ - $(OS)\xtrn.obj - -OVLOBJS = $(OS)\ars.obj\ - $(OS)\chk_ar.obj\ - $(OS)\comio.obj \ - $(OS)\con_in.obj \ - $(OS)\con_out.obj \ - $(OS)\con_mid.obj \ - $(OS)\con_hi.obj \ - $(OS)\atcodes.obj \ - $(OS)\data.obj \ - $(OS)\data_ovl.obj\ - $(OS)\getuser.obj\ - $(OS)\userrec.obj\ - $(OS)\getnode.obj\ - $(OS)\putnode.obj\ - $(OS)\exec.obj \ - $(OS)\execmisc.obj \ - $(OS)\execfunc.obj \ - $(OS)\execmsg.obj \ - $(OS)\execfile.obj \ - $(OS)\file.obj $(OS)\file_ovl.obj \ - $(OS)\chat.obj $(OS)\fido.obj \ - $(OS)\initdata.obj \ - $(OS)\listfile.obj \ - $(OS)\viewfile.obj \ - $(OS)\logio.obj \ - $(OS)\login.obj \ - $(OS)\logon.obj \ - $(OS)\logout.obj \ - $(OS)\newuser.obj \ - $(OS)\mail.obj \ - $(OS)\main.obj $(OS)\main_ovl.obj $(OS)\main_sec.obj \ - $(OS)\main_wfc.obj \ - $(OS)\msg1.obj \ - $(OS)\msg2.obj\ - $(OS)\putmsg.obj\ - $(OS)\postmsg.obj\ - $(OS)\email.obj\ - $(OS)\netmail.obj\ - $(OS)\bulkmail.obj\ - $(OS)\misc.obj\ - $(OS)\qwk.obj\ - $(OS)\qwktomsg.obj\ - $(OS)\msgtoqwk.obj\ - $(OS)\pack_qwk.obj\ - $(OS)\pack_rep.obj\ - $(OS)\un_qwk.obj\ - $(OS)\un_rep.obj\ - $(OS)\readmsgs.obj\ - $(OS)\scfglib1.obj\ - $(OS)\scfglib2.obj\ - $(OS)\str.obj $(OS)\text_sec.obj $(OS)\useredit.obj\ - $(OS)\xfer_lo.obj $(OS)\xfer_mid.obj $(OS)\xfer_hi.obj\ - $(OS)\xtrn_ovl.obj $(OS)\xfer_sec.obj $(OS)\lzh.obj\ - $(OS)\smblib.obj - -HEADERS = sbbs.h sbbsdefs.h gen_defs.h nodedefs.h text.h vars.c scfgvars.c \ - smb\smblib.h smb\smbdefs.h - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) $(OVLOBJS) $(OS)\ver.obj - @echo Linking $< ... -!if $d(__OS2__) - $(LD) $(LFLAGS) @&&+ -$(OBJS) $(LIB)\c02.obj $(OS)\ver.obj $(OVLOBJS) -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2mt.lib -!elif $d(W32) - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0X32.OBJ $(OBJS) $(OS)\ver.obj $(OVLOBJS) -+, $*, $*, $(LIB)\import32.lib $(LIB)\cw32mt.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) $(OS)\ver.obj /o $(OVLOBJS), \ -$*, $*, ..\spawno\spawnl $(LIB)\overlay $(LIB)\c$(MODEL) \ - $(LIB)\math$(MODEL) $(LIB)\emu -+ -!endif - -$(OS)\smblib.obj: smb\smblib.c smb\smblib.h smb\smbdefs.h - @echo Compiling SMBLIB ... - $(CC) $(CFLAGS) -c -DSMB_GETMSGTXT smb\smblib.c - -$(OS)\lzh.obj: smb\lzh.c smb\lzh.h - @echo Compiling LZH ... - $(CC) $(CFLAGS) -c -DLZH_DYNAMIC_BUF smb\lzh.c - -$(OS)\riolib.obj: rio\riolib.c rio\riolib.h rio\riodefs.h - @echo Compiling RIOLIB ... - $(CC) $(CFLAGS) -c rio\riolib.c - -etext.h: etext.dat - @echo Creating new encrypted text (ETEXT) Code and Header files... - genetext - -# All .obj modules -$(OS)\ars.obj: $(HEADERS) ars_defs.h -$(OS)\chk_ar.obj: $(HEADERS) ars_defs.h -$(OS)\atcodes.obj: $(HEADERS) cmdshell.h -$(OS)\chat.obj: $(HEADERS) -$(OS)\comio.obj: $(HEADERS) -$(OS)\con_in.obj: $(HEADERS) -$(OS)\con_out.obj: $(HEADERS) -$(OS)\con_mid.obj: $(HEADERS) -$(OS)\con_hi.obj: $(HEADERS) -$(OS)\data.obj: $(HEADERS) -$(OS)\data_ovl.obj: $(HEADERS) -$(OS)\exec.obj: $(HEADERS) cmdshell.h -$(OS)\execmisc.obj: $(HEADERS) cmdshell.h -$(OS)\execfunc.obj: $(HEADERS) cmdshell.h -$(OS)\execmsg.obj: $(HEADERS) cmdshell.h -$(OS)\execfile.obj: $(HEADERS) cmdshell.h -$(OS)\etext.obj: etext.h -$(OS)\fido.obj: $(HEADERS) -$(OS)\file.obj: $(HEADERS) -$(OS)\file_ovl.obj: $(HEADERS) -$(OS)\initdata.obj: $(HEADERS) -$(OS)\listfile.obj: $(HEADERS) -$(OS)\viewfile.obj: $(HEADERS) -$(OS)\logio.obj: $(HEADERS) -$(OS)\login.obj: $(HEADERS) -$(OS)\logon.obj: $(HEADERS) cmdshell.h -$(OS)\logout.obj: $(HEADERS) -$(OS)\main.obj: $(HEADERS) cmdshell.h -$(OS)\mail.obj: $(HEADERS) -$(OS)\main_ovl.obj: $(HEADERS) etext.h -$(OS)\main_sec.obj: $(HEADERS) -$(OS)\main_wfc.obj: $(HEADERS) qwk.h etext.h -$(OS)\misc.obj: $(HEADERS) ars_defs.h smb\crc32.h -$(OS)\msg1.obj: $(HEADERS) -$(OS)\msg2.obj: $(HEADERS) -$(OS)\newuser.obj: $(HEADERS) -$(OS)\putmsg.obj: $(HEADERS) -$(OS)\email.obj: $(HEADERS) cmdshell.h -$(OS)\postmsg.obj: $(HEADERS) -$(OS)\netmail.obj: $(HEADERS) qwk.h -$(OS)\bulkmail.obj: $(HEADERS) -$(OS)\qwk.obj: $(HEADERS) qwk.h post.h etext.h -$(OS)\qwktomsg.obj: $(HEADERS) qwk.h -$(OS)\msgtoqwk.obj: $(HEADERS) qwk.h -$(OS)\pack_qwk.obj: $(HEADERS) qwk.h post.h -$(OS)\pack_rep.obj: $(HEADERS) qwk.h post.h -$(OS)\un_qwk.obj: $(HEADERS) qwk.h -$(OS)\un_rep.obj: $(HEADERS) qwk.h -$(OS)\readmsgs.obj: $(HEADERS) post.h -$(OS)\scfglib1.obj: $(HEADERS) scfglib.h -$(OS)\scfglib2.obj: $(HEADERS) scfglib.h -$(OS)\scfgvars.obj: $(HEADERS) -$(OS)\str.obj: $(HEADERS) -$(OS)\getnode.obj: $(HEADERS) -$(OS)\putnode.obj: $(HEADERS) -$(OS)\text_sec.obj: $(HEADERS) -$(OS)\getuser.obj: $(HEADERS) -$(OS)\userrec.obj: $(HEADERS) -$(OS)\useredit.obj: $(HEADERS) -$(OS)\vars.obj: $(HEADERS) -$(OS)\ver.obj: $(OBJS) $(OVLOBJS) $(HEADERS) -$(OS)\xfer_lo.obj: $(HEADERS) -$(OS)\xfer_mid.obj: $(HEADERS) -$(OS)\xfer_hi.obj: $(HEADERS) -$(OS)\xfer_sec.obj: $(HEADERS) -$(OS)\xtrn.obj: $(HEADERS) cmdshell.h -$(OS)\xtrn_ovl.obj: $(HEADERS) diff --git a/src/sbbs2/misc.c b/src/sbbs2/misc.c deleted file mode 100644 index 8bb6116ca6..0000000000 --- a/src/sbbs2/misc.c +++ /dev/null @@ -1,815 +0,0 @@ -#line 1 "MISC.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/***************************************************************************/ -/* Miscellaneous functions that are useful many places throughout the code */ -/***************************************************************************/ - -#include "sbbs.h" -#include "crc32.h" - -#ifdef __WIN32__ -#include <windows.h> // Required for kbd_state(), beep(), and mswait() -#endif - -/****************************************************************************/ -/* Returns the number of characters in 'str' not counting ctrl-ax codes */ -/* or the null terminator */ -/****************************************************************************/ -int bstrlen(char *str) -{ - int i=0; - -while(*str) { - if(*str==1) /* ctrl-a */ - str++; - else - i++; - if(!(*str)) break; - str++; } -return(i); -} - -void strip_ctrl(char *str) -{ - char tmp[1024]; - int i,j,k; - -k=strlen(str); -for(i=j=0;i<k;i++) - if(str[i]==1) /* Ctrl-a */ - i++; - else if(j && str[i]<=SP && tmp[j-1]==SP) - continue; - else if(i && !isalnum(str[i]) && str[i]==str[i-1]) - continue; - else if((uchar)str[i]>=SP) - tmp[j++]=str[i]; - else if(str[i]==TAB || (str[i]==CR && str[i+1]==LF)) - tmp[j++]=SP; -tmp[j]=0; -strcpy(str,tmp); -} - -void strip_exascii(char *str) -{ - char tmp[1024]; - int i,j,k; - -k=strlen(str); -for(i=j=0;i<k;i++) - if(!(str[i]&0x80)) - tmp[j++]=str[i]; -tmp[j]=0; -strcpy(str,tmp); -} - -/****************************************************************************/ -/* Returns in 'string' a character representation of the number in l with */ -/* commas. */ -/****************************************************************************/ -char *ultoac(ulong l, char *string) -{ - char str[256]; - char i,j,k; - -ultoa(l,str,10); -i=strlen(str)-1; -j=i/3+1+i; -string[j--]=0; -for(k=1;i>-1;k++) { - string[j--]=str[i--]; - if(j>0 && !(k%3)) - string[j--]=','; } -return(string); -} - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access&O_DENYNONE) { - share=SH_DENYNO; - access&=~O_DENYNONE; } -else if(access==O_RDONLY) share=SH_DENYWR; -else share=SH_DENYRW; -while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN) - if(count>10) - mswait(55); -if(count>(LOOP_NOPEN/2) && count<=LOOP_NOPEN) { - sprintf(logstr,"NOPEN COLLISION - File: %s Count: %d" - ,str,count); - logline("!!",logstr); } -if(file==-1 && errno==EACCES) - bputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(((*file)=nopen(str,access))==-1) - return(NULL); - -if(access&O_APPEND) { - if(access&O_RDONLY) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&O_WRONLY) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - close(*file); - errormsg(WHERE,ERR_FDOPEN,str,access); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,2*1024); -return(stream); -} - -#ifndef __FLAT__ -/****************************************************************************/ -/* This function reads files that are potentially larger than 32k. */ -/* Up to one megabyte of data can be read with each call. */ -/****************************************************************************/ -long lread(int file, char huge *buf,long bytes) -{ - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(read(file,(char *)buf,32767)!=32767) - return(-1L); -if(read(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} - -long lfread(char huge *buf, long bytes, FILE *fp) -{ - long count; - -for(count=bytes;count>0x7fff;count-=0x7fff,buf+=0x7fff) - if(fread((char *)buf,1,0x7fff,fp)!=0x7fff) - return(0); -if(fread((char *)buf,1,(int)count,fp)!=count) - return(0); -return(bytes); -} - -/****************************************************************************/ -/* This function writes files that are potentially larger than 32767 bytes */ -/* Up to one megabytes of data can be written with each call. */ -/****************************************************************************/ -long lwrite(int file, char huge *buf, long bytes) -{ - - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(write(file,(char *)buf,32767)!=32767) - return(-1L); -if(write(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} -#endif - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - uint c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} - -/****************************************************************************/ -/* Puts a backslash on path strings if not just a drive letter and colon */ -/****************************************************************************/ -void backslashcolon(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\' && str[i-1]!=':') { - str[i]='\\'; str[i+1]=0; } -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns CRC-16 of string (not including terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -/****************************************************************************/ -/* Returns CRC-32 of string (not including terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *buf, ulong len) -{ - ulong l,crc=0xffffffff; - -for(l=0;l<len;l++) - crc=ucrc32(buf[l],crc); -return(~crc); -} - -/****************************************************************************/ -/* Compares pointers to pointers to char. Used in conjuction with qsort() */ -/****************************************************************************/ -int pstrcmp(char **str1, char **str2) -{ -return(strcmp(*str1,*str2)); -} - -/****************************************************************************/ -/* Returns the number of characters that are the same between str1 and str2 */ -/****************************************************************************/ -int strsame(char *str1, char *str2) -{ - int i,j=0; - -for(i=0;i<strlen(str1);i++) - if(str1[i]==str2[i]) j++; -return(j); -} - -#define MV_BUFLEN 4096 - -/****************************************************************************/ -/* Moves or copies a file from one dir to another */ -/* both 'src' and 'dest' must contain full path and filename */ -/* returns 0 if successful, -1 if error */ -/****************************************************************************/ -int mv(char *src, char *dest, char copy) -{ - char str[256],*buf,atr=curatr; - int ind,outd; - long length,chunk=MV_BUFLEN,l; - struct ftime ftime; - FILE *inp,*outp; - -if(!stricmp(src,dest)) /* source and destination are the same! */ - return(0); -if(!fexist(src)) { - bprintf("\r\n\7MV ERROR: Source doesn't exist\r\n'%s'\r\n" - ,src); - return(-1); } -if(!copy && fexist(dest)) { - bprintf("\r\n\7MV ERROR: Destination already exists\r\n'%s'\r\n" - ,dest); - return(-1); } -if(!copy && ((src[1]!=':' && dest[1]!=':') - || (src[1]==':' && dest[1]==':' && toupper(src[0])==toupper(dest[0])))) { - if(rename(src,dest)) { /* same drive, so move */ - bprintf("\r\nMV ERROR: Error renaming '%s'" - "\r\n to '%s'\r\n\7",src,dest); - return(-1); } - return(0); } -attr(WHITE); -if((ind=nopen(src,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,src,O_RDONLY); - return(-1); } -if((inp=fdopen(ind,"rb"))==NULL) { - close(ind); - errormsg(WHERE,ERR_FDOPEN,str,O_RDONLY); - return(-1); } -setvbuf(inp,NULL,_IOFBF,32*1024); -if((outd=nopen(dest,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - fclose(inp); - errormsg(WHERE,ERR_OPEN,dest,O_WRONLY|O_CREAT|O_TRUNC); - return(-1); } -if((outp=fdopen(outd,"wb"))==NULL) { - close(outd); - fclose(inp); - errormsg(WHERE,ERR_FDOPEN,dest,O_WRONLY|O_CREAT|O_TRUNC); - return(-1); } -setvbuf(outp,NULL,_IOFBF,8*1024); -length=filelength(ind); -if(!length) { - fclose(inp); - fclose(outp); - errormsg(WHERE,ERR_LEN,src,0); - return(-1); } -if((buf=(char *)MALLOC(MV_BUFLEN))==NULL) { - fclose(inp); - fclose(outp); - errormsg(WHERE,ERR_ALLOC,nulstr,MV_BUFLEN); - return(-1); } -l=0L; -while(l<length) { - bprintf("%2lu%%",l ? (long)(100.0/((float)length/l)) : 0L); - if(l+chunk>length) - chunk=length-l; - if(fread(buf,1,chunk,inp)!=chunk) { - FREE(buf); - fclose(inp); - fclose(outp); - errormsg(WHERE,ERR_READ,src,chunk); - return(-1); } - if(fwrite(buf,1,chunk,outp)!=chunk) { - FREE(buf); - fclose(inp); - fclose(outp); - errormsg(WHERE,ERR_WRITE,dest,chunk); - return(-1); } - l+=chunk; - bputs("\b\b\b"); } -bputs(" \b\b\b"); /* erase it */ -attr(atr); -getftime(ind,&ftime); -setftime(outd,&ftime); -FREE(buf); -fclose(inp); -fclose(outp); -if(!copy && remove(src)) { - errormsg(WHERE,ERR_REMOVE,src,0); - return(-1); } -return(0); -} - -/****************************************************************************/ -/* Prompts user for System Password. Returns 1 if user entered correct PW */ -/****************************************************************************/ -char chksyspass(int local) -{ - static int inside; - char str[256],str2[256],x,y,atr; - int orgcon=console; - -if(inside) return(0); -if(online==ON_REMOTE && !(sys_misc&SM_R_SYSOP)) - return(0); -if(online==ON_LOCAL) { - if(!(sys_misc&SM_L_SYSOP)) - return(0); - if(!(node_misc&NM_SYSPW) && !(sys_misc&SM_REQ_PW)) - return(1); } -if(local) { - x=lclwx(); - y=lclwy(); - atr=lclatr(LIGHTGRAY<<4); - STATUSLINE; - lclxy(1,node_scrnlen); - lputc(CLREOL); - lputs(" System Password: "); } -else - bputs("SY: "); -console&=~(CON_R_ECHO|CON_L_ECHO); -inside=1; -getstr(str,40,K_UPPER); -if(local) { - TEXTWINDOW; - lclatr(atr); - lclxy(x,y); - statusline(); } -inside=0; -console=orgcon; -if(!local) - CRLF; -if(strcmp(sys_pass,str)) { - sprintf(str2,"%s #%u System password attempt: '%s'" - ,useron.alias,useron.number,str); - logline("S!",str2); - return(0); } -return(1); -} - -/****************************************************************************/ -/* Converts when_t.zone into ASCII format */ -/****************************************************************************/ -char *zonestr(short zone) -{ - static char str[32]; - -switch((ushort)zone) { - case 0: return("UT"); - case AST: return("AST"); - case EST: return("EST"); - case CST: return("CST"); - case MST: return("MST"); - case PST: return("PST"); - case YST: return("YST"); - case HST: return("HST"); - case BST: return("BST"); - case ADT: return("ADT"); - case EDT: return("EDT"); - case CDT: return("CDT"); - case MDT: return("MDT"); - case PDT: return("PDT"); - case YDT: return("YDT"); - case HDT: return("HDT"); - case BDT: return("BDT"); - case MID: return("MID"); - case VAN: return("VAN"); - case EDM: return("EDM"); - case WIN: return("WIN"); - case BOG: return("BOG"); - case CAR: return("CAR"); - case RIO: return("RIO"); - case FER: return("FER"); - case AZO: return("AZO"); - case LON: return("LON"); - case BER: return("BER"); - case ATH: return("ATH"); - case MOS: return("MOS"); - case DUB: return("DUB"); - case KAB: return("KAB"); - case KAR: return("KAR"); - case BOM: return("BOM"); - case KAT: return("KAT"); - case DHA: return("DHA"); - case BAN: return("BAN"); - case HON: return("HON"); - case TOK: return("TOK"); - case SYD: return("SYD"); - case NOU: return("NOU"); - case WEL: return("WEL"); - } - -sprintf(str,"%02d:%02u",zone/60,zone<0 ? (-zone)%60 : zone%60); -return(str); -} - -/****************************************************************************/ -/* Waits so many seconds. Call with 2 or greater. */ -/****************************************************************************/ -void secwait(int sec) -{ - time_t start; - -start=time(NULL); -while(time(NULL)-start<sec) - mswait(1); -} - -/****************************************************************************/ -/* Converts a date string in format MM/DD/YY into unix time format */ -/****************************************************************************/ -time_t dstrtounix(char *str) -{ - -if(!strncmp(str,"00/00/00",8)) - return(0); -curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0; -if(str[6]<'7') - date.da_year=2000+((str[6]&0xf)*10)+(str[7]&0xf); -else - date.da_year=1900+((str[6]&0xf)*10)+(str[7]&0xf); -if(sys_misc&SM_EURODATE) { - date.da_mon=((str[3]&0xf)*10)+(str[4]&0xf); - date.da_day=((str[0]&0xf)*10)+(str[1]&0xf); } -else { - date.da_mon=((str[0]&0xf)*10)+(str[1]&0xf); - date.da_day=((str[3]&0xf)*10)+(str[4]&0xf); } -return(dostounix(&date,&curtime)); -} - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - -if(!unix) - strcpy(str,"00/00/00"); -else { - unixtodos(unix,&date,&curtime); - if((unsigned)date.da_mon>12) { /* DOS leap year bug */ - date.da_mon=1; - date.da_year++; } - if((unsigned)date.da_day>31) - date.da_day=1; - if(sys_misc&SM_EURODATE) - sprintf(str,"%02u/%02u/%02u",date.da_day,date.da_mon - ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); - else - sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day - ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); } -return(str); -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0 /*FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC */)==0) - return(1); -return(0); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(f.ff_fsize); -return(-1L); -} - -time_t ftimetounix(struct ftime ft) -{ - struct date da; - struct time ti; - -ti.ti_min=ft.ft_min; -ti.ti_hour=ft.ft_hour; -ti.ti_hund=0; -ti.ti_sec=ft.ft_tsec*2; -da.da_year=1980+ft.ft_year; -da.da_day=ft.ft_day; -da.da_mon=ft.ft_month; -return(dostounix(&da,&ti)); -} - -struct ftime unixtoftime(time_t unix) -{ - struct date da; - struct time ti; - struct ftime ft; - -unixtodos(unix,&da,&ti); -ft.ft_min=ti.ti_min; -ft.ft_hour=ti.ti_hour; -ft.ft_tsec=ti.ti_sec/2; -ft.ft_year=da.da_year-1980; -ft.ft_day=da.da_day; -ft.ft_month=da.da_mon; -return(ft); -} - -/****************************************************************************/ -/* Returns the time/date of the file in 'filespec' in time_t (unix) format */ -/****************************************************************************/ -long fdate(char *filespec) -{ - int file; - struct ftime f; - time_t t; - -if((file=nopen(filespec,O_RDONLY))==-1) - return(0); -getftime(file,&f); -t=ftimetounix(f); -close(file); -return(t); -} - -long fdate_dir(char *filespec) -{ - struct ffblk f; - struct date fd; - struct time ft; - -if(findfirst(filespec,&f,0/* FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC */)==0) { - fd.da_day=f.ff_fdate&0x1f; - fd.da_mon=(f.ff_fdate>>5)&0xf; - fd.da_year=1980+((f.ff_fdate>>9)&0x7f); - ft.ti_hour=(f.ff_ftime>>11)&0x1f; - ft.ti_min=(f.ff_ftime>>5)&0x3f; - ft.ti_sec=(f.ff_ftime&0xf)*2; - return(dostounix(&fd,&ft)); } -else return(0); -} - - - -/****************************************************************************/ -/* Returns the FidoNet address kept in str as ASCII. */ -/****************************************************************************/ -faddr_t atofaddr(char *str) -{ - char *p; - faddr_t addr; - -addr.zone=addr.net=addr.node=addr.point=0; -if((p=strchr(str,':'))!=NULL) { - addr.zone=atoi(str); - addr.net=atoi(p+1); } -else { - if(total_faddrs) - addr.zone=faddr[0].zone; - else - addr.zone=1; - addr.net=atoi(str); } -if(!addr.zone) /* no such thing as zone 0 */ - addr.zone=1; -if((p=strchr(str,'/'))!=NULL) - addr.node=atoi(p+1); -else { - if(total_faddrs) - addr.net=faddr[0].net; - else - addr.net=1; - addr.node=atoi(str); } -if((p=strchr(str,'.'))!=NULL) - addr.point=atoi(p+1); -return(addr); -} - -/****************************************************************************/ -/* Returns an ASCII string for FidoNet address 'addr' */ -/****************************************************************************/ -char *faddrtoa(faddr_t addr) -{ - static char str[25]; - char point[25]; - -sprintf(str,"%u:%u/%u",addr.zone,addr.net,addr.node); -if(addr.point) { - sprintf(point,".%u",addr.point); - strcat(str,point); } -return(str); -} - -/****************************************************************************/ -/* Returns string for 2 digit hex+ numbers up to 575 */ -/****************************************************************************/ -char *hexplus(uint num, char *str) -{ -sprintf(str,"%03x",num); -str[0]=num/0x100 ? 'f'+(num/0x10)-0xf : str[1]; -str[1]=str[2]; -str[2]=0; -return(str); -} - -uint hptoi(char *str) -{ - char tmp[128]; - uint i; - -if(!str[1] || toupper(str[0])<='F') - return(ahtoul(str)); -strcpy(tmp,str); -tmp[0]='F'; -i=ahtoul(tmp)+((toupper(str[0])-'F')*0x10); -return(i); -} - -#ifndef __FLAT__ - -void beep(int freq, int dur) -{ -sound(freq); -mswait(dur); -nosound(); -} - -int kbd_state(void) -{ -return(peekb(0,0x417)); /* Check scroll lock */ -} - -#elif defined(__WIN32__) - -void beep(int freq, int dur) -{ -Beep(freq,dur); // Requires WINDOWS.H -} - -void mswait(int ms) -{ -Sleep(ms); // Requires WINDOWS.H -} - -#endif - -#ifdef __OS2__ - -int kbd_state(void) -{ - KBDINFO info; - -KbdGetStatus(&info,0); -return(info.fsState); -} - -void mswait(int msec) -{ -DosSleep(msec ? msec : 1); -} - -#elif defined(__WIN32__) - -#define KBDSTF_RIGHTSHIFT 0x0001 -#define KBDSTF_LEFTSHIFT 0x0002 -#define KBDSTF_CONTROL 0x0004 -#define KBDSTF_ALT 0x0008 -#define KBDSTF_SCROLLLOCK_ON 0x0010 -#define KBDSTF_NUMLOCK_ON 0x0020 -#define KBDSTF_CAPSLOCK_ON 0x0040 -#define KBDSTF_INSERT_ON 0x0080 -#define KBDSTF_LEFTCONTROL 0x0100 -#define KBDSTF_LEFTALT 0x0200 -#define KBDSTF_RIGHTCONTROL 0x0400 -#define KBDSTF_RIGHTALT 0x0800 -#define KBDSTF_SCROLLLOCK 0x1000 -#define KBDSTF_NUMLOCK 0x2000 -#define KBDSTF_CAPSLOCK 0x4000 -#define KBDSTF_SYSREQ 0x8000 - -int kbd_state(void) -{ - int i=0; - ulong l; - INPUT_RECORD rec; - -PeekConsoleInput(stdin,&rec,1,&l); -if(rec.EventType==KEY_EVENT) - l=rec.Event.KeyEvent.dwControlKeyState; -else if(rec.EventType==MOUSE_EVENT) - l=rec.Event.MouseEvent.dwControlKeyState; -else - return(0); - -/* Translate Win32 key state to IBM key state */ - -if(l&RIGHT_ALT_PRESSED) - i|=KBDSTF_RIGHTALT; -if(l&LEFT_ALT_PRESSED) - i|=KBDSTF_LEFTALT; -if(l&RIGHT_CTRL_PRESSED) - i|=KBDSTF_RIGHTCONTROL; -if(l&LEFT_CTRL_PRESSED) - i|=KBDSTF_LEFTCONTROL; -if(l&CAPSLOCK_ON) - i|=KBDSTF_CAPSLOCK; -if(l&NUMLOCK_ON) - i|=KBDSTF_NUMLOCK; -if(l&SCROLLLOCK_ON) - i|=KBDSTF_SCROLLLOCK; -if(l&SHIFT_PRESSED) - i|=KBDSTF_LEFTSHIFT; - -return(i); -} - - - -#endif - diff --git a/src/sbbs2/mlabels/make.bat b/src/sbbs2/mlabels/make.bat deleted file mode 100755 index e2aa293fc7..0000000000 --- a/src/sbbs2/mlabels/make.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -w-pro -I.. mlabels.c diff --git a/src/sbbs2/mlabels/mlabels.c b/src/sbbs2/mlabels/mlabels.c deleted file mode 100644 index 080f6a653c..0000000000 --- a/src/sbbs2/mlabels/mlabels.c +++ /dev/null @@ -1,361 +0,0 @@ -/* MLABELS.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Make mailing labels from Synchronet BBS user database */ -/* Digital Dynamics - 03/16/93 v1.00 */ -/* Digital Dynamics - 03/03/94 v2.00 */ -/* Digital Dynamics - 04/13/95 v2.10 */ -/* Digital Dynamics - 07/17/95 v2.20 */ - -/* For compilation under Borland/Turbo C(++) */ - -/* Set tabstops to 4 for viewing/printing */ - -/* This program and source code are public domain. Modified versions may */ -/* note be distributed without consent from Digital Dynamics. */ - -#include <io.h> -#include <share.h> -#include <fcntl.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <sys\stat.h> -#include "sbbsdefs.h" /* Synchronet typedefs and macros header */ - -#define DOUBLE_COLUMN (1<<0) /* Print double column labels */ -#define ATTN_ALIAS (1<<1) /* Print ATTN: Alias/Real Name */ - -char *nulstr=""; -int min=0,max=99; -long reqflags[4]={0},reqrest=0,reqexempt=0; - -char *usage= -"\nusage: mlabels <data\\user path> [[-require] [...]] [/options] <outfile>\n" -"\nwhere require is one of:\n" -" L# set minimum level to # (default=0)\n" -" M# set maximum level to # (default=99)\n" -" F#<flags> set required flags from flag set #\n" -" E<flags> set required exemptions\n" -" R<flags> set required restrictions\n" -"\nwhere options is one or more of:\n" -" D double column labels\n" -" A include ATTN: alias/name on label\n" -"\nexample:\n" -"\nMLABELS \\SBBS\\DATA\\USER -L50 /D PRN\n"; - - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Returns bytes offset into user record for flag set # 'set' */ -/****************************************************************************/ -long getflagoff(int set) -{ -switch(set) { - default: - return(U_FLAGS1); - case 2: - return(U_FLAGS2); - case 3: - return(U_FLAGS3); - case 4: - return(U_FLAGS4); } -} - -/****************************************************************************/ -/* Checks a user record against the requirements set on the command line */ -/* Returns 1 if the user meets the requirements (or no requirements were */ -/* specified) or 0 if the user does not meet any of the requirements. */ -/****************************************************************************/ -int chkuser(FILE *stream, long offset) -{ - char str[128]; - int i; - -if(min || max!=99) { /* Check security level */ - fseek(stream,offset+U_LEVEL,SEEK_SET); - fread(str,2,1,stream); - str[2]=0; - i=atoi(str); - if(i<min || i>max) /* not within range */ - return(0); } /* so skip this user */ - -for(i=0;i<4;i++) - if(reqflags[i]) { - fseek(stream,offset+getflagoff(i+1),SEEK_SET); - fread(str,8,1,stream); - str[8]=0; - truncsp(str); - if((ahtoul(str)&reqflags[i])!=reqflags[i]) - return(0); } /* doesn't have 'em all */ - -if(reqrest) { - fseek(stream,offset+U_REST,SEEK_SET); - fread(str,8,1,stream); - str[8]=0; - truncsp(str); - if((ahtoul(str)&reqrest)!=reqrest) - return(0); } - -if(reqexempt) { - fseek(stream,offset+U_REST,SEEK_SET); - fread(str,8,1,stream); - str[8]=0; - truncsp(str); - if((ahtoul(str)&reqexempt)!=reqexempt) - return(0); } - -return(1); -} - -/****************************************************************************/ -/* Attempts to lock a user record, retries for up to 10 seconds */ -/* Returns 0 on success, -1 on failure */ -/****************************************************************************/ -int lockuser(FILE *stream, ulong offset) -{ - time_t start; - -if(lock(fileno(stream),offset,U_LEN)==0) - return(0); -start=time(NULL); -while(1) { - if(lock(fileno(stream),offset,U_LEN)==0) - return(0); - if(time(NULL)-start>=10L) - break; } -return(-1); -} - -/***************/ -/* Entry point * -/***************/ -int main(int argc, char **argv) -{ - char str[256],buf1[U_LEN],buf2[U_LEN],infile[128]="",outfile[128]="" - ,mode=0; /* optional modes bits */ - int i,j,k,file,printed=0; - long l,length,offset; - FILE *in,*out; - -printf("\nSynchronet Mailing Labels v2.10\n"); -for(i=1;i<argc;i++) { - if(argv[i][0]=='-') - switch(toupper(argv[i][1])) { - case 'L': /* Set minimum sec level */ - min=atoi(argv[i]+2); - break; - case 'M': /* Set maximum sec level */ - max=atoi(argv[i]+2); - break; - case 'F': /* Set required flags */ - j=3; - k=1; - if(isdigit(argv[i][2])) - k=argv[i][2]&0xf; - else - j=2; - for(;argv[i][j];j++) - if(isalpha(argv[i][j])) - reqflags[k-1]|=FLAG(toupper(argv[i][j])); - break; - case 'R': /* Set required restrictions */ - for(j=2;argv[i][j];j++) - if(isalpha(argv[i][j])) - reqrest|=FLAG(toupper(argv[i][j])); - break; - case 'E': /* Set required exemptions */ - for(j=2;argv[i][j];j++) - if(isalpha(argv[i][j])) - reqexempt|=FLAG(toupper(argv[i][j])); - break; - default: /* Unrecognized include */ - printf(usage); - exit(1); } - - else if(argv[i][0]=='/') { - k=strlen(argv[i]); - for(j=1;j<k;j++) - switch(toupper(argv[i][j])) { - case 'D': /* Double column labels */ - mode|=DOUBLE_COLUMN; - break; - case 'A': /* Attention Alias/Real Name */ - mode|=ATTN_ALIAS; - break; - default: - printf("\nUnknown option\n"); - case '?': - printf(usage); - exit(1); } } - else if(infile[0]) /* in filename already given */ - strcpy(outfile,argv[i]); - else - strcpy(infile,argv[i]); } - -if(!infile[0] || !outfile[0]) { - printf("\nFilename not specified\n"); - printf(usage); - exit(1); } - -if(infile[strlen(infile)-1]!='\\' && infile[strlen(infile)-1]!=':') - strcat(infile,"\\"); -strcat(infile,"USER.DAT"); -if((file=sopen(infile,O_RDONLY|O_BINARY,SH_DENYNO))==-1) { - printf("\nError opening %s\n",infile); - exit(1); } -if((in=fdopen(file,"rb"))==NULL) { - printf("\nError opening %s\n",infile); - exit(1); } -setvbuf(in,NULL,_IOFBF,2048); -length=filelength(file); - -if((file=open(outfile,O_WRONLY|O_TRUNC|O_CREAT|O_BINARY - ,S_IWRITE|S_IREAD))==-1) { - printf("\nError opening/creating %s\n",outfile); - exit(1); } -if((out=fdopen(file,"wb"))==NULL) { - printf("\nError opening %s\n",outfile); - exit(1); } -setvbuf(out,NULL,_IOFBF,2048); - -printf("\n"); -for(offset=0;offset<length;offset+=U_LEN) { - printf("%lu of %lu (%u labels)\r" - ,(offset/U_LEN)+1,length/U_LEN,printed); - if(lockuser(in,offset)) { - printf("Error locking offset %lu\n",offset); - continue; } - - if(!chkuser(in,offset)) { - unlock(fileno(in),offset,U_LEN); - continue; } - - fseek(in,offset,SEEK_SET); - if(!fread(buf1,U_LEN,1,in)) { - printf("Couldn't read %lu bytes at %lu\n",U_LEN,offset); - break; } - unlock(fileno(in),offset,U_LEN); - for(i=0;i<U_LEN;i++) { /* Convert ETX (3) to NULL (0) */ - if(buf1[i]==ETX) - buf1[i]=NULL; } - - buf1[U_MISC+8]=0; - l=ahtoul(buf1+U_MISC); - if(l&(DELETED|INACTIVE)) /* skip if deleted or inactive */ - continue; - - while(mode&DOUBLE_COLUMN) { /* double wide - right column */ - offset+=U_LEN; - printf("%lu of %lu (%u labels)\r" - ,(offset/U_LEN)+1,length/U_LEN,printed); - if(lockuser(in,offset)) { - printf("Error locking offset %lu\n",offset); - continue; } - fseek(in,offset,SEEK_SET); - if(!fread(buf2,U_LEN,1,in)) { - mode&=~DOUBLE_COLUMN; - unlock(fileno(in),offset,U_LEN); } - else { - if(!chkuser(in,offset)) { - unlock(fileno(in),offset,U_LEN); - continue; } - unlock(fileno(in),offset,U_LEN); - for(i=0;i<U_LEN;i++) { /* Convert ETX (3) to NULL (0) */ - if(buf2[i]==ETX) - buf2[i]=NULL; } - buf2[U_MISC+8]=0; - l=ahtoul(buf2+U_MISC); - if(l&(DELETED|INACTIVE)) /* skip if deleted or inactive */ - continue; - else - break; } } - - if(mode&DOUBLE_COLUMN) { /* print two columns */ - fprintf(out," %-*.*s%*s%.*s\r\n" - ,LEN_NAME,LEN_NAME - ,buf1+U_NAME - ,41-LEN_NAME,nulstr - ,LEN_NAME - ,buf2+U_NAME); - - fprintf(out," %-*.*s%*s%.*s\r\n" - ,LEN_ADDRESS,LEN_ADDRESS - ,buf1+U_ADDRESS - ,41-LEN_ADDRESS,nulstr - ,LEN_ADDRESS - ,buf2+U_ADDRESS); - - sprintf(str,"%.*s %.*s" - ,LEN_LOCATION,buf1+U_LOCATION - ,LEN_ZIPCODE,buf1+U_ZIPCODE); - - fprintf(out," %-41s%.*s %.*s\r\n" - ,str - ,LEN_LOCATION,buf2+U_LOCATION - ,LEN_ZIPCODE,buf2+U_ZIPCODE); - - sprintf(str,"ATTN: %.*s",LEN_ALIAS,buf1+U_ALIAS); - - if(mode&ATTN_ALIAS) - fprintf(out," %-41sATTN: %.*s\r\n\r\n\r\n" - ,str,LEN_ALIAS,buf2+U_ALIAS); - else - fprintf(out,"\r\n\r\n\r\n"); - - printed+=2; } - - else { /* single column labels */ - fprintf(out," %.*s\r\n" - ,LEN_NAME - ,buf1+U_NAME); - - fprintf(out," %.*s\r\n" - ,LEN_ADDRESS - ,buf1+U_ADDRESS); - - fprintf(out," %.*s %.*s\r\n" - ,LEN_LOCATION - ,buf1+U_LOCATION - ,LEN_ZIPCODE - ,buf1+U_ZIPCODE); - - if(mode&ATTN_ALIAS) - fprintf(out," ATTN: %.*s\r\n\r\n\r\n" - ,LEN_ALIAS,buf1+U_ALIAS); - else - fprintf(out,"\r\n\r\n\r\n"); - - printed++; } } -printf("\nDone.\n"); -fclose(in); -fclose(out); -return(0); -} - -/* end of mlabels.c */ diff --git a/src/sbbs2/msg1.c b/src/sbbs2/msg1.c deleted file mode 100644 index e13d7a5065..0000000000 --- a/src/sbbs2/msg1.c +++ /dev/null @@ -1,493 +0,0 @@ -#line 1 "MSG1.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/***********************************************************************/ -/* Functions that do i/o with messages (posts/mail/auto) or their data */ -/***********************************************************************/ - -#include "sbbs.h" - -#define LZH 1 - -void lfputs(char HUGE16 *buf, FILE *fp) -{ -while(*buf) { - fputc(*buf,fp); - buf++; } -} - -/****************************************************************************/ -/* Loads an SMB message from the open msg base the fastest way possible */ -/* first by offset, and if that's the wrong message, then by number. */ -/* Returns 1 if the message was loaded and left locked, otherwise */ -/****************************************************************************/ -int loadmsg(smbmsg_t *msg, ulong number) -{ - char str[128]; - int i; - -if(msg->idx.offset) { /* Load by offset if specified */ - - if((i=smb_lockmsghdr(&smb,msg))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); - return(0); } - - i=smb_getmsghdr(&smb,msg); - if(!i && msg->hdr.number==number) - return(1); - - /* Wrong offset */ - - if(!i) { - smb_freemsgmem(msg); - msg->total_hfields=0; } - - smb_unlockmsghdr(&smb,msg); } - -msg->hdr.number=number; -if((i=smb_getmsgidx(&smb,msg))!=0) /* Message is deleted */ - return(0); -if((i=smb_lockmsghdr(&smb,msg))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); - return(0); } -if((i=smb_getmsghdr(&smb,msg))!=0) { - sprintf(str,"(%06lX) #%lu/%lu %s",msg->idx.offset,msg->idx.number - ,number,smb.file); - smb_unlockmsghdr(&smb,msg); - errormsg(WHERE,ERR_READ,str,i); - return(0); } -return(msg->total_hfields); -} - -/****************************************************************************/ -/* Displays a text file to the screen, reading/display a block at time */ -/****************************************************************************/ -void putmsg_fp(FILE *fp, long length, int mode) -{ - uchar *buf,tmpatr; - int i,j,b=8192,orgcon=console; - long l; - -tmpatr=curatr; /* was lclatr(-1) */ -if((buf=MALLOC(b+1))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,b+1L); - return; } -for(l=0;l<length;l+=b) { - if(l+b>length) - b=length-l; - i=j=fread(buf,1,b,fp); - if(!j) break; /* No bytes read */ - if(l+i<length) /* Not last block */ - while(i && buf[i-1]!=LF) i--; /* Search for last LF */ - if(!i) i=j; /* None found */ - buf[i]=0; - if(i<j) - fseek(fp,(long)-(j-i),SEEK_CUR); - b=i; - if(putmsg(buf,mode|P_SAVEATR)) - break; } -if(!(mode&P_SAVEATR)) { - console=orgcon; - attr(tmpatr); } -FREE(buf); -} - -void show_msgattr(ushort attr) -{ - -bprintf(text[MsgAttr] - ,attr&MSG_PRIVATE ? "Private " :nulstr - ,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 - ,nulstr - ,nulstr - ,nulstr - ,nulstr - ,nulstr - ,nulstr - ); -} - -/****************************************************************************/ -/* Displays a message header to the screen */ -/****************************************************************************/ -void show_msghdr(smbmsg_t msg) -{ - char *sender=NULL; - int i; - -attr(LIGHTGRAY); -if(useron.misc&CLRSCRN) - outchar(FF); -else - CRLF; -bprintf(text[MsgSubj],msg.subj); -if(msg.hdr.attr) - show_msgattr(msg.hdr.attr); - -bprintf(text[MsgTo],msg.to); -if(msg.to_ext) - bprintf(text[MsgToExt],msg.to_ext); -if(msg.to_net.addr) - bprintf(text[MsgToNet],msg.to_net.type==NET_FIDO - ? faddrtoa(*(faddr_t *)msg.to_net.addr) : msg.to_net.addr); -if(!(msg.hdr.attr&MSG_ANONYMOUS) || SYSOP) { - bprintf(text[MsgFrom],msg.from); - if(msg.from_ext) - bprintf(text[MsgFromExt],msg.from_ext); - if(msg.from_net.addr) - bprintf(text[MsgFromNet],msg.from_net.type==NET_FIDO - ? faddrtoa(*(faddr_t *)msg.from_net.addr) - : msg.from_net.addr); } -bprintf(text[MsgDate] - ,timestr((time_t *)&msg.hdr.when_written.time) - ,zonestr(msg.hdr.when_written.zone)); - -CRLF; - -for(i=0;i<msg.total_hfields;i++) { - if(msg.hfield[i].type==SENDER) - sender=msg.hfield_dat[i]; - if(msg.hfield[i].type==FORWARDED && sender) - bprintf(text[ForwardedFrom],sender - ,timestr((time_t *)msg.hfield_dat[i])); } - -/* Debug stuff -if(SYSOP) { - bprintf("\1n\1c\r\nAux : \1h%08lX",msg.hdr.auxattr); - bprintf("\1n\1c\r\nNum : \1h%lu",msg.hdr.number); } -*/ - -CRLF; -} - -#if !LZH - -/****************************************************************************/ -/* Displays message header and text (if not deleted) */ -/****************************************************************************/ -void show_msg(smbmsg_t msg, int mode) -{ - ushort xlat; - int i; - -show_msghdr(msg); -for(i=0;i<msg.hdr.total_dfields;i++) - switch(msg.dfield[i].type) { - case TEXT_BODY: - case TEXT_TAIL: - fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset - ,SEEK_SET); - fread(&xlat,2,1,smb.sdt_fp); - if(xlat!=XLAT_NONE) /* no translations supported */ - continue; - putmsg_fp(smb.sdt_fp,msg.dfield[i].length-2,mode); - CRLF; - break; } -} - -#else - -/****************************************************************************/ -/* Displays message header and text (if not deleted) */ -/****************************************************************************/ -void show_msg(smbmsg_t msg, int mode) -{ - char *inbuf,*lzhbuf; - ushort xlat; - int i,lzh; - long lzhlen,length; - -show_msghdr(msg); -for(i=0;i<msg.hdr.total_dfields;i++) - switch(msg.dfield[i].type) { - case TEXT_BODY: - case TEXT_TAIL: - fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset - ,SEEK_SET); - fread(&xlat,2,1,smb.sdt_fp); - lzh=0; - if(xlat==XLAT_LZH) { - lzh=1; - fread(&xlat,2,1,smb.sdt_fp); } - if(xlat!=XLAT_NONE) /* no translations supported */ - continue; - if(lzh) { - length=msg.dfield[i].length-4; - if((inbuf=MALLOC(length))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,length); - continue; } - fread(inbuf,length,1,smb.sdt_fp); - lzhlen=*(long *)inbuf; -/** - if(SYSOP) - bprintf("Decoding %lu bytes of LZH into %lu bytes of text " - "(%d%% compression)" - ,length,lzhlen - ,(int)(((float)(lzhlen-length)/lzhlen)*100.0)); -**/ - if((lzhbuf=MALLOC(lzhlen+2L))==NULL) { - FREE(inbuf); - errormsg(WHERE,ERR_ALLOC,nulstr,lzhlen+2L); - continue; } - lzh_decode(inbuf,length,lzhbuf); - lzhbuf[lzhlen]=0; -// CRLF; - putmsg(lzhbuf,P_NOATCODES); - FREE(lzhbuf); - FREE(inbuf); } - else - putmsg_fp(smb.sdt_fp,msg.dfield[i].length-2,mode); - CRLF; - break; } -} - -#endif - -void quotemsg(smbmsg_t msg, int tails) -{ - char str[256]; - -sprintf(str,"%sQUOTES.TXT",node_dir); -remove(str); -msgtotxt(msg,str,0,tails); -} - - -/****************************************************************************/ -/* Writes message header and text data to a text file */ -/****************************************************************************/ -void msgtotxt(smbmsg_t msg, char *str, int header, int tails) -{ - uchar HUGE16 *buf; - ushort xlat; - int i,j,x; - ulong l; - FILE *out; - -if((out=fnopen(&i,str,O_WRONLY|O_CREAT|O_APPEND))==NULL) { - errormsg(WHERE,ERR_OPEN,str,0); - return; } -if(header) { - fprintf(out,"\r\n"); - fprintf(out,"Subj : %s\r\n",msg.subj); - fprintf(out,"To : %s",msg.to); - if(msg.to_ext) - fprintf(out," #%s",msg.to_ext); - if(msg.to_net.addr) - fprintf(out," (%s)",msg.to_net.type==NET_FIDO - ? faddrtoa(*(faddr_t *)msg.to_net.addr) : msg.to_net.addr); - fprintf(out,"\r\nFrom : %s",msg.from); - if(msg.from_ext && !(msg.hdr.attr&MSG_ANONYMOUS)) - fprintf(out," #%s",msg.from_ext); - if(msg.from_net.addr) - fprintf(out," (%s)",msg.from_net.type==NET_FIDO - ? faddrtoa(*(faddr_t *)msg.from_net.addr) - : msg.from_net.addr); - fprintf(out,"\r\nDate : %.24s %s" - ,timestr((time_t *)&msg.hdr.when_written.time) - ,zonestr(msg.hdr.when_written.zone)); - fprintf(out,"\r\n\r\n"); } - -buf=smb_getmsgtxt(&smb,&msg,tails); -if(buf) { - lfputs(buf,out); - LFREE(buf); } -else if(smb_getmsgdatlen(&msg)>2) - errormsg(WHERE,ERR_ALLOC,smb.file,smb_getmsgdatlen(&msg)); -fclose(out); -} - - -/****************************************************************************/ -/* Returns total number of posts in a sub-board */ -/****************************************************************************/ -ulong getposts(uint subnum) -{ - char str[128]; - ulong l; - -sprintf(str,"%s%s.SID",sub[subnum]->data_dir,sub[subnum]->code); -l=flength(str); -if((long)l==-1) - return(0); -return(l/sizeof(idxrec_t)); -} - -/****************************************************************************/ -/* Returns message number posted at or after time */ -/****************************************************************************/ -ulong getmsgnum(uint subnum, time_t t) -{ - int i; - ulong l,total,bot,top; - smbmsg_t msg; - -if(!t) - return(0); - -sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } - -total=filelength(fileno(smb.sid_fp))/sizeof(idxrec_t); - -if(!total) { /* Empty base */ - smb_close(&smb); - return(0); } - -if((i=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return(0); } - -if((i=smb_getlastidx(&smb,&msg.idx))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,i); - return(0); } - -if(msg.idx.time<=t) { - smb_close(&smb); - return(msg.idx.number); } - -bot=0; -top=total; -l=total/2; /* Start at middle index */ -clearerr(smb.sid_fp); -while(1) { - fseek(smb.sid_fp,l*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg.idx,sizeof(idxrec_t),1,smb.sid_fp)) - break; - if(bot==top-1) - break; - if(msg.idx.time>t) { - top=l; - l=bot+((top-bot)/2); - continue; } - if(msg.idx.time<t) { - bot=l; - l=top-((top-bot)/2); - continue; } - break; } -smb_close(&smb); -return(msg.idx.number); -} - -/****************************************************************************/ -/* Returns the time of the message number pointed to by 'ptr' */ -/****************************************************************************/ -time_t getmsgtime(uint subnum, ulong ptr) -{ - char str[128]; - int i; - long l; - smbmsg_t msg; - idxrec_t lastidx; - -sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } -if(!filelength(fileno(smb.sid_fp))) { /* Empty base */ - smb_close(&smb); - return(0); } -msg.offset=0; -msg.hdr.number=0; -if(smb_getmsgidx(&smb,&msg)) { /* Get first message index */ - smb_close(&smb); - return(0); } -if(!ptr || msg.idx.number>=ptr) { /* ptr is before first message */ - smb_close(&smb); - return(msg.idx.time); } /* so return time of first msg */ - -if(smb_getlastidx(&smb,&lastidx)) { /* Get last message index */ - smb_close(&smb); - return(0); } -if(lastidx.number<ptr) { /* ptr is after last message */ - smb_close(&smb); - return(lastidx.time); } /* so return time of last msg */ - -msg.idx.time=0; -msg.hdr.number=ptr; -if(!smb_getmsgidx(&smb,&msg)) { - smb_close(&smb); - return(msg.idx.time); } - -if(ptr-msg.idx.number < lastidx.number-ptr) { - msg.offset=0; - msg.idx.number=0; - while(msg.idx.number<ptr) { - msg.hdr.number=0; - if(smb_getmsgidx(&smb,&msg) || msg.idx.number>=ptr) - break; - msg.offset++; } - smb_close(&smb); - return(msg.idx.time); } - -ptr--; -while(ptr) { - msg.hdr.number=ptr; - if(!smb_getmsgidx(&smb,&msg)) - break; - ptr--; } -smb_close(&smb); -return(msg.idx.time); -} - - -/****************************************************************************/ -/* Returns the total number of msgs in the sub-board and sets 'ptr' to the */ -/* number of the last message in the sub (0) if no messages. */ -/****************************************************************************/ -ulong getlastmsg(uint subnum, ulong *ptr, time_t *t) -{ - char str[256]; - int i; - ulong total; - idxrec_t idx; - -if(ptr) - (*ptr)=0; -if(t) - (*t)=0; -if(subnum>=total_subs) - return(0); - -sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } - -if(!filelength(fileno(smb.sid_fp))) { /* Empty base */ - smb_close(&smb); - return(0); } -if((i=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return(0); } -if((i=smb_getlastidx(&smb,&idx))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,i); - return(0); } -total=filelength(fileno(smb.sid_fp))/sizeof(idxrec_t); -smb_unlocksmbhdr(&smb); -smb_close(&smb); -if(ptr) - (*ptr)=idx.number; -if(t) - (*t)=idx.time; -return(total); -} - diff --git a/src/sbbs2/msg2.c b/src/sbbs2/msg2.c deleted file mode 100644 index b8468f8693..0000000000 --- a/src/sbbs2/msg2.c +++ /dev/null @@ -1,1202 +0,0 @@ -#line 1 "MSG2.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -#define MAX_LINE_LEN 82L - -char *qstr=" > %.76s\r\n"; - -int qwk_route(char *inaddr, char *fulladdr); - -void remove_re(char *str) -{ -while(!strnicmp(str,"RE:",3)) { - strcpy(str,str+3); - while(str[0]==SP) - strcpy(str,str+1); } -} - -/****************************************************************************/ -/* Modify 'str' to for quoted format. Remove ^A codes, etc. */ -/****************************************************************************/ -void quotestr(char *str) -{ - char tmp[512]; - int i,j; - -j=strlen(str); -while(j && (str[j-1]==SP || str[j-1]==LF || str[j-1]==CR)) j--; -str[j]=0; -remove_ctrl_a(str); -} - -void editor_inf(int xeditnum,char *dest, char *title,int mode - ,uint subnum) -{ - char str[512]; - int file; - -xeditnum--; - -if(xedit[xeditnum]->misc&QUICKBBS) { - sprintf(str,"%sMSGINF",node_dir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - sprintf(str,"%s\r\n%s\r\n%s\r\n%u\r\n%s\r\n%s\r\n" - ,(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_NAME) ? useron.name - : useron.alias - ,dest,title,1 - ,mode&WM_NETMAIL ? "NetMail" - :mode&WM_EMAIL ? "Electronic Mail" - :subnum==INVALID_SUB ? nulstr - :sub[subnum]->sname - ,mode&WM_PRIVATE ? "YES":"NO"); - write(file,str,strlen(str)); - close(file); } -else { - sprintf(str,"%sEDITOR.INF",node_dir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - sprintf(str,"%s\r\n%s\r\n%u\r\n%s\r\n%s\r\n%u\r\n" - ,title,dest,useron.number - ,(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_NAME) ? useron.name - : useron.alias - ,useron.name,useron.level); - write(file,str,strlen(str)); - close(file); } -} - -/****************************************************************************/ -/* Creates a message (post or mail) using standard line editor. 'fname' is */ -/* is name of file to create, 'top' is a buffer to place at beginning of */ -/* message and 'title' is the title (70chars max) for the message. */ -/* 'dest' contains a text description of where the message is going. */ -/* Returns positive if successful or 0 if aborted. */ -/****************************************************************************/ -char writemsg(char *fname, char *top, char *title, int mode, int subnum - ,char *dest) -{ - uchar str[256],quote[128],msgtmp[32],c,HUGE16 *buf,ex_mode=0,*p,*tp - ,useron_level; - int i,j,file,linesquoted=0; - long length,qlen,qtime; - ulong l; - FILE *stream; - -useron_level=useron.level; - -if((buf=(char HUGE16*)LMALLOC(level_linespermsg[useron_level]*MAX_LINE_LEN)) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,fname - ,level_linespermsg[useron_level]*MAX_LINE_LEN); - return(0); } - -if(mode&WM_NETMAIL || - (!(mode&(WM_EMAIL|WM_NETMAIL)) && sub[subnum]->misc&SUB_PNET)) - mode|=WM_NOTOP; - -if(useron.xedit && xedit[useron.xedit-1]->misc&QUICKBBS) - strcpy(msgtmp,"MSGTMP"); -else - strcpy(msgtmp,"INPUT.MSG"); - -if(mode&WM_QUOTE && !(useron.rest&FLAG('J')) - && ((mode&(WM_EMAIL|WM_NETMAIL) && sys_misc&SM_QUOTE_EM) - || (!(mode&(WM_EMAIL|WM_NETMAIL)) && (uint)subnum!=INVALID_SUB - && sub[subnum]->misc&SUB_QUOTE))) { - - /* Quote entire message to MSGTMP or INPUT.MSG */ - - if(useron.xedit && xedit[useron.xedit-1]->misc"EALL) { - sprintf(str,"%sQUOTES.TXT",node_dir); - if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - LFREE(buf); - return(0); } - - sprintf(str,"%s%s",node_dir,msgtmp); /* file for quoted msg */ - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - LFREE(buf); - fclose(stream); - return(0); } - - while(!feof(stream) && !ferror(stream)) { - if(!fgets(str,255,stream)) - break; - quotestr(str); - sprintf(tmp,qstr,str); - write(file,tmp,strlen(tmp)); - linesquoted++; } - fclose(stream); - close(file); } - - /* Quote nothing to MSGTMP or INPUT.MSG automatically */ - - else if(useron.xedit && xedit[useron.xedit-1]->misc"ENONE) - ; - - else if(yesno(text[QuoteMessageQ])) { - sprintf(str,"%sQUOTES.TXT",node_dir); - if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - LFREE(buf); - return(0); } - - sprintf(str,"%s%s",node_dir,msgtmp); /* file for quoted msg */ - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - LFREE(buf); - fclose(stream); - return(0); } - - l=ftell(stream); /* l now points to start of message */ - - while(online) { - sprintf(str,text[QuoteLinesPrompt],linesquoted ? "Done":"All"); - mnemonics(str); - i=getstr(quote,10,K_UPPER); - if(sys_status&SS_ABORT) { - fclose(stream); - close(file); - LFREE(buf); - return(0); } - if(!i && linesquoted) - break; - if(!i || quote[0]=='A') { /* Quote all */ - fseek(stream,l,SEEK_SET); - while(!feof(stream) && !ferror(stream)) { - if(!fgets(str,255,stream)) - break; - quotestr(str); - sprintf(tmp,qstr,str); - write(file,tmp,strlen(tmp)); - linesquoted++; } - break; } - if(quote[0]=='L') { - fseek(stream,l,SEEK_SET); - i=1; - CRLF; - attr(LIGHTGRAY); - while(!feof(stream) && !ferror(stream) && !msgabort()) { - if(!fgets(str,255,stream)) - break; - quotestr(str); - bprintf("%3d: %.74s\r\n",i,str); - i++; } - continue; } - - if(!isdigit(quote[0])) - break; - p=quote; - while(p) { - if(*p==',' || *p==SP) - p++; - i=atoi(p); - if(!i) - break; - fseek(stream,l,SEEK_SET); - j=1; - while(!feof(stream) && !ferror(stream) && j<i) { - if(!fgets(tmp,255,stream)) - break; - j++; } /* skip beginning */ - tp=strchr(p,'-'); /* tp for temp pointer */ - if(tp) { /* range */ - i=atoi(tp+1); - while(!feof(stream) && !ferror(stream) && j<=i) { - if(!fgets(str,255,stream)) - break; - quotestr(str); - sprintf(tmp,qstr,str); - write(file,tmp,strlen(tmp)); - linesquoted++; - j++; } } - else { /* one line */ - if(fgets(str,255,stream)) { - quotestr(str); - sprintf(tmp,qstr,str); - write(file,tmp,strlen(tmp)); - linesquoted++; } } - p=strchr(p,','); - // if(!p) p=strchr(p,SP); 02/05/96 huh? - } } - - fclose(stream); - close(file); } } -else { - sprintf(str,"%sQUOTES.TXT",node_dir); - remove(str); } - -if(!online || sys_status&SS_ABORT) { - LFREE(buf); - return(0); } - -if(!(mode&WM_EXTDESC)) { - if(mode&WM_FILE) { - c=12; - CRLF; - bputs(text[Filename]); } - else { - c=LEN_TITLE; - bputs(text[TitlePrompt]); } - if(!(mode&(WM_EMAIL|WM_NETMAIL)) && !(mode&WM_FILE) - && sub[subnum]->misc&(SUB_QNET /* |SUB_PNET */ )) - c=25; - if(mode&WM_QWKNET) - c=25; - if(!getstr(title,c,mode&WM_FILE ? K_LINE|K_UPPER : K_LINE|K_EDIT|K_AUTODEL) - && useron_level && useron.logons) { - LFREE(buf); - return(0); } - if(!(mode&(WM_EMAIL|WM_NETMAIL)) && sub[subnum]->misc&SUB_QNET - && !SYSOP - && (!stricmp(title,"DROP") || !stricmp(title,"ADD") - || !strnicmp(dest,"SBBS",4))) { - LFREE(buf); /* Users can't post DROP or ADD in QWK netted subs */ - return(0); } } /* or messages to "SBBS" */ - -if(!online || sys_status&SS_ABORT) { - LFREE(buf); - return(0); } - -/* Create WWIV compatible EDITOR.INF file */ - -if(useron.xedit) { - editor_inf(useron.xedit,dest,title,mode,subnum); - if(xedit[useron.xedit-1]->type) { - gettimeleft(); - xtrndat(useron.alias,node_dir,xedit[useron.xedit-1]->type,timeleft); } - } - -if(console&CON_RAW_IN) { - bprintf(text[EnterMsgNowRaw] - ,(ulong)level_linespermsg[useron_level]*MAX_LINE_LEN); - if(top[0] && !(mode&WM_NOTOP)) { - strcpy((char *)buf,top); - strcat((char *)buf,crlf); - l=strlen((char *)buf); } - else - l=0; - while(l<level_linespermsg[useron_level]*MAX_LINE_LEN) { - c=getkey(0); - if(sys_status&SS_ABORT) { /* Ctrl-C */ - LFREE(buf); - return(0); } - if((c==ESC || c==1) && useron.rest&FLAG('A')) /* ANSI restriction */ - continue; -#ifndef __OS2__ - if(lclaes() && c=='"') c=7; /* convert keyboard reassignmnet to beep */ -#endif - if(c==7 && useron.rest&FLAG('B')) /* Beep restriction */ - continue; - if(!(console&CON_RAW_IN)) /* Ctrl-Z was hit */ - break; - outchar(c); - buf[l++]=c; } - buf[l]=0; - if(l==level_linespermsg[useron_level]*MAX_LINE_LEN) - bputs(text[OutOfBytes]); } - - -else if((online==ON_LOCAL && node_misc&NM_LCL_EDIT && node_editor[0]) - || useron.xedit) { - - if(useron.xedit && xedit[useron.xedit-1]->misc&IO_INTS) { - ex_mode|=EX_OUTL; - if(online==ON_REMOTE) - ex_mode|=(EX_OUTR|EX_INR); - if(xedit[useron.xedit-1]->misc&WWIVCOLOR) - ex_mode|=EX_WWIV; } - - sprintf(str,"%s%s",node_dir,msgtmp); /* temporary file for input */ - if(!linesquoted && fexist(str)) - remove(str); - if(linesquoted) { - qlen=flength(str); - qtime=fdate(str); } - if(online==ON_LOCAL) { - if(node_misc&NM_LCL_EDIT && node_editor[0]) - external(cmdstr(node_editor,str,nulstr,NULL) - ,0); /* EX_CC removed and EX_OUTL removed */ - else - external(cmdstr(xedit[useron.xedit-1]->lcmd,str,nulstr,NULL) - ,ex_mode); } - - else { - rioctl(IOCM|PAUSE|ABORT); - external(cmdstr(xedit[useron.xedit-1]->rcmd,str,nulstr,NULL),ex_mode); - rioctl(IOSM|PAUSE|ABORT); } - checkline(); - if(!fexist(str) || !online - || (linesquoted && qlen==flength(str) && qtime==fdate(str))) { - LFREE(buf); - return(0); } - buf[0]=0; - if(!(mode&WM_NOTOP)) - strcpy((char *)buf,top); - if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - LFREE(buf); - return(0); } - length=filelength(file); - l=strlen((char *)buf); /* reserve space for top and terminating null */ - /* truncate if too big */ - if(length>(level_linespermsg[useron_level]*MAX_LINE_LEN)-(l+1)) { - length=(level_linespermsg[useron_level]*MAX_LINE_LEN)-(l+1); - bputs(text[OutOfBytes]); } - lread(file,buf+l,length); - close(file); - // remove(str); /* no need to save the temp input file */ - buf[l+length]=0; } -else { - buf[0]=0; - if(linesquoted) { - sprintf(str,"%s%s",node_dir,msgtmp); - if((file=nopen(str,O_RDONLY))!=-1) { - length=filelength(file); - l=length>level_linespermsg[useron_level]*MAX_LINE_LEN - ? level_linespermsg[useron_level]*MAX_LINE_LEN : length; - lread(file,buf,l); - buf[l]=0; - close(file); - // remove(str); - } } - if(!(msgeditor((char *)buf,mode&WM_NOTOP ? nulstr : top,title))) { - LFREE(buf); - return(0); } } - -now=time(NULL); -bputs(text[Saving]); -if((stream=fnopen(&file,fname,O_WRONLY|O_CREAT|O_TRUNC))==NULL) { - errormsg(WHERE,ERR_OPEN,fname,O_WRONLY|O_CREAT|O_TRUNC); - LFREE(buf); - return(0); } -for(l=i=0;buf[l] && i<level_linespermsg[useron_level];l++) { - if(buf[l]==141 && useron.xedit && xedit[useron.xedit-1]->misc&QUICKBBS) { - fwrite(crlf,2,1,stream); - i++; - continue; } - if(buf[l]==LF && (!l || buf[l-1]!=CR) && useron.xedit - && xedit[useron.xedit-1]->misc&EXPANDLF) { - fwrite(crlf,2,1,stream); - i++; - continue; } - if(!(mode&(WM_EMAIL|WM_NETMAIL)) - && (!l || buf[l-1]==LF) - && buf[l]=='-' && buf[l+1]=='-' && buf[l+2]=='-' - && (buf[l+3]==SP || buf[l+3]==TAB || buf[l+3]==CR)) - buf[l+1]='+'; - if(buf[l]==LF) - i++; - fputc(buf[l],stream); } - -if(buf[l]) - bputs(text[NoMoreLines]); -fclose(stream); -LFREE((char *)buf); -bprintf(text[SavedNBytes],l,i); -return(1); -} - - -/****************************************************************************/ -/* Removes from file 'str' every LF terminated line that starts with 'str2' */ -/* That is divisable by num. Function skips first 'skip' number of lines */ -/****************************************************************************/ -void removeline(char *str, char *str2, char num, char skip) -{ - char HUGE16 *buf; - char slen,c; - int i,file; - ulong l=0,m,flen; - FILE *stream; - -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -flen=filelength(file); -slen=strlen(str2); -if((buf=(char *)MALLOC(flen))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,flen); - return; } -if(lread(file,buf,flen)!=flen) { - close(file); - errormsg(WHERE,ERR_READ,str,flen); - FREE(buf); - return; } -close(file); -if((stream=fnopen(&file,str,O_WRONLY|O_TRUNC))==NULL) { - close(file); - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_TRUNC); - FREE(buf); - return; } -for(i=0;l<flen && i<skip;l++) { - fputc(buf[l],stream); - if(buf[l]==LF) - i++; } -while(l<flen) { - if(!strncmp((char *)buf+l,str2,slen)) { - for(i=0;i<num && l<flen;i++) { - while(l<flen && buf[l]!=LF) l++; - l++; } } - else { - for(i=0;i<num && l<flen;i++) { - while(l<flen && buf[l]!=LF) fputc(buf[l++],stream); - fputc(buf[l++],stream); } } } -fclose(stream); -FREE((char *)buf); -} - -/*****************************************************************************/ -/* The Synchronet editor. */ -/* Returns the number of lines edited. */ -/*****************************************************************************/ -ulong msgeditor(char *buf, char *top, char *title) -{ - int i,j,line,lines=0,maxlines; - char strin[256],**str,done=0; - ulong l,m; - -if(online==ON_REMOTE) { - rioctl(IOCM|ABORT); - rioctl(IOCS|ABORT); } - -maxlines=level_linespermsg[useron.level]; - -if((str=(char **)MALLOC(sizeof(char *)*(maxlines+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,"msgeditor",sizeof(char *)*(maxlines+1)); - return(0); } -m=strlen(buf); -l=0; -while(l<m && lines<maxlines) { - msgabort(); /* to allow pausing */ - if((str[lines]=MALLOC(MAX_LINE_LEN))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,MAX_LINE_LEN); - for(i=0;i<lines;i++) - FREE(str[lines]); - FREE(str); - if(online==ON_REMOTE) - rioctl(IOSM|ABORT); - return(0); } - for(i=0;i<79 && l<m;i++,l++) { - if(buf[l]==CR) { - l+=2; - break; } - if(buf[l]==TAB) { - if(!(i%8)) /* hard-coded tabstop of 8 */ - str[lines][i++]=SP; /* for expansion */ - while(i%8 && i<79) - str[lines][i++]=SP; - i--; - /*** - bprintf("\r\nMessage editor: Expanded tab on line #%d",lines+1); - ***/ } - else str[lines][i]=buf[l]; } - if(i==79) { - if(buf[l]==CR) - l+=2; - else - bprintf("\r\nMessage editor: Split line #%d",lines+1); } - str[lines][i]=0; - lines++; } -if(lines) - bprintf("\r\nMessage editor: Read in %d lines\r\n",lines); -bprintf(text[EnterMsgNow],maxlines); -for(i=0;i<79;i++) - if(i%TABSIZE || !i) - outchar('-'); - else outchar('+'); -CRLF; -putmsg(top,P_SAVEATR|P_NOATCODES); -for(line=0;line<lines && !msgabort();line++) { /* display lines in buf */ - putmsg(str[line],P_SAVEATR|P_NOATCODES); - if(useron.misc&ANSI) - bputs("\x1b[K"); /* delete to end of line */ - CRLF; } -SYNC; -if(online==ON_REMOTE) - rioctl(IOSM|ABORT); -while(online && !done) { - checkline(); - if(line==lines) { - if((str[line]=MALLOC(MAX_LINE_LEN))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,MAX_LINE_LEN); - for(i=0;i<lines;i++) - FREE(str[i]); - FREE(str); - return(0); } - str[line][0]=0; } - if(line>(maxlines-10)) { - if(line==maxlines) - bputs(text[NoMoreLines]); - else - bprintf(text[OnlyNLinesLeft],maxlines-line); } - strcpy(strin,str[line]); - do { - if(!line) - outchar(CR); - getstr(strin,79,K_WRAP|K_MSG|K_EDIT); - } while(console&CON_UPARROW && !line); - - if(sys_status&SS_ABORT) { - if(line==lines) - FREE(str[line]); - continue; } - if(strin[0]=='/' && strlen(strin)<8) { - if(!stricmp(strin,"/DEBUG") && SYSOP) { - if(line==lines) - FREE(str[line]); - bprintf("\r\nline=%d lines=%d rows=%d\r\n",line,lines,rows); - continue; } - else if(!stricmp(strin,"/ABT")) { - if(line==lines) /* delete a line */ - FREE(str[line]); - for(i=0;i<lines;i++) - FREE(str[i]); - FREE(str); - return(0); } - else if(toupper(strin[1])=='D') { - if(line==lines) /* delete a line */ - FREE(str[line]); - if(!lines) - continue; - i=atoi(strin+2)-1; - if(i==-1) /* /D means delete last line */ - i=lines-1; - if(i>=lines || i<0) - bputs(text[InvalidLineNumber]); - else { - FREE(str[i]); - lines--; - while(i<lines) { - str[i]=str[i+1]; - i++; } - if(line>lines) - line=lines; } - continue; } - else if(toupper(strin[1])=='I') { - if(line==lines) /* insert a line before number x */ - FREE(str[line]); - if(line==maxlines || !lines) - continue; - i=atoi(strin+2)-1; - if(i==-1) - i=lines-1; - if(i>=lines || i<0) - bputs(text[InvalidLineNumber]); - else { - for(line=lines;line>i;line--) /* move the pointers */ - str[line]=str[line-1]; - if((str[i]=MALLOC(MAX_LINE_LEN))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,MAX_LINE_LEN); - for(i=0;i<lines;i++) - FREE(str[i]); - FREE(str); - return(0); } - str[i][0]=0; - line=++lines; } - continue; } - else if(toupper(strin[1])=='E') { - if(line==lines) /* edit a line */ - FREE(str[line]); - if(!lines) - continue; - i=atoi(strin+2)-1; - j=K_MSG|K_EDIT; /* use j for the getstr mode */ - if(i==-1) { /* /E means edit last line */ - i=lines-1; - j|=K_WRAP; } /* wrap when editing last line */ - if(i>=lines || i<0) - bputs(text[InvalidLineNumber]); - else - getstr(str[i],79,j); - continue; } - else if(!stricmp(strin,"/CLR")) { - bputs(text[MsgCleared]); - if(line!=lines) - lines--; - for(i=0;i<=lines;i++) - FREE(str[i]); - line=0; - lines=0; - putmsg(top,P_SAVEATR|P_NOATCODES); - continue; } - else if(toupper(strin[1])=='L') { /* list message */ - if(line==lines) - FREE(str[line]); - if(lines) - i=!noyes(text[WithLineNumbers]); - CRLF; - attr(LIGHTGRAY); - putmsg(top,P_SAVEATR|P_NOATCODES); - if(!lines) { - continue; } - j=atoi(strin+2); - if(j) j--; /* start from line j */ - while(j<lines && !msgabort()) { - if(i) { /* line numbers */ - sprintf(tmp,"%3d: %-.74s",j+1,str[j]); - putmsg(tmp,P_SAVEATR|P_NOATCODES); } - else - putmsg(str[j],P_SAVEATR|P_NOATCODES); - if(useron.misc&ANSI) - bputs("\x1b[K"); /* delete to end of line */ - CRLF; - j++; } - SYNC; - continue; } - else if(!stricmp(strin,"/S")) { /* Save */ - if(line==lines) - FREE(str[line]); - done=1; - continue;} - else if(!stricmp(strin,"/T")) { /* Edit title */ - if(line==lines) - FREE(str[line]); - if(title[0]) { - bputs(text[TitlePrompt]); - getstr(title,LEN_TITLE,K_LINE|K_EDIT|K_AUTODEL); - SYNC; - CRLF; } - continue; } - else if(!stricmp(strin,"/?")) { - if(line==lines) - FREE(str[line]); - menu("EDITOR"); /* User Editor Commands */ - SYNC; - continue; } - else if(!stricmp(strin,"/ATTR")) { - if(line==lines) - FREE(str[line]); - menu("ATTR"); /* User ANSI Commands */ - SYNC; - continue; } } - strcpy(str[line],strin); - if(line<maxlines) - line++; - else - FREE(str[line]); - if(line>lines) - lines++; - if(console&CON_UPARROW) { - outchar(CR); - bprintf("\x1b[A\x1b[K"); /* up one line, clear to eol */ - line-=2; } - } -if(!online) { - for(i=0;i<lines;i++) - FREE(str[i]); - FREE(str); - return(0); } -strcpy(buf,top); -for(i=0;i<lines;i++) { - strcat(buf,str[i]); - strcat(buf,crlf); - FREE(str[i]); } -FREE(str); -return(lines); -} - - -/****************************************************************************/ -/* Edits an existing file or creates a new one in MSG format */ -/****************************************************************************/ -void editfile(char *str) -{ - char *buf,str2[128],mode=0; /* EX_CC */ - int file; - long length,maxlines,lines,l; - -maxlines=level_linespermsg[useron.level]; -sprintf(str2,"%sQUOTES.TXT",node_dir); -remove(str2); -if(node_editor[0] && online==ON_LOCAL) { - external(cmdstr(node_editor,str,nulstr,NULL),0); /* EX_CC */ - return; } -if(useron.xedit) { - editor_inf(useron.xedit,nulstr,nulstr,0,INVALID_SUB); - if(xedit[useron.xedit-1]->misc&IO_INTS) { - mode|=EX_OUTL; - if(online==ON_REMOTE) - mode|=(EX_OUTR|EX_INR); - if(xedit[useron.xedit-1]->misc&WWIVCOLOR) - mode|=EX_WWIV; } - if(online==ON_LOCAL) - external(cmdstr(xedit[useron.xedit-1]->lcmd,str,nulstr,NULL),mode); - else { - rioctl(IOCM|PAUSE|ABORT); - external(cmdstr(xedit[useron.xedit-1]->rcmd,str,nulstr,NULL),mode); - rioctl(IOSM|PAUSE|ABORT); } - return; } -if((buf=(char *)MALLOC(maxlines*MAX_LINE_LEN))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,maxlines*MAX_LINE_LEN); - return; } -if((file=nopen(str,O_RDONLY))!=-1) { - length=filelength(file); - if(length>(ulong)maxlines*MAX_LINE_LEN) { - attr(color[clr_err]); - bprintf("\7\r\nFile size (%lu bytes) is larger than (%lu).\r\n" - ,length,(ulong)maxlines*MAX_LINE_LEN); - close(file); - FREE(buf); } - if(read(file,buf,length)!=length) { - close(file); - FREE(buf); - errormsg(WHERE,ERR_READ,str,length); - return; } - buf[length]=0; - close(file); } -else { - buf[0]=0; - bputs(text[NewFile]); } -if(!msgeditor(buf,nulstr,nulstr)) { - FREE(buf); - return; } -bputs(text[Saving]); -if((file=nopen(str,O_CREAT|O_WRONLY|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY|O_TRUNC); - FREE(buf); - return; } -if(write(file,buf,strlen(buf))!=strlen(buf)) { - close(file); - errormsg(WHERE,ERR_WRITE,str,strlen(buf)); - FREE(buf); - return; } -for(l=lines=0;buf[l];l++) - if(buf[l]==LF) - lines++; -bprintf(text[SavedNBytes],l,lines); -close(file); -FREE(buf); -return; -} - -/*************************/ -/* Copy file attachments */ -/*************************/ -void copyfattach(uint to, uint from, char *title) -{ - char str[128],str2[128],str3[128],*tp,*sp,*p; - uint i; - -strcpy(str,title); -tp=str; -while(1) { - p=strchr(tp,SP); - if(p) *p=0; - sp=strrchr(tp,'/'); /* sp is slash pointer */ - if(!sp) sp=strrchr(tp,'\\'); - if(sp) tp=sp+1; - sprintf(str2,"%sFILE\\%04u.IN\\%s" /* str2 is path/fname */ - ,data_dir,to,tp); - sprintf(str3,"%sFILE\\%04u.IN\\%s" /* str2 is path/fname */ - ,data_dir,from,tp); - if(strcmp(str2,str3)) - mv(str3,str2,1); - if(!p) - break; - tp=p+1; } -} - - -/****************************************************************************/ -/* Forwards mail (fname) to usernumber */ -/* Called from function readmail */ -/****************************************************************************/ -void forwardmail(smbmsg_t *msg, ushort usernumber) -{ - char str[256],touser[128]; - int i; - node_t node; - msghdr_t hdr=msg->hdr; - idxrec_t idx=msg->idx; - -if(useron.etoday>=level_emailperday[useron.level] && !SYSOP) { - bputs(text[TooManyEmailsToday]); - return; } -if(useron.rest&FLAG('F')) { - bputs(text[R_Forward]); - return; } -if(usernumber==1 && useron.rest&FLAG('S')) { - bprintf(text[R_Feedback],sys_op); - return; } -if(usernumber!=1 && useron.rest&FLAG('E')) { - bputs(text[R_Email]); - return; } - -msg->idx.attr&=~(MSG_READ|MSG_DELETE); -msg->hdr.attr=msg->idx.attr; - - -smb_hfield(msg,SENDER,strlen(useron.alias),useron.alias); -sprintf(str,"%u",useron.number); -smb_hfield(msg,SENDEREXT,strlen(str),str); - -username(usernumber,touser); -smb_hfield(msg,RECIPIENT,strlen(touser),touser); -sprintf(str,"%u",usernumber); -smb_hfield(msg,RECIPIENTEXT,sizeof(str),str); -msg->idx.to=usernumber; - -now=time(NULL); -smb_hfield(msg,FORWARDED,sizeof(time_t),&now); - - -if((i=smb_open_da(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } -if((i=smb_incdat(&smb,msg->hdr.offset,smb_getmsgdatlen(msg),1))!=0) { - errormsg(WHERE,ERR_WRITE,smb.file,i); - return; } -smb_close_da(&smb); - - -if((i=smb_addmsghdr(&smb,msg,SMB_SELFPACK))!=0) { - errormsg(WHERE,ERR_WRITE,smb.file,i); - return; } - -if(msg->hdr.auxattr&MSG_FILEATTACH) - copyfattach(usernumber,useron.number,msg->subj); - -bprintf(text[Forwarded],username(usernumber,str),usernumber); -sprintf(str,"Forwarded mail to %s #%d",username(usernumber,tmp) - ,usernumber); -logline("E",str); -msg->idx=idx; -msg->hdr=hdr; - - -if(usernumber==1) { - useron.fbacks++; - logon_fbacks++; - putuserrec(useron.number,U_FBACKS,5,itoa(useron.fbacks,tmp,10)); } -else { - useron.emails++; - logon_emails++; - putuserrec(useron.number,U_EMAILS,5,itoa(useron.emails,tmp,10)); } -useron.etoday++; -putuserrec(useron.number,U_ETODAY,5,itoa(useron.etoday,tmp,10)); - -for(i=1;i<=sys_nodes;i++) { /* Tell user, if online */ - getnodedat(i,&node,0); - if(node.useron==usernumber && !(node.misc&NODE_POFF) - && (node.status==NODE_INUSE || node.status==NODE_QUIET)) { - sprintf(str,text[EmailNodeMsg],node_num,useron.alias); - putnmsg(i,str); - break; } } -if(i>sys_nodes) { /* User wasn't online, so leave short msg */ - sprintf(str,text[UserSentYouMail],useron.alias); - putsmsg(usernumber,str); } -} - -/****************************************************************************/ -/* Auto-Message Routine ('A' from the main menu) */ -/****************************************************************************/ -void automsg() -{ - char str[256],buf[300],anon=0; - int file; - struct ffblk ff; - -while(online) { - SYNC; - mnemonics(text[AutoMsg]); - switch(getkeys("RWQ",0)) { - case 'R': - sprintf(str,"%sMSGS\\AUTO.MSG",data_dir); - printfile(str,P_NOABORT|P_NOATCODES); - break; - case 'W': - if(useron.rest&FLAG('W')) { - bputs(text[R_AutoMsg]); - break; } - action=NODE_AMSG; - SYNC; - bputs("\r\n3 lines:\r\n"); - if(!getstr(str,68,K_WRAP|K_MSG)) - break; - strcpy(buf,str); - strcat(buf,"\r\n "); - getstr(str,68,K_WRAP|K_MSG); - strcat(buf,str); - strcat(buf,"\r\n "); - getstr(str,68,K_MSG); - strcat(str,crlf); - strcat(buf,str); - if(yesno(text[OK])) { - if(useron.exempt&FLAG('A')) { - if(!noyes(text[AnonymousQ])) - anon=1; } - sprintf(str,"%sMSGS\\AUTO.MSG",data_dir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - if(anon) - sprintf(tmp,"%.80s",text[Anonymous]); - else - sprintf(tmp,"%s #%d",useron.alias,useron.number); - sprintf(str,text[AutoMsgBy],tmp); - strcat(str," "); - write(file,str,strlen(str)); - write(file,buf,strlen(buf)); - close(file); } - break; - case 'Q': - return; } } -} - -/****************************************************************************/ -/* Edits messages */ -/****************************************************************************/ -void editmsg(smbmsg_t *msg, uint subnum) -{ - char str[256],buf[SDT_BLOCK_LEN]; - ushort xlat; - int file,i,j,x; - ulong length,offset; - FILE *instream; - -if(!msg->hdr.total_dfields) - return; -sprintf(str,"%sINPUT.MSG",node_dir); -remove(str); -msgtotxt(*msg,str,0,1); -editfile(str); -length=flength(str)+2; /* +2 for translation string */ -if(length<1L) - return; - -if((i=smb_locksmbhdr(&smb))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); - return; } - -if((i=smb_getstatus(&smb))!=0) { - errormsg(WHERE,ERR_READ,smb.file,i); - return; } - -if(!(smb.status.attr&SMB_HYPERALLOC)) { - if((i=smb_open_da(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } - for(x=0;x<msg->hdr.total_dfields;x++) - if((i=smb_freemsgdat(&smb,msg->hdr.offset+msg->dfield[x].offset - ,msg->dfield[x].length,1))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); } - -msg->dfield[0].type=TEXT_BODY; /* Make one single data field */ -msg->dfield[0].length=length; -msg->dfield[0].offset=0; -for(x=1;x<msg->hdr.total_dfields;x++) { /* Clear the other data fields */ - msg->dfield[x].type=UNUSED; /* so we leave the header length */ - msg->dfield[x].length=0; /* unchanged */ - msg->dfield[x].offset=0; } - - -if(smb.status.attr&SMB_HYPERALLOC) { - offset=smb_hallocdat(&smb); } -else { - if((subnum!=INVALID_SUB && sub[subnum]->misc&SUB_FAST) - || (subnum==INVALID_SUB && sys_misc&SM_FASTMAIL)) - offset=smb_fallocdat(&smb,length,1); - else - offset=smb_allocdat(&smb,length,1); - smb_close_da(&smb); } - -msg->hdr.offset=offset; -if((file=open(str,O_RDONLY|O_BINARY))==-1 - || (instream=fdopen(file,"rb"))==NULL) { - smb_unlocksmbhdr(&smb); - smb_freemsgdat(&smb,offset,length,1); - errormsg(WHERE,ERR_OPEN,str,O_RDONLY|O_BINARY); - return; } - -setvbuf(instream,NULL,_IOFBF,2*1024); -fseek(smb.sdt_fp,offset,SEEK_SET); -xlat=XLAT_NONE; -fwrite(&xlat,2,1,smb.sdt_fp); -x=SDT_BLOCK_LEN-2; /* Don't read/write more than 255 */ -while(!feof(instream)) { - memset(buf,0,x); - j=fread(buf,1,x,instream); - if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) - buf[j-1]=buf[j-2]=0; /* Convert to NULL */ - fwrite(buf,j,1,smb.sdt_fp); - x=SDT_BLOCK_LEN; } -fflush(smb.sdt_fp); -fclose(instream); - -smb_unlocksmbhdr(&smb); -msg->hdr.length=smb_getmsghdrlen(msg); -if((i=smb_putmsghdr(&smb,msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); -} - -/****************************************************************************/ -/* Moves a message from one message base to another */ -/****************************************************************************/ -char movemsg(smbmsg_t msg, uint subnum) -{ - char str[256],*buf; - int i,j,x,file,newgrp,newsub,storage; - long l; - ulong offset,length; - -for(i=0;i<usrgrps;i++) /* Select New Group */ - uselect(1,i,"Message Group",grp[usrgrp[i]]->lname,0); -if((newgrp=uselect(0,0,0,0,0))<0) - return(0); - -for(i=0;i<usrsubs[newgrp];i++) /* Select New Sub-Board */ - uselect(1,i,"Sub-Board",sub[usrsub[newgrp][i]]->lname,0); -if((newsub=uselect(0,0,0,0,0))<0) - return(0); -newsub=usrsub[newgrp][newsub]; - -length=smb_getmsgdatlen(&msg); -if((buf=(char *)MALLOC(length))==NULL) { - errormsg(WHERE,ERR_ALLOC,smb.file,length); - return(0); } - -fseek(smb.sdt_fp,msg.hdr.offset,SEEK_SET); -fread(buf,length,1,smb.sdt_fp); - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - FREE(buf); - errormsg(WHERE,ERR_OPEN,sub[newsub]->code,i); - return(0); } - -sprintf(smb.file,"%s%s",sub[newsub]->data_dir,sub[newsub]->code); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - FREE(buf); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } - -if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ - smb.status.max_crcs=sub[newsub]->maxcrcs; - smb.status.max_msgs=sub[newsub]->maxmsgs; - smb.status.max_age=sub[newsub]->maxage; - smb.status.attr=sub[newsub]->misc&SUB_HYPER ? SMB_HYPERALLOC :0; - if((i=smb_create(&smb))!=0) { - FREE(buf); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_CREATE,smb.file,i); - return(0); } } - -if((i=smb_locksmbhdr(&smb))!=0) { - FREE(buf); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return(0); } - -if((i=smb_getstatus(&smb))!=0) { - FREE(buf); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_READ,smb.file,i); - return(0); } - -if(smb.status.attr&SMB_HYPERALLOC) { - offset=smb_hallocdat(&smb); - storage=SMB_HYPERALLOC; } -else { - if((i=smb_open_da(&smb))!=0) { - FREE(buf); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } - if(sub[newsub]->misc&SUB_FAST) { - offset=smb_fallocdat(&smb,length,1); - storage=SMB_FASTALLOC; } - else { - offset=smb_allocdat(&smb,length,1); - storage=SMB_SELFPACK; } - smb_close_da(&smb); } - -msg.hdr.offset=offset; - -memcpy(msg.hdr.id,"SHD\x1a",4); -msg.hdr.version=smb_ver(); - -smb_unlocksmbhdr(&smb); - -fseek(smb.sdt_fp,offset,SEEK_SET); -fwrite(buf,length,1,smb.sdt_fp); -fflush(smb.sdt_fp); -FREE(buf); - -i=smb_addmsghdr(&smb,&msg,storage); -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); - -if(i) { - smb_freemsgdat(&smb,offset,length,1); - errormsg(WHERE,ERR_WRITE,smb.file,i); - return(0); } - -bprintf("\r\nMoved to %s %s\r\n\r\n" - ,grp[usrgrp[newgrp]]->sname,sub[newsub]->lname); -sprintf(str,"Moved message from %s %s to %s %s" - ,grp[newgrp]->sname,sub[newsub]->sname - ,grp[sub[subnum]->grp]->sname,sub[subnum]->sname); -logline("M+",str); -if(sub[newsub]->misc&SUB_FIDO && sub[newsub]->echomail_sem[0]) - if((file=nopen(sub[newsub]->echomail_sem - ,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(file); -return(1); -} - -ushort chmsgattr(ushort attr) -{ - int ch; - -while(online && !(sys_status&SS_ABORT)) { - CRLF; - show_msgattr(attr); - menu("MSGATTR"); - ch=getkey(K_UPPER); - if(ch) - bprintf("%c\r\n",ch); - switch(ch) { - case 'P': - attr^=MSG_PRIVATE; - break; - case 'R': - attr^=MSG_READ; - break; - case 'K': - attr^=MSG_KILLREAD; - break; - case 'A': - attr^=MSG_ANONYMOUS; - break; - case 'N': /* Non-purgeable */ - attr^=MSG_PERMANENT; - break; - case 'M': - attr^=MSG_MODERATED; - break; - case 'V': - attr^=MSG_VALIDATED; - break; - case 'D': - attr^=MSG_DELETE; - break; - case 'L': - attr^=MSG_LOCKED; - break; - default: - return(attr); } } -return(attr); -} diff --git a/src/sbbs2/msg2ans/msg2ans.c b/src/sbbs2/msg2ans/msg2ans.c deleted file mode 100644 index 586744d1dd..0000000000 --- a/src/sbbs2/msg2ans/msg2ans.c +++ /dev/null @@ -1,147 +0,0 @@ -/* msg2ans.c */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Converts Synchronet Ctrl-A codes into ANSI escape sequences */ - -#include <stdio.h> -#include <conio.h> - -#define ANSI fprintf(out,"\x1b[") - -int main(int argc, char **argv) -{ - int i,ch; - FILE *in,*out; - -if(argc<3) { - printf("\nMSG2ANS v1.03\n"); - printf("\nusage: msg2ans infile.msg outfile.ans\n"); - exit(0); } - -if((in=fopen(argv[1],"rb"))==NULL) { - printf("\nerror opening %s\n",argv[1]); - exit(1); } - -if((out=fopen(argv[2],"wb"))==NULL) { - printf("\nerror opening %s\n",argv[2]); - exit(1); } - -while((ch=fgetc(in))!=EOF) { - if(ch==1) { /* ctrl-a */ - ch=fgetc(in); - if(ch==EOF) - break; - if(ch>=0x7f) { /* move cursor right x columns */ - ANSI; - fprintf(out,"%uC",ch-0x7f); - continue; } - switch(toupper(ch)) { - case 'A': - fputc('\1',out); - break; - case '<': - fputc('\b',out); - break; - case '>': - ANSI; - fputc('K',out); - break; - case '[': - fputc('\r',out); - break; - case ']': - fputc('\n',out); - break; - case 'L': - ANSI; - fprintf(out,"2J"); - break; - case '-': - case '_': - case 'N': - ANSI; - fprintf(out,"0m"); - break; - case 'H': - ANSI; - fprintf(out,"1m"); - break; - case 'I': - ANSI; - fprintf(out,"5m"); - break; - case 'K': - ANSI; - fprintf(out,"30m"); - break; - case 'R': - ANSI; - fprintf(out,"31m"); - break; - case 'G': - ANSI; - fprintf(out,"32m"); - break; - case 'Y': - ANSI; - fprintf(out,"33m"); - break; - case 'B': - ANSI; - fprintf(out,"34m"); - break; - case 'M': - ANSI; - fprintf(out,"35m"); - break; - case 'C': - ANSI; - fprintf(out,"36m"); - break; - case 'W': - ANSI; - fprintf(out,"37m"); - break; - case '0': - ANSI; - fprintf(out,"40m"); - break; - case '1': - ANSI; - fprintf(out,"41m"); - break; - case '2': - ANSI; - fprintf(out,"42m"); - break; - case '3': - ANSI; - fprintf(out,"43m"); - break; - case '4': - ANSI; - fprintf(out,"44m"); - break; - case '5': - ANSI; - fprintf(out,"45m"); - break; - case '6': - ANSI; - fprintf(out,"46m"); - break; - case '7': - ANSI; - fprintf(out,"47m"); - break; - default: - fprintf(out,"\1%c",ch); - break; } } - else - fputc(ch,out); } -} - - - - diff --git a/src/sbbs2/msgtoqwk.c b/src/sbbs2/msgtoqwk.c deleted file mode 100644 index 68ad8a92cb..0000000000 --- a/src/sbbs2/msgtoqwk.c +++ /dev/null @@ -1,298 +0,0 @@ -#line 1 "MSGTOQWK.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "qwk.h" -#include "etext.h" - -#define MAX_MSGNUM 0x7FFFFFUL // only 7 (decimal) digits allowed for msg num - -/****************************************************************************/ -/* Converts message 'msg' to QWK format, writing to file 'qwk_fp'. */ -/* mode determines how to handle Ctrl-A codes */ -/****************************************************************************/ -ulong msgtoqwk(smbmsg_t msg, FILE *qwk_fp, int mode, int subnum - , int conf) -{ - uchar str[512],from[512],to[512],ch,tear=0,tearwatch=0,HUGE16 *buf,*p; - ushort xlat; - long l,size=0,offset; - int i; - -offset=ftell(qwk_fp); -memset(str,SP,128); -fwrite(str,128,1,qwk_fp); /* Init header to space */ - -if(msg.from_net.addr && (uint)subnum==INVALID_SUB) { - if(mode&TO_QNET) - sprintf(from,"%.128s",msg.from); - else if(msg.from_net.type==NET_FIDO) - sprintf(from,"%.128s@%.128s" - ,msg.from,faddrtoa(*(faddr_t *)msg.from_net.addr)); - else if(msg.from_net.type==NET_INTERNET) - sprintf(from,"%.128s",msg.from_net.addr); - else - sprintf(from,"%.128s@%.128s",msg.from,msg.from_net.addr); - if(strlen(from)>25) { - sprintf(str,"From: %.128s\xe3\xe3",from); - fwrite(str,strlen(str),1,qwk_fp); - size+=strlen(str); - sprintf(from,"%.128s",msg.from); } } -else { - sprintf(from,"%.128s",msg.from); - if(msg.hdr.attr&MSG_ANONYMOUS && !SYSOP) /* from user */ - strcpy(from,text[Anonymous]); } - -if(msg.to_net.addr && (uint)subnum==INVALID_SUB) { - if(msg.to_net.type==NET_FIDO) - sprintf(to,"%.128s@%s",msg.to,faddrtoa(*(faddr_t *)msg.to_net.addr)); - else if(msg.to_net.type==NET_INTERNET) - sprintf(to,"%.128s",msg.to_net.addr); - else if(msg.to_net.type==NET_QWK) { - if(mode&TO_QNET) { - p=strchr(msg.to_net.addr,'/'); - if(p) { /* Another hop */ - p++; - strcpy(to,"NETMAIL"); - sprintf(str,"%.128s@%.128s\xe3",msg.to,p); - fwrite(str,strlen(str),1,qwk_fp); - size+=strlen(str); } - else - sprintf(to,"%.128s",msg.to); } - else - sprintf(to,"%.128s@%.128s",msg.to,msg.to_net.addr); } - else - sprintf(to,"%.128s@%.128s",msg.to,msg.to_net.addr); - if(strlen(to)>25) { - sprintf(str,"To: %.128s\xe3\xe3",to); - fwrite(str,strlen(str),1,qwk_fp); - size+=strlen(str); - if(msg.to_net.type==NET_QWK) - strcpy(to,"NETMAIL"); - else - sprintf(to,"%.128s",msg.to); } } -else - sprintf(to,"%.128s",msg.to); - -if(msg.from_net.type==NET_QWK && mode&VIA && !msg.forwarded) { - sprintf(str,"@VIA:%.128s\xe3",msg.from_net.addr); - fwrite(str,strlen(str),1,qwk_fp); - size+=strlen(str); } - -if(msg.hdr.when_written.zone && mode&TZ) { - sprintf(str,"@TZ:%04x\xe3",msg.hdr.when_written.zone); - fwrite(str,strlen(str),1,qwk_fp); - size+=strlen(str); } - -p=0; -for(i=0;i<msg.total_hfields;i++) { - if(msg.hfield[i].type==SENDER) - p=msg.hfield_dat[i]; - if(msg.hfield[i].type==FORWARDED && p) { - sprintf(str,"Forwarded from %s on %s\xe3",p - ,timestr((time_t *)msg.hfield_dat[i])); - fwrite(str,strlen(str),1,qwk_fp); - size+=strlen(str); } } - -buf=smb_getmsgtxt(&smb,&msg,1); -if(!buf) - return(0); - -for(l=0;buf[l];l++) { - ch=buf[l]; - - if(ch==LF) { - if(tear) - tear++; /* Count LFs after tearline */ - if(tear>3) /* more than two LFs after the tear */ - tear=0; - if(tearwatch==4) { /* watch for LF---LF */ - tear=1; - tearwatch=0; } - else if(!tearwatch) - tearwatch=1; - else - tearwatch=0; - ch=0xe3; - fputc(ch,qwk_fp); /* Replace LF with funky char */ - size++; - continue; } - - if(ch==CR) { /* Ignore CRs */ - if(tearwatch<4) /* LF---CRLF is okay */ - tearwatch=0; /* LF-CR- is not okay */ - continue; } - - if(ch==SP && tearwatch==4) { /* watch for "LF--- " */ - tear=1; - tearwatch=0; } - - if(ch=='-') { /* watch for "LF---" */ - if(l==0 || (tearwatch && tearwatch<4)) - tearwatch++; - else - tearwatch=0; } - else - tearwatch=0; - - if((uint)subnum!=INVALID_SUB && sub[subnum]->misc&SUB_ASCII) { - if(ch<SP && ch!=1) - ch='.'; - else if(ch>0x7f) - ch='*'; } - - if(ch==0xE3) /* funky char */ - ch='*'; - - if(ch==1) { /* ctrl-a */ - ch=buf[++l]; - if(!ch) - break; - if(mode&A_EXPAND) { - str[0]=0; - switch(toupper(ch)) { /* non-color codes */ - case 'L': - strcpy(str,"\x1b[2J"); - break; - case 'W': - strcpy(str,ansi(LIGHTGRAY)); - break; - case 'K': - strcpy(str,ansi(BLACK)); - break; - case 'H': - strcpy(str,ansi(HIGH)); - break; - case 'I': - strcpy(str,ansi(BLINK)); - break; - case 'N': /* Normal */ - strcpy(str,"\x1b[0m"); - break; - case '0': - strcpy(str,"\x1b[40m"); - break; - case '7': - strcpy(str,ansi(LIGHTGRAY<<4)); - break; - case 'R': /* Color codes */ - strcpy(str,ansi(RED)); - break; - case 'G': - strcpy(str,ansi(GREEN)); - break; - case 'B': - strcpy(str,ansi(BLUE)); - break; - case 'C': - strcpy(str,ansi(CYAN)); - break; - case 'M': - strcpy(str,ansi(MAGENTA)); - break; - case 'Y': /* Yellow */ - strcpy(str,ansi(BROWN)); - break; - case '1': - strcpy(str,ansi(RED<<4)); - break; - case '2': - strcpy(str,ansi(GREEN<<4)); - break; - case '3': - strcpy(str,ansi(BROWN<<4)); - break; - case '4': - strcpy(str,ansi(BLUE<<4)); - break; - case '5': - strcpy(str,ansi(MAGENTA<<4)); - break; - case '6': - strcpy(str,ansi(CYAN<<4)); - break; } - if(str[0]) { - fwrite(str,strlen(str),1,qwk_fp); - size+=strlen(str); } - continue; } /* End Expand */ - - if(mode&A_LEAVE) { - fputc(1,qwk_fp); - fputc(ch,qwk_fp); - size+=2L; } - else /* Strip */ - if(toupper(ch)=='L') { - fputc(FF,qwk_fp); - size++; } - continue; } /* End of Ctrl-A shit */ - fputc(ch,qwk_fp); - size++; } - -LFREE(buf); -if(ch!=0xE3) { - fputc(0xE3,qwk_fp); /* make sure it ends in CRLF */ - size++; } - -if(mode&TAGLINE && !(sub[subnum]->misc&SUB_NOTAG)) { - if(!tear) /* no tear line */ - strcpy(str,"\1n---\xe3"); /* so add one */ - else - strcpy(str,"\1n"); - if(sub[subnum]->misc&SUB_ASCII) ch='*'; - else ch='�'; - sprintf(tmp," %c \1g%s\1n %c %.127s\xe3" - ,ch,decrypt(Synchronet,0),ch,sub[subnum]->tagline); - strcat(str,tmp); - if(!(mode&A_LEAVE)) - remove_ctrl_a(str); - fwrite(str,strlen(str),1,qwk_fp); - size+=strlen(str); } - -while(size%128L) { /* Pad with spaces */ - size++; - fputc(SP,qwk_fp); } - -unixtodos(msg.hdr.when_written.time,&date,&curtime); - -sprintf(tmp,"%02u-%02u-%02u%02u:%02u" - ,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900) - ,curtime.ti_hour,curtime.ti_min); - -if(msg.hdr.attr&MSG_PRIVATE) { - if(msg.hdr.attr&MSG_READ) - ch='*'; /* private, read */ - else - ch='+'; /* private, unread */ } -else { - if(msg.hdr.attr&MSG_READ) - ch='-'; /* public, read */ - else - ch=' '; /* public, unread */ } - - -sprintf(str,"%c%-7lu%-13.13s%-25.25s" - "%-25.25s%-25.25s%12s%-8lu%-6lu\xe1%c%c%c%c%c" - ,ch /* message status flag */ - ,mode&REP ? (ulong)conf /* conference or */ - : msg.hdr.number&MAX_MSGNUM /* message number */ - ,tmp /* date and time */ - ,to /* To: */ - ,from /* From: */ - ,msg.subj /* Subject */ - ,nulstr /* Password */ - ,msg.hdr.thread_orig&MAX_MSGNUM /* Message Re: Number */ - ,(size/128L)+1 /* Number of 128byte blocks */ - ,(char)conf&0xff /* Conference number lo byte */ - ,(ushort)conf>>8 /* hi byte */ - ,SP /* not used */ - ,SP /* not used */ - ,useron.rest&FLAG('Q') ? '*' : SP /* Net tag line */ - ); - -fseek(qwk_fp,offset,SEEK_SET); -fwrite(str,128,1,qwk_fp); -fseek(qwk_fp,size,SEEK_CUR); - -return(size); -} diff --git a/src/sbbs2/netmail.c b/src/sbbs2/netmail.c deleted file mode 100644 index d5d4670f38..0000000000 --- a/src/sbbs2/netmail.c +++ /dev/null @@ -1,389 +0,0 @@ -#line 1 "NETMAIL.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "qwk.h" - -/****************************************************************************/ -/****************************************************************************/ -void inetmail(char *into, char *subj, char mode) -{ - char str[256],str2[256],msgpath[256],title[256],name[256],ch - ,buf[SDT_BLOCK_LEN],*p,addr[256]; - ushort xlat=XLAT_NONE,net=NET_INTERNET; - int i,j,x,file; - long l; - ulong length,offset; - FILE *instream; - node_t node; - smbmsg_t msg; - -strcpy(name,into); -strcpy(addr,into); -strcpy(title,subj); - -if((!SYSOP && !(inetmail_misc&NMAIL_ALLOW)) || useron.rest&FLAG('M')) { - bputs(text[NoNetMailAllowed]); - return; } - -if(inetmail_cost && !(useron.exempt&FLAG('S'))) { - if(useron.cdt+useron.freecdt<inetmail_cost) { - bputs(text[NotEnoughCredits]); - return; } - sprintf(str,text[NetMailCostContinueQ],inetmail_cost); - if(noyes(str)) - return; } - -p=strrchr(name,'@'); -if(!p) - p=strrchr(name,'!'); -if(p) { - *p=0; - truncsp(name); } -bprintf(text[NetMailing],name,addr - ,inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name - ,sys_inetaddr); -action=NODE_SMAL; -nodesync(); - -sprintf(msgpath,"%sNETMAIL.MSG",node_dir); -if(!writemsg(msgpath,nulstr,title,mode,0,into)) { - bputs(text[Aborted]); - return; } - -if(mode&WM_FILE) { - sprintf(str2,"%sFILE\\%04u.OUT",data_dir,useron.number); - mkdir(str2); - sprintf(str2,"%sFILE\\%04u.OUT\\%s",data_dir,useron.number,title); - if(fexist(str2)) { - bputs(text[FileAlreadyThere]); - remove(msgpath); - return; } - if(online==ON_LOCAL) { /* Local upload */ - bputs(text[EnterPath]); - if(!getstr(str,60,K_LINE|K_UPPER)) { - bputs(text[Aborted]); - remove(msgpath); - return; } - backslash(str); - strcat(str,title); - mv(str,str2,1); } - else { /* Remote */ - menu("ULPROT"); - mnemonics(text[ProtocolOrQuit]); - strcpy(str,"Q"); - for(x=0;x<total_prots;x++) - if(prot[x]->ulcmd[0] && chk_ar(prot[x]->ar,useron)) { - sprintf(tmp,"%c",prot[x]->mnemonic); - strcat(str,tmp); } - ch=getkeys(str,0); - if(ch=='Q' || sys_status&SS_ABORT) { - bputs(text[Aborted]); - remove(msgpath); - return; } - for(x=0;x<total_prots;x++) - if(prot[x]->ulcmd[0] && prot[x]->mnemonic==ch - && chk_ar(prot[x]->ar,useron)) - break; - if(x<total_prots) /* This should be always */ - protocol(cmdstr(prot[x]->ulcmd,str2,nulstr,NULL),0); } - l=flength(str2); - if(l>0) - bprintf(text[FileNBytesReceived],title,ultoac(l,tmp)); - else { - bprintf(text[FileNotReceived],title); - remove(msgpath); - return; } } - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,"MAIL",i); - return; } -sprintf(smb.file,"%sMAIL",data_dir); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } - -if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ - smb.status.max_crcs=mail_maxcrcs; - smb.status.max_age=mail_maxage; - smb.status.max_msgs=MAX_SYSMAIL; - smb.status.attr=SMB_EMAIL; - if((i=smb_create(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_CREATE,smb.file,i); - return; } } - -if((i=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return; } - -length=flength(msgpath)+2; /* +2 for translation string */ - -if(length&0xfff00000UL) { - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LEN,msgpath,length); - return; } - -if((i=smb_open_da(&smb))!=0) { - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } -if(sys_misc&SM_FASTMAIL) - offset=smb_fallocdat(&smb,length,1); -else - offset=smb_allocdat(&smb,length,1); -smb_close_da(&smb); - -if((file=open(msgpath,O_RDONLY|O_BINARY))==-1 - || (instream=fdopen(file,"rb"))==NULL) { - smb_freemsgdat(&smb,offset,length,1); - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY); - return; } - -setvbuf(instream,NULL,_IOFBF,2*1024); -fseek(smb.sdt_fp,offset,SEEK_SET); -xlat=XLAT_NONE; -fwrite(&xlat,2,1,smb.sdt_fp); -x=SDT_BLOCK_LEN-2; /* Don't read/write more than 255 */ -while(!feof(instream)) { - memset(buf,0,x); - j=fread(buf,1,x,instream); - if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) - buf[j-1]=buf[j-2]=0; - fwrite(buf,j,1,smb.sdt_fp); - x=SDT_BLOCK_LEN; } -fflush(smb.sdt_fp); -fclose(instream); - -memset(&msg,0,sizeof(smbmsg_t)); -memcpy(msg.hdr.id,"SHD\x1a",4); -msg.hdr.version=smb_ver(); -if(mode&WM_FILE) - msg.hdr.auxattr|=MSG_FILEATTACH; -msg.hdr.when_written.time=msg.hdr.when_imported.time=time(NULL); -msg.hdr.when_written.zone=msg.hdr.when_imported.zone=sys_timezone; - -msg.hdr.offset=offset; - -net=NET_INTERNET; -smb_hfield(&msg,RECIPIENT,strlen(name),name); -msg.idx.to=0; /* Out-bound NetMail set to 0 */ -smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net); -smb_hfield(&msg,RECIPIENTNETADDR,strlen(addr),addr); - -strcpy(str,inetmail_misc&NMAIL_ALIAS ? useron.alias : useron.name); -smb_hfield(&msg,SENDER,strlen(str),str); - -sprintf(str,"%u",useron.number); -smb_hfield(&msg,SENDEREXT,strlen(str),str); -msg.idx.from=useron.number; - -/* -smb_hfield(&msg,SENDERNETTYPE,sizeof(net),&net); -smb_hfield(&msg,SENDERNETADDR,strlen(sys_inetaddr),sys_inetaddr); -*/ - -smb_hfield(&msg,SUBJECT,strlen(title),title); -strcpy(str,title); -strlwr(str); -msg.idx.subj=crc16(str); - -smb_dfield(&msg,TEXT_BODY,length); - -smb_unlocksmbhdr(&smb); -i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK); -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); - -smb_freemsgmem(&msg); -if(i) { - smb_freemsgdat(&smb,offset,length,1); - errormsg(WHERE,ERR_WRITE,smb.file,i); - return; } - -if(mode&WM_FILE && online==ON_REMOTE) - autohangup(); - -if(inetmail_sem[0]) /* update semaphore file */ - if((file=nopen(inetmail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(file); -if(!(useron.exempt&FLAG('S'))) - subtract_cdt(inetmail_cost); -sprintf(str,"Sent Internet Mail to %s (%s)",name,addr); -logline("EN",str); -} - -void qnetmail(char *into, char *subj, char mode) -{ - char str[256],str2[128],msgpath[128],title[128],to[128],fulladdr[128],ch - ,buf[SDT_BLOCK_LEN],*addr,*p; - ushort xlat=XLAT_NONE,net=NET_QWK,touser; - int i,j,x,file; - long l; - ulong length,offset; - FILE *instream; - node_t node; - smbmsg_t msg; - -strcpy(to,into); -strcpy(title,subj); - -if(useron.rest&FLAG('M')) { - bputs(text[NoNetMailAllowed]); - return; } - -addr=strrchr(to,'@'); -if(!addr) { - bputs("Invalid netmail address\r\n"); - return; } -*addr=0; -addr++; -strupr(addr); -truncsp(addr); -touser=qwk_route(addr,fulladdr); -if(!fulladdr[0]) { - bputs("Invalid netmail address\r\n"); - return; } - -truncsp(to); -if(!stricmp(to,"SBBS") && !SYSOP) { - bputs("Invalid netmail address\r\n"); - return; } -bprintf(text[NetMailing],to,fulladdr - ,useron.alias,sys_id); -action=NODE_SMAL; -nodesync(); - -sprintf(msgpath,"%sNETMAIL.MSG",node_dir); -if(!writemsg(msgpath,nulstr,title,mode|WM_QWKNET,0,to)) { - bputs(text[Aborted]); - return; } - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,"MAIL",i); - return; } -sprintf(smb.file,"%sMAIL",data_dir); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } - -if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ - smb.status.max_crcs=mail_maxcrcs; - smb.status.max_msgs=MAX_SYSMAIL; - smb.status.max_age=mail_maxage; - smb.status.attr=SMB_EMAIL; - if((i=smb_create(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_CREATE,smb.file,i); - return; } } - -if((i=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return; } - -length=flength(msgpath)+2; /* +2 for translation string */ - -if(length&0xfff00000UL) { - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LEN,msgpath,length); - return; } - -if((i=smb_open_da(&smb))!=0) { - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } -if(sys_misc&SM_FASTMAIL) - offset=smb_fallocdat(&smb,length,1); -else - offset=smb_allocdat(&smb,length,1); -smb_close_da(&smb); - -if((file=open(msgpath,O_RDONLY|O_BINARY))==-1 - || (instream=fdopen(file,"rb"))==NULL) { - smb_freemsgdat(&smb,offset,length,1); - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY); - return; } - -setvbuf(instream,NULL,_IOFBF,2*1024); -fseek(smb.sdt_fp,offset,SEEK_SET); -xlat=XLAT_NONE; -fwrite(&xlat,2,1,smb.sdt_fp); -x=SDT_BLOCK_LEN-2; /* Don't read/write more than 255 */ -while(!feof(instream)) { - memset(buf,0,x); - j=fread(buf,1,x,instream); - if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) - buf[j-1]=buf[j-2]=0; - fwrite(buf,j,1,smb.sdt_fp); - x=SDT_BLOCK_LEN; } -fflush(smb.sdt_fp); -fclose(instream); - -memset(&msg,0,sizeof(smbmsg_t)); -memcpy(msg.hdr.id,"SHD\x1a",4); -msg.hdr.version=smb_ver(); -if(mode&WM_FILE) - msg.hdr.auxattr|=MSG_FILEATTACH; -msg.hdr.when_written.time=msg.hdr.when_imported.time=time(NULL); -msg.hdr.when_written.zone=msg.hdr.when_imported.zone=sys_timezone; - -msg.hdr.offset=offset; - -net=NET_QWK; -smb_hfield(&msg,RECIPIENT,strlen(to),to); -msg.idx.to=touser; -smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net); -smb_hfield(&msg,RECIPIENTNETADDR,strlen(fulladdr),fulladdr); - -smb_hfield(&msg,SENDER,strlen(useron.alias),useron.alias); - -sprintf(str,"%u",useron.number); -smb_hfield(&msg,SENDEREXT,strlen(str),str); -msg.idx.from=useron.number; - -smb_hfield(&msg,SUBJECT,strlen(title),title); -strcpy(str,title); -strlwr(str); -msg.idx.subj=crc16(str); - -smb_dfield(&msg,TEXT_BODY,length); - -smb_unlocksmbhdr(&smb); -i=smb_addmsghdr(&smb,&msg,SMB_SELFPACK); -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); - -smb_freemsgmem(&msg); -if(i) { - smb_freemsgdat(&smb,offset,length,1); - errormsg(WHERE,ERR_WRITE,smb.file,i); - return; } - -sprintf(str,"Sent QWK NetMail to %s (%s)",to,fulladdr); -logline("EN",str); -} diff --git a/src/sbbs2/newuser.c b/src/sbbs2/newuser.c deleted file mode 100644 index 40802c077e..0000000000 --- a/src/sbbs2/newuser.c +++ /dev/null @@ -1,404 +0,0 @@ -#line 1 "NEWUSER.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "cmdshell.h" - -extern char qwklogon; - -/****************************************************************************/ -/* This function is invoked when a user enters "NEW" at the NN: prompt */ -/* Prompts user for personal information and then sends feedback to sysop. */ -/* Called from function waitforcall */ -/****************************************************************************/ -void newuser() -{ - char c,str[512],usa; - int file; - uint i,j; - long misc; - FILE *stream; - -if(cur_rate<node_minbps) { - bprintf(text[MinimumModemSpeed],node_minbps); - sprintf(str,"%sTOOSLOW.MSG",text_dir); - if(fexist(str)) - printfile(str,0); - sprintf(str,"New user modem speed: %lu<%u" - ,cur_rate,node_minbps); - logline("N!",str); - hangup(); - return; } - -getnodedat(node_num,&thisnode,0); -if(thisnode.misc&NODE_LOCK) { - bputs(text[NodeLocked]); - logline("N!","New user locked node logon attempt"); - hangup(); - return; } - -if(sys_misc&SM_CLOSED) { - bputs(text[NoNewUsers]); - hangup(); - return; } -getnodedat(node_num,&thisnode,1); -thisnode.status=NODE_NEWUSER; -if(online==ON_LOCAL) - thisnode.connection=0; -else - thisnode.connection=cur_rate; -putnodedat(node_num,thisnode); -memset(&useron,0,sizeof(user_t)); /* Initialize user info to null */ -if(new_pass[0] && online==ON_REMOTE) { - c=0; - while(++c<4) { - bputs(text[NewUserPasswordPrompt]); - getstr(str,40,K_UPPER); - if(!strcmp(str,new_pass)) - break; - sprintf(tmp,"NUP Attempted: '%s'",str); - logline("N!",tmp); } - if(c==4) { - sprintf(str,"%sNUPGUESS.MSG",text_dir); - if(fexist(str)) - printfile(str,P_NOABORT); - hangup(); - return; } } - -if(autoterm || yesno(text[AutoTerminalQ])) { - useron.misc|=AUTOTERM; - useron.misc|=autoterm; } - -if(!(useron.misc&AUTOTERM)) { - if(yesno(text[AnsiTerminalQ])) - useron.misc|=ANSI; } - -if(useron.misc&ANSI) { - useron.rows=0; /* Auto-rows */ - if(useron.misc&(RIP|WIP) || yesno(text[ColorTerminalQ])) - useron.misc|=COLOR; } -else - useron.rows=24; -if(!yesno(text[ExAsciiTerminalQ])) - useron.misc|=NO_EXASCII; - -/* Sets defaults per sysop config */ -useron.misc|=(new_misc&~(DELETED|INACTIVE|QUIET|NETMAIL)); -useron.qwk=(QWK_FILES|QWK_ATTACH|QWK_EMAIL|QWK_DELMAIL); -strcpy(useron.modem,connection); -useron.firston=useron.laston=useron.pwmod=time(NULL); -if(new_expire) { - now=time(NULL); - useron.expire=now+((long)new_expire*24L*60L*60L); } -else - useron.expire=0; -useron.sex=SP; -useron.prot=new_prot; -strcpy(useron.note,cid); /* Caller ID if supported, NULL otherwise */ -strcpy(useron.alias,"New"); /* just for status line */ -strcpy(useron.modem,connection); -if(!lastuser()) { /* Automatic sysop access for first user */ - useron.level=99; - useron.exempt=useron.flags1=useron.flags2=0xffffffffUL; - useron.flags3=useron.flags4=0xffffffffUL; - useron.rest=0L; } -else { - useron.level=new_level; - useron.flags1=new_flags1; - useron.flags2=new_flags2; - useron.flags3=new_flags3; - useron.flags4=new_flags4; - useron.rest=new_rest; - useron.exempt=new_exempt; } - -useron.cdt=new_cdt; -useron.min=new_min; -useron.freecdt=level_freecdtperday[useron.level]; - -if(total_fcomps) - strcpy(useron.tmpext,fcomp[0]->ext); -else - strcpy(useron.tmpext,"ZIP"); -for(i=0;i<total_xedits;i++) - if(!stricmp(xedit[i]->code,new_xedit) && chk_ar(xedit[i]->ar,useron)) - break; -if(i<total_xedits) - useron.xedit=i+1; - - -useron.shell=new_shell; - -statline=sys_def_stat; -statusline(); -useron.alias[0]=0; -while(online) { - while(online) { - if(uq&UQ_ALIASES) - bputs(text[EnterYourAlias]); - else - bputs(text[EnterYourRealName]); - getstr(useron.alias,LEN_ALIAS - ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL); - truncsp(useron.alias); - if(useron.alias[0]<=SP || !isalpha(useron.alias[0]) - || strchr(useron.alias,0xff) - || matchuser(useron.alias) || trashcan(useron.alias,"NAME") - || (!(uq&UQ_ALIASES) && !strchr(useron.alias,SP))) { - bputs(text[YouCantUseThatName]); - continue; } - break; } - statusline(); - if(!online) return; - if(uq&UQ_ALIASES && uq&UQ_REALNAME) { - while(online) { - bputs(text[EnterYourRealName]); - if(!getstr(useron.name,LEN_NAME - ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL) - || trashcan(useron.name,"NAME") - || strchr(useron.name,0xff) - || !strchr(useron.name,SP) - || (uq&UQ_DUPREAL - && userdatdupe(useron.number,U_NAME,LEN_NAME - ,useron.name,0))) - bputs(text[YouCantUseThatName]); - else - break; } } - else if(uq&UQ_COMPANY) { - bputs(text[EnterYourCompany]); - getstr(useron.name,LEN_NAME,(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL); } - if(!useron.name[0]) - strcpy(useron.name,useron.alias); - if(!online) return; - if(!useron.handle[0]) - sprintf(useron.handle,"%.*s",LEN_HANDLE,useron.alias); - while(uq&UQ_HANDLE && online) { - bputs(text[EnterYourHandle]); - if(!getstr(useron.handle,LEN_HANDLE - ,K_LINE|K_EDIT|K_AUTODEL|(uq&UQ_NOEXASC)) - || strchr(useron.handle,0xff) - || (uq&UQ_DUPHAND - && userdatdupe(0,U_HANDLE,LEN_HANDLE,useron.handle,0)) - || trashcan(useron.handle,"NAME")) - bputs(text[YouCantUseThatName]); - else - break; } - if(!online) return; - if(uq&UQ_ADDRESS) - while(online) { /* Get address and zip code */ - bputs(text[EnterYourAddress]); - if(getstr(useron.address,LEN_ADDRESS - ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL)) - break; } - if(!online) return; - while(uq&UQ_LOCATION && online) { - bputs(text[EnterYourCityState]); - if(getstr(useron.location,LEN_LOCATION - ,K_UPRLWR|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL) - && (uq&UQ_NOCOMMAS || strchr(useron.location,','))) - break; - bputs("\r\nYou must include a comma between the city and state.\r\n"); - useron.location[0]=0; } - if(uq&UQ_ADDRESS) - while(online) { - bputs(text[EnterYourZipCode]); - if(getstr(useron.zipcode,LEN_ZIPCODE - ,K_UPPER|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL)) - break; } - if(!online) return; - if(uq&UQ_PHONE) { - usa=yesno(text[CallingFromNorthAmericaQ]); - while(online) { - bputs(text[EnterYourPhoneNumber]); - if(!usa) { - if(getstr(useron.phone,LEN_PHONE - ,K_UPPER|K_LINE|(uq&UQ_NOEXASC)|K_EDIT|K_AUTODEL)<5) - continue; } - else { - if(gettmplt(useron.phone,sys_phonefmt - ,K_LINE|(uq&UQ_NOEXASC)|K_EDIT)<strlen(sys_phonefmt)) - continue; } - if(!trashcan(useron.phone,"PHONE")) - break; } } - if(!online) return; - if(uq&UQ_SEX) { - bputs(text[EnterYourSex]); - useron.sex=getkeys("MF",0); } - while(uq&UQ_BIRTH && online) { - bputs(text[EnterYourBirthday]); - if(gettmplt(useron.birth,"nn/nn/nn",K_EDIT)==8 && getage(useron.birth)) - break; } - if(yesno(text[UserInfoCorrectQ])) - break; } -sprintf(str,"New user: %s",useron.alias); -logline("N",str); -if(!online) return; -if(uq&UQ_COMP) - getcomputer(useron.comp); -CLS; -sprintf(str,"%sSBBS.MSG",text_dir); -printfile(str,P_NOABORT); -if(lncntr) - pause(); -CLS; -sprintf(str,"%sSYSTEM.MSG",text_dir); -printfile(str,P_NOABORT); -if(lncntr) - pause(); -CLS; -sprintf(str,"%sNEWUSER.MSG",text_dir); -printfile(str,P_NOABORT); -if(lncntr) - pause(); -CLS; -answertime=time(NULL); /* could take 10 minutes to get this far */ - -if(total_xedits && uq&UQ_XEDIT && !noyes("Use an external editor")) { - if(useron.xedit) useron.xedit--; - for(i=0;i<total_xedits;i++) - uselect(1,i,"External Editor",xedit[i]->name,xedit[i]->ar); - if((int)(i=uselect(0,useron.xedit,0,0,0))>=0) - useron.xedit=i+1; } - -if(total_shells>1 && uq&UQ_CMDSHELL) { - for(i=0;i<total_shells;i++) - uselect(1,i,"Command Shell",shell[i]->name,shell[i]->ar); - if((int)(i=uselect(0,useron.shell,0,0,0))>=0) - useron.shell=i; } - -c=0; -while(c<LEN_PASS) { /* Create random password */ - useron.pass[c]=random(43)+48; - if(isalnum(useron.pass[c])) - c++; } -useron.pass[c]=0; -bprintf(text[YourPasswordIs],useron.pass); - -if(sys_misc&SM_PWEDIT && yesno(text[NewPasswordQ])) - while(online) { - bputs(text[NewPassword]); - getstr(str,LEN_PASS,K_UPPER|K_LINE); - truncsp(str); - if(chkpass(str,useron)) { - strcpy(useron.pass,str); - CRLF; - bprintf(text[YourPasswordIs],useron.pass); - break; } - CRLF; } - -c=0; -while(online) { - bprintf(text[NewUserPasswordVerify]); - console|=CON_R_ECHOX; - if(!(sys_misc&SM_ECHO_PW)) - console|=CON_L_ECHOX; - str[0]=0; - getstr(str,LEN_PASS,K_UPPER); - console&=~(CON_R_ECHOX|CON_L_ECHOX); - if(!strcmp(str,useron.pass)) break; - sprintf(tmp,"Failed PW verification: '%s' instead of '%s'",str - ,useron.pass); - logline(nulstr,tmp); - if(++c==4) { - logline("N!","Couldn't figure out password."); - hangup(); } - bputs(text[IncorrectPassword]); - bprintf(text[YourPasswordIs],useron.pass); } -if(!online) return; -if(new_magic[0]) { - bputs(text[MagicWordPrompt]); - str[0]=0; - getstr(str,50,K_UPPER); - if(strcmp(str,new_magic)) { - bputs(text[FailedMagicWord]); - sprintf(tmp,"Failed magic word: '%s'",str); - logline("N!",tmp); - hangup(); } - if(!online) return; } - -i=1; -bputs(text[CheckingSlots]); -sprintf(str,"%s\\USER\\NAME.DAT",data_dir); -if(fexist(str)) { - if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - hangup(); - return; } - j=filelength(file)/(LEN_ALIAS+2); /* total users */ - while(i<=j) { - fread(str,LEN_ALIAS+2,1,stream); - for(c=0;c<LEN_ALIAS;c++) - if(str[c]==ETX) break; - str[c]=0; - if(!c) { /* should be a deleted user */ - getuserrec(i,U_MISC,8,str); - misc=ahtoul(str); - if(misc&DELETED) { /* deleted bit set too */ - getuserrec(i,U_LASTON,8,str); - now=ahtoul(str); /* delete long enough ? */ - if((time(NULL)-now)/86400>=sys_deldays) break; } } - i++; } - fclose(stream); } - -j=lastuser(); /* Check against data file */ -if(i<=j) { /* Overwriting existing user */ - getuserrec(i,U_MISC,8,str); - misc=ahtoul(str); - if(!(misc&DELETED)) /* Not deleted? Set usernumber to end+1 */ - i=j+1; } - -useron.number=i; -putuserdat(useron); -putusername(useron.number,useron.alias); -logline(nulstr,"Wrote user data"); -if(new_sif[0]) { - sprintf(str,"%sUSER\\%4.4u.DAT",data_dir,useron.number); - create_sif_dat(new_sif,str); } -if(!(uq&UQ_NODEF)) - maindflts(useron); - -delallmail(useron.number); - -if(useron.number!=1 && node_valuser) { - sprintf(str,"%sFEEDBACK.MSG",text_dir); - CLS; - printfile(str,P_NOABORT); - sprintf(str,text[NewUserFeedbackHdr] - ,nulstr,getage(useron.birth),useron.sex,useron.birth - ,useron.name,useron.phone,useron.comp,useron.modem); - email(node_valuser,str,"New User Validation",WM_EMAIL); - if(!useron.fbacks && !useron.emails) { - if(online) { /* didn't hang up */ - bprintf(text[NoFeedbackWarning],username(node_valuser,tmp)); - email(node_valuser,str,"New User Validation",WM_EMAIL); - } /* give 'em a 2nd try */ - if(!useron.fbacks && !useron.emails) { - bprintf(text[NoFeedbackWarning],username(node_valuser,tmp)); - logline("N!","Aborted feedback"); - hangup(); - putuserrec(useron.number,U_COMMENT,60,"Didn't leave feedback"); - putuserrec(useron.number,U_MISC,8 - ,ultoa(useron.misc|DELETED,tmp,16)); - putusername(useron.number,nulstr); - return; } } } - -sprintf(str,"%sFILE\\%04u.IN",data_dir,useron.number); /* delete any files */ -delfiles(str,"*.*"); /* waiting for user */ -rmdir(str); -sprintf(tmp,"%04u.*",useron.number); -sprintf(str,"%sFILE",data_dir); -delfiles(str,tmp); - -answertime=starttime=time(NULL); /* set answertime to now */ -sprintf(str,"%sUSER\\PTRS\\%04u.IXB",data_dir,useron.number); /* msg ptrs */ -remove(str); -sprintf(str,"%sMSGS\\%04u.MSG",data_dir,useron.number); /* delete short msg */ -remove(str); -sprintf(str,"%sUSER\\%04u.MSG",data_dir,useron.number); /* delete ex-comment */ -remove(str); -if(newuser_mod[0]) - exec_bin(newuser_mod,&main_csi); -user_event(EVENT_NEWUSER); -logline("N+","Successful new user logon"); -sys_status|=SS_NEWUSER; -} diff --git a/src/sbbs2/node/make.bat b/src/sbbs2/node/make.bat deleted file mode 100755 index b20b2c0d19..0000000000 --- a/src/sbbs2/node/make.bat +++ /dev/null @@ -1,5 +0,0 @@ -@echo off -bcc -w-pro -I.. -C -mt -nDOS node.c -if errorlevel 1 goto end -exe2bin dos\node.exe dos\node.com -:end \ No newline at end of file diff --git a/src/sbbs2/node/make.cmd b/src/sbbs2/node/make.cmd deleted file mode 100755 index 4094c5e6d7..0000000000 --- a/src/sbbs2/node/make.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -I.. -w-pro -nOS2 node.c diff --git a/src/sbbs2/node/node.c b/src/sbbs2/node/node.c deleted file mode 100644 index 9532dc12d5..0000000000 --- a/src/sbbs2/node/node.c +++ /dev/null @@ -1,476 +0,0 @@ -/* NODE.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Synchronet BBS Node control program */ - -#include <stdio.h> -#include <stdlib.h> -#include <io.h> -#include <dos.h> -#include <fcntl.h> -#include <string.h> -#include "sbbsdefs.h" - -enum { - MODE_LIST - ,MODE_ANON - ,MODE_LOCK - ,MODE_INTR - ,MODE_RRUN - ,MODE_DOWN - ,MODE_EVENT - ,MODE_NOPAGE - ,MODE_NOALERTS - ,MODE_STATUS - ,MODE_USERON - ,MODE_ACTION - ,MODE_ERRORS - ,MODE_MISC - ,MODE_CONN - ,MODE_AUX - ,MODE_EXTAUX - }; - -char tmp[256]; -int nodefile; - -/****************************************************************************/ -/* Reads the data for node number 'number' into the structure 'node' */ -/* from NODE.DAB */ -/* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */ -/****************************************************************************/ -void getnodedat(uchar number, node_t *node, char lockit) -{ - char str[256]; - int count=0; - -number--; /* make zero based */ -while(count<LOOP_NODEDAB) { - lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); - if(lockit - && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) { - count++; - continue; } - if(read(nodefile,node,sizeof(node_t))==sizeof(node_t)) - break; - count++; } -if(count) - printf("NODE.DAB COLLISION (READ) - Count:%d\n",count); -if(count==LOOP_NODEDAB) { - printf("Error reading nodefile for node %d\n",number+1); - return; } -} - -/****************************************************************************/ -/* Write the data from the structure 'node' into NODE.DAB */ -/* getnodedat(num,&node,1); must have been called before calling this func */ -/* NOTE: ------^ the indicates the node record has been locked */ -/****************************************************************************/ -void putnodedat(uchar number, node_t node) -{ - char str[256]; - int count; - -number--; /* make zero based */ -lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); -if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) { - unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); - printf("Error writing to nodefile for node %d\n",number+1); - return; } -unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); -} - -/****************************************************************************/ -/* Unpacks the password 'pass' from the 5bit ASCII inside node_t. 32bits in */ -/* node.extaux, and the other 8bits in the upper byte of node.aux */ -/****************************************************************************/ -char *unpackchatpass(char *pass, node_t node) -{ - char bits; - int i; - -pass[0]=(node.aux&0x1f00)>>8; -pass[1]=((node.aux&0xe000)>>13)|((node.extaux&0x3)<<3); -bits=2; -for(i=2;i<8;i++) { - pass[i]=(node.extaux>>bits)&0x1f; - bits+=5; } -pass[8]=0; -for(i=0;i<8;i++) - if(pass[i]) - pass[i]+=64; -return(pass); -} - -/****************************************************************************/ -/* Displays the information for node number 'number' contained in 'node' */ -/****************************************************************************/ -void printnodedat(uchar number, node_t node) -{ - uint i; - char hour,mer[3]; - -printf("Node %2d: ",number); -switch(node.status) { - case NODE_WFC: - printf("Waiting for call"); - break; - case NODE_OFFLINE: - printf("Offline"); - break; - case NODE_NETTING: - printf("Networking"); - break; - case NODE_LOGON: - printf("At logon prompt"); - break; - case NODE_EVENT_WAITING: - printf("Waiting for all nodes to become inactive"); - break; - case NODE_EVENT_LIMBO: - printf("Waiting for node %d to finish external event",node.aux); - break; - case NODE_EVENT_RUNNING: - printf("Running external event"); - break; - case NODE_NEWUSER: - printf("New user"); - printf(" applying for access "); - if(!node.connection) - printf("Locally"); - else - printf("at %ubps",node.connection); - break; - case NODE_QUIET: - case NODE_INUSE: - printf("User #%d",node.useron); - printf(" "); - switch(node.action) { - case NODE_MAIN: - printf("at main menu"); - break; - case NODE_RMSG: - printf("reading messages"); - break; - case NODE_RMAL: - printf("reading mail"); - break; - case NODE_RSML: - printf("reading sent mail"); - break; - case NODE_RTXT: - printf("reading text files"); - break; - case NODE_PMSG: - printf("posting message"); - break; - case NODE_SMAL: - printf("sending mail"); - break; - case NODE_AMSG: - printf("posting auto-message"); - break; - case NODE_XTRN: - if(!node.aux) - printf("at external program menu"); - else - printf("running external program #%d",node.aux); - break; - case NODE_DFLT: - printf("changing defaults"); - break; - case NODE_XFER: - printf("at transfer menu"); - break; - case NODE_RFSD: - printf("retrieving from device #%d",node.aux); - break; - case NODE_DLNG: - printf("downloading"); - break; - case NODE_ULNG: - printf("uploading"); - break; - case NODE_BXFR: - printf("transferring bidirectional"); - break; - case NODE_LFIL: - printf("listing files"); - break; - case NODE_LOGN: - printf("logging on"); - break; - case NODE_LCHT: - printf("in local chat with sysop"); - break; - case NODE_MCHT: - if(node.aux) { - printf("in multinode chat channel %d",node.aux&0xff); - if(node.aux&0x1f00) { /* password */ - putchar('*'); - printf(" %s",unpackchatpass(tmp,node)); } } - else - printf("in multinode global chat channel"); - break; - case NODE_PAGE: - printf("paging node %u for private chat",node.aux); - break; - case NODE_PCHT: - printf("in private chat with node %u",node.aux); - break; - case NODE_GCHT: - printf("chatting with The Guru"); - break; - case NODE_CHAT: - printf("in chat section"); - break; - case NODE_TQWK: - printf("transferring QWK packet"); - break; - case NODE_SYSP: - printf("performing sysop activities"); - break; - default: - printf(itoa(node.action,tmp,10)); - break; } - if(!node.connection) - printf(" locally"); - else - printf(" at %ubps",node.connection); - if(node.action==NODE_DLNG) { - if((node.aux/60)>=12) { - if(node.aux/60==12) - hour=12; - else - hour=(node.aux/60)-12; - strcpy(mer,"pm"); } - else { - if((node.aux/60)==0) /* 12 midnite */ - hour=12; - else hour=node.aux/60; - strcpy(mer,"am"); } - printf(" ETA %02d:%02d %s" - ,hour,node.aux-((node.aux/60)*60),mer); } - break; } -if(node.misc&(NODE_LOCK|NODE_POFF|NODE_AOFF|NODE_MSGW|NODE_NMSG)) { - printf(" ("); - if(node.misc&NODE_AOFF) - putchar('A'); - if(node.misc&NODE_LOCK) - putchar('L'); - if(node.misc&(NODE_MSGW|NODE_NMSG)) - putchar('M'); - if(node.misc&NODE_POFF) - putchar('P'); - putchar(')'); } -if(((node.misc - &(NODE_ANON|NODE_UDAT|NODE_INTR|NODE_RRUN|NODE_EVENT|NODE_DOWN)) - || node.status==NODE_QUIET)) { - printf(" ["); - if(node.misc&NODE_ANON) - putchar('A'); - if(node.misc&NODE_INTR) - putchar('I'); - if(node.misc&NODE_RRUN) - putchar('R'); - if(node.misc&NODE_UDAT) - putchar('U'); - if(node.status==NODE_QUIET) - putchar('Q'); - if(node.misc&NODE_EVENT) - putchar('E'); - if(node.misc&NODE_DOWN) - putchar('D'); - putchar(']'); } -if(node.errors) - printf(" %d error%c",node.errors, node.errors>1 ? 's' : '\0' ); -printf("\n"); -} - - -/****************************/ -/* Main program entry point */ -/****************************/ -int main(int argc, char **argv) -{ - char str[256],ctrl_dir[41],*p,debug=0; - uchar sys_nodes,node_num=0,onoff=0; - uint i,j,mode=0,misc; - long value; - node_t node; - -printf("\nSynchronet Node Display/Control Utility v1.03\n\n"); - -if(argc<2) { - printf("usage: node [/debug] [action [on|off]] [node numbers] [...]" - "\n\n"); - printf("actions (default is list):\n\n"); - printf("list = list status\n"); - printf("anon = anonymous user\n"); - printf("lock = locked\n"); - printf("intr = interrupt\n"); - printf("down = shut-down\n"); - printf("rerun = rerun\n"); - printf("event = run event\n"); - printf("nopage = page disable\n"); - printf("noalerts = activity alerts disable\n"); - printf("status=# = set status value\n"); - printf("useron=# = set useron number\n"); - printf("action=# = set action value\n"); - printf("errors=# = set error counter\n"); - printf("conn=# = set connection value\n"); - printf("misc=# = set misc value\n"); - printf("aux=# = set aux value\n"); - printf("extaux=# = set extended aux value\n"); - exit(0); } - -p=getenv("SBBSCTRL"); -if(p==NULL) { - printf("\7\nSBBSCTRL environment variable is not set.\n"); - printf("This environment variable must be set to your CTRL directory."); - printf("\nExample: SET SBBSCTRL=C:\\SBBS\\CTRL\n"); - exit(1); } -sprintf(ctrl_dir,"%.40s",p); -strupr(ctrl_dir); -if(ctrl_dir[strlen(ctrl_dir)-1]!='\\') - strcat(ctrl_dir,"\\"); - -sprintf(str,"%sNODE.DAB",ctrl_dir); -if((nodefile=open(str,O_RDWR|O_DENYNONE|O_BINARY))==-1) { - printf("\7\nError opening %s.\n",str); - exit(1); } - -sys_nodes=filelength(nodefile)/sizeof(node_t); -if(!sys_nodes) { - printf("%s reflects 0 nodes!\n",str); - exit(1); } - -for(i=1;i<argc;i++) { - if(isdigit(argv[i][0])) - node_num=atoi(argv[i]); - else { - node_num=onoff=value=0; - if(!stricmp(argv[i],"/DEBUG")) - debug=1; - else if(!stricmp(argv[i],"LOCK")) - mode=MODE_LOCK; - else if(!stricmp(argv[i],"ANON")) - mode=MODE_ANON; - else if(!stricmp(argv[i],"INTR")) - mode=MODE_INTR; - else if(!stricmp(argv[i],"DOWN")) - mode=MODE_DOWN; - else if(!stricmp(argv[i],"RERUN")) - mode=MODE_RRUN; - else if(!stricmp(argv[i],"EVENT")) - mode=MODE_EVENT; - else if(!stricmp(argv[i],"NOPAGE")) - mode=MODE_NOPAGE; - else if(!stricmp(argv[i],"NOALERTS")) - mode=MODE_NOALERTS; - else if(!stricmp(argv[i],"ON")) - onoff=1; - else if(!stricmp(argv[i],"OFF")) - onoff=2; - else if(!strnicmp(argv[i],"STATUS=",7)) { - mode=MODE_STATUS; - value=atoi(argv[i]+7); } - else if(!strnicmp(argv[i],"ERRORS=",7)) { - mode=MODE_ERRORS; - value=atoi(argv[i]+7); } - else if(!strnicmp(argv[i],"USERON=",7)) { - mode=MODE_USERON; - value=atoi(argv[i]+7); } - else if(!strnicmp(argv[i],"ACTION=",7)) { - mode=MODE_ACTION; - value=atoi(argv[i]+7); } - else if(!strnicmp(argv[i],"CONN=",5)) { - mode=MODE_CONN; - value=atoi(argv[i]+5); } - else if(!strnicmp(argv[i],"MISC=",5)) { - mode=MODE_MISC; - value=atoi(argv[i]+5); } - else if(!strnicmp(argv[i],"AUX=",4)) { - mode=MODE_AUX; - value=atoi(argv[i]+4); } - else if(!strnicmp(argv[i],"EXTAUX=",7)) { - mode=MODE_EXTAUX; - value=atoi(argv[i]+7); } - } - if((mode && node_num) || i+1==argc) - for(j=1;j<=sys_nodes;j++) - if(!node_num || j==node_num) { - getnodedat(j,&node,1); - misc=0; - switch(mode) { - case MODE_ANON: - misc=NODE_ANON; - break; - case MODE_LOCK: - misc=NODE_LOCK; - break; - case MODE_INTR: - misc=NODE_INTR; - break; - case MODE_DOWN: - misc=NODE_DOWN; - break; - case MODE_RRUN: - misc=NODE_RRUN; - break; - case MODE_EVENT: - misc=NODE_EVENT; - break; - case MODE_NOPAGE: - misc=NODE_POFF; - break; - case MODE_NOALERTS: - misc=NODE_AOFF; - break; - case MODE_STATUS: - node.status=value; - break; - case MODE_ERRORS: - node.errors=value; - break; - case MODE_ACTION: - node.action=value; - break; - case MODE_USERON: - node.useron=value; - break; - case MODE_MISC: - node.misc=value; - break; - case MODE_CONN: - node.connection=value; - break; - case MODE_AUX: - node.aux=value; - break; - case MODE_EXTAUX: - node.extaux=value; - break; } - if(misc) { - if(onoff==0) - node.misc^=misc; - else if(onoff==1) - node.misc|=misc; - else if(onoff==2) - node.misc&=~misc; } - putnodedat(j,node); - printnodedat(j,node); - if(debug) { - printf("status=%u\n",node.status); - printf("errors=%u\n",node.errors); - printf("action=%d\n",node.action); - printf("useron=%u\n",node.useron); - printf("conn=%u\n",node.connection); - printf("misc=%u\n",node.misc); - printf("aux=%u\n",node.aux); - printf("extaux=%lu\n",node.extaux); } } } - -close(nodefile); -return(0); -} diff --git a/src/sbbs2/nodedefs.h b/src/sbbs2/nodedefs.h deleted file mode 100644 index c661445e3e..0000000000 --- a/src/sbbs2/nodedefs.h +++ /dev/null @@ -1,81 +0,0 @@ -/* NODEDEFS.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/************************************************************/ -/* Constants, macros, and typedefs for use ONLY with SBBS */ -/************************************************************/ - -#ifndef _NODEDEFS_H -#define _NODEDEFS_H - -#include "gen_defs.h" - -enum { /* Node Status */ - NODE_WFC /* Waiting for Call */ - ,NODE_LOGON /* at logon prompt */ - ,NODE_NEWUSER /* New user applying */ - ,NODE_INUSE /* In Use */ - ,NODE_QUIET /* In Use - quiet mode */ - ,NODE_OFFLINE /* Offline */ - ,NODE_NETTING /* Networking */ - ,NODE_EVENT_WAITING /* Waiting for all nodes to be inactive */ - ,NODE_EVENT_RUNNING /* Running an external event */ - ,NODE_EVENT_LIMBO /* Allowing another node to run an event */ - }; - - /* Bit values for node.misc */ -#define NODE_ANON (1<<0) /* Anonymous User */ -#define NODE_LOCK (1<<1) /* Locked for sysops only */ -#define NODE_INTR (1<<2) /* Interrupted - hang up */ -#define NODE_MSGW (1<<3) /* Message is waiting (old way) */ -#define NODE_POFF (1<<4) /* Page disabled */ -#define NODE_AOFF (1<<5) /* Activity Alert disabled */ -#define NODE_UDAT (1<<6) /* User data has been updated */ -#define NODE_RRUN (1<<7) /* Re-run this node when log off */ -#define NODE_EVENT (1<<8) /* Must run node event after log off */ -#define NODE_DOWN (1<<9) /* Down this node after logoff */ -#define NODE_RPCHT (1<<10) /* Reset private chat */ -#define NODE_NMSG (1<<11) /* Node message waiting (new way) */ -#define NODE_EXT (1<<12) /* Extended info on node action */ - -enum { /* Node Action */ - NODE_MAIN /* Main Prompt */ - ,NODE_RMSG /* Reading Messages */ - ,NODE_RMAL /* Reading Mail */ - ,NODE_SMAL /* Sending Mail */ - ,NODE_RTXT /* Reading G-Files */ - ,NODE_RSML /* Reading Sent Mail */ - ,NODE_PMSG /* Posting Message */ - ,NODE_AMSG /* Auto-message */ - ,NODE_XTRN /* Running External Program */ - ,NODE_DFLT /* Main Defaults Section */ - ,NODE_XFER /* Transfer Prompt */ - ,NODE_DLNG /* Downloading File */ - ,NODE_ULNG /* Uploading File */ - ,NODE_BXFR /* Bidirectional Transfer */ - ,NODE_LFIL /* Listing Files */ - ,NODE_LOGN /* Logging on */ - ,NODE_LCHT /* In Local Chat with Sysop */ - ,NODE_MCHT /* In Multi-Chat with Other Nodes */ - ,NODE_GCHT /* In Local Chat with Guru */ - ,NODE_CHAT /* In Chat Section */ - ,NODE_SYSP /* Sysop Activity */ - ,NODE_TQWK /* Transferring QWK packet */ - ,NODE_PCHT /* In Private Chat */ - ,NODE_PAGE /* Paging another node for Private Chat */ - ,NODE_RFSD /* Retrieving file from seq dev (aux=dev)*/ - }; - -typedef struct { /* Node information kept in NODE.DAB */ - uchar status, /* Current Status of Node */ - errors, /* Number of Critical Errors */ - action; /* Action User is doing on Node */ - ushort useron, /* User on Node */ - connection, /* Connection rate of Node */ - misc, /* Miscellaneous bits for node */ - aux; /* Auxillary word for node */ - ulong extaux; /* Extended aux dword for node */ - } node_t; - -#endif /* Don't add anything after this line */ diff --git a/src/sbbs2/pack_qwk.c b/src/sbbs2/pack_qwk.c deleted file mode 100644 index c5ebb17c91..0000000000 --- a/src/sbbs2/pack_qwk.c +++ /dev/null @@ -1,527 +0,0 @@ -#line 1 "PACK_QWK.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "qwk.h" -#include "post.h" -#include "etext.h" - -/****************************************************************************/ -/* Creates QWK packet, returning 1 if successful, 0 if not. */ -/****************************************************************************/ -char pack_qwk(char *packet, ulong *msgcnt, int prepack) -{ - uchar str[256],tmp2[256],ch,*p; - uchar HUGE16 *qwkbuf; - int file,mode; - uint i,j,k,n,conf; - long l,size,msgndx; - ulong totalcdt,totalsize,totaltime,lastmsg - ,mailmsgs=0,files,submsgs,msgs,posts,netfiles=0,preqwk=0; - float f; /* Sparky is responsible */ - time_t start; - node_t node; - mail_t *mail; - post_t HUGE16 *post; - FILE *stream,*qwk,*personal,*ndx; - struct ffblk ff; - smbmsg_t msg; - -delfiles(temp_dir,"*.*"); -sprintf(str,"%sFILE\\%04u.QWK",data_dir,useron.number); -if(fexist(str)) { - for(k=0;k<total_fextrs;k++) - if(!stricmp(fextr[k]->ext,useron.tmpext) - && chk_ar(fextr[k]->ar,useron)) - break; - if(k>=total_fextrs) - k=0; - i=external(cmdstr(fextr[k]->cmd,str,"*.*",NULL),EX_OUTL|EX_OUTR); - if(!i) - preqwk=1; } - -if(useron.rest&FLAG('Q') && useron.qwk&QWK_RETCTLA) - useron.qwk|=(QWK_NOINDEX|QWK_NOCTRL|QWK_VIA|QWK_TZ); - -if(useron.qwk&QWK_EXPCTLA) - mode=A_EXPAND; -else if(useron.qwk&QWK_RETCTLA) - mode=A_LEAVE; -else mode=0; -if(useron.qwk&QWK_TZ) - mode|=TZ; -if(useron.qwk&QWK_VIA) - mode|=VIA; -(*msgcnt)=0L; -if(!prepack && !(useron.qwk&QWK_NOCTRL)) { - /***************************/ - /* Create CONTROL.DAT file */ - /***************************/ - sprintf(str,"%sCONTROL.DAT",temp_dir); - if((stream=fnopen(&file,str,O_WRONLY|O_CREAT|O_TRUNC))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return(0); } - - now=time(NULL); - unixtodos(now,&date,&curtime); - - fprintf(stream,"%s\r\n%s\r\n%s\r\n%s, Sysop\r\n0000,%s\r\n" - "%02u-%02u-%u,%02u:%02u:%02u\r\n" - ,sys_name - ,sys_location - ,node_phone - ,sys_op - ,sys_id - ,date.da_mon,date.da_day,date.da_year - ,curtime.ti_hour,curtime.ti_min,curtime.ti_sec); - k=0; - for(i=0;i<usrgrps;i++) - for(j=0;j<usrsubs[i];j++) - k++; /* k is how many subs */ - fprintf(stream,"%s\r\n\r\n0\r\n0\r\n%u\r\n",useron.alias,k); - fprintf(stream,"0\r\nE-mail\r\n"); /* first conference is e-mail */ - for(i=0;i<usrgrps;i++) - for(j=0;j<usrsubs[i];j++) - fprintf(stream,"%u\r\n%s\r\n" - ,sub[usrsub[i][j]]->qwkconf ? sub[usrsub[i][j]]->qwkconf - : ((i+1)*1000)+j+1,sub[usrsub[i][j]]->qwkname); - fprintf(stream,"HELLO\r\nBBSNEWS\r\nGOODBYE\r\n"); - fclose(stream); - /***********************/ - /* Create DOOR.ID File */ - /***********************/ - sprintf(str,"%sDOOR.ID",temp_dir); - if((stream=fnopen(&file,str,O_WRONLY|O_CREAT|O_TRUNC))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return(0); } - p="CONTROLTYPE = "; - fprintf(stream,"DOOR = %s\r\nVERSION = %s\r\n" - "SYSTEM = %s v%s\r\n" - "CONTROLNAME = SBBS\r\n" - "%sADD\r\n" - "%sDROP\r\n" - "%sYOURS\r\n" - "%sRESET\r\n" - "%sRESETALL\r\n" - "%sFILES\r\n" - "%sATTACH\r\n" - "%sOWN\r\n" - "%sMAIL\r\n" - "%sDELMAIL\r\n" - "%sCTRL-A\r\n" - "%sFREQ\r\n" - "%sNDX\r\n" - "%sTZ\r\n" - "%sVIA\r\n" - "%sCONTROL\r\n" - "MIXEDCASE = YES\r\n" - ,decrypt(Synchronet,0) - ,VERSION - ,decrypt(Synchronet,0) - ,VERSION - ,p,p,p,p - ,p,p,p,p - ,p,p,p,p - ,p,p,p,p - ); - fclose(stream); - if(useron.rest&FLAG('Q')) { - /***********************/ - /* Create NETFLAGS.DAT */ - /***********************/ - sprintf(str,"%sNETFLAGS.DAT",temp_dir); - if((stream=fnopen(&file,str,O_WRONLY|O_CREAT))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT); - return(0); } - ch=1; /* Net enabled */ - if(usrgrps) - for(i=0;i<(usrgrps*1000)+usrsubs[usrgrps-1];i++) - fputc(ch,stream); - fclose(stream); } - } /* !prepack */ - -/****************************************************/ -/* Create MESSAGES.DAT, write header and leave open */ -/****************************************************/ -sprintf(str,"%sMESSAGES.DAT",temp_dir); -if((qwk=fnopen(&file,str,O_CREAT|O_WRONLY|O_TRUNC))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY|O_TRUNC); - return(0); } -l=filelength(file); -if(!l) { - fprintf(qwk,"%-128s",decrypt(QWKheader,0)); - msgndx=1; } -else - msgndx=l/128L; -fseek(qwk,0,SEEK_END); -sprintf(str,"%sNEWFILES.DAT",temp_dir); -remove(str); -if(!(useron.rest&FLAG('T')) && useron.qwk&QWK_FILES) - files=create_filelist("NEWFILES.DAT",FL_ULTIME); -else - files=0; - -start=time(NULL); - -if(useron.rest&FLAG('Q')) - useron.qwk|=(QWK_EMAIL|QWK_ALLMAIL|QWK_DELMAIL); - -if(!(useron.qwk&QWK_NOINDEX)) { - sprintf(str,"%sPERSONAL.NDX",temp_dir); - if((personal=fnopen(&file,str,O_CREAT|O_WRONLY|O_APPEND))==NULL) { - fclose(qwk); - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); - return(0); } - fseek(personal,0L,SEEK_END); } -else - personal=NULL; - -if(useron.qwk&(QWK_EMAIL|QWK_ALLMAIL) && !prepack) { - sprintf(smb.file,"%sMAIL",data_dir); - smb.retry_time=smb_retry_time; - if((i=smb_open(&smb))!=0) { - fclose(qwk); - if(personal) - fclose(personal); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } - - /***********************/ - /* Pack E-mail, if any */ - /***********************/ - qwkmail_time=time(NULL); - mailmsgs=loadmail(&mail,useron.number,0,useron.qwk&QWK_ALLMAIL ? LM_QWK - : LM_UNREAD|LM_QWK); - if(mailmsgs && !(sys_status&SS_ABORT)) { - bputs(text[QWKPackingEmail]); - if(!(useron.qwk&QWK_NOINDEX)) { - sprintf(str,"%s000.NDX",temp_dir); - if((ndx=fnopen(&file,str,O_CREAT|O_WRONLY|O_APPEND))==NULL) { - fclose(qwk); - if(personal) - fclose(personal); - smb_close(&smb); - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); - FREE(mail); - return(0); } - fseek(ndx,0L,SEEK_END); } - else - ndx=NULL; - - if(useron.rest&FLAG('Q')) - mode|=TO_QNET; - else - mode&=~TO_QNET; - - for(l=0;l<mailmsgs;l++) { - bprintf("\b\b\b\b\b\b\b\b\b\b\b\b%4lu of %-4lu" - ,l+1,mailmsgs); - - msg.idx.offset=mail[l].offset; - if(!loadmsg(&msg,mail[l].number)) - continue; - - if(msg.hdr.auxattr&MSG_FILEATTACH && useron.qwk&QWK_ATTACH) { - sprintf(str,"%sFILE\\%04u.IN\\%s" - ,data_dir,useron.number,msg.subj); - sprintf(tmp,"%s%s",temp_dir,msg.subj); - if(fexist(str) && !fexist(tmp)) - mv(str,tmp,1); } - - size=msgtoqwk(msg,qwk,mode,INVALID_SUB,0); - smb_unlockmsghdr(&smb,&msg); - smb_freemsgmem(&msg); - if(ndx) { - msgndx++; - f=ltomsbin(msgndx); /* Record number */ - ch=0; /* Sub number, not used */ - if(personal) { - fwrite(&f,4,1,personal); - fwrite(&ch,1,1,personal); } - fwrite(&f,4,1,ndx); - fwrite(&ch,1,1,ndx); - msgndx+=size/128L; } } - bprintf(text[QWKPackedEmail],mailmsgs); - if(ndx) - fclose(ndx); } - smb_close(&smb); /* Close the e-mail */ - if(mailmsgs) - FREE(mail); - } - -/*********************/ -/* Pack new messages */ -/*********************/ -for(i=0;i<usrgrps;i++) { - for(j=0;j<usrsubs[i] && !msgabort();j++) - if(sub[usrsub[i][j]]->misc&SUB_NSCAN - || (!(useron.rest&FLAG('Q')) - && sub[usrsub[i][j]]->misc&SUB_FORCED)) { - if(!chk_ar(sub[usrsub[i][j]]->read_ar,useron)) - continue; - lncntr=0; /* defeat pause */ - if(useron.rest&FLAG('Q') && !(sub[usrsub[i][j]]->misc&SUB_QNET)) - continue; /* QWK Net Node and not QWK networked, so skip */ - - msgs=getlastmsg(usrsub[i][j],&lastmsg,0); - if(!msgs || lastmsg<=sub[usrsub[i][j]]->ptr) { /* no msgs */ - if(sub[usrsub[i][j]]->ptr>lastmsg) { /* corrupted ptr */ - sub[usrsub[i][j]]->ptr=lastmsg; /* so fix automatically */ - sub[usrsub[i][j]]->last=lastmsg; } - bprintf(text[NScanStatusFmt] - ,grp[sub[usrsub[i][j]]->grp]->sname - ,sub[usrsub[i][j]]->lname,0L,msgs); - continue; } - - sprintf(smb.file,"%s%s" - ,sub[usrsub[i][j]]->data_dir,sub[usrsub[i][j]]->code); - smb.retry_time=smb_retry_time; - if((k=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,k); - continue; } - - k=0; - if(useron.qwk&QWK_BYSELF) - k|=LP_BYSELF; - if(!(sub[usrsub[i][j]]->misc&SUB_YSCAN)) - k|=LP_OTHERS; - post=loadposts(&posts,usrsub[i][j],sub[usrsub[i][j]]->ptr,k); - - bprintf(text[NScanStatusFmt] - ,grp[sub[usrsub[i][j]]->grp]->sname - ,sub[usrsub[i][j]]->lname,posts,msgs); - if(!posts) { /* no new messages */ - smb_close(&smb); - continue; } - bputs(text[QWKPackingSubboard]); - submsgs=0; - conf=sub[usrsub[i][j]]->qwkconf; - if(!conf) - conf=((i+1)*1000)+j+1; - - if(!(useron.qwk&QWK_NOINDEX)) { - sprintf(str,"%s%u.NDX",temp_dir,conf); - if((ndx=fnopen(&file,str,O_CREAT|O_WRONLY|O_APPEND))==NULL) { - fclose(qwk); - if(personal) - fclose(personal); - smb_close(&smb); - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); - LFREE(post); - return(0); } - fseek(ndx,0L,SEEK_END); } - else - ndx=NULL; - - for(l=0;l<posts && !msgabort();l++) { - bprintf("\b\b\b\b\b%-5lu",l+1); - - sub[usrsub[i][j]]->ptr=post[l].number; /* set ptr */ - sub[usrsub[i][j]]->last=post[l].number; /* set last read */ - - msg.idx.offset=post[l].offset; - if(!loadmsg(&msg,post[l].number)) - continue; - - if(useron.rest&FLAG('Q')) { - if(msg.from_net.type && msg.from_net.type!=NET_QWK && - !(sub[usrsub[i][j]]->misc&SUB_GATE)) { /* From other */ - smb_freemsgmem(&msg); /* net, don't gate */ - smb_unlockmsghdr(&smb,&msg); - continue; } - mode|=(TO_QNET|TAGLINE); - if(msg.from_net.type==NET_QWK) { - mode&=~TAGLINE; - if(route_circ(msg.from_net.addr,useron.alias) - || !strnicmp(msg.subj,"NE:",3)) { - smb_freemsgmem(&msg); - smb_unlockmsghdr(&smb,&msg); - continue; } } } - else - mode&=~(TAGLINE|TO_QNET); - - size=msgtoqwk(msg,qwk,mode,usrsub[i][j],conf); - smb_unlockmsghdr(&smb,&msg); - - if(ndx) { - msgndx++; - f=ltomsbin(msgndx); /* Record number */ - ch=0; /* Sub number, not used */ - if(personal - && (!stricmp(msg.to,useron.alias) - || !stricmp(msg.to,useron.name))) { - fwrite(&f,4,1,personal); - fwrite(&ch,1,1,personal); } - fwrite(&f,4,1,ndx); - fwrite(&ch,1,1,ndx); - msgndx+=size/128L; } - - smb_freemsgmem(&msg); - (*msgcnt)++; - submsgs++; - if(max_qwkmsgs - && !(useron.rest&FLAG('Q')) && (*msgcnt)>=max_qwkmsgs) { - bputs(text[QWKmsgLimitReached]); - break; } } - if(!(sys_status&SS_ABORT)) - bprintf(text[QWKPackedSubboard],submsgs,(*msgcnt)); - if(ndx) { - fclose(ndx); - sprintf(str,"%s%u.NDX",temp_dir,conf); - if(!flength(str)) - remove(str); } - smb_close(&smb); - LFREE(post); - if(l<posts) - break; } - if(j<usrsubs[i]) /* if sub aborted, abort all */ - break; } - -if((*msgcnt)+mailmsgs && time(NULL)-start) - bprintf("\r\n\r\n\1n\1hPacked %lu messages in %lu seconds " - "(%lu messages/second)." - ,(*msgcnt)+mailmsgs,time(NULL)-start - ,((*msgcnt)+mailmsgs)/(time(NULL)-start)); - -fclose(qwk); /* close MESSAGE.DAT */ -if(personal) { - fclose(personal); /* close PERSONAL.NDX */ - sprintf(str,"%sPERSONAL.NDX",temp_dir); - if(!flength(str)) - remove(str); } -CRLF; - -if(!prepack && (sys_status&SS_ABORT || !online)) - return(0); - -if(!prepack && useron.rest&FLAG('Q')) { /* If QWK Net node, check for files */ - sprintf(str,"%sQNET\\%s.OUT\\*.*",data_dir,useron.alias); - i=findfirst(str,&ff,0); - while(!i) { /* Move files into temp dir */ - sprintf(str,"%sQNET\\%s.OUT\\%s",data_dir,useron.alias,ff.ff_name); - strupr(str); - sprintf(tmp2,"%s%s",temp_dir,ff.ff_name); - lncntr=0; /* Default pause */ - bprintf(text[RetrievingFile],str); - if(!mv(str,tmp2,1)) - netfiles++; - i=findnext(&ff); } - if(netfiles) - CRLF; } - -if(batdn_total) { - for(i=0,totalcdt=0;i<batdn_total;i++) - totalcdt+=batdn_cdt[i]; - if(!(useron.exempt&FLAG('D')) - && totalcdt>useron.cdt+useron.freecdt) { - bprintf(text[YouOnlyHaveNCredits] - ,ultoac(useron.cdt+useron.freecdt,tmp)); } - else { - for(i=0,totalsize=totaltime=0;i<batdn_total;i++) { - totalsize+=batdn_size[i]; - if(!(dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps) - totaltime+=batdn_size[i]/(ulong)cur_cps; } - if(!(useron.exempt&FLAG('T')) && !SYSOP && totaltime>timeleft) - bputs(text[NotEnoughTimeToDl]); - else { - for(i=0;i<batdn_total;i++) { - lncntr=0; - unpadfname(batdn_name[i],tmp); - sprintf(tmp2,"%s%s",temp_dir,tmp); - if(!fexist(tmp2)) { - seqwait(dir[batdn_dir[i]]->seqdev); - bprintf(text[RetrievingFile],tmp); - sprintf(str,"%s%s" - ,batdn_alt[i]>0 && batdn_alt[i]<=altpaths - ? altpath[batdn_alt[i]-1] - : dir[batdn_dir[i]]->path - ,tmp); - mv(str,tmp2,1); /* copy the file to temp dir */ - getnodedat(node_num,&thisnode,1); - thisnode.aux=0xfe; - putnodedat(node_num,thisnode); - CRLF; } } } } } - -if(!(*msgcnt) && !mailmsgs && !files && !netfiles && !batdn_total - && (prepack || !preqwk)) { - bputs(text[QWKNoNewMessages]); - return(0); } - -if(!prepack && !(useron.rest&FLAG('Q'))) { /* Don't include in network */ - /***********************/ /* packets */ - /* Copy QWK Text files */ - /***********************/ - sprintf(str,"%sQWK\\HELLO",text_dir); - if(fexist(str)) { - sprintf(tmp2,"%sHELLO",temp_dir); - mv(str,tmp2,1); } - sprintf(str,"%sQWK\\BBSNEWS",text_dir); - if(fexist(str)) { - sprintf(tmp2,"%sBBSNEWS",temp_dir); - mv(str,tmp2,1); } - sprintf(str,"%sQWK\\GOODBYE",text_dir); - if(fexist(str)) { - sprintf(tmp2,"%sGOODBYE",temp_dir); - mv(str,tmp2,1); } - sprintf(str,"%sQWK\\BLT-*.*",text_dir); - i=findfirst(str,&ff,0); - while(!i) { /* Copy BLT-*.* files */ - padfname(ff.ff_name,str); - if(isdigit(str[4]) && isdigit(str[9])) { - sprintf(str,"%sQWK\\%s",text_dir,ff.ff_name); - sprintf(tmp2,"%s%s",temp_dir,ff.ff_name); - mv(str,tmp2,1); } - i=findnext(&ff); } } - -if(prepack) { - for(i=1;i<=sys_nodes;i++) { - getnodedat(i,&node,0); - if((node.status==NODE_INUSE || node.status==NODE_QUIET - || node.status==NODE_LOGON) && node.useron==useron.number) - break; } - if(i<=sys_nodes) /* Don't pre-pack with user online */ - return(0); } - -/*******************/ -/* Compress Packet */ -/*******************/ -sprintf(tmp2,"%s*.*",temp_dir); -i=external(cmdstr(temp_cmd(),packet,tmp2,NULL),EX_OUTL|EX_OUTR); -if(!fexist(packet)) { - bputs(text[QWKCompressionFailed]); - if(i) - errormsg(WHERE,ERR_EXEC,cmdstr(temp_cmd(),packet,tmp2,NULL),i); - else - errorlog("Couldn't compress QWK packet"); - return(0); } - -if(prepack) /* Early return if pre-packing */ - return(1); - -l=flength(packet); -sprintf(str,"%s.QWK",sys_id); -bprintf(text[FiFilename],str); -bprintf(text[FiFileSize],ultoac(l,tmp)); -if(l>0L && cur_cps) - i=l/(ulong)cur_cps; -else - i=0; -bprintf(text[FiTransferTime],sectostr(i,tmp)); -CRLF; -if(!(useron.exempt&FLAG('T')) && i>timeleft) { - bputs(text[NotEnoughTimeToDl]); - return(0); } - -if(useron.rest&FLAG('Q')) { - sprintf(str,"%s.QWK",sys_id); - sprintf(tmp,"%s*.*",temp_dir); - i=findfirst(tmp,&ff,0); - while(!i) { - if(stricmp(str,ff.ff_name)) { - sprintf(tmp,"%s%s",temp_dir,ff.ff_name); - remove(tmp); } - i=findnext(&ff); } } - -return(1); -} diff --git a/src/sbbs2/pack_rep.c b/src/sbbs2/pack_rep.c deleted file mode 100644 index 6a9cdaaf97..0000000000 --- a/src/sbbs2/pack_rep.c +++ /dev/null @@ -1,245 +0,0 @@ -#line 1 "PACK_REP.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "post.h" -#include "qwk.h" - -/****************************************************************************/ -/* Creates an REP packet for upload to QWK hub 'hubnum'. */ -/* Returns 1 if successful, 0 if not. */ -/****************************************************************************/ -char pack_rep(uint hubnum) -{ - uchar str[256],tmp2[256],ch,*p; - uchar HUGE16 *qwkbuf; - int file,mode; - uint i,j,k,n; - long l,size,msgcnt,submsgs,mailmsgs,packedmail,netfiles=0,deleted; - ulong last,ptr,posts,msgs; - post_t HUGE16 *post; - mail_t *mail; - struct ffblk ff; - FILE *rep; - smbmsg_t msg; - -msgcnt=0L; -delfiles(temp_dir,"*.*"); -sprintf(str,"%s%s.REP",data_dir,qhub[hubnum]->id); -if(fexist(str)) - external(cmdstr(qhub[hubnum]->unpack,str,"*.*",NULL),EX_OUTL); -/*************************************************/ -/* Create SYSID.MSG, write header and leave open */ -/*************************************************/ -sprintf(str,"%s%s.MSG",temp_dir,qhub[hubnum]->id); -if((rep=fnopen(&file,str,O_CREAT|O_WRONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY); - return(0); } -if(!filelength(file)) { /* New REP packet */ - sprintf(str,"%-128s",qhub[hubnum]->id); /* So write header */ - fwrite(str,128,1,rep); } -fseek(rep,0L,SEEK_END); -/*********************/ -/* Pack new messages */ -/*********************/ -console|=CON_L_ECHO; - -sprintf(smb.file,"%sMAIL",data_dir); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - fclose(rep); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } - -/***********************/ -/* Pack E-mail, if any */ -/***********************/ -qwkmail_time=time(NULL); -mailmsgs=loadmail(&mail,0,MAIL_YOUR,LM_QWK); -packedmail=0; -if(mailmsgs) { - bputs(text[QWKPackingEmail]); - for(l=0;l<mailmsgs;l++) { - bprintf("\b\b\b\b\b%-5lu",l+1); - - msg.idx.offset=mail[l].offset; - if(!loadmsg(&msg,mail[l].number)) - continue; - - sprintf(str,"%s/",qhub[hubnum]->id); - if(msg.to_net.type!=NET_QWK - || (strcmp(msg.to_net.addr,qhub[hubnum]->id) - && strncmp(msg.to_net.addr,str,strlen(str)))) { - smb_unlockmsghdr(&smb,&msg); - smb_freemsgmem(&msg); - continue; } - - msgtoqwk(msg,rep,TO_QNET|REP|A_LEAVE,INVALID_SUB,0); - packedmail++; - smb_unlockmsghdr(&smb,&msg); - smb_freemsgmem(&msg); } - bprintf(text[QWKPackedEmail],packedmail); } -smb_close(&smb); /* Close the e-mail */ -if(mailmsgs) - FREE(mail); - -useron.number=1; -getuserdat(&useron); -for(i=0;i<qhub[hubnum]->subs;i++) { - j=qhub[hubnum]->sub[i]; /* j now equals the real sub num */ - msgs=getlastmsg(j,&last,0); - lncntr=0; /* defeat pause */ - if(!msgs || last<=sub[j]->ptr) { - if(sub[j]->ptr>last) { - sub[j]->ptr=last; - sub[j]->last=last; } - bprintf(text[NScanStatusFmt] - ,grp[sub[j]->grp]->sname - ,sub[j]->lname,0L,msgs); - continue; } - - sprintf(smb.file,"%s%s" - ,sub[j]->data_dir,sub[j]->code); - smb.retry_time=smb_retry_time; - if((k=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,k); - continue; } - - post=loadposts(&posts,j,sub[j]->ptr,LP_BYSELF|LP_OTHERS|LP_PRIVATE|LP_REP); - bprintf(text[NScanStatusFmt] - ,grp[sub[j]->grp]->sname - ,sub[j]->lname,posts,msgs); - if(!posts) { /* no new messages */ - smb_close(&smb); - continue; } - - sub[j]->ptr=last; /* set pointer */ - bputs(text[QWKPackingSubboard]); /* ptr to last msg */ - submsgs=0; - for(l=0;l<posts;l++) { - bprintf("\b\b\b\b\b%-5lu",l+1); - - msg.idx.offset=post[l].offset; - if(!loadmsg(&msg,post[l].number)) - continue; - - if(msg.from_net.type && msg.from_net.type!=NET_QWK && - !(sub[j]->misc&SUB_GATE)) { - smb_freemsgmem(&msg); - smb_unlockmsghdr(&smb,&msg); - continue; } - - if(!strncmpi(msg.subj,"NE:",3) || (msg.from_net.type==NET_QWK && - route_circ(msg.from_net.addr,qhub[hubnum]->id))) { - smb_freemsgmem(&msg); - smb_unlockmsghdr(&smb,&msg); - continue; } - - mode=qhub[hubnum]->mode[i]|TO_QNET|REP; - if(mode&A_LEAVE) mode|=(VIA|TZ); - if(msg.from_net.type!=NET_QWK) - mode|=TAGLINE; - - msgtoqwk(msg,rep,mode,j,qhub[hubnum]->conf[i]); - - smb_freemsgmem(&msg); - smb_unlockmsghdr(&smb,&msg); - msgcnt++; - submsgs++; } - bprintf(text[QWKPackedSubboard],submsgs,msgcnt); - LFREE(post); - smb_close(&smb); } - -fclose(rep); /* close MESSAGE.DAT */ -CRLF; - /* Look for extra files to send out */ -sprintf(str,"%sQNET\\%s.OUT\\*.*",data_dir,qhub[hubnum]->id); -i=findfirst(str,&ff,0); -while(!i) { - sprintf(str,"%sQNET\\%s.OUT\\%s",data_dir,qhub[hubnum]->id,ff.ff_name); - sprintf(tmp2,"%s%s",temp_dir,ff.ff_name); - bprintf(text[RetrievingFile],str); - if(!mv(str,tmp2,1)) - netfiles++; - i=findnext(&ff); } -if(netfiles) - CRLF; - -if(!msgcnt && !netfiles && !packedmail) { - bputs(text[QWKNoNewMessages]); - return(0); } - -/*******************/ -/* Compress Packet */ -/*******************/ -sprintf(str,"%s%s.REP",data_dir,qhub[hubnum]->id); -sprintf(tmp2,"%s*.*",temp_dir); -i=external(cmdstr(qhub[hubnum]->pack,str,tmp2,NULL),EX_OUTL); -if(!fexist(str)) { - bputs(text[QWKCompressionFailed]); - if(i) - errormsg(WHERE,ERR_EXEC,cmdstr(qhub[hubnum]->pack,str,tmp2,NULL),i); - else - errorlog("Couldn't compress REP packet"); - return(0); } -sprintf(str,"%sQNET\\%s.OUT\\",data_dir,qhub[hubnum]->id); -delfiles(str,"*.*"); - -if(packedmail) { /* Delete NetMail */ - sprintf(smb.file,"%sMAIL",data_dir); - smb.retry_time=smb_retry_time; - if((i=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(1); } - - mailmsgs=loadmail(&mail,0,MAIL_YOUR,LM_QWK); - - if((i=smb_locksmbhdr(&smb))!=0) { /* Lock the base, so nobody */ - if(mailmsgs) - FREE(mail); - smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,i); /* messes with the index */ - return(1); } - - if((i=smb_getstatus(&smb))!=0) { - if(mailmsgs) - FREE(mail); - smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,i); - return(1); } - - deleted=0; - /* Mark as READ and DELETE */ - for(l=0;l<mailmsgs;l++) { - if(mail[l].time>qwkmail_time) - continue; - msg.idx.offset=0; - if(!loadmsg(&msg,mail[l].number)) - continue; - - sprintf(str,"%s/",qhub[hubnum]->id); - if(msg.to_net.type!=NET_QWK - || (strcmp(msg.to_net.addr,qhub[hubnum]->id) - && strncmp(msg.to_net.addr,str,strlen(str)))) { - smb_unlockmsghdr(&smb,&msg); - smb_freemsgmem(&msg); - continue; } - - msg.hdr.attr|=MSG_DELETE; - msg.idx.attr=msg.hdr.attr; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - else - deleted++; - smb_unlockmsghdr(&smb,&msg); - smb_freemsgmem(&msg); } - - if(deleted && sys_misc&SM_DELEMAIL) - delmail(0,MAIL_YOUR); - smb_close(&smb); - if(mailmsgs) - FREE(mail); } - -return(1); -} diff --git a/src/sbbs2/post.h b/src/sbbs2/post.h deleted file mode 100644 index 060ec942af..0000000000 --- a/src/sbbs2/post.h +++ /dev/null @@ -1,23 +0,0 @@ -/* POST.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "gen_defs.h" - - -typedef struct { /* Message data */ - ulong offset, /* Offset to header (in bytes) */ - number; /* Number of message */ - ushort to, /* CRC-16 of to username */ - from, /* CRC-16 of from username */ - subj; /* CRC-16 of subject */ - } post_t; - -#ifdef SBBS -post_t HUGE16 *loadposts(ulong *posts, uint subnum, ulong ptr, uint mode); -#else -ulong loadposts(post_t HUGE16 **post, uint subnum, ulong ptr, uint mode); -#endif -int searchposts(uint subnum, post_t HUGE16 *post, long start, long msgs - ,char *search); -void showposts_toyou(post_t HUGE16 *post, ulong start, ulong posts); diff --git a/src/sbbs2/postmsg.c b/src/sbbs2/postmsg.c deleted file mode 100644 index 4034d0a1f0..0000000000 --- a/src/sbbs2/postmsg.c +++ /dev/null @@ -1,308 +0,0 @@ -#line 1 "POSTMSG.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -/****************************************************************************/ -/* Posts a message on subboard number sub, with 'top' as top of message. */ -/* Returns 1 if posted, 0 if not. */ -/****************************************************************************/ -char postmsg(uint subnum, smbmsg_t *remsg, int wm_mode) -{ - char str[256],touser[256],title[LEN_TITLE+1],buf[SDT_BLOCK_LEN] - ,top[256],c; - ushort xlat,msgattr; - int i,j,n,x,file,storage; - ulong l,length,offset,crc=0xffffffff; - FILE *instream; - smbmsg_t msg,tmpmsg; - -if(remsg) { - sprintf(title,"%.*s",LEN_TITLE,remsg->subj); - if(sub[subnum]->misc&SUB_INET) // All Internet posts to "All" 05/20/97 - touser[0]=0; - else if(remsg->hdr.attr&MSG_ANONYMOUS) - strcpy(touser,text[Anonymous]); - else - strcpy(touser,remsg->from); - msgattr=(remsg->hdr.attr&MSG_PRIVATE); - sprintf(top,text[RegardingByTo],title,touser,remsg->to - ,timestr((time_t *)&remsg->hdr.when_written.time) - ,zonestr(remsg->hdr.when_written.zone)); } -else { - title[0]=0; - touser[0]=0; - top[0]=0; - msgattr=0; } - -if(useron.rest&FLAG('P')) { - bputs(text[R_Post]); - return(0); } - -if((sub[subnum]->misc&(SUB_QNET|SUB_FIDO|SUB_PNET|SUB_INET)) - && (useron.rest&FLAG('N'))) { - bputs(text[CantPostOnSub]); - return(0); } - -if(useron.ptoday>=level_postsperday[useron.level]) { - bputs(text[TooManyPostsToday]); - return(0); } - -bprintf(text[Posting],grp[sub[subnum]->grp]->sname,sub[subnum]->lname); -action=NODE_PMSG; -nodesync(); - -if(!(msgattr&MSG_PRIVATE) && (sub[subnum]->misc&SUB_PONLY - || (sub[subnum]->misc&SUB_PRIV && !noyes(text[PrivatePostQ])))) - msgattr|=MSG_PRIVATE; - -if(sys_status&SS_ABORT) - return(0); - -if(!(sub[subnum]->misc&SUB_INET) // Prompt for TO: user - && (sub[subnum]->misc&SUB_TOUSER || msgattr&MSG_PRIVATE || touser[0])) { - if(!touser[0] && !(msgattr&MSG_PRIVATE)) - strcpy(touser,"All"); - bputs(text[PostTo]); - i=LEN_ALIAS; - if(sub[subnum]->misc&(SUB_PNET|SUB_INET)) - i=60; - if(sub[subnum]->misc&SUB_FIDO) - i=35; - if(sub[subnum]->misc&SUB_QNET) - i=25; - getstr(touser,i,K_UPRLWR|K_LINE|K_EDIT|K_AUTODEL); - if(stricmp(touser,"ALL") - && !(sub[subnum]->misc&(SUB_PNET|SUB_FIDO|SUB_QNET|SUB_INET|SUB_ANON))) { - if(sub[subnum]->misc&SUB_NAME) { - if(!userdatdupe(useron.number,U_NAME,LEN_NAME,touser,0)) { - bputs(text[UnknownUser]); - return(0); } } - else { - if((i=finduser(touser))==0) - return(0); - username(i,touser); } } - if(sys_status&SS_ABORT) - return(0); } - -if(!touser[0]) - strcpy(touser,"All"); // Default to ALL - -if(!stricmp(touser,"SYSOP") && !SYSOP) // Change SYSOP to user #1 - username(1,touser); - -if(msgattr&MSG_PRIVATE && !stricmp(touser,"ALL")) { - bputs(text[NoToUser]); - return(0); } -if(msgattr&MSG_PRIVATE) - wm_mode|=WM_PRIVATE; - -if(sub[subnum]->misc&SUB_AONLY - || (sub[subnum]->misc&SUB_ANON && useron.exempt&FLAG('A') - && !noyes(text[AnonymousQ]))) - msgattr|=MSG_ANONYMOUS; - -if(sub[subnum]->mod_ar[0] && chk_ar(sub[subnum]->mod_ar,useron)) - msgattr|=MSG_MODERATED; - -if(sub[subnum]->misc&SUB_SYSPERM && sub_op(subnum)) - msgattr|=MSG_PERMANENT; - -if(msgattr&MSG_PRIVATE) - bputs(text[PostingPrivately]); - -if(msgattr&MSG_ANONYMOUS) - bputs(text[PostingAnonymously]); - -if(sub[subnum]->misc&SUB_NAME) - bputs(text[UsingRealName]); - -sprintf(str,"%sINPUT.MSG",node_dir); -if(!writemsg(str,top,title,wm_mode,subnum,touser)) { - bputs(text[Aborted]); - return(0); } - -bputs(text[WritingIndx]); - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,sub[subnum]->code,i); - return(0); } - -sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } - -if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ - smb.status.max_crcs=sub[subnum]->maxcrcs; - smb.status.max_msgs=sub[subnum]->maxmsgs; - smb.status.max_age=sub[subnum]->maxage; - smb.status.attr=sub[subnum]->misc&SUB_HYPER ? SMB_HYPERALLOC : 0; - if((i=smb_create(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_CREATE,smb.file,i); - return(0); } } - -if((i=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return(0); } - -if((i=smb_getstatus(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_READ,smb.file,i); - return(0); } - -length=flength(str)+2; /* +2 for translation string */ - -if(length&0xfff00000UL) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LEN,str,length); - return(0); } - -if(smb.status.attr&SMB_HYPERALLOC) { - offset=smb_hallocdat(&smb); - storage=SMB_HYPERALLOC; } -else { - if((i=smb_open_da(&smb))!=0) { - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } - if(sub[subnum]->misc&SUB_FAST) { - offset=smb_fallocdat(&smb,length,1); - storage=SMB_FASTALLOC; } - else { - offset=smb_allocdat(&smb,length,1); - storage=SMB_SELFPACK; } - smb_close_da(&smb); } - -if((file=open(str,O_RDONLY|O_BINARY))==-1 - || (instream=fdopen(file,"rb"))==NULL) { - smb_freemsgdat(&smb,offset,length,1); - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,str,O_RDONLY|O_BINARY); - return(0); } - -setvbuf(instream,NULL,_IOFBF,2*1024); -fseek(smb.sdt_fp,offset,SEEK_SET); -xlat=XLAT_NONE; -fwrite(&xlat,2,1,smb.sdt_fp); -x=SDT_BLOCK_LEN-2; /* Don't read/write more than 255 */ -while(!feof(instream)) { - memset(buf,0,x); - j=fread(buf,1,x,instream); - if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR) - buf[j-1]=buf[j-2]=0; /* Convert to NULL */ - if(sub[subnum]->maxcrcs) { - for(i=0;i<j;i++) - crc=ucrc32(buf[i],crc); } - fwrite(buf,j,1,smb.sdt_fp); - x=SDT_BLOCK_LEN; } -fflush(smb.sdt_fp); -fclose(instream); -crc=~crc; - -memset(&msg,0,sizeof(smbmsg_t)); -memcpy(msg.hdr.id,"SHD\x1a",4); -msg.hdr.version=smb_ver(); -msg.hdr.attr=msg.idx.attr=msgattr; -msg.hdr.when_written.time=msg.hdr.when_imported.time=time(NULL); -msg.hdr.when_written.zone=msg.hdr.when_imported.zone=sys_timezone; -if(remsg) { - msg.hdr.thread_orig=remsg->hdr.number; - if(!remsg->hdr.thread_first) { - remsg->hdr.thread_first=smb.status.last_msg+1; - if((i=smb_lockmsghdr(&smb,remsg))!=0) - errormsg(WHERE,ERR_LOCK,smb.file,i); - else { - i=smb_putmsghdr(&smb,remsg); - smb_unlockmsghdr(&smb,remsg); - if(i) - errormsg(WHERE,ERR_WRITE,smb.file,i); } } - else { - l=remsg->hdr.thread_first; - while(1) { - tmpmsg.idx.offset=0; - if(!loadmsg(&tmpmsg,l)) - break; - if(tmpmsg.hdr.thread_next && tmpmsg.hdr.thread_next!=l) { - l=tmpmsg.hdr.thread_next; - smb_unlockmsghdr(&smb,&tmpmsg); - smb_freemsgmem(&tmpmsg); - continue; } - tmpmsg.hdr.thread_next=smb.status.last_msg+1; - if((i=smb_putmsghdr(&smb,&tmpmsg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - smb_unlockmsghdr(&smb,&tmpmsg); - smb_freemsgmem(&tmpmsg); - break; } } } - - -if(sub[subnum]->maxcrcs) { - i=smb_addcrc(&smb,crc); - if(i) { - smb_freemsgdat(&smb,offset,length,1); - smb_unlocksmbhdr(&smb); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - bputs("\1r\1h\1iDuplicate message!\r\n"); - return(0); } } - -msg.hdr.offset=offset; - -smb_hfield(&msg,RECIPIENT,strlen(touser),touser); -strlwr(touser); -msg.idx.to=crc16(touser); - -strcpy(str,sub[subnum]->misc&SUB_NAME ? useron.name : useron.alias); -smb_hfield(&msg,SENDER,strlen(str),str); -strlwr(str); -msg.idx.from=crc16(str); - -sprintf(str,"%u",useron.number); -smb_hfield(&msg,SENDEREXT,strlen(str),str); - -smb_hfield(&msg,SUBJECT,strlen(title),title); -strcpy(str,title); -strlwr(str); -remove_re(str); -msg.idx.subj=crc16(str); - -smb_dfield(&msg,TEXT_BODY,length); - -smb_unlocksmbhdr(&smb); -i=smb_addmsghdr(&smb,&msg,storage); -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); - -smb_freemsgmem(&msg); -if(i) { - smb_freemsgdat(&smb,offset,length,1); - errormsg(WHERE,ERR_WRITE,smb.file,i); - return(0); } - -useron.ptoday++; -useron.posts++; -logon_posts++; -putuserrec(useron.number,U_POSTS,5,itoa(useron.posts,str,10)); -putuserrec(useron.number,U_PTODAY,5,itoa(useron.ptoday,str,10)); -bprintf(text[Posted],grp[sub[subnum]->grp]->sname - ,sub[subnum]->lname); -sprintf(str,"Posted on %s %s",grp[sub[subnum]->grp]->sname,sub[subnum]->lname); -logline("P+",str); -if(sub[subnum]->misc&SUB_FIDO && sub[subnum]->echomail_sem[0]) /* semaphore */ - if((file=nopen(sub[subnum]->echomail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(file); -return(1); -} diff --git a/src/sbbs2/putmsg.c b/src/sbbs2/putmsg.c deleted file mode 100644 index eae2dc7313..0000000000 --- a/src/sbbs2/putmsg.c +++ /dev/null @@ -1,195 +0,0 @@ -#line 1 "PUTMSG.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -/****************************************************************************/ -/* Outputs a NULL terminated string locally and remotely (if applicable) */ -/* checking for message aborts, pauses, ANSI escape and ^A sequences. */ -/* Changes local text attributes if necessary. Max length of str is 4 gig */ -/* Returns the last char of the buffer access.. 0 if not aborted. */ -/* If P_SAVEATR bit is set in mode, the attributes set by the message */ -/* will be the current attributes after the message is displayed, otherwise */ -/* the attributes prior to diplaying the message are always restored. */ -/* Ignores Ctrl-Z's */ -/****************************************************************************/ -char putmsg(char HUGE16 *str, int mode) -{ - uchar tmpatr,tmp2[256],tmp3[128],*p,exatr=0; - int orgcon=console,i; - ulong l=0,sys_status_sav=sys_status; - -tmpatr=curatr; /* was lclatr(-1) */ -if(!(mode&P_SAVEATR)) - attr(LIGHTGRAY); -while(str[l] && (mode&P_NOABORT || !msgabort()) && online) { - if(str[l]==1) { /* Ctrl-Ax sequence */ - if(str[l+1]=='"' && !(sys_status&SS_NEST_PF)) { /* Quote a file */ - l+=2; - i=0; - while(i<12 && isprint(str[l]) && str[l]!='\\' && str[l]!='/') - tmp2[i++]=str[l++]; - tmp2[i]=0; - sys_status|=SS_NEST_PF; /* keep it only one message deep! */ - sprintf(tmp3,"%s%s",text_dir,tmp2); - printfile(tmp3,0); - sys_status&=~SS_NEST_PF; } - else if(toupper(str[l+1])=='Z') /* Ctrl-AZ==EOF */ - break; - else { - ctrl_a(str[l+1]); - l+=2; } } - else if((str[l]=='`' || str[l]=='�') && str[l+1]=='[') { - outchar(ESC); /* Convert `[ and �[ to ESC[ */ - l++; } - else if(sys_misc&SM_PCBOARD && str[l]=='@' && str[l+1]=='X' - && isxdigit(str[l+2]) && isxdigit(str[l+3])) { - sprintf(tmp2,"%.2s",str+l+2); - attr(ahtoul(tmp2)); - exatr=1; - l+=4; } - else if(sys_misc&SM_WILDCAT && str[l]=='@' && str[l+3]=='@' - && isxdigit(str[l+1]) && isxdigit(str[l+2])) { - sprintf(tmp2,"%.2s",str+l+1); - attr(ahtoul(tmp2)); - // exatr=1; - l+=4; } - else if(sys_misc&SM_RENEGADE && str[l]=='|' && isdigit(str[l+1]) - && !(useron.misc&(RIP|WIP))) { - sprintf(tmp2,"%.2s",str+l+1); - i=atoi(tmp2); - if(i>=16) { /* setting background */ - i-=16; - i<<=4; - i|=(curatr&0x0f); } /* leave foreground alone */ - else - i|=(curatr&0xf0); /* leave background alone */ - attr(i); - exatr=1; - l+=2; /* Skip |x */ - if(isdigit(str[l])) - l++; } /* Skip second digit if it exists */ - else if(sys_misc&SM_CELERITY && str[l]=='|' && isalpha(str[l+1]) - && !(useron.misc&(RIP|WIP))) { - switch(str[l+1]) { - case 'k': - attr((curatr&0xf0)|BLACK); - break; - case 'b': - attr((curatr&0xf0)|BLUE); - break; - case 'g': - attr((curatr&0xf0)|GREEN); - break; - case 'c': - attr((curatr&0xf0)|CYAN); - break; - case 'r': - attr((curatr&0xf0)|RED); - break; - case 'm': - attr((curatr&0xf0)|MAGENTA); - break; - case 'y': - attr((curatr&0xf0)|YELLOW); - break; - case 'w': - attr((curatr&0xf0)|LIGHTGRAY); - break; - case 'd': - attr((curatr&0xf0)|BLACK|HIGH); - break; - case 'B': - attr((curatr&0xf0)|BLUE|HIGH); - break; - case 'G': - attr((curatr&0xf0)|GREEN|HIGH); - break; - case 'C': - attr((curatr&0xf0)|CYAN|HIGH); - break; - case 'R': - attr((curatr&0xf0)|RED|HIGH); - break; - case 'M': - attr((curatr&0xf0)|MAGENTA|HIGH); - break; - case 'Y': /* Yellow */ - attr((curatr&0xf0)|YELLOW|HIGH); - break; - case 'W': - attr((curatr&0xf0)|LIGHTGRAY|HIGH); - break; - case 'S': /* swap foreground and background */ - attr((curatr&0x07)<<4); - break; } - exatr=1; - l+=2; /* Skip |x */ - } /* Skip second digit if it exists */ - else if(sys_misc&SM_WWIV && str[l]==3 && isdigit(str[l+1])) { - exatr=1; - switch(str[l+1]) { - default: - attr(LIGHTGRAY); - break; - case '1': - attr(CYAN|HIGH); - break; - case '2': - attr(BROWN|HIGH); - break; - case '3': - attr(MAGENTA); - break; - case '4': - attr(LIGHTGRAY|HIGH|(BLUE<<4)); - break; - case '5': - attr(GREEN); - break; - case '6': - attr(RED|HIGH|BLINK); - break; - case '7': - attr(BLUE|HIGH); - break; - case '8': - attr(BLUE); - break; - case '9': - attr(CYAN); - break; } - l+=2; } - else { - if(exatr && str[l]==LF) /* clear at newline for extra attr codes */ - attr(LIGHTGRAY); - if(lclaes()) { - if(str[l]=='A' || str[l]=='B' || str[l]=='H' || str[l]=='J' - || str[l]=='f' || str[l]=='u') /* ANSI anim */ - lncntr=0; /* so defeat pause */ - if(str[l]=='"') { - l++; /* don't pass on keyboard reassignment */ - continue; } } - if(str[l]=='!' && str[l+1]=='|' && useron.misc&(RIP|WIP)) /* RIP */ - lncntr=0; /* so defeat pause */ - if(str[l]==ESC && str[l+1]=='$') /* WIP command */ - lncntr=0; - if(str[l]=='@' && !(mode&P_NOATCODES)) { - i=atcodes((char *)str+l); /* returns 0 if not valid @ code */ - l+=i; /* i is length of code string */ - if(i) /* if valid string, go to top */ - continue; } - if(str[l]!=26) - outchar(str[l]); - l++; } } -//curatr=lclatr(-1); 01/29/96 -if(!(mode&P_SAVEATR)) { - console=orgcon; - attr(tmpatr); } - -/* Restore original settings of Forced Pause On/Off */ -sys_status&=~(SS_PAUSEOFF|SS_PAUSEON); -sys_status|=(sys_status_sav&(SS_PAUSEOFF|SS_PAUSEON)); -return(str[l]); -} diff --git a/src/sbbs2/putnode.c b/src/sbbs2/putnode.c deleted file mode 100644 index 6e9a5a6f56..0000000000 --- a/src/sbbs2/putnode.c +++ /dev/null @@ -1,135 +0,0 @@ -#line 1 "PUTNODE.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -/****************************************************************************/ -/* Write the data from the structure 'node' into NODE.DAB */ -/* getnodedat(num,&node,1); must have been called before calling this func */ -/* NOTE: ------^ the indicates the node record has been locked */ -/****************************************************************************/ -void putnodedat(uint number, node_t node) -{ - char str[256],firston[25]; - -if(!(sys_status&SS_NODEDAB)) - return; -if(!number || number>sys_nodes) { - errormsg(WHERE,ERR_CHK,"node number",number); - return; } -if(number==node_num) { - if((node.status==NODE_INUSE || node.status==NODE_QUIET) - && text[NodeActionMain+node.action][0]) { - node.misc|=NODE_EXT; - memset(str,0,128); - sprintf(str,text[NodeActionMain+node.action] - ,useron.alias - ,useron.level - ,getage(useron.birth) - ,useron.sex - ,useron.comp - ,useron.note - ,unixtodstr(useron.firston,firston) - ,node.aux&0xff - ,node.connection - ); - putnodeext(number,str); } - else - node.misc&=~NODE_EXT; } -number--; /* make zero based */ -lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); -if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) { - unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); - errormsg(WHERE,ERR_WRITE,"nodefile",number+1); - return; } -unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); -} - -/****************************************************************************/ -/* Creates a short message for node 'num' than contains 'strin' */ -/****************************************************************************/ -void putnmsg(int num, char *strin) -{ - char str[256]; - int file,i; - node_t node; - -sprintf(str,"%sMSGS\\N%3.3u.MSG",data_dir,num); -if((file=nopen(str,O_WRONLY|O_CREAT))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT); - return; } -lseek(file,0L,SEEK_END); // Instead of opening with O_APPEND -i=strlen(strin); -if(write(file,strin,i)!=i) { - close(file); - errormsg(WHERE,ERR_WRITE,str,i); - return; } -close(file); -getnodedat(num,&node,0); -if((node.status==NODE_INUSE || node.status==NODE_QUIET) - && !(node.misc&NODE_NMSG)) { - getnodedat(num,&node,1); - node.misc|=NODE_NMSG; - putnodedat(num,node); } -} - -void putnodeext(uint number, char *ext) -{ - char str[256]; - int count=0; - -if(!(sys_status&SS_NODEDAB)) - return; -if(!number || number>sys_nodes) { - errormsg(WHERE,ERR_CHK,"node number",number); - return; } -number--; /* make zero based */ -while(count<LOOP_NODEDAB) { - if(count>10) - mswait(55); - lseek(node_ext,(long)number*128L,SEEK_SET); - if(lock(node_ext,(long)number*128L,128)==-1) { - count++; - continue; } - if(write(node_ext,ext,128)==128) - break; - count++; } -unlock(node_ext,(long)number*128L,128); -if(count>(LOOP_NODEDAB/2) && count!=LOOP_NODEDAB) { - sprintf(str,"NODE.EXB COLLISION - Count: %d",count); - logline("!!",str); } -if(count==LOOP_NODEDAB) { - errormsg(WHERE,ERR_WRITE,"NODE.EXB",number+1); - return; } -} - -/****************************************************************************/ -/* Creates a short message for 'usernumber' than contains 'strin' */ -/****************************************************************************/ -void putsmsg(int usernumber, char *strin) -{ - char str[256]; - int file,i; - node_t node; - -sprintf(str,"%sMSGS\\%4.4u.MSG",data_dir,usernumber); -if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); - return; } -i=strlen(strin); -if(write(file,strin,i)!=i) { - close(file); - errormsg(WHERE,ERR_WRITE,str,i); - return; } -close(file); -for(i=1;i<=sys_nodes;i++) { /* flag node if user on that msg waiting */ - getnodedat(i,&node,0); - if(node.useron==usernumber - && (node.status==NODE_INUSE || node.status==NODE_QUIET) - && !(node.misc&NODE_MSGW)) { - getnodedat(i,&node,1); - node.misc|=NODE_MSGW; - putnodedat(i,node); } } -} - diff --git a/src/sbbs2/qwk.c b/src/sbbs2/qwk.c deleted file mode 100644 index d5e598e93f..0000000000 --- a/src/sbbs2/qwk.c +++ /dev/null @@ -1,942 +0,0 @@ -#line 1 "QWK.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/****************************************************/ -/* Functions that pertain solely to the QWK packets */ -/****************************************************/ - -#include "sbbs.h" -#include "etext.h" -#include "post.h" -#include "qwk.h" - -time_t qwkmail_time; - -/****************************************************************************/ -/* Removes ctrl-a codes from the string 'instr' */ -/****************************************************************************/ -void remove_ctrl_a(char *instr) -{ - char str[512]; - uint i,j,k; - -j=strlen(instr); -for(k=i=0;i<j;i++) { - if(instr[i]==1) - i++; - else str[k++]=instr[i]; } -str[k]=0; -strcpy(instr,str); -} - - -/****************************************************************************/ -/* Converts a long to an msbin real number. required for QWK NDX file */ -/****************************************************************************/ -float ltomsbin(long val) -{ - converter t; - int sign, exp; /* sign and exponent */ - -t.f[0]=(float)val; -sign=t.uc[3]/0x80; -exp=((t.ui[1]>>7)-0x7f+0x81)&0xff; -t.ui[1]=(t.ui[1]&0x7f)|(sign<<7)|(exp<<8); -return(t.f[0]); -} - -int route_circ(char *via, char *id) -{ - char str[256],*p,*sp; - -strcpy(str,via); -p=str; -while(*p && *p<=SP) - p++; -while(*p) { - sp=strchr(p,'/'); - if(sp) *sp=0; - if(!stricmp(p,id)) - return(1); - if(!sp) - break; - p=sp+1; } -return(0); -} - -int qwk_route(char *inaddr, char *fulladdr) -{ - char node[10],str[256],*p; - int file,i; - FILE *stream; - -fulladdr[0]=0; -sprintf(str,"%.255s",inaddr); -p=strrchr(str,'/'); -if(p) p++; -else p=str; -sprintf(node,"%.8s",p); /* node = destination node */ -truncsp(node); - -for(i=0;i<total_qhubs;i++) /* Check if destination is our hub */ - if(!stricmp(qhub[i]->id,node)) - break; -if(i<total_qhubs) { - strcpy(fulladdr,node); - return(0); } - -i=matchuser(node); /* Check if destination is a node */ -if(i) { - getuserrec(i,U_REST,8,str); - if(ahtoul(str)&FLAG('Q')) { - strcpy(fulladdr,node); - return(i); } } - -sprintf(node,"%.8s",inaddr); /* node = next hop */ -p=strchr(node,'/'); -if(p) *p=0; -truncsp(node); - -if(strchr(inaddr,'/')) { /* Multiple hops */ - - for(i=0;i<total_qhubs;i++) /* Check if next hop is our hub */ - if(!stricmp(qhub[i]->id,node)) - break; - if(i<total_qhubs) { - strcpy(fulladdr,inaddr); - return(0); } - - i=matchuser(node); /* Check if next hop is a node */ - if(i) { - getuserrec(i,U_REST,8,str); - if(ahtoul(str)&FLAG('Q')) { - strcpy(fulladdr,inaddr); - return(i); } } } - -p=strchr(node,SP); -if(p) *p=0; - -sprintf(str,"%sQNET\\ROUTE.DAT",data_dir); -if((stream=fnopen(&file,str,O_RDONLY))==NULL) - return(0); - -strcat(node,":"); -fulladdr[0]=0; -while(!feof(stream)) { - if(!fgets(str,256,stream)) - break; - if(!strnicmp(str+9,node,strlen(node))) { - fclose(stream); - truncsp(str); - sprintf(fulladdr,"%s/%s",str+9+strlen(node),inaddr); - break; } } - -fclose(stream); -if(!fulladdr[0]) /* First hop not found in ROUTE.DAT */ - return(0); - -sprintf(node,"%.8s",fulladdr); -p=strchr(node,'/'); -if(p) *p=0; -truncsp(node); - -for(i=0;i<total_qhubs;i++) /* Check if first hop is our hub */ - if(!stricmp(qhub[i]->id,node)) - break; -if(i<total_qhubs) - return(0); - -i=matchuser(node); /* Check if first hop is a node */ -if(i) { - getuserrec(i,U_REST,8,str); - if(ahtoul(str)&FLAG('Q')) - return(i); } -fulladdr[0]=0; -return(0); -} - - -/* Via is in format: NODE/NODE/... */ -void update_qwkroute(char *via) -{ - static uint total_nodes; - static char **qwk_node; - static char **qwk_path; - static time_t *qwk_time; - char str[256],*p,*tp,node[9]; - int i,file; - time_t t; - FILE *stream; - -if(via==NULL) { - if(!total_nodes) - return; - sprintf(str,"%sQNET\\ROUTE.DAT",data_dir); - if((stream=fnopen(&file,str,O_WRONLY|O_CREAT|O_TRUNC))!=NULL) { - t=time(NULL); - t-=(90L*24L*60L*60L); - for(i=0;i<total_nodes;i++) - if(qwk_time[i]>t) - fprintf(stream,"%s %s:%s\r\n" - ,unixtodstr(qwk_time[i],str),qwk_node[i],qwk_path[i]); - fclose(stream); } - else - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - for(i=0;i<total_nodes;i++) { - FREE(qwk_node[i]); - FREE(qwk_path[i]); } - if(qwk_node) { - FREE(qwk_node); - qwk_node=NULL; } - if(qwk_path) { - FREE(qwk_path); - qwk_path=NULL; } - if(qwk_time) { - FREE(qwk_time); - qwk_time=NULL; } - total_nodes=0; - return; } - -if(!total_nodes) { - sprintf(str,"%sQNET\\ROUTE.DAT",data_dir); - if((stream=fnopen(&file,str,O_RDONLY))!=NULL) { - while(!feof(stream)) { - if(!fgets(str,255,stream)) - break; - truncsp(str); - t=dstrtounix(str); - p=strchr(str,':'); - if(!p) continue; - *p=0; - sprintf(node,"%.8s",str+9); - tp=strchr(node,SP); /* change "node bbs:" to "node:" */ - if(tp) *tp=0; - for(i=0;i<total_nodes;i++) - if(!stricmp(qwk_node[i],node)) - break; - if(i<total_nodes && qwk_time[i]>t) - continue; - if(i==total_nodes) { - if((qwk_node=REALLOC(qwk_node,sizeof(char *)*(i+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,str,9*(i+1)); - break; } - if((qwk_path=REALLOC(qwk_path,sizeof(char *)*(i+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,str,128*(i+1)); - break; } - if((qwk_time=REALLOC(qwk_time,sizeof(time_t)*(i+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,str,sizeof(time_t)*(i+1)); - break; } - if((qwk_node[i]=MALLOC(9))==NULL) { - errormsg(WHERE,ERR_ALLOC,str,9); - break; } - if((qwk_path[i]=MALLOC(128))==NULL) { - errormsg(WHERE,ERR_ALLOC,str,128); - break; } - total_nodes++; } - strcpy(qwk_node[i],node); - p++; - while(*p && *p<=SP) p++; - sprintf(qwk_path[i],"%.127s",p); - qwk_time[i]=t; } - fclose(stream); } } - -strupr(via); -p=strchr(via,'/'); /* Skip uplink */ - -while(p && *p) { - p++; - sprintf(node,"%.8s",p); - tp=strchr(node,'/'); - if(tp) *tp=0; - tp=strchr(node,SP); /* no spaces allowed */ - if(tp) *tp=0; - truncsp(node); - for(i=0;i<total_nodes;i++) - if(!stricmp(qwk_node[i],node)) - break; - if(i==total_nodes) { /* Not in list */ - if((qwk_node=REALLOC(qwk_node,sizeof(char *)*(total_nodes+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,str,9*(total_nodes+1)); - break; } - if((qwk_path=REALLOC(qwk_path,sizeof(char *)*(total_nodes+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,str,128*(total_nodes+1)); - break; } - if((qwk_time=REALLOC(qwk_time,sizeof(time_t)*(total_nodes+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,str,sizeof(time_t)*(total_nodes+1)); - break; } - if((qwk_node[total_nodes]=MALLOC(9))==NULL) { - errormsg(WHERE,ERR_ALLOC,str,9); - break; } - if((qwk_path[total_nodes]=MALLOC(128))==NULL) { - errormsg(WHERE,ERR_ALLOC,str,128); - break; } - total_nodes++; } - sprintf(qwk_node[i],"%.8s",node); - sprintf(qwk_path[i],"%.*s",(uint)((p-1)-via),via); - qwk_time[i]=time(NULL); - p=strchr(p,'/'); } -} - -/****************************************************************************/ -/* Successful download of QWK packet */ -/****************************************************************************/ -void qwk_success(ulong msgcnt, char bi, char prepack) -{ - char str[128]; - int i; - ulong l,msgs,deleted=0; - mail_t *mail; - smbmsg_t msg; - -if(!prepack) { - logline("D-","Downloaded QWK packet"); - posts_read+=msgcnt; - - if(useron.rest&FLAG('Q')) { - sprintf(str,"%sQNET\\%.8s.OUT\\",data_dir,useron.alias); - delfiles(str,"*.*"); } - - sprintf(str,"%sFILE\\%04u.QWK",data_dir,useron.number); - remove(str); - - if(!bi) { - batch_download(-1); - delfiles(temp_dir,"*.*"); } } - -if(useron.rest&FLAG('Q')) - useron.qwk|=(QWK_EMAIL|QWK_ALLMAIL|QWK_DELMAIL); -if(useron.qwk&(QWK_EMAIL|QWK_ALLMAIL)) { - sprintf(smb.file,"%sMAIL",data_dir); - smb.retry_time=smb_retry_time; - if((i=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - return; } - - msgs=loadmail(&mail,useron.number,0 - ,useron.qwk&QWK_ALLMAIL ? LM_QWK : LM_UNREAD|LM_QWK); - - if((i=smb_locksmbhdr(&smb))!=0) { /* Lock the base, so nobody */ - if(msgs) - FREE(mail); - smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,i); /* messes with the index */ - return; } - - if((i=smb_getstatus(&smb))!=0) { - if(msgs) - FREE(mail); - smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,i); - return; } - - /* Mark as READ and DELETE */ - for(l=0;l<msgs;l++) { - if(mail[l].time>qwkmail_time) - continue; - msg.idx.offset=0; - if(!loadmsg(&msg,mail[l].number)) - continue; - if(!(msg.hdr.attr&MSG_READ)) { - if(thisnode.status==NODE_INUSE) - telluser(msg); - msg.hdr.attr|=MSG_READ; - msg.idx.attr=msg.hdr.attr; - smb_putmsg(&smb,&msg); } - if(!(msg.hdr.attr&MSG_PERMANENT) - && ((msg.hdr.attr&MSG_KILLREAD && msg.hdr.attr&MSG_READ) - || (useron.qwk&QWK_DELMAIL))) { - msg.hdr.attr|=MSG_DELETE; - msg.idx.attr=msg.hdr.attr; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - else - deleted++; } - smb_freemsgmem(&msg); - smb_unlockmsghdr(&smb,&msg); } - - if(deleted && sys_misc&SM_DELEMAIL) - delmail(useron.number,MAIL_YOUR); - smb_close(&smb); - if(msgs) - FREE(mail); } - -} - -/****************************************************************************/ -/* QWK mail packet section */ -/****************************************************************************/ -void qwk_sec() -{ - uchar str[256],tmp2[256],ch,bi=0 - ,*AttemptedToDownloadQWKpacket="Attempted to download QWK packet"; - int s; - uint i,j,k; - ulong msgcnt,l; - time_t *sav_ptr; - file_t fd; - -getusrdirs(); -fd.dir=total_dirs; -if((sav_ptr=(time_t *)MALLOC(sizeof(time_t)*total_subs))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(time_t)*total_subs); - return; } -for(i=0;i<total_subs;i++) - sav_ptr[i]=sub[i]->ptr; -for(i=0;i<total_prots;i++) - if(prot[i]->bicmd[0] && chk_ar(prot[i]->ar,useron)) - bi++; /* number of bidirectional protocols configured */ -if(useron.rest&FLAG('Q')) - getusrsubs(); -delfiles(temp_dir,"*.*"); -while(online) { - if((useron.misc&(WIP|RIP) || !(useron.misc&EXPERT)) - && !(useron.rest&FLAG('Q'))) - menu("QWK"); - action=NODE_TQWK; - ASYNC; - bputs(text[QWKPrompt]); - strcpy(str,"?UDCSPQ\r"); - if(bi) - strcat(str,"B"); - ch=getkeys(str,0); - if(ch>SP) - logch(ch,0); - if(sys_status&SS_ABORT || ch=='Q' || ch==CR) - break; - if(ch=='?') { - if((useron.misc&(WIP|RIP) || !(useron.misc&EXPERT)) - && !(useron.rest&FLAG('Q'))) - continue; - menu("QWK"); - continue; } - if(ch=='S') { - new_scan_cfg(SUB_NSCAN); - delfiles(temp_dir,"*.*"); - continue; } - if(ch=='P') { - new_scan_ptr_cfg(); - for(i=0;i<total_subs;i++) - sav_ptr[i]=sub[i]->ptr; - delfiles(temp_dir,"*.*"); - continue; } - if(ch=='C') { - while(online) { - CLS; - bputs("\1n\1gQWK Settings:\1n\r\n\r\n"); - bprintf("A) %-30s: %s\r\n" - ,"Ctrl-A Color Codes" - ,useron.qwk&QWK_EXPCTLA - ? "Expand to ANSI" : useron.qwk&QWK_RETCTLA ? "Leave in" - : "Strip"); - bprintf("T) %-30s: %s\r\n" - ,"Archive Type" - ,useron.tmpext); - bprintf("E) %-30s: %s\r\n" - ,"Include E-mail Messages" - ,useron.qwk&QWK_EMAIL ? "Un-read Only" - : useron.qwk&QWK_ALLMAIL ? text[Yes] : text[No]); - bprintf("I) %-30s: %s\r\n" - ,"Include File Attachments" - ,useron.qwk&QWK_ATTACH ? text[Yes] : text[No]); - bprintf("D) %-30s: %s\r\n" - ,"Delete E-mail Automatically" - ,useron.qwk&QWK_DELMAIL ? text[Yes]:text[No]); - bprintf("F) %-30s: %s\r\n" - ,"Include New Files List" - ,useron.qwk&QWK_FILES ? text[Yes]:text[No]); - bprintf("N) %-30s: %s\r\n" - ,"Include Index Files" - ,useron.qwk&QWK_NOINDEX ? text[No]:text[Yes]); - bprintf("C) %-30s: %s\r\n" - ,"Include Control Files" - ,useron.qwk&QWK_NOCTRL ? text[No]:text[Yes]); - bprintf("Y) %-30s: %s\r\n" - ,"Include Messages from You" - ,useron.qwk&QWK_BYSELF ? text[Yes]:text[No]); - bprintf("Z) %-30s: %s\r\n" - ,"Include Time Zone (TZ)" - ,useron.qwk&QWK_TZ ? text[Yes]:text[No]); - bprintf("V) %-30s: %s\r\n" - ,"Include Message Path (VIA)" - ,useron.qwk&QWK_VIA ? text[Yes]:text[No]); - //bprintf("Q) Quit\r\n\r\n"); - bputs(text[UserDefaultsWhich]); - ch=getkeys("AQEDFIOQTYNCZV",0); - if(sys_status&SS_ABORT || !ch || ch=='Q') - break; - switch(ch) { - case 'A': - if(!(useron.qwk&(QWK_EXPCTLA|QWK_RETCTLA))) - useron.qwk|=QWK_EXPCTLA; - else if(useron.qwk&QWK_EXPCTLA) { - useron.qwk&=~QWK_EXPCTLA; - useron.qwk|=QWK_RETCTLA; } - else - useron.qwk&=~(QWK_EXPCTLA|QWK_RETCTLA); - break; - case 'T': - for(i=0;i<total_fcomps;i++) - uselect(1,i,"Archive Types",fcomp[i]->ext,fcomp[i]->ar); - s=uselect(0,0,0,0,0); - if(s>=0) { - strcpy(useron.tmpext,fcomp[s]->ext); - putuserrec(useron.number,U_TMPEXT,3,useron.tmpext); } - break; - case 'E': - if(!(useron.qwk&(QWK_EMAIL|QWK_ALLMAIL))) - useron.qwk|=QWK_EMAIL; - else if(useron.qwk&QWK_EMAIL) { - useron.qwk&=~QWK_EMAIL; - useron.qwk|=QWK_ALLMAIL; } - else - useron.qwk&=~(QWK_EMAIL|QWK_ALLMAIL); - break; - case 'I': - useron.qwk^=QWK_ATTACH; - break; - case 'D': - useron.qwk^=QWK_DELMAIL; - break; - case 'F': - useron.qwk^=QWK_FILES; - break; - case 'N': /* NO IDX files */ - useron.qwk^=QWK_NOINDEX; - break; - case 'C': - useron.qwk^=QWK_NOCTRL; - break; - case 'Z': - useron.qwk^=QWK_TZ; - break; - case 'V': - useron.qwk^=QWK_VIA; - break; - case 'Y': /* Yourself */ - useron.qwk^=QWK_BYSELF; - break; } - putuserrec(useron.number,U_QWK,8,ultoa(useron.qwk,str,16)); } - delfiles(temp_dir,"*.*"); - continue; } - - - if(ch=='B') { /* Bidirectional QWK and REP packet transfer */ - sprintf(str,"%s%s.QWK",temp_dir,sys_id); - if(!fexist(str) && !pack_qwk(str,&msgcnt,0)) { - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; - remove(str); - last_ns_time=ns_time; - continue; } - bprintf(text[UploadingREP],sys_id); - menu("BIPROT"); - mnemonics(text[ProtocolOrQuit]); - strcpy(tmp2,"Q"); - for(i=0;i<total_prots;i++) - if(prot[i]->bicmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(tmp2,tmp); } - ch=getkeys(tmp2,0); - if(ch=='Q' || sys_status&SS_ABORT) { - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; /* re-load saved pointers */ - last_ns_time=ns_time; - continue; } - for(i=0;i<total_prots;i++) - if(prot[i]->bicmd[0] && prot[i]->mnemonic==ch - && chk_ar(prot[i]->ar,useron)) - break; - if(i<total_prots) { - batup_total=1; - batup_dir[0]=total_dirs; - sprintf(batup_name[0],"%s.REP",sys_id); - batdn_total=1; - batdn_dir[0]=total_dirs; - sprintf(batdn_name[0],"%s.QWK",sys_id); - if(!create_batchdn_lst() || !create_batchup_lst() - || !create_bimodem_pth()) { - batup_total=batdn_total=0; - continue; } - sprintf(str,"%s%s.QWK",temp_dir,sys_id); - sprintf(tmp2,"%s.QWK",sys_id); - padfname(tmp2,fd.name); - sprintf(str,"%sBATCHDN.LST",node_dir); - sprintf(tmp2,"%sBATCHUP.LST",node_dir); - j=protocol(cmdstr(prot[i]->bicmd,str,tmp2,NULL),0); - batdn_total=batup_total=0; - if(prot[i]->misc&PROT_DSZLOG) { - if(!checkprotlog(fd)) { - logline("D!",AttemptedToDownloadQWKpacket); - last_ns_time=ns_time; - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; } /* re-load saved pointers */ - else { - qwk_success(msgcnt,1,0); - for(i=0;i<total_subs;i++) - sav_ptr[i]=sub[i]->ptr; } } - else if(j) { - logline("D!",AttemptedToDownloadQWKpacket); - last_ns_time=ns_time; - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; } - else { - qwk_success(msgcnt,1,0); - for(i=0;i<total_subs;i++) - sav_ptr[i]=sub[i]->ptr; } - sprintf(str,"%s%s.QWK",temp_dir,sys_id); - remove(str); - unpack_rep(); - delfiles(temp_dir,"*.*"); - //autohangup(); - } - else { - last_ns_time=ns_time; - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; } } - - else if(ch=='D') { /* Download QWK Packet of new messages */ - sprintf(str,"%s%s.QWK",temp_dir,sys_id); - if(!fexist(str) && !pack_qwk(str,&msgcnt,0)) { - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; - last_ns_time=ns_time; - remove(str); - continue; } - if(online==ON_LOCAL) { /* Local QWK packet creation */ - bputs(text[EnterPath]); - if(!getstr(str,60,K_LINE|K_UPPER)) { - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; /* re-load saved pointers */ - last_ns_time=ns_time; - continue; } - backslashcolon(str); - sprintf(tmp2,"%s%s.QWK",str,sys_id); - if(fexist(tmp2)) { - for(i=0;i<10;i++) { - sprintf(tmp2,"%s%s.QW%d",str,sys_id,i); - if(!fexist(tmp2)) - break; } - if(i==10) { - bputs(text[FileAlreadyThere]); - last_ns_time=ns_time; - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; - continue; } } - sprintf(tmp,"%s%s.QWK",temp_dir,sys_id); - if(mv(tmp,tmp2,0)) { /* unsuccessful */ - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; - last_ns_time=ns_time; } - else { - bprintf(text[FileNBytesSent],tmp2,ultoac(flength(tmp2),tmp)); - qwk_success(msgcnt,0,0); - for(i=0;i<total_subs;i++) - sav_ptr[i]=sub[i]->ptr; } - continue; } - - /***************/ - /* Send Packet */ - /***************/ - menu("DLPROT"); - mnemonics(text[ProtocolOrQuit]); - strcpy(tmp2,"Q"); - for(i=0;i<total_prots;i++) - if(prot[i]->dlcmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(tmp2,tmp); } - ungetkey(useron.prot); - ch=getkeys(tmp2,0); - if(ch=='Q' || sys_status&SS_ABORT) { - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; /* re-load saved pointers */ - last_ns_time=ns_time; - continue; } - for(i=0;i<total_prots;i++) - if(prot[i]->dlcmd[0] && prot[i]->mnemonic==ch - && chk_ar(prot[i]->ar,useron)) - break; - if(i<total_prots) { - sprintf(str,"%s%s.QWK",temp_dir,sys_id); - sprintf(tmp2,"%s.QWK",sys_id); - padfname(tmp2,fd.name); - j=protocol(cmdstr(prot[i]->dlcmd,str,nulstr,NULL),0); - if(prot[i]->misc&PROT_DSZLOG) { - if(!checkprotlog(fd)) { - last_ns_time=ns_time; - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; } /* re-load saved pointers */ - else { - qwk_success(msgcnt,0,0); - for(i=0;i<total_subs;i++) - sav_ptr[i]=sub[i]->ptr; } } - else if(j) { - logline("D!",AttemptedToDownloadQWKpacket); - last_ns_time=ns_time; - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; } - else { - qwk_success(msgcnt,0,0); - for(i=0;i<total_subs;i++) - sav_ptr[i]=sub[i]->ptr; } - autohangup(); } - else { /* if not valid protocol (hungup?) */ - for(i=0;i<total_subs;i++) - sub[i]->ptr=sav_ptr[i]; - last_ns_time=ns_time; } } - - else if(ch=='U') { /* Upload REP Packet */ -/* - if(useron.rest&FLAG('Q') && useron.rest&FLAG('P')) { - bputs(text[R_Post]); - continue; } -*/ - - delfiles(temp_dir,"*.*"); - bprintf(text[UploadingREP],sys_id); - for(k=0;k<total_fextrs;k++) - if(!stricmp(fextr[k]->ext,useron.tmpext) - && chk_ar(fextr[k]->ar,useron)) - break; - if(k>=total_fextrs) { - bputs(text[QWKExtractionFailed]); - errorlog("Couldn't extract REP packet - configuration error"); - continue; } - - if(online==ON_LOCAL) { /* Local upload of rep packet */ - bputs(text[EnterPath]); - if(!getstr(str,60,K_LINE|K_UPPER)) - continue; - backslashcolon(str); - sprintf(tmp,"%s.REP",sys_id); - strcat(str,tmp); - sprintf(tmp,"%s%s.REP",temp_dir,sys_id); - if(!mv(str,tmp,0)) - unpack_rep(); - delfiles(temp_dir,"*.*"); - continue; } - - /******************/ - /* Receive Packet */ - /******************/ - menu("ULPROT"); - mnemonics(text[ProtocolOrQuit]); - strcpy(tmp2,"Q"); - for(i=0;i<total_prots;i++) - if(prot[i]->ulcmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(tmp2,tmp); } - ch=getkeys(tmp2,0); - if(ch=='Q' || sys_status&SS_ABORT) - continue; - for(i=0;i<total_prots;i++) - if(prot[i]->ulcmd[0] && prot[i]->mnemonic==ch - && chk_ar(prot[i]->ar,useron)) - break; - if(i>=total_prots) /* This shouldn't happen */ - continue; - sprintf(str,"%s%s.REP",temp_dir,sys_id); - protocol(cmdstr(prot[i]->ulcmd,str,nulstr,NULL),0); - unpack_rep(); - delfiles(temp_dir,"*.*"); - //autohangup(); - } } -delfiles(temp_dir,"*.*"); -FREE(sav_ptr); -} - -void qwksetptr(uint subnum, char *buf, int reset) -{ - long l; - ulong last; - -if(buf[2]=='/' && buf[5]=='/') { /* date specified */ - l=dstrtounix(buf); - sub[subnum]->ptr=getmsgnum(subnum,l); - return; } -l=atol(buf); -if(l>=0) /* ptr specified */ - sub[subnum]->ptr=l; -else if(l) { /* relative ptr specified */ - getlastmsg(subnum,&last,0); - if(-l>last) - sub[subnum]->ptr=0; - else - sub[subnum]->ptr=last+l; } -else if(reset) - getlastmsg(subnum,&sub[subnum]->ptr,0); -} - - -/****************************************************************************/ -/* Process a QWK Config line */ -/****************************************************************************/ -void qwkcfgline(char *buf,uint subnum) -{ - char str[128]; - int x,y; - long l; - ulong qwk=useron.qwk,last; - file_t f; - -sprintf(str,"%.25s",buf); -strupr(str); -bprintf("\1n\r\n\1b\1hQWK Control [\1c%s\1b]: \1g%s\r\n" - ,subnum==INVALID_SUB ? "Mail":sub[subnum]->qwkname,str); - -if(subnum!=INVALID_SUB) { /* Only valid in sub-boards */ - - if(!strncmp(str,"DROP ",5)) { /* Drop from new-scan */ - l=atol(str+5); - if(!l) - sub[subnum]->misc&=~SUB_NSCAN; - else { - x=l/1000; - y=l-(x*1000); - if(x>=usrgrps || y>=usrsubs[x]) { - bprintf(text[QWKInvalidConferenceN],l); - sprintf(str,"Invalid conference number %lu",l); - logline("Q!",str); } - else - sub[usrsub[x][y]]->misc&=~SUB_NSCAN; } - return; } - - if(!strncmp(str,"ADD YOURS ",10)) { /* Add to new-scan */ - sub[subnum]->misc|=(SUB_NSCAN|SUB_YSCAN); - qwksetptr(subnum,str+10,0); - return; } - - else if(!strncmp(str,"YOURS ",6)) { - sub[subnum]->misc|=(SUB_NSCAN|SUB_YSCAN); - qwksetptr(subnum,str+6,0); - return; } - - else if(!strncmp(str,"ADD ",4)) { /* Add to new-scan */ - sub[subnum]->misc|=SUB_NSCAN; - sub[subnum]->misc&=~SUB_YSCAN; - qwksetptr(subnum,str+4,0); - return; } - - if(!strncmp(str,"RESET ",6)) { /* set msgptr */ - qwksetptr(subnum,str+6,1); - return; } - - if(!strncmp(str,"SUBPTR ",7)) { - qwksetptr(subnum,str+7,1); - return; } - } - -if(!strncmp(str,"RESETALL ",9)) { /* set all ptrs */ - for(x=0;x<usrgrps;x++) - for(y=0;y<usrsubs[x];y++) - if(sub[usrsub[x][y]]->misc&SUB_NSCAN) - qwksetptr(usrsub[x][y],str+9,1); } - -else if(!strncmp(str,"ALLPTR ",7)) { /* set all ptrs */ - for(x=0;x<usrgrps;x++) - for(y=0;y<usrsubs[x];y++) - if(sub[usrsub[x][y]]->misc&SUB_NSCAN) - qwksetptr(usrsub[x][y],str+7,1); } - -else if(!strncmp(str,"FILES ",6)) { /* files list */ - if(!strncmp(str+6,"ON ",3)) - useron.qwk|=QWK_FILES; - else if(str[8]=='/' && str[11]=='/') { /* set scan date */ - useron.qwk|=QWK_FILES; - ns_time=dstrtounix(str+6); } - else - useron.qwk&=~QWK_FILES; } - -else if(!strncmp(str,"OWN ",4)) { /* message from you */ - if(!strncmp(str+4,"ON ",3)) - useron.qwk|=QWK_BYSELF; - else - useron.qwk&=~QWK_BYSELF; - return; } - -else if(!strncmp(str,"NDX ",4)) { /* include indexes */ - if(!strncmp(str+4,"OFF ",4)) - useron.qwk|=QWK_NOINDEX; - else - useron.qwk&=~QWK_NOINDEX; } - -else if(!strncmp(str,"CONTROL ",8)) { /* exclude ctrl files */ - if(!strncmp(str+8,"OFF ",4)) - useron.qwk|=QWK_NOCTRL; - else - useron.qwk&=~QWK_NOCTRL; } - -else if(!strncmp(str,"VIA ",4)) { /* include @VIA: */ - if(!strncmp(str+4,"ON ",3)) - useron.qwk|=QWK_VIA; - else - useron.qwk&=~QWK_VIA; } - -else if(!strncmp(str,"TZ ",3)) { /* include @TZ: */ - if(!strncmp(str+3,"ON ",3)) - useron.qwk|=QWK_TZ; - else - useron.qwk&=~QWK_TZ; } - -else if(!strncmp(str,"ATTACH ",7)) { /* file attachments */ - if(!strncmp(str+7,"ON ",3)) - useron.qwk|=QWK_ATTACH; - else - useron.qwk&=~QWK_ATTACH; } - -else if(!strncmp(str,"DELMAIL ",8)) { /* delete mail */ - if(!strncmp(str+8,"ON ",3)) - useron.qwk|=QWK_DELMAIL; - else - useron.qwk&=~QWK_DELMAIL; } - -else if(!strncmp(str,"CTRL-A ",7)) { /* Ctrl-a codes */ - if(!strncmp(str+7,"KEEP ",5)) { - useron.qwk|=QWK_RETCTLA; - useron.qwk&=~QWK_EXPCTLA; } - else if(!strncmp(str+7,"EXPAND ",7)) { - useron.qwk|=QWK_EXPCTLA; - useron.qwk&=~QWK_RETCTLA; } - else - useron.qwk&=~(QWK_EXPCTLA|QWK_RETCTLA); } - -else if(!strncmp(str,"MAIL ",5)) { /* include e-mail */ - if(!strncmp(str+5,"ALL ",4)) { - useron.qwk|=QWK_ALLMAIL; - useron.qwk&=~QWK_EMAIL; } - else if(!strncmp(str+5,"ON ",3)) { - useron.qwk|=QWK_EMAIL; - useron.qwk&=~QWK_ALLMAIL; } - else - useron.qwk&=~(QWK_ALLMAIL|QWK_EMAIL); } - -else if(!strncmp(str,"FREQ ",5)) { /* file request */ - padfname(str+5,f.name); - strupr(f.name); - for(x=0;x<usrlibs;x++) { - for(y=0;y<usrdirs[x];y++) - if(findfile(usrdir[x][y],f.name)) - break; - if(y<usrdirs[x]) - break; } - if(x>=usrlibs) { - bprintf("\r\n%s",f.name); - bputs(text[FileNotFound]); } - else { - f.dir=usrdir[x][y]; - getfileixb(&f); - f.size=0; - getfiledat(&f); - if(f.size==-1L) - bprintf(text[FileIsNotOnline],f.name); - else - addtobatdl(f); } } - -else bputs("\1r\1h\1iUnrecognized Control Command!\1n\r\n"); - -if(qwk!=useron.qwk) - putuserrec(useron.number,U_QWK,8,ultoa(useron.qwk,tmp,16)); -} - - diff --git a/src/sbbs2/qwk.h b/src/sbbs2/qwk.h deleted file mode 100644 index d1b48dcb70..0000000000 --- a/src/sbbs2/qwk.h +++ /dev/null @@ -1,35 +0,0 @@ -/* QWK.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -typedef union { - uchar uc[10]; - ushort ui[5]; - ulong ul[2]; - float f[2]; - double d[1]; } converter; - -#define LEN_QWKBUF 20000 /* 20k buffer for each message */ -#define TAGLINE (1<<5) /* Place tagline at end of qwk message */ -#define TO_QNET (1<<6) /* Sending to hub */ -#define REP (1<<7) /* It's a REP packet */ -#define VIA (1<<8) /* Include VIA */ -#define TZ (1<<9) /* Include TZ */ - -void qwk_success(ulong msgcnt, char bi, char prepack); -char pack_qwk(char *packet, ulong *msgcnt, int prepack); -void unpack_qwk(char *packet, uint hubnum); -char pack_rep(uint hubnum); -void unpack_rep(void); -void remove_ctrl_a(char *instr); -ulong msgtoqwk(smbmsg_t msg, FILE *qwk_fp, int mode, int subnum - , int conf); -char qwktomsg(FILE *qwk_fp, uchar *hdrblk, char fromhub, uint subnum - , uint touser); -void qwkcfgline(char *buf,uint subnum); -float ltomsbin(long val); -int qwk_route(char *inaddr, char *fulladdr); -int route_circ(char *via, char *id); -void update_qwkroute(char *via); - -extern time_t qwkmail_time; diff --git a/src/sbbs2/qwknodes/make.bat b/src/sbbs2/qwknodes/make.bat deleted file mode 100755 index dc1d6ab601..0000000000 --- a/src/sbbs2/qwknodes/make.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -w-pro -N -ml -C -I..;..\smb;..\rio qwknodes.c ..\ars.c ..\scfglib1.c ..\scfgvars.c ..\smb\smblib.c diff --git a/src/sbbs2/qwknodes/qwknodes.c b/src/sbbs2/qwknodes/qwknodes.c deleted file mode 100644 index 2a063c32cc..0000000000 --- a/src/sbbs2/qwknodes/qwknodes.c +++ /dev/null @@ -1,500 +0,0 @@ -/* QWKNODES.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Generates QWKnet node list or ROUTE.DAT file from Synchronet message base */ - -#include "sbbs.h" -#include "crc32.h" -#include "crc16.c" - -unsigned _stklen=10000; -smb_t smb; - -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - struct date date; - struct time curtime; - -if(!unix) - strcpy(str,"00/00/00"); -else { - unixtodos(unix,&date,&curtime); - if((unsigned)date.da_mon>12) { /* DOS leap year bug */ - date.da_mon=1; - date.da_year++; } - if((unsigned)date.da_day>31) - date.da_day=1; - if(sys_misc&SM_EURODATE) - sprintf(str,"%02u/%02u/%02u",date.da_day,date.da_mon - ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); - else - sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day - ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); } -return(str); -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access==O_RDONLY) share=SH_DENYWR; - else share=SH_DENYRW; -while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(((*file)=nopen(str,access))==-1) - return(NULL); - -if(access&O_APPEND) { - if(access&O_RDONLY) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&O_WRONLY) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - close(*file); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,16*1024); -return(stream); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - uchar c; - -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - -void stripctrla(uchar *str) -{ - uchar out[256]; - int i,j; - -for(i=j=0;str[i];i++) { - if(str[i]==1) - i++; - else - out[j++]=str[i]; } -out[j]=0; -strcpy(str,out); -} - - -long lputs(char FAR16 *str) -{ - char tmp[256]; - int i,j,k; - -j=strlen(str); -for(i=k=0;i<j;i++) /* remove CRs */ - if(str[i]==CR && str[i+1]==LF) - continue; - else - tmp[k++]=str[i]; -tmp[k]=0; -return(fputs(tmp,stderr)); -} -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) -{ - va_list argptr; - char sbuf[256]; - int chcount; - -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); -} -void bail(int code) -{ -exit(code); -} - - -char *loadmsgtail(smbmsg_t msg) -{ - char *buf=NULL; - ushort xlat; - int i; - long l=0,length; - -for(i=0;i<msg.hdr.total_dfields;i++) { - if(msg.dfield[i].type!=TEXT_TAIL) - continue; - fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset - ,SEEK_SET); - fread(&xlat,2,1,smb.sdt_fp); - if(xlat!=XLAT_NONE) /* no translations supported */ - continue; - length=msg.dfield[i].length-2; - if((buf=REALLOC(buf,l+msg.dfield[i].length+1))==NULL) - return(buf); - l+=fread(buf+l,1,length,smb.sdt_fp); - buf[l]=0; } -return(buf); -} - - -void gettag(smbmsg_t msg, char *tag) -{ - char *buf,*p; - -tag[0]=0; -buf=loadmsgtail(msg); -if(buf==NULL) - return; -truncsp(buf); -stripctrla(buf); -p=strrchr(buf,LF); -if(!p) p=buf; -else p++; -if(!strnicmp(p," � Synchronet � ",16)) - p+=16; -if(!strnicmp(p," * Synchronet * ",16)) - p+=16; -while(*p && *p<=SP) p++; -strcpy(tag,p); -FREE(buf); -} - - -#define FEED (1<<0) -#define LOCAL (1<<1) -#define APPEND (1<<2) -#define TAGS (1<<3) - -#define ROUTE (1<<1) -#define NODES (1<<2) -#define USERS (1<<3) - -char *usage="\nusage: qwknodes [/opts] cmds" - "\n" - "\n cmds: r = create ROUTE.DAT" - "\n u = create USERS.DAT" - "\n n = create NODES.DAT" - "\n" - "\n opts: f = format addresses for nodes that feed from this system" - "\n a = append existing output files" - "\n t = include tag lines in NODES.DAT" - "\n l = include local users in USERS.DAT" - "\n m# = maximum message age set to # days" - "\n"; - -void main(int argc, char **argv) -{ - char str[256],tmp[128],tag[256],addr[256],*p; - int i,j,mode=0,cmd=0,o_mode,max_age=0; - ushort smm,sbl; - ulong *crc=NULL,curcrc,total_crcs=0,l; - FILE *route,*users,*nodes; - time_t now; - read_cfg_text_t txt; - smbstatus_t status; - smbmsg_t msg; - -txt.openerr="\7\r\nError opening %s for read.\r\n"; -txt.reading="\r\nReading %s..."; -txt.readit="\rRead %s "; -txt.allocerr="\7\r\nError allocating %u bytes of memory\r\n"; -txt.error="\7\r\nERROR: Offset %lu in %s\r\n\r\n"; - -fprintf(stderr,"\nSynchronet QWKnet Node/Route/User List v1.20 " - "Developed 1995-1997 Rob Swindell\n"); - - -for(i=1;i<argc;i++) - for(j=0;argv[i][j];j++) - switch(toupper(argv[i][j])) { - case '/': - case '-': - while(argv[i][++j]) - switch(toupper(argv[i][j])) { - case 'F': - mode|=FEED; - break; - case 'L': - mode|=LOCAL; - break; - case 'A': - mode|=APPEND; - break; - case 'T': - mode|=TAGS; - break; - case 'M': - j++; - max_age=atoi(argv[i]+j); - while(isdigit(argv[i][j+1])) j++; - break; - default: - printf(usage); - exit(1); } - j--; - break; - case 'R': - cmd|=ROUTE; - break; - case 'U': - cmd|=USERS; - break; - case 'N': - cmd|=NODES; - break; - default: - printf(usage); - exit(1); } - -if(!cmd) { - printf(usage); - exit(1); } - -if(mode&APPEND) - o_mode=O_WRONLY|O_CREAT|O_APPEND; -else - o_mode=O_WRONLY|O_CREAT|O_TRUNC; - -if(cmd&NODES) - if((nodes=fnopen(&i,"NODES.DAT",o_mode))==NULL) { - printf("\7\nError opening NODES.DAT\n"); - exit(1); } - -if(cmd&USERS) - if((users=fnopen(&i,"USERS.DAT",o_mode))==NULL) { - printf("\7\nError opening USERS.DAT\n"); - exit(1); } - -if(cmd&ROUTE) - if((route=fnopen(&i,"ROUTE.DAT",o_mode))==NULL) { - printf("\7\nError opening ROUTE.DAT\n"); - exit(1); } - -if(!node_dir[0]) { - p=getenv("SBBSNODE"); - if(p==NULL) { - printf("\7\nSBBSNODE environment variable not set.\n"); - exit(1); } - strcpy(node_dir,p); } - -strupr(node_dir); - -if(node_dir[strlen(node_dir)-1]!='\\') - strcat(node_dir,"\\"); - -read_node_cfg(txt); -if(ctrl_dir[0]=='.') { /* Relative path */ - strcpy(str,ctrl_dir); - sprintf(ctrl_dir,"%s%s",node_dir,str); - if(_fullpath(str,ctrl_dir,40)) - strcpy(ctrl_dir,str); } -backslash(ctrl_dir); - -read_main_cfg(txt); -if(data_dir[0]=='.') { /* Relative path */ - strcpy(str,data_dir); - sprintf(data_dir,"%s%s",node_dir,str); - if(_fullpath(str,data_dir,40)) - strcpy(data_dir,str); } -backslash(data_dir); -read_msgs_cfg(txt); - -now=time(NULL); -smm=crc16("smm"); -sbl=crc16("sbl"); -fprintf(stderr,"\n\n"); -for(i=0;i<total_subs;i++) { - if(!(sub[i]->misc&SUB_QNET)) - continue; - fprintf(stderr,"%-*s %s\n" - ,LEN_GSNAME,grp[sub[i]->grp]->sname,sub[i]->lname); - sprintf(smb.file,"%s%s",sub[i]->data_dir,sub[i]->code); - smb.retry_time=30; - if((j=smb_open(&smb))!=0) { - printf("smb_open returned %d\n",j); - continue; } - if((j=smb_locksmbhdr(&smb))!=0) { - printf("smb_locksmbhdr returned %d\n",j); - smb_close(&smb); - continue; } - if((j=smb_getstatus(&smb))!=0) { - printf("smb_getstatus returned %d\n",j); - smb_close(&smb); - continue; } - smb_unlocksmbhdr(&smb); - msg.offset=status.total_msgs; - if(!msg.offset) { - smb_close(&smb); - printf("Empty.\n"); - continue; } - while(!kbhit() && !ferror(smb.sid_fp) && msg.offset) { - msg.offset--; - fseek(smb.sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg.idx,1,sizeof(idxrec_t),smb.sid_fp)) - break; - fprintf(stderr,"%-5lu\r",msg.offset+1); - if(msg.idx.to==smm || msg.idx.to==sbl) - continue; - if(max_age && now-msg.idx.time>((ulong)max_age*24UL*60UL*60UL)) - continue; - if((j=smb_lockmsghdr(&smb,&msg))!=0) { - printf("smb_lockmsghdr returned %d\n",j); - break; } - if((j=smb_getmsghdr(&smb,&msg))!=0) { - printf("smb_getmsghdr returned %d\n",j); - break; } - smb_unlockmsghdr(&smb,&msg); - if((mode&LOCAL && msg.from_net.type==NET_NONE) - || msg.from_net.type==NET_QWK) { - if(msg.from_net.type!=NET_QWK) - msg.from_net.addr=""; - if(cmd&USERS) { - sprintf(str,"%s%s",msg.from_net.addr,msg.from); - curcrc=crc32(str); } - else - curcrc=crc32(msg.from_net.addr); - for(l=0;l<total_crcs;l++) - if(curcrc==crc[l]) - break; - if(l==total_crcs) { - total_crcs++; - if((crc=(ulong *)REALLOC(crc - ,sizeof(ulong)*total_crcs))==NULL) { - printf("Error allocating %lu bytes\n" - ,sizeof(ulong)*total_crcs); - break; } - crc[l]=curcrc; - if(cmd&ROUTE && msg.from_net.type==NET_QWK) { - strcpy(addr,msg.from_net.addr); - if(mode&FEED) { - p=strrchr(addr,'/'); - if(!p) - p=addr; - else - *(p++)=0; - sprintf(str,"%s %s:%s%c%s" - ,unixtodstr(msg.hdr.when_written.time,tmp) - ,p,sys_id,p==addr ? 0 : '/' - ,addr); - fprintf(route,"%s\r\n",str); } - else { - p=strrchr(addr,'/'); - if(p) { - *(p++)=0; - fprintf(route,"%s %s:%.*s\r\n" - ,unixtodstr(msg.hdr.when_written.time,str) - ,p - ,(uint)(p-addr) - ,addr); } } } - if(cmd&USERS) { - if(msg.from_net.type!=NET_QWK) - strcpy(str,sys_id); - else if(mode&FEED) - sprintf(str,"%s/%s",sys_id,msg.from_net.addr); - else - strcpy(str,msg.from_net.addr); - p=strrchr(str,'/'); - if(p) - fprintf(users,"%-25.25s %-8.8s %s (%s)\r\n" - ,msg.from,p+1 - ,unixtodstr(msg.hdr.when_written.time,tmp) - ,str); - else - fprintf(users,"%-25.25s %-8.8s %s\r\n" - ,msg.from,str - ,unixtodstr(msg.hdr.when_written.time,tmp)); } - if(cmd&NODES && msg.from_net.type==NET_QWK) { - if(mode&TAGS) - gettag(msg,tag); - if(mode&FEED) - sprintf(str,"%s/%s",sys_id,msg.from_net.addr); - else - strcpy(str,msg.from_net.addr); - p=strrchr(str,'/'); - if(p) { - if(mode&TAGS) - fprintf(nodes,"%-8.8s %s\r\n" - ,p+1 - ,tag); - else - fprintf(nodes,"%-8.8s %s (%s)\r\n" - ,p+1 - ,unixtodstr(msg.hdr.when_written.time,tmp) - ,str); } - else - fprintf(nodes,"%-8.8s %s\r\n" - ,str - ,mode&TAGS - ? tag - : unixtodstr(msg.hdr.when_written.time,tmp)); } - } } - smb_freemsgmem(&msg); } - - smb_close(&smb); - if(kbhit()) { - getch(); - fprintf(stderr,"Key pressed.\n"); - break; } } -fprintf(stderr,"Done.\n"); -} - diff --git a/src/sbbs2/qwktomsg.c b/src/sbbs2/qwktomsg.c deleted file mode 100644 index e3d43dd12b..0000000000 --- a/src/sbbs2/qwktomsg.c +++ /dev/null @@ -1,350 +0,0 @@ -#line 1 "QWKTOMSG.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "qwk.h" - -/****************************************************************************/ -/* Converts a QWK message packet into a message. The 'qwkbuf' pointer */ -/* points to the message header and 'str' is the file to output to. */ -/* Returns the 1 on success or 0 if failure. */ -/****************************************************************************/ -char qwktomsg(FILE *qwk_fp, uchar *hdrblk, char fromhub, uint subnum - , uint touser) -{ - uchar str[256],*body,*tail,col=0,lastch=0,*p,*lzhbuf,qwkbuf[128]; - int file,i,j,k,lzh=0,storage,skip=0; - ushort xlat; - long l,bodylen,taillen,length; - ulong crc,block,blocks; - smbmsg_t msg; - -memset(&msg,0,sizeof(smbmsg_t)); /* Initialize message header */ -memcpy(msg.hdr.id,"SHD\x1a",4); -msg.hdr.version=smb_ver(); - -blocks=atol(hdrblk+116); -if(blocks<2) - return(0); - -if(subnum!=INVALID_SUB - && (hdrblk[0]=='*' || hdrblk[0]=='+' || sub[subnum]->misc&SUB_PONLY)) - msg.idx.attr|=MSG_PRIVATE; -if(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_AONLY) - msg.idx.attr|=MSG_ANONYMOUS; -if(subnum==INVALID_SUB && sys_misc&SM_DELREADM) - msg.idx.attr|=MSG_KILLREAD; -if((fromhub || useron.rest&FLAG('Q')) && - (hdrblk[0]=='*' || hdrblk[0]=='-' || hdrblk[0]=='`')) - msg.idx.attr|=MSG_READ; - -if(subnum!=INVALID_SUB && !fromhub && sub[subnum]->mod_ar[0] - && chk_ar(sub[subnum]->mod_ar,useron)) - msg.idx.attr|=MSG_MODERATED; -if(subnum!=INVALID_SUB && !fromhub && sub[subnum]->misc&SUB_SYSPERM - && sub_op(subnum)) - msg.idx.attr|=MSG_PERMANENT; - -msg.hdr.attr=msg.idx.attr; - -date.da_mon=((hdrblk[8]&0xf)*10)+(hdrblk[9]&0xf); -date.da_day=((hdrblk[11]&0xf)*10)+(hdrblk[12]&0xf); -date.da_year=((hdrblk[14]&0xf)*10)+(hdrblk[15]&0xf); -if(date.da_year<Y2K_2DIGIT_WINDOW) - date.da_year+=100; -date.da_year+=1900; -curtime.ti_hour=((hdrblk[16]&0xf)*10)+(hdrblk[17]&0xf); -curtime.ti_min=((hdrblk[19]&0xf)*10)+(hdrblk[20]&0xf); -curtime.ti_sec=0; -msg.hdr.when_written.time=dostounix(&date,&curtime); -if(!(useron.rest&FLAG('Q')) && !fromhub) - msg.hdr.when_written.zone=sys_timezone; -msg.hdr.when_imported.time=time(NULL); -msg.hdr.when_imported.zone=sys_timezone; - -hdrblk[116]=0; /* don't bleed number-of-blocks and re-msg-num fields together */ -msg.hdr.thread_orig=atol(hdrblk+108); - -if((uint)subnum==INVALID_SUB) { /* E-mail */ - msg.idx.to=touser; - -/*** Unnecessary code in v2.10a - if(!touser) { - sprintf(str,"%25.25s",hdrblk+21); - truncsp(str); - for(i=0;i<total_qhubs;i++) - if(!stricmp(qhub[i]->id,str)) - break; - if(i==total_qhubs) { - errormsg(WHERE,ERR_CHK,str,0); - return(0); } - smb_hfield(&msg,RECIPIENT,strlen(str),str); } - else { -***/ - username(touser,str); - smb_hfield(&msg,RECIPIENT,strlen(str),str); - sprintf(str,"%u",touser); - smb_hfield(&msg,RECIPIENTEXT,strlen(str),str); } - -else { - sprintf(str,"%25.25s",hdrblk+21); /* To user */ - truncsp(str); - smb_hfield(&msg,RECIPIENT,strlen(str),str); - strlwr(str); - msg.idx.to=crc16(str); } - -fread(qwkbuf,1,128,qwk_fp); - -if(useron.rest&FLAG('Q') || fromhub) { /* QWK Net */ - if(!strnicmp(qwkbuf,"@VIA:",5)) { - p=strchr(qwkbuf,'\xe3'); - if(p) { - *p=0; - skip=strlen(qwkbuf)+1; } - truncsp(qwkbuf); - p=qwkbuf+5; /* Skip "@VIA:" */ - while(*p && *p<=SP) p++; /* Skip any spaces */ - if(route_circ(p,sys_id)) { - smb_freemsgmem(&msg); - bprintf("\r\nCircular message path: %s\r\n",p); - sprintf(str,"Circular message path: %s from %s" - ,p,fromhub ? qhub[fromhub-1]->id:useron.alias); - errorlog(str); - return(0); } - sprintf(str,"%s/%s" - ,fromhub ? qhub[fromhub-1]->id : useron.alias,p); - strupr(str); - update_qwkroute(str); } - else { - if(fromhub) - strcpy(str,qhub[fromhub-1]->id); - else - strcpy(str,useron.alias); } - strupr(str); - j=NET_QWK; - smb_hfield(&msg,SENDERNETTYPE,2,&j); - smb_hfield(&msg,SENDERNETADDR,strlen(str),str); - sprintf(str,"%25.25s",hdrblk+46); /* From user */ - truncsp(str); - if(!strnicmp(qwkbuf+skip,"@TZ:",4)) { - p=strchr(qwkbuf+skip,'\xe3'); - i=skip; - if(p) { - *p=0; - skip+=strlen(qwkbuf+i)+1; } - p=qwkbuf+i+4; /* Skip "@TZ:" */ - while(*p && *p<=SP) p++; /* Skip any spaces */ - msg.hdr.when_written.zone=(short)ahtoul(p); } - } -else { - sprintf(str,"%u",useron.number); - smb_hfield(&msg,SENDEREXT,strlen(str),str); - if((uint)subnum!=INVALID_SUB && sub[subnum]->misc&SUB_NAME) - strcpy(str,useron.name); - else - strcpy(str,useron.alias); } - -smb_hfield(&msg,SENDER,strlen(str),str); -if((uint)subnum==INVALID_SUB) { - if(useron.rest&FLAG('Q') || fromhub) - msg.idx.from=0; - else - msg.idx.from=useron.number; } -else { - strlwr(str); - msg.idx.from=crc16(str); } - -sprintf(str,"%25.25s",hdrblk+71); /* Subject */ -truncsp(str); -remove_re(str); -smb_hfield(&msg,SUBJECT,strlen(str),str); -strlwr(str); -msg.idx.subj=crc16(str); - -/********************************/ -/* Convert the QWK message text */ -/********************************/ - -bodylen=0; -if((body=LMALLOC((blocks-1L)*128L*2L))==NULL) { - smb_freemsgmem(&msg); - errormsg(WHERE,ERR_ALLOC,"QWK msg",(blocks-1L)*128L*2L); - return(0); } - -taillen=0; -if((tail=LMALLOC((blocks-1L)*128L))==NULL) { - LFREE(body); - smb_freemsgmem(&msg); - errormsg(WHERE,ERR_ALLOC,"QWK msg",(blocks-1L)*128L); - return(0); } - -for(block=1;block<blocks;block++) { - if(block>1) - if(!fread(qwkbuf,1,128,qwk_fp)) - break; - for(k=skip;k<128;k++,skip=0) { - if(qwkbuf[k]==0) - continue; - if(!taillen && qwkbuf[k]==SP && col==3 && bodylen>=3 - && body[bodylen-3]=='-' && body[bodylen-2]=='-' - && body[bodylen-1]=='-') { - bodylen-=3; - strcpy(tail,"--- "); - taillen=4; - col++; - continue; } - if(qwkbuf[k]==0xE3) { /* expand 0xe3 to crlf */ - if(!taillen && col==3 && bodylen>=3 && body[bodylen-3]=='-' - && body[bodylen-2]=='-' && body[bodylen-1]=='-') { - bodylen-=3; - strcpy(tail,"---"); - taillen=3; } - col=0; - if(taillen) { - tail[taillen++]=CR; - tail[taillen++]=LF; } - else { - body[bodylen++]=CR; - body[bodylen++]=LF; } - continue; } - if(!fromhub && qwkbuf[k]==7 && useron.rest&FLAG('B')) /* beep res */ - continue; - if(!fromhub && (qwkbuf[k]==1 || qwkbuf[k]==ESC) /* ANSI restriction */ - && useron.rest&FLAG('A')) - continue; - if(qwkbuf[k]!=1 && lastch!=1) - col++; - if(lastch==1 && !validattr(qwkbuf[k])) { - if(taillen) taillen--; - else bodylen--; - lastch=0; - continue; } - lastch=qwkbuf[k]; - if(taillen) - tail[taillen++]=qwkbuf[k]; - else - body[bodylen++]=qwkbuf[k]; } } - -while(bodylen && body[bodylen-1]==SP) bodylen--; /* remove trailing spaces */ -if(bodylen>=2 && body[bodylen-2]==CR && body[bodylen-1]==LF) - bodylen-=2; - -while(taillen && tail[taillen-1]<=SP) taillen--; /* remove trailing garbage */ - -/*****************/ -/* Calculate CRC */ -/*****************/ - -if(smb.status.max_crcs) { - crc=0xffffffffUL; - for(l=0;l<bodylen;l++) - crc=ucrc32(body[l],crc); - crc=~crc; - - /*******************/ - /* Check for dupes */ - /*******************/ - - j=smb_addcrc(&smb,crc); - if(j) { - if(j==1) { - bprintf("\r\nDuplicate message\r\n"); - logline(subnum==INVALID_SUB ? "E!":"P!","Duplicate message"); } - else - errormsg(WHERE,ERR_CHK,smb.file,j); - - smb_freemsgmem(&msg); - LFREE(body); - LFREE(tail); - return(0); } } - -bputs(text[WritingIndx]); - -/*************************************/ -/* Write SMB message header and text */ -/*************************************/ - -if(subnum!=INVALID_SUB && sub[subnum]->misc&SUB_LZH && bodylen - && bodylen+2+taillen+2>=SDT_BLOCK_LEN - && (lzhbuf=(char *)LMALLOC(bodylen*2))!=NULL) { - length=lzh_encode((uchar *)body,bodylen,(uchar *)lzhbuf); - if(length>1L - && smb_datblocks(length+4L+taillen+2L) - <smb_datblocks(bodylen+2L+taillen+2L)) { - bodylen=length; /* Compressable */ - length+=4L; - lzh=1; - LFREE(body); - body=lzhbuf; } - else { /* Non-compressable */ - length=bodylen+2L; - LFREE(lzhbuf); } } -else - length=bodylen+2L; /* +2 for translation string */ - -if(taillen) - length+=taillen+2L; - -if(length&0xfff00000UL) { - errormsg(WHERE,ERR_LEN,"REP msg",length); - smb_freemsgmem(&msg); - LFREE(body); - LFREE(tail); - return(0); } - -if((i=smb_locksmbhdr(&smb))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); - FREE(body); - FREE(tail); - return(0); } - -if(smb.status.attr&SMB_HYPERALLOC) { - msg.hdr.offset=smb_hallocdat(&smb); - storage=SMB_HYPERALLOC; } -else { - if((i=smb_open_da(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - FREE(body); - FREE(tail); - return(0); } - if((subnum==INVALID_SUB && sys_misc&SM_FASTMAIL) - || (subnum!=INVALID_SUB && sub[subnum]->misc&SUB_FAST)) { - msg.hdr.offset=smb_fallocdat(&smb,length,1); - storage=SMB_FASTALLOC; } - else { - msg.hdr.offset=smb_allocdat(&smb,length,1); - storage=SMB_SELFPACK; } - smb_close_da(&smb); } - -if(msg.hdr.offset && msg.hdr.offset<1L) { - smb_unlocksmbhdr(&smb); - errormsg(WHERE,ERR_READ,smb.file,msg.hdr.offset); - smb_freemsgmem(&msg); - FREE(body); - FREE(tail); } -fseek(smb.sdt_fp,msg.hdr.offset,SEEK_SET); -if(lzh) { - xlat=XLAT_LZH; - fwrite(&xlat,2,1,smb.sdt_fp); } -xlat=XLAT_NONE; -fwrite(&xlat,2,1,smb.sdt_fp); -fwrite(body,bodylen,1,smb.sdt_fp); -smb_dfield(&msg,TEXT_BODY,bodylen+2+(lzh ? 2:0)); -if(taillen) { - fwrite(&xlat,2,1,smb.sdt_fp); - fwrite(tail,taillen,1,smb.sdt_fp); - smb_dfield(&msg,TEXT_TAIL,taillen+2); } -fflush(smb.sdt_fp); -smb_unlocksmbhdr(&smb); - -if((i=smb_addmsghdr(&smb,&msg,storage))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - -smb_freemsgmem(&msg); - -LFREE(body); -LFREE(tail); - -return(1); -} diff --git a/src/sbbs2/readmsgs.c b/src/sbbs2/readmsgs.c deleted file mode 100644 index ceaa73bc29..0000000000 --- a/src/sbbs2/readmsgs.c +++ /dev/null @@ -1,1070 +0,0 @@ -#line 1 "READMSGS.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "post.h" - -char movemsg(smbmsg_t msg, uint subnum); -void editmsg(smbmsg_t *msg, uint subnum); - -int sub_op(uint subnum) -{ -return(SYSOP || (sub[subnum]->op_ar[0] && chk_ar(sub[subnum]->op_ar,useron))); -} - - -void listmsgs(int subnum, post_t HUGE16 *post, long i, long posts) -{ - char ch; - int j; - smbmsg_t msg; - - -bputs(text[MailOnSystemLstHdr]); -msg.total_hfields=0; -while(i<posts && !msgabort()) { - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=post[i].offset; - if(!loadmsg(&msg,post[i].number)) - break; - smb_unlockmsghdr(&smb,&msg); - if(msg.hdr.attr&MSG_DELETE) - ch='-'; - else if((!stricmp(msg.to,useron.alias) || !stricmp(msg.to,useron.name)) - && !(msg.hdr.attr&MSG_READ)) - ch='!'; - else if(msg.hdr.number>sub[subnum]->ptr) - ch='*'; - else - ch=' '; - bprintf(text[SubMsgLstFmt],(long)i+1 - ,msg.hdr.attr&MSG_ANONYMOUS && !sub_op(subnum) - ? text[Anonymous] : msg.from - ,msg.to - ,ch - ,msg.subj); - smb_freemsgmem(&msg); - msg.total_hfields=0; - i++; } -} - -char *binstr(uchar *buf, ushort length) -{ - static char str[128]; - char tmp[128]; - int i; - -str[0]=0; -for(i=0;i<length;i++) - if(buf[i] && (buf[i]<SP || buf[i]>=0x7f)) - break; -if(i==length) /* not binary */ - return(buf); -for(i=0;i<length;i++) { - sprintf(tmp,"%02X ",buf[i]); - strcat(str,tmp); } -return(str); -} - - -void msghdr(smbmsg_t msg) -{ - int i; - -for(i=0;i<msg.total_hfields;i++) - bprintf("hfield[%u].type %02Xh\r\n" - "hfield[%u].length %d\r\n" - "hfield[%u]_dat %s\r\n" - ,i,msg.hfield[i].type - ,i,msg.hfield[i].length - ,i,binstr(msg.hfield_dat[i],msg.hfield[i].length)); -} - -/****************************************************************************/ -/****************************************************************************/ -post_t HUGE16 *loadposts(ulong *posts, uint subnum, ulong ptr, uint mode) -{ - char name[128]; - ushort aliascrc,namecrc,sysop; - int i,file,skip; - ulong l=0,total,alloc_len; - smbmsg_t msg; - idxrec_t idx; - post_t HUGE16 *post; - -if(posts==NULL) - return(NULL); - -(*posts)=0; - -if((i=smb_locksmbhdr(&smb))!=0) { /* Be sure noone deletes or */ - errormsg(WHERE,ERR_LOCK,smb.file,i); /* adds while we're reading */ - return(NULL); } - -total=filelength(fileno(smb.sid_fp))/sizeof(idxrec_t); /* total msgs in sub */ - -if(!total) { /* empty */ - smb_unlocksmbhdr(&smb); - return(NULL); } - -strcpy(name,useron.name); -strlwr(name); -namecrc=crc16(name); -strcpy(name,useron.alias); -strlwr(name); -aliascrc=crc16(name); -sysop=crc16("sysop"); - -rewind(smb.sid_fp); - -alloc_len=sizeof(post_t)*total; -#ifdef __OS2__ - while(alloc_len%4096) - alloc_len++; -#endif -if((post=(post_t HUGE16 *)LMALLOC(alloc_len))==NULL) { /* alloc for max */ - smb_unlocksmbhdr(&smb); - errormsg(WHERE,ERR_ALLOC,smb.file,sizeof(post_t *)*sub[subnum]->maxmsgs); - return(NULL); } -while(!feof(smb.sid_fp)) { - skip=0; - if(!fread(&idx,sizeof(idxrec_t),1,smb.sid_fp)) - break; - - if(idx.number<=ptr) - continue; - - if(idx.attr&MSG_READ && mode&LP_UNREAD) /* Skip read messages */ - continue; - - if(idx.attr&MSG_DELETE) { /* Pre-flagged */ - if(mode&LP_REP) /* Don't include deleted msgs in REP pkt */ - continue; - if(!(sys_misc&SM_SYSVDELM)) /* Noone can view deleted msgs */ - continue; - if(!(sys_misc&SM_USRVDELM) /* Users can't view deleted msgs */ - && !sub_op(subnum)) /* not sub-op */ - continue; - if(!sub_op(subnum) /* not sub-op */ - && idx.from!=namecrc && idx.from!=aliascrc) /* not for you */ - continue; } - - if(idx.attr&MSG_MODERATED && !(idx.attr&MSG_VALIDATED) - && (mode&LP_REP || !sub_op(subnum))) - break; - - if(idx.attr&MSG_PRIVATE && !(mode&LP_PRIVATE) - && !sub_op(subnum) && !(useron.rest&FLAG('Q'))) { - if(idx.to!=namecrc && idx.from!=namecrc - && idx.to!=aliascrc && idx.from!=aliascrc - && (useron.number!=1 || idx.to!=sysop)) - continue; - if(!smb_lockmsghdr(&smb,&msg)) { - if(!smb_getmsghdr(&smb,&msg)) { - if(stricmp(msg.to,useron.alias) - && stricmp(msg.from,useron.alias) - && stricmp(msg.to,useron.name) - && stricmp(msg.from,useron.name) - && (useron.number!=1 || stricmp(msg.to,"sysop") - || msg.from_net.type)) - skip=1; - smb_freemsgmem(&msg); } - smb_unlockmsghdr(&smb,&msg); } - if(skip) - continue; } - - - if(!(mode&LP_BYSELF) && (idx.from==namecrc || idx.from==aliascrc)) { - msg.idx=idx; - if(!smb_lockmsghdr(&smb,&msg)) { - if(!smb_getmsghdr(&smb,&msg)) { - if(!stricmp(msg.from,useron.alias) - || !stricmp(msg.from,useron.name)) - skip=1; - smb_freemsgmem(&msg); } - smb_unlockmsghdr(&smb,&msg); } - if(skip) - continue; } - - if(!(mode&LP_OTHERS)) { - if(idx.to!=namecrc && idx.to!=aliascrc - && (useron.number!=1 || idx.to!=sysop)) - continue; - msg.idx=idx; - if(!smb_lockmsghdr(&smb,&msg)) { - if(!smb_getmsghdr(&smb,&msg)) { - if(stricmp(msg.to,useron.alias) && stricmp(msg.to,useron.name) - && (useron.number!=1 || stricmp(msg.to,"sysop") - || msg.from_net.type)) - skip=1; - smb_freemsgmem(&msg); } - smb_unlockmsghdr(&smb,&msg); } - if(skip) - continue; } - - post[l].offset=idx.offset; - post[l].number=idx.number; - post[l].to=idx.to; - post[l].from=idx.from; - post[l].subj=idx.subj; - l++; } -smb_unlocksmbhdr(&smb); -if(!l) { - LFREE(post); - post=NULL; } -(*posts)=l; -return(post); -} - - -/****************************************************************************/ -/* Reads posts on subboard sub. 'mode' determines new-posts only, browse, */ -/* or continuous read. */ -/* Returns 0 if normal completion, 1 if aborted. */ -/* Called from function main_sec */ -/****************************************************************************/ -char scanposts(uint subnum, char mode, char *find) -{ - char str[256],str2[256],str3[256],reread=0,mismatches=0 - ,done=0,domsg=1,HUGE16 *buf,*p; - int file,i,j,usub,ugrp,reads=0; - uint lp=0; - long curpost; - ulong msgs,last,posts,l; - post_t HUGE16 *post; - smbmsg_t msg; - -cursubnum=subnum; /* for ARS */ -if(!chk_ar(sub[subnum]->read_ar,useron)) { - bprintf("\1n\r\nYou can't read messages on %s %s\r\n" - ,grp[sub[subnum]->grp]->sname,sub[subnum]->sname); - return(0); } -msg.total_hfields=0; /* init to NULL, specify not-allocated */ -if(!(mode&SCAN_CONST)) - lncntr=0; -if((msgs=getlastmsg(subnum,&last,0))==0) { - if(mode&(SCAN_NEW|SCAN_TOYOU)) - bprintf(text[NScanStatusFmt] - ,grp[sub[subnum]->grp]->sname,sub[subnum]->lname,0L,0L); - else - bprintf(text[NoMsgsOnSub] - ,grp[sub[subnum]->grp]->sname,sub[subnum]->sname); - return(0); } -if(mode&SCAN_NEW && sub[subnum]->ptr>=last && !(mode&SCAN_BACK)) { - if(sub[subnum]->ptr>last) - sub[subnum]->ptr=sub[subnum]->last=last; - bprintf(text[NScanStatusFmt] - ,grp[sub[subnum]->grp]->sname,sub[subnum]->lname,0L,msgs); - return(0); } - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,sub[subnum]->code,i); - return(0); } -sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } - -if(!(mode&SCAN_TOYOU) - && (!mode || mode&SCAN_FIND || !(sub[subnum]->misc&SUB_YSCAN))) - lp=LP_BYSELF|LP_OTHERS; -if(mode&SCAN_TOYOU) - lp|=LP_UNREAD; -post=loadposts(&posts,subnum,0,lp); -if(mode&SCAN_NEW) { /* Scanning for new messages */ - for(curpost=0;curpost<posts;curpost++) - if(sub[subnum]->ptr<post[curpost].number) - break; - bprintf(text[NScanStatusFmt] - ,grp[sub[subnum]->grp]->sname,sub[subnum]->lname,posts-curpost,msgs); - if(!posts) { /* no messages at all */ - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - return(0); } - if(curpost==posts) { /* no new messages */ - if(!(mode&SCAN_BACK)) { - if(post) - LFREE(post); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - return(0); } - curpost=posts-1; } } -else { - if(mode&SCAN_TOYOU) - bprintf(text[NScanStatusFmt] - ,grp[sub[subnum]->grp]->sname,sub[subnum]->lname,posts,msgs); - if(!posts) { - if(!(mode&SCAN_TOYOU)) - bprintf(text[NoMsgsOnSub] - ,grp[sub[subnum]->grp]->sname,sub[subnum]->sname); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - return(0); } - if(mode&SCAN_FIND) { - bprintf(text[SearchSubFmt] - ,grp[sub[subnum]->grp]->sname,sub[subnum]->lname,posts); - domsg=1; - curpost=0; } - else if(mode&SCAN_TOYOU) - curpost=0; - else { - for(curpost=0;curpost<posts;curpost++) - if(post[curpost].number>=sub[subnum]->last) - break; - if(curpost==posts) - curpost=posts-1; - - domsg=1; } } - -if(useron.misc&RIP) - menu("MSGSCAN"); - -if((i=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return(0); } -if((i=smb_getstatus(&smb))!=0) { - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_READ,smb.file,i); - return(0); } -smb_unlocksmbhdr(&smb); -last=smb.status.last_msg; - -action=NODE_RMSG; -if(mode&SCAN_CONST) { /* update action */ - getnodedat(node_num,&thisnode,1); - thisnode.action=NODE_RMSG; - putnodedat(node_num,thisnode); } -while(online && !done) { - - action=NODE_RMSG; - if((i=heapcheck())!=_HEAPOK) { - errormsg(WHERE,ERR_CHK,"heap",i); - break; } - - if(mode&(SCAN_CONST|SCAN_FIND) && sys_status&SS_ABORT) - break; - - if(post==NULL) /* Been unloaded */ - post=loadposts(&posts,subnum,0,lp); /* So re-load */ - - if(!posts) { - done=1; - continue; } - - while(curpost>=posts) curpost--; - - for(ugrp=0;ugrp<usrgrps;ugrp++) - if(usrgrp[ugrp]==sub[subnum]->grp) - break; - for(usub=0;usub<usrsubs[ugrp];usub++) - if(usrsub[ugrp][usub]==subnum) - break; - usub++; - ugrp++; - - msg.idx.offset=post[curpost].offset; - msg.idx.number=post[curpost].number; - msg.idx.to=post[curpost].to; - msg.idx.from=post[curpost].from; - msg.idx.subj=post[curpost].subj; - - if((i=smb_locksmbhdr(&smb))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); - break; } - if((i=smb_getstatus(&smb))!=0) { - smb_unlocksmbhdr(&smb); - errormsg(WHERE,ERR_READ,smb.file,i); - break; } - smb_unlocksmbhdr(&smb); - - if(smb.status.last_msg!=last) { /* New messages */ - last=smb.status.last_msg; - if(post) { - LFREE((void *)post); } - post=loadposts(&posts,subnum,0,lp); /* So re-load */ - if(!posts) - break; - for(curpost=0;curpost<posts;curpost++) - if(post[curpost].number==msg.idx.number) - break; - if(curpost>(posts-1)) - curpost=(posts-1); - continue; } - - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - - if(!loadmsg(&msg,post[curpost].number)) { - if(mismatches>5) { /* We can't do this too many times in a row */ - errormsg(WHERE,ERR_CHK,smb.file,post[curpost].number); - break; } - if(post) - LFREE(post); - post=loadposts(&posts,subnum,0,lp); - if(!posts) - break; - if(curpost>(posts-1)) - curpost=(posts-1); - mismatches++; - continue; } - smb_unlockmsghdr(&smb,&msg); - - mismatches=0; - - if(domsg) { - - if(!reread && mode&SCAN_FIND) { /* Find text in messages */ - buf=smb_getmsgtxt(&smb,&msg,GETMSGTXT_TAILS); - if(!buf) { - if(curpost<posts-1) curpost++; - else done=1; - continue; } - strupr((char *)buf); - if(!strstr((char *)buf,find) && !strstr(msg.subj,find)) { - FREE(buf); - if(curpost<posts-1) curpost++; - else done=1; - continue; } - FREE(buf); } - - if(mode&SCAN_CONST) - bprintf(text[ZScanPostHdr],ugrp,usub,curpost+1,posts); - - if(!reads && mode) - CRLF; - - show_msg(msg - ,msg.from_ext && !strcmp(msg.from_ext,"1") && !msg.from_net.type - ? 0:P_NOATCODES); - - reads++; /* number of messages actually read during this sub-scan */ - - /* Message is to this user and hasn't been read, so flag as read */ - if((!stricmp(msg.to,useron.name) || !stricmp(msg.to,useron.alias) - || (useron.number==1 && !stricmp(msg.to,"sysop") - && !msg.from_net.type)) - && !(msg.hdr.attr&MSG_READ)) { - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=0; - if(!smb_locksmbhdr(&smb)) { /* Lock the entire base */ - if(loadmsg(&msg,msg.idx.number)) { - msg.hdr.attr|=MSG_READ; - msg.idx.attr=msg.hdr.attr; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - smb_unlockmsghdr(&smb,&msg); } - smb_unlocksmbhdr(&smb); } - if(!msg.total_hfields) { /* unsuccessful reload */ - domsg=0; - continue; } } - - sub[subnum]->last=post[curpost].number; - - if(sub[subnum]->ptr<post[curpost].number && !(mode&SCAN_TOYOU)) { - posts_read++; - sub[subnum]->ptr=post[curpost].number; } } - else domsg=1; - if(mode&SCAN_CONST) { - if(curpost<posts-1) curpost++; - else done=1; - continue; } - if(useron.misc&WIP) - menu("MSGSCAN"); - ASYNC; - bprintf(text[ReadingSub],ugrp,grp[sub[subnum]->grp]->sname - ,usub,sub[subnum]->sname,curpost+1,posts); - sprintf(str,"ABCDFILMPQRTY?<>[]{}-+.,"); - if(sub_op(subnum)) - strcat(str,"O"); - reread=0; - l=getkeys(str,posts); - if(l&0x80000000L) { - if((long)l==-1) { /* ctrl-c */ - if(msg.total_hfields) - smb_freemsgmem(&msg); - if(post) - LFREE(post); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - return(1); } - curpost=(l&~0x80000000L)-1; - reread=1; - continue; } - switch(l) { - case 'A': /* Reply to last message */ - domsg=0; - if(!chk_ar(sub[subnum]->post_ar,useron)) { - bputs(text[CantPostOnSub]); - break; } - quotemsg(msg,0); - if(post) - LFREE(post); - post=NULL; - postmsg(subnum,&msg,WM_QUOTE); -// post=loadposts(&posts,subnum,0,lp); - if(mode&SCAN_TOYOU) - domsg=1; - break; - case 'B': /* Skip sub-board */ - if(mode&SCAN_NEW && !noyes(text[RemoveFromNewScanQ])) - sub[subnum]->misc&=~SUB_NSCAN; - if(msg.total_hfields) - smb_freemsgmem(&msg); - if(post) - LFREE(post); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - return(0); - case 'C': /* Continuous */ - mode|=SCAN_CONST; - if(curpost<posts-1) curpost++; - else done=1; - break; - case 'D': /* Delete message on sub-board */ - domsg=0; - if(!sub_op(subnum) && !(sub[subnum]->misc&SUB_DEL)) { - bputs(text[CantDeletePosts]); - break; } - if(!sub_op(subnum)) { - if(stricmp(sub[subnum]->misc&SUB_NAME - ? useron.name : useron.alias, msg.from) - && stricmp(sub[subnum]->misc&SUB_NAME - ? useron.name : useron.alias, msg.to)) { - bprintf(text[YouDidntPostMsgN],curpost+1); - break; } } - if(msg.hdr.attr&MSG_PERMANENT) { - bputs("\1n\r\nMessage is marked permanent.\r\n"); - domsg=0; - break; } - if(post) - LFREE(post); - post=NULL; - - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=0; - if(loadmsg(&msg,msg.idx.number)) { - msg.idx.attr^=MSG_DELETE; - msg.hdr.attr=msg.idx.attr; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - smb_unlockmsghdr(&smb,&msg); - if(i==0 && msg.idx.attr&MSG_DELETE) { - sprintf(str,"Removed post from %s %s" - ,grp[sub[subnum]->grp]->sname,sub[subnum]->lname); - logline("P-",str); - if(!stricmp(sub[subnum]->misc&SUB_NAME - ? useron.name : useron.alias, msg.from)) - useron.posts=adjustuserrec(useron.number - ,U_POSTS,5,-1); } } - domsg=1; - if((sys_misc&SM_SYSVDELM // anyone can view delete msgs - || (sys_misc&SM_USRVDELM // sys/subops can view deleted msgs - && sub_op(subnum))) - && curpost<posts-1) - curpost++; - if(curpost>=posts-1) - done=1; - break; - - case 'F': /* find text in messages */ - domsg=0; - bprintf(text[StartWithN],curpost+2); - if((i=getnum(posts))<0) - break; - if(i) - i--; - else - i=curpost+1; - bputs(text[SearchStringPrompt]); - if(!getstr(str,40,K_LINE|K_UPPER)) - break; - searchposts(subnum,post,(long)i,posts,str); - break; - case 'I': /* Sub-board information */ - domsg=0; - subinfo(subnum); - break; - case 'L': /* List messages */ - domsg=0; - bprintf(text[StartWithN],curpost+1); - if((i=getnum(posts))<0) - break; - if(i) i--; - else i=curpost; - listmsgs(subnum,post,i,posts); - break; - case 'M': /* Reply to last post in mail */ - domsg=0; - if(msg.hdr.attr&MSG_ANONYMOUS && !sub_op(subnum)) { - bputs(text[CantReplyToAnonMsg]); - break; } - if(!sub_op(subnum) && msg.hdr.attr&MSG_PRIVATE - && stricmp(msg.to,useron.name) - && stricmp(msg.to,useron.alias)) - break; - sprintf(str2,text[Regarding] - ,msg.subj - ,timestr((time_t *)&msg.hdr.when_written.time)); - if(msg.from_net.type==NET_FIDO) - sprintf(str,"%s @%s",msg.from - ,faddrtoa(*(faddr_t *)msg.from_net.addr)); - else if(msg.from_net.type==NET_INTERNET) - strcpy(str,msg.from_net.addr); - else if(msg.from_net.type) - sprintf(str,"%s@%s",msg.from,msg.from_net.addr); - else - strcpy(str,msg.from); - bputs(text[Email]); - if(!getstr(str,60,K_EDIT|K_AUTODEL)) - break; - if(post) - LFREE(post); - post=NULL; - quotemsg(msg,1); - if(msg.from_net.type==NET_INTERNET - && (!strcmp(str,msg.from_net.addr) || strchr(str,'@'))) - inetmail(str,msg.subj,WM_QUOTE|WM_NETMAIL); - else { - p=strrchr(str,'@'); - if(p) /* FidoNet or QWKnet */ - netmail(str,msg.subj,WM_QUOTE); - else { - i=atoi(str); - if(!i) { - if(sub[subnum]->misc&SUB_NAME) - i=userdatdupe(0,U_NAME,LEN_NAME,str,0); - else - i=matchuser(str); } - email(i,str2,msg.subj,WM_EMAIL|WM_QUOTE); } } -// post=loadposts(&posts,subnum,0,lp); - break; - case 'P': /* Post message on sub-board */ - domsg=0; - if(!chk_ar(sub[subnum]->post_ar,useron)) - bputs(text[CantPostOnSub]); - else { - if(post) - LFREE(post); - post=NULL; - postmsg(subnum,0,0); -// post=loadposts(&posts,subnum,0,lp); - } - break; - case 'Q': /* Quit */ - if(msg.total_hfields) - smb_freemsgmem(&msg); - if(post) - LFREE(post); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - return(1); - case 'R': /* re-read last message */ - reread=1; - break; - case 'T': /* List titles of next ten messages */ - domsg=0; - if(!posts) - break; - if(curpost>=posts-1) { - done=1; - break; } - i=curpost+11; - if(i>posts) - i=posts; - listmsgs(subnum,post,curpost+1,i); - curpost=i-1; - if(sub[subnum]->ptr<post[curpost].number) - sub[subnum]->ptr=post[curpost].number; - break; - case 'Y': /* Your messages */ - domsg=0; - showposts_toyou(post,0,posts); - break; - case '-': - if(curpost>0) curpost--; - reread=1; - break; - case 'O': /* Operator commands */ - while(online) { - if(!(useron.misc&EXPERT)) - menu("SYSMSCAN"); - bprintf("\r\n\1y\1hOperator: \1w"); - strcpy(str,"?CEHMPQUV"); - if(SYSOP) - strcat(str,"S"); - switch(getkeys(str,0)) { - case '?': - if(useron.misc&EXPERT) - menu("SYSMSCAN"); - continue; - case 'P': /* Purge user */ - purgeuser(sub[subnum]->misc&SUB_NAME - ? userdatdupe(0,U_NAME,LEN_NAME,msg.from,0) - : matchuser(msg.from)); - break; - case 'C': /* Change message attributes */ - i=chmsgattr(msg.hdr.attr); - if(msg.hdr.attr==i) - break; - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=0; - if(loadmsg(&msg,msg.idx.number)) { - msg.hdr.attr=msg.idx.attr=i; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - smb_unlockmsghdr(&smb,&msg); } - break; - case 'E': /* edit last post */ - if(post) - LFREE(post); - post=NULL; - editmsg(&msg,subnum); -// post=loadposts(&posts,subnum,0,lp); - break; - case 'H': /* View message header */ - msghdr(msg); - domsg=0; - break; - case 'M': /* Move message */ - domsg=0; - if(post) - LFREE(post); - post=NULL; - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=0; - if(!loadmsg(&msg,msg.idx.number)) { - errormsg(WHERE,ERR_READ,smb.file,msg.idx.number); - break; } - sprintf(str,text[DeletePostQ],msg.hdr.number,msg.subj); - if(movemsg(msg,subnum) && yesno(str)) { - msg.idx.attr|=MSG_DELETE; - msg.hdr.attr=msg.idx.attr; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); } - smb_unlockmsghdr(&smb,&msg); -// post=loadposts(&posts,subnum,0,lp); - break; - - case 'Q': - break; - case 'S': /* Save/Append message to another file */ -/* 05/26/95 - if(!yesno(text[SaveMsgToFile])) - break; -*/ - bputs(text[FileToWriteTo]); - if(getstr(str,40,K_LINE|K_UPPER)) - msgtotxt(msg,str,1,1); - break; - case 'U': /* User edit */ - useredit(sub[subnum]->misc&SUB_NAME - ? userdatdupe(0,U_NAME,LEN_NAME,msg.from,0) - : matchuser(msg.from),0); - break; - case 'V': /* Validate message */ - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=0; - if(loadmsg(&msg,msg.idx.number)) { - msg.idx.attr|=MSG_VALIDATED; - msg.hdr.attr=msg.idx.attr; - if((i=smb_putmsg(&smb,&msg))!=0) - errormsg(WHERE,ERR_WRITE,smb.file,i); - smb_unlockmsghdr(&smb,&msg); } - break; - default: - continue; } - break; } - break; - case '.': /* Thread forward */ - l=msg.hdr.thread_first; - if(!l) l=msg.hdr.thread_next; - if(!l) { - domsg=0; - break; } - for(i=0;i<posts;i++) - if(l==post[i].number) - break; - if(i<posts) - curpost=i; - break; - case ',': /* Thread backwards */ - if(!msg.hdr.thread_orig) { - domsg=0; - break; } - for(i=0;i<posts;i++) - if(msg.hdr.thread_orig==post[i].number) - break; - if(i<posts) - curpost=i; - break; - case '>': /* Search Title forward */ - for(i=curpost+1;i<posts;i++) - if(post[i].subj==msg.idx.subj) - break; - if(i<posts) - curpost=i; - else - domsg=0; - break; - case '<': /* Search Title backward */ - for(i=curpost-1;i>-1;i--) - if(post[i].subj==msg.idx.subj) - break; - if(i>-1) - curpost=i; - else - domsg=0; - break; - case '}': /* Search Author forward */ - strcpy(str,msg.from); - for(i=curpost+1;i<posts;i++) - if(post[i].from==msg.idx.from) - break; - if(i<posts) - curpost=i; - else - domsg=0; - break; - case '{': /* Search Author backward */ - strcpy(str,msg.from); - for(i=curpost-1;i>-1;i--) - if(post[i].from==msg.idx.from) - break; - if(i>-1) - curpost=i; - else - domsg=0; - break; - case ']': /* Search To User forward */ - strcpy(str,msg.to); - for(i=curpost+1;i<posts;i++) - if(post[i].to==msg.idx.to) - break; - if(i<posts) - curpost=i; - else - domsg=0; - break; - case '[': /* Search To User backward */ - strcpy(str,msg.to); - for(i=curpost-1;i>-1;i--) - if(post[i].to==msg.idx.to) - break; - if(i>-1) - curpost=i; - else - domsg=0; - break; - case 0: /* Carriage return - Next Message */ - case '+': - if(curpost<posts-1) curpost++; - else done=1; - break; - case '?': - menu("MSGSCAN"); - domsg=0; - break; } } -if(msg.total_hfields) - smb_freemsgmem(&msg); -if(post) - LFREE(post); -if(!(mode&(SCAN_CONST|SCAN_TOYOU|SCAN_FIND)) && !(sub[subnum]->misc&SUB_PONLY) - && reads && chk_ar(sub[subnum]->post_ar,useron) - && !(useron.rest&FLAG('P'))) { - sprintf(str,text[Post],grp[sub[subnum]->grp]->sname - ,sub[subnum]->lname); - if(!noyes(str)) - postmsg(subnum,0,0); } -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); -return(0); -} - -/****************************************************************************/ -/* This function will search the specified sub-board for messages that */ -/* contain the string 'search'. */ -/* Returns number of messages found. */ -/****************************************************************************/ -int searchsub(uint subnum,char *search) -{ - int i,found; - ulong l,posts,total; - post_t HUGE16 *post; - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,sub[subnum]->code,i); - return(0); } -total=getposts(subnum); -sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } -post=loadposts(&posts,subnum,0,LP_BYSELF|LP_OTHERS); -bprintf(text[SearchSubFmt] - ,grp[sub[subnum]->grp]->sname,sub[subnum]->lname,posts,total); -found=searchposts(subnum,post,0,posts,search); -if(posts) - LFREE(post); -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); -return(found); -} - -/****************************************************************************/ -/* Will search the messages pointed to by 'msg' for the occurance of the */ -/* string 'search' and display any messages (number of message, author and */ -/* title). 'msgs' is the total number of valid messages. */ -/* Returns number of messages found. */ -/****************************************************************************/ -int searchposts(uint subnum, post_t HUGE16 *post, long start, long posts - , char *search) -{ - char HUGE16 *buf,ch; - ushort xlat; - int i,j; - long l,length,found=0; - smbmsg_t msg; - -msg.total_hfields=0; -for(l=start;l<posts && !msgabort();l++) { - msg.idx.offset=post[l].offset; - if(!loadmsg(&msg,post[l].number)) - continue; - smb_unlockmsghdr(&smb,&msg); - buf=smb_getmsgtxt(&smb,&msg,1); - if(!buf) { - smb_freemsgmem(&msg); - continue; } - strupr((char *)buf); - if(strstr((char *)buf,search) || strstr(msg.subj,search)) { - if(!found) - CRLF; - if(msg.hdr.attr&MSG_DELETE) - ch='-'; - else if((!stricmp(msg.to,useron.alias) || !stricmp(msg.to,useron.name)) - && !(msg.hdr.attr&MSG_READ)) - ch='!'; - else if(msg.hdr.number>sub[subnum]->ptr) - ch='*'; - else - ch=' '; - bprintf(text[SubMsgLstFmt],l+1 - ,(msg.hdr.attr&MSG_ANONYMOUS) && !sub_op(subnum) ? text[Anonymous] - : msg.from - ,msg.to - ,ch - ,msg.subj); - found++; } - FREE(buf); - smb_freemsgmem(&msg); } - -return(found); -} - -/****************************************************************************/ -/* Will search the messages pointed to by 'msg' for message to the user on */ -/* Returns number of messages found. */ -/****************************************************************************/ -void showposts_toyou(post_t HUGE16 *post, ulong start, ulong posts) -{ - char str[128]; - ushort namecrc,aliascrc,sysop; - int i; - ulong l,found; - smbmsg_t msg; - -strcpy(str,useron.alias); -strlwr(str); -aliascrc=crc16(str); -strcpy(str,useron.name); -strlwr(str); -namecrc=crc16(str); -sysop=crc16("sysop"); -msg.total_hfields=0; -for(l=start,found=0;l<posts && !msgabort();l++) { - - if((useron.number!=1 || post[l].to!=sysop) - && post[l].to!=aliascrc && post[l].to!=namecrc) - continue; - - if(msg.total_hfields) - smb_freemsgmem(&msg); - msg.total_hfields=0; - msg.idx.offset=post[l].offset; - if(!loadmsg(&msg,post[l].number)) - continue; - smb_unlockmsghdr(&smb,&msg); - if((useron.number==1 && !stricmp(msg.to,"sysop") && !msg.from_net.type) - || !stricmp(msg.to,useron.alias) || !stricmp(msg.to,useron.name)) { - if(!found) - CRLF; - found++; - bprintf(text[SubMsgLstFmt],l+1 - ,(msg.hdr.attr&MSG_ANONYMOUS) && !SYSOP - ? text[Anonymous] : msg.from - ,msg.to - ,msg.hdr.attr&MSG_DELETE ? '-' : msg.hdr.attr&MSG_READ ? ' ' : '*' - ,msg.subj); } } - -if(msg.total_hfields) - smb_freemsgmem(&msg); -} - -/****************************************************************************/ -/* This function will search the specified sub-board for messages that */ -/* are sent to the currrent user. */ -/* returns number of messages found */ -/****************************************************************************/ -int searchsub_toyou(uint subnum) -{ - int i; - ulong l,posts,total; - post_t HUGE16 *post; - -if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) { - errormsg(WHERE,ERR_OPEN,sub[subnum]->code,i); - return(0); } -total=getposts(subnum); -sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smb.retry_time=smb_retry_time; -if((i=smb_open(&smb))!=0) { - smb_stack(&smb,SMB_STACK_POP); - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } -post=loadposts(&posts,subnum,0,0); -bprintf(text[SearchSubFmt] - ,grp[sub[subnum]->grp]->sname,sub[subnum]->lname,total); -if(posts) { - if(post) - LFREE(post); - post=loadposts(&posts,subnum,0,LP_BYSELF|LP_OTHERS); - showposts_toyou(post,0,posts); } -if(post) - LFREE(post); -smb_close(&smb); -smb_stack(&smb,SMB_STACK_POP); -return(posts); -} - - diff --git a/src/sbbs2/rio/riodefs.h b/src/sbbs2/rio/riodefs.h deleted file mode 100644 index fa5e54f148..0000000000 --- a/src/sbbs2/rio/riodefs.h +++ /dev/null @@ -1,102 +0,0 @@ -/* RIODEFS.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#ifndef _RIODEFS_H -#define _RIODEFS_H - - -/************************/ -/* Remote I/O Constants */ -/************************/ - - /* i/o mode and state flags */ -#define CTSCK 0x1000 /*.check cts (mode only) */ -#define RTSCK 0x2000 /*.check rts (mode only) */ -#define TXBOF 0x0800 /*.transmit buffer overflow (outcom only) */ -#define ABORT 0x0400 /*.check for ^C (mode), aborting (state) */ -#define PAUSE 0x0200 /*.check for ^S (mode), pausing (state) */ -#define NOINP 0x0100 /*.input buffer empty (incom only) */ - - /* status flags */ -#define DCD 0x0080 /*.DCD on */ -#define RI 0x0040 /*.Ring indicate */ -#define DSR 0x0020 /*.Dataset ready */ -#define CTS 0x0010 /*.CTS on */ -#define FERR 0x0008 /*.Frameing error */ -#define PERR 0x0004 /*.Parity error */ -#define OVRR 0x0002 /*.Overrun */ -#define RXLOST 0x0001 /*.Receive buffer overflow */ - -/* rioctl() arguments */ -/* returns mode or state flags in high 8 bits, status flags in low 8 bits */ - - /* the following return mode in high 8 bits */ -#define IOMODE 0x0000 /*.no operation */ -#define IOSM 0x0001 /*.i/o set mode flags */ -#define IOCM 0x0002 /*.i/o clear mode flags */ - -#define GVERS 0x0007 /*.get version */ -#define GUART 0x0107 /*.get uart */ -#define GIRQN 0x0207 /*.get IRQ number */ -#define GBAUD 0x0307 /*.get baud */ - - /* the following return state in high 8 bits */ -#define IOSTATE 0x0004 /*.no operation */ -#define IOSS 0x0005 /*.i/o set state flags */ -#define IOCS 0x0006 /*.i/o clear state flags */ -#define IOFB 0x0308 /*.i/o buffer flush */ -#define IOFI 0x0208 /*.input buffer flush */ -#define IOFO 0x0108 /*.output buffer flush */ -#define IOCE 0x0009 /* i/o clear error flags */ - - - /* return count (16bit) */ -#define RXBC 0x000a /*.get receive buffer count */ -#define RXBS 0x010a /*.get receive buffer size */ -#define TXBC 0x000b /*.get transmit buffer count */ -#define TXBS 0x010b /*.get transmit buffer size */ -#define TXBF 0x020b /*.get transmit buffer free space */ -#define TXSYNC 0x000c /*.sync transmition (seconds<<8|0x0c) */ -#define IDLE 0x000d /* suspend communication routines */ -#define RESUME 0x010d /* return from suspended state */ -#define RLERC 0x000e /* read line error count and clear */ -#define CPTON 0x0110 /* set input translation flag for ctrl-p on */ -#define CPTOFF 0x0010 /* set input translation flag for ctrl-p off */ -#define GETCPT 0x8010 /* return the status of ctrl-p translation */ -#define MSR 0x0011 /* read modem status register */ -#define FIFOCTL 0x0012 /*.FIFO UART control */ -#define TSTYPE 0x0013 /* Time-slice API type */ -#define GETTST 0x8013 /* Get Time-slice API type */ - -#define I14DB 0x001d /* DigiBoard int 14h driver */ -#define I14PC 0x011d /* PC int 14h driver */ -#define I14PS 0x021d /* PS/2 int 14h driver */ -#define I14FO 0x031d /* FOSSIL int 14h driver */ - -#define SMSMK 0x0014 /* set modem status mask */ -#define SMLCR 0x0015 /* set modem line control register */ -#define LFN81 0x0315 /*.set line format N81 */ -#define LFE71 0x1A15 /*.set line format E71 */ -#define SRXHL 0x001E /* set receive flow control high limit */ -#define SRXLL 0x001F /* set receive flow control low limit */ -#define IGCLS 0x0020 /* input gate close */ -#define IGOPN 0xFF20 /* input gate open */ - - - /* ivhctl() arguments */ -#define INT29R 0x0001 /* copy int 29h output to remote */ -#define INT29L 0x0002 /* Use _putlc for int 29h */ -#define INT16 0x0010 /* return remote chars to int 16h calls */ -#define INTCLR 0x0000 /* release int 16h, int 29h */ - -#define TS_INT28 1 -#define TS_WINOS2 2 -#define TS_NODV 4 - -#define RIO_OUTCOM_STKLEN 4096 /* outcom_thread() stack size */ -#define RIO_OUTCOM_BUFLEN 4096 /* outcom() buffer length */ -#define RIO_INCOM_BUFLEN 1024 /* incom() buffer length */ - - -#endif /* Don't add anything after this line */ diff --git a/src/sbbs2/rio/riolib.c b/src/sbbs2/rio/riolib.c deleted file mode 100644 index 18cee97d54..0000000000 --- a/src/sbbs2/rio/riolib.c +++ /dev/null @@ -1,965 +0,0 @@ -/* RIOLIB.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Remote communications Input/Output Library for OS/2 and Win32 */ - -#define RIOLIB_VER 100 - -#ifdef __OS2__ - #define INCL_DOSDEVICES - #define INCL_DOSDEVIOCTL - #define INCL_DOS - #include <os2.h> - -#else // Win32 - - #include <windows.h> -#endif - -#include <time.h> -#include <stdio.h> -#include <fcntl.h> -#include <string.h> -#include <process.h> -#include "riolib.h" -#include "riodefs.h" - -int rio_handle=-1; - -int rio_abort=0,rio_aborted=0; -int inbufbot,inbuftop; -int outbufbot,outbuftop; -char inbuf[RIO_INCOM_BUFLEN]; -char outbuf[RIO_OUTCOM_BUFLEN]; - -/****************************************************************************/ -/* OS/2 Specific */ -/****************************************************************************/ - -#ifdef __OS2__ - -HEV rio_sem; - -typedef struct { /* Packet for Get/Set Device Control Block Parms */ - - ushort wr_timeout; - ushort rd_timeout; - uchar flags1; - uchar flags2; - uchar flags3; - uchar err_char; - uchar brk_char; - uchar xon_char; - uchar xoff_char; - - } async_dcb_t; - -typedef struct { /* Parameter Packet for Extended Set Bit Rate */ - - ulong rate; - uchar frac; - - } setrate_t; - -typedef struct { /* Data Packet for Extended Query Bit Rate */ - - ulong cur_rate; - uchar cur_rate_frac; - ulong min_rate; - uchar min_rate_frac; - ulong max_rate; - uchar max_rate_frac; - - } getrate_t; - -typedef struct { /* Data Packet for Query Number of Chars Queue */ - - ushort cur, - max; - - } getqueue_t; - -typedef struct { /* Parameter Packet for Set Modem Control Signals */ - - uchar on; - uchar off; - - } setmdmctrl_t; - -typedef struct { /* Parameter Packet for Set Line Characteristics */ - - uchar data; - uchar parity; - uchar stop; - - } setline_t; - -#else - -/****************************************************************************/ -/* Win32 Specific */ -/****************************************************************************/ - -HANDLE rio_event; - -#endif - -/************************************************************************/ -/* Opens COM port, ignoring IRQ argument */ -/* Returns 0 on no error */ -/************************************************************************/ -int rioini(int com, int unused) -{ - char str[64]; -#ifdef __OS2__ - async_dcb_t async_dcb; -#else // Win32 - DCB dcb; - COMMTIMEOUTS timeouts; -#endif - -#ifdef __WATOMC__ - char *stack; -#endif - -inbufbot=inbuftop=outbufbot=outbuftop=0; /* clear our i/o buffers */ - -if(!com) { /* Close port */ - if(rio_handle>=0) { -#ifdef __OS2__ - close(rio_handle); - rio_handle=-1; /* signal outcom_thread() to end */ - DosPostEventSem(rio_sem); -#else // Win32 - CloseHandle((HANDLE)rio_handle); - rio_handle=-1; - SetEvent(rio_event); -#endif - return(0); } - return(-2); } - -sprintf(str,"COM%u",com); -#ifdef __OS2__ -if(rio_handle==-1) { /* Not already opened */ - if((rio_handle=open(str,O_RDWR|O_BINARY,0))==-1) - return(-1); } -#else // Win32 -if(rio_handle==-1) { /* Not already opened */ - if((rio_handle=(int)CreateFile(str - ,GENERIC_READ|GENERIC_WRITE /* Access */ - ,0 /* Share mode */ - ,NULL /* Security attributes */ - ,OPEN_EXISTING /* Create access */ - ,FILE_ATTRIBUTE_NORMAL /* File attributes */ - ,NULL /* Template */ - ))==(int)INVALID_HANDLE_VALUE) - return(-1); } -#endif - -#ifdef __OS2__ - -if(DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x73 /* Query Device Control Block (DCB) Parms */ - ,NULL - ,0 - ,NULL - ,&async_dcb - ,sizeof(async_dcb) - ,NULL)) - return(-6); - -async_dcb.flags2&=~(1<<1); /* Disable Automatic Recv XON/XOFF flow ctrl */ -/* Extended Hardware Buffering (16550 FIFO) */ -if(async_dcb.flags3&((1<<4)|(1<<3))) { /* Supported */ - async_dcb.flags3&=~((1<<3)|(1<<6)|(1<<5)); /* Set to 1 char trgr lvl */ - async_dcb.flags3|=((1<<4)|(1<<7)); } /* Set to 16 char tx buf */ -async_dcb.flags3|=((1<<2)|(1<<1)); /* No-Wait read timeout */ -async_dcb.flags3&=~(1<<0); /* Normal write timeout */ -async_dcb.wr_timeout=499; /* 5 seconds? */ -DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x53 /* Set Device Control Block (DCB) Parms */ - ,(void *)&async_dcb - ,sizeof(async_dcb) - ,NULL - ,NULL - ,0 - ,NULL); - -if(DosCreateEventSem(NULL,&rio_sem,0,0)) - return(-5); - -#else // Win32 - -if(GetCommState((HANDLE)rio_handle,&dcb)!=TRUE) - return(-6); - -dcb.fBinary=1; // No EOF check -dcb.fDtrControl=DTR_CONTROL_ENABLE; -dcb.fDsrSensitivity=FALSE; -dcb.fOutX=0; // No Xon/Xoff out -dcb.fInX=0; // No Xon/Xoff in -dcb.fErrorChar=FALSE; // No character replacement -dcb.fNull=0; // No null stripping -dcb.fAbortOnError=0; // Continue to communicate even if error detected - -SetCommState((HANDLE)rio_handle,&dcb); - -if(GetCommTimeouts((HANDLE)rio_handle,&timeouts)!=TRUE) - return(-7); - -timeouts.ReadIntervalTimeout=MAXDWORD; -timeouts.ReadTotalTimeoutMultiplier=0; -timeouts.ReadTotalTimeoutConstant=0; // No-wait read timeout -timeouts.WriteTotalTimeoutMultiplier=0; -timeouts.WriteTotalTimeoutConstant=5000; // 5 seconds -SetCommTimeouts((HANDLE)rio_handle,&timeouts); - -SetupComm((HANDLE)rio_handle,4096,4096); /* Init Rx and Tx buffer sizes */ - -if((rio_event=CreateEvent(NULL /* Security attributes */ - ,TRUE /* Manual reset */ - ,FALSE /* Non-signaled by default */ - ,NULL /* Event name */ - ))==NULL) - return(-5); - -#endif - -#ifdef __WATCOMC__ -stack=malloc(RIO_OUTCOM_STACK); -if(stack==NULL) - return(-4); -if(_beginthread(outcom_thread,stack,RIO_OUTCOM_STKLEN,NULL)==-1) - return(-3); -#else -if(_beginthread(outcom_thread,RIO_OUTCOM_STKLEN,NULL)==(ulong)-1) - return(-3); -#endif - - -return(0); -} - -/************************************************************************/ -/* Raise or lower DTR */ -/* If onoff is 0, drop and exit, 1 raise and exit, >1 drop and wait */ -/* up to x seconds for DCD to drop, return 0 on success, 1 on failure */ -/************************************************************************/ -int dtr(char onoff) -{ -#ifdef __OS2__ - setmdmctrl_t setmdmctrl; - ulong start; - ushort w; - uchar c; - -if(onoff==1) { - setmdmctrl.on=1; - setmdmctrl.off=0xff; } -else { - setmdmctrl.on=0; - setmdmctrl.off=0xfe; } - -DosDevIOCtl(rio_handle, IOCTL_ASYNC, 0x46 /* Set Modem Ctrl Signals */ - ,&setmdmctrl - ,sizeof(setmdmctrl) - ,NULL - ,&w - ,sizeof(short) - ,NULL); - -if(onoff<=1) - return(0); - -start=time(NULL); -while(time(NULL)-start<=onoff) { - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x67 /* Get Modem Input Signals */ - ,NULL - ,0 - ,NULL - ,&c - ,1 - ,NULL); - if(!(c&DCD)) /* DCD is low */ - return(0); - DosSleep(1); } - -#else // Win32 - - ulong l,start; - -if(onoff==1) - EscapeCommFunction((HANDLE)rio_handle,SETDTR); -else - EscapeCommFunction((HANDLE)rio_handle,CLRDTR); - -if(onoff<=1) - return(0); - -start=time(NULL); -while(time(NULL)-start<=onoff) { - GetCommModemStatus((HANDLE)rio_handle,&l); - if(!(l&MS_RLSD_ON)) // DCD is low - return(0); - Sleep(1000); } - -#endif - -return(1); /* Dropping DTR failed to lower DCD */ -} - - - -/************************************************************************/ -/* Returns the current DTE rate of the currently open COM port */ -/************************************************************************/ -long rio_getbaud(void) -{ -#ifdef __OS2__ - getrate_t getrate; - -if(DosDevIOCtl(rio_handle, IOCTL_ASYNC, 0x63 /* Extended Query Bit Rate */ - ,NULL - ,0 - ,NULL - ,&getrate - ,sizeof(getrate) - ,NULL)==0) - return(getrate.cur_rate); - -#else // Win32 - - DCB dcb; - -if(GetCommState((HANDLE)rio_handle,&dcb)==TRUE) { - switch(dcb.BaudRate) { - case CBR_110: - return(110); - case CBR_300: - return(300); - case CBR_600: - return(600); - case CBR_1200: - return(1200); - case CBR_2400: - return(2400); - case CBR_4800: - return(4800); - case CBR_9600: - return(9600); - case CBR_14400: - return(14400); - case CBR_19200: - return(19200); - case CBR_38400: - return(38400); - case CBR_56000: - return(56000); - case CBR_57600: - return(57600); - case CBR_115200: - return(115200); - case CBR_128000: - return(128000); - case CBR_256000: - return(256000); - default: - return(dcb.BaudRate); } } - -#endif - -return(-1); // Error -} - - -/************************************************************************/ -/* Sets the current DTE rate */ -/* Returns 0 on success */ -/************************************************************************/ -int setbaud(int rate) -{ -#ifdef __OS2__ - setrate_t setrate; - APIRET ret; - -setrate.rate=rate; -setrate.frac=0; - -ret=DosDevIOCtl(rio_handle, IOCTL_ASYNC, 0x43 /* Extended Set Bit Rate */ - ,&setrate - ,sizeof(setrate) - ,NULL - ,NULL - ,0 - ,NULL); - -if(ret) - return(ret); - -if(rio_getbaud()!=rate) /* Make sure it actually changed rates */ - return(-1); - -#else // Win32 - - DCB dcb; - -if(GetCommState((HANDLE)rio_handle,&dcb)!=TRUE) - return(-1); -dcb.BaudRate=rate; -if(SetCommState((HANDLE)rio_handle,&dcb)!=TRUE) - return(-1); - -#endif - -return(0); -} - -/************************************************************************/ -/* Return next incoming character from COM port, NOINP if none avail. */ -/* Uses a linear buffer. */ -/************************************************************************/ -int incom(void) -{ - char c; - -if(inbufbot!=inbuftop) { - c=inbuf[inbufbot]; - inbufbot++; - if(inbufbot==inbuftop) - inbufbot=inbuftop=0; - if(rio_abort && c==3) { /* Ctrl-C */ - rio_aborted=1; - rioctl(IOFO); - return(NOINP); } - return(c); } - -inbufbot=0; -#ifdef __OS2__ -inbuftop=read(rio_handle,inbuf,RIO_INCOM_BUFLEN); -#else // Win32 -ReadFile((HANDLE)rio_handle,inbuf,RIO_INCOM_BUFLEN,(DWORD *)&inbuftop,NULL); -#endif -if(inbuftop<=0 || inbuftop>RIO_INCOM_BUFLEN) { - inbuftop=0; - return(NOINP); } -else - return(inbuf[inbufbot++]); -} - -/************************************************************************/ -/* Return number of chars in our input buffer */ -/************************************************************************/ -int inbufcnt(void) -{ -return(inbuftop-inbufbot); -} - -/************************************************************************/ -/* Place a character into outbound buffer, return TXBOF on buffer */ -/* overflow, 0 on success. */ -/************************************************************************/ -int outcom(int ch) -{ - int i=outbuftop+1; - -if(i==RIO_OUTCOM_BUFLEN) - i=0; -if(i==outbufbot) - return(TXBOF); -outbuf[outbuftop++]=ch; -if(outbuftop==RIO_OUTCOM_BUFLEN) - outbuftop=0; -#ifdef __OS2__ -DosPostEventSem(rio_sem); // Enable output -#else // Win32 -SetEvent(rio_event); -#endif -return(0); -} - -/************************************************************************/ -/************************************************************************/ -void outcom_thread(void *unused) -{ - int i,top; - ulong l; - -while(rio_handle>=0) { - if(outbufbot==outbuftop) { -#ifdef __OS2__ - DosResetEventSem(rio_sem,&l); - DosWaitEventSem(rio_sem,10000); /* every 10 seconds */ -#else // Win32 - ResetEvent(rio_event); - WaitForSingleObject(rio_event,10000); -#endif - continue; } - top=outbuftop; - if(top<outbufbot) - i=RIO_OUTCOM_BUFLEN-outbufbot; - else - i=top-outbufbot; -#ifdef __OS2__ - i=write(rio_handle,outbuf+outbufbot,i); -#else // Win32 - WriteFile((HANDLE)rio_handle,outbuf+outbufbot,i,(DWORD *)&i,NULL); -#endif - if(i>0 && i<=RIO_OUTCOM_BUFLEN-outbufbot) - outbufbot+=i; - if(outbufbot==RIO_OUTCOM_BUFLEN) - outbufbot=0; } -_endthread(); -} - -/************************************************************************/ -/* Return number of chars in our output buffer */ -/************************************************************************/ -int outbufcnt(void) -{ -if(outbuftop>=outbufbot) - return(outbuftop-outbufbot); -return(outbuftop+(RIO_OUTCOM_BUFLEN-outbufbot)); -} - -/************************************************************************/ -/************************************************************************/ -int rio_getstate(void) -{ -#ifdef __OS2__ - uchar c; - ushort state=0,w; - getqueue_t getqueue; - -if(rio_abort && !rio_aborted) { - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x68 /* Query # of chars in rx queue */ - ,NULL - ,0 - ,NULL - ,&getqueue - ,sizeof(getqueue) - ,NULL); - if(getqueue.cur && read(rio_handle,&c,1)==1) { - if(c==3) { /* ctrl-c */ - rio_aborted=1; - rioctl(IOFO); } - else - if(inbuftop<RIO_INCOM_BUFLEN) /* don't overflow input buffer */ - inbuf[inbuftop++]=c; } } - -if(rio_aborted) - state|=ABORT; - -#if 0 // just to see if things speed up -DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x6D /* Query COM Error */ - ,NULL - ,0 - ,NULL - ,&w - ,sizeof(short) - ,NULL); -state|=w&0xf; /* FERR|PERR|OVRR|RXLOST */ -#endif - -DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x67 /* Query Modem Input Signals */ - ,NULL - ,0 - ,NULL - ,&c - ,sizeof(char) - ,NULL); -state|=c&0xf0; /* DCD|RI|DSR|CTS */ - -#else // Win32 - - uchar c; - ushort state=0; - int i; - ulong l; - COMSTAT comstat; - -if(rio_abort && !rio_aborted) { - ClearCommError((HANDLE)rio_handle,&l,&comstat); - if(comstat.cbInQue) { - ReadFile((HANDLE)rio_handle,&c,1,(DWORD *)&i,NULL); - if(i==1) { - if(c==3) { /* Ctrl-C */ - rio_aborted=1; - rioctl(IOFO); } - else - if(inbuftop<RIO_INCOM_BUFLEN) /* don't overflow input buffer */ - inbuf[inbuftop++]=c; } } } - -GetCommModemStatus((HANDLE)rio_handle,(DWORD *)&state); /* DCD|RI|DSR|CTS */ -if(rio_aborted) - state|=ABORT; - -#endif - -return(state); -} - - -/************************************************************************/ -/************************************************************************/ -int rioctl(ushort action) -{ -#ifdef __OS2__ - async_dcb_t async_dcb; - getqueue_t getqueue; - setline_t setline; -#else // Win32 - COMMPROP commprop; - COMSTAT comstat; - DCB dcb; - ulong l; -#endif - uchar c; - ushort mode,w; - clock_t start; - -switch(action) { - case GVERS: /* Get version */ - return(RIOLIB_VER); - case GUART: /* Get UART I/O address, not available */ - return(0xffff); - case GIRQN: /* Get IRQ number, not available */ - return((int)rio_handle); - case GBAUD: /* Get current bit rate */ - return(rio_getbaud()); - case RXBC: /* Get receive buffer count */ -#ifndef __OS2__ // Win32 - ClearCommError((HANDLE)rio_handle,&l,&comstat); - return(comstat.cbInQue+inbufcnt()); -#endif - /* Fall-through if OS/2 */ - case RXBS: /* Get receive buffer size */ -#ifdef __OS2__ - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x68 /* Query # of chars in rx queue */ - ,NULL - ,0 - ,NULL - ,&getqueue - ,sizeof(getqueue) - ,NULL); - if(action==RXBC) - return(getqueue.cur+inbufcnt()); - /* RXBS */ - return(getqueue.max+RIO_INCOM_BUFLEN); -#else - GetCommProperties((HANDLE)rio_handle,&commprop); - return(commprop.dwCurrentRxQueue+RIO_INCOM_BUFLEN); -#endif - case TXBC: /* Get transmit buffer count */ -#ifndef __OS2__ // Win32 - ClearCommError((HANDLE)rio_handle,&l,&comstat); - return(comstat.cbOutQue+outbufcnt()); -#endif - /* Fall-through if OS/2 */ - case TXBS: /* Get transmit buffer size */ - case TXBF: /* Get transmit buffer free space */ -#ifdef __OS2__ - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x69 /* Query # of chars in tx queue */ - ,NULL - ,0 - ,NULL - ,&getqueue - ,sizeof(getqueue) - ,NULL); - if(action==TXBC) - return(getqueue.cur+outbufcnt()); - else if(action==TXBS) - return(getqueue.max+RIO_OUTCOM_BUFLEN); - /* TXBF */ - return((getqueue.max-getqueue.cur)+(RIO_OUTCOM_BUFLEN-outbufcnt())); -#else - GetCommProperties((HANDLE)rio_handle,&commprop); - if(action==TXBS) - return(commprop.dwCurrentTxQueue+RIO_OUTCOM_BUFLEN); - /* TXBF */ - ClearCommError((HANDLE)rio_handle,&l,&comstat); - return((commprop.dwCurrentTxQueue-comstat.cbOutQue) - +(RIO_OUTCOM_BUFLEN-outbufcnt())); -#endif - case IOSTATE: - return(rio_getstate()); - case IOFI: /* Flush input buffer */ - case IOFO: /* Flush output buffer */ - case IOFB: /* Flush both buffers */ -#ifdef __OS2__ - c=0; - if((action&IOFI)==IOFI) { - DosDevIOCtl(rio_handle - ,IOCTL_GENERAL, DEV_FLUSHINPUT - ,&c - ,sizeof(char) - ,NULL - ,&w - ,sizeof(short) - ,NULL); - inbufbot=inbuftop=0; - } /* Clear our input buffer too */ - c=0; - if((action&IOFO)==IOFO) { - DosDevIOCtl(rio_handle - ,IOCTL_GENERAL, DEV_FLUSHOUTPUT - ,&c - ,sizeof(char) - ,NULL - ,&w - ,sizeof(short) - ,NULL); - outbufbot=outbuftop=0; - } /* Clear our output buffer too */ -#else // Win32 - l=0; - if((action&IOFI)==IOFI) - l|=(PURGE_RXABORT|PURGE_RXCLEAR); - if((action&IOFO)==IOFO) - l|=(PURGE_TXABORT|PURGE_TXCLEAR); - PurgeComm((HANDLE)rio_handle,l); -#endif - return(rio_getstate()); - case LFN81: - case LFE71: -#ifdef __OS2__ - setline.stop=0; /* 1 stop bit */ - if(action==LFN81) { - setline.data=8; - setline.parity=0; } /* No parity */ - else { - setline.data=7; - setline.parity=2; } /* Even parity */ - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x42 /* Set Line Characteristics */ - ,&setline - ,sizeof(setline) - ,NULL - ,NULL - ,0 - ,NULL); -#else // Win32 - GetCommState((HANDLE)rio_handle,&dcb); - if(action==LFN81) { - dcb.Parity=NOPARITY; - dcb.ByteSize=8; - dcb.StopBits=ONESTOPBIT; } - else { - dcb.Parity=EVENPARITY; - dcb.ByteSize=7; - dcb.StopBits=ONESTOPBIT; } - SetCommState((HANDLE)rio_handle,&dcb); -#endif - return(0); - case FIFOCTL: -#ifdef __OS2__ - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x73 /* Query Device Control Block (DCB) Parms */ - ,NULL - ,0 - ,NULL - ,&async_dcb - ,sizeof(async_dcb) - ,NULL); - - /* Extended Hardware Buffering (16550 FIFO) */ - if(async_dcb.flags3&(1<<4)) { /* Supported */ - c=0xc0; - if(async_dcb.flags3&(1<<7)) - c|=0x0c; - return(c); } -#else // Win32 - // Not supported under Win32? -#endif - return(0); - } - -if((action&0xff)<=IOCM) { /* Get/Set/Clear mode */ - mode=0; - -#ifdef __OS2__ - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x73 /* Query Device Control Block (DCB) Parms */ - ,NULL - ,0 - ,NULL - ,&async_dcb - ,sizeof(async_dcb) - ,NULL); - if(async_dcb.flags1&(1<<3)) /* Output CTS handshaking */ - mode|=CTSCK; - if(async_dcb.flags2&(1<<0)) /* Automatic Xmit Control Flow Xon/Xoff */ - mode|=PAUSE; - if(async_dcb.flags2&(1<<7) /* RTS Input handshaking */ - && !(async_dcb.flags2&(1<<6))) - mode|=RTSCK; - if(rio_abort) - mode|=ABORT; - - if(action==IOMODE) - return(mode); - - if((action&0xff)==IOCM) /* Clear mode */ - mode&=~(action&0xff00); - else /* Set mode */ - mode|=(action&0xff00); - - if(mode&CTSCK) - async_dcb.flags1|=(1<<3); - else - async_dcb.flags1&=~(1<<3); - if(mode&PAUSE) { - async_dcb.flags2|=(1<<0); /* xmit flow control */ - async_dcb.xon_char=17; /* Ctrl-Q */ - async_dcb.xoff_char=19; } /* Ctrl-S */ - else - async_dcb.flags2&=~(1<<0); - if(mode&RTSCK) { - async_dcb.flags2|=(1<<7); - async_dcb.flags2&=~(1<<6); } - else - async_dcb.flags2&=~((1<<7)|(1<<6)); - if(mode&ABORT) - rio_abort=1; - else - rio_abort=0; - - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x53 /* Set Device Control Block (DCB) Parms */ - ,&async_dcb - ,sizeof(async_dcb) - ,NULL - ,NULL - ,0 - ,NULL); - -#else // Win32 - - GetCommState((HANDLE)rio_handle,&dcb); - if(dcb.fOutxCtsFlow) - mode|=CTSCK; - if(dcb.fOutX) - mode|=PAUSE; - if(dcb.fRtsControl==RTS_CONTROL_HANDSHAKE) - mode|=RTSCK; - - if(rio_abort) - mode|=ABORT; - - if(action==IOMODE) - return(mode); - - if((action&0xff)==IOCM) /* Clear mode */ - mode&=~(action&0xff00); - else /* Set mode */ - mode|=(action&0xff00); - - if(mode&CTSCK) - dcb.fOutxCtsFlow=1; - else - dcb.fOutxCtsFlow=0; - if(mode&PAUSE) { - dcb.fOutX=1; - dcb.XonChar=17; /* Ctrl-Q */ - dcb.XoffChar=19; } /* Ctrl-S */ - else - dcb.fOutX=0; - if(mode&RTSCK) - dcb.fRtsControl=RTS_CONTROL_HANDSHAKE; - else - dcb.fRtsControl=RTS_CONTROL_ENABLE; - if(mode&ABORT) - rio_abort=1; - else - rio_abort=0; - - SetCommState((HANDLE)rio_handle,&dcb); - -#endif - - return(mode); } - -if((action&0xff)==IOSS) { /* Set state */ - - if(action&ABORT) - rio_aborted=1; - -#ifdef __OS2__ - if(action&PAUSE) - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x47 /* Behave as if XOFF Received */ - ,NULL - ,0 - ,NULL - ,&w - ,sizeof(short) - ,NULL); -#else // Win32 - if(action&PAUSE) - EscapeCommFunction((HANDLE)rio_handle,SETXOFF); -#endif - - return(rio_getstate()); } - -if((action&0xff)==IOCS) { /* Clear state */ - - if(action&ABORT) - rio_aborted=0; - -#ifdef __OS2__ - if(action&PAUSE) - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x48 /* Behave as if XON Received */ - ,NULL - ,0 - ,NULL - ,&w - ,sizeof(short) - ,NULL); -#else // Win32 - if(action&PAUSE) - EscapeCommFunction((HANDLE)rio_handle,SETXON); -#endif - return(rio_getstate()); } - -if((action&0xff)==TXSYNC) { /* Synchronize transmition */ - c=action>>8; /* Number of seconds */ - w=110+(c*1000); /* Number of milliseconds */ - start=clock(); - while(clock()-start<w) { - if(!outbufcnt()) { -#ifdef __OS2__ - DosDevIOCtl(rio_handle - ,IOCTL_ASYNC, 0x69 /* Query # of chars in tx queue */ - ,NULL - ,0 - ,NULL - ,&getqueue - ,sizeof(getqueue) - ,NULL); - if(getqueue.cur==0) /* Empty outbound queue */ - return(0); -#else // Win32 - ClearCommError((HANDLE)rio_handle,&l,&comstat); - if(comstat.cbOutQue==0) /* Empty outbound queue */ - return(0); -#endif - } -#ifdef __OS2__ - DosSleep(1); -#else // Win32 - Sleep(1); -#endif - } - return(1); } - -return(0); -} - -/* End of file */ diff --git a/src/sbbs2/rio/riolib.h b/src/sbbs2/rio/riolib.h deleted file mode 100644 index 26718cb5c7..0000000000 --- a/src/sbbs2/rio/riolib.h +++ /dev/null @@ -1,26 +0,0 @@ -/* RIOLIB.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#ifndef _RIOLIB_H -#define _RIOLIB_H - -#include "gen_defs.h" - -int rioini(int com,int irq); /* initialize com,irq */ -int setbaud(int rate); /* set baud rate */ -int rioctl(ushort action); /* remote i/o control */ -int dtr(char onoff); /* set/reset dtr */ -int outcom(int ch); /* send character */ -int incom(void); /* receive character */ -int ivhctl(int intcode); /* local i/o redirection */ - -/* Win32 and OS/2 versions only */ - -long rio_getbaud(void); /* get current baud rate */ -int rio_getstate(void); /* get current current state */ -void outcom_thread(void *); - -extern int rio_handle; - -#endif /* Don't add anything after this line */ diff --git a/src/sbbs2/sbbs.h b/src/sbbs2/sbbs.h deleted file mode 100644 index b805601adf..0000000000 --- a/src/sbbs2/sbbs.h +++ /dev/null @@ -1,472 +0,0 @@ -/* SBBS.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#ifndef _SBBS_H -#define _SBBS_H - -/****************************/ -/* Standard library headers */ -/****************************/ - -#include <io.h> -#ifdef __TURBOC__ - #include <dir.h> - #include <alloc.h> -#else - #include <malloc.h> -#endif - -#include <dos.h> -#include <mem.h> -#include <time.h> -#include <errno.h> -#include <stdio.h> -#include <conio.h> -#include <ctype.h> -#include <fcntl.h> -#include <share.h> -#include <stdarg.h> -#include <stdlib.h> -#include <string.h> -#include <process.h> -#include <sys\stat.h> - -#ifdef __OS2__ - #define INCL_BASE - #include <os2.h> -#else - #include <bios.h> -#endif - -#define GLOBAL extern /* turn vars.c and scfgvars.c files into headers */ -#ifdef SBBS -#include "vars.c" -#endif -#include "smblib.h" -#include "ars_defs.h" -#include "scfgvars.c" -#include "scfglib.h" -#include "riolib.h" -#include "riodefs.h" - -/***********************************************/ -/* Prototypes of functions used ONLY with SBBS */ -/***********************************************/ - - -void lputc(int); -int lclatr(int); -uint lkbrd(int); -int lclaes(void); -void lclxy(int,int); -int lclwx(void); -int lclwy(void); -long lputs(char FAR16 *); - -#ifndef __FLAT__ - -/* LCLOLL.ASM */ -int lclini(int); - -#endif - -/* COMIO.C */ -void putcom(char *str); /* Send string to com port */ -void putcomch(char ch); /* Send single char to com port */ -void mdmcmd(char *str); /* Send translated modem command to COM */ -char getmdmstr(char *str, int sec); /* Returns chars */ -void hangup(void); /* Hangup modem */ -void offhook(void); /* Takes phone offhook */ -void checkline(void); /* Checks if remote user has hungup */ -void comini(void); /* initializes com port and sets baud */ -void setrate(void); /* sets baud rate for current connect */ - -/* DATIO.C */ -void getuserdat(user_t *user); /* Fill userdat struct with user data */ -void putuserdat(user_t user); /* Put userdat struct into user file */ -void getuserrec(int usernumber, int start, char length, char *str); -void putuserrec(int usernumber, int start, char length, char *str); -ulong adjustuserrec(int usernumber, int start, char length, long adj); -void subtract_cdt(long amt); -void getrec(char *instr,int start,int length,char *outstr); - /* Retrieve a record from a string */ -void putrec(char *outstr,int start,int length,char *instr); - /* Place a record into a string */ -uint matchuser(char *str); /* Checks for a username match */ -uint finduser(char *str); -uint lastuser(void); -char getage(char *birthdate); - -int sub_op(uint subnum); -ulong getlastmsg(uint subnum, ulong *ptr, time_t *t); -time_t getmsgtime(uint subnum, ulong ptr); -ulong getmsgnum(uint subnum, time_t t); -ulong getposts(uint subnum); - -int getfiles(uint dirnum); -int dir_op(uint dirnum); -int getuserxfers(int fromuser, int destuser, char *fname); -void rmuserxfers(int fromuser, int destuser, char *fname); -char *username(int usernumber, char *str); -uint gettotalfiles(uint dirnum); -void getnodeext(uint number, char *str); -void putnodeext(uint number, char *str); -void getnodedat(uint number, node_t *node, char lock); -void putnodedat(uint number, node_t node); -void putusername(int number, char *name); -void nodesync(void); -void getmsgptrs(void); -void putmsgptrs(void); -void getusrsubs(void); -void getusrdirs(void); -uint userdatdupe(uint usernumber, uint offset, uint datlen, char *dat - , char del); -void gettimeleft(void); - -/* FILIO.C */ -char addfiledat(file_t *f); -void getfileixb(file_t *f); -void getfiledat(file_t *f); -void putfiledat(file_t f); -char uploadfile(file_t *f); -void downloadfile(file_t f); -void removefiledat(file_t f); -void fileinfo(file_t f); -void openfile(file_t f); -void closefile(file_t f); -void update_uldate(file_t f); -void putextdesc(uint dirnum, ulong datoffset, char *ext); -void getextdesc(uint dirnum, ulong datoffset, char *ext); -void viewfilecontents(file_t f); - -/* STR.C */ -void userlist(char subonly); -char gettmplt(char *outstr, char *template, int mode); -void sif(char *fname, char *answers, long len); /* Synchronet Inteface File */ -void sof(char *fname, char *answers, long len); -void create_sif_dat(char *siffile, char *datfile); -void read_sif_dat(char *siffile, char *datfile); -void printnodedat(uint number, node_t node); -void reports(void); -char inputnstime(time_t *dt); -char chkpass(char *pass, user_t user); -char *cmdstr(char *instr, char *fpath, char *fspec, char *outstr); -void getcomputer(char *computer); -void subinfo(uint subnum); -void dirinfo(uint dirnum); -char trashcan(char *insearch, char *name); -#ifdef SBBS -char *decrypt(ulong [],char *); -#endif - -/* MSGIO.C */ -void automsg(void); -char writemsg(char *str, char *top, char *title, int mode, int subnum - ,char *dest); -char putmsg(char HUGE16 *str, int mode); -char msgabort(void); -void email(int usernumber, char *top, char *title, char mode); -void forwardmail(smbmsg_t *msg, ushort usernum); -char postmsg(uint subnum, smbmsg_t *msg, int wm_mode); -void removeline(char *str, char *str2, char num, char skip); -ulong msgeditor(char *buf, char *top, char *title); -void editfile(char *path); -void getsmsg(int usernumber); -void putsmsg(int usernumber, char *strin); -void getnmsg(void); -void putnmsg(int num, char *strin); -int loadmsg(smbmsg_t *msg, ulong number); -char HUGE16 *loadmsgtxt(smbmsg_t msg, int tails); -ushort chmsgattr(ushort attr); -void show_msgattr(ushort attr); -void show_msghdr(smbmsg_t msg); -void show_msg(smbmsg_t msg, int mode); -void msgtotxt(smbmsg_t msg, char *str, int header, int tails); -void quotemsg(smbmsg_t msg, int tails); -void putmsg_fp(FILE *fp, long length, int mode); -void editmsg(smbmsg_t *msg, uint subnum); -void remove_re(char *str); -void remove_ctrl_a(char *instr); - -/* MAIL.C */ - -ulong loadmail(mail_t **mail, uint usernumber, int which, int mode); -int getmail(int usernumber, char sent); -int delmail(uint usernumber,int which); -void delfattach(uint to, char *title); -void telluser(smbmsg_t msg); -void delallmail(uint usernumber); -void readmail(uint usernumber, int sent); - -void bulkmail(uchar *ar); - -/* CONIO.C */ -int bputs(char *str); /* BBS puts function */ -int rputs(char *str); /* BBS raw puts function */ -int lprintf(char *fmt, ...); /* local printf */ -int bprintf(char *fmt, ...); /* BBS printf function */ -int rprintf(char *fmt, ...); /* BBS raw printf function */ -int getstr(char *str,int length, long mode); -void outchar(char ch); /* Output a char - check echo and emu. */ -char r0dentch(char ch); /* Converts CH to r0dent CH */ -char getkey(long mode); /* Waits for a key hit local or remote */ -void ungetkey(char ch); /* Places 'ch' into the input buffer */ -char inkey(int mode); /* Returns key if one has been hit */ -char yesno(char *str); -char noyes(char *str); -void printfile(char *str, int mode); -void printtail(char *str, int lines, int mode); -void menu(char *code); -long getkeys(char *str, ulong max); -long getnum(ulong max); -void center(char *str); -int uselect(int add, int n, char *title, char *item, char *ar); -void statusline(void); -void pause(void); -void waitforsysop(char on); -void riosync(char abortable); -char validattr(char a); -char stripattr(char *str); -void redrwstr(char *strin, int i, int l, char mode); -void mnemonics(char *str); -void attr(int atr); /* Change local and remote text attributes */ -void ctrl_a(char x); /* Peforms the Ctrl-Ax attribute changes */ -int atcodes(char *code); -char *ansi(char atr); /* Returns ansi escape sequence for atr */ -int whos_online(char listself);/* Lists active nodes, returns active nodes */ - -/* LOGONOFF.C */ -int login(char *str, char *pw); -char logon(void); -void logout(void); -void logoff(void); -void newuser(void); /* Get new user */ -void backout(void); - -/* BBSIO.C */ -char scanposts(uint subnum, char newscan, char *find); /* Scan sub-board */ -int searchsub(uint subnum, char *search); /* Search for string on sub */ -int searchsub_toyou(uint subnum); -char text_sec(void); /* Text sections */ - -/* CHAT.C */ -void localchat(void); -void chatsection(void); -void nodepage(void); -void nodemsg(void); -void guruchat(char *line, char *guru, int gurunum); -char guruexp(char **ptrptr, char *line); -void localguru(char *guru, int gurunum); -void packchatpass(char *pass, node_t *node); -char *unpackchatpass(char *pass, node_t node); -void sysop_page(void); -void privchat(void); - -/* MAIN.C */ -void printstatslog(uint node); -ulong logonstats(void); -void logoffstats(void); -void getstats(char node, stats_t *stats); - -/* MISC.C */ -void bail(int code); /* Exit */ -char *ultoac(ulong l,char *str); -int bstrlen(char *str); -int nopen(char *str, int access); -FILE *fnopen(int *file, char *str,int access); -char *sectostr(uint sec, char *str); /* seconds to HH:MM:SS */ -void truncsp(char *str); /* Truncates white spaces off end of str */ -ulong ahtoul(char *str); /* Converts ASCII hex to ulong */ -int pstrcmp(char **str1, char **str2); /* Compares pointers to pointers */ -int strsame(char *str1, char *str2); /* Compares number of same chars */ -void errormsg(int line, char *file, char action, char *object, ulong access); -int mv(char *src, char *dest, char copy); /* fast file move/copy function */ -char chksyspass(int local); -char *timestr(time_t *intime); /* ASCII representation of time_t */ -char *zonestr(short zone); -void dv_pause(void); -void secwait(int sec); -time_t ftimetounix(struct ftime f); -struct ftime unixtoftime(time_t unix); -time_t dstrtounix(char *str); /* ASCII date (MM/DD/YY) to unix conversion */ -char *unixtodstr(time_t unix, char *str); /* Unix time to ASCII date */ -char *hexplus(uint num, char *str); /* Hex plus for 3 digits up to 9000 */ -uint hptoi(char *str); -int chk_ar(char *str, user_t user); /* checks access requirements */ -ushort crc16(char *str); -ulong _crc32(char *str); -void ucrc16(uchar ch, ushort *rcrc); -int kbd_state(void); - -#ifndef __FLAT__ -long lread(int file, char HUGE16 *buf, long bytes); /* Reads >32k files */ -long lfread(char huge *buf, long bytes, FILE *fp); -long lwrite(int file, char HUGE16 *buf, long bytes); /* Writes >32k files */ -#endif - -/* XFER.C */ -int listfile(char *fname, char HUGE16 *buf, uint dirnum - , char *search, char letter, ulong datoffset); -int listfiles(uint dirnum, char *filespec, int tofile, char mode); -int listfileinfo(uint dirnum, char *filespec, char mode); -void batchmenu(void); -void temp_xfer(void); -void batch_add_list(char *list); -void notdownloaded(ulong size, time_t start, time_t end); -int viewfile(file_t f, int ext); - -/* XFERMISC.C */ -void seqwait(uint devnum); -void listfiletofile(char *fname, char HUGE16 *buf, uint dirnum, int file); -void upload(uint dirnum); -char bulkupload(uint dirnum); -void extract(uint dirnum); -char *getfilespec(char *str); -int delfiles(char *path, char *spec); -char findfile(uint dirnum, char *filename); -char fexist(char *filespec); -long flength(char *filespec); -long fdate(char *filespec); -long fdate_dir(char *filespec); -char *padfname(char *filename, char *str); -char *unpadfname(char *filename, char *str); -char filematch(char *filename, char *filespec); -int protocol(char *cmdline, int cd); -void autohangup(void); -char checkprotlog(file_t f); -char checkfname(char *fname); -void viewfiles(uint dirnum, char *fspec); -char addtobatdl(file_t f); -int fnamecmp_a(char **str1, char **str2); /* for use with resort() */ -int fnamecmp_d(char **str1, char **str2); -int fdatecmp_a(uchar **buf1, uchar **buf2); -int fdatecmp_d(uchar **buf1, uchar **buf2); -void resort(uint dirnum); -int create_batchup_lst(void); -int create_batchdn_lst(void); -int create_bimodem_pth(void); -void batch_upload(void); -void batch_download(int xfrprot); -void start_batch_download(void); -ulong create_filelist(char *name, char mode); - -/* XTRN.C */ -int external(char *cmdline,char mode); /* Runs external program */ -void xtrndat(char *name, char *dropdir, uchar type, ulong tleft); -char xtrn_sec(void); /* The external program section */ -void exec_xtrn(uint xtrnnum); /* Executes online external program */ -void user_event(char event); /* Executes user event(s) */ -char xtrn_access(uint xnum); /* Does useron have access to xtrn? */ -char *temp_cmd(void); /* Returns temp file command line */ - -/* LOGIO.C */ -void logentry(char *code,char *entry); -void log(char *str); /* Writes 'str' to node log */ -void logch(char ch, char comma); /* Writes 'ch' to node log */ -void logline(char *code,char *str); /* Writes 'str' on it's own line in log */ -void logofflist(void); /* List of users logon activity */ -void errorlog(char *text); /* Logs errors to ERROR.LOG and NODE.LOG */ -#if DEBUG -void dlog(int line, char *file, char *text); /* Debug log file */ -#endif - -/* QWK.C */ -void qwk_sec(void); -char pack_qwk(char *packet, ulong *msgcnt, int prepack); -void unpack_qwk(char *packet,uint hubnum); - - -/* FIDO.C */ -void netmail(char *into, char *subj, char mode); -void qwktonetmail(FILE *rep, char *block, char *into, uchar fromhub); - -void inetmail(char *into, char *subj, char mode); -void qnetmail(char *into, char *subj, char mode); - -/* USEREDIT.C */ -void useredit(int usernumber, int local); -void maindflts(user_t user); -void purgeuser(int usernumber); - -/* INITDATA.C */ -void initdata(void); - -/* VER.C */ -void ver(void); - -/* MAIN_SEC.C */ -void main_sec(void); -void scanallsubs(char mode); -void scansubs(char mode); -void new_scan_cfg(ulong misc); -void new_scan_ptr_cfg(void); - -/* XFER_SEC.C */ -void xfer_sec(void); -void scanalldirs(char mode); -void scandirs(char mode); - -/* MSWAIT.OBJ */ - -void mswait(int msecs); - -#ifdef __OS2__ -#define beep(f,d) DosBeep(f,d) -#else -void beep(int freq, int dur); -#endif - -void backslash(char *str); -void backslashcolon(char *str); -void getlines(void); -void strip_ctrl(char *str); -void strip_exascii(char *str); - -char wfc_events(time_t lastnodechk); -void catsyslog(int crash); -char waitforcall(void); -void quicklogonstuff(void); -char terminal(void); -void startup(int argc, char *argv[]); - -void crack_attempt(void); - -/*********************/ -/* OS specific stuff */ -/*********************/ - -#ifdef __FLAT__ - -#define lread(f,b,l) read(f,b,l) -#define lfread(b,l,f) fread(b,l,f) -#define lwrite(f,b,l) write(f,b,l) -#define lfwrite(b,l,f) fwrite(b,l,f) - -#endif - -#if (__BORLANDC__ > 0x0410) -#define _chmod(p,f,a) _rtl_chmod(p,f,a) // _chmod obsolete in 4.x -#endif - -#if defined(__OS2__) - #define lclini(x) window(1,1,80,x) - #define lclaes() conaes() - #define nosound() ; -#elif defined(__WIN32__) - #define lclini(x) window(1,1,80,x) - #define lclxy(x,y) gotoxy(x,y) - #define lclwy() wherey() - #define lclwx() wherex() - #define lputs cputs - #define nosound() ; -#elif defined(__FLAT__) - #define mswait(x) delay(x) -#endif - -#ifndef __OS2__ - #define outcon(ch) lputc(ch) -#endif - - -#endif /* Don't add anything after this #endif statement */ diff --git a/src/sbbs2/sbbs_src.doc b/src/sbbs2/sbbs_src.doc deleted file mode 100644 index 00e2657317..0000000000 --- a/src/sbbs2/sbbs_src.doc +++ /dev/null @@ -1,660 +0,0 @@ - Synchronet BBS Software and Utilities C Source Code Documentation - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - Created April 1997, Rob Swindell - Updated September 1997, Rob Swindell - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Official Synchronet Web Site: - http://www.weedpuller.com/synchronet -Latest version of the source code and this document stored at: - ftp://ftp.weedpuller.com/synchronet -Post public questions are comments on the freelance Synchronet listserv: - mailto:synchronet@freelance.com -Send bug fixes or comments - mailto:sbbs@weedpuller.com - -I no-longer monitor any BBS-related newsgroups (too flakey and spam-ridden). - -History -======= - -The Synchronet BBS software project began in December of 1990 when I started -writing my very own BBS program from the ground up. While it is true that I ran -Wayne Bell's WWIV BBS software for a number of years and an illicit copy of the -WWIV source code was my first exposure to the C Programming Language, I didn't -steal, borrow, or otherwise copy the WWIV source code for use in Synchronet in -any way. I did refer to Wayne's code from time to time when implementing -WWIV-compatible features like WWIV color codes, but I didn't need (or want) to -copy his source. I do wish to take this moment, however, to extend my -appreciation to Wayne Bell for his contributions to the BBS and hacker -communities, and for personally inspiring me to write a better BBS! ;-) - -In 1992, Synchronet became a commercial venture for me (under the company name -Digital Dynamics) and was my sole source of income for over three years. The -commercialization of the Internet, and in paticular, the Wolrd Wide Web, has -all but eliminated the commercial BBS software market and in 1996, I officially -announced the end of Digital Dynamics (in the "Digital Manifesto"). In February -of 1997, my own BBS, Vertrauen, was abruptly shut-down. This time for good. -From September of 1988 to February of 1997, Vertrauen (German for "Trust") -answered the phone at 714-529-9525 24 hours a day, 7 days a week. It went from -a 1 line "pirate" BBS running WWIV on an 8mhz 8088 to a 7 node Synchronet -BBS running on two 66mhz 486s connected to a Novell NetWare 3.12 file server -with many gigabytes of disk space, 7 CD-ROMS, Planet Connect Fidonet feed, the -whole nine yards - pretty much everything except Internet access (never could -justify the monthly costs of a full-time connection). - -Today, I personally have very little interest in BBSs (using or operating them) -and my programming interests have been focused elsewhere for quite some time -(Internet communication products). For this reason, I am releasing the -complete source code (in C) for Synchronet BBS software and all other Digital -Dynamics' utilites. Since I expect no futher income from Synchronet BBS -software and have no plans on enhancing or supporting the product in any way, I -thought the least I could do was to package up, document, and publicly release -the source code for others to continue enhancing as they wish. - - -Disclaimer -========== - -The accompanying source code (and this documentation) are not intended for the -beginning, or possibly even intermediate, programmer. You must have a healthy -knowledge of DOS, MAKEFILES, and the C Programming Language for this source -code to be of any use to you. Of course, beginners are encouraged to learn -(hopefully with the help of a friend or two) from the included projects - just -don't get too irritated if things don't compile and link the first time. - -It is my hope that a hand full of capable young hackers will take Synchronet -into new directions. Hopefully, retaining the original name (Synchronet) in -some form, although there is no way for me to enforce this. I assume that some -will make minor modifications and re-release compiled versions under their name -with no credit to my work or the history of Synchronet, but while that isn't -"cool", it isn't illegal either. I am releasing the rights to every piece of -code accompanying this document to the public domain. That means that anyone -and everyone can do with it whatever they like as far as I'm concerned. - -I, Rob Swindell, author of Synchronet, owner of Digital Dynamics, hereby -relinquish the copyright of Synchronet BBS software and all Synchronet-related -Digital Dynamics' utilities to the public domain. I am offering no warranties -of any kind. Use at your own risk. - - -Required Tools Version Project(s) -============== ------- ---------- - -Borland C++ for DOS and Windows 3.1 SBBS.EXE - SBJ.EXE - SBL.EXE - SCB.EXE - SMM.EXE - UTI*.EXE - ADDFILES.EXE - DELFILES.EXE - DUPEFIND.EXE - FILELIST.EXE - SMBACTIV.EXE - - Note: Newer versions of Borland C++ tended to create larger, more memory - hungry executables, so I stayed with 3.1 for these 16-bit DOS versions - (where available DOS memory was a never ending issue with sysops). - Newer versions of Borland C++ will work (with slight changes to the - appropriate MAKEFILEs) for the above projects. The last five projects - listed above are built with MAKEFILE.BC (i.e. make -fmakefile.bc) - instead of MAKEFILE (used for Watcom). - -Borland C++ for DOS, Windows, and Win32 4.5 SCFG.EXE - SCFG32.EXE - BAJA.EXE - BAJA32.EXE - SBBS4W32.EXE - INSTALL.EXE - QWKNODES.EXE - SBBSECHO.EXE - SMB2SBL.EXE - SBL2SMB.EXE - SMB2SMM.EXE - SMM2SMB.EXE - NODE.COM - SLOG.EXE - DSTSEDIT.EXE - ANS2MSG.EXE - MSG2ANS.EXE - EXECSBBS.COM - - Note: SBBS4W32.EXE, the 32-bit Windows version of Synchronet, is incomplete. - Again, newer versions of Borland C++ (4.51, 5.x, etc) will probably - work fine with slight changes to the appropriate MAKEFILEs. SCFG32.EXE - is a native Win32 app that also runs under DOS (using Borland's DOS - extender) - I don't know why the gettext/puttext is messed up. - You'll need EXE2BIN.EXE (included with MS-DOS) to create EXECSBBS.COM. - - -Borland C++ for OS/2 2.0 SBBS4OS2.EXE - SCFG4OS2.EXE - SBBSECHO.EXE - ADDFILES.EXE - BAJA4OS2.EXE - DELFILES.EXE - DUPEFIND.EXE - FILELIST.EXE - INSTALL.EXE - NODE.EXE - SLOG.EXE - CHKSMB.EXE - FIXSMB.EXE - SMBUTIL.EXE - SMBACTIV.EXE - DSTSEDIT.EXE - ANS2MSG.EXE - MSG2ANS.EXE - EXECSBBS.EXE - - Note: Watcom makefiles are available for many of these projects and have - the advantage of being able to be built from any environment (DOS, - Windows, or OS/2) and create executables that run under all those - environments. Borland C++ for OS/2, on the otherhand, can only be - used in an OS/2 environment and can only create OS/2 executables. - While Borland's C++ compilers definitely compile faster, the resulting - exectubles created by Watcom C++ are usually smaller and faster. - Any of the projects that don't already have support for Borland C++ - for OS/2, can probably be easily modified to do so (this excludes - XSDK apps). Most popular executables are already supported. - - -Watcom C++ 10.0a ADDFILES.EXE - AUTONODE.EXE - DELFILES.EXE - DUPEFIND.EXE - FILELIST.EXE - SBBSECHO.EXE - SMBUTIL.EXE - SMBACTIV.EXE - - Note: All flavors (16-bit DOS, 32-bit DOS, 32-bit OS/2, and 32-bit Windows) - Love the cross-platform capabilites of Watcom C++! - The NT\*.EXE files are Win32 executables that run native under either - Windows 95 or Windows NT. - The DOSX\*.EXE and DOS4G\*.EXE files are extended DOS executables that - need DOS4G.EXE or DOS4GW.EXE (included with Watcom C++) in the search - path. (Sorry 'bout the inconsistency in the sub-directory names, - there's no difference between DOSX and DOS4G except that I used to have - some extended DOS Borland projects write to the DOSX directories). - - *** IMPORTANT *** - 1) It is important that you delete all the files from the DOS and OS2 - destination sub-directories (use CLEANALL.BAT) if you've previously - built a project using Borland C++ and wish to re-build it using - Watcom. The .OBJ files are NOT compatible between Watcom and Borland - (without some special effort). - 2) You must copy \WATCOM\SRC\STARTUP\WILDARGV.C from the Watcom C++ - installation directory (or CD-ROM) into the SBBS\SMB\SMBUTIL - directory before attempting a Watcom build on the SMBUTIL project. - It's a copyrighted file, so I couldn't include it. - - Watcom can be/could have been used for some of the Borland-only - projects, but due to its slow compile speed, I only used it for the - projects that needed the best extended DOS support (DOS4G blows away - Borland's DOS extender) and cross-platform compile (it was a pain to - boot OS/2 every time I needed to build an OS/2 executable with Borland - C++ for OS/2). Plus, Watcom's text-mode screen-libraries were sorely - lacking (hence no CFG.EXE projects are built with Watcom). - -Tool Notes -========== - -As noted aboved, Borland C++ v4.5 (or possibly newer versions) may be used for -SBBS.EXE (and other BC v3.1 projects), but you will have less available DOS -memory (the executable will consume more memory). - -Borland C++ v4.5 can also be used for many of the Watcom compiled utilities. -If you find MAKEFILE.BC in any of the Watcom compiled project directories, you -can use this makefile to build a 16-bit DOS, 32-bit OS/2, and in some cases -32-bit DOS executable with Borland C++. Likewise, any *.WAT makefiles (and most -of the MAEKALL.BAT files) are intended for use with Watcom C++. - - -Project Notes -============= - -Most projects are built via MAKEFILE and/or .BAT/.CMD file. If you find a -MAKEALL.BAT or MAKEALL.CMD (for OS/2) file in any of the project directories, -this batch file is used to compile and link versions for all supported -platforms (e.g. DOS-16, DOS-32, OS/2, Win32, etc). - -If a MAKEFILE or *.MAK file doesn't exist in the project directory, there may -be a simple MAKE.BAT/MAKE.CMD to build the executable. The simplest projects -may not include any type of MAKEFILE, BAT, or CMD file, but just require a -basic CC command line to compile and link into an executable (only the most -independant and smallest projects fit into this category). - -The MAKEALL.BAT file in the source ROOT directory is used to build ALL -Borland C++ DOS and Win32 projects. - -The MAKEALL.CMD file in the source ROOT directory is used to build ALL -Borland C++ OS/2 projects. - -The WMAKEALL.BAT file in the source ROOT directory is used to build ALL -Watcom C++ DOS, DOS4G, OS/2 and Win32 projects. - -Sub-directories are usually used to house the output files (.OBJ, .EXE, .MAP, -etc) for each supported platform. Sub-directories with the name DOS are used -for 16-bit DOS output files; sub-directories of DOSX, DOS32, or DOS4G are used -for 32-bit extended DOS output files; sub-directories of OS2 contain 32-bit -OS/2 output files; subdirectories of NT or W32 contain 32-bit Windows -(Windows NT or Windows 95) output files. In the more simple projects (e.g. -BAJA*.EXE), no sub-directories are utilized. - -The makefiles (MAKEFILE.*, *.MAK, *.BC, *.WAT) are setup for my environment. -You will most likely need to make changes to these makefiles for your -environment. For reference purposes, these are the path locations of the -various tools in my environment: - -Path Tool ----- ---- -N:\BC31 Borland C++ for DOS and Windows v3.1 -N:\BC45 Borland C++ for DOS, Windows, and Win32 v4.5 -C:\BCOS2 Borland C++ for OS/2 v2.0 -N:\WATCOM Watcom C++ v10.0a - -My system PATH environment variable contains N:\BC45\BIN, N:\WATCOM\BINB, -and N:\WATCOM\BIN. So if you see references (without path) to BCC, then that -would indicate Borland C++ v4.5. MAKE and MAKER are Borland's MAKE utilities -(included with Borland C++ v4.5, the latter being the 16-bit real mode -version). WMAKE is the Watcom MAKE utility. - -My N:\BCxx\BIN\TURBOC.CFG file contains: - --IN:\BCxx\INCLUDE --LN:\BCxx\LIB - -I've made an effort to eliminate the project drive letter (N:) from all -MAKEFILEs and BATch files, but some references may still remain. If you only -have one hard disk on your system (C:) or your projects are stored on the same -drive the compiler(s) is/are installed on, then simply eliminating any drive -letter specifications is suggested. - -Efforts have been made to eliminate all compiler warnings, but in some cases -warnings may persist. Especially when using a different compiler or version -than I have used. Any warnings in the source code I'm releasing may be safely -ignored. If you or anyone else has modified the code, then warnings in the -modified files should be investigated at your discretion. - - -Directory Hierachry -=================== - -If extracted correctly, the archive that contained this document should have -created a directory hierarchy similar to the following: - -�� SBBS ����������� ADDFILES ������� DOS -� � �� DOSX -� � �� NT -� � �� OS2 -� �� ALLUSERS -� �� ANS2MSG -� �� AUTONODE -� �� BAJA -� �� DCDWATCH -� �� DELFILES ������� DOS -� � �� DOSX -� � �� NT -� � �� OS2 -� �� DOS -� �� DSTSEDIT -� �� DUPEFIND ������� DOS -� � �� DOSX -� � �� NT -� � �� OS2 -� �� ECHO ����������� DOS -� � �� DOS4G -� � �� NT -� � �� OS2 -� �� EXECDOS -� �� EXECSBBS ������� DOS -� � �� OS2 -� �� FILELIST ������� DOS -� � �� DOSX -� � �� NT -� � �� OS2 -� �� INSTALL �������� DOS -� � �� OS2 -� �� MLABELS -� �� MSG2ANS -� �� MSWAIT ��������� DOS -� �� NODE ����������� DOS -� � �� OS2 -� �� OS2 -� �� QWKNODES -� �� RIO -� �� SBL -� �� SBJ -� �� SCB -� �� SCFG ����������� DOS -� � �� DOS32 -� � �� OS2 -� �� SDK -� �� SLOG ����������� DOS -� � �� OS2 -� �� SMB ������������ CHKSMB ��������� DOS -� � � �� OS2 -� � �� FIXSMB ��������� DOS -� � � �� OS2 -� � �� SMBUTIL �������� DOS -� � �� DOS4G -� � �� NT -� � �� OS2 -� �� SMBACTIV ������� DOS -� � �� DOSX -� � �� NT -� � �� OS2 -� �� SMM -� �� UTI -� �� W32 -�� MSWAIT ��������� DOS -�� SPAWNO -�� STP -�� TONE -�� UIFC - -Directory Descriptions ----------------------- -SBBS\ Synchronet source code and shared header files -SBBS\SMB\ Synchronet Message Base library and header files -...\CHKSMB\ Source for utility to check Synchronet message bases for errors -...\FIXSMB\ Source for utility to rebuild Synchronet message base indices -...\SMBUTIL\ Synchronet message base maintenance utility (SMBUTIL) source -SBBS\RIO\ OS/2 and Win32 Remote I/O library source and header files -SBBS\SDK\ Synchronet External program SDK (XSDK) source and header files -SBBS\SMM\ Synchronet Match Maker and utility source -SBBS\SCB\ Synchronet Callback source -SBBS\SBJ\ Synchronet Blackjack source -SBBS\SBL\ Synchronet BBS List source -SBBS\UTI\ Synchronet UTI driver (for PostLink/RelayNet/RIME) source -SBBS\SCFG\ Synchronet Configuration program source -SBBS\BAJA\ Synchronet shell/module compiler (BAJA.EXE) source -SBBS\ECHO\ SBBSecho (FidoNet echomail program) source -SBBS\EXECDOS\ Synchronet for OS/2's EXECDOS.EXE source -SBBS\EXECSBBS\ EXECSBBS.COM/EXE (for SBBS4DOS/OS2) source -SBBS\DCDWATCH\ DCDWATCH.EXE source -SBBS\ADDFILES\ ADDFILES.EXE source -SBBS\DELFILES\ DELFILES.EXE source -SBBS\DUPEFIND\ DUPEFIND.EXE source -SBBS\FILELIST\ FILELIST.EXE source -SBBS\ALLUSERS\ ALLUSERS.EXE source -SBBS\MLABELS\ MLABLES.EXE source -SBBS\ANS2MSG\ ANS2MSG.EXE source -SBBS\MSG2ANS\ MSG2ANS.EXE source -SBBS\AUTONODE\ AUTONODE.EXE source -SBBS\SMBACTIV\ SMBACTIV.EXE source -SBBS\QWKNODES\ QWKNODES.EXE source -SBBS\SLOG\ SLOG.EXE source -SBBS\NODE\ NODE.COM/EXE source -SBBS\DSTSEDIT\ DSTSEDIT.EXE source -SBBS\INSTALL\ INSTALL.EXE source -MSWAIT\ MSWAIT\DOS\MSWAIT.OBJ (millisecond wait) source -SPAWNO\ Ralf Brown's EMS/XMS/disk swapping replacement for spawn...() -STP\ Synchronet Transfer Protocols (X/Y/Zmodem) [incomplete] -TONE\ Tone generator (used for external sysop chat pager) -UIFC\ User Interface library source and header files (for *CFG.EXE) - -Note: If you don't recognize the name of a program or utility, see SYSOP.DOC. -Note: Source code for SBBS\DOS\RCIOL.OBJ is not provided because I don't have - it (the consultant that developed this module never supplied me with the - latest version of the source code). - - -C Header File Notes -=================== - -SBBS\SBBS.H ------------ -This is the main shared header file for Synchronet and Synchronet related -utilities. This header file contains prototypes for most all functions -contained in SBBS.EXE. But, more importantly, it #includes SMBLIB.H (which -indirectly #includes SMBDEFS.H), ARS_DEFS.H (which indirectly #includes -GEN_DEFS.H), SCFGVARS.C (which indirectly #includes SBBSDEFS.H, which -indirectly #includes NODEDEFS.H), SCFGLIB.H, RIOLIB.H, RIODEFS.H, and if "SBBS" -is defined (only in the MAKEFILE for SBBS) VARS.C (which indirectly #includes -text.h). So, as you can see, SBBS.H pretty much covers it in the header file -department for Synchronet and its related utilities. The only header files -that SBBS.H doesn't directly or indirectly #include are QWK.H, POST.H, ETEXT.H, -CMDSHELL.H, and SPAWNO.H. You will find this header file is the most commonly -#included header file in SBBS modules and Sycnhronet related utilities. The -comments are quite antiquated and may be safely ignored (e.g. /* DATIO.H */). - -SBBS\SBBSDEFS.H ---------------- -This file contains most constants, macros, and type definitions used for -Synchronet and its utilities. Since it is indirectly #included with SBBS.H, -you won't find it specifically #included very often. - -SBBS\SCFGLIB.H --------------- -Contains type defintions and function protoypes only used in the initialization -of Synchronet's configuration structures. Used by the SBBS and SCFG projects -and all utilities that read Synchronet's configuration (*.CNF) files. - -SBBS\GEN_DEFS.H ---------------- -A small header file that contains general application independant constant -defintions and macros. This header file is #included directly or indirectly -with nearly every project. - -SBBS\ARS_DEFS.H ---------------- -Synchronet's Access Requirement Strings function prototype and constants. -This function prototype and constants were broken out for use in the SBBS\BAJA -(shell/module compiler) project. - -SBBS\CMDSHELL.H ---------------- -Contains constants, typedefs, and function prototypes specific to Synchronet's -command shell/module interpreter. Also used in the SBBS\BAJA (shell/module -compiler) project. - -SBBS\POST.H ------------ -Contains type defintions for post_t and shared function prototypes for -the SBBS and SBBSecho projects. - -SBBS\QWK.H ----------- -Contains constants, type definitions, and function prototypes only used in -the QWK related portions of the SBBS project. - -SBBS\TEXT.H ------------ -Contains constant defintions (via enum) for every text item in Synchronet's -TEXT.DAT file. Since this header file is indirectly #included with SBBS.H -in the SBBS project, you won't find it specifically #included very often. - -SBBS\ETEXT.H ------------- -Contains extern variable declarations for the encrypted text strings in the -SBBS project. This file is automatically created (along with ETEXT.C) from -ETEXT.DAT by the GENETEXT.EXE utility. The encrypted text strings are left -over from the commercial version of SBBS. - -SBBS\VARS.C ------------ -This is a dual-purpose file. If GLOBAL isn't defined, then it's a C source -file for all of Synchronet's global variables. SBBS.H automatically #defines -GLOBAL to extern and #includes this file to automatically declare all global -variables as extern. This eliminates the double-entry work of creating -separate definitions and declarations for global variables. This file is -only used in the SBBS project. - -SBBS\RIO\RIOLIB.H ------------------ -This file contains function prototypes for the Remote I/O Library API. This API -is consistent between DOS, OS/2 and Win32 versions. - -SBBS\RIO\RIODEFS.H ------------------- -Contains constants required for using the Remote I/O Library. - -SBBS\SMB\SMBLIB.H ------------------ -Contains constants and function prototypes for the Synchronet Message Base -Library. - -SBBS\SMB\SMBDEFS.H ------------------- -Contains constants and type definitions required for using the Synchronet -Message Base Library. - -SBBS\SMB\CRC32.H ----------------- -Standard 32-bit CRC table and macro. Also included in BAJA, SBBSecho, and -other projects. - -SBBS\SCFG\SCFG.H ----------------- -Contains constant defintions, macros, global variable declarations, and -function prototypes for modules in the SCFG project. - -SBBS\ECHO\SBBSECHO.H --------------------- -Contains constants, type definitions, and function prototypes for the -SBBSecho project. - -SBBS\UTI\UTI.H --------------- -Small header file containing global variable declarations, constants, macros, -and a function prototype for modules in the UTI driver project. - -SBBS\SDK\XSDK.H ---------------- -Main header file for Synchronet external programs using the External -program SDK (XSDK). This header file #includes XSDKVARS.C (global variable -declarations) which indirectly #includes XSDKDEFS.H (constants and type -defintions). - -UIFC\UIFC.H ------------ -Contains constants, macros, type definitions, and function prototypes for -the local console User Interface library. Used by the SCFG, SCBCFG, SMMCFG -and ECHOCFG projects. - -SPWANO\SPANWO.H ---------------- -Ralf Brown's spawno function prototypes. Used for swaping SBBS.EXE (16-bit -DOS) out of memory. - - -C Source File Notes -=================== - -Overlays --------- -The SBBS project (SBBS.EXE/SBBS4OS2.EXE/SBBS4W32.EXE) contains the largest -number of C source files and has the longest history. For a few years, SBBS.EXE -was a small 16-bit DOS executable that executed completely in memory (no -overlays). With each additional group of features, the executable file -(SBBS.EXE) inevitably increased in size and memory consumption. At one point I -started compiling two separate versions of SBBS.EXE, one with some of the -modules overlaid (dynamically swapped to/from disk), and another without -overlays (faster, but consumed more memory). This was the time with I began to -split off less-commonly called functions into modules that were specifically -overlaid (and given a filename ending in OVL.C, e.g. MAIN.C contains -non-overlaid code, and MAIN_OVL.C contains overlaid code). - -As the exectuable grew larger and my knowledge and experience with optimization -of overlaid modules grew, I stopped making the non-overlaid version -altogether. The performance difference had become negligible and the memory -consumption of the non-overlaid version was unwieldly. Anyway, the point of -this little story is to help explain why so many of the filenames end in OVL. -Eventually, I ended up overlaying most of the modules (not just the ones named -with OVL). But still, you'll find that the code in the modules with the OVL -names is of the less-frequently executed variety. Only the 16-bit versions of -SBBS.EXE and SCFG.EXE use overlaid modules. All other projects (and the 32-bit -versions of SBBS/SCFG) do not explicitly use overlays. - -Hi/Mid/Low Level ----------------- -The modules with filenames containing HI (e.g. XFER_HI.C) contain high-level -code (mostly user-interface type functions); modules with filenames containing -MID (e.g. CON_MID.C) contain mid-level code (larger functions that don't -contain direct user-interfaces;, and modules with filenames containing LO -(e.g. XFER_LO.C) contain low-level code (smaller functions called frequently -from mid or high level code). - -Comments --------- -Please excuse the sparse comments; I never planned on giving the source code -out. The source code that was originally distributed freely (SMB library and -XSDK) is better commented. - - -C Source Content Notes -====================== - -First off, make sure you're using an editor with tab stops set to 4 spaces -for *.C and *.H files (QEdit works nicely), otherwise the source will be mostly -unreadable (don't try to print the files without first exanding all tabs to -4 space tabstops). All MAKEFILES and other text files use 8 space tab stops. - -If you're an experienced C programmer, the first thing you'll notice when -examining any of the source code is my somewhat unique style. It's your basic -K&R style C with significantly compressed whitespace. Most notably, I don't -put closing curly braces (}) on their own line (except at the end of a -function). Instead, I use consitent indentation to indicate nested logic and -control flow. Also, I don't indent the base code of a function, but I do indent -automatic variables. And I don't put white space between any operators except -&& and ||. This style comes from the usefulness of getting as much code as -possible in an 80x25 window (and saving printer paper). You'll notice, I do use -blank lines to enhance readability, but there are no strict rules I follow in -the blank line department. If my style really bugs you and you just can't get -used to it, then run the source through a C beautifier or other such C -formatting utility (but don't cry if it doesn't compile after that). - -Example (K&R style): - -main() -{ - char line[MAXLINE]; - int found = 0; - - while (getline(line, MAXLINE) > 0) - if (strindex(line, pattern) >= 0) { - printf("%s", line); - found++; - } - return found; -} - -Example (my style): - -main() -{ - char line[MAXLINE]; - int found=0; - -while(getline(line,MAXLINE)>0) - if(strindex(line,pattern)>=0) { - printf("%s",line); - found++; } -return(found); -} - -If you find blocks of code contained in "#if 0" and "#endif" or "/***" and -"***/", you can safely ignore or even delete this code (the compiler is -ignoring it). For some reason, I found it necessary or preferable to remove or -replace the code in question but wished to leave the old code temporarily -intact in case I changed my mind... I'm not going to be changing me mind. :-) - -I've deleted all sections of code refering to registration numbers, keys, etc. -If you find some code remaining that appears to require a registration number -or key of some sort, it probably can be safely ignored (unless you've found it -impeding the operation of the program) - but there shouldn't be any. - - -Last Minute Updates -=================== - -The UTI, FIXSMB, QWKNODES, and SBL2SMB/SMB2SBL projects were all converted from -SMBLIB 1.x to 2.x at the last minute. They all compile, but haven't been -tested. The differences between SMBLIB 1.x and 2.x are mainly in the calling -conventions, so these programs should run fine, but I suppose you never know -what could've happened. - -/* End of SBBS_SRC.DOC */ diff --git a/src/sbbs2/sbbsdefs.h b/src/sbbs2/sbbsdefs.h deleted file mode 100644 index 93304c26d1..0000000000 --- a/src/sbbs2/sbbsdefs.h +++ /dev/null @@ -1,1330 +0,0 @@ -/* SBBSDEFS.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/************************************************************/ -/* Constants, macros, and typedefs for use ONLY with SBBS */ -/************************************************************/ - -#ifndef _SBBSDEFS_H -#define _SBBSDEFS_H - -#include "gen_defs.h" -#include "nodedefs.h" -#include <time.h> - -/*************/ -/* Constants */ -/*************/ - -#define VERSION "2.30" /* Version: Major.minor */ -#define REVISION 'C' -#define BETA " beta" /* Space if non-beta, " �eta" otherwise */ - -#define Y2K_2DIGIT_WINDOW 70 - -/************/ -/* Maximums */ -/************/ - -#define MAX_NODES 250 - -#ifdef __FLAT__ -#define MAX_FILES 10000 /* Maximum number of files per dir */ -#define MAX_SYSMAIL 50000 /* Maximum number of total emails in system */ -#else -#define MAX_FILES 1000 /* Maximum number of files per dir */ -#define MAX_SYSMAIL 5000 /* Maximum number of total emails in system */ -#endif -#define MAX_USERXFER 500 /* Maximum number of dest. users of usrxfer */ - - -#define LEN_DIR 63 /* Maximum length of directory paths */ -#define LEN_CMD 63 /* Maximum length of command lines */ - - /* Lengths of various strings */ -#define LEN_GSNAME 15 /* Group/Lib short name */ -#define LEN_GLNAME 40 /* Group/Lib long name */ -#define LEN_SSNAME 25 /* Sub/Dir short name */ -#define LEN_SLNAME 40 /* Sub/Dir long name */ - - /* User Questions */ -#define UQ_ALIASES (1L<<0) /* Ask for alias */ -#define UQ_LOCATION (1L<<1) /* Ask for location */ -#define UQ_ADDRESS (1L<<2) /* Ask for address */ -#define UQ_PHONE (1L<<3) /* Ask for phone number */ -#define UQ_HANDLE (1L<<4) /* Ask for chat handle */ -#define UQ_DUPHAND (1L<<5) /* Search for duplicate handles */ -#define UQ_SEX (1L<<6) /* Ask for sex :) */ -#define UQ_BIRTH (1L<<7) /* Ask for birth date */ -#define UQ_COMP (1L<<8) /* Ask for computer type */ -#define UQ_MC_COMP (1L<<9) /* Multiple choice computer type */ -#define UQ_REALNAME (1L<<10) /* Ask for real name */ -#define UQ_DUPREAL (1L<<11) /* Search for duplicate real names */ -#define UQ_COMPANY (1L<<12) /* Ask for company name */ -#define UQ_NOEXASC (1L<<13) /* Don't allow ex-ASCII in user text */ -#define UQ_CMDSHELL (1L<<14) /* Ask for command shell */ -#define UQ_XEDIT (1L<<15) /* Ask for external editor */ -#define UQ_NODEF (1L<<16) /* Don't ask for default settings */ -#define UQ_NOCOMMAS (1L<<17) /* Do not require commas in location */ - - - /* Different bits in sys_misc */ -#define SM_CLOSED (1L<<0) /* System is clsoed to New Users */ -#define SM_SYSSTAT (1L<<1) /* Sysops activity included in statistics */ -#define SM_NOBEEP (1L<<2) /* No beep sound locally */ -#define SM_PWEDIT (1L<<3) /* Allow users to change their passwords */ -#define SM_TIMED_EX (1L<<4) /* Timed event must run exclusively */ -#define SM_ANON_EM (1L<<5) /* Allow anonymous e-mail */ -#define SM_LISTLOC (1L<<6) /* Use location of caller in user lists */ -#define SM_WILDCAT (1L<<7) /* Expand Wildcat color codes in messages */ -#define SM_PCBOARD (1L<<8) /* Expand PCBoard color codes in messages */ -#define SM_WWIV (1L<<9) /* Expand WWIV color codes in messages */ -#define SM_CELERITY (1L<<10) /* Expand Celerity color codes in messages */ -#define SM_RENEGADE (1L<<11) /* Expand Renegade color codes in messages */ -#define SM_ECHO_PW (1L<<12) /* Echo passwords locally */ -#define SM_REQ_PW (1L<<13) /* Require passwords locally */ -#define SM_L_SYSOP (1L<<14) /* Allow local sysop logon/commands */ -#define SM_R_SYSOP (1L<<15) /* Allow remote sysop logon/commands */ -#define SM_QUOTE_EM (1L<<16) /* Allow quoting of e-mail */ -#define SM_EURODATE (1L<<17) /* Europian date format (DD/MM/YY) */ -#define SM_MILITARY (1L<<18) /* Military time format */ -#define SM_TIMEBANK (1L<<19) /* Allow time bank functions */ -#define SM_FILE_EM (1L<<20) /* Allow file attachments in E-mail */ -#define SM_SHRTPAGE (1L<<21) /* Short sysop page */ -#define SM_TIME_EXP (1L<<22) /* Set to expired values if out-of-time */ -#define SM_FASTMAIL (1L<<23) /* Fast e-mail storage mode */ -#define SM_QVALKEYS (1L<<24) /* Quick validation keys enabled */ -#define SM_ERRALARM (1L<<25) /* Error beeps on */ -#define SM_FWDTONET (1L<<26) /* Allow forwarding of e-mail to netmail */ -#define SM_DELREADM (1L<<27) /* Delete read mail automatically */ -#define SM_NOCDTCVT (1L<<28) /* No credit to minute conversions allowed */ -#define SM_DELEMAIL (1L<<29) /* Physically remove deleted e-mail immed. */ -#define SM_USRVDELM (1L<<30) /* Users can see deleted msgs */ -#define SM_SYSVDELM (1L<<31) /* Sysops can see deleted msgs */ - - /* Different bits in node_misc */ -#define NM_ANSALARM (1<<0) /* Alarm locally on answer */ -#define NM_WFCSCRN (1<<1) /* Wait for call screen */ -#define NM_WFCMSGS (1<<2) /* Include total messages/files on WFC */ -#define NM_LCL_EDIT (1<<3) /* Use local editor to create messages */ -#define NM_EMSOVL (1<<4) /* Use expanded memory of overlays */ -#define NM_WINOS2 (1<<5) /* Use Windows/OS2 time slice API call */ -#define NM_INT28 (1<<6) /* Make int 28 DOS idle calls */ -#define NM_NODV (1<<7) /* Don't detect and use DESQview API */ -#define NM_NO_NUM (1<<8) /* Don't allow logons by user number */ -#define NM_LOGON_R (1<<9) /* Allow logons by user real name */ -#define NM_LOGON_P (1<<10) /* Secure logons (always ask for password) */ -#define NM_NO_LKBRD (1<<11) /* No local keyboard (at all) */ -#define NM_SYSPW (1<<12) /* Protect WFC keys and Alt keys with SY: */ -#define NM_NO_INACT (1<<13) /* No local inactivity alert/logoff */ -#define NM_NOBEEP (1<<14) /* Don't beep locally */ -#define NM_LOWPRIO (1<<15) /* Always use low priority input */ -#define NM_7BITONLY (1L<<16) /* Except 7-bit input only (E71 terminals) */ -#define NM_RESETVID (1L<<17) /* Reset video mode between callers? */ - - /* Miscellaneous Modem Settings (mdm_misc) */ -#define MDM_CTS (1<<0) /* Use hardware send flow control */ -#define MDM_RTS (1<<1) /* Use hardware recv flow control */ -#define MDM_STAYHIGH (1<<2) /* Stay at highest DTE rate */ -#define MDM_CALLERID (1<<3) /* Supports Caller ID */ -#define MDM_DUMB (1<<4) /* Just watch DCD for answer - dumb modem */ -#define MDM_NODTR (1<<5) /* Don't drop DTR for hang-up */ -#define MDM_KNOWNRES (1<<6) /* Allow known result codes only */ -#define MDM_VERBAL (1<<7) /* Use verbal result codes */ - - /* Bit values for level_misc[x] */ -#define LEVEL_EXPTOLVL (1<<0) /* Expire to level_expireto[x] */ -#define LEVEL_EXPTOVAL (1<<1) /* Expire to val[level_expireto[x]] */ - - /* Bit values for prot[x].misc */ -#define PROT_DSZLOG (1<<0) /* Supports DSZ Log */ - - /* Bit values in netmail_misc */ - -#define NMAIL_ALLOW (1<<0) /* Allow NetMail */ -#define NMAIL_CRASH (1<<1) /* Default netmail to crash */ -#define NMAIL_HOLD (1<<2) /* Default netmail to hold */ -#define NMAIL_KILL (1<<3) /* Default netmail to kill after sent */ -#define NMAIL_ALIAS (1<<4) /* Use Aliases in NetMail */ -#define NMAIL_FILE (1<<5) /* Allow file attachments */ -#define NMAIL_DIRECT (1<<6) /* Default netmail to direct */ - - /* Attribute bits for fido msg header */ -#define FIDO_PRIVATE (1<<0) /* Private message */ -#define FIDO_CRASH (1<<1) /* Crash-mail (send immediately) */ -#define FIDO_RECV (1<<2) /* Received successfully */ -#define FIDO_SENT (1<<3) /* Sent successfully */ -#define FIDO_FILE (1<<4) /* File attached */ -#define FIDO_INTRANS (1<<5) /* In transit */ -#define FIDO_ORPHAN (1<<6) /* Orphan */ -#define FIDO_KILLSENT (1<<7) /* Kill it after sending it */ -#define FIDO_LOCAL (1<<8) /* Created locally - on this system */ -#define FIDO_HOLD (1<<9) /* Hold - don't send it yet */ -#define FIDO_FREQ (1<<11) /* File request */ -#define FIDO_RRREQ (1<<12) /* Return receipt request */ -#define FIDO_RR (1<<13) /* This is a return receipt */ -#define FIDO_AUDIT (1<<14) /* Audit request */ -#define FIDO_FUPREQ (1<<15) /* File update request */ - - /* Bit values for sub[x].misc */ -#define SUB_NSCAN (1L<<0) /* Scan this sub-board for new msgs */ -#define SUB_YSCAN (1L<<1) /* Scan for new messages to you only */ -#define SUB_SSCAN (1L<<2) /* Scan this sub-board for msgs to you */ -#define SUB_QNET (1L<<3) /* Sub-board is netted via QWK network */ -#define SUB_PNET (1L<<4) /* Sub-board is netted via PostLink */ -#define SUB_FIDO (1L<<5) /* Sub-board is netted via FidoNet */ -#define SUB_PRIV (1L<<6) /* Allow private posts on sub */ -#define SUB_PONLY (1L<<7) /* Private posts only */ -#define SUB_ANON (1L<<8) /* Allow anonymous posts on sub */ -#define SUB_AONLY (1L<<9) /* Anonymous only */ -#define SUB_NAME (1L<<10) /* Must use real names */ -#define SUB_DEL (1L<<11) /* Allow users to delete messages */ -#define SUB_DELLAST (1L<<12) /* Allow users to delete last msg only */ -#define SUB_FORCED (1L<<13) /* Sub-board is forced scanning */ -#define SUB_NOTAG (1L<<14) /* Don't add tag or origin lines */ -#define SUB_TOUSER (1L<<15) /* Prompt for to user on posts */ -#define SUB_ASCII (1L<<16) /* ASCII characters only */ -#define SUB_QUOTE (1L<<17) /* Allow online quoting */ -#define SUB_NSDEF (1L<<18) /* New-Scan on by default */ -#define SUB_INET (1L<<19) /* Sub-board is netted via Internet */ -#define SUB_FAST (1L<<20) /* Fast storage mode */ -#define SUB_KILL (1L<<21) /* Kill read messages automatically */ -#define SUB_KILLP (1L<<22) /* Kill read pvt messages automatically */ -#define SUB_SYSPERM (1L<<23) /* Sysop messages are permament */ -#define SUB_GATE (1L<<24) /* Gateway between Network types */ -#define SUB_LZH (1L<<25) /* Use LZH compression for msgs */ -#define SUB_SSDEF (1L<<26) /* Default ON for Scan for Your msgs */ -#define SUB_HYPER (1L<<27) /* Hyper allocation */ - - /* Bit values for dir[x].misc */ -#define DIR_FCHK (1L<<0) /* Check for file existance */ -#define DIR_RATE (1L<<1) /* Force uploads to be rated G,R, or X */ -#define DIR_MULT (1L<<2) /* Ask for multi-disk numbering */ -#define DIR_DUPES (1L<<3) /* Search this dir for upload dupes */ -#define DIR_FREE (1L<<4) /* Free downloads */ -#define DIR_TFREE (1L<<5) /* Time to download is free */ -#define DIR_CDTUL (1L<<6) /* Credit Uploads */ -#define DIR_CDTDL (1L<<7) /* Credit Downloads */ -#define DIR_ANON (1L<<8) /* Anonymous uploads */ -#define DIR_AONLY (1L<<9) /* Anonymous only */ -#define DIR_ULDATE (1L<<10) /* Include upload date in listing */ -#define DIR_DIZ (1L<<11) /* FILE_ID.DIZ and DESC.SDI support */ -#define DIR_NOSCAN (1L<<12) /* Don't new-scan this directory */ -#define DIR_NOAUTO (1L<<13) /* Don't auto-add this directory */ -#define DIR_ULTIME (1L<<14) /* Deduct time during uploads */ -#define DIR_CDTMIN (1L<<15) /* Give uploader minutes instead of cdt */ -#define DIR_SINCEDL (1L<<16) /* Purge based on days since last dl */ -#define DIR_MOVENEW (1L<<17) /* Files marked as new when moved */ - - /* Bit values for file_t.misc */ -#define FM_EXTDESC (1<<0) /* Extended description exists */ -#define FM_ANON (1<<1) /* Anonymous upload */ - -enum { /* errormsg() codes */ - ERR_OPEN /* opening a file */ - ,ERR_CLOSE /* close a file */ - ,ERR_FDOPEN /* associating a stream with fd */ - ,ERR_READ /* reading from file */ - ,ERR_WRITE /* writing to file */ - ,ERR_REMOVE /* removing a file */ - ,ERR_ALLOC /* allocating memory */ - ,ERR_CHK /* checking */ - ,ERR_LEN /* file length */ - ,ERR_EXEC /* executing */ - ,ERR_CHDIR /* changing directory */ - ,ERR_CREATE /* creating */ - ,ERR_LOCK /* locking */ - ,ERR_UNLOCK /* unlocking */ - }; - -enum { /* Values for dir[x].sort */ - SORT_NAME_A /* Sort by filename, ascending */ - ,SORT_NAME_D /* Sort by filename, descending */ - ,SORT_DATE_A /* Sort by upload date, ascending */ - ,SORT_DATE_D /* Sort by upload date, descending */ - }; - -enum { - clr_mnehigh - ,clr_mnelow - ,clr_mnecmd - ,clr_inputline - ,clr_err - ,clr_nodenum - ,clr_nodeuser - ,clr_nodestatus - ,clr_filename - ,clr_filecdt - ,clr_filedesc - ,clr_filelsthdrbox - ,clr_filelstline - ,clr_chatlocal - ,clr_chatremote - ,clr_multichat - ,TOTAL_COLORS }; - -enum { /* Values for xtrn_t.type */ - XTRN_NONE /* No data file needed */ - ,XTRN_SBBS /* Synchronet external */ - ,XTRN_WWIV /* WWIV external */ - ,XTRN_GAP /* Gap door */ - ,XTRN_RBBS /* RBBS, QBBS, or Remote Access */ - ,XTRN_WILDCAT /* Wildcat */ - ,XTRN_PCBOARD /* PCBoard */ - ,XTRN_SPITFIRE /* SpitFire */ - ,XTRN_UTI /* UTI Doors - MegaMail */ - ,XTRN_SR /* Solar Realms */ - ,XTRN_RBBS1 /* DORINFO1.DEF always */ - ,XTRN_TRIBBS /* TRIBBS.SYS */ - }; - -enum { /* Values for xtrn_t.event */ - EVENT_NONE /* Only accessible by menu */ - ,EVENT_LOGON /* Execute during logon sequence */ - ,EVENT_LOGOFF /* Execute during logoff sequence */ - ,EVENT_NEWUSER /* Execute during newuser app. */ - ,EVENT_BIRTHDAY /* Execute on birthday */ - }; - - /* Misc bits for event_t.misc */ -#define EVENT_EXCL (1L<<0) /* Exclusive */ -#define EVENT_FORCE (1L<<1) /* Force users off-line for event */ - - /* Mode bits for QWK stuff */ -#define A_EXPAND (1<<0) /* Expand to ANSI sequences */ -#define A_LEAVE (1<<1) /* Leave in */ -#define A_STRIP (1<<2) /* Strip out */ - - /* Bits in xtrn_t.misc */ -#define MULTIUSER (1L<<0) /* allow multi simultaneous users */ -#define ANSI (1L<<1) /* user must have ANSI, same as ^^^ */ -#define IO_INTS (1L<<2) /* Intercept I/O interrupts */ -#define MODUSERDAT (1L<<3) /* Program can modify user data */ -#define WWIVCOLOR (1L<<4) /* Program uses WWIV color codes */ -#define EVENTONLY (1L<<5) /* Program executes as event only */ -#define STARTUPDIR (1L<<6) /* Create drop file in start-up dir */ -#define REALNAME (1L<<7) /* Use real name in drop file */ -#define SWAP (1L<<8) /* Swap for this door */ -#define FREETIME (1L<<9) /* Free time while in this door */ -#define QUICKBBS (1L<<10) /* QuickBBS style editor */ -#define EXPANDLF (1L<<11) /* Expand LF to CRLF editor */ -#define QUOTEALL (1L<<12) /* Automatically quote all of msg */ -#define QUOTENONE (1L<<13) /* Automatically quote none of msg */ - - /* Bits in user.qwk */ -#define QWK_FILES (1L<<0) /* Include new files list */ -#define QWK_EMAIL (1L<<1) /* Include unread e-mail */ -#define QWK_ALLMAIL (1L<<2) /* Include ALL e-mail */ -#define QWK_DELMAIL (1L<<3) /* Delete e-mail after download */ -#define QWK_BYSELF (1L<<4) /* Include messages from self */ -#define QWK_UNUSED (1L<<5) /* Currently unused */ -#define QWK_EXPCTLA (1L<<6) /* Expand ctrl-a codes to ascii */ -#define QWK_RETCTLA (1L<<7) /* Retain ctrl-a codes */ -#define QWK_ATTACH (1L<<8) /* Include file attachments */ -#define QWK_NOINDEX (1L<<9) /* Do not create index files in QWK */ -#define QWK_TZ (1L<<10) /* Include "@TZ" time zone in msgs */ -#define QWK_VIA (1L<<11) /* Include "@VIA" seen-bys in msgs */ -#define QWK_NOCTRL (1L<<12) /* No extraneous control files */ - -#define INVALID_DIR 0xffff /* Invalid directory value */ -#define INVALID_SUB 0xffff /* Invalid sub-board value */ - -#define KEY_BUFSIZE 1024 /* Size of keyboard input buffer */ -#define SAVE_LINES 4 /* Maximum number of lines to save */ -#define LINE_BUFSIZE 512 /* Size of line output buffer */ - - -#define TABSIZE 4 /* Tab Size */ - -#define SWAP_NONE 0x80 /* Allow no swapping for executables */ - -#define DSTSDABLEN 50 /* Length of DSTS.DAB file */ - - /* Console I/O Bits (console) */ -#define CON_R_ECHO (1<<0) /* Echo remotely */ -#define CON_R_ECHOX (1<<1) /* Echo X's to remote user */ -#define CON_R_INPUT (1<<2) /* Accept input remotely */ -#define CON_L_ECHO (1<<3) /* Echo locally */ -#define CON_L_ECHOX (1<<4) /* Echo X's locally */ -#define CON_L_INPUT (1<<5) /* Accept input locally */ -#define CON_RAW_IN (1<<8) /* Raw input mode - no editing capabilities */ -#define CON_ECHO_OFF (1<<10)/* Remote & Local echo disabled for ML/MF */ -#define CON_UPARROW (1<<11)/* Up arrow hit - move up one line */ - - /* Number of milliseconds */ -#define DELAY_HANGUP 250 /* Delay before modem drops carrier */ -#define DELAY_MDMTLD 500 /* Delay to give each ~ in modem strings */ -#define DELAY_SPIN 10 /* Delay for the spinning cursor */ -#define DELAY_AUTOHG 1500 /* Delay for auto-hangup (xfer) */ - -#define SEC_LOGON 1800 /* 30 minutes allowed to logon */ -#define SEC_BILLING 90 /* under 2 minutes per billing call */ -#define SEC_OK 5 /* Attempt to get an OK response from modem */ -#define SEC_ANSI 5 /* Attempt to get a valid ANSI response */ -#define SEC_ANSWER 30 /* Retries to get an answer code from modem */ -#define SEC_CID 10 /* Ten second pause for caller ID */ -#define SEC_RING 6 /* Maximum seconds between rings */ - -#define LOOP_NOPEN 50 /* Retries before file access denied */ -#define LOOP_NODEDAB 50 /* Retries on NODE.DAB locking/unlocking */ - - /* String lengths */ -#define LEN_ALIAS 25 /* User alias */ -#define LEN_NAME 25 /* User name */ -#define LEN_HANDLE 8 /* User chat handle */ -#define LEN_NOTE 30 /* User note */ -#define LEN_COMP 30 /* User computer description */ -#define LEN_COMMENT 60 /* User comment */ -#define LEN_NETMAIL 60 /* NetMail forwarding address */ -#define LEN_PASS 8 /* User password */ -#define LEN_PHONE 12 /* User phone number */ -#define LEN_BIRTH 8 /* Birthday in MM/DD/YY format */ -#define LEN_ADDRESS 30 /* User address */ -#define LEN_LOCATION 30 /* Location (City, State) */ -#define LEN_ZIPCODE 10 /* Zip/Postal code */ -#define LEN_MODEM 8 /* User modem type description */ -#define LEN_FDESC 58 /* File description */ -#define LEN_FCDT 9 /* 9 digits for file credit values */ -#define LEN_TITLE 70 /* Message title */ -#define LEN_MAIN_CMD 40 /* Storage in user.dat for custom commands */ -#define LEN_XFER_CMD 40 -#define LEN_SCAN_CMD 40 -#define LEN_MAIL_CMD 40 -#define LEN_CID 25 /* Caller ID (phone number) */ -#define LEN_ARSTR 40 /* Max length of Access Requirement string */ -#define LEN_CHATACTCMD 9 /* Chat action command */ -#define LEN_CHATACTOUT 65 /* Chat action output string */ - -/****************************************************************************/ -/* This is a list of offsets into the USER.DAT file for different variables */ -/* that are stored (for each user) */ -/****************************************************************************/ -#define U_ALIAS 0 /* Offset to alias */ -#define U_NAME (U_ALIAS+LEN_ALIAS) /* Offset to name */ -#define U_HANDLE (U_NAME+LEN_NAME) -#define U_NOTE (U_HANDLE+LEN_HANDLE+2) -#define U_COMP (U_NOTE+LEN_NOTE) -#define U_COMMENT (U_COMP+LEN_COMP+2) - -#define U_NETMAIL (U_COMMENT+LEN_COMMENT+2) - -#define U_ADDRESS (U_NETMAIL+LEN_NETMAIL+2) -#define U_LOCATION (U_ADDRESS+LEN_ADDRESS) -#define U_ZIPCODE (U_LOCATION+LEN_LOCATION) - -#define U_PASS (U_ZIPCODE+LEN_ZIPCODE+2) -#define U_PHONE (U_PASS+8) /* Offset to phone-number */ -#define U_BIRTH (U_PHONE+12) /* Offset to users birthday */ -#define U_MODEM (U_BIRTH+8) -#define U_LASTON (U_MODEM+8) -#define U_FIRSTON (U_LASTON+8) -#define U_EXPIRE (U_FIRSTON+8) -#define U_PWMOD (U_EXPIRE+8) - -#define U_LOGONS (U_PWMOD+8+2) -#define U_LTODAY (U_LOGONS+5) -#define U_TIMEON (U_LTODAY+5) -#define U_TEXTRA (U_TIMEON+5) -#define U_TTODAY (U_TEXTRA+5) -#define U_TLAST (U_TTODAY+5) -#define U_POSTS (U_TLAST+5) -#define U_EMAILS (U_POSTS+5) -#define U_FBACKS (U_EMAILS+5) -#define U_ETODAY (U_FBACKS+5) -#define U_PTODAY (U_ETODAY+5) - -#define U_ULB (U_PTODAY+5+2) -#define U_ULS (U_ULB+10) -#define U_DLB (U_ULS+5) -#define U_DLS (U_DLB+10) -#define U_CDT (U_DLS+5) -#define U_MIN (U_CDT+10) - -#define U_LEVEL (U_MIN+10+2) /* Offset to Security Level */ -#define U_FLAGS1 (U_LEVEL+2) /* Offset to Flags */ -#define U_TL (U_FLAGS1+8) /* Offset to unused field */ -#define U_FLAGS2 (U_TL+2) -#define U_EXEMPT (U_FLAGS2+8) -#define U_REST (U_EXEMPT+8) -#define U_ROWS (U_REST+8+2) /* Number of Rows on user's monitor */ -#define U_SEX (U_ROWS+2) /* Sex, Del, ANSI, color etc. */ -#define U_MISC (U_SEX+1) /* Miscellaneous flags in 8byte hex */ -#define U_OLDXEDIT (U_MISC+8) /* External editor (Version 1 method) */ -#define U_LEECH (U_OLDXEDIT+2) /* two hex digits - leech attempt count */ -#define U_CURSUB (U_LEECH+2) /* Current sub (internal code) */ -#define U_CURDIR (U_CURSUB+8) /* Current dir (internal code) */ -#define U_CMDSET (U_CURDIR+8) /* unused */ -#define U_MAIN_CMD (U_CMDSET+2+2) /* unused */ -#define U_XFER_CMD (U_MAIN_CMD+LEN_MAIN_CMD) /* unused */ -#define U_SCAN_CMD (U_XFER_CMD+LEN_XFER_CMD+2) /* unused */ -#define U_MAIL_CMD (U_SCAN_CMD+LEN_SCAN_CMD) /* unused */ -#define U_FREECDT (U_MAIL_CMD+LEN_MAIL_CMD+2) -#define U_FLAGS3 (U_FREECDT+10) /* Flag set #3 */ -#define U_FLAGS4 (U_FLAGS3+8) /* Flag set #4 */ -#define U_XEDIT (U_FLAGS4+8) /* External editor (code) */ -#define U_SHELL (U_XEDIT+8) /* Command shell (code) */ -#define U_QWK (U_SHELL+8) /* QWK settings */ -#define U_TMPEXT (U_QWK+8) /* QWK extension */ -#define U_CHAT (U_TMPEXT+3) /* Chat settings */ -#define U_NS_TIME (U_CHAT+8) /* New-file scan date/time */ -#define U_PROT (U_NS_TIME+8) /* Default transfer protocol */ -#define U_UNUSED (U_PROT+1) -#define U_LEN (U_UNUSED+28+2) - -/****************************************************************************/ -/* Offsets into DIR .DAT file for different fields for each file */ -/****************************************************************************/ -#define F_CDT 0 /* Offset in DIR#.DAT file for cdts */ -#define F_DESC (F_CDT+LEN_FCDT)/* Description */ -#define F_ULER (F_DESC+LEN_FDESC+2) /* Uploader */ -#define F_TIMESDLED (F_ULER+30+2) /* Number of times downloaded */ -#define F_OPENCOUNT (F_TIMESDLED+5+2) -#define F_MISC (F_OPENCOUNT+3+2) -#define F_ALTPATH (F_MISC+1) /* Two hex digit alternate path */ -#define F_LEN (F_ALTPATH+2+2) /* Total length of all fdat in file */ - -#define F_IXBSIZE 22 /* Length of each index entry */ - - -#define SIF_MAXBUF 0x7000 /* Maximum buffer size of SIF data */ - -/* NOTE: Do not change the values of the following block of defines! */ - -#define DELETED (1L<<0) /* Bit values for user.misc */ -#define ANSI (1L<<1) /* Supports ANSI terminal emulation */ -#define COLOR (1L<<2) /* Send color codes */ -#define RIP (1L<<3) /* Supports RIP terminal emulation */ -#define UPAUSE (1L<<4) /* Pause on every screen full */ -#define SPIN (1L<<5) /* Spinning cursor - Same as K_SPIN */ -#define INACTIVE (1L<<6) /* Inactive user slot */ -#define EXPERT (1L<<7) /* Expert menu mode */ -#define ANFSCAN (1L<<8) /* Auto New file scan */ -#define CLRSCRN (1L<<9) /* Clear screen before each message */ -#define QUIET (1L<<10) /* Quiet mode upon logon */ -#define BATCHFLAG (1L<<11) /* File list allow batch dl flags */ -#define NETMAIL (1L<<12) /* Forward e-mail to fidonet addr */ -#define CURSUB (1L<<13) /* Remember current sub-board/dir */ -#define ASK_NSCAN (1L<<14) /* Ask for newscanning upon logon */ -#define NO_EXASCII (1L<<15) /* Don't send extended ASCII */ -#define ASK_SSCAN (1L<<16) /* Ask for messages to you at logon */ -#define AUTOTERM (1L<<17) /* Autodetect terminal type */ -#define COLDKEYS (1L<<18) /* No hot-keys */ -#define EXTDESC (1L<<19) /* Extended file descriptions */ -#define AUTOHANG (1L<<20) /* Auto-hang-up after transfer */ -#define WIP (1L<<21) /* Supports WIP terminal emulation */ - -#define CLREOL 256 /* Character to erase to end of line */ -#define HIGH 8 /* High intensity for curatr */ - - /* Online status (online) */ -#define ON_LOCAL 1 /* Online locally */ -#define ON_REMOTE 2 /* Online remotely */ -#define ON_XFER 3 /* Online remotely - transferring file */ -#define ON_WFC 4 /* Online waiting for a call */ - - /* Varios SYSTEM parameters for sys_status */ -#define SS_LOGOPEN (1L<<0) /* Node's Log file is open */ -#define SS_INITIAL (1L<<1) /* The bbs data has been initialized. */ -#define SS_TMPSYSOP (1L<<2) /* Temporary Sysop Status */ -#define SS_USERON (1L<<3) /* A User is logged on to the BBS */ -#define SS_LCHAT (1L<<4) /* Local chat in progress */ -#define SS_CAP (1L<<5) /* Capture is on */ -#define SS_ANSCAP (1L<<6) /* Capture ANSI codes too */ -#define SS_FINPUT (1L<<7) /* Using file for input */ -#define SS_COMISR (1L<<8) /* Com port ISR is installed */ -#define SS_DAILY (1L<<9) /* Execute System Daily Event on logoff */ -#define SS_INUEDIT (1L<<10) /* Inside Alt-Useredit section */ -#define SS_ABORT (1L<<11) /* Global abort input or output flag */ -#define SS_SYSPAGE (1L<<12) /* Paging sysop */ -#define SS_SYSALERT (1L<<13) /* Notify sysop when users hangs up */ -#define SS_GURUCHAT (1L<<14) /* Guru chat in progress */ -#define SS_NODEDAB (1L<<15) /* NODE.DAB operations are okay */ -#define SS_EVENT (1L<<16) /* Time shortened due to upcoming event */ -#define SS_PAUSEON (1L<<17) /* Pause on, overriding user default */ -#define SS_PAUSEOFF (1L<<18) /* Pause off, overriding user default */ -#define SS_IN_CTRLP (1L<<19) /* Inside ctrl-p send node message func */ -#define SS_NEWUSER (1L<<20) /* New User online */ -#define SS_MDMDEBUG (1L<<21) /* Modem debug output */ -#define SS_NEST_PF (1L<<22) /* Nested in printfile function */ -#define SS_DCDHIGH (1L<<23) /* Assume DCD is high always */ -#define SS_SPLITP (1L<<24) /* Split-screen private chat */ -#define SS_NEWDAY (1L<<25) /* Date changed while online */ - - /* Bits in 'mode' for getkey and getstr */ -#define K_UPPER (1L<<0) /* Converts all letters to upper case */ -#define K_UPRLWR (1L<<1) /* Upper/Lower case automatically */ -#define K_NUMBER (1L<<2) /* Allow numbers only */ -#define K_WRAP (1L<<3) /* Allows word wrap */ -#define K_MSG (1L<<4) /* Allows ANSI, ^N ^A ^G */ -#define K_SPIN (1L<<5) /* Spinning cursor (same as SPIN) */ -#define K_LINE (1L<<6) /* Input line (inverse color) */ -#define K_EDIT (1L<<7) /* Edit string passed */ -#define K_CHAT (1L<<8) /* In chat multi-chat */ -#define K_NOCRLF (1L<<9) /* Don't print CRLF after string input */ -#define K_ALPHA (1L<<10) /* Only allow alphabetic characters */ -#define K_GETSTR (1L<<11) /* getkey called from getstr() */ -#define K_LOWPRIO (1L<<12) /* low priority input */ -#define K_NOEXASC (1L<<13) /* No extended ASCII allowed */ -#define K_E71DETECT (1L<<14) /* Detect E-7-1 terminal type */ -#define K_AUTODEL (1L<<15) /* Auto-delete text (used with K_EDIT) */ -#define K_COLD (1L<<16) /* Possible cold key mode */ -#define K_NOECHO (1L<<17) /* Don't echo input */ - - /* Bits in 'mode' for putmsg and printfile */ -#define P_NOABORT (1<<0) /* Disallows abortion of a message */ -#define P_SAVEATR (1<<1) /* Save the new current attributres after */ - /* msg has printed. */ -#define P_NOATCODES (1<<2) /* Don't allow @ codes */ -#define P_OPENCLOSE (1<<3) /* Open and close the file */ - - /* Bits in 'mode' for listfiles */ -#define FL_ULTIME (1<<0) /* List files by upload time */ -#define FL_DLTIME (1<<1) /* List files by download time */ -#define FL_NO_HDR (1<<2) /* Don't list directory header */ -#define FL_FINDDESC (1<<3) /* Find text in description */ -#define FL_EXFIND (1<<4) /* Find text in description - extended info */ -#define FL_VIEW (1<<5) /* View ZIP/ARC/GIF etc. info */ - - /* Bits in the mode of writemsg and email() */ -#define WM_EXTDESC (1<<0) /* Writing extended file description */ -#define WM_EMAIL (1<<1) /* Writing e-mail */ -#define WM_NETMAIL (1<<2) /* Writing NetMail */ -#define WM_ANON (1<<3) /* Writing anonymous message */ -#define WM_FILE (1<<4) /* Attaching a file to the message */ -#define WM_NOTOP (1<<5) /* Don't add top because we need top line */ -#define WM_QUOTE (1<<6) /* Quote file available */ -#define WM_QWKNET (1<<7) /* Writing QWK NetMail (25 char title) */ -#define WM_PRIVATE (1<<8) /* Private (for creating MSGINF file) */ - - /* Bits in the mode of loadposts() */ -#define LP_BYSELF (1<<0) /* Include messages sent by self */ -#define LP_OTHERS (1<<1) /* Include messages sent to others */ -#define LP_UNREAD (1<<2) /* Un-read messages only */ -#define LP_PRIVATE (1<<3) /* Include all private messages */ -#define LP_REP (1<<4) /* Packing REP packet */ - - /* Bits in the mode of loadmail() */ -#define LM_UNREAD (1<<0) /* Include un-read mail only */ -#define LM_QWK (1<<1) /* Loading for a QWK packet */ - -enum { /* readmail and delmailidx which types */ - MAIL_YOUR /* mail sent to you */ - ,MAIL_SENT /* mail you have sent */ - ,MAIL_ANY /* mail sent to or from you */ - ,MAIL_ALL /* all mail (ignores usernumber arg) */ - }; - -#if 0 - /* Message mode bits */ -#define MSG_PERM 1 /* Permanent - non-purgable message (post) */ -#define MSG_FORWARD 1 /* Forwarded message (mail) */ -#define MSG_ANON 2 /* Anonymous message */ -#define MSG_PRIVATE 4 /* Private posted message */ -#define MSG_READ 8 /* Private post has been read */ -#define MSG_FILE 16 /* File attached */ - -#endif - - /* Bits in the mode of external() */ -#define EX_CC (1<<0) /* Use command.com to load other process */ -#define EX_OUTR (1<<1) /* Copy DOS output to remote */ -#define EX_OUTL (1<<2) /* Use _lputc() for local DOS output */ -#define EX_INR (1<<3) /* Trap int 16h keyboard input requests */ -#define EX_WWIV (1<<4) /* Expand WWIV color codes to ANSI sequence */ -#define EX_SWAP (1<<5) /* Swap out for this external */ -#define EX_OS2 (1<<6) /* Executing an OS/2 pgm from SBBS4OS2 */ -#define EX_POPEN (1<<7) /* Leave COM port open */ - -#define OS2_POPEN (1<<0) /* Leave COM port open */ - -enum { /* Values for 'mode' in listfileinfo */ - FI_INFO /* Just list file information */ - ,FI_REMOVE /* Remove/Move/Edit file information */ - ,FI_DOWNLOAD /* Download files */ - ,FI_OLD /* Search/Remove files not downloaded since */ - ,FI_OLDUL /* Search/Remove files uploaded before */ - ,FI_OFFLINE /* Search/Remove files not online */ - ,FI_USERXFER /* User Xfer Download */ - ,FI_CLOSE /* Close any open records */ - }; - -#define L_LOGON 1 /* Logon List maintenance */ -#define LOL_SIZE 81 /* Length of each logon list entry */ - -#define CHAT_ECHO (1<<0) /* Multinode chat echo */ -#define CHAT_ACTION (1<<1) /* Chat actions */ -#define CHAT_NOPAGE (1<<2) /* Can't be paged */ -#define CHAT_NOACT (1<<3) /* No activity alerts */ -#define CHAT_SPLITP (1<<4) /* Split screen private chat */ - - /* Bits in mode of scanposts() function */ -#define SCAN_CONST (1<<0) /* Continuous message scanning */ -#define SCAN_NEW (1<<1) /* New scanning */ -#define SCAN_BACK (1<<2) /* Scan the last message if no new */ -#define SCAN_TOYOU (1<<3) /* Scan for messages to you */ -#define SCAN_FIND (1<<4) /* Scan for text in messages */ -#define SCAN_UNREAD (1<<5) /* Find un-read messages to you */ - - /* Bits in misc of chan_t */ -#define CHAN_PW (1<<0) /* Can be password protected */ -#define CHAN_GURU (1<<1) /* Guru joins empty channel */ - -enum { /* Values of mode for userlist function */ - UL_ALL /* List all users in userlist */ - ,UL_SUB /* List all users with access to cursub */ - ,UL_DIR /* List all users with access to curdir */ - }; - - -#define BO_LEN 16 /* BACKOUT.DAB record length */ - -#define BO_OPENFILE 0 /* Backout types */ - - -/**********/ -/* Macros */ -/**********/ - -#define CRLF { outchar(CR); outchar(LF); } -#define SYSOP (useron.level>=90 || sys_status & SS_TMPSYSOP) -#define REALSYSOP (useron.level>=90) -#define FLAG(x) (long)(1L<<(x-'A')) -#define CLS outchar(FF) -#define WHERE __LINE__,__FILE__ -#define SAVELINE { slatr[slcnt]=latr; \ - sprintf(slbuf[slcnt<SAVE_LINES ? slcnt++ : slcnt] \ - ,"%.*s",lbuflen,lbuf); \ - lbuflen=0; } -#define RESTORELINE { lbuflen=0; attr(slatr[--slcnt]); \ - bputs(slbuf[slcnt]); \ - curatr=lclatr(-1); } -#define RIOSYNC(x) { if(online==ON_REMOTE) riosync(x); } -#define SYNC { getnodedat(node_num,&thisnode,0); \ - RIOSYNC(0); \ - nodesync(); } -#define ASYNC { getnodedat(node_num,&thisnode,0); \ - RIOSYNC(1); \ - nodesync(); } -#define DCDHIGH (sys_status&SS_DCDHIGH || rioctl(IOSTATE)&DCD) -#define ANSI_SAVE() bputs("\x1b[s") -#define ANSI_RESTORE() bputs("\x1b[u") -#define GOTOXY(x,y) bprintf("\x1b[%d;%dH",y,x) -#define TM_YEAR(yy) ((yy)%100) - -extern long crc32tbl[]; -#define ucrc32(ch,crc) (crc32tbl[(crc^ch)&0xff]^(crc>>8)) - -#ifdef __FLAT__ -#define TEXTWINDOW window(1,1,80,node_scrnlen-1) -#define STATUSLINE window(1,node_scrnlen,80,node_scrnlen) -#else -#define TEXTWINDOW -#define STATUSLINE -#endif - -#define ucrc32(ch,crc) (crc32tbl[(crc^ch)&0xff]^(crc>>8)) - -#ifdef __WATCOMC__ - - #if !defined(__COLORS) - #define __COLORS - - enum COLORS { - BLACK, /* dark colors */ - BLUE, - GREEN, - CYAN, - RED, - MAGENTA, - BROWN, - LIGHTGRAY, - DARKGRAY, /* light colors */ - LIGHTBLUE, - LIGHTGREEN, - LIGHTCYAN, - LIGHTRED, - LIGHTMAGENTA, - YELLOW, - WHITE - }; - #endif - - #define BLINK 128 /* blink bit */ - - #define ffblk find_t - #define findfirst(x,y,z) _dos_findfirst(x,z,y) - #define findnext(x) _dos_findnext(x) -#endif - -#if DEBUG /* if DEBUG, call function */ -#define DLOG(where,txt) dlog(where,txt) -#else /* else, do nothing - function isn't even valid */ -#define DLOG(where,txt) -#endif - - -/********************/ -/* Type Definitions */ -/********************/ - -typedef struct { /* Users information */ - ushort number, /* Number */ - uls, /* Number of uploads */ - dls, /* Number of downloads */ - posts, /* Number of posts */ - emails, /* Number of emails */ - fbacks, /* Number of emails sent to sysop */ - etoday, /* Emails today */ - ptoday, /* Posts today */ - timeon, /* Total time on */ - textra, /* Extra time for today */ - logons, /* Total logons */ - ttoday, /* Time on today */ - tlast, /* Time on last call */ - ltoday, /* Logons today */ - xedit, /* External editor (1 based) */ - shell; /* Command shell */ - uchar level, /* Security level */ - sex, /* Sex - M or F */ - rows, /* Rows of text */ - prot, /* Default transfer protocol */ - alias[LEN_ALIAS+1], /* Alias */ - name[LEN_NAME+1], /* Name - Real */ - handle[LEN_HANDLE+1], /* Chat handle */ - comp[LEN_COMP+1], /* Computer type */ - note[LEN_NOTE+1], /* Public notice about this user */ - address[LEN_ADDRESS+1], /* Street Address */ - location[LEN_LOCATION+1], /* Location of user */ - zipcode[LEN_ZIPCODE+1], /* Zip/Postal code */ - pass[LEN_PASS+1], /* Password - not case sensitive */ - birth[LEN_BIRTH+1], /* Birthday in MM/DD/YY format */ - phone[LEN_PHONE+1], /* Phone number xxx-xxx-xxxx format */ - modem[LEN_MODEM+1], /* Modem type - 8 chars max */ - netmail[LEN_NETMAIL+1], /* NetMail forwarding address */ - leech, /* Leech attempt counter */ - tmpext[4], /* QWK Packet extension */ - comment[LEN_COMMENT+1], /* Private comment about user */ - cursub[9], /* Current sub-board internal code */ - curdir[9]; /* Current directory internal code */ - ulong misc, /* Misc. bits - ANSI, Deleted etc. */ - qwk, /* QWK settings */ - chat, /* Chat defaults */ - flags1, /* Flag set #1 */ - flags2, /* Flag set #2 */ - flags3, /* Flag set #3 */ - flags4, /* Flag set #4 */ - exempt, /* Exemption Flags */ - rest, /* Restriction Flags */ - ulb, /* Total bytes uploaded */ - dlb, /* Total bytes downloaded */ - cdt, /* Credits */ - min, /* Minutes */ - freecdt; /* Free credits (renewed daily) */ - time_t firston, /* Date/Time first called */ - laston, /* Last logoff date/time */ - expire, /* Expiration date */ - pwmod, /* Password last modified */ - ns_time; /* Date/Time of last new file scan */ - } user_t; - -typedef struct { /* File (transfers) Data */ - uchar name[13], /* Name of file FILENAME.EXT */ - desc[LEN_FDESC+1], /* Uploader's Description */ - uler[LEN_ALIAS+1], /* User who uploaded */ - opencount, /* Times record is currently open */ - path[LEN_DIR+1]; /* Alternate DOS path */ - time_t date, /* File date/time */ - dateuled, /* Date/Time (Unix) Uploaded */ - datedled; /* Date/Time (Unix) Last downloaded */ - ushort dir, /* Directory file is in */ - altpath, - timesdled, /* Total times downloaded */ - timetodl; /* How long transfer time */ - long datoffset, /* Offset into .DAT file */ - size, /* Size of file */ - misc; /* Miscellaneous bits */ - ulong cdt; /* Credit value for this file */ - } file_t; - -typedef struct { /* Mail data (taken from index) */ - ulong offset, /* Offset to header (in bytes) */ - number, /* Number of message */ - time; /* Time imported */ - ushort to, /* To user # */ - from, /* From user # */ - subj, /* CRC-16 of subject */ - attr; /* Attributes */ - } mail_t; - -typedef struct { /* System/Node Statistics */ - ulong logons, /* Total Logons on System */ - ltoday, /* Total Logons Today */ - timeon, /* Total Time on System */ - ttoday, /* Total Time Today */ - uls, /* Total Uploads Today */ - ulb, /* Total Upload Bytes Today */ - dls, /* Total Downloads Today */ - dlb, /* Total Download Bytes Today */ - ptoday, /* Total Posts Today */ - etoday, /* Total Emails Today */ - ftoday; /* Total Feedbacks Today */ - ushort nusers; /* Total New Users Today */ - } stats_t; - -typedef struct { /* FidoNet address */ - ushort zone, /* Zone */ - net, /* Network */ - node, /* Node */ - point; /* Point */ - } faddr_t; - -typedef struct { /* Message sub board info */ - uchar -#ifdef SCFG - lname[LEN_SLNAME+1], /* Short name - used for prompts */ - sname[LEN_SSNAME+1], /* Long name - used for listing */ - ar[LEN_ARSTR+1], /* Access requirements */ - read_ar[LEN_ARSTR+1], /* Read requirements */ - post_ar[LEN_ARSTR+1], /* Post requirements */ - op_ar[LEN_ARSTR+1], /* Operator requirements */ - mod_ar[LEN_ARSTR+1], /* Moderated user requirements */ - qwkname[11], /* QWK name - only 10 chars */ - data_dir[LEN_DIR+1], /* Data file directory */ - origline[51], /* Optional EchoMail origin line */ - echomail_sem[LEN_DIR+1], /* EchoMail semaphore for this sub */ - tagline[81], /* Optional QWK net tag line */ -#else - *lname, - *sname, - *ar, - *read_ar, - *post_ar, - *op_ar, - *mod_ar, - *qwkname, - *data_dir, - *origline, - *echomail_sem, - *tagline, -#endif - code[9]; /* Eight character code */ -#ifndef SBBS - uchar echopath[LEN_DIR+1]; /* EchoMail path */ -#endif - ushort grp, /* Which group this sub belongs to */ - ptridx, /* Index into pointer file */ - qwkconf, /* QWK conference number */ - maxage; /* Max age of messages (in days) */ - ulong misc, /* Miscellaneous flags */ - maxmsgs, /* Max number of messages allowed */ - maxcrcs; /* Max number of CRCs to keep */ -#ifdef SBBS - ulong ptr, /* Highest read message */ - last; /* Last read message */ -#endif - faddr_t faddr; /* FidoNet address */ - } sub_t; - -typedef struct { /* Message group info */ - uchar -#ifdef SCFG - lname[LEN_GLNAME+1], /* Short name */ - sname[LEN_GSNAME+1], /* Long name */ - ar[LEN_ARSTR+1]; /* Access requirements */ - -#else - *lname, - *sname, - *ar; -#endif - } grp_t; - -typedef struct { /* Transfer Directory Info */ - uchar /* Eight character code */ -#ifdef SCFG - lname[LEN_SLNAME+1], /* Short name - used for prompts */ - sname[LEN_SSNAME+1], /* Long name - used for listing */ - ar[LEN_ARSTR+1], /* Access Requirements */ - ul_ar[LEN_ARSTR+1], /* Upload Requirements */ - dl_ar[LEN_ARSTR+1], /* Download Requirements */ - ex_ar[LEN_ARSTR+1], /* Exemption Requirements (credits) */ - op_ar[LEN_ARSTR+1], /* Operator Requirements */ - path[LEN_DIR+1], /* Path to directory for files */ - exts[41], /* Extensions allowed */ - upload_sem[LEN_DIR+1], /* Upload semaphore file */ - data_dir[LEN_DIR+1], /* Directory where data is stored */ -#else - *lname, - *sname, - *ar, - *ul_ar, - *dl_ar, - *ex_ar, - *op_ar, - *path, - *exts, - *upload_sem, - *data_dir, -#endif - code[9], - seqdev, /* Sequential access device number */ - sort; /* Sort type */ - ushort maxfiles, /* Max number of files allowed */ - maxage, /* Max age of files (in days) */ - up_pct, /* Percentage of credits on uloads */ - dn_pct, /* Percentage of credits on dloads */ - lib; /* Which library this dir is in */ - ulong misc; /* Miscellaneous bits */ - } dir_t; - -typedef struct { /* Transfer Library Information */ - uchar -#ifdef SCFG - lname[LEN_GLNAME+1], /* Short Name - used for prompts */ - sname[LEN_GSNAME+1], /* Long Name - used for listings */ - ar[LEN_ARSTR+1]; /* Access Requirements */ -#else - *lname, - *sname, - *ar; -#endif - ushort offline_dir; /* Offline file directory */ - } lib_t; - -typedef struct { /* Gfile Section Information */ - uchar /* Eight character code */ -#ifdef SCFG - name[41], /* Name of section */ - ar[LEN_ARSTR+1], /* Access requirements */ -#else - *name, - *ar, -#endif - code[9]; - } txtsec_t; - -typedef struct { /* External Section Information */ - uchar -#ifdef SCFG - name[41], /* Name of section */ - ar[LEN_ARSTR+1], /* Access requirements */ -#else - *name, - *ar, -#endif - code[9]; /* Eight character code */ - } xtrnsec_t; - -typedef struct { /* Swappable executable */ -#ifdef SCFG - uchar cmd[LEN_CMD+1]; /* Program name */ -#else - uchar *cmd; -#endif - } swap_t; - -typedef struct { /* OS/2 executable */ -#ifdef SCFG - uchar name[13]; /* Program name */ -#else - uchar *name; -#endif - ulong misc; /* See OS2PGM_* */ - - } os2pgm_t; - -typedef struct { /* External Program Information */ - uchar -#ifdef SCFG - name[41], /* Name of External */ - ar[LEN_ARSTR+1], /* Access Requirements */ - run_ar[LEN_ARSTR+1], /* Run Requirements */ - cmd[LEN_CMD+1], /* Command line */ - clean[LEN_CMD+1], /* Clean-up command line */ - path[LEN_DIR+1], /* Start-up path */ -#else - *name, - *ar, - *run_ar, - *cmd, - *clean, - *path, -#endif - type, /* What type of external program */ - event, /* Execute upon what event */ - textra, /* Extra time while in this program */ - maxtime, /* Maximum time allowed in this door */ - code[9]; /* Internal code for program */ - ushort sec; /* Section this program belongs to */ - ulong cost, /* Cost to run in credits */ - misc; /* Misc. bits - ANSI, DOS I/O etc. */ - } xtrn_t; - -typedef struct { /* External Page program info */ -#ifdef SCFG - uchar cmd[LEN_CMD+1], /* Command line */ - ar[LEN_ARSTR+1]; /* ARS for this chat page */ -#else - uchar *cmd, - *ar; -#endif - ulong misc; /* Intercept I/O */ - } page_t; - - -typedef struct { /* Chat action set */ -#ifdef SCFG - uchar name[26]; /* Name of set */ -#else - uchar *name; -#endif - } actset_t; - -typedef struct { /* Chat action info */ -#ifdef SCFG - uchar cmd[LEN_CHATACTCMD+1], /* Command word */ - out[LEN_CHATACTOUT+1]; /* Output */ -#else - uchar *cmd, - *out; -#endif - ushort actset; /* Set this action belongs to */ - } chatact_t; - -typedef struct { /* Gurus */ - uchar -#ifdef SCFG - name[26], - ar[LEN_ARSTR+1], -#else - *name, - *ar, -#endif - code[9]; - - } guru_t; - -typedef struct { /* Chat Channel Information */ - uchar -#ifdef SCFG - ar[LEN_ARSTR+1], /* Access requirements */ - name[26], /* Channel description */ -#else - *ar, - *name, -#endif - code[9]; - ushort actset, /* Set of actions used in this chan */ - guru; /* Guru file number */ - ulong cost, /* Cost to join */ - misc; /* Misc. bits CHAN_* definitions */ - } chan_t; - -typedef struct { /* Modem Result codes info */ - ushort code, /* Numeric Result Code */ - cps, /* Average Transfer CPS */ - rate; /* DCE Rate (Modem to Modem) */ -#ifdef SCFG - uchar str[LEN_MODEM+1]; /* String to use for description */ -#else - uchar *str; -#endif - } mdm_result_t; - -typedef struct { /* Transfer Protocol information */ - uchar mnemonic, /* Letter to select this protocol */ -#ifdef SCFG - name[26], /* Name of protocol */ - ar[LEN_ARSTR+1], /* ARS */ - ulcmd[LEN_CMD+1], /* Upload command line */ - dlcmd[LEN_CMD+1], /* Download command line */ - batulcmd[LEN_CMD+1], /* Batch upload command line */ - batdlcmd[LEN_CMD+1], /* Batch download command line */ - blindcmd[LEN_CMD+1], /* Blind upload command line */ - bicmd[LEN_CMD+1]; /* Bidirectional command line */ -#else - *ar, - *name, - *ulcmd, - *dlcmd, - *batulcmd, - *batdlcmd, - *blindcmd, - *bicmd; -#endif - ulong misc; /* Miscellaneous bits */ - } prot_t; - -typedef struct { /* Extractable file types */ - uchar ext[4], /* Extension */ -#ifdef SCFG - ar[LEN_ARSTR+1], /* Access Requirements */ - cmd[LEN_CMD+1]; /* Command line */ -#else - *ar, - *cmd; -#endif - } fextr_t; - -typedef struct { /* Compressable file types */ - uchar ext[4], /* Extension */ -#ifdef SCFG - ar[LEN_ARSTR+1], /* Access Requirements */ - cmd[LEN_CMD+1]; /* Command line */ -#else - *ar, - *cmd; -#endif - } fcomp_t; - -typedef struct { /* Viewable file types */ - uchar ext[4], /* Extension */ -#ifdef SCFG - ar[LEN_ARSTR+1], /* Access Requirements */ - cmd[LEN_CMD+1]; /* Command line */ -#else - *ar, - *cmd; -#endif - } fview_t; - -typedef struct { /* Testable file types */ - uchar ext[4], /* Extension */ -#ifdef SCFG - ar[LEN_ARSTR+1], /* Access requirement */ - cmd[LEN_CMD+1], /* Command line */ - workstr[41]; /* String to display while working */ -#else - *ar, - *cmd, - *workstr; -#endif - } ftest_t; - -typedef struct { /* Download events */ - uchar ext[4], -#ifdef SCFG - ar[LEN_ARSTR+1], /* Access requirement */ - cmd[LEN_CMD+1], /* Command line */ - workstr[41]; /* String to display while working */ -#else - *ar, - *cmd, - *workstr; -#endif - } dlevent_t; - -typedef struct { /* External Editors */ - uchar -#ifdef SCFG - name[41], /* Name (description) */ - ar[LEN_ARSTR+1], /* Access Requirement */ - lcmd[LEN_CMD+1], /* Local command line */ - rcmd[LEN_CMD+1], /* Remote command line */ -#else - *name, - *ar, - *lcmd, - *rcmd, -#endif - code[9]; - ulong misc; /* Misc. bits */ - uchar type; /* Drop file type */ - } xedit_t; - - -typedef struct { /* Generic Timed Event */ - uchar code[9], /* Internal code */ - days, /* Days to run event */ -#ifdef SCFG - dir[LEN_DIR+1], /* Start-up directory */ - cmd[LEN_CMD+1]; /* Command line */ -#else - *dir, - *cmd; -#endif - ushort node, /* Node to execute event */ - time; /* Time to run event */ - ulong misc; /* Misc bits */ -#ifndef SCFG - time_t last; /* Last time event ran */ -#endif - } event_t; - -typedef struct { /* QWK Network Hub */ - uchar id[9], /* System ID of Hub */ - *mode, /* Mode for Ctrl-A codes for ea. sub */ - days, /* Days to call-out on */ -#ifdef SCFG - call[LEN_CMD+1], /* Call-out command line to execute */ - pack[LEN_CMD+1], /* Packing command line */ - unpack[LEN_CMD+1]; /* Unpacking command line */ -#else - *call, - *pack, - *unpack; -#endif - ushort time, /* Time to call-out */ - node, /* Node to do the call-out */ - freq, /* Frequency of call-outs */ - subs, /* Number Sub-boards carried */ - *sub, /* Number of local sub-board for ea. */ - *conf; /* Conference number of ea. */ -#ifndef SCFG - time_t last; /* Last network attempt */ -#endif - } qhub_t; - -typedef struct { /* PCRelay/PostLink Hub */ - uchar days, /* Days to call-out on */ -#ifdef SCFG - name[11], /* Site Name of Hub */ - call[LEN_CMD+1]; /* Call-out command line to execute */ -#else - *call; -#endif - ushort time, /* Time to call-out */ - node, /* Node to do the call-out */ - freq; /* Frequency of call-outs */ -#ifndef SCFG - time_t last; /* Last network attempt */ -#endif - } phub_t; - - -typedef struct { /* FidoNet msg header */ - uchar from[36], /* From user */ - to[36], /* To user */ - subj[72], /* Message title */ - time[20]; /* Time in goof-ball ASCII format */ - short read, /* Times read */ - destnode, /* Destination node */ - orignode, /* Origin node */ - cost, /* Cost in pennies */ - orignet, /* Origin net */ - destnet, /* Destination net */ - destzone, /* Destination zone */ - origzone, /* Origin zone */ - destpoint, /* Destination point */ - origpoint, /* Origin point */ - re, /* Message number regarding */ - attr, /* Attributes - see FIDO_* */ - next; /* Next message number in stream */ - } fmsghdr_t; - - -typedef struct { /* Command Shells */ - uchar -#ifdef SCFG - name[41], /* Name (description) */ - ar[LEN_ARSTR+1], /* Access Requirement */ -#else - *name, - *ar, -#endif - code[9]; - ulong misc; - } shell_t; - -#endif /* Don't add anything after this #endif statement */ diff --git a/src/sbbs2/scb/makefile b/src/sbbs2/scb/makefile deleted file mode 100644 index 5e3dea3f81..0000000000 --- a/src/sbbs2/scb/makefile +++ /dev/null @@ -1,37 +0,0 @@ - -# Macros -CC = bcc -LD = tlink -SDK = ..\sdk -MSWAIT = ..\..\mswait\dos -INCLUDE = \bc31\include;$(SDK);.. -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -w-pro -LDFLAGS = /n /c -OBJS = xsdk.obj xsdkvars.obj $(MSWAIT)\mswait$(MODEL).obj ..\dos\rciol.obj -HEADERS = $(SDK)\xsdk.h $(SDK)\xsdkdefs.h $(SDK)\xsdkvars.c scb.h - -# Implicit C Compile Rule -.c.obj: - @echo Compiling $*.c to $*.obj ... - $(CC) $(CFLAGS) -c $*.c - -# Main EXE Link Rule -scb.exe: $(OBJS) scb.obj - @echo Linking $< ... - $(LD) $(LDFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) scb.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - - -# All .obj modules -scb.obj: $(HEADERS) - -xsdk.obj: $(SDK)\xsdk.c $(HEADERS) - @echo Compiling $(SDK)\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c $(SDK)\$*.c - -xsdkvars.obj: $(SDK)\xsdkvars.c $(SDK)\xsdkdefs.h - @echo Compiling $(SDK)\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c $(SDK)\$*.c diff --git a/src/sbbs2/scb/scb.c b/src/sbbs2/scb/scb.c deleted file mode 100644 index 661528cf1c..0000000000 --- a/src/sbbs2/scb/scb.c +++ /dev/null @@ -1,920 +0,0 @@ -/* SCB */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "xsdk.h" -#include "scb.h" - -/* RCIOLL.ASM */ - -int rioini(int com,int irq); /* initialize com,irq */ -int setbaud(int rate); /* set baud rate */ -int rioctl(int action); /* remote i/o control */ -int dtr(char onoff); /* set/reset dtr */ -int outcom(int ch); /* send character */ -int incom(void); /* receive character */ -int ivhctl(int intcode); /* local i/o redirection */ - -/************************/ -/* Remote I/O Constants */ -/************************/ - - /* i/o mode and state flags */ -#define CTSCK 0x1000 /* check cts (mode only) */ -#define RTSCK 0x2000 /* check rts (mode only) */ -#define TXBOF 0x0800 /* transmit buffer overflow (outcom only) */ -#define ABORT 0x0400 /* check for ^C (mode), aborting (state) */ -#define PAUSE 0x0200 /* check for ^S (mode), pausing (state) */ -#define NOINP 0x0100 /* input buffer empty (incom only) */ - - /* status flags */ -#define RIODCD 0x80 /* DCD on */ -#define RI 0x40 /* Ring indicate */ -#define DSR 0x20 /* Dataset ready */ -#define CTS 0x10 /* CTS on */ -#define FERR 0x08 /* Frameing error */ -#define PERR 0x04 /* Parity error */ -#define OVRR 0x02 /* Overrun */ -#define RXLOST 0x01 /* Receive buffer overflow */ - -/* rioctl() arguments */ -/* returns mode or state flags in high 8 bits, status flags in low 8 bits */ - - /* the following return mode in high 8 bits */ -#define IOMODE 0 /* no operation */ -#define IOSM 1 /* i/o set mode flags */ -#define IOCM 2 /* i/o clear mode flags */ - /* the following return state in high 8 bits */ -#define IOSTATE 4 /* no operation */ -#define IOSS 5 /* i/o set state flags */ -#define IOCS 6 /* i/o clear state flags */ -#define IOFB 0x308 /* i/o buffer flush */ -#define IOFI 0x208 /* input buffer flush */ -#define IOFO 0x108 /* output buffer flush */ -#define IOCE 9 /* i/o clear error flags */ - - /* return count (16bit) */ -#define RXBC 0x0a /* get receive buffer count */ -#define TXBC 0x0b /* get transmit buffer count */ -#define TXSYNC 0x0c /* sync transmition (seconds<<8|0x0c) */ -#define IDLE 0x0d /* suspend communication routines */ -#define RESUME 0x10d /* return from suspended state */ -#define RLERC 0x000e /* read line error count and clear */ -#define CPTON 0x0110 /* set input translation flag for ctrl-p on */ -#define CPTOFF 0x0010 /* set input translation flag for ctrl-p off */ -#define GETCPT 0x8010 /* return the status of ctrl-p translation */ -#define MSR 0x0011 /* read modem status register */ -#define FIFOCTL 0x0012 /* FIFO UART control */ -#define TSTYPE 0x0013 /* Time-slice API type */ -#define GETTST 0x8013 /* Get Time-slice API type */ - - -#define I14DB 0x001d /* DigiBoard int 14h driver */ -#define I14PC 0x011d /* PC int 14h driver */ -#define I14PS 0x021d /* PS/2 int 14h driver */ -#define I14FO 0x031d /* FOSSIL int 14h driver */ - - - /* ivhctl() arguments */ -#define INT29R 1 /* copy int 29h output to remote */ -#define INT29L 2 /* Use _putlc for int 29h */ -#define INT16 0x10 /* return remote chars to int 16h calls */ -#define INTCLR 0 /* release int 16h, int 29h */ - -#define LEN_ALIAS 25 /* User alias */ -#define LEN_NAME 25 /* User name */ -#define LEN_HANDLE 8 /* User chat handle */ -#define LEN_NOTE 30 /* User note */ -#define LEN_COMP 30 /* User computer description */ -#define LEN_COMMENT 60 /* User comment */ -#define LEN_NETMAIL 60 /* NetMail forwarding address */ -#define LEN_PASS 8 /* User password */ -#define LEN_PHONE 12 /* User phone number */ -#define LEN_BIRTH 8 /* Birthday in MM/DD/YY format */ -#define LEN_ADDRESS 30 /* User address */ -#define LEN_LOCATION 30 /* Location (City, State) */ -#define LEN_ZIPCODE 10 /* Zip/Postal code */ -#define LEN_MODEM 8 /* User modem type description */ -#define LEN_FDESC 58 /* File description */ -#define LEN_TITLE 70 /* Message title */ -#define LEN_MAIN_CMD 40 /* Storage in user.dat for custom commands */ -#define LEN_XFER_CMD 40 -#define LEN_SCAN_CMD 40 -#define LEN_MAIL_CMD 40 -#define LEN_CID 25 /* Caller ID (phone number) */ -#define LEN_ARSTR 40 /* Max length of Access Requirement string */ - -/****************************************************************************/ -/* This is a list of offsets into the USER.DAT file for different variables */ -/* that are stored (for each user) */ -/****************************************************************************/ -#define U_ALIAS 0 /* Offset to alias */ -#define U_NAME (U_ALIAS+LEN_ALIAS) /* Offset to name */ -#define U_HANDLE (U_NAME+LEN_NAME) -#define U_NOTE (U_HANDLE+LEN_HANDLE+2) -#define U_COMP (U_NOTE+LEN_NOTE) -#define U_COMMENT (U_COMP+LEN_COMP+2) - -#define U_NETMAIL (U_COMMENT+LEN_COMMENT+2) - -#define U_ADDRESS (U_NETMAIL+LEN_NETMAIL+2) -#define U_LOCATION (U_ADDRESS+LEN_ADDRESS) -#define U_ZIPCODE (U_LOCATION+LEN_LOCATION) - -#define U_PASS (U_ZIPCODE+LEN_ZIPCODE+2) -#define U_PHONE (U_PASS+8) /* Offset to phone-number */ -#define U_BIRTH (U_PHONE+12) /* Offset to users birthday */ -#define U_MODEM (U_BIRTH+8) -#define U_LASTON (U_MODEM+8) -#define U_FIRSTON (U_LASTON+8) -#define U_EXPIRE (U_FIRSTON+8) -#define U_PWMOD (U_EXPIRE+8) - -#define U_LOGONS (U_PWMOD+8+2) -#define U_LTODAY (U_LOGONS+5) -#define U_TIMEON (U_LTODAY+5) -#define U_TEXTRA (U_TIMEON+5) -#define U_TTODAY (U_TEXTRA+5) -#define U_TLAST (U_TTODAY+5) -#define U_POSTS (U_TLAST+5) -#define U_EMAILS (U_POSTS+5) -#define U_FBACKS (U_EMAILS+5) -#define U_ETODAY (U_FBACKS+5) -#define U_PTODAY (U_ETODAY+5) - -#define U_ULB (U_PTODAY+5+2) -#define U_ULS (U_ULB+10) -#define U_DLB (U_ULS+5) -#define U_DLS (U_DLB+10) -#define U_CDT (U_DLS+5) -#define U_MIN (U_CDT+10) - -#define U_LEVEL (U_MIN+10+2) /* Offset to Security Level */ -#define U_FLAGS1 (U_LEVEL+2) /* Offset to Flags */ -#define U_TL (U_FLAGS1+8) /* Offset to unused field */ -#define U_FLAGS2 (U_TL+2) /* Offset to unused field */ -#define U_EXEMPT (U_FLAGS2+8) -#define U_REST (U_EXEMPT+8) -#define U_ROWS (U_REST+8+2) /* Number of Rows on user's monitor */ -#define U_SEX (U_ROWS+2) /* Sex, Del, ANSI, color etc. */ -#define U_MISC (U_SEX+1) /* Miscellaneous flags in 8byte hex */ -#define U_XEDIT (U_MISC+8) /* External editor */ -#define U_LEECH (U_XEDIT+2) /* two hex digits - leech attempt count */ -#define U_CURGRP (U_LEECH+2) /* Current group */ -#define U_CURSUB (U_CURGRP+4) /* Current sub-board */ -#define U_CURLIB (U_CURSUB+4) /* Current library */ -#define U_CURDIR (U_CURLIB+4) /* Current directory */ -#define U_CMDSET (U_CURDIR+4) /* User's command set */ -#define U_MAIN_CMD (U_CMDSET+2+2) /* Custom main command set */ -#define U_XFER_CMD (U_MAIN_CMD+LEN_MAIN_CMD) -#define U_SCAN_CMD (U_XFER_CMD+LEN_XFER_CMD+2) -#define U_MAIL_CMD (U_SCAN_CMD+LEN_SCAN_CMD) -#define U_FREECDT (U_MAIL_CMD+LEN_MAIL_CMD+2) /* Unused bytes */ -#define U_FLAGS3 (U_FREECDT+10) /* Unused bytes */ -#define U_FLAGS4 (U_FLAGS3+8) -#define U_UNUSED1 (U_FLAGS4+8) -#define U_UNUSED2 (U_UNUSED1+22+2) -#define U_LEN (U_UNUSED2+48+2) - -enum { - PHONE_OKAY - ,PHONE_INVALID - ,PHONE_LD - }; - -unsigned _stklen=16000; /* Set stack size in code, not header */ - -uint asmrev,options=0; -char canfile[256],result[256]={NULL},tmp[256], - addfile[256],phone_number[81]={NULL},flags1[81],flags2[81],flags3[81], - flags4[81],exempt[81],restrict[81],expiration[81],credits[81],minutes[81], - level[81],bbs_ac[81]; -char *crlf="\r\n"; -extern uint riobp; -extern int mswtyp; -char io_int=0,validated=0; /* i/o interrupts intercepted? yes/no */ -int sysop=0; -int ldstart[7],ldend[7],min_phone_len,max_phone_len,hangup_time; - -/***********************/ -/* Function Prototypes */ -/***********************/ -int lprintf(char *fmat, ...); -void bail(); -int main(); -void phone_val(); -char *get_user_pw(); -char check_phone(char *insearch); -void mdmcmd(char *str); -void putcomch(char ch); -char getmdmstr(char *str, int sec); -void mswait(int); -void moduser(); -void write_info(); -char long_distance(char *number); - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) { - char sbuf[256]; - int chcount; - -chcount=vsprintf(sbuf,fmat,_va_ptr); -lputs(sbuf); -return(chcount); -} - -void bail() -{ - char str[256]; - int i; - -if(io_int) - ivhctl(0); -else if(!(options&STAY_CONNECTED)) { /* exiting without re-connecting */ - dtr(10); - sprintf(str,"%sHANGUP.NOW",node_dir); - if((i=nopen(str,O_CREAT|O_RDWR))!=-1) - close(i); } -if(com_port) { - for(i=0;i<5;i++) - if(!rioctl(TXBC)) /* wait for rest of output */ - break; - else - mswait(1000); - rioini(0,0); } -if(options&ALWAYS_VALIDATE || validated) - moduser(); -write_info(); -lputc(FF); -} - -int main() -{ - void *v; - uchar far *s; - char str[128],ch,*p; - int i,file; - uint base=0xffff; - FILE *stream; - -node_dir[0]=0; - -p=getenv("SBBSNODE"); -if(p) - strcpy(node_dir,p); - -if(!node_dir[0]) { /* node directory not specified */ - printf("\n\7SBBSNODE environment variable must be set.\n"); - printf("\nExample: SET SBBSNODE=C:\\SBBS\\NODE1\n"); - getch(); - return(1); } - -if(node_dir[strlen(node_dir)-1]!='\\') /* make sure node_dir ends in '\' */ - strcat(node_dir,"\\"); - -initdata(); /* read XTRN.DAT and more */ - -if((asmrev=*(&riobp-1))!=23) { - printf("Wrong rciol.obj\n"); - exit(1); } - -lclini(0xd<<8); /* Tab expansion, no CRLF expansion */ - -if(com_port) { - lprintf("\r\nInitializing COM port %u: ",com_port); - switch(com_base) { - case 0xb: - lputs("PC BIOS"); - rioctl(I14PC); - break; - case 0xffff: - case 0xd: - lputs("DigiBoard"); - rioctl(I14DB); - break; - case 0xe: - lputs("PS/2 BIOS"); - rioctl(I14PS); - break; - case 0xf: - lputs("FOSSIL"); - rioctl(I14FO); - break; - case 0: - base=com_port; - lputs("UART I/O (BIOS), "); - if(com_irq) - lprintf("IRQ %d",com_irq); - else lputs("default IRQ"); - break; - default: - base=com_base; - lprintf("UART I/O %Xh, ",com_base); - if(com_irq) - lprintf("IRQ %d",com_irq); - else lputs("default IRQ"); - break; } - - if(base==0xffff) - lprintf(" channel %u",com_irq); - i=rioini(base,com_irq); - if(i) { - lprintf(" - Failed! (%d)\r\n",i); - exit(1); } - if(mdm_misc&MDM_FLOWCTRL) - rioctl(IOSM|CTSCK|RTSCK); /* set rts/cts chk */ - setbaud((uint)(com_rate&0xffffL)); - msr=&riobp-1; } - -rioctl(TSTYPE|mswtyp); /* set time-slice API type */ - -rioctl(CPTON); /* ctrl-p translation */ - -i=INT29L; -if(com_port) - i|=(INT29R|INT16); -ivhctl(i); -io_int=1; - -atexit(bail); - -phone_val(); - -return(0); -} - -/****************************************************************************** - Main phone validation loop. -******************************************************************************/ -void phone_val() -{ - FILE *stream; - char user_password[9],str[256],init_attempts=0,callout_attempts=0,*p; - int i=0,j,file; - - if((file=nopen("SCB.CFG",O_RDONLY))==-1) { - bprintf("ERROR: Opening configuration file\r\n"); exit(1); } - if((stream=fdopen(file,"rb"))==NULL) { - bprintf("ERROR: Converting configuration file to a stream\r\n"); - exit(1); } - fgets(str,81,stream); truncsp(str); callout_attempts=atoi(str); - fgets(str,81,stream); truncsp(str); - if(str[0]=='Y') options|=ALWAYS_VALIDATE; - if(str[1]=='Y') options|=MODIFY_USER_NOTE; - if(str[2]=='Y') options|=START_WITH_0; - if(str[3]=='Y') options|=START_WITH_1; - if(str[4]=='Y') options|=STAY_CONNECTED; - if(str[5]=='Y') options|=SC_LOCAL_ONLY; - if(str[6]=='Y') options|=US_PHONE_FORMAT; - if(str[7]=='Y') options|=ALLOWED_ONLY; - if(str[8]!='N') options|=SAME_AREA_LD; - fgets(canfile,81,stream); truncsp(canfile); - fgets(addfile,81,stream); truncsp(addfile); - fgets(credits,81,stream); truncsp(credits); - fgets(str,81,stream); truncsp(str); sysop=atoi(str); - fgets(level,81,stream); truncsp(level); - fgets(flags1,81,stream); truncsp(flags1); - fgets(flags2,81,stream); truncsp(flags2); - fgets(exempt,81,stream); truncsp(exempt); - fgets(restrict,81,stream); truncsp(restrict); - fgets(expiration,81,stream); truncsp(expiration); - fgets(minutes,81,stream); truncsp(minutes); - fgets(flags3,81,stream); truncsp(flags3); - fgets(flags4,81,stream); truncsp(flags4); - for(i=0;i<7;i++) { - fgets(str,81,stream); ldstart[i]=atoi(str); /* min since midnight */ - fgets(str,81,stream); ldend[i]=atoi(str); } - fgets(str,81,stream); min_phone_len=atoi(str); - fgets(str,81,stream); max_phone_len=atoi(str); - fgets(bbs_ac,81,stream); truncsp(bbs_ac); - if(fgets(str,81,stream)) { - hangup_time=atoi(str); - if(hangup_time>90) - hangup_time=90; } - else - hangup_time=30; - - fgets(str,81,stream); // regnum - - fclose(stream); - - cls(); - strcpy(result,"Hung up"); - strcpy(user_password,get_user_pw()); - bprintf("\1c\1hSynchronet Callback v%s " - "Developed 1995-1997 Rob Swindell\r\n",VERSION); - sprintf(str,"%s..\\EXEC\\",ctrl_dir); - printfile("SCB.MSG"); - if(yesno("\r\nDo you need instructions")) - printfile("INSTRUCT.MSG"); - if(!yesno("\r\nContinue with verification")) { - options&=~ALWAYS_VALIDATE; - cls(); printfile("REFUSED.MSG"); pause(); - strcpy(result,"Refused"); - return; } -/*** - if(!(options&ALLOW_LD) && yesno("Are you calling long distance")) { - bprintf("\r\n\1n\1cSorry, \1h%s \1n\1cwill verify \1y\1hLOCAL " - "\1n\1ccalls only!\r\n",sys_name); - strcpy(result,"Long Dist"); pause(); - return; } -***/ - - while(1) { - while(1) { - bprintf("\r\n\r\n\1n\1cEnter your \1h\1yCOMPLETE \1n\1cphone " - "number now. If you are calling long distance, enter\r\n\1h\1y" - "ALL \1n\1cof the digits necessary to reach your phone number. " - "If you are a \1h\1yLOCAL \1n\1ccall from the BBS, \1h\1yDO NOT" - "\1n\1c enter unnecessary digits (your area code, for example)." - "\r\n:"); - getstr(phone_number,20,K_LINE|K_NUMBER); - if(yesno("\r\nIs this correct")) break; } - - if(bbs_ac[0]) { /* Strip off area code */ - if(!strncmp(phone_number,bbs_ac,strlen(bbs_ac))) - strcpy(phone_number,phone_number+strlen(bbs_ac)); - else { - sprintf(tmp,"1%s",bbs_ac); - if(!strncmp(phone_number,tmp,strlen(tmp))) - strcpy(phone_number,phone_number+strlen(tmp)); } } - - if(options&US_PHONE_FORMAT && /* Add 1 to number */ - (phone_number[1]=='0' || phone_number[1]=='1') && - strlen(phone_number)>7) { - sprintf(tmp,"1%s",phone_number); - strcpy(phone_number,tmp); } - - j=check_phone(phone_number); - - if(j==PHONE_LD) { - strcpy(result,"Long Dist"); - pause(); - return; } - if(j==PHONE_OKAY) - break; - options&=~ALWAYS_VALIDATE; - strcpy(result,"Invalid #"); - bprintf("\r\n\1n\1cReturning you to \1h%s.\1n\r\n",sys_name); - return; } - - bprintf("\r\n\r\n\1n\1cDropping Carrier, \1h%s \1n\1cwill call you back " - "now.\r\nType \1h\1yATA \1n\1cto answer when your modem rings!\r\n\r\n" - ,sys_name); - if(!com_port) exit(0); - mswait(1000); - ivhctl(0); /* put intercepted i/o vectors back */ - io_int=0; - - for(init_attempts=0;init_attempts<4;init_attempts++) { /* 4 attempts */ - dtr(5); - if(!init_attempts) mswait(1000); - dtr(1); - rioctl(IOFB); - for(i=0;i<4;i++) { - mdmcmd(mdm_init); - if(!getmdmstr(str,10)) - continue; - if(!stricmp(str,mdm_init)) { /* Echo on? */ - getmdmstr(str,10); /* Get OK */ - mdmcmd("ATE0"); /* Turn echo off */ - if(!getmdmstr(str,10)) - continue; } - if(!strcmp(str,"OK")) { /* Verbal response? */ - mdmcmd("ATV0"); /* Turn verbal off */ - if(!getmdmstr(str,10)) - continue; } - if(!strcmp(str,"0")) - break; - rioctl(IOFB); /* Send fool-proof init string */ - mdmcmd("ATE0V0"); - if(getmdmstr(str,10) && !strcmp(str,"0")) - break; } - if(i==4) - continue; - mswait(100); - if(mdm_spec[0]) { - for(i=0;i<4;i++) { - mdmcmd(mdm_spec); - if(!getmdmstr(str,10)) continue; - if(!strcmp(str,"0")) break; } - if(i==4) - continue; } - break; } - - if(init_attempts==4) { /* couldn't init */ - strcpy(result,"No Init"); - exit(1); } - - mswait(1000); - mdmcmd("ATH"); - str[0]=0; - getmdmstr(str,10); - if(strcmp(str,"0")) { - strcpy(result,"No Init"); - exit(1); } - if(hangup_time) - bprintf("\r\n\1n\1cWaiting \1h%u\1n\1c seconds before dialing..." - "\r\n\r\n",hangup_time); - mswait(hangup_time*1000); /* Wait xx seconds before dialing */ - - for(i=0;i<callout_attempts;i++) { - mswait(5000); - rioctl(IOFB); - sprintf(str,"%s%s",mdm_dial,phone_number); - mdmcmd(str); - if(!getmdmstr(str,60)) { - mdmcmd(""); /* send CR to abort dial */ - continue; } - if(strcmp(str,"0") && strcmp(str,"2") && strcmp(str,"3") - && strcmp(str,"4") && strcmp(str,"6") && strcmp(str,"7") - && strcmp(str,"8") && strcmp(str,"9")) - break; } - - if(i==callout_attempts) { /* Couldn't connect */ - strcpy(result,"No Connect"); - exit(1); } - - i=INT29L; /* intercept i/o vectors again */ - if(com_port) - i|=(INT29R|INT16); - ivhctl(i); - io_int=1; - - if(rioctl(IOSTATE|DCD)) { - mswait(5000); /* wait 5 seconds for MNP to Non-MNP connect */ - rioctl(IOFB); - lncntr=0; - i=0; cls(); - bprintf("\r\n\r\n\1n\1cThis is \1h%s \1n\1ccalling for \1m%s.", - sys_name,user_name); - while(1) { - bprintf("\r\n\r\n\1h\1yEnter your password for verification: "); - getstr(str,8,K_UPPER|K_LINE); - if(!stricmp(str,user_password)) { - validated=1; - bprintf("\r\n\r\n\1n\1cYou have now been verified on \1h%s!", - sys_name); - printfile("VERIFIED.MSG"); - strcpy(result,"Verified"); - break; } - else { - bprintf("\r\n\1r\1hINCORRECT!\1n"); - if(++i>=4) { - bprintf("\r\n\r\n\1r\1hYou have entered an incorrect " - "password. Goodbye.\r\n\r\n"); dtr(5); - strcpy(result,"Bad Pass"); return; } } } - - if(!(options&STAY_CONNECTED)) { - mswait(2000); - for(i=0;i<5;i++) { - dtr(5); - if(!(rioctl(IOSTATE)&DCD)) /* no carrier detect */ - break; - lprintf("SCB: Dropping DTR failed to lower DCD.\r\n"); - dtr(1); - mswait(2000); } - sprintf(str,"%sHANGUP.NOW",node_dir); - if((i=nopen(str,O_CREAT|O_RDWR))!=-1) - close(i); } } -} - -/****************************************************************************** - Writes the MODUSER.DAT file. -******************************************************************************/ -void moduser() -{ - FILE *stream; - char str[512]; - int file; - long expire; - time_t now; - - now=time(NULL); - - if(user_expire>now) - expire=(user_expire+(atol(expiration)*24L*60L*60L)); - else - expire=(now+(atol(expiration)*24L*60L*60L)); - - sprintf(str,"%sMODUSER.DAT",node_dir); - if((stream=fopen(str,"wb"))!=NULL) { - fprintf(stream,"%s\r\n",credits); - fprintf(stream,"%s\r\n",level); - fprintf(stream,"\r\n"); - fprintf(stream,"%s\r\n",flags1); - fprintf(stream,"%s\r\n",flags2); - fprintf(stream,"%s\r\n",exempt); - fprintf(stream,"%s\r\n",restrict); - fprintf(stream,"%s\r\n",atol(expiration) ? ultoa(expire,str,16) : ""); - fprintf(stream,"%s\r\n",minutes); - fprintf(stream,"%s\r\n",flags3); - fprintf(stream,"%s\r\n",flags4); - fclose(stream); - } - else - bprintf("\7\r\nError opening %s for write.\r\n",str); - if(addfile[0] && phone_number[0]) { - if((file=nopen(addfile,O_WRONLY|O_APPEND|O_CREAT))!=-1) { - sprintf(str,"%s^\r\n",phone_number); - write(file,str,strlen(str)); - close(file); } - else - bprintf("\7\r\nError opening %s for write.\r\n",addfile); } - if(sysop) { - sprintf(str,"\1c\1hSCB: \1y%s \1n\1cwas validated \1h%.24s\1n\r\n" - ,user_name,ctime(&now)); - putsmsg(sysop,str); } -} - -/****************************************************************************** - Writes the log file. -******************************************************************************/ -void write_info() -{ - char str[512]; - int file; - time_t now; - - now=time(NULL); - if((file=nopen("SCB.LOG",O_WRONLY|O_APPEND|O_CREAT))!=-1) { - sprintf(str, - "Node %-3d : %.24s\r\n" - "User Name : %s\r\n" - "Voice Number : %s\r\n" - "Modem Number : %s\r\n" - "Result : %s\r\n\r\n" - ,node_num,ctime(&now),user_name,user_phone,phone_number,result); - write(file,str,strlen(str)); - close(file); } - else - bprintf("\7\r\nError opening SCB.LOG for write.\r\n"); - sprintf(str,"%sNODE.LOG",node_dir); - if(com_port && (file=nopen(str,O_WRONLY|O_APPEND|O_CREAT))!=-1) { - sprintf(str,"cb Result: %s %s\r\n",result,phone_number); - write(file,str,strlen(str)); - close(file); } - if(options&MODIFY_USER_NOTE) { - sprintf(str,"%sUSER\\USER.DAT",data_dir); - if((file=nopen(str,O_WRONLY|O_DENYNONE))!=-1) { - lseek(file,(long)((((long)user_number-1L)*U_LEN)+U_NOTE),SEEK_SET); - memset(str,'\3',30); - sprintf(str,"%s %s",result,phone_number); - str[strlen(str)]=3; - write(file,str,30); - close(file); } } -} - -/****************************************************************************** - Returns the users' password. -******************************************************************************/ -char *get_user_pw() -{ - static char pw[9]; - char str[256]; - int file,x; - - sprintf(str,"%sUSER\\USER.DAT",data_dir); - if((file=nopen(str,O_RDONLY))==-1) { - printf("Unable to open %s.",str); exit(1); } - lseek(file,(long)((((long)user_number-1L)*U_LEN)+U_PASS),SEEK_SET); - read(file,pw,8); - for(x=0;x<8;x++) - if(pw[x]==3) break; - pw[x]=0; - close(file); - return(pw); -} - -/****************************************************************************** - Checks the phone number entered. 0=Good, 1=Bad. -******************************************************************************/ -char check_phone(char *insearch) -{ - char str[256],search[256],c,found=0,allowed=0,long_distance=0; - int file,day,t; - FILE *stream; - time_t now; - struct date date; - struct time curtime; - struct tm *tblock; - -if(strlen(insearch)<min_phone_len) { - printfile("TOOSHORT.MSG"); - return(PHONE_INVALID); } -if(strlen(insearch)>max_phone_len) { - printfile("TOOLONG.MSG"); - return(PHONE_INVALID); } - -strcpy(str,"ALLOWED.DAT"); -if((file=nopen(str,O_RDONLY|O_TEXT))!=-1) - if((stream=fdopen(file,"rt"))!=NULL) { - strcpy(search,insearch); - strupr(search); - while(!feof(stream) && !ferror(stream)) { - if(!fgets(str,81,stream)) - break; - truncsp(str); - c=strlen(str); - if(c && !strncmp(str,search,c)) { - allowed=1; - break; } } - fclose(stream); } - -if(!allowed) { - - if(options&ALLOWED_ONLY) - long_distance=1; - else { - strcpy(str,"LDPREFIX.DAT"); - if((file=nopen(str,O_RDONLY|O_TEXT))!=-1) - if((stream=fdopen(file,"rt"))!=NULL) { - strcpy(search,insearch); - strupr(search); - while(!feof(stream) && !ferror(stream)) { - if(!fgets(str,81,stream)) - break; - truncsp(str); - c=strlen(str); - if(c && !strncmp(str,search,c)) { - long_distance=1; - break; } } - fclose(stream); } } - - if(!(options&START_WITH_0) && insearch[0]=='0') { - printfile("NO_ZERO.MSG"); - return(PHONE_LD); } - if(!(options&START_WITH_1) && insearch[0]=='1') { - printfile("NO_ONE.MSG"); - return(PHONE_LD); } - if(!(options&SAME_AREA_LD) && insearch[0]!='0' && insearch[0]!='1' - && long_distance) { - printfile("NO_LD.MSG"); - return(PHONE_LD); } - if((insearch[0]=='1' || insearch[0]=='0' || long_distance) && - (ldstart[day] || ldend[day])) { - now=time(NULL); - tblock=localtime(&now); - day=tblock->tm_wday; - unixtodos(now,&date,&curtime); - t=(curtime.ti_hour*60)+curtime.ti_min; - - if((ldstart[day]<ldend[day] - && (t<ldstart[day] || t>ldend[day])) - - || (ldstart[day]>ldend[day] - && (t<ldstart[day] && t>ldend[day])) - - ) { - - bprintf("\7\r\n\1n\1gLong distance calls are only allowed between " - "\1h%02d:%02d \1n\1gand \1h%02d:%02d\1n\1g.\r\n" - ,ldstart[day]/60,ldstart[day]%60 - ,ldend[day]/60,ldend[day]%60); - printfile("LD_TIME.MSG"); - return(PHONE_LD); } } } - -strcpy(str,canfile); -if((file=nopen(str,O_RDONLY|O_TEXT))==-1) { - if(fexist(str)) - printf("ERROR: Unable to open %s for read.",str); - return(PHONE_OKAY); } -if((stream=fdopen(file,"rt"))==NULL) { - printf("ERROR: Converting %s to a stream.",str); - return(PHONE_OKAY); } -strcpy(search,insearch); -strupr(search); -while(!feof(stream) && !ferror(stream) && !found) { - if(!fgets(str,81,stream)) - break; - truncsp(str); - c=strlen(str); - if(c) { - c--; - strupr(str); - if(str[c]=='~') { - str[c]=0; - if(strstr(search,str)) - found=1; } - - else if(str[c]=='^') { - str[c]=0; - if(!strncmp(str,search,c)) - found=1; } - - else if(!strcmp(str,search)) - found=1; } } -fclose(stream); -if(found) { - printfile("PHONECAN.MSG"); - return(PHONE_INVALID); } -if(!allowed && options&STAY_CONNECTED && options&SC_LOCAL_ONLY && - (insearch[0]=='1' || insearch[0]=='0')) - options&=~STAY_CONNECTED; -return(PHONE_OKAY); -} - -/****************************************************************************/ -/* Outputs a single character to the COM port */ -/****************************************************************************/ -void putcomch(char ch) -{ - char lch; - int i=0; - -if(!com_port) - return; -while(outcom(ch)&TXBOF && i<1440) { /* 3 minute pause delay */ - if(lkbrd(1)) { - lch=lkbrd(0); /* ctrl-c */ - if(lch==3) { - lputs("local abort (putcomch)\r\n"); - i=1440; - break; } - ungetkey(lch); } - if(!(rioctl(IOSTATE)&DCD)) - break; - i++; - mswait(80); } -if(i==1440) { /* timeout - beep flush outbuf */ - i=rioctl(TXBC); - lprintf("timeout(putcomch) %04X %04X\r\n",i,rioctl(IOFO)); - outcom(7); - lputc(7); - rioctl(IOCS|PAUSE); } -} - -/****************************************************************************/ -/* Sends string of characters to COM port. Interprets ^M and ~ (pause) */ -/* Called from functions waitforcall and offhook */ -/****************************************************************************/ -void mdmcmd(char *str) -{ - int i=0; - uint lch; - -lputs("\r\nModem command : "); -while(str[i]) { - if(str[i]=='~') - mswait(500); - else { - if(i && str[i-1]=='^' && str[i]!='^') /* control character */ - putcomch(toupper(str[i])-64); - else if(str[i]!='^' || (i && str[i-1]=='^')) - putcomch(str[i]); - lputc(str[i]); } - i++; } -putcomch(CR); -i=0; -while(rioctl(TXSYNC) && i<10) { /* wait for modem to receive all chars */ - if(lkbrd(1)) { - lch=lkbrd(0); /* ctrl-c */ - if(lch==0x2e03) { - lputs("local abort (mdmcmd)\r\n"); - break; } - if(lch==0xff00) - bail(1); - ungetkey(lch); } - i++; } -if(i==10) { - i=rioctl(TXBC); - lprintf("\r\n\7timeout(mdmcmd) %04X %04X\r\n",i,rioctl(IOFO)); } -lputs(crlf); -} -/****************************************************************************/ -/* Returns CR terminated string from the COM port. */ -/* Called from function waitforcall */ -/****************************************************************************/ -char getmdmstr(char *str, int sec) -{ - uchar j=0,ch; - uint lch; - time_t start; - -lputs("Modem response : "); -start=time(NULL); -while(time(NULL)-start<sec && j<81) { - if(lkbrd(1)) { - lch=lkbrd(0); /* ctrl-c */ - if(lch==0x2e03) { - lputs("local abort (getmdmstr)\r\n"); - break; } - if(lch==0xff00) - bail(1); - ungetkey(lch); } - if((ch=incom())==CR && j) - break; - if(ch && (ch<0x20 || ch>0x7f)) /* ignore control characters and ex-ascii */ - continue; - if(ch) { - str[j++]=ch; - lputc(ch); } - else mswait(0); } -mswait(500); -str[j]=0; -lputs(crlf); -return(j); -} diff --git a/src/sbbs2/scb/scb.h b/src/sbbs2/scb/scb.h deleted file mode 100644 index 1aac129df0..0000000000 --- a/src/sbbs2/scb/scb.h +++ /dev/null @@ -1,17 +0,0 @@ -/* SCB.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Synchronet BBS Callback door */ - -#define VERSION "1.40" - -#define ALWAYS_VALIDATE (1<<0) -#define MODIFY_USER_NOTE (1<<1) -#define START_WITH_0 (1<<2) -#define START_WITH_1 (1<<3) -#define STAY_CONNECTED (1<<4) -#define SC_LOCAL_ONLY (1<<5) -#define US_PHONE_FORMAT (1<<6) -#define ALLOWED_ONLY (1<<7) -#define SAME_AREA_LD (1<<8) diff --git a/src/sbbs2/scb/scbcfg.c b/src/sbbs2/scb/scbcfg.c deleted file mode 100644 index 4058369fe3..0000000000 --- a/src/sbbs2/scb/scbcfg.c +++ /dev/null @@ -1,788 +0,0 @@ -/* SCBCFG.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <uifc.h> -#include <sys\stat.h> -#include "scb.h" - -#define MAX_PRFX 500 -#define LEN_PRFX 20 - -char **opt; -char **prfx; - -int add(); -void bail(int code); -void main(); -char fexist(char *filespec); - -unsigned _stklen=16000; /* Set stack size in code, not header */ - -void bail(int code) -{ - -if(code) - getch(); -uifcbail(); -exit(code); -} - -int add() -{ - int i; - -i=0; -strcpy(opt[0],"Add these to the user account"); -strcpy(opt[1],"Remove these from the user account"); -opt[2][0]=0; -/* -Add/Remove Flags/Restricts/Exempts: - -Select ADD if you want these flags/restricts/exempts added to the -user upon validation, or select REMOVE to take them away upon -validation. - -*/ -i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Add or Remove From Account",opt); -return(i); -} - -void main() -{ - char str[128],canfile[256],addfile[256],flags1[81]={NULL}, - flags2[81]={NULL},flags3[81]={NULL},flags4[81]={NULL}, - exempt[81]={NULL},restrict[81]={NULL},expiration[81]={NULL}, - credits[81]={NULL},minutes[81]={NULL},level[81]={NULL}, - callout_attempts[81]={NULL},sysop[81]={NULL},bbs_ac[81],*p; - int file,i,j,k,options=0,ldstart[7]={NULL},ldend[7]={NULL},min_phone_len=7, - max_phone_len=11,total_prfxs,dflt,b,hangup_time; - FILE *stream; - -savnum=0; -if((opt=(char **)MALLOC(sizeof(char *)*300))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } -for(i=0;i<300;i++) - if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } -uifcini(); -sprintf(str,"Synchronet Callback v%s",VERSION); -uscrn(str); - -if(!(fexist("SCB.CFG"))) { - strcpy(callout_attempts,"5"); - strcpy(canfile,"\\SBBS\\TEXT\\PHONE.CAN"); - strcpy(addfile,canfile); - options|=MODIFY_USER_NOTE; } -else { - if((file=open("SCB.CFG",O_RDONLY|O_BINARY|O_DENYNONE))==-1) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error opening SCB.CFG\r\n"); - bail(1); } - if((stream=fdopen(file,"rb"))==NULL) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error fdopen SCB.CFG\r\n"); - bail(1); } - fgets(callout_attempts,81,stream); truncsp(callout_attempts); - fgets(str,81,stream); truncsp(str); - if(str[0]=='Y') options|=ALWAYS_VALIDATE; - if(str[1]=='Y') options|=MODIFY_USER_NOTE; - if(str[2]=='Y') options|=START_WITH_0; - if(str[3]=='Y') options|=START_WITH_1; - if(str[4]=='Y') options|=STAY_CONNECTED; - if(str[5]=='Y') options|=SC_LOCAL_ONLY; - if(str[6]=='Y') options|=US_PHONE_FORMAT; - if(str[7]=='Y') options|=ALLOWED_ONLY; - if(str[8]!='N') options|=SAME_AREA_LD; - fgets(canfile,81,stream); truncsp(canfile); - fgets(addfile,81,stream); truncsp(addfile); - fgets(credits,81,stream); truncsp(credits); - fgets(sysop,81,stream); truncsp(sysop); - fgets(level,81,stream); truncsp(level); - fgets(flags1,81,stream); truncsp(flags1); - fgets(flags2,81,stream); truncsp(flags2); - fgets(exempt,81,stream); truncsp(exempt); - fgets(restrict,81,stream); truncsp(restrict); - fgets(expiration,81,stream); truncsp(expiration); - fgets(minutes,81,stream); truncsp(minutes); - fgets(flags3,81,stream); truncsp(flags3); - fgets(flags4,81,stream); truncsp(flags4); - for(i=0;i<7;i++) { - fgets(str,81,stream); ldstart[i]=atoi(str); /* min since midnight */ - fgets(str,81,stream); ldend[i]=atoi(str); } - fgets(str,81,stream); min_phone_len=atoi(str); - fgets(str,81,stream); max_phone_len=atoi(str); - fgets(bbs_ac,81,stream); truncsp(bbs_ac); - if(fgets(str,81,stream)) { - hangup_time=atoi(str); - if(hangup_time>90) - hangup_time=90; } - else - hangup_time=30; - str[0]=0; - fgets(str,81,stream); // regnum - fclose(stream); } -dflt=0; -while(1) { - helpbuf= -" Synchronet Callback Configuration \r\n\r\n" -"Move through the various options using the arrow keys. Select the\r\n" -"highlighted options by pressing ENTER.\r\n\r\n"; - j=0; - sprintf(opt[j++],"Toggle Options..."); - sprintf(opt[j++],"Validation Values..."); - sprintf(opt[j++],"Allowed Prefix List..."); - sprintf(opt[j++],"Long Distance Prefix List..."); - sprintf(opt[j++],"Long Distance Calling Times..."); - sprintf(opt[j++],"Phone Number Trash Can %-30.30s",canfile); - sprintf(opt[j++],"Validated Phone List %-30.30s",addfile); - sprintf(opt[j++],"Callback Attempts %-2.2s",callout_attempts); - sprintf(opt[j++],"Minimum Phone Length %u",min_phone_len); - sprintf(opt[j++],"Maximum Phone Length %u",max_phone_len); - sprintf(opt[j++],"Wait Before Dialing %u seconds",hangup_time); - sprintf(opt[j++],"BBS Area Code %-3.3s",bbs_ac); - if(sysop[0]) - sprintf(str,"User #%s",sysop); - else - sprintf(str,"Disabled"); - sprintf(opt[j++],"Send Message to Sysop %-30.30s",str); - opt[j][0]=NULL; - switch(ulist(WIN_ORG|WIN_MID|WIN_ACT|WIN_ESC,0,0,60,&dflt,0 - ,"Synchronet Callback Configuration",opt)) { - case 0: - j=0; - while(1) { - k=0; - sprintf(opt[k++],"%-40.40s%-3s","Validate if Unable to Verify" - ,options&ALWAYS_VALIDATE ? "Yes":"No"); - sprintf(opt[k++],"%-40.40s%-3s","Put Result in User Note" - ,options&MODIFY_USER_NOTE ? "Yes":"No"); - sprintf(opt[k++],"%-40.40s%-3s" - ,"Long Distance if not an Allowed Prefix" - ,options&ALLOWED_ONLY ? "Yes":"No"); - sprintf(opt[k++],"%-40.40s%-3s" - ,"Allow Long Distance (Starting with 0)" - ,options&START_WITH_0 ? "Yes":"No"); - sprintf(opt[k++],"%-40.40s%-3s" - ,"Allow Long Distance (Starting with 1)" - ,options&START_WITH_1 ? "Yes":"No"); - sprintf(opt[k++],"%-40.40s%-3s" - ,"Allow Long Distance (Same Area Code)" - ,options&SAME_AREA_LD ? "Yes":"No"); - sprintf(opt[k++],"%-40.40s%-3s" - ,"U.S. Style Phone Format (AAA-PPP-SSSS)" - ,options&US_PHONE_FORMAT ? "Yes":"No"); - sprintf(opt[k++],"%-40.40s%-10s","Stay Connected After Callback" - ,options&STAY_CONNECTED && options&SC_LOCAL_ONLY ? - "Local Only" : options&STAY_CONNECTED ? "Yes":"No"); - opt[k][0]=NULL; -helpbuf= -" Toggle Options \r\n\r\n" -"Validate if Unable to Call Back\r\n" -" Setting this to Yes will validate the user even if the board is unable " -"\r\n" -" to call the user back.\r\n" -"Put Result in User Note\r\n" -" When set to Yes, this option will place the phone number, and\r\n" -" information pertaining to the call into the user's note.\r\n" -"Allow Numbers that Start with 0 / Allow Numbers that Start with 1\r\n" -" Set these options to Yes to allow SCB to call phone numbers which\r\n" -" start with a 0 or a 1 (respectively).\r\n" -"U.S. Style Phone Format\r\n" -" Toggle this option to Yes if you live in an area that uses a phone\r\n" -" number format of (AAA) PPP-SSSS.\r\n" -"Stay Connected After Callback\r\n" -" Toggle this option to Yes to allow SCB to stay connected after a\r\n" -" callback, Local Only for local numbers, or No to disconnect."; - - j=ulist(0,0,0,0,&j,0,"Toggle Options",opt); - if(j==-1) - break; - switch(j) { - case 0: - options^=ALWAYS_VALIDATE; - break; - case 1: - options^=MODIFY_USER_NOTE; - break; - case 2: - options^=ALLOWED_ONLY; - break; - case 3: - options^=START_WITH_0; - break; - case 4: - options^=START_WITH_1; - break; - case 5: - options^=SAME_AREA_LD; - break; - case 6: - options^=US_PHONE_FORMAT; - break; - case 7: - if(options&STAY_CONNECTED && options&SC_LOCAL_ONLY) { - options^=STAY_CONNECTED; - options^=SC_LOCAL_ONLY; - } else if(options&STAY_CONNECTED) - options^=SC_LOCAL_ONLY; - else options^=STAY_CONNECTED; - break; } } - break; - case 1: - j=0; - while(1) { - k=0; - sprintf(opt[k++],"%-30.30s %-27.27s","Security Level" - ,level); - sprintf(opt[k++],"%-30.30s %-27.27s","Flag Set 1" - ,flags1); - sprintf(opt[k++],"%-30.30s %-27.27s","Flag Set 2" - ,flags2); - sprintf(opt[k++],"%-30.30s %-27.27s","Flag Set 3" - ,flags3); - sprintf(opt[k++],"%-30.30s %-27.27s","Flag Set 4" - ,flags4); - sprintf(opt[k++],"%-30.30s %-27.27s","Exemptions" - ,exempt); - sprintf(opt[k++],"%-30.30s %-27.27s","Restrictions" - ,restrict); - sprintf(opt[k++],"%-30.30s %-27.27s" - ,"Days to Extend Expiration" - ,expiration); - sprintf(opt[k++],"%-30.30s %-27.27s","Credits to Add" - ,credits); - sprintf(opt[k++],"%-30.30s %-27.27s","Minutes to Add" - ,minutes); - opt[k][0]=NULL; -helpbuf= -" Validation Values \r\n\r\n" -"These are the values that will be placed into user accounts that have\r\n" -"been successfully verified through the Synchronet Callback."; - - - j=ulist(WIN_ACT,0,0,0,&j,0,"Validation Values",opt); - if(j==-1) - break; - switch(j) { - case 0: -helpbuf= -" Security Level \r\n\r\n" -"This is the Security level that will be given to users that are called\r\n" -"back successfully."; - uinput(WIN_L2R|WIN_MID|WIN_SAV,0,0, - "Security Level",level,2,K_EDIT|K_NUMBER); - break; - case 1: -helpbuf= -" Flag Set 1 \r\n\r\n" -"These are the different flags to be added to (or removed from) the\r\n" -"user account."; - p=strstr(flags1,"-"); - if(p!=NULL) sprintf(str,"%s",p+1); - else - sprintf(str,"%s",flags1); - if(uinput(WIN_L2R|WIN_MID|WIN_SAV,0,0,"Flag Set 1",str - ,26,K_EDIT|K_UPPER|K_ALPHA)<0) - break; - if(str[0] && add()>0) sprintf(flags1,"-%s",str); - else - sprintf(flags1,"%s",str); - break; - case 2: -helpbuf= -" Flag Set 2 \r\n\r\n" -"These are the different flags to be added to (or removed from) the\r\n" -"user account."; - p=strstr(flags2,"-"); - if(p!=NULL) sprintf(str,"%s",p+1); - else - sprintf(str,"%s",flags2); - if(uinput(WIN_L2R|WIN_MID|WIN_SAV,0,0,"Flag Set 2",str - ,26,K_EDIT|K_UPPER|K_ALPHA)<0) - break; - if(str[0] && add()>0) sprintf(flags2,"-%s",str); - else - sprintf(flags2,"%s",str); - break; - case 3: -helpbuf= -" Flag Set 3 \r\n\r\n" -"These are the different flags to be added to (or removed from) the\r\n" -"user account."; - p=strstr(flags3,"-"); - if(p!=NULL) sprintf(str,"%s",p+1); - else - sprintf(str,"%s",flags3); - if(uinput(WIN_L2R|WIN_MID|WIN_SAV,0,0,"Flag Set 3",str - ,26,K_EDIT|K_UPPER|K_ALPHA)<0) - break; - if(str[0] && add()>0) sprintf(flags3,"-%s",str); - else - sprintf(flags3,"%s",str); - break; - case 4: -helpbuf= -" Flag Set 4 \r\n\r\n" -"These are the different flags to be added to (or removed from) the\r\n" -"user account."; - p=strstr(flags4,"-"); - if(p!=NULL) sprintf(str,"%s",p+1); - else - sprintf(str,"%s",flags4); - if(uinput(WIN_L2R|WIN_MID|WIN_SAV,0,0,"Flag Set 4",str - ,26,K_EDIT|K_UPPER|K_ALPHA)<0) - break; - if(str[0] && add()>0) sprintf(flags4,"-%s",str); - else - sprintf(flags4,"%s",str); - break; - case 5: -helpbuf= -" Exemptions \r\n\r\n" -"These are the exemption flags that will be added to (or removed from)\r\n" -"the user account."; - p=strstr(exempt,"-"); - if(p!=NULL) sprintf(str,"%s",p+1); - else - sprintf(str,"%s",exempt); - if(uinput(WIN_MID|WIN_SAV,0,0,"Exemptions",str - ,26,K_EDIT|K_UPPER|K_ALPHA)<0) - break; - if(str[0] && add()>0) sprintf(exempt,"-%s",str); - else - sprintf(exempt,"%s",str); - break; - case 6: -helpbuf= -" Restrictions \r\n\r\n" -"These are the restriction flags that will be added to (or removed\r\n" -"from) the user account."; - p=strstr(restrict,"-"); - if(p!=NULL) sprintf(str,"%s",p+1); - else - sprintf(str,"%s",restrict); - if(uinput(WIN_MID|WIN_SAV,0,0,"Restrictions",str - ,26,K_EDIT|K_UPPER|K_ALPHA)<0) - break; - if(str[0] && add()>0) sprintf(restrict,"-%s",str); - else - sprintf(restrict,"%s",str); - break; - case 7: -helpbuf= -" Days to Extend Expiration \r\n\r\n" -"This is the number of days to extend the expiration date of a user\r\n" -"account."; - uinput(WIN_MID|WIN_SAV,0,0,"Expiration" - ,expiration,8,K_EDIT|K_UPPER|K_NUMBER); - break; - case 8: -helpbuf= -" Credits to Add \r\n\r\n" -"This is the number of credits to add to a user account."; - uinput(WIN_MID|WIN_SAV,0,0,"Credits",credits - ,10,K_EDIT|K_UPPER|K_NUMBER); - break; - case 9: -helpbuf= -" Minutes to Add \r\n\r\n" -"This is the number of minutes to add to a user account."; - uinput(WIN_MID|WIN_SAV,0,0,"Minutes",minutes - ,3,K_EDIT|K_UPPER|K_NUMBER); - break; } } - break; - case 2: -helpbuf= -" Allowed Prefix List \r\n\r\n" -"Any phone numbers entered whose prefix matches a number contained\r\n" -"in this list, will not be affected by long distance restrictions.\r\n" -"For example, if you are in the 714 code, and you wish to SCB to\r\n" -"consider all prefixes in the 310 area code local, you would enter 1310\r\n" -"in the list."; - - total_prfxs=0; - if((prfx=(char **)MALLOC(sizeof(char *)*MAX_PRFX))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } - for(i=0;i<MAX_PRFX;i++) - if((prfx[i]=(char *)MALLOC(LEN_PRFX+1))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } - - if(fexist("ALLOWED.DAT")) { - if((file=open("ALLOWED.DAT", - O_RDONLY|O_BINARY|O_DENYNONE))==-1) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error opening ALLOWED.DAT\r\n"); - bail(1); } - if((stream=fdopen(file,"rb"))==NULL) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error fdopen ALLOWED.DAT\r\n"); - bail(1); } - while(!feof(stream) && total_prfxs<MAX_PRFX) { - if(!fgets(str,81,stream)) - break; - truncsp(str); - sprintf(prfx[total_prfxs++],"%.*s",LEN_PRFX,str); } - fclose(stream); } - i=b=0; - while(1) { - for(j=0;j<total_prfxs;j++) - strcpy(opt[j],prfx[j]); - opt[j][0]=NULL; - j=WIN_ACT|WIN_SAV; - if(total_prfxs) - j|=WIN_DEL; - if(total_prfxs<MAX_PRFX) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - i=ulist(j,0,0,30,&i,&b,"Allowed Prefix List",opt); - if((i&0xf000)==MSK_DEL) { - i&=0xfff; - total_prfxs--; - for(j=i;j<total_prfxs;j++) - strcpy(prfx[j],prfx[j+1]); - strcpy(prfx[j+1],""); - continue; } - if((i&0xf000)==MSK_INS) { - i&=0xfff; - if(uinput(WIN_MID|WIN_SAV,0,0,"Enter Prefix",str,LEN_PRFX - ,K_NUMBER)<1) - continue; - ++total_prfxs; - if(total_prfxs) - for(j=total_prfxs;j>i;j--) - strcpy(prfx[j],prfx[j-1]); - strcpy(prfx[i],str); - continue; } - if(i==-1) { - if((file=open("ALLOWED.DAT", - O_WRONLY|O_BINARY|O_CREAT|O_TRUNC|O_DENYALL, - S_IREAD|S_IWRITE))==-1) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error opening ALLOWED.DAT\r\n"); - bail(1); } - if((stream=fdopen(file,"wb"))==NULL) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error fdopen ALLOWED.DAT\r\n"); - bail(1); } - for(i=0;i<total_prfxs;i++) { - fprintf(stream,"%s\r\n",prfx[i]); } - fclose(stream); - for(i=0;i<MAX_PRFX;i++) - FREE(prfx[i]); - FREE(prfx); - break; } - /* else CR was hit */ - uinput(WIN_MID|WIN_SAV,0,0,"Edit Prefix" - ,prfx[i],LEN_PRFX,K_EDIT|K_NUMBER); } - break; - case 3: -helpbuf= -" Long Distance Prefix List \r\n\r\n" -"Any phone numbers entered whose prefixes matches a number contained\r\n" -"in this list, will be considered a long distance number. For example,\r\n" -"in the same area code, the phone number 234-5678 is long distance to you,\r\n" -"so placing 234 in this list will make SCB view calls to that prefix as\r\n" -"long distance.\r\n" -"\r\n" -"If the Long Distance if not an Allowed Prefix toggle option is set to\r\n" -"Yes, then this list is not used.\r\n"; - - total_prfxs=0; - if((prfx=(char **)MALLOC(sizeof(char *)*MAX_PRFX))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } - for(i=0;i<MAX_PRFX;i++) - if((prfx[i]=(char *)MALLOC(LEN_PRFX+1))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } - - if(fexist("LDPREFIX.DAT")) { - if((file=open("LDPREFIX.DAT", - O_RDONLY|O_BINARY|O_DENYNONE))==-1) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error opening LDPREFIX.DAT\r\n"); - bail(1); } - if((stream=fdopen(file,"rb"))==NULL) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error fdopen LDPREFIX.DAT\r\n"); - bail(1); } - while(!feof(stream) && total_prfxs<MAX_PRFX) { - if(!fgets(str,81,stream)) - break; - truncsp(str); - sprintf(prfx[total_prfxs++],"%.*s",LEN_PRFX,str); } - fclose(stream); } - i=b=0; - while(1) { - for(j=0;j<total_prfxs;j++) - strcpy(opt[j],prfx[j]); - opt[j][0]=NULL; - j=WIN_ACT|WIN_SAV; - if(total_prfxs) - j|=WIN_DEL; - if(total_prfxs<MAX_PRFX) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - i=ulist(j,0,0,30,&i,&b,"Long Distance Prefix List",opt); - if((i&0xf000)==MSK_DEL) { - i&=0xfff; - total_prfxs--; - for(j=i;j<total_prfxs;j++) - strcpy(prfx[j],prfx[j+1]); - strcpy(prfx[j+1],""); - continue; } - if((i&0xf000)==MSK_INS) { - i&=0xfff; - if(uinput(WIN_MID|WIN_SAV,0,0,"Enter Prefix",str,LEN_PRFX - ,K_NUMBER)<1) - continue; - ++total_prfxs; - if(total_prfxs) - for(j=total_prfxs;j>i;j--) - strcpy(prfx[j],prfx[j-1]); - strcpy(prfx[i],str); - continue; } - if(i==-1) { - if((file=open("LDPREFIX.DAT", - O_WRONLY|O_BINARY|O_CREAT|O_TRUNC|O_DENYALL, - S_IREAD|S_IWRITE))==-1) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error opening LDPREFIX.DAT\r\n"); - bail(1); } - if((stream=fdopen(file,"wb"))==NULL) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error fdopen LDPREFIX.DAT\r\n"); - bail(1); } - for(i=0;i<total_prfxs;i++) { - fprintf(stream,"%s\r\n",prfx[i]); } - fclose(stream); - for(i=0;i<MAX_PRFX;i++) - FREE(prfx[i]); - FREE(prfx); - break; } - /* else CR was hit */ - uinput(WIN_MID|WIN_SAV,0,0,"Edit Prefix" - ,prfx[i],LEN_PRFX,K_EDIT|K_NUMBER); } - break; - case 4: -helpbuf= -" Long Distance Calling Times \r\n\r\n" -"You are being prompted to specify the beginning and ending times to\r\n" -"allow long distance verification calls (in military 24-hour format).\r\n" -"If you wish to allow long distance calls continuously, set both times\r\n" -"to 00:00.\r\n" -"\r\n" -"To disable long distance calls entirely, set the Allow Long Distance\r\n" -"toggle options to No."; - - j=0; - while(1) { - k=0; - sprintf(opt[k++],"Sunday From %02d:%02d to %02d:%02d" - ,ldstart[0]/60,ldstart[0]%60 - ,ldend[0]/60,ldend[0]%60); - sprintf(opt[k++],"Monday From %02d:%02d to %02d:%02d" - ,ldstart[1]/60,ldstart[1]%60 - ,ldend[1]/60,ldend[1]%60); - sprintf(opt[k++],"Tuesday From %02d:%02d to %02d:%02d" - ,ldstart[2]/60,ldstart[2]%60 - ,ldend[2]/60,ldend[2]%60); - sprintf(opt[k++],"Wednesday From %02d:%02d to %02d:%02d" - ,ldstart[3]/60,ldstart[3]%60 - ,ldend[3]/60,ldend[3]%60); - sprintf(opt[k++],"Thursday From %02d:%02d to %02d:%02d" - ,ldstart[4]/60,ldstart[4]%60 - ,ldend[4]/60,ldend[4]%60); - sprintf(opt[k++],"Friday From %02d:%02d to %02d:%02d" - ,ldstart[5]/60,ldstart[5]%60 - ,ldend[5]/60,ldend[5]%60); - sprintf(opt[k++],"Saturday From %02d:%02d to %02d:%02d" - ,ldstart[6]/60,ldstart[6]%60 - ,ldend[6]/60,ldend[6]%60); - opt[k][0]=NULL; - - j=ulist(WIN_ACT|WIN_SAV,0,0,0,&j,0 - ,"Long Distance Calling Times",opt); - if(j==-1) - break; - sprintf(str,"%02d:%02d",ldstart[j]/60,ldstart[j]%60); - if(uinput(WIN_MID|WIN_SAV,0,0,"Long Distance Start " - "Time",str,5,K_EDIT|K_UPPER)) { - ldstart[j]=atoi(str)*60; - p=strchr(str,':'); - if(p) - ldstart[j]+=atoi(p+1); } - sprintf(str,"%02d:%02d",ldend[j]/60,ldend[j]%60); - if(uinput(WIN_MID|WIN_SAV,0,0,"Long Distance End Time", - str,5,K_EDIT|K_UPPER)) { - ldend[j]=atoi(str)*60; - p=strchr(str,':'); - if(p) - ldend[j]+=atoi(p+1); } } - break; - case 5: -helpbuf= -" Phone Can \r\n\r\n" -"This is the complete path (drive, directory, and filename) where a\r\n" -"trashcan file of phone numbers will be kept. Any numbers inside of this\r\n" -"trashcan will not be accepted for callback verification by SCB."; - uinput(WIN_MID,0,0,"Phone Can",canfile - ,30,K_EDIT|K_UPPER); - break; - case 6: -helpbuf= -" Validated Phone List \r\n\r\n" -"This is the complete path (drive, directory, and filename) where SCB\r\n" -"will write a list of numbers that have been verified.\r\n" -"\r\n" -"Setting this option to the same file as Phone Can will keep users from\r\n" -"being validated with an already validated phone number."; - uinput(WIN_MID|WIN_BOT,0,0,"Phone List",addfile - ,30,K_EDIT|K_UPPER); - break; - case 7: -helpbuf= -" Callback Attempts \r\n\r\n" -"This is the number of times SCB will attempt to dial out to a phone\r\n" -"number."; - uinput(WIN_MID|WIN_BOT,0,0,"Callback Attempts",callout_attempts - ,2,K_EDIT|K_NUMBER); - break; - case 8: -helpbuf= -" Minimum Phone Number Length \r\n\r\n" -"This is the minimum number of digits SCB will allow for a phone number."; - sprintf(str,"%u",min_phone_len); - uinput(WIN_MID|WIN_BOT,0,0,"Minimum Phone Length",str - ,2,K_EDIT|K_NUMBER); - min_phone_len=atoi(str); - break; - case 9: -helpbuf= -" Maximum Phone Number Length \r\n\r\n" -"This is the maximum number of digits SCB will allow for a phone number."; - sprintf(str,"%u",max_phone_len); - uinput(WIN_MID|WIN_BOT,0,0,"Maximum Phone Length",str - ,2,K_EDIT|K_NUMBER); - max_phone_len=atoi(str); - break; - case 10: -helpbuf= -" Wait Before Dialing \r\n\r\n" -"When the BBS hangs up prior to calling a user, this is the amount of\r\n" -"time (in seconds) that the modem will remain hung up before dialing.\r\n" -"This is used to insure that the user has completely disconnected.\r\n" -"The default setting here is 30 seconds, maximum is 90 seconds."; - sprintf(str,"%u",hangup_time); - uinput(WIN_MID|WIN_BOT,0,0,"Wait Before Dialing (in seconds)",str - ,3,K_EDIT|K_NUMBER); - hangup_time=atoi(str); - if(hangup_time>90) - hangup_time=90; - break; - case 11: -helpbuf= -" BBS Area Code \r\n\r\n" -"Enter the area code for YOUR BBS here. A user enters a phone number\r\n" -"with this area code, SCB will strip off the area code before attempting\r\n" -"to call the user back (setting this to 0 disables it)."; - uinput(WIN_MID|WIN_BOT,0,0,"BBS Area Code",bbs_ac - ,3,K_EDIT|K_NUMBER); - break; - case 12: -helpbuf= -" Send Message to Sysop \r\n\r\n" -"If you wish for SCB to send a message to a Sysop when a user has been\r\n" -"verified, set this to the number of the user who is to receive the\r\n" -"messages, or set it to 0 to disable this function."; - uinput(WIN_MID|WIN_BOT,0,0,"Send Message to Sysop - User #",sysop - ,4,K_EDIT|K_NUMBER); - break; - - case -1: -helpbuf= -" Save Configuration File \r\n\r\n" -"Select Yes to save the config file, No to quit without saving,\r\n" -"or hit ESC to go back to the menu.\r\n\r\n"; - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=ulist(WIN_MID,0,0,0,&i,0,"Save Config File",opt); - if(i==-1) break; - if(i) bail(0); - if((file=open("SCB.CFG" - ,O_WRONLY|O_BINARY|O_CREAT|O_DENYALL|O_TRUNC))==-1) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error opening SCB.CFG\r\n"); - bail(1); } - if((stream=fdopen(file,"wb"))==NULL) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error fdopen SCB.CFG\r\n"); - bail(1); } - str[0]=0; - fprintf(stream,"%s\r\n",callout_attempts); - if(options&ALWAYS_VALIDATE) strcat(str,"Y"); else strcat(str,"N"); - if(options&MODIFY_USER_NOTE) strcat(str,"Y"); else strcat(str,"N"); - if(options&START_WITH_0) strcat(str,"Y"); else strcat(str,"N"); - if(options&START_WITH_1) strcat(str,"Y"); else strcat(str,"N"); - if(options&STAY_CONNECTED) strcat(str,"Y"); else strcat(str,"N"); - if(options&SC_LOCAL_ONLY) strcat(str,"Y"); else strcat(str,"N"); - if(options&US_PHONE_FORMAT) strcat(str,"Y"); else strcat(str,"N"); - if(options&ALLOWED_ONLY) strcat(str,"Y"); else strcat(str,"N"); - if(options&SAME_AREA_LD) strcat(str,"Y"); else strcat(str,"N"); - fprintf(stream,"%s\r\n",str); - fprintf(stream,"%s\r\n",canfile); - fprintf(stream,"%s\r\n",addfile); - fprintf(stream,"%s\r\n",credits); - fprintf(stream,"%s\r\n",sysop); - fprintf(stream,"%s\r\n",level); - fprintf(stream,"%s\r\n",flags1); - fprintf(stream,"%s\r\n",flags2); - fprintf(stream,"%s\r\n",exempt); - fprintf(stream,"%s\r\n",restrict); - fprintf(stream,"%s\r\n",expiration); - fprintf(stream,"%s\r\n",minutes); - fprintf(stream,"%s\r\n",flags3); - fprintf(stream,"%s\r\n",flags4); - for(i=0;i<7;i++) { - fprintf(stream,"%u\r\n",ldstart[i]); - fprintf(stream,"%u\r\n",ldend[i]); } - fprintf(stream,"%u\r\n",min_phone_len); - fprintf(stream,"%u\r\n",max_phone_len); - fprintf(stream,"%s\r\n",bbs_ac); - fprintf(stream,"%u\r\n",hangup_time); - fprintf(stream,"%s\r\n",""); // regnum - fclose(stream); - bail(0); - } -} -} -/****************************************************************************/ -/* Checks the disk drive for the existance of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/* Called from upload */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==NULL) - return(1); -return(0); -} diff --git a/src/sbbs2/scb/scbcfg.mak b/src/sbbs2/scb/scbcfg.mak deleted file mode 100644 index 00d9ddf9fa..0000000000 --- a/src/sbbs2/scb/scbcfg.mak +++ /dev/null @@ -1,35 +0,0 @@ - -# Macros -CC = bcc -LD = tlink -SDK = ..\sdk -UIFC = ..\..\uifc -MSWAIT = ..\..\mswait -INCLUDE = \bc45\include;$(UIFC) -LIB = \bc45\lib -MODEL = l -CFLAGS = -d -C -w-pro -m$(MODEL) -I$(INCLUDE) -LDFLAGS = /n /c -OBJS = $(MSWAIT)\dos\mswait$(MODEL).obj uifc.obj -HEADERS = $(UIFC)\uifc.h scb.h - -# Implicit C Compile Rule -.c.obj: - @echo Compiling $*.c to $*.obj ... - $(CC) $(CFLAGS) -c $*.c - -# Main EXE Link Rule -scbcfg.exe: $(OBJS) scbcfg.obj - @echo Linking $< ... - $(LD) $(LDFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) scbcfg.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - - -# All .obj modules -scbcfg.obj: $(HEADERS) - -uifc.obj: $(UIFC)\uifc.h $(UIFC)\uifc.c - @echo Compiling $(UIFC)\$*.c to $*.obj ... - $(CC) $(CFLAGS) -DSCFG -c $(UIFC)\$*.c - diff --git a/src/sbbs2/scfg/makeall.bat b/src/sbbs2/scfg/makeall.bat deleted file mode 100755 index ccca323002..0000000000 --- a/src/sbbs2/scfg/makeall.bat +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -maker -maker -DDOS32 diff --git a/src/sbbs2/scfg/makefile b/src/sbbs2/scfg/makefile deleted file mode 100644 index 0f6343a16a..0000000000 --- a/src/sbbs2/scfg/makefile +++ /dev/null @@ -1,108 +0,0 @@ -############################################## -# Makefile for Synchronet BBS Config Program # -# For use with Borland C++ for DOS or OS/2 # -############################################## - -# Macros - -INCLUDE = \bc45\include;..;..\..\uifc;..\..\spawno;..\smb;..\rio -LIB = \bc45\lib -MAIN = $(OS)\scfg.exe - -!if $d(DOS32) -OS = DOS32 -CC = \bc45\bin\bcc32 -LD = \bc45\bin\tlink32 -CFLAGS = -w-pro -d -C -WX -I$(INCLUDE) -DSCFG -LFLAGS = -Tpe -ax -n -c -MAIN = $(OS)\scfg32.exe -!elif $d(__OS2__) -OS = OS2 -CC = c:\bcos2\bin\bcc -LD = c:\bcos2\bin\tlink -CFLAGS = -w-pro -d -C -I$(INCLUDE) -DSCFG -LFLAGS = -Toe -ap -c -INCLUDE = c:\bcos2\include;..;..\..\uifc;..\..\spawno;..\smb;..\rio -LIB = c:\bcos2\lib -MAIN = $(OS)\scfg4os2.exe -!else -OS = DOS -CC = \bc45\bin\bcc -LD = \bc45\bin\tlink -CFLAGS = -w-pro -d -C -Y -ml -I$(INCLUDE) -DSCFG -LFLAGS = -n -c -OBJS = ..\..\mswait\dos\mswait.obj -!endif - -OBJS = $(OBJS) $(OS)\scfgvars.obj -OVLOBJS = $(OS)\scfg.obj $(OS)\scfgnode.obj\ - $(OS)\scfgxfr1.obj $(OS)\scfgxfr2.obj\ - $(OS)\scfgnet.obj $(OS)\scfgxtrn.obj $(OS)\scfgsys.obj\ - $(OS)\scfgmsg.obj $(OS)\scfgsub.obj\ - $(OS)\scfglib1.obj $(OS)\scfglib2.obj $(OS)\scfgchat.obj\ - $(OS)\uifc.obj $(OS)\scfgmdm.obj $(OS)\smblib.obj\ - $(OS)\wrcnf1.obj $(OS)\wrcnf2.obj -HEADERS = scfg.h ..\..\uifc\uifc.h ..\sbbsdefs.h ..\gen_defs.h ..\scfgvars.c - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) $(OVLOBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) $(OVLOBJS) -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!elif $d(DOS32) - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0X32.obj $(OBJS) $(OVLOBJS) -+, $*, $*,$(LIB)\DPMI32 $(LIB)\CW32 -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0l.obj $(OBJS) /o $(OVLOBJS) -+, $*, $*, $(LIB)\overlay.lib $(LIB)\cl.lib $(LIB)\mathl.lib\ - $(LIB)\emu.lib -!endif -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Shared Functions -$(OS)\scfglib1.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib.h ..\scfglib1.c \ - ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Shared Functions -$(OS)\scfglib2.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib.h ..\scfglib2.c \ - ..\scfgvars.c - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Local Menu Routines -$(OS)\uifc.obj: ..\..\uifc\uifc.c ..\..\uifc\uifc.h - @echo Compiling ..\..\uifc\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\..\uifc\$&.c - -# SMBLIB Functions -$(OS)\smblib.obj: ..\smb\smblib.c ..\smb\smblib.h ..\smb\smbdefs.h - @echo Compiling ..\smb\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\smb\$&.c - -$(OS)\scfg.obj: $(HEADERS) -$(OS)\scfgnode.obj: $(HEADERS) -$(OS)\scfgchat.obj: $(HEADERS) -$(OS)\scfgmsg.obj: $(HEADERS) -$(OS)\scfgsub.obj: $(HEADERS) -$(OS)\scfgnet.obj: $(HEADERS) -$(OS)\scfgsys.obj: $(HEADERS) -$(OS)\scfgxtrn.obj: $(HEADERS) -$(OS)\scfgxfr1.obj: $(HEADERS) -$(OS)\scfgxfr2.obj: $(HEADERS) -$(OS)\scfgmdm.obj: $(HEADERS) -$(OS)\wrcnf1.obj: $(HEADERS) -$(OS)\wrcnf2.obj: $(HEADERS) diff --git a/src/sbbs2/scfg/makehelp.c b/src/sbbs2/scfg/makehelp.c deleted file mode 100644 index 20a64ad8af..0000000000 --- a/src/sbbs2/scfg/makehelp.c +++ /dev/null @@ -1,79 +0,0 @@ -/* MAKEHELP.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Makes SCFG.HLP for Synchronet configuration program */ - -#include <stdio.h> -#include <alloc.h> -#include <string.h> -#include <io.h> -#include <fcntl.h> -#include <sys/stat.h> - -void main(void) -{ - char *files[]={ "SCFG.C" - ,"SCFGSYS.C" - ,"SCFGMSG.C" - ,"SCFGSUB.C" - ,"SCFGNODE.C" - ,"SCFGCHAT.C" - ,"SCFGXFR1.C" - ,"SCFGXFR2.C" - ,"SCFGNET.C" - ,"SCFGXTRN.C" - ,NULL }; - char str[256],tmp[256]; - int i,j,k,line,ixb; - long l; - FILE *stream,*out; - -if((out=fopen("SCFGHELP.DAT","wb"))==NULL) { - printf("error opening SCFGHELP.DAT\r\n"); - return; } - -if((ixb=open("SCFGHELP.IXB",O_WRONLY|O_CREAT|O_BINARY,S_IWRITE|S_IREAD))==-1) { - printf("error opening SCFGHELP.IXB\r\n"); - return; } - -for(i=0;files[i];i++) { - if((stream=fopen(files[i],"rb"))==NULL) { - printf("error opening %s\r\n",files[i]); - return; } - printf("\r\n%s ",files[i]); - line=0; - while(!feof(stream)) { - if(!fgets(str,128,stream)) - break; - line++; - if(strstr(str,"SETHELP(WHERE);")) { - l=ftell(out); - write(ixb,files[i],12); - write(ixb,&line,2); - write(ixb,&l,4); - fgets(str,128,stream); /* skip start comment */ - line++; - while(!feof(stream)) { - if(!fgets(str,128,stream)) - break; - if(strchr(str,9)) { /* Tab expansion */ - strcpy(tmp,str); - k=strlen(tmp); - for(j=l=0;j<k;j++) { - if(tmp[j]==9) { - str[l++]=32; - while(l%4) - str[l++]=32; } - else - str[l++]=tmp[j]; } - str[l]=0; } - line++; - if(strstr(str,"*/")) /* end comment */ - break; - fputs(str,out); } - fputc(0,out); } } - fclose(stream); } -fclose(out); -printf("\n"); -} diff --git a/src/sbbs2/scfg/makehelp.exe b/src/sbbs2/scfg/makehelp.exe deleted file mode 100755 index 7e6a104c4311ee082949d9a5e64ce08aadf21cf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10178 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 WQ{Y*a7aSD3`1XS#1Jeo)1_l6;@0Sn& diff --git a/src/sbbs2/scfg/scfg.c b/src/sbbs2/scfg/scfg.c deleted file mode 100644 index 3804fbe01d..0000000000 --- a/src/sbbs2/scfg/scfg.c +++ /dev/null @@ -1,1967 +0,0 @@ -#line 2 "SCFG.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/****************************************************************************/ -/* Synchronet configuration utility */ -/****************************************************************************/ - -#include "scfg.h" - -#ifdef __FLAT__ - unsigned _stklen=64000; -#else - unsigned _stklen=32000; -#endif - -extern char *wday[]; /* names of weekdays (3 char) */ -extern char uifc_status; - -/********************/ -/* Global Variables */ -/********************/ - -long freedosmem; -int no_dirchk=0,no_msghdr=0,forcesave=0,all_msghdr=0; -char **opt; -char tmp[256]; -char *nulstr=""; -char **mdm_type; -char **mdm_file; -int mdm_types; -int backup_level=3; - -read_cfg_text_t txt={ - "\7\r\nError opening %s for read.\r\n", - "","", - "\7\r\nError allocating %u bytes of memory\r\n", - "\7\r\nERROR: Offset %lu in %s\r\n\r\n" }; - -char *invalid_code= -"Invalid Internal Code:\n\n" -"Internal codes can be up to eight characters in length and can only\n" -"contain valid DOS filename characters. The code you have entered\n" -"contains one or more invalid characters."; - -char *num_flags= -"Number of Flags Needed:\n\n" -"If you want users to be required to have all the flags, select All.\n" -"\n" -"If you want users to be required to have any one or more of the flags,\n" -"select One (Allowed)."; - - -void allocfail(uint size) -{ -cprintf("\7Error allocating %u bytes of memory.\r\n",size); -bail(1); -} - -time_t checktime(void) -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - -int main(int argc, char **argv) -{ - char **mopt,*p; - int i,j,main_dflt=0,no_emsovl=0,chat_dflt=0; - uint u; - long l; - char str[129]; - FILE *instream; -#ifndef __FLAT__ - union REGS reg; -#endif - -printf("\r\nSynchronet Configuration Util (%s) v%s%c Developed 1995-1997 " - "Rob Swindell\r\n", -#ifdef __OS2__ - "OS/2" -#elif defined(__FLAT__) - "DOS/Win32" -#else - "DOS" -#endif - ,VERSION,REVISION); - -if(argc>1) - strcpy(ctrl_dir,argv[1]); -else - getcwd(ctrl_dir,MAXDIR); -if(argc>2) { - for(i=2;i<argc;i++) { - if(!stricmp(argv[i],"/M")) /* Show free mem */ - show_free_mem=!show_free_mem; - else if(!stricmp(argv[i],"/N")) /* No EMS */ - no_emsovl=!no_emsovl; -#if !defined(__FLAT__) - else if(!strnicmp(argv[i],"/T",2)) /* Windows/OS2 time slice API */ - mswtyp=atoi(argv[i]+2); -#endif - else if(!strnicmp(argv[i],"/C",2)) /* Force color mode */ - uifc_status|=UIFC_COLOR; - else if(!strnicmp(argv[i],"/B",2)) /* Backup level */ - backup_level=atoi(argv[i]+2); - else if(!stricmp(argv[i],"/S")) /* No dir checking */ - no_dirchk=!no_dirchk; - else if(!stricmp(argv[i],"/H")) /* No msg header updating */ - no_msghdr=!no_msghdr; - else if(!stricmp(argv[i],"/U")) /* Update all message headers */ - all_msghdr=!all_msghdr; - else if(!stricmp(argv[i],"/F")) /* Force save of config files */ - forcesave=!forcesave; - else { - printf("\r\nusage: scfg <ctrl_dir> [/c] [/m] [/n] [/s] [/u] [/h] " - "[/t#] [/b#]\r\n" - "\r\n" - "/c = force color mode\r\n" - "/m = show free memory\r\n" - "/n = don't use EMS\r\n" - "/s = don't check directories\r\n" - "/f = force save of config files\r\n" - "/u = update all message base status headers\r\n" - "/h = don't update message base status headers\r\n" - "/t# = set supported time slice APIs to #\r\n" - "/b# = set automatic back-up level (default=3 max=10)\r\n" - ); - exit(0); } } } - -if(backup_level>10) backup_level=10; - -if(ctrl_dir[strlen(ctrl_dir)-1]!='\\' && ctrl_dir[strlen(ctrl_dir)-1]!=':') - strcat(ctrl_dir,"\\"); - -init_mdms(); - -uifcini(); - -#if !defined(__FLAT__) -if(!no_emsovl) { - cputs("\r\nEMS: "); - if((i=open("EMMXXXX0",O_RDONLY))==-1) - cputs("not installed."); - else { - close(i); - reg.h.ah=0x46; /* Get EMS version */ - int86(0x67,®,®); - if(reg.h.ah) - cputs("\7error getting version."); - else { - cprintf("Version %u.%u ",(reg.h.al&0xf0)>>4,reg.h.al&0xf); - if(_OvrInitEms(0,0,23)) /* use up to 360K */ - cprintf("allocation failed."); } } - cputs("\r\n"); } -#endif - -#ifdef __FLAT__ -if(putenv("TZ=UCT0")) - printf("putenv() failed!\n"); -tzset(); -#endif - -if((l=checktime())!=0) { /* Check binary time */ - printf("Time problem (%08lx)\n",l); - exit(1); } - -if((opt=(char **)MALLOC(sizeof(char *)*(MAX_OPTS+1)))==NULL) - allocfail(sizeof(char *)*(MAX_OPTS+1)); -for(i=0;i<(MAX_OPTS+1);i++) - if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL) - allocfail(MAX_OPLN); - -if((mopt=(char **)MALLOC(sizeof(char *)*14))==NULL) - allocfail(sizeof(char *)*14); -for(i=0;i<14;i++) - if((mopt[i]=(char *)MALLOC(64))==NULL) - allocfail(64); - -txt.reading=nulstr; -txt.readit=nulstr; - -strcpy(str,argv[0]); -p=strrchr(str,'\\'); -if(!p) { - sprintf(helpdatfile,"..\\EXEC\\SCFGHELP.DAT"); - sprintf(helpixbfile,"..\\EXEC\\SCFGHELP.IXB"); } -else { - *p=0; - sprintf(helpdatfile,"%s\\SCFGHELP.DAT",str); - sprintf(helpixbfile,"%s\\SCFGHELP.IXB",str); } - -sprintf(str,"Synchronet Configuration for %s v%s", -#if defined(__OS2__) - "OS/2" -#elif defined(__FLAT__) - "DOS/Win32" -#else - "DOS" -#endif - ,VERSION); -if(uscrn(str)) { - cprintf("USCRN failed!\r\n"); - bail(1); } -i=0; -strcpy(mopt[i++],"Nodes"); -strcpy(mopt[i++],"System"); -strcpy(mopt[i++],"Networks"); -strcpy(mopt[i++],"File Areas"); -strcpy(mopt[i++],"File Options"); -strcpy(mopt[i++],"Chat Features"); -strcpy(mopt[i++],"Message Areas"); -strcpy(mopt[i++],"Message Options"); -strcpy(mopt[i++],"Command Shells"); -strcpy(mopt[i++],"External Programs"); -strcpy(mopt[i++],"Text File Sections"); -mopt[i][0]=0; -#ifndef __FLAT__ -freedosmem=farcoreleft(); -#endif -while(1) { -#if 0 - if(freedosmem!=farcoreleft()) { - errormsg(WHERE,ERR_CHK,"lost memory",freedosmem-farcoreleft()); - freedosmem=farcoreleft(); } -#endif - SETHELP(WHERE); -/* -Main Configuration Menu: - -This is the main menu of the Synchronet configuration utility (SCFG). -From this menu, you have the following choices: - - Nodes : Add, delete, or configure nodes - System : System-wide configuration options - Networks : Message networking configuration - File Areas : File area configuration - File Options : File area options - Chat Features : Chat actions, sections, pagers, and gurus - Message Areas : Message area configuration - Message Options : Message and email options - External Programs : Events, editors, and online programs - Text File Sections : General text file area - -Use the arrow keys and ENTER to select an option, or ESC to exit. -*/ - switch(ulist(WIN_ORG|WIN_MID|WIN_ESC|WIN_ACT,0,0,30,&main_dflt,0 - ,"Configure",mopt)) { - case 0: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop(0); - node_menu(); - free_main_cfg(); - break; - case 1: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading XTRN.CNF..."); - read_xtrn_cfg(txt); - upop(0); - sys_cfg(); - free_xtrn_cfg(); - free_main_cfg(); - break; - case 2: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading MSGS.CNF..."); - read_msgs_cfg(txt); - upop(0); - net_cfg(); - free_msgs_cfg(); - free_main_cfg(); - break; - case 3: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading FILE.CNF..."); - read_file_cfg(txt); - upop(0); - xfer_cfg(); - free_file_cfg(); - free_main_cfg(); - break; - case 4: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading FILE.CNF..."); - read_file_cfg(txt); - upop(0); - xfer_opts(); - free_file_cfg(); - free_main_cfg(); - break; - case 5: - upop("Reading CHAT.CNF..."); - read_chat_cfg(txt); - upop(0); - while(1) { - i=0; - strcpy(opt[i++],"Artificial Gurus"); - strcpy(opt[i++],"Multinode Chat Actions"); - strcpy(opt[i++],"Multinode Chat Channels"); - strcpy(opt[i++],"External Sysop Chat Pagers"); - opt[i][0]=0; - j=ulist(WIN_ORG|WIN_ACT|WIN_CHE,0,0,0,&chat_dflt,0 - ,"Chat Features",opt); - if(j==-1) { - j=save_changes(WIN_MID); - if(j==-1) - continue; - if(!j) - write_chat_cfg(); - break; } - switch(j) { - case 0: - guru_cfg(); - break; - case 1: - actsets_cfg(); - break; - case 2: - chan_cfg(); - break; - case 3: - page_cfg(); - break; } } - free_chat_cfg(); - break; - case 6: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading MSGS.CNF..."); - read_msgs_cfg(txt); - upop(0); - msgs_cfg(); - free_msgs_cfg(); - free_main_cfg(); - break; - case 7: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading MSGS.CNF..."); - read_msgs_cfg(txt); - upop(0); - msg_opts(); - free_msgs_cfg(); - free_main_cfg(); - break; - case 8: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop(0); - shell_cfg(); - free_main_cfg(); - break; - case 9: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading XTRN.CNF..."); - read_xtrn_cfg(txt); - upop(0); - xprogs_cfg(); - free_xtrn_cfg(); - free_main_cfg(); - break; - case 10: - upop("Reading MAIN.CNF..."); - read_main_cfg(txt); - upop("Reading FILE.CNF..."); - read_file_cfg(txt); - upop(0); - txt_cfg(); - free_file_cfg(); - free_main_cfg(); - break; - case -1: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Exit SCFG: - -If you want to exit the Synchronet configuration utility, select Yes. -Otherwise, select No or hit ESC . -*/ - i=ulist(WIN_MID,0,0,0,&i,0,"Exit SCFG",opt); - if(!i) - bail(0); - break; } } -} - -/****************************************************************************/ -/* Checks the changes variable. If there have been no changes, returns 2. */ -/* If there have been changes, it prompts the user to change or not. If the */ -/* user escapes the menu, returns -1, selects Yes, 0, and selects no, 1 */ -/****************************************************************************/ -int save_changes(int mode) -{ - int i=0; - -if(!changes) - return(2); -strcpy(opt[0],"Yes"); -strcpy(opt[1],"No"); -opt[2][0]=0; -if(mode&WIN_SAV && savdepth) - savnum++; -SETHELP(WHERE); -/* -Save Changes: - -You have made some changes to the configuration. If you want to save -these changes, select Yes. If you are positive you DO NOT want to save -these changes, select No. If you are not sure and want to review the -configuration before deciding, hit ESC . -*/ -i=ulist(mode|WIN_ACT,0,0,0,&i,0,"Save Changes",opt); -if(mode&WIN_SAV && savdepth) - savnum--; -if(i!=-1) - changes=0; -return(i); -} - -void txt_cfg() -{ - static int txt_dflt,bar; - char str[81],code[9],done=0,*p; - int j,k; - uint i; - static txtsec_t savtxtsec; - -while(1) { - for(i=0;i<total_txtsecs;i++) - sprintf(opt[i],"%-25s",txtsec[i]->name); - opt[i][0]=0; - j=WIN_ORG|WIN_ACT|WIN_CHE; - if(total_txtsecs) - j|=WIN_DEL|WIN_GET; - if(total_txtsecs<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savtxtsec.name[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -Text File Sections: - -This is a list of General Text File (G-File) Sections configured for -your system. G-File sections are used to store text files that can be -viewed freely by the users. Common text file section topics include -ANSI Artwork, System Information, Game Help Files, and other special -interest topics. - -To add a text file section, select the desired location with the arrow -keys and hit INS . - -To delete a text file section, select it and hit DEL . - -To configure a text file, select it and hit ENTER . -*/ - i=ulist(j,0,0,45,&txt_dflt,&bar,"Text File Sections",opt); - if((signed)i==-1) { - j=save_changes(WIN_MID); - if(j==-1) - continue; - if(!j) - write_file_cfg(); - return; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - strcpy(str,"ANSI Artwork"); - SETHELP(WHERE); -/* -Text Section Name: - -This is the name of this text section. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Text Section Name",str,40 - ,K_EDIT)<1) - continue; - sprintf(code,"%.8s",str); - p=strchr(code,SP); - if(p) *p=0; - strupr(code); - SETHELP(WHERE); -/* -Text Section Internal Code: - -Every text file section must have its own unique internal code for -Synchronet to reference it by. It is helpful if this code is an -abreviation of the name. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Text Section Internal Code",code,8 - ,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; - continue; } - if((txtsec=(txtsec_t **)REALLOC(txtsec - ,sizeof(txtsec_t *)*(total_txtsecs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_txtsecs+1); - total_txtsecs=0; - bail(1); - continue; } - if(total_txtsecs) - for(j=total_txtsecs;j>i;j--) - txtsec[j]=txtsec[j-1]; - if((txtsec[i]=(txtsec_t *)MALLOC(sizeof(txtsec_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(txtsec_t)); - continue; } - memset((txtsec_t *)txtsec[i],0,sizeof(txtsec_t)); - strcpy(txtsec[i]->name,str); - strcpy(txtsec[i]->code,code); - total_txtsecs++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(txtsec[i]); - total_txtsecs--; - for(j=i;j<total_txtsecs;j++) - txtsec[j]=txtsec[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savtxtsec=*txtsec[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *txtsec[i]=savtxtsec; - changes=1; - continue; } - i=txt_dflt; - j=0; - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%s","Name",txtsec[i]->name); - sprintf(opt[k++],"%-27.27s%s","Access Requirements" - ,txtsec[i]->ar); - sprintf(opt[k++],"%-27.27s%s","Internal Code",txtsec[i]->code); - opt[k][0]=0; - switch(ulist(WIN_ACT|WIN_MID,0,0,60,&j,0,txtsec[i]->name - ,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Text Section Name: - -This is the name of this text section. -*/ - strcpy(str,txtsec[i]->name); /* save */ - if(!uinput(WIN_MID|WIN_SAV,0,10 - ,"Text File Section Name" - ,txtsec[i]->name,40,K_EDIT)) - strcpy(txtsec[i]->name,str); - break; - case 1: - sprintf(str,"%s Text Section",txtsec[i]->name); - getar(str,txtsec[i]->ar); - break; - case 2: - strcpy(str,txtsec[i]->code); - SETHELP(WHERE); -/* -Text Section Internal Code: - -Every text file section must have its own unique internal code for -Synchronet to reference it by. It is helpful if this code is an -abreviation of the name. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)" - ,str,8,K_EDIT|K_UPPER); - if(code_ok(str)) - strcpy(txtsec[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; } } } -} - -void shell_cfg() -{ - static int shell_dflt,shell_bar; - char str[81],code[9],done=0,*p; - int j,k; - uint i; - static shell_t savshell; - -while(1) { - for(i=0;i<total_shells;i++) - sprintf(opt[i],"%-25s",shell[i]->name); - opt[i][0]=0; - j=WIN_ORG|WIN_ACT|WIN_CHE; - if(total_shells) - j|=WIN_DEL|WIN_GET; - if(total_shells<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savshell.name[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -Command Shells: - -This is a list of Command Shells configured for your system. -Command shells are the programmable command and menu structures which -are available for your BBS. - -To add a command shell section, select the desired location with the arrow -keys and hit INS . - -To delete a command shell, select it and hit DEL . - -To configure a command shell, select it and hit ENTER . -*/ - i=ulist(j,0,0,45,&shell_dflt,&shell_bar,"Command Shells",opt); - if((signed)i==-1) { - j=save_changes(WIN_MID); - if(j==-1) - continue; - if(!j) - write_main_cfg(); - return; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - strcpy(str,"Menu Shell"); - SETHELP(WHERE); -/* -Command Shell Name: - -This is the descriptive name of this command shell. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Command Shell Name",str,40 - ,K_EDIT)<1) - continue; - sprintf(code,"%.8s",str); - p=strchr(code,SP); - if(p) *p=0; - strupr(code); - SETHELP(WHERE); -/* -Command Shell Internal Code: - -Every command shell must have its own unique internal code for -Synchronet to reference it by. It is helpful if this code is an -abreviation of the name. - -This code will be the base filename used to load the shell from your -EXEC directory. e.g. A shell with an internal code of MYBBS would -indicate a Baja shell file named MYBBS.BIN in your EXEC directory. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Command Shell Internal Code",code,8 - ,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; - continue; } - if((shell=(shell_t **)REALLOC(shell - ,sizeof(shell_t *)*(total_shells+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_shells+1); - total_shells=0; - bail(1); - continue; } - if(total_shells) - for(j=total_shells;j>i;j--) - shell[j]=shell[j-1]; - if((shell[i]=(shell_t *)MALLOC(sizeof(shell_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(shell_t)); - continue; } - memset((shell_t *)shell[i],0,sizeof(shell_t)); - strcpy(shell[i]->name,str); - strcpy(shell[i]->code,code); - total_shells++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(shell[i]); - total_shells--; - for(j=i;j<total_shells;j++) - shell[j]=shell[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savshell=*shell[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *shell[i]=savshell; - changes=1; - continue; } - i=shell_dflt; - j=0; - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%s","Name",shell[i]->name); - sprintf(opt[k++],"%-27.27s%s","Access Requirements" - ,shell[i]->ar); - sprintf(opt[k++],"%-27.27s%s","Internal Code",shell[i]->code); - opt[k][0]=0; - SETHELP(WHERE); -/* -Command Shell: - -A command shell is a programmed command and menu structure that you or -your users can use to navigate the BBS. For every command shell -configured here, there must be an associated .BIN file in your EXEC -directory for Synchronet to execute. - -Command shell files are created by using the Baja command shell compiler -to turn Baja source code (.SRC) files into binary files (.BIN) for -Synchronet to interpret. See the example .SRC files in the TEXT -directory and the documentation for the Baja compiler for more details. -*/ - switch(ulist(WIN_ACT|WIN_MID,0,0,60,&j,0,shell[i]->name - ,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Command Shell Name: - -This is the descriptive name of this command shell. -*/ - strcpy(str,shell[i]->name); /* save */ - if(!uinput(WIN_MID|WIN_SAV,0,10 - ,"Command Shell Name" - ,shell[i]->name,40,K_EDIT)) - strcpy(shell[i]->name,str); - break; - case 1: - sprintf(str,"%s Command Shell",shell[i]->name); - getar(str,shell[i]->ar); - break; - case 2: - strcpy(str,shell[i]->code); - SETHELP(WHERE); -/* -Command Shell Internal Code: - -Every command shell must have its own unique internal code for -Synchronet to reference it by. It is helpful if this code is an -abreviation of the name. - -This code will be the base filename used to load the shell from your -EXEC directory. e.g. A shell with an internal code of MYBBS would -indicate a Baja shell file named MYBBS.BIN in your EXEC directory. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)" - ,str,8,K_EDIT|K_UPPER); - if(code_ok(str)) - strcpy(shell[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; } } } -} - -/****************************************************************************/ -/* Deletes all files in dir 'path' that match file spec 'spec' */ -/****************************************************************************/ -int delfiles(char *inpath, char *spec) -{ - char str[256],path[128],done,c; - int files=0; - struct ffblk ff; - -strcpy(path,inpath); -c=strlen(path); -if(path[c-1]!='\\' && path[c-1]!=':') - strcat(path,"\\"); -sprintf(str,"%s%s",path,spec); -done=findfirst(str,&ff,0); -while(!done) { - sprintf(str,"%s%s",path,ff.ff_name); - if(remove(str)) - errormsg(WHERE,ERR_REMOVE,str,0); - else - files++; - done=findnext(&ff); } -return(files); -} - -int whichlogic() -{ - int i; - -i=0; -strcpy(opt[0],"Greater than or Equal"); -strcpy(opt[1],"Equal"); -strcpy(opt[2],"Not Equal"); -strcpy(opt[3],"Less than"); -opt[4][0]=0; -if(savdepth) - savnum++; -SETHELP(WHERE); -/* -Select Logic for Requirement: - -This menu allows you to choose the type of logic evaluation to use -in determining if the requirement is met. If, for example, the user's -level is being evaluated and you select Greater than or Equal from -this menu and set the required level to 50, the user must have level -50 or higher to meet this requirement. If you selected Equal from -this menu and set the required level to 50, the user must have level -50 exactly. If you select Not equal and level 50, then the user -must have any level BUT 50. And if you select Less than from this -menu and level 50, the user must have a level below 50. -*/ -i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Select Logic",opt); -if(savdepth) - savnum--; -return(i); -} - -int whichcond() -{ - int i; - -i=0; -strcpy(opt[0],"AND (Both/All)"); -strcpy(opt[1],"OR (Either/Any)"); -opt[2][0]=0; -if(savdepth) - savnum++; -SETHELP(WHERE); -/* -Select Logic for Multiple Requirements: - -If you wish this new parameter to be required along with the other -parameters, select AND to specify that both or all of the -parameter requirments must be met. - -If you wish this new parameter to only be required if the other -parameter requirements aren't met, select OR to specify that either -or any of the parameter requirements must be met. -*/ -i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Multiple Requirement Logic",opt); -if(savdepth) - savnum--; -return(i); -} - - -void getar(char *desc, char *inar) -{ - static int curar; - char str[128],ar[128]; - int i,j,len,done=0,n; - -strcpy(ar,inar); -while(!done) { - len=strlen(ar); - if(len>=30) { /* Needs to be shortened */ - str[0]=0; - n=strlen(ar); - for(i=0;i<n;i++) { /* Shorten operators */ - if(!strncmp(ar+i,"AND",3)) { - strcat(str,"&"); - i+=2; } - else if(!strncmp(ar+i,"NOT",3)) { - strcat(str,"!"); - i+=2; } - else if(!strncmp(ar+i,"EQUAL",5)) { - strcat(str,"="); - i+=4; } - else if(!strncmp(ar+i,"EQUALS",6)) { - strcat(str,"="); - i+=5; } - else if(!strncmp(ar+i,"EQUAL TO",8)) { - strcat(str,"="); - i+=7; } - else if(!strncmp(ar+i,"OR",2)) { - strcat(str,"|"); - i+=1; } - else - strncat(str,ar+i,1); } - strcpy(ar,str); - len=strlen(ar); } - - if(len>=30) { - str[0]=0; - n=strlen(ar); - for(i=0;i<n;i++) { /* Remove spaces from ! and = */ - if(!strncmp(ar+i," ! ",3)) { - strcat(str,"!"); - i+=2; } - else if(!strncmp(ar+i,"= ",2)) { - strcat(str,"="); - i++; } - else if(!strncmp(ar+i," = ",3)) { - strcat(str,"="); - i+=2; } - else - strncat(str,ar+i,1); } - strcpy(ar,str); - len=strlen(ar); } - - if(len>=30) { - str[0]=0; - n=strlen(ar); - for(i=0;i<n;i++) { /* Remove spaces from & and | */ - if(!strncmp(ar+i," & ",3)) { - strcat(str," "); - i+=2; } - else if(!strncmp(ar+i," | ",3)) { - strcat(str,"|"); - i+=2; } - else - strncat(str,ar+i,1); } - strcpy(ar,str); - len=strlen(ar); } - - if(len>=30) { /* change week days to numbers */ - str[0]=0; - n=strlen(ar); - for(i=0;i<n;i++) { - for(j=0;j<7;j++) - if(!strnicmp(ar+i,wday[j],3)) { - strcat(str,itoa(j,tmp,10)); - i+=2; - break; } - if(j==7) - strncat(str,ar+i,1); } - strcpy(ar,str); - len=strlen(ar); } - - if(len>=30) { /* Shorten parameters */ - str[0]=0; - n=strlen(ar); - for(i=0;i<n;i++) { - if(!strncmp(ar+i,"AGE",3)) { - strcat(str,"$A"); - i+=2; } - else if(!strncmp(ar+i,"BPS",3)) { - strcat(str,"$B"); - i+=2; } - else if(!strncmp(ar+i,"PCR",3)) { - strcat(str,"$P"); - i+=2; } - else if(!strncmp(ar+i,"RIP",3)) { - strcat(str,"$*"); - i+=2; } - else if(!strncmp(ar+i,"SEX",3)) { - strcat(str,"$S"); - i+=2; } - else if(!strncmp(ar+i,"UDR",3)) { - strcat(str,"$K"); - i+=2; } - else if(!strncmp(ar+i,"DAY",3)) { - strcat(str,"$W"); - i+=2; } - else if(!strncmp(ar+i,"ANSI",4)) { - strcat(str,"$["); - i+=3; } - else if(!strncmp(ar+i,"UDFR",4)) { - strcat(str,"$D"); - i+=3; } - else if(!strncmp(ar+i,"FLAG",4)) { - strcat(str,"$F"); - i+=3; } - else if(!strncmp(ar+i,"NODE",4)) { - strcat(str,"$N"); - i+=3; } - else if(!strncmp(ar+i,"NULL",4)) { - strcat(str,"$0"); - i+=3; } - else if(!strncmp(ar+i,"TIME",4)) { - strcat(str,"$T"); - i+=3; } - else if(!strncmp(ar+i,"USER",4)) { - strcat(str,"$U"); - i+=3; } - else if(!strncmp(ar+i,"REST",4)) { - strcat(str,"$Z"); - i+=3; } - else if(!strncmp(ar+i,"LOCAL",5)) { - strcat(str,"$G"); - i+=4; } - else if(!strncmp(ar+i,"LEVEL",5)) { - strcat(str,"$L"); - i+=4; } - else if(!strncmp(ar+i,"TLEFT",5)) { - strcat(str,"$R"); - i+=4; } - else if(!strncmp(ar+i,"TUSED",5)) { - strcat(str,"$O"); - i+=4; } - else if(!strncmp(ar+i,"EXPIRE",6)) { - strcat(str,"$E"); - i+=5; } - else if(!strncmp(ar+i,"CREDIT",6)) { - strcat(str,"$C"); - i+=5; } - else if(!strncmp(ar+i,"EXEMPT",6)) { - strcat(str,"$X"); - i+=5; } - else if(!strncmp(ar+i,"RANDOM",6)) { - strcat(str,"$Q"); - i+=5; } - else if(!strncmp(ar+i,"LASTON",6)) { - strcat(str,"$Y"); - i+=5; } - else if(!strncmp(ar+i,"LOGONS",6)) { - strcat(str,"$V"); - i+=5; } - else if(!strncmp(ar+i,":00",3)) { - i+=2; } - else - strncat(str,ar+i,1); } - strcpy(ar,str); - len=strlen(ar); } - if(len>=30) { /* Remove all spaces and &s */ - str[0]=0; - n=strlen(ar); - for(i=0;i<n;i++) - if(ar[i]!=SP && ar[i]!='&') - strncat(str,ar+i,1); - strcpy(ar,str); - len=strlen(ar); } - i=0; - sprintf(opt[i++],"Requirement String (%s)",ar); - strcpy(opt[i++],"Clear Requirements"); - strcpy(opt[i++],"Set Required Level"); - strcpy(opt[i++],"Set Required Flag"); - strcpy(opt[i++],"Set Required Age"); - strcpy(opt[i++],"Set Required Sex"); - strcpy(opt[i++],"Set Required Connect Rate"); - strcpy(opt[i++],"Set Required Post/Call Ratio"); - strcpy(opt[i++],"Set Required Number of Credits"); - strcpy(opt[i++],"Set Required Upload/Download Ratio"); - strcpy(opt[i++],"Set Required Upload/Download File Ratio"); - strcpy(opt[i++],"Set Required Time of Day"); - strcpy(opt[i++],"Set Required Day of Week"); - strcpy(opt[i++],"Set Required Node Number"); - strcpy(opt[i++],"Set Required User Number"); - strcpy(opt[i++],"Set Required Time Remaining"); - strcpy(opt[i++],"Set Required Days Till Expiration"); - opt[i][0]=0; - SETHELP(WHERE); -/* -Access Requirements: - -This menu allows you to edit the access requirement string for the -selected feature/section of your BBS. You can edit the string -directly (see documentation for details) or use the Set Required... -options from this menu to automatically fill in the string for you. -*/ - sprintf(str,"%s Requirements",desc); - switch(ulist(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&curar,0,str,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Key word Symbol Description -������������������������������������������������������������������������ -AND & More than one requirement (optional) -NOT ! Logical negation (i.e. NOT EQUAL) -EQUAL = Equality required -OR | Either of two or more parameters is required -AGE $A User's age (years since birthdate, 0-255) -BPS $B User's current connect rate (bps) -FLAG $F User's flag (A-Z) -LEVEL $L User's level (0-99) -NODE $N Current node (1-250) -PCR $P User's post/call ratio (0-100) -SEX $S User's sex/gender (M or F) -TIME $T Time of day (HH:MM, 00:00-23:59) -TLEFT $R User's time left online (minutes, 0-255) -TUSED $O User's time online this call (minutes, 0-255) -USER $U User's number (1-xxxx) -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Requirement String",ar,LEN_ARSTR - ,K_EDIT|K_UPPER); - break; - case 1: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - if(savdepth) - savnum++; - SETHELP(WHERE); -/* -Clear Requirements: - -If you wish to clear the current requirement string, select Yes. -Otherwise, select No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Are You Sure",opt); - if(savdepth) - savnum--; - if(!i) { - ar[0]=0; - changes=1; } - break; - case 2: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Level: - -You are being prompted to enter the security level to be used in this -requirement evaluation. The valid range is 0 (zero) through 99. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Level",str,2,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"LEVEL "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 3: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - - for(i=0;i<4;i++) - sprintf(opt[i],"Flag Set #%d",i+1); - opt[i][0]=0; - i=0; - if(savdepth) - savnum++; - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Select Flag Set",opt); - if(savdepth) - savnum--; - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Flag: - -You are being prompted to enter the security flag to be used in this -requirement evaluation. The valid range is A through Z. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Flag (A-Z)",str,1 - ,K_UPPER|K_ALPHA); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"FLAG "); - if(i) - strcat(ar,itoa(i+1,tmp,10)); - strcat(ar,str); - break; - case 4: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Age: - -You are being prompted to enter the user's age to be used in this -requirement evaluation. The valid range is 0 through 255. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Age",str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"AGE "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 5: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - str[0]=0; - SETHELP(WHERE); -/* -Required Sex: - -You are being prompted to enter the user's gender to be used in this -requirement evaluation. The valid values are M or F (for male or -female). -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Sex (M or F)",str,1 - ,K_UPPER|K_ALPHA); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"SEX "); - strcat(ar,str); - break; - case 6: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Connect Rate (BPS): - -You are being prompted to enter the connect rate to be used in this -requirement evaluation. The valid range is 300 through 57600. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Connect Rate (BPS)",str,5,K_NUMBER); - if(!str[0]) - break; - j=atoi(str); - if(j>=300 && j<30000) { - j/=100; - sprintf(str,"%d",j); } - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"BPS "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 7: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Post/Call Ratio: - -You are being prompted to enter the post/call ratio to be used in this -requirement evaluation (percentage). The valid range is 0 through 100. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Post/Call Ratio (Percentage)" - ,str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"PCR "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 8: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Number of Credits: - -You are being prompted to enter the number of credits (in kilobytes) to -be used in this requirement evaluation. The valid range is 0 through -65535. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Required Credits",str,5,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"CREDIT "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 9: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Upload/Download Ratio: - -You are being prompted to enter the upload/download ratio to be used in -this requirement evaluation (percentage). The valid range is 0 through -100. This ratio is based on the number of bytes uploaded by the user -divided by the number of bytes downloaded. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Upload/Download Ratio (Percentage)" - ,str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"UDR "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 10: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Upload/Download File Ratio: - -You are being prompted to enter the upload/download ratio to be used in -this requirement evaluation (percentage). The valid range is 0 through -100. This ratio is based on the number of files uploaded by the user -divided by the number of files downloaded. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Upload/Download File Ratio (Percentage)" - ,str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"UDFR "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 11: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=0; - strcpy(opt[0],"Before"); - strcpy(opt[1],"After"); - opt[2][0]=0; - if(savdepth) - savnum++; - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Time Relationship",opt); - if(savdepth) - savnum--; - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Time of Day: - -You are being prompted to enter the time of day to be used in this -requirement evaluation (24 hour HH:MM format). The valid range is 0 -through 23:59. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Time of Day (HH:MM)",str,5,K_UPPER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"TIME "); - if(!i) - strcat(ar,"NOT "); - strcat(ar,str); - break; - case 12: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - SETHELP(WHERE); -/* -Required Day of Week: - -You are being prompted to select a day of the week as an access -requirement value. -*/ - for(n=0;n<7;n++) - strcpy(opt[n],wday[n]); - opt[n][0]=0; - n=0; - if(savdepth) - savnum++; - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0,"Select Day of Week",opt); - if(savdepth) - savnum--; - if(n==-1) - break; - strcpy(str,wday[n]); - strupr(str); - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"DAY "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 13: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Node: - -You are being prompted to enter the number of a node to be used in this -requirement evaluation. The valid range is 1 through 250. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Node Number",str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"NODE "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - case 14: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required User Number: - -You are being prompted to enter the user's number to be used in this -requirement evaluation. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"User Number",str,5,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"USER "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - - case 15: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Time Remaining: - -You are being prompted to enter the time remaining to be used in this -requirement evaluation (in minutes). The valid range is 0 through 255. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Time Remaining (minutes)" - ,str,3,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"TLEFT "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - - case 16: - if(strlen(ar)>=30) { - umsg("Maximum string length reached"); - break; } - i=whichlogic(); - if(i==-1) - break; - str[0]=0; - SETHELP(WHERE); -/* -Required Days Till User Account Expiration: - -You are being prompted to enter the required number of days till the -user's account will expire. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Days Till Expiration" - ,str,5,K_NUMBER); - if(!str[0]) - break; - if(ar[0]) { - j=whichcond(); - if(j==-1) - break; - if(!j) - strcat(ar," AND "); - else - strcat(ar," OR "); } - strcat(ar,"EXPIRE "); - switch(i) { - case 1: - strcat(ar,"= "); - break; - case 2: - strcat(ar,"NOT = "); - break; - case 3: - strcat(ar,"NOT "); - break; } - strcat(ar,str); - break; - } } -sprintf(inar,"%.*s",LEN_ARSTR,ar); -} - -char code_ok(char *str) -{ - -if(!strlen(str)) - return(0); -if(strcspn(str," \\/.|<>*?+[]:=\";,")!=strlen(str)) - return(0); -return(1); -} - -/****************************************************************************/ -/* Functions from MISC.C */ -/****************************************************************************/ - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - int file,share,count=0; - -if(access==O_RDONLY) share=O_DENYWRITE; - else share=O_DENYALL; -while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - cputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(((*file)=nopen(str,access))==-1) - return(NULL); - -if(access&O_APPEND) { - if(access&O_RDONLY) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&O_WRONLY) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - close(*file); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,16*1024); -return(stream); -} - - -/****************************************************************************/ -/* Converts an ASCII Hex string into an unsigned long */ -/****************************************************************************/ -unsigned long ahtoul(char *str) -{ - unsigned long l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -/****************************************************************************/ -/* Returns in 'string' a character representation of the number in l with */ -/* commas. Maximum value of l is 4 gigabytes. */ -/****************************************************************************/ -char *ultoac(ulong l, char *string) -{ - char str[81]; - char i,j; - -ultoa(l,str,10); -if(!(strlen(str)%3)) i=(strlen(str)/3)-1; - else i=strlen(str)/3; -j=strlen(str)+i; -string[j--]=0; -i=strlen(str)-1; -while(i!=-1) { - if(!((strlen(str)-i)%3)) { - string[j--]=str[i--]; - string[j--]=','; } - else string[j--]=str[i--]; } -return(string); -} - -/****************************************************************************/ -/* If the directory 'path' doesn't exist, create it. */ -/****************************************************************************/ -void md(char *inpath) -{ - char path[256],str[128]; - struct ffblk ff; - int curdisk,disk; - -if(!inpath[0] || no_dirchk) - return; -if(!strcmp(inpath+1,":\\")) { - curdisk=getdisk(); - disk=toupper(inpath[0])-'A'; - setdisk(disk); - if(getdisk()!=disk) { - sprintf(str,"Invalid drive %c:",toupper(inpath[0])); - umsg(str); } - setdisk(curdisk); - return; } -strcpy(path,inpath); -if(path[strlen(path)-1]=='\\') - path[strlen(path)-1]=0; -if(!strcmp(path,".")) /* Don't try to make '.' */ - return; -if(findfirst(path,&ff,FA_DIREC)) - if(mkdir(path)) { - sprintf(str,"Failed to create %s",path); - umsg(str); } -} - - -void bail(int code) -{ - char str[256]; - int i,x; - smbstatus_t status; - -if(code) { - cputs("\r\nHit a key..."); - getch(); } -else if(forcesave) { - upop("Loading Configs..."); - read_main_cfg(txt); - read_msgs_cfg(txt); - read_file_cfg(txt); - read_chat_cfg(txt); - read_xtrn_cfg(txt); - upop(0); - write_main_cfg(); - write_msgs_cfg(); - write_file_cfg(); - write_chat_cfg(); - write_xtrn_cfg(); } - -uifcbail(); - -exit(code); -} - -/****************************************************************************/ -/* Error handling routine. Prints to local and remote screens the error */ -/* information, function, action, object and access and then attempts to */ -/* write the error information into the file ERROR.LOG in the text dir. */ -/****************************************************************************/ -void errormsg(int line, char *source, char action, char *object, ulong access) -{ - char scrn_buf[8000]; - char actstr[256]; - -gettext(1,1,80,scrn_len,scrn_buf); -clrscr(); -switch(action) { - case ERR_OPEN: - strcpy(actstr,"opening"); - break; - case ERR_CLOSE: - strcpy(actstr,"closeing"); - break; - case ERR_FDOPEN: - strcpy(actstr,"fdopen"); - break; - case ERR_READ: - strcpy(actstr,"reading"); - break; - case ERR_WRITE: - strcpy(actstr,"writing"); - break; - case ERR_REMOVE: - strcpy(actstr,"removing"); - break; - case ERR_ALLOC: - strcpy(actstr,"allocating memory"); - break; - case ERR_CHK: - strcpy(actstr,"checking"); - break; - case ERR_LEN: - strcpy(actstr,"checking length"); - break; - case ERR_EXEC: - strcpy(actstr,"executing"); - break; - default: - strcpy(actstr,"UNKNOWN"); } -cprintf("ERROR - line: %d\r\n",line); -cprintf(" file: %s\r\n",source); -cprintf(" action: %s\r\n",actstr); -cprintf(" object: %s\r\n",object); -cprintf(" access: %ld (%lx)\r\n",access,access); -cputs("\r\n<Hit any key>"); -getch(); -puttext(1,1,80,scrn_len,scrn_buf); -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/* Called from upload */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(1); -return(0); -} - -/* End of SCFG.C */ diff --git a/src/sbbs2/scfg/scfg.h b/src/sbbs2/scfg/scfg.h deleted file mode 100644 index 2ea311e2f1..0000000000 --- a/src/sbbs2/scfg/scfg.h +++ /dev/null @@ -1,89 +0,0 @@ -/* SCFG.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "uifc.h" -#include <dos.h> -#include <dir.h> -#include <stdio.h> -#include <stdlib.h> - -#if defined(__DPMI32__) || defined(__OS2__) - #define far - #define huge -#endif - -#include "sbbs.h" -#include "scfglib.h" - -/**********/ -/* Macros */ -/**********/ - -/*************/ -/* Constants */ -/*************/ - -#define SUB_HDRMOD (1L<<31) /* Modified sub-board header info */ - -/************/ -/* Typedefs */ -/************/ - -/********************/ -/* Global Variables */ -/********************/ -extern long freedosmem; -extern char item; -extern char **opt; -extern char tmp[256]; -extern char *nulstr; -extern char **mdm_type; -extern char **mdm_file; -extern int mdm_types; -extern char *invalid_code,*num_flags; -extern int backup_level; - -extern read_cfg_text_t txt; - -/***********************/ -/* Function Prototypes */ -/***********************/ - -int save_changes(int mode); -void node_menu(); -void node_cfg(); -void results(int i); -void sys_cfg(); -void net_cfg(); -void msgs_cfg(); -void sub_cfg(uint grpnum); -void xfer_cfg(); -void libs_cfg(); -void dir_cfg(uint libnum); -void xprogs_cfg(); -void fevents_cfg(); -void tevents_cfg(); -void xtrn_cfg(); -void swap_cfg(); -void xtrnsec_cfg(); -void page_cfg(); -void xedit_cfg(); -void txt_cfg(); -void shell_cfg(); -void read_node_cfg(read_cfg_text_t txt); -void write_node_cfg(); -void write_main_cfg(); -void write_msgs_cfg(); -void write_file_cfg(); -void write_xtrn_cfg(); -void write_chat_cfg(); -void init_mdms(); -void mdm_cfg(int mdmnum); -int export_mdm(char *fname); -char code_ok(char *str); -int bits(long l); -char oneflag(long l); -void getar(char *desc, char *ar); -char *ultoac(ulong l,char *str); -FILE *fnopen(int *file, char *str, int access); diff --git a/src/sbbs2/scfg/scfgchat.c b/src/sbbs2/scfg/scfgchat.c deleted file mode 100644 index 842d1e24c1..0000000000 --- a/src/sbbs2/scfg/scfgchat.c +++ /dev/null @@ -1,819 +0,0 @@ -#line 2 "SCFGCHAT.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "scfg.h" - -void page_cfg() -{ - static int dflt,bar; - char str[81],done=0; - int j,k; - uint i; - static page_t savpage; - -while(1) { - for(i=0;i<total_pages && i<MAX_OPTS;i++) - sprintf(opt[i],"%-40.40s %.-20s",page[i]->cmd,page[i]->ar); - opt[i][0]=0; - savnum=0; - j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT; - if(total_pages) - j|=WIN_DEL|WIN_GET; - if(total_pages<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savpage.cmd[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -External Sysop Chat Pagers: - -This is a list of the configured external sysop chat pagers. - -To add a pager, select the desired location and hit INS . - -To delete a pager, select it and hit DEL . - -To configure a pager, select it and hit ENTER . -*/ - i=ulist(j,0,0,45,&dflt,&bar,"External Sysop Chat Pagers",opt); - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - sprintf(str,"%%!tone +chatpage.ton"); - SETHELP(WHERE); -/* -External Chat Pager Command Line: - -This is the command line to execute for this external chat pager. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Command Line",str,50 - ,K_EDIT)<1) - continue; - if((page=(page_t **)REALLOC(page,sizeof(page_t *)*(total_pages+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_pages+1); - total_pages=0; - bail(1); - continue; } - if(total_pages) - for(j=total_pages;j>i;j--) - page[j]=page[j-1]; - if((page[i]=(page_t *)MALLOC(sizeof(page_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(page_t)); - continue; } - memset((page_t *)page[i],0,sizeof(page_t)); - strcpy(page[i]->cmd,str); - total_pages++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(page[i]); - total_pages--; - for(j=i;j<total_pages;j++) - page[j]=page[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savpage=*page[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *page[i]=savpage; - changes=1; - continue; } - j=0; - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%.40s","Command Line",page[i]->cmd); - sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",page[i]->ar); - sprintf(opt[k++],"%-27.27s%s","Intercept I/O Interrupts" - ,page[i]->misc&IO_INTS ? "Yes":"No"); - opt[k][0]=0; - sprintf(str,"Sysop Chat Pager #%d",i+1); - savnum=1; - switch(ulist(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&j,0,str,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -External Chat Pager Command Line: - -This is the command line to execute for this external chat pager. -*/ - strcpy(str,page[i]->cmd); - if(!uinput(WIN_MID|WIN_SAV,0,10,"Command Line" - ,page[i]->cmd,50,K_EDIT)) - strcpy(page[i]->cmd,str); - break; - case 1: - savnum=2; - getar(str,page[i]->ar); - break; - case 2: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Intercept I/O Interrupts: - -If you wish the DOS screen output and keyboard input to be intercepted -when running this chat pager, set this option to Yes. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O Interrupts" - ,opt); - if(!k && !(page[i]->misc&IO_INTS)) { - page[i]->misc|=IO_INTS; - changes=1; } - else if(k==1 && page[i]->misc&IO_INTS) { - page[i]->misc&=~IO_INTS; - changes=1; } - break; - - } } } -} - -void chan_cfg() -{ - static int chan_dflt,chan_bar,opt_dflt; - char str[81],code[9],done=0,*p; - int j,k; - uint i; - static chan_t savchan; - -while(1) { - for(i=0;i<total_chans && i<MAX_OPTS;i++) - sprintf(opt[i],"%-25s",chan[i]->name); - opt[i][0]=0; - j=WIN_ACT|WIN_SAV|WIN_BOT|WIN_RHT; - savnum=0; - if(total_chans) - j|=WIN_DEL|WIN_GET; - if(total_chans<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savchan.name[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -Multinode Chat Channels: - -This is a list of the configured multinode chat channels. - -To add a channel, select the desired location with the arrow keys and -hit INS . - -To delete a channel, select it with the arrow keys and hit DEL . - -To configure a channel, select it with the arrow keys and hit ENTER . -*/ - i=ulist(j,0,0,45,&chan_dflt,&chan_bar,"Multinode Chat Channels",opt); - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - strcpy(str,"Open"); - SETHELP(WHERE); -/* -Channel Name: - -This is the name or description of the chat channel. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Chat Channel Name",str,25 - ,K_EDIT)<1) - continue; - sprintf(code,"%.8s",str); - p=strchr(code,SP); - if(p) *p=0; - strupr(code); - SETHELP(WHERE); -/* -Chat Channel Internal Code: - -Every chat channel must have its own unique code for Synchronet to refer -to it internally. This code is usually an abreviation of the chat -channel name. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Internal Code" - ,code,8,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; - continue; } - if((chan=(chan_t **)REALLOC(chan,sizeof(chan_t *)*(total_chans+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_chans+1); - total_chans=0; - bail(1); - continue; } - if(total_chans) - for(j=total_chans;j>i;j--) - chan[j]=chan[j-1]; - if((chan[i]=(chan_t *)MALLOC(sizeof(chan_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chan_t)); - continue; } - memset((chan_t *)chan[i],0,sizeof(chan_t)); - strcpy(chan[i]->name,str); - strcpy(chan[i]->code,code); - total_chans++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(chan[i]); - total_chans--; - for(j=i;j<total_chans;j++) - chan[j]=chan[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savchan=*chan[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *chan[i]=savchan; - changes=1; - continue; } - j=0; - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%s","Name",chan[i]->name); - sprintf(opt[k++],"%-27.27s%s","Internal Code",chan[i]->code); - sprintf(opt[k++],"%-27.27s%lu","Cost in Credits",chan[i]->cost); - sprintf(opt[k++],"%-27.27s%.40s","Access Requirements" - ,chan[i]->ar); - sprintf(opt[k++],"%-27.27s%s","Password Protection" - ,chan[i]->misc&CHAN_PW ? "Yes" : "No"); - sprintf(opt[k++],"%-27.27s%s","Guru Joins When Empty" - ,chan[i]->misc&CHAN_GURU ? "Yes" : "No"); - sprintf(opt[k++],"%-27.27s%s","Channel Guru" - ,chan[i]->guru<total_gurus ? guru[chan[i]->guru]->name : ""); - sprintf(opt[k++],"%-27.27s%s","Channel Action Set" - ,actset[chan[i]->actset]->name); - opt[k][0]=0; - SETHELP(WHERE); -/* -Chat Channel Configuration: - -This menu is for configuring the selected chat channel. -*/ - savnum=1; - sprintf(str,"%s Chat Channel",chan[i]->name); - switch(ulist(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Chat Channel Name: - -This is the name or description of the chat channel. -*/ - strcpy(str,chan[i]->name); - if(!uinput(WIN_MID|WIN_SAV,0,10,"Chat Channel Name" - ,chan[i]->name,25,K_EDIT)) - strcpy(chan[i]->name,str); - break; - case 1: - SETHELP(WHERE); -/* -Chat Channel Internal Code: - -Every chat channel must have its own unique code for Synchronet to refer -to it internally. This code is usually an abreviation of the chat -channel name. -*/ - strcpy(str,chan[i]->code); - if(!uinput(WIN_MID|WIN_SAV,0,10,"Internal Code" - ,str,8,K_UPPER|K_EDIT)) - break; - if(code_ok(str)) - strcpy(chan[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; - case 2: - ultoa(chan[i]->cost,str,10); - SETHELP(WHERE); -/* -Chat Channel Cost to Join: - -If you want users to be charged credits to join this chat channel, set -this value to the number of credits to charge. If you want this channel -to be free, set this value to 0. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Cost to Join (in Credits)" - ,str,10,K_EDIT|K_NUMBER); - chan[i]->cost=atol(str); - break; - case 3: - savnum=2; - sprintf(str,"%s Chat Channel",chan[i]->name); - getar(str,chan[i]->ar); - break; - case 4: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Allow Channel to be Password Protected: - -If you want to allow the first user to join this channel to password -protect it, set this option to Yes. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Allow Channel to be Password Protected" - ,opt); - if(!k && !(chan[i]->misc&CHAN_PW)) { - chan[i]->misc|=CHAN_PW; - changes=1; } - else if(k==1 && chan[i]->misc&CHAN_PW) { - chan[i]->misc&=~CHAN_PW; - changes=1; } - break; - case 5: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Guru Joins This Channel When Empty: - -If you want the system guru to join this chat channel when there is -only one user, set this option to Yes. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Guru Joins This Channel When Empty" - ,opt); - if(!k && !(chan[i]->misc&CHAN_GURU)) { - chan[i]->misc|=CHAN_GURU; - changes=1; } - else if(k==1 && chan[i]->misc&CHAN_GURU) { - chan[i]->misc&=~CHAN_GURU; - changes=1; } - break; - case 6: -SETHELP(WHERE); -/* -Channel Guru: - -This is a list of available chat Gurus. Select the one that you wish -to have available in this channel. -*/ - k=0; - for(j=0;j<total_gurus && j<MAX_OPTS;j++) - sprintf(opt[j],"%-25s",guru[j]->name); - opt[j][0]=0; - savnum=2; - k=ulist(WIN_SAV|WIN_RHT,0,0,25,&j,0 - ,"Available Chat Gurus",opt); - if(k==-1) - break; - chan[i]->guru=k; - break; - case 7: -SETHELP(WHERE); -/* -Channel Action Set: - -This is a list of available chat action sets. Select the one that you wish -to have available in this channel. -*/ - k=0; - for(j=0;j<total_actsets && j<MAX_OPTS;j++) - sprintf(opt[j],"%-25s",actset[j]->name); - opt[j][0]=0; - savnum=2; - k=ulist(WIN_SAV|WIN_RHT,0,0,25,&j,0 - ,"Available Chat Action Sets",opt); - if(k==-1) - break; - changes=1; - chan[i]->actset=k; - break; } } } -} - -void chatact_cfg(uint setnum) -{ - static int chatact_dflt,chatact_bar; - char str[128],cmd[128],out[128]; - int j,k; - uint i,n,chatnum[MAX_OPTS+1]; - static chatact_t savchatact; - -while(1) { - for(i=0,j=0;i<total_chatacts && j<MAX_OPTS;i++) - if(chatact[i]->actset==setnum) { - sprintf(opt[j],"%-*.*s %s",LEN_CHATACTCMD,LEN_CHATACTCMD - ,chatact[i]->cmd,chatact[i]->out); - chatnum[j++]=i; } - chatnum[j]=total_chatacts; - opt[j][0]=0; - savnum=2; - i=WIN_ACT|WIN_SAV; - if(j) - i|=WIN_DEL|WIN_GET; - if(j<MAX_OPTS) - i|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savchatact.cmd[0]) - i|=WIN_PUT; - SETHELP(WHERE); -/* -Multinode Chat Actions: - -This is a list of the configured multinode chat actions. The users can -use these actions in multinode chat by turning on action commands with -the /A command in multinode chat. Then if a line is typed which -begins with a valid action command and has a user name, chat handle, -or node number following, the output string will be displayed replacing -the %s symbols with the sending user's name and the receiving user's -name (in that order). - -To add an action, select the desired location with the arrow keys and -hit INS . - -To delete an action, select it with the arrow keys and hit DEL . - -To configure an action, select it with the arrow keys and hit ENTER . -*/ - sprintf(str,"%s Chat Actions",actset[setnum]->name); - i=ulist(i,0,0,70,&chatact_dflt,&chatact_bar,str,opt); - savnum=3; - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Chat Action Command: - -This is the command word (normally a verb) to trigger the action output. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Action Command",cmd,LEN_CHATACTCMD - ,K_UPPER)<1) - continue; - SETHELP(WHERE); -/* -Chat Action Output String: - -This is the output string displayed with this action output. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"",out,LEN_CHATACTOUT - ,K_MSG)<1) - continue; - if((chatact=(chatact_t **)REALLOC(chatact - ,sizeof(chatact_t *)*(total_chatacts+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_chatacts+1); - total_chatacts=0; - bail(1); - continue; } - if(j) - for(n=total_chatacts;n>chatnum[i];n--) - chatact[n]=chatact[n-1]; - if((chatact[chatnum[i]]=(chatact_t *)MALLOC(sizeof(chatact_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(chatact_t)); - continue; } - memset((chatact_t *)chatact[chatnum[i]],0,sizeof(chatact_t)); - strcpy(chatact[chatnum[i]]->cmd,cmd); - strcpy(chatact[chatnum[i]]->out,out); - chatact[chatnum[i]]->actset=setnum; - total_chatacts++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(chatact[chatnum[i]]); - total_chatacts--; - for(j=chatnum[i];j<total_chatacts && j<MAX_OPTS;j++) - chatact[j]=chatact[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savchatact=*chatact[chatnum[i]]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *chatact[chatnum[i]]=savchatact; - chatact[chatnum[i]]->actset=setnum; - changes=1; - continue; } - SETHELP(WHERE); -/* -Chat Action Command: - -This is the command that triggers this chat action. -*/ - strcpy(str,chatact[chatnum[i]]->cmd); - if(!uinput(WIN_MID|WIN_SAV,0,10,"Chat Action Command" - ,chatact[chatnum[i]]->cmd,LEN_CHATACTCMD,K_EDIT|K_UPPER)) { - strcpy(chatact[chatnum[i]]->cmd,str); - continue; } - SETHELP(WHERE); -/* -Chat Action Output String: - -This is the output string that results from this chat action. -*/ - strcpy(str,chatact[chatnum[i]]->out); - if(!uinput(WIN_MID|WIN_SAV,0,10,"" - ,chatact[chatnum[i]]->out,LEN_CHATACTOUT,K_EDIT|K_MSG)) - strcpy(chatact[chatnum[i]]->out,str); } -} - -void guru_cfg() -{ - static int guru_dflt,guru_bar,opt_dflt; - char str[81],code[9],done=0,*p; - int j,k; - uint i; - static guru_t savguru; - -while(1) { - for(i=0;i<total_gurus && i<MAX_OPTS;i++) - sprintf(opt[i],"%-25s",guru[i]->name); - opt[i][0]=0; - savnum=0; - j=WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT; - if(total_gurus) - j|=WIN_DEL|WIN_GET; - if(total_gurus<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savguru.name[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -Gurus: - -This is a list of the configured Gurus. - -To add a Guru, select the desired location with the arrow keys and -hit INS . - -To delete a Guru, select it with the arrow keys and hit DEL . - -To configure a Guru, select it with the arrow keys and hit ENTER . -*/ - i=ulist(j,0,0,45,&guru_dflt,&guru_bar,"Artificial Gurus",opt); - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Guru Name: - -This is the name of the selected Guru. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Guru Name",str,25 - ,0)<1) - continue; - sprintf(code,"%.8s",str); - p=strchr(code,SP); - if(p) *p=0; - strupr(code); - SETHELP(WHERE); -/* -Guru Internal Code: - -Every Guru must have its own unique code for Synchronet to refer to -it internally. This code is usually an abreviation of the Guru name. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Internal Code" - ,code,8,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; - continue; } - if((guru=(guru_t **)REALLOC(guru,sizeof(guru_t *)*(total_gurus+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_gurus+1); - total_gurus=0; - bail(1); - continue; } - if(total_gurus) - for(j=total_gurus;j>i;j--) - guru[j]=guru[j-1]; - if((guru[i]=(guru_t *)MALLOC(sizeof(guru_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(guru_t)); - continue; } - memset((guru_t *)guru[i],0,sizeof(guru_t)); - strcpy(guru[i]->name,str); - strcpy(guru[i]->code,code); - total_gurus++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(guru[i]); - total_gurus--; - for(j=i;j<total_gurus;j++) - guru[j]=guru[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savguru=*guru[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *guru[i]=savguru; - changes=1; - continue; } - j=0; - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%s","Guru Name",guru[i]->name); - sprintf(opt[k++],"%-27.27s%s","Guru Internal Code",guru[i]->code); - sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",guru[i]->ar); - opt[k][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Guru Configuration: - -This menu is for configuring the selected Guru. -*/ - switch(ulist(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,guru[i]->name - ,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Guru Name: - -This is the name of the selected Guru. -*/ - strcpy(str,guru[i]->name); - if(!uinput(WIN_MID|WIN_SAV,0,10,"Guru Name" - ,guru[i]->name,25,K_EDIT)) - strcpy(guru[i]->name,str); - break; - case 1: -SETHELP(WHERE); -/* -Guru Internal Code: - -Every Guru must have its own unique code for Synchronet to refer to -it internally. This code is usually an abreviation of the Guru name. -*/ - strcpy(str,guru[i]->code); - if(!uinput(WIN_MID|WIN_SAV,0,0,"Guru Internal Code" - ,str,8,K_EDIT|K_UPPER)) - break; - if(code_ok(str)) - strcpy(guru[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; - case 2: - savnum=2; - getar(guru[i]->name,guru[i]->ar); - break; } } } -} - -void actsets_cfg() -{ - static int actset_dflt,actset_bar,opt_dflt; - char str[81]; - int j,k,done; - uint i; - static actset_t savactset; - -while(1) { - for(i=0;i<total_actsets && i<MAX_OPTS;i++) - sprintf(opt[i],"%-25s",actset[i]->name); - opt[i][0]=0; - j=WIN_ACT|WIN_RHT|WIN_BOT|WIN_SAV; - savnum=0; - if(total_actsets) - j|=WIN_DEL|WIN_GET; - if(total_actsets<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savactset.name[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -Chat Action Sets: - -This is a list of the configured action sets. - -To add an action set, select the desired location with the arrow keys and -hit INS . - -To delete an action set, select it with the arrow keys and hit DEL . - -To configure an action set, select it with the arrow keys and hit ENTER . -*/ - i=ulist(j,0,0,45,&actset_dflt,&actset_bar,"Chat Action Sets",opt); - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Chat Action Set Name: - -This is the name of the selected chat action set. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Chat Action Set Name",str,25 - ,0)<1) - continue; - if((actset=(actset_t **)REALLOC(actset,sizeof(actset_t *)*(total_actsets+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_actsets+1); - total_actsets=0; - bail(1); - continue; } - if(total_actsets) - for(j=total_actsets;j>i;j--) - actset[j]=actset[j-1]; - if((actset[i]=(actset_t *)MALLOC(sizeof(actset_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(actset_t)); - continue; } - memset((actset_t *)actset[i],0,sizeof(actset_t)); - strcpy(actset[i]->name,str); - total_actsets++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(actset[i]); - total_actsets--; - for(j=i;j<total_actsets;j++) - actset[j]=actset[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savactset=*actset[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *actset[i]=savactset; - changes=1; - continue; } - j=0; - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%s","Action Set Name",actset[i]->name); - sprintf(opt[k++],"%-27.27s","Configure Chat Actions..."); - opt[k][0]=0; - SETHELP(WHERE); -/* -Chat Action Set Configuration: - -This menu is for configuring the selected chat action set. -*/ - sprintf(str,"%s Chat Action Set",actset[i]->name); - savnum=1; - switch(ulist(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&opt_dflt,0,str - ,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Chat Action Set Name: - -This is the name of the selected action set. -*/ - strcpy(str,actset[i]->name); - if(!uinput(WIN_MID|WIN_SAV,0,10,"Action Set Name" - ,actset[i]->name,25,K_EDIT)) - strcpy(actset[i]->name,str); - break; - case 1: - chatact_cfg(i); - break; } } } -} - diff --git a/src/sbbs2/scfg/scfgmdm.c b/src/sbbs2/scfg/scfgmdm.c deleted file mode 100644 index 08a91e08bc..0000000000 --- a/src/sbbs2/scfg/scfgmdm.c +++ /dev/null @@ -1,295 +0,0 @@ -/* SCFGMDM.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "scfg.h" - -int exec_mdm(char *fname); - -void mdm_cfg(int mdmnum) -{ - -FREE(mdm_result); -mdm_result=NULL; - -/* -strcpy(mdm_answ,"ATA"); -strcpy(mdm_hang,"ATH"); -strcpy(mdm_dial,"ATDT"); -strcpy(mdm_offh,"ATM0H1"); -strcpy(mdm_term,"ATE1V1"); -strcpy(mdm_init,"AT&FS0=0S2=128E0V0X4&C1&D2"); -*/ -mdm_answ[0]=0; -mdm_hang[0]=0; -mdm_dial[0]=0; -mdm_offh[0]=0; -mdm_term[0]=0; -mdm_init[0]=0; -mdm_spec[0]=0; -mdm_results=0; -mdm_misc=(MDM_RTS|MDM_CTS); - -exec_mdm(mdm_file[mdmnum]); - -} - -void cvttab(char *str) -{ - int i; - -for(i=0;str[i];i++) - if(str[i]==TAB) - str[i]=SP; -} - -int export_mdm(char *fname) -{ - char str[256]; - int file,i; - time_t now; - FILE *stream; - -sprintf(str,"%s%s.MDM",ctrl_dir,fname); -if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) - return(0); -if((stream=fdopen(file,"wb"))==NULL) { - close(file); - return(0); } - -now=time(NULL); -fprintf(stream,"# Exported from %s Node %u on %.24s\r\n\r\n" - ,sys_name,node_num,ctime(&now)); -fprintf(stream,"COM_RATE\t%ld\r\n",com_rate); -fprintf(stream,"INIT_STR\t%s\r\n",mdm_init); -fprintf(stream,"DIAL_STR\t%s\r\n",mdm_dial); -fprintf(stream,"HANGUP_STR\t%s\r\n",mdm_hang); -fprintf(stream,"ANSWER_STR\t%s\r\n",mdm_answ); -fprintf(stream,"OFFHOOK_STR\t%s\r\n",mdm_offh); -fprintf(stream,"SPEC_INIT\t%s\r\n",mdm_spec); -fprintf(stream,"TERM_INIT\t%s\r\n",mdm_term); -fprintf(stream,"LOCKED_RATE\t%s\r\n",(mdm_misc&MDM_STAYHIGH) ? "YES":"NO"); -fprintf(stream,"CALLER_ID\t%s\r\n",(mdm_misc&MDM_CALLERID) ? "YES":"NO"); -fprintf(stream,"DROP_DTR\t%s\r\n",(mdm_misc&MDM_NODTR) ? "NO":"YES"); -fprintf(stream,"FLOW_CONTROL\t%s\r\n" - ,(mdm_misc&(MDM_RTS|MDM_CTS)==(MDM_RTS|MDM_CTS)) ? "BOTH": - (mdm_misc&MDM_CTS) ? "TRANSMIT" : (mdm_misc&MDM_RTS) ? "RECEIVE" : "NONE"); -for(i=0;i<mdm_results;i++) - fprintf(stream,"RESULT\t\t%u\t%u\t%u\t%s\r\n",mdm_result[i].code - ,mdm_result[i].cps,mdm_result[i].rate,mdm_result[i].str); - -fclose(stream); - -return(1); -} - -int exec_mdm(char *fname) -{ - char str[256],msg[128],*p; - int file,i,j; - FILE *stream; - -sprintf(str,"%s%s.MDM",ctrl_dir,fname); - -if((file=open(str,O_RDONLY|O_BINARY|O_DENYALL))==-1) - return(0); -if((stream=fdopen(file,"rb"))==NULL) { - close(file); - return(0); } - -while(!feof(stream)) { - if(!fgets(str,255,stream)) - break; - cvttab(str); - truncsp(str); - p=str; - while(*p && *p<=SP) /* look for beginning of command */ - p++; - if(!*p) - continue; - if(*p=='#') /* remarks start with # */ - continue; - - if(!strnicmp(p,"COM_RATE",8)) { - p+=8; - while(*p==SP) p++; - com_rate=atol(p); - continue; } - - if(!strnicmp(p,"INIT_STR",8)) { - p+=8; - while(*p==SP) p++; - sprintf(mdm_init,"%.63s",p); - continue; } - - if(!strnicmp(p,"DIAL_STR",8)) { - p+=8; - while(*p==SP) p++; - sprintf(mdm_dial,"%.63s",p); - continue; } - - if(!strnicmp(p,"HANGUP_STR",10)) { - p+=10; - while(*p==SP) p++; - sprintf(mdm_hang,"%.63s",p); - continue; } - - if(!strnicmp(p,"ANSWER_STR",10)) { - p+=10; - while(*p==SP) p++; - sprintf(mdm_answ,"%.63s",p); - continue; } - - if(!strnicmp(p,"OFFHOOK_STR",11)) { - p+=11; - while(*p==SP) p++; - sprintf(mdm_offh,"%.63s",p); - continue; } - - if(!strnicmp(p,"SPEC_INIT",9)) { - p+=9; - while(*p==SP) p++; - sprintf(mdm_spec,"%.63s",p); - continue; } - - if(!strnicmp(p,"TERM_INIT",9)) { - p+=9; - while(*p==SP) p++; - sprintf(mdm_term,"%.63s",p); - continue; } - - if(!strnicmp(p,"LOCKED_RATE",11)) { - p+=11; - while(*p==SP) p++; - if(!stricmp(p,"OFF") || !stricmp(p,"NO")) - mdm_misc&=~MDM_STAYHIGH; - else - mdm_misc|=MDM_STAYHIGH; - continue; } - - if(!strnicmp(p,"CALLER_ID",9)) { - p+=9; - while(*p==SP) p++; - if(!stricmp(p,"YES") || !stricmp(p,"ON")) - mdm_misc|=MDM_CALLERID; - else - mdm_misc&=~MDM_CALLERID; - continue; } - - if(!strnicmp(p,"VERBAL_RESULTS",14)) { - p+=14; - while(*p==SP) p++; - if(!stricmp(p,"YES") || !stricmp(p,"ON")) - mdm_misc|=MDM_VERBAL; - else - mdm_misc&=~MDM_VERBAL; - continue; } - - if(!strnicmp(p,"DROP_DTR",8)) { - p+=8; - while(*p==SP) p++; - if(!stricmp(p,"OFF") || !stricmp(p,"NO")) - mdm_misc|=MDM_NODTR; - else - mdm_misc&=~MDM_NODTR; - continue; } - - if(!strnicmp(p,"FLOW_CONTROL",12)) { - p+=12; - while(*p==SP) p++; - mdm_misc&=~(MDM_RTS|MDM_CTS); - strupr(p); - if(strstr(p,"RTS") || strstr(p,"RECEIVE") || strstr(p,"RECV") - || strstr(p,"BOTH")) - mdm_misc|=MDM_RTS; - if(strstr(p,"CTS") || strstr(p,"TRANSMIT") || strstr(p,"SEND") - || strstr(p,"BOTH")) - mdm_misc|=MDM_CTS; - continue; } - - if(!strnicmp(p,"RESULT ",7)) { - p+=7; - while(*p==SP) p++; - i=atoi(p); - for(j=0;j<mdm_results;j++) - if(mdm_result[j].code==i) - break; - if(j>=mdm_results) { - if((mdm_result=(mdm_result_t *)REALLOC( - mdm_result,sizeof(mdm_result_t) - *(mdm_results+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,p,mdm_results+1); - mdm_results=0; - bail(1); - continue; } - mdm_results++; } - mdm_result[j].code=i; - while(*p!=SP) p++; - while(*p==SP) p++; - mdm_result[j].cps=atoi(p); - while(*p!=SP) p++; - while(*p==SP) p++; - mdm_result[j].rate=atoi(p); - while(*p!=SP) p++; - while(*p==SP) p++; - sprintf(mdm_result[j].str,"%.*s",LEN_MODEM,p); - continue; } - - if(!strnicmp(p,"INCLUDE ",8)) { - p+=8; - while(*p==SP) p++; - exec_mdm(p); - continue; } - - sprintf(msg,"ERROR: '%.15s' in %.8s.MDM",p,fname); - savnum--; - umsg(msg); - savnum++; } - -fclose(stream); -return(1); -} - - -void init_mdms() -{ - char str[128],fname[128]; - int file; - FILE *stream; - -mdm_types=0; -mdm_type=NULL; -mdm_file=NULL; -sprintf(str,"%sMDMS.IXT",ctrl_dir); -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -if((stream=fdopen(file,"rb"))==NULL) { - close(file); - errormsg(WHERE,ERR_FDOPEN,str,O_RDONLY); - return; } - -while(!feof(stream)) { - if(!fgets(str,120,stream)) - break; - truncsp(str); - if(!fgets(fname,120,stream)) - break; - truncsp(fname); - if((mdm_type=REALLOC(mdm_type,sizeof(char *)*(mdm_types+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,"Modem Type",sizeof(char *)*(mdm_types+1)); - break; } - if((mdm_file=REALLOC(mdm_file,sizeof(char *)*(mdm_types+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,"Modem File",sizeof(char *)*(mdm_types+1)); - break; } - if((mdm_type[mdm_types]=MALLOC(strlen(str)+1))==NULL) { - errormsg(WHERE,ERR_ALLOC,"Modem Typename",sizeof(char *)*(mdm_types+1)); - break; } - if((mdm_file[mdm_types]=MALLOC(9))==NULL) { - errormsg(WHERE,ERR_ALLOC,"Modem Filename",sizeof(char *)*(mdm_types+1)); - break; } - strcpy(mdm_type[mdm_types],str); - sprintf(mdm_file[mdm_types],"%.8s",fname); - mdm_types++; } -fclose(stream); -} diff --git a/src/sbbs2/scfg/scfgmsg.c b/src/sbbs2/scfg/scfgmsg.c deleted file mode 100644 index f090fc70cd..0000000000 --- a/src/sbbs2/scfg/scfgmsg.c +++ /dev/null @@ -1,1337 +0,0 @@ -#line 2 "SCFGMSG.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "scfg.h" - -/****************************************************************************/ -/* Converts when_t.zone into ASCII format */ -/****************************************************************************/ -char *zonestr(short zone) -{ - static char str[32]; - -switch((ushort)zone) { - case 0: return("UT"); - case AST: return("AST"); - case EST: return("EST"); - case CST: return("CST"); - case MST: return("MST"); - case PST: return("PST"); - case YST: return("YST"); - case HST: return("HST"); - case BST: return("BST"); - case ADT: return("ADT"); - case EDT: return("EDT"); - case CDT: return("CDT"); - case MDT: return("MDT"); - case PDT: return("PDT"); - case YDT: return("YDT"); - case HDT: return("HDT"); - case BDT: return("BDT"); - case MID: return("MID"); - case VAN: return("VAN"); - case EDM: return("EDM"); - case WIN: return("WIN"); - case BOG: return("BOG"); - case CAR: return("CAR"); - case RIO: return("RIO"); - case FER: return("FER"); - case AZO: return("AZO"); - case LON: return("LON"); - case BER: return("BER"); - case ATH: return("ATH"); - case MOS: return("MOS"); - case DUB: return("DUB"); - case KAB: return("KAB"); - case KAR: return("KAR"); - case BOM: return("BOM"); - case KAT: return("KAT"); - case DHA: return("DHA"); - case BAN: return("BAN"); - case HON: return("HON"); - case TOK: return("TOK"); - case SYD: return("SYD"); - case NOU: return("NOU"); - case WEL: return("WEL"); - } - -sprintf(str,"%02hd:%02hu",zone/60,zone<0 ? (-zone)%60 : zone%60); -return(str); -} - -char *utos(char *str) -{ - static char out[128]; - int i; - -for(i=0;str[i];i++) - if(str[i]=='_') - out[i]=SP; - else - out[i]=str[i]; -out[i]=0; -return(out); -} - -char *stou(char *str) -{ - static char out[128]; - int i; - -for(i=0;str[i];i++) - if(str[i]==SP) - out[i]='_'; - else - out[i]=str[i]; -out[i]=0; -return(out); -} - - - -void clearptrs(int subnum) -{ - char str[256]; - ushort idx,ch; - int last,file,i; - long l=0L; - struct ffblk ff; - -upop("Clearing Pointers..."); -sprintf(str,"%sUSER\\PTRS\\*.IXB",data_dir); -last=findfirst(str,&ff,0); -while(!last) { - if(ff.ff_fsize>=((long)sub[subnum]->ptridx+1L)*10L) { - sprintf(str,"%sUSER\\PTRS\\%s",data_dir,ff.ff_name); - if((file=nopen(str,O_WRONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY); - bail(1); } - while(filelength(file)<(long)(sub[subnum]->ptridx)*10) { - lseek(file,0L,SEEK_END); - idx=tell(file)/10; - for(i=0;i<total_subs;i++) - if(sub[i]->ptridx==idx) - break; - write(file,&l,4); - write(file,&l,4); - ch=0xff; /* default to scan ON for unknown sub */ - if(i<total_subs) { - if(!(sub[i]->misc&SUB_NSDEF)) - ch&=~5; - if(!(sub[i]->misc&SUB_SSDEF)) - ch&=~2; } - write(file,&ch,2); } - lseek(file,((long)sub[subnum]->ptridx)*10L,SEEK_SET); - write(file,&l,4); /* date set to null */ - write(file,&l,4); /* date set to null */ - ch=0xff; - if(!(sub[subnum]->misc&SUB_NSDEF)) - ch&=~5; - if(!(sub[subnum]->misc&SUB_SSDEF)) - ch&=~2; - write(file,&ch,2); - close(file); } - last=findnext(&ff); } -upop(0); -} - -void msgs_cfg() -{ - static int dflt,msgs_dflt,bar; - char str[256],str2[256],done=0,*p; - int j,k,q,s; - int i,file,ptridx,n; - long ported; - sub_t tmpsub; - static grp_t savgrp; - FILE *stream; - -while(1) { - for(i=0;i<total_grps && i<MAX_OPTS;i++) - sprintf(opt[i],"%-25s",grp[i]->lname); - opt[i][0]=0; - j=WIN_ORG|WIN_ACT|WIN_CHE; - if(total_grps) - j|=WIN_DEL|WIN_DELACT|WIN_GET; - if(total_grps<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savgrp.sname[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -Message Groups: - -This is a listing of message groups for your BBS. Message groups are -used to logically separate your message sub-boards into groups. Every -sub-board belongs to a message group. You must have at least one message -group and one sub-board configured. - -One popular use for message groups is to separate local sub-boards and -networked sub-boards. One might have a Local message group that contains -non-networked sub-boards of various topics and also have a FidoNet -message group that contains sub-boards that are echoed across FidoNet. -Some sysops separate sub-boards into more specific areas such as Main, -Technical, or Adult. If you have many sub-boards that have a common -subject denominator, you may want to have a separate message group for -those sub-boards for a more organized message structure. -*/ - i=ulist(j,0,0,45,&msgs_dflt,&bar,"Message Groups",opt); - savnum=0; - if(i==-1) { - j=save_changes(WIN_MID); - if(j==-1) - continue; - if(!j) - write_msgs_cfg(); - return; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Group Long Name: - -This is a description of the message group which is displayed when a -user of the system uses the /* command from the main menu. -*/*/ - strcpy(str,"Main"); - if(uinput(WIN_MID|WIN_SAV,0,0,"Group Long Name",str,LEN_GLNAME - ,K_EDIT)<1) - continue; - SETHELP(WHERE); -/* -Group Short Name: - -This is a short description of the message group which is used for the -main menu and reading message prompts. -*/ - sprintf(str2,"%.*s",LEN_GSNAME,str); - if(uinput(WIN_MID,0,0,"Group Short Name",str2,LEN_GSNAME,K_EDIT)<1) - continue; - if((grp=(grp_t **)REALLOC(grp,sizeof(grp_t *)*(total_grps+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_grps+1); - total_grps=0; - bail(1); - continue; } - - if(total_grps) { /* was total_subs (?) */ - for(j=total_grps;j>i;j--) /* insert above */ - grp[j]=grp[j-1]; - for(j=0;j<total_subs;j++) /* move sub group numbers */ - if(sub[j]->grp>=i) - sub[j]->grp++; } - - if((grp[i]=(grp_t *)MALLOC(sizeof(grp_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(grp_t)); - continue; } - memset((grp_t *)grp[i],0,sizeof(grp_t)); - strcpy(grp[i]->lname,str); - strcpy(grp[i]->sname,str2); - total_grps++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Delete All Data in Group: - -If you wish to delete the messages in all the sub-boards in this group, -select Yes. -*/ - j=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0,"Delete All Data in Group",opt); - if(j==-1) - continue; - if(j==0) - for(j=0;j<total_subs;j++) - if(sub[j]->grp==i) { - sprintf(str,"%s.s*",sub[j]->code); - if(!sub[j]->data_dir[0]) - sprintf(tmp,"%sSUBS\\",data_dir); - else - strcpy(tmp,sub[j]->data_dir); - delfiles(tmp,str); - clearptrs(j); } - FREE(grp[i]); - for(j=0;j<total_subs;) { - if(sub[j]->grp==i) { /* delete subs of this group */ - FREE(sub[j]); - total_subs--; - k=j; - while(k<total_subs) { /* move all subs down */ - sub[k]=sub[k+1]; - for(q=0;q<total_qhubs;q++) - for(s=0;s<qhub[q]->subs;s++) - if(qhub[q]->sub[s]==k) - qhub[q]->sub[s]--; - k++; } } - else j++; } - for(j=0;j<total_subs;j++) /* move sub group numbers down */ - if(sub[j]->grp>i) - sub[j]->grp--; - total_grps--; - while(i<total_grps) { - grp[i]=grp[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savgrp=*grp[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *grp[i]=savgrp; - changes=1; - continue; } - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-27.27s%s","Long Name",grp[i]->lname); - sprintf(opt[j++],"%-27.27s%s","Short Name",grp[i]->sname); - sprintf(opt[j++],"%-27.27s%.40s","Access Requirements" - ,grp[i]->ar); - strcpy(opt[j++],"Clone Options"); - strcpy(opt[j++],"Export Areas..."); - strcpy(opt[j++],"Import Areas..."); - strcpy(opt[j++],"Message Sub-boards..."); - opt[j][0]=0; - sprintf(str,"%s Group",grp[i]->sname); - savnum=0; - SETHELP(WHERE); -/* -Message Group Configuration: - -This menu allows you to configure the security requirements for access -to this message group. You can also add, delete, and configure the -sub-boards of this group by selecting the Messages Sub-boards... option. -*/ - switch(ulist(WIN_ACT,6,4,60,&dflt,0,str,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Group Long Name: - -This is a description of the message group which is displayed when a -user of the system uses the /* command from the main menu. -*/*/ - strcpy(str,grp[i]->lname); /* save incase setting to null */ - if(!uinput(WIN_MID|WIN_SAV,0,17,"Name to use for Listings" - ,grp[i]->lname,LEN_GLNAME,K_EDIT)) - strcpy(grp[i]->lname,str); - break; - case 1: - SETHELP(WHERE); -/* -Group Short Name: - -This is a short description of the message group which is used for -main menu and reading messages prompts. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts" - ,grp[i]->sname,LEN_GSNAME,K_EDIT); - break; - case 2: - sprintf(str,"%s Group",grp[i]->sname); - getar(str,grp[i]->ar); - break; - case 3: /* Clone Options */ - j=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Clone Sub-board Options: - -If you want to clone the options of the first sub-board of this group -into all sub-boards of this group, select Yes. - -The options cloned are posting requirements, reading requirements, -operator requirments, moderated user requirments, toggle options, -network options (including EchoMail origin line, EchoMail address, -and QWK Network tagline), maximum number of messages, maximum number -of CRCs, maximum age of messages, storage method, and data directory. -*/ - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Clone Options of First Sub-board into All of Group",opt); - if(j==0) { - k=-1; - for(j=0;j<total_subs;j++) - if(sub[j]->grp==i) { - if(k==-1) - k=j; - else { - changes=1; - sub[j]->misc=(sub[k]->misc|SUB_HDRMOD); - strcpy(sub[j]->post_ar,sub[k]->post_ar); - strcpy(sub[j]->read_ar,sub[k]->read_ar); - strcpy(sub[j]->op_ar,sub[k]->op_ar); - strcpy(sub[j]->mod_ar,sub[k]->mod_ar); - strcpy(sub[j]->origline,sub[k]->origline); - strcpy(sub[j]->tagline,sub[k]->tagline); - strcpy(sub[j]->data_dir,sub[k]->data_dir); - strcpy(sub[j]->echomail_sem - ,sub[k]->echomail_sem); - sub[j]->maxmsgs=sub[k]->maxmsgs; - sub[j]->maxcrcs=sub[k]->maxcrcs; - sub[j]->maxage=sub[k]->maxage; - - sub[j]->faddr=sub[k]->faddr; } } } - break; - case 4: - k=0; - ported=0; - q=changes; - strcpy(opt[k++],"SUBS.TXT (Synchronet)"); - strcpy(opt[k++],"AREAS.BBS (MSG)"); - strcpy(opt[k++],"AREAS.BBS (SMB)"); - strcpy(opt[k++],"AREAS.BBS (SBBSECHO)"); - strcpy(opt[k++],"FIDONET.NA (Fido)"); - opt[k][0]=0; - SETHELP(WHERE); -/* -Export Area File Format: - -This menu allows you to choose the format of the area file you wish to -export the current message group into. -*/ - k=0; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Export Area File Format",opt); - if(k==-1) - break; - if(k==0) - sprintf(str,"%sSUBS.TXT",ctrl_dir); - else if(k==1 || k==2) - sprintf(str,"AREAS.BBS"); - else if(k==3) - sprintf(str,"%sAREAS.BBS",data_dir); - else if(k==4) - sprintf(str,"FIDONET.NA"); - strupr(str); - if(k && k<4) - if(uinput(WIN_MID|WIN_SAV,0,0,"Uplinks" - ,str2,40,K_UPPER)<=0) { - changes=q; - break; } - if(uinput(WIN_MID|WIN_SAV,0,0,"Filename" - ,str,40,K_UPPER|K_EDIT)<=0) { - changes=q; - break; } - if(fexist(str)) { - strcpy(opt[0],"Overwrite"); - strcpy(opt[1],"Append"); - opt[2][0]=0; - j=0; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"File Exists",opt); - if(j==-1) - break; - if(j==0) j=O_WRONLY|O_TRUNC; - else j=O_WRONLY|O_APPEND; } - else - j=O_WRONLY|O_CREAT; - if((stream=fnopen(&file,str,j))==NULL) { - umsg("Open Failure"); - break; } - upop("Exporting Areas..."); - for(j=0;j<total_subs;j++) { - if(sub[j]->grp!=i) - continue; - ported++; - if(k==1) { /* AREAS.BBS *.MSG */ - if(!sub[j]->echopath[0]) - sprintf(str,"%s%s\\",echomail_dir,sub[j]->code); - else - strcpy(str,sub[j]->echopath); - fprintf(stream,"%-30s %-20s %s\r\n" - ,str,stou(sub[j]->sname),str2); - continue; } - if(k==2) { /* AREAS.BBS SMB */ - if(!sub[j]->data_dir[0]) - sprintf(str,"%sSUBS\\%s",data_dir,sub[j]->code); - else - sprintf(str,"%s%s",sub[j]->data_dir,sub[j]->code); - fprintf(stream,"%-30s %-20s %s\r\n" - ,str,stou(sub[j]->sname),str2); - continue; } - if(k==3) { /* AREAS.BBS SBBSECHO */ - fprintf(stream,"%-30s %-20s %s\r\n" - ,sub[j]->code,stou(sub[j]->sname),str2); - continue; } - if(k==4) { /* FIDONET.NA */ - fprintf(stream,"%-20s %s\r\n" - ,stou(sub[j]->sname),sub[j]->lname); - continue; } - fprintf(stream,"%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n" - "%s\r\n%s\r\n%s\r\n" - ,sub[j]->lname - ,sub[j]->sname - ,sub[j]->qwkname - ,sub[j]->code - ,sub[j]->data_dir - ,sub[j]->ar - ,sub[j]->read_ar - ,sub[j]->post_ar - ,sub[j]->op_ar - ); - fprintf(stream,"%lX\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n" - ,sub[j]->misc - ,sub[j]->tagline - ,sub[j]->origline - ,sub[j]->echomail_sem - ,sub[j]->echopath - ,faddrtoa(sub[j]->faddr) - ); - fprintf(stream,"%lu\r\n%lu\r\n%u\r\n%u\r\n%s\r\n" - ,sub[j]->maxmsgs - ,sub[j]->maxcrcs - ,sub[j]->maxage - ,sub[j]->ptridx - ,sub[j]->mod_ar - ); - fprintf(stream,"***END-OF-SUB***\r\n\r\n"); } - fclose(stream); - upop(0); - sprintf(str,"%lu Message Areas Exported Successfully",ported); - umsg(str); - changes=q; - break; - case 5: - ported=0; - k=0; - strcpy(opt[k++],"SUBS.TXT (Synchronet)"); - strcpy(opt[k++],"AREAS.BBS (MSG)"); - strcpy(opt[k++],"AREAS.BBS (SMB)"); - strcpy(opt[k++],"AREAS.BBS (SBBSECHO)"); - strcpy(opt[k++],"FIDONET.NA (Fido)"); - opt[k][0]=0; - SETHELP(WHERE); -/* -Import Area File Format: - -This menu allows you to choose the format of the area file you wish to -import into the current message group. -*/ - k=0; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Import Area File Format",opt); - if(k==-1) - break; - if(k==0) - sprintf(str,"%sSUBS.TXT",ctrl_dir); - else if(k==1 || k==2) - sprintf(str,"AREAS.BBS"); - else if(k==3) - sprintf(str,"%sAREAS.BBS",data_dir); - else if(k==4) - sprintf(str,"FIDONET.NA"); - strupr(str); - if(uinput(WIN_MID|WIN_SAV,0,0,"Filename" - ,str,40,K_UPPER|K_EDIT)<=0) - break; - if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - umsg("Open Failure"); - break; } - upop("Importing Areas..."); - while(!feof(stream)) { - if(!fgets(str,128,stream)) break; - truncsp(str); - if(!str[0]) - continue; - if(k) { - p=str; - while(*p && *p<=SP) p++; - if(!*p || *p==';') - continue; - memset(&tmpsub,0,sizeof(sub_t)); - tmpsub.misc|= - (SUB_FIDO|SUB_NAME|SUB_TOUSER|SUB_QUOTE|SUB_HYPER); - if(k==1) { /* AREAS.BBS *.MSG */ - p=strrchr(str,'\\'); - if(p) *p=0; - else p=str; - sprintf(tmpsub.echopath,"%.*s",LEN_DIR,str); - p++; - sprintf(tmpsub.code,"%.8s",p); - while(*p && *p<=SP) p++; - sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,p); - p=strchr(tmpsub.sname,SP); - if(p) *p=0; - strcpy(tmpsub.sname,utos(tmpsub.sname)); - sprintf(tmpsub.lname,"%.*s",LEN_SLNAME - ,tmpsub.sname); - sprintf(tmpsub.qwkname,"%.*s",10 - ,tmpsub.sname); - } - if(k==2) { /* AREAS.BBS SMB */ - p=strrchr(str,'\\'); - if(p) *p=0; - else p=str; - sprintf(tmpsub.data_dir,"%.*s",LEN_DIR,str); - p++; - sprintf(tmpsub.code,"%.8s",p); - while(*p && *p<=SP) p++; - sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,p); - p=strchr(tmpsub.sname,SP); - if(p) *p=0; - strcpy(tmpsub.sname,utos(tmpsub.sname)); - sprintf(tmpsub.lname,"%.*s",LEN_SLNAME - ,tmpsub.sname); - sprintf(tmpsub.qwkname,"%.*s",10 - ,tmpsub.sname); - } - else if(k==3) { /* AREAS.BBS SBBSECHO */ - p=str; - while(*p && *p>SP) p++; - *p=0; - sprintf(tmpsub.code,"%.8s",str); - p++; - while(*p && *p<=SP) p++; - sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,p); - p=strchr(tmpsub.sname,SP); - if(p) *p=0; - strcpy(tmpsub.sname,utos(tmpsub.sname)); - sprintf(tmpsub.lname,"%.*s",LEN_SLNAME - ,tmpsub.sname); - sprintf(tmpsub.qwkname,"%.*s",10 - ,tmpsub.sname); - } - else if(k==4) { /* FIDONET.NA */ - p=str; - while(*p && *p>SP) p++; - *p=0; - sprintf(tmpsub.code,"%.8s",str); - sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,utos(str)); - sprintf(tmpsub.qwkname,"%.10s",tmpsub.sname); - p++; - while(*p && *p<=SP) p++; - sprintf(tmpsub.lname,"%.*s",LEN_SLNAME,p); - } - ported++; } - else { - memset(&tmpsub,0,sizeof(sub_t)); - tmpsub.grp=i; - sprintf(tmpsub.lname,"%.*s",LEN_SLNAME,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.sname,"%.*s",LEN_SSNAME,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.qwkname,"%.*s",10,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.code,"%.*s",8,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.data_dir,"%.*s",LEN_DIR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.ar,"%.*s",LEN_ARSTR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.read_ar,"%.*s",LEN_ARSTR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.post_ar,"%.*s",LEN_ARSTR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.op_ar,"%.*s",LEN_ARSTR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpsub.misc=ahtoul(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.tagline,"%.*s",80,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.origline,"%.*s",50,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.echomail_sem,"%.*s",LEN_DIR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.echopath,"%.*s",LEN_DIR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpsub.faddr=atofaddr(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpsub.maxmsgs=atol(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpsub.maxcrcs=atol(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpsub.maxage=atoi(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpsub.ptridx=atoi(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpsub.mod_ar,"%.*s",LEN_ARSTR,str); - - ported++; - while(!feof(stream) - && strcmp(str,"***END-OF-SUB***")) { - if(!fgets(str,128,stream)) break; - truncsp(str); } } - - truncsp(tmpsub.code); - truncsp(tmpsub.sname); - truncsp(tmpsub.lname); - truncsp(tmpsub.qwkname); - for(j=0;j<total_subs;j++) { - if(sub[j]->grp!=i) - continue; - if(!stricmp(sub[j]->code,tmpsub.code)) - break; } - if(j==total_subs) { - - if((sub=(sub_t **)REALLOC(sub - ,sizeof(sub_t *)*(total_subs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_subs+1); - total_subs=0; - bail(1); - break; } - - for(ptridx=0;ptridx>-1;ptridx++) { - for(n=0;n<total_subs;n++) - if(sub[n]->ptridx==ptridx) - break; - if(n==total_subs) - break; } - - if((sub[j]=(sub_t *)MALLOC(sizeof(sub_t))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(sub_t)); - break; } - memset(sub[j],0,sizeof(sub_t)); } - if(!k) - memcpy(sub[j],&tmpsub,sizeof(sub_t)); - else { - sub[j]->grp=i; - if(total_faddrs) - sub[j]->faddr=faddr[0]; - strcpy(sub[j]->code,tmpsub.code); - strcpy(sub[j]->sname,tmpsub.sname); - strcpy(sub[j]->lname,tmpsub.lname); - strcpy(sub[j]->qwkname,tmpsub.qwkname); - strcpy(sub[j]->echopath,tmpsub.echopath); - strcpy(sub[j]->data_dir,tmpsub.data_dir); - if(j==total_subs) - sub[j]->maxmsgs=1000; - } - if(j==total_subs) { - sub[j]->ptridx=ptridx; - sub[j]->misc=tmpsub.misc; - total_subs++; } - changes=1; } - fclose(stream); - upop(0); - sprintf(str,"%lu Message Areas Imported Successfully",ported); - umsg(str); - break; - - case 6: - sub_cfg(i); - break; } } } - -} - -void msg_opts() -{ - char str[128],*p; - static int msg_dflt; - int i,j; - - while(1) { - i=0; - sprintf(opt[i++],"%-33.33s%s" - ,"BBS ID for QWK Packets",sys_id); - sprintf(opt[i++],"%-33.33s%s" - ,"Local Time Zone",zonestr(sys_timezone)); - sprintf(opt[i++],"%-33.33s%u seconds" - ,"Maximum Retry Time",smb_retry_time); - if(max_qwkmsgs) - sprintf(str,"%lu",max_qwkmsgs); - else - sprintf(str,"Unlimited"); - sprintf(opt[i++],"%-33.33s%s" - ,"Maximum QWK Messages",str); - sprintf(opt[i++],"%-33.33s%s","Pre-pack QWK Requirements",preqwk_ar); - if(mail_maxage) - sprintf(str,"Enabled (%u days old)",mail_maxage); - else - strcpy(str,"Disabled"); - sprintf(opt[i++],"%-33.33s%s","Purge E-mail by Age",str); - if(sys_misc&SM_DELEMAIL) - strcpy(str,"Immediately"); - else - strcpy(str,"Daily"); - sprintf(opt[i++],"%-33.33s%s","Purge Deleted E-mail",str); - if(mail_maxcrcs) - sprintf(str,"Enabled (%lu mail CRCs)",mail_maxcrcs); - else - strcpy(str,"Disabled"); - sprintf(opt[i++],"%-33.33s%s","Duplicate E-mail Checking",str); - sprintf(opt[i++],"%-33.33s%s","Allow Anonymous E-mail" - ,sys_misc&SM_ANON_EM ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Allow Quoting in E-mail" - ,sys_misc&SM_QUOTE_EM ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Allow Uploads in E-mail" - ,sys_misc&SM_FILE_EM ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Allow Forwarding to NetMail" - ,sys_misc&SM_FWDTONET ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Kill Read E-mail" - ,sys_misc&SM_DELREADM ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Users Can View Deleted Messages" - ,sys_misc&SM_USRVDELM ? "Yes" : sys_misc&SM_SYSVDELM - ? "Sysops Only":"No"); - strcpy(opt[i++],"Extra Attribute Codes..."); - opt[i][0]=0; - savnum=0; - SETHELP(WHERE); -/* -Message Options: - -This is a menu of system-wide message related options. Messages include -E-mail and public posts (on sub-boards). -*/ - - switch(ulist(WIN_ORG|WIN_ACT|WIN_MID|WIN_CHE,0,0,72,&msg_dflt,0 - ,"Message Options",opt)) { - case -1: - i=save_changes(WIN_MID); - if(i==-1) - continue; - if(!i) { - write_msgs_cfg(); - write_main_cfg(); } - return; - case 0: - strcpy(str,sys_id); - SETHELP(WHERE); -/* -BBS ID for QWK Packets: - -This is a short system ID for your BBS that is used for QWK packets. -It should be an abbreviation of your BBS name or other related string. -This ID will be used for your outgoing and incoming QWK packets. If -you plan on networking via QWK packets with another Synchronet BBS, -this ID should not begin with a number. The maximum length of the ID -is eight characters and cannot contain spaces or other invalid DOS -filename characters. In a QWK packet network, each system must have -a unique QWK system ID. -*/ - - uinput(WIN_MID|WIN_SAV,0,0,"BBS ID for QWK Packets" - ,str,8,K_EDIT|K_UPPER); - if(code_ok(str)) - strcpy(sys_id,str); - else - umsg("Invalid ID"); - break; - case 1: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -United States Time Zone: - -If your local time zone is the United States, select Yes. -*/ - - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"United States Time Zone",opt); - if(i==-1) - break; - if(i==0) { - strcpy(opt[i++],"Atlantic"); - strcpy(opt[i++],"Eastern"); - strcpy(opt[i++],"Central"); - strcpy(opt[i++],"Mountain"); - strcpy(opt[i++],"Pacific"); - strcpy(opt[i++],"Yukon"); - strcpy(opt[i++],"Hawaii/Alaska"); - strcpy(opt[i++],"Bering"); - opt[i][0]=0; - i=0; - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Time Zone",opt); - if(i==-1) - break; - changes=1; - switch(i) { - case 0: - sys_timezone=AST; - break; - case 1: - sys_timezone=EST; - break; - case 2: - sys_timezone=CST; - break; - case 3: - sys_timezone=MST; - break; - case 4: - sys_timezone=PST; - break; - case 5: - sys_timezone=YST; - break; - case 6: - sys_timezone=HST; - break; - case 7: - sys_timezone=BST; - break; } - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Daylight Savings",opt); - if(i==-1) - break; - if(!i) - sys_timezone|=DAYLIGHT; - break; } - i=0; - strcpy(opt[i++],"Midway"); - strcpy(opt[i++],"Vancouver"); - strcpy(opt[i++],"Edmonton"); - strcpy(opt[i++],"Winnipeg"); - strcpy(opt[i++],"Bogota"); - strcpy(opt[i++],"Caracas"); - strcpy(opt[i++],"Rio de Janeiro"); - strcpy(opt[i++],"Fernando de Noronha"); - strcpy(opt[i++],"Azores"); - strcpy(opt[i++],"London"); - strcpy(opt[i++],"Berlin"); - strcpy(opt[i++],"Athens"); - strcpy(opt[i++],"Moscow"); - strcpy(opt[i++],"Dubai"); - strcpy(opt[i++],"Kabul"); - strcpy(opt[i++],"Karachi"); - strcpy(opt[i++],"Bombay"); - strcpy(opt[i++],"Kathmandu"); - strcpy(opt[i++],"Dhaka"); - strcpy(opt[i++],"Bangkok"); - strcpy(opt[i++],"Hong Kong"); - strcpy(opt[i++],"Tokyo"); - strcpy(opt[i++],"Sydney"); - strcpy(opt[i++],"Noumea"); - strcpy(opt[i++],"Wellington"); - strcpy(opt[i++],"Other..."); - opt[i][0]=0; - i=0; - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Time Zone",opt); - if(i==-1) - break; - changes=1; - switch(i) { - case 0: - sys_timezone=MID; - break; - case 1: - sys_timezone=VAN; - break; - case 2: - sys_timezone=EDM; - break; - case 3: - sys_timezone=WIN; - break; - case 4: - sys_timezone=BOG; - break; - case 5: - sys_timezone=CAR; - break; - case 6: - sys_timezone=RIO; - break; - case 7: - sys_timezone=FER; - break; - case 8: - sys_timezone=AZO; - break; - case 9: - sys_timezone=LON; - break; - case 10: - sys_timezone=BER; - break; - case 11: - sys_timezone=ATH; - break; - case 12: - sys_timezone=MOS; - break; - case 13: - sys_timezone=DUB; - break; - case 14: - sys_timezone=KAB; - break; - case 15: - sys_timezone=KAR; - break; - case 16: - sys_timezone=BOM; - break; - case 17: - sys_timezone=KAT; - break; - case 18: - sys_timezone=DHA; - break; - case 19: - sys_timezone=BAN; - break; - case 20: - sys_timezone=HON; - break; - case 21: - sys_timezone=TOK; - break; - case 22: - sys_timezone=SYD; - break; - case 23: - sys_timezone=NOU; - break; - case 24: - sys_timezone=WEL; - break; - default: - if(sys_timezone>720 || sys_timezone<-720) - sys_timezone=0; - sprintf(str,"%02d:%02d" - ,sys_timezone/60,sys_timezone<0 - ? (-sys_timezone)%60 : sys_timezone%60); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Time (HH:MM) East (+) or West (-) of Universal " - "Time" - ,str,6,K_EDIT|K_UPPER); - sys_timezone=atoi(str)*60; - p=strchr(str,':'); - if(p) { - if(sys_timezone<0) - sys_timezone-=atoi(p+1); - else - sys_timezone+=atoi(p+1); } - break; - } - break; - case 2: - SETHELP(WHERE); -/* -Maximum Message Base Retry Time: - -This is the maximum number of seconds to allow while attempting to open -or lock a message base (a value in the range of 10 to 45 seconds should -be fine). -*/ - itoa(smb_retry_time,str,10); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Maximum Message Base Retry Time (in seconds)" - ,str,2,K_NUMBER|K_EDIT); - smb_retry_time=atoi(str); - break; - case 3: - SETHELP(WHERE); -/* -Maximum Messages Per QWK Packet: - -This is the maximum number of messages (excluding E-mail), that a user -can have in one QWK packet for download. This limit does not effect -QWK network nodes (Q restriction). If set to 0, no limit is imposed. -*/ - - ultoa(max_qwkmsgs,str,10); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Maximum Messages Per QWK Packet (0=No Limit)" - ,str,6,K_NUMBER|K_EDIT); - max_qwkmsgs=atol(str); - break; - case 4: - SETHELP(WHERE); -/* -Pre-pack QWK Requirements: - -ALL user accounts on the BBS meeting this requirmenet will have a QWK -packet automatically created for them every day after midnight -(during the internal daily event). - -This is mainly intended for QWK network nodes that wish to save connect -time by having their packets pre-packed. If a large number of users meet -this requirement, it can take up a large amount of disk space on your -system (in the DATA\FILE directory). -*/ - getar("Pre-pack QWK (Use with caution!)",preqwk_ar); - break; - case 5: - sprintf(str,"%u",mail_maxage); - SETHELP(WHERE); -/* -Maximum Age of Mail: - -This value is the maximum number of days that mail will be kept. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Maximum Age of Mail " - "(in days)",str,5,K_EDIT|K_NUMBER); - mail_maxage=atoi(str); - break; - case 6: - strcpy(opt[0],"Daily"); - strcpy(opt[1],"Immediately"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Purge Deleted E-mail: - -If you wish to have deleted e-mail physically (and permanently) removed -from your e-mail database immediately after a users exits the reading -e-mail prompt, set this option to Immediately. - -For the best system performance and to avoid delays when deleting e-mail -from a large e-mail database, set this option to Daily (the default). -Your system maintenance will automatically purge deleted e-mail once a -day. -*/ - - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Purge Deleted E-mail",opt); - if(!i && sys_misc&SM_DELEMAIL) { - sys_misc&=~SM_DELEMAIL; - changes=1; } - else if(i==1 && !(sys_misc&SM_DELEMAIL)) { - sys_misc|=SM_DELEMAIL; - changes=1; } - break; - case 7: - sprintf(str,"%lu",mail_maxcrcs); - SETHELP(WHERE); -/* -Maximum Number of Mail CRCs: - -This value is the maximum number of CRCs that will be kept for duplicate -mail checking. Once this maximum number of CRCs is reached, the oldest -CRCs will be automatically purged. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Maximum Number of Mail " - "CRCs",str,5,K_EDIT|K_NUMBER); - mail_maxcrcs=atol(str); - break; - case 8: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - SETHELP(WHERE); -/* -Allow Anonymous E-mail: - -If you want users with the A exemption to be able to send E-mail -anonymously, set this option to Yes. -*/ - - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Anonymous E-mail",opt); - if(!i && !(sys_misc&SM_ANON_EM)) { - sys_misc|=SM_ANON_EM; - changes=1; } - else if(i==1 && sys_misc&SM_ANON_EM) { - sys_misc&=~SM_ANON_EM; - changes=1; } - break; - case 9: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Allow Quoting in E-mail: - -If you want your users to be allowed to use message quoting when -responding in E-mail, set this option to Yes. -*/ - - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Quoting in E-mail",opt); - if(!i && !(sys_misc&SM_QUOTE_EM)) { - sys_misc|=SM_QUOTE_EM; - changes=1; } - else if(i==1 && sys_misc&SM_QUOTE_EM) { - sys_misc&=~SM_QUOTE_EM; - changes=1; } - break; - case 10: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Allow File Attachment Uploads in E-mail: - -If you want your users to be allowed to attach an uploaded file to -an E-mail message, set this option to Yes. -*/ - - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow File Attachment Uploads in E-mail",opt); - if(!i && !(sys_misc&SM_FILE_EM)) { - sys_misc|=SM_FILE_EM; - changes=1; } - else if(i==1 && sys_misc&SM_FILE_EM) { - sys_misc&=~SM_FILE_EM; - changes=1; } - break; - case 11: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Allow Users to Have Their E-mail Forwarded to NetMail: - -If you want your users to be able to have any e-mail sent to them -optionally (at the sender's discretion) forwarded to a NetMail address, -set this option to Yes. -*/ - - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Forwarding of E-mail to NetMail",opt); - if(!i && !(sys_misc&SM_FWDTONET)) { - sys_misc|=SM_FWDTONET; - changes=1; } - else if(i==1 && sys_misc&SM_FWDTONET) { - sys_misc&=~SM_FWDTONET; - changes=1; } - break; - case 12: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - SETHELP(WHERE); -/* -Kill Read E-mail Automatically: - -If this option is set to Yes, e-mail that has been read will be -automatically deleted when message base maintenance is run. -*/ - - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Kill Read E-mail Automatically",opt); - if(!i && !(sys_misc&SM_DELREADM)) { - sys_misc|=SM_DELREADM; - changes=1; } - else if(i==1 && sys_misc&SM_DELREADM) { - sys_misc&=~SM_DELREADM; - changes=1; } - break; - case 13: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Sysops Only"); - opt[3][0]=0; - i=1; - SETHELP(WHERE); -/* -Users Can View Deleted Messages: - -If this option is set to Yes, then users will be able to view messages -they've sent and deleted or messages sent to them and they've deleted -with the option of un-deleting the message before the message is -physically purged from the e-mail database. - -If this option is set to No, then when a message is deleted, it is no -longer viewable (with SBBS) by anyone. - -If this option is set to Sysops Only, then only sysops and sub-ops (when -appropriate) can view deleted messages. -*/ - - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Users Can View Deleted Messages",opt); - if(!i && (sys_misc&(SM_USRVDELM|SM_SYSVDELM)) - !=(SM_USRVDELM|SM_SYSVDELM)) { - sys_misc|=(SM_USRVDELM|SM_SYSVDELM); - changes=1; } - else if(i==1 && sys_misc&(SM_USRVDELM|SM_SYSVDELM)) { - sys_misc&=~(SM_USRVDELM|SM_SYSVDELM); - changes=1; } - else if(i==2 && (sys_misc&(SM_USRVDELM|SM_SYSVDELM)) - !=SM_SYSVDELM) { - sys_misc|=SM_SYSVDELM; - sys_misc&=~SM_USRVDELM; - changes=1; } - break; - case 14: - SETHELP(WHERE); -/* -Extra Attribute Codes... - -Synchronet can suppport the native text attribute codes of other BBS -programs in messages (menus, posts, e-mail, etc.) To enable the extra -attribute codes for another BBS program, set the corresponding option -to Yes. -*/ - - j=0; - while(1) { - i=0; - sprintf(opt[i++],"%-15.15s %-3.3s","WWIV" - ,sys_misc&SM_WWIV ? "Yes":"No"); - sprintf(opt[i++],"%-15.15s %-3.3s","PCBoard" - ,sys_misc&SM_PCBOARD ? "Yes":"No"); - sprintf(opt[i++],"%-15.15s %-3.3s","Wildcat" - ,sys_misc&SM_WILDCAT ? "Yes":"No"); - sprintf(opt[i++],"%-15.15s %-3.3s","Celerity" - ,sys_misc&SM_CELERITY ? "Yes":"No"); - sprintf(opt[i++],"%-15.15s %-3.3s","Renegade" - ,sys_misc&SM_RENEGADE ? "Yes":"No"); - opt[i][0]=0; - j=ulist(WIN_BOT|WIN_RHT|WIN_SAV,2,2,0,&j,0 - ,"Extra Attribute Codes",opt); - if(j==-1) - break; - - changes=1; - switch(j) { - case 0: - sys_misc^=SM_WWIV; - break; - case 1: - sys_misc^=SM_PCBOARD; - break; - case 2: - sys_misc^=SM_WILDCAT; - break; - case 3: - sys_misc^=SM_CELERITY; - break; - case 4: - sys_misc^=SM_RENEGADE; - break; } } } } -} diff --git a/src/sbbs2/scfg/scfgnet.c b/src/sbbs2/scfg/scfgnet.c deleted file mode 100644 index d645ab7c9f..0000000000 --- a/src/sbbs2/scfg/scfgnet.c +++ /dev/null @@ -1,1457 +0,0 @@ -#line 2 "SCFGNET.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "scfg.h" - -char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; - -char *daystr(char days); - - -void qhub_edit(int num); -void phub_edit(int num); -char *daystr(char days); -void qhub_sub_edit(uint num); - -/****************************************************************************/ -/* Returns the FidoNet address kept in str as ASCII. */ -/****************************************************************************/ -faddr_t atofaddr(char *str) -{ - char *p; - faddr_t addr; - -addr.zone=addr.net=addr.node=addr.point=0; -if((p=strchr(str,':'))!=NULL) { - addr.zone=atoi(str); - addr.net=atoi(p+1); } -else { - if(total_faddrs) - addr.zone=faddr[0].zone; - else - addr.zone=1; - addr.net=atoi(str); } -if(!addr.zone) /* no such thing as zone 0 */ - addr.zone=1; -if((p=strchr(str,'/'))!=NULL) - addr.node=atoi(p+1); -else { - if(total_faddrs) - addr.net=faddr[0].net; - else - addr.net=1; - addr.node=atoi(str); } -if((p=strchr(str,'.'))!=NULL) - addr.point=atoi(p+1); -return(addr); -} - -/****************************************************************************/ -/* Returns an ASCII string for FidoNet address 'addr' */ -/****************************************************************************/ -char *faddrtoa(faddr_t addr) -{ - static char str[25]; - char point[25]; - -sprintf(str,"%u:%u/%u",addr.zone,addr.net,addr.node); -if(addr.point) { - sprintf(point,".%u",addr.point); - strcat(str,point); } -return(str); -} - - -uint getsub() -{ - static int grp_dflt,sub_dflt,grp_bar,sub_bar; - char str[81]; - int i,j,k; - uint subnum[MAX_OPTS+1]; - -while(1) { - for(i=0;i<total_grps && i<MAX_OPTS;i++) - sprintf(opt[i],"%-25s",grp[i]->lname); - opt[i][0]=0; - i=ulist(WIN_SAV|WIN_RHT|WIN_BOT,0,0,45,&grp_dflt,&grp_bar - ,"Message Groups" - ,opt); - if(i==-1) - return(-1); - for(j=k=0;j<total_subs && k<MAX_OPTS;j++) - if(sub[j]->grp==i) { - sprintf(opt[k],"%-25s",sub[j]->lname); - subnum[k++]=j; } - opt[k][0]=0; - sprintf(str,"%s Sub-boards",grp[i]->sname); - j=ulist(WIN_RHT|WIN_BOT|WIN_SAV,0,0,45,&sub_dflt,&sub_bar,str,opt); - if(j==-1) - continue; - return(subnum[j]); } - -} - -void net_cfg() -{ - static int net_dflt,qnet_dflt,pnet_dflt,fnet_dflt,inet_dflt - ,qhub_dflt,phub_dflt; - char str[81],done,*p; - int i,j,k,l,m,n; - -while(1) { - i=0; - strcpy(opt[i++],"QWK Packet Networks"); - strcpy(opt[i++],"FidoNet EchoMail and NetMail"); - strcpy(opt[i++],"PostLink Networks"); - strcpy(opt[i++],"Internet NetMail"); - opt[i][0]=0; - SETHELP(WHERE); -/* -Configure Networks: - -This is the network configuration menu. Select the type of network -technology that you want to configure. -*/ - i=ulist(WIN_ORG|WIN_ACT|WIN_CHE,0,0,0,&net_dflt,0,"Networks",opt); - if(i==0) { /* QWK net stuff */ - done=0; - while(!done) { - i=0; - strcpy(opt[i++],"Network Hubs..."); - strcpy(opt[i++],"Default Tagline"); - opt[i][0]=0; - SETHELP(WHERE); -/* -QWK Packet Networks: - -From this menu you can configure the default tagline to use for -outgoing messages on QWK networked sub-boards, or you can select -Network Hubs... to add, delete, or configure QWK hubs that your system -calls to exchange packets with. -*/ - i=ulist(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&qnet_dflt,0 - ,"QWK Packet Networks",opt); - savnum=0; - switch(i) { - case -1: /* ESC */ - done=1; - break; - case 1: - SETHELP(WHERE); -/* -QWK Network Default Tagline: - -This is the default tagline to use for outgoing messages on QWK -networked sub-boards. This default can be overridden on a per sub-board -basis with the sub-board configuration Network Options.... -*/ - uinput(WIN_MID|WIN_SAV,0,0,nulstr - ,qnet_tagline,63,K_MSG|K_EDIT); - break; - case 0: - while(1) { - for(i=0;i<total_qhubs && i<MAX_OPTS;i++) - sprintf(opt[i],"%-8.8s",qhub[i]->id); - opt[i][0]=0; - i=WIN_ACT|WIN_RHT|WIN_SAV; - if(total_qhubs<MAX_OPTS) - i|=WIN_INS|WIN_INSACT|WIN_XTR; - if(total_qhubs) - i|=WIN_DEL; - savnum=0; - SETHELP(WHERE); -/* -QWK Network Hubs: - -This is a list of QWK network hubs that your system calls to exchange -packets with. - -To add a hub, select the desired location with the arrow keys and hit - INS . - -To delete a hub, select it and hit DEL . - -To configure a hub, select it and hit ENTER . -*/ - i=ulist(i,0,0,0,&qhub_dflt,0 - ,"QWK Network Hubs",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - if((qhub=(qhub_t **)REALLOC(qhub - ,sizeof(qhub_t *)*(total_qhubs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr - ,sizeof(qhub_t *)*(total_qhubs+1)); - total_qhubs=0; - bail(1); - continue; } - - savnum=1; - SETHELP(WHERE); -/* -QWK Network Hub System ID: - -This is the QWK System ID of this hub. It is used for incoming and -outgoing network packets and must be accurate. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"System ID",str,8,K_UPPER)<1) - continue; - - for(j=total_qhubs;j>i;j--) - qhub[j]=qhub[j-1]; - if((qhub[i]=(qhub_t *)MALLOC(sizeof(qhub_t))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr - ,sizeof(qhub_t)); - continue; } - memset(qhub[i],0,sizeof(qhub_t)); - strcpy(qhub[i]->id,str); - strcpy(qhub[i]->pack,"%!pkzip %f %s"); - strcpy(qhub[i]->unpack,"%!pkunzip -o %f %g %s"); - strcpy(qhub[i]->call,"%!qnet"); - qhub[i]->node=1; - qhub[i]->days=0xff; /* all days */ - total_qhubs++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(qhub[i]->mode); - FREE(qhub[i]->conf); - FREE(qhub[i]->sub); - FREE(qhub[i]); - total_qhubs--; - while(i<total_qhubs) { - qhub[i]=qhub[i+1]; - i++; } - changes=1; - continue; } - qhub_edit(i); } - break; } } } - - else if(i==1) { /* FidoNet Stuff */ - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s" - ,"System Addresses",total_faddrs ? faddrtoa(faddr[0]) - : nulstr); - sprintf(opt[i++],"%-27.27s%s" - ,"Default Outbound Address" - ,dflt_faddr.zone ? faddrtoa(dflt_faddr) : "No"); - sprintf(opt[i++],"%-27.27s" - ,"Default Origin Line"); - sprintf(opt[i++],"%-27.27s%.40s" - ,"NetMail Semaphore",netmail_sem); - sprintf(opt[i++],"%-27.27s%.40s" - ,"EchoMail Semaphore",echomail_sem); - sprintf(opt[i++],"%-27.27s%.40s" - ,"Inbound File Directory",fidofile_dir); - sprintf(opt[i++],"%-27.27s%.40s" - ,"EchoMail Base Directory",echomail_dir); - sprintf(opt[i++],"%-27.27s%.40s" - ,"NetMail Directory",netmail_dir); - sprintf(opt[i++],"%-27.27s%s" - ,"Allow Sending of NetMail" - ,netmail_misc&NMAIL_ALLOW ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Allow File Attachments" - ,netmail_misc&NMAIL_FILE ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Send NetMail Using Alias" - ,netmail_misc&NMAIL_ALIAS ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"NetMail Defaults to Crash" - ,netmail_misc&NMAIL_CRASH ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"NetMail Defaults to Direct" - ,netmail_misc&NMAIL_DIRECT ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"NetMail Defaults to Hold" - ,netmail_misc&NMAIL_HOLD ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Kill NetMail After Sent" - ,netmail_misc&NMAIL_KILL ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%lu" - ,"Cost to Send NetMail",netmail_cost); - opt[i][0]=0; - SETHELP(WHERE); -/* -FidoNet EchoMail and NetMail: - -This menu contains configuration options that pertain specifically to -networking E-mail (NetMail) and sub-boards (EchoMail) through networks -using FidoNet technology. -*/ - i=ulist(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&fnet_dflt,0 - ,"FidoNet EchoMail and NetMail",opt); - savnum=0; - switch(i) { - case -1: /* ESC */ - done=1; - break; - case 0: - SETHELP(WHERE); -/* -System FidoNet Addresses: - -This is the FidoNet address of this system used to receive NetMail. -The Main address is also used as the default address for sub-boards. -Format: Zone:Net/Node[.Point] -*/ - k=l=0; - while(1) { - for(i=0;i<total_faddrs && i<MAX_OPTS;i++) { - if(i==0) - strcpy(str,"Main"); - else - sprintf(str,"AKA %u",i); - sprintf(opt[i],"%-8.8s %-16s" - ,str,faddrtoa(faddr[i])); } - opt[i][0]=0; - j=WIN_RHT|WIN_SAV|WIN_ACT|WIN_INSACT; - if(total_faddrs<MAX_OPTS) - j|=WIN_INS|WIN_XTR; - if(total_faddrs) - j|=WIN_DEL; - i=ulist(j,0,0,0,&k,&l - ,"System Addresses",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - - if(!total_faddrs) - strcpy(str,"1:1/0"); - else - strcpy(str,faddrtoa(faddr[0])); - if(!uinput(WIN_MID|WIN_SAV,0,0,"Address" - ,str,25,K_EDIT|K_UPPER)) - continue; - - if((faddr=(faddr_t *)REALLOC(faddr - ,sizeof(faddr_t)*(total_faddrs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr - ,sizeof(faddr_t)*total_faddrs+1); - total_faddrs=0; - bail(1); - continue; } - - for(j=total_faddrs;j>i;j--) - faddr[j]=faddr[j-1]; - - faddr[i]=atofaddr(str); - total_faddrs++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - total_faddrs--; - while(i<total_faddrs) { - faddr[i]=faddr[i+1]; - i++; } - changes=1; - continue; } - strcpy(str,faddrtoa(faddr[i])); - uinput(WIN_MID|WIN_SAV,0,0,"Address" - ,str,25,K_EDIT); - faddr[i]=atofaddr(str); } - break; - case 1: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Use Default Outbound NetMail Address: - -If you would like to have a default FidoNet address adding to outbound -NetMail mail messages that do not have an address specified, select -Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Use Default Outbound NetMail Address",opt); - if(i==1) { - if(dflt_faddr.zone) - changes=1; - dflt_faddr.zone=0; - break; } - if(i==-1) - break; - if(!dflt_faddr.zone) { - dflt_faddr.zone=1; - changes=1; } - strcpy(str,faddrtoa(dflt_faddr)); - SETHELP(WHERE); -/* -Default Outbound FidoNet NetMail Address: - -If you would like to automatically add a FidoNet address to outbound -NetMail that does not have an address specified, set this option -to that address. This is useful for Fido/UUCP gateway mail. -Format: Zone:Net/Node[.Point] -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Outbound Address" - ,str,25,K_EDIT)) { - dflt_faddr=atofaddr(str); - changes=1; } - break; - case 2: - SETHELP(WHERE); -/* -Default Origin Line: - -This is the default origin line used for sub-boards networked via -EchoMail. This origin line can be overridden on a per sub-board basis -with the sub-board configuration Network Options.... -*/ - uinput(WIN_MID|WIN_SAV,0,0,"* Origin" - ,origline,50,K_EDIT); - break; - case 3: - SETHELP(WHERE); -/* -NetMail Semaphore File: - -This is a filename that will be used as a semaphore (signal) to your -FidoNet front-end that new NetMail has been created and the messages -should be re-scanned. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"NetMail Semaphore" - ,netmail_sem,50,K_EDIT|K_UPPER); - break; - case 4: - SETHELP(WHERE); -/* -EchoMail Semaphore File: - -This is a filename that will be used as a semaphore (signal) to your -FidoNet front-end that new EchoMail has been created and the messages -should be re-scanned. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"EchoMail Semaphore" - ,echomail_sem,50,K_EDIT|K_UPPER); - break; - case 5: - SETHELP(WHERE); -/* -Inbound File Directory: - -This directory is where inbound files are placed. This directory is -only used when an incoming message has a file attached. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Inbound Files" - ,fidofile_dir,50,K_EDIT|K_UPPER); - break; - case 6: - SETHELP(WHERE); -/* -EchoMail Base Directory: - -This is an optional field used as a base directory for the location -of EchoMail messages for sub-boards that do not have a specified -EchoMail Storage Directory. If a sub-board does not have a specified -storage directory for EchoMail, its messages will be imported from and -exported to a sub-directory off of this base directory. The name of the -sub-directory is the same as the internal code for the sub-directory. - -If all EchoMail sub-boards have specified EchoMail storage directories, -this option is not used at all. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"EchoMail Base" - ,echomail_dir,50,K_EDIT|K_UPPER); - break; - case 7: - SETHELP(WHERE); -/* -NetMail Directory: - -This is the directory where NetMail will be imported from and exported -to. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"NetMail" - ,netmail_dir,50,K_EDIT|K_UPPER); - break; - case 8: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Allow Users to Send NetMail: - -If you are on a FidoNet style network and want your users to be allowed -to send NetMail, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Send NetMail",opt); - if(!i && !(netmail_misc&NMAIL_ALLOW)) { - changes=1; - netmail_misc|=NMAIL_ALLOW; } - else if(i==1 && netmail_misc&NMAIL_ALLOW) { - changes=1; - netmail_misc&=~NMAIL_ALLOW; } - break; - case 9: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Allow Users to Send NetMail File Attachments: - -If you are on a FidoNet style network and want your users to be allowed -to send NetMail file attachments, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Send NetMail File Attachments",opt); - if(!i && !(netmail_misc&NMAIL_FILE)) { - changes=1; - netmail_misc|=NMAIL_FILE; } - else if(i==1 && netmail_misc&NMAIL_FILE) { - changes=1; - netmail_misc&=~NMAIL_FILE; } - break; - case 10: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Use Aliases in NetMail: - -If you allow aliases on your system and wish users to have their NetMail -contain their alias as the From User, set this option to Yes. If you -want all NetMail to be sent using users' real names, set this option to -No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Use Aliases in NetMail",opt); - if(!i && !(netmail_misc&NMAIL_ALIAS)) { - changes=1; - netmail_misc|=NMAIL_ALIAS; } - else if(i==1 && netmail_misc&NMAIL_ALIAS) { - changes=1; - netmail_misc&=~NMAIL_ALIAS; } - break; - case 11: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -NetMail Defaults to Crash Status: - -If you want all NetMail to default to crash (send immediately) status, -set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"NetMail Defaults to Crash Status",opt); - if(!i && !(netmail_misc&NMAIL_CRASH)) { - changes=1; - netmail_misc|=NMAIL_CRASH; } - else if(i==1 && netmail_misc&NMAIL_CRASH) { - changes=1; - netmail_misc&=~NMAIL_CRASH; } - break; - case 12: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -NetMail Defaults to Direct Status: - -If you want all NetMail to default to direct (send directly) status, -set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"NetMail Defaults to Direct Status",opt); - if(!i && !(netmail_misc&NMAIL_DIRECT)) { - changes=1; - netmail_misc|=NMAIL_DIRECT; } - else if(i==1 && netmail_misc&NMAIL_DIRECT) { - changes=1; - netmail_misc&=~NMAIL_DIRECT; } - break; - case 13: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -NetMail Defaults to Hold Status: - -If you want all NetMail to default to hold status, set this option to -Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"NetMail Defaults to Hold Status",opt); - if(!i && !(netmail_misc&NMAIL_HOLD)) { - changes=1; - netmail_misc|=NMAIL_HOLD; } - else if(i==1 && netmail_misc&NMAIL_HOLD) { - changes=1; - netmail_misc&=~NMAIL_HOLD; } - break; - case 14: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Kill NetMail After it is Sent: - -If you want NetMail messages to be deleted after they are successfully -sent, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Kill NetMail After it is Sent",opt); - if(!i && !(netmail_misc&NMAIL_KILL)) { - changes=1; - netmail_misc|=NMAIL_KILL; } - else if(i==1 && netmail_misc&NMAIL_KILL) { - changes=1; - netmail_misc&=~NMAIL_KILL; } - break; - case 15: - ultoa(netmail_cost,str,10); - SETHELP(WHERE); -/* -Cost in Credits to Send NetMail: - -This is the number of credits it will cost your users to send NetMail. -If you want the sending of NetMail to be free, set this value to 0. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Cost in Credits to Send NetMail" - ,str,10,K_EDIT|K_NUMBER); - netmail_cost=atol(str); - break; } } } - else if(i==2) { - done=0; - while(!done) { - i=0; - strcpy(opt[i++],"Network Hubs..."); - sprintf(opt[i++],"%-20.20s%-12s","Site Name",sys_psname); - sprintf(opt[i++],"%-20.20s%-lu","Site Number",sys_psnum); - opt[i][0]=0; - SETHELP(WHERE); -/* -PostLink Networks: - -From this menu you can configure the default tagline to use for -outgoing messages on QWK networked sub-boards, or you can select -Network Hubs... to add, delete, or configure QWK hubs that your system -calls to exchange packets with. -*/ - i=ulist(WIN_ACT|WIN_RHT|WIN_BOT|WIN_CHE,0,0,0,&pnet_dflt,0 - ,"PostLink Networks",opt); - savnum=0; - switch(i) { - case -1: /* ESC */ - done=1; - break; - case 1: - SETHELP(WHERE); -/* -PostLink Site Name: - -If your system is networked via PostLink or PCRelay, this should be the -Site Name for your BBS. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Site Name" - ,sys_psname,12,K_UPPER|K_EDIT); - break; - case 2: - SETHELP(WHERE); -/* -PostLink Site Number: - -If your system is networked via PostLink or PCRelay, this should be the -Site Number for your BBS. -*/ - ultoa(sys_psnum,str,10); - uinput(WIN_MID|WIN_SAV,0,0,"Site Number" - ,str,10,K_NUMBER|K_EDIT); - sys_psnum=atol(str); - break; - case 0: - while(1) { - for(i=0;i<total_phubs && i<MAX_OPTS;i++) - sprintf(opt[i],"%-10.10s",phub[i]->name); - opt[i][0]=0; - i=WIN_ACT|WIN_RHT|WIN_SAV; - if(total_phubs<MAX_OPTS) - i|=WIN_INS|WIN_INSACT|WIN_XTR; - if(total_phubs) - i|=WIN_DEL; - savnum=0; - SETHELP(WHERE); -/* -PostLink Network Hubs: - -This is a list of PostLink and/or PCRelay network hubs that your system -calls to exchange packets with. - -To add a hub, select the desired location with the arrow keys and hit - INS . - -To delete a hub, select it and hit DEL . - -To configure a hub, select it and hit ENTER . -*/ - i=ulist(i,0,0,0,&phub_dflt,0 - ,"PostLink Hubs",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - if((phub=(phub_t **)REALLOC(phub - ,sizeof(phub_t *)*(total_phubs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr - ,sizeof(phub_t *)*(total_phubs+1)); - total_phubs=0; - bail(1); - continue; } - - savnum=1; - SETHELP(WHERE); -/* -Network Hub Site Name: - -This is the Site Name of this hub. It is used for only for reference. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Site Name",str,10,K_UPPER)<1) - continue; - - for(j=total_phubs;j>i;j--) - phub[j]=phub[j-1]; - - if((phub[i]=(phub_t *)MALLOC(sizeof(phub_t))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr - ,sizeof(phub_t)); - continue; } - memset(phub[i],0,sizeof(phub_t)); - strcpy(phub[i]->name,str); - strcpy(phub[i]->call,"%!pnet"); - phub[i]->node=1; - phub[i]->days=0xff; /* all days */ - total_phubs++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(phub[i]); - total_phubs--; - while(i<total_phubs) { - phub[i]=phub[i+1]; - i++; } - changes=1; - continue; } - phub_edit(i); } - break; } } } - - else if(i==3) { /* Internet */ - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s" - ,"System Address",sys_inetaddr); - sprintf(opt[i++],"%-27.27s%.40s" - ,"NetMail Semaphore",inetmail_sem); - sprintf(opt[i++],"%-27.27s%s" - ,"Allow Sending of NetMail" - ,inetmail_misc&NMAIL_ALLOW ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Allow File Attachments" - ,inetmail_misc&NMAIL_FILE ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Send NetMail Using Alias" - ,inetmail_misc&NMAIL_ALIAS ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%lu" - ,"Cost to Send NetMail",inetmail_cost); - opt[i][0]=0; - SETHELP(WHERE); -/* -Internet NetMail: - -This menu contains configuration options that pertain specifically to -Internet E-mail (NetMail). To utilize these options, you must own -a Synchronet compatible UUCP/Internet gateway (e.g. SyncUUCP). -*/ - i=ulist(WIN_ACT|WIN_MID|WIN_CHE,0,0,60,&inet_dflt,0 - ,"Internet NetMail",opt); - savnum=0; - switch(i) { - case -1: /* ESC */ - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Sytem Internet Address: - -If your system has an Internet mail feed, enter your system's Internet -address here (e.g. joesbbs.com). -*/ - uinput(WIN_MID|WIN_SAV,0,0,"" - ,sys_inetaddr,60,K_EDIT); - break; - case 1: - SETHELP(WHERE); -/* -Internet NetMail Semaphore File: - -This is a filename that will be used as a semaphore (signal) to your -Internet gateway (if supported) that new mail has been created and the -message base should be re-scanned. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Semaphore File" - ,inetmail_sem,50,K_EDIT|K_UPPER); - break; - - case 2: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Allow Users to Send Internet NetMail: - -If your system has an Internet uplink and you want your users to be -allowed to send Internet NetMail, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Send NetMail",opt); - if(!i && !(inetmail_misc&NMAIL_ALLOW)) { - changes=1; - inetmail_misc|=NMAIL_ALLOW; } - else if(i==1 && inetmail_misc&NMAIL_ALLOW) { - changes=1; - inetmail_misc&=~NMAIL_ALLOW; } - break; - - case 3: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Allow Users to Send Internet NetMail File Attachments: - -If your system has an Internet uplink and you want your users to be -allowed to send Internet NetMail file attachments, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Send NetMail File Attachments",opt); - if(!i && !(inetmail_misc&NMAIL_FILE)) { - changes=1; - inetmail_misc|=NMAIL_FILE; } - else if(i==1 && inetmail_misc&NMAIL_FILE) { - changes=1; - inetmail_misc&=~NMAIL_FILE; } - break; - case 4: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Use Aliases in NetMail: - -If you allow aliases on your system and wish users to have their NetMail -contain their alias as the From User, set this option to Yes. If you -want all NetMail to be sent using users' real names, set this option to -No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Use Aliases in NetMail",opt); - if(!i && !(inetmail_misc&NMAIL_ALIAS)) { - changes=1; - inetmail_misc|=NMAIL_ALIAS; } - else if(i==1 && inetmail_misc&NMAIL_ALIAS) { - changes=1; - inetmail_misc&=~NMAIL_ALIAS; } - break; - case 5: - ultoa(inetmail_cost,str,10); - SETHELP(WHERE); -/* -Cost in Credits to Send NetMail: - -This is the number of credits it will cost your users to send NetMail. -If you want the sending of NetMail to be free, set this value to 0. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Cost in Credits to Send NetMail" - ,str,10,K_EDIT|K_NUMBER); - inetmail_cost=atol(str); - break; } } } - - else { /* ESC */ - i=save_changes(WIN_MID|WIN_SAV); - if(i==-1) - continue; - if(!i) - write_msgs_cfg(); - break; } } -} - -void qhub_edit(int num) -{ - static int qhub_dflt; - char *p,done=0,str[256]; - int i,j,k,n; - -while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s","Hub System ID",qhub[num]->id); - sprintf(opt[i++],"%-27.27s%.40s","Pack Command Line",qhub[num]->pack); - sprintf(opt[i++],"%-27.27s%.40s","Unpack Command Line",qhub[num]->unpack); - sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",qhub[num]->call); - sprintf(opt[i++],"%-27.27s%u","Call-out Node",qhub[num]->node); - sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(qhub[num]->days)); - if(qhub[num]->freq) { - sprintf(str,"%u times a day",1440/qhub[num]->freq); - sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); } - else { - sprintf(str,"%2.2d:%2.2d",qhub[num]->time/60,qhub[num]->time%60); - sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); } - strcpy(opt[i++],"Networked Sub-boards..."); - opt[i][0]=0; - sprintf(str,"%s Network Hub",qhub[num]->id); - savnum=1; - SETHELP(WHERE); -/* -QWK Network Hub Configuration: - -This menu allows you to configure options specific to this QWK network -hub. -*/ - switch(ulist(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&qhub_dflt,0 - ,str,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -QWK Network Hub System ID: - -This is the QWK System ID of this hub. It is used for incoming and -outgoing network packets and must be accurate. -*/ - strcpy(str,qhub[num]->id); /* save */ - if(!uinput(WIN_MID|WIN_SAV,0,0,"QWK Network Hub System ID" - ,qhub[num]->id,8,K_UPPER|K_EDIT)) - strcpy(qhub[num]->id,str); - break; - case 1: - SETHELP(WHERE); -/* -REP Packet Creation Command: - -This is the command line to use to create (compress) REP packets for -this QWK network hub. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Packet Creation" - ,qhub[num]->pack,50,K_EDIT); - break; - case 2: - SETHELP(WHERE); -/* -QWK Packet Extraction Command: - -This is the command line to use to extract (decompress) QWK packets from -this QWK network hub. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Packet Extraction" - ,qhub[num]->unpack,50,K_EDIT); - break; - case 3: - SETHELP(WHERE); -/* -QWK Network Hub Call-out Command Line: - -This is the command line to use to initiate a call-out to this QWK -network hub. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Call-out Command" - ,qhub[num]->call,50,K_EDIT); - break; - case 4: - sprintf(str,"%u",qhub[num]->node); - SETHELP(WHERE); -/* -Node to Perform Call-out: - -This is the number of the node to perform the call-out for this QWK -network hub. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER); - qhub[num]->node=atoi(str); - break; - case 5: - j=0; - while(1) { - for(i=0;i<7;i++) - sprintf(opt[i],"%s %s" - ,wday[i],(qhub[num]->days&(1<<i)) ? "Yes":"No"); - opt[i][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Days to Perform Call-out: - -These are the days that a call-out will be performed for this QWK -network hub. -*/ - i=ulist(WIN_MID,0,0,0,&j,0 - ,"Days to Perform Call-out",opt); - if(i==-1) - break; - qhub[num]->days^=(1<<i); - changes=1; } - break; - case 6: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Perform Call-out at a Specific Time: - -If you want the system call this QWK network hub at a specific time, -set this option to Yes. If you want the system to call this network -hub more than once a day at predetermined intervals, set this option to -No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Perform Call-out at a Specific Time",opt); - if(i==0) { - sprintf(str,"%2.2d:%2.2d",qhub[num]->time/60 - ,qhub[num]->time%60); - SETHELP(WHERE); -/* -Time to Perform Call-out: - -This is the time (in 24 hour HH:MM format) to perform the call-out to -this QWK network hub. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Time to Perform Call-out (HH:MM)" - ,str,5,K_UPPER|K_EDIT)>0) { - qhub[num]->freq=0; - qhub[num]->time=atoi(str)*60; - if((p=strchr(str,':'))!=NULL) - qhub[num]->time+=atoi(p+1); } } - else if(i==1) { - sprintf(str,"%u",qhub[num]->freq - && qhub[num]->freq<=1440 ? 1440/qhub[num]->freq : 0); - SETHELP(WHERE); -/* -Number of Call-outs Per Day: - -This is the maximum number of times the system will perform a call-out -per day to this QWK network hub. This value is actually converted by -Synchronet into minutes between call-outs and when the BBS is idle -and this number of minutes since the last call-out is reached, it will -perform a call-out. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Number of Call-outs Per Day" - ,str,4,K_NUMBER|K_EDIT)>0) { - qhub[num]->time=0; - i=atoi(str); - if(i && i<=1440) - qhub[num]->freq=1440/i; - else - qhub[num]->freq=0; } } - break; - case 7: - qhub_sub_edit(num); - break; } } -} - -void qhub_sub_edit(uint num) -{ - char str[256]; - int i,j,k,l,m,n,bar=0; - -k=0; -while(1) { - for(j=0;j<qhub[num]->subs;j++) - sprintf(opt[j],"%-*.*s %-*.*s" - ,LEN_GSNAME,LEN_GSNAME - ,grp[sub[qhub[num]->sub[j]]->grp]->sname - ,LEN_SSNAME,LEN_SSNAME - ,sub[qhub[num]->sub[j]]->sname); - opt[j][0]=0; - savnum=2; - j=WIN_BOT|WIN_SAV|WIN_ACT; - if(qhub[num]->subs<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(qhub[num]->subs) - j|=WIN_DEL; - SETHELP(WHERE); -/* -QWK Networked Sub-boards: - -This is a list of the sub-boards that are networked with this QWK -network hub. - -To add a sub-board, select the desired location and hit INS . - -To remove a sub-board, select it and hit DEL . - -To configure a sub-board for this QWK network hub, select it and hit - ENTER . -*/ - j=ulist(j,0,0,0,&k,&bar - ,"Networked Sub-boards",opt); - if(j==-1) - break; - if((j&MSK_ON)==MSK_INS) { - j&=MSK_OFF; - savnum=3; - if((l=getsub())==-1) - continue; - savnum=3; - SETHELP(WHERE); -/* -Conference Number on Hub: - -This is the number of the conference on the QWK network hub, that this -sub-board is networked with. On Synchronet systems, this number is -derived by multiplying the group number by 10 and adding the sub-board -number. For example, group 2, sub-board 3, is conference number 203. - -It is important to understand that this is NOT the conference number of -this sub-board on your system. It is the number of the conference this -sub-board is networked with on this QWK network hub. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Conference Number on Hub" - ,str,5,K_NUMBER)<1) - continue; - strcpy(opt[0],"Strip out"); - strcpy(opt[1],"Leave in"); - strcpy(opt[2],"Expand to ANSI"); - opt[3][0]=0; - m=0; - SETHELP(WHERE); -/* -Ctrl-A Codes: - -You are being prompted for the method of handling Ctrl-A attribute codes -generated by Synchronet. If this QWK network hub is a Synchronet BBS, -set this option to Leave in. If the QWK network hub is not a Synchronet -BBS, but allows ANSI escape sequences in messages, set this option to -Expand to ANSI. If the QWK network hub is not a Synchronet BBS and does -not support ANSI escape sequences in messages (or you're not sure), set -this option to Strip out. -*/ - if((m=ulist(WIN_MID|WIN_SAV,0,0,0,&m,0 - ,"Ctrl-A Codes",opt))==-1) - continue; - if((qhub[num]->sub=(ushort *)REALLOC(qhub[num]->sub - ,sizeof(ushort *)*(qhub[num]->subs+1)))==NULL - || (qhub[num]->conf=(ushort *)REALLOC(qhub[num]->conf - ,sizeof(ushort *)*(qhub[num]->subs+1)))==NULL - || (qhub[num]->mode=(uchar *)REALLOC(qhub[num]->mode - ,sizeof(uchar *)*(qhub[num]->subs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,qhub[num]->subs+1); - continue; } - if(qhub[num]->subs) /* insert */ - for(n=qhub[num]->subs;n>j;n--) { - qhub[num]->sub[n]=qhub[num]->sub[n-1]; - qhub[num]->conf[n]=qhub[num]->conf[n-1]; - qhub[num]->mode[n]=qhub[num]->mode[n-1]; } - if(!m) - qhub[num]->mode[j]=A_STRIP; - else if(m==1) - qhub[num]->mode[j]=A_LEAVE; - else - qhub[num]->mode[j]=A_EXPAND; - qhub[num]->sub[j]=l; - qhub[num]->conf[j]=atoi(str); - qhub[num]->subs++; - changes=1; - continue; } - if((j&MSK_ON)==MSK_DEL) { - j&=MSK_OFF; - qhub[num]->subs--; - while(j<qhub[num]->subs) { - qhub[num]->sub[j]=qhub[num]->sub[j+1]; - qhub[num]->mode[j]=qhub[num]->mode[j+1]; - qhub[num]->conf[j]=qhub[num]->conf[j+1]; - j++; } - changes=1; - continue; } - l=0; - while(1) { - n=0; - sprintf(opt[n++],"%-22.22s%.*s %.*s" - ,"Sub-board" - ,LEN_GSNAME - ,grp[sub[qhub[num]->sub[j]]->grp]->sname - ,LEN_SSNAME - ,sub[qhub[num]->sub[j]]->sname); - sprintf(opt[n++],"%-22.22s%u" - ,"Conference Number",qhub[num]->conf[j]); - sprintf(opt[n++],"%-22.22s%s" - ,"Ctrl-A Codes",qhub[num]->mode[j]==A_STRIP ? - "Strip out" : qhub[num]->mode[j]==A_LEAVE ? - "Leave in" : "Expand to ANSI"); - opt[n][0]=0; - savnum=3; - SETHELP(WHERE); -/* -QWK Netted Sub-board: - -You are configuring the options for this sub-board for this QWK network -hub. -*/ - l=ulist(WIN_MID|WIN_SAV|WIN_ACT,0,0, - 22+LEN_GSNAME+LEN_SSNAME,&l,0 - ,"Netted Sub-board",opt); - if(l==-1) - break; - if(!l) { - savnum=4; - m=getsub(); - if(m!=-1) { - qhub[num]->sub[j]=m; - changes=1; } } - else if(l==1) { - savnum=4; - SETHELP(WHERE); -/* -Conference Number on Hub: - -This is the number of the conference on the QWK network hub, that this -sub-board is networked with. On Synchronet systems, this number is -derived by multiplying the group number by 10 and adding the sub-board -number. For example, group 2, sub-board 3, is conference number 203. - -It is important to understand that this is NOT the conference number of -this sub-board on your system. It is the number of the conference this -sub-board is networked with on this QWK network hub. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Conference Number on Hub" - ,str,5,K_NUMBER)>0) - qhub[num]->conf[j]=atoi(str); } - else if(l==2) { - strcpy(opt[0],"Strip out"); - strcpy(opt[1],"Leave in"); - strcpy(opt[2],"Expand to ANSI"); - opt[3][0]=0; - m=0; - savnum=4; - SETHELP(WHERE); -/* -Ctrl-A Codes: - -You are being prompted for the method of handling Ctrl-A attribute codes -generated by Synchronet. If this QWK network hub is a Synchronet BBS, -set this option to Leave in. If the QWK network hub is not a Synchronet -BBS, but allows ANSI escape sequences in messages, set this option to -Expand to ANSI. If the QWK network hub is not a Synchronet BBS and does -not support ANSI escape sequences in messages (or you're not sure), set -this option to Strip out. -*/ - m=ulist(WIN_MID|WIN_SAV,0,0,0,&m,0 - ,"Ctrl-A Codes",opt); - changes=1; - if(!m) - qhub[num]->mode[j]=A_STRIP; - else if(m==1) - qhub[num]->mode[j]=A_LEAVE; - else if(m==2) - qhub[num]->mode[j]=A_EXPAND; } } } -} - -void phub_edit(int num) -{ - static int phub_dflt; - char *p,done=0,str[256]; - int i,j,k,n; - -while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s","Hub Site Name",phub[num]->name); - sprintf(opt[i++],"%-27.27s%.40s","Call-out Command Line",phub[num]->call); - sprintf(opt[i++],"%-27.27s%u","Call-out Node",phub[num]->node); - sprintf(opt[i++],"%-27.27s%s","Call-out Days",daystr(phub[num]->days)); - if(phub[num]->freq) { - sprintf(str,"%u times a day",1440/phub[num]->freq); - sprintf(opt[i++],"%-27.27s%s","Call-out Frequency",str); } - else { - sprintf(str,"%2.2d:%2.2d",phub[num]->time/60 - ,phub[num]->time%60); - sprintf(opt[i++],"%-27.27s%s","Call-out Time",str); } - opt[i][0]=0; - sprintf(str,"%s Network Hub",phub[num]->name); - savnum=1; - SETHELP(WHERE); -/* -PostLink Network Hub Configuration: - -This menu allows you to configure options specific to this network hub. -*/ - switch(ulist(WIN_ACT|WIN_MID|WIN_SAV,0,0,0,&phub_dflt,0 - ,str,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Network Hub Site Name: - -This is the Site Name of this hub. It is used for only for reference. -*/ - strcpy(str,phub[num]->name); /* save */ - if(!uinput(WIN_MID|WIN_SAV,0,0,"Hub Site Name" - ,phub[num]->name,10,K_UPPER|K_EDIT)) - strcpy(phub[num]->name,str); /* restore */ - break; - case 1: - SETHELP(WHERE); -/* -Network Hub Call-out Command Line: - -This is the command line to use to initiate a call-out to this network -hub. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Call-out Command" - ,phub[num]->call,50,K_EDIT); - break; - case 2: - sprintf(str,"%u",phub[num]->node); - SETHELP(WHERE); -/* -Node to Perform Call-out: - -This is the number of the node to perform the call-out for this network -hub. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Node to Perform Call-out",str,3,K_EDIT|K_NUMBER); - phub[num]->node=atoi(str); - break; - case 3: - j=0; - while(1) { - for(i=0;i<7;i++) - sprintf(opt[i],"%s %s" - ,wday[i],(phub[num]->days&(1<<i)) ? "Yes":"No"); - opt[i][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Days to Perform Call-out: - -These are the days that a call-out will be performed for this network -hub. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Days to Perform Call-out",opt); - if(i==-1) - break; - phub[num]->days^=(1<<i); - changes=1; } - break; - case 4: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Perform Call-out at a Specific Time: - -If you want the system call this network hub at a specific time, set -this option to Yes. If you want the system to call this hub more than -once a day at predetermined intervals, set this option to No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Perform Call-out at a Specific Time",opt); - if(i==0) { - sprintf(str,"%2.2d:%2.2d",phub[num]->time/60 - ,phub[num]->time%60); - SETHELP(WHERE); -/* -Time to Perform Call-out: - -This is the time (in 24 hour HH:MM format) to perform the call-out to -this network hub. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Time to Perform Call-out (HH:MM)" - ,str,5,K_UPPER|K_EDIT)>0) { - phub[num]->freq=0; - phub[num]->time=atoi(str)*60; - if((p=strchr(str,':'))!=NULL) - phub[num]->time+=atoi(p+1); } } - else if(i==1) { - sprintf(str,"%u",phub[num]->freq - && phub[num]->freq<=1440 ? 1440/phub[num]->freq : 0); - SETHELP(WHERE); -/* -Number of Call-outs Per Day: - -This is the maximum number of times the system will perform a call-out -per day to this network hub. This value is actually converted by -Synchronet into minutes between call-outs and when the BBS is idle -and this number of minutes since the last call-out is reached, it will -perform a call-out. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Number of Call-outs Per Day" - ,str,4,K_NUMBER|K_EDIT)>0) { - phub[num]->time=0; - i=atoi(str); - if(i && i<=1440) - phub[num]->freq=1440/i; - else - phub[num]->freq=0; } } - break; } } -} - -char *daystr(char days) -{ - static char str[256]; - int i; - -str[0]=0; -for(i=0;i<7;i++) { - if(days&(1<<i)) - strcat(str,wday[i]); - else - strcat(str," "); - strcat(str," "); } -return(str); -} diff --git a/src/sbbs2/scfg/scfgnode.c b/src/sbbs2/scfg/scfgnode.c deleted file mode 100644 index ddb9155e85..0000000000 --- a/src/sbbs2/scfg/scfgnode.c +++ /dev/null @@ -1,2163 +0,0 @@ -#line 2 "SCFGNODE.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/****************************************************************************/ -/* Synchronet configuration utility */ -/****************************************************************************/ - -#include "scfg.h" -#include "spawno.h" - -int com_type() -{ - int i; - -i=0; -strcpy(opt[0],"UART"); -strcpy(opt[1],"FOSSIL Int 14h"); -strcpy(opt[2],"PC BIOS Int 14h"); -strcpy(opt[3],"PS/2 BIOS Int 14h"); -strcpy(opt[4],"DigiBoard Int 14h"); -opt[5][0]=0; -SETHELP(WHERE); -/* -COM Port Type: - -Select the type of serial COM port for this node. If you are unsure, -select UART. If you have a FOSSIL driver installed, you do not have to -select FOSSIL unless you specifically want to override Synchronet's -internal COM functions. -*/ -i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"COM Port Type",opt); -if(i==-1) - return(0); -changes=1; -if(i) { - com_irq=com_port-1; - if(i==1) { - savnum=0; - umsg("WARNING: This is not a recommended setting for most systems"); - umsg("The default DSZ command lines will not work with this setting"); - com_base=0xf; } - else if(i==2) - com_base=0xb; - else if(i==3) - com_base=0xe; - else if(i==4) - com_base=0xd; } - -else { /* UART */ - if(com_port && com_port<5) { - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Use Default UART IRQ and I/O Address: - -If your COM Port's UART is using the normal IRQ and Base I/O Address -for the configured COM Port number, select Yes. If your COM Port -is using a non-standard IRQ or I/O Address, select No and be sure -to set the UART IRQ and UART I/O Address options. If you are not -sure what IRQ and I/O Address your COM Port is using, select Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Use Default UART IRQ and I/O Address" - ,opt); - if(i==0) { - switch(com_port) { - case 1: - com_irq=4; - com_base=0x3f8; - break; - case 2: - com_irq=3; - com_base=0x2f8; - break; - case 3: - com_irq=4; - com_base=0x3e8; - break; - case 4: - com_irq=3; - com_base=0x2e8; - break; } - changes=1; - return(1); } } - else { - if(com_base<0x100) - com_base=0x100; - if(com_irq<2 || com_irq>15) - com_irq=5; } } -return(0); -} - -void node_menu() -{ - char done,str[81],savnode=0; - int i,j; - static int node_menu_dflt,node_bar; - -while(1) { - for(i=0;i<sys_nodes;i++) - sprintf(opt[i],"Node %d",i+1); - opt[i][0]=0; - j=WIN_ORG|WIN_ACT|WIN_INSACT|WIN_DELACT; - if(sys_nodes>1) - j|=WIN_DEL|WIN_GET; - if(sys_nodes<MAX_NODES && sys_nodes<MAX_OPTS) - j|=WIN_INS; - if(savnode) - j|=WIN_PUT; -SETHELP(WHERE); -/* -Node List: - -This is the list of configured nodes in your system. - -To add a node, hit INS . - -To delete a node, hit DEL . - -To configure a node, select it using the arrow keys and hit ENTER . - -To copy a node's configuration to another node, first select the source -node with the arrow keys and hit F5 . Then select the destination -node and hit F6 . -*/ - - i=ulist(j,0,0,13,&node_menu_dflt,&node_bar,"Nodes",opt); - if(i==-1) { - if(savnode) { - free_node_cfg(); - savnode=0; } - return; } - - if((i&MSK_ON)==MSK_DEL) { - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - sprintf(str,"Delete Node %d",sys_nodes); - i=1; -SETHELP(WHERE); -/* -Delete Node: - -If you are positive you want to delete this node, select Yes. Otherwise, -select No or hit ESC . -*/ - i=ulist(WIN_MID,0,0,0,&i,0,str,opt); - if(!i) { - --sys_nodes; - FREE(node_path[sys_nodes]); - write_main_cfg(); } - continue; } - if((i&MSK_ON)==MSK_INS) { - strcpy(node_dir,node_path[sys_nodes-1]); - i=sys_nodes+1; - upop("Reading NODE.CNF..."); - read_node_cfg(txt); - upop(0); - sprintf(str,"..\\NODE%d\\",i); - sprintf(tmp,"Node %d Path",i); -SETHELP(WHERE); -/* -Node Path: - -This is the path to this node's private directory where its separate -configuration and data files are stored. - -The drive and directory of this path can be set to any valid DOS -directory that can be accessed by ALL nodes and MUST NOT be on a RAM disk -or other volatile media. - -If you want to abort the creation of this new node, hit ESC . -*/ - j=uinput(WIN_MID,0,0,tmp,str,50,K_EDIT|K_UPPER); - changes=0; - if(j<2) - continue; - truncsp(str); - if((node_path=(char **)REALLOC(node_path,sizeof(char *)*(sys_nodes+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sys_nodes+1); - continue; } - if((node_path[i-1]=MALLOC(strlen(str)+2))==NULL) { - errormsg(WHERE,ERR_ALLOC,str,strlen(str)+2); - continue; } - strcpy(node_path[i-1],str); - if(str[strlen(str)-1]=='\\') - str[strlen(str)-1]=0; - mkdir(str); - node_num=++sys_nodes; - sprintf(node_name,"Node %u",node_num); - write_node_cfg(); - write_main_cfg(); - free_node_cfg(); - continue; } - if((i&MSK_ON)==MSK_GET) { - if(savnode) - free_node_cfg(); - i&=MSK_OFF; - strcpy(node_dir,node_path[i]); - upop("Reading NODE.CNF..."); - read_node_cfg(txt); - upop(0); - savnode=1; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - strcpy(node_dir,node_path[i]); - node_num=i+1; - write_node_cfg(); - changes=1; - continue; } - - if(savnode) { - free_node_cfg(); - savnode=0; } - strcpy(node_dir,node_path[i]); - upop("Reading NODE.CNF..."); - read_node_cfg(txt); - upop(0); - if(node_num!=i+1) { /* Node number isn't right? */ - node_num=i+1; /* so fix it */ - write_node_cfg(); } /* and write it back */ - node_cfg(); - - free_node_cfg(); } -} - -void node_cfg() -{ - static int node_dflt; - char done,str[81]; - static int mdm_dflt,adv_dflt,tog_dflt,tog_bar; - int i,j,dflt=0,bar=0; - -while(1) { - i=0; - sprintf(opt[i++],"%-27.27s%s","Name",node_name); - sprintf(opt[i++],"%-27.27s%s","Phone Number",node_phone); - sprintf(opt[i++],"%-27.27s%ubps","Minimum Connect Rate",node_minbps); - sprintf(opt[i++],"%-27.27s%.40s","Logon Requirements",node_ar); - sprintf(opt[i++],"%-27.27s%.40s","Local Text Editor",node_editor); - sprintf(opt[i++],"%-27.27s%.40s","Local Text Viewer",node_viewer); - sprintf(opt[i++],"%-27.27s%.40s","Configuration Command",scfg_cmd); - sprintf(opt[i++],"%-27.27s%.40s","DOS Command Interpreter" - ,node_comspec[0] ? node_comspec : "%COMSPEC%"); - strcpy(opt[i++],"Toggle Options..."); - strcpy(opt[i++],"Advanced Options..."); - strcpy(opt[i++],"Modem Configuration..."); - strcpy(opt[i++],"Wait for Call Number Keys..."); - strcpy(opt[i++],"Wait for Call Function Keys..."); - opt[i][0]=0; - sprintf(str,"Node %d Configuration",node_num); -SETHELP(WHERE); -/* -Node Configuration Menu: - -This is the node configuration menu. The options available from this -menu will only affect the selected node's configuration. - -Options with a trailing ... will produce a sub-menu of more options. -*/ - switch(ulist(WIN_ACT|WIN_CHE|WIN_BOT|WIN_RHT,0,0,60,&node_dflt,0 - ,str,opt)) { - case -1: - i=save_changes(WIN_MID); - if(!i) - write_node_cfg(); - if(i!=-1) - return; - break; - case 0: -SETHELP(WHERE); -/* -Node Name: - -This is the name of the selected node. It is used for documentary -purposes only. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Name",node_name,40,K_EDIT); - break; - case 1: -SETHELP(WHERE); -/* -Node Phone Number: - -This is the phone number to access the selected node. It is used for -documentary purposes only. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Phone Number",node_phone,12,K_EDIT); - break; - case 2: -SETHELP(WHERE); -/* -Minimum Connect Rate: - -This is the lowest modem connection speed allowed for the selected node. -The speed is a decimal number representing bits per second (bps) or more -inaccurately referred to as baud. - -If a user attempts to logon this node at a speed lower than the minimum -connect rate, a message is displayed explaining the minimum connect -rate and the user is disconnected. - -If the file TEXT\TOOSLOW.MSG exists, it will be displayed to the user -before the user is disconnected. - -Users with the M exemption can log onto any node at any speed. -*/ - sprintf(str,"%u",node_minbps); - uinput(WIN_MID|WIN_SAV,0,10,"Minimum Connect Rate",str,5 - ,K_NUMBER|K_EDIT); - node_minbps=atoi(str); - break; - case 3: - sprintf(str,"Node %u Logon",node_num); - getar(str,node_ar); - break; - case 4: -SETHELP(WHERE); -/* -Local Text Editor: - -This is the command line to execute to edit text files locally in -Synchronet. If this command line is blank, the default editor of the -sysop (user #1) will be used. - -This command line can be used to create posts and e-mail locally, if the -toggle option Use Editor for Messages is set to Yes. - -The %f command line specifier is used for the filename to edit. -*/ - uinput(WIN_MID|WIN_SAV,0,13,"Editor",node_editor - ,50,K_EDIT); - break; - case 5: -SETHELP(WHERE); -/* -Local Text Viewer: - -This is the command line used to view log files from the wait for call -screen. - -The %f command line specifier is used for the filename to view. -*/ - uinput(WIN_MID|WIN_SAV,0,14,"Viewer",node_viewer - ,50,K_EDIT); - break; - case 6: -SETHELP(WHERE); -/* -Configuration Command Line: - -This is the command line used to launch the Synchronet configuration -program (SCFG) from this node's Waiting for Call (WFC) screen. -*/ - uinput(WIN_MID|WIN_SAV,0,14,"Configuration Command",scfg_cmd - ,40,K_EDIT); - break; - case 7: -SETHELP(WHERE); -/* -DOS Command Interpreter: - -This is the complete path to your DOS command interpreter (normally -COMMAND.COM). Leaving this option blank (designated by %COMSPEC%) -specifies that the path contained in the COMSPEC environment variable -should be used. - -When running Synchronet for OS/2, this option should be set to: -C:\OS2\MDOS\COMMAND.COM. -*/ - uinput(WIN_MID|WIN_SAV,0,14,"DOS Command Interpreter" - ,node_comspec,40,K_EDIT); - break; - case 8: - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s","Alarm When Answering" - ,node_misc&NM_ANSALARM ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Status Screen While WFC" - ,node_misc&NM_WFCSCRN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Total Msgs/Files on WFC" - ,node_misc&NM_WFCMSGS ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Use Editor for Messages" - ,node_misc&NM_LCL_EDIT ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Use EMS for Overlays" - ,node_misc&NM_EMSOVL ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Allow Swapping" - ,node_swap&SWAP_NONE ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s%s","Swap to EMS Memory" - ,node_swap&SWAP_EMS ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Swap to XMS Memory" - ,node_swap&SWAP_XMS ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Swap to Extended Memory" - ,node_swap&SWAP_EXT ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Windows/OS2 Time Slice API" - ,node_misc&NM_WINOS2 ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","DESQview Time Slice API" - ,node_misc&NM_NODV ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s%s","DOS Idle Interrupts" - ,node_misc&NM_INT28 ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Low Priority String Input" - ,node_misc&NM_LOWPRIO ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Allow Logon by Number" - ,node_misc&NM_NO_NUM ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s%s","Allow Logon by Real Name" - ,node_misc&NM_LOGON_R ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Always Prompt for Password" - ,node_misc&NM_LOGON_P ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Disable Local Inactivity" - ,node_misc&NM_NO_INACT ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Disable Local Keyboard" - ,node_misc&NM_NO_LKBRD ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Local System Protection" - ,node_misc&NM_SYSPW ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s%s","Beep Locally" - ,node_misc&NM_NOBEEP ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s%s","Allow 8-bit Remote Logons" - ,node_misc&NM_7BITONLY ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s%s","Reset Video Between Calls" - ,node_misc&NM_RESETVID ? "Yes":"No"); - - opt[i][0]=0; - savnum=0; -SETHELP(WHERE); -/* -Node Toggle Options: - -This is the toggle options menu for the selected node's configuration. - -The available options from this menu can all be toggled between two or -more states, such as Yes and No. -*/ - switch(ulist(WIN_BOT|WIN_RHT|WIN_ACT|WIN_SAV,3,2,35,&tog_dflt - ,&tog_bar,"Toggle Options",opt)) { - case -1: - done=1; - break; - case 0: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; -SETHELP(WHERE); -/* -Alarm When Answering: - -Set this option to Yes if want this node to make an alarm sound each -time it answers an incoming call. Usually, the modem's speaker is a -sufficient alarm if one is desired. -*/ - i=ulist(WIN_MID|WIN_SAV,0,15,0,&i,0 - ,"Sound Alarm When Answering",opt); - if(i==0 && !(node_misc&NM_ANSALARM)) { - node_misc|=NM_ANSALARM; - changes=1; } - else if(i==1 && (node_misc&NM_ANSALARM)) { - node_misc&=~NM_ANSALARM; - changes=1; } - break; - case 1: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; -SETHELP(WHERE); -/* -Status Screen While WFC: - -If you want the current system statistics and current status of all -active nodes to be displayed while this node is waiting for a caller, -set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Display Status Screen While Waiting for Call",opt); - if(i==0 && !(node_misc&NM_WFCSCRN)) { - node_misc|=NM_WFCSCRN; - changes=1; } - else if(i==1 && (node_misc&NM_WFCSCRN)) { - node_misc&=~NM_WFCSCRN; - changes=1; } - break; - case 2: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; -SETHELP(WHERE); -/* -Total Messages and Files on WFC Status Screen: - -If you want the total number of messages and files to be retrieved -and displayed on the WFC status screen, set this option to Yes. - -Setting this option to No will significantly reduce the amount of -time required to retrieve the system statistics on systems with large -numbers of message and file areas. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Display Total Messages and Files while WFC",opt); - if(i==0 && !(node_misc&NM_WFCMSGS)) { - node_misc|=(NM_WFCMSGS|NM_WFCSCRN); - changes=1; } - else if(i==1 && (node_misc&NM_WFCMSGS)) { - node_misc&=~NM_WFCMSGS; - changes=1; } - break; - case 3: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; -SETHELP(WHERE); -/* -Use Local Text Editor for Messages: - -If a local text editor command has been specified, it can be used to -create messages (posts and e-mail) locally by setting this option to -Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Use Local Text Editor to Create Messages",opt); - if(i==0 && !(node_misc&NM_LCL_EDIT)) { - node_misc|=NM_LCL_EDIT; - changes=1; } - else if(i==1 && (node_misc&NM_LCL_EDIT)) { - node_misc&=~NM_LCL_EDIT; - changes=1; } - break; - case 4: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; -SETHELP(WHERE); -/* -Use Available Expanded Memory (EMS) for Swapping Overlays: - -If you wish to use any available expanded memory (EMS) for swapping -overlays, set this option to Yes. Swapping overlays to memory is much -faster than swapping to disk. - -If this option is set to Yes, Synchronet will attempt to allocation 360K -of EMS for swapping overlays into. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Use Available EMS for Overlays",opt); - if(i==0 && !(node_misc&NM_EMSOVL)) { - node_misc|=NM_EMSOVL; - changes=1; } - else if(i==1 && (node_misc&NM_EMSOVL)) { - node_misc&=~NM_EMSOVL; - changes=1; } - break; - case 5: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Allow Swapping: - -If this option is set to Yes, Synchronet will use one of the available -Swap to options when swapping out of memory. If you have no Extended, -EMS, or XMS memory available, and this option is set to Yes, Synchronet -will swap to disk. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Allow Swapping",opt); - if(i==0 && node_swap&SWAP_NONE) { - node_swap&=~SWAP_NONE; - changes=1; } - else if(i==1 && !(node_swap&SWAP_NONE)) { - node_swap|=SWAP_NONE; - changes=1; } - break; - case 6: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Swap to EMS Memory: - -If this option is set to Yes, and the Allow Swapping option is set to -Yes Synchronet will use EMS memory (when available) for swapping out -of memory. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Swap to EMS Memory",opt); - if(i==1 && node_swap&SWAP_EMS) { - node_swap&=~SWAP_EMS; - changes=1; } - else if(i==0 && !(node_swap&SWAP_EMS)) { - node_swap|=SWAP_EMS; - changes=1; } - break; - case 7: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Swap to XMS Memory: - -If this option is set to Yes, and the Allow Swapping option is set to -Yes Synchronet will use XMS memory (when available) for swapping out -of memory. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Swap to XMS Memory",opt); - if(i==1 && node_swap&SWAP_XMS) { - node_swap&=~SWAP_XMS; - changes=1; } - else if(i==0 && !(node_swap&SWAP_XMS)) { - node_swap|=SWAP_XMS; - changes=1; } - break; - case 8: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Swap to Extended Memory: - -If this option is set to Yes, and the Allow Swapping option is set to -Yes Synchronet will use non-XMS Extended memory (when available) for -swapping out of memory. - -If you are running under a DOS multitasker (e.g. Windows, DESQview, or -OS/2) set this option to No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Swap to Extended Memory",opt); - if(i==1 && node_swap&SWAP_EXT) { - node_swap&=~SWAP_EXT; - changes=1; } - else if(i==0 && !(node_swap&SWAP_EXT)) { - node_swap|=SWAP_EXT; - changes=1; } - break; - case 9: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Windows/OS2 Time Slice API: - -If you wish to have Synchronet specifically use the Windows and OS/2 -API call to surrender time slices when in a low priority task, set this -option to Yes. If setting this option to Yes causes erratic pauses -or performance problems, leave the option on No. This type of behavior -has been witnessed under Windows 3.1 when using this API call. - -If running in an OS/2 DOS session, you will most likely want this -option set to Yes for the best aggregate performance for your system. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Use Windows/OS2 Time Slice API",opt); - if(i==0 && !(node_misc&NM_WINOS2)) { - node_misc|=NM_WINOS2; - changes=1; } - else if(i==1 && (node_misc&NM_WINOS2)) { - node_misc&=~NM_WINOS2; - changes=1; } - break; - case 10: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -DESQview Time Slice API: - -If this option is set to Yes, and this node is run under DESQview, -Synchronet will use the DESQview Time Slice API calls for intelligent -variable time slicing. - -Since Synchronet automatically detects DESQview, there is no harm in -having this option set to Yes if you are not running DESQview. Only set -this option to No, if you wish to disable the DESQview API for some -reason. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"DESQview Time Slice API",opt); - if(i==0 && node_misc&NM_NODV) { - node_misc&=~NM_NODV; - changes=1; } - else if(i==1 && !(node_misc&NM_NODV)) { - node_misc|=NM_NODV; - changes=1; } - break; - case 11: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -DOS Idle Interrupts: - -If you want Synchronet to make DOS Idle Interrupts when waiting for user -input or in other low priority loops, set this option to Yes. - -For best aggregate multinode performance under multitaskers, you should -set this option to Yes. - -For best single node performance under multitaskers, you should set this -option to No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"DOS Idle Interrupts",opt); - if(i==0 && !(node_misc&NM_INT28)) { - node_misc|=NM_INT28; - changes=1; } - else if(i==1 && (node_misc&NM_INT28)) { - node_misc&=~NM_INT28; - changes=1; } - break; - case 12: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Low Priority String Input: - -Normally, Synchronet will not give up time slices (under a multitasker) -when users are prompted for a string of characters. This is considered -a high priority task. - -Setting this option to Yes will force Synchronet to give up time slices -during string input, possibly causing jerky keyboard input from the -user, but improving aggregate system performance under multitaskers. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Low Priority String Input",opt); - if(i==0 && !(node_misc&NM_LOWPRIO)) { - node_misc|=NM_LOWPRIO; - changes=1; } - else if(i==1 && (node_misc&NM_LOWPRIO)) { - node_misc&=~NM_LOWPRIO; - changes=1; } - break; - case 13: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Allow Logon by Number: - -If you want users to be able logon using their user number at the NN: -set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Allow Logon by Number",opt); - if(i==0 && node_misc&NM_NO_NUM) { - node_misc&=~NM_NO_NUM; - changes=1; } - else if(i==1 && !(node_misc&NM_NO_NUM)) { - node_misc|=NM_NO_NUM; - changes=1; } - break; - case 14: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Allow Logon by Real Name: - -If you want users to be able logon using their real name as well as -their alias, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Allow Logon by Real Name",opt); - if(i==0 && !(node_misc&NM_LOGON_R)) { - node_misc|=NM_LOGON_R; - changes=1; } - else if(i==1 && (node_misc&NM_LOGON_R)) { - node_misc&=~NM_LOGON_R; - changes=1; } - break; - case 15: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Always Prompt for Password: - -If you want to have attempted logons using an unknown user name still -prompt for a password, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Always Prompt for Password",opt); - if(i==0 && !(node_misc&NM_LOGON_P)) { - node_misc|=NM_LOGON_P; - changes=1; } - else if(i==1 && (node_misc&NM_LOGON_P)) { - node_misc&=~NM_LOGON_P; - changes=1; } - break; - case 16: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Disable Local Inactivity Warning/Logoff: - -Setting this option to Yes will disable the user inactivity warning -and automatic logoff for local logons. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Disable Local Inactivity",opt); - if(i==0 && !(node_misc&NM_NO_INACT)) { - node_misc|=NM_NO_INACT; - changes=1; } - else if(i==1 && (node_misc&NM_NO_INACT)) { - node_misc&=~NM_NO_INACT; - changes=1; } - break; - case 17: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Disable Local Keyboard (Entirely): - -Setting this option to Yes will disable the local keyboard when the -BBS is running. Use this option only for the absolute highest degree -of local system security. If this option is set to Yes, the BBS cannot -be exited until the node is downed from another process or the machine -is rebooted. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Disable Local Keyboard (Entirely)",opt); - if(i==0 && !(node_misc&NM_NO_LKBRD)) { - node_misc|=NM_NO_LKBRD; - changes=1; } - else if(i==1 && (node_misc&NM_NO_LKBRD)) { - node_misc&=~NM_NO_LKBRD; - changes=1; } - break; - case 18: - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Local System Protection: - -When this option is set to Yes, all local system functions from the -Waiting for Call screen and Alt-Key combinations will require the user -to enter the system password. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Local System Protection (Password)",opt); - if(i==0 && !(node_misc&NM_SYSPW)) { - node_misc|=NM_SYSPW; - changes=1; } - else if(i==1 && (node_misc&NM_SYSPW)) { - node_misc&=~NM_SYSPW; - changes=1; } - break; - case 19: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Beep Locally: - -If you want the local speaker to be disabled for online beeps, set this -option to No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Beep Locally",opt); - if(i==1 && !(node_misc&NM_NOBEEP)) { - node_misc|=NM_NOBEEP; - changes=1; } - else if(i==0 && (node_misc&NM_NOBEEP)) { - node_misc&=~NM_NOBEEP; - changes=1; } - break; - case 20: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Allow 8-bit Remote Input During Logon: - -If you wish to allow E-7-1 terminals to use this node, you must set this -option to No. This will also eliminate the ability of 8-bit remote users -to send IBM extended ASCII characters during the logon sequence. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Allow 8-bit Remote Input During Logon",opt); - if(i==1 && !(node_misc&NM_7BITONLY)) { - node_misc|=NM_7BITONLY; - changes=1; } - else if(i==0 && (node_misc&NM_7BITONLY)) { - node_misc&=~NM_7BITONLY; - changes=1; } - break; - case 21: - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=1; - SETHELP(WHERE); -/* -Reset Video Mode Between Calls: - -If you wish to have SBBS reset the video mode between calls, set this -option to Yes. This is to reverse the effects of some external programs -that change the video mode without permission. -*/ - i=ulist(WIN_MID|WIN_SAV,0,10,0,&i,0 - ,"Reset Video Mode Beteween Calls",opt); - if(i==0 && !(node_misc&NM_RESETVID)) { - node_misc|=NM_RESETVID; - changes=1; } - else if(i==1 && (node_misc&NM_RESETVID)) { - node_misc&=~NM_RESETVID; - changes=1; } - break; - } } - break; - case 9: - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s","Validation User" - ,node_valuser ? itoa(node_valuser,tmp,10) : "Nobody"); - sprintf(opt[i++],"%-27.27s%s","Screen Length" - ,node_scrnlen ? itoa(node_scrnlen,tmp,10) - : "Auto-Detect"); - sprintf(opt[i++],"%-27.27s%s","Screen Blanker" - ,node_scrnblank ? itoa(node_scrnblank,tmp,10) - : "Disabled"); - sprintf(opt[i++],"%-27.27s%u seconds","Semaphore Frequency" - ,node_sem_check); - sprintf(opt[i++],"%-27.27s%u seconds","Statistics Frequency" - ,node_stat_check); - sprintf(opt[i++],"%-27.27s%u seconds","Inactivity Warning" - ,sec_warn); - sprintf(opt[i++],"%-27.27s%u seconds","Inactivity Disconnection" - ,sec_hangup); - sprintf(tmp,"$%d.00",node_dollars_per_call); - sprintf(opt[i++],"%-27.27s%s","Cost Per Call",tmp); - sprintf(opt[i++],"%-27.27s%.40s","Daily Event",node_daily); - sprintf(opt[i++],"%-27.27s%.40s","Control Directory",ctrl_dir); - sprintf(opt[i++],"%-27.27s%.40s","Text Directory",text_dir); - sprintf(opt[i++],"%-27.27s%.40s","Temporary Directory" - ,temp_dir); - sprintf(opt[i++],"%-27.27s%.40s","Swap Directory" - ,node_swapdir); - opt[i][0]=0; - savnum=0; -SETHELP(WHERE); -/* -Node Advanced Options: - -This is the advanced options menu for the selected node. The available -options are of an advanced nature and should not be modified unless you -are sure of the consequences and necessary preparation. -*/ - switch(ulist(WIN_T2B|WIN_RHT|WIN_ACT|WIN_SAV,2,0,60,&adv_dflt,0 - ,"Advanced Options",opt)) { - case -1: - done=1; - break; - case 0: - itoa(node_valuser,str,10); -SETHELP(WHERE); -/* -Validation User Number: - -When a caller logs onto the system as New, he or she must send -validation feedback to the sysop. This feature can be disabled by -setting this value to 0, allowing new users to logon without sending -validation feedback. If you want new users on this node to be forced to -send validation feedback, set this value to the number of the user to -whom the feedback is sent. The normal value of this option is 1 for -user number one. -*/ - uinput(WIN_MID,0,13,"Validation User Number (0=Nobody)" - ,str,4,K_NUMBER|K_EDIT); - node_valuser=atoi(str); - break; - case 1: - itoa(node_scrnlen,str,10); -SETHELP(WHERE); -/* -Screen Length: - -Synchronet automatically senses the number of lines on your display and -uses all of them. If for some reason you want to override the detected -screen length, set this value to the number of lines (rows) you want -Synchronet to use. -*/ - uinput(WIN_MID,0,14,"Screen Length (0=Auto-Detect)" - ,str,2,K_NUMBER|K_EDIT); - node_scrnlen=atoi(str); - break; - case 2: - itoa(node_scrnblank,str,10); -SETHELP(WHERE); -/* -Screen Blanker: - -This option allows you to have this node blank its Waiting for Call -screen after this number of minutes of inactivity. Setting this option -to 0 disables the screen blanker. -*/ - uinput(WIN_MID|WIN_SAV,0,14 - ,"Minutes Inactive Before Blanking Screen " - "(0=Disabled)" - ,str,2,K_NUMBER|K_EDIT); - node_scrnblank=atoi(str); - break; - case 3: - itoa(node_sem_check,str,10); -SETHELP(WHERE); -/* -Semaphore Check Frequency While Waiting for Call (in seconds): - -This is the number of seconds between semaphore checks while this node -is waiting for a caller. Default is 60 seconds. -*/ - uinput(WIN_MID|WIN_SAV,0,14 - ,"Seconds Between Semaphore Checks" - ,str,3,K_NUMBER|K_EDIT); - node_sem_check=atoi(str); - break; - case 4: - itoa(node_stat_check,str,10); -SETHELP(WHERE); -/* -Statistics Check Frequency While Waiting for Call (in seconds): - -This is the number of seconds between static checks while this node -is waiting for a caller. Default is 10 seconds. -*/ - uinput(WIN_MID|WIN_SAV,0,14 - ,"Seconds Between Statistic Checks" - ,str,3,K_NUMBER|K_EDIT); - node_stat_check=atoi(str); - break; - case 5: - itoa(sec_warn,str,10); -SETHELP(WHERE); -/* -Seconds Before Inactivity Warning: - -This is the number of seconds the user must be inactive before a -warning will be given. Default is 180 seconds. -*/ - uinput(WIN_MID|WIN_SAV,0,14 - ,"Seconds Before Inactivity Warning" - ,str,4,K_NUMBER|K_EDIT); - sec_warn=atoi(str); - break; - case 6: - itoa(sec_hangup,str,10); -SETHELP(WHERE); -/* -Seconds Before Inactivity Disconnection: - -This is the number of seconds the user must be inactive before they -will be automatically disconnected. Default is 300 seconds. -*/ - uinput(WIN_MID|WIN_SAV,0,14 - ,"Seconds Before Inactivity Disconnection" - ,str,4,K_NUMBER|K_EDIT); - sec_hangup=atoi(str); - break; - case 7: - itoa(node_dollars_per_call,str,10); -SETHELP(WHERE); -/* -Billing Node Cost Per Call: - -If you have an automated billing phone number (usually area code 900 -or prefix 976) and you wish to use this node as an automated billing -node, set this value to the dollar amount that is billed for the first -minute. Subsequent minutes should be charged the minimum amount as the -maximum connect time for a billing node is 90 seconds. - -If this feature is used, when a caller connects to the node, he or she -will be notified of the eminent charge amount if they do not drop -carrier within the allotted free period. If the caller is still -connected after 30 seconds, he or she will be prompted to enter a valid -user name or number. After a valid user name or number has been entered, -the caller is disconnected and the entered user is immediately given the -purchased credits based on this dollar amount multiplied by the -Credits per Dollar system option. -*/ - uinput(WIN_MID,0,0,"Billing Node Cost Per Call " - "(in dollars)",str,2,K_NUMBER|K_EDIT); - node_dollars_per_call=atoi(str); - break; - case 8: -SETHELP(WHERE); -/* -Daily Event: - -If you have an event that this node should run every day, enter the -command line for that event here. - -An event can be any valid DOS command line. If multiple programs or -commands are required, use a batch file. - -Remember: The %! command line specifier is an abreviation for your - configured EXEC directory path. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Daily Event" - ,node_daily,50,K_EDIT); - break; - case 9: - strcpy(str,ctrl_dir); - if(strstr(str,"\\CTRL\\")!=NULL) - *strstr(str,"\\CTRL\\")=0; -SETHELP(WHERE); -/* -Control Directory Parent: - -Your control directory contains important configuration and data files -that ALL nodes share. This directory MUST NOT be located on a RAM disk -or other volatile media. - -This option allows you to change the parent of your control directory. -The \CTRL\ suffix (sub-directory) cannot be changed or removed. -*/ - if(uinput(WIN_MID|WIN_SAV,0,9,"Control Dir Parent" - ,str,50,K_EDIT|K_UPPER)>0) { - if(str[strlen(str)-1]!='\\') - strcat(str,"\\"); - strcat(str,"CTRL\\"); - strcpy(ctrl_dir,str); } - break; - case 10: - strcpy(str,text_dir); - if(strstr(str,"\\TEXT\\")!=NULL) - *strstr(str,"\\TEXT\\")=0; -SETHELP(WHERE); -/* -Text Directory Parent: - -Your text directory contains read-only text files. Synchronet never -writes to any files in this directory so it CAN be placed on a RAM -disk or other volatile media. This directory contains the system's menus -and other important text files, so be sure the files and directories are -moved to this directory if you decide to change it. - -This option allows you to change the parent of your control directory. -The \TEXT\ suffix (sub-directory) cannot be changed or removed. -*/ - if(uinput(WIN_MID|WIN_SAV,0,10,"Text Dir Parent" - ,str,50,K_EDIT|K_UPPER)>0) { - if(str[strlen(str)-1]!='\\') - strcat(str,"\\"); - strcat(str,"TEXT\\"); - strcpy(text_dir,str); } - break; - case 11: - strcpy(str,temp_dir); -SETHELP(WHERE); -/* -Temp Directory: - -Your temp directory is where Synchronet stores files of a temporary -nature for this node. Each node MUST have its own unique temp directory. -This directory can exist on a RAM disk or other volatile media. For -the best batch upload performance, it should be located on the same -drive as the majority of your upload directories. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Temp Directory" - ,str,50,K_EDIT|K_UPPER); - if(!strlen(str)) - umsg("Temp directory cannot be blank"); - else - strcpy(temp_dir,str); - break; - case 12: - strcpy(str,node_swapdir); -SETHELP(WHERE); -/* -Swap Directory: - -Your swap directory is where Synchronet will swap out to if you have -swapping enabled, and it is necessary to swap to disk. The default is -the node directory. If you do specify a swap directory, it must not -be a relative path (i.e. "..\etc"). Specify the entire path and include -the drive letter specification (i.e. "D:\SBBS\SWAP"). -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Swap Directory" - ,str,50,K_EDIT|K_UPPER); - if(str[0] && strcmp(str,".") && strcmp(str,".\\") - && (strstr(str,"..") || str[1]!=':' - || str[2]!='\\')) - umsg("Must specify full path"); - else - strcpy(node_swapdir,str); - break; } } - break; - case 11: -SETHELP(WHERE); -/* -Wait for Call Number Key Commands: - -Each of the number keys (0 through 9) can be assigned a command to -execute when entered at the wait for call screen. This is a list of -those keys and the assigned commands. Since Synchronet is still in -memory when these command are executed, the number keys should be used -for small program execution or command lines with small memory -requirements. - -If you have a program or command line with large memory requirements, -use a Wait for Call Function Key Command. -*/ - j=0; - while(1) { - for(i=0;i<10;i++) - sprintf(opt[i],"%d %s",i,wfc_cmd[i]); - opt[i][0]=0; - savnum=0; - - i=ulist(WIN_T2B|WIN_RHT|WIN_ACT|WIN_SAV,2,0,50,&j,0 - ,"Number Key Commands",opt); - if(i==-1) - break; - sprintf(str,"%d Key Command Line",i); - uinput(WIN_MID|WIN_SAV,0,0,str,wfc_cmd[i],50,K_EDIT); } - break; - case 12: -SETHELP(WHERE); -/* -Wait for Call Function Key Commands: - -Each of the function keys (F1 through F12) can be assigned a command to -execute when entered at the wait for call screen. This is a list of -those keys and the currently assigned commands. Synchronet will shrink -to 16K of RAM before executing one of these command lines. - -If you have a command line with small memory requirements, you should -probably use a Wait for Call Number Key Command for faster execution. -*/ - j=0; - while(1) { - for(i=0;i<12;i++) - sprintf(opt[i],"F%-2d %s",i+1,wfc_scmd[i]); - opt[i][0]=0; - savnum=0; - i=ulist(WIN_T2B|WIN_RHT|WIN_ACT|WIN_SAV,2,0,50,&j,0 - ,"Function Key (Shrinking) Commands",opt); - if(i==-1) - break; - sprintf(str,"F%d Key Command Line",i+1); - uinput(WIN_MID|WIN_SAV,0,0,str,wfc_scmd[i],50,K_EDIT); } - break; - case 10: - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s","COM Port" - ,com_port ? itoa(com_port,tmp,10) : "Disabled"); - sprintf(opt[i++],"%-27.27s%u" - ,com_base && com_base<0x100 ? "COM Channel" - :"UART IRQ Line" - ,com_irq); - if(com_base==0xd) - strcpy(str,"DigiBoard"); - else if(com_base==0xf) - strcpy(str,"FOSSIL"); - else if(com_base==0xb) - strcpy(str,"PC BIOS"); - else if(com_base==0xe) - strcpy(str,"PS/2 BIOS"); - else - sprintf(str,"%Xh",com_base); - sprintf(opt[i++],"%-27.27s%s" - ,com_base<0x100 ? "COM Type":"UART I/O Address",str); - sprintf(opt[i++],"%-27.27s%lu","DTE Rate",com_rate); - sprintf(opt[i++],"%-27.27s%s","Fixed DTE Rate" - ,mdm_misc&MDM_STAYHIGH ? "Yes" : "No"); - if(!(mdm_misc&(MDM_RTS|MDM_CTS))) - strcpy(str,"None"); - else { - if(mdm_misc&MDM_CTS) { - strcpy(str,"CTS"); - if(mdm_misc&MDM_RTS) - strcat(str,"/"); } - else str[0]=0; - if(mdm_misc&MDM_RTS) - strcat(str,"RTS"); } - sprintf(opt[i++],"%-27.27s%s","Hardware Flow Control",str); - sprintf(opt[i++],"%-27.27s%u ring%c","Answer After" - ,mdm_rings,mdm_rings>1 ? 's':' '); - sprintf(opt[i++],"%-27.27s%u second%c","Answer Delay" - ,mdm_ansdelay,mdm_ansdelay>1 ? 's':' '); - sprintf(opt[i++],"%-27.27s%s","Reinitialization Timer" - ,mdm_reinit ? itoa(mdm_reinit,tmp,10) : "Disabled"); - strcpy(opt[i++],"Result Codes..."); - strcpy(opt[i++],"Toggle Options..."); - strcpy(opt[i++],"Control Strings..."); - strcpy(opt[i++],"Auto-Configuration..."); - strcpy(opt[i++],"Import Configuration..."); - strcpy(opt[i++],"Export Configuration..."); - opt[i][0]=0; - savnum=0; -SETHELP(WHERE); -/* -Modem Configuration Menu: - -This menu contains the configuration options for this node's modem. -If you do not have a modem attached to this node or do not want to use -an attached modem, you can disable the Synchronet modem communications -by setting the COM Port to 0. - -If your modem is listed in the Auto-Configuration, you should probably -just set the COM Port and run the auto-configuration for your modem -type. -*/ - switch(ulist(WIN_T2B|WIN_RHT|WIN_ACT|WIN_SAV,2,0,44,&mdm_dflt,0 - ,"Modem Configuration",opt)) { - case -1: - done=1; - break; - case 0: - itoa(com_port,str,10); -SETHELP(WHERE); -/* -COM Port: - -This is the serial communications port that the modem for this node is -connected to. If you do not have a modem connected to this node, or -do not wish to use a connected modem, you can disable the Synchronet -modem communications by setting this value to 0. -*/ - if(uinput(WIN_MID|WIN_SAV,0,10,"COM Port (0=Disabled)" - ,str,2,K_EDIT|K_NUMBER)==-1) - break; - com_port=atoi(str); - if(!com_port) - break; - savnum=1; - com_type(); - break; - case 1: - itoa(com_irq,str,10); -SETHELP(WHERE); -/* -UART IRQ Line or Channel Number: - -If you are using a standard UART serial interface for this COM port, -this is the IRQ line that your COM Port's UART is using. If you have -configured your COM Port and selected the default IRQ and I/O address, -you should not need to change the value of this option. - -If this COM port is accessed via Int 14h, this is the channel number -for this COM port (normally, the COM port number minus one). -*/ - uinput(WIN_MID|WIN_SAV,0,10 - ,com_base && com_base<0x100 ? "Channel" - : "UART IRQ Line" - ,str,2,K_EDIT|K_NUMBER); - com_irq=atoi(str); - break; - case 2: - savnum=1; - if(com_type() || com_base<0x100) - break; -SETHELP(WHERE); -/* -UART I/O Address in Hex: - -This is the base I/O address of your COM Port's UART. If you have -configured your COM Port and selected the default IRQ and I/O address, -you should not need to change the value of this option. If this node's -COM Port's UART is using a non-standard I/O address, enter that address -(in hexadecimal) using this option. -*/ - itoa(com_base,str,16); - strupr(str); - uinput(WIN_MID|WIN_SAV,0,10 - ,"UART I/O Address in Hex" - ,str,4,K_EDIT|K_UPPER); - com_base=ahtoul(str); - break; - case 3: - savnum=1; -SETHELP(WHERE); -/* -UART (DTE) Rate: - -This is the data transfer rate between your COM Port's UART (Data -Terminal Equipment) and your modem. This is NOT the connect rate of -your modem (Data Communications Equipment). Most high-speed (9600bps+) -modems use a fixed DTE rate that is higher than the highest DCE rate to -allow for data compression and error correction. This value should be -set to the highest DTE rate your modem supports. If you have a 1200 or -2400bps modem without data compression capabilities, this value should -be set to 1200 or 2400 respectively. If you have a high-speed modem, -refer to the modem's manual to find the highest supported DTE rate. -*/ - i=0; - strcpy(opt[i++],"300"); - strcpy(opt[i++],"1200"); - strcpy(opt[i++],"2400"); - strcpy(opt[i++],"4800"); - strcpy(opt[i++],"9600"); - strcpy(opt[i++],"19200"); - strcpy(opt[i++],"38400"); - strcpy(opt[i++],"57600"); - strcpy(opt[i++],"115200"); - opt[i][0]=0; - switch(com_rate) { - default: - i=0; - break; - case 1200: - i=1; - break; - case 2400: - i=2; - break; - case 4800: - i=3; - break; - case 9600: - i=4; - break; - case 19200: - i=5; - break; - case 38400: - i=6; - break; - case 57600: - i=7; - break; - case 115200L: - i=8; - break; } - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"UART (DTE) Rate" - ,opt); - if(i==-1) - break; - changes=1; - switch(i) { - default: - com_rate=300; - break; - case 1: - com_rate=1200; - break; - case 2: - com_rate=2400; - break; - case 3: - com_rate=4800; - break; - case 4: - com_rate=9600; - break; - case 5: - com_rate=19200; - break; - case 6: - com_rate=38400; - break; - case 7: - com_rate=57600; - break; - case 8: - com_rate=115200L; - break; } - break; - case 4: - i=1; - savnum=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; -SETHELP(WHERE); -/* -Use Fixed DTE Rate: - -If this node is using a modem with error correction or data compression -capabilities, set this option to Yes. If you are using a 2400bps or -slower modem, it is most likely this value should be set to No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Use Fixed " - "DTE Rate",opt); - if(i==0 && !(mdm_misc&MDM_STAYHIGH)) { - mdm_misc|=MDM_STAYHIGH; - changes=1; } - else if(i==1 && mdm_misc&MDM_STAYHIGH) { - mdm_misc&=~MDM_STAYHIGH; - changes=1; } - break; - case 5: - i=1; - savnum=1; - strcpy(opt[0],"Both"); - strcpy(opt[1],"CTS Only"); - strcpy(opt[2],"RTS Only"); - strcpy(opt[3],"None"); - opt[4][0]=0; - i=0; -SETHELP(WHERE); -/* -Hardware Flow Control (CTS/RTS): - -If your modem supports the use of hardware flow control via CTS/RTS -(Clear to Send/Request to Send), set this option to Both. If are using -a high-speed modem or a modem with data compression or error correction -capabilities, it is most likely this option should be set to Both. If -you are using a 2400bps or slower modem without data compression or -error correction capabilities, set this option to None. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Hardware " - "Flow Control (CTS/RTS)",opt); - if(i==0 - && (mdm_misc&(MDM_CTS|MDM_RTS)) - !=(MDM_CTS|MDM_RTS)) { - mdm_misc|=(MDM_CTS|MDM_RTS); - changes=1; } - else if(i==1 - && (mdm_misc&(MDM_CTS|MDM_RTS))!=MDM_CTS) { - mdm_misc|=MDM_CTS; - mdm_misc&=~MDM_RTS; - changes=1; } - else if(i==2 - && (mdm_misc&(MDM_CTS|MDM_RTS))!=MDM_RTS) { - mdm_misc|=MDM_RTS; - mdm_misc&=~MDM_CTS; - changes=1; } - else if(i==3 - && mdm_misc&(MDM_CTS|MDM_RTS)) { - mdm_misc&=~(MDM_RTS|MDM_CTS); - changes=1; } - break; - - case 6: -SETHELP(WHERE); -/* -Number of Rings to Answer After: - -This is the number of rings to let pass before answering the phone. -*/ - itoa(mdm_rings,str,10); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Number of Rings to Answer After" - ,str,2,K_EDIT|K_NUMBER); - mdm_rings=atoi(str); - if(!mdm_rings) - mdm_rings=1; - break; - - case 7: -SETHELP(WHERE); -/* -Seconds to Delay after Answer: - -This is the length of time (in seconds) to delay after connection and -before the terminal detection sequence is trasmitted to the remote user -and the logon prompt is displayed. -*/ - itoa(mdm_ansdelay,str,10); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Answer Delay (in seconds)" - ,str,4,K_EDIT|K_NUMBER); - mdm_ansdelay=atoi(str); - break; - - case 8: -SETHELP(WHERE); -/* -Minutes Between Reinitialization: - -If you want your modem to be periodically reinitialized while waiting -for a caller, set this option to the maximum number of minutes between -initializations. Setting this value to 0 disables this feature. -*/ - itoa(mdm_reinit,str,10); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Minutes Between Reinitialization (0=Disabled)" - ,str,4,K_EDIT|K_NUMBER); - mdm_reinit=atoi(str); - break; - case 9: - dflt=bar=0; - while(1) { - for(i=0;i<mdm_results;i++) { - sprintf(opt[i],"%3u %5ubps %4ucps %s" - ,mdm_result[i].code,mdm_result[i].rate - ,mdm_result[i].cps,mdm_result[i].str); } - opt[i][0]=0; - i=WIN_ACT|WIN_SAV|WIN_RHT; - if(mdm_results<MAX_OPTS) - i|=WIN_INS; - if(mdm_results>1) - i|=WIN_DEL; - savnum=1; -SETHELP(WHERE); -/* -Modem Result Codes: - -This is the list of configured numeric connection result codes that this -node's modem supports. If this node is getting Invalid Result Code -errors when answer incoming calls, those result codes should be added -to this list. Refer to your modem's manual for a list of supported -result codes. Using the Auto-Configuration option automatically -configures this list for you. -To add a result code, hit INS . - -To delete a result code, select it using the arrow keys and hit DEL . -*/ - i=ulist(i,0,0,34,&dflt,&bar - ,"Modem Result Codes",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - mdm_results--; - while(i<mdm_results) { - mdm_result[i]=mdm_result[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - if((mdm_result=(mdm_result_t *)REALLOC( - mdm_result,sizeof(mdm_result_t) - *(mdm_results+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr - ,mdm_results+1); - mdm_results=0; - bail(1); - continue; } - for(j=mdm_results;j>i;j--) - mdm_result[j]=mdm_result[j-1]; - mdm_result[i]=mdm_result[i+1]; - mdm_results++; - changes=1; - continue; } - results(dflt); } - break; - case 10: /* Toggle Options */ - dflt=0; - while(1) { - savnum=1; - i=0; - sprintf(opt[i++],"%-27.27s%s" - ,"Caller Identification" - ,mdm_misc&MDM_CALLERID ? "Yes" : "No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Dumb Modem Connection" - ,mdm_misc&MDM_DUMB ? "Yes" : "No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Drop DTR to Hang Up" - ,mdm_misc&MDM_NODTR ? "No" : "Yes"); - sprintf(opt[i++],"%-27.27s%s" - ,"Use Verbal Result Codes" - ,mdm_misc&MDM_VERBAL ? "Yes" : "No"); - sprintf(opt[i++],"%-27.27s%s" - ,"Allow Unknown Result Codes" - ,mdm_misc&MDM_KNOWNRES ? "No" : "Yes"); - opt[i][0]=0; - i=ulist(WIN_SAV|WIN_ACT,0,0,0,&dflt,0 - ,"Modem Toggle Options",opt); - savnum=2; - if(i==-1) - break; - if(i==0) { - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; -SETHELP(WHERE); -/* -Caller Identification: - -If your modem supports Caller ID and is configured to return caller -number delivery messages, set this option to Yes. - -If this option is set to Yes, Synchronet will log caller number delivery -messages. If a caller attempts to connect with a number listed in the -file TEXT\CID.CAN, they will be displayed TEXT\BADCID.MSG (if it exists) -and disconnected. Each user will have their most recent caller ID number -stored in their note field. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Caller ID",opt); - if(i==0 && !(mdm_misc&MDM_CALLERID)) { - mdm_misc|=MDM_CALLERID; - changes=1; } - else if(i==1 && mdm_misc&MDM_CALLERID) { - mdm_misc&=~MDM_CALLERID; - changes=1; } } - else if(i==1) { - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; -SETHELP(WHERE); -/* -Dumb Modem Connection: - -If this node is connected to a serial line through a dumb modem, set -this option to Yes to disable all modem commands and answer calls when -DCD is raised. -*/ - i=ulist(WIN_SAV|WIN_MID,0,0,0,&i,0 - ,"Dumb Modem",opt); - if(i==0 && !(mdm_misc&MDM_DUMB)) { - mdm_misc|=MDM_DUMB; - changes=1; } - else if(i==1 && mdm_misc&MDM_DUMB) { - mdm_misc&=~MDM_DUMB; - changes=1; } } - else if(i==2) { - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; -SETHELP(WHERE); -/* -Drop DTR to Hang Up: - -If you wish to have the BBS drop DTR to hang up the modem, set this -option to Yes. If this option is set to No, the Hang Up String is sent -to modem instead. -*/ - i=ulist(WIN_SAV|WIN_MID,0,0,0,&i,0 - ,"Drop DTR to Hang Up",opt); - if(i==0 && mdm_misc&MDM_NODTR) { - mdm_misc&=~MDM_NODTR; - changes=1; } - else if(i==1 && !(mdm_misc&MDM_NODTR)) { - mdm_misc|=MDM_NODTR; - changes=1; } } - else if(i==3) { - i=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; -SETHELP(WHERE); -/* -Use Verbal Result Codes: - -If you wish to have the BBS expect verbal (or verbose) result codes -from the modem instead of numeric (non-verbose) result codes, set this -option to Yes. - -This option can be useful for modems that insist on returning multiple -result codes upon connection (CARRIER, PROTOCOL, etc) or modems that -do not report numeric result codes correctly. While this option is more -flexible than numeric result codes, it may not be as accurate in -describing the connection or estimating the CPS rate of the connection. - -If this option is set to Yes, the configured result code list will not -be used (you may remove all entries from the list if you wish). The -connection rate, description, and estimated CPS will be automatically -generated by the BBS. -*/ - i=ulist(WIN_SAV|WIN_MID,0,0,0,&i,0 - ,"Use Verbal Result Codes",opt); - if(i==0 && !(mdm_misc&MDM_VERBAL)) { - mdm_misc|=MDM_VERBAL; - changes=1; } - else if(i==1 && mdm_misc&MDM_VERBAL) { - mdm_misc&=~MDM_VERBAL; - changes=1; } } - else if(i==4) { - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; -SETHELP(WHERE); -/* -Allow Unknown Result Codes: - -If you wish to have the BBS allow modem connections with an unknown -(un-configured) numeric result code by using the last known (configured) -result code information by default, set this option to Yes. - -This option has no effect if Verbal Result Codes are used. -*/ - i=ulist(WIN_SAV|WIN_MID,0,0,0,&i,0 - ,"Allow Unknown Result Codes",opt); - if(i==0 && mdm_misc&MDM_KNOWNRES) { - mdm_misc&=~MDM_KNOWNRES; - changes=1; } - else if(i==1 && !(mdm_misc&MDM_KNOWNRES)) { - mdm_misc|=MDM_KNOWNRES; - changes=1; } } - } - break; - case 11: -SETHELP(WHERE); -/* -Modem Control Strings: - -This menu contains a list of available modem control strings. It is usually -not necessary to modify these except under special circumstances. -*/ - j=0; - while(1) { - i=0; - savnum=1; - sprintf(opt[i++],"%-27.27s%.40s" - ,"Initialization String",mdm_init); - sprintf(opt[i++],"%-27.27s%.40s" - ,"Special Init String",mdm_spec); - sprintf(opt[i++],"%-27.27s%.40s" - ,"Terminal Init String",mdm_term); - sprintf(opt[i++],"%-27.27s%.40s" - ,"Dial String",mdm_dial); - sprintf(opt[i++],"%-27.27s%.40s" - ,"Off Hook String",mdm_offh); - sprintf(opt[i++],"%-27.27s%.40s" - ,"Answer String",mdm_answ); - sprintf(opt[i++],"%-27.27s%.40s" - ,"Hang Up String",mdm_hang); - opt[i][0]=0; - j=ulist(WIN_ACT|WIN_MID|WIN_SAV,0,0,60,&j,0 - ,"Modem Control Strings",opt); - if(j==-1) - break; - switch(j) { - case 0: -SETHELP(WHERE); -/* -Initialization String: - -This is one of the strings of characters sent to your modem upon -modem initialization. If you find it necessary to send additional -commands to the modem during initialization, use the Special Init String -for that purpose. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Initialization" - ,mdm_init,50,K_EDIT|K_UPPER); - break; - case 1: -SETHELP(WHERE); -/* -Special Init String: - -This is an additional optional string of characters to be sent to your -modem during initialization. Many of the Auto-Configuration options -automatically set this string. It is used for sending commands that are -particular to this modem type. If you find it necessary to send -additional commands to your modem during initialization, use this option -for that purpose. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Special Init" - ,mdm_spec,50,K_EDIT|K_UPPER); - break; - case 2: -SETHELP(WHERE); -/* -Terminal Init String: - -This is the string of characters sent to your modem when terminal mode -is entered from the Synchronet wait for call screen. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Terminal Init" - ,mdm_term,50,K_EDIT|K_UPPER); - break; - case 3: -SETHELP(WHERE); -/* -Dial String: - -This is the string used to dial the modem in Synchronet Callback -(an optional callback verification module). -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Dial String",mdm_dial,40 - ,K_EDIT|K_UPPER); - break; - case 4: -SETHELP(WHERE); -/* -Off Hook String: - -This is the string of characters sent to your modem to take it off hook -(make busy). -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Off Hook String",mdm_offh - ,40,K_EDIT|K_UPPER); - break; - case 5: -SETHELP(WHERE); -/* -Answer String: - -This is the string of characters sent to your modem to answer an -incoming call. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Answer String",mdm_answ,40 - ,K_EDIT|K_UPPER); - break; - case 6: -SETHELP(WHERE); -/* -Hang Up String: - -This is the string of characters sent to your modem to hang up the -phone line (go on-hook). -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Hang Up String",mdm_hang,40 - ,K_EDIT|K_UPPER); - break; - } } - break; - case 12: - dflt=bar=0; - while(1) { - for(i=0;i<mdm_types;i++) - strcpy(opt[i],mdm_type[i]); - opt[i][0]=0; - savnum=1; -SETHELP(WHERE); -/* -Auto-Configuration Modem Type: - -This is the list of modem types currently supported by Synchronet's -automatic modem configuration feature. If your modem is listed, select -it using the arrow keys and hit ENTER . If your modem is not listed, -you may want to try using the auto-configuration of a compatible modem -or one from the same manufacturer. If you have a 2400bps modem, select -Hayes SmartModem 2400. If you have a high-speed modem that is not -listed, you may want to try Generic 9600 or Generic 14400 and add -the additional high-speed result codes by hand. Refer to your modem's -manual for a list of result codes supported by your modem. -*/ - i=ulist(WIN_ACT|WIN_SAV|WIN_RHT,0,0,0 - ,&dflt,&bar,"Modem Type",opt); - if(i==-1) - break; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - j=1; - savnum=2; - - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Continue with Modem Auto-Configuration",opt); - if(!j) { - mdm_cfg(i); - changes=1; - sprintf(str - ,"Modem configured as %s",mdm_type[i]); - savnum=1; - umsg(str); } } - break; - case 13: -SETHELP(WHERE); -/* -Import Modem Configuration File - -Using this option, you can import modem settings from an MDM file in -your CTRL directory (i.e. To import from CTRL\MYMODEM.MDM, type MYMODEM -now). -*/ - i=changes; - str[0]=0; - uinput(WIN_MID|WIN_SAV,0,0,"MDM Filename",str - ,8,K_UPPER); - if(str[0]) { - FREE(mdm_result); - mdm_result=NULL; - - mdm_answ[0]=0; - mdm_hang[0]=0; - mdm_dial[0]=0; - mdm_offh[0]=0; - mdm_term[0]=0; - mdm_init[0]=0; - mdm_spec[0]=0; - mdm_results=0; - - if(exec_mdm(str)) - umsg("Imported"); - else { - umsg("File Not Found"); - changes=i; } } - else - changes=i; - break; - - case 14: -SETHELP(WHERE); -/* -Export Current Modem Configuration to a File - -Using this option, you can save the current modem settings to a file. -The file will be placed into the CTRL directory and will be given an -extension of MDM (i.e. To create CTRL\MYMODEM.MDM, type MYMODEM now). -*/ - i=changes; - str[0]=0; - uinput(WIN_MID|WIN_SAV,0,0,"MDM Filename",str - ,8,K_UPPER); - if(str[0]) { - if(export_mdm(str)) - umsg("Exported"); - else - umsg("Error Exporting"); } - changes=i; - break; - } } } } -} - -void results(int i) -{ - char str[81]; - int n,dflt=0; - -while(1) { - n=0; - sprintf(opt[n++],"%-22.22s%u","Numeric Code",mdm_result[i].code); - sprintf(opt[n++],"%-22.22s%ubps","Modem Connect Rate",mdm_result[i].rate); - sprintf(opt[n++],"%-22.22s%ucps","Modem Average CPS",mdm_result[i].cps); - sprintf(opt[n++],"%-22.22s%s","Description",mdm_result[i].str); - opt[n][0]=0; - savnum=2; -SETHELP(WHERE); -/* -Result Code: - -This is one of the configured connect result codes for your modem. The -available options are: - - Numeric Code : Numeric result code - Modem Connect Rate : Connect speed (in bps) for this result code - Modem Average CPS : Average file transfer throughput in cps - Description : Description of this connection type -*/ - switch(ulist(WIN_SAV|WIN_MID|WIN_ACT,0,0,35,&dflt,0,"Result Code",opt)) { - case -1: - return; - case 0: - sprintf(str,"%u",mdm_result[i].code); -SETHELP(WHERE); -/* -Numeric Result Code: - -This is the numeric (as opposed to verbal) result code your modem will -send to your computer when it establishes a connection with another -modem with this connect type. Your modem must have the V0 setting -enabled to return numeric result codes. -*/ - uinput(WIN_L2R|WIN_SAV,0,15,"Numeric Result Code",str,3 - ,K_EDIT|K_NUMBER); - mdm_result[i].code=atoi(str); - break; - case 1: -SETHELP(WHERE); -/* -Connection (DCE) Rate: - -This is the modem (DCE) rate established with this connect type. This is -NOT the DTE rate of your modem. As an example, a 14,400bps modem may -have a DTE rate of 38,400bps but a maximum DCE rate of 14,400bps. -*/ - sprintf(str,"%u",mdm_result[i].rate); - uinput(WIN_L2R|WIN_SAV,0,15,"Connection (DCE) Rate",str,5 - ,K_EDIT|K_NUMBER); - mdm_result[i].rate=atoi(str); - break; - case 2: -SETHELP(WHERE); -/* -Average File Transfer CPS: - -This is the average file transfer through-put (characters per second) -of connections with this result code. If you don't know the average -through-put, just divide the DCE Rate by ten for an approximation. -As an example, a 9600bps DCE Rate would have an approximate file -transfer through-put of 960cps. -*/ - sprintf(str,"%u",mdm_result[i].cps); - uinput(WIN_L2R|WIN_SAV,0,15,"Average File Transfer CPS",str,5 - ,K_EDIT|K_NUMBER); - mdm_result[i].cps=atoi(str); - break; - case 3: -SETHELP(WHERE); -/* -Modem Description: - -This is a description of the modem type used for a connection with -this result code. It can be up to eight characters long. This -description usually just contains the DCE rate and possibly the -protocol type. Such as 2400 for a 2400bps connection, 9600/V32 -for a 9600bps V.32 connection or 9600/HST for a 9600bps HST connection. -*/ - uinput(WIN_L2R|WIN_SAV,0,15,"Modem Description" - ,mdm_result[i].str,LEN_MODEM,K_EDIT); - break; } } -} diff --git a/src/sbbs2/scfg/scfgsub.c b/src/sbbs2/scfg/scfgsub.c deleted file mode 100644 index a318e8b4be..0000000000 --- a/src/sbbs2/scfg/scfgsub.c +++ /dev/null @@ -1,1200 +0,0 @@ -#line 2 "SCFGSUB.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "scfg.h" - -void sub_cfg(uint grpnum) -{ - static int dflt,tog_dflt,opt_dflt,net_dflt,adv_dflt,bar; - char str[81],str2[81],str3[11],done=0,code[9],*p; - int j,m,n,ptridx,q,s; - uint i,subnum[MAX_OPTS+1]; - static sub_t savsub; - -while(1) { - for(i=0,j=0;i<total_subs && j<MAX_OPTS;i++) - if(sub[i]->grp==grpnum) { - subnum[j]=i; - if(sub[subnum[0]]->qwkconf) - sprintf(opt[j],"%-5u %s" - ,sub[i]->qwkconf,sub[i]->lname); - else - sprintf(opt[j],"%s" - ,sub[i]->lname); - j++; } - subnum[j]=total_subs; - opt[j][0]=0; - sprintf(str,"%s Sub-boards",grp[grpnum]->sname); - savnum=0; - i=WIN_SAV|WIN_ACT; - if(j) - i|=WIN_DEL|WIN_GET|WIN_DELACT; - if(j<MAX_OPTS) - i|=WIN_INS|WIN_XTR|WIN_INSACT; - if(savsub.sname[0]) - i|=WIN_PUT; - SETHELP(WHERE); -/* -Message Sub-boards: - -This is a list of message sub-boards that have been configured for the -selected message group. - -To add a sub-board, select the desired position with the arrow keys and -hit INS . - -To delete a sub-board, select it with the arrow keys and hit DEL . - -To configure a sub-board, select it with the arrow keys and hit ENTER . -*/ - i=ulist(i,24,1,LEN_SLNAME+5,&dflt,&bar,str,opt); - savnum=1; - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - strcpy(str,"General"); - SETHELP(WHERE); -/* -Sub-board Long Name: - -This is a description of the message sub-board which is displayed in all -sub-board listings. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Sub-board Long Name",str,LEN_SLNAME - ,K_EDIT)<1) - continue; - sprintf(str2,"%.*s",LEN_SSNAME,str); - SETHELP(WHERE); -/* -Sub-board Short Name: - -This is a short description of the message sub-board which is displayed -at the main and reading messages prompts. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Sub-board Short Name",str2,LEN_SSNAME - ,K_EDIT)<1) - continue; - sprintf(str3,"%.10s",str2); - SETHELP(WHERE); -/* -Sub-board QWK Name: - -This is the name of the sub-board used for QWK off-line readers. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Sub-board QWK Name",str3,10 - ,K_EDIT)<1) - continue; - sprintf(code,"%.8s",str3); - p=strchr(code,SP); - if(p) *p=0; - strupr(code); - SETHELP(WHERE); -/* -Sub-board Internal Code: - -Every sub-board must have its own unique code for Synchronet to refer to -it internally. This code should be descriptive of the sub-board's topic, -usually an abreviation of the sub-board's name. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Sub-board Internal Code",code,8 - ,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - helpbuf=invalid_code; - savnum=0; - umsg("Invalid Code"); - helpbuf=0; - continue; } - - if((sub=(sub_t **)REALLOC(sub,sizeof(sub_t *)*(total_subs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_subs+1); - total_subs=0; - bail(1); - continue; } - - for(ptridx=0;ptridx>-1;ptridx++) { /* Search for unused pointer indx */ - for(n=0;n<total_subs;n++) - if(sub[n]->ptridx==ptridx) - break; - if(n==total_subs) - break; } - - if(j) { - for(n=total_subs;n>subnum[i];n--) - sub[n]=sub[n-1]; - for(q=0;q<total_qhubs;q++) - for(s=0;s<qhub[q]->subs;s++) - if(qhub[q]->sub[s]>=subnum[i]) - qhub[q]->sub[s]++; } - - if((sub[subnum[i]]=(sub_t *)MALLOC(sizeof(sub_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(sub_t)); - continue; } - memset((sub_t *)sub[subnum[i]],0,sizeof(sub_t)); - sub[subnum[i]]->grp=grpnum; - if(total_faddrs) - sub[subnum[i]]->faddr=faddr[0]; - else - memset(&sub[subnum[i]]->faddr,0,sizeof(faddr_t)); - sub[subnum[i]]->maxmsgs=500; - strcpy(sub[subnum[i]]->code,code); - strcpy(sub[subnum[i]]->lname,str); - strcpy(sub[subnum[i]]->sname,str2); - strcpy(sub[subnum[i]]->qwkname,str3); - sub[subnum[i]]->misc=(SUB_NSDEF|SUB_SSDEF|SUB_QUOTE|SUB_TOUSER - |SUB_HDRMOD|SUB_FAST); - sub[subnum[i]]->ptridx=ptridx; - total_subs++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Delete Data in Sub-board: - -If you want to delete all the messages for this sub-board, select Yes. -*/ - j=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Delete Data in Sub-board",opt); - if(j==-1) - continue; - if(j==0) { - sprintf(str,"%s.s*",sub[subnum[i]]->code); - if(!sub[subnum[i]]->data_dir[0]) - sprintf(tmp,"%sSUBS\\",data_dir); - else - strcpy(tmp,sub[subnum[i]]->data_dir); - delfiles(tmp,str); - clearptrs(subnum[i]); } - FREE(sub[subnum[i]]); - total_subs--; - for(j=subnum[i];j<total_subs;j++) - sub[j]=sub[j+1]; - for(q=0;q<total_qhubs;q++) - for(s=0;s<qhub[q]->subs;s++) { - if(qhub[q]->sub[s]==subnum[i]) - qhub[q]->sub[s]=INVALID_SUB; - else if(qhub[q]->sub[s]>subnum[i]) - qhub[q]->sub[s]--; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savsub=*sub[subnum[i]]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - ptridx=sub[subnum[i]]->ptridx; - *sub[subnum[i]]=savsub; - sub[subnum[i]]->ptridx=ptridx; - sub[subnum[i]]->grp=grpnum; - changes=1; - continue; } - i=subnum[i]; - j=0; - done=0; - while(!done) { - n=0; - sprintf(opt[n++],"%-27.27s%s","Long Name",sub[i]->lname); - sprintf(opt[n++],"%-27.27s%s","Short Name",sub[i]->sname); - sprintf(opt[n++],"%-27.27s%s","QWK Name",sub[i]->qwkname); - sprintf(opt[n++],"%-27.27s%s","Internal Code",sub[i]->code); - sprintf(opt[n++],"%-27.27s%.40s","Access Requirements" - ,sub[i]->ar); - sprintf(opt[n++],"%-27.27s%.40s","Reading Requirements" - ,sub[i]->read_ar); - sprintf(opt[n++],"%-27.27s%.40s","Posting Requirements" - ,sub[i]->post_ar); - sprintf(opt[n++],"%-27.27s%.40s","Operator Requirements" - ,sub[i]->op_ar); - sprintf(opt[n++],"%-27.27s%.40s","Moderated Posting User" - ,sub[i]->mod_ar); - sprintf(opt[n++],"%-27.27s%u","Maximum Messages" - ,sub[i]->maxmsgs); - if(sub[i]->maxage) - sprintf(str,"Enabled (%u days old)",sub[i]->maxage); - else - strcpy(str,"Disabled"); - sprintf(opt[n++],"%-27.27s%s","Purge by Age",str); - if(sub[i]->maxcrcs) - sprintf(str,"Enabled (%lu message CRCs)",sub[i]->maxcrcs); - else - strcpy(str,"Disabled"); - sprintf(opt[n++],"%-27.27s%s","Duplicate Checking",str); - - strcpy(opt[n++],"Toggle Options..."); - strcpy(opt[n++],"Network Options..."); - strcpy(opt[n++],"Advanced Options..."); - opt[n][0]=0; - sprintf(str,"%s Sub-board",sub[i]->sname); - savnum=1; - SETHELP(WHERE); -/* -Sub-board Configuration: - -This menu allows you to configure the individual selected sub-board. -Options with a trailing ... provide a sub-menu of more options. -*/ - switch(ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT - ,0,0,60,&opt_dflt,0,str,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Sub-board Long Name: - -This is a description of the message sub-board which is displayed in all -sub-board listings. -*/ - strcpy(str,sub[i]->lname); /* save */ - if(!uinput(WIN_MID|WIN_SAV,0,17,"Name to use for Listings" - ,sub[i]->lname,LEN_SLNAME,K_EDIT)) - strcpy(sub[i]->lname,str); /* restore */ - break; - case 1: - SETHELP(WHERE); -/* -Sub-board Short Name: - -This is a short description of the message sub-board which is displayed -at the main and reading messages prompts. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Name to use for Prompts" - ,sub[i]->sname,LEN_SSNAME,K_EDIT); - break; - case 2: - SETHELP(WHERE); -/* -Sub-board QWK Name: - -This is the name of the sub-board used for QWK off-line readers. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Name to use for QWK Packets" - ,sub[i]->qwkname,10,K_EDIT); - break; - case 3: - SETHELP(WHERE); -/* -Sub-board Internal Code: - -Every sub-board must have its own unique code for Synchronet to refer -to it internally. This code should be descriptive of the sub-board's -topic, usually an abreviation of the sub-board's name. -*/ - strcpy(str,sub[i]->code); - uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)" - ,str,8,K_EDIT|K_UPPER); - if(code_ok(str)) - strcpy(sub[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; - case 4: - savnum=2; - sprintf(str,"%s Access",sub[i]->sname); - getar(str,sub[i]->ar); - break; - case 5: - savnum=2; - sprintf(str,"%s Reading",sub[i]->sname); - getar(str,sub[i]->read_ar); - break; - case 6: - savnum=2; - sprintf(str,"%s Posting",sub[i]->sname); - getar(str,sub[i]->post_ar); - break; - case 7: - savnum=2; - sprintf(str,"%s Operator",sub[i]->sname); - getar(str,sub[i]->op_ar); - break; - case 8: - savnum=2; - sprintf(str,"%s Moderated Posting User",sub[i]->sname); - getar(str,sub[i]->mod_ar); - break; - case 9: - sprintf(str,"%u",sub[i]->maxmsgs); - SETHELP(WHERE); -/* -Maximum Number of Messages: - -This value is the maximum number of messages that will be kept in the -sub-board. Once this maximum number of messages is reached, the oldest -messages will be automatically purged. Usually, 100 messages is a -sufficient maximum. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Maximum Number of Messages" - ,str,5,K_EDIT|K_NUMBER); - sub[i]->maxmsgs=atoi(str); - sub[i]->misc|=SUB_HDRMOD; - break; - case 10: - sprintf(str,"%u",sub[i]->maxage); - SETHELP(WHERE); -/* -Maximum Age of Messages: - -This value is the maximum number of days that messages will be kept in -the sub-board. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Maximum Age of Messages (in days)" - ,str,5,K_EDIT|K_NUMBER); - sub[i]->maxage=atoi(str); - sub[i]->misc|=SUB_HDRMOD; - break; - case 11: - sprintf(str,"%u",sub[i]->maxcrcs); - SETHELP(WHERE); -/* -Maximum Number of CRCs: - -This value is the maximum number of CRCs that will be kept in the -sub-board for duplicate message checking. Once this maximum number of -CRCs is reached, the oldest CRCs will be automatically purged. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Maximum Number of CRCs" - ,str,5,K_EDIT|K_NUMBER); - sub[i]->maxcrcs=atol(str); - sub[i]->misc|=SUB_HDRMOD; - break; - case 12: - while(1) { - n=0; - sprintf(opt[n++],"%-27.27s%s","Allow Private Posts" - ,sub[i]->misc&SUB_PRIV ? sub[i]->misc&SUB_PONLY - ? "Only":"Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Allow Anonymous Posts" - ,sub[i]->misc&SUB_ANON ? sub[i]->misc&SUB_AONLY - ? "Only":"Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Post Using Real Names" - ,sub[i]->misc&SUB_NAME ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Users Can Delete Posts" - ,sub[i]->misc&SUB_DEL ? sub[i]->misc&SUB_DELLAST - ? "Last":"Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Default On for New Scan" - ,sub[i]->misc&SUB_NSDEF ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Forced On for New Scan" - ,sub[i]->misc&SUB_FORCED ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Default On for Your Scan" - ,sub[i]->misc&SUB_SSDEF ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Public 'To' User" - ,sub[i]->misc&SUB_TOUSER ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Allow Message Quoting" - ,sub[i]->misc&SUB_QUOTE ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Permanent Operator Msgs" - ,sub[i]->misc&SUB_SYSPERM ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Kill Read Messages" - ,sub[i]->misc&SUB_KILL ? "Yes" - : (sub[i]->misc&SUB_KILLP ? "Pvt" : "No")); -#if 1 - sprintf(opt[n++],"%-27.27s%s","Compress Messages (LZH)" - ,sub[i]->misc&SUB_LZH ? "Yes" : "No"); -#endif - opt[n][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Sub-board Toggle Options: - -This menu allows you to toggle certain options for the selected -sub-board between two or more settings, such as Yes and No. -*/ - n=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,36,&tog_dflt,0 - ,"Toggle Options",opt); - if(n==-1) - break; - savnum=3; - switch(n) { - case 0: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Only"); - opt[3][0]=0; - SETHELP(WHERE); -/* -Allow Private Posts on Sub-board: - -If you want users to be able to post private messages to other users -on this sub-board, set this value to Yes. Usually, E-mail is the -preferred method of private communication. If you want users to be able -to post private messages only on this sub-board, select Only. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Allow Private Posts",opt); - if(n==-1) - break; - if(!n && (sub[i]->misc&(SUB_PRIV|SUB_PONLY)) - !=SUB_PRIV) { - changes=1; - sub[i]->misc&=~SUB_PONLY; - sub[i]->misc|=SUB_PRIV; - break; } - if(n==1 && sub[i]->misc&SUB_PRIV) { - changes=1; - sub[i]->misc&=~SUB_PRIV; - break; } - if(n==2 && (sub[i]->misc&(SUB_PRIV|SUB_PONLY)) - !=(SUB_PRIV|SUB_PONLY)) { - changes=1; - sub[i]->misc|=(SUB_PRIV|SUB_PONLY); } - break; - case 1: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Only"); - opt[3][0]=0; - SETHELP(WHERE); -/* -Allow Anonymous Posts on Sub-board: - -If you want users with the A exemption to be able to post anonymously on -this sub-board, select Yes. If you want all posts on this sub-board to be -forced anonymous, select Only. If you do not want anonymous posts allowed -on this sub-board at all, select No. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Allow Anonymous Posts",opt); - if(n==-1) - break; - if(!n && (sub[i]->misc&(SUB_ANON|SUB_AONLY)) - !=SUB_ANON) { - changes=1; - sub[i]->misc&=~SUB_AONLY; - sub[i]->misc|=SUB_ANON; - break; } - if(n==1 && sub[i]->misc&(SUB_ANON|SUB_AONLY)) { - changes=1; - sub[i]->misc&=~(SUB_ANON|SUB_AONLY); - break; } - if(n==2 && (sub[i]->misc&(SUB_ANON|SUB_AONLY)) - !=(SUB_ANON|SUB_AONLY)) { - changes=1; - sub[i]->misc|=(SUB_ANON|SUB_AONLY); } - break; - case 2: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -User Real Names in Posts on Sub-board: - -If you allow aliases on your system, you can have messages on this -sub-board automatically use the real name of the posting user by setting -this option to Yes. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Use Real Names in Posts",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_NAME)) { - changes=1; - sub[i]->misc|=SUB_NAME; - break; } - if(n==1 && sub[i]->misc&SUB_NAME) { - changes=1; - sub[i]->misc&=~SUB_NAME; } - break; - case 3: - n=2; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Last Post Only"); - opt[3][0]=0; - SETHELP(WHERE); -/* -Users Can Delete Posts on Sub-board: - -If you want users to be able to delete any of their own posts on this -sub-board, set this option to Yes. If you want to allow users the -ability to delete their message only if it is the last message on the -sub-board, select Last Post Only. If you want to disallow users from -deleting any of their posts, set this option to No. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Users Can Delete Posts",opt); - if(n==-1) - break; - if(!n && (sub[i]->misc&(SUB_DEL|SUB_DELLAST)) - !=SUB_DEL) { - changes=1; - sub[i]->misc&=~SUB_DELLAST; - sub[i]->misc|=SUB_DEL; - break; } - if(n==1 && sub[i]->misc&SUB_DEL) { - changes=1; - sub[i]->misc&=~SUB_DEL; - break; } - if(n==2 && (sub[i]->misc&(SUB_DEL|SUB_DELLAST)) - !=(SUB_DEL|SUB_DELLAST)) { - changes=1; - sub[i]->misc|=(SUB_DEL|SUB_DELLAST); } - break; - case 4: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Default On for New Scan: - -If you want this sub-board to be included in all user new message scans -by default, set this option to Yes. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Default On for New Scan",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_NSDEF)) { - changes=1; - sub[i]->misc|=SUB_NSDEF; - break; } - if(n==1 && sub[i]->misc&SUB_NSDEF) { - changes=1; - sub[i]->misc&=~SUB_NSDEF; } - break; - case 5: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Forced On for New Scan: - -If you want this sub-board to be included in all user new message scans -even if the user has removed it from their new scan configuration, set -this option to Yes. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Forced New Scan",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_FORCED)) { - changes=1; - sub[i]->misc|=SUB_FORCED; - break; } - if(n==1 && sub[i]->misc&SUB_FORCED) { - changes=1; - sub[i]->misc&=~SUB_FORCED; } - break; - case 6: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Default On for Your Scan: - -If you want this sub-board to be included in all user personal message -scans by default, set this option to Yes. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Default On for Your Scan",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_SSDEF)) { - changes=1; - sub[i]->misc|=SUB_SSDEF; - break; } - if(n==1 && sub[i]->misc&SUB_SSDEF) { - changes=1; - sub[i]->misc&=~SUB_SSDEF; } - break; - case 7: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Prompt for 'To' User on Public Posts: - -If you want all posts on this sub-board to be prompted for a 'To' user, -set this option to Yes. This is a useful option for sub-boards that -are on a network that does not allow private posts. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Prompt for 'To' User on Public Posts",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_TOUSER)) { - changes=1; - sub[i]->misc|=SUB_TOUSER; - break; } - if(n==1 && sub[i]->misc&SUB_TOUSER) { - changes=1; - sub[i]->misc&=~SUB_TOUSER; } - break; - case 8: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Allow Message Quoting: - -If you want users to be allowed to quote messages on this sub-board, set -this option to Yes. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Allow Message Quoting",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_QUOTE)) { - changes=1; - sub[i]->misc|=SUB_QUOTE; - break; } - if(n==1 && sub[i]->misc&SUB_QUOTE) { - changes=1; - sub[i]->misc&=~SUB_QUOTE; } - break; - case 9: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Operator Messages Automatically Permanent: - -If you want messages posted by System and Sub-board Operators to be -automatically permanent (non-purgable) for this sub-board, set this -option to Yes. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Permanent Operator Messages",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_SYSPERM)) { - changes=1; - sub[i]->misc|=SUB_SYSPERM; - break; } - if(n==1 && sub[i]->misc&SUB_SYSPERM) { - changes=1; - sub[i]->misc&=~SUB_SYSPERM; } - break; - case 10: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Private"); - opt[3][0]=0; - SETHELP(WHERE); -/* -Kill Read Messages Automatically: - -If you want messages that have been read by the intended recipient to -be automatically deleted by SMBUTIL, set this option to Yes or -Private if you want only private messages to be automatically deleted. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Kill Read Messages",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_KILL)) { - changes=1; - sub[i]->misc|=SUB_KILL; - sub[i]->misc&=~SUB_KILLP; - break; } - if(n==1 && sub[i]->misc&(SUB_KILL|SUB_KILLP)) { - changes=1; - sub[i]->misc&=~(SUB_KILL|SUB_KILLP); } - if(n==2 && !(sub[i]->misc&SUB_KILLP)) { - changes=1; - sub[i]->misc|=SUB_KILLP; - sub[i]->misc&=~SUB_KILL; - break; } - break; -#if 1 - case 11: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Compress Messages with LZH Encoding: - -If you want all messages in this sub-board to be automatically -compressed via LZH (Lempel/Ziv/Huffman algorithm used in LHarc, LHA, -and other popular compression and archive programs), this option to Yes. - -Compression will slow down the reading and writing of messages slightly, -but the storage space saved can be as much as 50 percent. - -Before setting this option to Yes, make sure that all of the SMB -compatible mail programs you use support the LZH translation. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Compress Messages (LZH)",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_LZH)) { - changes=1; - sub[i]->misc|=SUB_LZH; - break; } - if(n==1 && sub[i]->misc&SUB_LZH) { - changes=1; - sub[i]->misc&=~SUB_LZH; } - break; -#endif - } } - break; - case 13: - while(1) { - n=0; - sprintf(opt[n++],"%-27.27s%s","Append Tag/Origin Line" - ,sub[i]->misc&SUB_NOTAG ? "No":"Yes"); - sprintf(opt[n++],"%-27.27s%s","Export ASCII Only" - ,sub[i]->misc&SUB_ASCII ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Gate Between Net Types" - ,sub[i]->misc&SUB_GATE ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","QWK Networked" - ,sub[i]->misc&SUB_QNET ? "Yes":"No"); - sprintf(opt[n++],"QWK Tagline"); - sprintf(opt[n++],"%-27.27s%s","Internet" - ,sub[i]->misc&SUB_INET ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","PostLink or PCRelay" - ,sub[i]->misc&SUB_PNET ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","FidoNet EchoMail" - ,sub[i]->misc&SUB_FIDO ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","FidoNet Address" - ,faddrtoa(sub[i]->faddr)); - sprintf(opt[n++],"EchoMail Origin Line"); - if(!sub[i]->echopath[0]) - sprintf(str,"%s%s\\",echomail_dir,sub[i]->code); - else - strcpy(str,sub[i]->echopath); - sprintf(opt[n++],"%-27.27s%.40s","EchoMail Directory" - ,str); - if(!sub[i]->echomail_sem[0]) - strcpy(str,echomail_sem); - else - strcpy(str,sub[i]->echomail_sem); - sprintf(opt[n++],"%-27.27s%.40s","EchoMail Semaphore File" - ,str); - opt[n][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Sub-board Network Options: - -This menu contains options for the selected sub-board that pertain -specifically to message networking. -*/ - n=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&net_dflt,0 - ,"Network Options",opt); - if(n==-1) - break; - savnum=3; - switch(n) { - case 0: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Append Tag/Origin Line to Posts: - -If you want to disable the automatic addition of a network tagline or -origin line to the bottom of outgoing networked posts from this -sub-board, set this option to No. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Append Tag/Origin Line to Posts",opt); - if(n==-1) - break; - if(!n && sub[i]->misc&SUB_NOTAG) { - changes=1; - sub[i]->misc&=~SUB_NOTAG; - break; } - if(n==1 && !(sub[i]->misc&SUB_NOTAG)) { - changes=1; - sub[i]->misc|=SUB_NOTAG; } - break; - case 1: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Export ASCII Characters Only: - -If the network that this sub-board is echoed on does not allow extended -ASCII (>127) or control codes (<20, not including CR), set this option -to Yes. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Export ASCII Characters Only",opt); - if(n==-1) - break; - if(n && sub[i]->misc&SUB_ASCII) { - changes=1; - sub[i]->misc&=~SUB_ASCII; - break; } - if(!n && !(sub[i]->misc&SUB_ASCII)) { - changes=1; - sub[i]->misc|=SUB_ASCII; } - break; - case 2: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Gate Between Net Types: - -If this sub-board is networked using more than one network technology, -and you want messages to be gated between the networks, set this -option to Yes. - -If this option is set to No, messages imported from one network type -will not be exported to another network type. This is the default and -should be used unless you have specific permission from both networks -to gate this sub-board. Incorrectly gated sub-boards can cause duplicate -messages loops and cross-posted messages. - -This option does not affect the exporting of messages created on your -BBS. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Gate Between Net Types",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_GATE)) { - changes=1; - sub[i]->misc|=SUB_GATE; - break; } - if(n==1 && sub[i]->misc&SUB_GATE) { - changes=1; - sub[i]->misc&=~SUB_GATE; } - break; - case 3: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Sub-board Networked via QWK Packets: - -If this sub-board is networked with other BBSs via QWK packets, this -option should be set to Yes. With this option set to Yes, titles of -posts on this sub-board will be limited to the QWK packet limitation of -25 characters. It also allows the Network restriction to function -properly. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Networked via QWK Packets",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_QNET)) { - changes=1; - sub[i]->misc|=SUB_QNET; - break; } - if(n==1 && sub[i]->misc&SUB_QNET) { - changes=1; - sub[i]->misc&=~SUB_QNET; } - break; - case 4: - SETHELP(WHERE); -/* -Sub-board QWK Network Tagline: - -If you want to use a different QWK tagline than the configured default -tagline in the Networks configuration, you should enter that tagline -here. If this option is left blank, the default tagline is used. -*/ - uinput(WIN_MID|WIN_SAV,0,0,nulstr,sub[i]->tagline - ,63,K_MSG|K_EDIT); - break; - case 5: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Sub-board Networked via Internet: - -If this sub-board is networked to the Internet via UUCP, this option -should be set to Yes. - -It will allow the Network restriction to function properly. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Networked via Internet",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_INET)) { - changes=1; - sub[i]->misc|=SUB_INET; - break; } - if(n==1 && sub[i]->misc&SUB_INET) { - changes=1; - sub[i]->misc&=~SUB_INET; } - break; - case 6: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Sub-board Networked via PostLink or PCRelay: - -If this sub-board is networked with other BBSs via PostLink or PCRelay, -this option should be set to Yes. With this option set to Yes, -titles of posts on this sub-board will be limited to the UTI -specification limitation of 25 characters. It also allows the Network -restriction to function properly. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Networked via PostLink or PCRelay",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_PNET)) { - changes=1; - sub[i]->misc|=SUB_PNET; - break; } - if(n==1 && sub[i]->misc&SUB_PNET) { - changes=1; - sub[i]->misc&=~SUB_PNET; } - break; - case 7: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Sub-board Networked via FidoNet EchoMail: - -If this sub-board is part of a FidoNet EchoMail conference, set this -option to Yes. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Networked via FidoNet EchoMail",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_FIDO)) { - changes=1; - sub[i]->misc|=SUB_FIDO; - break; } - if(n==1 && sub[i]->misc&SUB_FIDO) { - changes=1; - sub[i]->misc&=~SUB_FIDO; } - break; - case 8: - strcpy(str,faddrtoa(sub[i]->faddr)); - SETHELP(WHERE); -/* -Sub-board FidoNet Address: - -If this sub-board is part of a FidoNet EchoMail conference, this is -the address used for this sub-board. Format: Zone:Net/Node[.Point] -*/ - uinput(WIN_MID|WIN_SAV,0,0,"FidoNet Address" - ,str,20,K_EDIT); - sub[i]->faddr=atofaddr(str); - break; - case 9: - SETHELP(WHERE); -/* -Sub-board FidoNet Origin Line: - -If this sub-board is part of a FidoNet EchoMail conference and you -want to use an origin line other than the default origin line in the -Networks configuration, set this value to the desired origin line. - -If this option is blank, the default origin line is used. -*/ - uinput(WIN_MID|WIN_SAV,0,0,nulstr,sub[i]->origline - ,50,K_EDIT); - break; - case 10: - SETHELP(WHERE); -/* -Sub-board EchoMail Storage Directory: - -This is the storage directory where FidoNet style (FTS-0001 stored -message format) messages are imported from and exported to for this -sub-board. If this option is blank, then the EchoMail Base Directory is -used with the internal code of this sub-board as the sub-directory where -the FidoNet messages are stored. -*/ - - uinput(WIN_MID|WIN_SAV,0,0 - ,"EchoMail Directory" - ,sub[i]->echopath,50,K_UPPER|K_EDIT); - break; - case 11: -SETHELP(WHERE); -/* -EchoMail Semaphore File: - -This is a filename that will be used as a semaphore (signal) to your -FidoNet front-end that new EchoMail has been created and the messages -should be re-scanned. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"EchoMail Semaphore" - ,sub[i]->echomail_sem,50,K_EDIT|K_UPPER); - break; } } - break; - case 14: - while(1) { - n=0; - if(sub[i]->qwkconf) - sprintf(str,"Static (%u)",sub[i]->qwkconf); - else - strcpy(str,"Dynamic"); - sprintf(opt[n++],"%-27.27s%s","QWK Conference Number" - ,str); - sprintf(opt[n++],"%-27.27s%s","Storage Method" - ,sub[i]->misc&SUB_HYPER ? "Hyper Allocation" - : sub[i]->misc&SUB_FAST ? "Fast Allocation" - : "Self-packing"); - if(!sub[i]->data_dir[0]) - sprintf(str,"%sSUBS\\",data_dir); - else - strcpy(str,sub[i]->data_dir); - sprintf(opt[n++],"%-27.27s%.40s","Storage Directory",str); - opt[n][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Sub-board Advanced Options: - -This menu contains options for the selected sub-board that are advanced -in nature. -*/ - n=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,60,&adv_dflt,0 - ,"Advanced Options",opt); - if(n==-1) - break; - savnum=3; - switch(n) { - case 0: - SETHELP(WHERE); -/* -Sub-board QWK Conference Number: - -If you wish to have the QWK conference number for this sub-board -automatically generated by Synchronet (based on the group number -and sub-board number for the user), set this option to Dynamic. - -If you wish to have the same QWK conference number for this sub-board -regardless of which user access it, set this option to Static -by entering the conference number you want to use. -*/ - if(sub[i]->qwkconf) - sprintf(str,"%u",sub[i]->qwkconf); - else - str[0]=0; - if(uinput(WIN_MID|WIN_SAV,0,17 - ,"QWK Conference Number (0=Dynamic)" - ,str,5,K_EDIT|K_NUMBER)>=0) - sub[i]->qwkconf=atoi(str); - break; - case 1: - n=0; - strcpy(opt[0],"Hyper Allocation"); - strcpy(opt[1],"Fast Allocation"); - strcpy(opt[2],"Self-packing"); - opt[3][0]=0; - SETHELP(WHERE); -/* -Self-Packing is the slowest storage method because it conserves disk - space as it imports messages by using deleted message header and data - blocks for new messages automatically. If you use this storage method, - you will not need to run SMBUTIL P on this message base unless you - accumilate a large number of deleted message blocks and wish to free - that disk space. You can switch from self-packing to fast allocation - storage method and back again as you wish. -Fast Allocation is faster than self-packing because it does not search - for deleted message blocks for new messages. It automatically places - all new message blocks at the end of the header and data files. If you - use this storage method, you will need to run SMBUTIL P on this - message base periodically or it will continually use up disk space. -Hyper Allocation is the fastest storage method because it does not - maintain allocation files at all. Once a message base is setup to use - this storage method, it should not be changed without first deleting - the message base data files in your DATA\DIRS\SUBS directory for this - sub-board. You must use SMBUTIL P as with the fast allocation method. -*/ - n=ulist(WIN_SAV|WIN_MID,0,0,0,&n,0 - ,"Storage Method",opt); - if(n==-1) - break; - if(!n && !(sub[i]->misc&SUB_HYPER)) { - changes=1; - sub[i]->misc|=SUB_HYPER; - sub[i]->misc&=~SUB_FAST; - sub[i]->misc|=SUB_HDRMOD; - break; } - if(!n) - break; - if(sub[i]->misc&SUB_HYPER) { /* Switching from hyper */ - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No, I want to use Hyper Allocation"); - opt[2][0]=0; - m=0; - if(ulist(WIN_SAV|WIN_MID,0,0,0,&m,0 - ,"Delete all messages in this sub-board?",opt)!=0) - break; - if(sub[i]->data_dir[0]) - sprintf(str,"%s",sub[i]->data_dir); - else - sprintf(str,"%sSUBS\\",data_dir); - sprintf(str2,"%s.*",sub[i]->code); - delfiles(str,str2); } - - if(sub[i]->misc&SUB_HYPER) - sub[i]->misc|=SUB_HDRMOD; - if(n==1 && !(sub[i]->misc&SUB_FAST)) { - changes=1; - sub[i]->misc|=SUB_FAST; - sub[i]->misc&=~SUB_HYPER; - break; } - if(n==2 && sub[i]->misc&(SUB_FAST|SUB_HYPER)) { - changes=1; - sub[i]->misc&=~(SUB_FAST|SUB_HYPER); - break; } - break; - case 2: - SETHELP(WHERE); -/* -Sub-board Storage Directory: - -Use this if you wish to place the data directory for this sub-board on -another drive or in another directory besides the default setting. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Directory" - ,sub[i]->data_dir,50,K_EDIT|K_UPPER); - break; } } - break; - } } } -} diff --git a/src/sbbs2/scfg/scfgsys.c b/src/sbbs2/scfg/scfgsys.c deleted file mode 100644 index 4f6a595e39..0000000000 --- a/src/sbbs2/scfg/scfgsys.c +++ /dev/null @@ -1,1790 +0,0 @@ -#line 2 "SCFGSYS.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "scfg.h" - -void sys_cfg(void) -{ - static int sys_dflt,adv_dflt,tog_dflt,new_dflt; - char str[81],str2[81],done=0,*dupehelp; - int i,j,k,dflt,bar,savchanges; - -while(1) { - i=0; - sprintf(opt[i++],"%-33.33s%s","BBS Name",sys_name); - sprintf(opt[i++],"%-33.33s%s","Location",sys_location); - sprintf(opt[i++],"%-33.33s%s","Operator",sys_op); - sprintf(opt[i++],"%-33.33s%s","Password",sys_pass); - - sprintf(str,"%s Password" - ,sys_misc&SM_PWEDIT && sys_pwdays ? "Users Must Change" - : sys_pwdays ? "Users Get New Random" : "Users Can Change"); - if(sys_pwdays) - sprintf(tmp,"Every %u Days",sys_pwdays); - else if(sys_misc&SM_PWEDIT) - strcpy(tmp,"Yes"); - else - strcpy(tmp,"No"); - sprintf(opt[i++],"%-33.33s%s",str,tmp); - - sprintf(opt[i++],"%-33.33s%u","Days to Preserve Deleted Users" - ,sys_deldays); - sprintf(opt[i++],"%-33.33s%s","Maximum Days of Inactivity" - ,sys_autodel ? itoa(sys_autodel,tmp,10) : "Unlimited"); - sprintf(opt[i++],"%-33.33s%s","New User Password",new_pass); - - strcpy(opt[i++],"Toggle Options..."); - strcpy(opt[i++],"New User Values..."); - strcpy(opt[i++],"Advanced Options..."); - strcpy(opt[i++],"Loadable Modules..."); - strcpy(opt[i++],"Security Level Values..."); - strcpy(opt[i++],"Expired Account Values..."); - strcpy(opt[i++],"Quick-Validation Values..."); - opt[i][0]=0; - SETHELP(WHERE); -/* -System Configuration: - -This menu contains options and sub-menus of options that affect the -entire system. -*/ - switch(ulist(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&sys_dflt,0 - ,"System Configuration",opt)) { - case -1: - i=save_changes(WIN_MID); - if(i==-1) - break; - if(!i) - write_main_cfg(); - return; - case 0: - SETHELP(WHERE); -/* -BBS Name: - -This is the name of the BBS. -*/ - uinput(WIN_MID,0,0,"BBS Name",sys_name,40,K_EDIT); - break; - case 1: - SETHELP(WHERE); -/* -System Location: - -This is the location of the BBS. The format is flexible, but it is -suggested you use the City, State format for clarity. -*/ - uinput(WIN_MID,0,0,"Location",sys_location,40,K_EDIT); - break; - case 2: - SETHELP(WHERE); -/* -System Operator: - -This is the name or alias of the system operator. This does not have to -be the same as user #1. This field is used for documentary purposes -only. -*/ - uinput(WIN_MID,0,0,"System Operator",sys_op,40,K_EDIT); - break; - case 3: - SETHELP(WHERE); -/* -System Password: - -This is an extra security password required for sysop logon and certain -sysop functions. This password should be something not easily guessed -and should be kept absolutely confidential. This password must be -entered at the SY: prompt. -*/ - uinput(WIN_MID,0,0,"System Password",sys_pass,40,K_EDIT|K_UPPER); - break; - case 4: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - SETHELP(WHERE); -/* -Allow Users to Change Their Password: - -If you want the users of your system to have the option of changing -their password to a string of their choice, set this option to Yes. -For the highest level of security, set this option to No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Change Their Password",opt); - if(!i && !(sys_misc&SM_PWEDIT)) { - sys_misc|=SM_PWEDIT; - changes=1; } - else if(i==1 && sys_misc&SM_PWEDIT) { - sys_misc&=~SM_PWEDIT; - changes=1; } - i=0; - SETHELP(WHERE); -/* -Force Periodic Password Changes: - -If you want your users to be forced to change their passwords -periodically, select Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Force Periodic Password Changes",opt); - if(!i) { - itoa(sys_pwdays,str,10); - SETHELP(WHERE); -/* -Maximum Days Between Password Changes: - -Enter the maximum number of days allowed between password changes. -If a user has not voluntarily changed his or her password in this -many days, he or she will be forced to change their password upon -logon. -*/ - uinput(WIN_MID,0,0,"Maximum Days Between Password Changes" - ,str,5,K_NUMBER|K_EDIT); - sys_pwdays=atoi(str); } - else if(i==1 && sys_pwdays) { - sys_pwdays=0; - changes=1; } - - break; - case 5: - sprintf(str,"%u",sys_deldays); - SETHELP(WHERE); -/* -Days Since Last Logon to Preserve Deleted Users: - -Deleted user slots can be undeleted until the slot is written over -by a new user. If you want deleted user slots to be preserved for period -of time since their last logon, set this value to the number of days to -keep new users from taking over a deleted user's slot. -*/ - uinput(WIN_MID,0,0,"Days Since Last Logon to Preserve Deleted Users" - ,str,5,K_EDIT|K_NUMBER); - sys_deldays=atoi(str); - break; - case 6: - sprintf(str,"%u",sys_autodel); - SETHELP(WHERE); -/* -Maximum Days of Inactivity Before Auto-Deletion: - -If you want users that haven't logged on in certain period of time to -be automatically deleted, set this value to the maximum number of days -of inactivity before the user is deleted. Setting this value to 0 -disables this feature. - -Users with the P exemption will not be deleted due to inactivity. -*/ - uinput(WIN_MID,0,0,"Maximum Days of Inactivity Before Auto-Deletion" - ,str,5,K_EDIT|K_NUMBER); - sys_autodel=atoi(str); - break; - case 7: - SETHELP(WHERE); -/* -New User Password: - -If you want callers to only be able to logon as New if they know a -certain password, enter that password here. If you want any caller to -be able to logon as New, leave this option blank. -*/ - uinput(WIN_MID,0,0,"New User Password",new_pass,40 - ,K_EDIT|K_UPPER); - break; - case 8: /* Toggle Options */ - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-33.33s%s","Allow Aliases" - ,uq&UQ_ALIASES ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Allow Time Banking" - ,sys_misc&SM_TIMEBANK ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Allow Credit Conversions" - ,sys_misc&SM_NOCDTCVT ? "No" : "Yes"); - sprintf(opt[i++],"%-33.33s%s","Allow Local Sysop Access" - ,sys_misc&SM_L_SYSOP ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Allow Remote Sysop Access" - ,sys_misc&SM_R_SYSOP ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Echo Passwords Locally" - ,sys_misc&SM_ECHO_PW ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Require Passwords Locally" - ,sys_misc&SM_REQ_PW ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Short Sysop Page" - ,sys_misc&SM_SHRTPAGE ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Sound Alarm on Error" - ,sys_misc&SM_ERRALARM ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Include Sysop in Statistics" - ,sys_misc&SM_SYSSTAT ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Closed to New Users" - ,sys_misc&SM_CLOSED ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Use Location in User Lists" - ,sys_misc&SM_LISTLOC ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Military (24 hour) Time Format" - ,sys_misc&SM_MILITARY ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","European Date Format (DD/MM/YY)" - ,sys_misc&SM_EURODATE ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","User Expires When Out-of-time" - ,sys_misc&SM_TIME_EXP ? "Yes" : "No"); - sprintf(opt[i++],"%-33.33s%s","Quick Validation Hot-Keys" - ,sys_misc&SM_QVALKEYS ? "Yes" : "No"); - opt[i][0]=0; - savnum=0; - SETHELP(WHERE); -/* -System Toggle Options: - -This is a menu of system related options that can be toggled between -two or more states, such as Yes and No. -*/ - switch(ulist(WIN_ACT|WIN_BOT|WIN_RHT,0,0,41,&tog_dflt,0 - ,"Toggle Options",opt)) { - case -1: - done=1; - break; - case 0: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Allow Users to Use Aliases: - -If you want the users of your system to be allowed to be known by a -false name, handle, or alias, set this option to Yes. If you want all -users on your system to be known only by their real names, select No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Use Aliases",opt); - if(!i && !(uq&UQ_ALIASES)) { - uq|=UQ_ALIASES; - changes=1; } - else if(i==1 && uq&UQ_ALIASES) { - uq&=~UQ_ALIASES; - changes=1; } - break; - case 1: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Allow Time Banking: - -If you want the users of your system to be allowed to be deposit -any extra time they may have left during a call into their minute bank, -set this option to Yes. If this option is set to No, then the only -way a user may get minutes in their minute bank is to purchase them -with credits. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Depost Time in Minute Bank",opt); - if(!i && !(sys_misc&SM_TIMEBANK)) { - sys_misc|=SM_TIMEBANK; - changes=1; } - else if(i==1 && sys_misc&SM_TIMEBANK) { - sys_misc&=~SM_TIMEBANK; - changes=1; } - break; - case 2: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Allow Credits to be Converted into Minutes: - -If you want the users of your system to be allowed to be convert -any credits they may have into minutes for their minute bank, -set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Users to Convert Credits into Minutes" - ,opt); - if(!i && sys_misc&SM_NOCDTCVT) { - sys_misc&=~SM_NOCDTCVT; - changes=1; } - else if(i==1 && !(sys_misc&SM_NOCDTCVT)) { - sys_misc|=SM_NOCDTCVT; - changes=1; } - break; - case 3: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Allow Local Sysop Access: - -If you want to be able to logon locally with sysop access, set this -option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Local Sysop Access",opt); - if(!i && !(sys_misc&SM_L_SYSOP)) { - sys_misc|=SM_L_SYSOP; - changes=1; } - else if(i==1 && sys_misc&SM_L_SYSOP) { - sys_misc&=~SM_L_SYSOP; - changes=1; } - break; - case 4: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Allow Remote Sysop Access: - -If you want to be able to logon remotely with sysop access, set this -option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Allow Remote Sysop Access",opt); - if(!i && !(sys_misc&SM_R_SYSOP)) { - sys_misc|=SM_R_SYSOP; - changes=1; } - else if(i==1 && sys_misc&SM_R_SYSOP) { - sys_misc&=~SM_R_SYSOP; - changes=1; } - break; - case 5: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Echo Passwords Locally: - -If you want to passwords to be displayed locally, set this option to -Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Echo Passwords Locally",opt); - if(!i && !(sys_misc&SM_ECHO_PW)) { - sys_misc|=SM_ECHO_PW; - changes=1; } - else if(i==1 && sys_misc&SM_ECHO_PW) { - sys_misc&=~SM_ECHO_PW; - changes=1; } - break; - case 6: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Require Passwords Locally: - -If you want to passwords to be required when logged on locally, set this -option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Require Passwords Locally",opt); - if(!i && !(sys_misc&SM_REQ_PW)) { - sys_misc|=SM_REQ_PW; - changes=1; } - else if(i==1 && sys_misc&SM_REQ_PW) { - sys_misc&=~SM_REQ_PW; - changes=1; } - break; - case 7: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Short Sysop Page: - -If you would like the sysop page to be a short series of beeps rather -than continuous random tones, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0,"Short Sysop Page" - ,opt); - if(i==1 && sys_misc&SM_SHRTPAGE) { - sys_misc&=~SM_SHRTPAGE; - changes=1; } - else if(!i && !(sys_misc&SM_SHRTPAGE)) { - sys_misc|=SM_SHRTPAGE; - changes=1; } - break; - case 8: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -Sound Alarm on Error: - -If you would like to have an alarm sounded locally when a critical -system error has occured, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Sound Alarm on Error",opt); - if(i==1 && sys_misc&SM_ERRALARM) { - sys_misc&=~SM_ERRALARM; - changes=1; } - else if(!i && !(sys_misc&SM_ERRALARM)) { - sys_misc|=SM_ERRALARM; - changes=1; } - break; - case 9: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - SETHELP(WHERE); -/* -Include Sysop Activity in System Statistics: - -If you want sysops to be included in the statistical data of the BBS, -set this option to Yes. The suggested setting for this option is -No so that statistical data will only reflect user usage and not -include sysop maintenance activity. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Include Sysop Activity in System Statistics" - ,opt); - if(!i && !(sys_misc&SM_SYSSTAT)) { - sys_misc|=SM_SYSSTAT; - changes=1; } - else if(i==1 && sys_misc&SM_SYSSTAT) { - sys_misc&=~SM_SYSSTAT; - changes=1; } - break; - case 10: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - SETHELP(WHERE); -/* -Closed to New Users: - -If you want callers to be able to logon as New, set this option to No. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Closed to New Users",opt); - if(!i && !(sys_misc&SM_CLOSED)) { - sys_misc|=SM_CLOSED; - changes=1; } - else if(i==1 && sys_misc&SM_CLOSED) { - sys_misc&=~SM_CLOSED; - changes=1; } - break; - case 11: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=0; - SETHELP(WHERE); -/* -User Location in User Lists: - -If you want user locations (city, state) displayed in the user lists, -set this option to Yes. If this option is set to No, the user notes -(if they exist) are displayed in the user lists. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"User Location (Instead of Note) in User Lists" - ,opt); - if(!i && !(sys_misc&SM_LISTLOC)) { - sys_misc|=SM_LISTLOC; - changes=1; } - else if(i==1 && sys_misc&SM_LISTLOC) { - sys_misc&=~SM_LISTLOC; - changes=1; } - break; - case 12: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - SETHELP(WHERE); -/* -Military: - -If you would like the time-of-day to be displayed and entered in 24 hour -format always, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Use Military Time Format",opt); - if(!i && !(sys_misc&SM_MILITARY)) { - sys_misc|=SM_MILITARY; - changes=1; } - else if(i==1 && sys_misc&SM_MILITARY) { - sys_misc&=~SM_MILITARY; - changes=1; } - break; - case 13: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - SETHELP(WHERE); -/* -European Date Format: - -If you would like dates to be displayed and entered in DD/MM/YY format -instead of MM/DD/YY format, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"European Date Format",opt); - if(!i && !(sys_misc&SM_EURODATE)) { - sys_misc|=SM_EURODATE; - changes=1; } - else if(i==1 && sys_misc&SM_EURODATE) { - sys_misc&=~SM_EURODATE; - changes=1; } - break; - - case 14: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - SETHELP(WHERE); -/* -User Expires When Out-of-time: - -If you want users to be set to Expired User Values if they run out of -time online, then set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"User Expires When Out-of-time",opt); - if(!i && !(sys_misc&SM_TIME_EXP)) { - sys_misc|=SM_TIME_EXP; - changes=1; } - else if(i==1 && sys_misc&SM_TIME_EXP) { - sys_misc&=~SM_TIME_EXP; - changes=1; } - break; - - case 15: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - SETHELP(WHERE); -/* -Quick Validation Hot-Keys: - -If you would like to enable the Alt-# hot-keys for quick user -validation, set this option to Yes. -*/ - i=ulist(WIN_MID|WIN_SAV,0,0,0,&i,0 - ,"Quick Validation Hot-Keys",opt); - if(!i && !(sys_misc&SM_QVALKEYS)) { - sys_misc|=SM_QVALKEYS; - changes=1; } - else if(i==1 && sys_misc&SM_QVALKEYS) { - sys_misc&=~SM_QVALKEYS; - changes=1; } - break; - - } } - break; - case 9: /* New User Values */ - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%u","Level",new_level); - sprintf(opt[i++],"%-27.27s%s","Flag Set #1" - ,ltoaf(new_flags1,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #2" - ,ltoaf(new_flags2,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #3" - ,ltoaf(new_flags3,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #4" - ,ltoaf(new_flags4,str)); - sprintf(opt[i++],"%-27.27s%s","Exemptions" - ,ltoaf(new_exempt,str)); - sprintf(opt[i++],"%-27.27s%s","Restrictions" - ,ltoaf(new_rest,str)); - sprintf(opt[i++],"%-27.27s%s","Expiration Days" - ,itoa(new_expire,str,10)); - - ultoac(new_cdt,str); - sprintf(opt[i++],"%-27.27s%s","Credits",str); - ultoac(new_min,str); - sprintf(opt[i++],"%-27.27s%s","Minutes",str); - sprintf(opt[i++],"%-27.27s%s","Editor" - ,new_xedit); - sprintf(opt[i++],"%-27.27s%s","Command Shell" - ,shell[new_shell]->code); - if(new_prot!=SP) - sprintf(str,"%c",new_prot); - else - strcpy(str,"None"); - sprintf(opt[i++],"%-27.27s%s","Download Protocol",str); - strcpy(opt[i++],"Default Toggles..."); - strcpy(opt[i++],"Question Toggles..."); - opt[i][0]=0; - SETHELP(WHERE); -/* -New User Values: - -This menu allows you to determine the default settings for new users. -*/ - switch(ulist(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&new_dflt,0 - ,"New User Values",opt)) { - case -1: - done=1; - break; - case 0: - itoa(new_level,str,10); - SETHELP(WHERE); -/* -New User Security Level: - -This is the security level automatically given to new users. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Security Level" - ,str,2,K_EDIT|K_NUMBER); - new_level=atoi(str); - break; - case 1: - ltoaf(new_flags1,str); - SETHELP(WHERE); -/* -New User Security Flags: - -These are the security flags automatically given to new users. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Flag Set #1" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - new_flags1=aftol(str); - break; - case 2: - ltoaf(new_flags2,str); - SETHELP(WHERE); -/* -New User Security Flags: - -These are the security flags automatically given to new users. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Flag Set #2" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - new_flags2=aftol(str); - break; - case 3: - ltoaf(new_flags3,str); - SETHELP(WHERE); -/* -New User Security Flags: - -These are the security flags automatically given to new users. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Flag Set #3" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - new_flags3=aftol(str); - break; - case 4: - ltoaf(new_flags4,str); - SETHELP(WHERE); -/* -New User Security Flags: - -These are the security flags automatically given to new users. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Flag Set #4" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - new_flags4=aftol(str); - break; - case 5: - ltoaf(new_exempt,str); - SETHELP(WHERE); -/* -New User Exemption Flags: - -These are the exemptions that are automatically given to new users. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26 - ,K_EDIT|K_UPPER|K_ALPHA); - new_exempt=aftol(str); - break; - case 6: - ltoaf(new_rest,str); - SETHELP(WHERE); -/* -New User Restriction Flags: - -These are the restrictions that are automatically given to new users. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26 - ,K_EDIT|K_UPPER|K_ALPHA); - new_rest=aftol(str); - break; - case 7: - itoa(new_expire,str,10); - SETHELP(WHERE); -/* -New User Expiration Days: - -If you wish new users to have an automatic expiration date, set this -value to the number of days before the user will expire. To disable -New User expiration, set this value to 0. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Expiration Days",str,4 - ,K_EDIT|K_NUMBER); - new_expire=atoi(str); - break; - case 8: - ultoa(new_cdt,str,10); - SETHELP(WHERE); -/* -New User Credits: - -This is the amount of credits that are automatically given to new users. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Credits",str,10 - ,K_EDIT|K_NUMBER); - new_cdt=atol(str); - break; - case 9: - ultoa(new_min,str,10); - SETHELP(WHERE); -/* -New User Minutes: - -This is the number of extra minutes automatically given to new users. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Minutes (Time Credit)" - ,str,10,K_EDIT|K_NUMBER); - new_min=atol(str); - break; - case 10: - if(!total_xedits) { - umsg("No External Editors Configured"); - break; } - strcpy(opt[0],"Internal"); - for(i=1;i<=total_xedits;i++) - strcpy(opt[i],xedit[i-1]->code); - opt[i][0]=0; - i=0; - savnum=0; - SETHELP(WHERE); -/* -New User Editor: - -You can use this option to select the default editor for new users. -*/ - i=ulist(WIN_SAV|WIN_RHT,2,1,13,&i,0,"Editors",opt); - if(i==-1) - break; - changes=1; - if(i && i<=total_xedits) - sprintf(new_xedit,"%-.8s",xedit[i-1]->code); - else - new_xedit[0]=0; - break; - case 11: - for(i=0;i<total_shells && i<MAX_OPTS;i++) - sprintf(opt[i],"%-.8s",shell[i]->code); - opt[i][0]=0; - i=0; - savnum=0; - SETHELP(WHERE); -/* -New User Command Shell: - -You can use this option to select the default command shell for new -users. -*/ - i=ulist(WIN_SAV|WIN_RHT,2,1,13,&i,0 - ,"Command Shells",opt); - if(i==-1) - break; - new_shell=i; - changes=1; - break; - case 12: - SETHELP(WHERE); -/* -New User Default Download Protocol: - -This option allows you to set the default download protocol of new users -(protocol command key or BLANK for no default). -*/ - sprintf(str,"%c",new_prot); - uinput(WIN_SAV|WIN_MID,0,0 - ,"Default Download Protocol (SPACE=Disabled)" - ,str,1,K_EDIT|K_UPPER); - new_prot=str[0]; - if(new_prot<SP) - new_prot=SP; - break; - case 13: - SETHELP(WHERE); -/* -New User Default Toggle Options: - -This menu contains the default state of new user toggle options. All new -users on your system will have their defaults set according to the -settings on this menu. The user can then change them to his or her -liking. - -See the Synchronet User Manual for more information on the individual -options available. -*/ - j=0; - while(1) { - i=0; - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Expert Menu Mode" - ,new_misc&EXPERT ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Screen Pause" - ,new_misc&UPAUSE ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Spinning Cursor" - ,new_misc&SPIN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Clear Screen" - ,new_misc&CLRSCRN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Ask For New Scan" - ,new_misc&ASK_NSCAN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Ask For Your Msg Scan" - ,new_misc&ASK_SSCAN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Automatic New File Scan" - ,new_misc&ANFSCAN ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Remember Current Sub-board" - ,new_misc&CURSUB ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Batch Download File Flag" - ,new_misc&BATCHFLAG ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Extended File Descriptions" - ,new_misc&EXTDESC ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Hot Keys" - ,new_misc&COLDKEYS ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Auto Hang-up After Xfer" - ,new_misc&AUTOHANG ? "Yes":"No"); - opt[i][0]=0; - j=ulist(WIN_BOT|WIN_RHT,2,1,0,&j,0 - ,"Default Toggle Options",opt); - if(j==-1) - break; - changes=1; - switch(j) { - case 0: - new_misc^=EXPERT; - break; - case 1: - new_misc^=UPAUSE; - break; - case 2: - new_misc^=SPIN; - break; - case 3: - new_misc^=CLRSCRN; - break; - case 4: - new_misc^=ASK_NSCAN; - break; - case 5: - new_misc^=ASK_SSCAN; - break; - case 6: - new_misc^=ANFSCAN; - break; - case 7: - new_misc^=CURSUB; - break; - case 8: - new_misc^=BATCHFLAG; - break; - case 9: - new_misc^=EXTDESC; - break; - case 10: - new_misc^=COLDKEYS; - break; - case 11: - new_misc^=AUTOHANG; - break; - } } - break; - case 14: - SETHELP(WHERE); -/* -New User Question Toggle Options: - -This menu allows you to decide which questions will be asked of a new -user. -*/ - j=0; - while(1) { - i=0; - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Real Name" - ,uq&UQ_REALNAME ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Force Unique Real Name" - ,uq&UQ_DUPREAL ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Company Name" - ,uq&UQ_COMPANY ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Multinode Chat Handle" - ,uq&UQ_HANDLE ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Force Unique Chat Handle" - ,uq&UQ_DUPHAND ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Sex (Gender)" - ,uq&UQ_SEX ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Birthday" - ,uq&UQ_BIRTH ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Address and Zip Code" - ,uq&UQ_ADDRESS ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Location" - ,uq&UQ_LOCATION ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Require Comma in Location" - ,uq&UQ_NOCOMMAS ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Phone Number" - ,uq&UQ_PHONE ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Computer Type" - ,uq&UQ_COMP ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Multiple Choice Computer" - ,uq&UQ_MC_COMP ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Allow EX-ASCII in Answers" - ,uq&UQ_NOEXASC ? "No":"Yes"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"External Editor" - ,uq&UQ_XEDIT ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Command Shell" - ,uq&UQ_CMDSHELL ? "Yes":"No"); - sprintf(opt[i++],"%-27.27s %-3.3s" - ,"Default Settings" - ,uq&UQ_NODEF ? "No":"Yes"); - opt[i][0]=0; - j=ulist(WIN_BOT|WIN_RHT|WIN_SAV,2,1,0,&j,0 - ,"New User Questions",opt); - if(j==-1) - break; - changes=1; - switch(j) { - case 0: - uq^=UQ_REALNAME; - break; - case 1: - uq^=UQ_DUPREAL; - break; - case 2: - uq^=UQ_COMPANY; - break; - case 3: - uq^=UQ_HANDLE; - break; - case 4: - uq^=UQ_DUPHAND; - break; - case 5: - uq^=UQ_SEX; - break; - case 6: - uq^=UQ_BIRTH; - break; - case 7: - uq^=UQ_ADDRESS; - break; - case 8: - uq^=UQ_LOCATION; - break; - case 9: - uq^=UQ_NOCOMMAS; - break; - case 10: - uq^=UQ_PHONE; - break; - case 11: - uq^=UQ_COMP; - break; - case 12: - uq^=UQ_MC_COMP; - break; - case 13: - uq^=UQ_NOEXASC; - break; - case 14: - uq^=UQ_XEDIT; - break; - case 15: - uq^=UQ_CMDSHELL; - break; - case 16: - uq^=UQ_NODEF; - break; - } } - break; } } - break; - case 10: /* Advanced Options */ - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%s","New User Magic Word",new_magic); - sprintf(opt[i++],"%-27.27s%.40s","Data Directory",data_dir); - sprintf(opt[i++],"%-27.27s%.40s","Executables Directory" - ,exec_dir); - sprintf(opt[i++],"%-27.27s%s","Input SIF Questionnaire" - ,new_sif); - sprintf(opt[i++],"%-27.27s%s","Output SIF Questionnaire" - ,new_sof); - ultoac(cdt_per_dollar,str); - sprintf(opt[i++],"%-27.27s%s","Credits Per Dollar",str); - sprintf(opt[i++],"%-27.27s%u","Minutes Per 100k Credits" - ,cdt_min_value); - sprintf(opt[i++],"%-27.27s%s","Maximum Number of Minutes" - ,max_minutes ? ltoa(max_minutes,tmp,10) : "Unlimited"); - sprintf(opt[i++],"%-27.27s%u","Warning Days Till Expire" - ,sys_exp_warn); - sprintf(opt[i++],"%-27.27s%u","Default Status Line" - ,sys_def_stat); - sprintf(opt[i++],"%-27.27s%u","Last Displayable Node" - ,sys_lastnode); - sprintf(opt[i++],"%-27.27s%u","First Local Auto-Node" - ,sys_autonode); - sprintf(opt[i++],"%-27.27s%s","Phone Number Format" - ,sys_phonefmt); - sprintf(opt[i++],"%-27.27s%.40s","Sysop Chat Requirements" - ,sys_chat_ar); - opt[i][0]=0; - savnum=0; - SETHELP(WHERE); -/* -System Advanced Options: - -Care should be taken when modifying any of the options listed here. -*/ - switch(ulist(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&adv_dflt,0 - ,"Advanced Options",opt)) { - case -1: - done=1; - break; - - case 0: - SETHELP(WHERE); -/* -New User Magic Word: - -If this field has a value, it is assumed the sysop has placed some -reference to this magic word in TEXT\NEWUSER.MSG and new users -will be prompted for the magic word after they enter their password. -If they do not enter it correctly, it is assumed they didn't read the -new user information displayed to them and they are disconnected. - -Think of it as a password to guarantee that new users read the text -displayed to them. -*/ - uinput(WIN_MID,0,0,"New User Magic Word",new_magic,20 - ,K_EDIT|K_UPPER); - break; - case 1: - SETHELP(WHERE); -/* -Data Directory Parent: - -The Synchronet data directory contains almost all the data for your BBS. -This directory must be located where ALL nodes can access it and -MUST NOT be placed on a RAM disk or other volatile media. - -This option allows you to change the parent of your data directory. -The \DATA\ suffix (sub-directory) cannot be changed or removed. -*/ - strcpy(str,data_dir); - if(strstr(str,"\\DATA\\")!=NULL) - *strstr(str,"\\DATA\\")=0; - if(uinput(WIN_MID|WIN_SAV,0,9,"Data Dir Parent" - ,str,50,K_EDIT|K_UPPER)>0) { - if(str[strlen(str)-1]!='\\') - strcat(str,"\\"); - strcat(str,"DATA\\"); - strcpy(data_dir,str); } - break; - case 2: - SETHELP(WHERE); -/* -Exec Directory Parent: - -The Synchronet exec directory contains executable files that your BBS -executes. This directory does not need to be in your DOS search path. -If you place programs in this directory for the BBS to execute, you -should place the %! abreviation for this exec directory at the -beginning of the command line. - -This option allows you to change the parent of your exec directory. -The \EXEC\ suffix (sub-directory) cannot be changed or removed. -*/ - strcpy(str,exec_dir); - if(strstr(str,"\\EXEC\\")!=NULL) - *strstr(str,"\\EXEC\\")=0; - if(uinput(WIN_MID|WIN_SAV,0,9,"Exec Dir Parent" - ,str,50,K_EDIT|K_UPPER)>0) { - if(str[strlen(str)-1]!='\\') - strcat(str,"\\"); - strcat(str,"EXEC\\"); - strcpy(exec_dir,str); } - break; - case 3: - strcpy(str,new_sif); - SETHELP(WHERE); -/* -SIF Questionnaire for User Input: - -This is the name of a SIF questionnaire file that resides your text -directory that all users will be prompted to answer. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"SIF Questionnaire for User Input" - ,str,8,K_UPPER|K_EDIT); - if(!str[0] || code_ok(str)) - strcpy(new_sif,str); - else - umsg("Invalid SIF Name"); - break; - case 4: - strcpy(str,new_sof); - SETHELP(WHERE); -/* -SIF Questionnaire for Reviewing User Input: - -This is the SIF file used to review the input of users from the user -edit function. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"SIF Questionnaire for Reviewing User Input" - ,str,8,K_UPPER|K_EDIT); - if(!str[0] || code_ok(str)) - strcpy(new_sof,str); - else - umsg("Invalid SIF Name"); - break; - case 5: - SETHELP(WHERE); -/* -Credits Per Dollar: - -This is the monetary value of a credit (How many credits per dollar). -This value should be a power of 2 (1, 2, 4, 8, 16, 32, 64, 128, etc.) -since credits are usually converted by 100 kilobyte (102400) blocks. -To make a dollar worth two megabytes of credits, set this value to -2,097,152 (a megabyte is 1024*1024 or 1048576). -*/ - ultoa(cdt_per_dollar,str,10); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Credits Per Dollar",str,10,K_NUMBER|K_EDIT); - cdt_per_dollar=atol(str); - break; - case 6: - SETHELP(WHERE); -/* -Minutes Per 100K Credits: - -This is the value of a minute of time online. This field is the number -of minutes to give the user in exchange for each 100K credit block. -*/ - sprintf(str,"%u",cdt_min_value); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Minutes Per 100K Credits",str,5,K_NUMBER|K_EDIT); - cdt_min_value=atoi(str); - break; - case 7: - SETHELP(WHERE); -/* -Maximum Number of Minutes User Can Have: - -This value is the maximum total number of minutes a user can have. If a -user has this number of minutes or more, they will not be allowed to -convert credits into minutes. A sysop can add minutes to a user's -account regardless of this maximum. If this value is set to 0, users -will have no limit on the total number of minutes they can have. -*/ - sprintf(str,"%lu",max_minutes); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Maximum Number of Minutes a User Can Have " - "(0=No Limit)" - ,str,10,K_NUMBER|K_EDIT); - max_minutes=atol(str); - break; - case 8: - SETHELP(WHERE); -/* -Warning Days Till Expire: - -If a user's account will expire in this many days or less, the user will -be notified at logon. Setting this value to 0 disables the warning -completely. -*/ - sprintf(str,"%u",sys_exp_warn); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Warning Days Till Expire",str,5,K_NUMBER|K_EDIT); - sys_exp_warn=atoi(str); - break; - case 9: - SETHELP(WHERE); -/* -Default Status Line: - -This is the number of the status line format that will be the default -display on the bottom line of the screen. For explanation of the -available status lines, see the sysop documentation. -*/ - sprintf(str,"%u",sys_def_stat); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Default Status Line",str,5,K_NUMBER|K_EDIT); - sys_def_stat=atoi(str); - break; - case 10: - SETHELP(WHERE); -/* -Last Displayed Node: - -This is the number of the last node to display to users in node lists. -This allows the sysop to define the higher numbered nodes as invisible -to users. -*/ - sprintf(str,"%u",sys_lastnode); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Last Displayed Node",str,5,K_NUMBER|K_EDIT); - sys_lastnode=atoi(str); - break; - case 11: - SETHELP(WHERE); -/* -First Local Auto-Node: - -This is the number of the first node in the search for an available -node for local login using the AUTONODE utility. -*/ - sprintf(str,"%u",sys_autonode); - uinput(WIN_MID|WIN_SAV,0,0 - ,"First Local Auto-Node",str,5,K_NUMBER|K_EDIT); - sys_autonode=atoi(str); - break; - case 12: - SETHELP(WHERE); -/* -Phone Number Format: - -This is the format used for phone numbers in your local calling -area. Use N for number positions, A for alphabetic, or ! for any -character. All other characters will be static in the phone number -format. An example for North American phone numbers is NNN-NNN-NNNN. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Phone Number Format",sys_phonefmt - ,LEN_PHONE,K_UPPER|K_EDIT); - break; - case 13: - getar("Sysop Chat",sys_chat_ar); - break; - } } - break; - case 11: /* Loadable Modules */ - done=0; - k=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-16.16s%s","Login",login_mod); - sprintf(opt[i++],"%-16.16s%s","Logon Event",logon_mod); - sprintf(opt[i++],"%-16.16s%s","Sync Event",sync_mod); - sprintf(opt[i++],"%-16.16s%s","Logoff Event",logoff_mod); - sprintf(opt[i++],"%-16.16s%s","Logout Event",logout_mod); - sprintf(opt[i++],"%-16.16s%s","New User Event",newuser_mod); - sprintf(opt[i++],"%-16.16s%s","Expired User",expire_mod); - opt[i][0]=0; - savnum=0; - SETHELP(WHERE); -/* -Loadable Modules: - -Baja modules (.BIN files) can be automatically loaded and executed -during certain system functions. The name of the module can be specified -for each of the available triggers listed here. - -Login Required module for remote and local logins (online) -Logon Executed as an event during logon procedure (online) -Sync Executed when nodes are periodically synchronized (online) -Logoff Executed during logoff procedure (online) -Logout Executed during logout procedure (offline) -New User Executed at end of new user procedure (online) -Expired User Executed during daily event when user expires (offline) -*/ - switch(ulist(WIN_ACT|WIN_T2B|WIN_RHT,0,0,32,&k,0 - ,"Loadable Modules",opt)) { - - case -1: - done=1; - break; - - case 0: - uinput(WIN_MID|WIN_SAV,0,0,"Login Module",login_mod,8 - ,K_EDIT|K_UPPER); - break; - case 1: - uinput(WIN_MID|WIN_SAV,0,0,"Logon Module",logon_mod,8 - ,K_EDIT|K_UPPER); - break; - case 2: - uinput(WIN_MID|WIN_SAV,0,0,"Synchronize Module" - ,sync_mod,8,K_EDIT|K_UPPER); - break; - case 3: - uinput(WIN_MID|WIN_SAV,0,0,"Logoff Module",logoff_mod,8 - ,K_EDIT|K_UPPER); - break; - case 4: - uinput(WIN_MID|WIN_SAV,0,0,"Logout Module",logout_mod,8 - ,K_EDIT|K_UPPER); - break; - case 5: - uinput(WIN_MID|WIN_SAV,0,0,"New User Module" - ,newuser_mod,8,K_EDIT|K_UPPER); - break; - case 6: - uinput(WIN_MID|WIN_SAV,0,0,"Expired User Module" - ,expire_mod,8,K_EDIT|K_UPPER); - break; - - } } - break; - - case 12: /* Security Levels */ - dflt=bar=0; - k=0; - while(1) { - for(i=0;i<100;i++) { - sprintf(tmp,"%luk",level_freecdtperday[i]/1024L); - sprintf(opt[i],"%-2d %5d %5d " - "%5d %5d %5d %5d %6s %7s %2u",i - ,level_timeperday[i],level_timepercall[i] - ,level_callsperday[i],level_emailperday[i] - ,level_postsperday[i],level_linespermsg[i] - ,tmp - ,level_misc[i]&LEVEL_EXPTOVAL ? "Val Set" : "Level" - ,level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ? - level_expireto[i] : expired_level); } - opt[i][0]=0; - i=0; - SETHELP(WHERE); -/* -Security Level Values: - -This menu allows you to change the security options for every possible -security level from 0 to 99. The available options for each level are: - - Time Per Day : Maximum online time per day - Time Per Call : Maximum online time per call - Calls Per Day : Maximum number of calls per day - Email Per Day : Maximum number of email per day - Posts Per Day : Maximum number of posts per day - Lines Per Message : Maximum number of lines per message - Free Credits Per Day : Number of free credits per day - Expire To : Level or validation set to Expire to -*/ - i=ulist(WIN_RHT|WIN_ACT,0,3,0,&dflt,&bar - ,"Level T/D T/C C/D E/D P/D L/M F/D " - "Expire To",opt); - if(i==-1) - break; - while(1) { - sprintf(str,"Security Level %d Values",i); - j=0; - sprintf(opt[j++],"%-22.22s%-5u","Time Per Day" - ,level_timeperday[i]); - sprintf(opt[j++],"%-22.22s%-5u","Time Per Call" - ,level_timepercall[i]); - sprintf(opt[j++],"%-22.22s%-5u","Calls Per Day" - ,level_callsperday[i]); - sprintf(opt[j++],"%-22.22s%-5u","Email Per Day" - ,level_emailperday[i]); - sprintf(opt[j++],"%-22.22s%-5u","Posts Per Day" - ,level_postsperday[i]); - sprintf(opt[j++],"%-22.22s%-5u","Lines Per Message" - ,level_linespermsg[i]); - sprintf(tmp,"%luk",level_freecdtperday[i]/1024L); - sprintf(opt[j++],"%-22.22s%-6s","Free Credits Per Day" - ,tmp); - sprintf(opt[j++],"%-22.22s%s %u","Expire To" - ,level_misc[i]&LEVEL_EXPTOVAL ? "Validation Set" - : "Level" - ,level_misc[i]&(LEVEL_EXPTOVAL|LEVEL_EXPTOLVL) ? - level_expireto[i] : expired_level); - opt[j][0]=0; - savnum=0; - j=ulist(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0 - ,str,opt); - if(j==-1) - break; - switch(j) { - case 0: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Total Time Allowed Per Day" - ,itoa(level_timeperday[i],tmp,10),3 - ,K_NUMBER|K_EDIT); - level_timeperday[i]=atoi(tmp); - if(level_timeperday[i]>500) - level_timeperday[i]=500; - break; - case 1: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Time Allowed Per Call" - ,itoa(level_timepercall[i],tmp,10),3 - ,K_NUMBER|K_EDIT); - level_timepercall[i]=atoi(tmp); - if(level_timepercall[i]>500) - level_timepercall[i]=500; - break; - case 2: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Calls Allowed Per Day" - ,itoa(level_callsperday[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - level_callsperday[i]=atoi(tmp); - break; - case 3: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Email Allowed Per Day" - ,itoa(level_emailperday[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - level_emailperday[i]=atoi(tmp); - break; - case 4: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Posts Allowed Per Day" - ,itoa(level_postsperday[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - level_postsperday[i]=atoi(tmp); - break; - case 5: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Lines Allowed Per Message (Post/E-mail)" - ,itoa(level_linespermsg[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - level_linespermsg[i]=atoi(tmp); - break; - case 6: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Free Credits Per Day (in Kilobytes)" - ,ultoa(level_freecdtperday[i]/1024L,tmp,10),8 - ,K_EDIT|K_UPPER); - level_freecdtperday[i]=atol(tmp)*1024L; - break; - case 7: - j=0; - sprintf(opt[j++],"Default Expired Level " - "(Currently %u)",expired_level); - sprintf(opt[j++],"Specific Level"); - sprintf(opt[j++],"Quick-Validation Set"); - opt[j][0]=0; - j=0; - sprintf(str,"Level %u Expires To",i); - savnum=1; - j=ulist(WIN_SAV,2,1,0,&j,0 - ,str,opt); - if(j==-1) - break; - if(j==0) { - level_misc[i]&= - ~(LEVEL_EXPTOLVL|LEVEL_EXPTOVAL); - changes=1; - break; } - if(j==1) { - level_misc[i]&=~LEVEL_EXPTOVAL; - level_misc[i]|=LEVEL_EXPTOLVL; - changes=1; - uinput(WIN_MID|WIN_SAV,0,0 - ,"Expired Level" - ,itoa(level_expireto[i],tmp,10),2 - ,K_EDIT|K_NUMBER); - level_expireto[i]=atoi(tmp); - break; } - level_misc[i]&=~LEVEL_EXPTOLVL; - level_misc[i]|=LEVEL_EXPTOVAL; - uinput(WIN_MID|WIN_SAV,0,0 - ,"Quick-Validation Set to Expire To" - ,itoa(level_expireto[i],tmp,10),1 - ,K_EDIT|K_NUMBER); - level_expireto[i]=atoi(tmp); - break; - } } } - break; - case 13: /* Expired Acccount Values */ - dflt=0; - done=0; - while(!done) { - i=0; - sprintf(opt[i++],"%-27.27s%u","Level",expired_level); - sprintf(opt[i++],"%-27.27s%s","Flag Set #1 to Remove" - ,ltoaf(expired_flags1,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #2 to Remove" - ,ltoaf(expired_flags2,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #3 to Remove" - ,ltoaf(expired_flags3,str)); - sprintf(opt[i++],"%-27.27s%s","Flag Set #4 to Remove" - ,ltoaf(expired_flags4,str)); - sprintf(opt[i++],"%-27.27s%s","Exemptions to Remove" - ,ltoaf(expired_exempt,str)); - sprintf(opt[i++],"%-27.27s%s","Restrictions to Add" - ,ltoaf(expired_rest,str)); - opt[i][0]=0; - SETHELP(WHERE); -/* -Expired Account Values: - -If a user's account expires, the security levels for that account will -be modified according to the settings of this menu. The Main Level and -Transfer Level will be set to the values listed on this menu. The Main -Flags, Transfer Flags, and Exemptions listed on this menu will be -removed from the account if they are set. The Restrictions listed will -be added to the account. -*/ - switch(ulist(WIN_ACT|WIN_BOT|WIN_RHT,0,0,60,&dflt,0 - ,"Expired Account Values",opt)) { - case -1: - done=1; - break; - case 0: - itoa(expired_level,str,10); - SETHELP(WHERE); -/* -Expired Account Security Level: - -This is the security level automatically given to expired user accounts. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Security Level" - ,str,2,K_EDIT|K_NUMBER); - expired_level=atoi(str); - break; - case 1: - ltoaf(expired_flags1,str); - SETHELP(WHERE); -/* -Expired Security Flags to Remove: - -These are the security flags automatically removed when a user account -has expired. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Flags Set #1" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - expired_flags1=aftol(str); - break; - case 2: - ltoaf(expired_flags2,str); - SETHELP(WHERE); -/* -Expired Security Flags to Remove: - -These are the security flags automatically removed when a user account -has expired. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Flags Set #2" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - expired_flags2=aftol(str); - break; - case 3: - ltoaf(expired_flags3,str); - SETHELP(WHERE); -/* -Expired Security Flags to Remove: - -These are the security flags automatically removed when a user account -has expired. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Flags Set #3" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - expired_flags3=aftol(str); - break; - case 4: - ltoaf(expired_flags4,str); - SETHELP(WHERE); -/* -Expired Security Flags to Remove: - -These are the security flags automatically removed when a user account -has expired. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Flags Set #4" - ,str,26,K_EDIT|K_UPPER|K_ALPHA); - expired_flags4=aftol(str); - break; - case 5: - ltoaf(expired_exempt,str); - SETHELP(WHERE); -/* -Expired Exemption Flags to Remove: - -These are the exemptions that are automatically removed from a user -account if it expires. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Exemption Flags",str,26 - ,K_EDIT|K_UPPER|K_ALPHA); - expired_exempt=aftol(str); - break; - case 6: - ltoaf(expired_rest,str); - SETHELP(WHERE); -/* -Expired Restriction Flags to Add: - -These are the restrictions that are automatically added to a user -account if it expires. -*/ - uinput(WIN_SAV|WIN_MID,0,0,"Restriction Flags",str,26 - ,K_EDIT|K_UPPER|K_ALPHA); - expired_rest=aftol(str); - break; } } - break; - case 14: /* Quick-Validation Values */ - dflt=0; - k=0; - while(1) { - for(i=0;i<10;i++) - sprintf(opt[i],"%d SL: %-2d F1: %s" - ,i,val_level[i],ltoaf(val_flags1[i],str)); - opt[i][0]=0; - i=0; - SETHELP(WHERE); -/* -Quick-Validation Values: - -This is a list of the ten quick-validation sets. These sets are used to -quickly set a user's security values (Level, Flags, Exemptions, -Restrictions, Expiration Date, and Credits) with one key stroke. The -user's expiration date may be extended and additional credits may also -be added using quick-validation sets. - -Holding down ALT and one of the number keys (1-9) while a user -is online, automatically sets his or user security values to the -quick-validation set for that number key. - -From within the User Edit function, a sysop can use the Validate -User command and select from this quick-validation list to change a -user's security values with very few key-strokes. -*/ - savnum=0; - i=ulist(WIN_RHT|WIN_BOT|WIN_ACT|WIN_SAV,0,0,0,&dflt,0 - ,"Quick-Validation Values",opt); - if(i==-1) - break; - sprintf(str,"Quick-Validation Set %d",i); - savnum=0; - while(1) { - j=0; - sprintf(opt[j++],"%-22.22s%u","Level",val_level[i]); - sprintf(opt[j++],"%-22.22s%s","Flag Set #1" - ,ltoaf(val_flags1[i],tmp)); - sprintf(opt[j++],"%-22.22s%s","Flag Set #2" - ,ltoaf(val_flags2[i],tmp)); - sprintf(opt[j++],"%-22.22s%s","Flag Set #3" - ,ltoaf(val_flags3[i],tmp)); - sprintf(opt[j++],"%-22.22s%s","Flag Set #4" - ,ltoaf(val_flags4[i],tmp)); - sprintf(opt[j++],"%-22.22s%s","Exemptions" - ,ltoaf(val_exempt[i],tmp)); - sprintf(opt[j++],"%-22.22s%s","Restrictions" - ,ltoaf(val_rest[i],tmp)); - sprintf(opt[j++],"%-22.22s%u days","Extend Expiration" - ,val_expire[i]); - sprintf(opt[j++],"%-22.22s%lu","Additional Credits" - ,val_cdt[i]); - opt[j][0]=0; - savnum=1; - j=ulist(WIN_RHT|WIN_SAV|WIN_ACT,2,1,0,&k,0 - ,str,opt); - if(j==-1) - break; - switch(j) { - case 0: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Level" - ,itoa(val_level[i],tmp,10),2 - ,K_NUMBER|K_EDIT); - val_level[i]=atoi(tmp); - break; - case 1: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Flag Set #1" - ,ltoaf(val_flags1[i],tmp),26 - ,K_UPPER|K_ALPHA|K_EDIT); - val_flags1[i]=aftol(tmp); - break; - case 2: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Flag Set #2" - ,ltoaf(val_flags2[i],tmp),26 - ,K_UPPER|K_ALPHA|K_EDIT); - val_flags2[i]=aftol(tmp); - break; - case 3: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Flag Set #3" - ,ltoaf(val_flags3[i],tmp),26 - ,K_UPPER|K_ALPHA|K_EDIT); - val_flags3[i]=aftol(tmp); - break; - case 4: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Flag Set #4" - ,ltoaf(val_flags4[i],tmp),26 - ,K_UPPER|K_ALPHA|K_EDIT); - val_flags4[i]=aftol(tmp); - break; - case 5: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Exemption Flags" - ,ltoaf(val_exempt[i],tmp),26 - ,K_UPPER|K_ALPHA|K_EDIT); - val_exempt[i]=aftol(tmp); - break; - case 6: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Restriction Flags" - ,ltoaf(val_rest[i],tmp),26 - ,K_UPPER|K_ALPHA|K_EDIT); - val_rest[i]=aftol(tmp); - break; - case 7: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Days to Extend Expiration" - ,itoa(val_expire[i],tmp,10),4 - ,K_NUMBER|K_EDIT); - val_expire[i]=atoi(tmp); - break; - case 8: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Additional Credits" - ,ultoa(val_cdt[i],tmp,10),10 - ,K_NUMBER|K_EDIT); - val_cdt[i]=atol(tmp); - break; } } } - break; } } - -} diff --git a/src/sbbs2/scfg/scfgxfr1.c b/src/sbbs2/scfg/scfgxfr1.c deleted file mode 100644 index 8fcb4e5ebb..0000000000 --- a/src/sbbs2/scfg/scfgxfr1.c +++ /dev/null @@ -1,976 +0,0 @@ -#line 2 "SCFGXFR1.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "scfg.h" - -void xfer_opts() -{ - static int xfr_dflt; - char str[81],done; - int i,j,k,l,dflt,bar; - static fextr_t savfextr; - static fview_t savfview; - static ftest_t savftest; - static fcomp_t savfcomp; - static prot_t savprot; - static dlevent_t savdlevent; - static char savaltpath[LEN_DIR+1]; - -while(1) { - i=0; - sprintf(opt[i++],"%-33.33s%uk","Min Bytes Free Disk Space",min_dspace); - sprintf(opt[i++],"%-33.33s%u","Max Files in Batch UL Queue" - ,max_batup); - sprintf(opt[i++],"%-33.33s%u","Max Files in Batch DL Queue" - ,max_batdn); - sprintf(opt[i++],"%-33.33s%u","Max Users in User Transfers",max_userxfer); - sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Upload" - ,cdt_up_pct); - sprintf(opt[i++],"%-33.33s%u%%","Default Credit on Download" - ,cdt_dn_pct); - if(leech_pct) - sprintf(str,"%u%% after %u seconds",leech_pct,leech_sec); - else - strcpy(str,"Disabled"); - sprintf(opt[i++],"%-33.33s%s","Leech Protocol Detection",str); - strcpy(opt[i++],"Viewable Files..."); - strcpy(opt[i++],"Testable Files..."); - strcpy(opt[i++],"Download Events..."); - strcpy(opt[i++],"Extractable Files..."); - strcpy(opt[i++],"Compressable Files..."); - strcpy(opt[i++],"Transfer Protocols..."); - strcpy(opt[i++],"Alternate File Paths..."); - opt[i][0]=0; - SETHELP(WHERE); -/* -File Transfer Configuration: - -This menu has options and sub-menus that pertain specifically to the -file transfer section of the BBS. -*/ - switch(ulist(WIN_ORG|WIN_ACT|WIN_CHE,0,0,72,&xfr_dflt,0 - ,"File Transfer Configuration",opt)) { - case -1: - i=save_changes(WIN_MID); - if(i==-1) - break; - if(!i) - write_file_cfg(); - return; - case 0: - SETHELP(WHERE); -/* -Minimum Kilobytes Free Disk Space to Allow Uploads: - -This is the minimum free space in a file directory to allow user -uploads. -*/ - uinput(WIN_MID,0,0 - ,"Minimum Kilobytes Free Disk Space to Allow Uploads" - ,itoa(min_dspace,tmp,10),5,K_EDIT|K_NUMBER); - min_dspace=atoi(tmp); - break; - case 1: - SETHELP(WHERE); -/* -Maximum Files in Batch Upload Queue: - -This is the maximum number of files that can be placed in the batch -upload queue. -*/ - uinput(WIN_MID,0,0,"Maximum Files in Batch Upload Queue" - ,itoa(max_batup,tmp,10),5,K_EDIT|K_NUMBER); - max_batup=atoi(tmp); - break; - case 2: - SETHELP(WHERE); -/* -Maximum Files in Batch Download Queue: - -This is the maximum number of files that can be placed in the batch -download queue. -*/ - uinput(WIN_MID,0,0,"Maximum Files in Batch Download Queue" - ,itoa(max_batdn,tmp,10),5,K_EDIT|K_NUMBER); - max_batdn=atoi(tmp); - break; - case 3: - SETHELP(WHERE); -/* -Maximum Destination Users in User to User Transfer: - -This is the maximum number of users allowed in the destination user list -of a user to user upload. -*/ - uinput(WIN_MID,0,0 - ,"Maximum Destination Users in User to User Transfers" - ,itoa(max_userxfer,tmp,10),5,K_EDIT|K_NUMBER); - max_userxfer=atoi(tmp); - break; - case 4: -SETHELP(WHERE); -/* -Default Percentage of Credits to Credit Uploader on Upload: - -This is the default setting that will be used when new file -directories are created. -*/ - uinput(WIN_MID,0,0 - ,"Default Percentage of Credits to Credit Uploader on Upload" - ,itoa(cdt_up_pct,tmp,10),4,K_EDIT|K_NUMBER); - cdt_up_pct=atoi(tmp); - break; - case 5: -SETHELP(WHERE); -/* -Default Percentage of Credits to Credit Uploader on Download: - -This is the default setting that will be used when new file -directories are created. -*/ - uinput(WIN_MID,0,0 - ,"Default Percentage of Credits to Credit Uploader on Download" - ,itoa(cdt_dn_pct,tmp,10),4,K_EDIT|K_NUMBER); - cdt_dn_pct=atoi(tmp); - break; - case 6: - SETHELP(WHERE); -/* -Leech Protocol Detection Percentage: - -This value is the sensitivity of the leech protocol detection feature of -Synchronet. If the transfer is apparently unsuccessful, but the transfer -time was at least this percentage of the estimated transfer time (based -on the estimated CPS of the connection result code), then a leech -protocol error is issued and the user's leech download counter is -incremented. Setting this value to 0 disables leech protocol detection. -*/ - savnum=0; - uinput(WIN_MID|WIN_SAV,0,0 - ,"Leech Protocol Detection Percentage (0=Disabled)" - ,itoa(leech_pct,tmp,10),3,K_EDIT|K_NUMBER); - leech_pct=atoi(tmp); - if(!leech_pct) - break; - SETHELP(WHERE); -/* -Leech Protocol Minimum Time (in Seconds): - -This option allows you to adjust the sensitivity of the leech protocol -detection feature. This value is the minimum length of transfer time -(in seconds) that must elapse before an aborted tranfser will be -considered a possible leech attempt. -*/ - uinput(WIN_MID,0,0 - ,"Leech Protocol Minimum Time (in Seconds)" - ,itoa(leech_sec,tmp,10),3,K_EDIT|K_NUMBER); - leech_sec=atoi(tmp); - break; - case 7: /* Viewable file types */ - dflt=bar=0; - while(1) { - for(i=0;i<total_fviews && i<MAX_OPTS;i++) - sprintf(opt[i],"%-3.3s %-40s",fview[i]->ext,fview[i]->cmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(total_fviews<MAX_OPTS) - i|=WIN_INS; - if(total_fviews) - i|=WIN_DEL|WIN_GET; - if(savfview.cmd[0]) - i|=WIN_PUT; - savnum=0; - SETHELP(WHERE); -/* -Viewable File Types: - -This is a list of file types that have content information that can be -viewed through the execution of an external program. Here are a couple of -command line examples for a few file types. -*/ - i=ulist(i,0,0,50,&dflt,&bar,"Viewable File Types",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(fview[i]); - total_fviews--; - while(i<total_fviews) { - fview[i]=fview[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - if((fview=(fview_t **)REALLOC(fview - ,sizeof(fview_t *)*(total_fviews+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_fviews+1); - total_fviews=0; - bail(1); - continue; } - if(!total_fviews) { - if((fview[0]=(fview_t *)MALLOC( - sizeof(fview_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t)); - continue; } - memset(fview[0],0,sizeof(fview_t)); - strcpy(fview[0]->ext,"ZIP"); - strcpy(fview[0]->cmd,"%!pkunzip -v %f"); } - else { - for(j=total_fviews;j>i;j--) - fview[j]=fview[j-1]; - if((fview[i]=(fview_t *)MALLOC( - sizeof(fview_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fview_t)); - continue; } - *fview[i]=*fview[i+1]; } - total_fviews++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savfview=*fview[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *fview[i]=savfview; - changes=1; - continue; } - k=0; - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-22.22s%s","File Extension" - ,fview[i]->ext); - sprintf(opt[j++],"%-22.22s%-40s","Command Line" - ,fview[i]->cmd); - sprintf(opt[j++],"%-22.22s%s","Access Requirements" - ,fview[i]->ar); - opt[j][0]=0; - savnum=1; - switch(ulist(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&k,0 - ,"Viewable File Type",opt)) { - case -1: - done=1; - break; - case 0: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Viewable File Type Extension" - ,fview[i]->ext,3,K_UPPER|K_EDIT); - break; - case 1: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Command Line" - ,fview[i]->cmd,50,K_EDIT); - break; - case 2: - savnum=2; - sprintf(str,"Viewable File Type %s" - ,fview[i]->ext); - getar(str,fview[i]->ar); - break; } } } - break; - case 8: /* Testable file types */ - dflt=bar=0; - while(1) { - for(i=0;i<total_ftests && i<MAX_OPTS;i++) - sprintf(opt[i],"%-3.3s %-40s",ftest[i]->ext,ftest[i]->cmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(total_ftests<MAX_OPTS) - i|=WIN_INS; - if(total_ftests) - i|=WIN_DEL|WIN_GET; - if(savftest.cmd[0]) - i|=WIN_PUT; - savnum=0; - SETHELP(WHERE); -/* -Testable File Types: - -This is a list of file types that will have a command line executed to -test the file integrity upon their upload. The file types are specified -by extension and if one file extension is listed more than once, each -command line will be executed. The command lines must return a DOS error -code of 0 (no error) in order for the file to pass the test. This method -of file testing upon upload is also known as an upload event. This test -or event, can do more than just test the file, it can perform any -function that the sysop wishes. Such as adding comments to an archived -file, or extracting an archive and performing a virus scan. While the -external program is executing, a text string is displayed to the user. -This working string can be set for each file type and command line -listed. -*/ - i=ulist(i,0,0,50,&dflt,&bar,"Testable File Types",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(ftest[i]); - total_ftests--; - while(i<total_ftests) { - ftest[i]=ftest[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - if((ftest=(ftest_t **)REALLOC(ftest - ,sizeof(ftest_t *)*(total_ftests+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_ftests+1); - total_ftests=0; - bail(1); - continue; } - if(!total_ftests) { - if((ftest[0]=(ftest_t *)MALLOC( - sizeof(ftest_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t)); - continue; } - memset(ftest[0],0,sizeof(ftest_t)); - strcpy(ftest[0]->ext,"ZIP"); - strcpy(ftest[0]->cmd,"%!pkunzip -t %f"); - strcpy(ftest[0]->workstr,"Testing ZIP Integrity..."); } - else { - - for(j=total_ftests;j>i;j--) - ftest[j]=ftest[j-1]; - if((ftest[i]=(ftest_t *)MALLOC( - sizeof(ftest_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(ftest_t)); - continue; } - *ftest[i]=*ftest[i+1]; } - total_ftests++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savftest=*ftest[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *ftest[i]=savftest; - changes=1; - continue; } - done=0; - k=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-22.22s%s","File Extension" - ,ftest[i]->ext); - sprintf(opt[j++],"%-22.22s%-40s","Command Line" - ,ftest[i]->cmd); - sprintf(opt[j++],"%-22.22s%s","Working String" - ,ftest[i]->workstr); - sprintf(opt[j++],"%-22.22s%s","Access Requirements" - ,ftest[i]->ar); - opt[j][0]=0; - savnum=1; - switch(ulist(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&k,0 - ,"Testable File Type",opt)) { - case -1: - done=1; - break; - case 0: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Testable File Type Extension" - ,ftest[i]->ext,3,K_UPPER|K_EDIT); - break; - case 1: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Command Line" - ,ftest[i]->cmd,50,K_EDIT); - break; - case 2: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Working String" - ,ftest[i]->workstr,40,K_EDIT|K_MSG); - break; - case 3: - savnum=2; - sprintf(str,"Testable File Type %s",ftest[i]->ext); - getar(str,ftest[i]->ar); - break; } } } - break; - case 9: /* Download Events */ - dflt=bar=0; - while(1) { - for(i=0;i<total_dlevents && i<MAX_OPTS;i++) - sprintf(opt[i],"%-3.3s %-40s",dlevent[i]->ext,dlevent[i]->cmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(total_dlevents<MAX_OPTS) - i|=WIN_INS; - if(total_dlevents) - i|=WIN_DEL|WIN_GET; - if(savdlevent.cmd[0]) - i|=WIN_PUT; - savnum=0; - SETHELP(WHERE); -/* -Download Events: - -This is a list of file types that will have a command line executed to -perform an event upon their download (e.g. trigger a download event). -The file types are specified by extension and if one file extension -is listed more than once, each command line will be executed. The -command lines must return a DOS error code of 0 (no error) in order -for the file to pass the test. This test or event, can do more than -just test the file, it can perform any function that the sysop wishes. -Such as adding comments to an archived file, or extracting an archive -and performing a virus scan. While the external program is executing, -a text string is displayed to the user. This working string can be set -for each file type and command line listed. -*/ - i=ulist(i,0,0,50,&dflt,&bar,"Download Events",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(dlevent[i]); - total_dlevents--; - while(i<total_dlevents) { - dlevent[i]=dlevent[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - if((dlevent=(dlevent_t **)REALLOC(dlevent - ,sizeof(dlevent_t *)*(total_dlevents+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_dlevents+1); - total_dlevents=0; - bail(1); - continue; } - if(!total_dlevents) { - if((dlevent[0]=(dlevent_t *)MALLOC( - sizeof(dlevent_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t)); - continue; } - memset(dlevent[0],0,sizeof(dlevent_t)); - strcpy(dlevent[0]->ext,"ZIP"); - strcpy(dlevent[0]->cmd,"%!pkzip -z %f " - "< ..\\text\\zipmsg.txt"); - strcpy(dlevent[0]->workstr,"Adding ZIP Comment..."); } - else { - - for(j=total_dlevents;j>i;j--) - dlevent[j]=dlevent[j-1]; - if((dlevent[i]=(dlevent_t *)MALLOC( - sizeof(dlevent_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dlevent_t)); - continue; } - *dlevent[i]=*dlevent[i+1]; } - total_dlevents++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savdlevent=*dlevent[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *dlevent[i]=savdlevent; - changes=1; - continue; } - done=0; - k=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-22.22s%s","File Extension" - ,dlevent[i]->ext); - sprintf(opt[j++],"%-22.22s%-40s","Command Line" - ,dlevent[i]->cmd); - sprintf(opt[j++],"%-22.22s%s","Working String" - ,dlevent[i]->workstr); - sprintf(opt[j++],"%-22.22s%s","Access Requirements" - ,dlevent[i]->ar); - opt[j][0]=0; - savnum=1; - switch(ulist(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&k,0 - ,"Download Event",opt)) { - case -1: - done=1; - break; - case 0: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Download Event Extension" - ,dlevent[i]->ext,3,K_UPPER|K_EDIT); - break; - case 1: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Command Line" - ,dlevent[i]->cmd,50,K_EDIT); - break; - case 2: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Working String" - ,dlevent[i]->workstr,40,K_EDIT|K_MSG); - break; - case 3: - savnum=2; - sprintf(str,"Download Event %s",dlevent[i]->ext); - getar(str,dlevent[i]->ar); - break; } } } - break; - case 10: /* Extractable file types */ - dflt=bar=0; - while(1) { - for(i=0;i<total_fextrs && i<MAX_OPTS;i++) - sprintf(opt[i],"%-3.3s %-40s" - ,fextr[i]->ext,fextr[i]->cmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(total_fextrs<MAX_OPTS) - i|=WIN_INS; - if(total_fextrs) - i|=WIN_DEL|WIN_GET; - if(savfextr.cmd[0]) - i|=WIN_PUT; - savnum=0; - SETHELP(WHERE); -/* -Extractable File Types: - -This is a list of archive file types that can be extracted to the temp -directory by an external program. The file types are specified by their -extension. For each file type you must specify the command line used to -extract the file(s). -*/ - i=ulist(i,0,0,50,&dflt,&bar,"Extractable File Types",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(fextr[i]); - total_fextrs--; - while(i<total_fextrs) { - fextr[i]=fextr[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - if((fextr=(fextr_t **)REALLOC(fextr - ,sizeof(fextr_t *)*(total_fextrs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_fextrs+1); - total_fextrs=0; - bail(1); - continue; } - if(!total_fextrs) { - if((fextr[0]=(fextr_t *)MALLOC( - sizeof(fextr_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t)); - continue; } - memset(fextr[0],0,sizeof(fextr_t)); - strcpy(fextr[0]->ext,"ZIP"); - strcpy(fextr[0]->cmd,"%!pkunzip -o %f %g %s"); } - else { - - for(j=total_fextrs;j>i;j--) - fextr[j]=fextr[j-1]; - if((fextr[i]=(fextr_t *)MALLOC( - sizeof(fextr_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fextr_t)); - continue; } - *fextr[i]=*fextr[i+1]; } - total_fextrs++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savfextr=*fextr[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *fextr[i]=savfextr; - changes=1; - continue; } - k=0; - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-22.22s%s","File Extension" - ,fextr[i]->ext); - sprintf(opt[j++],"%-22.22s%-40s","Command Line" - ,fextr[i]->cmd); - sprintf(opt[j++],"%-22.22s%s","Access Requirements" - ,fextr[i]->ar); - opt[j][0]=0; - savnum=1; - switch(ulist(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&k,0 - ,"Extractable File Type",opt)) { - case -1: - done=1; - break; - case 0: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Extractable File Type Extension" - ,fextr[i]->ext,3,K_UPPER|K_EDIT); - break; - case 1: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Command Line" - ,fextr[i]->cmd,50,K_EDIT); - break; - case 2: - savnum=2; - sprintf(str,"Extractable File Type %s" - ,fextr[i]->ext); - getar(str,fextr[i]->ar); - break; } } } - break; - case 11: /* Compressable file types */ - dflt=bar=0; - while(1) { - for(i=0;i<total_fcomps && i<MAX_OPTS;i++) - sprintf(opt[i],"%-3.3s %-40s",fcomp[i]->ext,fcomp[i]->cmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(total_fcomps<MAX_OPTS) - i|=WIN_INS; - if(total_fcomps) - i|=WIN_DEL|WIN_GET; - if(savfcomp.cmd[0]) - i|=WIN_PUT; - savnum=0; - SETHELP(WHERE); -/* -Compressable File Types: - -This is a list of compression methods available for different file types. -These will be used for items such as creating QWK packets, temporary -files from the transfer section, and more. -*/ - i=ulist(i,0,0,50,&dflt,&bar,"Compressable File Types",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(fcomp[i]); - total_fcomps--; - while(i<total_fcomps) { - fcomp[i]=fcomp[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - if((fcomp=(fcomp_t **)REALLOC(fcomp - ,sizeof(fcomp_t *)*(total_fcomps+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_fcomps+1); - total_fcomps=0; - bail(1); - continue; } - if(!total_fcomps) { - if((fcomp[0]=(fcomp_t *)MALLOC( - sizeof(fcomp_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t)); - continue; } - memset(fcomp[0],0,sizeof(fcomp_t)); - strcpy(fcomp[0]->ext,"ZIP"); - strcpy(fcomp[0]->cmd,"%!pkzip %f %s"); } - else { - for(j=total_fcomps;j>i;j--) - fcomp[j]=fcomp[j-1]; - if((fcomp[i]=(fcomp_t *)MALLOC( - sizeof(fcomp_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(fcomp_t)); - continue; } - *fcomp[i]=*fcomp[i+1]; } - total_fcomps++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savfcomp=*fcomp[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *fcomp[i]=savfcomp; - changes=1; - continue; } - k=0; - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-22.22s%s","File Extension" - ,fcomp[i]->ext); - sprintf(opt[j++],"%-22.22s%-40s","Command Line" - ,fcomp[i]->cmd); - sprintf(opt[j++],"%-22.22s%s","Access Requirements" - ,fcomp[i]->ar); - opt[j][0]=0; - savnum=1; - switch(ulist(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&k,0 - ,"Compressable File Type",opt)) { - case -1: - done=1; - break; - case 0: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Compressable File Type Extension" - ,fcomp[i]->ext,3,K_UPPER|K_EDIT); - break; - case 1: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Command Line" - ,fcomp[i]->cmd,50,K_EDIT); - break; - case 2: - savnum=2; - sprintf(str,"Compressable File Type %s" - ,fcomp[i]->ext); - getar(str,fcomp[i]->ar); - break; } } } - break; - case 12: /* Transfer protocols */ - dflt=bar=0; - while(1) { - for(i=0;i<total_prots && i<MAX_OPTS;i++) - sprintf(opt[i],"%c %-40s" - ,prot[i]->mnemonic,prot[i]->ulcmd); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if(total_prots<MAX_OPTS) - i|=WIN_INS; - if(total_prots) - i|=WIN_DEL|WIN_GET; - if(savprot.mnemonic) - i|=WIN_PUT; - savnum=0; - SETHELP(WHERE); -/* -File Transfer Protocols: - -This is a list of file transfer protocols that can be used to transfer -files either to or from a remote user. For each protocol, you can -specify the mnemonic (hot-key) to use to specify that protocol, the -command line to use for uploads, downloads, batch uploads, batch -downloads, bidirectional file transfers, and the support of DSZLOG. If -the protocol doesn't support a certain method of transfer, or you don't -wish it to be available for a certain method of transfer, leave the -command line for that method blank. Be advised, that if you add or -remove any transfer protocols, you will need to edit the protocol menus -(ULPROT, DLPROT, BATUPROT, BATDPROT, and BIPROT) in the TEXT\MENU -directory accordingly. -*/ - i=ulist(i,0,0,50,&dflt,&bar,"File Transfer Protocols",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(prot[i]); - total_prots--; - while(i<total_prots) { - prot[i]=prot[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - if((prot=(prot_t **)REALLOC(prot - ,sizeof(prot_t *)*(total_prots+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_prots+1); - total_prots=0; - bail(1); - continue; } - if(!total_prots) { - if((prot[0]=(prot_t *)MALLOC( - sizeof(prot_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t)); - continue; } - memset(prot[0],0,sizeof(prot_t)); - prot[0]->mnemonic='Y'; - prot[0]->misc=PROT_DSZLOG; - strcpy(prot[0]->ulcmd - ,"%!dsz port %p estimate 0 %e rb %f"); - strcpy(prot[0]->dlcmd - ,"%!dsz port %p estimate 0 %e sb %f"); - strcpy(prot[0]->batulcmd - ,"%!dsz port %p estimate 0 %e rb %f"); - strcpy(prot[0]->batdlcmd - ,"%!dsz port %p estimate 0 %e sb @%f"); } - else { - - for(j=total_prots;j>i;j--) - prot[j]=prot[j-1]; - if((prot[i]=(prot_t *)MALLOC( - sizeof(prot_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(prot_t)); - continue; } - *prot[i]=*prot[i+1]; } - total_prots++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savprot=*prot[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *prot[i]=savprot; - changes=1; - continue; } - done=0; - k=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-25.25s%c","Mnemonic (Command Key)" - ,prot[i]->mnemonic); - sprintf(opt[j++],"%-25.25s%-40s","Protocol Name" - ,prot[i]->name); - sprintf(opt[j++],"%-25.25s%-40s","Access Requirements" - ,prot[i]->ar); - sprintf(opt[j++],"%-25.25s%-40s","Upload Command Line" - ,prot[i]->ulcmd); - sprintf(opt[j++],"%-25.25s%-40s","Download Command Line" - ,prot[i]->dlcmd); - sprintf(opt[j++],"%-25.25s%-40s","Batch UL Command Line" - ,prot[i]->batulcmd); - sprintf(opt[j++],"%-25.25s%-40s","Batch DL Command Line" - ,prot[i]->batdlcmd); - sprintf(opt[j++],"%-25.25s%-40s","Bidir Command Line" - ,prot[i]->bicmd); - sprintf(opt[j++],"%-25.25s%s","Uses DSZLOG" - ,prot[i]->misc&PROT_DSZLOG ? "Yes":"No"); - opt[j][0]=0; - savnum=1; - switch(ulist(WIN_RHT|WIN_BOT|WIN_SAV|WIN_ACT,0,0,0,&k,0 - ,"File Transfer Protocol",opt)) { - case -1: - done=1; - break; - case 0: - str[0]=prot[i]->mnemonic; - str[1]=0; - uinput(WIN_MID|WIN_SAV,0,0 - ,"Mnemonic (Command Key)" - ,str,1,K_UPPER|K_EDIT); - if(str[0]) - prot[i]->mnemonic=str[0]; - break; - case 1: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Protocol Name" - ,prot[i]->name,25,K_EDIT); - break; - case 2: - savnum=2; - sprintf(str,"Protocol %s",prot[i]->name); - getar(str,prot[i]->ar); - break; - case 3: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Upload Command" - ,prot[i]->ulcmd,50,K_EDIT); - break; - case 4: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Download Command" - ,prot[i]->dlcmd,50,K_EDIT); - break; - case 5: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Batch UL Command" - ,prot[i]->batulcmd,50,K_EDIT); - break; - case 6: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Batch DL Command" - ,prot[i]->batdlcmd,50,K_EDIT); - break; - case 7: - uinput(WIN_MID|WIN_SAV,0,0 - ,"Bi-dir Command" - ,prot[i]->bicmd,50,K_EDIT); - break; - case 8: - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - l=0; - savnum=2; - l=ulist(WIN_MID|WIN_SAV,0,0,0,&l,0 - ,"Uses DSZLOG",opt); - if(!l && !(prot[i]->misc&PROT_DSZLOG)) { - prot[i]->misc|=PROT_DSZLOG; - changes=1; } - else if(l==1 && prot[i]->misc&PROT_DSZLOG) { - prot[i]->misc&=~PROT_DSZLOG; - changes=1; } - break; } } } - break; - case 13: /* Alternate file paths */ - dflt=bar=0; - while(1) { - for(i=0;i<altpaths;i++) - sprintf(opt[i],"%3d: %-40s",i+1,altpath[i]); - opt[i][0]=0; - i=WIN_ACT|WIN_SAV; /* save cause size can change */ - if((int)altpaths<MAX_OPTS) - i|=WIN_INS; - if(altpaths) - i|=WIN_DEL|WIN_GET; - if(savaltpath[0]) - i|=WIN_PUT; - savnum=0; - SETHELP(WHERE); -/* -Alternate File Paths: - -This option allows the sysop to add and configure alternate file paths -for files stored on drives and directories other than the configured -storage path for a file directory. This command is useful for those who -have file directories where they wish to have files listed from -multiple CD-ROMs or hard disks. -*/ - i=ulist(i,0,0,50,&dflt,&bar,"Alternate File Paths",opt); - if(i==-1) - break; - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(altpath[i]); - altpaths--; - while(i<altpaths) { - altpath[i]=altpath[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - if((altpath=(char **)REALLOC(altpath - ,sizeof(char *)*(altpaths+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,altpaths+1); - altpaths=0; - bail(1); - continue; } - if(!altpaths) { - if((altpath[0]=(char *)MALLOC(LEN_DIR+1))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1); - continue; } - memset(altpath[0],0,LEN_DIR+1); } - else { - for(j=altpaths;j>i;j--) - altpath[j]=altpath[j-1]; - if((altpath[i]=(char *)MALLOC(LEN_DIR+1))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,LEN_DIR+1); - continue; } - memcpy(altpath[i],altpath[i+1],LEN_DIR+1); } - altpaths++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - memcpy(savaltpath,altpath[i],LEN_DIR+1); - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - memcpy(altpath[i],savaltpath,LEN_DIR+1); - changes=1; - continue; } - sprintf(str,"Path %d",i+1); - uinput(WIN_MID|WIN_SAV,0,0,str,altpath[i],50,K_UPPER|K_EDIT); } - break; } } -} - diff --git a/src/sbbs2/scfg/scfgxfr2.c b/src/sbbs2/scfg/scfgxfr2.c deleted file mode 100644 index 6169caf3e4..0000000000 --- a/src/sbbs2/scfg/scfgxfr2.c +++ /dev/null @@ -1,1453 +0,0 @@ -#line 2 "SCFGXFR2.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "scfg.h" - -void xfer_cfg() -{ - static int libs_dflt,libs_bar,dflt; - char str[256],str2[81],done=0,*p; - int file,j,k,q; - uint i; - long ported; - static lib_t savlib; - dir_t tmpdir; - FILE *stream; - -while(1) { - for(i=0;i<total_libs && i<MAX_OPTS;i++) - sprintf(opt[i],"%-25s",lib[i]->lname); - opt[i][0]=0; - j=WIN_ACT|WIN_CHE|WIN_ORG; - if(total_libs) - j|=WIN_DEL|WIN_GET|WIN_DELACT; - if(total_libs<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savlib.sname[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -File Libraries: - -This is a listing of file libraries for your BBS. File Libraries are -used to logically separate your file directories into groups. Every -directory belongs to a file library. - -One popular use for file libraries is to separate CD-ROM and hard disk -directories. One might have an Uploads file library that contains -uploads to the hard disk directories and also have a PC-SIG file -library that contains directories from a PC-SIG CD-ROM. Some sysops -separate directories into more specific areas such as Main, Graphics, -or Adult. If you have many directories that have a common subject -denominator, you may want to have a separate file library for those -directories for a more organized file structure. -*/ - i=ulist(j,0,0,45,&libs_dflt,&libs_bar,"File Libraries",opt); - if((signed)i==-1) { - j=save_changes(WIN_MID); - if(j==-1) - continue; - if(!j) - write_file_cfg(); - return; } - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - strcpy(str,"Main"); - SETHELP(WHERE); -/* -Library Long Name: - -This is a description of the file library which is displayed when a -user of the system uses the /* command from the file transfer menu. -*/*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Library Long Name",str,LEN_GLNAME - ,K_EDIT)<1) - continue; - sprintf(str2,"%.*s",LEN_GSNAME,str); - SETHELP(WHERE); -/* -Library Short Name: - -This is a short description of the file library which is used for the -file transfer menu prompt. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Library Short Name",str2,LEN_GSNAME - ,K_EDIT)<1) - continue; - if((lib=(lib_t **)REALLOC(lib,sizeof(lib_t *)*(total_libs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_libs+1); - total_libs=0; - bail(1); - continue; } - - if(total_libs) { - for(j=total_libs;j>i;j--) - lib[j]=lib[j-1]; - for(j=0;j<total_dirs;j++) - if(dir[j]->lib>=i) - dir[j]->lib++; } - if((lib[i]=(lib_t *)MALLOC(sizeof(lib_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(lib_t)); - continue; } - memset((lib_t *)lib[i],0,sizeof(lib_t)); - strcpy(lib[i]->lname,str); - strcpy(lib[i]->sname,str2); - total_libs++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Delete All Data in Library: - -If you wish to delete the database files for all directories in this -library, select Yes. -*/ - j=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Delete All Library Data Files",opt); - if(j==-1) - continue; - if(j==0) - for(j=0;j<total_dirs;j++) - if(dir[j]->lib==i) { - sprintf(str,"%s.*",dir[j]->code); - if(!dir[j]->data_dir[0]) - sprintf(tmp,"%sDIRS\\",data_dir); - else - strcpy(tmp,dir[j]->data_dir); - delfiles(tmp,str); } - FREE(lib[i]); - for(j=0;j<total_dirs;) { - if(dir[j]->lib==i) { - FREE(dir[j]); - total_dirs--; - k=j; - while(k<total_dirs) { - dir[k]=dir[k+1]; - k++; } } - else j++; } - for(j=0;j<total_dirs;j++) - if(dir[j]->lib>i) - dir[j]->lib--; - total_libs--; - while(i<total_libs) { - lib[i]=lib[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savlib=*lib[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *lib[i]=savlib; - changes=1; - continue; } - done=0; - while(!done) { - j=0; - sprintf(opt[j++],"%-27.27s%s","Long Name",lib[i]->lname); - sprintf(opt[j++],"%-27.27s%s","Short Name",lib[i]->sname); - sprintf(opt[j++],"%-27.27s%.40s","Access Requirements" - ,lib[i]->ar); - strcpy(opt[j++],"Clone Options"); - strcpy(opt[j++],"Export Areas..."); - strcpy(opt[j++],"Import Areas..."); - strcpy(opt[j++],"File Directories..."); - opt[j][0]=0; - savnum=0; - sprintf(str,"%s Library",lib[i]->sname); - SETHELP(WHERE); -/* -File Library Configuration: - -This menu allows you to configure the security requirments for access -to this file library. You can also add, delete, and configure the -directories of this library by selecting the File Directories... option. -*/ - switch(ulist(WIN_ACT,6,4,60,&dflt,0,str,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Library Long Name: - -This is a description of the file library which is displayed when a -user of the system uses the /* command from the file transfer menu. -*/*/ - strcpy(str,lib[i]->lname); /* save */ - if(!uinput(WIN_MID|WIN_SAV,0,0,"Name to use for Listings" - ,lib[i]->lname,LEN_GLNAME,K_EDIT)) - strcpy(lib[i]->lname,str); /* restore */ - break; - case 1: - SETHELP(WHERE); -/* -Library Short Name: - -This is a short description of the file librarly which is used for the -file transfer menu prompt. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Name to use for Prompts" - ,lib[i]->sname,LEN_GSNAME,K_EDIT); - break; - case 2: - sprintf(str,"%s Library",lib[i]->sname); - getar(str,lib[i]->ar); - break; - case 3: /* clone options */ - j=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Clone Directory Options: - -If you want to clone the options of the first directory of this library -into all directories of this library, select Yes. - -The options cloned are upload requirments, download requirments, -operator requirements, exempted user requirements, toggle options, -maximum number of files, allowed file extensions, default file -extension, and sort type. -*/ - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Clone Options of First Directory into All of Library" - ,opt); - if(j==0) { - k=-1; - for(j=0;j<total_dirs;j++) - if(dir[j]->lib==i) { - if(k==-1) - k=j; - else { - changes=1; - dir[j]->misc=dir[k]->misc; - strcpy(dir[j]->ul_ar,dir[k]->ul_ar); - strcpy(dir[j]->dl_ar,dir[k]->dl_ar); - strcpy(dir[j]->op_ar,dir[k]->op_ar); - strcpy(dir[j]->ex_ar,dir[k]->ex_ar); - strcpy(dir[j]->exts,dir[k]->exts); - strcpy(dir[j]->data_dir,dir[k]->data_dir); - strcpy(dir[j]->upload_sem,dir[k]->upload_sem); - dir[j]->maxfiles=dir[k]->maxfiles; - dir[j]->maxage=dir[k]->maxage; - dir[j]->up_pct=dir[k]->up_pct; - dir[j]->dn_pct=dir[k]->dn_pct; - dir[j]->seqdev=dir[k]->seqdev; - dir[j]->sort=dir[k]->sort; } } } - break; - case 4: - k=0; - ported=0; - q=changes; - strcpy(opt[k++],"DIRS.TXT (Synchronet)"); - strcpy(opt[k++],"FILEBONE.NA (Fido)"); - opt[k][0]=0; - SETHELP(WHERE); -/* -Export Area File Format: - -This menu allows you to choose the format of the area file you wish to -export to. -*/ - k=0; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Export Area File Format",opt); - if(k==-1) - break; - if(k==0) - sprintf(str,"%sDIRS.TXT",ctrl_dir); - else if(k==1) - sprintf(str,"FILEBONE.NA"); - strupr(str); - if(uinput(WIN_MID|WIN_SAV,0,0,"Filename" - ,str,40,K_UPPER|K_EDIT)<=0) { - changes=q; - break; } - if(fexist(str)) { - strcpy(opt[0],"Overwrite"); - strcpy(opt[1],"Append"); - opt[2][0]=0; - j=0; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"File Exists",opt); - if(j==-1) - break; - if(j==0) j=O_WRONLY|O_TRUNC; - else j=O_WRONLY|O_APPEND; } - else - j=O_WRONLY|O_CREAT; - if((stream=fnopen(&file,str,j))==NULL) { - umsg("Open Failure"); - break; } - upop("Exporting Areas..."); - for(j=0;j<total_dirs;j++) { - if(dir[j]->lib!=i) - continue; - ported++; - if(k==1) { - fprintf(stream,"Area %-8s 0 ! %s\r\n" - ,dir[j]->code,dir[j]->lname); - continue; } - fprintf(stream,"%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n" - "%s\r\n%s\r\n" - ,dir[j]->lname - ,dir[j]->sname - ,dir[j]->code - ,dir[j]->data_dir - ,dir[j]->ar - ,dir[j]->ul_ar - ,dir[j]->dl_ar - ,dir[j]->op_ar - ); - fprintf(stream,"%s\r\n%s\r\n%u\r\n%s\r\n%lX\r\n%u\r\n" - "%u\r\n" - ,dir[j]->path - ,dir[j]->upload_sem - ,dir[j]->maxfiles - ,dir[j]->exts - ,dir[j]->misc - ,dir[j]->seqdev - ,dir[j]->sort - ); - fprintf(stream,"%s\r\n%u\r\n%u\r\n%u\r\n" - ,dir[j]->ex_ar - ,dir[j]->maxage - ,dir[j]->up_pct - ,dir[j]->dn_pct - ); - fprintf(stream,"***END-OF-DIR***\r\n\r\n"); } - fclose(stream); - upop(0); - sprintf(str,"%lu File Areas Exported Successfully",ported); - umsg(str); - changes=q; - break; - - case 5: - ported=0; - k=0; - SETHELP(WHERE); -/* -Import Area File Format: - -This menu allows you to choose the format of the area file you wish to -import into the current file library. -*/ - strcpy(opt[k++],"DIRS.TXT (Synchronet)"); - strcpy(opt[k++],"FILEBONE.NA (Fido)"); - opt[k][0]=0; - k=0; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Import Area File Format",opt); - if(k==-1) - break; - if(k==0) - sprintf(str,"%sDIRS.TXT",ctrl_dir); - else if(k==1) - sprintf(str,"FILEBONE.NA"); - strupr(str); - if(uinput(WIN_MID|WIN_SAV,0,0,"Filename" - ,str,40,K_UPPER|K_EDIT)<=0) - break; - if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - umsg("Open Failure"); - break; } - upop("Importing Areas..."); - while(!feof(stream)) { - if(!fgets(str,128,stream)) break; - truncsp(str); - if(!str[0]) - continue; - if(k) { - p=str; - while(*p && *p<=SP) p++; - if(strnicmp(p,"AREA ",5)) - continue; - memset(&tmpdir,0,sizeof(dir_t)); - tmpdir.misc|= - (DIR_FCHK|DIR_DUPES|DIR_CDTUL|DIR_CDTDL|DIR_DIZ); - if(k==1) { - p+=5; - while(*p && *p<=SP) p++; - sprintf(tmpdir.code,"%.8s",p); - truncsp(tmpdir.code); - while(*p>SP) p++; /* Skip areaname */ - while(*p && *p<=SP) p++; /* Skip space */ - while(*p>SP) p++; /* Skip level */ - while(*p && *p<=SP) p++; /* Skip space */ - while(*p>SP) p++; /* Skip flags */ - while(*p && *p<=SP) p++; /* Skip space */ - sprintf(tmpdir.lname,"%.*s",LEN_SLNAME,p); } - ported++; } - else { - memset(&tmpdir,0,sizeof(dir_t)); - sprintf(tmpdir.lname,"%.*s",LEN_SLNAME,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.sname,"%.*s",LEN_SSNAME,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.code,"%.*s",8,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.data_dir,"%.*s",LEN_DIR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.ar,"%.*s",LEN_ARSTR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.ul_ar,"%.*s",LEN_ARSTR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.dl_ar,"%.*s",LEN_ARSTR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.op_ar,"%.*s",LEN_ARSTR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.path,"%.*s",LEN_DIR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.upload_sem,"%.*s",LEN_DIR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpdir.maxfiles=atoi(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.exts,"%.*s",40,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpdir.misc=ahtoul(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpdir.seqdev=atoi(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpdir.sort=atoi(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - sprintf(tmpdir.ex_ar,"%.*s",LEN_ARSTR,str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpdir.maxage=atoi(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpdir.up_pct=atoi(str); - if(!fgets(str,128,stream)) break; - truncsp(str); - tmpdir.dn_pct=atoi(str); - - ported++; - while(!feof(stream) - && strcmp(str,"***END-OF-DIR***")) { - if(!fgets(str,128,stream)) break; - truncsp(str); } } - - for(j=0;j<total_dirs;j++) { - if(dir[j]->lib!=i) - continue; - if(!stricmp(dir[j]->code,tmpdir.code)) - break; } - if(j==total_dirs) { - - if((dir=(dir_t **)REALLOC(dir - ,sizeof(dir_t *)*(total_dirs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,"dir",total_dirs+1); - total_dirs=0; - bail(1); - break; } - - if((dir[j]=(dir_t *)MALLOC(sizeof(dir_t))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,"dir",sizeof(dir_t)); - break; } - memset(dir[j],0,sizeof(dir_t)); } - if(!k) - memcpy(dir[j],&tmpdir,sizeof(dir_t)); - else { - strcpy(dir[j]->code,tmpdir.code); - strcpy(dir[j]->sname,tmpdir.code); - strcpy(dir[j]->lname,tmpdir.lname); - if(j==total_dirs) { - dir[j]->maxfiles=1000; - dir[j]->up_pct=cdt_up_pct; - dir[j]->dn_pct=cdt_dn_pct; } - } - dir[j]->lib=i; - if(j==total_dirs) { - dir[j]->misc=tmpdir.misc; - total_dirs++; } - changes=1; } - fclose(stream); - upop(0); - sprintf(str,"%lu File Areas Imported Successfully",ported); - umsg(str); - break; - - case 6: - dir_cfg(i); - break; } } } - -} - -void dir_cfg(uint libnum) -{ - static int dflt,bar,tog_dflt,tog_bar,adv_dflt,opt_dflt; - char str[81],str2[81],code[9],path[128],done=0,*p; - int j,n; - uint i,dirnum[MAX_OPTS+1]; - static dir_t savdir; - -while(1) { - for(i=0,j=0;i<total_dirs && j<MAX_OPTS;i++) - if(dir[i]->lib==libnum) { - sprintf(opt[j],"%-25s",dir[i]->lname); - dirnum[j++]=i; } - dirnum[j]=total_dirs; - opt[j][0]=0; - sprintf(str,"%s Directories",lib[libnum]->sname); - savnum=0; - i=WIN_SAV|WIN_ACT; - if(j) - i|=WIN_DEL|WIN_GET|WIN_DELACT; - if(j<MAX_OPTS) - i|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savdir.sname[0]) - i|=WIN_PUT; - SETHELP(WHERE); -/* -File Directories: - -This is a list of file directories that have been configured for the -selected file library. - -To add a directory, select the desired position with the arrow keys and -hit INS . - -To delete a directory, select it with the arrow keys and hit DEL . - -To configure a directory, select it with the arrow keys and hit ENTER . -*/ - i=ulist(i,24,1,45,&dflt,&bar,str,opt); - savnum=1; - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - strcpy(str,"Games"); - SETHELP(WHERE); -/* -Directory Long Name: - -This is a description of the file directory which is displayed in all -directory listings. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Directory Long Name",str,LEN_SLNAME - ,K_EDIT)<1) - continue; - sprintf(str2,"%.*s",LEN_SSNAME,str); - SETHELP(WHERE); -/* -Directory Short Name: - -This is a short description of the file directory which is displayed at -the file transfer prompt. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Directory Short Name",str2,LEN_SSNAME - ,K_EDIT)<1) - continue; - sprintf(code,"%.8s",str2); - p=strchr(code,SP); - if(p) *p=0; - strupr(code); - SETHELP(WHERE); -/* -Directory Internal Code: - -Every directory must have its own unique code for Synchronet to refer to -it internally. This code should be descriptive of the directory's -contents, usually an abreviation of the directory's name. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Directory Internal Code",code,8 - ,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; - continue; } - sprintf(path,"%sDIRS\\%s",data_dir,code); - SETHELP(WHERE); -/* -Directory File Path: - -This is the drive and directory where your uploads to and downloads from -this directory will be stored. Example: C:\XFER\GAMES -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Directory File Path",path,50 - ,K_EDIT|K_UPPER)<1) - continue; - if((dir=(dir_t **)REALLOC(dir,sizeof(dir_t *)*(total_dirs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_dirs+1); - total_dirs=0; - bail(1); - continue; } - - if(j) - for(n=total_dirs;n>dirnum[i];n--) - dir[n]=dir[n-1]; - if((dir[dirnum[i]]=(dir_t *)MALLOC(sizeof(dir_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(dir_t)); - continue; } - memset((dir_t *)dir[dirnum[i]],0,sizeof(dir_t)); - dir[dirnum[i]]->lib=libnum; - dir[dirnum[i]]->maxfiles=MAX_FILES<500 ? MAX_FILES:500; - if(strcmpi(str2,"OFFLINE")) - dir[dirnum[i]]->misc=(DIR_FCHK|DIR_MULT|DIR_DUPES - |DIR_CDTUL|DIR_CDTDL|DIR_DIZ); - strcpy(dir[dirnum[i]]->code,code); - strcpy(dir[dirnum[i]]->lname,str); - strcpy(dir[dirnum[i]]->sname,str2); - strcpy(dir[dirnum[i]]->path,path); - dir[dirnum[i]]->up_pct=cdt_up_pct; - dir[dirnum[i]]->dn_pct=cdt_dn_pct; - total_dirs++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Delete Directory Data Files: - -If you want to delete all the database files for this directory, -select Yes. -*/ - j=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Delete Data in Sub-board",opt); - if(j==-1) - continue; - if(j==0) { - sprintf(str,"%s.*",dir[dirnum[i]]->code); - if(!dir[dirnum[i]]->data_dir[0]) - sprintf(tmp,"%sDIRS\\",data_dir); - else - strcpy(tmp,dir[dirnum[i]]->data_dir); - delfiles(tmp,str); } - FREE(dir[dirnum[i]]); - total_dirs--; - for(j=dirnum[i];j<total_dirs;j++) - dir[j]=dir[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savdir=*dir[dirnum[i]]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *dir[dirnum[i]]=savdir; - dir[dirnum[i]]->lib=libnum; - changes=1; - continue; } - i=dirnum[dflt]; - j=0; - done=0; - while(!done) { - n=0; - sprintf(opt[n++],"%-27.27s%s","Long Name",dir[i]->lname); - sprintf(opt[n++],"%-27.27s%s","Short Name",dir[i]->sname); - sprintf(opt[n++],"%-27.27s%s","Internal Code",dir[i]->code); - sprintf(opt[n++],"%-27.27s%.40s","Access Requirements" - ,dir[i]->ar); - sprintf(opt[n++],"%-27.27s%.40s","Upload Requirements" - ,dir[i]->ul_ar); - sprintf(opt[n++],"%-27.27s%.40s","Download Requirements" - ,dir[i]->dl_ar); - sprintf(opt[n++],"%-27.27s%.40s","Operator Requirements" - ,dir[i]->op_ar); - sprintf(opt[n++],"%-27.27s%.40s","Exemption Requirements" - ,dir[i]->ex_ar); - sprintf(opt[n++],"%-27.27s%.40s","Transfer File Path" - ,dir[i]->path); - sprintf(opt[n++],"%-27.27s%u","Maximum Number of Files" - ,dir[i]->maxfiles); - if(dir[i]->maxage) - sprintf(str,"Enabled (%u days old)",dir[i]->maxage); - else - strcpy(str,"Disabled"); - sprintf(opt[n++],"%-27.27s%s","Purge by Age",str); - sprintf(opt[n++],"%-27.27s%u%%","Credit on Upload" - ,dir[i]->up_pct); - sprintf(opt[n++],"%-27.27s%u%%","Credit on Download" - ,dir[i]->dn_pct); - strcpy(opt[n++],"Toggle Options..."); - strcpy(opt[n++],"Advanced Options..."); - opt[n][0]=0; - sprintf(str,"%s Directory",dir[i]->sname); - SETHELP(WHERE); -/* -Directory Configuration: - -This menu allows you to configure the individual selected directory. -Options with a trailing ... provide a sub-menu of more options. -*/ - savnum=1; - switch(ulist(WIN_SAV|WIN_ACT|WIN_RHT|WIN_BOT - ,0,0,60,&opt_dflt,0,str,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Directory Long Name: - -This is a description of the file directory which is displayed in all -directory listings. -*/ - strcpy(str,dir[i]->lname); /* save */ - if(!uinput(WIN_L2R|WIN_SAV,0,17,"Name to use for Listings" - ,dir[i]->lname,LEN_SLNAME,K_EDIT)) - strcpy(dir[i]->lname,str); - break; - case 1: - SETHELP(WHERE); -/* -Directory Short Name: - -This is a short description of the file directory which is displayed at -the file transfer prompt. -*/ - uinput(WIN_L2R|WIN_SAV,0,17,"Name to use for Prompts" - ,dir[i]->sname,LEN_SSNAME,K_EDIT); - break; - case 2: - SETHELP(WHERE); -/* -Directory Internal Code: - -Every directory must have its own unique code for Synchronet to refer to -it internally. This code should be descriptive of the directory's -contents, usually an abreviation of the directory's name. -*/ - strcpy(str,dir[i]->code); - uinput(WIN_L2R|WIN_SAV,0,17,"Internal Code (unique)" - ,str,8,K_EDIT|K_UPPER); - if(code_ok(str)) - strcpy(dir[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; - case 3: - savnum=2; - sprintf(str,"%s Access",dir[i]->sname); - getar(str,dir[i]->ar); - break; - case 4: - savnum=2; - sprintf(str,"%s Upload",dir[i]->sname); - getar(str,dir[i]->ul_ar); - break; - case 5: - savnum=2; - sprintf(str,"%s Download",dir[i]->sname); - getar(str,dir[i]->dl_ar); - break; - case 6: - savnum=2; - sprintf(str,"%s Operator",dir[i]->sname); - getar(str,dir[i]->op_ar); - break; - case 7: - savnum=2; - sprintf(str,"%s Exemption",dir[i]->sname); - getar(str,dir[i]->ex_ar); - break; - case 8: - SETHELP(WHERE); -/* -File Path: - -This is the default storage path for files uploaded to this directory. -If this path is blank, files are stored in a directory off of the -DATA\DIRS directory using the internal code of this directory as the -name of the dirdirectory (i.e. DATA\DIRS\<CODE>). - -This path can be overridden on a per file basis using Alternate File -Paths. -*/ - uinput(WIN_L2R|WIN_SAV,0,17,"File Path" - ,dir[i]->path,50,K_EDIT|K_UPPER); - break; - case 9: - SETHELP(WHERE); -/* -Maximum Number of Files: - -This value is the maximum number of files allowed in this directory. -*/ - sprintf(str,"%u",dir[i]->maxfiles); - uinput(WIN_L2R|WIN_SAV,0,17,"Maximum Number of Files" - ,str,5,K_EDIT|K_NUMBER); - n=atoi(str); - if(n>MAX_FILES) { - sprintf(str,"Maximum Files is %u",MAX_FILES); - umsg(str); } - else - dir[i]->maxfiles=n; - break; - case 10: - sprintf(str,"%u",dir[i]->maxage); - SETHELP(WHERE); -/* -Maximum Age of Files: - -This value is the maximum number of days that files will be kept in -the directory based on the date the file was uploaded or last -downloaded (If the Purge by Last Download toggle option is used). - -The Synchronet file base maintenance program (DELFILES) must be used -to automatically remove files based on age. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Maximum Age of Files (in days)" - ,str,5,K_EDIT|K_NUMBER); - dir[i]->maxage=atoi(str); - break; - case 11: -SETHELP(WHERE); -/* -Percentage of Credits to Credit Uploader on Upload: - -This is the percentage of a file's credit value that is given to users -when they upload files. Most often, this value will be set to 100 to -give full credit value (100%) for uploads. - -If you want uploaders to receive no credits upon upload, set this value -to 0. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Percentage of Credits to Credit Uploader on Upload" - ,itoa(dir[i]->up_pct,tmp,10),4,K_EDIT|K_NUMBER); - dir[i]->up_pct=atoi(tmp); - break; - case 12: -SETHELP(WHERE); -/* -Percentage of Credits to Credit Uploader on Download: - -This is the percentage of a file's credit value that is given to users -who upload a file that is later downloaded by another user. This is an -award type system where more popular files will generate more credits -for the uploader. - -If you do not want uploaders to receive credit when files they upload -are later downloaded, set this value to 0. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Percentage of Credits to Credit Uploader on Download" - ,itoa(dir[i]->dn_pct,tmp,10),4,K_EDIT|K_NUMBER); - dir[i]->dn_pct=atoi(tmp); - break; - case 13: - while(1) { - n=0; - sprintf(opt[n++],"%-27.27s%s","Check for File Existence" - ,dir[i]->misc&DIR_FCHK ? "Yes":"No"); - strcpy(str,"Slow Media Device"); - if(dir[i]->seqdev) { - sprintf(tmp," #%u",dir[i]->seqdev); - strcat(str,tmp); } - sprintf(opt[n++],"%-27.27s%s",str - ,dir[i]->seqdev ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Force Content Ratings" - ,dir[i]->misc&DIR_RATE ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Upload Date in Listings" - ,dir[i]->misc&DIR_ULDATE ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Multiple File Numberings" - ,dir[i]->misc&DIR_MULT ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Search for Duplicates" - ,dir[i]->misc&DIR_DUPES ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Search for New Files" - ,dir[i]->misc&DIR_NOSCAN ? "No":"Yes"); - sprintf(opt[n++],"%-27.27s%s","Search for Auto-ADDFILES" - ,dir[i]->misc&DIR_NOAUTO ? "No":"Yes"); - sprintf(opt[n++],"%-27.27s%s","Import FILE_ID.DIZ" - ,dir[i]->misc&DIR_DIZ ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Free Downloads" - ,dir[i]->misc&DIR_FREE ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Free Download Time" - ,dir[i]->misc&DIR_TFREE ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Deduct Upload Time" - ,dir[i]->misc&DIR_ULTIME ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Credit Uploads" - ,dir[i]->misc&DIR_CDTUL ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Credit Downloads" - ,dir[i]->misc&DIR_CDTDL ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Credit with Minutes" - ,dir[i]->misc&DIR_CDTMIN ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Anonymous Uploads" - ,dir[i]->misc&DIR_ANON ? dir[i]->misc&DIR_AONLY - ? "Only":"Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Purge by Last Download" - ,dir[i]->misc&DIR_SINCEDL ? "Yes":"No"); - sprintf(opt[n++],"%-27.27s%s","Mark Moved Files as New" - ,dir[i]->misc&DIR_MOVENEW ? "Yes":"No"); - opt[n][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Directory Toggle Options: - -This is the toggle options menu for the selected file directory. - -The available options from this menu can all be toggled between two or -more states, such as Yes and No. -*/ - n=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,2,36,&tog_dflt - ,&tog_bar,"Toggle Options",opt); - if(n==-1) - break; - savnum=3; - switch(n) { - case 0: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Check for File Existence When Listing: - -If you want the actual existence of files to be verified while listing -directories, set this value to Yes. - -Directories with files located on CD-ROM or other slow media should have -this option set to No. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Check for File Existence When Listing",opt); - if(n==0 && !(dir[i]->misc&DIR_FCHK)) { - dir[i]->misc|=DIR_FCHK; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_FCHK)) { - dir[i]->misc&=~DIR_FCHK; - changes=1; } - break; - case 1: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Slow Media Device: - -If this directory contains files located on CD-ROM or other slow media -device, you should set this option to Yes. Each slow media device on -your system should have a unique Device Number. If you only have one -slow media device, then this number should be set to 1. - -CD-ROM multidisk changers are considered one device and all the -directories on all the CD-ROMs in each changer should be set to the same -device number. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Slow Media Device" - ,opt); - if(n==0) { - if(!dir[i]->seqdev) { - changes=1; - strcpy(str,"1"); } - else - sprintf(str,"%u",dir[i]->seqdev); - uinput(WIN_MID|WIN_SAV,0,0 - ,"Device Number" - ,str,2,K_EDIT|K_UPPER); - dir[i]->seqdev=atoi(str); } - else if(n==1 && dir[i]->seqdev) { - dir[i]->seqdev=0; - changes=1; } - break; - case 2: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Force Content Ratings in Descriptions: - -If you would like all uploads to this directory to be prompted for -content rating (G, R, or X), set this value to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Force Content Ratings in Descriptions",opt); - if(n==0 && !(dir[i]->misc&DIR_RATE)) { - dir[i]->misc|=DIR_RATE; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_RATE)) { - dir[i]->misc&=~DIR_RATE; - changes=1; } - break; - case 3: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Include Upload Date in File Descriptions: - -If you wish the upload date of each file in this directory to be -automatically included in the file description, set this option to -Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Include Upload Date in Descriptions",opt); - if(n==0 && !(dir[i]->misc&DIR_ULDATE)) { - dir[i]->misc|=DIR_ULDATE; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_ULDATE)) { - dir[i]->misc&=~DIR_ULDATE; - changes=1; } - break; - case 4: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Ask for Multiple File Numberings: - -If you would like uploads to this directory to be prompted for multiple -file (disk) numbers, set this value to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Ask for Multiple File Numberings",opt); - if(n==0 && !(dir[i]->misc&DIR_MULT)) { - dir[i]->misc|=DIR_MULT; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_MULT)) { - dir[i]->misc&=~DIR_MULT; - changes=1; } - break; - case 5: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Search Directory for Duplicate Filenames: - -If you would like to have this directory searched for duplicate -filenames when a user attempts to upload a file, set this option to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Search for Duplicate Filenames",opt); - if(n==0 && !(dir[i]->misc&DIR_DUPES)) { - dir[i]->misc|=DIR_DUPES; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_DUPES)) { - dir[i]->misc&=~DIR_DUPES; - changes=1; } - break; - case 6: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Search Directory for New Files: - -If you would like to have this directory searched for newly uploaded -files when a user scans All libraries for new files, set this option to -Yes. - -If this directory is located on CD-ROM or other read only media -(where uploads are unlikely to occur), it will improve new file scans -if this option is set to No. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Search for New files",opt); - if(n==0 && dir[i]->misc&DIR_NOSCAN) { - dir[i]->misc&=~DIR_NOSCAN; - changes=1; } - else if(n==1 && !(dir[i]->misc&DIR_NOSCAN)) { - dir[i]->misc|=DIR_NOSCAN; - changes=1; } - break; - case 7: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Search Directory for Auto-ADDFILES: - -If you would like to have this directory searched for a file list to -import automatically when using the ADDFILES * (Auto-ADD) feature, -set this option to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Search for Auto-ADDFILES",opt); - if(n==0 && dir[i]->misc&DIR_NOAUTO) { - dir[i]->misc&=~DIR_NOAUTO; - changes=1; } - else if(n==1 && !(dir[i]->misc&DIR_NOAUTO)) { - dir[i]->misc|=DIR_NOAUTO; - changes=1; } - break; - case 8: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Import FILE_ID.DIZ and DESC.SDI Descriptions: - -If you would like archived descriptions (FILE_ID.DIZ and DESC.SDI) -of uploaded files to be automatically imported as the extended -description, set this option to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Import FILE_ID.DIZ and DESC.SDI",opt); - if(n==0 && !(dir[i]->misc&DIR_DIZ)) { - dir[i]->misc|=DIR_DIZ; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_DIZ)) { - dir[i]->misc&=~DIR_DIZ; - changes=1; } - break; - case 9: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Downloads are Free: - -If you would like all downloads from this directory to be free (cost -no credits), set this option to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Downloads are Free",opt); - if(n==0 && !(dir[i]->misc&DIR_FREE)) { - dir[i]->misc|=DIR_FREE; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_FREE)) { - dir[i]->misc&=~DIR_FREE; - changes=1; } - break; - case 10: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Free Download Time: - -If you would like all downloads from this directory to not subtract -time from the user, set this option to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Free Download Time",opt); - if(n==0 && !(dir[i]->misc&DIR_TFREE)) { - dir[i]->misc|=DIR_TFREE; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_TFREE)) { - dir[i]->misc&=~DIR_TFREE; - changes=1; } - break; - case 11: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Deduct Upload Time: - -If you would like all uploads to this directory to have the time spent -uploading subtracted from their time online, set this option to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Deduct Upload Time",opt); - if(n==0 && !(dir[i]->misc&DIR_ULTIME)) { - dir[i]->misc|=DIR_ULTIME; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_ULTIME)) { - dir[i]->misc&=~DIR_ULTIME; - changes=1; } - break; - case 12: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Give Credit for Uploads: - -If you want users who upload to this directory to get credit for their -initial upload, set this option to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Give Credit for Uploads",opt); - if(n==0 && !(dir[i]->misc&DIR_CDTUL)) { - dir[i]->misc|=DIR_CDTUL; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_CDTUL)) { - dir[i]->misc&=~DIR_CDTUL; - changes=1; } - break; - case 13: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Give Uploader Credit for Downloads: - -If you want users who upload to this directory to get credit when their -files are downloaded, set this optin to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Give Uploader Credit for Downloads",opt); - if(n==0 && !(dir[i]->misc&DIR_CDTDL)) { - dir[i]->misc|=DIR_CDTDL; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_CDTDL)) { - dir[i]->misc&=~DIR_CDTDL; - changes=1; } - break; - case 14: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Credit Uploader with Minutes instead of Credits: - -If you wish to give the uploader of files to this directory minutes, -intead of credits, set this option to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Credit Uploader with Minutes",opt); - if(n==0 && !(dir[i]->misc&DIR_CDTMIN)) { - dir[i]->misc|=DIR_CDTMIN; - changes=1; } - else if(n==1 && dir[i]->misc&DIR_CDTMIN){ - dir[i]->misc&=~DIR_CDTMIN; - changes=1; } - break; - - case 15: - n=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - strcpy(opt[2],"Only"); - opt[3][0]=0; - SETHELP(WHERE); -/* -Allow Anonymous Uploads: - -If you want users with the A exemption to be able to upload anonymously -to this directory, set this option to Yes. If you want all uploads to -this directory to be forced anonymous, set this option to Only. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Allow Anonymous Uploads",opt); - if(n==0 && (dir[i]->misc&(DIR_ANON|DIR_AONLY)) - !=DIR_ANON) { - dir[i]->misc|=DIR_ANON; - dir[i]->misc&=~DIR_AONLY; - changes=1; } - else if(n==1 && dir[i]->misc&(DIR_ANON|DIR_AONLY)){ - dir[i]->misc&=~(DIR_ANON|DIR_AONLY); - changes=1; } - else if(n==2 && (dir[i]->misc&(DIR_ANON|DIR_AONLY)) - !=(DIR_ANON|DIR_AONLY)) { - dir[i]->misc|=(DIR_ANON|DIR_AONLY); - changes=1; } - break; - case 16: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Purge Files Based on Date of Last Download: - -Using the Synchronet file base maintenance utility (DELFILES), you can -have files removed based on the number of days since last downloaded -rather than the number of days since the file was uploaded (default), -by setting this option to Yes. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Purge Files Based on Date of Last Download" - ,opt); - if(n==0 && !(dir[i]->misc&DIR_SINCEDL)) { - dir[i]->misc|=DIR_SINCEDL; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_SINCEDL)) { - dir[i]->misc&=~DIR_SINCEDL; - changes=1; } - break; - case 17: - n=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Mark Moved Files as New: - -If this option is set to Yes, then all files moved from this directory -will have their upload date changed to the current date so the file will -appear in users' new-file scans again. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Mark Moved Files as New" - ,opt); - if(n==0 && !(dir[i]->misc&DIR_MOVENEW)) { - dir[i]->misc|=DIR_MOVENEW; - changes=1; } - else if(n==1 && (dir[i]->misc&DIR_MOVENEW)) { - dir[i]->misc&=~DIR_MOVENEW; - changes=1; } - break; - } } - break; - case 14: - while(1) { - n=0; - sprintf(opt[n++],"%-27.27s%s","Extensions Allowed" - ,dir[i]->exts); - if(!dir[i]->data_dir[0]) - sprintf(str,"%sDIRS\\",data_dir); - else - strcpy(str,dir[i]->data_dir); - sprintf(opt[n++],"%-27.27s%.40s","Data Directory" - ,str); - sprintf(opt[n++],"%-27.27s%.40s","Upload Semaphore File" - ,dir[i]->upload_sem); - sprintf(opt[n++],"%-27.27s%s","Sort Value and Direction" - , dir[i]->sort==SORT_NAME_A ? "Name Ascending" - : dir[i]->sort==SORT_NAME_D ? "Name Descending" - : dir[i]->sort==SORT_DATE_A ? "Date Ascending" - : "Date Descending"); - opt[n][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Directory Advanced Options: - -This is the advanced options menu for the selected file directory. -*/ - n=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,3,4,60,&adv_dflt,0 - ,"Advanced Options",opt); - if(n==-1) - break; - savnum=3; - switch(n) { - case 0: - SETHELP(WHERE); -/* -File Extensions Allowed: - -This option allows you to limit the types of files uploaded to this -directory. This is a list of file extensions that are allowed, each -separated by a comma (Example: ZIP,EXE). If this option is left -blank, all file extensions will be allowed to be uploaded. -*/ - uinput(WIN_L2R|WIN_SAV,0,17 - ,"File Extensions Allowed" - ,dir[i]->exts,40,K_EDIT|K_UPPER); - break; - case 1: -SETHELP(WHERE); -/* -Data Directory: - -Use this if you wish to place the data directory for this directory -on another drive or in another directory besides the default setting. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Data" - ,dir[i]->data_dir,50,K_EDIT|K_UPPER); - break; - case 2: -SETHELP(WHERE); -/* -Upload Semaphore File: - -This is a filename that will be used as a semaphore (signal) to your -FidoNet front-end that new files are ready to be hatched for export. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Upload Semaphore" - ,dir[i]->upload_sem,50,K_EDIT|K_UPPER); - break; - case 3: - n=0; - strcpy(opt[0],"Name Ascending"); - strcpy(opt[1],"Name Descending"); - strcpy(opt[2],"Date Ascending"); - strcpy(opt[3],"Date Descending"); - opt[4][0]=0; - SETHELP(WHERE); -/* -Sort Value and Direction: - -This option allows you to determine the sort value and direction. Files -that are uploaded are automatically sorted by filename or upload date, -ascending or descending. If you change the sort value or direction after -a directory already has files in it, use the sysop transfer menu ;RESORT -command to resort the directory with the new sort parameters. -*/ - n=ulist(WIN_MID|WIN_SAV,0,0,0,&n,0 - ,"Sort Value and Direction",opt); - if(n==0 && dir[i]->sort!=SORT_NAME_A) { - dir[i]->sort=SORT_NAME_A; - changes=1; } - else if(n==1 && dir[i]->sort!=SORT_NAME_D) { - dir[i]->sort=SORT_NAME_D; - changes=1; } - else if(n==2 && dir[i]->sort!=SORT_DATE_A) { - dir[i]->sort=SORT_DATE_A; - changes=1; } - else if(n==3 && dir[i]->sort!=SORT_DATE_D) { - dir[i]->sort=SORT_DATE_D; - changes=1; } - break; } } - break; - } } } - -} diff --git a/src/sbbs2/scfg/scfgxtrn.c b/src/sbbs2/scfg/scfgxtrn.c deleted file mode 100644 index 38561a964d..0000000000 --- a/src/sbbs2/scfg/scfgxtrn.c +++ /dev/null @@ -1,1798 +0,0 @@ -#line 2 "SCFGXTRN.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -extern char *wday[]; - -char *daystr(char days); - - -/****************************************************************************/ -/* Synchronet configuration utility */ -/****************************************************************************/ - -#include "scfg.h" - -void xprogs_cfg() -{ - static int xprogs_dflt; - int i; - char str[81]; - -while(1) { - i=0; - strcpy(opt[i++],"Fixed Events"); - strcpy(opt[i++],"Timed Events"); - strcpy(opt[i++],"Global Swap List"); - strcpy(opt[i++],"OS/2 Program List"); - strcpy(opt[i++],"External Editors"); - strcpy(opt[i++],"Online Programs"); - opt[i][0]=0; - SETHELP(WHERE); -/* -Online External Programs: - -From this menu, you can configure external events, external editors, or -online external programs (doors). -*/ - switch(ulist(WIN_ORG|WIN_CHE|WIN_ACT,0,0,0,&xprogs_dflt,0 - ,"External Programs",opt)) { - case -1: - i=save_changes(WIN_MID); - if(i==-1) - break; - if(!i) { - write_xtrn_cfg(); - write_main_cfg(); } - return; - case 0: - fevents_cfg(); - break; - case 1: - tevents_cfg(); - break; - case 2: - swap_cfg(); - break; - case 3: - os2pgm_cfg(); - break; - case 4: - xedit_cfg(); - break; - case 5: - xtrnsec_cfg(); - break; } } -} - -void fevents_cfg() -{ - static int event_dflt; - char str[81],*p; - int i; - -while(1) { - i=0; - sprintf(opt[i++],"%-32.32s%.40s","Logon Event",sys_logon); - sprintf(opt[i++],"%-32.32s%.40s","Logout Event",sys_logout); - sprintf(opt[i++],"%-32.32s%.40s","Daily Event",sys_daily); - opt[i][0]=0; - savnum=0; - SETHELP(WHERE); -/* -External Events: - -From this menu, you can configure the logon and logout events, and the -system daily event. -*/ - switch(ulist(WIN_ACT|WIN_SAV|WIN_CHE|WIN_BOT|WIN_RHT,0,0,60,&event_dflt,0 - ,"Fixed Events",opt)) { - case -1: - return; - case 0: - SETHELP(WHERE); -/* -Logon Event: - -This is the command line for a program that will execute during the -logon sequence of every user. The program cannot have user interaction. -The program will be executed after the LOGON message is displayed and -before the logon user list is displayed. If you wish to place a program -in the logon sequence of users that includes interaction or requires -account information, you probably want to use an online external -program configured to run as a logon event. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Logon Event" - ,sys_logon,50,K_EDIT); - break; - case 1: - SETHELP(WHERE); -/* -Logout Event: - -This is the command line for a program that will execute during the -logout sequence of every user. This program cannot have user -interaction because it is executed after carrier is dropped. If you -wish to have a program execute before carrier is dropped, you probably -want to use an Online External Program configured to run as a logoff -event. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Logout Event" - ,sys_logout,50,K_EDIT); - break; - case 2: - SETHELP(WHERE); -/* -Daily Event: - -This is the command line for a program that will run after the first -user that logs on after midnight, logs off (regardless of what node). -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Daily Event" - ,sys_daily,50,K_EDIT); - - break; } } -} - -void tevents_cfg() -{ - static int dflt,dfltopt,bar; - char str[81],done=0,*p; - int j,k; - uint i; - static event_t savevent; - -while(1) { - for(i=0;i<total_events && i<MAX_OPTS;i++) - sprintf(opt[i],"%-8.8s %.50s",event[i]->code,event[i]->cmd); - opt[i][0]=0; - j=WIN_SAV|WIN_ACT|WIN_CHE|WIN_RHT; - savnum=0; - if(total_events) - j|=WIN_DEL|WIN_GET; - if(total_events<MAX_OPTS) - j|=WIN_INS|WIN_INSACT; - if(savevent.code[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -Timed Events: - -This is a list of the configured timed external events. - -To add an event hit INS . - -To delete an event, select it and hit DEL . - -To configure an event, select it and hit ENTER . -*/ - i=ulist(j,0,0,45,&dflt,&bar,"Timed Events",opt); - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i=total_events; - SETHELP(WHERE); -/* -Timed Event Internal Code: - -This is the internal code for the timed event. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Event Internal Code",str,8 - ,K_UPPER)<1) - continue; - if((event=(event_t **)REALLOC(event - ,sizeof(event_t *)*(total_events+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_events+1); - total_events=0; - bail(1); - continue; } - if((event[i]=(event_t *)MALLOC(sizeof(event_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(event_t)); - continue; } - memset((event_t *)event[i],0,sizeof(event_t)); - strcpy(event[i]->code,str); - event[i]->node=1; - event[i]->days=0xff; - total_events++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(event[i]); - total_events--; - for(j=i;j<total_events;j++) - event[j]=event[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savevent=*event[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *event[i]=savevent; - changes=1; - continue; } - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-32.32s%s","Internal Code",event[i]->code); - sprintf(opt[k++],"%-32.32s%.40s","Start-up Directory",event[i]->dir); - sprintf(opt[k++],"%-32.32s%.40s","Command Line",event[i]->cmd); - sprintf(opt[k++],"%-32.32s%u","Execution Node",event[i]->node); - sprintf(opt[k++],"%-32.32s%s","Execution Days",daystr(event[i]->days)); - sprintf(opt[k++],"%-32.32s%02u:%02u","Execution Time" - ,event[i]->time/60,event[i]->time%60); - sprintf(opt[k++],"%-32.32s%s","Requires Exclusive Execution" - ,event[i]->misc&EVENT_EXCL ? "Yes":"No"); - sprintf(opt[k++],"%-32.32s%s","Force Users Off-line For Event" - ,event[i]->misc&EVENT_FORCE ? "Yes":"No"); - opt[k][0]=0; - SETHELP(WHERE); -/* -Timed Event: - -This is the configuration menu for a timed event. An event is an -external program that performs some type of automated function on the -system. Use this menu to configure how and when this event will be -executed. - -If you need the BBS to swap out of memory for this event (to make more -available memory), add the program name (first word of the command line) -to Global Swap List from the External Programs menu. -*/ - savnum=1; - sprintf(str,"%s Timed Event",event[i]->code); - switch(ulist(WIN_SAV|WIN_ACT|WIN_L2R|WIN_BOT,0,0,70,&dfltopt,0 - ,str,opt)) { - case -1: - done=1; - break; - case 0: - strcpy(str,event[i]->code); - SETHELP(WHERE); -/* -Timed Event Internal Code: - -Every timed event must have its own unique internal code for Synchronet -to reference it by. It is helpful if this code is an abreviation of the -command line. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)" - ,str,8,K_EDIT|K_UPPER); - if(code_ok(str)) - strcpy(event[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; - case 1: - SETHELP(WHERE); -/* -Timed Event Start-up Directory: - -This is the DOS drive/directory where the event program is located. -If a path is specified here, it will be made the current directory -before the event's command line is executed. This eliminates the need -for batch files that just change the current drive and directory before -executing the event. - -If this option is not used, the current NODE's directory will be the -current DOS drive/directory before the command line is executed. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Directory" - ,event[i]->dir,50,K_EDIT|K_UPPER); - break; - case 2: - SETHELP(WHERE); -/* -Timed Event Command Line: - -This is the command line to execute upon this timed event. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Command" - ,event[i]->cmd,50,K_EDIT); - break; - case 3: - SETHELP(WHERE); -/* -Timed Event Node: - -This is the node number to execute the timed event. -*/ - sprintf(str,"%u",event[i]->node); - uinput(WIN_MID|WIN_SAV,0,0,"Node Number" - ,str,3,K_EDIT|K_NUMBER); - event[i]->node=atoi(str); - break; - case 4: - j=0; - while(1) { - for(k=0;k<7;k++) - sprintf(opt[k],"%s %s" - ,wday[k],(event[i]->days&(1<<k)) ? "Yes":"No"); - opt[k][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Days to Execute Event: - -These are the days of the week that this event will be executed. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Days to Execute Event",opt); - if(k==-1) - break; - event[i]->days^=(1<<k); - changes=1; } - break; - case 5: - sprintf(str,"%2.2d:%2.2d",event[i]->time/60 - ,event[i]->time%60); - SETHELP(WHERE); -/* -Time to Execute Event: - -This is the time (in 24 hour HH:MM format) to execute the event. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0 - ,"Time to Execute Event (HH:MM)" - ,str,5,K_UPPER|K_EDIT)>0) { - event[i]->time=atoi(str)*60; - if((p=strchr(str,':'))!=NULL) - event[i]->time+=atoi(p+1); } - break; - case 6: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Exclusive Event Execution: - -If this event must be run exclusively (all nodes inactive), set this -option to Yes. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Exclusive Execution" - ,opt); - if(!k && !(event[i]->misc&EVENT_EXCL)) { - event[i]->misc|=EVENT_EXCL; - changes=1; } - else if(k==1 && event[i]->misc&EVENT_EXCL) { - event[i]->misc&=~EVENT_EXCL; - changes=1; } - break; - case 7: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Force Users Off-line for Event: - -If you want to have your users' on-line time reduced so the event can -execute precisely on time, set this option to Yes. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Force Users Off-line for Event",opt); - if(!k && !(event[i]->misc&EVENT_FORCE)) { - event[i]->misc|=EVENT_FORCE; - changes=1; } - else if(k==1 && event[i]->misc&EVENT_FORCE) { - event[i]->misc&=~EVENT_FORCE; - changes=1; } - break; - - } } } -} - - -void xtrn_cfg(uint section) -{ - static int ext_dflt,ext_bar,opt_dflt,time_dflt; - char str[128],code[9],done=0,*p; - int j,k; - uint i,n,xtrnnum[MAX_OPTS+1]; - static xtrn_t savxtrn; - -while(1) { - for(i=0,j=0;i<total_xtrns && j<MAX_OPTS;i++) - if(xtrn[i]->sec==section) { - sprintf(opt[j],"%-25s",xtrn[i]->name); - xtrnnum[j++]=i; } - xtrnnum[j]=total_xtrns; - opt[j][0]=0; - savnum=2; - i=WIN_ACT|WIN_CHE|WIN_SAV|WIN_RHT; - if(j) - i|=WIN_DEL|WIN_GET; - if(total_xtrns<MAX_OPTS) - i|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savxtrn.name[0]) - i|=WIN_PUT; - SETHELP(WHERE); -/* -Online External Programs: - -This is a list of the configured online external programs (doors). - -To add a program, select the desired location with the arrow keys and -hit INS . - -To delete a program, select it with the arrow keys and hit DEL . - -To configure a program, select it with the arrow keys and hit ENTER . -*/ - sprintf(str,"%s Online Programs",xtrnsec[section]->name); - i=ulist(i,0,0,45,&ext_dflt,&ext_bar,str,opt); - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Online Program Name: - -This is the name or description of the online program (door). -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Online Program Name",str,25 - ,0)<1) - continue; - sprintf(code,"%.8s",str); - p=strchr(code,SP); - if(p) *p=0; - strupr(code); - SETHELP(WHERE); -/* -Online Program Internal Code: - -Every online program must have its own unique code for Synchronet to -refer to it internally. This code is usually an abreviation of the -online program name. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Internal Code" - ,code,8,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; - continue; } - if((xtrn=(xtrn_t **)REALLOC(xtrn,sizeof(xtrn_t *)*(total_xtrns+1))) - ==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_xtrns+1); - total_xtrns=0; - bail(1); - continue; } - if(j) - for(n=total_xtrns;n>xtrnnum[i];n--) - xtrn[n]=xtrn[n-1]; - if((xtrn[xtrnnum[i]]=(xtrn_t *)MALLOC(sizeof(xtrn_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(xtrn_t)); - continue; } - memset((xtrn_t *)xtrn[xtrnnum[i]],0,sizeof(xtrn_t)); - strcpy(xtrn[xtrnnum[i]]->name,str); - strcpy(xtrn[xtrnnum[i]]->code,code); - xtrn[xtrnnum[i]]->sec=section; - total_xtrns++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(xtrn[xtrnnum[i]]); - total_xtrns--; - for(j=xtrnnum[i];j<total_xtrns;j++) - xtrn[j]=xtrn[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savxtrn=*xtrn[xtrnnum[i]]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *xtrn[xtrnnum[i]]=savxtrn; - xtrn[xtrnnum[i]]->sec=section; - changes=1; - continue; } - done=0; - i=xtrnnum[i]; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%s","Name",xtrn[i]->name); - sprintf(opt[k++],"%-27.27s%s","Internal Code",xtrn[i]->code); - sprintf(opt[k++],"%-27.27s%.40s","Start-up Directory",xtrn[i]->path); - sprintf(opt[k++],"%-27.27s%.40s","Command Line",xtrn[i]->cmd); - sprintf(opt[k++],"%-27.27s%.40s","Clean-up Command Line",xtrn[i]->clean); - if(xtrn[i]->cost) - sprintf(str,"%lu credits",xtrn[i]->cost); - else - strcpy(str,"None"); - sprintf(opt[k++],"%-27.27s%s","Execution Cost",str); - sprintf(opt[k++],"%-27.27s%.40s","Access Requirements",xtrn[i]->ar); - sprintf(opt[k++],"%-27.27s%.40s","Execution Requirements" - ,xtrn[i]->run_ar); - sprintf(opt[k++],"%-27.27s%s","Multiple Concurrent Users" - ,xtrn[i]->misc&MULTIUSER ? "Yes" : "No"); - sprintf(opt[k++],"%-27.27s%s%s","Intercept I/O Interrupts" - ,xtrn[i]->misc&IO_INTS ? "Yes" : "No" - ,xtrn[i]->misc&WWIVCOLOR ? ", WWIV" : nulstr); - sprintf(opt[k++],"%-27.27s%s","Swap BBS out of Memory" - ,xtrn[i]->misc&SWAP ? "Yes" : "No"); - sprintf(opt[k++],"%-27.27s%s","Modify User Data" - ,xtrn[i]->misc&MODUSERDAT ? "Yes" : "No"); - switch(xtrn[i]->event) { - case EVENT_LOGON: - strcpy(str,"Logon"); - break; - case EVENT_LOGOFF: - strcpy(str,"Logoff"); - break; - case EVENT_NEWUSER: - strcpy(str,"New User"); - break; - case EVENT_BIRTHDAY: - strcpy(str,"Birthday"); - break; - default: - strcpy(str,"No"); - break; } - if(xtrn[i]->misc&EVENTONLY && xtrn[i]->event) - strcat(str,", Only"); - sprintf(opt[k++],"%-27.27s%s","Execute on Event",str); - switch(xtrn[i]->type) { - case XTRN_SBBS: - sprintf(str,"%-15s %s","Synchronet","XTRN.DAT"); - break; - case XTRN_WWIV: - sprintf(str,"%-15s %s","WWIV","CHAIN.TXT"); - break; - case XTRN_GAP: - sprintf(str,"%-15s %s","GAP","DOOR.SYS"); - break; - case XTRN_RBBS: - sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF"); - break; - case XTRN_RBBS1: - sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF"); - break; - case XTRN_WILDCAT: - sprintf(str,"%-15s %s","Wildcat","CALLINFO.BBS"); - break; - case XTRN_PCBOARD: - sprintf(str,"%-15s %s","PCBoard","PCBOARD.SYS"); - break; - case XTRN_SPITFIRE: - sprintf(str,"%-15s %s","SpitFire","SFDOORS.DAT"); - break; - case XTRN_UTI: - sprintf(str,"%-15s %s","MegaMail","UTIDOOR.TXT"); - break; - case XTRN_SR: - sprintf(str,"%-15s %s","Solar Realms","DOORFILE.SR"); - break; - case XTRN_TRIBBS: - sprintf(str,"%-15s %s","TriBBS","TRIBBS.SYS"); - break; - default: - strcpy(str,"None"); - break; } - sprintf(opt[k++],"%-23.23s%-4s%s","BBS Drop File Type" - ,xtrn[i]->misc&REALNAME ? "(R)":nulstr,str); - sprintf(opt[k++],"%-27.27s%s","Place Drop File In" - ,xtrn[i]->misc&STARTUPDIR ? "Start-Up Directory":"Node Directory"); - sprintf(opt[k++],"Time Options..."); - opt[k][0]=0; - savnum=3; - SETHELP(WHERE); -/* -Online Program Configuration: - -This menu is for configuring the selected online program. -*/ - switch(ulist(WIN_SAV|WIN_ACT|WIN_MID,0,0,60,&opt_dflt,0,xtrn[i]->name - ,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Online Program Name: - -This is the name or description of the online program (door). -*/ - strcpy(str,xtrn[i]->name); - if(!uinput(WIN_MID|WIN_SAV,0,10,"Online Program Name" - ,xtrn[i]->name,25,K_EDIT)) - strcpy(xtrn[i]->name,str); - break; - case 1: - SETHELP(WHERE); -/* -Online Program Internal Code: - -Every online program must have its own unique code for Synchronet to -refer to it internally. This code is usually an abreviation of the -online program name. -*/ - strcpy(str,xtrn[i]->code); - uinput(WIN_MID|WIN_SAV,0,10,"Internal Code" - ,str,8,K_UPPER|K_EDIT); - if(code_ok(str)) - strcpy(xtrn[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; - case 2: - SETHELP(WHERE); -/* -Online Program Start-up Directory: - -This is the DOS drive/directory where the online program is located. -If a path is specified here, it will be made the current directory -before the program's command line is executed. This eliminates the need -for batch files that just change the current drive and directory before -executing the program. - -If this option is not used, the current NODE's directory will be the -current DOS drive/directory before the command line is executed. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Directory" - ,xtrn[i]->path,50,K_EDIT|K_UPPER); - break; - case 3: - SETHELP(WHERE); -/* -Online Program Command Line: - -This is the command line to execute to run the online program. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Command" - ,xtrn[i]->cmd,50,K_EDIT); - break; - case 4: - SETHELP(WHERE); -/* -Online Program Clean-up Command: - -This is the command line to execute after the main command line. This -option is usually only used for multiuser online programs. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Clean-up" - ,xtrn[i]->clean,50,K_EDIT); - break; - case 5: - ultoa(xtrn[i]->cost,str,10); - SETHELP(WHERE); -/* -Online Program Cost to Run: - -If you want users to be charged credits to run this online program, -set this value to the number of credits to charge. If you want this -online program to be free, set this value to 0. -*/ - uinput(WIN_MID|WIN_SAV,0,0,"Cost to Run (in Credits)" - ,str,10,K_EDIT|K_NUMBER); - xtrn[i]->cost=atol(str); - break; - case 6: - savnum=4; - sprintf(str,"%s Access",xtrn[i]->name); - getar(str,xtrn[i]->ar); - break; - case 7: - savnum=4; - sprintf(str,"%s Execution",xtrn[i]->name); - getar(str,xtrn[i]->run_ar); - break; - case 8: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Supports Multiple Users: - -If this online program supports multiple simultaneous users (nodes), -set this option to Yes. -*/ - savnum=4; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Supports Multiple Users" - ,opt); - if(!k && !(xtrn[i]->misc&MULTIUSER)) { - xtrn[i]->misc|=MULTIUSER; - changes=1; } - else if(k==1 && xtrn[i]->misc&MULTIUSER) { - xtrn[i]->misc&=~MULTIUSER; - changes=1; } - break; - case 9: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Intercept I/O Interrupts: - -If this online program has its own serial communication abilities, set -this option to No. -*/ - savnum=4; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O Interrupts" - ,opt); - if(!k && !(xtrn[i]->misc&IO_INTS)) { - xtrn[i]->misc|=IO_INTS; - changes=1; } - else if(k==1 && xtrn[i]->misc&IO_INTS) { - xtrn[i]->misc&=~(IO_INTS|WWIVCOLOR); - changes=1; } - if(!(xtrn[i]->misc&IO_INTS)) - break; - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Program Uses WWIV Color Codes: - -If this program was written for use exclusively under WWIV, set this -option to Yes. -*/ - savnum=4; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Program Uses WWIV Color Codes" - ,opt); - if(!k && !(xtrn[i]->misc&WWIVCOLOR)) { - xtrn[i]->misc|=WWIVCOLOR; - changes=1; } - else if(k==1 && xtrn[i]->misc&WWIVCOLOR) { - xtrn[i]->misc&=~WWIVCOLOR; - changes=1; } - break; - case 10: - k=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Swap BBS out of Memory to Run Executable: - -If this online programs requires a large amount of free memory, -set this option to Yes to have the BBS swapped out of memory. -*/ - savnum=4; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Swap BBS out of Memory",opt); - if(!k && !(xtrn[i]->misc&SWAP)) { - xtrn[i]->misc|=SWAP; - changes=1; } - else if(k==1 && xtrn[i]->misc&SWAP) { - xtrn[i]->misc&=~SWAP; - changes=1; } - break; - case 11: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Program Can Modify User Data: - -If this online programs recognizes the Synchronet MODUSER.DAT format -or the RBBS/QuickBBS EXITINFO.BBS format and you want it to be able to -modify the data of users who run the program, set this option to Yes. -*/ - savnum=4; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Program Can Modify User Data",opt); - if(!k && !(xtrn[i]->misc&MODUSERDAT)) { - xtrn[i]->misc|=MODUSERDAT; - changes=1; } - else if(k==1 && xtrn[i]->misc&MODUSERDAT) { - xtrn[i]->misc&=~MODUSERDAT; - changes=1; } - break; - case 12: - k=0; - strcpy(opt[k++],"No"); - strcpy(opt[k++],"Logon"); - strcpy(opt[k++],"Logoff"); - strcpy(opt[k++],"New User"); - strcpy(opt[k++],"Birthday"); - opt[k][0]=0; - switch(xtrn[i]->event) { - default: - k=0; - break; - case EVENT_LOGON: - k=1; - break; - case EVENT_LOGOFF: - k=2; - break; - case EVENT_NEWUSER: - k=3; - break; - case EVENT_BIRTHDAY: - k=4; - break; } - SETHELP(WHERE); -/* -Execute Online Program on Event: - -If you would like this online program to automatically execute on a -specific user event, select the event. Otherwise, select No. -*/ - savnum=4; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Execute on Event",opt); - if(k==-1) - break; - if(xtrn[i]->event!=k) { - xtrn[i]->event=k; - changes=1; } - if(!xtrn[i]->event) - break; - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Execute Online Program as Event Only: - -If you would like this online program to execute as an event only -(not available to users on the online program menu), set this option -to Yes. -*/ - savnum=4; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k - ,0,"Execute as Event Only" - ,opt); - if(!k && !(xtrn[i]->misc&EVENTONLY)) { - xtrn[i]->misc|=EVENTONLY; - changes=1; } - else if(k==1 && xtrn[i]->misc&EVENTONLY) { - xtrn[i]->misc&=~EVENTONLY; - changes=1; } - break; - case 13: - k=0; - strcpy(opt[k++],"None"); - sprintf(opt[k++],"%-15s %s","Synchronet","XTRN.DAT"); - sprintf(opt[k++],"%-15s %s","WWIV","CHAIN.TXT"); - sprintf(opt[k++],"%-15s %s","GAP","DOOR.SYS"); - sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF"); - sprintf(opt[k++],"%-15s %s","Wildcat","CALLINFO.BBS"); - sprintf(opt[k++],"%-15s %s","PCBoard","PCBOARD.SYS"); - sprintf(opt[k++],"%-15s %s","SpitFire","SFDOORS.DAT"); - sprintf(opt[k++],"%-15s %s","MegaMail","UTIDOOR.TXT"); - sprintf(opt[k++],"%-15s %s","Solar Realms","DOORFILE.SR"); - sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF"); - sprintf(opt[k++],"%-15s %s","TriBBS","TRIBBS.SYS"); - opt[k][0]=0; - k=xtrn[i]->type; - SETHELP(WHERE); -/* -Online Program BBS Drop File Type: - -If this online program requires a specific BBS data (drop) file -format, select the file format from the list. -*/ - savnum=4; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"BBS Drop File Type",opt); - if(k==-1) - break; - if(xtrn[i]->type!=k) { - xtrn[i]->type=k; - changes=1; } - if(xtrn[i]->type && uq&UQ_ALIASES) { - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - k=1; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Use Real Names",opt); - if(k==0 && !(xtrn[i]->misc&REALNAME)) { - xtrn[i]->misc|=REALNAME; - changes=1; } - else if(k==1 && xtrn[i]->misc&REALNAME) { - xtrn[i]->misc&=~REALNAME; - changes=1; } } - break; - case 14: - k=0; - strcpy(opt[0],"Node Directory"); - strcpy(opt[1],"Start-up Directory"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Directory for Drop File: - -You can have the data file created in the current Node Directory or the -Start-up Directory (if one is specified). -*/ - savnum=4; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Create Drop File In" - ,opt); - if(!k && xtrn[i]->misc&STARTUPDIR) { - xtrn[i]->misc&=~STARTUPDIR; - changes=1; } - else if(k==1 && !(xtrn[i]->misc&STARTUPDIR)) { - xtrn[i]->misc|=STARTUPDIR; - changes=1; } - break; - case 15: - while(1) { - k=0; - if(xtrn[i]->textra) - sprintf(str,"%u minutes",xtrn[i]->textra); - else - strcpy(str,"None"); - sprintf(opt[k++],"%-25.25s%s","Extra Time",str); - if(xtrn[i]->maxtime) - sprintf(str,"%u minutes",xtrn[i]->maxtime); - else - strcpy(str,"None"); - sprintf(opt[k++],"%-25.25s%s","Maximum Time",str); - sprintf(opt[k++],"%-25.25s%s","Suspended (Free) Time" - ,xtrn[i]->misc&FREETIME ? "Yes" : "No"); - opt[k][0]=0; - SETHELP(WHERE); -/* -Online Program Time Options: - -This sub-menu allows you to define specific preferences regarding the -time users spend running this program. -*/ - savnum=4; - k=ulist(WIN_SAV|WIN_ACT|WIN_RHT|WIN_BOT,0,0,40 - ,&time_dflt,0 - ,"Online Program Time Options",opt); - if(k==-1) - break; - savnum=5; - switch(k) { - case 0: - itoa(xtrn[i]->textra,str,10); - SETHELP(WHERE); -/* -Extra Time to Give User in Program: - -If you want to give users extra time while in this online program, -set this value to the number of minutes to add to their current time -left online. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Extra Time to Give User (in minutes)" - ,str,2,K_EDIT|K_NUMBER); - xtrn[i]->textra=atoi(str); - break; - case 1: - itoa(xtrn[i]->maxtime,str,10); - SETHELP(WHERE); -/* -Maximum Time Allowed in Program: - -If this program supports a drop file that contains the number of minutes -left online for the current user, this option allows the sysop to set -the maximum number of minutes that will be allowed in the drop file. - -Setting this option to 0, disables this feature. -*/ - uinput(WIN_MID|WIN_SAV,0,0 - ,"Maximum Time (in minutes, 0=disabled)" - ,str,2,K_EDIT|K_NUMBER); - xtrn[i]->maxtime=atoi(str); - break; - case 2: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - SETHELP(WHERE); -/* -Suspended (Free) Time: - -If you want the user's time online to be suspended while running this -online program (e.g. Free Time), set this option to Yes. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Suspended (Free) Time",opt); - if(!k && !(xtrn[i]->misc&FREETIME)) { - xtrn[i]->misc|=FREETIME; - changes=1; } - else if(k==1 && xtrn[i]->misc&FREETIME) { - xtrn[i]->misc&=~FREETIME; - changes=1; } - break; } } - break; - - } } } -} - -void xedit_cfg() -{ - static int dflt,dfltopt,bar; - char str[81],code[81],done=0,*p; - int j,k; - uint i; - static xedit_t savxedit; - -while(1) { - for(i=0;i<total_xedits && i<MAX_OPTS;i++) - sprintf(opt[i],"%-8.8s %.40s",xedit[i]->code,xedit[i]->lcmd); - opt[i][0]=0; - j=WIN_SAV|WIN_ACT|WIN_CHE|WIN_RHT; - savnum=0; - if(total_xedits) - j|=WIN_DEL|WIN_GET; - if(total_xedits<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savxedit.name[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -External Editors: - -This is a list of the configured external editors. - -To add an editor, select the desired location and hit INS . - -To delete an editor, select it and hit DEL . - -To configure an editor, select it and hit ENTER . -*/ - i=ulist(j,0,0,45,&dflt,&bar,"External Editors",opt); - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -External Editor Name: - -This is the name or description of the external editor. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"External Editor Name",str,40 - ,0)<1) - continue; - sprintf(code,"%.8s",str); - p=strchr(code,SP); - if(p) *p=0; - strupr(code); - SETHELP(WHERE); -/* -External Editor Internal Code: - -This is the internal code for the external editor. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"External Editor Internal Code",code,8 - ,K_UPPER|K_EDIT)<1) - continue; - if(!code_ok(code)) { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; - continue; } - - if((xedit=(xedit_t **)REALLOC(xedit - ,sizeof(xedit_t *)*(total_xedits+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_xedits+1); - total_xedits=0; - bail(1); - continue; } - if(total_xedits) - for(j=total_xedits;j>i;j--) - xedit[j]=xedit[j-1]; - if((xedit[i]=(xedit_t *)MALLOC(sizeof(xedit_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(xedit_t)); - continue; } - memset((xedit_t *)xedit[i],0,sizeof(xedit_t)); - strcpy(xedit[i]->name,str); - strcpy(xedit[i]->code,code); - total_xedits++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(xedit[i]); - total_xedits--; - for(j=i;j<total_xedits;j++) - xedit[j]=xedit[j+1]; - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savxedit=*xedit[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *xedit[i]=savxedit; - changes=1; - continue; } - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-32.32s%s","Name",xedit[i]->name); - sprintf(opt[k++],"%-32.32s%s","Internal Code",xedit[i]->code); - sprintf(opt[k++],"%-32.32s%.40s","Local Command Line",xedit[i]->lcmd); - sprintf(opt[k++],"%-32.32s%.40s","Remote Command Line",xedit[i]->rcmd); - sprintf(opt[k++],"%-32.32s%.40s","Access Requirements",xedit[i]->ar); - sprintf(opt[k++],"%-32.32s%s%s","Intercept I/O Interrupts" - ,xedit[i]->misc&IO_INTS ? "Yes":"No" - ,xedit[i]->misc&WWIVCOLOR ? ", WWIV" : nulstr); - sprintf(opt[k++],"%-32.32s%s","Quoted Text" - ,xedit[i]->misc"EALL ? "All":xedit[i]->misc"ENONE - ? "None" : "Prompt User"); - sprintf(opt[k++],"%-32.32s%s","QuickBBS Style (MSGTMP)" - ,xedit[i]->misc&QUICKBBS ? "Yes":"No"); - sprintf(opt[k++],"%-32.32s%s","Expand Line Feeds to CRLF" - ,xedit[i]->misc&EXPANDLF ? "Yes":"No"); - switch(xedit[i]->type) { - case XTRN_SBBS: - sprintf(str,"%-15s %s","Synchronet","XTRN.DAT"); - break; - case XTRN_WWIV: - sprintf(str,"%-15s %s","WWIV","CHAIN.TXT"); - break; - case XTRN_GAP: - sprintf(str,"%-15s %s","GAP","DOOR.SYS"); - break; - case XTRN_RBBS: - sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF"); - break; - case XTRN_RBBS1: - sprintf(str,"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF"); - break; - case XTRN_WILDCAT: - sprintf(str,"%-15s %s","Wildcat","CALLINFO.BBS"); - break; - case XTRN_PCBOARD: - sprintf(str,"%-15s %s","PCBoard","PCBOARD.SYS"); - break; - case XTRN_SPITFIRE: - sprintf(str,"%-15s %s","SpitFire","SFDOORS.DAT"); - break; - case XTRN_UTI: - sprintf(str,"%-15s %s","MegaMail","UTIDOOR.TXT"); - break; - case XTRN_SR: - sprintf(str,"%-15s %s","Solar Realms","DOORFILE.SR"); - break; - case XTRN_TRIBBS: - sprintf(str,"%-15s %s","TriBBS","TRIBBS.SYS"); - break; - default: - strcpy(str,"None"); - break; } - sprintf(opt[k++],"%-32.32s%s","BBS Drop File Type",str); - opt[k][0]=0; - SETHELP(WHERE); -/* -External Editor Configuration: - -This menu allows you to change the settings for the selected external -message editor. External message editors are very common on BBSs. Some -popular editors include SyncEdit, WWIVedit, FEdit, GEdit, IceEdit, -and many others. -*/ - - savnum=1; - sprintf(str,"%s Editor",xedit[i]->name); - switch(ulist(WIN_SAV|WIN_ACT|WIN_L2R|WIN_BOT,0,0,70,&dfltopt,0 - ,str,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -External Editor Name: - -This is the name or description of the external editor. -*/ - strcpy(str,xedit[i]->name); - if(!uinput(WIN_MID|WIN_SAV,0,10,"External Editor Name" - ,xedit[i]->name,40,K_EDIT)) - strcpy(xedit[i]->name,str); - break; - case 1: - strcpy(str,xedit[i]->code); - SETHELP(WHERE); -/* -External Editor Internal Code: - -Every external editor must have its own unique internal code for -Synchronet to reference it by. It is helpful if this code is an -abreviation of the name. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)" - ,str,8,K_EDIT|K_UPPER); - if(code_ok(str)) - strcpy(xedit[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; - case 2: - SETHELP(WHERE); -/* -External Editor Local Command Line: - -This is the command line to execute when using this editor locally. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Local" - ,xedit[i]->lcmd,50,K_EDIT); - break; - - case 3: - SETHELP(WHERE); -/* -External Editor Remote Command Line: - -This is the command line to execute when using this editor remotely. -*/ - uinput(WIN_MID|WIN_SAV,0,10,"Remote" - ,xedit[i]->rcmd,50,K_EDIT); - break; - case 4: - savnum=2; - sprintf(str,"%s External Editor",xedit[i]->name); - getar(str,xedit[i]->ar); - break; - case 5: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Intercept I/O Interrupts: - -If this external editor has its own serial communication abilities or -requires a FOSSIL driver, set this option to No. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Intercept I/O Interrupts" - ,opt); - if(!k && !(xedit[i]->misc&IO_INTS)) { - xedit[i]->misc|=IO_INTS; - changes=1; } - else if(k==1 && xedit[i]->misc&IO_INTS) { - xedit[i]->misc&=~(IO_INTS|WWIVCOLOR); - changes=1; } - if(!(xedit[i]->misc&IO_INTS)) - break; - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Editor Uses WWIV Color Codes: - -If this editor was written for use exclusively under WWIV, set this -option to Yes. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"Editor Uses WWIV Color Codes",opt); - if(!k && !(xedit[i]->misc&WWIVCOLOR)) { - xedit[i]->misc|=WWIVCOLOR; - changes=1; } - else if(k==1 && xedit[i]->misc&WWIVCOLOR) { - xedit[i]->misc&=~WWIVCOLOR; - changes=1; } - break; - case 6: - k=3; - strcpy(opt[0],"All"); - strcpy(opt[1],"None"); - strcpy(opt[2],"Prompt User"); - opt[3][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Quoted Text: - -If you want all the message text to be automatically entered into the -message edit/quote file (INPUT.MSG or MSGTMP), select All. - -If you want the user to be prompted for which lines to quote before -running the editor, select Prompt User. - -If you want none of the lines to be automatically quoted, select None. -This option is mainly for use with editors that support the QUOTES.TXT -drop file (like SyncEdit v2.x). -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Quoted Text" - ,opt); - if(!k && !(xedit[i]->misc"EALL)) { - xedit[i]->misc|=QUOTEALL; - xedit[i]->misc&=~QUOTENONE; - changes=1; } - else if(k==1 && !(xedit[i]->misc"ENONE)) { - xedit[i]->misc|=QUOTENONE; - xedit[i]->misc&=~QUOTEALL; - changes=1; } - else if(k==2 && xedit[i]->misc&(QUOTENONE|QUOTEALL)) { - xedit[i]->misc&=~(QUOTENONE|QUOTEALL); - changes=1; } - break; - case 7: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -QuickBBS Style (MSGTMP): - -If this external editor uses the QuickBBS style MSGTMP interface, set -this option to Yes. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"QuickBBS Style (MSGTMP)" - ,opt); - if(!k && !(xedit[i]->misc&QUICKBBS)) { - xedit[i]->misc|=QUICKBBS; - changes=1; } - else if(k==1 && xedit[i]->misc&QUICKBBS) { - xedit[i]->misc&=~QUICKBBS; - changes=1; } - break; - case 8: - k=1; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - savnum=2; - SETHELP(WHERE); -/* -Expand Line Feeds to Carriage Return/Line Feed Pairs: - -If this external editor saves new lines as a single line feed character -instead of a carriage return/line feed pair, set this option to Yes. -*/ - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0,"Expand LF to CRLF" - ,opt); - if(!k && !(xedit[i]->misc&EXPANDLF)) { - xedit[i]->misc|=EXPANDLF; - changes=1; } - else if(k==1 && xedit[i]->misc&EXPANDLF) { - xedit[i]->misc&=~EXPANDLF; - changes=1; } - break; - case 9: - k=0; - strcpy(opt[k++],"None"); - sprintf(opt[k++],"%-15s %s","Synchronet","XTRN.DAT"); - sprintf(opt[k++],"%-15s %s","WWIV","CHAIN.TXT"); - sprintf(opt[k++],"%-15s %s","GAP","DOOR.SYS"); - sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO#.DEF"); - sprintf(opt[k++],"%-15s %s","Wildcat","CALLINFO.BBS"); - sprintf(opt[k++],"%-15s %s","PCBoard","PCBOARD.SYS"); - sprintf(opt[k++],"%-15s %s","SpitFire","SFDOORS.DAT"); - sprintf(opt[k++],"%-15s %s","MegaMail","UTIDOOR.TXT"); - sprintf(opt[k++],"%-15s %s","Solar Realms","DOORFILE.SR"); - sprintf(opt[k++],"%-15s %s","RBBS/QuickBBS","DORINFO1.DEF"); - sprintf(opt[k++],"%-15s %s","TriBBS","TRIBBS.SYS"); - opt[k][0]=0; - k=xedit[i]->type; - SETHELP(WHERE); -/* -External Program BBS Drop File Type: - -If this external editor requires a specific BBS data (drop) file -format, select the file format from the list. -*/ - savnum=2; - k=ulist(WIN_MID|WIN_SAV,0,0,0,&k,0 - ,"BBS Drop File Type",opt); - if(k==-1) - break; - if(xedit[i]->type!=k) { - xedit[i]->type=k; - changes=1; } - break; - - } } } -} - - -void swap_cfg() -{ - static int dflt,bar; - char str[81]; - int j,k; - uint i; - -while(1) { - for(i=0;i<MAX_OPTS && i<total_swaps;i++) - sprintf(opt[i],"%-25s",swap[i]->cmd); - opt[i][0]=0; - j=WIN_ACT|WIN_CHE|WIN_L2R|WIN_SAV; - savnum=0; - if(total_swaps) - j|=WIN_DEL; - if(total_swaps<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - SETHELP(WHERE); -/* -External Program Global Swap List: - -This is a list of the external program (executable file) names to swap -the BBS out of memory for. They are termed Global because if you add -a program name to this list, the BBS will swap to run it regardless of -when, where, or why the program is run from the BBS. - -Use INS and DELETE to add and remove swappable programs. - -To change the filename of a program, hit ENTER . - -To swap whenever PKZIP is run, add PKZIP to the list. - -To swap for all DOS Shells, add COMMAND.COM to the list. -*/ - i=ulist(j,0,0,17,&dflt,&bar,"Global Swap List",opt); - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Swappable Program Name: - -This is the executable filename of the external program. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Program Name",str,12 - ,K_UPPER)<1) - continue; - if((swap=(swap_t **)REALLOC(swap - ,sizeof(swap_t *)*(total_swaps+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_swaps+1); - total_swaps=0; - bail(1); - continue; } - if(total_swaps) - for(j=total_swaps;j>i;j--) - swap[j]=swap[j-1]; - if((swap[i]=(swap_t *)MALLOC(sizeof(swap_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(swap_t)); - continue; } - memset((swap_t *)swap[i],0,sizeof(swap_t)); - strcpy(swap[i]->cmd,str); - total_swaps++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(swap[i]); - total_swaps--; - for(j=i;j<total_swaps;j++) - swap[j]=swap[j+1]; - changes=1; - continue; } - SETHELP(WHERE); -/* -Swappable Program Name: - -This is the executable filename of the external program. -*/ - strcpy(str,swap[i]->cmd); - if(uinput(WIN_MID|WIN_SAV,0,5,"Program Name",str,12 - ,K_UPPER|K_EDIT)>0) - strcpy(swap[i]->cmd,str); } -} - -int os2pgm_cfg() -{ - static int dflt,bar; - char str[81]; - int j,k; - uint i; - -while(1) { - for(i=0;i<MAX_OPTS && i<total_os2pgms;i++) - sprintf(opt[i],"%-12s %-12s",os2pgm[i]->name - ,os2pgm[i]->misc&OS2_POPEN ? "(port open)":nulstr); - opt[i][0]=0; - j=WIN_ACT|WIN_CHE|WIN_L2R|WIN_SAV; - savnum=0; - if(total_os2pgms) - j|=WIN_DEL; - if(total_os2pgms<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - SETHELP(WHERE); -/* -OS/2 Program List: - -This is a list of all native OS/2 external program (executable file) -names that you may execute under Synchronet for OS/2. This list is not -used in Synchronet for DOS. Any programs not listed here will be assumed -to be DOS programs and executed accordingly. - -Use INS and DELETE to add and remove OS/2 programs. - -To change the filename of a program, hit ENTER . -*/ - i=ulist(j,0,0,30,&dflt,&bar,"OS/2 Program List",opt); - if((signed)i==-1) - break; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -OS/2 Program Name: - -This is the executable filename of the OS/2 external program. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"OS/2 Program Name",str,12 - ,K_UPPER)<1) - continue; - if((os2pgm=(os2pgm_t **)REALLOC(os2pgm - ,sizeof(os2pgm_t *)*(total_os2pgms+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_os2pgms+1); - total_os2pgms=0; - bail(1); - continue; } - if(total_os2pgms) - for(j=total_os2pgms;j>i;j--) - os2pgm[j]=os2pgm[j-1]; - if((os2pgm[i]=(os2pgm_t *)MALLOC(sizeof(os2pgm_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(os2pgm_t)); - continue; } - memset((os2pgm_t *)os2pgm[i],0,sizeof(os2pgm_t)); - strcpy(os2pgm[i]->name,str); - - SETHELP(WHERE); -/* -Leave COM Port Open During Execution: - -If this program accesses the COM port via handle (currently open COM -port), set this option to Yes, otherwise set it to No. -*/ - strcpy(opt[0],"Yes (This Program Uses Port Handle)"); - strcpy(opt[1],"No (This Program Uses Port Number)"); - opt[2][0]=0; - j=1; - if(ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Leave COM Port Open During Execution?",opt)==0) - os2pgm[i]->misc|=OS2_POPEN; - total_os2pgms++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(os2pgm[i]); - total_os2pgms--; - for(j=i;j<total_os2pgms;j++) - os2pgm[j]=os2pgm[j+1]; - changes=1; - continue; } - SETHELP(WHERE); -/* -OS/2 Program Name: - -This is the executable filename of the OS/2 external program. -*/ - strcpy(str,os2pgm[i]->name); - if(uinput(WIN_MID|WIN_SAV,0,5,"OS/2 Program Name",str,12 - ,K_UPPER|K_EDIT)>0) - strcpy(os2pgm[i]->name,str); - - SETHELP(WHERE); -/* -Leave COM Port Open During Execution: - -If this program accesses the COM port via handle (currently open COM -port), set this option to Yes, otherwise set it to No. -*/ - strcpy(opt[0],"Yes (This Program Uses Port Handle)"); - strcpy(opt[1],"No (This Program Uses Port Number)"); - opt[2][0]=0; - j=1; - savnum=1; - j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0 - ,"Leave COM Port Open During Execution",opt); - if(j==0 && !(os2pgm[i]->misc&OS2_POPEN)) { - os2pgm[i]->misc|=OS2_POPEN; - changes=1; } - else if(j==1 && os2pgm[i]->misc&OS2_POPEN) { - os2pgm[i]->misc&=~OS2_POPEN; - changes=1; } - } -return(0); -} - - -void xtrnsec_cfg() -{ - static int xtrnsec_dflt,xtrnsec_opt; - char str[81],code[9],done=0,*p; - int j,k; - uint i; - static xtrnsec_t savxtrnsec; - -while(1) { - for(i=0;i<total_xtrnsecs && i<MAX_OPTS;i++) - sprintf(opt[i],"%-25s",xtrnsec[i]->name); - opt[i][0]=0; - j=WIN_SAV|WIN_ACT|WIN_CHE|WIN_BOT; - savnum=0; - if(total_xtrnsecs) - j|=WIN_DEL|WIN_GET; - if(total_xtrnsecs<MAX_OPTS) - j|=WIN_INS|WIN_INSACT|WIN_XTR; - if(savxtrnsec.name[0]) - j|=WIN_PUT; - SETHELP(WHERE); -/* -Online Program Sections: - -This is a list of Online Program Sections configured for your system. - -To add an online program section, select the desired location with the -arrow keys and hit INS . - -To delete an online program section, select it and hit DEL . - -To configure an online program section, select it and hit ENTER . -*/ - i=ulist(j,0,0,45,&xtrnsec_dflt,0,"Online Program Sections",opt); - if((signed)i==-1) - return; - if((i&MSK_ON)==MSK_INS) { - i&=MSK_OFF; - SETHELP(WHERE); -/* -Online Program Section Name: - -This is the name of this section. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Online Program Section Name",str,40 - ,0)<1) - continue; - sprintf(code,"%.8s",str); - p=strchr(code,SP); - if(p) *p=0; - strupr(code); - SETHELP(WHERE); -/* -Online Program Section Internal Code: - -Every online program section must have its own unique internal code -for Synchronet to reference it by. It is helpful if this code is an -abreviation of the name. -*/ - if(uinput(WIN_MID|WIN_SAV,0,0,"Online Program Section Internal Code" - ,code,8,K_EDIT|K_UPPER)<1) - continue; - if(!code_ok(code)) { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; - continue; } - if((xtrnsec=(xtrnsec_t **)REALLOC(xtrnsec - ,sizeof(xtrnsec_t *)*(total_xtrnsecs+1)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_xtrnsecs+1); - total_xtrnsecs=0; - bail(1); - continue; } - if(total_xtrnsecs) { - for(j=total_xtrnsecs;j>i;j--) - xtrnsec[j]=xtrnsec[j-1]; - for(j=0;j<total_xtrns;j++) - if(xtrn[j]->sec>=i) - xtrn[j]->sec++; } - - - if((xtrnsec[i]=(xtrnsec_t *)MALLOC(sizeof(xtrnsec_t)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,sizeof(xtrnsec_t)); - continue; } - memset((xtrnsec_t *)xtrnsec[i],0,sizeof(xtrnsec_t)); - strcpy(xtrnsec[i]->name,str); - strcpy(xtrnsec[i]->code,code); - total_xtrnsecs++; - changes=1; - continue; } - if((i&MSK_ON)==MSK_DEL) { - i&=MSK_OFF; - FREE(xtrnsec[i]); - for(j=0;j<total_xtrns;) { - if(xtrn[j]->sec==i) { /* delete xtrns of this group */ - FREE(xtrn[j]); - total_xtrns--; - k=j; - while(k<total_xtrns) { /* move all xtrns down */ - xtrn[k]=xtrn[k+1]; - k++; } } - else j++; } - for(j=0;j<total_xtrns;j++) /* move xtrn group numbers down */ - if(xtrn[j]->sec>i) - xtrn[j]->sec--; - total_xtrnsecs--; - while(i<total_xtrnsecs) { - xtrnsec[i]=xtrnsec[i+1]; - i++; } - changes=1; - continue; } - if((i&MSK_ON)==MSK_GET) { - i&=MSK_OFF; - savxtrnsec=*xtrnsec[i]; - continue; } - if((i&MSK_ON)==MSK_PUT) { - i&=MSK_OFF; - *xtrnsec[i]=savxtrnsec; - changes=1; - continue; } - done=0; - while(!done) { - k=0; - sprintf(opt[k++],"%-27.27s%s","Name",xtrnsec[i]->name); - sprintf(opt[k++],"%-27.27s%s","Internal Code",xtrnsec[i]->code); - sprintf(opt[k++],"%-27.27s%.40s","Access Requirements" - ,xtrnsec[i]->ar); - sprintf(opt[k++],"%s","Available Online Programs..."); - opt[k][0]=0; - savnum=1; - sprintf(str,"%s Program Section",xtrnsec[i]->name); - switch(ulist(WIN_SAV|WIN_ACT|WIN_MID,0,0,60,&xtrnsec_opt,0,str - ,opt)) { - case -1: - done=1; - break; - case 0: - SETHELP(WHERE); -/* -Online Program Section Name: - -This is the name of this section. -*/ - strcpy(str,xtrnsec[i]->name); /* save */ - if(!uinput(WIN_MID|WIN_SAV,0,10 - ,"Online Program Section Name" - ,xtrnsec[i]->name,40,K_EDIT)) - strcpy(xtrnsec[i]->name,str); - break; - case 1: - strcpy(str,xtrnsec[i]->code); - SETHELP(WHERE); -/* -Online Program Section Internal Code: - -Every online program section must have its own unique internal code -for Synchronet to reference it by. It is helpful if this code is an -abreviation of the name. -*/ - uinput(WIN_MID|WIN_SAV,0,17,"Internal Code (unique)" - ,str,8,K_EDIT|K_UPPER); - if(code_ok(str)) - strcpy(xtrnsec[i]->code,str); - else { - helpbuf=invalid_code; - umsg("Invalid Code"); - helpbuf=0; } - break; - case 2: - getar(xtrnsec[i]->name,xtrnsec[i]->ar); - break; - case 3: - xtrn_cfg(i); - break; } } } -} diff --git a/src/sbbs2/scfg/wrcnf1.c b/src/sbbs2/scfg/wrcnf1.c deleted file mode 100644 index e6d70020db..0000000000 --- a/src/sbbs2/scfg/wrcnf1.c +++ /dev/null @@ -1,577 +0,0 @@ -#line 2 "WRCNF1.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "scfg.h" - -extern int no_msghdr,all_msghdr; -extern int no_dirchk; - -char *crlf="\r\n"; -char nulbuf[256]={0}; -int pslen; - -#define put_int(var,stream) fwrite(&var,1,sizeof(var),stream) -#define put_str(var,stream) { pslen=strlen(var); \ - fwrite(var,1,pslen > sizeof(var) \ - ? sizeof(var) : pslen ,stream); \ - fwrite(nulbuf,1,pslen > sizeof(var) \ - ? 0 : sizeof(var)-pslen,stream); } - -void write_node_cfg() -{ - char str[128],cmd[64],c; - int i,file; - short n; - FILE *stream; - -memset(cmd,0,64); - -upop("Writing NODE.CNF..."); -sprintf(str,"%sNODE.CNF",node_path[node_num-1]); -backup(str); - -if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1 - || (stream=fdopen(file,"wb"))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } -setvbuf(stream,NULL,_IOFBF,2048); - -put_int(node_num,stream); -put_str(node_name,stream); -put_str(node_phone,stream); -put_str(node_comspec,stream); /* Was node_logon */ -put_int(node_misc,stream); -put_int(node_ivt,stream); -put_int(node_swap,stream); -if(node_swapdir[0]) { - backslash(node_swapdir); - md(node_swapdir); } /* make sure it's a valid directory */ -put_str(node_swapdir,stream); -put_int(node_valuser,stream); -put_int(node_minbps,stream); -put_str(node_ar,stream); -put_int(node_dollars_per_call,stream); -put_str(node_editor,stream); -put_str(node_viewer,stream); -put_str(node_daily,stream); -put_int(node_scrnlen,stream); -put_int(node_scrnblank,stream); -backslash(ctrl_dir); -put_str(ctrl_dir,stream); -backslash(text_dir); -put_str(text_dir,stream); -backslash(temp_dir); -put_str(temp_dir,stream); -for(i=0;i<10;i++) - put_str(wfc_cmd[i],stream); -for(i=0;i<12;i++) - put_str(wfc_scmd[i],stream); -put_str(mdm_hang,stream); -put_int(node_sem_check,stream); -put_int(node_stat_check,stream); -put_str(scfg_cmd,stream); -put_int(sec_warn,stream); -put_int(sec_hangup,stream); -n=0; -for(i=0;i<188;i++) /* unused init to NULL */ - fwrite(&n,1,2,stream); -n=0xffff; /* unused init to 0xff */ -for(i=0;i<256;i++) - fwrite(&n,1,2,stream); -put_int(com_port,stream); -put_int(com_irq,stream); -put_int(com_base,stream); -put_int(com_rate,stream); -put_int(mdm_misc,stream); -put_str(mdm_init,stream); -put_str(mdm_spec,stream); -put_str(mdm_term,stream); -put_str(mdm_dial,stream); -put_str(mdm_offh,stream); -put_str(mdm_answ,stream); -put_int(mdm_reinit,stream); -put_int(mdm_ansdelay,stream); -put_int(mdm_rings,stream); -put_int(mdm_results,stream); -for(i=0;i<mdm_results;i++) { - put_int(mdm_result[i].code,stream); - put_int(mdm_result[i].rate,stream); - put_int(mdm_result[i].cps,stream); - put_str(mdm_result[i].str,stream); } -fclose(stream); -} - -void free_node_cfg() -{ - -FREE(mdm_result); -} - -void write_main_cfg() -{ - char str[128],c=0; - int file; - short i,j,n; - FILE *stream; - -upop("Writing MAIN.CNF..."); -sprintf(str,"%sMAIN.CNF",ctrl_dir); -backup(str); - -if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1 - || (stream=fdopen(file,"wb"))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } -setvbuf(stream,NULL,_IOFBF,2048); - -put_str(sys_name,stream); -put_str(sys_id,stream); -put_str(sys_location,stream); -put_str(sys_phonefmt,stream); -put_str(sys_op,stream); -put_str(sys_guru,stream); -put_str(sys_pass,stream); -put_int(sys_nodes,stream); -for(i=0;i<sys_nodes;i++) { - backslash(node_path[i]); - fwrite(node_path[i],LEN_DIR+1,1,stream); } -backslash(data_dir); -put_str(data_dir,stream); - -/************************************************************/ -/* Create data and sub-dirs off data if not already created */ -/************************************************************/ -strcpy(str,data_dir); -md(str); -sprintf(str,"%sSUBS",data_dir); -md(str); -sprintf(str,"%sDIRS",data_dir); -md(str); -sprintf(str,"%sTEXT",data_dir); -md(str); -sprintf(str,"%sMSGS",data_dir); -md(str); -sprintf(str,"%sUSER",data_dir); -md(str); -sprintf(str,"%sUSER\\PTRS",data_dir); -md(str); -sprintf(str,"%sLOGS",data_dir); -md(str); -sprintf(str,"%sQNET",data_dir); -md(str); -sprintf(str,"%sFILE",data_dir); -md(str); - -backslash(exec_dir); -put_str(exec_dir,stream); -put_str(sys_logon,stream); -put_str(sys_logout,stream); -put_str(sys_daily,stream); -put_int(sys_timezone,stream); -put_int(sys_misc,stream); -put_int(sys_lastnode,stream); -put_int(sys_autonode,stream); -put_int(uq,stream); -put_int(sys_pwdays,stream); -put_int(sys_deldays,stream); -put_int(sys_exp_warn,stream); -put_int(sys_autodel,stream); -put_int(sys_def_stat,stream); -put_str(sys_chat_ar,stream); -put_int(cdt_min_value,stream); -put_int(max_minutes,stream); -put_int(cdt_per_dollar,stream); -put_str(new_pass,stream); -put_str(new_magic,stream); -put_str(new_sif,stream); -put_str(new_sof,stream); - -put_int(new_level,stream); -put_int(new_flags1,stream); -put_int(new_flags2,stream); -put_int(new_flags3,stream); -put_int(new_flags4,stream); -put_int(new_exempt,stream); -put_int(new_rest,stream); -put_int(new_cdt,stream); -put_int(new_min,stream); -put_str(new_xedit,stream); -put_int(new_expire,stream); -if(new_shell>total_shells) - new_shell=0; -put_int(new_shell,stream); -put_int(new_misc,stream); -put_int(new_prot,stream); -c=0; -put_int(c,stream); -n=0; -for(i=0;i<7;i++) - put_int(n,stream); - -put_int(expired_level,stream); -put_int(expired_flags1,stream); -put_int(expired_flags2,stream); -put_int(expired_flags3,stream); -put_int(expired_flags4,stream); -put_int(expired_exempt,stream); -put_int(expired_rest,stream); - -put_str(logon_mod,stream); -put_str(logoff_mod,stream); -put_str(newuser_mod,stream); -put_str(login_mod,stream); -put_str(logout_mod,stream); -put_str(sync_mod,stream); -put_str(expire_mod,stream); -put_int(c,stream); -n=0; -for(i=0;i<224;i++) - put_int(n,stream); -n=0xffff; -for(i=0;i<256;i++) - put_int(n,stream); - -n=0; -for(i=0;i<10;i++) { - put_int(val_level[i],stream); - put_int(val_expire[i],stream); - put_int(val_flags1[i],stream); - put_int(val_flags2[i],stream); - put_int(val_flags3[i],stream); - put_int(val_flags4[i],stream); - put_int(val_cdt[i],stream); - put_int(val_exempt[i],stream); - put_int(val_rest[i],stream); - for(j=0;j<8;j++) - put_int(n,stream); } - -c=0; -for(i=0;i<100 && !feof(stream);i++) { - put_int(level_timeperday[i],stream); - put_int(level_timepercall[i],stream); - put_int(level_callsperday[i],stream); - put_int(level_freecdtperday[i],stream); - put_int(level_linespermsg[i],stream); - put_int(level_postsperday[i],stream); - put_int(level_emailperday[i],stream); - put_int(level_misc[i],stream); - put_int(level_expireto[i],stream); - put_int(c,stream); - for(j=0;j<5;j++) - put_int(n,stream); } - -/* Command Shells */ - -put_int(total_shells,stream); -for(i=0;i<total_shells;i++) { - put_str(shell[i]->name,stream); - put_str(shell[i]->code,stream); - put_str(shell[i]->ar,stream); - put_int(shell[i]->misc,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); } - -fclose(stream); -} - -void free_main_cfg() -{ - int i; - -for(i=0;i<sys_nodes;i++) - FREE(node_path[i]); -FREE(node_path); -for(i=0;i<total_shells;i++) - FREE(shell[i]); -FREE(shell); -} - -void write_msgs_cfg() -{ - char str[128],c; - int i,j,k,file,x; - short n; - long l; - FILE *stream; - smb_t smb; - -upop("Writing MSGS.CNF..."); -sprintf(str,"%sMSGS.CNF",ctrl_dir); -backup(str); - -if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1 - || (stream=fdopen(file,"wb"))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } -setvbuf(stream,NULL,_IOFBF,2048); - -put_int(max_qwkmsgs,stream); -put_int(mail_maxcrcs,stream); -put_int(mail_maxage,stream); -put_str(preqwk_ar,stream); -put_int(smb_retry_time,stream); -n=0; -for(i=0;i<235;i++) - put_int(n,stream); -n=0xffff; -for(i=0;i<256;i++) - put_int(n,stream); - -/* Message Groups */ - -put_int(total_grps,stream); -for(i=0;i<total_grps;i++) { - put_str(grp[i]->lname,stream); - put_str(grp[i]->sname,stream); - put_str(grp[i]->ar,stream); - n=0; - for(j=0;j<32;j++) - put_int(n,stream); - n=0xffff; - for(j=0;j<16;j++) - put_int(n,stream); } - -/* Message Sub-boards */ - -backslash(echomail_dir); - -str[0]=0; -for(i=n=0;i<total_subs;i++) - if(sub[i]->grp<total_grps) /* total VALID sub-boards */ - n++; -put_int(n,stream); -for(i=0;i<total_subs;i++) { - if(sub[i]->grp>=total_grps) /* skip bogus group numbers */ - continue; - put_int(sub[i]->grp,stream); - put_str(sub[i]->lname,stream); - put_str(sub[i]->sname,stream); - put_str(sub[i]->qwkname,stream); - put_str(sub[i]->code,stream); - if(sub[i]->data_dir[0]) - backslash(sub[i]->data_dir); - put_str(sub[i]->data_dir,stream); - md(sub[i]->data_dir); - put_str(sub[i]->ar,stream); - put_str(sub[i]->read_ar,stream); - put_str(sub[i]->post_ar,stream); - put_str(sub[i]->op_ar,stream); - l=(sub[i]->misc&(~SUB_HDRMOD)); /* Don't write mod bit */ - put_int(l,stream); - put_str(sub[i]->tagline,stream); - put_str(sub[i]->origline,stream); - put_str(sub[i]->echomail_sem,stream); - if(sub[i]->echopath) - backslash(sub[i]->echopath); - put_str(sub[i]->echopath,stream); - if(sub[i]->misc&SUB_FIDO && (echomail_dir[0] || sub[i]->echopath[0])) { - md(echomail_dir); - if(!sub[i]->echopath[0]) - sprintf(sub[i]->echopath,"%s%s",echomail_dir,sub[i]->code); - md(sub[i]->echopath); } - put_int(sub[i]->faddr,stream); - put_int(sub[i]->maxmsgs,stream); - put_int(sub[i]->maxcrcs,stream); - put_int(sub[i]->maxage,stream); - put_int(sub[i]->ptridx,stream); - put_str(sub[i]->mod_ar,stream); - put_int(sub[i]->qwkconf,stream); - c=0; - put_int(c,stream); - n=0; - for(k=0;k<26;k++) - put_int(n,stream); - - if(all_msghdr || (sub[i]->misc&SUB_HDRMOD && !no_msghdr)) { - if(!sub[i]->data_dir[0]) - sprintf(smb.file,"%sSUBS\\%s",data_dir,sub[i]->code); - else - sprintf(smb.file,"%s%s",sub[i]->data_dir,sub[i]->code); - if((x=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,x); - continue; } - if(!filelength(fileno(smb.shd_fp))) { - smb.status.max_crcs=sub[i]->maxcrcs; - smb.status.max_msgs=sub[i]->maxmsgs; - smb.status.max_age=sub[i]->maxage; - smb.status.attr=sub[i]->misc&SUB_HYPER ? SMB_HYPERALLOC :0; - if((x=smb_create(&smb))!=0) - errormsg(WHERE,ERR_CREATE,smb.file,x); - smb_close(&smb); - continue; } - if((x=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,x); - continue; } - if((x=smb_getstatus(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,x); - continue; } - if((!(sub[i]->misc&SUB_HYPER) || smb.status.attr&SMB_HYPERALLOC) - && smb.status.max_msgs==sub[i]->maxmsgs - && smb.status.max_crcs==sub[i]->maxcrcs - && smb.status.max_age==sub[i]->maxage) { /* No change */ - smb_close(&smb); - continue; } - smb.status.max_msgs=sub[i]->maxmsgs; - smb.status.max_crcs=sub[i]->maxcrcs; - smb.status.max_age=sub[i]->maxage; - if(sub[i]->misc&SUB_HYPER) - smb.status.attr|=SMB_HYPERALLOC; - if((x=smb_putstatus(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_WRITE,smb.file,x); - continue; } - smb_close(&smb); } - - } - -/* FidoNet */ - -put_int(total_faddrs,stream); -for(i=0;i<total_faddrs;i++) { - put_int(faddr[i].zone,stream); - put_int(faddr[i].net,stream); - put_int(faddr[i].node,stream); - put_int(faddr[i].point,stream); } - -put_str(origline,stream); -put_str(netmail_sem,stream); -put_str(echomail_sem,stream); -backslash(netmail_dir); -put_str(netmail_dir,stream); -put_str(echomail_dir,stream); -backslash(fidofile_dir); -put_str(fidofile_dir,stream); -put_int(netmail_misc,stream); -put_int(netmail_cost,stream); -put_int(dflt_faddr,stream); -n=0; -for(i=0;i<28;i++) - put_int(n,stream); - -/* QWKnet Config */ - -put_str(qnet_tagline,stream); - -put_int(total_qhubs,stream); -for(i=0;i<total_qhubs;i++) { - put_str(qhub[i]->id,stream); - put_int(qhub[i]->time,stream); - put_int(qhub[i]->freq,stream); - put_int(qhub[i]->days,stream); - put_int(qhub[i]->node,stream); - put_str(qhub[i]->call,stream); - put_str(qhub[i]->pack,stream); - put_str(qhub[i]->unpack,stream); - put_int(qhub[i]->subs,stream); - for(j=0;j<qhub[i]->subs;j++) { - put_int(qhub[i]->conf[j],stream); - put_int(qhub[i]->sub[j],stream); - put_int(qhub[i]->mode[j],stream); } - n=0; - for(j=0;j<32;j++) - put_int(n,stream); } -n=0; -for(i=0;i<32;i++) - put_int(n,stream); - -/* PostLink Config */ - -memset(str,0,11); -fwrite(str,11,1,stream); /* unused, used to be site name */ -put_int(sys_psnum,stream); - -put_int(total_phubs,stream); -for(i=0;i<total_phubs;i++) { - put_str(phub[i]->name,stream); - put_int(phub[i]->time,stream); - put_int(phub[i]->freq,stream); - put_int(phub[i]->days,stream); - put_int(phub[i]->node,stream); - put_str(phub[i]->call,stream); - n=0; - for(j=0;j<32;j++) - put_int(n,stream); } - -put_str(sys_psname,stream); -n=0; -for(i=0;i<32;i++) - put_int(n,stream); - -put_str(sys_inetaddr,stream); /* Internet address */ -put_str(inetmail_sem,stream); -put_int(inetmail_misc,stream); -put_int(inetmail_cost,stream); - -fclose(stream); - -/* MUST BE AT END */ - -if(!no_msghdr) { - backslash(data_dir); - sprintf(smb.file,"%sMAIL",data_dir); - if((x=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,x); - return; } - if(!filelength(fileno(smb.shd_fp))) { - smb.status.max_crcs=mail_maxcrcs; - smb.status.max_msgs=MAX_SYSMAIL; - smb.status.max_age=mail_maxage; - smb.status.attr=SMB_EMAIL; - if((x=smb_create(&smb))!=0) - errormsg(WHERE,ERR_CREATE,smb.file,x); - smb_close(&smb); - return; } - if((x=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,x); - return; } - if((x=smb_getstatus(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,x); - return; } - smb.status.max_msgs=MAX_SYSMAIL; - smb.status.max_crcs=mail_maxcrcs; - smb.status.max_age=mail_maxage; - if((x=smb_putstatus(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_WRITE,smb.file,x); - return; } - smb_close(&smb); } -} - -void free_msgs_cfg() -{ - int i; - -for(i=0;i<total_grps;i++) - FREE(grp[i]); -FREE(grp); -grp=NULL; - -for(i=0;i<total_subs;i++) - FREE(sub[i]); -FREE(sub); -sub=NULL; - -FREE(faddr); -total_faddrs=0; - -for(i=0;i<total_qhubs;i++) { - FREE(qhub[i]->mode); - FREE(qhub[i]->conf); - FREE(qhub[i]->sub); - FREE(qhub[i]); } -FREE(qhub); -qhub=NULL; - -for(i=0;i<total_phubs;i++) - FREE(phub[i]); -FREE(phub); -phub=NULL; - -} - diff --git a/src/sbbs2/scfg/wrcnf2.c b/src/sbbs2/scfg/wrcnf2.c deleted file mode 100644 index d006ed3bb7..0000000000 --- a/src/sbbs2/scfg/wrcnf2.c +++ /dev/null @@ -1,494 +0,0 @@ -#line 2 "WRCNF2.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "scfg.h" - -extern int no_msghdr,all_msghdr; -extern int no_dirchk; - -extern char *crlf; -extern char nulbuf[]; -extern int pslen; - -#define put_int(var,stream) fwrite(&var,1,sizeof(var),stream) -#define put_str(var,stream) { pslen=strlen(var); \ - fwrite(var,1,pslen > sizeof(var) \ - ? sizeof(var) : pslen ,stream); \ - fwrite(nulbuf,1,pslen > sizeof(var) \ - ? 0 : sizeof(var)-pslen,stream); } - -void backup(char *org) -{ - char old[128],new[128]; - int i,x; - -x=strlen(org)-1; -if(x<=0) - return; -strcpy(old,org); -strcpy(new,org); -for(i=backup_level;i;i--) { - new[x]=(i-1)+'0'; - if(i==backup_level) - remove(new); - if(i==1) { - rename(org,new); - continue; } - old[x]=(i-2)+'0'; - rename(old,new); } -} - - -void write_file_cfg() -{ - char str[128],cmd[LEN_CMD+1],c; - int i,j,k,file; - short n; - long l=0; - FILE *stream; - -upop("Writing FILE.CNF..."); -sprintf(str,"%sFILE.CNF",ctrl_dir); -backup(str); - -if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1 - || (stream=fdopen(file,"wb"))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } -setvbuf(stream,NULL,_IOFBF,2048); - -put_int(min_dspace,stream); -put_int(max_batup,stream); -put_int(max_batdn,stream); -put_int(max_userxfer,stream); -put_int(l,stream); /* unused */ -put_int(cdt_up_pct,stream); -put_int(cdt_dn_pct,stream); -put_int(l,stream); /* unused */ -put_str(cmd,stream); -put_int(leech_pct,stream); -put_int(leech_sec,stream); -n=0; -for(i=0;i<32;i++) - put_int(n,stream); - -/* Extractable File Types */ - -put_int(total_fextrs,stream); -for(i=0;i<total_fextrs;i++) { - put_str(fextr[i]->ext,stream); - put_str(fextr[i]->cmd,stream); - put_str(fextr[i]->ar,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); } - -/* Compressable File Types */ - -put_int(total_fcomps,stream); -for(i=0;i<total_fcomps;i++) { - put_str(fcomp[i]->ext,stream); - put_str(fcomp[i]->cmd,stream); - put_str(fcomp[i]->ar,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); } - -/* Viewable File Types */ - -put_int(total_fviews,stream); -for(i=0;i<total_fviews;i++) { - put_str(fview[i]->ext,stream); - put_str(fview[i]->cmd,stream); - put_str(fview[i]->ar,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); } - -/* Testable File Types */ - -put_int(total_ftests,stream); -for(i=0;i<total_ftests;i++) { - put_str(ftest[i]->ext,stream); - put_str(ftest[i]->cmd,stream); - put_str(ftest[i]->workstr,stream); - put_str(ftest[i]->ar,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); } - -/* Download Events */ - -put_int(total_dlevents,stream); -for(i=0;i<total_dlevents;i++) { - put_str(dlevent[i]->ext,stream); - put_str(dlevent[i]->cmd,stream); - put_str(dlevent[i]->workstr,stream); - put_str(dlevent[i]->ar,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); } - -/* File Transfer Protocols */ - -put_int(total_prots,stream); -for(i=0;i<total_prots;i++) { - put_int(prot[i]->mnemonic,stream); - put_str(prot[i]->name,stream); - put_str(prot[i]->ulcmd,stream); - put_str(prot[i]->dlcmd,stream); - put_str(prot[i]->batulcmd,stream); - put_str(prot[i]->batdlcmd,stream); - put_str(prot[i]->blindcmd,stream); - put_str(prot[i]->bicmd,stream); - put_int(prot[i]->misc,stream); - put_str(prot[i]->ar,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); } - -/* Alternate File Paths */ - -put_int(altpaths,stream); -for(i=0;i<altpaths;i++) { - backslash(altpath[i]); - fwrite(altpath[i],LEN_DIR+1,1,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); } - -/* File Libraries */ - -put_int(total_libs,stream); -for(i=0;i<total_libs;i++) { - put_str(lib[i]->lname,stream); - put_str(lib[i]->sname,stream); - put_str(lib[i]->ar,stream); - n=0; - for(j=0;j<32;j++) - put_int(n,stream); - n=0xffff; - for(j=0;j<16;j++) - put_int(n,stream); } - -/* File Directories */ - -put_int(total_dirs,stream); -for(j=0;j<total_libs;j++) - for(i=0;i<total_dirs;i++) - if(dir[i]->lib==j) { - put_int(dir[i]->lib,stream); - put_str(dir[i]->lname,stream); - put_str(dir[i]->sname,stream); - put_str(dir[i]->code,stream); - if(dir[i]->data_dir[0]) - backslash(dir[i]->data_dir); - md(dir[i]->data_dir); - put_str(dir[i]->data_dir,stream); - put_str(dir[i]->ar,stream); - put_str(dir[i]->ul_ar,stream); - put_str(dir[i]->dl_ar,stream); - put_str(dir[i]->op_ar,stream); - backslash(dir[i]->path); - put_str(dir[i]->path,stream); - if(dir[i]->misc&DIR_FCHK) { - strcpy(str,dir[i]->path); - md(str); } - - put_str(dir[i]->upload_sem,stream); - put_int(dir[i]->maxfiles,stream); - put_str(dir[i]->exts,stream); - put_int(dir[i]->misc,stream); - put_int(dir[i]->seqdev,stream); - put_int(dir[i]->sort,stream); - put_str(dir[i]->ex_ar,stream); - put_int(dir[i]->maxage,stream); - put_int(dir[i]->up_pct,stream); - put_int(dir[i]->dn_pct,stream); - c=0; - put_int(c,stream); - n=0; - for(k=0;k<8;k++) - put_int(n,stream); - n=0xffff; - for(k=0;k<16;k++) - put_int(n,stream); - } - -/* Text File Sections */ - -put_int(total_txtsecs,stream); -for(i=0;i<total_txtsecs;i++) { - sprintf(str,"%sTEXT\\%s",data_dir,txtsec[i]->code); - md(str); - put_str(txtsec[i]->name,stream); - put_str(txtsec[i]->code,stream); - put_str(txtsec[i]->ar,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); } - -fclose(stream); -} - -void free_file_cfg() -{ - int i; - -for(i=0;i<total_fextrs;i++) - FREE(fextr[i]); -FREE(fextr); - -for(i=0;i<total_fcomps;i++) - FREE(fcomp[i]); -FREE(fcomp); - -for(i=0;i<total_fviews;i++) - FREE(fview[i]); -FREE(fview); - -for(i=0;i<total_ftests;i++) - FREE(ftest[i]); -FREE(ftest); - -for(i=0;i<total_dlevents;i++) - FREE(dlevent[i]); -FREE(dlevent); - -for(i=0;i<total_prots;i++) - FREE(prot[i]); -FREE(prot); - -for(i=0;i<altpaths;i++) - FREE(altpath[i]); -FREE(altpath); - -for(i=0;i<total_libs;i++) - FREE(lib[i]); -FREE(lib); - -for(i=0;i<total_dirs;i++) - FREE(dir[i]); -FREE(dir); - -for(i=0;i<total_txtsecs;i++) - FREE(txtsec[i]); -FREE(txtsec); -} - - -void write_chat_cfg() -{ - char str[128]; - int i,j,file; - short n; - FILE *stream; - -upop("Writing CHAT.CNF..."); -sprintf(str,"%sCHAT.CNF",ctrl_dir); -backup(str); - -if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1 - || (stream=fdopen(file,"wb"))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } -setvbuf(stream,NULL,_IOFBF,2048); - -put_int(total_gurus,stream); -for(i=0;i<total_gurus;i++) { - put_str(guru[i]->name,stream); - put_str(guru[i]->code,stream); - put_str(guru[i]->ar,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); - } - -put_int(total_actsets,stream); -for(i=0;i<total_actsets;i++) - put_str(actset[i]->name,stream); - -put_int(total_chatacts,stream); -for(i=0;i<total_chatacts;i++) { - put_int(chatact[i]->actset,stream); - put_str(chatact[i]->cmd,stream); - put_str(chatact[i]->out,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); - } - -put_int(total_chans,stream); -for(i=0;i<total_chans;i++) { - put_int(chan[i]->actset,stream); - put_str(chan[i]->name,stream); - put_str(chan[i]->code,stream); - put_str(chan[i]->ar,stream); - put_int(chan[i]->cost,stream); - put_int(chan[i]->guru,stream); - put_int(chan[i]->misc,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); - } - -put_int(total_pages,stream); -for(i=0;i<total_pages;i++) { - put_int(page[i]->cmd,stream); - put_int(page[i]->ar,stream); - put_int(page[i]->misc,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); - } - -fclose(stream); -} - -void free_chat_cfg() -{ - int i; - -for(i=0;i<total_actsets;i++) - FREE(actset[i]); -FREE(actset); - -for(i=0;i<total_chatacts;i++) - FREE(chatact[i]); -FREE(chatact); - -for(i=0;i<total_chans;i++) - FREE(chan[i]); -FREE(chan); - -for(i=0;i<total_gurus;i++) - FREE(guru[i]); -FREE(guru); - -for(i=0;i<total_pages;i++) - FREE(page[i]); -FREE(page); - -} - -void write_xtrn_cfg() -{ - uchar str[128],c; - int i,j,sec,file; - short n; - long l; - FILE *stream; - -upop("Writing XTRN.CNF..."); -sprintf(str,"%sXTRN.CNF",ctrl_dir); -backup(str); - -if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1 - || (stream=fdopen(file,"wb"))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } -setvbuf(stream,NULL,_IOFBF,2048); - -put_int(total_swaps,stream); -for(i=0;i<total_swaps;i++) - put_str(swap[i]->cmd,stream); - -put_int(total_xedits,stream); -for(i=0;i<total_xedits;i++) { - put_str(xedit[i]->name,stream); - put_str(xedit[i]->code,stream); - put_str(xedit[i]->lcmd,stream); - put_str(xedit[i]->rcmd,stream); - put_int(xedit[i]->misc,stream); - put_str(xedit[i]->ar,stream); - put_int(xedit[i]->type,stream); - c=0; - put_int(c,stream); - n=0; - for(j=0;j<7;j++) - put_int(n,stream); - } - -put_int(total_xtrnsecs,stream); -for(i=0;i<total_xtrnsecs;i++) { - put_str(xtrnsec[i]->name,stream); - put_str(xtrnsec[i]->code,stream); - put_str(xtrnsec[i]->ar,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); - } - -put_int(total_xtrns,stream); -for(sec=0;sec<total_xtrnsecs;sec++) - for(i=0;i<total_xtrns;i++) { - if(xtrn[i]->sec!=sec) - continue; - put_int(xtrn[i]->sec,stream); - put_str(xtrn[i]->name,stream); - put_str(xtrn[i]->code,stream); - put_str(xtrn[i]->ar,stream); - put_str(xtrn[i]->run_ar,stream); - put_int(xtrn[i]->type,stream); - put_int(xtrn[i]->misc,stream); - put_int(xtrn[i]->event,stream); - put_int(xtrn[i]->cost,stream); - put_str(xtrn[i]->cmd,stream); - put_str(xtrn[i]->clean,stream); - put_str(xtrn[i]->path,stream); - put_int(xtrn[i]->textra,stream); - put_int(xtrn[i]->maxtime,stream); - n=0; - for(j=0;j<7;j++) - put_int(n,stream); - } - -put_int(total_events,stream); -for(i=0;i<total_events;i++) { - put_str(event[i]->code,stream); - put_str(event[i]->cmd,stream); - put_int(event[i]->days,stream); - put_int(event[i]->time,stream); - put_int(event[i]->node,stream); - put_int(event[i]->misc,stream); - put_int(event[i]->dir,stream); - n=0; - for(j=0;j<8;j++) - put_int(n,stream); - } - -put_int(total_os2pgms,stream); -for(i=0;i<total_os2pgms;i++) - put_str(os2pgm[i]->name,stream); -for(i=0;i<total_os2pgms;i++) - put_int(os2pgm[i]->misc,stream); - -fclose(stream); -} - -void free_xtrn_cfg() -{ - int i; - -for(i=0;i<total_swaps;i++) - FREE(swap[i]); -FREE(swap); - -for(i=0;i<total_xedits;i++) - FREE(xedit[i]); -FREE(xedit); - -for(i=0;i<total_xtrnsecs;i++) - FREE(xtrnsec[i]); -FREE(xtrnsec); - -for(i=0;i<total_xtrns;i++) - FREE(xtrn[i]); -FREE(xtrn); - -for(i=0;i<total_events;i++) - FREE(event[i]); -FREE(event); - -} diff --git a/src/sbbs2/scfglib.h b/src/sbbs2/scfglib.h deleted file mode 100644 index b0a5c22d4f..0000000000 --- a/src/sbbs2/scfglib.h +++ /dev/null @@ -1,43 +0,0 @@ -/* SCFGLIB.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#ifndef _SCFGLIB_H -#define _SCFGLIB_H - -#define SAVE_MEMORY - -#define get_int(var,stream) { if(!fread(&var,1,sizeof(var),stream)) \ - memset(&var,0,sizeof(var)); \ - offset+=sizeof(var); } -#define get_str(var,stream) { if(!fread(var,1,sizeof(var),stream)) \ - memset(var,0,sizeof(var)); \ - offset+=sizeof(var); } - -typedef struct { - char *openerr, - *reading, - *readit, - *allocerr, - *error; - } read_cfg_text_t; - -char *get_alloc(long *offset, char *outstr, int maxlen, FILE *instream); -void allocerr(read_cfg_text_t txt, long offset, char *fname, uint size); -char *readline(long *offset, char *str, int maxlen, FILE *stream); -void read_node_cfg(read_cfg_text_t txt); -void read_main_cfg(read_cfg_text_t txt); -void read_text_cfg(read_cfg_text_t txt); -void read_xtrn_cfg(read_cfg_text_t txt); -void read_file_cfg(read_cfg_text_t txt); -void read_msgs_cfg(read_cfg_text_t txt); -void read_attr_cfg(read_cfg_text_t txt); -void read_chat_cfg(read_cfg_text_t txt); -long aftol(char *str); /* Converts flag string to long */ -char *ltoaf(long l, char *str); /* Converts long to flag string */ -faddr_t atofaddr(char *str); /* ASCII text to FidoNet address conversion */ -char *faddrtoa(faddr_t addr); /* FidoNet address to ASCII text conversion */ -char chardupe(char *str); /* Searches for duplicate chars in str */ -int attrstr(char *str); /* Convert ATTR string into attribute int */ - -#endif /* Don't add anything after this line */ diff --git a/src/sbbs2/scfglib1.c b/src/sbbs2/scfglib1.c deleted file mode 100644 index aaabc373f9..0000000000 --- a/src/sbbs2/scfglib1.c +++ /dev/null @@ -1,874 +0,0 @@ -#line 1 "SCFGLIB1.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "scfglib.h" - -void prep_path(char *path) -{ - char str[LEN_DIR*2]; - int i; - -if(!path[0]) - return; -if(path[0]!='\\' && path[1]!=':') /* Relative to NODE directory */ - sprintf(str,"%s%s",node_dir,path); -else - strcpy(str,path); -i=strlen(str); -if(str[i-1]!=':' && str[i-1]!='\\') - strcat(str,"\\"); -strcat(str,"."); // Change C: to C:. and C:\SBBS\ to C:\SBBS\. -_fullpath(path,str,LEN_DIR+1); // Change C:\SBBS\NODE1\..\EXEC to C:\SBBS\EXEC -i=strlen(path); -if(i && path[i-1]!='\\') - strcat(path,"\\"); -} - -char *get_alloc(long *offset, char *outstr, int maxlen, FILE *instream) -{ - -#ifdef SCFG - fread(outstr,1,maxlen+1,instream); - (*offset)+=maxlen+1; -#else - char str[257]; - - fread(str,1,maxlen+1,instream); -// lprintf("%s %d %p\r\n",__FILE__,__LINE__,offset); - (*offset)+=maxlen+1; // this line was commented out (04/12/97) why? - if(!str[0]) /* Save memory */ - return(scfgnulstr); - if((outstr=(char *)MALLOC(strlen(str)+1))==NULL) - return(NULL); - strcpy(outstr,str); -#endif - -return(outstr); -} - -#ifdef SCFG /* SCFG allocate max length */ - #define readline_alloc(l,s,m,i) readline(l,s,m,i) -#else - char *readline_alloc(long *offset, char *outstr, int maxline - , FILE *instream); - #define readline_alloc(l,s,m,i) s=readline_alloc(l,s,m,i) - #define get_alloc(o,s,l,i) s=get_alloc(o,s,l,i) -#endif - -/***********************************************************/ -/* These functions are called from here and must be linked */ -/***********************************************************/ -/*** - nopen() - truncsp() -***/ - -void allocerr(read_cfg_text_t txt, long offset, char *fname, uint size) -{ -lprintf(txt.error,offset,fname); -lprintf(txt.allocerr,size); -bail(1); -} - -#ifndef NO_NODE_CFG - -/****************************************************************************/ -/* Reads in NODE.CNF and initializes the associated variables */ -/****************************************************************************/ -void read_node_cfg(read_cfg_text_t txt) -{ - char c,str[256],cmd[64],fname[13],*p; - int i; - short n; - long offset=0; - FILE *instream; - -strcpy(fname,"NODE.CNF"); -sprintf(str,"%s%s",node_dir,fname); -if((instream=fnopen(&i,str,O_RDONLY))==NULL) { - lprintf(txt.openerr,str); -#ifdef SBBS - lprintf("\r\nSBBS must be run from a NODE directory (e.g. "); - lclatr(WHITE); - lprintf("C:\\SBBS\\NODE1"); - lclatr(LIGHTGRAY); - lprintf(").\r\n"); -#endif - bail(1); } - -lprintf(txt.reading,fname); -get_int(node_num,instream); -if(!node_num) { - lprintf(txt.error,offset,fname); - lprintf("Node number must be non-zero\r\n"); - bail(1); } -get_str(node_name,instream); -get_str(node_phone,instream); -get_str(node_comspec,instream); -if(!node_comspec[0]) - strcpy(node_comspec,"C:\\OS2\\MDOS\\COMMAND.COM"); -get_int(node_misc,instream); -get_int(node_ivt,instream); -get_int(node_swap,instream); -get_str(node_swapdir,instream); -#ifndef SCFG -if(!node_swapdir[0]) - strcpy(node_swapdir,node_dir); -else - prep_path(node_swapdir); -#endif -get_int(node_valuser,instream); -get_int(node_minbps,instream); -#ifdef SCFG -get_str(node_ar,instream); -#else -fread(str,1,LEN_ARSTR+1,instream); -offset+=LEN_ARSTR+1; -node_ar=arstr(0,str); -#endif -get_int(node_dollars_per_call,instream); -get_str(node_editor,instream); -get_str(node_viewer,instream); -get_str(node_daily,instream); -get_int(c,instream); -if(c) node_scrnlen=c; -get_int(node_scrnblank,instream); -get_str(ctrl_dir,instream); /* ctrl directory */ -get_str(text_dir,instream); /* text directory */ -get_str(temp_dir,instream); /* temp directory */ -if(!temp_dir[0]) - strcpy(temp_dir,"TEMP"); - -#ifndef SCFG -prep_path(ctrl_dir); -prep_path(text_dir); -prep_path(temp_dir); -#endif - -for(i=0;i<10;i++) { /* WFC 0-9 DOS commands */ - get_alloc(&offset,wfc_cmd[i],LEN_CMD,instream); } -for(i=0;i<12;i++) { /* WFC F1-F12 shrinking DOS cmds */ - get_alloc(&offset,wfc_scmd[i],LEN_CMD,instream); } -get_str(mdm_hang,instream); -get_int(node_sem_check,instream); -if(!node_sem_check) node_sem_check=60; -get_int(node_stat_check,instream); -if(!node_stat_check) node_stat_check=10; -get_str(scfg_cmd,instream); -if(!scfg_cmd[0]) - strcpy(scfg_cmd,"%!scfg %k"); -get_int(sec_warn,instream); -if(!sec_warn) - sec_warn=180; -get_int(sec_hangup,instream); -if(!sec_hangup) - sec_hangup=300; -for(i=0;i<188;i++) { /* Unused - initialized to NULL */ - fread(&n,1,2,instream); - offset+=2; } -for(i=0;i<256;i++) { /* Unused - initialized to 0xff */ - fread(&n,1,2,instream); - offset+=2; } - -/***************/ -/* Modem Stuff */ -/***************/ - -get_int(com_port,instream); -get_int(com_irq,instream); -get_int(com_base,instream); -get_int(com_rate,instream); -get_int(mdm_misc,instream); -get_str(mdm_init,instream); -get_str(mdm_spec,instream); -get_str(mdm_term,instream); -get_str(mdm_dial,instream); -get_str(mdm_offh,instream); -get_str(mdm_answ,instream); -get_int(mdm_reinit,instream); -get_int(mdm_ansdelay,instream); -get_int(mdm_rings,instream); - -get_int(mdm_results,instream); - -if(mdm_results) { - if((mdm_result=(mdm_result_t *)MALLOC(sizeof(mdm_result_t)*mdm_results)) - ==NULL) - allocerr(txt,offset,fname,sizeof(mdm_result_t *)*mdm_results); } -else - mdm_result=NULL; - -for(i=0;i<mdm_results;i++) { - if(feof(instream)) break; - get_int(mdm_result[i].code,instream); - get_int(mdm_result[i].rate,instream); - get_int(mdm_result[i].cps,instream); - get_alloc(&offset,mdm_result[i].str,LEN_MODEM,instream); } -mdm_results=i; -fclose(instream); -lprintf(txt.readit,fname); -} - -#endif - -#ifndef NO_MAIN_CFG - -/****************************************************************************/ -/* Reads in MAIN.CNF and initializes the associated variables */ -/****************************************************************************/ -void read_main_cfg(read_cfg_text_t txt) -{ - char str[256],fname[13],*p,c; - int file; - short i,j,n; - long offset=0; - FILE *instream; - -strcpy(fname,"MAIN.CNF"); -sprintf(str,"%s%s",ctrl_dir,fname); -if((instream=fnopen(&file,str,O_RDONLY))==NULL) { - lprintf(txt.openerr,str); - bail(1); } - -lprintf(txt.reading,fname); -get_str(sys_name,instream); -get_str(sys_id,instream); -get_str(sys_location,instream); -get_str(sys_phonefmt,instream); -get_str(sys_op,instream); -get_str(sys_guru,instream); -get_str(sys_pass,instream); -get_int(sys_nodes,instream); - -if(!sys_nodes || sys_nodes<node_num || sys_nodes>MAX_NODES) { - lprintf(txt.error,offset,fname); - if(!sys_nodes) - lprintf("Total nodes on system must be non-zero.\r\n"); - else if(sys_nodes>MAX_NODES) - lprintf("Total nodes exceeds %u.\r\n",MAX_NODES); - else - lprintf("Total nodes (%u) < node number in NODE.CNF (%u)\r\n" - ,sys_nodes,node_num); - bail(1); } - -if((node_path=(char **)MALLOC(sizeof(char *)*sys_nodes))==NULL) - allocerr(txt,offset,fname,sizeof(char *)*sys_nodes); - -for(i=0;i<sys_nodes;i++) { - if(feof(instream)) break; - fread(str,LEN_DIR+1,1,instream); - offset+=LEN_DIR+1; - if((node_path[i]=(char *)MALLOC(strlen(str)+1))==NULL) - allocerr(txt,offset,fname,strlen(str)+1); - strcpy(node_path[i],str); } - -get_str(data_dir,instream); /* data directory */ -get_str(exec_dir,instream); /* exec directory */ - -#ifndef SCFG -prep_path(data_dir); -prep_path(exec_dir); -#endif - -get_str(sys_logon,instream); -get_str(sys_logout,instream); -get_str(sys_daily,instream); -get_int(sys_timezone,instream); -get_int(sys_misc,instream); -get_int(sys_lastnode,instream); -get_int(sys_autonode,instream); -get_int(uq,instream); -get_int(sys_pwdays,instream); -get_int(sys_deldays,instream); -get_int(sys_exp_warn,instream); /* Days left till expiration warning */ -get_int(sys_autodel,instream); -get_int(sys_def_stat,instream); /* default status line */ - -#ifdef SCFG -get_str(sys_chat_ar,instream); -#else -fread(str,1,LEN_ARSTR+1,instream); -offset+=LEN_ARSTR+1; -sys_chat_ar=arstr(0,str); -#endif - -get_int(cdt_min_value,instream); -get_int(max_minutes,instream); -get_int(cdt_per_dollar,instream); -get_str(new_pass,instream); -get_str(new_magic,instream); -get_str(new_sif,instream); -get_str(new_sof,instream); -if(!new_sof[0]) /* if output not specified, use input file */ - strcpy(new_sof,new_sif); - -/*********************/ -/* New User Settings */ -/*********************/ - -get_int(new_level,instream); -get_int(new_flags1,instream); -get_int(new_flags2,instream); -get_int(new_flags3,instream); -get_int(new_flags4,instream); -get_int(new_exempt,instream); -get_int(new_rest,instream); -get_int(new_cdt,instream); -get_int(new_min,instream); -get_str(new_xedit,instream); -get_int(new_expire,instream); -get_int(new_shell,instream); -get_int(new_misc,instream); -get_int(new_prot,instream); -if(new_prot<SP) - new_prot=SP; -get_int(c,instream); -for(i=0;i<7;i++) - get_int(n,instream); - -/*************************/ -/* Expired User Settings */ -/*************************/ - -get_int(expired_level,instream); -get_int(expired_flags1,instream); -get_int(expired_flags2,instream); -get_int(expired_flags3,instream); -get_int(expired_flags4,instream); -get_int(expired_exempt,instream); -get_int(expired_rest,instream); - -get_str(logon_mod,instream); -get_str(logoff_mod,instream); -get_str(newuser_mod,instream); -get_str(login_mod,instream); -if(!login_mod[0]) strcpy(login_mod,"LOGIN"); -get_str(logout_mod,instream); -get_str(sync_mod,instream); -get_str(expire_mod,instream); -get_int(c,instream); - -for(i=0;i<224;i++) /* unused - initialized to NULL */ - get_int(n,instream); -for(i=0;i<256;i++) /* unused - initialized to 0xff */ - get_int(n,instream); - -/*******************/ -/* Validation Sets */ -/*******************/ - -for(i=0;i<10 && !feof(instream);i++) { - get_int(val_level[i],instream); - get_int(val_expire[i],instream); - get_int(val_flags1[i],instream); - get_int(val_flags2[i],instream); - get_int(val_flags3[i],instream); - get_int(val_flags4[i],instream); - get_int(val_cdt[i],instream); - get_int(val_exempt[i],instream); - get_int(val_rest[i],instream); - for(j=0;j<8;j++) - get_int(n,instream); } - -/***************************/ -/* Security Level Settings */ -/***************************/ - -for(i=0;i<100 && !feof(instream);i++) { - get_int(level_timeperday[i],instream); - if(level_timeperday[i]>500) - level_timeperday[i]=500; - get_int(level_timepercall[i],instream); - if(level_timepercall[i]>500) - level_timepercall[i]=500; - get_int(level_callsperday[i],instream); - get_int(level_freecdtperday[i],instream); - get_int(level_linespermsg[i],instream); - get_int(level_postsperday[i],instream); - get_int(level_emailperday[i],instream); - get_int(level_misc[i],instream); - get_int(level_expireto[i],instream); - get_int(c,instream); - for(j=0;j<5;j++) - get_int(n,instream); } -if(i!=100) { - lprintf(txt.error,offset,fname); - lprintf("Insufficient User Level Information\r\n" - "%d user levels read, 100 needed.\r\n",i); - bail(1); } - -get_int(total_shells,instream); -#ifdef SBBS -if(!total_shells) { - lprintf(txt.error,offset,fname); - lprintf("At least one command shell must be configured.\r\n"); - bail(1); } -#endif - -if(total_shells) { - if((shell=(shell_t **)MALLOC(sizeof(shell_t *)*total_shells))==NULL) - allocerr(txt,offset,fname,sizeof(shell_t *)*total_shells); } -else - shell=NULL; - -for(i=0;i<total_shells;i++) { - if(feof(instream)) break; - if((shell[i]=(shell_t *)MALLOC(sizeof(shell_t)))==NULL) - allocerr(txt,offset,fname,sizeof(shell_t)); - memset(shell[i],0,sizeof(shell_t)); - - get_alloc(&offset,shell[i]->name,40,instream); - get_str(shell[i]->code,instream); -#ifdef SCFG - get_str(shell[i]->ar,instream); -#else - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - shell[i]->ar=arstr(0,str); -#endif - get_int(shell[i]->misc,instream); - for(j=0;j<8;j++) - get_int(n,instream); - } -total_shells=i; - - -fclose(instream); -lprintf(txt.readit,fname); -} - -#endif - -#ifndef NO_MSGS_CFG - - -/****************************************************************************/ -/* Reads in MSGS.CNF and initializes the associated variables */ -/****************************************************************************/ -void read_msgs_cfg(read_cfg_text_t txt) -{ - char str[256],fname[13],tmp[128],c; - int file; - short i,j,k,l,n; - long offset=0; - FILE *instream; - -#ifndef SCFG - -sprintf(data_dir_subs,"%sSUBS\\",data_dir); -prep_path(data_dir_subs); - -#endif - -strcpy(fname,"MSGS.CNF"); -sprintf(str,"%s%s",ctrl_dir,fname); -if((instream=fnopen(&file,str,O_RDONLY))==NULL) { - lprintf(txt.openerr,str); - bail(1); } - -lprintf(txt.reading,fname); - -/*************************/ -/* General Message Stuff */ -/*************************/ - -get_int(max_qwkmsgs,instream); -get_int(mail_maxcrcs,instream); -get_int(mail_maxage,instream); -#ifdef SCFG - get_str(preqwk_ar,instream); -#else - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - preqwk_ar=arstr(0,str); -#endif -get_int(smb_retry_time,instream); /* odd byte */ -if(!smb_retry_time) - smb_retry_time=30; -for(i=0;i<235;i++) /* NULL */ - get_int(n,instream); -for(i=0;i<256;i++) /* 0xff */ - get_int(n,instream); - - -/******************/ -/* Message Groups */ -/******************/ - -get_int(total_grps,instream); - - -if(total_grps) { - if((grp=(grp_t **)MALLOC(sizeof(grp_t *)*total_grps))==NULL) - allocerr(txt,offset,fname,sizeof(grp_t *)*total_grps); } -else - grp=NULL; - - -#ifdef SBBS - -if(total_grps) { - - if((cursub=(uint *)MALLOC(sizeof(uint)*total_grps))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*total_grps); - - if((usrgrp=(uint *)MALLOC(sizeof(uint)*total_grps))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*total_grps); - - if((usrsubs=(uint *)MALLOC(sizeof(uint)*total_grps))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*total_grps); - - if((usrsub=(uint **)MALLOC(sizeof(uint *)*total_grps))==NULL) - allocerr(txt,offset,fname,sizeof(uint *)*total_grps); } - -#endif - -for(i=0;i<total_grps;i++) { - - if(feof(instream)) break; - if((grp[i]=(grp_t *)MALLOC(sizeof(grp_t)))==NULL) - allocerr(txt,offset,fname,sizeof(grp_t)); - memset(grp[i],0,sizeof(grp_t)); - - get_alloc(&offset,grp[i]->lname,LEN_GLNAME,instream); - get_alloc(&offset,grp[i]->sname,LEN_GSNAME,instream); - -#if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */ - if(!strcmp(grp[i]->lname,grp[i]->sname) && grp[i]->sname!=scfgnulstr) { - FREE(grp[i]->sname); - grp[i]->sname=grp[i]->lname; } -#endif - -#ifdef SCFG - get_str(grp[i]->ar,instream); -#else - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - grp[i]->ar=arstr(0,str); -#endif - for(j=0;j<48;j++) - get_int(n,instream); - } -total_grps=i; - -/**********************/ -/* Message Sub-boards */ -/**********************/ - -get_int(total_subs,instream); - -if(total_subs) { - if((sub=(sub_t **)MALLOC(sizeof(sub_t *)*total_subs))==NULL) - allocerr(txt,offset,fname,sizeof(sub_t *)*total_subs); } -else - sub=NULL; - -#ifdef SBBS - -if(total_subs) { - - if((sub_misc=(char *)MALLOC(sizeof(char)*total_subs))==NULL) - allocerr(txt,offset,fname,sizeof(char)*total_subs); - - if((sub_ptr=(ulong *)MALLOC(sizeof(ulong)*total_subs))==NULL) - allocerr(txt,offset,fname,sizeof(ulong)*total_subs); - - if((sub_last=(ulong *)MALLOC(sizeof(ulong)*total_subs))==NULL) - allocerr(txt,offset,fname,sizeof(ulong)*total_subs); } - -#endif - -for(i=0;i<total_subs;i++) { - if(feof(instream)) break; - if((sub[i]=(sub_t *)MALLOC(sizeof(sub_t)))==NULL) - allocerr(txt,offset,fname,sizeof(sub_t)); - memset(sub[i],0,sizeof(sub_t)); - - get_int(sub[i]->grp,instream); - get_alloc(&offset,sub[i]->lname,LEN_SLNAME,instream); - get_alloc(&offset,sub[i]->sname,LEN_SSNAME,instream); - -#if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */ - if(!strcmp(sub[i]->lname,sub[i]->sname) && sub[i]->sname!=scfgnulstr) { - FREE(sub[i]->sname); - sub[i]->sname=sub[i]->lname; } -#endif - - get_alloc(&offset,sub[i]->qwkname,10,instream); - -#if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */ - if(!strcmp(sub[i]->qwkname,sub[i]->sname) && sub[i]->qwkname!=scfgnulstr) { - FREE(sub[i]->qwkname); - sub[i]->qwkname=sub[i]->sname; } -#endif - - get_str(sub[i]->code,instream); - -#ifdef SCFG - get_str(sub[i]->data_dir,instream); -#else - fread(str,LEN_DIR+1,1,instream); /* substitute data dir */ - offset+=LEN_DIR+1; - if(str[0]) { - prep_path(str); - if((sub[i]->data_dir=(char *)MALLOC(strlen(str)+1))==NULL) - allocerr(txt,offset,fname,strlen(str)+1); - strcpy(sub[i]->data_dir,str); } - else - sub[i]->data_dir=data_dir_subs; -#endif - - -#ifdef SCFG - get_str(sub[i]->ar,instream); - get_str(sub[i]->read_ar,instream); - get_str(sub[i]->post_ar,instream); - get_str(sub[i]->op_ar,instream); -#else - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - sub[i]->ar=arstr(0,str); - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - sub[i]->read_ar=arstr(0,str); - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - sub[i]->post_ar=arstr(0,str); - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - sub[i]->op_ar=arstr(0,str); -#endif - get_int(sub[i]->misc,instream); - - -#ifdef SCFG - get_str(sub[i]->tagline,instream); -#else - fread(str,81,1,instream); /* substitute tagline */ - offset+=81; - if(str[0]) { - if((sub[i]->tagline=(char *)MALLOC(strlen(str)+1))==NULL) - allocerr(txt,offset,fname,strlen(str)+1); - strcpy(sub[i]->tagline,str); } - else - sub[i]->tagline=qnet_tagline; -#endif - -#ifdef SCFG - get_str(sub[i]->origline,instream); -#else - fread(str,1,51,instream); /* substitute origin line */ - offset+=51; - if(str[0]) { - if((sub[i]->origline=(char *)MALLOC(strlen(str)+1))==NULL) - allocerr(txt,offset,fname,strlen(str)+1); - strcpy(sub[i]->origline,str); } - else - sub[i]->origline=origline; -#endif - -#ifdef SCFG - get_str(sub[i]->echomail_sem,instream); -#else - fread(str,1,LEN_DIR+1,instream); /* substitute echomail semaphore */ - offset+=LEN_DIR+1; - if(str[0]) { - if((sub[i]->echomail_sem=(char *)MALLOC(strlen(str)+1))==NULL) - allocerr(txt,offset,fname,strlen(str)+1); - strcpy(sub[i]->echomail_sem,str); } - else - sub[i]->echomail_sem=echomail_sem; -#endif - fread(str,1,LEN_DIR+1,instream); /* substitute EchoMail path */ - offset+=LEN_DIR+1; -#ifndef SBBS - backslash(str); - strcpy(sub[i]->echopath,str); -#endif - get_int(sub[i]->faddr,instream); /* FidoNet address */ - - get_int(sub[i]->maxmsgs,instream); - get_int(sub[i]->maxcrcs,instream); - get_int(sub[i]->maxage,instream); - get_int(sub[i]->ptridx,instream); -#ifdef SBBS - for(j=0;j<i;j++) - if(sub[i]->ptridx==sub[j]->ptridx) { - lprintf(txt.error,offset,fname); - lprintf("Duplicate pointer index for subs #%d and #%d\r\n" - ,i+1,j+1); - bail(1); } -#endif - -#ifdef SCFG - get_str(sub[i]->mod_ar,instream); -#else - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - sub[i]->mod_ar=arstr(0,str); -#endif - get_int(sub[i]->qwkconf,instream); - get_int(c,instream); - for(j=0;j<26;j++) - get_int(n,instream); - } -total_subs=i; - -#ifdef SBBS -for(i=l=0;i<total_grps;i++) { - for(j=k=0;j<total_subs;j++) - if(sub[j]->grp==i) - k++; /* k = number of subs per grp[i] */ - if(k>l) l=k; } /* l = the largest number of subs per grp */ -if(l) - for(i=0;i<total_grps;i++) - if((usrsub[i]=(uint *)MALLOC(sizeof(uint)*l))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*l); - -if(sys_status&SS_INITIAL) { - fclose(instream); - lprintf(txt.readit,fname); - return; } -#endif - -/***********/ -/* FidoNet */ -/***********/ - -get_int(total_faddrs,instream); - -if(total_faddrs) { - if((faddr=(faddr_t *)MALLOC(sizeof(faddr_t)*total_faddrs))==NULL) - allocerr(txt,offset,fname,sizeof(faddr_t)*total_faddrs); } -else - faddr=NULL; - -for(i=0;i<total_faddrs;i++) - get_int(faddr[i],instream); - -get_str(origline,instream); -get_str(netmail_sem,instream); -get_str(echomail_sem,instream); -get_str(netmail_dir,instream); -get_str(echomail_dir,instream); -get_str(fidofile_dir,instream); -get_int(netmail_misc,instream); -get_int(netmail_cost,instream); -get_int(dflt_faddr,instream); -for(i=0;i<28;i++) - get_int(n,instream); - - -/**********/ -/* QWKnet */ -/**********/ - -get_str(qnet_tagline,instream); - -get_int(total_qhubs,instream); - -if(total_qhubs) { - if((qhub=(qhub_t **)MALLOC(sizeof(qhub_t *)*total_qhubs))==NULL) - allocerr(txt,offset,fname,sizeof(qhub_t*)*total_qhubs); } -else - qhub=NULL; - -for(i=0;i<total_qhubs;i++) { - if(feof(instream)) break; - if((qhub[i]=(qhub_t *)MALLOC(sizeof(qhub_t)))==NULL) - allocerr(txt,offset,fname,sizeof(qhub_t)); - memset(qhub[i],0,sizeof(qhub_t)); - - get_str(qhub[i]->id,instream); - get_int(qhub[i]->time,instream); - get_int(qhub[i]->freq,instream); - get_int(qhub[i]->days,instream); - get_int(qhub[i]->node,instream); - get_alloc(&offset,qhub[i]->call,LEN_CMD,instream); - get_alloc(&offset,qhub[i]->pack,LEN_CMD,instream); - get_alloc(&offset,qhub[i]->unpack,LEN_CMD,instream); - get_int(k,instream); - - if(k) { - if((qhub[i]->sub=(ushort *)MALLOC(sizeof(ushort)*k))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*k); - if((qhub[i]->conf=(ushort *)MALLOC(sizeof(ushort)*k))==NULL) - allocerr(txt,offset,fname,sizeof(ushort)*k); - if((qhub[i]->mode=(uchar *)MALLOC(sizeof(uchar)*k))==NULL) - allocerr(txt,offset,fname,sizeof(uchar)*k); } - - for(j=0;j<k;j++) { - if(feof(instream)) break; - get_int(qhub[i]->conf[qhub[i]->subs],instream); - get_int(qhub[i]->sub[qhub[i]->subs],instream); - get_int(qhub[i]->mode[qhub[i]->subs],instream); - if(qhub[i]->sub[qhub[i]->subs]<total_subs) - sub[qhub[i]->sub[qhub[i]->subs]]->misc|=SUB_QNET; - else - continue; - if(qhub[i]->sub[qhub[i]->subs]!=INVALID_SUB) - qhub[i]->subs++; } - for(j=0;j<32;j++) - get_int(n,instream); } - -total_qhubs=i; - -for(j=0;j<32;j++) - get_int(n,instream); - -/************/ -/* PostLink */ -/************/ - -fread(str,11,1,instream); /* Unused - used to be Site Name */ -offset+=11; -get_int(sys_psnum,instream); /* Site Number */ -get_int(total_phubs,instream); - -if(total_phubs) { - if((phub=(phub_t **)MALLOC(sizeof(phub_t *)*total_phubs))==NULL) - allocerr(txt,offset,fname,sizeof(phub_t*)*total_phubs); } -else - phub=NULL; - -for(i=0;i<total_phubs;i++) { - if(feof(instream)) break; - if((phub[i]=(phub_t *)MALLOC(sizeof(phub_t)))==NULL) - allocerr(txt,offset,fname,sizeof(phub_t)); - memset(phub[i],0,sizeof(phub_t)); -#ifdef SCFG - get_str(phub[i]->name,instream); -#else - fread(str,11,1,instream); - offset+=11; -#endif - get_int(phub[i]->time,instream); - get_int(phub[i]->freq,instream); - get_int(phub[i]->days,instream); - get_int(phub[i]->node,instream); - get_alloc(&offset,phub[i]->call,LEN_CMD,instream); - for(j=0;j<32;j++) - get_int(n,instream); } - -total_phubs=i; - -get_str(sys_psname,instream); /* Site Name */ - -for(j=0;j<32;j++) - get_int(n,instream); - -/* Internet */ - -get_str(sys_inetaddr,instream); /* Internet address */ -get_str(inetmail_sem,instream); -get_int(inetmail_misc,instream); -get_int(inetmail_cost,instream); - -fclose(instream); -lprintf(txt.readit,fname); -} - -#endif - diff --git a/src/sbbs2/scfglib2.c b/src/sbbs2/scfglib2.c deleted file mode 100644 index e7b638684d..0000000000 --- a/src/sbbs2/scfglib2.c +++ /dev/null @@ -1,1106 +0,0 @@ -#line 1 "SCFGLIB2.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "scfglib.h" - -#ifdef SCFG /* SCFG allocate max length */ - #define readline_alloc(l,s,m,i) readline(l,s,m,i) -#else - char *readline_alloc(long *offset, char *outstr, int maxline - , FILE *instream); - #define readline_alloc(l,s,m,i) s=readline_alloc(l,s,m,i) - #define get_alloc(o,s,l,i) s=get_alloc(o,s,l,i) -#endif - - -#ifndef NO_FILE_CFG - -/****************************************************************************/ -/* Reads in LIBS.CNF and initializes the associated variables */ -/****************************************************************************/ -void read_file_cfg(read_cfg_text_t txt) -{ - char str[256],fname[13],c,cmd[LEN_CMD+1]; - int file; - short i,j,k,l,n; - long offset=0,t; - FILE *instream; - -#ifndef SCFG - -sprintf(data_dir_dirs,"%sDIRS\\",data_dir); - -#endif - -strcpy(fname,"FILE.CNF"); -sprintf(str,"%s%s",ctrl_dir,fname); -if((instream=fnopen(&file,str,O_RDONLY))==NULL) { - lprintf(txt.openerr,str); - bail(1); } - -lprintf(txt.reading,fname); - -get_int(min_dspace,instream); -get_int(max_batup,instream); - -#ifdef SBBS -if(max_batup) { - if((batup_desc=(char **)MALLOC(sizeof(char *)*max_batup))==NULL) - allocerr(txt,offset,fname,sizeof(char *)*max_batup); - if((batup_name=(char **)MALLOC(sizeof(char *)*max_batup))==NULL) - allocerr(txt,offset,fname,sizeof(char *)*max_batup); - if((batup_misc=(char *)MALLOC(sizeof(char)*max_batup))==NULL) - allocerr(txt,offset,fname,sizeof(char)*max_batup); - if((batup_dir=(uint *)MALLOC(sizeof(uint)*max_batup))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*max_batup); - if((batup_alt=(ushort *)MALLOC(sizeof(ushort)*max_batup))==NULL) - allocerr(txt,offset,fname,sizeof(ushort)*max_batup); - for(i=0;i<max_batup;i++) { - if((batup_desc[i]=(char *)MALLOC(59))==NULL) - allocerr(txt,offset,fname,59); - if((batup_name[i]=(char *)MALLOC(13))==NULL) - allocerr(txt,offset,fname,13); } } -#endif -get_int(max_batdn,instream); - -#ifdef SBBS -if(max_batdn) { - if((batdn_name=(char **)MALLOC(sizeof(char *)*max_batdn))==NULL) - allocerr(txt,offset,fname,sizeof(char *)*max_batdn); - if((batdn_dir=(uint *)MALLOC(sizeof(uint)*max_batdn))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*max_batdn); - if((batdn_offset=(long *)MALLOC(sizeof(long)*max_batdn))==NULL) - allocerr(txt,offset,fname,sizeof(long)*max_batdn); - if((batdn_size=(ulong *)MALLOC(sizeof(ulong)*max_batdn))==NULL) - allocerr(txt,offset,fname,sizeof(ulong)*max_batdn); - if((batdn_cdt=(ulong *)MALLOC(sizeof(ulong)*max_batdn))==NULL) - allocerr(txt,offset,fname,sizeof(ulong)*max_batdn); - if((batdn_alt=(ushort *)MALLOC(sizeof(ushort)*max_batdn))==NULL) - allocerr(txt,offset,fname,sizeof(ushort)*max_batdn); - for(i=0;i<max_batdn;i++) - if((batdn_name[i]=(char *)MALLOC(13))==NULL) - allocerr(txt,offset,fname,13); } -#endif -get_int(max_userxfer,instream); - -get_int(t,instream); /* unused - was cdt_byte_value */ -get_int(cdt_up_pct,instream); -get_int(cdt_dn_pct,instream); -get_int(t,instream); /* unused - was temp_ext */ -get_str(cmd,instream); /* unused - was temp_cmd */ -get_int(leech_pct,instream); -get_int(leech_sec,instream); - -for(i=0;i<32;i++) - get_int(n,instream); - -/**************************/ -/* Extractable File Types */ -/**************************/ - -get_int(total_fextrs,instream); - -if(total_fextrs) { - if((fextr=(fextr_t **)MALLOC(sizeof(fextr_t *)*total_fextrs))==NULL) - allocerr(txt,offset,fname,sizeof(fextr_t*)*total_fextrs); } -else - fextr=NULL; - -for(i=0; i<total_fextrs; i++) { - if(feof(instream)) - break; - if((fextr[i]=(fextr_t *)MALLOC(sizeof(fextr_t)))==NULL) - allocerr(txt,offset,fname,sizeof(fextr_t)); - memset(fextr[i],0,sizeof(fextr_t)); - get_str(fextr[i]->ext,instream); - get_alloc(&offset,fextr[i]->cmd,LEN_CMD,instream); -#ifdef SCFG - get_str(fextr[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - fextr[i]->ar=arstr(0,str); -#endif - for(j=0;j<8;j++) - get_int(n,instream); - } -total_fextrs=i; - -/***************************/ -/* Compressable File Types */ -/***************************/ - -get_int(total_fcomps,instream); - -if(total_fcomps) { - if((fcomp=(fcomp_t **)MALLOC(sizeof(fcomp_t *)*total_fcomps))==NULL) - allocerr(txt,offset,fname,sizeof(fcomp_t*)*total_fcomps); } -else - fcomp=NULL; - -for(i=0; i<total_fcomps; i++) { - if(feof(instream)) - break; - if((fcomp[i]=(fcomp_t *)MALLOC(sizeof(fcomp_t)))==NULL) - allocerr(txt,offset,fname,sizeof(fcomp_t)); - memset(fcomp[i],0,sizeof(fcomp_t)); - get_str(fcomp[i]->ext,instream); - get_alloc(&offset,fcomp[i]->cmd,LEN_CMD,instream); -#ifdef SCFG - get_str(fcomp[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - fcomp[i]->ar=arstr(0,str); -#endif - for(j=0;j<8;j++) - get_int(n,instream); - } -total_fcomps=i; - -/***********************/ -/* Viewable File Types */ -/***********************/ - -get_int(total_fviews,instream); - -if(total_fviews) { - if((fview=(fview_t **)MALLOC(sizeof(fview_t *)*total_fviews))==NULL) - allocerr(txt,offset,fname,sizeof(fview_t*)*total_fviews); } -else - fview=NULL; - -for(i=0; i<total_fviews; i++) { - if(feof(instream)) break; - if((fview[i]=(fview_t *)MALLOC(sizeof(fview_t)))==NULL) - allocerr(txt,offset,fname,sizeof(fview_t)); - memset(fview[i],0,sizeof(fview_t)); - get_str(fview[i]->ext,instream); - get_alloc(&offset,fview[i]->cmd,LEN_CMD,instream); -#ifdef SCFG - get_str(fview[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - fview[i]->ar=arstr(0,str); -#endif - for(j=0;j<8;j++) - get_int(n,instream); - } -total_fviews=i; - -/***********************/ -/* Testable File Types */ -/***********************/ - -get_int(total_ftests,instream); - -if(total_ftests) { - if((ftest=(ftest_t **)MALLOC(sizeof(ftest_t *)*total_ftests))==NULL) - allocerr(txt,offset,fname,sizeof(ftest_t*)*total_ftests); } -else - ftest=NULL; - -for(i=0; i<total_ftests; i++) { - if(feof(instream)) break; - if((ftest[i]=(ftest_t *)MALLOC(sizeof(ftest_t)))==NULL) - allocerr(txt,offset,fname,sizeof(ftest_t)); - memset(ftest[i],0,sizeof(ftest_t)); - get_str(ftest[i]->ext,instream); - get_alloc(&offset,ftest[i]->cmd,LEN_CMD,instream); - get_alloc(&offset,ftest[i]->workstr,40,instream); -#ifdef SCFG - get_str(ftest[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - ftest[i]->ar=arstr(0,str); -#endif - for(j=0;j<8;j++) - get_int(n,instream); - } -total_ftests=i; - -/*******************/ -/* Download events */ -/*******************/ - -get_int(total_dlevents,instream); - -if(total_dlevents) { - if((dlevent=(dlevent_t **)MALLOC(sizeof(dlevent_t *)*total_dlevents)) - ==NULL) - allocerr(txt,offset,fname,sizeof(dlevent_t*)*total_dlevents); } -else - dlevent=NULL; - -for(i=0; i<total_dlevents; i++) { - if(feof(instream)) break; - if((dlevent[i]=(dlevent_t *)MALLOC(sizeof(dlevent_t)))==NULL) - allocerr(txt,offset,fname,sizeof(dlevent_t)); - memset(dlevent[i],0,sizeof(dlevent_t)); - get_str(dlevent[i]->ext,instream); - get_alloc(&offset,dlevent[i]->cmd,LEN_CMD,instream); - get_alloc(&offset,dlevent[i]->workstr,40,instream); -#ifdef SCFG - get_str(dlevent[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - dlevent[i]->ar=arstr(0,str); -#endif - for(j=0;j<8;j++) - get_int(n,instream); - } -total_dlevents=i; - - -/***************************/ -/* File Transfer Protocols */ -/***************************/ - -get_int(total_prots,instream); - -if(total_prots) { - if((prot=(prot_t **)MALLOC(sizeof(prot_t *)*total_prots))==NULL) - allocerr(txt,offset,fname,sizeof(prot_t*)*total_prots); } -else - prot=NULL; - -for(i=0;i<total_prots;i++) { - if(feof(instream)) break; - if((prot[i]=(prot_t *)MALLOC(sizeof(prot_t)))==NULL) - allocerr(txt,offset,fname,sizeof(prot_t)); - memset(prot[i],0,sizeof(prot_t)); - - get_int(prot[i]->mnemonic,instream); - get_alloc(&offset,prot[i]->name,25,instream); - get_alloc(&offset,prot[i]->ulcmd,LEN_CMD,instream); - get_alloc(&offset,prot[i]->dlcmd,LEN_CMD,instream); - get_alloc(&offset,prot[i]->batulcmd,LEN_CMD,instream); - get_alloc(&offset,prot[i]->batdlcmd,LEN_CMD,instream); - get_alloc(&offset,prot[i]->blindcmd,LEN_CMD,instream); - get_alloc(&offset,prot[i]->bicmd,LEN_CMD,instream); - get_int(prot[i]->misc,instream); -#ifdef SCFG - get_str(prot[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - prot[i]->ar=arstr(0,str); -#endif - for(j=0;j<8;j++) - get_int(n,instream); - } - -/************************/ -/* Alternate File Paths */ -/************************/ - -get_int(altpaths,instream); - -if(altpaths) { - if((altpath=(char **)MALLOC(sizeof(char *)*altpaths))==NULL) - allocerr(txt,offset,fname,sizeof(char *)*altpaths); } -else - altpath=NULL; - -for(i=0;i<altpaths;i++) { - if(feof(instream)) break; - fread(str,LEN_DIR+1,1,instream); - offset+=LEN_DIR+1; - backslash(str); -#ifdef SCFG - j=LEN_DIR+1; -#else - j=strlen(str)+1; -#endif - if((altpath[i]=(char *)MALLOC(j))==NULL) - allocerr(txt,offset,fname,j); - memset(altpath[i],0,j); - strcpy(altpath[i],str); - for(j=0;j<8;j++) - get_int(n,instream); - } - -altpaths=i; - -/******************/ -/* File Libraries */ -/******************/ - -get_int(total_libs,instream); - -if(total_libs) { - if((lib=(lib_t **)MALLOC(sizeof(lib_t *)*total_libs))==NULL) - allocerr(txt,offset,fname,sizeof(lib_t *)*total_libs); } -else - lib=NULL; - -#ifdef SBBS - -if(total_libs) { - if((curdir=(uint *)MALLOC(sizeof(uint)*total_libs))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*total_libs); - - if((usrlib=(uint *)MALLOC(sizeof(uint)*total_libs))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*total_libs); - - if((usrdirs=(uint *)MALLOC(sizeof(uint)*total_libs))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*total_libs); - - if((usrdir=(uint **)MALLOC(sizeof(uint *)*total_libs))==NULL) - allocerr(txt,offset,fname,sizeof(uint *)*total_libs); } - -#endif -for(i=0;i<total_libs;i++) { - if(feof(instream)) break; - if((lib[i]=(lib_t *)MALLOC(sizeof(lib_t)))==NULL) - allocerr(txt,offset,fname,sizeof(lib_t)); - memset(lib[i],0,sizeof(lib_t)); - lib[i]->offline_dir=INVALID_DIR; - - get_alloc(&offset,lib[i]->lname,LEN_GLNAME,instream); - get_alloc(&offset,lib[i]->sname,LEN_GSNAME,instream); - -#if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */ - if(!strcmp(lib[i]->lname,lib[i]->sname) && lib[i]->sname!=scfgnulstr) { - FREE(lib[i]->sname); - lib[i]->sname=lib[i]->lname; } -#endif - -#ifdef SCFG - get_str(lib[i]->ar,instream); -#else - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - lib[i]->ar=arstr(0,str); -#endif - for(j=0;j<48;j++) - get_int(n,instream); - } -total_libs=i; - -/********************/ -/* File Directories */ -/********************/ - -sysop_dir=user_dir=upload_dir=INVALID_DIR; -get_int(total_dirs,instream); - -if(total_dirs) { - if((dir=(dir_t **)MALLOC(sizeof(dir_t *)*(total_dirs+1)))==NULL) - allocerr(txt,offset,fname,sizeof(dir_t *)*(total_dirs+1)); } -else - dir=NULL; - -for(i=0;i<total_dirs;i++) { - if(feof(instream)) break; - if((dir[i]=(dir_t *)MALLOC(sizeof(dir_t)))==NULL) - allocerr(txt,offset,fname,sizeof(dir_t)); - memset(dir[i],0,sizeof(dir_t)); - - get_int(dir[i]->lib,instream); - get_alloc(&offset,dir[i]->lname,LEN_SLNAME,instream); - get_alloc(&offset,dir[i]->sname,LEN_SSNAME,instream); - -#if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */ - if(!strcmp(dir[i]->lname,dir[i]->sname) && dir[i]->sname!=scfgnulstr) { - FREE(dir[i]->sname); - dir[i]->sname=dir[i]->lname; } -#endif - - if(!strcmpi(dir[i]->sname,"SYSOP")) /* Sysop upload directory */ - sysop_dir=i; - else if(!strcmpi(dir[i]->sname,"USER")) /* User to User xfer dir */ - user_dir=i; - else if(!strcmpi(dir[i]->sname,"UPLOADS")) /* Upload directory */ - upload_dir=i; - else if(!strcmpi(dir[i]->sname,"OFFLINE")) /* Offline files dir */ - lib[dir[i]->lib]->offline_dir=i; - - get_str(dir[i]->code,instream); - -#ifdef SCFG - get_str(dir[i]->data_dir,instream); -#else - fread(str,LEN_DIR+1,1,instream); /* substitute data dir */ - offset+=LEN_DIR+1; - if(str[0]) { - backslash(str); - if((dir[i]->data_dir=(char *)MALLOC(strlen(str)+1))==NULL) - allocerr(txt,offset,fname,strlen(str)+1); - strcpy(dir[i]->data_dir,str); } - else - dir[i]->data_dir=data_dir_dirs; -#endif - -#ifdef SCFG - get_str(dir[i]->ar,instream); - get_str(dir[i]->ul_ar,instream); - get_str(dir[i]->dl_ar,instream); - get_str(dir[i]->op_ar,instream); -#else - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - dir[i]->ar=arstr(0,str); - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - dir[i]->ul_ar=arstr(0,str); - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - dir[i]->dl_ar=arstr(0,str); - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - dir[i]->op_ar=arstr(0,str); -#endif - fread(str,1,LEN_DIR+1,instream); - offset+=LEN_DIR+1; - if(!str[0]) /* no path specified */ - sprintf(str,"%sDIRS\\%s\\",data_dir,dir[i]->code); - -#ifndef SCFG - if((dir[i]->path=(char *)MALLOC(strlen(str)+1))==NULL) - allocerr(txt,offset,fname,strlen(str)+1); -#endif - strcpy(dir[i]->path,str); - get_alloc(&offset,dir[i]->upload_sem,LEN_DIR,instream); - get_int(dir[i]->maxfiles,instream); - if(dir[i]->maxfiles>MAX_FILES) - dir[i]->maxfiles=MAX_FILES; - get_alloc(&offset,dir[i]->exts,40,instream); - get_int(dir[i]->misc,instream); - get_int(dir[i]->seqdev,instream); - get_int(dir[i]->sort,instream); -#ifdef SCFG - get_str(dir[i]->ex_ar,instream); -#else - fread(str,1,LEN_ARSTR+1,instream); - offset+=LEN_ARSTR+1; - dir[i]->ex_ar=arstr(0,str); -#endif - get_int(dir[i]->maxage,instream); - get_int(dir[i]->up_pct,instream); - get_int(dir[i]->dn_pct,instream); - get_int(c,instream); - for(j=0;j<24;j++) - get_int(n,instream); } - -total_dirs=i; - -#ifndef NO_TEXT_CFG /* This must be the last section in CFG file */ - -/**********************/ -/* Text File Sections */ -/**********************/ - -get_int(total_txtsecs,instream); - - -if(total_txtsecs) { - if((txtsec=(txtsec_t **)MALLOC(sizeof(txtsec_t *)*total_txtsecs))==NULL) - allocerr(txt,offset,fname,sizeof(txtsec_t *)*total_txtsecs); } -else - txtsec=NULL; - -for(i=0;i<total_txtsecs;i++) { - if(feof(instream)) break; - if((txtsec[i]=(txtsec_t *)MALLOC(sizeof(txtsec_t)))==NULL) - allocerr(txt,offset,fname,sizeof(txtsec_t)); - memset(txtsec[i],0,sizeof(txtsec_t)); - - get_alloc(&offset,txtsec[i]->name,40,instream); - get_str(txtsec[i]->code,instream); -#ifdef SCFG - get_str(txtsec[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - txtsec[i]->ar=arstr(0,str); -#endif - for(j=0;j<8;j++) - get_int(n,instream); - } -total_txtsecs=i; - -#endif - -fclose(instream); -lprintf(txt.readit,fname); -#ifdef SBBS -for(i=l=0;i<total_libs;i++) { - for(j=k=0;j<total_dirs;j++) - if(dir[j]->lib==i) - k++; - if(k>l) l=k; } /* l = largest number of dirs in a lib */ -for(i=0;i<total_libs;i++) - if(l && (usrdir[i]=(uint *)MALLOC(sizeof(uint)*l))==NULL) - allocerr(txt,offset,fname,sizeof(uint)*l); -#endif -} - -#endif - - -#ifndef NO_XTRN_CFG - -/****************************************************************************/ -/* Reads in XTRN.CNF and initializes the associated variables */ -/****************************************************************************/ -void read_xtrn_cfg(read_cfg_text_t txt) -{ - char str[256],fname[13],*p,c; - int file; - short i,j,n; - long offset=0; - FILE *instream; - -strcpy(fname,"XTRN.CNF"); -sprintf(str,"%s%s",ctrl_dir,fname); -if((instream=fnopen(&file,str,O_RDONLY))==NULL) { - lprintf(txt.openerr,str); - bail(1); } - -lprintf(txt.reading,fname); - -/*************/ -/* Swap list */ -/*************/ - -get_int(total_swaps,instream); - -if(total_swaps) { - if((swap=(swap_t **)MALLOC(sizeof(swap_t *)*total_swaps))==NULL) - allocerr(txt,offset,fname,sizeof(swap_t *)*total_swaps); } -else - swap=NULL; - -for(i=0;i<total_swaps;i++) { - if(feof(instream)) break; - if((swap[i]=(swap_t *)MALLOC(sizeof(swap_t)))==NULL) - allocerr(txt,offset,fname,sizeof(swap_t)); - get_alloc(&offset,swap[i]->cmd,LEN_CMD,instream); } -total_swaps=i; - -/********************/ -/* External Editors */ -/********************/ - -get_int(total_xedits,instream); - -if(total_xedits) { - if((xedit=(xedit_t **)MALLOC(sizeof(xedit_t *)*total_xedits))==NULL) - allocerr(txt,offset,fname,sizeof(xedit_t *)*total_xedits); } -else - xedit=NULL; - -for(i=0;i<total_xedits;i++) { - if(feof(instream)) break; - if((xedit[i]=(xedit_t *)MALLOC(sizeof(xedit_t)))==NULL) - allocerr(txt,offset,fname,sizeof(xedit_t)); - memset(xedit[i],0,sizeof(xedit_t)); - - get_alloc(&offset,xedit[i]->name,40,instream); - get_str(xedit[i]->code,instream); - get_alloc(&offset,xedit[i]->lcmd,LEN_CMD,instream); - get_alloc(&offset,xedit[i]->rcmd,LEN_CMD,instream); - -#if !defined(SCFG) && defined(SAVE_MEMORY) /* Save memory */ - if(!strcmp(xedit[i]->lcmd,xedit[i]->rcmd) && xedit[i]->rcmd!=scfgnulstr) { - FREE(xedit[i]->rcmd); - xedit[i]->rcmd=xedit[i]->lcmd; } -#endif - - get_int(xedit[i]->misc,instream); -#ifdef SCFG - get_str(xedit[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - xedit[i]->ar=arstr(0,str); -#endif - get_int(xedit[i]->type,instream); - get_int(c,instream); - for(j=0;j<7;j++) - get_int(n,instream); - } -total_xedits=i; - - -/*****************************/ -/* External Program Sections */ -/*****************************/ - -get_int(total_xtrnsecs,instream); - -if(total_xtrnsecs) { - if((xtrnsec=(xtrnsec_t **)MALLOC(sizeof(xtrnsec_t *)*total_xtrnsecs)) - ==NULL) - allocerr(txt,offset,fname,sizeof(xtrnsec_t *)*total_xtrnsecs); } -else - xtrnsec=NULL; - -for(i=0;i<total_xtrnsecs;i++) { - if(feof(instream)) break; - if((xtrnsec[i]=(xtrnsec_t *)MALLOC(sizeof(xtrnsec_t)))==NULL) - allocerr(txt,offset,fname,sizeof(xtrnsec_t)); - memset(xtrnsec[i],0,sizeof(xtrnsec_t)); - - get_alloc(&offset,xtrnsec[i]->name,40,instream); - get_str(xtrnsec[i]->code,instream); -#ifdef SCFG - get_str(xtrnsec[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - xtrnsec[i]->ar=arstr(0,str); -#endif - for(j=0;j<8;j++) - get_int(n,instream); - } -total_xtrnsecs=i; - - -/*********************/ -/* External Programs */ -/*********************/ - -get_int(total_xtrns,instream); - -if(total_xtrns) { - if((xtrn=(xtrn_t **)MALLOC(sizeof(xtrn_t *)*total_xtrns))==NULL) - allocerr(txt,offset,fname,sizeof(xtrn_t *)*total_xtrns); } -else - xtrn=NULL; - -for(i=0;i<total_xtrns;i++) { - if(feof(instream)) break; - if((xtrn[i]=(xtrn_t *)MALLOC(sizeof(xtrn_t)))==NULL) - allocerr(txt,offset,fname,sizeof(xtrn_t)); - memset(xtrn[i],0,sizeof(xtrn_t)); - - get_int(xtrn[i]->sec,instream); - get_alloc(&offset,xtrn[i]->name,40,instream); - get_str(xtrn[i]->code,instream); -#ifdef SCFG - get_str(xtrn[i]->ar,instream); - get_str(xtrn[i]->run_ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - xtrn[i]->ar=arstr(0,str); - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - xtrn[i]->run_ar=arstr(0,str); -#endif - get_int(xtrn[i]->type,instream); - get_int(xtrn[i]->misc,instream); - get_int(xtrn[i]->event,instream); - get_int(xtrn[i]->cost,instream); - get_alloc(&offset,xtrn[i]->cmd,LEN_CMD,instream); - get_alloc(&offset,xtrn[i]->clean,LEN_CMD,instream); - fread(str,LEN_DIR+1,1,instream); - offset+=LEN_DIR+1; - if(strcmp(str+1,":\\") && str[strlen(str)-1]=='\\') // C:\ is valid - str[strlen(str)-1]=0; // C:\SBBS\XTRN\GAME\ is not -#ifdef SBBS - if(!str[0]) /* Minimum path of '.' */ - strcpy(str,"."); - if((xtrn[i]->path=(char *)MALLOC(strlen(str)+1))==NULL) - allocerr(txt,offset,fname,strlen(str)+1); -#endif - strcpy(xtrn[i]->path,str); - get_int(xtrn[i]->textra,instream); - get_int(xtrn[i]->maxtime,instream); - for(j=0;j<7;j++) - get_int(n,instream); - } -total_xtrns=i; - - -/****************/ -/* Timed Events */ -/****************/ - -get_int(total_events,instream); - -if(total_events) { - if((event=(event_t **)MALLOC(sizeof(event_t *)*total_events))==NULL) - allocerr(txt,offset,fname,sizeof(event_t *)*total_events); } -else - event=NULL; - -for(i=0;i<total_events;i++) { - if(feof(instream)) break; - if((event[i]=(event_t *)MALLOC(sizeof(event_t)))==NULL) - allocerr(txt,offset,fname,sizeof(event_t)); - memset(event[i],0,sizeof(event_t)); - - get_str(event[i]->code,instream); - get_alloc(&offset,event[i]->cmd,LEN_CMD,instream); - get_int(event[i]->days,instream); - get_int(event[i]->time,instream); - get_int(event[i]->node,instream); - get_int(event[i]->misc,instream); - get_alloc(&offset,event[i]->dir,LEN_DIR,instream); - if(event[i]->dir[0] // blank is valid - && strcmp(event[i]->dir+1,":\\") // C:\ is valid - && event[i]->dir[strlen(event[i]->dir)-1]=='\\') // C:\DIR\ !valid - event[i]->dir[strlen(event[i]->dir)-1]=0; // Remove \ - for(j=0;j<8;j++) - get_int(n,instream); - } -total_events=i; - -#if defined(SCFG) || defined(__OS2__) - -/********************/ -/* DOS Program list */ -/********************/ - -get_int(total_os2pgms,instream); - -if(total_os2pgms) { - if((os2pgm=(os2pgm_t **)MALLOC(sizeof(os2pgm_t *)*total_os2pgms))==NULL) - allocerr(txt,offset,fname,sizeof(os2pgm_t *)*total_os2pgms); } -else - os2pgm=NULL; - -for(i=0;i<total_os2pgms;i++) { - if(feof(instream)) break; - if((os2pgm[i]=(os2pgm_t *)MALLOC(sizeof(os2pgm_t)))==NULL) - allocerr(txt,offset,fname,sizeof(os2pgm_t)); - get_alloc(&offset,os2pgm[i]->name,12,instream); - os2pgm[i]->misc=0; } -total_os2pgms=i; -for(i=0;i<total_os2pgms;i++) { - if(feof(instream)) break; - get_int(os2pgm[i]->misc,instream); } - -#endif // Don't add anything non-OS2 specific after this (without moding ^^ ) - - -fclose(instream); -lprintf(txt.readit,fname); -} - -#endif - - -#ifndef NO_CHAT_CFG - -/****************************************************************************/ -/* Reads in CHAT.CNF and initializes the associated variables */ -/****************************************************************************/ -void read_chat_cfg(read_cfg_text_t txt) -{ - char str[256],fname[13],*p; - int file; - short i,j,n; - long offset=0; - FILE *instream; - -strcpy(fname,"CHAT.CNF"); -sprintf(str,"%s%s",ctrl_dir,fname); -if((instream=fnopen(&file,str,O_RDONLY))==NULL) { - lprintf(txt.openerr,str); - bail(1); } - -lprintf(txt.reading,fname); - -/*********/ -/* Gurus */ -/*********/ - -get_int(total_gurus,instream); - -if(total_gurus) { - if((guru=(guru_t **)MALLOC(sizeof(guru_t *)*total_gurus))==NULL) - allocerr(txt,offset,fname,sizeof(guru_t *)*total_gurus); } -else - guru=NULL; - -for(i=0;i<total_gurus;i++) { - if(feof(instream)) break; - if((guru[i]=(guru_t *)MALLOC(sizeof(guru_t)))==NULL) - allocerr(txt,offset,fname,sizeof(guru_t)); - memset(guru[i],0,sizeof(guru_t)); - - get_alloc(&offset,guru[i]->name,25,instream); - get_str(guru[i]->code,instream); - -#ifdef SCFG - get_str(guru[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - guru[i]->ar=arstr(0,str); -#endif - for(j=0;j<8;j++) - get_int(n,instream); - } -total_chans=i; - - -/********************/ -/* Chat Action Sets */ -/********************/ - -get_int(total_actsets,instream); - -if(total_actsets) { - if((actset=(actset_t **)MALLOC(sizeof(actset_t *)*total_actsets))==NULL) - allocerr(txt,offset,fname,sizeof(actset_t *)*total_actsets); } -else - actset=NULL; - -for(i=0;i<total_actsets;i++) { - if(feof(instream)) break; - if((actset[i]=(actset_t *)MALLOC(sizeof(actset_t)))==NULL) - allocerr(txt,offset,fname,sizeof(actset_t)); - get_alloc(&offset,actset[i]->name,25,instream); - } -total_actsets=i; - - -/****************/ -/* Chat Actions */ -/****************/ - -get_int(total_chatacts,instream); - -if(total_chatacts) { - if((chatact=(chatact_t **)MALLOC(sizeof(chatact_t *)*total_chatacts)) - ==NULL) - allocerr(txt,offset,fname,sizeof(chatact_t *)*total_chatacts); } -else - chatact=NULL; - -for(i=0;i<total_chatacts;i++) { - if(feof(instream)) break; - if((chatact[i]=(chatact_t *)MALLOC(sizeof(chatact_t)))==NULL) - allocerr(txt,offset,fname,sizeof(chatact_t)); - memset(chatact[i],0,sizeof(chatact_t)); - - get_int(chatact[i]->actset,instream); - get_alloc(&offset,chatact[i]->cmd,LEN_CHATACTCMD,instream); - get_alloc(&offset,chatact[i]->out,LEN_CHATACTOUT,instream); - for(j=0;j<8;j++) - get_int(n,instream); - } - -total_chatacts=i; - - -/***************************/ -/* Multinode Chat Channels */ -/***************************/ - -get_int(total_chans,instream); - -if(total_chans) { - if((chan=(chan_t **)MALLOC(sizeof(chan_t *)*total_chans))==NULL) - allocerr(txt,offset,fname,sizeof(chan_t *)*total_chans); } -else - chan=NULL; - -for(i=0;i<total_chans;i++) { - if(feof(instream)) break; - if((chan[i]=(chan_t *)MALLOC(sizeof(chan_t)))==NULL) - allocerr(txt,offset,fname,sizeof(chan_t)); - memset(chan[i],0,sizeof(chan_t)); - - get_int(chan[i]->actset,instream); - get_alloc(&offset,chan[i]->name,25,instream); - - get_str(chan[i]->code,instream); - -#ifdef SCFG - get_str(chan[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - chan[i]->ar=arstr(0,str); -#endif - get_int(chan[i]->cost,instream); - get_int(chan[i]->guru,instream); - get_int(chan[i]->misc,instream); - for(j=0;j<8;j++) - get_int(n,instream); } -total_chans=i; - - -/**************/ -/* Chat Pages */ -/**************/ - -get_int(total_pages,instream); - -if(total_pages) { - if((page=(page_t **)MALLOC(sizeof(page_t *)*total_pages))==NULL) - allocerr(txt,offset,fname,sizeof(page_t *)*total_pages); } -else - page=NULL; - -for(i=0;i<total_pages;i++) { - if(feof(instream)) break; - if((page[i]=(page_t *)MALLOC(sizeof(page_t)))==NULL) - allocerr(txt,offset,fname,sizeof(page_t)); - memset(page[i],0,sizeof(page_t)); - - get_alloc(&offset,page[i]->cmd,LEN_CMD,instream); - -#ifdef SCFG - get_str(page[i]->ar,instream); -#else - fread(str,LEN_ARSTR+1,1,instream); - offset+=LEN_ARSTR+1; - page[i]->ar=arstr(0,str); -#endif - get_int(page[i]->misc,instream); - for(j=0;j<8;j++) - get_int(n,instream); - } -total_pages=i; - - -fclose(instream); -lprintf(txt.readit,fname); -} - -#endif - -/****************************************************************************/ -/* Read one line of up two 256 characters from the file pointed to by */ -/* 'stream' and put upto 'maxlen' number of character into 'outstr' and */ -/* truncate spaces off end of 'outstr'. */ -/****************************************************************************/ -char *readline(long *offset, char *outstr, int maxlen, FILE *instream) -{ - char str[257]; - -if(fgets(str,256,instream)==NULL) - return(NULL); -sprintf(outstr,"%.*s",maxlen,str); -truncsp(outstr); -(*offset)+=maxlen; -return(outstr); -} - -#undef readline_alloc - -char *readline_alloc(long *offset, char *outstr, int maxline, FILE *instream) -{ - char str[257]; - -readline(offset,str,maxline,instream); -if((outstr=(char *)MALLOC(strlen(str)+1))==NULL) - return(NULL); -strcpy(outstr,str); -return(outstr); -} - -/****************************************************************************/ -/* Turns char string of flags into a long */ -/****************************************************************************/ -long aftol(char *str) -{ - char c=0; - ulong l=0UL; - -strupr(str); -while(str[c]) { - if(str[c]>='A' && str[c]<='Z') - l|=FLAG(str[c]); - c++; } -return(l); -} - -/*****************************************************************************/ -/* Converts a long into an ASCII Flag string (A-Z) that represents bits 0-25 */ -/*****************************************************************************/ -char *ltoaf(long l,char *str) -{ - char c=0; - -while(c<26) { - if(l&(long)(1L<<c)) - str[c]='A'+c; - else str[c]=SP; - c++; } -str[c]=0; -return(str); -} - -/****************************************************************************/ -/* Returns the actual attribute code from a string of ATTR characters */ -/****************************************************************************/ -int attrstr(char *str) -{ - ulong l=0; - short atr; - -atr=LIGHTGRAY; -while(str[l]) { - switch(str[l]) { - case 'H': /* High intensity */ - atr|=HIGH; - break; - case 'I': /* Blink */ - atr|=BLINK; - break; - case 'K': /* Black */ - atr=(atr&0xf8)|BLACK; - break; - case 'W': /* White */ - atr=(atr&0xf8)|LIGHTGRAY; - break; - case '0': /* Black Background */ - atr=(atr&0x8f)|(BLACK<<4); - break; - case '7': /* White Background */ - atr=(atr&0x8f)|(LIGHTGRAY<<4); - break; - case 'R': - atr=(atr&0xf8)|RED; - break; - case 'G': - atr=(atr&0xf8)|GREEN; - break; - case 'Y': /* Yellow */ - atr=(atr&0xf8)|BROWN; - break; - case 'B': - atr=(atr&0xf8)|BLUE; - break; - case 'M': - atr=(atr&0xf8)|MAGENTA; - break; - case 'C': - atr=(atr&0xf8)|CYAN; - break; - case '1': /* Red Background */ - atr=(atr&0x8f)|(RED<<4); - break; - case '2': /* Green Background */ - atr=(atr&0x8f)|(GREEN<<4); - break; - case '3': /* Yellow Background */ - atr=(atr&0x8f)|(BROWN<<4); - break; - case '4': /* Blue Background */ - atr=(atr&0x8f)|(BLUE<<4); - break; - case '5': /* Magenta Background */ - atr=(atr&0x8f)|(MAGENTA<<4); - break; - case '6': /* Cyan Background */ - atr=(atr&0x8f)|(CYAN<<4); - break; } - l++; } -return(atr); -} - - diff --git a/src/sbbs2/scfgvars.c b/src/sbbs2/scfgvars.c deleted file mode 100644 index d637844daf..0000000000 --- a/src/sbbs2/scfgvars.c +++ /dev/null @@ -1,264 +0,0 @@ -/* SCFGVARS.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/**********************************************************************/ -/* External (Global/Public) Variables for use with both SBBS and SCFG */ -/**********************************************************************/ - -#ifndef GLOBAL -#define GLOBAL - char *scfgnulstr=""; -#else -extern char *scfgnulstr; -#endif - -#include "sbbsdefs.h" - -GLOBAL grp_t **grp; /* Each message group */ -GLOBAL ushort total_grps; /* Total number of groups */ -GLOBAL sub_t **sub; /* Each message sub */ -GLOBAL ushort total_subs; /* Total number of subs */ -GLOBAL lib_t **lib; /* Each library */ -GLOBAL ushort total_libs; /* Total number of libraries */ -GLOBAL dir_t **dir; /* Each message directory */ -GLOBAL ushort total_dirs; /* Total number of directories */ -GLOBAL txtsec_t **txtsec; /* Each text section */ -GLOBAL ushort total_txtsecs; /* Total number of text sections */ -GLOBAL xtrnsec_t **xtrnsec; /* Each external section */ -GLOBAL ushort total_xtrnsecs; /* Total number of external sections */ -GLOBAL xtrn_t **xtrn; /* Each external program */ -GLOBAL ushort total_xtrns; /* Total number of externals */ -GLOBAL mdm_result_t *mdm_result; /* Each Modem Result Code */ -GLOBAL ushort mdm_results; /* Total number of Modem Results */ -GLOBAL prot_t **prot; /* Each Transfer Protocol */ -GLOBAL ushort total_prots; /* Total Transfer Protocols */ -GLOBAL fextr_t **fextr; /* Each extractable file type */ -GLOBAL ushort total_fextrs; /* Total extractable file types */ -GLOBAL fcomp_t **fcomp; /* Each compressable file type */ -GLOBAL ushort total_fcomps; /* Total */ -GLOBAL fview_t **fview; /* Each veiwable file type */ -GLOBAL ushort total_fviews; /* Total viewable file types */ -GLOBAL ftest_t **ftest; /* Each testable file type */ -GLOBAL ushort total_ftests; /* Total testable file types */ -GLOBAL xedit_t **xedit; /* Each external editor */ -GLOBAL ushort total_xedits; /* Total external editors */ -GLOBAL qhub_t **qhub; /* QWK network hubs */ -GLOBAL ushort total_qhubs; /* Total qwk network hubs */ -GLOBAL phub_t **phub; /* PostLink/PCRelay network hubs */ -GLOBAL ushort total_phubs; /* Total PostLink/PCRelay hubs */ -GLOBAL chan_t **chan; /* Each chat channel */ -GLOBAL ushort total_chans; /* Total number of chat channels */ -GLOBAL chatact_t **chatact; /* Chat action commands */ -GLOBAL ushort total_chatacts; /* Total number of action commands */ -GLOBAL actset_t **actset; /* Name of action set */ -GLOBAL ushort total_actsets; /* Total number of action sets */ -GLOBAL page_t **page; /* External chat page */ -GLOBAL ushort total_pages; /* Total number of external pages */ -GLOBAL event_t **event; /* Timed events */ -GLOBAL ushort total_events; /* Total number of timed events */ -GLOBAL dlevent_t **dlevent; /* Download events */ -GLOBAL ushort total_dlevents; /* Total download events */ -GLOBAL faddr_t *faddr; /* FidoNet addresses */ -GLOBAL ushort total_faddrs; /* Total number of fido addresses */ -GLOBAL swap_t **swap; /* Swapping externals */ -GLOBAL ushort total_swaps; /* Total number of non-swap xtrns */ -GLOBAL os2pgm_t **os2pgm; /* DOS Programs */ -GLOBAL ushort total_os2pgms; /* Total number of DOS pgms */ -GLOBAL guru_t **guru; /* Gurus */ -GLOBAL ushort total_gurus; /* Total number of guru files */ -GLOBAL shell_t **shell; /* Command shells */ -GLOBAL ushort total_shells; /* Total number of command shells */ - - /* COM port registers: */ -GLOBAL ushort com_base, /* COM base address */ - com_irq; /* irq line number */ -GLOBAL ulong com_rate; /* DTE rate in bps */ -GLOBAL char com_port; /* Number of COM port */ - - /* Modem command strings */ -GLOBAL char mdm_init[64], /* Initialization */ - mdm_spec[64], /* Special Initialization */ - mdm_term[64], /* Terminal Initialization String */ - mdm_dial[64], /* Dial */ - mdm_offh[64], /* Off hook */ - mdm_answ[64], /* Answer */ - mdm_hang[64]; /* Hang-up */ -GLOBAL ulong mdm_misc; /* Misc bits used for flags */ -GLOBAL ushort mdm_reinit; /* Modem reinitialization minute count */ -GLOBAL ushort mdm_ansdelay; /* Modem seconds to delay after answer */ -GLOBAL uchar mdm_rings; /* Rings to wait till answer */ - -GLOBAL long sys_misc; /* System Misc Settings */ -GLOBAL char sys_pass[41]; /* System Pass Word */ -GLOBAL char sys_name[41]; /* System Name */ -GLOBAL char sys_id[9]; /* System ID for QWK Packets */ -GLOBAL char sys_psname[13]; /* PostLink and PCRelay Site Name */ -GLOBAL ulong sys_psnum; /* PostLink and PCRelay Site Number */ -GLOBAL char sys_inetaddr[128]; /* System's internet address */ -GLOBAL char sys_location[41]; /* System Location */ -GLOBAL short sys_timezone; /* Time Zone of BBS */ -GLOBAL char sys_daily[LEN_CMD+1]; /* Daily event */ -GLOBAL char sys_logon[LEN_CMD+1]; /* Logon event */ -GLOBAL char sys_logout[LEN_CMD+1]; /* Logoff event */ -GLOBAL ushort sys_pwdays; /* Max days between password change */ -GLOBAL ushort sys_deldays; /* Days to keep deleted users */ -GLOBAL ushort sys_autodel; /* Autodeletion after x days inactive */ -GLOBAL ushort sys_nodes; /* Number of local nodes on system */ -GLOBAL char sys_op[41]; /* Name of system operator */ -GLOBAL char sys_guru[41]; /* Name of system guru */ -GLOBAL uchar sys_exp_warn; /* Days left till expire to notify */ -GLOBAL char sys_def_stat; /* Default status line */ -GLOBAL char sys_phonefmt[LEN_PHONE+1]; /* format of phone numbers */ -GLOBAL ushort sys_lastnode; /* Last displayable node number */ -GLOBAL ushort sys_autonode; /* First node number for autonode */ -#ifdef SCFG -GLOBAL uchar sys_chat_ar[LEN_ARSTR+1]; /* chat override */ -#else -GLOBAL uchar *sys_chat_ar; -#endif - -GLOBAL uchar node_comspec[LEN_CMD+1]; /* DOS COMMAND.COM to use */ -GLOBAL uchar node_editor[LEN_CMD+1]; /* Local text editor command line to use */ -GLOBAL uchar node_viewer[LEN_CMD+1]; /* Local text viewer command line */ -GLOBAL uchar node_daily[LEN_CMD+1]; /* Name of node's daily event */ -GLOBAL uchar node_scrnlen; /* Length of screen (rows) */ -GLOBAL uchar node_scrnblank; /* Min of inactivity for blank screen */ -GLOBAL ulong node_misc; /* Misc bits for node setup */ -GLOBAL ushort node_valuser; /* User validation mail goes to */ -GLOBAL ushort node_ivt; /* Time-slice APIs */ -GLOBAL uchar node_swap; /* Swap types allowed */ -GLOBAL uchar node_swapdir[LEN_DIR+1]; /* Swap directory */ -GLOBAL ushort node_minbps; /* Minimum connect rate of this node */ -GLOBAL ushort node_num; /* Local node number of this node */ -GLOBAL uchar node_phone[13], /* Phone number of this node */ - node_name[41]; /* Name of this node */ -#ifdef SCFG -GLOBAL uchar node_ar[LEN_ARSTR+1]; /* Node minimum requirements */ -#else -GLOBAL uchar *node_ar; -#endif -GLOBAL ulong node_cost; /* Node cost to call - in credits */ -GLOBAL uchar node_dollars_per_call; /* Billing Node Dollars Per Call */ -GLOBAL ushort node_sem_check; /* Seconds between semaphore checks */ -GLOBAL ushort node_stat_check; /* Seconds between statistic checks */ - -GLOBAL char new_pass[41]; /* New User Password */ -GLOBAL char new_magic[21]; /* New User Magic Word */ -GLOBAL char new_sif[9]; /* New User SIF Questionaire */ -GLOBAL char new_sof[9]; /* New User SIF Questionaire output SIF */ -GLOBAL char new_level; /* New User Main Level */ -GLOBAL ulong new_flags1; /* New User Main Flags from set #1*/ -GLOBAL ulong new_flags2; /* New User Main Flags from set #2*/ -GLOBAL ulong new_flags3; /* New User Main Flags from set #3*/ -GLOBAL ulong new_flags4; /* New User Main Flags from set #4*/ -GLOBAL ulong new_exempt; /* New User Exemptions */ -GLOBAL ulong new_rest; /* New User Restrictions */ -GLOBAL ulong new_cdt; /* New User Credits */ -GLOBAL ulong new_min; /* New User Minutes */ -GLOBAL uchar new_xedit[9]; /* New User Default Editor */ -GLOBAL ushort new_shell; /* New User Default Command Set */ -GLOBAL ulong new_misc; /* New User Miscellaneous Defaults */ -GLOBAL ushort new_expire; /* Expiration days for new user */ -GLOBAL uchar new_prot; /* New User Default Download Protocol */ -GLOBAL char val_level[10]; /* Validation User Main Level */ -GLOBAL ulong val_flags1[10]; /* Validation User Flags from set #1*/ -GLOBAL ulong val_flags2[10]; /* Validation User Flags from set #2*/ -GLOBAL ulong val_flags3[10]; /* Validation User Flags from set #3*/ -GLOBAL ulong val_flags4[10]; /* Validation User Flags from set #4*/ -GLOBAL ulong val_exempt[10]; /* Validation User Exemption Flags */ -GLOBAL ulong val_rest[10]; /* Validation User Restriction Flags */ -GLOBAL ulong val_cdt[10]; /* Validation User Additional Credits */ -GLOBAL ushort val_expire[10]; /* Validation User Extend Expire #days */ -GLOBAL uchar level_expireto[100]; -GLOBAL ushort level_timepercall[100], /* Security level settings */ - level_timeperday[100], - level_callsperday[100], - level_linespermsg[100], - level_postsperday[100], - level_emailperday[100]; -GLOBAL long level_freecdtperday[100]; -GLOBAL long level_misc[100]; -GLOBAL char expired_level; /* Expired user's ML */ -GLOBAL ulong expired_flags1; /* Flags from set #1 to remove when expired */ -GLOBAL ulong expired_flags2; /* Flags from set #2 to remove when expired */ -GLOBAL ulong expired_flags3; /* Flags from set #3 to remove when expired */ -GLOBAL ulong expired_flags4; /* Flags from set #4 to remove when expired */ -GLOBAL ulong expired_exempt; /* Exemptions to remove when expired */ -GLOBAL ulong expired_rest; /* Restrictions to add when expired */ -GLOBAL ushort min_dspace; /* Minimum amount of free space for uploads */ -GLOBAL ushort max_batup; /* Max number of files in upload queue */ -GLOBAL ushort max_batdn; /* Max number of files in download queue */ -GLOBAL ushort max_userxfer; /* Max dest. users of user to user xfer */ -GLOBAL ulong max_minutes; /* Maximum minutes a user can have */ -GLOBAL ulong max_qwkmsgs; /* Maximum messages per QWK packet */ -#ifdef SCFG -GLOBAL uchar preqwk_ar[LEN_ARSTR+1]; /* pre pack QWK */ -#else -GLOBAL uchar *preqwk_ar; -#endif -GLOBAL ushort cdt_min_value; /* Minutes per 100k credits */ -GLOBAL ulong cdt_per_dollar; /* Credits per dollar */ -GLOBAL ushort cdt_up_pct; /* Pct of credits credited on uploads */ -GLOBAL ushort cdt_dn_pct; /* Pct of credits credited per download */ -GLOBAL char node_dir[LEN_DIR+1]; -GLOBAL char ctrl_dir[LEN_DIR+1]; -GLOBAL char data_dir[LEN_DIR+1]; -GLOBAL char text_dir[LEN_DIR+1]; -GLOBAL char exec_dir[LEN_DIR+1]; -GLOBAL char temp_dir[LEN_DIR+1]; -GLOBAL char **node_path; /* paths to all node dirs */ -GLOBAL ushort sysop_dir; /* Destination for uploads to sysop */ -GLOBAL ushort user_dir; /* Directory for user to user xfers */ -GLOBAL ushort upload_dir; /* Directory where all uploads go */ -GLOBAL char **altpath; /* Alternate paths for files */ -GLOBAL ushort altpaths; /* Total number of alternate paths */ -GLOBAL ushort leech_pct; /* Leech detection percentage */ -GLOBAL ushort leech_sec; /* Minimum seconds before possible leech */ -GLOBAL ulong netmail_cost; /* Cost in credits to send netmail */ -GLOBAL char netmail_dir[LEN_DIR+1]; /* Directory to store netmail */ -GLOBAL ushort netmail_misc; /* Miscellaneous bits regarding netmail */ -GLOBAL ulong inetmail_misc; /* Miscellaneous bits regarding inetmail */ -GLOBAL ulong inetmail_cost; /* Cost in credits to send Internet mail */ -GLOBAL uchar inetmail_sem[LEN_DIR+1]; /* Internet Mail semaphore file */ -GLOBAL char echomail_dir[LEN_DIR+1]; /* Directory to store echomail in */ -GLOBAL char fidofile_dir[LEN_DIR+1]; /* Directory where inbound files go */ -GLOBAL char netmail_sem[LEN_DIR+1]; /* FidoNet NetMail semaphore */ -GLOBAL char echomail_sem[LEN_DIR+1]; /* FidoNet EchoMail semaphore */ -GLOBAL char origline[51]; /* Default EchoMail origin line */ -GLOBAL char qnet_tagline[128]; /* Default QWK Network tagline */ -GLOBAL long uq; /* User Questions */ -GLOBAL ulong mail_maxcrcs; /* Dupe checking in e-mail */ -GLOBAL ushort mail_maxage; /* Maximum age of e-mail */ -GLOBAL faddr_t dflt_faddr; /* Default FidoNet address */ -GLOBAL uchar logon_mod[9]; /* Logon module */ -GLOBAL uchar logoff_mod[9]; /* Logoff module */ -GLOBAL uchar newuser_mod[9]; /* New User Module */ -GLOBAL uchar login_mod[9]; /* Login module */ -GLOBAL uchar logout_mod[9]; /* Logout module */ -GLOBAL uchar sync_mod[9]; /* Synchronization module */ -GLOBAL uchar expire_mod[9]; /* User expiration module */ -GLOBAL uchar scfg_cmd[LEN_CMD+1]; /* SCFG command line */ -GLOBAL uchar smb_retry_time; /* Seconds to retry on SMBs */ -GLOBAL ushort sec_warn; /* Seconds before inactivity warning */ -GLOBAL ushort sec_hangup; /* Seconds before inactivity hang-up */ - -#ifndef SCFG - -GLOBAL uchar data_dir_subs[128]; /* DATA\SUBS directory */ -GLOBAL uchar data_dir_dirs[128]; /* DATA\DIRS directory */ - -#endif - -#ifdef SCFG - -GLOBAL char wfc_cmd[10][LEN_CMD+1]; /* 0-9 WFC DOS commands */ -GLOBAL char wfc_scmd[12][LEN_CMD+1]; /* F1-F12 WFC shrinking DOS commands */ - -#else - -GLOBAL char *wfc_cmd[10]; /* 0-9 WFC DOS commands */ -GLOBAL char *wfc_scmd[12]; /* F1-F12 WFC shrinking DOS commands */ - -#endif - diff --git a/src/sbbs2/slog/make.bat b/src/sbbs2/slog/make.bat deleted file mode 100755 index 0d8ba2a2b7..0000000000 --- a/src/sbbs2/slog/make.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -w-pro -I.. -ml -ndos slog.c diff --git a/src/sbbs2/slog/make.cmd b/src/sbbs2/slog/make.cmd deleted file mode 100755 index e223e5c79c..0000000000 --- a/src/sbbs2/slog/make.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -w-pro -I.. -nos2 slog.c diff --git a/src/sbbs2/slog/slog.c b/src/sbbs2/slog/slog.c deleted file mode 100644 index 4a8170fb25..0000000000 --- a/src/sbbs2/slog/slog.c +++ /dev/null @@ -1,140 +0,0 @@ -/* SLOG.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <stdio.h> -#include <stdlib.h> -#include <fcntl.h> -#include <sys\stat.h> -#include <io.h> -#include <dos.h> -#include <alloc.h> -#include <time.h> -#include <errno.h> - -#include "sbbsdefs.h" - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access==O_RDONLY) share=O_DENYWRITE; - else share=O_DENYALL; -while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(count) - printf("NOPEN COLLISION - File: %s Count: %d" - ,str,count); -if(file==-1 && errno==EACCES) - printf("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - - -/****************************************************************************/ -/* Lists system statistics for everyday the bbs has been running. */ -/* Either for the current node (node=1) or the system (node=0) */ -/****************************************************************************/ -int main(int argc, char **argv) -{ - char str[256],dir[256]={""},*p; - uchar *buf; - int i,file,pause=0,lncntr=0; - time_t timestamp; - long l; - ulong length, - logons, - timeon, - posts, - emails, - fbacks, - ulb, - uls, - dlb, - dls; - struct date date; - struct time curtime; - - -printf("\nSynchronet System/Node Statistics Log Viewer v1.02\n\n"); - -for(i=1;i<argc;i++) - if(!stricmp(argv[i],"/P")) - pause=1; - else - strcpy(dir,argv[1]); -if(!dir[0]) { - p=getenv("SBBSCTRL"); - if(p!=NULL) - strcpy(dir,p); } - -if(dir[0] && dir[strlen(dir)-1]!='\\') - strcat(dir,"\\"); - -sprintf(str,"%sCSTS.DAB",dir); -if((file=nopen(str,O_RDONLY))==-1) { - printf("Error opening %s\r\n",str); - return(1); } -length=filelength(file); -if(length<40) { - close(file); - return(1); } -if((buf=(char *)MALLOC(length))==0) { - close(file); - printf("error allocating %lu bytes\r\n",length); - return(1); } -read(file,buf,length); -close(file); -l=length-4; -while(l>-1L) { - fbacks=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - emails=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - posts=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - dlb=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - dls=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - ulb=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - uls=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - timeon=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - logons=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - timestamp=buf[l]|((long)buf[l+1]<<8)|((long)buf[l+2]<<16) - |((long)buf[l+3]<<24); - l-=4; - unixtodos(timestamp-(24*60*60),&date,&curtime); /* 1 day less than stamp */ - printf("%2.2d/%2.2d/%2.2d T:%5lu L:%3lu P:%3lu " - "E:%3lu F:%3lu U:%6luk %3lu D:%6luk %3lu\n" - ,date.da_mon,date.da_day,date.da_year%100,timeon,logons,posts,emails - ,fbacks,ulb/1024,uls,dlb/1024,dls); - lncntr++; - if(pause && lncntr>=20) { - printf("[Hit a key]"); - if(getch()==3) - break; - printf("\r"); - lncntr=0; } } -FREE(buf); -return(0); -} diff --git a/src/sbbs2/smb/121a/chksmb.c b/src/sbbs2/smb/121a/chksmb.c deleted file mode 100644 index 5cb0c8bdf7..0000000000 --- a/src/sbbs2/smb/121a/chksmb.c +++ /dev/null @@ -1,671 +0,0 @@ -/* CHKSMB.C */ - -#include <dos.h> -#include "smblib.h" - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/* Called from upload */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct find_t f; - -if(!_dos_findfirst(filespec,0,&f)) - return(1); -return(0); -} - -/****************************************************************************/ -/* Returns in 'string' a character representation of the number in l with */ -/* commas. */ -/****************************************************************************/ -char *ultoac(ulong l, char *string) -{ - char str[256]; - signed char i,j,k; - -ultoa(l,str,10); -i=strlen(str)-1; -j=i/3+1+i; -string[j--]=0; -for(k=1;i>-1;k++) { - string[j--]=str[i--]; - if(j>0 && !(k%3)) - string[j--]=','; } -return(string); -} - -/****************************************************************************/ -/* Returns an ASCII string for FidoNet address 'addr' */ -/****************************************************************************/ -char *faddrtoa(fidoaddr_t addr) -{ - static char str[25]; - char point[25]; - -sprintf(str,"%u:%u/%u",addr.zone,addr.net,addr.node); -if(addr.point) { - sprintf(point,".%u",addr.point); - strcat(str,point); } -return(str); -} - -char *usage="\nusage: chksmb [/opts] <filespec.SHD>\n" - "\n" - " opts:\n" - " s - stop after errored message base\n" - " p - pause after errored messsage base\n" - " q - quiet mode (no beeps while checking)\n" - " t - don't check translation strings\n" - " e - display extended info on corrupted msgs\n"; - -int main(int argc, char **argv) -{ - char str[128],*p,*s,*beep="\7"; - int i,j,x,y,lzh,errors,errlast,stop_on_error=0,pause_on_error=0 - ,chkxlat=1,lzhmsg,extinfo=0,msgerr; - ushort xlat; - ulong l,m,n,length,size,total=0,orphan=0,deleted=0,headers=0 - ,*offset,*number,xlaterr - ,delhdrblocks,deldatblocks,hdrerr=0,lockerr=0,hdrnumerr=0 - ,acthdrblocks,actdatblocks - ,dfieldlength=0,dfieldoffset=0 - ,dupenum=0,dupenumhdr=0,dupeoff=0,attr=0,actalloc=0 - ,datactalloc=0,misnumbered=0,timeerr=0,idxofferr=0,idxerr - ,zeronum,idxzeronum,idxnumerr,packable=0L,totallzhsaved=0L - ,totalmsgs=0,totallzhmsgs=0,totaldelmsgs=0,totalmsgbytes=0L - ,lzhblocks,lzhsaved; - idxrec_t idx; - smbmsg_t msg; - smbstatus_t status; - -fprintf(stderr,"\nCHKSMB v1.24 � Check Synchronet Message Base � " - "Copyright 1995 Digital Dynamics\n"); - -if(argc<2) { - printf("%s",usage); - exit(1); } - -errlast=errors=0; -for(x=1;x<argc;x++) { - if(stop_on_error && errors) - break; - if(pause_on_error && errlast!=errors) { - fprintf(stderr,"\7\nHit any key to continue..."); - if(!getch()) - getch(); - printf("\n"); } - errlast=errors; - if(argv[x][0]=='/') { - for(y=1;argv[x][y];y++) - switch(toupper(argv[x][y])) { - case 'Q': - beep=""; - break; - case 'P': - pause_on_error=1; - break; - case 'S': - stop_on_error=1; - break; - case 'T': - chkxlat=0; - break; - case 'E': - extinfo=1; - break; - default: - printf("%s",usage); - exit(1); } - continue; } - -strcpy(smb_file,argv[x]); -p=strrchr(smb_file,'.'); -s=strrchr(smb_file,'\\'); -if(p>s) *p=0; -strupr(smb_file); - -sprintf(str,"%s.SHD",smb_file); -if(!fexist(str)) { - printf("\n%s doesn't exist.\n",smb_file); - continue; } - -fprintf(stderr,"\nChecking %s Headers\n\n",smb_file); - -if((i=smb_open(10))!=0) { - printf("smb_open returned %d\n",i); - errors++; - continue; } - -if(filelength(fileno(shd_fp))<sizeof(smbhdr_t)) { - printf("Empty\n"); - smb_close(); - continue; } - -if((i=smb_locksmbhdr(10))!=0) { - smb_close(); - printf("smb_locksmbhdr returned %d\n",i); - errors++; - continue; } - -if((i=smb_getstatus(&status))!=0) { - smb_unlocksmbhdr(); - smb_close(); - printf("smb_getstatus returned %d\n",i); - errors++; - continue; } - - -length=filelength(fileno(shd_fp)); - -if((length/SHD_BLOCK_LEN)*sizeof(ulong)) { - if((number=(ulong *)MALLOC(((length/SHD_BLOCK_LEN)+2)*sizeof(ulong))) - ==NULL) { - printf("Error allocating %lu bytes of memory\n" - ,(length/SHD_BLOCK_LEN)*sizeof(ulong)); - return(++errors); } } -else - number=NULL; - -if(!(status.attr&SMB_HYPERALLOC)) { - if((i=smb_open_ha(10))!=0) { - printf("smb_open_ha returned %d\n",i); - return(++errors); } - - if((i=smb_open_da(10))!=0) { - printf("smb_open_da returned %d\n",i); - return(++errors); } } - -headers=deleted=orphan=dupenumhdr=attr=zeronum=timeerr=lockerr=hdrerr=0; -actalloc=datactalloc=deldatblocks=delhdrblocks=xlaterr=0; -lzhblocks=lzhsaved=acthdrblocks=actdatblocks=0; - -for(l=status.header_offset;l<length;l+=size) { - fprintf(stderr,"\r%2u%% ",(long)(100.0/((float)length/l))); - msg.idx.offset=l; - msgerr=0; - if((i=smb_lockmsghdr(msg,10))!=0) { - printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i); - lockerr++; - headers++; - size=SHD_BLOCK_LEN; - continue; } - if((i=smb_getmsghdr(&msg))!=0) { - smb_unlockmsghdr(msg); - if(!(status.attr&SMB_HYPERALLOC)) { - fseek(sha_fp,(l-status.header_offset)/SHD_BLOCK_LEN,SEEK_SET); - j=fgetc(sha_fp); - if(j) { /* Allocated block or at EOF */ - printf("%s\n(%06lX) smb_getmsghdr returned %d\n",beep,l,i); - hdrerr++; } - else - delhdrblocks++; } - else { - /* printf("%s\n(%06lX) smb_getmsghdr returned %d\n",beep,l,i); */ - delhdrblocks++; } - size=SHD_BLOCK_LEN; - continue; } - smb_unlockmsghdr(msg); - fprintf(stderr,"#%-5lu (%06lX) %-25.25s ",msg.hdr.number,l,msg.from); - - lzhmsg=0; - if(msg.hdr.attr&MSG_DELETE) { - deleted++; - if(number) - number[headers]=0; - if(status.attr&SMB_HYPERALLOC) - deldatblocks+=smb_datblocks(smb_getmsgdatlen(msg)); } - else { - actdatblocks+=smb_datblocks(smb_getmsgdatlen(msg)); - if(msg.hdr.number>status.last_msg) { - fprintf(stderr,"%sOut-Of-Range message number\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header number (%lu) greater than last (%lu)\n" - ,msg.hdr.number,status.last_msg); - hdrnumerr++; } - - if(smb_getmsgidx(&msg)) { - fprintf(stderr,"%sNot found in index\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header number (%lu) not found in index\n" - ,msg.hdr.number); - orphan++; } - else if(msg.hdr.attr!=msg.idx.attr) { - fprintf(stderr,"%sAttributes mismatch index\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header attributes (%04X) do not match index " - "attributes (%04X)\n" - ,msg.hdr.attr,msg.idx.attr); - attr++; } - else if(msg.hdr.when_imported.time!=msg.idx.time) { - fprintf(stderr,"%sImport date/time mismatch index\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header import date/time does not match " - "index import date/time\n"); - timeerr++; } - - if(msg.hdr.number==0) { - fprintf(stderr,"%sZero message number\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header number is zero (invalid)\n"); - zeronum++; } - if(number) { - for(m=0;m<headers;m++) - if(number[m] && msg.hdr.number==number[m]) { - fprintf(stderr,"%sDuplicate message number\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header number (%lu) duplicated\n" - ,msg.hdr.number); - dupenumhdr++; - break; } - number[headers]=msg.hdr.number; } - if(chkxlat) { /* Check translation strings */ - for(i=0;i<msg.hdr.total_dfields;i++) { - fseek(sdt_fp,msg.hdr.offset+msg.dfield[i].offset,SEEK_SET); - if(!fread(&xlat,2,1,sdt_fp)) - xlat=0xffff; - lzh=0; - if(xlat==XLAT_LZH) { - lzh=1; - if(!fread(&xlat,2,1,sdt_fp)) - xlat=0xffff; } - if(xlat!=XLAT_NONE) { - fprintf(stderr,"%sUnsupported Xlat %04X dfield[%u]\n" - ,beep,xlat,i); - msgerr=1; - if(extinfo) - printf("MSGERR: Unsupported translation type (%04X) " - "in dfield[%u]\n" - ,xlat,i); - xlaterr++; } - else { - if(lzh) { - lzhmsg=1; - if(fread(&m,4,1,sdt_fp)) { /* Get uncompressed len */ - lzhsaved+=(smb_datblocks(m+2) - -smb_datblocks(msg.dfield[i].length)) - *SDT_BLOCK_LEN; - lzhblocks+=smb_datblocks(msg.dfield[i].length); - } } } } } } - - size=smb_getmsghdrlen(msg); - while(size%SHD_BLOCK_LEN) - size++; - - if(!(status.attr&SMB_HYPERALLOC)) { - fseek(sha_fp,(l-status.header_offset)/SHD_BLOCK_LEN,SEEK_SET); - for(m=0;m<size;m+=SHD_BLOCK_LEN) { -/*** - if(msg.hdr.attr&MSG_DELETE && (i=fgetc(sha_fp))!=0) { - fprintf(stderr,"%sDeleted Header Block %lu marked %02X\n" - ,beep,m/SHD_BLOCK_LEN,i); - msgerr=1; - delalloc++; } -***/ - if(!(msg.hdr.attr&MSG_DELETE) && (i=fgetc(sha_fp))!=1) { - fprintf(stderr,"%sActive Header Block %lu marked %02X\n" - ,beep,m/SHD_BLOCK_LEN,i); - msgerr=1; - if(extinfo) - printf("MSGERR: Active header block %lu marked %02X " - "instead of 01\n" - ,m/SHD_BLOCK_LEN,i); - actalloc++; } } - - if(!(msg.hdr.attr&MSG_DELETE)) { - acthdrblocks+=(size/SHD_BLOCK_LEN); - for(n=0;n<msg.hdr.total_dfields;n++) { - if(msg.dfield[n].offset&0x80000000UL) { - msgerr=1; - if(extinfo) - printf("MSGERR: Invalid Data Field [%u] Offset: %lu\n" - ,n,msg.dfield[n].offset); - dfieldoffset++; } - if(msg.dfield[n].length&0x80000000UL) { - msgerr=1; - if(extinfo) - printf("MSGERR: Invalid Data Field [%u] Length: %lu\n" - ,n,msg.dfield[n].length); - dfieldlength++; } - fseek(sda_fp - ,((msg.hdr.offset+msg.dfield[n].offset)/SDT_BLOCK_LEN)*2 - ,SEEK_SET); - for(m=0;m<msg.dfield[n].length;m+=SDT_BLOCK_LEN) { - if(!fread(&i,2,1,sda_fp) || !i) { - fprintf(stderr - ,"%sActive Data Block %lu.%lu marked free\n" - ,beep,n,m/SHD_BLOCK_LEN); - msgerr=1; - if(extinfo) - printf("MSGERR: Active Data Block %lu.%lu " - "marked free\n" - ,n,m/SHD_BLOCK_LEN); - datactalloc++; } } } } - else - delhdrblocks+=(size/SHD_BLOCK_LEN); } - - else { /* Hyper Alloc */ - if(msg.hdr.attr&MSG_DELETE) - delhdrblocks+=(size/SHD_BLOCK_LEN); - else - acthdrblocks+=(size/SHD_BLOCK_LEN); } - - totallzhmsgs+=lzhmsg; - headers++; - if(msgerr && extinfo) { - printf("\n"); - printf("%-20s: %s\n","Message Base",smb_file); - printf("%-20s: %lu (%lu)\n","Message Number" - ,msg.hdr.number,msg.offset+1); - printf("%-20s: %s\n","Subject",msg.subj); - printf("%-20s: %s","To",msg.to); - if(msg.to_net.type) - printf(" (%s)",msg.to_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.to_net.addr) : msg.to_net.addr); - printf("\n%-20s: %s","From",msg.from); - if(msg.from_net.type) - printf(" (%s)",msg.from_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.from_net.addr) - : msg.from_net.addr); - printf("\n"); - printf("%-20s: %.24s\n","When Written" - ,ctime((time_t *)&msg.hdr.when_written.time)); - printf("%-20s: %.24s\n","When Imported" - ,ctime((time_t *)&msg.hdr.when_imported.time)); - printf("%-20s: %04hXh\n","Type" - ,msg.hdr.type); - printf("%-20s: %04hXh\n","Version" - ,msg.hdr.version); - printf("%-20s: %u\n","Length" - ,msg.hdr.length); - printf("%-20s: %04hXh\n","Attributes" - ,msg.hdr.attr); - printf("%-20s: %08lXh\n","Auxilary Attributes" - ,msg.hdr.auxattr); - printf("%-20s: %08lXh\n","Network Attributes" - ,msg.hdr.netattr); - printf("%-20s: %06lXh\n","Header Offset" - ,msg.idx.offset); - printf("%-20s: %06lXh\n","Data Offset" - ,msg.hdr.offset); - printf("%-20s: %u\n","Total Data Fields" - ,msg.hdr.total_dfields); - printf("\n"); } - - smb_freemsgmem(msg); } - -if(number) - FREE(number); - -fprintf(stderr,"\r%79s\r100%%\n",""); - - -if(!(status.attr&SMB_HYPERALLOC)) { - - fprintf(stderr,"\nChecking %s Data Blocks\n\n",smb_file); - - length=filelength(fileno(sda_fp)); - - fseek(sda_fp,0L,SEEK_SET); - for(l=0;l<length;l+=2) { - fprintf(stderr,"\r%2u%% ",l ? (long)(100.0/((float)length/l)) : 0); - i=0; - if(!fread(&i,2,1,sda_fp)) - break; - if(!i) - deldatblocks++; } - - fclose(sha_fp); - fclose(sda_fp); - - fprintf(stderr,"\r%79s\r100%%\n",""); } - -total=filelength(fileno(sid_fp))/sizeof(idxrec_t); - -dupenum=dupeoff=misnumbered=idxzeronum=idxnumerr=idxofferr=idxerr=0; - -if(total) { - -fprintf(stderr,"\nChecking %s Index\n\n",smb_file); - -if((offset=(ulong *)MALLOC(total*sizeof(ulong)))==NULL) { - printf("Error allocating %lu bytes of memory\n",total*sizeof(ulong)); - return(++errors); } -if((number=(ulong *)MALLOC(total*sizeof(ulong)))==NULL) { - printf("Error allocating %lu bytes of memory\n",total*sizeof(ulong)); - return(++errors); } -fseek(sid_fp,0L,SEEK_SET); - -for(l=0;l<total;l++) { - fprintf(stderr,"\r%2lu%% %5lu ",l ? (long)(100.0/((float)total/l)) : 0,l); - if(!fread(&idx,sizeof(idxrec_t),1,sid_fp)) - break; - fprintf(stderr,"#%-5lu (%06lX) 1st Pass ",idx.number,idx.offset); -/*** - if(idx.attr&MSG_DELETE) { - fprintf(stderr,"%sMarked for deletion\n",beep); - delidx++; } -***/ - for(m=0;m<l;m++) - if(number[m]==idx.number) { - fprintf(stderr,"%sDuplicate message number\n",beep); - dupenum++; - break; } - for(m=0;m<l;m++) - if(offset[m]==idx.offset) { - fprintf(stderr,"%sDuplicate offset\n",beep,idx.offset); - dupeoff++; - break; } - if(idx.offset<status.header_offset) { - fprintf(stderr,"%sInvalid offset\n",beep); - idxofferr++; - break; } - if(idx.number==0) { - fprintf(stderr,"%sZero message number\n",beep); - idxzeronum++; - break; } - if(idx.number>status.last_msg) { - fprintf(stderr,"%sOut-Of-Range message number\n",beep); - idxnumerr++; - break; } - number[l]=idx.number; - offset[l]=idx.offset; } - -if(l<total) { - fprintf(stderr,"%sError reading index record\n",beep); - idxerr=1; } -else { - fprintf(stderr,"\r%79s\r",""); - for(m=0;m<total;m++) { - fprintf(stderr,"\r%2lu%% %5lu ",m ? (long)(100.0/((float)total/m)) : 0,m); - fprintf(stderr,"#%-5lu (%06lX) 2nd Pass ",number[m],offset[m]); - for(n=0;n<m;n++) - if(number[m] && number[n] && number[m]<number[n]) { - fprintf(stderr,"%sMisordered message number\n",beep); - misnumbered++; - number[n]=0; - break; } } - fprintf(stderr,"\r%79s\r100%%\n",""); } -FREE(number); -FREE(offset); - -} /* if(total) */ - -totalmsgs+=status.total_msgs; -totalmsgbytes+=(acthdrblocks*SHD_BLOCK_LEN)+(actdatblocks*SDT_BLOCK_LEN); -totaldelmsgs+=deleted; -totallzhsaved+=lzhsaved; -printf("\n"); -printf("%-35.35s (=): %lu\n" - ,"Status Total" - ,status.total_msgs); -printf("%-35.35s (=): %lu\n" - ,"Index Records" - ,total); -printf("%-35.35s (=): %lu\n" - ,"Active Headers" - ,headers-deleted); -printf("%-35.35s ( ): %-8lu %13s bytes used\n" - ,"Active Header Blocks" - ,acthdrblocks,ultoac(acthdrblocks*SHD_BLOCK_LEN,str)); -printf("%-35.35s ( ): %-8lu %13s bytes used\n" - ,"Active Data Blocks" - ,actdatblocks,ultoac(actdatblocks*SDT_BLOCK_LEN,str)); -if(lzhblocks) - printf("%-35.35s ( ): %-8lu %13s bytes saved\n" - ,"Active LZH Compressed Data Blocks" - ,lzhblocks,ultoac(lzhsaved,str)); -printf("%-35.35s ( ): %lu\n" - ,"Header Records" - ,headers); -printf("%-35.35s ( ): %lu\n" - ,"Deleted Headers" - ,deleted); -printf("%-35.35s ( ): %-8lu %13s bytes used\n" - ,"Deleted Header Blocks" - ,delhdrblocks,ultoac(delhdrblocks*SHD_BLOCK_LEN,str)); -packable+=(delhdrblocks*SHD_BLOCK_LEN); -printf("%-35.35s ( ): %-8lu %13s bytes used\n" - ,"Deleted Data Blocks" - ,deldatblocks,ultoac(deldatblocks*SDT_BLOCK_LEN,str)); -packable+=(deldatblocks*SDT_BLOCK_LEN); - -if(orphan) - printf("%-35.35s (!): %lu\n" - ,"Orphaned Headers" - ,orphan); -if(idxzeronum) - printf("%-35.35s (!): %lu\n" - ,"Zeroed Index Numbers" - ,idxzeronum); -if(zeronum) - printf("%-35.35s (!): %lu\n" - ,"Zeroed Header Numbers" - ,zeronum); -/*** -if(delidx) - printf("%-35.35s (!): %lu\n" - ,"Deleted Index Records" - ,delidx); -***/ -if(idxofferr) - printf("%-35.35s (!): %lu\n" - ,"Invalid Index Offsets" - ,idxofferr); -if(dupenum) - printf("%-35.35s (!): %lu\n" - ,"Duplicate Index Numbers" - ,dupenum); -if(dupeoff) - printf("%-35.35s (!): %lu\n" - ,"Duplicate Index Offsets" - ,dupeoff); -if(dupenumhdr) - printf("%-35.35s (!): %lu\n" - ,"Duplicate Header Numbers" - ,dupenumhdr); -if(misnumbered) - printf("%-35.35s (!): %lu\n" - ,"Misordered Index Numbers" - ,misnumbered); -if(lockerr) - printf("%-35.35s (!): %lu\n" - ,"Unlockable Header Records" - ,lockerr); -if(hdrerr) - printf("%-35.35s (!): %lu\n" - ,"Unreadable Header Records" - ,hdrerr); -if(idxnumerr) - printf("%-35.35s (!): %lu\n" - ,"Out-Of-Range Index Numbers" - ,idxnumerr); -if(hdrnumerr) - printf("%-35.35s (!): %lu\n" - ,"Out-Of-Range Header Numbers" - ,hdrnumerr); -if(attr) - printf("%-35.35s (!): %lu\n" - ,"Mismatched Header Attributes" - ,attr); -if(timeerr) - printf("%-35.35s (!): %lu\n" - ,"Mismatched Header Import Time" - ,timeerr); -if(xlaterr) - printf("%-35.35s (!): %lu\n" - ,"Unsupported Translation Types" - ,xlaterr); -if(datactalloc) - printf("%-35.35s (!): %lu\n" - ,"Misallocated Active Data Blocks" - ,datactalloc); -if(actalloc) - printf("%-35.35s (!): %lu\n" - ,"Misallocated Active Header Blocks" - ,actalloc); -/*** -if(delalloc) - printf("%-35.35s (!): %lu\n" - ,"Misallocated Deleted Header Blocks" - ,delalloc); -***/ - -if(dfieldoffset) - printf("%-35.35s (!): %lu\n" - ,"Invalid Data Field Offsets" - ,dfieldoffset); - -if(dfieldlength) - printf("%-35.35s (!): %lu\n" - ,"Invalid Data Field Lengths" - ,dfieldlength); - - -printf("\n%s Message Base ",smb_file); -if((headers-deleted)!=status.total_msgs || total!=status.total_msgs - || (headers-deleted)!=total || idxzeronum || zeronum - || orphan || dupenumhdr || dupenum || dupeoff || attr - || lockerr || hdrerr || hdrnumerr || idxnumerr || idxofferr - || actalloc || datactalloc || misnumbered || timeerr - || dfieldoffset || dfieldlength || xlaterr || idxerr) { - printf("%shas Errors!\n",beep); - errors++; } -else - printf("is OK\n"); - -smb_unlocksmbhdr(); -smb_close(); -} -if(pause_on_error && errlast!=errors) { - fprintf(stderr,"\7\nHit any key to continue..."); - if(!getch()) - getch(); - fprintf(stderr,"\n"); } - -if((totalmsgs && (totalmsgs!=status.total_msgs || totallzhmsgs)) - || packable) - printf("\n"); -if(totalmsgs && totalmsgs!=status.total_msgs) - printf("%-39.39s: %-8lu %13s bytes used\n" - ,"Total Active Messages" - ,totalmsgs,ultoac(totalmsgbytes,str)); -if(totallzhmsgs && totalmsgs!=status.total_msgs) - printf("%-39.39s: %-8lu %13s bytes saved\n" - ,"Total LZH Compressed Messages" - ,totallzhmsgs,ultoac(totallzhsaved,str)); -if(packable) - printf("%-39.39s: %-8lu %13s bytes used\n" - ,"Total Deleted Messages" - ,totaldelmsgs,ultoac(packable,str)); - -return(errors); -} diff --git a/src/sbbs2/smb/121a/chksmb.mak b/src/sbbs2/smb/121a/chksmb.mak deleted file mode 100644 index 1609c16ece..0000000000 --- a/src/sbbs2/smb/121a/chksmb.mak +++ /dev/null @@ -1,50 +0,0 @@ -############################### -# Makefile for CHKSMB # -# For use with Borland C++ # -# Tabstop=8 # -############################### - -# Macros - -CC = bcc -LD = tlink -INCLUDE = \bc31\include -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = -n -c -MAIN = chksmb.exe -OBJS = $(MODEL)\chksmb.obj $(MODEL)\smblib.obj $(MODEL)\smbvars.obj -HEADERS = smblib.h smbdefs.h crc32.h - -!ifdef __OS2__ -CC = c:\bcos2\bin\bcc -LD = c:\bcos2\bin\tlink -INCLUDE = c:\bcos2\include;smb -LIB = c:\bcos2\lib -CFLAGS = -d -C -I$(INCLUDE) -LFLAGS = -c -w-srf -!endif - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(MODEL) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) $(LIB)\wildargs.obj -+, $*, $*, $(LIB)\os2.lib $(LI$(MODEL)\B)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) $(LIB)\wildargs.obj -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# All .obj modules -$(MODEL)\chksmb.obj: $(HEADERS) -$(MODEL)\smbvars.obj: $(HEADERS) -$(MODEL)\smblib.obj: $(HEADERS) diff --git a/src/sbbs2/smb/121a/crc16.c b/src/sbbs2/smb/121a/crc16.c deleted file mode 100644 index dc89962940..0000000000 --- a/src/sbbs2/smb/121a/crc16.c +++ /dev/null @@ -1,37 +0,0 @@ -/* CRC16.C */ - -/* 16-bit CRC routines */ - -#include "smblib.h" - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - diff --git a/src/sbbs2/smb/121a/crc32.h b/src/sbbs2/smb/121a/crc32.h deleted file mode 100644 index a5d5162fb2..0000000000 --- a/src/sbbs2/smb/121a/crc32.h +++ /dev/null @@ -1,40 +0,0 @@ -/* 32-bit CRC */ - -long crc32tbl[]={ /* CRC polynomial 0xedb88320 */ -0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, -0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, -0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, -0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, -0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, -0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, -0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, -0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, -0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, -0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, -0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, -0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, -0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, -0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, -0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, -0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, -0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, -0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, -0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, -0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, -0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, -0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, -0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, -0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, -0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, -0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, -0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, -0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, -0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, -0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -#define ucrc32(ch,crc) (crc32tbl[(crc^ch)&0xff]^(crc>>8)) - - diff --git a/src/sbbs2/smb/121a/fido2smb.c b/src/sbbs2/smb/121a/fido2smb.c deleted file mode 100644 index c366b56fbc..0000000000 --- a/src/sbbs2/smb/121a/fido2smb.c +++ /dev/null @@ -1,502 +0,0 @@ -/* FIDO2SMB.C */ - -/* Converts FidoNet FTSC-1 (*.MSG) message base to SMB format */ - -/* The intention of this source code is an example of how to use the SMBLIB */ -/* library functions to access an SMB format message base. */ - -/* This program and source code are freeware. May be used in part or whole */ -/* for any purpose without consent or notification of Digital Dynamics. */ - -/* Digital Dynamics does request that developers that release products that */ -/* support the SMB format notify Digital Dynamics so the implementation */ -/* and contact chapters in the technical specification may be updated. */ - -#include "smblib.h" -#include "crc32.h" -#include <dos.h> - /* Attribute bits for fido msg header */ -#define FIDO_PRIVATE (1<<0) /* Private message */ -#define FIDO_CRASH (1<<1) /* Crash-mail (send immediately) */ -#define FIDO_RECV (1<<2) /* Received successfully */ -#define FIDO_SENT (1<<3) /* Sent successfully */ -#define FIDO_FILE (1<<4) /* File attached */ -#define FIDO_INTRANS (1<<5) /* In transit */ -#define FIDO_ORPHAN (1<<6) /* Orphan */ -#define FIDO_KILLSENT (1<<7) /* Kill it after sending it */ -#define FIDO_LOCAL (1<<8) /* Created locally - on this system */ -#define FIDO_HOLD (1<<9) /* Hold - don't send it yet */ -#define FIDO_FREQ (1<<11) /* File request */ -#define FIDO_RRREQ (1<<12) /* Return receipt request */ -#define FIDO_RR (1<<13) /* This is a return receipt */ -#define FIDO_AUDIT (1<<14) /* Audit request */ -#define FIDO_FUPREQ (1<<15) /* File update request */ - -typedef struct { /* FidoNet msg header */ - uchar from[36], /* From user */ - to[36], /* To user */ - subj[72], /* Message title */ - time[20]; /* Time in goof-ball ASCII format */ - short read, /* Times read */ - destnode, /* Destination node */ - orignode, /* Origin node */ - cost, /* Cost in pennies */ - orignet, /* Origin net */ - destnet, /* Destination net */ - destzone, /* Destination zone */ - origzone, /* Origin zone */ - destpoint, /* Destination point */ - origpoint, /* Origin point */ - re, /* Message number regarding */ - attr, /* Attributes - see FIDO_* */ - next; /* Next message number in stream */ - } fmsghdr_t; - -/******************************************/ -/* CRC-16 routines required for SMB index */ -/******************************************/ - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=' ') c--; -str[c]=0; -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(f.ff_fsize); -return(-1L); -} - -/****************************************************************************/ -/* Returns the FidoNet address kept in str as ASCII. */ -/****************************************************************************/ -fidoaddr_t atofaddr(char *str) -{ - char *p; - fidoaddr_t addr; - -addr.zone=addr.net=addr.node=addr.point=0; -if((p=strchr(str,':'))!=NULL) { - addr.zone=atoi(str); - addr.net=atoi(p+1); } -else { - addr.zone=1; - addr.net=atoi(str); } -if(!addr.zone) /* no such thing as zone 0 */ - addr.zone=1; -if((p=strchr(str,'/'))!=NULL) - addr.node=atoi(p+1); -else { - addr.net=1; - addr.node=atoi(str); } -if((p=strchr(str,'.'))!=NULL) - addr.point=atoi(p+1); -return(addr); -} - -/****************************************************************************/ -/* Converts goofy FidoNet time format into Unix format */ -/****************************************************************************/ -time_t fmsgtime(char *str) -{ - char month[4]; - struct date date; - struct time t; - -if(isdigit(str[1])) { /* Regular format: "01 Jan 86 02:34:56" */ - date.da_day=atoi(str); - sprintf(month,"%3.3s",str+3); - if(!stricmp(month,"jan")) - date.da_mon=1; - else if(!stricmp(month,"feb")) - date.da_mon=2; - else if(!stricmp(month,"mar")) - date.da_mon=3; - else if(!stricmp(month,"apr")) - date.da_mon=4; - else if(!stricmp(month,"may")) - date.da_mon=5; - else if(!stricmp(month,"jun")) - date.da_mon=6; - else if(!stricmp(month,"jul")) - date.da_mon=7; - else if(!stricmp(month,"aug")) - date.da_mon=8; - else if(!stricmp(month,"sep")) - date.da_mon=9; - else if(!stricmp(month,"oct")) - date.da_mon=10; - else if(!stricmp(month,"nov")) - date.da_mon=11; - else - date.da_mon=12; - date.da_year=1900+atoi(str+7); - t.ti_hour=atoi(str+11); - t.ti_min=atoi(str+14); - t.ti_sec=atoi(str+17); } - -else { /* SEAdog format: "Mon 1 Jan 86 02:34" */ - date.da_day=atoi(str+4); - sprintf(month,"%3.3s",str+7); - if(!stricmp(month,"jan")) - date.da_mon=1; - else if(!stricmp(month,"feb")) - date.da_mon=2; - else if(!stricmp(month,"mar")) - date.da_mon=3; - else if(!stricmp(month,"apr")) - date.da_mon=4; - else if(!stricmp(month,"may")) - date.da_mon=5; - else if(!stricmp(month,"jun")) - date.da_mon=6; - else if(!stricmp(month,"jul")) - date.da_mon=7; - else if(!stricmp(month,"aug")) - date.da_mon=8; - else if(!stricmp(month,"sep")) - date.da_mon=9; - else if(!stricmp(month,"oct")) - date.da_mon=10; - else if(!stricmp(month,"nov")) - date.da_mon=11; - else - date.da_mon=12; - date.da_year=1900+atoi(str+11); - t.ti_hour=atoi(str+14); - t.ti_min=atoi(str+17); - t.ti_sec=0; } -return(dostounix(&date,&t)); -} - -/****************************************************************************/ -/* Entry point - if you didn't know that, maybe you shouldn't be reading :) */ -/****************************************************************************/ -int main(int argc, char **argv) -{ - uchar *p,str[128],*fbuf,*sbody,*stail,ch,done; - ushort xlat,net; - int i,j,file,col,cr,esc,orig,last,msgs,found; - ulong l,m,length,bodylen,taillen,crc; - struct ffblk ff; - smbmsg_t msg; - smbstatus_t status; - fmsghdr_t fmsghdr; - fidoaddr_t destaddr,origaddr,faddr; - -if(argc<3) { - printf("usage: fido2smb <fido_dir> <smb_name>\r\n"); - exit(1); } - -strcpy(smb_file,argv[2]); -strupr(smb_file); - -smb_open(10); -if(!filelength(fileno(shd_fp))) - smb_create(2000,2000,0,0,10); - -smb_getstatus(&status); // Initialized for first call to smb_addcrc() - -/*********************************************/ -/* Get the total number of .MSG files in dir */ -/*********************************************/ -printf("\nCounting messages..."); -sprintf(str,"%s\\*.MSG",argv[1]); -last=findfirst(str,&ff,0); -for(msgs=0;!last;msgs++) - last=findnext(&ff); -printf("\n%u messages.\n",msgs); - -/******************************************/ -/* Convert in sequence, starting at 1.MSG */ -/******************************************/ -for(i=1,found=0;found<msgs && i<2000;i++) { - sprintf(str,"%s\\%u.MSG",argv[1],i); - if((file=open(str,O_RDONLY|O_BINARY))==-1) - continue; - found++; - strupr(str); - printf("%s\n",str); - read(file,&fmsghdr,sizeof(fmsghdr_t)); - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - if(fmsghdr.attr&FIDO_PRIVATE) - msg.idx.attr|=MSG_PRIVATE; - msg.hdr.attr=msg.idx.attr; - - msg.hdr.when_imported.time=time(NULL); - msg.hdr.when_written.time=fmsgtime(fmsghdr.time); - - origaddr.zone=fmsghdr.origzone; /* only valid if NetMail */ - origaddr.net=fmsghdr.orignet; - origaddr.node=fmsghdr.orignode; - origaddr.point=fmsghdr.origpoint; - - destaddr.zone=fmsghdr.destzone; /* only valid if NetMail */ - destaddr.net=fmsghdr.destnet; - destaddr.node=fmsghdr.destnode; - destaddr.point=fmsghdr.destpoint; - - smb_hfield(&msg,SENDER,strlen(fmsghdr.from),fmsghdr.from); - strlwr(fmsghdr.from); - msg.idx.from=crc16(fmsghdr.from); - - smb_hfield(&msg,RECIPIENT,strlen(fmsghdr.to),fmsghdr.to); - strlwr(fmsghdr.to); - msg.idx.to=crc16(fmsghdr.to); - - smb_hfield(&msg,SUBJECT,strlen(fmsghdr.subj),fmsghdr.subj); - strlwr(fmsghdr.subj); - msg.idx.subj=crc16(fmsghdr.subj); - - length=filelength(file)-sizeof(fmsghdr_t); - if((fbuf=(char *)MALLOC(length))==NULL) { - printf("alloc error\n"); - exit(1); } - if((sbody=(char *)MALLOC(length*2L))==NULL) { - printf("alloc error\n"); - exit(1); } - if((stail=(char *)MALLOC(length))==NULL) { - printf("alloc error\n"); - exit(1); } - read(file,fbuf,length); - close(file); - - for(col=l=esc=done=bodylen=taillen=orig=0,cr=1;l<length;l++) { - ch=fbuf[l]; - if(ch==1 && cr) { /* kludge line */ - - if(!strncmp(fbuf+l+1,"TOPT ",5)) - destaddr.point=atoi(fbuf+l+6); - - else if(!strncmp(fbuf+l+1,"FMPT ",5)) - origaddr.point=atoi(fbuf+l+6); - - else if(!strncmp(fbuf+l+1,"INTL ",5)) { - faddr=atofaddr(fbuf+l+6); - destaddr.zone=faddr.zone; - destaddr.net=faddr.net; - destaddr.node=faddr.node; - l+=6; - while(l<length && fbuf[l]!=SP) l++; - faddr=atofaddr(fbuf+l+1); - origaddr.zone=faddr.zone; - origaddr.net=faddr.net; - origaddr.node=faddr.node; } - - else if(!strncmp(fbuf+l+1,"MSGID:",6)) { - l+=7; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOMSGID,m-l,fbuf+l); } - - else if(!strncmp(fbuf+l+1,"REPLY:",6)) { - l+=7; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOREPLYID,m-l,fbuf+l); } - - else if(!strncmp(fbuf+l+1,"FLAGS:",6)) { - l+=7; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOFLAGS,m-l,fbuf+l); } - - else if(!strncmp(fbuf+l+1,"PATH:",5)) { - l+=6; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOPATH,m-l,fbuf+l); } - - else if(!strncmp(fbuf+l+1,"PID:",4)) { - l+=5; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOPID,m-l,fbuf+l); } - - else { /* Unknown kludge line */ - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOCTRL,m-l,fbuf+l); } - - while(l<length && fbuf[l]!=CR) l++; - continue; } - - if(ch!=LF && ch!=0x8d) { /* ignore LF and soft CRs */ - if(cr && (!strncmp((char *)fbuf+l,"--- ",4) - || !strncmp((char *)fbuf+l,"---\r",4))) - done=1; /* tear line and down go into tail */ - if(done && cr && !strncmp(fbuf+l,"SEEN-BY:",8)) { - l+=8; - while(l<length && fbuf[l]<=SP) l++; - m=l; - while(m<length && fbuf[m]!=CR) m++; - while(m && fbuf[m-1]<=SP) m--; - if(m>l) - smb_hfield(&msg,FIDOSEENBY,m-l,fbuf+l); - while(l<length && fbuf[l]!=CR) l++; - continue; } /* skip the CR */ - if(done) - stail[taillen++]=ch; - else - sbody[bodylen++]=ch; - col++; - if(ch==CR) { - cr=1; - col=0; - if(done) - stail[taillen++]=LF; - else - sbody[bodylen++]=LF; } - else { - cr=0; - if(col==1 && !strncmp((char *)fbuf+l," * Origin: ",11)) { - p=strchr(fbuf+l+11,CR); /* find carriage return */ - while(p && *p!='(') p--; /* rewind to '(' */ - if(p) - origaddr=atofaddr(p+1); /* get orig address */ - orig=done=1; } - if(done) - continue; - - if(ch==ESC) esc=1; /* ANSI codes */ - if(ch==SP && col>40 && !esc) { /* word wrap */ - for(m=l+1;m<length;m++) /* find next space */ - if(fbuf[m]<=SP) - break; - if(m<length && m-l>80-col) { /* if it's beyond the eol */ - sbody[bodylen++]=CR; - sbody[bodylen++]=LF; - col=0; } } - } } } - - if(bodylen>=2 && sbody[bodylen-2]==CR && sbody[bodylen-1]==LF) - bodylen-=2; /* remove last CRLF if present */ - - for(l=0,crc=0xffffffff;l<bodylen;l++) - crc=ucrc32(sbody[l],crc); - crc=~crc; - - j=smb_addcrc(status.max_crcs,crc,10); - if(j) { - if(j==1) { - printf("\nDuplicate message\n"); - smb_freemsgmem(msg); - FREE(fbuf); - FREE(sbody); - FREE(stail); - continue; } - printf("smb_addcrc returned %d\n",j); - exit(1); } - - while(taillen && stail[taillen-1]<=SP) /* trim all garbage off the tail */ - taillen--; - - net=NET_FIDO; /* Record origin address */ - smb_hfield(&msg,SENDERNETTYPE,sizeof(ushort),&net); - smb_hfield(&msg,SENDERNETADDR,sizeof(fidoaddr_t),&origaddr); - - if(!orig) { /* No origin line means NetMail, so add dest addr */ - smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(ushort),&net); - smb_hfield(&msg,RECIPIENTNETADDR,sizeof(fidoaddr_t),&destaddr); } - - if(smb_open_da(10)) { - printf("error opening %s.SDA\n",smb_file); - exit(1); } - l=bodylen+2; - if(taillen) - l+=(taillen+2); - msg.hdr.offset=smb_fallocdat(l,1); - fclose(sda_fp); - if(msg.hdr.offset && msg.hdr.offset<1L) { - printf("error %ld allocating records\r\n",msg.hdr.offset); - exit(1); } - fseek(sdt_fp,msg.hdr.offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,sdt_fp); - l=ftell(sdt_fp); - fwrite(sbody,SDT_BLOCK_LEN,smb_datblocks(bodylen),sdt_fp); - if(taillen) { - fseek(sdt_fp,l+bodylen,SEEK_SET); - fwrite(&xlat,2,1,sdt_fp); - fwrite(stail,SDT_BLOCK_LEN,smb_datblocks(taillen),sdt_fp); } - fflush(sdt_fp); - FREE(fbuf); - FREE(sbody); - FREE(stail); - - smb_dfield(&msg,TEXT_BODY,bodylen+2); - if(taillen) - smb_dfield(&msg,TEXT_TAIL,taillen+2); - - smb_addmsghdr(&msg,&status,1,10); - smb_freemsgmem(msg); } - -printf("\n%u messages converted.\n",found); -return(0); -} - diff --git a/src/sbbs2/smb/121a/fido2smb.mak b/src/sbbs2/smb/121a/fido2smb.mak deleted file mode 100644 index 018d5792e5..0000000000 --- a/src/sbbs2/smb/121a/fido2smb.mak +++ /dev/null @@ -1,34 +0,0 @@ -############################### -# Makefile for FIDO2SMB # -# For use with Borland C++ # -# Tabstop=8 # -############################### - -# Macros -CC = bcc -LD = tlink -INCLUDE = \bc31\include -LIB = \bc31\lib -MODEL = s -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = -n -c -MAIN = fido2smb.exe -OBJS = fido2smb.obj smblib.obj smbvars.obj -HEADERS = smblib.h smbdefs.h crc32.h - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) -+ $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -# All .obj modules -fido2smb.obj: $(HEADERS) -smbvars.obj: $(HEADERS) -smblib.obj: $(HEADERS) diff --git a/src/sbbs2/smb/121a/file_id.diz b/src/sbbs2/smb/121a/file_id.diz deleted file mode 100644 index be69095651..0000000000 --- a/src/sbbs2/smb/121a/file_id.diz +++ /dev/null @@ -1,10 +0,0 @@ -Synchronet Message Base Specification v1.21a -Released 08/31/95. Designed for high volume, -high speed, multi-network, multimedia e-mail -storage and retrieval. Includes comprehensive -95 page technical specification, 38 function -royalty free C library, tons of C source code -including conversion programs from QWK, Fido -(FTSC-1), and Internet (RFC-822) messages. -New: Hyper Allocation storage method and LZH -compression/decompression functions. diff --git a/src/sbbs2/smb/121a/fixsmb.c b/src/sbbs2/smb/121a/fixsmb.c deleted file mode 100644 index cf522e0175..0000000000 --- a/src/sbbs2/smb/121a/fixsmb.c +++ /dev/null @@ -1,221 +0,0 @@ -/* FIXSMB.C */ - -/* Re-generates an SMB message base based on SHD and SDT files */ - -#include "smblib.h" - -char *usage="usage: fixsmb [/opts] <smb_file>\n" - "\n" - " opts:\n" - " m - force mail format instead of sub-board format\n" - "\n" - " ex: FIXSMB /M MAIL\n" - " or: FIXSMB DEBATE\n"; - -void remove_re(char *str) -{ -while(!strnicmp(str,"RE:",3)) { - strcpy(str,str+3); - while(str[0]==SP) - strcpy(str,str+1); } -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -#define MAIL (1<<0) - -int main(int argc, char **argv) -{ - char str[128],c; - int i,w,mode=0; - ulong l,length,size,n,m; - smbmsg_t msg; - smbstatus_t status; - -printf("\nFIXSMB v1.22 � Rebuild Synchronet Message Base � Copyright 1995 " - "Digital Dynamics\n"); - -smb_file[0]=0; -for(i=1;i<argc;i++) - if(argv[i][0]=='/') - switch(toupper(argv[i][1])) { - case 'M': - mode|=MAIL; - break; - default: - printf(usage); - exit(1); } - else - strcpy(smb_file,argv[i]); - -if(!smb_file[0]) { - printf(usage); - exit(1); } - -strupr(smb_file); - -if((i=smb_open(10))!=0) { - printf("smb_open returned %d\n",i); - exit(1); } - -if((i=smb_locksmbhdr(10))!=0) { - smb_close(); - printf("smb_locksmbhdr returned %d\n",i); - exit(1); } - -if((i=smb_getstatus(&status))!=0) { - smb_unlocksmbhdr(); - smb_close(); - printf("smb_getstatus returned %d\n",i); - exit(1); } - -if(mode&MAIL && !(status.attr&SMB_EMAIL)) { - status.attr|=SMB_EMAIL; - if((i=smb_putstatus(status))!=0) { - smb_unlocksmbhdr(); - smb_close(); - printf("smb_putstatus returned %d\n",i); - exit(1); } } - -if(!(status.attr&SMB_HYPERALLOC)) { - - if((i=smb_open_ha(10))!=0) { - smb_close(); - printf("smb_open_ha returned %d\n",i); - exit(1); } - - if((i=smb_open_da(10))!=0) { - smb_close(); - printf("smb_open_da returned %d\n",i); - exit(1); } - - rewind(sha_fp); - chsize(fileno(sha_fp),0L); /* Truncate the header allocation file */ - rewind(sda_fp); - chsize(fileno(sda_fp),0L); /* Truncate the data allocation file */ - } - -rewind(sid_fp); -chsize(fileno(sid_fp),0L); /* Truncate the index */ - - -if(!(status.attr&SMB_HYPERALLOC)) { - length=filelength(fileno(sdt_fp)); - w=0; - for(l=0;l<length;l+=SDT_BLOCK_LEN) /* Init .SDA file to NULL */ - fwrite(&w,2,1,sda_fp); - - length=filelength(fileno(shd_fp)); - c=0; - for(l=0;l<length;l+=SHD_BLOCK_LEN) /* Init .SHD file to NULL */ - fwrite(&c,1,1,sha_fp); } -else - length=filelength(fileno(shd_fp)); - -n=1; /* messsage number */ -for(l=status.header_offset;l<length;l+=size) { - printf("\r%2u%% ",(long)(100.0/((float)length/l))); - msg.idx.offset=l; - if((i=smb_lockmsghdr(msg,10))!=0) { - printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i); - continue; } - if((i=smb_getmsghdr(&msg))!=0) { - smb_unlockmsghdr(msg); - printf("\n(%06lX) smb_getmsghdr returned %d\n",l,i); - size=SHD_BLOCK_LEN; - continue; } - smb_unlockmsghdr(msg); - printf("#%-5lu (%06lX) %-25.25s ",msg.hdr.number,l,msg.from); - if(!(msg.hdr.attr&MSG_DELETE)) { /* Don't index deleted messages */ - msg.offset=n-1; - msg.hdr.number=n; - msg.idx.number=n; - msg.idx.attr=msg.hdr.attr; - msg.idx.time=msg.hdr.when_imported.time; - strcpy(str,msg.subj); - strlwr(str); - remove_re(str); - msg.idx.subj=crc16(str); - if(status.attr&SMB_EMAIL) { - if(msg.to_ext) - msg.idx.to=atoi(msg.to_ext); - else - msg.idx.to=0; - if(msg.from_ext) - msg.idx.from=atoi(msg.from_ext); - else - msg.idx.from=0; } - else { - strcpy(str,msg.to); - strlwr(str); - msg.idx.to=crc16(str); - strcpy(str,msg.from); - strlwr(str); - msg.idx.from=crc16(str); } - if((i=smb_putmsg(msg))!=0) { - printf("\nsmb_putmsg returned %d\n",i); - continue; } - n++; } - else - printf("Not indexing deleted message\n"); - size=smb_getmsghdrlen(msg); - while(size%SHD_BLOCK_LEN) - size++; - - if(!(status.attr&SMB_HYPERALLOC)) { - /**************************/ - /* Allocate header blocks */ - /**************************/ - fseek(sha_fp,(l-status.header_offset)/SHD_BLOCK_LEN,SEEK_SET); - if(msg.hdr.attr&MSG_DELETE) c=0; /* mark as free */ - else c=1; /* or allocated */ - - for(i=0;i<size/SHD_BLOCK_LEN;i++) - fputc(c,sha_fp); - - /************************/ - /* Allocate data blocks */ - /************************/ - - if(!(msg.hdr.attr&MSG_DELETE)) - smb_incdat(msg.hdr.offset,smb_getmsgdatlen(msg),1); - } - - smb_freemsgmem(msg); } -printf("\nDone.\n"); -status.total_msgs=status.last_msg=n-1; -if((i=smb_putstatus(status))!=0) - printf("\nsmb_putstatus returned %d\n",i); -smb_unlocksmbhdr(); -smb_close(); -return(0); -} diff --git a/src/sbbs2/smb/121a/fixsmb.mak b/src/sbbs2/smb/121a/fixsmb.mak deleted file mode 100644 index cdb9fbc284..0000000000 --- a/src/sbbs2/smb/121a/fixsmb.mak +++ /dev/null @@ -1,34 +0,0 @@ -############################### -# Makefile for FIXSMB # -# For use with Borland C++ # -# Tabstop=8 # -############################### - -# Macros -CC = bcc -LD = tlink -INCLUDE = \bc31\include -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = -n -c -MAIN = fixsmb.exe -OBJS = $(MODEL)\fixsmb.obj $(MODEL)\smblib.obj $(MODEL)\smbvars.obj -HEADERS = smblib.h smbdefs.h crc32.h - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(MODEL) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) -+ $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -# All .obj modules -$(MODEL)\fixsmb.obj: $(HEADERS) -$(MODEL)\smbvars.obj: $(HEADERS) -$(MODEL)\smblib.obj: $(HEADERS) diff --git a/src/sbbs2/smb/121a/inet2smb.c b/src/sbbs2/smb/121a/inet2smb.c deleted file mode 100644 index beb692af1e..0000000000 --- a/src/sbbs2/smb/121a/inet2smb.c +++ /dev/null @@ -1,312 +0,0 @@ -/* Converts RFC #822 Internet Text Messages to SMB format */ - -#include <dos.h> -#include "smblib.h" - -/****************************************************************************** - Chops off the ":" and all spaces and tabs after it for the message headers -******************************************************************************/ -char *header(char *instr) -{ - char str[256],*p; - int i=0; - - p=strstr(instr,":"); - ++p; - while(*p==SP || *p==TAB) - ++p; - while(i<strlen(p)) { - if(p[i]==LF || p[i]==CR) { - p[i]=0; - break; } - ++i; } - return p; -} -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -/****************************************************************************** - Converts ASCII time in RFC 822 or RFC 1036 format to SMB when_t format -******************************************************************************/ -when_t imsgtime(char *str) -{ - char month[25],zone[25],*p; - struct date date; - struct time t; - when_t when; - -when.zone=0; /* Default to UT */ - -if(isdigit(str[1])) { /* Regular format: "01 Jan 86 0234 GMT" */ - date.da_day=atoi(str); - sprintf(month,"%3.3s",str+3); - if(!stricmp(month,"jan")) - date.da_mon=1; - else if(!stricmp(month,"feb")) - date.da_mon=2; - else if(!stricmp(month,"mar")) - date.da_mon=3; - else if(!stricmp(month,"apr")) - date.da_mon=4; - else if(!stricmp(month,"may")) - date.da_mon=5; - else if(!stricmp(month,"jun")) - date.da_mon=6; - else if(!stricmp(month,"jul")) - date.da_mon=7; - else if(!stricmp(month,"aug")) - date.da_mon=8; - else if(!stricmp(month,"sep")) - date.da_mon=9; - else if(!stricmp(month,"oct")) - date.da_mon=10; - else if(!stricmp(month,"nov")) - date.da_mon=11; - else - date.da_mon=12; - date.da_year=1900+atoi(str+7); - t.ti_hour=atoi(str+10); - t.ti_min=atoi(str+12); - t.ti_sec=0; - p=str+13; } - -else { /* USENET format: "Mon, 1 Jan 86 02:34:00 GMT" */ - date.da_day=atoi(str+5); - sprintf(month,"%3.3s",str+8); - if(!stricmp(month,"jan")) - date.da_mon=1; - else if(!stricmp(month,"feb")) - date.da_mon=2; - else if(!stricmp(month,"mar")) - date.da_mon=3; - else if(!stricmp(month,"apr")) - date.da_mon=4; - else if(!stricmp(month,"may")) - date.da_mon=5; - else if(!stricmp(month,"jun")) - date.da_mon=6; - else if(!stricmp(month,"jul")) - date.da_mon=7; - else if(!stricmp(month,"aug")) - date.da_mon=8; - else if(!stricmp(month,"sep")) - date.da_mon=9; - else if(!stricmp(month,"oct")) - date.da_mon=10; - else if(!stricmp(month,"nov")) - date.da_mon=11; - else - date.da_mon=12; - date.da_year=atoi(str+12); - if(date.da_year<100) - date.da_year+=1900; - p=str+12; - while(*p!=SP) p++; /* skip the year */ - while(*p==SP) p++; /* and white space */ - t.ti_hour=atoi(p); - t.ti_min=atoi(p+3); - t.ti_sec=atoi(p+6); - p=str+22; } - -when.time=dostounix(&date,&t); - -while(*p!=SP) p++; /* skip the time */ -while(*p==SP) p++; /* and white space */ - -sprintf(zone,"%-.5s",p); - -/* Get the zone */ -if(!strcmpi(zone,"GMT") || !strcmpi(zone,"UT")) - when.zone=0; -else if(!strcmpi(zone,"EST")) - when.zone=EST; -else if(!strcmpi(zone,"EDT")) - when.zone=EDT; -else if(!strcmpi(zone,"MST")) - when.zone=MST; -else if(!strcmpi(zone,"MDT")) - when.zone=MDT; -else if(!strcmpi(zone,"CST")) - when.zone=CST; -else if(!strcmpi(zone,"CDT")) - when.zone=CDT; -else if(!strcmpi(zone,"PST")) - when.zone=PST; -else if(!strcmpi(zone,"PDT")) - when.zone=PDT; - -else if(isalpha(zone[0]) && !zone[1]) { /* Military single character zone */ - zone[0]&=0xdf; /* convert to upper case */ - if(zone[0]>='A' && zone[0]<='I') - when.zone='@'-zone[0]; - else if(zone[0]>='K' && zone[0]<='M') /* J is not used */ - when.zone='A'-zone[0]; - else if(zone[0]>='N' && zone[0]<='Y') - when.zone=zone[0]-'M'; } - -else if((zone[0]=='+' || zone[0]=='-') && isdigit(zone[1])) { /* Literal */ - when.zone=(((zone[1]&0xf)*10)+(zone[2]&0xf))*60; /* Hours */ - when.zone+=atoi(zone+3); /* Minutes */ - if(zone[0]=='-') /* Negative? */ - when.zone=-when.zone; } - -return(when); -} - -void main(int argc, char **argv) -{ - FILE *stream; - char str[256]={NULL},filespec[256],file[256],*p,*abuf; - ushort i,xlat,net; - ulong l,length,datlen; - struct ffblk ff; - smbmsg_t msg; - smbstatus_t status; - - if(argc<2) { - printf("Usage: INET2SMB <file_spec> <smb_name>\r\n"); - exit(1); } - - strcpy(filespec,argv[1]); - strcpy(smb_file,argv[2]); - strupr(smb_file); - - smb_open(10); - if(!filelength(fileno(shd_fp))) - smb_create(2000,2000,0,0,10); - - i=findfirst(filespec,&ff,0); - while(!i) { - sprintf(file,"%s",ff.ff_name); - if((stream=fopen(file,"rb"))==NULL) { - printf("Error opening %s\r\n",file); - break; } - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - msg.hdr.when_imported.time=time(NULL); - msg.hdr.when_imported.zone=PST; /* set to local time zone */ - - while(str[0]!=CR && str[0]!=LF) { - fgets(str,81,stream); - if(!strnicmp(str,"Resent-",6)) { - p=strstr(str,"Resent-"); - sprintf(str,"%s",p); } - if(!strnicmp(str,"Return-Path",11) - || !strnicmp(str,"Path",4)) { - strcpy(str,header(str)); - smb_hfield(&msg,REPLYTO,strlen(str),str); } - else if(!strnicmp(str,"Date",4)) { - strcpy(str,header(str)); - msg.hdr.when_written=imsgtime(str); } - else if(!strnicmp(str,"From",4) || !strnicmp(str,"Sender",6)) { - strcpy(str,header(str)); - p=strstr(str," ("); - if(p) { - *p=0; - *(p+1)=0; - p+=2; - smb_hfield(&msg,SENDERNETADDR,strlen(str),str); - sprintf(str,"%s",p); - p=strstr(str,")"); - *p=0; } - smb_hfield(&msg,SENDER,strlen(str),str); - strlwr(str); - msg.idx.from=crc16(str); } - else if(!strnicmp(str,"Subject",7)) { - strcpy(str,header(str)); - smb_hfield(&msg,SUBJECT,strlen(str),str); - strlwr(str); - msg.idx.subj=crc16(str); } - else if(!strnicmp(str,"To",2)) { - strcpy(str,header(str)); - smb_hfield(&msg,RECIPIENT,strlen(str),str); - strlwr(str); - msg.idx.to=crc16(str); } - - /* Following are optional fields */ - - else if(!strnicmp(str,"Message-ID",10)) { - strcpy(str,header(str)); - smb_hfield(&msg,RFC822MSGID,strlen(str),str); } - else if(!strnicmp(str,"In-Reply-To",11)) { - strcpy(str,header(str)); - smb_hfield(&msg,RFC822REPLYID,strlen(str),str); } - - /* User defined extension field */ - - else if(!strnicmp(str,"X-",2)) { - if(strstr(str,"To")) { - strcpy(str,header(str)); - smb_hfield(&msg,RECIPIENT,strlen(str),str); - strlwr(str); - msg.idx.to=crc16(str); } - else - smb_hfield(&msg,RFC822HEADER,strlen(str),str); } - else - smb_hfield(&msg,RFC822HEADER,strlen(str),str); } - - l=ftell(stream); - fseek(stream,0L,SEEK_END); - length=ftell(stream)-l; - fseek(stream,l,SEEK_SET); - - if((abuf=(char *)MALLOC(length))==NULL) { - printf("alloc error\n"); - exit(1); } - fread(abuf,length,1,stream); - fclose(stream); - - net=NET_INTERNET; - smb_hfield(&msg,SENDERNETTYPE,sizeof(ushort),&net); - - if(smb_open_da(10)) { - printf("error opening %s.SDA\n",smb_file); - exit(1); } - msg.hdr.offset=smb_fallocdat(length+2,1); - fclose(sda_fp); - if(msg.hdr.offset && msg.hdr.offset<1L) { - printf("error %ld allocating records\r\n",msg.hdr.offset); - exit(1); } - fseek(sdt_fp,msg.hdr.offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,sdt_fp); - fwrite(abuf,SDT_BLOCK_LEN,smb_datblocks(length),sdt_fp); - FREE(abuf); - fflush(sdt_fp); - - smb_dfield(&msg,TEXT_BODY,length+2); - - smb_addmsghdr(&msg,&status,1,10); - smb_freemsgmem(msg); - i=findnext(&ff); } -} diff --git a/src/sbbs2/smb/121a/inet2smb.mak b/src/sbbs2/smb/121a/inet2smb.mak deleted file mode 100644 index 682933f636..0000000000 --- a/src/sbbs2/smb/121a/inet2smb.mak +++ /dev/null @@ -1,34 +0,0 @@ -############################### -# Makefile for INET2SMB # -# For use with Borland C++ # -# Tabstop=8 # -############################### - -# Macros -CC = bcc -LD = tlink -INCLUDE = \bc31\include -LIB = \bc31\lib -MODEL = s -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = -n -c -MAIN = inet2smb.exe -OBJS = inet2smb.obj smblib.obj smbvars.obj -HEADERS = smblib.h smbdefs.h crc32.h - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) -+ $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -# All .obj modules -inet2smb.obj: $(HEADERS) -smbvars.obj: $(HEADERS) -smblib.obj: $(HEADERS) diff --git a/src/sbbs2/smb/121a/lzh.c b/src/sbbs2/smb/121a/lzh.c deleted file mode 100644 index 2d21e4d55f..0000000000 --- a/src/sbbs2/smb/121a/lzh.c +++ /dev/null @@ -1,785 +0,0 @@ -/* LZH.C */ - -/* Digital Dynamics conversion of 1988 LZH (LHarc) encoding functions */ -/* Based on Japanese version 29-NOV-1988 */ -/* LZSS coded by Haruhiko Okumura */ -/* Adaptive Huffman Coding coded by Haruyasu Yoshizaki */ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#ifndef __WATCOMC__ - #include <alloc.h> -#endif - -/****************************************************************************/ -/* Memory allocation macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) - #if defined(__TURBOC__) - #define REALLOC(x,y) farrealloc(x,y) - #define LMALLOC(x) farmalloc(x) - #define MALLOC(x) farmalloc(x) - #define LFREE(x) farfree(x) - #define FREE(x) farfree(x) - #elif defined(__WATCOMC__) - #define REALLOC realloc - #define LMALLOC(x) halloc(x,1) /* far heap, but slow */ - #define MALLOC malloc /* far heap, but 64k max */ - #define LFREE hfree - #define FREE free - #else /* Other 16-bit Compiler */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free - #endif -#else /* 32-bit Compiler or Small Memory Model */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free -#endif - - - -typedef unsigned char uchar; - -/* LZSS Parameters */ - -#define LZH_N 4096 /* Size of string buffer */ -#define LZH_F 60 /* Size of look-ahead buffer */ -#define LZH_THRESHOLD 2 -#define LZH_NIL LZH_N /* End of tree's node */ - -#ifdef LZH_DYNAMIC_BUF - -unsigned char *lzh_text_buf; -short int lzh_match_position, lzh_match_length, - *lzh_lson, *lzh_rson, *lzh_dad; - -#else - -unsigned char lzh_text_buf[LZH_N + LZH_F - 1]; -short int lzh_match_position, lzh_match_length, - lzh_lson[LZH_N + 1], lzh_rson[LZH_N + 257], lzh_dad[LZH_N + 1]; - -#endif - - -void lzh_init_tree(void) /* Initializing tree */ -{ - short int i; - - for (i = LZH_N + 1; i <= LZH_N + 256; i++) - lzh_rson[i] = LZH_NIL; /* root */ - for (i = 0; i < LZH_N; i++) - lzh_dad[i] = LZH_NIL; /* node */ -} - -/******************************/ -/* Inserting node to the tree */ -/* Only used during encoding */ -/******************************/ -void lzh_insert_node(short int r) -{ - short int i, p, cmp; - unsigned char *key; - unsigned c; - - cmp = 1; - key = lzh_text_buf+r; - p = LZH_N + 1 + key[0]; - lzh_rson[r] = lzh_lson[r] = LZH_NIL; - lzh_match_length = 0; - for ( ; ; ) { - if (cmp >= 0) { - if (lzh_rson[p] != LZH_NIL) - p = lzh_rson[p]; - else { - lzh_rson[p] = r; - lzh_dad[r] = p; - return; - } - } else { - if (lzh_lson[p] != LZH_NIL) - p = lzh_lson[p]; - else { - lzh_lson[p] = r; - lzh_dad[r] = p; - return; - } - } - for (i = 1; i < LZH_F; i++) - if ((cmp = key[i] - lzh_text_buf[p + i]) != 0) - break; - if (i > LZH_THRESHOLD) { - if (i > lzh_match_length) { - lzh_match_position = ((r - p) & (LZH_N - 1)) - 1; - if ((lzh_match_length = i) >= LZH_F) - break; - } - if (i == lzh_match_length) { - if ((c = ((r - p) & (LZH_N - 1)) - 1) < lzh_match_position) { - lzh_match_position = c; - } - } - } - } - lzh_dad[r] = lzh_dad[p]; - lzh_lson[r] = lzh_lson[p]; - lzh_rson[r] = lzh_rson[p]; - lzh_dad[lzh_lson[p]] = r; - lzh_dad[lzh_rson[p]] = r; - if (lzh_rson[lzh_dad[p]] == p) - lzh_rson[lzh_dad[p]] = r; - else - lzh_lson[lzh_dad[p]] = r; - lzh_dad[p] = LZH_NIL; /* remove p */ -} - -void lzh_delete_node(short int p) /* Deleting node from the tree */ -{ - short int q; - - if (lzh_dad[p] == LZH_NIL) - return; /* unregistered */ - if (lzh_rson[p] == LZH_NIL) - q = lzh_lson[p]; - else - if (lzh_lson[p] == LZH_NIL) - q = lzh_rson[p]; - else { - q = lzh_lson[p]; - if (lzh_rson[q] != LZH_NIL) { - do { - q = lzh_rson[q]; - } while (lzh_rson[q] != LZH_NIL); - lzh_rson[lzh_dad[q]] = lzh_lson[q]; - lzh_dad[lzh_lson[q]] = lzh_dad[q]; - lzh_lson[q] = lzh_lson[p]; - lzh_dad[lzh_lson[p]] = q; - } - lzh_rson[q] = lzh_rson[p]; - lzh_dad[lzh_rson[p]] = q; - } - lzh_dad[q] = lzh_dad[p]; - if (lzh_rson[lzh_dad[p]] == p) - lzh_rson[lzh_dad[p]] = q; - else - lzh_lson[lzh_dad[p]] = q; - lzh_dad[p] = LZH_NIL; -} - -/* Huffman coding parameters */ - -#define LZH_N_CHAR (256 - LZH_THRESHOLD + LZH_F) - /* character code (= 0..LZH_N_CHAR-1) */ -#define LZH_T (LZH_N_CHAR * 2 - 1) /* Size of table */ -#define LZH_R (LZH_T - 1) /* root position */ -#define MAX_FREQ 0x8000 - /* update when cumulative frequency */ - /* reaches to this value */ - -/* - * Tables for encoding/decoding upper 6 bits of - * sliding dictionary pointer - */ -/* encoder table */ -uchar lzh_p_len[64] = { - 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 -}; - -uchar lzh_p_code[64] = { - 0x00, 0x20, 0x30, 0x40, 0x50, 0x58, 0x60, 0x68, - 0x70, 0x78, 0x80, 0x88, 0x90, 0x94, 0x98, 0x9C, - 0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC, - 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, - 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE, - 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, - 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -}; - -/* decoder table */ -uchar lzh_d_code[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, - 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, - 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, - 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, - 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, - 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, - 0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, - 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F, - 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, - 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, - 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, - 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, -}; - -uchar lzh_d_len[256] = { - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -}; - -#ifdef LZH_DYNAMIC_BUF - -unsigned short *lzh_freq=NULL; /* cumulative freq table */ - -/* - * pointing parent nodes. - * area [LZH_T..(LZH_T + LZH_N_CHAR - 1)] are pointers for leaves - */ -short int *lzh_prnt=NULL; - -/* pointing children nodes (son[], son[] + 1)*/ -short int *lzh_son=NULL; - -#else /* STATIC */ - -unsigned short lzh_freq[LZH_T + 1]; /* cumulative freq table */ -short int lzh_prnt[LZH_T + LZH_N_CHAR]; -short int lzh_son[LZH_T + 1]; /* bug fixed by Digital Dynamics */ - -#endif - - -unsigned short lzh_getbuf = 0; /* Was just "unsigned" fixed 04/12/95 */ -uchar lzh_getlen = 0; - -int lzh_getbit(uchar *inbuf, long *incnt, long inlen) /* get one bit */ -{ - short int i; - - while (lzh_getlen <= 8) { - if((*incnt)>=inlen) - i=0; - else - i=inbuf[(*incnt)++]; - lzh_getbuf |= i << (8 - lzh_getlen); - lzh_getlen += 8; - } - i = lzh_getbuf; - lzh_getbuf <<= 1; - lzh_getlen--; - return (i < 0); -} - -short int lzh_getbyte(uchar *inbuf, long *incnt, long inlen) /* get a byte */ -{ - unsigned short i; - - while (lzh_getlen <= 8) { - if((*incnt)>=inlen) - i=0; - else - i=inbuf[(*incnt)++]; - lzh_getbuf |= i << (8 - lzh_getlen); - lzh_getlen += 8; - } - i = lzh_getbuf; - lzh_getbuf <<= 8; - lzh_getlen -= 8; - return i >> 8; -} - -unsigned lzh_putbuf = 0; -uchar lzh_putlen = 0; - -/* output c bits */ -void lzh_putcode(short int l, unsigned short c, uchar *outbuf, long *outlen) -{ - lzh_putbuf |= c >> lzh_putlen; - if ((lzh_putlen += l) >= 8) { - outbuf[(*outlen)++]=(lzh_putbuf >> 8); - if ((lzh_putlen -= 8) >= 8) { - outbuf[(*outlen)++]=lzh_putbuf; - lzh_putlen -= 8; - lzh_putbuf = c << (l - lzh_putlen); - } else { - lzh_putbuf <<= 8; - } - } -} - - -/* initialize freq tree */ - -void lzh_start_huff() -{ - short int i, j; - -lzh_getbuf = 0; /* Added by Digital Dynamics for repeating operations */ -lzh_getlen = 0; -lzh_putbuf = 0; -lzh_putlen = 0; - - for (i = 0; i < LZH_N_CHAR; i++) { - lzh_freq[i] = 1; - lzh_son[i] = i + LZH_T; - lzh_prnt[i + LZH_T] = i; - } - i = 0; j = LZH_N_CHAR; - while (j <= LZH_R) { - lzh_freq[j] = lzh_freq[i] + lzh_freq[i + 1]; - lzh_son[j] = i; - lzh_prnt[i] = lzh_prnt[i + 1] = j; - i += 2; j++; - } - lzh_freq[LZH_T] = 0xffff; - lzh_prnt[LZH_R] = 0; -} - - -/* reconstruct freq tree */ - -void lzh_reconst() -{ - short int i, j, k; - unsigned short f, l; - - /* halven cumulative freq for leaf nodes */ - j = 0; - for (i = 0; i < LZH_T; i++) { - if (lzh_son[i] >= LZH_T) { - lzh_freq[j] = (lzh_freq[i] + 1) / 2; - lzh_son[j] = lzh_son[i]; - j++; - } - } - /* make a tree : first, connect children nodes */ - for (i = 0, j = LZH_N_CHAR; j < LZH_T; i += 2, j++) { - k = i + 1; - f = lzh_freq[j] = lzh_freq[i] + lzh_freq[k]; - for (k = j - 1; f < lzh_freq[k]; k--); - k++; - l = (j - k) * 2; - - /* movmem() is Turbo-C dependent - rewritten to memmove() by Kenji */ - - /* movmem(&lzh_freq[k], &lzh_freq[k + 1], l); */ - (void)memmove(lzh_freq+k+1,lzh_freq+k, l); - lzh_freq[k] = f; - /* movmem(&lzh_son[k], &lzh_son[k + 1], l); */ - (void)memmove(lzh_son+k+1,lzh_son+k, l); - lzh_son[k] = i; - } - /* connect parent nodes */ - for (i = 0; i < LZH_T; i++) { - if ((k = lzh_son[i]) >= LZH_T) { - lzh_prnt[k] = i; - } else { - lzh_prnt[k] = lzh_prnt[k + 1] = i; - } - } -} - -/* update freq tree */ - -void lzh_update(short int c) -{ - short int i, j, k, l; - - if (lzh_freq[LZH_R] == MAX_FREQ) { - lzh_reconst(); - } - c = lzh_prnt[c + LZH_T]; - do { - k = ++lzh_freq[c]; - - /* swap nodes to keep the tree freq-ordered */ - if (k > lzh_freq[l = c + 1]) { - while (k > lzh_freq[++l]); - l--; - lzh_freq[c] = lzh_freq[l]; - lzh_freq[l] = k; - - i = lzh_son[c]; - lzh_prnt[i] = l; - if (i < LZH_T) lzh_prnt[i + 1] = l; - - j = lzh_son[l]; - lzh_son[l] = i; - - lzh_prnt[j] = c; - if (j < LZH_T) lzh_prnt[j + 1] = c; - lzh_son[c] = j; - - c = l; - } - } while ((c = lzh_prnt[c]) != 0); /* do it until reaching the root */ -} - -unsigned short lzh_code, lzh_len; - -void lzh_encode_char(unsigned short c, uchar *outbuf, long *outlen) -{ - unsigned short i; - short int j, k; - - i = 0; - j = 0; - k = lzh_prnt[c + LZH_T]; - - /* search connections from leaf node to the root */ - do { - i >>= 1; - - /* - if node's address is odd, output 1 - else output 0 - */ - if (k & 1) i += 0x8000; - - j++; - } while ((k = lzh_prnt[k]) != LZH_R); - lzh_putcode(j, i, outbuf, outlen); - lzh_code = i; - lzh_len = j; - lzh_update(c); -} - -void lzh_encode_position(unsigned short c, uchar *outbuf, long *outlen) -{ - unsigned short i; - - /* output upper 6 bits with encoding */ - i = c >> 6; - lzh_putcode(lzh_p_len[i], (unsigned)lzh_p_code[i] << 8, outbuf, outlen); - - /* output lower 6 bits directly */ - lzh_putcode(6, (c & 0x3f) << 10, outbuf, outlen); -} - -void lzh_encode_end(uchar *outbuf, long *outlen) -{ - if (lzh_putlen) { - outbuf[(*outlen)++]=(lzh_putbuf >> 8); - } -} - -short int lzh_decode_char(uchar *inbuf, long *incnt, long inlen) -{ - unsigned short c; - - c = lzh_son[LZH_R]; - - /* - * start searching tree from the root to leaves. - * choose node #(lzh_son[]) if input bit == 0 - * else choose #(lzh_son[]+1) (input bit == 1) - */ - while (c < LZH_T) { - c += lzh_getbit(inbuf,incnt,inlen); - c = lzh_son[c]; - } - c -= LZH_T; - lzh_update(c); - return c; -} - -short int lzh_decode_position(uchar *inbuf, long *incnt, long inlen) -{ - unsigned short i, j, c; - - /* decode upper 6 bits from given table */ - i = lzh_getbyte(inbuf,incnt,inlen); - c = (unsigned)lzh_d_code[i] << 6; - j = lzh_d_len[i]; - - /* input lower 6 bits directly */ - j -= 2; - while (j--) { - i = (i << 1) + lzh_getbit(inbuf,incnt,inlen); - } - return c | i & 0x3f; -} - -/* Compression */ - -/* Encoding/Compressing */ -/* Returns length of outbuf */ -long lzh_encode(uchar *inbuf, long inlen, uchar *outbuf) -{ - short int i, c, len, r, s, last_match_length; - long incnt,outlen; /* textsize=0; */ - -#ifdef LZH_DYNAMIC_BUF - - if((lzh_text_buf=(uchar *)MALLOC(LZH_N + LZH_F - 1))==NULL) - return(-1); - if((lzh_freq=(unsigned short*)MALLOC((LZH_T + 1)*sizeof(unsigned short)))==NULL) { - FREE(lzh_text_buf); - return(-1); } - if((lzh_prnt=(short *)MALLOC((LZH_T + LZH_N_CHAR)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_freq); - return(-1); } - if((lzh_son=(short *)MALLOC((LZH_T + 1) * sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - return(-1); } - if((lzh_lson=(short *)MALLOC((LZH_N + 1)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - return(-1); } - if((lzh_rson=(short *)MALLOC((LZH_N + 257)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - return(-1); } - if((lzh_dad=(short *)MALLOC((LZH_N + 1)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - FREE(lzh_rson); - return(-1); } -#endif - - incnt=0; - memcpy(outbuf,&inlen,sizeof(inlen)); - outlen=sizeof(inlen); - if(!inlen) { -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - FREE(lzh_rson); - FREE(lzh_dad); -#endif - return(outlen); } - lzh_start_huff(); - lzh_init_tree(); - s = 0; - r = LZH_N - LZH_F; - for (i = s; i < r; i++) - lzh_text_buf[i] = ' '; - for (len = 0; len < LZH_F && incnt<inlen; len++) - lzh_text_buf[r + len] = inbuf[incnt++]; - /* textsize = len; */ - for (i = 1; i <= LZH_F; i++) - lzh_insert_node(r - i); - lzh_insert_node(r); - do { - if (lzh_match_length > len) - lzh_match_length = len; - if (lzh_match_length <= LZH_THRESHOLD) { - lzh_match_length = 1; - lzh_encode_char(lzh_text_buf[r],outbuf,&outlen); - } else { - lzh_encode_char(255 - LZH_THRESHOLD + lzh_match_length - ,outbuf,&outlen); - lzh_encode_position(lzh_match_position - ,outbuf,&outlen); - } - last_match_length = lzh_match_length; - for (i = 0; i < last_match_length && incnt<inlen; i++) { - lzh_delete_node(s); - c=inbuf[incnt++]; - lzh_text_buf[s] = c; - if (s < LZH_F - 1) - lzh_text_buf[s + LZH_N] = c; - s = (s + 1) & (LZH_N - 1); - r = (r + 1) & (LZH_N - 1); - lzh_insert_node(r); - } -/*** - if ((textsize += i) > printcount) { - printf("%12ld\r", textsize); - printcount += 1024; - } -***/ - while (i++ < last_match_length) { - lzh_delete_node(s); - s = (s + 1) & (LZH_N - 1); - r = (r + 1) & (LZH_N - 1); - if (--len) lzh_insert_node(r); - } - } while (len > 0); - lzh_encode_end(outbuf,&outlen); -/* - printf("input: %ld (%ld) bytes\n", inlen,textsize); - printf("output: %ld bytes\n", outlen); - printf("output/input: %.3f\n", (double)outlen / inlen); -*/ - -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - FREE(lzh_rson); - FREE(lzh_dad); -#endif - - return(outlen); -} - -/* Decoding/Uncompressing */ -/* Returns length of outbuf */ -long lzh_decode(uchar *inbuf, long inlen, uchar *outbuf) -{ - short int i, j, k, r, c; - unsigned long int count; - long incnt,textsize; - -#ifdef LZH_DYNAMIC_BUF - - if((lzh_text_buf=(uchar *)MALLOC((LZH_N + LZH_F - 1)*2))==NULL) - return(-1); - if((lzh_freq=(unsigned short *)MALLOC((LZH_T + 1)*sizeof(unsigned short))) - ==NULL) { - FREE(lzh_text_buf); - return(-1); } - if((lzh_prnt=(short *)MALLOC((LZH_T + LZH_N_CHAR)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_freq); - return(-1); } - if((lzh_son=(short *)MALLOC((LZH_T + 1) * sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - return(-1); } - -#endif - - incnt=0; - memcpy(&textsize,inbuf,sizeof(textsize)); - incnt+=sizeof(textsize); - if (textsize == 0) { -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); -#endif - return(textsize); } - lzh_start_huff(); - for (i = 0; i < LZH_N - LZH_F; i++) - *(lzh_text_buf+i) = ' '; - r = LZH_N - LZH_F; - for (count = 0; count < textsize; ) { - c = lzh_decode_char(inbuf,&incnt,inlen); - if (c < 256) { - outbuf[count]=c; -#if 0 - if(r>(LZH_N + LZH_F - 1) || r<0) { - printf("Overflow! (%d)\n",r); - getch(); - exit(-1); } -#endif - *(lzh_text_buf+r) = c; - r++; - r &= (LZH_N - 1); - count++; - } else { - i = (r - lzh_decode_position(inbuf,&incnt,inlen) - 1) - & (LZH_N - 1); - j = c - 255 + LZH_THRESHOLD; - for (k = 0; k < j && count<textsize; k++) { - c = lzh_text_buf[(i + k) & (LZH_N - 1)]; - outbuf[count]=c; -#if 0 - if(r>(LZH_N + LZH_F - 1) || r<0) { - printf("Overflow! (%d)\n",r); - exit(-1); } -#endif - *(lzh_text_buf+r) = c; - r++; - r &= (LZH_N - 1); - count++; - } - } - } -/*** - printf("%12ld\n", count); -***/ - -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); -#endif - -return(count); -} - - diff --git a/src/sbbs2/smb/121a/lzh.h b/src/sbbs2/smb/121a/lzh.h deleted file mode 100644 index 68a71dd90c..0000000000 --- a/src/sbbs2/smb/121a/lzh.h +++ /dev/null @@ -1,5 +0,0 @@ -/* LZH.H */ - -long lzh_encode(uchar *inbuf, long inlen, uchar *outbuf); -long lzh_decode(uchar *inbuf, long inlen, uchar *outbuf); - diff --git a/src/sbbs2/smb/121a/qwk2smb.c b/src/sbbs2/smb/121a/qwk2smb.c deleted file mode 100644 index acf65074c7..0000000000 --- a/src/sbbs2/smb/121a/qwk2smb.c +++ /dev/null @@ -1,296 +0,0 @@ -/* QWK2SMB.C */ - -/* Converts QWK packet to to SMB formatted message bases */ - -/* The intention of this source code is an example of how to use the SMBLIB */ -/* library functions to access an SMB format message base. */ - -/* This program and source code are freeware. May be used in part or whole */ -/* for any purpose without consent or notification of Digital Dynamics. */ - -/* Digital Dynamics does request that developers that release products that */ -/* support the SMB format notify Digital Dynamics so the implementation */ -/* and contact chapters in the technical specification may be updated. */ - -#include "smblib.h" -#include "crc32.h" -#include <dos.h> - -char sbbs[128]; - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=' ') c--; -str[c]=0; -} - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(f.ff_fsize); -return(-1L); -} - -/****************************************************************************/ -/* Returns the FidoNet address kept in str as ASCII. */ -/****************************************************************************/ -fidoaddr_t atofaddr(char *str) -{ - char *p; - fidoaddr_t addr; - -addr.zone=addr.net=addr.node=addr.point=0; -if((p=strchr(str,':'))!=NULL) { - addr.zone=atoi(str); - addr.net=atoi(p+1); } -else { - addr.zone=1; - addr.net=atoi(str); } -if(!addr.zone) /* no such thing as zone 0 */ - addr.zone=1; -if((p=strchr(str,'/'))!=NULL) - addr.node=atoi(p+1); -else { - addr.net=1; - addr.node=atoi(str); } -if((p=strchr(str,'.'))!=NULL) - addr.point=atoi(p+1); -return(addr); -} - - -int main(int argc, char **argv) -{ - uchar *p,str[128],from[128],to[128],subj[128],block[128],*buf; - ushort xlat; - ushort i,j,k,msgs,total; - ulong l,m,length,size,crc; - FILE *qwk; - struct date date; - struct time curtime; - smbmsg_t msg; - smbstatus_t status; - -if(argc<2) { - printf("usage: qwk2smb <qwk_dir>\r\n"); - exit(1); } - -sprintf(str,"%s\\MESSAGES.DAT",argv[1]); -if((qwk=fopen(str,"rb"))==NULL) { - printf("error opening %s\n",str); - exit(1); } - -size=filelength(fileno(qwk)); -smb_file[0]=0; - -for(l=128,i=1,msgs=total=1;l<size;l+=i*128) { - fseek(qwk,l,SEEK_SET); - if(!fread(block,1,128,qwk)) - break; - i=atoi(block+116); /* i = number of 128 byte records */ - if(i<2) { - i=1; - continue; } - - j=(ushort)block[123]|(((ushort)block[124])<<8); /* conference number */ - - if(strcmp(smb_file,itoa(j,str,10))) { /* changed conference */ - fclose(sdt_fp); - fclose(shd_fp); - fclose(sid_fp); - strcpy(smb_file,str); - printf("\nConference #%s\n",str); - msgs=1; - k=smb_open(10); - if(k) { - printf("smb_open returned %d\n",k); - exit(1); } - if(!filelength(fileno(shd_fp))) /* new conference */ - smb_create(2000,2000,0,0,10); } - - smb_getstatus(&status); // Initialized for first call to smb_addcrc() - - printf("%u (total=%u)\r",msgs,total); - - /*****************************/ - /* Initialize the SMB header */ - /*****************************/ - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - - /**************************/ - /* Convert the QWK header */ - /**************************/ - - if(block[0]=='*' || block[0]=='+') - msg.idx.attr|=MSG_PRIVATE; - if(block[0]=='*' || block[0]=='-' || block[0]=='`') - msg.idx.attr|=MSG_READ; - msg.hdr.attr=msg.idx.attr; - - date.da_mon=((block[8]&0xf)*10)+(block[9]&0xf); - date.da_day=((block[11]&0xf)*10)+(block[12]&0xf); - date.da_year=((block[14]&0xf)*10)+(block[15]&0xf)+1900; - curtime.ti_hour=((block[16]&0xf)*10)+(block[17]&0xf); - curtime.ti_min=((block[19]&0xf)*10)+(block[20]&0xf); - curtime.ti_sec=0; - msg.hdr.when_written.time=dostounix(&date,&curtime); - msg.hdr.when_written.zone=PST; /* set to local time zone */ - msg.hdr.when_imported.time=time(NULL); - msg.hdr.when_imported.zone=PST; /* set to local time zone */ - - sprintf(to,"%25.25s",block+21); /* To user */ - truncsp(to); - smb_hfield(&msg,RECIPIENT,strlen(to),to); - strlwr(to); - msg.idx.to=crc16(to); - - sprintf(from,"%25.25s",block+46); /* From user */ - truncsp(from); - smb_hfield(&msg,SENDER,strlen(from),from); - strlwr(from); - msg.idx.from=crc16(from); - - sprintf(subj,"%25.25s",block+71); /* Subject */ - truncsp(subj); - smb_hfield(&msg,SUBJECT,strlen(subj),subj); - strlwr(subj); - msg.idx.subj=crc16(subj); - - /********************************/ - /* Convert the QWK message text */ - /********************************/ - - length=0; - if((buf=MALLOC((i-1)*128*2))==NULL) { - printf("memory allocation error\n"); - exit(1); } - for(j=1;j<i;j++) { - if(!fread(block,1,128,qwk)) - break; - for(k=0;k<128;k++) { - if(block[k]==0) - continue; - if(block[k]==0xE3) { /* expand 0xe3 to crlf */ - buf[length++]=CR; - buf[length++]=LF; - continue; } - buf[length++]=block[k]; } } - - while(length && buf[length-1]<=SP) length--; /* remove trailing garbage */ - - /*****************/ - /* Calculate CRC */ - /*****************/ - - crc=0xffffffffUL; - for(m=0;m<length;m++) - crc=ucrc32(buf[m],crc); - crc=~crc; - - /*******************/ - /* Check for dupes */ - /*******************/ - - j=smb_addcrc(status.max_crcs,crc,10); - if(j) { - if(j==1) { - printf("\nDuplicate message\n"); - smb_freemsgmem(msg); - FREE(buf); - continue; } - printf("smb_addcrc returned %d\n",j); - exit(1); } - - /*************************************/ - /* Write SMB message header and text */ - /*************************************/ - - length+=2; /* for translation string */ - - if(smb_open_da(10)) { - printf("error opening %s.SDA\n",smb_file); - exit(1); } - msg.hdr.offset=smb_fallocdat(length,1); - fclose(sda_fp); - if(msg.hdr.offset && msg.hdr.offset<1L) { - printf("error %ld allocating blocks\r\n",msg.hdr.offset); - exit(1); } - fseek(sdt_fp,msg.hdr.offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,sdt_fp); - fwrite(buf,length,1,sdt_fp); - fflush(sdt_fp); - - smb_dfield(&msg,TEXT_BODY,length); - - k=smb_addmsghdr(&msg,&status,1,10); - if(k) { - printf("smb_addmsghdr returned %d\n",k); - exit(1); } - smb_freemsgmem(msg); - FREE(buf); - msgs++; - total++; } - -return(0); -} - diff --git a/src/sbbs2/smb/121a/qwk2smb.mak b/src/sbbs2/smb/121a/qwk2smb.mak deleted file mode 100644 index 242f1111d2..0000000000 --- a/src/sbbs2/smb/121a/qwk2smb.mak +++ /dev/null @@ -1,34 +0,0 @@ -############################### -# Makefile for QWK2SMB # -# For use with Borland C++ # -# Tabstop=8 # -############################### - -# Macros -CC = bcc -LD = tlink -INCLUDE = \bc31\include -LIB = \bc31\lib -MODEL = s -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = -n -c -MAIN = qwk2smb.exe -OBJS = qwk2smb.obj smblib.obj smbvars.obj -HEADERS = smblib.h smbdefs.h crc32.h - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) -+ $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -# All .obj modules -qwk2smb.obj: $(HEADERS) -smbvars.obj: $(HEADERS) -smblib.obj: $(HEADERS) diff --git a/src/sbbs2/smb/121a/smb.hst b/src/sbbs2/smb/121a/smb.hst deleted file mode 100644 index 24472860e6..0000000000 --- a/src/sbbs2/smb/121a/smb.hst +++ /dev/null @@ -1,303 +0,0 @@ -Synchronet Message Base Specification Modification History -========================================================== - -****************************** -01/20/94 Initial Release v1.00 -****************************** - -Quite a few spelling errors in SMB.TXT corrected. - -Estimated maximum number of messages (in Introduction of SMB.TXT) formula -corrected (1500 rounded to nearest 256 is 1536, not 2048). - -Pages 32 and 38 (SENDEREXT and RECIPIENTEXT header field types) incorrectly -stated the index record contains CRC-32s, when in fact the index contains -CRC-16s of the agent names or extensions. - -FORWARDTO header field types incorrectly stated they were for replies, rather -than forwarding instructions. - -Trigger header field types incorrectly stated they were "attachments" rather -than triggers. - -Bug fixed in smb_open() function in smblib.c: was allocating buffer via -setvbuf for wrong file pointer when opening header file. Caused loss of -memory (2k) everytime smb_open() was called. - -Bug fixed in smb_getmsghdr() function in smblib.c: msg->from_agent,to_agent, -and replyto_agent were not initialized properly. - -Added from_ext, to_ext, and replyto_ext fields to msg struct. Initialized -with call to smb_getmsghdr() function. These are convenience pointers for -the to, from, and replyto agent extensions (user numbers, usually). - -Fixed a nasty bug in the smb_freemsgdat() function, causing odd values in the -SDA file and cross-linked messages when fast allocation mode was not used for -new messages. - -smb_putmsghdr() function replaced by smb_putmsg() and it calls smb_putmsghdr() -and smb_putmsgidx() - previously smb_putmsghdr() actually wrote the header -and the index. So you must change any occurances of smb_putmsghdr() to -smb_putmsg() if you intend to write to both the index and header records. - -smb_open() now takes a "retry_time" parameter (number of seconds) to lock -and read the message base header and verify the "id" and "version". Added -new error codes: -1 indicates failure to lock message base header, -2 indicates -id mismatch, and -3 indicates incompatible message base version. - -rewind() and clearerr() calls added to library functions to eliminate the -problem of "sticky" error flags when using fread() and fwrite(). Reordered -the use of chsize() to force seeking (with fseek()) before using the file -descriptor operation (chsize()) would would fail under some circumstances. - -smb_getmsgidx() function now uses "fast" message number look-up algorythm. - -Added smb_getlastidx() function to retrieve the last index in the message -base. - -Allocation strategy for hfield and dfield elements of the smbmsg_t structure -were changed to require less memory. Rather than an array of pointers (pointer -to a pointer) of type hfield_t or dfield_t, they are simply an array (pointer) -of type hfield_t or dfield_t. The only change you need to make are any -references to "smbmsg_t.hfield[x]->etc" to "smbmsg_t.hfield[x].etc". - -Added several new error codes to smb_getmsghdr(). -7 indicates missing one -of the three mandatory header fields (sender, recipient, or subject). -8 -indicates that total_dfields element of smbhdr_t is incorrect (extends beyond -smbhdr_t.length). -9 indicates incompatible header version. - -New error code to smb_addcrc(), -4 indicates error getting length of file. - -smb_putmsghdr() returns -2 on failure write header, -3 on failure to write -dfield, -4 on failure to write hfield (fixed), -5 on failure to write hfield -(data), and -6 on failure to pad record with NULLs. - -Bugs fixed in sample conversion source code and SMBUTIL: Overwriting first -two bytes of next record when using self-packing storage, SBBSFIDO would -crash on blank kludge lines, SEEN-BYs weren't converted properly by SBBSFIDO, -and more. - -*** IMPORTANT *** -Index format changed, added message time field to idxrec_t for fast pointer -manipulation by (import) date/time stamp. This is SMB format v1.10 and is -not compatible with the v1.00 format. A conversion program (100TO110.EXE) -is included with source code for converted any existing message bases. - -CHKSMB, a utility for checking message bases for corruption, included with -SMBLIB. - -SMBUTIL and CHKSMB both accept wildcard arguments for processing multiple -message bases. - -idxrec_t.to and idxrec_t.from may contain USER NUMBER instead of CRC of user -names. This implementation is currently specific to E-mail boxes on Synchronet -BBS. E-mail from non-local users are stored with a "from" field of 0. - -********************** -03/28/94 Release v1.10 -********************** - -Forgot to include this file (oops). - -*********************** -03/28/94 Release v1.10a -*********************** - -Fixed problem with buffered fread() routine attempting to read into a locked -regions. - -Added smb_stack() function for saving (pushing) currently open message base -and ability to pop it off later. - -Added fix for keeping original sender information in smbmsg_t structure when -a message has been forwarded. - -CHKSMB now correctly support multiple destination messages (without reporting -missallocated active data blocks) and now reports packable bytes available. - -SMBUTIL can now conditionally compress a message base, only if so many K are -compressable. - -Fixed problem with incorrect UTC value. - -Added NET_WWIV network type. - -********************** -06/02/94 Release v1.11 -********************** - -Created Watcom compatible MAKEFILE for DOS, 32-bit DOS, and 32-bit OS/2 -versions of SMBUTIL. - -Enhanced macro definitions in SMBDEFS.H for MALLOC, FREE, and REALLOC to -support Watcom and other compilers other than Borland. Also added LMALLOC -and LFREE macros for large allocation (>64k) operations. - -Fixed problem with multiple calls to setvbuf() when using Watcom C libraries. -Memory allocated by setvbuf() would never be released. To work around this -Watcom C bug, a static buffer, shd_buf[], is now used instead. - -Fixed bug in smb_getmsghdr() that would cause it to return -6 when attempting -to allocate 0 length header fields. - -Added LZH.C to SMBLIB for message data compression/decompression. - -Removed the 16-bit CRC functions from SMBUTIL and put them in CRC16.C (now part -of SMBLIB) for easier integration into other applications. - -Added Hyper Allocation storage method to specification: smbstatus_t.reserved -changed to smbstatus_t.attr and SMB_HYPERALLOC bit is set when Hyper Allocation -storage is used for a message base. This is the only change between v1.10 and -v1.20 of the message base format. No other bits in smbstatus_t.attr are -currently defined. See the specification for definition of the Hyper Allocation -storage method. - -Changed SMB Storage and Retrieval Protocol chapters in the specification to -Pseudo-code examples. - -Added SMBLIB Storage and Retrieval C example chapters to the specification. - -Added field descriptions for message base header record fields and Status Info -(base header #1) record fields to the specification. - -Changed SMBLIB smb_addmsghdr() 'fast' argument to 'storage' to specify the -storage method to use (either SMB_SELFPACK, SMB_FASTALLOC, or SMB_HYPERALLOC). -Previous usage (0 for self-pack, 1 for fast) still compatible. - -Added smb_hallocdat() and smb_hallochdr() to SMBLIB functions for the Hyper -Allocation storage method. - -Added SMB_STACK_XCHNG operation to smb_stack() function, to exchange the top -of the stack with the currently open message base. - -********************** -02/14/95 Release v1.20 -********************** - -smb_close() was modified in the following ways: - Only attempts to close non-NULL file pointers - If shd_fp is currently open, calls smb_unlocksmbhdr() before closing - (just in case it was left locked by application) - -smb_open() was modified in the following ways: - Initializes all file pointers to NULL - calls smb_close() if any of the files couldn't be opened - -smb_locksmbhdr() was modified in the following ways: - If lock fails, attempts to unlock the header before next lock - attempt (just incase application attempts to lock a locked - header without first unlocking it) - -smb_lockmsghdr() was modified in the following ways: - If lock fails, attempts to unlock the header before next lock - attempt (same reason stated above) - -CHKSMB (1.21) was modified in the following ways: - Tests for valid translations strings in the .SDT files - Displays totals for bytes used by header and data blocks, bytes used - by deleted messages, and bytes saved by LZH compression - -SMBUTIL (1.21) underwent some minor cosmetic changes. - -*********************** -03/18/95 Release v1.20a -*********************** - -SMBUTIL (1.22) now compiles correctly under Watcom, using correct time zone -information. SMBUTIL maint() will no longer delete messages if max_age is -specified in the SMB header and the when_imported time for a message is in the -future. - -Fixed problem in LZH.C that would cause lzh_decode() to generate exception -errors when compiled with a 32-bit compiler. - -CHKSMB (1.22) now supports /E command line switch to display extended -information about corrupted messages. CHKSMB.C is now Watcom compatible. - -Added fflush() calls to all smblib functions that write to the SDT, SHA, or SDA -files. This eliminates the problem of duplicate data offsets (data blocks for -multiple messages pointing to the same location) causing corrupted SDT files -(unsupported translation types reported by CHKSMB). - -Added fflush() call after writing to SDT file in SMB_PUT example in SMB.TXT. - -Fixed example *2SMB.C files to be compatible with SMBLIB v1.20 smb_create() -function. - -Fixed smb_hallocdat() function prototype to stop redeclaration warnings. - -Minor typos in specification fixed. - -*********************** -04/24/95 Release v1.20b -*********************** - -Added SMB_EMAIL (1<<0) attribute definition for the message base status header -to specify a local e-mail message base where index "to" and "from" fields are -stored as user numbers, not CRC-16s (this is the only change between v1.20 -and v1.21 of the SMB format). - -Version 1.21 of FIXSMB no longer needs the "/M" switch to correctly fix a -Synchronet e-mail message base (as long as the SMB_EMAIL status attr is set). - -Version 1.23 of SMBUTIL can now import text into a Synchronet e-mail message -base (as long as the SMB_EMAIL status attr has been set). It will ask for the -sender and recipient user numbers. Fixed an apparently nasty bug that would -cause damage to message bases when (I)mporting (check for SMB_HYPERALLOC -attribute was backwards). Excess baggage in the SMBUTIL source code was also -removed (no longer supports /L, /F, and /D command line switches). Only -supports self-packing and hyper-allocated message bases (it will not damage -fast allocated bases, however). "SMBUTIL M" now correctly handles message bases -that contain messages that have been pre-flagged for deletion (MSG_DELETE attr -set). - -Changed smb_open(int retry_count) function: if retry_count is 0, then a "fast -open" method is used which doesn't lock and read the status header to check -for compatibility and validity of message base. - -Added SMBLIB_VERSION definition (string constant) to contain the current -version and revision (if applicable) of the SMB library. This version number -may not always be the same as SMB_VERSION (version of the SMB format) or the -current version of the specification. It may be helpful to include a display -of this version number somewhere in your application (i.e. printf("SMBLIB v%s" -,SMBLIB_VERSION);). - -Changed smb_stack() example in the Performance Issues chapter to keep two -message bases always open using SMB_STACK_XCHNG. - -Fixed bug in SMBUTIL that would cause an infinite loop when analysing an -extrememly corrupted HyperAllocated message base. - -Fixed bug in smb_stack() function when using SMB_STACK_XCHNG operation. Would -previously set current message base to an undefined message base, rather than -the message base on top of the stack (last pushed or exchanged). - -CHKSMB v1.22 compiled in the 1.20b release did not support wildcards (wasn't -linked with WILDARGS.OBJ) - this has been fixed and is the only change in -CHKSMB v1.23. - -********************** -05/31/95 Release v1.21 -********************** - -Add uchar forwarded element to smbmsg_t structure. This variable is initialized -by the smb_getmsghdr() function. If the message has been forwarded, it will -be set to non-zero. - -Fixed bug in LZH.C which caused lzh_decode() to produce incorrect results -(usually t's and spaces) when compiled with a 32-bit compiler. - -Added HUGE16 and FAR16 macros to SMBDEFS.H for huge and far pointers for -16-bit compilers only (default pointer type for 32-bit compilers). - -Fixed bug in FIXSMB.C that would initialize the SDA file to the wrong length. - -Added net type NET_MHS for MHS gateways. - -SMBUTIL (1.24) will no longer free deleted headers when maintaining a message -base if the /A (no analysis) command line switch is used. This speeds up the -message base maintenance/pack operation significantly by using: SMBUTIL /A MP - -*********************** -08/31/95 Release v1.21a -*********************** diff --git a/src/sbbs2/smb/121a/smb.prn b/src/sbbs2/smb/121a/smb.prn deleted file mode 100644 index 904897ea1e..0000000000 --- a/src/sbbs2/smb/121a/smb.prn +++ /dev/null @@ -1,5661 +0,0 @@ - - - - - - - - - - - - - - - - - - - - Synchronet Message Base Specification - Version 1.21 - Updated 08/31/95 - - Copyright 1995 Digital Dynamics - - PO Box 501 - Yorba Linda, CA 92686 - - Voice: 714-529-6328 BBS: 714-529-9525 V.32/V.32bis - FAX: 714-529-9721 714-529-9547 V.FC - Fido: 1:103/705 ftp: netcom.com /pub/sb/sbbs - - - - - - - - - - - - - - - - - - - - - - - - - - - Table of Contents - ================= - - Introduction.............................................................3 - Implementation Levels....................................................8 - Definitions.............................................................10 - Acronyms........................................................12 - Data Types......................................................13 - File Formats............................................................18 - Index.....................(*.SID)...............................18 - Header....................(*.SHD)...............................20 - Header Allocation.........(*.SHA)...............................30 - Data......................(*.SDT)...............................31 - Data Allocation...........(*.SDA)...............................32 - CRC History...............(*.SCH)...............................33 - Header Field Types......................................................34 - Data Field Types........................................................58 - Messsage Attributes.....................................................60 - Translation Types.......................................................61 - Agent Types.............................................................62 - Network Types...........................................................63 - Media Types.............................................................64 - Message Storage Pseudo Code.............................................67 - Message Retrieval Pseudo Code...........................................69 - SMBUTIL.................................................................70 - CHKSMB..................................................................71 - FIXSMB..................................................................72 - SMBLIB (C library)......................................................73 - Data Types and Constants..(SMBDEFS.H)...........................74 - Global Variables..........(SMBVARS.C)...........................75 - Function Prototypes.......(SMBLIB.H)............................76 - Library Functions.........(SMBLIB.C)............................77 - Miscellaneous.............(CRC*.* and LZH.*)....................84 - SMBLIB Storage Example..................................................86 - SMBLIB Retrieval Example................................................89 - SMBLIB Performance Issues...............................................91 - Bibliography............................................................95 - Implementations.........................................................96 - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 2 Contents - - - Introduction - ============ - - Q. What is SMB? - - A. SMB (Synchronet Message Base) is a technical specification for the storage - format of electronic mail messages. These e-mail messages may all be - contained in one database, or, more commonly, separated into catagorized - databases. These message databases (or message bases) are also referred to - as "sub-boards", "forums", "conferences", and "SIGs". The messages may be - directed to an individual person, sent to a group of individuals, or sent - to everyone who can read messages in that message base. Messages may be - created and read soley at one physical location, or imported from and - exported to a message network that may span continents. Message bases that - are connected to a message network are often called "echoes". - - - Q. Why SMB? - - A. The Synchronet Message Base is designed to store high volumes of messages - while maintaining optimum search, retrieval, and creation performance. - These messages are not limited to mere text. In addition to text, SMB - defines the storage of digitized sound, MIDI, graphics, fonts, animation, - as well as other multimedia data and triggers for localized multimedia. - SMB thrives on a multi-user environment where messages are being created, - read, modified, and deleted by multiple tasks simultaneously. With the - large message networks of today being the rule, rather than the exception, - and high volumes of messages being imported on a daily, sometimes hourly - basis, creation and deletion speed is of the utmost importance. This is - where SMB really shines. Being extensible enough to handle message formats - from networks of today and tomorrow, and fast enough to import more messages - that humanly readable, the SMB format will more than meet your message - storage needs. - - - Q. Why a specification? - - A. Message bases are often accessed and modified by a number of different - programs. Often these programs are developed by individuals or companies - other than the original designer of the message base format. This - specification is an attempt to aid developers in creating programs that - access or modify a message base stored in the SMB format. - - - Q. Who can use this specification? - - A. Anyone that has interest in the Synchronet Message Base format at either - an educational or professional level. Specifically, software developers - interested or currently involved in the development of message readers, - editors, echomail (toss/scan) programs, message transfer agents (MTAs), - network gateways, and bulletin board systems. Much of the information in - this specification is intended for those with preexisting programming - knowledge, so those with little or no programming experience may find it - hard to comprehend. - - _______________________________________________________________________________ - Synchronet 3 Introduction - - - - - Q. What does the SMB specification include? - - A. The text you are reading is part of the SMB specification: a single text - document that defines the storage format of each of the six files of an - SMB format message base and how they are related to each other. - - Included with this specification is C source code to be used as an example - to programmers of how to access an SMB format message base and public domain - library functions (SMBLIB) that can be compiled and linked into programs - that access an SMB format message base developed by third parties. An SMB - utility program (SMBUTIL) is also included with C source code as an example - of how to use the SMBLIB functions. - - - Q. Where did the SMB specification come from? - - A. Digital Dynamics (southern California based software development company) - released "Synchronet Multinode BBS Software Version 1a" in June of 1992 as - one of the first BBS packages to be designed from the ground-up to operate - in a multinode environment with incredible speed and reliability, with a - large suite of multinode specific features and design innovations. - - The original message base format was designed with localized messaging and - low volume message networks in mind. By January of 1993, it was clear that - high volume message networks (FidoNet, RelayNet, Usenet, etc.) were the - preference of most BBS users and a new message base format was required to - allow for high volume message storage, improved storage, retrieval, and - maintenance performance, as well as lower storage space requirements. - - Rather than introduce another new message format, Digital Dynamics sought - to implement an existing public specification for a format that would meet - current and future message storage needs. More than a few specifications - were seriously considered at one time or another, but after careful - examination, design flaws and lack of extensibility eliminated them from the - long term plans of Digital Dynamics and Synchronet BBS Software. Thus began - the design of the "Synchronet Message Base" (SMB) format. - - At the request of many message related program developers, Digital Dynamics - created and released the SMB specification before the release of "Synchronet - Version 2.00" to allow lead-time on developing support programs for the new - format. - - Digital Dynamics strongly encourages developers of message related programs - (including software that directly competes with Synchronet or other Digital - Dynamics products) to implement support for SMB. Though this is a public - specification and Digital Dynamics encourages developer suggestions, it will - remain under the sole control of Digital Dynamics unless specifically stated - otherwise in a future revision of this specification. - - Digital Dynamics requests that any organizations that wish to adopt or - ratify this specification, in part or whole, notify Digital Dynamics through - any of the contact methods listed at the beginning of this document. - - _______________________________________________________________________________ - Synchronet 4 Introduction - - - - - Q. How does SMB store messages? - - A. Each message base is stored in a set of binary files. This set consists - of between three and six files depending the storage method used. The base - filename (maximum of eight characters under DOS) is the same for all six - files of the same message base and unique amoung the filenames of other - message bases in the same directory. The six files each have a different - three character extension. The first character of the extension is always - the letter 'S' (for SMB), while the second and third characters define the - contents of the file. - - Two of the six files associated with each message base are not recreatable - and therefore are the most important when considering data integrity. These - two files are the data file (with a .SDT extension) and header file (.SHD - extension). Both of these files use 256 byte blocks and have associated - block allocation tables (stored in .SDA and .SHA respectively) so that - deleted message blocks may be used by new messages without creating odd - sized unused 'holes' in the files. The block allocation table files (.SDA - and .SHA) can be recreated with the information stored in the header (.SHD) - file. When using Hyper Allocation storage method, the allocation files (.SDA - and .SHA) are not used. - - For fast indexing, there is a small fixed length index file (with a .SID - extension). This file allows for the immediate location of message header - records based on sender's name or user number, recipient's name or user - number, subject, message number, or message attributes. This file can be - recreated with the data stored in the header (.SHD) file. - - The last file is an optional CRC history (.SCH) file. It contains 32-bit - CRCs of a configurable number of messages imported or created locally. This - is to help eliminate duplicate messages created by user or program error. - The CRC history file can be recreated with the combination of information - stored in the data (.SDT) and header (.SHD) files. - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 5 Introduction - - - Q. How fast do messages import into an SMB message base? - - A. This is a very important question for systems for that import large volumes - of messages. Of course, the answer depends on the storage format which you - are importing from, the average length of messages, the design of the - program which is peforming the import process, as well as the hardware and - system software being used. What's important is that SMB will allow the - fastest import process possible with any given combination of the above - factors. - - Since system storage capacity is rarely infinite, neither is the number - of messages which can be stored in a message base. System operators must - define the maximum number of messages to be stored in a message base, the - maximum age of the messages in that message base, or a combination of both. - When using the Self-packing storage method (defined later in this document), - the smaller the number of messages stored in a message base, the faster the - import process. The SMB format is flexible enough to support multiple levels - of import performance based on optimizations for storage space or speed. - Most system operators will almost invariably choose speed over space, but - which choices are available is determined by the importing program. This - specification defines three storage methods, from slowest to fastest: - Self-packing, Fast Allocation, and Hyper Allocation. Other options defined - in this specification may affect storage performance, including duplicate - message checking and message compression/encryption. - - - Q. How much storage is required for an SMB message base? - - A. The biggest factor in determining storage requirements for a message base - is the maximum number of messages to be stored in the base (defined by the - system operator) and the average size of each message. The minimum required - storage for a message base is 32 bytes plus 532 bytes per message (plus four - bytes per message if duplicate message checking is used and three bytes - per message if Self-packing or Fast Allocation storage methods are used). - - The SMB format was originally designed to be "self-packing", meaning purged - (deleted) message header and data blocks will be used automatically by new - messages. Relying solely on self-packing, an SMB format message base will - never "shrink" in size. This is not to say that it will continually "grow" - in size, but that without specific packing procedures, deleted message - blocks may remain unused for extended periods of time, meanwhile using some - amount of storage space that could be recovered using specific packing - procedures. The Fast Allocation and Hyper Allocation storage methods do not - use deleted message blocks for new messages so specific packing procedures - must be used if any messages are deleted and that storage space is to ever - be recovered. - - Limiting the maximum age of messages in an SMB message base is another way - to control the storage requirements. While maximum message age definition is - optional, the definition of the maximum number of messages is not. - - - - - - _______________________________________________________________________________ - Synchronet 6 Introduction - - - Q. How many messages can be stored per SMB message base? - - A. Without considering storage limitations or message data lengths greater than - 256, the theoretical maximum number of messages that can be stored in a - single SMB message base is 16.7 million. Considering the variable length - nature of message and header data, it is suggested that the system operator - allow no more than 1 million messages per base. - - To determine an estimated maximum number of messages for a message base - using the average message data length as a factor, use the following - formula: - - 4.2 billion divided by the average message length rounded up to be evenly - divisible by 256. - - If the average message data length is 1500 bytes, the estimated maximum - number of messages would be 2,734,375 (4.2 billion divided by 1536). - - Implementations of this format may be further limited by available system - memory. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 7 Introduction - - - Implementation Levels - ===================== - The SMB format can be implemented to varying degrees between programs without - creating compatibilty issues. Rather than have developers specifically state - which features they have and have not implemented, we have defined seven levels - of implementation (represented by Roman numerals I through VII). For a program - or software package to meet an implementation level, it must have all of the - features listed for that level and all of those for each level below it. The - minimum suggested imlementation is level I. The SMBUTIL program included with - this specification is an example of a level I implementation with features - from some of the higher implementation levels. - - Level I - ------- - The minimum suggested level of implementation. Messages contain merely ASCII - text displayable on an ANSI terminal. Messages can be added to the message - base and if the maximum number of messages is exceeded, messages are removed - or marked for deletion. - - Level II - -------- - The addition of file attachments, multiple index/header entries per message - (multiple destinations), multiple text bodies for the separation of message - text and tag/origin lines (for example), forwarding, threading, and specific - FidoNet kludge header field support makes this level of implementation more - realistic for bulletin board system and EchoMail software implementation. - - Synchronet Multinode BBS Software v2.00 has a level II implementation of this - specification. - - Level III - --------- - This implementation adds support for translation strings defined later in this - document for data compression, encryption, escaping, and encoding. This level - is still limited to basic ASCII text and ANSI escape sequence entry and - retrieval. - - Synchronet Multinode BBS Software v2.10 has a level III implementation of this - specification. - - Level IV - -------- - The storage and retrieval of embedded and attached images is added in this - level of implementation. Supported images are limited to single binary or text - data blocks that can be displayed or transferred to the user (automatically, - or by request) if their display and translation protocols define specific - support for the image type. - - - - - - - - - _______________________________________________________________________________ - Synchronet 8 Implementation Levels - - - Level V - ------- - This level of implementation adds support for embedded and attached sound data. - This includes digitized sound and MIDI data. Supported sounds are limited to - single binary or text data blocks that can be played or transferred to the user - (automatically or by request) if their presentation and translation protocols - define specific support for the sound type. - - Level VI - -------- - Localized sound and image data can be triggered by messages stored and - retrieved in an implementation of this level. - - Level VII - --------- - Complete multimedia support is reached in this implementation level with - support for embedded and attached animation, sound, and video data. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 9 Implementation Levels - - - Definitions - =========== - - Control Characters - ------------------ - When specifying control characters (ASCII 1 through 31), the caret symbol "^" - or the abreviation "ctrl-" followed by a character will be used to indicate the - value. ^A is equivalent to ASCII 1, ^B ASCII 2, etc. The case of the control - character is not significant (i.e. ^z and ^Z are equivalent). The control - character ^@ (ASCII 0) will be specified as NULL or 0. - - - Hexadecimal - ----------- - Base sixteen numbering system which includes the digits 0-9 and A-F. - Hexadecimal numbers are represented in this document with a prefix of "0x" or - "\x" or a suffix of "h". Hexadecimal letter digits are not case sensitive - (i.e. the number 0xff is the same as 0xFF). - - - File dump - --------- - When example file dumps are displayed, the format is similar to that of the - output from the DOS DEBUG program. With the exception of the ASCII characters, - all numbers are in hexadecimal. - - Offset Byte values ASCII characters - - 000000 53 4D 42 1A 10 01 20 00 F4 01 00 00 F4 01 00 00 SMB... .�...�... - 000010 20 00 00 00 D0 07 00 00 D0 07 00 00 00 00 00 00 ...�...�....... - - - Bit values - ---------- - Bit (or flag) values are represented in C notation as (1<<x) where x is the bit - number. (i.e. bit number 7 (1<<7) is the same as 0x80). - - - Word storage - ------------ - All words (16-bit) and double words (32-bit) are stored in Intel 80x86 (little - endian) format with bytes stored from low to high (reverse of the Motorola - 680x0 word storage format). - - A 16-bit word with the value 1234h is stored as 34h 12h. - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 10 Definitions - - - Translation strings - ------------------- - Translation strings (xlat variables) are arrays of words (16-bit) in the order - of the original storage translation. The last translation type is followed by a - 16-bit zero (defined later as XLAT_NONE). If there are no translations, then - the first and only element of the array is XLAT_NONE. - - If multiple translations are used, the translation order must be reversed - upon retrieval to obtain the proper data. - - - Local e-mail - ------------ - When referring to the local e-mail message base of a Synchronet BBS, we are - referring specifically the message base with the name "MAIL" stored in the - "DATA" directory (e.g. \SBBS\DATA\MAIL). - - Messages stored in this message base are different in the following respects: - - The SMB_EMAIL status header attribute is set ON - Hyper Allocation storage method is not supported - The "To" and and "From" fields of the message indexes do NOT contain CRCs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 11 Definitions - - - Acronyms: - ======== - - ANSI American National Standards Institute - ASCII American Standard Code for Information Interchange - BBS Bulletin Board System - C The C programming language as defined by ANSI X3.159-1989 - CR Carriage Return character (ASCII 13) - CRC Cyclic Redundancy Check - CRC-16 Standard 16-bit CRC using 1021h polynomial (seed 0) - CRC-32 Standard 32-bit CRC using EDB88320h polynomial (seed -1) - CRLF Carriage Return character followed by a Line Feed character - FSC FidoNet Standards Commitee (FTS proposal) - FTN FidoNet Technology Network - FTS FidoNet Technical Standard - LF Line Feed character (ASCII 10) - QWK Compressed message packet format for message reading/networking - RFC Request for Comments - SMB Synchronet Message Base - UT Universal Time (formerly called "Greenwhich Mean Time") - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 12 Definition of Acronyms - - - Data types - ========== - - uchar Unsigned 8-bit value (0 through 255). - C example: - - #define uchar unsigned char - - - short Signed 16-bit value (-32768 through 32767). - "short" is a C keyword indicating "short int". - - - ushort Unsigned 16-bit value (0 through 65535). - C example: - - #define ushort unsigned short - - - ulong Unsigned 32-bit value (0 through 4294967295). - C example: - - #define ulong unsigned long - - - time_t Unsigned 32-bit value. - Seconds since 00:00 Jan 01 1970 (Unix format). - Used for all time/date storage in SMB as part of the when_t - data type. This time format will support dates through the year - 2105. - time_t is defined by ANSI C as a long (signed) which can - limit its date support to the year 2038 depending on the - library routines used. - - - ASCII String (aka character array) of 8-bit ASCII characters. - Characters with the bit 7 set (80h through FFh) represent - the IBM PC extended ASCII character set. When data or header - fields of this type are stored in the header, a NULL - terminator may or may not be present. - C example: - - uchar str[80]; - - - ASCIIZ ASCII string with (non-optional) NULL terminator. - C example: - - uchar str[81]; - - - - - - - _______________________________________________________________________________ - Synchronet 13 Definition of Data Types - - - nulstr ASCII string immediately terminated by NULL. - C example: - - uchar *nulstr=""; - - - undef Data buffer with undefined contents. - C example: - - uchar buf[BUF_LEN]; - - when_t Date/Time stamp including time-zone adjustment information. - C example: - - typedef struct { - - time_t time; // Time stamp (in local time) - short zone; // Zone constant or Minutes (+/-) from UT - - } when_t; - - time: - - A time value of 0 is invalid and indicates an uninitialized - time stamp. - - Time stamps are always stored in universal time. i.e. - Regardless of what the local time zone is, Jan 1st 1994 00:00 - will always be stored as 2D24BD00h. - - zone: - - If the zone is in the range -720 to +720, it represents the - number of minutes east or west of UT. Values in this range - should only be used for time zones not otherwise represented - here. - - If the zone is greater than 720 or less than -720, then the - following bits have special meaning: - - (1<<12) // Non-US time zone (east of UT) - (1<<13) // Non-US time zone (west of UT) - (1<<14) // U.S. time zone - (1<<15) // Daylight savings - - The lower 12 bits (0 through 11) contain the number of minutes - east or west of UT (not accounting for daylight savings). - - - - - - - - - _______________________________________________________________________________ - Synchronet 14 Definition of Data Types - - - If the time zone is one specified in the U.S. Uniform Time Act, - the following values represent the zone: - - AST 0x40F0 // Atlantic (-04:00) - EST 0x412C // Eastern (-05:00) - CST 0x4168 // Central (-06:00) - MST 0x41A4 // Mountain (-07:00) - PST 0x41E0 // Pacific (-08:00) - YST 0x421C // Yukon (-09:00) - HST 0x4258 // Hawaii/Alaska (-10:00) - BST 0x4294 // Bering (-11:00) - - With bit 15 set, the following values represent the same zone - with the presence of daylight savings: - - ADT 0xC0F0 // Atlantic (-03:00) - EDT 0xC12C // Eastern (-04:00) - CDT 0xC168 // Central (-05:00) - MDT 0xC1A4 // Mountain (-06:00) - PDT 0xC1E0 // Pacific (-07:00) - YDT 0xC21C // Yukon (-08:00) - HDT 0xC258 // Hawaii/Alaska (-09:00) - BDT 0xC294 // Bering (-10:00) - - The following non-standard time zone specifications may also be - used: - - MID 0x2294 // Midway (-11:00) - VAN 0x21E0 // Vancouver (-08:00) - EDM 0x21A4 // Edmonton (-07:00) - WIN 0x2168 // Winnipeg (-06:00) - BOG 0x212C // Bogota (-05:00) - CAR 0x20F0 // Caracas (-04:00) - RIO 0x20B4 // Rio de Janeiro (-03:00) - FER 0x2078 // Fernando de Noronha (-02:00) - AZO 0x203C // Azores (-01:00) - LON 0x1000 // London (+00:00) - BER 0x103C // Berlin (+01:00) - ATH 0x1078 // Athens (+02:00) - MOS 0x10B4 // Moscow (+03:00) - DUB 0x10F0 // Dubai (+04:00) - KAB 0x110E // Kabul (+04:30) - KAR 0x112C // Karachi (+05:00) - BOM 0x114A // Bombay (+05:30) - KAT 0x1159 // Kathmandu (+05:45) - DHA 0x1168 // Dhaka (+06:00) - BAN 0x11A4 // Bangkok (+07:00) - HON 0x11E0 // Hong Kong (+08:00) - TOK 0x121C // Tokyo (+09:00) - SYD 0x1258 // Sydney (+10:00) - NOU 0x1294 // Noumea (+11:00) - WEL 0x12D0 // Wellington (+12:00) - - - - _______________________________________________________________________________ - Synchronet 15 Definition of Data Types - - - fidoaddr_t FidoNet address stored as four ushorts that represent the zone, - network, node, and point (in that order). - C example: - - typedef struct { - - ushort zone, - net, - node, - point; - - } fidoaddr_t; - - - typestr_t ASCIIZ string with ushort type prefix. - C example: - - typedef struct { - - ushort type; // Specifier for type of 'str' - uchar str[]; // ASCIIZ filename or other string data - - } typestr_t; - - - mattach_t File attachment information with type prefix, translation - string, and filename. - C example: - - typedef struct { - - ushort type; // Attachment type - ushort xlat[]; // Translations of data in attachment - uchar str[]; // ASCIIZ filename - - } mattach_t; - - vattach_t Video file attachment information with type, compression, - translation string, and filename. - C example: - - typedef struct { - - ushort type; // Attachment type - ushort comp; // Compression method - ushort xlat[]; // Translations of data in attachment - uchar str[]; // ASCIIZ filename - - } vattach_t; - - - - - - - _______________________________________________________________________________ - Synchronet 16 Definition of Data Types - - - mtext_t Message text with translation string prefix. - C example: - - typedef struct { - - ushort xlat[]; // Translations of text - uchar text[]; // Actual text data - - } mtext_t; - - - ftext_t Formatted message text with translation string prefix and - format type. - C example: - - typedef struct { - - ushort type; // See Image Types for valid types - ushort xlat[]; // Translations of data - uchar data[]; // Actual formatted text data - - } ftext_t; - - - membed_t Embedded data with type prefix, translation string, and ASCIIZ - description. - C example: - - typedef struct { - - ushort type; // Specifier for type of 'dat' - ushort xlat[]; // Translations of embedded data - uchar name[]; // ASCIIZ char description of embedded data - uchar dat[]; // Binary data - - } membed_t; - - vembed_t Embedded video data with type, compression method, translation - string, and ASCIIZ description. - C example: - - typedef struct { - - ushort type; // Specifier for type of 'dat' - ushort comp; // Compression method - ushort xlat[]; // Translations of embedded data - uchar name[]; // ASCIIZ char description of embedded data - uchar dat[]; // Binary data - - } vembed_t; - - - - - - _______________________________________________________________________________ - Synchronet 17 Definition of Data Types - - - File formats - ============ - - Index File (*.SID) - ------------------ - The index file for each message base contains one record per message in the - base. Each record is fixed length using the following format: - - Index Record: - ------------ - C example: - - typedef struct { - - ushort to; // 16-bit CRC of recipient name (lower case) or user number - ushort from; // 16-bit CRC of sender name (lower case) or user number - ushort subj; // 16-bit CRC of title/subject (lower case) - ushort attr; // attributes (MSG_PRIVATE, MSG_READ, etc. flags) - ulong offset; // byte offset of message header in header file - ulong number; // message serial number (1 based) - time_t time; // import date/time stamp (Unix format) - - } idxrec_t; - - - Example file dump (16 messages starting with message number 15): - --------------------------------------------------------------- - 000000 36 4F 13 07 2A 77 00 00 20 00 00 00 0F 00 00 00 6O..*w.. ....... - 000010 BE 62 76 2C 36 4F 46 0A 7F B2 00 00 20 01 00 00 �bv,6OF.�.. ... - 000020 10 00 00 00 C7 29 78 2C 36 4F 70 6F 46 FF 00 00 ....�)x,6OpoF�.. - 000030 20 02 00 00 11 00 00 00 AD D3 7A 2C 70 6F 13 07 .......��z,po.. - 000040 46 FF 00 00 20 03 00 00 12 00 00 00 D6 F8 7F 2C F�.. .......��, - 000050 36 4F E1 EA E7 E9 00 00 20 04 00 00 13 00 00 00 6O����.. ....... - 000060 1E 7B 85 2C 37 0D 2E DF 4D 79 00 00 20 05 00 00 .{�,7..�My.. ... - 000070 14 00 00 00 5C E1 A1 2C 90 54 2D 5A 86 62 00 00 ....\�,�T-Z�b.. - 000080 20 06 00 00 15 00 00 00 39 2E A2 2C 70 6F 1A 8B .......9.�,po.� - 000090 46 FF 00 00 20 07 00 00 16 00 00 00 D0 7B A8 2C F�.. .......�{�, - 0000A0 2E DF 1A 8B 4D 79 00 00 20 08 00 00 17 00 00 00 .�.�My.. ....... - 0000B0 FF 7B A8 2C B4 D9 35 7C 23 B1 00 00 20 09 00 00 �{�,��5|#�.. ... - 0000C0 18 00 00 00 CE D4 BA 2C 36 4F BC D8 B2 E7 00 00 ....�Ժ,6O�ز�.. - 0000D0 20 0A 00 00 19 00 00 00 14 5F C3 2C BA A8 4E B0 ........_�,��N� - 0000E0 67 76 00 00 20 0B 00 00 1A 00 00 00 6F 89 C3 2C gv.. .......o��, - 0000F0 36 4F 0C 01 19 9C 00 00 20 0C 00 00 1B 00 00 00 6O...�.. ....... - 000100 F8 30 C6 2C 36 4F FA 48 0E 55 00 00 20 0D 00 00 �0�,6O�H.U.. ... - 000110 1C 00 00 00 6A 94 D3 2C 36 4F F1 CE CF A2 00 00 ....j��,6O��Ϣ.. - 000120 20 0E 00 00 1D 00 00 00 53 DB D5 2C 8D A6 21 CE .......S��,��!� - 000130 F7 AB 00 00 20 0F 00 00 1E 00 00 00 31 29 DC 2C ��.. .......1)�, - - - - - - - - - _______________________________________________________________________________ - Synchronet 18 Index (*.SID) File Format - - - Field descriptions: - ------------------ - To: - The 'To' field is the CRC-16 of the name of the intended recipient agent of - this message or the intended recipient's user number. If the CRC is stored, the - text must be converted to lower case (A-Z changed to a-z) before the CRC is - calculated. If the message is forwarded to another agent, the original or new - index record must be changed to contain the CRC-16 of the new recipient name or - user number. This field must always contain the recipient user number for local - e-mail on a Synchronet BBS. Outbound netmail stored in the Synchronet local - e-mail message base will contain 0 in this field. - - From: - This field, similar to the 'To' field, contains the CRC-16 of the name of the - sending agent of this message or the sender's user number. If the CRC is - stored, the text must be converted to lower case (A-Z changed to a-z) before - the CRC is calculated. If the message is forwarded to another agent, the - original or new index record must be changed to contain the CRC-16 of the new - sender name or user number. If the message was imported into the local e-mail - message base on a Synchronet BBS via netmail, this field will contain 0. - - Subj: - The 'Subj' field contains the CRC-16 of the message's subject. The subject - must be converted to lower case (A-Z changed to a-z) and all preceeding - "re: "'s and "re:"'s removed before calculating the CRC-16. - - Attr: - This ushort is a bit field of the specific attributes for this message. - It is a clone of the 'attr' element of the msghdr_t structure. - - Offset: - This ulong is the offset (in bytes) in the header file for this message's - header record. - - Number: - This ulong is the serial number of this message. Valid values are 1 through - 0xffffffff. No two index records in the same message base may have the same - message number. All index records must have sequential, but not necessarily - consequetive, message numbers. - - Time: - This field is the date/time stamp the message was imported to or posted in - the message base. It is a clone of the 'when_imported.time' element of the - msghdr_t structure. - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 19 Index (*.SID) File Format - - - Header File (*.SHD) - =================== - - Each SMB header file is made up of two distinct sections: base header records - and message header records (usually the bulk of the file). - - Base Header Records: - ------------------- - Base header records are blocks of data that apply to the entire message base - and are of variable length. This specification defines only one base header - record, the "Status info" (smbstatus_t) record. This status info record must be - the first base header record in the file and must be modified if additional - base header records are added. - - Additional header records allow other developers to store configuration and - status information particular to their application needs. It also allows for - future header record definitions as part of this specification without causing - backward compatibility issues. - - Each base header record contains a fixed length portion (smbhdr_t) and an - optional variable length portion. - - Whenever a base header record is read or updated (written), it must first - be successfully locked and subsequently unlocked. - - The first base header record (Status Info) is used as a semaphore when writing - to the message index (.SID) file and, when using the Hyper Allocation storage - method, writing to the message data (.SDT) file. This record must be - succesfully locked before writing and subsequently unlocked. This is to insure - that multiple applications simultaneously writing to the same message base - does result in corrrupted data. - - - Message Header Records: - ---------------------- - Following the last base header record is the first message header record. Each - header record is stored in one or more 256 byte blocks. There must be exactly - one active message header record for every index record in the index file. - (Note: This does not include deleted message headers that have not been - overwritten by a new message header). - - Each message header record contains a fixed length portion (msghdr_t), a list - of zero or more fixed length data fields (dfield_t), and a list of three or - more variable length header fields (hfield_t). - - The value of the data stored in the zero or more unused bytes of the last - header record block have an undefined value, though whenever possible - developers should initialize to binary zero for human readability. - - Whenever a message header record is read or updated (written), it must first - be successfully locked and subsequently unlocked. - - - - - _______________________________________________________________________________ - Synchronet 20 Header File (*.SHD) Format - - - Base Header Record (Fixed Portion): - ---------------------------------- - C example: - - typedef struct { - - uchar id[4]; // text or binary unique hdr ID - ushort version; // version number (initially 100h for 1.00) - ushort length; // length including this struct - - } smbhdr_t; - - - Base Header Record Field Descriptions: - ------------------------------------- - Id: - This is a four byte unique ID identifying the type of the base header record. - The bytes may contain any value, but printable ASCII characters are preferred. - The only ID defined in this specification is "SMB^Z" used by the Status Info - base header record. - - Version: - This is a version number of the base header record type. Base header records - of different versions may have different formats or contain different - information. This is to aid the application in determining if the record - is pertinent and if so, to what degree. The Status Info base header record - uses this version field to define the version of the format for the entire - message base (currently 0x121 for version 1.21). - - Length: - This is entire length in bytes of this header record (including both fixed - and variable portions). - - - Base Header #1 (Status info) Record (Variable Portion): - ------------------------------------------------------ - C example: - - typedef struct { - - ulong last_msg; // last message number posted or imported - ulong total_msgs; // total messages currently in message base - ulong header_offset; // byte offset to first header record - ulong max_crcs; // Maximum number of CRCs to keep in history - ulong max_msgs; // Maximum number of messages to keep in base - ushort max_age; // Maximum age of messages (days) to keep in base - ushort attr; // Attribute bits - - } smbstatus_t; - - - - - - - _______________________________________________________________________________ - Synchronet 21 Header File (*.SHD) Format - - - Base Header #1 (Status Info) Record (Variable Portion) Field Descriptions: - ------------------------------------------------------------------------- - Last_msg: - This is the serial number of the last message imported or posted into this - message base. The index, header, and data records for this message may possibly - not exist (due to deletion). This field is used for determining the message - number to give to a new message being imported or posted into this message - base. This field must be updated for every message added to the message base. - - Total_msgs: - This is the total number of active messages currently in the message base. - This number should match the number of records in the index (.SID) file - and active header records in the header (.SHD) file. This field must be - updated whenever a message is added to or removed from the message base. - - Header_offset: - This is the byte offset to the first message header record. It is useful - for skipping all the base header records and going directly to the first - message header record. - - Max_crcs: - This is the maximum number of message CRCs to store in the CRC history (.SCH) - file for duplicate message checking. If this field contains 0, then duplicate - message checking is disabled. - - Max_msgs: - This is the preferred maximum number of messages to keep in this message - base as specified by the system operator. It is used by maintenance programs - that trim the message base down by removing old messages. This field should - be ignored by applications importing or posting messages allowing them to - exceed this maximum at will. - - Max_age: - This field is the maximum age (in days) of messages to keep in the message - base. It is used by maintenance programs to purge out-dated messages from - the message base. - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 22 Header File (*.SHD) Format - - - Attr: - This is a bit field containing specific attributes (or flags) that may define - the way messages are stored or retrieved from the this message base. The - following attributes are defined: - - SMB_EMAIL (1<<0) - - Indicates the message base is specifically for messages to or from local - users. When this bit is set, the idxrec.to and idxrec.from fields will - contain the user numbers (or 0 for non-user destination/source) instead of - the CRC-16 of the agent name. - - SMB_HYPERALLOC (1<<1) - - Indicates the message base uses the Hyper Allocation storage method. This - bit should not be cleared by an application without first deleting all the - messages in the message base. This is due to the fact the Hyper Allocation - is not downward compatible with the Self-packing and Fast Allocation - storage methods. - - When used with Synchronet BBS software, a message base must NOT have both of - the above attributes set. The only message base that should have the SMB_EMAIL - attribute set is the DATA\MAIL message base. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 23 Header File (*.SHD) Format - - - Base Header #1 (Status info) Record Contents: - -------------------------------------------- - smbhdr.id="SMB\x1a"; // SMB^Z - smbhdr.version=0x121; // v1.21 - smbhdr.length=sizeof(smbhdr_t)+sizeof(smbstatus_t); smbstatus_t status; - - - Additional Base Headers: - ----------------------- - Additional headers from developers must have initial 8 bytes in smbhdr_t - format, length must include size of smbhdr_t, and header_offset of smbstatus_t - must be changed to include the size of the additional header(s). - - - Example file dump (base header portion only): - -------------------------------------------- - 000000 53 4D 42 1A 20 01 20 00 F4 01 00 00 F4 01 00 00 SMB. . .�...�... - 000010 20 00 00 00 D0 07 00 00 D0 07 00 00 00 00 00 00 ...�...�....... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 24 Header File (*.SHD) Format - - - Message Header Record (Fixed portion): - ------------------------------------- - C example: - - typedef struct { - - uchar id[4]; // SHD^Z (same for all types and versions) - ushort type; // Message type (this is the definition of type 0) - ushort version; // Version of type (initially 100h for 1.00) - ushort length; // Total length of fixed portion + all fields - ushort attr; // Attributes (bit field) (duplicated in SID) - ulong auxattr; // Auxillary attributes (bit field) - ulong netattr; // Network attributes (bit field) - when_t when_written; // Date/Time message was originally created - when_t when_imported; // Date/Time message was imported (locally) - ulong number; // Message number (unique, not necessarily seq.) - ulong thread_orig; // Original message number in thread - ulong thread_next; // Next message in thread - ulong thread_first; // Number of first reply to this message - uchar reserved[16]; // 16 reserved bytes for future use - ulong offset; // Offset for buffer into data file (0 or mod 256) - ushort total_dfields; // Total number of data fields - - } msghdr_t; - - typedef struct { - - ushort type; // See "Data Field Types" values - ulong offset; // Offset into buffer - ulong length; // Length of data field in buffer - - } dfield_t; - - typedef struct { - - ushort type; // See "Header Field Types" for values - ushort length; // Length of buffer - uchar dat[length]; - - } hfield_t; - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 25 Header File (*.SHD) Format - - - Example file dump (one header record, both fixed and variable length portions): - ------------------------------------------------------------------------------ - 000020 53 48 44 1A 00 00 20 01 F5 00 00 00 00 00 00 00 SHD... .�....... - 000030 00 00 00 00 46 DB F7 2C 00 00 7D D7 29 2D 00 00 ....F��,..}�)-.. - 000040 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ - 000060 00 00 00 00 02 00 00 00 00 00 00 00 4A 01 00 00 ............J... - 000070 02 00 4A 01 00 00 53 00 00 00 00 00 13 00 4D 61 ..J...S.......Ma - 000080 72 69 61 6E 6E 65 20 4D 6F 6E 74 67 6F 6D 65 72 rianne Montgomer - 000090 79 30 00 0C 00 43 61 72 6F 6C 20 47 61 69 73 65 y0...Carol Gaise - 0000A0 72 60 00 07 00 46 61 72 6E 68 61 6D A4 00 14 00 r`...Farnham�... - 0000B0 31 3A 31 33 38 2F 31 30 32 2E 30 20 32 63 66 38 1:138/102.0 2cf8 - 0000C0 30 35 37 36 A5 00 14 00 31 3A 33 34 33 2F 31 30 0576�...1:343/10 - 0000D0 30 2E 30 20 32 63 66 33 62 39 30 61 A3 00 23 00 0.0 2cf3b90a�.#. - 0000E0 31 33 38 2F 31 30 32 20 31 20 32 37 30 2F 31 30 138/102 1 270/10 - 0000F0 31 20 32 30 39 2F 32 30 39 20 31 30 33 2F 30 20 1 209/209 103/0 - 000100 33 35 35 02 00 02 00 02 00 03 00 08 00 01 00 8A 355............� - 000110 00 66 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .f.............. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 26 Header File (*.SHD) Format - - - Contents of example header: - -------------------------- - id SHD^Z - type 0000h - version 0120h - length 245 - attr 0000h - auxattr 00000000h - netattr 00000000h - when_written Sat Nov 27 17:57:10 1993 - when_imported Tue Jan 04 15:54:21 1994 - number 1 - thread_orig 0 - thread_next 0 - thread_first 0 - reserved[16] - offset 0 - total_dfields 2 - - dfield[0].type 00h - dfield[0].offset 0 - dfield[0].length 330 - dfield[1].type 02h - dfield[1].offset 330 - dfield[1].length 83 - - hfield[0].type 00h - hfield[0].length 19 - hfield[0]_dat Marianne Montgomery - hfield[1].type 30h - hfield[1].length 12 - hfield[1]_dat Carol Gaiser - hfield[2].type 60h - hfield[2].length 7 - hfield[2]_dat Farnham - hfield[3].type A4h - hfield[3].length 20 - hfield[3]_dat 1:138/102.0 2cf80576 - hfield[4].type A5h - hfield[4].length 20 - hfield[4]_dat 1:343/100.0 2cf3b90a - hfield[5].type A3h - hfield[5].length 35 - hfield[5]_dat 138/102 1 270/101 209/209 103/0 355 - hfield[6].type 02h - hfield[6].length 2 - hfield[6]_dat 02 00 - hfield[7].type 03h - hfield[7].length 8 - hfield[7]_dat 01 00 8A 00 66 00 00 00 - - - - - - _______________________________________________________________________________ - Synchronet 27 Header File (*.SHD) Format - - - Fixed Portion Field descriptions: - -------------------------------- - Id: - This field (regardless of the header type or version) must always contain the - the string "SHD^Z". This is to aid in the restoration of a corrupted header - file and give a visual indication of the beginning of a new header record when - viewing dumps of the header file. - - Type: - This is the message header type. Only one type is currently defined by this - specification (type 0). Any and all future header types will have the first - 4 fields (10 bytes) in the same format of type 0. This allows other types - (with different lengths) to be skipped because the 4th field (length) will - always be in the same position. - - Version: - This is the version of this header type. This specification defines version - 1.21 of message header type 0 (stored as 121h). - - Length: - This is the total length of this message header record (including both fixed - and variable length portions, but NOT including unused block space). - - Attr: - This is a bit field (16-bit) containing basic message attributes (flags) for - this message. An exact duplicate of this field is stored in the index file as - well. They must always match. - - Auxattr: - This is a bit field (32-bit) containing the auxillary attributes (flags) for - this message. The attributes stored in this variable are more specific in - nature and less critical than those in the Attr field. - - Netattr: - This is a bit field (32-bit) containing the network attributes (flags) for this - message. The attributes stored in this variable are related solely to message - networking. - - When_written: - This is the date and time when the message was originally created. - - When_imported: - This is the date and time when the message was posted on or imported into the - local message system. - - Number: - This is the message's unique serial number (from 1 to FFFFFFFFh). This field - is duplicated in the index file. They must always match. - - - - - - - - _______________________________________________________________________________ - Synchronet 28 Header File (*.SHD) Format - - - Thread_orig: - If this message is a reply, then this field contains the number of the original - message that was replied to. If this message was not a reply, this field will - contain the value 0. - - Thread_next: - If this message is a reply, and there are later replies to that message - (the message number contained in the Thread_orig field), then this field will - contain the number of the next reply in the chain. If this message is the only - reply to the orignal message, this field will contain the value 0. - - Thread_first: - If there are any replies to this message (after it has been posted), this field - will contain the number of the first reply to this message. If there are no - replies to this message, this field will contain the value 0. - - Reserved: - Unused bytes, reserved for future definition in the message header type 0 - specification. - - Offset: - The byte offset into the data file, specifying the start of the buffer for - all data associated with this message. This value must be either 0 or modula - 256. When retrieving the actual data portion of data fields, the physical - offset into the file will be the offset of the message data buffer (this field) - plus the offset of the individual data field (msghdr_t.offset+dfield_t.offset). - - Total_dfields: - This field contains the total number of data fields associated with this - message. The value of this field must match the actual number of data fields - stored in the header (dfield_t data types following the fixed portion of the - message header). - - - Variable Portion Field descriptions: - ----------------------------------- - See the Header Field Type and Data Field Type sections for the descriptions - of the values contained in these fields. - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 29 Header File (*.SHD) Format - - - Message Header Block Allocation (*.SHA) - ======================================= - - If this message base uses the Hyper Allocation storage method (the - SMB_HYPERALLOC bit is set in the smbstatus_t.attr field), then this file is - not created or used. - - This file contains no header or signature data. Each byte (uchar) in the file - specifies the allocation state of the corresponding 256 byte block in the - header (*.SHD) file. A value of 0 indicates a free header block, and a value of - 1 indicates an allocated block. Other non-zero values are undefined. - - This file must always be opened DENY ALL (non-shareable). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 30 Header Allocation File (*.SHA) Format - - - Message Data (*.SDT) - ==================== - - This file contains no header or signature data. It contains the text and other - embedded data for the messages in a single message base. The data for each - message always begins on a 256 byte block boundary. The data in the unused - portion of a data block is undefined, but should be initialized to NULL - whenever possible. - - This file must always be opened DENY NONE (shareable). - - Data fields of type TEXT_BODY and TEXT_TAIL must have all trailing white space - and control characters removed (i.e. the last character of the data record - must be in the range 21h to FFh). The only exception to this rule, is if the - TEXT_BODY is terminated with multiple contiguous CRLFs, only the last CRLF - should be removed. A CRLF should always be appended to the text data when it is - displayed. - - When reading from this file, it is a good idea to make sure the message header - for the data being read is currently locked (though no single message header - should be locked for extended durations of time). This will insure that no - other application will write to this portion of the file while it's being - read (read from disk, not displayed). - - When using the Hyper Allocation storage method, the Status Info message base - header must be successfully locked before writing to this file and subsequently - unlocked. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 31 Data File (*.SDT) Format - - - Message Data Block Allocation (*.SDA) - ===================================== - - If this message base uses the Hyper Allocation storage method (the - SMB_HYPERALLOC bit is set in the smbstatus_t.attr field), then this file is - not created or used. - - This file contains no header or signature data. Each word (ushort) in the file - specifies the allocation state of the corresponding 256 byte block in the data - (*.SDT) file. A value of 0 indicates a free block, and a non-zero value - indicates the number of message header records associated with this message - data (most often 1). Each block can be used by up to 65,535 header records. - - This file must always be opened DENY ALL (non-shareable). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 32 Data Allocation File (*.SDA) Format - - - CRC history for duplicate message checking (*.SCH) - ================================================== - - This file is optional and contains no header or signature data. Each long word - (ulong) in the file contains a CRC-32 of previously posted/imported messages. - These CRCs can be used to check a candidate message for posting/import to be - sure the message isn't a duplicate created by human or program error. The - maximum number of CRCs to store is defined in the first message base header - record (smbstatus_t.max_crcs). - - The CRC is calculated on the first TEXT_BODY data field before any translations - are applied (e.g. encoding, compression, encryption). - - This file must always be opened DENY ALL (non-shareable). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 33 CRC History File (*.SCH) Format - - - Header Field Types: - ================== - - These are the defined valid values for hfield_t.type: - - Name : SENDER - Value : 00h - Data : ASCII - Multiple : Yes, order significant - Required : Yes - Summary : Name of agent that sent this message - - If blank (0 length or nulstr), assumed "Anonymous". If multiple SENDER fields - exist, then the message has been forwarded and the order of the fields in the - record must match the forwarding order (chronologically). When forwarding a - message, the original SENDER field should be left intact and new SENDER, - FORWARDED, and RECIPIENT fields added to the end of the record. - - - Name : SENDERAGENT - Value : 01h - Data : ushort - Multiple : Yes, order significant - Required : No - Default : AGENT_PERSON or previous SENDERAGENT if exists - Summary : Type of agent that sent this message - - If multiple SENDER fields exist, then the message has been forwarded. If any of the - forwarding agents is of a type other than AGENT_PERSON, then this field must - follow that SENDER field to specify the agent type. - - Name : SENDERNETTYPE - Value : 02h - Data : ushort - Multiple : Yes, order significant - Required : No - Default : NET_NONE or previous SENDERNETTYPE if exists - Summary : Type of network message was sent from - - If multiple SENDERNETADDR fields are included, a SENDERNETTYPE field should be - included before each to determine what data type the address is stored in. - - Name : SENDERNETADDR - Value : 03h - Data : undef - Multiple : Yes, order significant - Required : No - Default : Previous SENDERNETADDR if exists - Summary : Network address for agent that sent this message - - The SENDERNETTYPE field indicates the data type of this field. If the - SENDERNETTYPE is of type NET_INTERNET, the local-part of the Internet - address is optional. If the local-part separator character ('@') is omitted, - the SENDER field is assumed to be the local-part of the address. - - _______________________________________________________________________________ - Synchronet 34 Header Field Types - - - - Name : SENDEREXT - Value : 04h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : Previous SENDEREXT if exists - Summary : Extension of sending agent - - This field is useful for storing the sending agent's extension, when the - agent's extension binds more tightly than the agent's name. - - For example, Synchronet Multinode BBS Software stores local e-mail with the - sending and receiving agent's user numbers stored as their respective - extensions. This is done so that if a user name changes for some reason, - messages will not "disappear" from the user's mail box. - - If the SMB_EMAIL status header attribute is set, then the "From" field in the - index must contain the binary value of this field rather than the CRC-16 of the - SENDER (name) field. - - Name : SENDERPOS - Value : 05h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : Previous SENDERPOS if exists - Summary : Position of sending agent - - Primarily for documentary purposes, this field contains the position of the - sending agent (i.e. President, Sysop, C.E.O., MIS Director, etc). - - It can also be useful for getting a message or reply to the intended - recipient when the agent name is not located or is unknown, but the position - of the agent is known and specified. - - Name : SENDERORG - Value : 06h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : Previous SENDERORG if exists - Summary : Organization name of sending agent - - Primarily for documentary purposes, this field contains the organization to - which the sending agent belongs (i.e. Microsoft, Joe's BBS, SoCal User's Group, - etc). - - - - - - - - - _______________________________________________________________________________ - Synchronet 35 Header Field Types - - - Name : AUTHOR - Value : 10h - Data : ASCII - Multiple : Yes - Required : No - Default : First SENDER - Summary : Name of agent that created this message - - This field can only be added by the process that originally creates the - message. It should not be included if same as first SENDER field. If multiple - AUTHOR fields exist, then the message was created by multiple agents and is - considered valid. The order of multiple AUTHOR fields in the record is not - significant. - - Name : AUTHORAGENT - Value : 11h - Data : ushort - Multiple : Yes, order significant - Required : No - Default : SENDERAGENT or previous AUTHORAGENT if exists - Summary : Type of agent that created this message - - This field can only be added by the process that originally creates the - message. It should not be included if same as first SENDERAGENT field. If - multiple AUTHOR fields exist, then the message was created by multiple agents - and if the agent type for any of the authors is other than AGENT_PERSON, an - AUTHORAGENT field must follow to specify the agent type. - - Name : AUTHORNETTYPE - Value : 12h - Data : ushort - Multiple : Yes, order significant - Required : No - Default : SENDERNETTYPE or previous AUTHORNETTYPE if exists - Summary : Type of network this author is member of - - Name : AUTHORNETADDR - Value : 13h - Data : undef - Multiple : Yes, order significant - Required : No - Default : SENDERNETADDR or previous AUTHORNETADDR if exists - Summary : Network address of this author - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 36 Header Field Types - - - Name : AUTHOREXT - Value : 14h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : SENDEREXT or previous AUTHOREXT if exists - Summary : Extension of this author - - Name : AUTHORPOS - Value : 15h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : SENDERPOS or previous AUTHORPOS if exists - Summary : Position of this author - - Name : AUTHORORG - Value : 16h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : SENDERORG or previous AUTHORORG if exists - Summary : Organization this author belongs to - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 37 Header Field Types - - - Name : REPLYTO - Value : 20h - Data : ASCII - Multiple : Yes, but only last is valid - Required : No - Default : SENDER - Summary : Name of agent that replies should go to - - Name : REPLYTOAGENT - Value : 21h - Data : ushort - Multiple : Yes, but only last is valid - Required : No - Default : SENDERAGENT - Summary : Type of agent that replies should go to - - Name : REPLYTONETTYPE - Value : 22h - Data : ushort - Multiple : Yes, but only last is valid - Required : No - Default : SENDERNETTYPE - Summary : Type of network that replies should go to - - Name : REPLYTONETADDR - Value : 23h - Data : undef - Multiple : Yes, but only last is valid - Required : No - Default : SENDERNETADDR - Summary : Network address that replies should go to - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 38 Header Field Types - - - Name : REPLYTOEXT - Value : 24h - Data : ASCII - Multiple : Yes, but only last is valid - Required : No - Default : SENDEREXT - Summary : Extension of agent that replies should go to - - Name : REPLYTOPOS - Value : 25h - Data : ASCII - Multiple : Yes, but only last is valid - Required : No - Default : SENDERPOS - Summary : Position of agent that replies should go to - - Name : REPLYTOORG - Value : 26h - Data : ASCII - Multiple : Yes, but only last is valid - Required : No - Default : SENDERORG - Summary : Organization of agent that replies should go to - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 39 Header Field Types - - - Name : RECIPIENT - Value : 30h - Data : ASCII - Multiple : Yes, order significant - Required : Yes - Default : "All" - Summary : Name of agent to receive this message - - If multiple RECIPIENT fields exist, the message has been forwarded and for each - additional RECIPIENT field (after the initial RECIPIENT), there should be a - FORWARDED field. The order of the RECIPIENT fields in the record must match the - order in which the message was sent and forwarded (chronologically). - - Name : RECIPIENTAGENT - Value : 31h - Data : ushort - Multiple : Yes, order significant - Required : No - Default : AGENT_PERSON or previous RECIPIENTAGENT if exists - Summary : Type of agent to receive this message - - If multiple RECIPIENT fields exist, the message has been forwarded. If any of - the recipient agents are of a type other than AGENT_PERSON, this field must - follow the RECIPIENT field to specify the agent type. - - Name : RECIPIENTNETTYPE - Value : 32h - Data : ushort - Multiple : Yes, order significant - Required : No - Default : NET_NONE or previous RECIPIENTNETTYPE if exists - Summary : Type of network to receive this message - - Name : RECIPIENTNETADDR - Value : 33h - Data : undef - Multiple : Yes, order significant - Required : No - Default : Previous RECIPIENTNETADDR if exists - Summary : Address of network to receive this message - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 40 Header Field Types - - - Name : RECIPIENTEXT - Value : 34h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : Previous RECIPIENTEXT if exists - Summary : Extension of agent to receive this message - - If SMB_EMAIL status header attribute is set, then the "To" field in the index - must contain the binary value of this field rather than the CRC-16 of the - RECIPIENT (name) field. This is the case specifically with the local e-mail - message base on a Synchronet BBS. - - Name : RECIPIENTPOS - Value : 35h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : Previous RECIPIENTPOS if exists - Summary : Position of agent to receive this message - - Name : RECIPIENTORG - Value : 36h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : Previous RECIPIENTORG if exists - Summary : Type of agent to receive this message - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 41 Header Field Types - - - Name : FORWARDTO - Value : 40h - Data : ASCII - Multiple : Yes, order significant - Required : No - Summary : Name of agent this message is to be forwarded to - - Name : FORWARDTOAGENT - Value : 41h - Data : ushort - Multiple : Yes, order significant - Required : No - Default : RECIPIENTAGENT or previous FORWARDTOAGENT if exists - Summary : Type of agent this message is to be forwarded to - - Name : FORWARDTONETTYPE - Value : 42h - Data : ushort - Multiple : Yes, order significant - Required : No - Default : RECIPIENTNETTYPE or previous FORWARDTONETTYPE if exists - Summary : Type of network this message is to be forwarded to - - Name : FORWARDTONETADDR - Value : 43h - Data : undef - Multiple : Yes, order significant - Required : No - Default : RECIPIENTNETADDR or previous FORWARDTONETADDR if exists - Summary : Network address this message is to be forwarded to - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 42 Header Field Types - - - Name : FORWARDTOEXT - Value : 44h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : RECIPIENTEXT or previous FORWARDTOEXT if exists - Summary : Extension of agent this message is to be forwarded to - - Name : FORWARDTOPOS - Value : 45h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : RECIPIENTPOS or previous FORWARDTOPOS if exists - Summary : Position of agent this message is to be forwarded to - - Name : FORWARDTOORG - Value : 46h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : RECIPIENTORG or previous FORWARDTOORG if exists - Summary : Organization of agent this message is to be forwarded to - - Name : FORWARDED - Value : 48h - Data : when_t - Multiple : Yes, order significant - Required : Yes, if forwarded - Summary : Date/Time this message was forwarded to another agent - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 43 Header Field Types - - - Name : RECEIVEDBY - Value : 50h - Data : ASCII - Multiple : Yes, order significant - Required : Yes, if receiving agent is other than RECIPIENT - Summary : Name of agent that received this message - - Name : RECEIVEDBYAGENT - Value : 51h - Data : ushort - Multiple : Yes, order significant - Required : No - Default : RECIPIENTAGENT or previous RECEIVEDBYAGENT if exists - Summary : Type of agent that received this message - - Name : RECEIVEDBYNETTYPE - Value : 52h - Data : ushort - Multiple : Yes, order significant - Required : No - Default : RECIPIENTNETTYPE or previous RECEIVEDBYNETTYPE if exists - Summary : Type of network that received this message - - Name : RECEIVEDBYNETADDR - Value : 53h - Data : undef - Multiple : Yes, order significant - Required : No - Default : RECIPIENTNETADDR or previous RECEIVEDBYNETADDR if exists - Summary : Network address that received this message - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 44 Header Field Types - - - Name : RECEIVEDBYEXT - Value : 54h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : RECIPIENTEXT or previous RECEIVEDBYEXT if exists - Summary : Extension of agent that received this message - - Name : RECEIVEDBYPOS - Value : 55h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : RECIPIENTPOS or previous RECEIVEDBYPOS if exists - Summary : Position of agent that received this message - - Name : RECEIVEDBYORG - Value : 56h - Data : ASCII - Multiple : Yes, order significant - Required : No - Default : RECIPIENTORG or previous RECEIVEDBYORG if exists - Summary : Organization of agent that received this message - - Name : RECEIVED - Value : 58h - Data : when_t - Multiple : Yes, order significant - Required : Yes, if received - Default : NULL - Summary : Date/Time this message was received - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 45 Header Field Types - - - Name : SUBJECT - Value : 60h - Data : ASCII - Multiple : No - Required : Yes, but may be blank (0 length or nulstr) - Summary : Subject/title of message - - Name : SUMMARY - Value : 61h - Data : ASCII - Multiple : No - Required : No - Summary : Summary of message contents, created by AUTHOR - - Name : COMMENT - Value : 62h - Data : ASCII - Multiple : Yes - Required : No - Summary : Comment about this message, created by SENDER - - This field is useful for adding notes to a message when forwarding to a new - recipient. - - Name : CARBONCOPY - Value : 63h - Data : ASCII - Multiple : Yes - Required : No - Summary : List of agents this message was also sent to - - This field is optional and only for the use of notifying the recipient of who - else received the message. - - Name : GROUP - Value : 64h - Data : ASCII - Multiple : Yes - Required : No - Summary : Name of group of users to receive message on recipient system - - This field is used when sending to a group name across a network, where the - group can be expanded into multiple header records for each agent on the - destination system. - - Name : EXPIRATION - Value : 65h - Data : when_t - Multiple : No - Required : No - Summary : Date/Time that this message will expire - - - - - _______________________________________________________________________________ - Synchronet 46 Header Field Types - - - Name : PRIORITY - Value : 66h - Data : ulong - Multiple : No - Required : No - Default : 0 - Summary : Message priority (0 is lowest, FFFFFFFFh is highest) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 47 Header Field Types - - - Name : FILEATTACH - Value : 70h - Data : ASCII - Multiple : Yes - Required : No - Summary : Name/file specification of attached file(s) - - Name of attached file(s). Wildcards allowed. MSG_FILEATTACH attribute must be - set. If the MSG_FILEATTACH attribute is set but this field is not included, - the SUBJECT field is assumed to be the filename(s). - - Name : DESTFILE - Value : 71h - Data : ASCII - Multiple : Yes, order significant - Required : No - Summary : Destination name for attached file(s) - - Wildcards allowed. FILEATTACH field must also be included. - - Name : FILEATTACHLIST - Value : 72h - Data : ASCII - Multiple : Yes - Required : No - Summary : Name of ASCII list of attached filenames - - Wildcards not allowed in ASCII list filename. Wildcards allowed in ASCII list. - MSG_FILEATTACH attribute must be set. - - Name : DESTFILELIST - Value : 73h - Data : ASCII - Multiple : Yes, order significant - Required : No - Summary : Name of ASCII list of destination filenames - - Wildcards not allowed in ASCII list filename. Wildcards allowed in ASCII list. - - Name : FILEREQUEST - Value : 74h - Data : ASCII - Multiple : Yes - Required : No - Summary : Name of requested file - - Wildcards allowed. MSG_FILEREQUEST attribute must be set - - Name : FILEPASSWORD - Value : 75h - Data : ASCII - Multiple : Yes, order significant - Required : No - Summary : Password for FILEREQUEST - - _______________________________________________________________________________ - Synchronet 48 Header Field Types - - - - Name : FILEREQUESTLIST - Value : 76h - Data : ASCII - Multiple : Yes - Required : No - Summary : Name of ASCII list of filenames to request - - Wildcards allowed. - - Name : FILEPASSWORDLIST - Value : 77h - Data : ASCII - Multiple : Yes, order significant - Required : No - Summary : Name of ASCII list of passwords for FILEREQUESTLIST - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 49 Header Field Types - - - Name : IMAGEATTACH - Value : 80h - Data : mattach_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of attached image file for display - - MSG_FILEATTACH attribute must be set. See Image Types for valid - mattach_t.type values. - - Name : ANIMATTACH - Value : 81h - Data : mattach_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of attached graphical animation file for display - - MSG_FILEATTACH attribute must be set. See Animation Types for valid - mattach_t.type values. - - Name : FONTATTACH - Value : 82h - Data : mattach_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of attached font definition file - - MSG_FILEATTACH attribute must be set. See Font Types for valid mattach_t.type - values. - - Name : SOUNDATTACH - Value : 83h - Data : mattach_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of attached sound file for playback - - MSG_FILEATTACH attribute must be set. See Sound Types for valid mattach_t.type - values. - - Name : PRESENTATTACH - Value : 84h - Data : mattach_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of attached presentation definition file - - MSG_FILEATTACH attribute must be set. See Present Types for valid - mattach_t.type values. - - - - - - - _______________________________________________________________________________ - Synchronet 50 Header Field Types - - - Name : VIDEOATTACH - Value : 85h - Data : vattach_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of attached interleaved video/sound file - - MSG_FILEATTACH attribute must be set. See Video Types for valid - vattach_t.type values and Video Compression Types for valid vattach_t.comp - values. - - Name : APPDATAATTACH - Value : 86h - Data : mattach_t - Multiple : Yes, order significant - Required : No - Summary : Name of attached application data file for process/display - - MSG_FILEATTACH attribute must be set. See Application Data Types for valid - mattach_t.type values. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 51 Header Field Types - - - Name : IMAGETRIGGER - Value : 90h - Data : typestr_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of image file to trigger for display - - See Image Types for valid typestr_t.type values. - - Name : ANIMTRIGGER - Value : 91h - Data : typestr_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of animation file to trigger for display - - See Animation Types for valid typestr_t.type values. - - Name : FONTTRIGGER - Value : 92h - Data : typestr_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of font definition file to trigger - - See Font Types for valid typestr_t.type values. - - Name : SOUNDTRIGGER - Value : 93h - Data : typestr_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of sound file to trigger for playback - - See Sound Types for valid typestr_t.type values. - - Name : PRESENTTRIGGER - Value : 94h - Data : typestr_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of presentation definition file to trigger - - See Present Types for valid typestr_t.type values. - - Name : VIDEOTRIGGER - Value : 95h - Data : typestr_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of interleaved video/sound file to trigger - - See Video Types for valid typestr_t.type values. - - - _______________________________________________________________________________ - Synchronet 52 Header Field Types - - - Name : APPDATATRIGGER - Value : 96h - Data : typestr_t - Multiple : Yes, order significant - Required : No - Summary : Type and filename of application data file to trigger - - See Application Data Types for valid typestr_t.type values. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 53 Header Field Types - - - Name : FIDOCTRL - Value : A0h - Data : ASCII - Multiple : Yes, order significant - Required : No - Format : keyword ":" [" "] appdata - Summary : FTS/FSC-compliant control information line - - Any FidoNet FTS/FSC-compliant control information ("kludge") line that - does not have an equivalent representation here. All data not unique to the - actual control line, including leading and trailing white space, Ctrl-A (01h) - character and terminating CR must be ommited. Defined in FTS-0001. - - Name : FIDOAREA - Value : A1h - Data : ASCII - Multiple : No - Required : No - Summary : FTN EchoMail conference name. - - Defined in FTS-0004. - - Name : FIDOSEENBY - Value : A2h - Data : ASCII - Multiple : Yes, order significant - Required : No - Format : net"/"node [" "[net"/"]node] [...] - Summary : Used to store two-dimensional (net/node) SEEN-BY information - - Often used in FTN EchoMail environments. Only the actual SEEN-BY data is stored - and SEEN-BY: is stripped along with any leading and trailing white space - characters. Defined in FTS-0004. - - Name : FIDOPATH - Value : A3h - Data : ASCII - Multiple : Yes, order significant - Required : No - Format : net"/"node [" "[net"/"]node] [...] - Summary : Used to store two-dimensional (net/node) - - Defined in FTS-0004. ^aPATH: is stripped along with any leading and trailing - white space characters. - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 54 Header Field Types - - - Name : FIDOMSGID - Value : A4h - Data : ASCII - Multiple : No - Required : No - Format : origaddr " " serialno - Summary : MSGID field as specified in FTS-0009. - - Name : FIDOREPLYID - Value : A5h - Data : ASCII - Multiple : No - Required : No - Format : origaddr " " serialno - Summary : REPLY field as specified in FTS-0009. - - Name : FIDOPID - Value : A6h - Data : ASCII - Multiple : No - Required : No - Format : pID " " version [" "serialno] - Summary : Indentification string of program that created this message - - Defined FSC-0046. "^aPID:" and any white space is not included. - - Name : FIDOFLAGS - Value : A7h - Data : ASCII - Multiple : Yes - Required : No - Summary : Used to store the FTN FLAGS kludge information - - Note that all FLAG options that have binary representation in the message - header must be removed from the FLAGS string prior to storing it. Only the - actual flags option string is stored and ^aFLAGS is stripped along with any - leading and trailing white space characters. Defined in FSC-0053. - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 55 Header Field Types - - - Name : RFC822HEADER - Value : B0h - Data : ASCII - Multiple : Yes, order significant - Required : No - Format : field-name ":" [field-body] [CRLF] - Summary : Undefined RFC-822 header field - - Internet Message storage format, that does not have an equivalent - representation here. Folded header fields are allowed. Terminating CRLF may be - ommited. - - Name : RFC822MSGID - Value : B1h - Data : ASCII - Multiple : No - Required : No - Format : "<" addr-spec ">" - Summary : Message-ID field as specified in RFC-822. - - Name : RFC822REPLYID - Value : B2h - Data : ASCII - Multiple : No - Required : No - Format : "<" addr-spec ">" - Summary : In-Reply-To field as specified in RFC-822. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 56 Header Field Types - - - Name : UNKNOWN - Value : F0h - Data : undef - Multiple : Yes - Required : No - Summary : Undefined header field of undefined type - - This field is useful for retaining binary header fields (that do not have an - equivalent representation here) between message storage formats. - - Name : UNKNOWNASCII - Value : F1h - Data : ASCII - Multiple : Yes - Required : No - Summary : Undefined header field of type ASCII - - This field is useful for retaining ASCII header fields (that do not have an - equivalent representation here) between message storage formats. - - Name : UNUSED - Value : FFh - Data : undef - Multiple : Yes - Required : No - Summary : Unused (deleted) header field - - The data contained in this header field is of an unknown type and should not be - processed. - - - Note: - ---- - Specifically, not defined are the values F000h through FFFFh. These values - are to be used for user or system defined header fields. Digital Dynamics - requests that any developers or organizations that wish to have additional - header fields added to this specification notify Digital Dynamics through any - of the contact methods listed at the beginning of this document. - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 57 Header Field Types - - - Data Field Types: - ================ - - These are the defined valid values for dfield_t.type: - - - Val Name Data Description - --- ---- ---- ----------- - 00h TEXT_BODY mtext_t Displayable text (body of message). - Included in duplicate message checking. - All terminating white space and control - characters are to be truncated from data - (except when multiple contiguous CRLFs - terminate the text, only the last CRLF - is removed). - - 01h TEXT_SOUL mtext_t Non-displayed text. - Not normally displayed. Not necessarily - displayable. - Included in duplicate message checking. - - 02h TEXT_TAIL mtext_t Displayable text (tag/tear/origin lines, - etc). - Not included in duplicate message checking. - All terminating white space and control - characters are to be truncated from data. - - 03h TEXT_WING mtext_t Non-displayed text. - Not normally displayed. Not necessarily - displayable. - Not included in duplicate message checking. - - 10h FTEXT_BODY ftext_t Formatted equivalent of TEXT_BODY to be - displayed in place of TEXT_BODY if format - is supported. See Image Types for valid - values of ftext_t.type. - - 12h FTEXT_TAIL ftext_t Formatted equivalent of TEXT_TAIL to be - displayed in place of TEXT_TAIL if format - is supported. See Image Types for valid - values of ftext_t.type. - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 58 Data Field Types - - - 20h IMAGEEMBED membed_t Type and data of embedded raster image file - for display. - See Image Types for valid membed.type - values. - - 21h ANIMEMBED membed_t Type and data of embedded graphical - animation file for display. - See Animation Types for valid membed.type - values. - - 22h FONTEMBED membed_t Type and data of embedded font definition - file. See Font Types for valid - membed_t.type values. - - 23h SOUNDEMBED membed_t Type and data of embedded sound file for - playback. - See Sound Types for valid membed_t.type - values. - - 24h PRESENTEMBED membed_t Type and data of embedded presentation - definition file. - See Present Types for valid membed_t.type - values. - - 25h VIDEOEMBED vembed_t Type and data of embedded video/sound file - for playback. - See Video Types for valid vembed_t.type - values. - See Video Compression Types for valid - vembed_t.comp values. - - 26h APPDATAEMBED membed_t Type and data of embedded application data - file for process/display. - See Application Data Types for valid - membed_t.type values. - - FFh UNUSED undef Space allocated for future update/expansion - - - Specifically, not defined are the values F000h through FFFFh. These values - are to be used for user or system defined data fields. Digital Dynamics - requests that any developers or organizations that wish to have additional - data fields added to this specification notify Digital Dynamics through any - of the contact methods listed at the beginning of this document. - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 59 Data Field Types - - - Message Attributes: - ------------------ - - These are the bit values for idxrec_t.attr and msghdr_t.attr: - - MSG_PRIVATE (1<<0) // Private - MSG_READ (1<<1) // Read by addressee - MSG_PERMANENT (1<<2) // Permanent - MSG_LOCKED (1<<3) // Msg is locked, no editing possible - MSG_DELETE (1<<4) // Msg is marked for deletion - MSG_ANONYMOUS (1<<5) // Anonymous author - MSG_KILLREAD (1<<6) // Delete message after it has been read - MSG_MODERATED (1<<7) // This message must be validated before export - MSG_VALIDATED (1<<8) // This message has been validated by a moderator - - - Auxillary Attributes: - -------------------- - These are the bit values for msghdr_t.auxattr: - - MSG_FILEREQUEST (1<<0) // File request - MSG_FILEATTACH (1<<1) // File(s) attached to Msg - MSG_TRUNCFILE (1<<2) // Truncate file(s) when sent - MSG_KILLFILE (1<<3) // Delete file(s) when sent - MSG_RECEIPTREQ (1<<4) // Return receipt requested - MSG_CONFIRMREQ (1<<5) // Confirmation receipt requested - MSG_NODISP (1<<6) // Msg may not be displayed to user - - - Network Attributes: - ------------------ - These are the bit values for msghdr_t.netattr: - - MSG_LOCAL (1<<0) // Msg created locally - MSG_INTRANSIT (1<<1) // Msg is in-transit - MSG_SENT (1<<2) // Sent to remote - MSG_KILLSENT (1<<3) // Kill when sent - MSG_ARCHIVESENT (1<<4) // Archive when sent - MSG_HOLD (1<<5) // Hold for pick-up - MSG_CRASH (1<<6) // Crash - MSG_IMMEDIATE (1<<7) // Send Msg now, ignore restrictions - MSG_DIRECT (1<<8) // Send directly to destination - MSG_GATE (1<<9) // Send via gateway - MSG_ORPHAN (1<<10) // Unknown destination - MSG_FPU (1<<11) // Force pickup - MSG_TYPELOCAL (1<<12) // Msg is for local use only - MSG_TYPEECHO (1<<13) // Msg is for conference distribution - MSG_TYPENET (1<<14) // Msg is direct network mail - - - - - - - - _______________________________________________________________________________ - Synchronet 60 Message Attributes - - - Translation Types: - ----------------- - - Definition for values of *.xlat[x]: - - XLAT_NONE 0 // No translation/End of translation list - XLAT_LF2CRLF 1 // Expand sole LF to CRLF - XLAT_ESCAPED 2 // 7-bit ASCII escaping for ctrl and 8-bit data - XLAT_HUFFMAN 3 // Static and adaptive Huffman coding compression - XLAT_LZW 4 // LZW (Lempel-Ziv-Welch) encoding for compression - // Terry Welch, IEEE Computer Vol 17, No 6 - // June 1984, pp 8-19 - XLAT_LZC 5 // LZC (modified LZW) encoding for compression - // Unix compress program - XLAT_RLE 6 // Run length encoding compression - XLAT_IMPLODE 7 // Implode compression (PKZIP v1.x) - XLAT_SHRINK 8 // Shrink compression (PKZIP v1.x) - XLAT_LZH 9 // LZH dynamic Huffman coding - // Haruyasu Yoshizaki, LHarc - // November, 1988 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 61 Translation Types - - - Agent Types: - ----------- - - AGENT_PERSON 0 // To or from person - AGENT_PROCESS 1 // Unknown process, identified by agent name - - Agent types E000h through EFFFh are reserved for Synchronet process types - (defined specifically by Digital Dynamics). - - Note: - ---- - Specifically not defined are agent types F000h through FFFFh. These values - are to be used for user or system defined agent types. Digital Dynamics - requests that any developers or organizations that wish to have additional - agent types added to this specification notify Digital Dynamics through any - of the contact methods listed at the beginning of this document. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 62 Agent Types - - - Network Types: - ------------- - - // Net Type Address Format - // ----------------------------------- - NET_NONE 0 // Locally created none - NET_UNKNOWN 1 // Unknown undef - NET_FIDO 2 // FTN network fidoaddr_t - NET_POSTLINK 3 // PostLink network none - NET_QWK 4 // QWK based network ASCII - NET_INTERNET 5 // The Internet ASCII - NET_WWIV 6 // WWIV based network ulong - NET_MHS 7 // MHS network ASCII - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 63 Network Types - - - Media Types: - =========== - - Image Types: - ----------- - - IMAGE_UNKNOWN 0x00 // Use image signature header to determine format - IMAGE_ASC 0x01 // ASCII text/IBM extended ASCII graphics - IMAGE_ANS 0x02 // ANSI X3.64 terminal escape sequences - IMAGE_AVT 0x03 // AVATAR terminal escape sequences - IMAGE_LVI 0x04 // LVI terminal escape sequences - IMAGE_GIF 0x05 // Compuserve Graphics Interchange Format (GIF) - IMAGE_TIF 0x06 // Tagged Image Format (AKA TIFF) - IMAGE_JPG 0x07 // Joint Photographers Electronics Group (JPEG) - IMAGE_T16 0x08 // TrueVision 16-bit bitmap (TGA) - IMAGE_T24 0x09 // TrueVision 24-bit bitmap (TGA) - IMAGE_T32 0x0a // TrueVision 32-bit bitmpa (TGA) - IMAGE_PCX 0x0b // ZSoft PaintBrush graphics - IMAGE_BMP 0x0c // Windows bitmap - IMAGE_RLE 0x0d // Windows bitmap (compressed) - IMAGE_DIB 0x0e // Display independant bitmap - IMAGE_PCD 0x0f // Kodak PhotoCD - IMAGE_G3F 0x10 // Group 3 FAX - IMAGE_EPS 0x11 // Ecapsulated PostScript - IMAGE_RTF 0x12 // Rich text format - IMAGE_RIP 0x13 // Remote Imaging Protocol Script (RIPscrip) - IMAGE_NAP 0x14 // NAPLPS - IMAGE_CDR 0x15 // Corel Draw! - IMAGE_CGM 0x16 // Computer graphics metafile - IMAGE_WMF 0x17 // Windows metafile - IMAGE_DFX 0x18 // Autodesk AutoCAD - IMAGE_IFF 0x19 // Amiga Interchange File Format - - - Animation Types: - --------------- - - ANIM_UNKNOWN 0 // Use file signature header to determine format - ANIM_FLI 1 // Autodesk animator - ANIM_FLC 2 // Autodesk - ANIM_GL 3 // Grasprt - ANIM_IFF 4 // Amiga Interchange File Format - - - Video Types: - ----------- - - VIDEO_UNKNOWN 0 // Use file signature header to determine format - VIDEO_QTIME 1 // Apple Quick-time - VIDEO_FQTIME 2 // Apple Flattened Quick-time - VIDEO_AVI 3 // Windows Auto/Video Interleave - VIDEO_ULT 4 // OS/2 Ultimotion - - - - _______________________________________________________________________________ - Synchronet 64 Media Types - - - Video Compression Types: - ----------------------- - - VCOMP_UNKNOWN 0 // Use file signature header to determine codec - VCOMP_RLE 1 // Apple animation - VCOMP_SMC 2 // Apple graphics - VCOMP_RPZA 3 // Apple video - VCOMP_KLIC 4 // Captain crunch - VCOMP_CVID 5 // CinePak - VCOMP_RT21 6 // Intel indeo R2 - VCOMP_IV31 7 // Intel indeo R3 - VCOMP_YVU9 8 // Intel YVU9 - VCOMP_JPEG 9 // JPEG - VCOMP_MRLE 10 // Microsoft RLE - VCOMP_MSVC 11 // Microsoft video 1 - - - Font Types: - ---------- - - FONT_UNKNOWN 0 // Use file signature header to determine format - FONT_TTF 1 // Windows TrueType - FONT_PFB 2 // PostScript Type 1 Font Binary - FONT_PFM 3 // PostScript Type 1 Font Metric - FONT_AMIGA 4 // Amiga Bitmapped - FONT_AGFA 5 // CompuGraphic Fonts - - - Sound Types: - ----------- - - SOUND_UNKNOWN 0 // Use file signature header to determine format - SOUND_MOD 1 // MOD format - SOUND_VOC 2 // Sound Blaster VOC format - SOUND_WAV 3 // Windows 3.1 WAV RIFF format - SOUND_MID 4 // MIDI format - SOUND_GMID 5 // General MIDI format (standardized patches) - SOUND_SMP 6 // Turtle Beach SampleVision format - SOUND_SF 7 // IRCAM format - SOUND_AU 8 // Sun Microsystems AU format - SOUND_IFF 9 // Amiga Interchange File Format - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 65 Media Types - - - Application Data Types: - ---------------------- - - APPDATA_UNKNOWN 0 // Use file signature header to determine format - APPDATA_WORDPERFECT 1 // WordPerfect Document - APPDATA_WKS 2 // Lotus 123 Worksheet (?) - APPDATA_WK1 3 // Lotus 123 Worksheet rev 1 - APPDATA_WK2 4 // Lotus 123 Worksheet rev 2 - APPDATA_WK3 5 // Lotus 123 Worksheet rev 3 - APPDATA_DBF 6 // dBase III data file - APPDATA_PDX 7 // Paradox data file - APPDATA_EXCEL 8 // Excel data file - APPDATA_QUATRO 9 // Borland Quatro Pro file - APPDATA_WORD 10 // Microsoft Word - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 66 Media Types - - - Message Storage Pseudo Code - =========================== - - The following is a "C like" pseudo code listing example of adding a message to - an SMB message base. SMBLIB contains C functions to do most of the following - operations. We are supplying this pseudo code as a general definition of the - order of required operations in writing to the message base. Many details have - been left out to simplify the code and to demonstrate only the basic - principles. - - shd = open ( MSGBASE.SHD , READ/WRITE/DENY_NONE ) - sdt = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) - sid = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) - - lock ( shd , smbhdr ) - read ( shd , smbstatus ) - - if ( smbstatus.attr & SMB_HYPERALLOC ) - msg.hdr.offset = filelength ( sdt ) - - else { - number_of_blocks = length_of_message_data / SDT_BLOCK_LEN - if ( length_of_message_data % SDT_BLOCK_LEN ) /* unevenly divisible */ - number_of_blocks = number_of_blocks + 1 - - sda = open ( MSGBASE.SDA , READ/WRITE/DENY_ALL ) - - if ( fast_allocation_mode ) - seek ( sda , END_OF_FILE ) - - else { - seek ( sda , BEGINNING_OF_FILE ) - while ( not end_of_file ( sda ) ) { - read ( sda , allocated , number_of_blocks * 2 ) - if ( allocated = 0 ) { - seek_backwards ( sda , number_of_blocks * 2 ) - break - } - } - } - - msg.hdr.offset = ( current_position ( sda ) / 2 ) * SDT_BLOCK_LEN - - allocated = 1 - - write ( sda , allocated , number_of_blocks * 2 ) - - close ( sda ) - } - - - - - - - _______________________________________________________________________________ - Synchronet 67 Message Storage Pseudo Code - - - seek ( sdt , msg.hdr.offset ) - - write ( sdt , message_data ) - - if ( smbstatus.attr & SMB_HYPERALLOC ) - msg.idx.offset = filelength ( shd ) - - else { - number_of_blocks = length_of_message_header / SHD_BLOCK_LEN - if ( length_of_message_header % SHD_BLOCK_LEN ) /* unevenly divisible */ - number_of_blocks = number_of_blocks + 1 - - sha = open ( MSGBASE.SHA , READ/WRITE/DENY_ALL ) - - if ( fast_allocation_mode ) - seek ( sha , END_OF_FILE ) - - else { - seek ( sha , BEGINNING_OF_FILE ) - while ( not end_of_file ( sha ) ) { - read ( sha , allocated , number_of_blocks ) - if ( allocated = 0 ) { - seek_backwards ( sha , number_of_blocks ) - break - } - } - } - - msg.idx.offset = ( current_position ( sha ) * SHD_BLOCK_LEN ) - msg.idx.offset = msg.idx.offset + smbstatus.header_offset - - allocated = 1 - - write ( sha , allocated , number_of_blocks ) - - close ( sha ) - } - - seek ( shd , msg.idx.offset ) - - msg.hdr.number = smbstatus.last_msg+1 - - write ( shd , msg.hdr ) - - smbstatus.total_msgs = smbstatus.total_msgs + 1 - smbstatus.last_msg = msg.hdr.number - - write ( shd , smbstatus ) - - write ( sid , msg.idx ) - - unlock ( shd , smbstatus ) - - - - _______________________________________________________________________________ - Synchronet 68 Message Storage Pseudo Code - - - Message Retrieval Pseudo Code - ============================= - - shd = open ( MSGBASE.SHD , READ/WRITE/DENY_NONE ) - sdt = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) - sid = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) - - read ( sid , msg.idx ) - - seek ( shd , msg.idx.offset ) - - lock ( shd , msg.hdr ) - - read ( shd , msg.hdr ) - - seek ( sdt , msg.hdr.offset ) - - read ( sdt , msg.hdr.data_length ) - - unlock ( shd , msg.hdr ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 69 Message Retrieval Pseudo Code - - - SMBUTIL - ======= - - SMBUTIL is a utility that can perform various functions on an SMB message base. - The primary purpose of SMBUTIL is as an example to C programmers of how to use - the SMBLIB functions to access and modify an SMB message base. The complete C - source code for SMBUTIL is included and functions from it can be used or - modified by developers at their own discretion. The following files make up - SMBUTIL: - - SMBUTIL.EXE Compiled and linked for 16-bit DOS (ready to run) - SMBUTIL.C C functions - SMBUTIL.H C definitions and variable prototypes - SMBUTIL.WAT Makefile for Watcom C/C++ (type wmake -f smbutil.wat) - SMBUTIL.BOR Makefile for Borland C/C++ (type make -f smbutil.bor) - - The usage syntax is as follows: - - SMBUTIL [/opts] cmd smb_filespec.shd - - where cmd is one or more of the following: - - l[n] = list msgs starting at number n - r[n] = read msgs starting at number n - v[n] = view msg headers starting at number n - k[n] = kill (delete) n msgs - i<f> = import from text file f - s = display msg base status - c = change msg base status - m = maintain msg base - delete old msgs and msgs over max - p[k] = pack msg base (k specifies minimum packable Kbytes) - - where opts is one or more of the following: - - a = always (force) packing - z<n> = set time zone (n=min +/- from UT or 'EST','EDT','CST',etc) - - and smb_filespec is the base filename or file specification (wildcards) for the - message base. If wildcards are used, the ".SHD" extension must be specified. - - An example command line: - - SMBUTIL MP C:\SBBS\DATA\SUBS\*.SHD - - would maintain and pack all the message bases found in the C:\SBBS\DATA\SUBS - directory. - - - - - - - - - - _______________________________________________________________________________ - Synchronet 70 SMBUTIL - - - CHKSMB - ====== - - CHKSMB is a utility that performs a comprehensive analysis of a message base - to find any possible errors and calculate the number of packable bytes. It does - not "fix" a message base if any errors are found, it only reports the specific - errors (and exits with a non-zero error level). If any errors are reported, - packing the message base with SMBUTIL may rebuild the damaged files. If that - doesn't work, then use FIXSMB as a last resort. - - C source code for CHKSMB is also included as an example to programmers of how - to use SMBLIB functions. - - The usage syntax is as follows: - - CHKSMB [/opts] smb_filespec.shd - - where opts is one or more of the following: - - q = quiet mode (no beeps) - s = stop after an errored message base (for use with wildcards) - p = pause after an errored message base (wait for key press) - t = don't check for unsupported translation strings (faster) - e = display extended information on corrupted messages - - An example command line: - - CHKSMB /QP C:\SBBS\DATA\SUBS\*.SHD - - would check all the message bases in the C:\SBBS\DATA\SUBS directory, without - beeping on errors, and pausing after an errored message base. - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 71 CHKSMB - - - FIXSMB - ====== - - FIXSMB is a utility that will rebuild the index and allocation files for a - message base. Since the message headers are not necessarily stored - sequentially, the order of the messages in the index may be changed when the - index is rebuilt. Messages are also re-numbered, so only use this program if - the index is corrupted and the messages are extremely important. - - C source code for FIXSMB is also included as an example to programmers of how - to use SMBLIB functions. - - The usage syntax is as follows: - - FIXSMB [/M] smb_file - - An example command line: - - FIXSMB \SBBS\DATA\MAIL - - Only use the "/M" command line switch if fixing an older Synchronet e-mail - message base (created with SBBS v2.1 or earlier). Once the SMB_EMAIL status - attr is set ("SMBUTIL S" will report a status attr of 1), the "/M" is not - required. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 72 FIXSMB - - - SMBLIB - ====== - - SMBLIB is a library of C functions for accessing and storing messages in an - SMB format message base. It can eliminate much of the development time for - developers that wish to use the library in whole or in part, or use the - functions as examples for their own message base function library. The library - consists of the following files: - - SMBDEFS.H Constant definitions, macros, and data types - SMBLIB.H Library constants and function prototypes - SMBLIB.C Function definitions - SMBVARS.C Global variable definitions (doubles as declaration file) - - For developers to use this library with their program, they must include the - "SMBLIB.H" header file at the top of each C file that uses any of the library - functions, global variables, data types, macros, and constants. This can be - done by simply adding the following line to each .C file: - - #include "smblib.h" - - If SMBLIB.H is included, there is no need to include SMBDEFS.H or SMBVARS.C. - - To link the library functions and variables with a main program, the files - SMBVARS.OBJ and SMBLIB.OBJ must be linked with the main program .OBJ files. - If the operating system is DOS, be sure that all .OBJ files are compiled for - the same memory model. - - Example MAKEFILEs for compiling and linking SMBUTIL with Borland C/C++ - (SMBUTIL.BOR) and Watcom C/C++ (SMBUTIL.WAT) are included. - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 73 SMBLIB - - - SMBDEFS.H - ========= - - The SMBDEFS.H file contains important constant definitions and data types (also - defined in this document). If ever this document and SMBDEFS.H are inconsistent - with each other, then SMBDEFS.H is to be considered correct and this document - in error. If such a discrepency is found, please notifiy Digital Dynamics so it - can be corrected in a future revision of the specification. - - Most notable of the data types is a structure called smbmsg_t (not defined - in this document). It contains the fixed and variable portions of a message's - header record as well as convenience pointers to the sender's name - (smbmsg_t.to), recipient's name (smbmsg_t.from), network addresses, and more. - If multiple SENDER header fields are included (for example), then smbmsg_t.to - will point to the last SENDER header field in the header record. Convenience - pointers for other data items work in the same fasion if multiple header fields - of the same type exist in the header record. - - Variables of the smbmsg_t data type (and pointers to variables of smbmsg_t - type) are used as arguments to many of the SMBLIB functions. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 74 SMBDEFS.H - - - SMBVARS.C - ========= - - The SMBVARS.C file contains definitions of the global variables used by the - SMBLIB functions. It is a fairly small file since their are a small number of - global variables (by design). This file is used for both definitions and - declarations, so no "extern" declarations need to be made in developers source - code as long as SMBVARS.C or (preferably) SMBLIB.H is included in the source - code. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 75 SMBVARS.C - - - SMBLIB.H - ======= - - The SMBLIB.H file contains prototypes of all the functions in the SMBLIB.C - file. It is necessary to include this file in C source code if any of the - SMBLIB functions are used. The following C source line will include this file: - - #include "smblib.h" - - and should be placed near the top of all C source files that use SMBLIB - functions, variables, constants, or data types. - - Function prototypes are necessary for compilers to know the correct calling - syntax of a function and detect incorrect usage. Prototypes are also useful - as a quick reference for programmers as to the correct calling syntax of a - specific function. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 76 SMBLIB.H - - - SMBLIB.C - ======= - - The SMBLIB.C file contains the actual SMBLIB library functions. This source - file is not a stand alone program, but instead must be compiled and linked - with a main source file to create the executable program. - - The functions in this file are organized in a logical order, but their order - is actually irrelevant to the compiling, linking, and execution of the - resulting program. - - A comment block preceeds each function, explaining what the function does, - how the passed parameters are used, and what the return code (if any) - indicates. A more detailed explanation of each function is included here: - - int smb_open(int retry_time) - ---------------------------- - The smb_open() function must be called before the message base is accessed - (read from or written to). The parameter, retry_time, is the maximum number - of seconds to wait while retrying to lock the message base header. If - retry_time is 0, then the message base header is not locked or read (this is - called "Fast Open" and should only be used when speed is more important than - checking for compatibility and validity upon opening). The global variable - smb_file must be initialized with the path and base filename of the message - base. This function returns 0 on success, 1 if the .SDT file could not be - opened, 2 if the .SHD file could not be opened, and 3 if the .SID file could - not be opened. If the message base header could not be locked, this function - returns -1. If the message base ID is incorrect, it returns -2. And if the - message base is of an incompatible version, it returns -3. - - The errno global variable (standard of most C libraries) will most likely - contain the error code for open failure. - - int smb_open_da(int retry_time) - ------------------------------- - The smb_open_da() function is used to open the data block allocation file for - writing messages to a message base. The parameter, retry_time, is the maximum - number of seconds to wait while retrying to open the file. This function - returns 0 on success. -1 is returned if an open error other than "Access - Denied" is returned from the operating system, and the global variable errno - will contain the error code. -2 is returned if the retry_time has been - reached, and -3 is returned if the file descriptor could not be converted to - a stream by the fdopen() function. - - fclose(sda_fp) should be called immediately after all necessary file access - has been completed. - - This function is not used with the Hyper Allocation storage method. - - - - - - - - _______________________________________________________________________________ - Synchronet 77 SMBLIB.C - - - int smb_open_ha(int retry_time) - ------------------------------- - The smb_open_ha() function is used to open the header block allocation file for - writing messages to a message base. The parameter, retry_time, is the maximum - number of seconds to wait while retrying to open the file. This function - returns 0 on success. -1 is returned if an open error other than "Access - Denied" is returned from the operating system, and the global variable errno - will contain the error code. -2 is returned if the retry_time has been - reached, and -3 is returned if the file descriptor could not be converted to - a stream by the fdopen() function. - - fclose(sha_fp) should be called immediately after all necessary file access - has been completed. - - This function is not used with the Hyper Allocation storage method. - - int smb_create(ulong max_crcs, ulong max_msgs, ushort max_age, ushort attr - ,int retry_time) - -------------------------------------------------------------------------- - The smb_create() function is used to create a new message base or reset an - existing message base. The parameters max_crcs, max_msgs, max_age, and attr - are used to set the initial status of the message base status header. The - parameter, retry_time is the maximum number of seconds to wait while retrying - to lock the message base header. This functions returns 0 on success or 1 if - the message base header could not be locked. - - int smb_trunchdr(int retry_time) - -------------------------------- - The smb_trunchdr() function is used to truncate the header file when packing - the message base and writing the new header information back to the header - file. The parameter, retry_time is the maximum number of seconds to wait while - retrying to truncate the header file. Returns 0 on success, -1 if error was - other than "Access Denied", or -2 if retry_time reached. - - int smb_locksmbhdr(int retry_time) - ---------------------------------- - The smb_locksmbhdr() function is used to lock the first message base (status) - header. The parameter, retry_time is the number of seconds to wait while - retrying to lock the header. The smb_unlocksmbhdr() function should always be - used to unlock the header after accessing the message base header (usually - with smb_getstatus() and/or smb_putstatus()). Returns 0 if successful, -1 if - unsuccessful. - - int smb_unlocksmbhdr() - ---------------------- - The smb_unlocksmbhdr() function is used to unlock a previously locked message - base header (using smb_lockmsghdr()). Returns 0 on success, non-zero on - failure. - - int smb_getstatus(smbstatus_t *hdr) - ----------------------------------- - The smb_getstatus() function is used to read the status message base header - into the hdr structure. Returns 0 on success, 1 on failure. - - - _______________________________________________________________________________ - Synchronet 78 SMBLIB.C - - - int smb_putstatus(smbstatus_t hdr) - ---------------------------------- - The smb_putstatus() function is used to write the status information to the - first message base header. The parameter hdr, contains the status information - to be written. Returns 0 on success, 1 on failure. - - int smb_getmsgidx(smbmsg_t *msg) - -------------------------------- - The smb_getmsgidx() function is used to get the byte offset for a specific - message header in the message header file based on the message base index. - - If msg->hdr.number is non-zero when this function is called, then the index - will be searched for this message number. If the message number is found in - the index, the msg->idx.offset is set to the byte offset of the message header - record in the header file and msg->offset is set to the record offset of the - index record in the index file, and the function returns 0. If the message - number is not found in the index, the function returns 1. - - If msg->hdr.number is zero, msg->idx.offset and msg->idx.number are obtained - from the index record at record offset msg->offset. If msg->offset is an - invalid record offset when this function is called, the function returns 1. - Otherwise, the function returns 0. - - int smb_getlastidx(idxrec_t *idx) - --------------------------------- - Reads the last index record of the currently open message base into the - idxrec_t structure pointed to by idx. Returns 0 if successful, -1 if the index - is empty or unopened, or -2 if the record can't be read. - - int smb_getmsghdrlen(smbmsg_t msg) - ---------------------------------- - The smb_getmsghdrlen() function is used to calculate the total length of - message header msg including both fixed and variable length portions. This - function returns the length of the header record in bytes. - - long smb_getmsgdatlen(smbmsg_t msg) - ----------------------------------- - The smb_getmsgdatlen() function is used to calculate the total length of the - data for message msg. This function returns the length of all data fields - combined. - - int smb_lockmsghdr(smbmsg_t msg, int retry_time) - ------------------------------------------------ - The smb_lockmsghdr() function is used to lock the header record for message - msg. The parameter retry_time is the maximum number of seconds to wait while - retrying to lock the header. Returns 0 on success, -1 on failure. The function - smb_unlockmsghdr() should immediately be called after accessing the message - header (usually with smb_getmsghdr() or smb_putmsghdr()). - - - - - - - - _______________________________________________________________________________ - Synchronet 79 SMBLIB.C - - - int smb_getmsghdr(smbmsg_t *msg) - -------------------------------- - The function smb_getmsghdr() is used to read the header record for message - msg. msg->idx.offset must be initialized to the byte offset of the header - record in the header file before this function is called. The function - smb_freemsgmem() must be called to free the memory allocated by this function - for the header and data felds. This function returns 0 on success, -1 if - the fixed portion of the message header record could not be read, -2 if the - message header ID was incorrect, -3 if memory could not be allocated, -4 - if a data field could not be read, -5 if the fixed length portion of a header - field could not be read, -6 if the variable length portion of a header field - could not be read, -7 if one or more of the mandatory header fields (SENDER, - RECIPIENT, or SUBJECT) are missing, -8 if total_dfields extends beyond the - end of the header record, or -9 if incompatible header version. - - Several convenience pointers in the msg structure are initialized by this - function to point to the last occurance of the SENDER (msg->from), RECIPIENT - (msg->to), SUBJECT (msg->subj), etc. - - int smb_unlockmsghdr(smbmsg_t msg) - ---------------------------------- - The smb_unlockmsghdr() function is used to unlock a previously locked message - header (with smb_lockmsghdr()). This function returns 0 on success, non-zero - on failure. - - int smb_addcrc(ulong max_crcs, ulong crc, int retry_time) - --------------------------------------------------------- - The smb_addcrc() function is used to add a CRC-32 to the CRC history file - for a message base, automatically checking for duplicates. The parameter - max_crcs should be the max_crcs defined in the status header of the message - base. The parameter crc, is the CRC-32 of the TEXT_BODY and TEXT_SOUL data - fields for the message. The parameter retry_time is the maximum number of - seconds to wait when retrying to open the CRC history file. - - This function returns -1 if there was an open error, -2 if the retry_time - was reached, -3 if there was a memory allocation error, 1 if the CRC already - exists in the CRC history file (indicating a duplicate message), or 0 on - success (and no duplicate). - - int smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data) - --------------------------------------------------------------------- - The smb_hfield() function is used to add a header field to the structure msg. - The parameters type, length, and data, must be specified according to the - header field values listed in this specification. This function returns 0 - on success, non-zero on memory allocation error. The function smb_freemsgmem() - must be called to free the memory allocated by this function. - - int smb_dfield(smbmsg_t *msg, ushort type, ulong length) - -------------------------------------------------------- - The smb_dfield() function is used to add a data field to the structure msg. - The parameters type and length must be specified according to the data field - values listed in this specification. This function returns 0 on success, - non-zero on memory allocation error. The function smb_freemsgmem() must be - called to free the memory allocated by this function. - - _______________________________________________________________________________ - Synchronet 80 SMBLIB.C - - - int smb_addmsghdr(smbmsg_t *msg,smbstatus_t *status,int storage,int retry_time) - ------------------------------------------------------------------------------- - The smb_addmsghdr() function is used to add a new message header to the message - header file and update the index file. The msg and status structures are - updated to reflect the new total messages, last message number, etc. The - storage parameter is used to indicate the storage method to use (either - SMB_SELFPACK, SMB_FASTALLOC, or SMB_HYPERALLOC). If the storage type is - SMB_SELFPACK, the header block allocation file will be searched for unused - block(s) to store this header. If the storage type is SMB_FASTALLOC or - SMB_HYPERALLOC, the header is stored at the end of the header file. Returns 0 - on success, non-zero on failure. The parameter retry_time is the maximum number - of seconds to wait while retrying to lock and open files. - - int smb_putmsg(smbmsg_t msg) - ---------------------------- - The smb_putmsg() function calls both the smb_putmsghdr() and smb_putmsgidx() - functions to write the header and index elements of a message to the - appropriate files. Returns 0 on success, non-zero on failure. - - int smb_putmsgidx(smbmsg_t msg) - ------------------------------- - The smb_putmsgidx() function is used to store a message index in the message - index file. The message index can be for a new message or an existing - message. Returns 0 on success, non-zero on failure. - - int smb_putmsghdr(smbmsg_t msg) - ------------------------------- - The smb_putmsghdr() function is used to store a message header in the message - header file. The message header can be for a new message or an existing - message. Returns 0 on success, non-zero on failure. - - void smb_freemsgmem(smbmsg_t msg) - --------------------------------- - Frees allocated memory for the header and data fields in the msg structure. - This function must be called to free the memory allocated by the functions - smb_hfield(), smb_dfield(), and smb_getmsghdr(). - - long smb_hdrblocks(ulong length) - -------------------------------- - The smb_hdrblocks() function is used to calculate the number of blocks - required to store a message header of length size (in bytes). This function - returns the number of blocks required. - - long smb_datblocks(ulong length) - -------------------------------- - The smb_datblocks() function is used to calculate the number of blocks - required to store message data of length size (in byte). This function returns - the number of blocks required. - - - - - - - - _______________________________________________________________________________ - Synchronet 81 SMBLIB.C - - - long smb_allochdr(ulong length) - ------------------------------- - The smb_allochdr() function is used to search for free blocks to store a - message header of length bytes and mark the free blocks as allocated in the - header allocation file. This function returns the byte offset to the header - record or a negative number on error. The function smb_open_ha() should be - called prior to calling this function and fclose(sha_fp) should be called - after. The function is called from smb_addmsghdr(), so you probably have no - need to call this function directly. - - long smb_fallochdr(ulong length) - -------------------------------- - The smb_fallochdr() function works exactly the same as the smb_allochdr() - function except it is much faster because the header allocation file is not - searched for free blocks. The function is called from smb_addmsghdr(), so you - probably have no need to call this function directly. - - long smb_hallochdr(ulong header_offset) - --------------------------------------- - This smb_hallochdr() functions works exactly the same as the smb_fallochdr() - function except the status.header_offset is passed as the argument and the - header allocation (.SHA) file is not updated so smb_open_ha() need not be - called. The function is called from smb_addmsghdr(), so you probably have no - need to call this function directly. - - long smb_allocdat(ulong length, ushort headers) - ----------------------------------------------- - The smb_allocdat() function is used to search for free blocks to store length - amount of data for a message. The parameter headers, indicates the number of - message headers that are associated with this data. Normally, the headers - parameter will be 1, unless this message is part of a mass mailing. The offset - to the allocated data blocks is returned, or a negative value on error. The - function smb_open_da() should be called prior to calling this function and - fclose(sda_fp) should be called after. - - long smb_fallocdat(ulong length, ushort headers) - ------------------------------------------------ - The smb_fallocdat() function works exactly the same as the smb_allocdat() - function except it is much faster because the data allocation file is not - searched for free blocks. - - long smb_hallocdat() - -------------------- - The smb_hallocdat() function works exactly the same as the smb_hallocdat() - function except no argument is passed and the data allocation file (.SDA) is - not updated so smb_open_da() need not be called. - - - - - - - - - - _______________________________________________________________________________ - Synchronet 82 SMBLIB.C - - - int smb_incdat(ulong offset, ulong length, ushort headers) - ---------------------------------------------------------- - The smb_incdat() function is used to increment the header counter in the data - allocation file for the data starting at the byte offset and length size in - bytes. The parameter headers, indicates the number of headers to add to the - current allocation value in the data allocation file. Returns 0 on success, - non-zero on failure. - - int smb_freemsg(smbmsg_t msg, smbstatus_t status) - ------------------------------------------------- - The smb_freemsg() function is used to free the disk space allocated for the - header and data fields of the message msg. Returns 0 on success, non-zero on - failure. The parameter, status, must be the current status from the message - base header for this message base. - - int smb_freemsgdat(ulong offset, ulong length, ushort headers) - -------------------------------------------------------------- - The smb_freemsgdat() function is used to decrement the data block allocation - records in the data allocation file associated with the data in the data file - by the value of the headers parameter (normally 1). The parameter offset - indicates the byte offset to the beginning of the message data in the data - file and the parameter length is the total length of the message data. - Returns 0 on success, non-zero on failure. - - int smb_freemsghdr(ulong offset, ulong length) - ---------------------------------------------- - The smb_freemsghdr() function is used to set the header block allocation - records in the header allocation file to 0 (indicated non-allocated block). - The parameter offset indicates the byte offset to the beginning of the header - record being freed and the parameter length indicates the total length of the - header record. Returns 0 on success, non-zero on failure. - - int smb_stack(int op) - --------------------- - The smb_stack() function is used to save and restore message base information - so that multiple message bases can be open simultaneously. The stack can - save up to 4 message bases (allowing 5 simultaneously open message bases). - The stack is a "last in, first out" storage area for open message bases. - If the op parameter is SMB_STACK_PUSH, smb_stack() will save (push) the current - message base onto the stack. Calling smb_stack(SMB_STACK_POP) will restore - (pop) the most recently pushed message base off the stack. Calling - smb_stack(SMB_STACK_XCHNG) will exchange the most recently pushed message base - and the current message base (replacing the top of the stack with the current - message base). - - void smb_close() - ---------------- - Closes the header, data, and index files for the currently open message base. - - - - - - - - _______________________________________________________________________________ - Synchronet 83 SMBLIB.C - - - Miscellaneous SMBLIB Files - ========================== - - CRC32.H C header file for CRC-32 calculations - ----------------------------------------------------- - This file contains a static 32-bit CRC table (crc32tbl[]) and a macro (ucrc32) - that uses this table to calculate 32-bit CRCs one byte at a time. - - Example: - - ulong crc=0xffffffff; - - for(i=0;i<length;i++) - crc=ucrc32(buf[i],crc); - crc=~crc; - - - CRC16.C C functions for 16-bit CRC calculations - ------------------------------------------------------- - This file contains a function (ucrc16), to calculate 16-bit CRCs one byte at a - time and a function (crc16) that uses the ucrc16() function to calculate the - 16-bit CRC of an ASCIIZ character string. - - Example: - - ushort crc; - - crc=crc16("Text"); - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 84 Miscellaneous SMBLIB Files - - - LZH.H Function prototypes for LZH.C - --------------------------------------------- - This file contains function prototypes for the two most important functions - in LZH.C, lzh_encode() and lzh_decode(). - - Example: - - uchar str[256],lzh[512]; - long length; - - strcpy(str,"This is a string of text"); - length=lzh_encode(str,strlen(str),lzh); - lzh_decode(lzh,length,str); - - - LZH.C C functions for LZH encoding (compression/decompression) - ------------------------------------------------------------------------ - This file contains the functions for encoding and decoding LZH compressed - data. If the macro LZH_DYNAMIC_BUF is defined when this file is compiled, - temporary buffers will be dynamically allocated as opposed to static. This - may be slower than the static buffer method, but frees the allocated memory - after encoding or decoding. If free memory for your application is an issue, - then define this macro when compiling this file. - - Example (Borland C): - - bcc -c -DLZH_DYNAMIC_BUF lzh - - Example (Watcom C): - - wcc -dLZH_DYNAMIC_BUF lzh - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 85 Miscellaneous SMBLIB Files - - - SMBLIB Storage Example - ====================== - - #include "smblib.h" - #include "crc16.c" - - int main(void) - { - char str[256] // General purpose string - ,*msg_text="Hello, world!" // Message text - ,nul_buf[SDT_BLOCK_LEN]={0} // NULL initialized buffer - ; - int i // General purpose integer - ,storage=SMB_SELFPACK // Default storage method - ,retry=10 // Retry for opening/locking files - ; - ushort max_age=0 // Default maximum age of messages - ,xlat=XLAT_NONE // Translation string - ,tzone=PST // Time zone - ,copies=1 // Number of copies of this msg - ; - ulong max_msgs=500 // Default max number of msgs - ,max_crcs=0 // Default max crcs - ,length // Length of msg text - ,offset // Offset to msg text in data file - ; - smbmsg_t msg; // Message structure - smbstatus_t status; // Message base status record - - strcpy(smb_file,"MSGBASE"); // We'll use "MSGBASE" for the name - if((i=smb_open(retry))!=0) { // Can't open!?! - printf("smb_open returned %d\n",i); - return(1); } - - if(!filelength(fileno(shd_fp))) // Message base not created yet - smb_create(max_crcs // Create with default settings - ,max_msgs - ,max_age - ,storage==SMB_HYPERALLOC - ? SMB_HYPERALLOC : 0 // SMB_EMAIL if this was e-mail - ,retry - ); - - if((i=smb_locksmbhdr(retry))!=0) { // Can't lock status base header - printf("smb_locksmbhdr returned %d\n",i); - smb_close(); - return(1); } - - if((i=smb_getstatus(&status))!=0) { // Can't read status base header - smb_unlocksmbhdr(); - smb_close(); - printf("smb_getstatus returned %d\n",i); - return(1); } - - - _______________________________________________________________________________ - Synchronet 86 SMBLIB Storage Example - - - if(status.attr&SMB_HYPERALLOC) - storage=SMB_HYPERALLOC; - else - storage=SMB_SELFPACK; - - length=strlen(msg_text); // Get length of message - length+=sizeof(xlat); // Add length of xlat string - - if(storage==SMB_HYPERALLOC) // Allocate space for message text - offset=smb_hallocdat(); - else { - if((i=smb_open_da(retry))!=0) { - smb_unlocksmbhdr(); - printf("smb_open_da returned %d\n",i); - smb_close(); - return(1); } - if(storage==SMB_FASTALLOC) - offset=smb_fallocdat(length,copies); - else - offset=smb_allocdat(length,copies); - fclose(sda_fp); } - - fseek(sdt_fp,offset,SEEK_SET); // Seek to beginning of data block - fwrite(&xlat,sizeof(xlat),1,sdt_fp); // Write xlat string - fwrite(msg_text,strlen(msg_text),1,sdt_fp); // Write message text - fwrite(nul_buf,SDT_BLOCK_LEN-length // Write NULLs out to end of block - ,1,sdt_fp); - fflush(sdt_fp); // Flush output buffer - smb_unlocksmbhdr(); // Unlock status base header - - memset(&msg,0,sizeof(smbmsg_t)); // Initialize header to NULL - memcpy(msg.hdr.id,"SHD\x1a",4); // Always set to SHD^Z - msg.hdr.version=SMB_VERSION; - msg.hdr.when_written.time=time(NULL); - msg.hdr.when_written.zone=tzone; - msg.hdr.when_imported.time=time(NULL); - msg.hdr.when_imported.zone=tzone; - msg.hdr.offset=offset; - - strcpy(str,"All"); // Send message to "All" - if((i=smb_hfield(&msg,RECIPIENT,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_close(); - return(1); } - strlwr(str); // If this were e-mail, idx.to - msg.idx.to=crc16(str); // would be the "to" user number - - - - - - - - - _______________________________________________________________________________ - Synchronet 87 SMBLIB Storage Example - - - strcpy(str,"Sysop"); // Send message from "Sysop" - if((i=smb_hfield(&msg,SENDER,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } - strlwr(str); // If this were e-mail, idx.from - msg.idx.from=crc16(str); // would be the "from" user number - - strcpy(str,"This is a test"); // Set the message subject/title - if((i=smb_hfield(&msg,SUBJECT,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } - strlwr(str); - msg.idx.subj=crc16(str); - - if((i=smb_dfield(&msg,TEXT_BODY,length))!=0) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } - - if((i=smb_addmsghdr(&msg,&status,storage,retry))!=0) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } - - smb_freemsgmem(msg); // Unnecessary if exiting main() - smb_close(); // Unnecessary if exiting main() - return(0); - } - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 88 SMBLIB Storage Example - - - SMBLIB Retrieval Example - ======================== - - #include "smblib.h" - - int main(void) - { - char ch; // General purpose character - int i, // General purpose integer - retry=10; // Retry for opening/locking files - ushort xlat; // Translation string - ulong l; // General purpose long integer - smbmsg_t msg; // Message structure - - strcpy(smb_file,"MSGBASE"); // We'll use "MSGBASE" for the name - if((i=smb_open(retry))!=0) { // Can't open!?! - printf("smb_open returned %d\n",i); - return(1); } - - if(!filelength(fileno(shd_fp))) { // Message base not created yet - printf("Empty\n"); - smb_close(); - return(0); } - - for(msg.offset=0;!ferror(sid_fp);msg.offset++) { - - fseek(sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) - break; - - if((i=smb_lockmsghdr(msg,retry))!=0) { - printf("smb_lockmsghdr returned %d\n",i); - break; } - if((i=smb_getmsghdr(&msg))!=0) { - smb_unlockmsghdr(msg); - printf("smb_getmsghdr returned %d\n",i); - break; } - if((i=smb_unlockmsghdr(msg))!=0) { - smb_freemsgmem(msg); - printf("smb_unlockmsghdr returned %d\n",i); - break; } - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 89 SMBLIB Retrieval Example - - - printf("Subj : %s\n",msg.subj); - printf("To : %s\n",msg.to); - printf("From : %s\n",msg.from); - printf("Date : %s\n",ctime((time_t *)&msg.hdr.when_written.time)); - - for(i=0;i<msg.hdr.total_dfields;i++) - switch(msg.dfield[i].type) { - case TEXT_BODY: // Only show BODY and TAIL data fields - case TEXT_TAIL: - fseek(sdt_fp,msg.hdr.offset+msg.dfield[i].offset - ,SEEK_SET); - fread(&xlat,sizeof(xlat),1,sdt_fp); - if(xlat!=XLAT_NONE) // No translations supported - continue; - for(l=sizeof(xlat);l<msg.dfield[i].length;l++) { - ch=fgetc(sdt_fp); - if(ch) - putchar(ch); } - printf("\n"); - break; } - printf("\n"); - - smb_freemsgmem(msg); } // Free memory allocated by smb_getmsghdr() - - smb_close(); - return(0); - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 90 SMBLIB Retrieval Example - - - SMBLIB Performance Issues - ========================= - - Since importing messages is the usually the most time consuming task likely - undertaken by an SMB application, it is also the most susceptable to design - issues that effect performance. - - Opening and Closing - ------------------- - When importing multiple messages for a single message base, it appears logical - to open the message base, import all the messages, then close it. This indeed - is preferred over opening and closing the message base for each message. - - When importing multiple messages for possibly non-consecutive message bases, - developers may eaily make the mistake of opening and closing the message base - for each message. This is not necessary and can considerably hinder the - import performance. The easiest solution is to only close the message base and - open a new one if the next message to be imported is not for the same message - base as the previously imported message. Example: - - smb_file[0]=0; - for(i=0;i<total_messages_to_be_imported;i++) { - if(stricmp(get_messagebase_for_this_message(i),smb_file)) { - if(smb_file[0]) /* We've already opened one */ - smb_close(); - strcpy(smb_file,get_messagebase_for_this_message(i)); - smb_open(10); } - /* Import this message */ - } - if(smb_file[0]) - smb_close(); - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 91 SMBLIB Performance Issues - - - A more advanced method is to keep multiple message bases open at the same time. - Due to the likely limitation of total file handles on the system, it is - suggested to keep the number of simultaneously open message bases at or below - 3. SMBLIB includes the function smb_stack() to easily "push" and "pop" message - bases without closing them (push is the equivalent to "save" and pop is the - equivalent to "restore"). The downside of this function is that you cannot - access message bases on the stack without actually popping them off (in reverse - of the order they were pushed). You can however "exchange" the current message - base with the message base on the top of the stack (most recently pushed). - To intelligently juggle more than two open message bases, the developer should - create their own equivalent of the smb_stack() function so they can access the - message bases on the stack without popping them off. An example of keeping a - maximum of two message bases open using smb_stack(): - - char last_messagebase[128],new_messagebase[128]; - - smb_file[0]=0; - last_messagebase[0]=0; - for(i=0;i<total_messages_to_be_imported;i++) { - strcpy(new_messagebase,get_messagebase_for_this_message(i)); - if(stricmp(new_messagebase,smb_file)) { /* Not current message base */ - if(smb_file[0]) { /* We've already opened one */ - if(!stricmp(new_messagebase,last_messagebase)) { /* Same as last */ - strcpy(last_messagebase,smb_file); - smb_stack(SMB_STACK_XCHNG); } /* Retore previous base */ - else { - if(last_messagebase[0]) { - smb_stack(SMB_STACK_XCHNG); - smb_close(); - strcpy(last_messagebase,new_messagebase); } - else { - strcpy(last_messagebase,smb_file); - smb_stack(SMB_STACK_PUSH); } /* Save current base */ - strcpy(smb_file,new_messagebase); - smb_open(10); } } - else { - strcpy(smb_file,new_messagebase); - smb_open(10); } } - /* Import this message */ - } - if(smb_file[0]) - smb_close(); - if(last_messagebase[0]) { - smb_stack(SMB_STACK_POP); - smb_close(); } - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 92 SMBLIB Performance Issues - - - The second example would be of negligible performance gain over the first - example (6 open operations versus 7) if the messages to import were in the - following order: - - msg[0] --> msgbase[0] // 0 opened - msg[1] --> msgbase[1] // 0 pushed 1 opened - msg[2] --> msgbase[1] - msg[3] --> msgbase[2] // 1 closed 0 popped 0 closed 2 opened - msg[4] --> msgbase[0] // 2 pushed 0 opened - msg[5] --> msgbase[2] // 0 pushed 2 popped (exchanged) - msg[6] --> msgbase[3] // 2 closed 0 popped 0 closed 3 opened - msg[7] --> msgbase[0] // 3 pushed 0 opened - - The second example would be of significant performance gain over the first - example (4 open operations versus 8) if the messages to import were in the - following order: - - msg[0] --> msgbase[0] // 0 opened - msg[1] --> msgbase[1] // 0 pushed 1 opened - msg[2] --> msgbase[0] // 1 pushed 0 popped (exchanged) - msg[3] --> msgbase[1] // 0 pushed 1 popped (exchanged) - msg[4] --> msgbase[0] // 1 pushed 0 popped (exchanged) - msg[5] --> msgbase[2] // 0 pushed 1 popped (exchanged) 1 closed 2 opened - msg[6] --> msgbase[3] // 2 pushed 0 popped (exchanged) 0 closed 3 opened - msg[7] --> msgbase[2] // 3 pushed 2 popped (exchanged) - - More advanced use of "stack-like" message base file handle storage can easily - reduce the number of open operations, therefore increasing import performance - under more adverse message base ordering conditions. - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 93 SMBLIB Performance Issues - - - Compression - ----------- - If any message data compression features are offered by the application, it - is important the the application not unnecessarily compress data that will - not save any storage space. While this may seem an obvious statement, please - review the following pseudo-code example: - - if ( message_data_length < SDT_BLOCK_LEN ) - // Store uncompressed data - else { - // Compress data - if ( ( compressed_data_length / SDT_BLOCK_LEN ) - < ( message_data_length / SDT_BLOCK_LEN ) ) // Saves a block or more - // Store compressed data - else - // Store uncompressed data - } - - Since the SMB format stores message data in fixed length blocks, there is no - point in storing a message in compressed format if it requires the same number - of blocks as the uncompressed format (i.e. a message that is two blocks in - length in uncompressed format and only a block and a half in length when - compressed should not be stored in compressed format since it still requires - two full blocks of storage). It is important to note that in the above example, - the length of the data translation string was not taken into account in - determining the number of required blocks. Also, the smb_datblocks() function - is normally used in determing the number of required blocks to store a given - data length and it is a little more involved than simply dividing the length of - the data by SDT_BLOCK_LEN. - - - - - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 94 SMBLIB Performance Issues - - - Bibliography - ============ - - Title : The C Programming Language - Publisher : Prentice Hall - Author : Brian W. Kernighan and Dennis M. Ritchie - - Document : ARPANET Request for Comments (RFC) #822 - Title : Standard for the Format of ARPA Internet text messages - Publisher : SRI International - Author : David H. Crocker, University of Delaware - - Document : FTS-0001 - Publisher : FSC - Author : Randy Bush, Pacific Systems Group - - Document : FTS-0004 - Title : EchoMail Specification - Publisher : FSC - Author : Bob Hartman - - Document : FTS-0009 - Title : A standard for unique message identifiers and reply chain linkage - Publisher : FSC - Author : Jim Nutt - - Document : FSC-00046 - Title : A Product Idenfifier for FidoNet Message Handlers - Publisher : FSC - Author : Joaquim H. Homrighausen - - Document : FSC-00053 - Title : Specifications for the ^aFLAGS field - Publisher : FSC - Author : Joaquim H. Homrighausen - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 95 Bibliography - - - Implementations - =============== - - Product : Synchronet Multinode BBS Software - Developer : Digital Dynamics - Level : III - Version : 2.20 - - Product : Synchronet/FidoNet Import/Export Utility (SBBSFIDO) - Developer : Digital Dynamics - Level : III - Version : 2.23 - - Product : Synchronet UTI (Universal Text Interface) Driver - Developer : Digital Dynamics - Level : III - Version : 2.23 - - Product : SBBSecho FidoNet Packet Tosser for Synchronet - Developer : Digital Dynamics - Level : III - Version : 1.11 - - Product : NetXpress Internet UUCP for Synchronet - Developer : Merlin Systems - Level : II - Version : 1.50 - - Product : InterEcho FidoNet Packet Tosser - Developer : InterMail Sales Inc - Level : II - Version : 1.11 - - - - - - - - - - - - - - - - - - - - - - - _______________________________________________________________________________ - Synchronet 96 Index - - diff --git a/src/sbbs2/smb/121a/smb.txt b/src/sbbs2/smb/121a/smb.txt deleted file mode 100644 index 96c50c01ac..0000000000 --- a/src/sbbs2/smb/121a/smb.txt +++ /dev/null @@ -1,5661 +0,0 @@ - - - - - - - - - - - - - - - - - - - - Synchronet Message Base Specification - Version 1.21 - Updated 08/31/95 - - Copyright 1995 Digital Dynamics - - PO Box 501 - Yorba Linda, CA 92686 - - Voice: 714-529-6328 BBS: 714-529-9525 V.32/V.32bis - FAX: 714-529-9721 714-529-9547 V.FC - Fido: 1:103/705 ftp: netcom.com /pub/sb/sbbs - - - - - - - - - - - - - - - - - - - - - - - - - - -Table of Contents -================= - -Introduction.............................................................3 -Implementation Levels....................................................8 -Definitions.............................................................10 - Acronyms........................................................12 - Data Types......................................................13 -File Formats............................................................18 - Index.....................(*.SID)...............................18 - Header....................(*.SHD)...............................20 - Header Allocation.........(*.SHA)...............................30 - Data......................(*.SDT)...............................31 - Data Allocation...........(*.SDA)...............................32 - CRC History...............(*.SCH)...............................33 -Header Field Types......................................................34 -Data Field Types........................................................58 -Messsage Attributes.....................................................60 -Translation Types.......................................................61 -Agent Types.............................................................62 -Network Types...........................................................63 -Media Types.............................................................64 -Message Storage Pseudo Code.............................................67 -Message Retrieval Pseudo Code...........................................69 -SMBUTIL.................................................................70 -CHKSMB..................................................................71 -FIXSMB..................................................................72 -SMBLIB (C library)......................................................73 - Data Types and Constants..(SMBDEFS.H)...........................74 - Global Variables..........(SMBVARS.C)...........................75 - Function Prototypes.......(SMBLIB.H)............................76 - Library Functions.........(SMBLIB.C)............................77 - Miscellaneous.............(CRC*.* and LZH.*)....................84 -SMBLIB Storage Example..................................................86 -SMBLIB Retrieval Example................................................89 -SMBLIB Performance Issues...............................................91 -Bibliography............................................................95 -Implementations.........................................................96 - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 2 Contents - - -Introduction -============ - -Q. What is SMB? - -A. SMB (Synchronet Message Base) is a technical specification for the storage - format of electronic mail messages. These e-mail messages may all be - contained in one database, or, more commonly, separated into catagorized - databases. These message databases (or message bases) are also referred to - as "sub-boards", "forums", "conferences", and "SIGs". The messages may be - directed to an individual person, sent to a group of individuals, or sent - to everyone who can read messages in that message base. Messages may be - created and read soley at one physical location, or imported from and - exported to a message network that may span continents. Message bases that - are connected to a message network are often called "echoes". - - -Q. Why SMB? - -A. The Synchronet Message Base is designed to store high volumes of messages - while maintaining optimum search, retrieval, and creation performance. - These messages are not limited to mere text. In addition to text, SMB - defines the storage of digitized sound, MIDI, graphics, fonts, animation, - as well as other multimedia data and triggers for localized multimedia. - SMB thrives on a multi-user environment where messages are being created, - read, modified, and deleted by multiple tasks simultaneously. With the - large message networks of today being the rule, rather than the exception, - and high volumes of messages being imported on a daily, sometimes hourly - basis, creation and deletion speed is of the utmost importance. This is - where SMB really shines. Being extensible enough to handle message formats - from networks of today and tomorrow, and fast enough to import more messages - that humanly readable, the SMB format will more than meet your message - storage needs. - - -Q. Why a specification? - -A. Message bases are often accessed and modified by a number of different - programs. Often these programs are developed by individuals or companies - other than the original designer of the message base format. This - specification is an attempt to aid developers in creating programs that - access or modify a message base stored in the SMB format. - - -Q. Who can use this specification? - -A. Anyone that has interest in the Synchronet Message Base format at either - an educational or professional level. Specifically, software developers - interested or currently involved in the development of message readers, - editors, echomail (toss/scan) programs, message transfer agents (MTAs), - network gateways, and bulletin board systems. Much of the information in - this specification is intended for those with preexisting programming - knowledge, so those with little or no programming experience may find it - hard to comprehend. - -_______________________________________________________________________________ -Synchronet 3 Introduction - - - - -Q. What does the SMB specification include? - -A. The text you are reading is part of the SMB specification: a single text - document that defines the storage format of each of the six files of an - SMB format message base and how they are related to each other. - - Included with this specification is C source code to be used as an example - to programmers of how to access an SMB format message base and public domain - library functions (SMBLIB) that can be compiled and linked into programs - that access an SMB format message base developed by third parties. An SMB - utility program (SMBUTIL) is also included with C source code as an example - of how to use the SMBLIB functions. - - -Q. Where did the SMB specification come from? - -A. Digital Dynamics (southern California based software development company) - released "Synchronet Multinode BBS Software Version 1a" in June of 1992 as - one of the first BBS packages to be designed from the ground-up to operate - in a multinode environment with incredible speed and reliability, with a - large suite of multinode specific features and design innovations. - - The original message base format was designed with localized messaging and - low volume message networks in mind. By January of 1993, it was clear that - high volume message networks (FidoNet, RelayNet, Usenet, etc.) were the - preference of most BBS users and a new message base format was required to - allow for high volume message storage, improved storage, retrieval, and - maintenance performance, as well as lower storage space requirements. - - Rather than introduce another new message format, Digital Dynamics sought - to implement an existing public specification for a format that would meet - current and future message storage needs. More than a few specifications - were seriously considered at one time or another, but after careful - examination, design flaws and lack of extensibility eliminated them from the - long term plans of Digital Dynamics and Synchronet BBS Software. Thus began - the design of the "Synchronet Message Base" (SMB) format. - - At the request of many message related program developers, Digital Dynamics - created and released the SMB specification before the release of "Synchronet - Version 2.00" to allow lead-time on developing support programs for the new - format. - - Digital Dynamics strongly encourages developers of message related programs - (including software that directly competes with Synchronet or other Digital - Dynamics products) to implement support for SMB. Though this is a public - specification and Digital Dynamics encourages developer suggestions, it will - remain under the sole control of Digital Dynamics unless specifically stated - otherwise in a future revision of this specification. - - Digital Dynamics requests that any organizations that wish to adopt or - ratify this specification, in part or whole, notify Digital Dynamics through - any of the contact methods listed at the beginning of this document. - -_______________________________________________________________________________ -Synchronet 4 Introduction - - - - -Q. How does SMB store messages? - -A. Each message base is stored in a set of binary files. This set consists - of between three and six files depending the storage method used. The base - filename (maximum of eight characters under DOS) is the same for all six - files of the same message base and unique amoung the filenames of other - message bases in the same directory. The six files each have a different - three character extension. The first character of the extension is always - the letter 'S' (for SMB), while the second and third characters define the - contents of the file. - - Two of the six files associated with each message base are not recreatable - and therefore are the most important when considering data integrity. These - two files are the data file (with a .SDT extension) and header file (.SHD - extension). Both of these files use 256 byte blocks and have associated - block allocation tables (stored in .SDA and .SHA respectively) so that - deleted message blocks may be used by new messages without creating odd - sized unused 'holes' in the files. The block allocation table files (.SDA - and .SHA) can be recreated with the information stored in the header (.SHD) - file. When using Hyper Allocation storage method, the allocation files (.SDA - and .SHA) are not used. - - For fast indexing, there is a small fixed length index file (with a .SID - extension). This file allows for the immediate location of message header - records based on sender's name or user number, recipient's name or user - number, subject, message number, or message attributes. This file can be - recreated with the data stored in the header (.SHD) file. - - The last file is an optional CRC history (.SCH) file. It contains 32-bit - CRCs of a configurable number of messages imported or created locally. This - is to help eliminate duplicate messages created by user or program error. - The CRC history file can be recreated with the combination of information - stored in the data (.SDT) and header (.SHD) files. - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 5 Introduction - - -Q. How fast do messages import into an SMB message base? - -A. This is a very important question for systems for that import large volumes - of messages. Of course, the answer depends on the storage format which you - are importing from, the average length of messages, the design of the - program which is peforming the import process, as well as the hardware and - system software being used. What's important is that SMB will allow the - fastest import process possible with any given combination of the above - factors. - - Since system storage capacity is rarely infinite, neither is the number - of messages which can be stored in a message base. System operators must - define the maximum number of messages to be stored in a message base, the - maximum age of the messages in that message base, or a combination of both. - When using the Self-packing storage method (defined later in this document), - the smaller the number of messages stored in a message base, the faster the - import process. The SMB format is flexible enough to support multiple levels - of import performance based on optimizations for storage space or speed. - Most system operators will almost invariably choose speed over space, but - which choices are available is determined by the importing program. This - specification defines three storage methods, from slowest to fastest: - Self-packing, Fast Allocation, and Hyper Allocation. Other options defined - in this specification may affect storage performance, including duplicate - message checking and message compression/encryption. - - -Q. How much storage is required for an SMB message base? - -A. The biggest factor in determining storage requirements for a message base - is the maximum number of messages to be stored in the base (defined by the - system operator) and the average size of each message. The minimum required - storage for a message base is 32 bytes plus 532 bytes per message (plus four - bytes per message if duplicate message checking is used and three bytes - per message if Self-packing or Fast Allocation storage methods are used). - - The SMB format was originally designed to be "self-packing", meaning purged - (deleted) message header and data blocks will be used automatically by new - messages. Relying solely on self-packing, an SMB format message base will - never "shrink" in size. This is not to say that it will continually "grow" - in size, but that without specific packing procedures, deleted message - blocks may remain unused for extended periods of time, meanwhile using some - amount of storage space that could be recovered using specific packing - procedures. The Fast Allocation and Hyper Allocation storage methods do not - use deleted message blocks for new messages so specific packing procedures - must be used if any messages are deleted and that storage space is to ever - be recovered. - - Limiting the maximum age of messages in an SMB message base is another way - to control the storage requirements. While maximum message age definition is - optional, the definition of the maximum number of messages is not. - - - - - -_______________________________________________________________________________ -Synchronet 6 Introduction - - -Q. How many messages can be stored per SMB message base? - -A. Without considering storage limitations or message data lengths greater than - 256, the theoretical maximum number of messages that can be stored in a - single SMB message base is 16.7 million. Considering the variable length - nature of message and header data, it is suggested that the system operator - allow no more than 1 million messages per base. - - To determine an estimated maximum number of messages for a message base - using the average message data length as a factor, use the following - formula: - - 4.2 billion divided by the average message length rounded up to be evenly - divisible by 256. - - If the average message data length is 1500 bytes, the estimated maximum - number of messages would be 2,734,375 (4.2 billion divided by 1536). - - Implementations of this format may be further limited by available system - memory. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 7 Introduction - - -Implementation Levels -===================== -The SMB format can be implemented to varying degrees between programs without -creating compatibilty issues. Rather than have developers specifically state -which features they have and have not implemented, we have defined seven levels -of implementation (represented by Roman numerals I through VII). For a program -or software package to meet an implementation level, it must have all of the -features listed for that level and all of those for each level below it. The -minimum suggested imlementation is level I. The SMBUTIL program included with -this specification is an example of a level I implementation with features -from some of the higher implementation levels. - -Level I -------- -The minimum suggested level of implementation. Messages contain merely ASCII -text displayable on an ANSI terminal. Messages can be added to the message -base and if the maximum number of messages is exceeded, messages are removed -or marked for deletion. - -Level II --------- -The addition of file attachments, multiple index/header entries per message -(multiple destinations), multiple text bodies for the separation of message -text and tag/origin lines (for example), forwarding, threading, and specific -FidoNet kludge header field support makes this level of implementation more -realistic for bulletin board system and EchoMail software implementation. - -Synchronet Multinode BBS Software v2.00 has a level II implementation of this -specification. - -Level III ---------- -This implementation adds support for translation strings defined later in this -document for data compression, encryption, escaping, and encoding. This level -is still limited to basic ASCII text and ANSI escape sequence entry and -retrieval. - -Synchronet Multinode BBS Software v2.10 has a level III implementation of this -specification. - -Level IV --------- -The storage and retrieval of embedded and attached images is added in this -level of implementation. Supported images are limited to single binary or text -data blocks that can be displayed or transferred to the user (automatically, -or by request) if their display and translation protocols define specific -support for the image type. - - - - - - - - -_______________________________________________________________________________ -Synchronet 8 Implementation Levels - - -Level V -------- -This level of implementation adds support for embedded and attached sound data. -This includes digitized sound and MIDI data. Supported sounds are limited to -single binary or text data blocks that can be played or transferred to the user -(automatically or by request) if their presentation and translation protocols -define specific support for the sound type. - -Level VI --------- -Localized sound and image data can be triggered by messages stored and -retrieved in an implementation of this level. - -Level VII ---------- -Complete multimedia support is reached in this implementation level with -support for embedded and attached animation, sound, and video data. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 9 Implementation Levels - - -Definitions -=========== - -Control Characters ------------------- -When specifying control characters (ASCII 1 through 31), the caret symbol "^" -or the abreviation "ctrl-" followed by a character will be used to indicate the -value. ^A is equivalent to ASCII 1, ^B ASCII 2, etc. The case of the control -character is not significant (i.e. ^z and ^Z are equivalent). The control -character ^@ (ASCII 0) will be specified as NULL or 0. - - -Hexadecimal ------------ -Base sixteen numbering system which includes the digits 0-9 and A-F. -Hexadecimal numbers are represented in this document with a prefix of "0x" or -"\x" or a suffix of "h". Hexadecimal letter digits are not case sensitive -(i.e. the number 0xff is the same as 0xFF). - - -File dump ---------- -When example file dumps are displayed, the format is similar to that of the -output from the DOS DEBUG program. With the exception of the ASCII characters, -all numbers are in hexadecimal. - -Offset Byte values ASCII characters - -000000 53 4D 42 1A 10 01 20 00 F4 01 00 00 F4 01 00 00 SMB... .�...�... -000010 20 00 00 00 D0 07 00 00 D0 07 00 00 00 00 00 00 ...�...�....... - - -Bit values ----------- -Bit (or flag) values are represented in C notation as (1<<x) where x is the bit -number. (i.e. bit number 7 (1<<7) is the same as 0x80). - - -Word storage ------------- -All words (16-bit) and double words (32-bit) are stored in Intel 80x86 (little -endian) format with bytes stored from low to high (reverse of the Motorola -680x0 word storage format). - -A 16-bit word with the value 1234h is stored as 34h 12h. - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 10 Definitions - - -Translation strings -------------------- -Translation strings (xlat variables) are arrays of words (16-bit) in the order -of the original storage translation. The last translation type is followed by a -16-bit zero (defined later as XLAT_NONE). If there are no translations, then -the first and only element of the array is XLAT_NONE. - -If multiple translations are used, the translation order must be reversed -upon retrieval to obtain the proper data. - - -Local e-mail ------------- -When referring to the local e-mail message base of a Synchronet BBS, we are -referring specifically the message base with the name "MAIL" stored in the -"DATA" directory (e.g. \SBBS\DATA\MAIL). - -Messages stored in this message base are different in the following respects: - - The SMB_EMAIL status header attribute is set ON - Hyper Allocation storage method is not supported - The "To" and and "From" fields of the message indexes do NOT contain CRCs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 11 Definitions - - -Acronyms: -======== - -ANSI American National Standards Institute -ASCII American Standard Code for Information Interchange -BBS Bulletin Board System -C The C programming language as defined by ANSI X3.159-1989 -CR Carriage Return character (ASCII 13) -CRC Cyclic Redundancy Check -CRC-16 Standard 16-bit CRC using 1021h polynomial (seed 0) -CRC-32 Standard 32-bit CRC using EDB88320h polynomial (seed -1) -CRLF Carriage Return character followed by a Line Feed character -FSC FidoNet Standards Commitee (FTS proposal) -FTN FidoNet Technology Network -FTS FidoNet Technical Standard -LF Line Feed character (ASCII 10) -QWK Compressed message packet format for message reading/networking -RFC Request for Comments -SMB Synchronet Message Base -UT Universal Time (formerly called "Greenwhich Mean Time") - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 12 Definition of Acronyms - - -Data types -========== - -uchar Unsigned 8-bit value (0 through 255). - C example: - - #define uchar unsigned char - - -short Signed 16-bit value (-32768 through 32767). - "short" is a C keyword indicating "short int". - - -ushort Unsigned 16-bit value (0 through 65535). - C example: - - #define ushort unsigned short - - -ulong Unsigned 32-bit value (0 through 4294967295). - C example: - - #define ulong unsigned long - - -time_t Unsigned 32-bit value. - Seconds since 00:00 Jan 01 1970 (Unix format). - Used for all time/date storage in SMB as part of the when_t - data type. This time format will support dates through the year - 2105. - time_t is defined by ANSI C as a long (signed) which can - limit its date support to the year 2038 depending on the - library routines used. - - -ASCII String (aka character array) of 8-bit ASCII characters. - Characters with the bit 7 set (80h through FFh) represent - the IBM PC extended ASCII character set. When data or header - fields of this type are stored in the header, a NULL - terminator may or may not be present. - C example: - - uchar str[80]; - - -ASCIIZ ASCII string with (non-optional) NULL terminator. - C example: - - uchar str[81]; - - - - - - -_______________________________________________________________________________ -Synchronet 13 Definition of Data Types - - -nulstr ASCII string immediately terminated by NULL. - C example: - - uchar *nulstr=""; - - -undef Data buffer with undefined contents. - C example: - - uchar buf[BUF_LEN]; - -when_t Date/Time stamp including time-zone adjustment information. - C example: - - typedef struct { - - time_t time; // Time stamp (in local time) - short zone; // Zone constant or Minutes (+/-) from UT - - } when_t; - - time: - - A time value of 0 is invalid and indicates an uninitialized - time stamp. - - Time stamps are always stored in universal time. i.e. - Regardless of what the local time zone is, Jan 1st 1994 00:00 - will always be stored as 2D24BD00h. - - zone: - - If the zone is in the range -720 to +720, it represents the - number of minutes east or west of UT. Values in this range - should only be used for time zones not otherwise represented - here. - - If the zone is greater than 720 or less than -720, then the - following bits have special meaning: - - (1<<12) // Non-US time zone (east of UT) - (1<<13) // Non-US time zone (west of UT) - (1<<14) // U.S. time zone - (1<<15) // Daylight savings - - The lower 12 bits (0 through 11) contain the number of minutes - east or west of UT (not accounting for daylight savings). - - - - - - - - -_______________________________________________________________________________ -Synchronet 14 Definition of Data Types - - - If the time zone is one specified in the U.S. Uniform Time Act, - the following values represent the zone: - - AST 0x40F0 // Atlantic (-04:00) - EST 0x412C // Eastern (-05:00) - CST 0x4168 // Central (-06:00) - MST 0x41A4 // Mountain (-07:00) - PST 0x41E0 // Pacific (-08:00) - YST 0x421C // Yukon (-09:00) - HST 0x4258 // Hawaii/Alaska (-10:00) - BST 0x4294 // Bering (-11:00) - - With bit 15 set, the following values represent the same zone - with the presence of daylight savings: - - ADT 0xC0F0 // Atlantic (-03:00) - EDT 0xC12C // Eastern (-04:00) - CDT 0xC168 // Central (-05:00) - MDT 0xC1A4 // Mountain (-06:00) - PDT 0xC1E0 // Pacific (-07:00) - YDT 0xC21C // Yukon (-08:00) - HDT 0xC258 // Hawaii/Alaska (-09:00) - BDT 0xC294 // Bering (-10:00) - - The following non-standard time zone specifications may also be - used: - - MID 0x2294 // Midway (-11:00) - VAN 0x21E0 // Vancouver (-08:00) - EDM 0x21A4 // Edmonton (-07:00) - WIN 0x2168 // Winnipeg (-06:00) - BOG 0x212C // Bogota (-05:00) - CAR 0x20F0 // Caracas (-04:00) - RIO 0x20B4 // Rio de Janeiro (-03:00) - FER 0x2078 // Fernando de Noronha (-02:00) - AZO 0x203C // Azores (-01:00) - LON 0x1000 // London (+00:00) - BER 0x103C // Berlin (+01:00) - ATH 0x1078 // Athens (+02:00) - MOS 0x10B4 // Moscow (+03:00) - DUB 0x10F0 // Dubai (+04:00) - KAB 0x110E // Kabul (+04:30) - KAR 0x112C // Karachi (+05:00) - BOM 0x114A // Bombay (+05:30) - KAT 0x1159 // Kathmandu (+05:45) - DHA 0x1168 // Dhaka (+06:00) - BAN 0x11A4 // Bangkok (+07:00) - HON 0x11E0 // Hong Kong (+08:00) - TOK 0x121C // Tokyo (+09:00) - SYD 0x1258 // Sydney (+10:00) - NOU 0x1294 // Noumea (+11:00) - WEL 0x12D0 // Wellington (+12:00) - - - -_______________________________________________________________________________ -Synchronet 15 Definition of Data Types - - -fidoaddr_t FidoNet address stored as four ushorts that represent the zone, - network, node, and point (in that order). - C example: - - typedef struct { - - ushort zone, - net, - node, - point; - - } fidoaddr_t; - - -typestr_t ASCIIZ string with ushort type prefix. - C example: - - typedef struct { - - ushort type; // Specifier for type of 'str' - uchar str[]; // ASCIIZ filename or other string data - - } typestr_t; - - -mattach_t File attachment information with type prefix, translation - string, and filename. - C example: - - typedef struct { - - ushort type; // Attachment type - ushort xlat[]; // Translations of data in attachment - uchar str[]; // ASCIIZ filename - - } mattach_t; - -vattach_t Video file attachment information with type, compression, - translation string, and filename. - C example: - - typedef struct { - - ushort type; // Attachment type - ushort comp; // Compression method - ushort xlat[]; // Translations of data in attachment - uchar str[]; // ASCIIZ filename - - } vattach_t; - - - - - - -_______________________________________________________________________________ -Synchronet 16 Definition of Data Types - - -mtext_t Message text with translation string prefix. - C example: - - typedef struct { - - ushort xlat[]; // Translations of text - uchar text[]; // Actual text data - - } mtext_t; - - -ftext_t Formatted message text with translation string prefix and - format type. - C example: - - typedef struct { - - ushort type; // See Image Types for valid types - ushort xlat[]; // Translations of data - uchar data[]; // Actual formatted text data - - } ftext_t; - - -membed_t Embedded data with type prefix, translation string, and ASCIIZ - description. - C example: - - typedef struct { - - ushort type; // Specifier for type of 'dat' - ushort xlat[]; // Translations of embedded data - uchar name[]; // ASCIIZ char description of embedded data - uchar dat[]; // Binary data - - } membed_t; - -vembed_t Embedded video data with type, compression method, translation - string, and ASCIIZ description. - C example: - - typedef struct { - - ushort type; // Specifier for type of 'dat' - ushort comp; // Compression method - ushort xlat[]; // Translations of embedded data - uchar name[]; // ASCIIZ char description of embedded data - uchar dat[]; // Binary data - - } vembed_t; - - - - - -_______________________________________________________________________________ -Synchronet 17 Definition of Data Types - - -File formats -============ - -Index File (*.SID) ------------------- -The index file for each message base contains one record per message in the -base. Each record is fixed length using the following format: - -Index Record: ------------- -C example: - -typedef struct { - - ushort to; // 16-bit CRC of recipient name (lower case) or user number - ushort from; // 16-bit CRC of sender name (lower case) or user number - ushort subj; // 16-bit CRC of title/subject (lower case) - ushort attr; // attributes (MSG_PRIVATE, MSG_READ, etc. flags) - ulong offset; // byte offset of message header in header file - ulong number; // message serial number (1 based) - time_t time; // import date/time stamp (Unix format) - - } idxrec_t; - - -Example file dump (16 messages starting with message number 15): ---------------------------------------------------------------- -000000 36 4F 13 07 2A 77 00 00 20 00 00 00 0F 00 00 00 6O..*w.. ....... -000010 BE 62 76 2C 36 4F 46 0A 7F B2 00 00 20 01 00 00 �bv,6OF.�.. ... -000020 10 00 00 00 C7 29 78 2C 36 4F 70 6F 46 FF 00 00 ....�)x,6OpoF�.. -000030 20 02 00 00 11 00 00 00 AD D3 7A 2C 70 6F 13 07 .......��z,po.. -000040 46 FF 00 00 20 03 00 00 12 00 00 00 D6 F8 7F 2C F�.. .......��, -000050 36 4F E1 EA E7 E9 00 00 20 04 00 00 13 00 00 00 6O����.. ....... -000060 1E 7B 85 2C 37 0D 2E DF 4D 79 00 00 20 05 00 00 .{�,7..�My.. ... -000070 14 00 00 00 5C E1 A1 2C 90 54 2D 5A 86 62 00 00 ....\�,�T-Z�b.. -000080 20 06 00 00 15 00 00 00 39 2E A2 2C 70 6F 1A 8B .......9.�,po.� -000090 46 FF 00 00 20 07 00 00 16 00 00 00 D0 7B A8 2C F�.. .......�{�, -0000A0 2E DF 1A 8B 4D 79 00 00 20 08 00 00 17 00 00 00 .�.�My.. ....... -0000B0 FF 7B A8 2C B4 D9 35 7C 23 B1 00 00 20 09 00 00 �{�,��5|#�.. ... -0000C0 18 00 00 00 CE D4 BA 2C 36 4F BC D8 B2 E7 00 00 ....�Ժ,6O�ز�.. -0000D0 20 0A 00 00 19 00 00 00 14 5F C3 2C BA A8 4E B0 ........_�,��N� -0000E0 67 76 00 00 20 0B 00 00 1A 00 00 00 6F 89 C3 2C gv.. .......o��, -0000F0 36 4F 0C 01 19 9C 00 00 20 0C 00 00 1B 00 00 00 6O...�.. ....... -000100 F8 30 C6 2C 36 4F FA 48 0E 55 00 00 20 0D 00 00 �0�,6O�H.U.. ... -000110 1C 00 00 00 6A 94 D3 2C 36 4F F1 CE CF A2 00 00 ....j��,6O��Ϣ.. -000120 20 0E 00 00 1D 00 00 00 53 DB D5 2C 8D A6 21 CE .......S��,��!� -000130 F7 AB 00 00 20 0F 00 00 1E 00 00 00 31 29 DC 2C ��.. .......1)�, - - - - - - - - -_______________________________________________________________________________ -Synchronet 18 Index (*.SID) File Format - - -Field descriptions: ------------------- -To: -The 'To' field is the CRC-16 of the name of the intended recipient agent of -this message or the intended recipient's user number. If the CRC is stored, the -text must be converted to lower case (A-Z changed to a-z) before the CRC is -calculated. If the message is forwarded to another agent, the original or new -index record must be changed to contain the CRC-16 of the new recipient name or -user number. This field must always contain the recipient user number for local -e-mail on a Synchronet BBS. Outbound netmail stored in the Synchronet local -e-mail message base will contain 0 in this field. - -From: -This field, similar to the 'To' field, contains the CRC-16 of the name of the -sending agent of this message or the sender's user number. If the CRC is -stored, the text must be converted to lower case (A-Z changed to a-z) before -the CRC is calculated. If the message is forwarded to another agent, the -original or new index record must be changed to contain the CRC-16 of the new -sender name or user number. If the message was imported into the local e-mail -message base on a Synchronet BBS via netmail, this field will contain 0. - -Subj: -The 'Subj' field contains the CRC-16 of the message's subject. The subject -must be converted to lower case (A-Z changed to a-z) and all preceeding -"re: "'s and "re:"'s removed before calculating the CRC-16. - -Attr: -This ushort is a bit field of the specific attributes for this message. -It is a clone of the 'attr' element of the msghdr_t structure. - -Offset: -This ulong is the offset (in bytes) in the header file for this message's -header record. - -Number: -This ulong is the serial number of this message. Valid values are 1 through -0xffffffff. No two index records in the same message base may have the same -message number. All index records must have sequential, but not necessarily -consequetive, message numbers. - -Time: -This field is the date/time stamp the message was imported to or posted in -the message base. It is a clone of the 'when_imported.time' element of the -msghdr_t structure. - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 19 Index (*.SID) File Format - - -Header File (*.SHD) -=================== - -Each SMB header file is made up of two distinct sections: base header records -and message header records (usually the bulk of the file). - -Base Header Records: -------------------- -Base header records are blocks of data that apply to the entire message base -and are of variable length. This specification defines only one base header -record, the "Status info" (smbstatus_t) record. This status info record must be -the first base header record in the file and must be modified if additional -base header records are added. - -Additional header records allow other developers to store configuration and -status information particular to their application needs. It also allows for -future header record definitions as part of this specification without causing -backward compatibility issues. - -Each base header record contains a fixed length portion (smbhdr_t) and an -optional variable length portion. - -Whenever a base header record is read or updated (written), it must first -be successfully locked and subsequently unlocked. - -The first base header record (Status Info) is used as a semaphore when writing -to the message index (.SID) file and, when using the Hyper Allocation storage -method, writing to the message data (.SDT) file. This record must be -succesfully locked before writing and subsequently unlocked. This is to insure -that multiple applications simultaneously writing to the same message base -does result in corrrupted data. - - -Message Header Records: ----------------------- -Following the last base header record is the first message header record. Each -header record is stored in one or more 256 byte blocks. There must be exactly -one active message header record for every index record in the index file. -(Note: This does not include deleted message headers that have not been -overwritten by a new message header). - -Each message header record contains a fixed length portion (msghdr_t), a list -of zero or more fixed length data fields (dfield_t), and a list of three or -more variable length header fields (hfield_t). - -The value of the data stored in the zero or more unused bytes of the last -header record block have an undefined value, though whenever possible -developers should initialize to binary zero for human readability. - -Whenever a message header record is read or updated (written), it must first -be successfully locked and subsequently unlocked. - - - - -_______________________________________________________________________________ -Synchronet 20 Header File (*.SHD) Format - - -Base Header Record (Fixed Portion): ----------------------------------- -C example: - -typedef struct { - - uchar id[4]; // text or binary unique hdr ID - ushort version; // version number (initially 100h for 1.00) - ushort length; // length including this struct - - } smbhdr_t; - - -Base Header Record Field Descriptions: -------------------------------------- -Id: -This is a four byte unique ID identifying the type of the base header record. -The bytes may contain any value, but printable ASCII characters are preferred. -The only ID defined in this specification is "SMB^Z" used by the Status Info -base header record. - -Version: -This is a version number of the base header record type. Base header records -of different versions may have different formats or contain different -information. This is to aid the application in determining if the record -is pertinent and if so, to what degree. The Status Info base header record -uses this version field to define the version of the format for the entire -message base (currently 0x121 for version 1.21). - -Length: -This is entire length in bytes of this header record (including both fixed -and variable portions). - - -Base Header #1 (Status info) Record (Variable Portion): ------------------------------------------------------- -C example: - -typedef struct { - - ulong last_msg; // last message number posted or imported - ulong total_msgs; // total messages currently in message base - ulong header_offset; // byte offset to first header record - ulong max_crcs; // Maximum number of CRCs to keep in history - ulong max_msgs; // Maximum number of messages to keep in base - ushort max_age; // Maximum age of messages (days) to keep in base - ushort attr; // Attribute bits - - } smbstatus_t; - - - - - - -_______________________________________________________________________________ -Synchronet 21 Header File (*.SHD) Format - - -Base Header #1 (Status Info) Record (Variable Portion) Field Descriptions: -------------------------------------------------------------------------- -Last_msg: -This is the serial number of the last message imported or posted into this -message base. The index, header, and data records for this message may possibly -not exist (due to deletion). This field is used for determining the message -number to give to a new message being imported or posted into this message -base. This field must be updated for every message added to the message base. - -Total_msgs: -This is the total number of active messages currently in the message base. -This number should match the number of records in the index (.SID) file -and active header records in the header (.SHD) file. This field must be -updated whenever a message is added to or removed from the message base. - -Header_offset: -This is the byte offset to the first message header record. It is useful -for skipping all the base header records and going directly to the first -message header record. - -Max_crcs: -This is the maximum number of message CRCs to store in the CRC history (.SCH) -file for duplicate message checking. If this field contains 0, then duplicate -message checking is disabled. - -Max_msgs: -This is the preferred maximum number of messages to keep in this message -base as specified by the system operator. It is used by maintenance programs -that trim the message base down by removing old messages. This field should -be ignored by applications importing or posting messages allowing them to -exceed this maximum at will. - -Max_age: -This field is the maximum age (in days) of messages to keep in the message -base. It is used by maintenance programs to purge out-dated messages from -the message base. - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 22 Header File (*.SHD) Format - - -Attr: -This is a bit field containing specific attributes (or flags) that may define -the way messages are stored or retrieved from the this message base. The -following attributes are defined: - - SMB_EMAIL (1<<0) - - Indicates the message base is specifically for messages to or from local - users. When this bit is set, the idxrec.to and idxrec.from fields will - contain the user numbers (or 0 for non-user destination/source) instead of - the CRC-16 of the agent name. - - SMB_HYPERALLOC (1<<1) - - Indicates the message base uses the Hyper Allocation storage method. This - bit should not be cleared by an application without first deleting all the - messages in the message base. This is due to the fact the Hyper Allocation - is not downward compatible with the Self-packing and Fast Allocation - storage methods. - -When used with Synchronet BBS software, a message base must NOT have both of -the above attributes set. The only message base that should have the SMB_EMAIL -attribute set is the DATA\MAIL message base. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 23 Header File (*.SHD) Format - - -Base Header #1 (Status info) Record Contents: --------------------------------------------- -smbhdr.id="SMB\x1a"; // SMB^Z -smbhdr.version=0x121; // v1.21 -smbhdr.length=sizeof(smbhdr_t)+sizeof(smbstatus_t); smbstatus_t status; - - -Additional Base Headers: ------------------------ -Additional headers from developers must have initial 8 bytes in smbhdr_t -format, length must include size of smbhdr_t, and header_offset of smbstatus_t -must be changed to include the size of the additional header(s). - - -Example file dump (base header portion only): --------------------------------------------- -000000 53 4D 42 1A 20 01 20 00 F4 01 00 00 F4 01 00 00 SMB. . .�...�... -000010 20 00 00 00 D0 07 00 00 D0 07 00 00 00 00 00 00 ...�...�....... - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 24 Header File (*.SHD) Format - - -Message Header Record (Fixed portion): -------------------------------------- -C example: - -typedef struct { - - uchar id[4]; // SHD^Z (same for all types and versions) - ushort type; // Message type (this is the definition of type 0) - ushort version; // Version of type (initially 100h for 1.00) - ushort length; // Total length of fixed portion + all fields - ushort attr; // Attributes (bit field) (duplicated in SID) - ulong auxattr; // Auxillary attributes (bit field) - ulong netattr; // Network attributes (bit field) - when_t when_written; // Date/Time message was originally created - when_t when_imported; // Date/Time message was imported (locally) - ulong number; // Message number (unique, not necessarily seq.) - ulong thread_orig; // Original message number in thread - ulong thread_next; // Next message in thread - ulong thread_first; // Number of first reply to this message - uchar reserved[16]; // 16 reserved bytes for future use - ulong offset; // Offset for buffer into data file (0 or mod 256) - ushort total_dfields; // Total number of data fields - - } msghdr_t; - -typedef struct { - - ushort type; // See "Data Field Types" values - ulong offset; // Offset into buffer - ulong length; // Length of data field in buffer - - } dfield_t; - -typedef struct { - - ushort type; // See "Header Field Types" for values - ushort length; // Length of buffer - uchar dat[length]; - - } hfield_t; - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 25 Header File (*.SHD) Format - - -Example file dump (one header record, both fixed and variable length portions): ------------------------------------------------------------------------------- -000020 53 48 44 1A 00 00 20 01 F5 00 00 00 00 00 00 00 SHD... .�....... -000030 00 00 00 00 46 DB F7 2C 00 00 7D D7 29 2D 00 00 ....F��,..}�)-.. -000040 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -000060 00 00 00 00 02 00 00 00 00 00 00 00 4A 01 00 00 ............J... -000070 02 00 4A 01 00 00 53 00 00 00 00 00 13 00 4D 61 ..J...S.......Ma -000080 72 69 61 6E 6E 65 20 4D 6F 6E 74 67 6F 6D 65 72 rianne Montgomer -000090 79 30 00 0C 00 43 61 72 6F 6C 20 47 61 69 73 65 y0...Carol Gaise -0000A0 72 60 00 07 00 46 61 72 6E 68 61 6D A4 00 14 00 r`...Farnham�... -0000B0 31 3A 31 33 38 2F 31 30 32 2E 30 20 32 63 66 38 1:138/102.0 2cf8 -0000C0 30 35 37 36 A5 00 14 00 31 3A 33 34 33 2F 31 30 0576�...1:343/10 -0000D0 30 2E 30 20 32 63 66 33 62 39 30 61 A3 00 23 00 0.0 2cf3b90a�.#. -0000E0 31 33 38 2F 31 30 32 20 31 20 32 37 30 2F 31 30 138/102 1 270/10 -0000F0 31 20 32 30 39 2F 32 30 39 20 31 30 33 2F 30 20 1 209/209 103/0 -000100 33 35 35 02 00 02 00 02 00 03 00 08 00 01 00 8A 355............� -000110 00 66 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .f.............. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 26 Header File (*.SHD) Format - - -Contents of example header: --------------------------- -id SHD^Z -type 0000h -version 0120h -length 245 -attr 0000h -auxattr 00000000h -netattr 00000000h -when_written Sat Nov 27 17:57:10 1993 -when_imported Tue Jan 04 15:54:21 1994 -number 1 -thread_orig 0 -thread_next 0 -thread_first 0 -reserved[16] -offset 0 -total_dfields 2 - -dfield[0].type 00h -dfield[0].offset 0 -dfield[0].length 330 -dfield[1].type 02h -dfield[1].offset 330 -dfield[1].length 83 - -hfield[0].type 00h -hfield[0].length 19 -hfield[0]_dat Marianne Montgomery -hfield[1].type 30h -hfield[1].length 12 -hfield[1]_dat Carol Gaiser -hfield[2].type 60h -hfield[2].length 7 -hfield[2]_dat Farnham -hfield[3].type A4h -hfield[3].length 20 -hfield[3]_dat 1:138/102.0 2cf80576 -hfield[4].type A5h -hfield[4].length 20 -hfield[4]_dat 1:343/100.0 2cf3b90a -hfield[5].type A3h -hfield[5].length 35 -hfield[5]_dat 138/102 1 270/101 209/209 103/0 355 -hfield[6].type 02h -hfield[6].length 2 -hfield[6]_dat 02 00 -hfield[7].type 03h -hfield[7].length 8 -hfield[7]_dat 01 00 8A 00 66 00 00 00 - - - - - -_______________________________________________________________________________ -Synchronet 27 Header File (*.SHD) Format - - -Fixed Portion Field descriptions: --------------------------------- -Id: -This field (regardless of the header type or version) must always contain the -the string "SHD^Z". This is to aid in the restoration of a corrupted header -file and give a visual indication of the beginning of a new header record when -viewing dumps of the header file. - -Type: -This is the message header type. Only one type is currently defined by this -specification (type 0). Any and all future header types will have the first -4 fields (10 bytes) in the same format of type 0. This allows other types -(with different lengths) to be skipped because the 4th field (length) will -always be in the same position. - -Version: -This is the version of this header type. This specification defines version -1.21 of message header type 0 (stored as 121h). - -Length: -This is the total length of this message header record (including both fixed -and variable length portions, but NOT including unused block space). - -Attr: -This is a bit field (16-bit) containing basic message attributes (flags) for -this message. An exact duplicate of this field is stored in the index file as -well. They must always match. - -Auxattr: -This is a bit field (32-bit) containing the auxillary attributes (flags) for -this message. The attributes stored in this variable are more specific in -nature and less critical than those in the Attr field. - -Netattr: -This is a bit field (32-bit) containing the network attributes (flags) for this -message. The attributes stored in this variable are related solely to message -networking. - -When_written: -This is the date and time when the message was originally created. - -When_imported: -This is the date and time when the message was posted on or imported into the -local message system. - -Number: -This is the message's unique serial number (from 1 to FFFFFFFFh). This field -is duplicated in the index file. They must always match. - - - - - - - -_______________________________________________________________________________ -Synchronet 28 Header File (*.SHD) Format - - -Thread_orig: -If this message is a reply, then this field contains the number of the original -message that was replied to. If this message was not a reply, this field will -contain the value 0. - -Thread_next: -If this message is a reply, and there are later replies to that message -(the message number contained in the Thread_orig field), then this field will -contain the number of the next reply in the chain. If this message is the only -reply to the orignal message, this field will contain the value 0. - -Thread_first: -If there are any replies to this message (after it has been posted), this field -will contain the number of the first reply to this message. If there are no -replies to this message, this field will contain the value 0. - -Reserved: -Unused bytes, reserved for future definition in the message header type 0 -specification. - -Offset: -The byte offset into the data file, specifying the start of the buffer for -all data associated with this message. This value must be either 0 or modula -256. When retrieving the actual data portion of data fields, the physical -offset into the file will be the offset of the message data buffer (this field) -plus the offset of the individual data field (msghdr_t.offset+dfield_t.offset). - -Total_dfields: -This field contains the total number of data fields associated with this -message. The value of this field must match the actual number of data fields -stored in the header (dfield_t data types following the fixed portion of the -message header). - - -Variable Portion Field descriptions: ------------------------------------ -See the Header Field Type and Data Field Type sections for the descriptions -of the values contained in these fields. - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 29 Header File (*.SHD) Format - - -Message Header Block Allocation (*.SHA) -======================================= - -If this message base uses the Hyper Allocation storage method (the -SMB_HYPERALLOC bit is set in the smbstatus_t.attr field), then this file is -not created or used. - -This file contains no header or signature data. Each byte (uchar) in the file -specifies the allocation state of the corresponding 256 byte block in the -header (*.SHD) file. A value of 0 indicates a free header block, and a value of -1 indicates an allocated block. Other non-zero values are undefined. - -This file must always be opened DENY ALL (non-shareable). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 30 Header Allocation File (*.SHA) Format - - -Message Data (*.SDT) -==================== - -This file contains no header or signature data. It contains the text and other -embedded data for the messages in a single message base. The data for each -message always begins on a 256 byte block boundary. The data in the unused -portion of a data block is undefined, but should be initialized to NULL -whenever possible. - -This file must always be opened DENY NONE (shareable). - -Data fields of type TEXT_BODY and TEXT_TAIL must have all trailing white space -and control characters removed (i.e. the last character of the data record -must be in the range 21h to FFh). The only exception to this rule, is if the -TEXT_BODY is terminated with multiple contiguous CRLFs, only the last CRLF -should be removed. A CRLF should always be appended to the text data when it is -displayed. - -When reading from this file, it is a good idea to make sure the message header -for the data being read is currently locked (though no single message header -should be locked for extended durations of time). This will insure that no -other application will write to this portion of the file while it's being -read (read from disk, not displayed). - -When using the Hyper Allocation storage method, the Status Info message base -header must be successfully locked before writing to this file and subsequently -unlocked. - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 31 Data File (*.SDT) Format - - -Message Data Block Allocation (*.SDA) -===================================== - -If this message base uses the Hyper Allocation storage method (the -SMB_HYPERALLOC bit is set in the smbstatus_t.attr field), then this file is -not created or used. - -This file contains no header or signature data. Each word (ushort) in the file -specifies the allocation state of the corresponding 256 byte block in the data -(*.SDT) file. A value of 0 indicates a free block, and a non-zero value -indicates the number of message header records associated with this message -data (most often 1). Each block can be used by up to 65,535 header records. - -This file must always be opened DENY ALL (non-shareable). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 32 Data Allocation File (*.SDA) Format - - -CRC history for duplicate message checking (*.SCH) -================================================== - -This file is optional and contains no header or signature data. Each long word -(ulong) in the file contains a CRC-32 of previously posted/imported messages. -These CRCs can be used to check a candidate message for posting/import to be -sure the message isn't a duplicate created by human or program error. The -maximum number of CRCs to store is defined in the first message base header -record (smbstatus_t.max_crcs). - -The CRC is calculated on the first TEXT_BODY data field before any translations -are applied (e.g. encoding, compression, encryption). - -This file must always be opened DENY ALL (non-shareable). - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 33 CRC History File (*.SCH) Format - - -Header Field Types: -================== - -These are the defined valid values for hfield_t.type: - -Name : SENDER -Value : 00h -Data : ASCII -Multiple : Yes, order significant -Required : Yes -Summary : Name of agent that sent this message - -If blank (0 length or nulstr), assumed "Anonymous". If multiple SENDER fields -exist, then the message has been forwarded and the order of the fields in the -record must match the forwarding order (chronologically). When forwarding a -message, the original SENDER field should be left intact and new SENDER, -FORWARDED, and RECIPIENT fields added to the end of the record. - - -Name : SENDERAGENT -Value : 01h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : AGENT_PERSON or previous SENDERAGENT if exists -Summary : Type of agent that sent this message - -If multiple SENDER fields exist, then the message has been forwarded. If any of the -forwarding agents is of a type other than AGENT_PERSON, then this field must -follow that SENDER field to specify the agent type. - -Name : SENDERNETTYPE -Value : 02h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : NET_NONE or previous SENDERNETTYPE if exists -Summary : Type of network message was sent from - -If multiple SENDERNETADDR fields are included, a SENDERNETTYPE field should be -included before each to determine what data type the address is stored in. - -Name : SENDERNETADDR -Value : 03h -Data : undef -Multiple : Yes, order significant -Required : No -Default : Previous SENDERNETADDR if exists -Summary : Network address for agent that sent this message - -The SENDERNETTYPE field indicates the data type of this field. If the -SENDERNETTYPE is of type NET_INTERNET, the local-part of the Internet -address is optional. If the local-part separator character ('@') is omitted, -the SENDER field is assumed to be the local-part of the address. - -_______________________________________________________________________________ -Synchronet 34 Header Field Types - - - -Name : SENDEREXT -Value : 04h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous SENDEREXT if exists -Summary : Extension of sending agent - -This field is useful for storing the sending agent's extension, when the -agent's extension binds more tightly than the agent's name. - -For example, Synchronet Multinode BBS Software stores local e-mail with the -sending and receiving agent's user numbers stored as their respective -extensions. This is done so that if a user name changes for some reason, -messages will not "disappear" from the user's mail box. - -If the SMB_EMAIL status header attribute is set, then the "From" field in the -index must contain the binary value of this field rather than the CRC-16 of the -SENDER (name) field. - -Name : SENDERPOS -Value : 05h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous SENDERPOS if exists -Summary : Position of sending agent - -Primarily for documentary purposes, this field contains the position of the -sending agent (i.e. President, Sysop, C.E.O., MIS Director, etc). - -It can also be useful for getting a message or reply to the intended -recipient when the agent name is not located or is unknown, but the position -of the agent is known and specified. - -Name : SENDERORG -Value : 06h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous SENDERORG if exists -Summary : Organization name of sending agent - -Primarily for documentary purposes, this field contains the organization to -which the sending agent belongs (i.e. Microsoft, Joe's BBS, SoCal User's Group, -etc). - - - - - - - - -_______________________________________________________________________________ -Synchronet 35 Header Field Types - - -Name : AUTHOR -Value : 10h -Data : ASCII -Multiple : Yes -Required : No -Default : First SENDER -Summary : Name of agent that created this message - -This field can only be added by the process that originally creates the -message. It should not be included if same as first SENDER field. If multiple -AUTHOR fields exist, then the message was created by multiple agents and is -considered valid. The order of multiple AUTHOR fields in the record is not -significant. - -Name : AUTHORAGENT -Value : 11h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : SENDERAGENT or previous AUTHORAGENT if exists -Summary : Type of agent that created this message - -This field can only be added by the process that originally creates the -message. It should not be included if same as first SENDERAGENT field. If -multiple AUTHOR fields exist, then the message was created by multiple agents -and if the agent type for any of the authors is other than AGENT_PERSON, an -AUTHORAGENT field must follow to specify the agent type. - -Name : AUTHORNETTYPE -Value : 12h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : SENDERNETTYPE or previous AUTHORNETTYPE if exists -Summary : Type of network this author is member of - -Name : AUTHORNETADDR -Value : 13h -Data : undef -Multiple : Yes, order significant -Required : No -Default : SENDERNETADDR or previous AUTHORNETADDR if exists -Summary : Network address of this author - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 36 Header Field Types - - -Name : AUTHOREXT -Value : 14h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : SENDEREXT or previous AUTHOREXT if exists -Summary : Extension of this author - -Name : AUTHORPOS -Value : 15h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : SENDERPOS or previous AUTHORPOS if exists -Summary : Position of this author - -Name : AUTHORORG -Value : 16h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : SENDERORG or previous AUTHORORG if exists -Summary : Organization this author belongs to - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 37 Header Field Types - - -Name : REPLYTO -Value : 20h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDER -Summary : Name of agent that replies should go to - -Name : REPLYTOAGENT -Value : 21h -Data : ushort -Multiple : Yes, but only last is valid -Required : No -Default : SENDERAGENT -Summary : Type of agent that replies should go to - -Name : REPLYTONETTYPE -Value : 22h -Data : ushort -Multiple : Yes, but only last is valid -Required : No -Default : SENDERNETTYPE -Summary : Type of network that replies should go to - -Name : REPLYTONETADDR -Value : 23h -Data : undef -Multiple : Yes, but only last is valid -Required : No -Default : SENDERNETADDR -Summary : Network address that replies should go to - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 38 Header Field Types - - -Name : REPLYTOEXT -Value : 24h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDEREXT -Summary : Extension of agent that replies should go to - -Name : REPLYTOPOS -Value : 25h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDERPOS -Summary : Position of agent that replies should go to - -Name : REPLYTOORG -Value : 26h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDERORG -Summary : Organization of agent that replies should go to - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 39 Header Field Types - - -Name : RECIPIENT -Value : 30h -Data : ASCII -Multiple : Yes, order significant -Required : Yes -Default : "All" -Summary : Name of agent to receive this message - -If multiple RECIPIENT fields exist, the message has been forwarded and for each -additional RECIPIENT field (after the initial RECIPIENT), there should be a -FORWARDED field. The order of the RECIPIENT fields in the record must match the -order in which the message was sent and forwarded (chronologically). - -Name : RECIPIENTAGENT -Value : 31h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : AGENT_PERSON or previous RECIPIENTAGENT if exists -Summary : Type of agent to receive this message - -If multiple RECIPIENT fields exist, the message has been forwarded. If any of -the recipient agents are of a type other than AGENT_PERSON, this field must -follow the RECIPIENT field to specify the agent type. - -Name : RECIPIENTNETTYPE -Value : 32h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : NET_NONE or previous RECIPIENTNETTYPE if exists -Summary : Type of network to receive this message - -Name : RECIPIENTNETADDR -Value : 33h -Data : undef -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTNETADDR if exists -Summary : Address of network to receive this message - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 40 Header Field Types - - -Name : RECIPIENTEXT -Value : 34h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTEXT if exists -Summary : Extension of agent to receive this message - -If SMB_EMAIL status header attribute is set, then the "To" field in the index -must contain the binary value of this field rather than the CRC-16 of the -RECIPIENT (name) field. This is the case specifically with the local e-mail -message base on a Synchronet BBS. - -Name : RECIPIENTPOS -Value : 35h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTPOS if exists -Summary : Position of agent to receive this message - -Name : RECIPIENTORG -Value : 36h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTORG if exists -Summary : Type of agent to receive this message - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 41 Header Field Types - - -Name : FORWARDTO -Value : 40h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Name of agent this message is to be forwarded to - -Name : FORWARDTOAGENT -Value : 41h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTAGENT or previous FORWARDTOAGENT if exists -Summary : Type of agent this message is to be forwarded to - -Name : FORWARDTONETTYPE -Value : 42h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETTYPE or previous FORWARDTONETTYPE if exists -Summary : Type of network this message is to be forwarded to - -Name : FORWARDTONETADDR -Value : 43h -Data : undef -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETADDR or previous FORWARDTONETADDR if exists -Summary : Network address this message is to be forwarded to - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 42 Header Field Types - - -Name : FORWARDTOEXT -Value : 44h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTEXT or previous FORWARDTOEXT if exists -Summary : Extension of agent this message is to be forwarded to - -Name : FORWARDTOPOS -Value : 45h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTPOS or previous FORWARDTOPOS if exists -Summary : Position of agent this message is to be forwarded to - -Name : FORWARDTOORG -Value : 46h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTORG or previous FORWARDTOORG if exists -Summary : Organization of agent this message is to be forwarded to - -Name : FORWARDED -Value : 48h -Data : when_t -Multiple : Yes, order significant -Required : Yes, if forwarded -Summary : Date/Time this message was forwarded to another agent - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 43 Header Field Types - - -Name : RECEIVEDBY -Value : 50h -Data : ASCII -Multiple : Yes, order significant -Required : Yes, if receiving agent is other than RECIPIENT -Summary : Name of agent that received this message - -Name : RECEIVEDBYAGENT -Value : 51h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTAGENT or previous RECEIVEDBYAGENT if exists -Summary : Type of agent that received this message - -Name : RECEIVEDBYNETTYPE -Value : 52h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETTYPE or previous RECEIVEDBYNETTYPE if exists -Summary : Type of network that received this message - -Name : RECEIVEDBYNETADDR -Value : 53h -Data : undef -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETADDR or previous RECEIVEDBYNETADDR if exists -Summary : Network address that received this message - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 44 Header Field Types - - -Name : RECEIVEDBYEXT -Value : 54h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTEXT or previous RECEIVEDBYEXT if exists -Summary : Extension of agent that received this message - -Name : RECEIVEDBYPOS -Value : 55h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTPOS or previous RECEIVEDBYPOS if exists -Summary : Position of agent that received this message - -Name : RECEIVEDBYORG -Value : 56h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTORG or previous RECEIVEDBYORG if exists -Summary : Organization of agent that received this message - -Name : RECEIVED -Value : 58h -Data : when_t -Multiple : Yes, order significant -Required : Yes, if received -Default : NULL -Summary : Date/Time this message was received - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 45 Header Field Types - - -Name : SUBJECT -Value : 60h -Data : ASCII -Multiple : No -Required : Yes, but may be blank (0 length or nulstr) -Summary : Subject/title of message - -Name : SUMMARY -Value : 61h -Data : ASCII -Multiple : No -Required : No -Summary : Summary of message contents, created by AUTHOR - -Name : COMMENT -Value : 62h -Data : ASCII -Multiple : Yes -Required : No -Summary : Comment about this message, created by SENDER - -This field is useful for adding notes to a message when forwarding to a new -recipient. - -Name : CARBONCOPY -Value : 63h -Data : ASCII -Multiple : Yes -Required : No -Summary : List of agents this message was also sent to - -This field is optional and only for the use of notifying the recipient of who -else received the message. - -Name : GROUP -Value : 64h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of group of users to receive message on recipient system - -This field is used when sending to a group name across a network, where the -group can be expanded into multiple header records for each agent on the -destination system. - -Name : EXPIRATION -Value : 65h -Data : when_t -Multiple : No -Required : No -Summary : Date/Time that this message will expire - - - - -_______________________________________________________________________________ -Synchronet 46 Header Field Types - - -Name : PRIORITY -Value : 66h -Data : ulong -Multiple : No -Required : No -Default : 0 -Summary : Message priority (0 is lowest, FFFFFFFFh is highest) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 47 Header Field Types - - -Name : FILEATTACH -Value : 70h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name/file specification of attached file(s) - -Name of attached file(s). Wildcards allowed. MSG_FILEATTACH attribute must be -set. If the MSG_FILEATTACH attribute is set but this field is not included, -the SUBJECT field is assumed to be the filename(s). - -Name : DESTFILE -Value : 71h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Destination name for attached file(s) - -Wildcards allowed. FILEATTACH field must also be included. - -Name : FILEATTACHLIST -Value : 72h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of ASCII list of attached filenames - -Wildcards not allowed in ASCII list filename. Wildcards allowed in ASCII list. -MSG_FILEATTACH attribute must be set. - -Name : DESTFILELIST -Value : 73h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Name of ASCII list of destination filenames - -Wildcards not allowed in ASCII list filename. Wildcards allowed in ASCII list. - -Name : FILEREQUEST -Value : 74h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of requested file - -Wildcards allowed. MSG_FILEREQUEST attribute must be set - -Name : FILEPASSWORD -Value : 75h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Password for FILEREQUEST - -_______________________________________________________________________________ -Synchronet 48 Header Field Types - - - -Name : FILEREQUESTLIST -Value : 76h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of ASCII list of filenames to request - -Wildcards allowed. - -Name : FILEPASSWORDLIST -Value : 77h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Name of ASCII list of passwords for FILEREQUESTLIST - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 49 Header Field Types - - -Name : IMAGEATTACH -Value : 80h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached image file for display - -MSG_FILEATTACH attribute must be set. See Image Types for valid -mattach_t.type values. - -Name : ANIMATTACH -Value : 81h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached graphical animation file for display - -MSG_FILEATTACH attribute must be set. See Animation Types for valid -mattach_t.type values. - -Name : FONTATTACH -Value : 82h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached font definition file - -MSG_FILEATTACH attribute must be set. See Font Types for valid mattach_t.type -values. - -Name : SOUNDATTACH -Value : 83h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached sound file for playback - -MSG_FILEATTACH attribute must be set. See Sound Types for valid mattach_t.type -values. - -Name : PRESENTATTACH -Value : 84h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached presentation definition file - -MSG_FILEATTACH attribute must be set. See Present Types for valid -mattach_t.type values. - - - - - - -_______________________________________________________________________________ -Synchronet 50 Header Field Types - - -Name : VIDEOATTACH -Value : 85h -Data : vattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached interleaved video/sound file - -MSG_FILEATTACH attribute must be set. See Video Types for valid -vattach_t.type values and Video Compression Types for valid vattach_t.comp -values. - -Name : APPDATAATTACH -Value : 86h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Name of attached application data file for process/display - -MSG_FILEATTACH attribute must be set. See Application Data Types for valid -mattach_t.type values. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 51 Header Field Types - - -Name : IMAGETRIGGER -Value : 90h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of image file to trigger for display - -See Image Types for valid typestr_t.type values. - -Name : ANIMTRIGGER -Value : 91h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of animation file to trigger for display - -See Animation Types for valid typestr_t.type values. - -Name : FONTTRIGGER -Value : 92h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of font definition file to trigger - -See Font Types for valid typestr_t.type values. - -Name : SOUNDTRIGGER -Value : 93h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of sound file to trigger for playback - -See Sound Types for valid typestr_t.type values. - -Name : PRESENTTRIGGER -Value : 94h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of presentation definition file to trigger - -See Present Types for valid typestr_t.type values. - -Name : VIDEOTRIGGER -Value : 95h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of interleaved video/sound file to trigger - -See Video Types for valid typestr_t.type values. - - -_______________________________________________________________________________ -Synchronet 52 Header Field Types - - -Name : APPDATATRIGGER -Value : 96h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of application data file to trigger - -See Application Data Types for valid typestr_t.type values. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 53 Header Field Types - - -Name : FIDOCTRL -Value : A0h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : keyword ":" [" "] appdata -Summary : FTS/FSC-compliant control information line - -Any FidoNet FTS/FSC-compliant control information ("kludge") line that -does not have an equivalent representation here. All data not unique to the -actual control line, including leading and trailing white space, Ctrl-A (01h) -character and terminating CR must be ommited. Defined in FTS-0001. - -Name : FIDOAREA -Value : A1h -Data : ASCII -Multiple : No -Required : No -Summary : FTN EchoMail conference name. - -Defined in FTS-0004. - -Name : FIDOSEENBY -Value : A2h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : net"/"node [" "[net"/"]node] [...] -Summary : Used to store two-dimensional (net/node) SEEN-BY information - -Often used in FTN EchoMail environments. Only the actual SEEN-BY data is stored -and SEEN-BY: is stripped along with any leading and trailing white space -characters. Defined in FTS-0004. - -Name : FIDOPATH -Value : A3h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : net"/"node [" "[net"/"]node] [...] -Summary : Used to store two-dimensional (net/node) - -Defined in FTS-0004. ^aPATH: is stripped along with any leading and trailing -white space characters. - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 54 Header Field Types - - -Name : FIDOMSGID -Value : A4h -Data : ASCII -Multiple : No -Required : No -Format : origaddr " " serialno -Summary : MSGID field as specified in FTS-0009. - -Name : FIDOREPLYID -Value : A5h -Data : ASCII -Multiple : No -Required : No -Format : origaddr " " serialno -Summary : REPLY field as specified in FTS-0009. - -Name : FIDOPID -Value : A6h -Data : ASCII -Multiple : No -Required : No -Format : pID " " version [" "serialno] -Summary : Indentification string of program that created this message - -Defined FSC-0046. "^aPID:" and any white space is not included. - -Name : FIDOFLAGS -Value : A7h -Data : ASCII -Multiple : Yes -Required : No -Summary : Used to store the FTN FLAGS kludge information - -Note that all FLAG options that have binary representation in the message -header must be removed from the FLAGS string prior to storing it. Only the -actual flags option string is stored and ^aFLAGS is stripped along with any -leading and trailing white space characters. Defined in FSC-0053. - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 55 Header Field Types - - -Name : RFC822HEADER -Value : B0h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : field-name ":" [field-body] [CRLF] -Summary : Undefined RFC-822 header field - -Internet Message storage format, that does not have an equivalent -representation here. Folded header fields are allowed. Terminating CRLF may be -ommited. - -Name : RFC822MSGID -Value : B1h -Data : ASCII -Multiple : No -Required : No -Format : "<" addr-spec ">" -Summary : Message-ID field as specified in RFC-822. - -Name : RFC822REPLYID -Value : B2h -Data : ASCII -Multiple : No -Required : No -Format : "<" addr-spec ">" -Summary : In-Reply-To field as specified in RFC-822. - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 56 Header Field Types - - -Name : UNKNOWN -Value : F0h -Data : undef -Multiple : Yes -Required : No -Summary : Undefined header field of undefined type - -This field is useful for retaining binary header fields (that do not have an -equivalent representation here) between message storage formats. - -Name : UNKNOWNASCII -Value : F1h -Data : ASCII -Multiple : Yes -Required : No -Summary : Undefined header field of type ASCII - -This field is useful for retaining ASCII header fields (that do not have an -equivalent representation here) between message storage formats. - -Name : UNUSED -Value : FFh -Data : undef -Multiple : Yes -Required : No -Summary : Unused (deleted) header field - -The data contained in this header field is of an unknown type and should not be -processed. - - -Note: ----- -Specifically, not defined are the values F000h through FFFFh. These values -are to be used for user or system defined header fields. Digital Dynamics -requests that any developers or organizations that wish to have additional -header fields added to this specification notify Digital Dynamics through any -of the contact methods listed at the beginning of this document. - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 57 Header Field Types - - -Data Field Types: -================ - -These are the defined valid values for dfield_t.type: - - -Val Name Data Description ---- ---- ---- ----------- -00h TEXT_BODY mtext_t Displayable text (body of message). - Included in duplicate message checking. - All terminating white space and control - characters are to be truncated from data - (except when multiple contiguous CRLFs - terminate the text, only the last CRLF - is removed). - -01h TEXT_SOUL mtext_t Non-displayed text. - Not normally displayed. Not necessarily - displayable. - Included in duplicate message checking. - -02h TEXT_TAIL mtext_t Displayable text (tag/tear/origin lines, - etc). - Not included in duplicate message checking. - All terminating white space and control - characters are to be truncated from data. - -03h TEXT_WING mtext_t Non-displayed text. - Not normally displayed. Not necessarily - displayable. - Not included in duplicate message checking. - -10h FTEXT_BODY ftext_t Formatted equivalent of TEXT_BODY to be - displayed in place of TEXT_BODY if format - is supported. See Image Types for valid - values of ftext_t.type. - -12h FTEXT_TAIL ftext_t Formatted equivalent of TEXT_TAIL to be - displayed in place of TEXT_TAIL if format - is supported. See Image Types for valid - values of ftext_t.type. - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 58 Data Field Types - - -20h IMAGEEMBED membed_t Type and data of embedded raster image file - for display. - See Image Types for valid membed.type - values. - -21h ANIMEMBED membed_t Type and data of embedded graphical - animation file for display. - See Animation Types for valid membed.type - values. - -22h FONTEMBED membed_t Type and data of embedded font definition - file. See Font Types for valid - membed_t.type values. - -23h SOUNDEMBED membed_t Type and data of embedded sound file for - playback. - See Sound Types for valid membed_t.type - values. - -24h PRESENTEMBED membed_t Type and data of embedded presentation - definition file. - See Present Types for valid membed_t.type - values. - -25h VIDEOEMBED vembed_t Type and data of embedded video/sound file - for playback. - See Video Types for valid vembed_t.type - values. - See Video Compression Types for valid - vembed_t.comp values. - -26h APPDATAEMBED membed_t Type and data of embedded application data - file for process/display. - See Application Data Types for valid - membed_t.type values. - -FFh UNUSED undef Space allocated for future update/expansion - - -Specifically, not defined are the values F000h through FFFFh. These values -are to be used for user or system defined data fields. Digital Dynamics -requests that any developers or organizations that wish to have additional -data fields added to this specification notify Digital Dynamics through any -of the contact methods listed at the beginning of this document. - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 59 Data Field Types - - -Message Attributes: ------------------- - -These are the bit values for idxrec_t.attr and msghdr_t.attr: - -MSG_PRIVATE (1<<0) // Private -MSG_READ (1<<1) // Read by addressee -MSG_PERMANENT (1<<2) // Permanent -MSG_LOCKED (1<<3) // Msg is locked, no editing possible -MSG_DELETE (1<<4) // Msg is marked for deletion -MSG_ANONYMOUS (1<<5) // Anonymous author -MSG_KILLREAD (1<<6) // Delete message after it has been read -MSG_MODERATED (1<<7) // This message must be validated before export -MSG_VALIDATED (1<<8) // This message has been validated by a moderator - - -Auxillary Attributes: --------------------- -These are the bit values for msghdr_t.auxattr: - -MSG_FILEREQUEST (1<<0) // File request -MSG_FILEATTACH (1<<1) // File(s) attached to Msg -MSG_TRUNCFILE (1<<2) // Truncate file(s) when sent -MSG_KILLFILE (1<<3) // Delete file(s) when sent -MSG_RECEIPTREQ (1<<4) // Return receipt requested -MSG_CONFIRMREQ (1<<5) // Confirmation receipt requested -MSG_NODISP (1<<6) // Msg may not be displayed to user - - -Network Attributes: ------------------- -These are the bit values for msghdr_t.netattr: - -MSG_LOCAL (1<<0) // Msg created locally -MSG_INTRANSIT (1<<1) // Msg is in-transit -MSG_SENT (1<<2) // Sent to remote -MSG_KILLSENT (1<<3) // Kill when sent -MSG_ARCHIVESENT (1<<4) // Archive when sent -MSG_HOLD (1<<5) // Hold for pick-up -MSG_CRASH (1<<6) // Crash -MSG_IMMEDIATE (1<<7) // Send Msg now, ignore restrictions -MSG_DIRECT (1<<8) // Send directly to destination -MSG_GATE (1<<9) // Send via gateway -MSG_ORPHAN (1<<10) // Unknown destination -MSG_FPU (1<<11) // Force pickup -MSG_TYPELOCAL (1<<12) // Msg is for local use only -MSG_TYPEECHO (1<<13) // Msg is for conference distribution -MSG_TYPENET (1<<14) // Msg is direct network mail - - - - - - - -_______________________________________________________________________________ -Synchronet 60 Message Attributes - - -Translation Types: ------------------ - -Definition for values of *.xlat[x]: - -XLAT_NONE 0 // No translation/End of translation list -XLAT_LF2CRLF 1 // Expand sole LF to CRLF -XLAT_ESCAPED 2 // 7-bit ASCII escaping for ctrl and 8-bit data -XLAT_HUFFMAN 3 // Static and adaptive Huffman coding compression -XLAT_LZW 4 // LZW (Lempel-Ziv-Welch) encoding for compression - // Terry Welch, IEEE Computer Vol 17, No 6 - // June 1984, pp 8-19 -XLAT_LZC 5 // LZC (modified LZW) encoding for compression - // Unix compress program -XLAT_RLE 6 // Run length encoding compression -XLAT_IMPLODE 7 // Implode compression (PKZIP v1.x) -XLAT_SHRINK 8 // Shrink compression (PKZIP v1.x) -XLAT_LZH 9 // LZH dynamic Huffman coding - // Haruyasu Yoshizaki, LHarc - // November, 1988 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 61 Translation Types - - -Agent Types: ------------ - -AGENT_PERSON 0 // To or from person -AGENT_PROCESS 1 // Unknown process, identified by agent name - -Agent types E000h through EFFFh are reserved for Synchronet process types -(defined specifically by Digital Dynamics). - -Note: ----- -Specifically not defined are agent types F000h through FFFFh. These values -are to be used for user or system defined agent types. Digital Dynamics -requests that any developers or organizations that wish to have additional -agent types added to this specification notify Digital Dynamics through any -of the contact methods listed at the beginning of this document. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 62 Agent Types - - -Network Types: -------------- - - // Net Type Address Format - // ----------------------------------- -NET_NONE 0 // Locally created none -NET_UNKNOWN 1 // Unknown undef -NET_FIDO 2 // FTN network fidoaddr_t -NET_POSTLINK 3 // PostLink network none -NET_QWK 4 // QWK based network ASCII -NET_INTERNET 5 // The Internet ASCII -NET_WWIV 6 // WWIV based network ulong -NET_MHS 7 // MHS network ASCII - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 63 Network Types - - -Media Types: -=========== - -Image Types: ------------ - -IMAGE_UNKNOWN 0x00 // Use image signature header to determine format -IMAGE_ASC 0x01 // ASCII text/IBM extended ASCII graphics -IMAGE_ANS 0x02 // ANSI X3.64 terminal escape sequences -IMAGE_AVT 0x03 // AVATAR terminal escape sequences -IMAGE_LVI 0x04 // LVI terminal escape sequences -IMAGE_GIF 0x05 // Compuserve Graphics Interchange Format (GIF) -IMAGE_TIF 0x06 // Tagged Image Format (AKA TIFF) -IMAGE_JPG 0x07 // Joint Photographers Electronics Group (JPEG) -IMAGE_T16 0x08 // TrueVision 16-bit bitmap (TGA) -IMAGE_T24 0x09 // TrueVision 24-bit bitmap (TGA) -IMAGE_T32 0x0a // TrueVision 32-bit bitmpa (TGA) -IMAGE_PCX 0x0b // ZSoft PaintBrush graphics -IMAGE_BMP 0x0c // Windows bitmap -IMAGE_RLE 0x0d // Windows bitmap (compressed) -IMAGE_DIB 0x0e // Display independant bitmap -IMAGE_PCD 0x0f // Kodak PhotoCD -IMAGE_G3F 0x10 // Group 3 FAX -IMAGE_EPS 0x11 // Ecapsulated PostScript -IMAGE_RTF 0x12 // Rich text format -IMAGE_RIP 0x13 // Remote Imaging Protocol Script (RIPscrip) -IMAGE_NAP 0x14 // NAPLPS -IMAGE_CDR 0x15 // Corel Draw! -IMAGE_CGM 0x16 // Computer graphics metafile -IMAGE_WMF 0x17 // Windows metafile -IMAGE_DFX 0x18 // Autodesk AutoCAD -IMAGE_IFF 0x19 // Amiga Interchange File Format - - -Animation Types: ---------------- - -ANIM_UNKNOWN 0 // Use file signature header to determine format -ANIM_FLI 1 // Autodesk animator -ANIM_FLC 2 // Autodesk -ANIM_GL 3 // Grasprt -ANIM_IFF 4 // Amiga Interchange File Format - - -Video Types: ------------ - -VIDEO_UNKNOWN 0 // Use file signature header to determine format -VIDEO_QTIME 1 // Apple Quick-time -VIDEO_FQTIME 2 // Apple Flattened Quick-time -VIDEO_AVI 3 // Windows Auto/Video Interleave -VIDEO_ULT 4 // OS/2 Ultimotion - - - -_______________________________________________________________________________ -Synchronet 64 Media Types - - -Video Compression Types: ------------------------ - -VCOMP_UNKNOWN 0 // Use file signature header to determine codec -VCOMP_RLE 1 // Apple animation -VCOMP_SMC 2 // Apple graphics -VCOMP_RPZA 3 // Apple video -VCOMP_KLIC 4 // Captain crunch -VCOMP_CVID 5 // CinePak -VCOMP_RT21 6 // Intel indeo R2 -VCOMP_IV31 7 // Intel indeo R3 -VCOMP_YVU9 8 // Intel YVU9 -VCOMP_JPEG 9 // JPEG -VCOMP_MRLE 10 // Microsoft RLE -VCOMP_MSVC 11 // Microsoft video 1 - - -Font Types: ----------- - -FONT_UNKNOWN 0 // Use file signature header to determine format -FONT_TTF 1 // Windows TrueType -FONT_PFB 2 // PostScript Type 1 Font Binary -FONT_PFM 3 // PostScript Type 1 Font Metric -FONT_AMIGA 4 // Amiga Bitmapped -FONT_AGFA 5 // CompuGraphic Fonts - - -Sound Types: ------------ - -SOUND_UNKNOWN 0 // Use file signature header to determine format -SOUND_MOD 1 // MOD format -SOUND_VOC 2 // Sound Blaster VOC format -SOUND_WAV 3 // Windows 3.1 WAV RIFF format -SOUND_MID 4 // MIDI format -SOUND_GMID 5 // General MIDI format (standardized patches) -SOUND_SMP 6 // Turtle Beach SampleVision format -SOUND_SF 7 // IRCAM format -SOUND_AU 8 // Sun Microsystems AU format -SOUND_IFF 9 // Amiga Interchange File Format - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 65 Media Types - - -Application Data Types: ----------------------- - -APPDATA_UNKNOWN 0 // Use file signature header to determine format -APPDATA_WORDPERFECT 1 // WordPerfect Document -APPDATA_WKS 2 // Lotus 123 Worksheet (?) -APPDATA_WK1 3 // Lotus 123 Worksheet rev 1 -APPDATA_WK2 4 // Lotus 123 Worksheet rev 2 -APPDATA_WK3 5 // Lotus 123 Worksheet rev 3 -APPDATA_DBF 6 // dBase III data file -APPDATA_PDX 7 // Paradox data file -APPDATA_EXCEL 8 // Excel data file -APPDATA_QUATRO 9 // Borland Quatro Pro file -APPDATA_WORD 10 // Microsoft Word - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 66 Media Types - - -Message Storage Pseudo Code -=========================== - -The following is a "C like" pseudo code listing example of adding a message to -an SMB message base. SMBLIB contains C functions to do most of the following -operations. We are supplying this pseudo code as a general definition of the -order of required operations in writing to the message base. Many details have -been left out to simplify the code and to demonstrate only the basic -principles. - -shd = open ( MSGBASE.SHD , READ/WRITE/DENY_NONE ) -sdt = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) -sid = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) - -lock ( shd , smbhdr ) -read ( shd , smbstatus ) - -if ( smbstatus.attr & SMB_HYPERALLOC ) - msg.hdr.offset = filelength ( sdt ) - -else { - number_of_blocks = length_of_message_data / SDT_BLOCK_LEN - if ( length_of_message_data % SDT_BLOCK_LEN ) /* unevenly divisible */ - number_of_blocks = number_of_blocks + 1 - - sda = open ( MSGBASE.SDA , READ/WRITE/DENY_ALL ) - - if ( fast_allocation_mode ) - seek ( sda , END_OF_FILE ) - - else { - seek ( sda , BEGINNING_OF_FILE ) - while ( not end_of_file ( sda ) ) { - read ( sda , allocated , number_of_blocks * 2 ) - if ( allocated = 0 ) { - seek_backwards ( sda , number_of_blocks * 2 ) - break - } - } - } - - msg.hdr.offset = ( current_position ( sda ) / 2 ) * SDT_BLOCK_LEN - - allocated = 1 - - write ( sda , allocated , number_of_blocks * 2 ) - - close ( sda ) -} - - - - - - -_______________________________________________________________________________ -Synchronet 67 Message Storage Pseudo Code - - -seek ( sdt , msg.hdr.offset ) - -write ( sdt , message_data ) - -if ( smbstatus.attr & SMB_HYPERALLOC ) - msg.idx.offset = filelength ( shd ) - -else { - number_of_blocks = length_of_message_header / SHD_BLOCK_LEN - if ( length_of_message_header % SHD_BLOCK_LEN ) /* unevenly divisible */ - number_of_blocks = number_of_blocks + 1 - - sha = open ( MSGBASE.SHA , READ/WRITE/DENY_ALL ) - - if ( fast_allocation_mode ) - seek ( sha , END_OF_FILE ) - - else { - seek ( sha , BEGINNING_OF_FILE ) - while ( not end_of_file ( sha ) ) { - read ( sha , allocated , number_of_blocks ) - if ( allocated = 0 ) { - seek_backwards ( sha , number_of_blocks ) - break - } - } - } - - msg.idx.offset = ( current_position ( sha ) * SHD_BLOCK_LEN ) - msg.idx.offset = msg.idx.offset + smbstatus.header_offset - - allocated = 1 - - write ( sha , allocated , number_of_blocks ) - - close ( sha ) -} - -seek ( shd , msg.idx.offset ) - -msg.hdr.number = smbstatus.last_msg+1 - -write ( shd , msg.hdr ) - -smbstatus.total_msgs = smbstatus.total_msgs + 1 -smbstatus.last_msg = msg.hdr.number - -write ( shd , smbstatus ) - -write ( sid , msg.idx ) - -unlock ( shd , smbstatus ) - - - -_______________________________________________________________________________ -Synchronet 68 Message Storage Pseudo Code - - -Message Retrieval Pseudo Code -============================= - -shd = open ( MSGBASE.SHD , READ/WRITE/DENY_NONE ) -sdt = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) -sid = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) - -read ( sid , msg.idx ) - -seek ( shd , msg.idx.offset ) - -lock ( shd , msg.hdr ) - -read ( shd , msg.hdr ) - -seek ( sdt , msg.hdr.offset ) - -read ( sdt , msg.hdr.data_length ) - -unlock ( shd , msg.hdr ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 69 Message Retrieval Pseudo Code - - -SMBUTIL -======= - -SMBUTIL is a utility that can perform various functions on an SMB message base. -The primary purpose of SMBUTIL is as an example to C programmers of how to use -the SMBLIB functions to access and modify an SMB message base. The complete C -source code for SMBUTIL is included and functions from it can be used or -modified by developers at their own discretion. The following files make up -SMBUTIL: - -SMBUTIL.EXE Compiled and linked for 16-bit DOS (ready to run) -SMBUTIL.C C functions -SMBUTIL.H C definitions and variable prototypes -SMBUTIL.WAT Makefile for Watcom C/C++ (type wmake -f smbutil.wat) -SMBUTIL.BOR Makefile for Borland C/C++ (type make -f smbutil.bor) - -The usage syntax is as follows: - -SMBUTIL [/opts] cmd smb_filespec.shd - -where cmd is one or more of the following: - - l[n] = list msgs starting at number n - r[n] = read msgs starting at number n - v[n] = view msg headers starting at number n - k[n] = kill (delete) n msgs - i<f> = import from text file f - s = display msg base status - c = change msg base status - m = maintain msg base - delete old msgs and msgs over max - p[k] = pack msg base (k specifies minimum packable Kbytes) - -where opts is one or more of the following: - - a = always (force) packing - z<n> = set time zone (n=min +/- from UT or 'EST','EDT','CST',etc) - -and smb_filespec is the base filename or file specification (wildcards) for the -message base. If wildcards are used, the ".SHD" extension must be specified. - -An example command line: - -SMBUTIL MP C:\SBBS\DATA\SUBS\*.SHD - -would maintain and pack all the message bases found in the C:\SBBS\DATA\SUBS -directory. - - - - - - - - - -_______________________________________________________________________________ -Synchronet 70 SMBUTIL - - -CHKSMB -====== - -CHKSMB is a utility that performs a comprehensive analysis of a message base -to find any possible errors and calculate the number of packable bytes. It does -not "fix" a message base if any errors are found, it only reports the specific -errors (and exits with a non-zero error level). If any errors are reported, -packing the message base with SMBUTIL may rebuild the damaged files. If that -doesn't work, then use FIXSMB as a last resort. - -C source code for CHKSMB is also included as an example to programmers of how -to use SMBLIB functions. - -The usage syntax is as follows: - -CHKSMB [/opts] smb_filespec.shd - -where opts is one or more of the following: - - q = quiet mode (no beeps) - s = stop after an errored message base (for use with wildcards) - p = pause after an errored message base (wait for key press) - t = don't check for unsupported translation strings (faster) - e = display extended information on corrupted messages - -An example command line: - -CHKSMB /QP C:\SBBS\DATA\SUBS\*.SHD - -would check all the message bases in the C:\SBBS\DATA\SUBS directory, without -beeping on errors, and pausing after an errored message base. - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 71 CHKSMB - - -FIXSMB -====== - -FIXSMB is a utility that will rebuild the index and allocation files for a -message base. Since the message headers are not necessarily stored -sequentially, the order of the messages in the index may be changed when the -index is rebuilt. Messages are also re-numbered, so only use this program if -the index is corrupted and the messages are extremely important. - -C source code for FIXSMB is also included as an example to programmers of how -to use SMBLIB functions. - -The usage syntax is as follows: - -FIXSMB [/M] smb_file - -An example command line: - -FIXSMB \SBBS\DATA\MAIL - -Only use the "/M" command line switch if fixing an older Synchronet e-mail -message base (created with SBBS v2.1 or earlier). Once the SMB_EMAIL status -attr is set ("SMBUTIL S" will report a status attr of 1), the "/M" is not -required. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 72 FIXSMB - - -SMBLIB -====== - -SMBLIB is a library of C functions for accessing and storing messages in an -SMB format message base. It can eliminate much of the development time for -developers that wish to use the library in whole or in part, or use the -functions as examples for their own message base function library. The library -consists of the following files: - -SMBDEFS.H Constant definitions, macros, and data types -SMBLIB.H Library constants and function prototypes -SMBLIB.C Function definitions -SMBVARS.C Global variable definitions (doubles as declaration file) - -For developers to use this library with their program, they must include the -"SMBLIB.H" header file at the top of each C file that uses any of the library -functions, global variables, data types, macros, and constants. This can be -done by simply adding the following line to each .C file: - -#include "smblib.h" - -If SMBLIB.H is included, there is no need to include SMBDEFS.H or SMBVARS.C. - -To link the library functions and variables with a main program, the files -SMBVARS.OBJ and SMBLIB.OBJ must be linked with the main program .OBJ files. -If the operating system is DOS, be sure that all .OBJ files are compiled for -the same memory model. - -Example MAKEFILEs for compiling and linking SMBUTIL with Borland C/C++ -(SMBUTIL.BOR) and Watcom C/C++ (SMBUTIL.WAT) are included. - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 73 SMBLIB - - -SMBDEFS.H -========= - -The SMBDEFS.H file contains important constant definitions and data types (also -defined in this document). If ever this document and SMBDEFS.H are inconsistent -with each other, then SMBDEFS.H is to be considered correct and this document -in error. If such a discrepency is found, please notifiy Digital Dynamics so it -can be corrected in a future revision of the specification. - -Most notable of the data types is a structure called smbmsg_t (not defined -in this document). It contains the fixed and variable portions of a message's -header record as well as convenience pointers to the sender's name -(smbmsg_t.to), recipient's name (smbmsg_t.from), network addresses, and more. -If multiple SENDER header fields are included (for example), then smbmsg_t.to -will point to the last SENDER header field in the header record. Convenience -pointers for other data items work in the same fasion if multiple header fields -of the same type exist in the header record. - -Variables of the smbmsg_t data type (and pointers to variables of smbmsg_t -type) are used as arguments to many of the SMBLIB functions. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 74 SMBDEFS.H - - -SMBVARS.C -========= - -The SMBVARS.C file contains definitions of the global variables used by the -SMBLIB functions. It is a fairly small file since their are a small number of -global variables (by design). This file is used for both definitions and -declarations, so no "extern" declarations need to be made in developers source -code as long as SMBVARS.C or (preferably) SMBLIB.H is included in the source -code. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 75 SMBVARS.C - - -SMBLIB.H -======= - -The SMBLIB.H file contains prototypes of all the functions in the SMBLIB.C -file. It is necessary to include this file in C source code if any of the -SMBLIB functions are used. The following C source line will include this file: - -#include "smblib.h" - -and should be placed near the top of all C source files that use SMBLIB -functions, variables, constants, or data types. - -Function prototypes are necessary for compilers to know the correct calling -syntax of a function and detect incorrect usage. Prototypes are also useful -as a quick reference for programmers as to the correct calling syntax of a -specific function. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 76 SMBLIB.H - - -SMBLIB.C -======= - -The SMBLIB.C file contains the actual SMBLIB library functions. This source -file is not a stand alone program, but instead must be compiled and linked -with a main source file to create the executable program. - -The functions in this file are organized in a logical order, but their order -is actually irrelevant to the compiling, linking, and execution of the -resulting program. - -A comment block preceeds each function, explaining what the function does, -how the passed parameters are used, and what the return code (if any) -indicates. A more detailed explanation of each function is included here: - -int smb_open(int retry_time) ----------------------------- -The smb_open() function must be called before the message base is accessed -(read from or written to). The parameter, retry_time, is the maximum number -of seconds to wait while retrying to lock the message base header. If -retry_time is 0, then the message base header is not locked or read (this is -called "Fast Open" and should only be used when speed is more important than -checking for compatibility and validity upon opening). The global variable -smb_file must be initialized with the path and base filename of the message -base. This function returns 0 on success, 1 if the .SDT file could not be -opened, 2 if the .SHD file could not be opened, and 3 if the .SID file could -not be opened. If the message base header could not be locked, this function -returns -1. If the message base ID is incorrect, it returns -2. And if the -message base is of an incompatible version, it returns -3. - -The errno global variable (standard of most C libraries) will most likely -contain the error code for open failure. - -int smb_open_da(int retry_time) -------------------------------- -The smb_open_da() function is used to open the data block allocation file for -writing messages to a message base. The parameter, retry_time, is the maximum -number of seconds to wait while retrying to open the file. This function -returns 0 on success. -1 is returned if an open error other than "Access -Denied" is returned from the operating system, and the global variable errno -will contain the error code. -2 is returned if the retry_time has been -reached, and -3 is returned if the file descriptor could not be converted to -a stream by the fdopen() function. - -fclose(sda_fp) should be called immediately after all necessary file access -has been completed. - -This function is not used with the Hyper Allocation storage method. - - - - - - - -_______________________________________________________________________________ -Synchronet 77 SMBLIB.C - - -int smb_open_ha(int retry_time) -------------------------------- -The smb_open_ha() function is used to open the header block allocation file for -writing messages to a message base. The parameter, retry_time, is the maximum -number of seconds to wait while retrying to open the file. This function -returns 0 on success. -1 is returned if an open error other than "Access -Denied" is returned from the operating system, and the global variable errno -will contain the error code. -2 is returned if the retry_time has been -reached, and -3 is returned if the file descriptor could not be converted to -a stream by the fdopen() function. - -fclose(sha_fp) should be called immediately after all necessary file access -has been completed. - -This function is not used with the Hyper Allocation storage method. - -int smb_create(ulong max_crcs, ulong max_msgs, ushort max_age, ushort attr - ,int retry_time) --------------------------------------------------------------------------- -The smb_create() function is used to create a new message base or reset an -existing message base. The parameters max_crcs, max_msgs, max_age, and attr -are used to set the initial status of the message base status header. The -parameter, retry_time is the maximum number of seconds to wait while retrying -to lock the message base header. This functions returns 0 on success or 1 if -the message base header could not be locked. - -int smb_trunchdr(int retry_time) --------------------------------- -The smb_trunchdr() function is used to truncate the header file when packing -the message base and writing the new header information back to the header -file. The parameter, retry_time is the maximum number of seconds to wait while -retrying to truncate the header file. Returns 0 on success, -1 if error was -other than "Access Denied", or -2 if retry_time reached. - -int smb_locksmbhdr(int retry_time) ----------------------------------- -The smb_locksmbhdr() function is used to lock the first message base (status) -header. The parameter, retry_time is the number of seconds to wait while -retrying to lock the header. The smb_unlocksmbhdr() function should always be -used to unlock the header after accessing the message base header (usually -with smb_getstatus() and/or smb_putstatus()). Returns 0 if successful, -1 if -unsuccessful. - -int smb_unlocksmbhdr() ----------------------- -The smb_unlocksmbhdr() function is used to unlock a previously locked message -base header (using smb_lockmsghdr()). Returns 0 on success, non-zero on -failure. - -int smb_getstatus(smbstatus_t *hdr) ------------------------------------ -The smb_getstatus() function is used to read the status message base header -into the hdr structure. Returns 0 on success, 1 on failure. - - -_______________________________________________________________________________ -Synchronet 78 SMBLIB.C - - -int smb_putstatus(smbstatus_t hdr) ----------------------------------- -The smb_putstatus() function is used to write the status information to the -first message base header. The parameter hdr, contains the status information -to be written. Returns 0 on success, 1 on failure. - -int smb_getmsgidx(smbmsg_t *msg) --------------------------------- -The smb_getmsgidx() function is used to get the byte offset for a specific -message header in the message header file based on the message base index. - -If msg->hdr.number is non-zero when this function is called, then the index -will be searched for this message number. If the message number is found in -the index, the msg->idx.offset is set to the byte offset of the message header -record in the header file and msg->offset is set to the record offset of the -index record in the index file, and the function returns 0. If the message -number is not found in the index, the function returns 1. - -If msg->hdr.number is zero, msg->idx.offset and msg->idx.number are obtained -from the index record at record offset msg->offset. If msg->offset is an -invalid record offset when this function is called, the function returns 1. -Otherwise, the function returns 0. - -int smb_getlastidx(idxrec_t *idx) ---------------------------------- -Reads the last index record of the currently open message base into the -idxrec_t structure pointed to by idx. Returns 0 if successful, -1 if the index -is empty or unopened, or -2 if the record can't be read. - -int smb_getmsghdrlen(smbmsg_t msg) ----------------------------------- -The smb_getmsghdrlen() function is used to calculate the total length of -message header msg including both fixed and variable length portions. This -function returns the length of the header record in bytes. - -long smb_getmsgdatlen(smbmsg_t msg) ------------------------------------ -The smb_getmsgdatlen() function is used to calculate the total length of the -data for message msg. This function returns the length of all data fields -combined. - -int smb_lockmsghdr(smbmsg_t msg, int retry_time) ------------------------------------------------- -The smb_lockmsghdr() function is used to lock the header record for message -msg. The parameter retry_time is the maximum number of seconds to wait while -retrying to lock the header. Returns 0 on success, -1 on failure. The function -smb_unlockmsghdr() should immediately be called after accessing the message -header (usually with smb_getmsghdr() or smb_putmsghdr()). - - - - - - - -_______________________________________________________________________________ -Synchronet 79 SMBLIB.C - - -int smb_getmsghdr(smbmsg_t *msg) --------------------------------- -The function smb_getmsghdr() is used to read the header record for message -msg. msg->idx.offset must be initialized to the byte offset of the header -record in the header file before this function is called. The function -smb_freemsgmem() must be called to free the memory allocated by this function -for the header and data felds. This function returns 0 on success, -1 if -the fixed portion of the message header record could not be read, -2 if the -message header ID was incorrect, -3 if memory could not be allocated, -4 -if a data field could not be read, -5 if the fixed length portion of a header -field could not be read, -6 if the variable length portion of a header field -could not be read, -7 if one or more of the mandatory header fields (SENDER, -RECIPIENT, or SUBJECT) are missing, -8 if total_dfields extends beyond the -end of the header record, or -9 if incompatible header version. - -Several convenience pointers in the msg structure are initialized by this -function to point to the last occurance of the SENDER (msg->from), RECIPIENT -(msg->to), SUBJECT (msg->subj), etc. - -int smb_unlockmsghdr(smbmsg_t msg) ----------------------------------- -The smb_unlockmsghdr() function is used to unlock a previously locked message -header (with smb_lockmsghdr()). This function returns 0 on success, non-zero -on failure. - -int smb_addcrc(ulong max_crcs, ulong crc, int retry_time) ---------------------------------------------------------- -The smb_addcrc() function is used to add a CRC-32 to the CRC history file -for a message base, automatically checking for duplicates. The parameter -max_crcs should be the max_crcs defined in the status header of the message -base. The parameter crc, is the CRC-32 of the TEXT_BODY and TEXT_SOUL data -fields for the message. The parameter retry_time is the maximum number of -seconds to wait when retrying to open the CRC history file. - -This function returns -1 if there was an open error, -2 if the retry_time -was reached, -3 if there was a memory allocation error, 1 if the CRC already -exists in the CRC history file (indicating a duplicate message), or 0 on -success (and no duplicate). - -int smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data) ---------------------------------------------------------------------- -The smb_hfield() function is used to add a header field to the structure msg. -The parameters type, length, and data, must be specified according to the -header field values listed in this specification. This function returns 0 -on success, non-zero on memory allocation error. The function smb_freemsgmem() -must be called to free the memory allocated by this function. - -int smb_dfield(smbmsg_t *msg, ushort type, ulong length) --------------------------------------------------------- -The smb_dfield() function is used to add a data field to the structure msg. -The parameters type and length must be specified according to the data field -values listed in this specification. This function returns 0 on success, -non-zero on memory allocation error. The function smb_freemsgmem() must be -called to free the memory allocated by this function. - -_______________________________________________________________________________ -Synchronet 80 SMBLIB.C - - -int smb_addmsghdr(smbmsg_t *msg,smbstatus_t *status,int storage,int retry_time) -------------------------------------------------------------------------------- -The smb_addmsghdr() function is used to add a new message header to the message -header file and update the index file. The msg and status structures are -updated to reflect the new total messages, last message number, etc. The -storage parameter is used to indicate the storage method to use (either -SMB_SELFPACK, SMB_FASTALLOC, or SMB_HYPERALLOC). If the storage type is -SMB_SELFPACK, the header block allocation file will be searched for unused -block(s) to store this header. If the storage type is SMB_FASTALLOC or -SMB_HYPERALLOC, the header is stored at the end of the header file. Returns 0 -on success, non-zero on failure. The parameter retry_time is the maximum number -of seconds to wait while retrying to lock and open files. - -int smb_putmsg(smbmsg_t msg) ----------------------------- -The smb_putmsg() function calls both the smb_putmsghdr() and smb_putmsgidx() -functions to write the header and index elements of a message to the -appropriate files. Returns 0 on success, non-zero on failure. - -int smb_putmsgidx(smbmsg_t msg) -------------------------------- -The smb_putmsgidx() function is used to store a message index in the message -index file. The message index can be for a new message or an existing -message. Returns 0 on success, non-zero on failure. - -int smb_putmsghdr(smbmsg_t msg) -------------------------------- -The smb_putmsghdr() function is used to store a message header in the message -header file. The message header can be for a new message or an existing -message. Returns 0 on success, non-zero on failure. - -void smb_freemsgmem(smbmsg_t msg) ---------------------------------- -Frees allocated memory for the header and data fields in the msg structure. -This function must be called to free the memory allocated by the functions -smb_hfield(), smb_dfield(), and smb_getmsghdr(). - -long smb_hdrblocks(ulong length) --------------------------------- -The smb_hdrblocks() function is used to calculate the number of blocks -required to store a message header of length size (in bytes). This function -returns the number of blocks required. - -long smb_datblocks(ulong length) --------------------------------- -The smb_datblocks() function is used to calculate the number of blocks -required to store message data of length size (in byte). This function returns -the number of blocks required. - - - - - - - -_______________________________________________________________________________ -Synchronet 81 SMBLIB.C - - -long smb_allochdr(ulong length) -------------------------------- -The smb_allochdr() function is used to search for free blocks to store a -message header of length bytes and mark the free blocks as allocated in the -header allocation file. This function returns the byte offset to the header -record or a negative number on error. The function smb_open_ha() should be -called prior to calling this function and fclose(sha_fp) should be called -after. The function is called from smb_addmsghdr(), so you probably have no -need to call this function directly. - -long smb_fallochdr(ulong length) --------------------------------- -The smb_fallochdr() function works exactly the same as the smb_allochdr() -function except it is much faster because the header allocation file is not -searched for free blocks. The function is called from smb_addmsghdr(), so you -probably have no need to call this function directly. - -long smb_hallochdr(ulong header_offset) ---------------------------------------- -This smb_hallochdr() functions works exactly the same as the smb_fallochdr() -function except the status.header_offset is passed as the argument and the -header allocation (.SHA) file is not updated so smb_open_ha() need not be -called. The function is called from smb_addmsghdr(), so you probably have no -need to call this function directly. - -long smb_allocdat(ulong length, ushort headers) ------------------------------------------------ -The smb_allocdat() function is used to search for free blocks to store length -amount of data for a message. The parameter headers, indicates the number of -message headers that are associated with this data. Normally, the headers -parameter will be 1, unless this message is part of a mass mailing. The offset -to the allocated data blocks is returned, or a negative value on error. The -function smb_open_da() should be called prior to calling this function and -fclose(sda_fp) should be called after. - -long smb_fallocdat(ulong length, ushort headers) ------------------------------------------------- -The smb_fallocdat() function works exactly the same as the smb_allocdat() -function except it is much faster because the data allocation file is not -searched for free blocks. - -long smb_hallocdat() --------------------- -The smb_hallocdat() function works exactly the same as the smb_hallocdat() -function except no argument is passed and the data allocation file (.SDA) is -not updated so smb_open_da() need not be called. - - - - - - - - - -_______________________________________________________________________________ -Synchronet 82 SMBLIB.C - - -int smb_incdat(ulong offset, ulong length, ushort headers) ----------------------------------------------------------- -The smb_incdat() function is used to increment the header counter in the data -allocation file for the data starting at the byte offset and length size in -bytes. The parameter headers, indicates the number of headers to add to the -current allocation value in the data allocation file. Returns 0 on success, -non-zero on failure. - -int smb_freemsg(smbmsg_t msg, smbstatus_t status) -------------------------------------------------- -The smb_freemsg() function is used to free the disk space allocated for the -header and data fields of the message msg. Returns 0 on success, non-zero on -failure. The parameter, status, must be the current status from the message -base header for this message base. - -int smb_freemsgdat(ulong offset, ulong length, ushort headers) --------------------------------------------------------------- -The smb_freemsgdat() function is used to decrement the data block allocation -records in the data allocation file associated with the data in the data file -by the value of the headers parameter (normally 1). The parameter offset -indicates the byte offset to the beginning of the message data in the data -file and the parameter length is the total length of the message data. -Returns 0 on success, non-zero on failure. - -int smb_freemsghdr(ulong offset, ulong length) ----------------------------------------------- -The smb_freemsghdr() function is used to set the header block allocation -records in the header allocation file to 0 (indicated non-allocated block). -The parameter offset indicates the byte offset to the beginning of the header -record being freed and the parameter length indicates the total length of the -header record. Returns 0 on success, non-zero on failure. - -int smb_stack(int op) ---------------------- -The smb_stack() function is used to save and restore message base information -so that multiple message bases can be open simultaneously. The stack can -save up to 4 message bases (allowing 5 simultaneously open message bases). -The stack is a "last in, first out" storage area for open message bases. -If the op parameter is SMB_STACK_PUSH, smb_stack() will save (push) the current -message base onto the stack. Calling smb_stack(SMB_STACK_POP) will restore -(pop) the most recently pushed message base off the stack. Calling -smb_stack(SMB_STACK_XCHNG) will exchange the most recently pushed message base -and the current message base (replacing the top of the stack with the current -message base). - -void smb_close() ----------------- -Closes the header, data, and index files for the currently open message base. - - - - - - - -_______________________________________________________________________________ -Synchronet 83 SMBLIB.C - - -Miscellaneous SMBLIB Files -========================== - -CRC32.H C header file for CRC-32 calculations ------------------------------------------------------ -This file contains a static 32-bit CRC table (crc32tbl[]) and a macro (ucrc32) -that uses this table to calculate 32-bit CRCs one byte at a time. - -Example: - - ulong crc=0xffffffff; - -for(i=0;i<length;i++) - crc=ucrc32(buf[i],crc); -crc=~crc; - - -CRC16.C C functions for 16-bit CRC calculations -------------------------------------------------------- -This file contains a function (ucrc16), to calculate 16-bit CRCs one byte at a -time and a function (crc16) that uses the ucrc16() function to calculate the -16-bit CRC of an ASCIIZ character string. - -Example: - - ushort crc; - -crc=crc16("Text"); - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 84 Miscellaneous SMBLIB Files - - -LZH.H Function prototypes for LZH.C ---------------------------------------------- -This file contains function prototypes for the two most important functions -in LZH.C, lzh_encode() and lzh_decode(). - -Example: - - uchar str[256],lzh[512]; - long length; - -strcpy(str,"This is a string of text"); -length=lzh_encode(str,strlen(str),lzh); -lzh_decode(lzh,length,str); - - -LZH.C C functions for LZH encoding (compression/decompression) ------------------------------------------------------------------------- -This file contains the functions for encoding and decoding LZH compressed -data. If the macro LZH_DYNAMIC_BUF is defined when this file is compiled, -temporary buffers will be dynamically allocated as opposed to static. This -may be slower than the static buffer method, but frees the allocated memory -after encoding or decoding. If free memory for your application is an issue, -then define this macro when compiling this file. - -Example (Borland C): - -bcc -c -DLZH_DYNAMIC_BUF lzh - -Example (Watcom C): - -wcc -dLZH_DYNAMIC_BUF lzh - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 85 Miscellaneous SMBLIB Files - - -SMBLIB Storage Example -====================== - -#include "smblib.h" -#include "crc16.c" - -int main(void) -{ - char str[256] // General purpose string - ,*msg_text="Hello, world!" // Message text - ,nul_buf[SDT_BLOCK_LEN]={0} // NULL initialized buffer - ; - int i // General purpose integer - ,storage=SMB_SELFPACK // Default storage method - ,retry=10 // Retry for opening/locking files - ; - ushort max_age=0 // Default maximum age of messages - ,xlat=XLAT_NONE // Translation string - ,tzone=PST // Time zone - ,copies=1 // Number of copies of this msg - ; - ulong max_msgs=500 // Default max number of msgs - ,max_crcs=0 // Default max crcs - ,length // Length of msg text - ,offset // Offset to msg text in data file - ; - smbmsg_t msg; // Message structure - smbstatus_t status; // Message base status record - -strcpy(smb_file,"MSGBASE"); // We'll use "MSGBASE" for the name -if((i=smb_open(retry))!=0) { // Can't open!?! - printf("smb_open returned %d\n",i); - return(1); } - -if(!filelength(fileno(shd_fp))) // Message base not created yet - smb_create(max_crcs // Create with default settings - ,max_msgs - ,max_age - ,storage==SMB_HYPERALLOC - ? SMB_HYPERALLOC : 0 // SMB_EMAIL if this was e-mail - ,retry - ); - -if((i=smb_locksmbhdr(retry))!=0) { // Can't lock status base header - printf("smb_locksmbhdr returned %d\n",i); - smb_close(); - return(1); } - -if((i=smb_getstatus(&status))!=0) { // Can't read status base header - smb_unlocksmbhdr(); - smb_close(); - printf("smb_getstatus returned %d\n",i); - return(1); } - - -_______________________________________________________________________________ -Synchronet 86 SMBLIB Storage Example - - -if(status.attr&SMB_HYPERALLOC) - storage=SMB_HYPERALLOC; -else - storage=SMB_SELFPACK; - -length=strlen(msg_text); // Get length of message -length+=sizeof(xlat); // Add length of xlat string - -if(storage==SMB_HYPERALLOC) // Allocate space for message text - offset=smb_hallocdat(); -else { - if((i=smb_open_da(retry))!=0) { - smb_unlocksmbhdr(); - printf("smb_open_da returned %d\n",i); - smb_close(); - return(1); } - if(storage==SMB_FASTALLOC) - offset=smb_fallocdat(length,copies); - else - offset=smb_allocdat(length,copies); - fclose(sda_fp); } - -fseek(sdt_fp,offset,SEEK_SET); // Seek to beginning of data block -fwrite(&xlat,sizeof(xlat),1,sdt_fp); // Write xlat string -fwrite(msg_text,strlen(msg_text),1,sdt_fp); // Write message text -fwrite(nul_buf,SDT_BLOCK_LEN-length // Write NULLs out to end of block - ,1,sdt_fp); -fflush(sdt_fp); // Flush output buffer -smb_unlocksmbhdr(); // Unlock status base header - -memset(&msg,0,sizeof(smbmsg_t)); // Initialize header to NULL -memcpy(msg.hdr.id,"SHD\x1a",4); // Always set to SHD^Z -msg.hdr.version=SMB_VERSION; -msg.hdr.when_written.time=time(NULL); -msg.hdr.when_written.zone=tzone; -msg.hdr.when_imported.time=time(NULL); -msg.hdr.when_imported.zone=tzone; -msg.hdr.offset=offset; - -strcpy(str,"All"); // Send message to "All" -if((i=smb_hfield(&msg,RECIPIENT,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_close(); - return(1); } -strlwr(str); // If this were e-mail, idx.to -msg.idx.to=crc16(str); // would be the "to" user number - - - - - - - - -_______________________________________________________________________________ -Synchronet 87 SMBLIB Storage Example - - -strcpy(str,"Sysop"); // Send message from "Sysop" -if((i=smb_hfield(&msg,SENDER,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } -strlwr(str); // If this were e-mail, idx.from -msg.idx.from=crc16(str); // would be the "from" user number - -strcpy(str,"This is a test"); // Set the message subject/title -if((i=smb_hfield(&msg,SUBJECT,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } -strlwr(str); -msg.idx.subj=crc16(str); - -if((i=smb_dfield(&msg,TEXT_BODY,length))!=0) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } - -if((i=smb_addmsghdr(&msg,&status,storage,retry))!=0) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } - -smb_freemsgmem(msg); // Unnecessary if exiting main() -smb_close(); // Unnecessary if exiting main() -return(0); -} - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 88 SMBLIB Storage Example - - -SMBLIB Retrieval Example -======================== - -#include "smblib.h" - -int main(void) -{ - char ch; // General purpose character - int i, // General purpose integer - retry=10; // Retry for opening/locking files - ushort xlat; // Translation string - ulong l; // General purpose long integer - smbmsg_t msg; // Message structure - -strcpy(smb_file,"MSGBASE"); // We'll use "MSGBASE" for the name -if((i=smb_open(retry))!=0) { // Can't open!?! - printf("smb_open returned %d\n",i); - return(1); } - -if(!filelength(fileno(shd_fp))) { // Message base not created yet - printf("Empty\n"); - smb_close(); - return(0); } - -for(msg.offset=0;!ferror(sid_fp);msg.offset++) { - - fseek(sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) - break; - - if((i=smb_lockmsghdr(msg,retry))!=0) { - printf("smb_lockmsghdr returned %d\n",i); - break; } - if((i=smb_getmsghdr(&msg))!=0) { - smb_unlockmsghdr(msg); - printf("smb_getmsghdr returned %d\n",i); - break; } - if((i=smb_unlockmsghdr(msg))!=0) { - smb_freemsgmem(msg); - printf("smb_unlockmsghdr returned %d\n",i); - break; } - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 89 SMBLIB Retrieval Example - - - printf("Subj : %s\n",msg.subj); - printf("To : %s\n",msg.to); - printf("From : %s\n",msg.from); - printf("Date : %s\n",ctime((time_t *)&msg.hdr.when_written.time)); - - for(i=0;i<msg.hdr.total_dfields;i++) - switch(msg.dfield[i].type) { - case TEXT_BODY: // Only show BODY and TAIL data fields - case TEXT_TAIL: - fseek(sdt_fp,msg.hdr.offset+msg.dfield[i].offset - ,SEEK_SET); - fread(&xlat,sizeof(xlat),1,sdt_fp); - if(xlat!=XLAT_NONE) // No translations supported - continue; - for(l=sizeof(xlat);l<msg.dfield[i].length;l++) { - ch=fgetc(sdt_fp); - if(ch) - putchar(ch); } - printf("\n"); - break; } - printf("\n"); - - smb_freemsgmem(msg); } // Free memory allocated by smb_getmsghdr() - -smb_close(); -return(0); -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 90 SMBLIB Retrieval Example - - -SMBLIB Performance Issues -========================= - -Since importing messages is the usually the most time consuming task likely -undertaken by an SMB application, it is also the most susceptable to design -issues that effect performance. - -Opening and Closing -------------------- -When importing multiple messages for a single message base, it appears logical -to open the message base, import all the messages, then close it. This indeed -is preferred over opening and closing the message base for each message. - -When importing multiple messages for possibly non-consecutive message bases, -developers may eaily make the mistake of opening and closing the message base -for each message. This is not necessary and can considerably hinder the -import performance. The easiest solution is to only close the message base and -open a new one if the next message to be imported is not for the same message -base as the previously imported message. Example: - -smb_file[0]=0; -for(i=0;i<total_messages_to_be_imported;i++) { - if(stricmp(get_messagebase_for_this_message(i),smb_file)) { - if(smb_file[0]) /* We've already opened one */ - smb_close(); - strcpy(smb_file,get_messagebase_for_this_message(i)); - smb_open(10); } - /* Import this message */ - } -if(smb_file[0]) - smb_close(); - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 91 SMBLIB Performance Issues - - -A more advanced method is to keep multiple message bases open at the same time. -Due to the likely limitation of total file handles on the system, it is -suggested to keep the number of simultaneously open message bases at or below -3. SMBLIB includes the function smb_stack() to easily "push" and "pop" message -bases without closing them (push is the equivalent to "save" and pop is the -equivalent to "restore"). The downside of this function is that you cannot -access message bases on the stack without actually popping them off (in reverse -of the order they were pushed). You can however "exchange" the current message -base with the message base on the top of the stack (most recently pushed). -To intelligently juggle more than two open message bases, the developer should -create their own equivalent of the smb_stack() function so they can access the -message bases on the stack without popping them off. An example of keeping a -maximum of two message bases open using smb_stack(): - - char last_messagebase[128],new_messagebase[128]; - -smb_file[0]=0; -last_messagebase[0]=0; -for(i=0;i<total_messages_to_be_imported;i++) { - strcpy(new_messagebase,get_messagebase_for_this_message(i)); - if(stricmp(new_messagebase,smb_file)) { /* Not current message base */ - if(smb_file[0]) { /* We've already opened one */ - if(!stricmp(new_messagebase,last_messagebase)) { /* Same as last */ - strcpy(last_messagebase,smb_file); - smb_stack(SMB_STACK_XCHNG); } /* Retore previous base */ - else { - if(last_messagebase[0]) { - smb_stack(SMB_STACK_XCHNG); - smb_close(); - strcpy(last_messagebase,new_messagebase); } - else { - strcpy(last_messagebase,smb_file); - smb_stack(SMB_STACK_PUSH); } /* Save current base */ - strcpy(smb_file,new_messagebase); - smb_open(10); } } - else { - strcpy(smb_file,new_messagebase); - smb_open(10); } } - /* Import this message */ - } -if(smb_file[0]) - smb_close(); -if(last_messagebase[0]) { - smb_stack(SMB_STACK_POP); - smb_close(); } - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 92 SMBLIB Performance Issues - - -The second example would be of negligible performance gain over the first -example (6 open operations versus 7) if the messages to import were in the -following order: - -msg[0] --> msgbase[0] // 0 opened -msg[1] --> msgbase[1] // 0 pushed 1 opened -msg[2] --> msgbase[1] -msg[3] --> msgbase[2] // 1 closed 0 popped 0 closed 2 opened -msg[4] --> msgbase[0] // 2 pushed 0 opened -msg[5] --> msgbase[2] // 0 pushed 2 popped (exchanged) -msg[6] --> msgbase[3] // 2 closed 0 popped 0 closed 3 opened -msg[7] --> msgbase[0] // 3 pushed 0 opened - -The second example would be of significant performance gain over the first -example (4 open operations versus 8) if the messages to import were in the -following order: - -msg[0] --> msgbase[0] // 0 opened -msg[1] --> msgbase[1] // 0 pushed 1 opened -msg[2] --> msgbase[0] // 1 pushed 0 popped (exchanged) -msg[3] --> msgbase[1] // 0 pushed 1 popped (exchanged) -msg[4] --> msgbase[0] // 1 pushed 0 popped (exchanged) -msg[5] --> msgbase[2] // 0 pushed 1 popped (exchanged) 1 closed 2 opened -msg[6] --> msgbase[3] // 2 pushed 0 popped (exchanged) 0 closed 3 opened -msg[7] --> msgbase[2] // 3 pushed 2 popped (exchanged) - -More advanced use of "stack-like" message base file handle storage can easily -reduce the number of open operations, therefore increasing import performance -under more adverse message base ordering conditions. - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 93 SMBLIB Performance Issues - - -Compression ------------ -If any message data compression features are offered by the application, it -is important the the application not unnecessarily compress data that will -not save any storage space. While this may seem an obvious statement, please -review the following pseudo-code example: - -if ( message_data_length < SDT_BLOCK_LEN ) - // Store uncompressed data -else { - // Compress data - if ( ( compressed_data_length / SDT_BLOCK_LEN ) - < ( message_data_length / SDT_BLOCK_LEN ) ) // Saves a block or more - // Store compressed data - else - // Store uncompressed data - } - -Since the SMB format stores message data in fixed length blocks, there is no -point in storing a message in compressed format if it requires the same number -of blocks as the uncompressed format (i.e. a message that is two blocks in -length in uncompressed format and only a block and a half in length when -compressed should not be stored in compressed format since it still requires -two full blocks of storage). It is important to note that in the above example, -the length of the data translation string was not taken into account in -determining the number of required blocks. Also, the smb_datblocks() function -is normally used in determing the number of required blocks to store a given -data length and it is a little more involved than simply dividing the length of -the data by SDT_BLOCK_LEN. - - - - - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 94 SMBLIB Performance Issues - - -Bibliography -============ - -Title : The C Programming Language -Publisher : Prentice Hall -Author : Brian W. Kernighan and Dennis M. Ritchie - -Document : ARPANET Request for Comments (RFC) #822 -Title : Standard for the Format of ARPA Internet text messages -Publisher : SRI International -Author : David H. Crocker, University of Delaware - -Document : FTS-0001 -Publisher : FSC -Author : Randy Bush, Pacific Systems Group - -Document : FTS-0004 -Title : EchoMail Specification -Publisher : FSC -Author : Bob Hartman - -Document : FTS-0009 -Title : A standard for unique message identifiers and reply chain linkage -Publisher : FSC -Author : Jim Nutt - -Document : FSC-00046 -Title : A Product Idenfifier for FidoNet Message Handlers -Publisher : FSC -Author : Joaquim H. Homrighausen - -Document : FSC-00053 -Title : Specifications for the ^aFLAGS field -Publisher : FSC -Author : Joaquim H. Homrighausen - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 95 Bibliography - - -Implementations -=============== - -Product : Synchronet Multinode BBS Software -Developer : Digital Dynamics -Level : III -Version : 2.20 - -Product : Synchronet/FidoNet Import/Export Utility (SBBSFIDO) -Developer : Digital Dynamics -Level : III -Version : 2.23 - -Product : Synchronet UTI (Universal Text Interface) Driver -Developer : Digital Dynamics -Level : III -Version : 2.23 - -Product : SBBSecho FidoNet Packet Tosser for Synchronet -Developer : Digital Dynamics -Level : III -Version : 1.11 - -Product : NetXpress Internet UUCP for Synchronet -Developer : Merlin Systems -Level : II -Version : 1.50 - -Product : InterEcho FidoNet Packet Tosser -Developer : InterMail Sales Inc -Level : II -Version : 1.11 - - - - - - - - - - - - - - - - - - - - - - -_______________________________________________________________________________ -Synchronet 96 Index - - diff --git a/src/sbbs2/smb/121a/smb_read.me b/src/sbbs2/smb/121a/smb_read.me deleted file mode 100644 index b1c1ec64d7..0000000000 --- a/src/sbbs2/smb/121a/smb_read.me +++ /dev/null @@ -1,65 +0,0 @@ -Synchronet Message Base (SMB) Specification v1.21 - READ.ME - -============================================================= - -Files: - - Miscellaneous - ------------- - SMB_READ.ME This file - FILE_ID.DIZ Description of archive - SMB.HST History of changes made since v1.00 - - Technical Specification - ----------------------- - SMB.PRN Paginated, to be printed at 12cpi (!) - SMB.TXT Not paginated, for online viewing - - Message Base C Library - ---------------------- - SMBDEFS.H C data types and constants - SMBVARS.C C global variables - SMBLIB.H C function prototypes - SMBLIB.C C library functions - CRC32.H C header file for 32-bit CRC calculations - CRC16.C C source file for 16-bit CRC calculations - LZH.H C header file for LZH compression functions - LZH.C C source file for LZH compression functions - - Message Base Utility - -------------------- - SMBUTIL.H C header file - SMBUTIL.C C source file - SMBUTIL.BOR C makefile (for Borland C: make -f smbutil.bor) - SMBUTIL.WAT C makefile (for Watcom C: wmake -f smbutil.wat - 32-bit OS2: wmake -f smbutil.wat OS=OS2 - 32-bit DOS: wmake -f smbutil.wat OS=DOSX) - SMBUTIL.EXE Compiled and linked for 16-bit DOS - - Check Message Base for Corruption - --------------------------------- - CHKSMB.C C source file - CHKSMB.MAK C makefile (for Borland C: make -f chksmb) - CHKSMB.EXE Compiled and linked for 16-bit DOS - - Rebuild Message Base Index and Allocation Files - ----------------------------------------------- - FIXSMB.C C source file - FIXSMB.MAK C makefile (for Borland C: make -f fixsmb) - FIXSMB.EXE Compiled and linked for 16-bit DOS - - Convert from FidoNet (FTSC-1) to SMB - ------------------------------------ - FIDO2SMB.C C source file - FIDO2SMB.MAK C makefile (for Borland C: make -f fido2smb) - - Convert from Internet (RFC-822) to SMB - -------------------------------------- - INET2SMB.C C source file - INET2SMB.MAK C makefile (for Borland C: make -f inet2smb) - - Convert from QWK to SMB - ----------------------- - QWK2SMB.C C source file - QWK2SMB.MAK C makefile (for Borland C: make -f qwk2smb) - -/* END of SMB_READ.ME */ diff --git a/src/sbbs2/smb/121a/smbdefs.h b/src/sbbs2/smb/121a/smbdefs.h deleted file mode 100644 index 71791e6952..0000000000 --- a/src/sbbs2/smb/121a/smbdefs.h +++ /dev/null @@ -1,449 +0,0 @@ -/* SMBDEFS.H */ - -#ifndef _SMBDEFS_H -#define _SMBDEFS_H - -/**********/ -/* Macros */ -/**********/ - -#define SMB_VERSION 0x0121 /* SMB format version */ - /* High byte major, low byte minor */ -#define SMBLIB_VERSION "1.21a" /* SMB library version */ - - /* Control characters */ -#define TAB 0x09 /* Horizontal tabulation ^I */ -#define LF 0x0a /* Line feed ^J */ -#define FF 0x0c /* Form feed ^L */ -#define CR 0x0d /* Carriage return ^M */ -#define ESC 0x1b /* Escape ^[ */ -#define SP 0x20 /* Space */ - -#define ulong unsigned long -#define ushort unsigned short -#define uchar unsigned char -#define uint unsigned int - -/****************************************************************************/ -/* Memory allocation macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) -# define HUGE16 huge -# define FAR16 far -# if defined(__TURBOC__) -# define REALLOC(x,y) farrealloc(x,y) -# define LMALLOC(x) farmalloc(x) -# define MALLOC(x) farmalloc(x) -# define LFREE(x) farfree(x) -# define FREE(x) farfree(x) -# elif defined(__WATCOMC__) -# define REALLOC realloc -# define LMALLOC(x) halloc(x,1) /* far heap, but slow */ -# define MALLOC malloc /* far heap, but 64k max */ -# define LFREE hfree -# define FREE free -# else /* Other 16-bit Compiler */ -# define REALLOC realloc -# define LMALLOC malloc -# define MALLOC malloc -# define LFREE free -# define FREE free -# endif -#else /* 32-bit Compiler or Small Memory Model */ -# define HUGE16 -# define FAR16 -# define REALLOC realloc -# define LMALLOC malloc -# define MALLOC malloc -# define LFREE free -# define FREE free -#endif - - -#define SDT_BLOCK_LEN 256 /* Size of data blocks */ -#define SHD_BLOCK_LEN 256 /* Size of header blocks */ - -#define SMB_SELFPACK 0 /* Self-packing storage allocation */ -#define SMB_FASTALLOC 1 /* Fast allocation */ -#define SMB_HYPERALLOC 2 /* No allocation */ - -#define SMB_EMAIL 1 /* User numbers stored in Indexes */ - - /* Time zone macros for when_t.zone */ -#define DAYLIGHT 0x8000 /* Daylight savings is active */ -#define US_ZONE 0x4000 /* U.S. time zone */ -#define WESTERN_ZONE 0x2000 /* Non-standard zone west of UT */ -#define EASTERN_ZONE 0x1000 /* Non-standard zone east of UT */ - - /* US Time Zones (standard) */ -#define AST 0x40F0 // Atlantic (-04:00) -#define EST 0x412C // Eastern (-05:00) -#define CST 0x4168 // Central (-06:00) -#define MST 0x41A4 // Mountain (-07:00) -#define PST 0x41E0 // Pacific (-08:00) -#define YST 0x421C // Yukon (-09:00) -#define HST 0x4258 // Hawaii/Alaska (-10:00) -#define BST 0x4294 // Bering (-11:00) - - /* US Time Zones (daylight) */ -#define ADT 0xC0F0 // Atlantic (-03:00) -#define EDT 0xC12C // Eastern (-04:00) -#define CDT 0xC168 // Central (-05:00) -#define MDT 0xC1A4 // Mountain (-06:00) -#define PDT 0xC1E0 // Pacific (-07:00) -#define YDT 0xC21C // Yukon (-08:00) -#define HDT 0xC258 // Hawaii/Alaska (-09:00) -#define BDT 0xC294 // Bering (-10:00) - - /* Non-standard Time Zones */ -#define MID 0x2294 // Midway (-11:00) -#define VAN 0x21E0 // Vancouver (-08:00) -#define EDM 0x21A4 // Edmonton (-07:00) -#define WIN 0x2168 // Winnipeg (-06:00) -#define BOG 0x212C // Bogota (-05:00) -#define CAR 0x20F0 // Caracas (-04:00) -#define RIO 0x20B4 // Rio de Janeiro (-03:00) -#define FER 0x2078 // Fernando de Noronha (-02:00) -#define AZO 0x203C // Azores (-01:00) -#define LON 0x1000 // London (+00:00) -#define BER 0x103C // Berlin (+01:00) -#define ATH 0x1078 // Athens (+02:00) -#define MOS 0x10B4 // Moscow (+03:00) -#define DUB 0x10F0 // Dubai (+04:00) -#define KAB 0x110E // Kabul (+04:30) -#define KAR 0x112C // Karachi (+05:00) -#define BOM 0x114A // Bombay (+05:30) -#define KAT 0x1159 // Kathmandu (+05:45) -#define DHA 0x1168 // Dhaka (+06:00) -#define BAN 0x11A4 // Bangkok (+07:00) -#define HON 0x11E0 // Hong Kong (+08:00) -#define TOK 0x121C // Tokyo (+09:00) -#define SYD 0x1258 // Sydney (+10:00) -#define NOU 0x1294 // Noumea (+11:00) -#define WEL 0x12D0 // Wellington (+12:00) - - /* Valid hfield_t.types */ -#define SENDER 0x00 -#define SENDERAGENT 0x01 -#define SENDERNETTYPE 0x02 -#define SENDERNETADDR 0x03 -#define SENDEREXT 0x04 -#define SENDERPOS 0x05 -#define SENDERORG 0x06 - -#define AUTHOR 0x10 -#define AUTHORAGENT 0x11 -#define AUTHORNETTYPE 0x12 -#define AUTHORNETADDR 0x13 -#define AUTHOREXT 0x14 -#define AUTHORPOS 0x15 -#define AUTHORORG 0x16 - -#define REPLYTO 0x20 -#define REPLYTOAGENT 0x21 -#define REPLYTONETTYPE 0x22 -#define REPLYTONETADDR 0x23 -#define REPLYTOEXT 0x24 -#define REPLYTOPOS 0x25 -#define REPLYTOORG 0x26 - -#define RECIPIENT 0x30 -#define RECIPIENTAGENT 0x31 -#define RECIPIENTNETTYPE 0x32 -#define RECIPIENTNETADDR 0x33 -#define RECIPIENTEXT 0x34 -#define RECIPIENTPOS 0x35 -#define RECIPIENTORG 0x36 - -#define FORWARDTO 0x40 -#define FORWARDTOAGENT 0x41 -#define FORWARDTONETTYPE 0x42 -#define FORWARDTONETADDR 0x43 -#define FORWARDTOEXT 0x44 -#define FORWARDTOPOS 0x45 -#define FORWARDTOORG 0x46 - -#define FORWARDED 0x48 - -#define RECEIVEDBY 0x50 -#define RECEIVEDBYAGENT 0x51 -#define RECEIVEDBYNETTYPE 0x52 -#define RECEIVEDBYNETADDR 0x53 -#define RECEIVEDBYEXT 0x54 -#define RECEIVEDBYPOS 0x55 -#define RECEIVEDBYORG 0x56 - -#define RECEIVED 0x58 - -#define SUBJECT 0x60 -#define SUMMARY 0x61 -#define COMMENT 0x62 -#define CARBONCOPY 0x63 -#define GROUP 0x64 -#define EXPIRATION 0x65 -#define PRIORITY 0x66 - -#define FILEATTACH 0x70 -#define DESTFILE 0x71 -#define FILEATTACHLIST 0x72 -#define DESTFILELIST 0x73 -#define FILEREQUEST 0x74 -#define FILEPASSWORD 0x75 -#define FILEREQUESTLIST 0x76 -#define FILEPASSWORDLIST 0x77 - -#define IMAGEATTACH 0x80 -#define ANIMATTACH 0x81 -#define FONTATTACH 0x82 -#define SOUNDATTACH 0x83 -#define PRESENTATTACH 0x84 -#define VIDEOATTACH 0x85 -#define APPDATAATTACH 0x86 - -#define IMAGETRIGGER 0x90 -#define ANIMTRIGGER 0x91 -#define FONTTRIGGER 0x92 -#define SOUNDTRIGGER 0x93 -#define PRESENTTRIGGER 0x94 -#define VIDEOTRIGGER 0x95 -#define APPDATATRIGGER 0x96 - -#define FIDOCTRL 0xa0 -#define FIDOAREA 0xa1 -#define FIDOSEENBY 0xa2 -#define FIDOPATH 0xa3 -#define FIDOMSGID 0xa4 -#define FIDOREPLYID 0xa5 -#define FIDOPID 0xa6 -#define FIDOFLAGS 0xa7 - -#define RFC822HEADER 0xb0 -#define RFC822MSGID 0xb1 -#define RFC822REPLYID 0xb2 - -#define UNKNOWN 0xf1 -#define UNKNOWNASCII 0xf2 -#define UNUSED 0xff - - /* Valid dfield_t.types */ -#define TEXT_BODY 0x00 -#define TEXT_SOUL 0x01 -#define TEXT_TAIL 0x02 -#define TEXT_WING 0x03 -#define IMAGEEMBED 0x20 -#define ANIMEMBED 0x21 -#define FONTEMBED 0x22 -#define SOUNDEMBED 0x23 -#define PRESENTEMBED 0x24 -#define VIDEOEMBED 0x25 -#define APPDATAEMBED 0x26 -#define UNUSED 0xff - - - /* Message attributes */ -#define MSG_PRIVATE (1<<0) -#define MSG_READ (1<<1) -#define MSG_PERMANENT (1<<2) -#define MSG_LOCKED (1<<3) -#define MSG_DELETE (1<<4) -#define MSG_ANONYMOUS (1<<5) -#define MSG_KILLREAD (1<<6) -#define MSG_MODERATED (1<<7) -#define MSG_VALIDATED (1<<8) - - /* Auxillary header attributes */ -#define MSG_FILEREQUEST (1<<0) // File request -#define MSG_FILEATTACH (1<<1) // File(s) attached to Msg -#define MSG_TRUNCFILE (1<<2) // Truncate file(s) when sent -#define MSG_KILLFILE (1<<3) // Delete file(s) when sent -#define MSG_RECEIPTREQ (1<<4) // Return receipt requested -#define MSG_CONFIRMREQ (1<<5) // Confirmation receipt requested -#define MSG_NODISP (1<<6) // Msg may not be displayed to user - - /* Message network attributes */ -#define MSG_LOCAL (1<<0) // Msg created locally -#define MSG_INTRANSIT (1<<1) // Msg is in-transit -#define MSG_SENT (1<<2) // Sent to remote -#define MSG_KILLSENT (1<<3) // Kill when sent -#define MSG_ARCHIVESENT (1<<4) // Archive when sent -#define MSG_HOLD (1<<5) // Hold for pick-up -#define MSG_CRASH (1<<6) // Crash -#define MSG_IMMEDIATE (1<<7) // Send Msg now, ignore restrictions -#define MSG_DIRECT (1<<8) // Send directly to destination -#define MSG_GATE (1<<9) // Send via gateway -#define MSG_ORPHAN (1<<10) // Unknown destination -#define MSG_FPU (1<<11) // Force pickup -#define MSG_TYPELOCAL (1<<12) // Msg is for local use only -#define MSG_TYPEECHO (1<<13) // Msg is for conference distribution -#define MSG_TYPENET (1<<14) // Msg is direct network mail - - -enum { - NET_NONE - ,NET_UNKNOWN - ,NET_FIDO - ,NET_POSTLINK - ,NET_QWK - ,NET_INTERNET - ,NET_WWIV - ,NET_MHS - -/* Add new ones here */ - - ,NET_TYPES - }; - -enum { - AGENT_PERSON - ,AGENT_PROCESS - -/* Add new ones here */ - - ,AGENT_TYPES - }; - -enum { - XLAT_NONE // No translation/End of translation list - ,XLAT_ENCRYPT // Encrypted data - ,XLAT_ESCAPED // 7-bit ASCII escaping for ctrl and 8-bit data - ,XLAT_HUFFMAN // Static and adaptive Huffman coding compression - ,XLAT_LZW // Limpel/Ziv/Welch compression - ,XLAT_MLZ78 // Modified LZ78 compression - ,XLAT_RLE // Run length encoding compression - ,XLAT_IMPLODE // Implode compression (PkZIP) - ,XLAT_SHRINK // Shrink compression (PkZIP) - ,XLAT_LZH // LHarc (LHA) Dynamic Huffman coding - -/* Add new ones here */ - - ,XLAT_TYPES - }; - - -/************/ -/* Typedefs */ -/************/ - -typedef struct { - - ulong time; // Local time (unix format) - short zone; // Time zone - - } when_t; - -typedef struct { - - ushort to; // 16-bit CRC of recipient name (lower case) - ushort from; // 16-bit CRC of sender name (lower case) - ushort subj; // 16-bit CRC of subject (lower case, w/o RE:) - ushort attr; // attributes (read, permanent, etc.) - ulong offset; // offset into header file - ulong number; // number of message (1 based) - ulong time; // time/date message was imported/posted - - } idxrec_t; - -typedef struct { - - uchar id[4]; // text or binary unique hdr ID - ushort version; // version number (initially 100h for 1.00) - ushort length; // length including this struct - - } smbhdr_t; - -typedef struct { - - ulong last_msg; // last message number - ulong total_msgs; // total messages - ulong header_offset; // byte offset to first header record - ulong max_crcs; // Maximum number of CRCs to keep in history - ulong max_msgs; // Maximum number of message to keep in sub - ushort max_age; // Maximum age of message to keep in sub (in days) - ushort attr; // Attributes for this message base (SMB_HYPER,etc) - - } smbstatus_t; - -typedef struct { - - uchar id[4]; // SHD<^Z> - ushort type; // Message type (normally 0) - ushort version; // Version of type (initially 100h for 1.00) - ushort length; // Total length of fixed record + all fields - ushort attr; // Attributes (bit field) (duped in SID) - ulong auxattr; // Auxillary attributes (bit field) - ulong netattr; // Network attributes - when_t when_written; // Time message was written (unix format) - when_t when_imported; // Time message was imported - ulong number; // Message number - ulong thread_orig; // Original message number in thread - ulong thread_next; // Next message in thread - ulong thread_first; // First reply to this message - uchar reserved[16]; // Reserved for future use - ulong offset; // Offset for buffer into data file (0 or mod 256) - ushort total_dfields; // Total number of data fields - - } msghdr_t; - -typedef struct { - - ushort type; // Type of data field - ulong offset; // Offset into buffer - ulong length; // Length of data field - - } dfield_t; - -typedef struct { - - ushort type; - ushort length; // Length of buffer - - } hfield_t; - -typedef struct { - - ushort zone; - ushort net; - ushort node; - ushort point; - - } fidoaddr_t; - -typedef struct { - - ushort type; - void *addr; - - } net_t; - -typedef struct { - - idxrec_t idx; // Index - msghdr_t hdr; // Header record (fixed portion) - uchar *to, // To name - *to_ext, // To extension - *from, // From name - *from_ext, // From extension - *replyto, // Reply-to name - *replyto_ext, // Reply-to extension */ - *subj; // Subject - ushort to_agent, // Type of agent message is to - from_agent, // Type of agent message is from - replyto_agent; // Type of agent replies should be sent to - net_t to_net, // Destination network type and address - from_net, // Origin network address - replyto_net; // Network type and address for replies - ushort total_hfields; // Total number of header fields - hfield_t *hfield; // Header fields (fixed length portion) - void **hfield_dat; // Header fields (variable length portion) - dfield_t *dfield; // Data fields (fixed length portion) - ulong offset; // Offset (number of records) into index - uchar forwarded; // Forwarded from agent to another - - } smbmsg_t; - -#endif /* Don't add anything after this #endif statement */ diff --git a/src/sbbs2/smb/121a/smblib.c b/src/sbbs2/smb/121a/smblib.c deleted file mode 100644 index e2d8a474b8..0000000000 --- a/src/sbbs2/smb/121a/smblib.c +++ /dev/null @@ -1,1121 +0,0 @@ -/* SMBLIB.C */ - -#include "smblib.h" - -/****************************************************************************/ -/* Open a message base of name 'smb_file' */ -/* If retry_time is 0, fast open method (no compatibility/validity check) */ -/* Opens files for READing messages or updating message indices only */ -/****************************************************************************/ -int smb_open(int retry_time) -{ - int file; - char str[128]; - smbhdr_t hdr; - -shd_fp=sdt_fp=sid_fp=NULL; -sprintf(str,"%s.SHD",smb_file); -if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO,S_IWRITE|S_IREAD))==-1 - || (shd_fp=fdopen(file,"r+b"))==NULL) { - if(file!=-1) - close(file); - return(2); } - -if(retry_time && filelength(file)>=sizeof(smbhdr_t)) { - setvbuf(shd_fp,shd_buf,_IONBF,SHD_BLOCK_LEN); - if(smb_locksmbhdr(retry_time)) { - smb_close(); - return(-1); } - memset(&hdr,0,sizeof(smbhdr_t)); - fread(&hdr,sizeof(smbhdr_t),1,shd_fp); - if(memcmp(hdr.id,"SMB\x1a",4)) { - smb_close(); - return(-2); } - if(hdr.version<0x110) { /* Compatibility check */ - smb_close(); - return(-3); } - smb_unlocksmbhdr(); - rewind(shd_fp); } - -setvbuf(shd_fp,shd_buf,_IOFBF,SHD_BLOCK_LEN); - -sprintf(str,"%s.SDT",smb_file); -if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO,S_IWRITE|S_IREAD))==-1 - || (sdt_fp=fdopen(file,"r+b"))==NULL) { - if(file!=-1) - close(file); - smb_close(); - return(1); } -setvbuf(sdt_fp,NULL,_IOFBF,2*1024); - -sprintf(str,"%s.SID",smb_file); -if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO,S_IWRITE|S_IREAD))==-1 - || (sid_fp=fdopen(file,"r+b"))==NULL) { - if(file!=-1) - close(file); - smb_close(); - return(3); } -setvbuf(sid_fp,NULL,_IOFBF,2*1024); - -return(0); -} - -/****************************************************************************/ -/* Closes the currently open message base */ -/****************************************************************************/ -void smb_close(void) -{ -if(shd_fp!=NULL) { - smb_unlocksmbhdr(); /* In case it's been locked */ - fclose(shd_fp); } -if(sid_fp!=NULL) - fclose(sid_fp); -if(sdt_fp!=NULL) - fclose(sdt_fp); -sid_fp=shd_fp=sdt_fp=NULL; -} - -/****************************************************************************/ -/* Opens the data block allocation table message base 'smb_file' */ -/* Retrys for retry_time number of seconds */ -/* Return 0 on success, non-zero otherwise */ -/****************************************************************************/ -int smb_open_da(int retry_time) -{ - int file; - char str[128]; - long start; - -start=time(NULL); -sprintf(str,"%s.SDA",smb_file); -while(1) { - if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IWRITE|S_IREAD))!=-1) - break; - if(errno!=EACCES) - return(-1); - if(time(NULL)-start>=retry_time) - return(-2); } -if((sda_fp=fdopen(file,"r+b"))==NULL) - return(-3); -setvbuf(sda_fp,NULL,_IOFBF,2*1024); -return(0); -} - -/****************************************************************************/ -/* Opens the header block allocation table for message base 'smb_file' */ -/* Retrys for retry_time number of seconds */ -/* Return 0 on success, non-zero otherwise */ -/****************************************************************************/ -int smb_open_ha(int retry_time) -{ - int file; - char str[128]; - long start; - -start=time(NULL); -sprintf(str,"%s.SHA",smb_file); -while(1) { - if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IWRITE|S_IREAD))!=-1) - break; - if(errno!=EACCES) - return(-1); - if(time(NULL)-start>=retry_time) - return(-2); } -if((sha_fp=fdopen(file,"r+b"))==NULL) - return(-3); -setvbuf(sha_fp,NULL,_IOFBF,2*1024); -return(0); -} - -/****************************************************************************/ -/* If the parameter 'push' is non-zero, this function stores the currently */ -/* open message base to the "virtual" smb stack. Up to SMB_STACK_LEN */ -/* message bases may be stored (defined in SMBDEFS.H). */ -/* The parameter 'op' is the operation to perform on the stack. Either */ -/* SMB_STACK_PUSH, SMB_STACK_POP, or SMB_STACK_XCHNG */ -/* If the operation is SMB_STACK_POP, this function restores a message base */ -/* previously saved with a SMB_STACK_PUSH call to this same function. */ -/* If the operation is SMB_STACK_XCHNG, then the current message base is */ -/* exchanged with the message base on the top of the stack (most recently */ -/* pushed. */ -/* If the current message base is not open, the SMB_STACK_PUSH and */ -/* SMB_STACK_XCHNG operations do nothing */ -/* Returns 0 on success, non-zero if stack full. */ -/* If operation is SMB_STACK_POP or SMB_STACK_XCHNG, it always returns 0. */ -/****************************************************************************/ -int smb_stack(int op) -{ - static char stack_file[SMB_STACK_LEN][128]; - static FILE *stack_sdt[SMB_STACK_LEN], - *stack_shd[SMB_STACK_LEN], - *stack_sid[SMB_STACK_LEN], - *stack_sda[SMB_STACK_LEN], - *stack_sha[SMB_STACK_LEN]; - static int stack_idx; - char tmp_file[128]; - FILE *tmp_sdt, - *tmp_shd, - *tmp_sid, - *tmp_sda, - *tmp_sha; - -if(op==SMB_STACK_PUSH) { - if(stack_idx>=SMB_STACK_LEN) - return(1); - if(shd_fp==NULL || sdt_fp==NULL || sid_fp==NULL) /* Msg base not open */ - return(0); - memcpy(stack_file[stack_idx],smb_file,128); - stack_sdt[stack_idx]=sdt_fp; - stack_shd[stack_idx]=shd_fp; - stack_sid[stack_idx]=sid_fp; - stack_sda[stack_idx]=sda_fp; - stack_sha[stack_idx]=sha_fp; - stack_idx++; - return(0); } -/* pop or xchng */ -if(!stack_idx) /* Nothing on the stack, so do nothing */ - return(0); -if(op==SMB_STACK_XCHNG) { - if(!shd_fp) - return(0); - memcpy(tmp_file,smb_file,128); - tmp_sdt=sdt_fp; - tmp_shd=shd_fp; - tmp_sid=sid_fp; - tmp_sda=sda_fp; - tmp_sha=sha_fp; } - -stack_idx--; -memcpy(smb_file,stack_file[stack_idx],128); -sdt_fp=stack_sdt[stack_idx]; -shd_fp=stack_shd[stack_idx]; -sid_fp=stack_sid[stack_idx]; -sda_fp=stack_sda[stack_idx]; -sha_fp=stack_sha[stack_idx]; -if(op==SMB_STACK_XCHNG) { - stack_idx++; - memcpy(stack_file[stack_idx-1],tmp_file,128); - stack_sdt[stack_idx-1]=tmp_sdt; - stack_shd[stack_idx-1]=tmp_shd; - stack_sid[stack_idx-1]=tmp_sid; - stack_sda[stack_idx-1]=tmp_sda; - stack_sha[stack_idx-1]=tmp_sha; } -return(0); -} - -/****************************************************************************/ -/* Truncates header file */ -/* Retrys for retry_time number of seconds */ -/* Return 0 on success, non-zero otherwise */ -/****************************************************************************/ -int smb_trunchdr(int retry_time) -{ - long start; - -start=time(NULL); -rewind(shd_fp); -while(1) { - if(!chsize(fileno(shd_fp),0L)) - break; - if(errno!=EACCES) - return(-1); - if(time(NULL)-start>=retry_time) /* Time-out */ - return(-2); } -return(0); -} - -/*********************************/ -/* Message Base Header Functions */ -/*********************************/ - -/****************************************************************************/ -/* Attempts for retry_time number of seconds to lock the message base hdr */ -/****************************************************************************/ -int smb_locksmbhdr(int retry_time) -{ - ulong start; - -start=time(NULL); -while(1) { - if(!lock(fileno(shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t))) - return(0); - if(time(NULL)-start>=retry_time) - break; /* Incase we've already locked it */ - unlock(fileno(shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t)); } -return(-1); -} - -/****************************************************************************/ -/* Read the SMB header from the header file and place into "status" */ -/****************************************************************************/ -int smb_getstatus(smbstatus_t *status) -{ - char str[128]; - int i; - -setvbuf(shd_fp,shd_buf,_IONBF,SHD_BLOCK_LEN); -clearerr(shd_fp); -fseek(shd_fp,sizeof(smbhdr_t),SEEK_SET); -i=fread(status,1,sizeof(smbstatus_t),shd_fp); -setvbuf(shd_fp,shd_buf,_IOFBF,SHD_BLOCK_LEN); -if(i==sizeof(smbstatus_t)) - return(0); -return(1); -} - -/****************************************************************************/ -/* Writes message base header */ -/****************************************************************************/ -int smb_putstatus(smbstatus_t status) -{ - int i; - -clearerr(shd_fp); -fseek(shd_fp,sizeof(smbhdr_t),SEEK_SET); -i=fwrite(&status,1,sizeof(smbstatus_t),shd_fp); -fflush(shd_fp); -if(i==sizeof(smbstatus_t)) - return(0); -return(1); -} - -/****************************************************************************/ -/* Unlocks previously locks message base header */ -/****************************************************************************/ -int smb_unlocksmbhdr() -{ -return(unlock(fileno(shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t))); -} - -/********************************/ -/* Individual Message Functions */ -/********************************/ - -/****************************************************************************/ -/* Attempts for retry_time number of seconds to lock the header for 'msg' */ -/****************************************************************************/ -int smb_lockmsghdr(smbmsg_t msg, int retry_time) -{ - ulong start; - -start=time(NULL); -while(1) { - if(!lock(fileno(shd_fp),msg.idx.offset,sizeof(msghdr_t))) - return(0); - if(time(NULL)-start>=retry_time) - break; - unlock(fileno(shd_fp),msg.idx.offset,sizeof(msghdr_t)); } -return(-1); -} - -/****************************************************************************/ -/* Fills msg->idx with message index based on msg->hdr.number */ -/* OR if msg->hdr.number is 0, based on msg->offset (record offset). */ -/* if msg.hdr.number does not equal 0, then msg->offset is filled too. */ -/* Either msg->hdr.number or msg->offset must be initialized before */ -/* calling this function */ -/* Returns 1 if message number wasn't found, 0 if it was */ -/****************************************************************************/ -int smb_getmsgidx(smbmsg_t *msg) -{ - idxrec_t idx; - ulong l,length,total,bot,top; - -clearerr(sid_fp); -if(!msg->hdr.number) { - fseek(sid_fp,msg->offset*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg->idx,sizeof(idxrec_t),1,sid_fp)) - return(1); - return(0); } - -length=filelength(fileno(sid_fp)); -if(!length) - return(1); -total=length/sizeof(idxrec_t); -if(!total) - return(1); - -bot=0; -top=total; -l=total/2; /* Start at middle index */ -while(1) { - fseek(sid_fp,l*sizeof(idxrec_t),SEEK_SET); - if(!fread(&idx,sizeof(idxrec_t),1,sid_fp)) - return(1); - if(bot==top-1 && idx.number!=msg->hdr.number) - return(1); - if(idx.number>msg->hdr.number) { - top=l; - l=bot+((top-bot)/2); - continue; } - if(idx.number<msg->hdr.number) { - bot=l; - l=top-((top-bot)/2); - continue; } - break; } -msg->idx=idx; -msg->offset=l; -return(0); -} - -/****************************************************************************/ -/* Reads the last index record in the open message base */ -/****************************************************************************/ -int smb_getlastidx(idxrec_t *idx) -{ - long length; - -clearerr(sid_fp); -length=filelength(fileno(sid_fp)); -if(length<sizeof(idxrec_t)) - return(-1); -fseek(sid_fp,length-sizeof(idxrec_t),SEEK_SET); -if(!fread(idx,sizeof(idxrec_t),1,sid_fp)) - return(-2); -return(0); -} - -/****************************************************************************/ -/* Figures out the total length of the header record for 'msg' */ -/* Returns length */ -/****************************************************************************/ -uint smb_getmsghdrlen(smbmsg_t msg) -{ - int i; - -/* fixed portion */ -msg.hdr.length=sizeof(msghdr_t); -/* data fields */ -msg.hdr.length+=msg.hdr.total_dfields*sizeof(dfield_t); -/* header fields */ -for(i=0;i<msg.total_hfields;i++) { - msg.hdr.length+=sizeof(hfield_t); - msg.hdr.length+=msg.hfield[i].length; } -return(msg.hdr.length); -} - -/****************************************************************************/ -/* Figures out the total length of the data buffer for 'msg' */ -/* Returns length */ -/****************************************************************************/ -ulong smb_getmsgdatlen(smbmsg_t msg) -{ - int i; - ulong length=0L; - -for(i=0;i<msg.hdr.total_dfields;i++) - length+=msg.dfield[i].length; -return(length); -} - -/****************************************************************************/ -/* Read header information into 'msg' structure */ -/* msg->idx.offset must be set before calling this function */ -/* Must call smb_freemsgmem() to free memory allocated for var len strs */ -/* Returns 0 on success, non-zero if error */ -/****************************************************************************/ -int smb_getmsghdr(smbmsg_t *msg) -{ - ushort i; - ulong l,offset; - idxrec_t idx; - -rewind(shd_fp); -fseek(shd_fp,msg->idx.offset,SEEK_SET); -idx=msg->idx; -offset=msg->offset; -memset(msg,0,sizeof(smbmsg_t)); -msg->idx=idx; -msg->offset=offset; -if(!fread(&msg->hdr,sizeof(msghdr_t),1,shd_fp)) - return(-1); -if(memcmp(msg->hdr.id,"SHD\x1a",4)) - return(-2); -if(msg->hdr.version<0x110) - return(-9); -l=sizeof(msghdr_t); -if(msg->hdr.total_dfields && (msg->dfield - =(dfield_t *)MALLOC(sizeof(dfield_t)*msg->hdr.total_dfields))==NULL) { - smb_freemsgmem(*msg); - return(-3); } -i=0; -while(i<msg->hdr.total_dfields && l<msg->hdr.length) { - if(!fread(&msg->dfield[i],sizeof(dfield_t),1,shd_fp)) { - smb_freemsgmem(*msg); - return(-4); } - i++; - l+=sizeof(dfield_t); } -if(i<msg->hdr.total_dfields) { - smb_freemsgmem(*msg); - return(-8); } - -while(l<msg->hdr.length) { - i=msg->total_hfields; - if((msg->hfield_dat=(void **)REALLOC(msg->hfield_dat,sizeof(void *)*(i+1))) - ==NULL) { - smb_freemsgmem(*msg); - return(-3); } - if((msg->hfield=(hfield_t *)REALLOC(msg->hfield - ,sizeof(hfield_t)*(i+1)))==NULL) { - smb_freemsgmem(*msg); - return(-3); } - msg->total_hfields++; - if(!fread(&msg->hfield[i],sizeof(hfield_t),1,shd_fp)) { - smb_freemsgmem(*msg); - return(-5); } - l+=sizeof(hfield_t); - if((msg->hfield_dat[i]=(char *)MALLOC(msg->hfield[i].length+1)) - ==NULL) { /* Allocate 1 extra for NULL terminator */ - smb_freemsgmem(*msg); /* or 0 length field */ - return(-3); } - memset(msg->hfield_dat[i],0,msg->hfield[i].length+1); /* init to NULL */ - if(msg->hfield[i].length - && !fread(msg->hfield_dat[i],msg->hfield[i].length,1,shd_fp)) { - smb_freemsgmem(*msg); - return(-6); } - - switch(msg->hfield[i].type) { /* convenience variables */ - case SENDER: - if(!msg->from) { - msg->from=msg->hfield_dat[i]; - break; } - case FORWARDED: /* fall through */ - msg->forwarded=1; - break; - case SENDERAGENT: - if(!msg->forwarded) - msg->from_agent=*(ushort *)msg->hfield_dat[i]; - break; - case SENDEREXT: - if(!msg->forwarded) - msg->from_ext=msg->hfield_dat[i]; - break; - case SENDERNETTYPE: - if(!msg->forwarded) - msg->from_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case SENDERNETADDR: - if(!msg->forwarded) - msg->from_net.addr=msg->hfield_dat[i]; - break; - case REPLYTO: - msg->replyto=msg->hfield_dat[i]; - break; - case REPLYTOEXT: - msg->replyto_ext=msg->hfield_dat[i]; - break; - case REPLYTOAGENT: - msg->replyto_agent=*(ushort *)msg->hfield_dat[i]; - break; - case REPLYTONETTYPE: - msg->replyto_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case REPLYTONETADDR: - msg->replyto_net.addr=msg->hfield_dat[i]; - break; - case RECIPIENT: - msg->to=msg->hfield_dat[i]; - break; - case RECIPIENTEXT: - msg->to_ext=msg->hfield_dat[i]; - break; - case RECIPIENTAGENT: - msg->to_agent=*(ushort *)msg->hfield_dat[i]; - break; - case RECIPIENTNETTYPE: - msg->to_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case RECIPIENTNETADDR: - msg->to_net.addr=msg->hfield_dat[i]; - break; - case SUBJECT: - msg->subj=msg->hfield_dat[i]; - break; } - l+=msg->hfield[i].length; } - -if(!msg->from || !msg->to || !msg->subj) { - smb_freemsgmem(*msg); - return(-7); } -return(0); -} - -/****************************************************************************/ -/* Frees memory allocated for 'msg' */ -/****************************************************************************/ -void smb_freemsgmem(smbmsg_t msg) -{ - ushort i; - -if(msg.dfield) - FREE(msg.dfield); -for(i=0;i<msg.total_hfields;i++) - if(msg.hfield_dat[i]) - FREE(msg.hfield_dat[i]); -if(msg.hfield) - FREE(msg.hfield); -if(msg.hfield_dat) - FREE(msg.hfield_dat); -} - -/****************************************************************************/ -/* Unlocks header for 'msg' */ -/****************************************************************************/ -int smb_unlockmsghdr(smbmsg_t msg) -{ -return(unlock(fileno(shd_fp),msg.idx.offset,sizeof(msghdr_t))); -} - - -/****************************************************************************/ -/* Adds a header field to the 'msg' structure (in memory only) */ -/****************************************************************************/ -int smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data) -{ - int i; - -i=msg->total_hfields; -if((msg->hfield=(hfield_t *)REALLOC(msg->hfield,sizeof(hfield_t)*(i+1))) - ==NULL) - return(1); -if((msg->hfield_dat=(void **)REALLOC(msg->hfield_dat,sizeof(void *)*(i+1))) - ==NULL) - return(2); -msg->total_hfields++; -msg->hfield[i].type=type; -msg->hfield[i].length=length; -if(length) { - if((msg->hfield_dat[i]=(void *)MALLOC(length))==NULL) - return(4); - memcpy(msg->hfield_dat[i],data,length); } -else - msg->hfield_dat[i]=NULL; -return(0); -} - -/****************************************************************************/ -/* Adds a data field to the 'msg' structure (in memory only) */ -/* Automatically figures out the offset into the data buffer from existing */ -/* dfield lengths */ -/****************************************************************************/ -int smb_dfield(smbmsg_t *msg, ushort type, ulong length) -{ - int i,j; - -i=msg->hdr.total_dfields; -if((msg->dfield=(dfield_t *)REALLOC(msg->dfield,sizeof(dfield_t)*(i+1))) - ==NULL) - return(1); -msg->hdr.total_dfields++; -msg->dfield[i].type=type; -msg->dfield[i].length=length; -for(j=msg->dfield[i].offset=0;j<i;j++) - msg->dfield[i].offset+=msg->dfield[j].length; -return(0); -} - -/****************************************************************************/ -/* Checks CRC history file for duplicate crc. If found, returns 1. */ -/* If no dupe, adds to CRC history and returns 0, or negative if error. */ -/****************************************************************************/ -int smb_addcrc(ulong max_crcs, ulong crc, int retry_time) -{ - char str[128]; - int file; - long length; - ulong l,*buf; - time_t start; - -if(!max_crcs) - return(0); -start=time(NULL); -sprintf(str,"%s.SCH",smb_file); -while(1) { - if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IWRITE|S_IREAD))!=-1) - break; - if(errno!=EACCES) - return(-1); - if(time(NULL)-start>=retry_time) - return(-2); } -length=filelength(file); -if(length<0L) { - close(file); - return(-4); } -if((buf=(ulong *)MALLOC(max_crcs*4))==NULL) { - close(file); - return(-3); } -if(length>=max_crcs*4) { /* Reached or exceeds max crcs */ - read(file,buf,max_crcs*4); - for(l=0;l<max_crcs;l++) - if(crc==buf[l]) - break; - if(l<max_crcs) { /* Dupe CRC found */ - close(file); - FREE(buf); - return(1); } - chsize(file,0L); /* truncate it */ - lseek(file,0L,SEEK_SET); - write(file,buf+4,(max_crcs-1)*4); } - -else if(length/4) { /* Less than max crcs */ - read(file,buf,length); - for(l=0;l<length/4;l++) - if(crc==buf[l]) - break; - if(l<length/4) { /* Dupe CRC found */ - close(file); - FREE(buf); - return(1); } } - -lseek(file,0L,SEEK_END); -write(file,&crc,4); /* Write to the end */ -FREE(buf); -close(file); -return(0); -} - - -/****************************************************************************/ -/* Creates a new message header record in the header file. */ -/* If storage is SMB_SELFPACK, self-packing conservative allocation is used */ -/* If storage is SMB_FASTALLOC, fast allocation is used */ -/* If storage is SMB_HYPERALLOC, no allocation tables are used (fastest) */ -/****************************************************************************/ -int smb_addmsghdr(smbmsg_t *msg, smbstatus_t *status, int storage - ,int retry_time) -{ - int i; - long l; - -if(smb_locksmbhdr(retry_time)) - return(1); -if(smb_getstatus(status)) - return(2); - -if(storage!=SMB_HYPERALLOC && (i=smb_open_ha(retry_time))!=0) - return(i); - -msg->hdr.length=smb_getmsghdrlen(*msg); -if(storage==SMB_HYPERALLOC) - l=smb_hallochdr(status->header_offset); -else if(storage==SMB_FASTALLOC) - l=smb_fallochdr(msg->hdr.length); -else - l=smb_allochdr(msg->hdr.length); -if(l==-1L) { - smb_unlocksmbhdr(); - fclose(sha_fp); - return(-1); } - -status->last_msg++; -msg->idx.number=msg->hdr.number=status->last_msg; -msg->idx.offset=status->header_offset+l; -msg->idx.time=msg->hdr.when_imported.time; -msg->idx.attr=msg->hdr.attr; -msg->offset=status->total_msgs; -status->total_msgs++; -smb_putstatus(*status); - -if(storage!=SMB_HYPERALLOC) - fclose(sha_fp); -i=smb_putmsg(*msg); -smb_unlocksmbhdr(); -return(i); -} - -/****************************************************************************/ -/* Writes both header and index information for msg 'msg' */ -/****************************************************************************/ -int smb_putmsg(smbmsg_t msg) -{ - int i; - -i=smb_putmsghdr(msg); -if(i) - return(i); -return(smb_putmsgidx(msg)); -} - -/****************************************************************************/ -/* Writes index information for 'msg' */ -/* msg.idx */ -/* and msg.offset must be set prior to calling to this function */ -/* Returns 0 if everything ok */ -/****************************************************************************/ -int smb_putmsgidx(smbmsg_t msg) -{ - -clearerr(sid_fp); -fseek(sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET); -if(!fwrite(&msg.idx,sizeof(idxrec_t),1,sid_fp)) - return(1); -fflush(sid_fp); -return(0); -} - -/****************************************************************************/ -/* Writes header information for 'msg' */ -/* msg.hdr.length */ -/* msg.idx.offset */ -/* and msg.offset must be set prior to calling to this function */ -/* Returns 0 if everything ok */ -/****************************************************************************/ -int smb_putmsghdr(smbmsg_t msg) -{ - ushort i; - ulong l; - -clearerr(shd_fp); -if(fseek(shd_fp,msg.idx.offset,SEEK_SET)) - return(-1); - -/************************************************/ -/* Write the fixed portion of the header record */ -/************************************************/ -if(!fwrite(&msg.hdr,sizeof(msghdr_t),1,shd_fp)) - return(-2); - -/************************************************/ -/* Write the data fields (each is fixed length) */ -/************************************************/ -for(i=0;i<msg.hdr.total_dfields;i++) - if(!fwrite(&msg.dfield[i],sizeof(dfield_t),1,shd_fp)) - return(-3); - -/*******************************************/ -/* Write the variable length header fields */ -/*******************************************/ -for(i=0;i<msg.total_hfields;i++) { - if(!fwrite(&msg.hfield[i],sizeof(hfield_t),1,shd_fp)) - return(-4); - if(msg.hfield[i].length /* more then 0 bytes long */ - && !fwrite(msg.hfield_dat[i],msg.hfield[i].length,1,shd_fp)) - return(-5); } - -l=smb_getmsghdrlen(msg); -while(l%SHD_BLOCK_LEN) { - if(fputc(0,shd_fp)==EOF) - return(-6); /* pad block with NULL */ - l++; } -fflush(shd_fp); -return(0); -} - -/****************************************************************************/ -/* Creates a sub-board's initial header file */ -/* Truncates and deletes other associated SMB files */ -/****************************************************************************/ -int smb_create(ulong max_crcs, ulong max_msgs, ushort max_age, ushort attr - ,int retry_time) -{ - char str[128]; - smbhdr_t hdr; - smbstatus_t status; - -if(filelength(fileno(shd_fp))>=sizeof(smbhdr_t)+sizeof(smbstatus_t) - && smb_locksmbhdr(retry_time)) /* header exists, so lock it */ - return(1); -memset(&hdr,0,sizeof(smbhdr_t)); -memset(&status,0,sizeof(smbstatus_t)); -memcpy(hdr.id,"SMB\x1a",4); /* <S> <M> <B> <^Z> */ -hdr.version=SMB_VERSION; -hdr.length=sizeof(smbhdr_t)+sizeof(smbstatus_t); -status.last_msg=status.total_msgs=0; -status.header_offset=sizeof(smbhdr_t)+sizeof(smbstatus_t); -status.max_crcs=max_crcs; -status.max_msgs=max_msgs; -status.max_age=max_age; -status.attr=attr; -rewind(shd_fp); -fwrite(&hdr,1,sizeof(smbhdr_t),shd_fp); -fwrite(&status,1,sizeof(smbstatus_t),shd_fp); -rewind(shd_fp); -chsize(fileno(shd_fp),sizeof(smbhdr_t)+sizeof(smbstatus_t)); -fflush(shd_fp); - -rewind(sdt_fp); -chsize(fileno(sdt_fp),0L); -rewind(sid_fp); -chsize(fileno(sid_fp),0L); - -sprintf(str,"%s.SDA",smb_file); -remove(str); /* if it exists, delete it */ -sprintf(str,"%s.SHA",smb_file); -remove(str); /* if it exists, delete it */ -sprintf(str,"%s.SCH",smb_file); -remove(str); -smb_unlocksmbhdr(); -return(0); -} - -/****************************************************************************/ -/* Returns number of data blocks required to store "length" amount of data */ -/****************************************************************************/ -ulong smb_datblocks(ulong length) -{ - ulong blocks; - -blocks=length/SDT_BLOCK_LEN; -if(length%SDT_BLOCK_LEN) - blocks++; -return(blocks); -} - -/****************************************************************************/ -/* Returns number of header blocks required to store "length" size header */ -/****************************************************************************/ -ulong smb_hdrblocks(ulong length) -{ - ulong blocks; - -blocks=length/SHD_BLOCK_LEN; -if(length%SHD_BLOCK_LEN) - blocks++; -return(blocks); -} - -/****************************************************************************/ -/* Finds unused space in data file based on block allocation table and */ -/* marks space as used in allocation table. */ -/* File must be opened read/write DENY ALL */ -/* Returns offset to beginning of data (in bytes, not blocks) */ -/* Assumes smb_open_da() has been called */ -/* fclose(sda_fp) should be called after */ -/* Returns negative on error */ -/****************************************************************************/ -long smb_allocdat(ulong length, ushort headers) -{ - ushort i,j; - ulong l,blocks,offset=0L; - -blocks=smb_datblocks(length); -j=0; /* j is consecutive unused block counter */ -fflush(sda_fp); -rewind(sda_fp); -while(!feof(sda_fp)) { - if(!fread(&i,2,1,sda_fp)) - break; - offset+=SDT_BLOCK_LEN; - if(!i) j++; - else j=0; - if(j==blocks) { - offset-=(blocks*SDT_BLOCK_LEN); - break; } } -clearerr(sda_fp); -fseek(sda_fp,(offset/SDT_BLOCK_LEN)*2L,SEEK_SET); -for(l=0;l<blocks;l++) - if(!fwrite(&headers,2,1,sda_fp)) - return(-1); -fflush(sda_fp); -return(offset); -} - -/****************************************************************************/ -/* Allocates space for data, but doesn't search for unused blocks */ -/* Returns negative on error */ -/****************************************************************************/ -long smb_fallocdat(ulong length, ushort headers) -{ - ulong l,blocks,offset; - -fflush(sda_fp); -clearerr(sda_fp); -blocks=smb_datblocks(length); -fseek(sda_fp,0L,SEEK_END); -offset=(ftell(sda_fp)/2L)*SDT_BLOCK_LEN; -for(l=0;l<blocks;l++) - if(!fwrite(&headers,2,1,sda_fp)) - break; -fflush(sda_fp); -if(l<blocks) - return(-1L); -return(offset); -} - -/****************************************************************************/ -/* De-allocates space for data */ -/* Returns non-zero on error */ -/****************************************************************************/ -int smb_freemsgdat(ulong offset, ulong length, ushort headers) -{ - ushort i; - ulong l,blocks; - -blocks=smb_datblocks(length); - -clearerr(sda_fp); -for(l=0;l<blocks;l++) { - if(fseek(sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET)) - return(1); - if(!fread(&i,2,1,sda_fp)) - return(2); - if(headers>i) - i=0; /* don't want to go negative */ - else - i-=headers; - if(fseek(sda_fp,-2L,SEEK_CUR)) - return(3); - if(!fwrite(&i,2,1,sda_fp)) - return(4); } -fflush(sda_fp); -return(0); -} - -/****************************************************************************/ -/* Adds to data allocation records for blocks starting at 'offset' */ -/* Returns non-zero on error */ -/****************************************************************************/ -int smb_incdat(ulong offset, ulong length, ushort headers) -{ - ushort i; - ulong l,blocks; - -clearerr(sda_fp); -blocks=smb_datblocks(length); -for(l=0;l<blocks;l++) { - fseek(sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET); - if(!fread(&i,2,1,sda_fp)) - return(1); - i+=headers; - fseek(sda_fp,-2L,SEEK_CUR); - if(!fwrite(&i,2,1,sda_fp)) - return(2); } -fflush(sda_fp); -return(0); -} - -/****************************************************************************/ -/* De-allocates blocks for header record */ -/* Returns non-zero on error */ -/****************************************************************************/ -int smb_freemsghdr(ulong offset, ulong length) -{ - uchar c=0; - ulong l,blocks; - -clearerr(sha_fp); -blocks=smb_hdrblocks(length); -fseek(sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET); -for(l=0;l<blocks;l++) - if(!fwrite(&c,1,1,sha_fp)) - return(1); -fflush(sha_fp); -return(0); -} - -/****************************************************************************/ -/* Frees all allocated header and data blocks for 'msg' */ -/****************************************************************************/ -int smb_freemsg(smbmsg_t msg, smbstatus_t status) -{ - int i; - ushort x; - -if(status.attr&SMB_HYPERALLOC) /* Nothing to do */ - return(0); - -for(x=0;x<msg.hdr.total_dfields;x++) { - if((i=smb_freemsgdat(msg.hdr.offset+msg.dfield[x].offset - ,msg.dfield[x].length,1))!=0) - return(i); } -return(smb_freemsghdr(msg.idx.offset-status.header_offset,msg.hdr.length)); -} - -/****************************************************************************/ -/* Finds unused space in header file based on block allocation table and */ -/* marks space as used in allocation table. */ -/* File must be opened read/write DENY ALL */ -/* Returns offset to beginning of header (in bytes, not blocks) */ -/* Assumes smb_open_ha() has been called */ -/* fclose(sha_fp) should be called after */ -/* Returns -1L on error */ -/****************************************************************************/ -long smb_allochdr(ulong length) -{ - uchar c; - ushort i; - ulong l,blocks,offset=0; - -blocks=smb_hdrblocks(length); -i=0; /* i is consecutive unused block counter */ -fflush(sha_fp); -rewind(sha_fp); -while(!feof(sha_fp)) { - if(!fread(&c,1,1,sha_fp)) - break; - offset+=SHD_BLOCK_LEN; - if(!c) i++; - else i=0; - if(i==blocks) { - offset-=(blocks*SHD_BLOCK_LEN); - break; } } -clearerr(sha_fp); -fseek(sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET); -c=1; -for(l=0;l<blocks;l++) - if(!fwrite(&c,1,1,sha_fp)) - return(-1L); -fflush(sha_fp); -return(offset); -} - -/****************************************************************************/ -/* Allocates space for index, but doesn't search for unused blocks */ -/* Returns -1L on error */ -/****************************************************************************/ -long smb_fallochdr(ulong length) -{ - uchar c=1; - ulong l,blocks,offset; - -blocks=smb_hdrblocks(length); -fflush(sha_fp); -clearerr(sha_fp); -fseek(sha_fp,0L,SEEK_END); -offset=ftell(sha_fp)*SHD_BLOCK_LEN; -for(l=0;l<blocks;l++) - if(!fwrite(&c,1,1,sha_fp)) - return(-1L); -fflush(sha_fp); -return(offset); -} - -/************************************************************************/ -/* Allocate header blocks using Hyper Allocation */ -/* this function should be most likely not be called from anywhere but */ -/* smb_addmsghdr() */ -/************************************************************************/ -long smb_hallochdr(ulong header_offset) -{ - long l; - -fflush(shd_fp); -fseek(shd_fp,0L,SEEK_END); -l=ftell(shd_fp); -if(l<header_offset) /* Header file truncated?!? */ - return(header_offset); -while((l-header_offset)%SHD_BLOCK_LEN) /* Make sure even block boundry */ - l++; -return(l-header_offset); -} - -/************************************************************************/ -/* Allocate data blocks using Hyper Allocation */ -/* smb_locksmbhdr() should be called before this function and not */ -/* unlocked until all data fields for this message have been written */ -/* to the SDT file */ -/************************************************************************/ -long smb_hallocdat() -{ - long l; - -fflush(sdt_fp); -fseek(sdt_fp,0L,SEEK_END); -l=ftell(sdt_fp); -if(l<=0) - return(l); -while(l%SDT_BLOCK_LEN) /* Make sure even block boundry */ - l++; -return(l); -} - -/* End of SMBLIB.C */ diff --git a/src/sbbs2/smb/121a/smblib.h b/src/sbbs2/smb/121a/smblib.h deleted file mode 100644 index b682f74f03..0000000000 --- a/src/sbbs2/smb/121a/smblib.h +++ /dev/null @@ -1,80 +0,0 @@ -/* SMBLIB.H */ - -#ifndef _SMBLIB_H -#define _SMBLIB_H - -#if defined(__WATCOMC__) || defined(__TURBOC__) -# include <io.h> -# include <mem.h> -# include <share.h> -#else -# include <memory.h> -#endif - -#ifdef __WATCOMC__ -# include <dos.h> -#elif defined(__TURBOC__) -# include <dir.h> -#endif - -#include <malloc.h> -#include <time.h> -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <sys/types.h> - -#define GLOBAL extern /* turn smbvars.c files into header */ - -#include "smbvars.c" - -#define SMB_STACK_LEN 4 /* Max msg bases in smb_stack() */ -#define SMB_STACK_POP 0 /* Pop a msg base off of smb_stack() */ -#define SMB_STACK_PUSH 1 /* Push a msg base onto smb_stack() */ -#define SMB_STACK_XCHNG 2 /* Exchange msg base w/last pushed */ - -int smb_open(int retry_time); -void smb_close(void); -int smb_open_da(int retry_time); -int smb_open_ha(int retry_time); -int smb_create(ulong max_crcs, ulong max_msgs, ushort max_age, ushort attr - ,int retry_time); -int smb_stack(int op); -int smb_trunchdr(int retry_time); -int smb_locksmbhdr(int retry_time); -int smb_getstatus(smbstatus_t *status); -int smb_putstatus(smbstatus_t status); -int smb_unlocksmbhdr(void); -int smb_getmsgidx(smbmsg_t *msg); -int smb_getlastidx(idxrec_t *idx); -uint smb_getmsghdrlen(smbmsg_t msg); -ulong smb_getmsgdatlen(smbmsg_t msg); -int smb_lockmsghdr(smbmsg_t msg, int retry_time); -int smb_getmsghdr(smbmsg_t *msg); -int smb_unlockmsghdr(smbmsg_t msg); -int smb_addcrc(ulong max_crcs, ulong crc, int retry_time); -int smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data); -int smb_dfield(smbmsg_t *msg, ushort type, ulong length); -int smb_addmsghdr(smbmsg_t *msg, smbstatus_t *status, int storage - ,int retry_time); -int smb_putmsg(smbmsg_t msg); -int smb_putmsgidx(smbmsg_t msg); -int smb_putmsghdr(smbmsg_t msg); -void smb_freemsgmem(smbmsg_t msg); -ulong smb_hdrblocks(ulong length); -ulong smb_datblocks(ulong length); -long smb_allochdr(ulong length); -long smb_fallochdr(ulong length); -long smb_hallochdr(ulong header_offset); -long smb_allocdat(ulong length, ushort headers); -long smb_fallocdat(ulong length, ushort headers); -long smb_hallocdat(void); -int smb_incdat(ulong offset, ulong length, ushort headers); -int smb_freemsg(smbmsg_t msg, smbstatus_t status); -int smb_freemsgdat(ulong offset, ulong length, ushort headers); -int smb_freemsghdr(ulong offset, ulong length); - -#endif /* Don't add anything after this #endif statement */ diff --git a/src/sbbs2/smb/121a/smbutil.bor b/src/sbbs2/smb/121a/smbutil.bor deleted file mode 100644 index eaf0ec330b..0000000000 --- a/src/sbbs2/smb/121a/smbutil.bor +++ /dev/null @@ -1,56 +0,0 @@ -############################### -# Makefile for SMBUTIL # -# For use with Borland C++ # -# Tabstop=8 # -############################### - -# ATTN: To use this MAKEFILE, you must create a directory "l" off of the -# current directory to store the large model .OBJ files - -# Macros -CC = bcc -LD = tlink -INCLUDE = \bc31\include -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -N -C -m$(MODEL) -I$(INCLUDE) -DLZH_DYNAMIC_BUF -w-pro -LFLAGS = -n -c -MAIN = smbutil.exe -OBJS = $(MODEL)\smbutil.obj $(MODEL)\smblib.obj $(MODEL)\smbvars.obj \ - $(MODEL)\lzh.obj -HEADERS = smbutil.h smblib.h smbdefs.h crc32.h lzh.h - -!ifdef __OS2__ -CC = c:\bcos2\bin\bcc -LD = c:\bcos2\bin\tlink -INCLUDE = c:\bcos2\include;smb -LIB = c:\bcos2\lib -MODEL = os2 -CFLAGS = -d -C -I$(INCLUDE) -#-DLZH_DYNAMIC_BUF -LFLAGS = -c -w-srf -!endif - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(MODEL) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) $(LIB)\wildargs.obj -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) $(LIB)\wildargs.obj -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# All .obj modules -$(MODEL)\smbutil.obj: $(HEADERS) -$(MODEL)\smbvars.obj: $(HEADERS) -$(MODEL)\smblib.obj: $(HEADERS) -$(MODEL)\lzh.obj: $(HEADERS) diff --git a/src/sbbs2/smb/121a/smbutil.c b/src/sbbs2/smb/121a/smbutil.c deleted file mode 100644 index 9ed216a045..0000000000 --- a/src/sbbs2/smb/121a/smbutil.c +++ /dev/null @@ -1,1419 +0,0 @@ -/* SMBUTIL.C */ - -/* Synchronet Message Base Utility */ - -#define SMBUTIL_VER "1.24" - -#include "smblib.h" -#include "smbutil.h" -#include "crc32.h" -#include "crc16.c" - -#ifdef __WATCOMC__ - #include <dos.h> -#endif - -/********************/ -/* Global variables */ -/********************/ - -ulong mode=0L; -ushort tzone=PST; -char filein[128]; -char attach[128]; - -/************************/ -/* Program usage/syntax */ -/************************/ - -char *usage= -"usage: smbutil [/opts] cmd <filespec.SHD>\n" -"\n" -"cmd:\n" -" l[n] = list msgs starting at number n\n" -" r[n] = read msgs starting at number n\n" -" v[n] = view msg headers starting at number n\n" -" k[n] = kill (delete) n msgs\n" -" i<f> = import from text file f\n" -" s = display msg base status\n" -" c = change msg base status\n" -" m = maintain msg base - delete old msgs and msgs over max\n" -" p[k] = pack msg base (k specifies minimum packable Kbytes)\n" -"opts:\n" -" a = always pack msg base (disable compression analysis)\n" -" z[n] = set time zone (n=min +/- from UT or 'EST','EDT','CST',etc)\n" -; - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(1); -return(0); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) -#ifdef __WATCOMC__ - return(f.size); -#else - return(f.ff_fsize); -#endif -return(-1L); -} - - -/****************************************************************************/ -/* Adds a new message to the message base */ -/****************************************************************************/ -void postmsg(smbstatus_t status) -{ - char str[128],buf[SDT_BLOCK_LEN]; - ushort xlat; - int i,j,k,file; - long length; - ulong offset,crc=0xffffffffUL; - FILE *instream; - smbmsg_t msg; - -length=flength(filein); -if(length<1L) { - printf("Invalid file size for '%s'\n",filein); - exit(1); } -length+=2; /* for translation string */ -if(!(status.attr&SMB_HYPERALLOC)) { - i=smb_open_da(10); - if(i) { - printf("smb_open_da returned %d\n",i); - exit(1); } - offset=smb_allocdat(length,1); - fclose(sda_fp); } -else - offset=smb_hallocdat(); - -if((file=open(filein,O_RDONLY|O_BINARY))==-1 - || (instream=fdopen(file,"rb"))==NULL) { - printf("Error opening %s for read\n",filein); - smb_freemsgdat(offset,length,1); - exit(1); } -setvbuf(instream,NULL,_IOFBF,32*1024); -fseek(sdt_fp,offset,SEEK_SET); -xlat=XLAT_NONE; -fwrite(&xlat,2,1,sdt_fp); -k=SDT_BLOCK_LEN-2; -while(!feof(instream)) { - memset(buf,0,k); - j=fread(buf,1,k,instream); - if(status.max_crcs) - for(i=0;i<j;i++) - crc=ucrc32(buf[i],crc); - fwrite(buf,k,1,sdt_fp); - k=SDT_BLOCK_LEN; } -fflush(sdt_fp); -fclose(instream); -crc=~crc; - -memset(&msg,0,sizeof(smbmsg_t)); -memcpy(msg.hdr.id,"SHD\x1a",4); -msg.hdr.version=SMB_VERSION; -msg.hdr.when_written.time=time(NULL); -msg.hdr.when_written.zone=tzone; -msg.hdr.when_imported=msg.hdr.when_written; - -if(status.max_crcs) { - i=smb_addcrc(status.max_crcs,crc,10); - if(i) { - printf("smb_addcrc returned %d\n",i); - smb_freemsgdat(offset,length,1); - exit(1); } } - -msg.hdr.offset=offset; - -printf("To User Name: "); -gets(str); -i=smb_hfield(&msg,RECIPIENT,strlen(str),str); -if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,1); - exit(1); } -if(status.attr&SMB_EMAIL) { - printf("To User Number: "); - gets(str); - i=smb_hfield(&msg,RECIPIENTEXT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,1); - exit(1); } - msg.idx.to=atoi(str); } -else { - strlwr(str); - msg.idx.to=crc16(str); } - -printf("From User Name: "); -gets(str); -i=smb_hfield(&msg,SENDER,strlen(str),str); -if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,1); - exit(1); } -if(status.attr&SMB_EMAIL) { - printf("From User Number: "); - gets(str); - i=smb_hfield(&msg,SENDEREXT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,1); - exit(1); } - msg.idx.from=atoi(str); } -else { - strlwr(str); - msg.idx.from=crc16(str); } - -printf("Subject: "); -gets(str); -i=smb_hfield(&msg,SUBJECT,strlen(str),str); -if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,1); - exit(1); } -strlwr(str); -msg.idx.subj=crc16(str); - -i=smb_dfield(&msg,TEXT_BODY,length); -if(i) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(offset,length,1); - exit(1); } - -i=smb_addmsghdr(&msg,&status,status.attr&SMB_HYPERALLOC,10); - -if(i) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(offset,length,1); - exit(1); } -smb_freemsgmem(msg); - -} - -/****************************************************************************/ -/* Shows the message base header */ -/****************************************************************************/ -void showstatus() -{ - int i; - smbstatus_t status; - -i=smb_locksmbhdr(10); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return; } -i=smb_getstatus(&status); -smb_unlocksmbhdr(); -if(i) { - printf("smb_getstatus returned %d\n",i); - return; } -printf("last_msg =%lu\n" - "total_msgs =%lu\n" - "header_offset =%lu\n" - "max_crcs =%lu\n" - "max_msgs =%lu\n" - "max_age =%u\n" - "attr =%04Xh\n" - ,status.last_msg - ,status.total_msgs - ,status.header_offset - ,status.max_crcs - ,status.max_msgs - ,status.max_age - ,status.attr - ); -} - -/****************************************************************************/ -/* Configure message base header */ -/****************************************************************************/ -void config() -{ - char max_msgs[128],max_crcs[128],max_age[128],header_offset[128],attr[128]; - int i; - smbstatus_t status; - -i=smb_locksmbhdr(10); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return; } -i=smb_getstatus(&status); -smb_unlocksmbhdr(); -if(i) { - printf("smb_getstatus returned %d\n",i); - return; } -printf("Header offset =%-5lu New value (CR=No Change): ",status.header_offset); -gets(header_offset); -printf("Max msgs =%-5lu New value (CR=No Change): ",status.max_msgs); -gets(max_msgs); -printf("Max crcs =%-5lu New value (CR=No Change): ",status.max_crcs); -gets(max_crcs); -printf("Max age =%-5u New value (CR=No Change): ",status.max_age); -gets(max_age); -printf("Attributes =%-5u New value (CR=No Change): ",status.attr); -gets(attr); -i=smb_locksmbhdr(10); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return; } -i=smb_getstatus(&status); -if(i) { - printf("smb_getstatus returned %d\n",i); - smb_unlocksmbhdr(); - return; } -if(isdigit(max_msgs[0])) - status.max_msgs=atol(max_msgs); -if(isdigit(max_crcs[0])) - status.max_crcs=atol(max_crcs); -if(isdigit(max_age[0])) - status.max_age=atoi(max_age); -if(isdigit(header_offset[0])) - status.header_offset=atol(header_offset); -if(isdigit(attr[0])) - status.attr=atoi(attr); -i=smb_putstatus(status); -smb_unlocksmbhdr(); -if(i) - printf("smb_putstatus returned %d\n",i); -} - -/****************************************************************************/ -/* Lists messages' to, from, and subject */ -/****************************************************************************/ -void listmsgs(ulong start, ulong count) -{ - int i; - ulong l=0; - smbmsg_t msg; - idxrec_t idxrec; - -if(!start) - start=1; -fseek(sid_fp,(start-1L)*sizeof(idxrec_t),SEEK_SET); -while(l<count) { - if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) - break; - i=smb_lockmsghdr(msg,10); - if(i) { - printf("smb_lockmsghdr returned %d\n",i); - break; } - i=smb_getmsghdr(&msg); - smb_unlockmsghdr(msg); - if(i) { - printf("smb_getmsghdr returned %d\n",i); - break; } - printf("%4lu %-25.25s %-25.25s %.20s\n" - ,msg.hdr.number,msg.from,msg.to,msg.subj); - smb_freemsgmem(msg); - l++; } -} - -/****************************************************************************/ -/* Returns an ASCII string for FidoNet address 'addr' */ -/****************************************************************************/ -char *faddrtoa(fidoaddr_t addr) -{ - static char str[25]; - char point[25]; - -sprintf(str,"%u:%u/%u",addr.zone,addr.net,addr.node); -if(addr.point) { - sprintf(point,".%u",addr.point); - strcat(str,point); } -return(str); -} - -char *binstr(uchar *buf, ushort length) -{ - static char str[128]; - char tmp[128]; - int i; - -str[0]=0; -for(i=0;i<length;i++) - if(buf[i] && (buf[i]<SP || buf[i]>=0x7f)) - break; -if(i==length) /* not binary */ - return(buf); -for(i=0;i<length;i++) { - sprintf(tmp,"%02X ",buf[i]); - strcat(str,tmp); } -return(str); -} - -/****************************************************************************/ -/* Converts when_t.zone into ASCII format */ -/****************************************************************************/ -char *zonestr(short zone) -{ - static char str[32]; - -switch(zone) { - case 0: return("UT"); - case AST: return("AST"); - case EST: return("EST"); - case CST: return("CST"); - case MST: return("MST"); - case PST: return("PST"); - case YST: return("YST"); - case HST: return("HST"); - case BST: return("BST"); - case ADT: return("ADT"); - case EDT: return("EDT"); - case CDT: return("CDT"); - case MDT: return("MDT"); - case PDT: return("PDT"); - case YDT: return("YDT"); - case HDT: return("HDT"); - case BDT: return("BDT"); - case MID: return("MID"); - case VAN: return("VAN"); - case EDM: return("EDM"); - case WIN: return("WIN"); - case BOG: return("BOG"); - case CAR: return("CAR"); - case RIO: return("RIO"); - case FER: return("FER"); - case AZO: return("AZO"); - case LON: return("LON"); - case BER: return("BER"); - case ATH: return("ATH"); - case MOS: return("MOS"); - case DUB: return("DUB"); - case KAB: return("KAB"); - case KAR: return("KAR"); - case BOM: return("BOM"); - case KAT: return("KAT"); - case DHA: return("DHA"); - case BAN: return("BAN"); - case HON: return("HON"); - case TOK: return("TOK"); - case SYD: return("SYD"); - case NOU: return("NOU"); - case WEL: return("WEL"); - } - -sprintf(str,"%02d:%02d",zone/60,zone<0 ? (-zone)%60 : zone%60); -return(str); -} - - -/****************************************************************************/ -/* Displays message header information */ -/****************************************************************************/ -void viewmsgs(ulong start, ulong count) -{ - char when_written[128] - ,when_imported[128]; - int i; - ulong l=0; - smbmsg_t msg; - idxrec_t idxrec; - -if(!start) - start=1; -fseek(sid_fp,(start-1L)*sizeof(idxrec_t),SEEK_SET); -while(l<count) { - if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) - break; - i=smb_lockmsghdr(msg,10); - if(i) { - printf("smb_lockmsghdr returned %d\n",i); - break; } - i=smb_getmsghdr(&msg); - smb_unlockmsghdr(msg); - if(i) { - printf("smb_getmsghdr returned %d\n",i); - break; } - - sprintf(when_written,"%.24s %s" - ,ctime((time_t *)&msg.hdr.when_written.time) - ,zonestr(msg.hdr.when_written.zone)); - sprintf(when_imported,"%.24s %s" - ,ctime((time_t *)&msg.hdr.when_imported.time) - ,zonestr(msg.hdr.when_imported.zone)); - - printf( "%-20.20s %s\n" - "%-20.20s %s\n" - "%-20.20s %s\n" - "%-20.20s %04Xh\n" - "%-20.20s %04Xh\n" - "%-20.20s %u\n" - "%-20.20s %04Xh\n" - "%-20.20s %08lXh\n" - "%-20.20s %08lXh\n" - "%-20.20s %s\n" - "%-20.20s %s\n" - "%-20.20s %ld (%ld)\n" - "%-20.20s %ld\n" - "%-20.20s %ld\n" - "%-20.20s %ld\n" - "%-20.20s %s\n" - "%-20.20s %06lXh\n" - "%-20.20s %u\n", - - "subj", - msg.subj, - - "from", - msg.from, - - "to", - msg.to, - - "type", - msg.hdr.type, - - "version", - msg.hdr.version, - - "length", - msg.hdr.length, - - "attr", - msg.hdr.attr, - - "auxattr", - msg.hdr.auxattr, - - "netattr", - msg.hdr.netattr, - - "when_written", - when_written, - - "when_imported", - when_imported, - - "number", - msg.hdr.number, - ftell(sid_fp)/sizeof(idxrec_t), - - "thread_orig", - msg.hdr.thread_orig, - - "thread_next", - msg.hdr.thread_next, - - "thread_first", - msg.hdr.thread_first, - - "reserved[16]", - binstr(msg.hdr.reserved,16), - - "offset", - msg.hdr.offset, - - "total_dfields", - msg.hdr.total_dfields - ); - for(i=0;i<msg.hdr.total_dfields;i++) - printf("dfield[%02u].type %02Xh\n" - "dfield[%02u].offset %lu\n" - "dfield[%02u].length %lu\n" - ,i,msg.dfield[i].type - ,i,msg.dfield[i].offset - ,i,msg.dfield[i].length); - - for(i=0;i<msg.total_hfields;i++) - printf("hfield[%02u].type %02Xh\n" - "hfield[%02u].length %d\n" - "hfield[%02u]_dat %s\n" - ,i,msg.hfield[i].type - ,i,msg.hfield[i].length - ,i,binstr(msg.hfield_dat[i],msg.hfield[i].length)); - - if(msg.from_net.type) - printf("from_net.type %02Xh\n" - "from_net.addr %s\n" - ,msg.from_net.type - ,msg.from_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.from_net.addr) : msg.from_net.addr); - - if(msg.to_net.type) - printf("to_net.type %02Xh\n" - "to_net.addr %s\n" - ,msg.to_net.type - ,msg.to_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.to_net.addr) : msg.to_net.addr); - - if(msg.replyto_net.type) - printf("replyto_net.type %02Xh\n" - "replyto_net.addr %s\n" - ,msg.replyto_net.type - ,msg.replyto_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.replyto_net.addr) - : msg.replyto_net.addr); - - printf("from_agent %02Xh\n" - "to_agent %02Xh\n" - "replyto_agent %02Xh\n" - ,msg.from_agent - ,msg.to_agent - ,msg.replyto_agent); - - printf("\n"); - smb_freemsgmem(msg); - l++; } -} - -/****************************************************************************/ -/* Maintain message base - deletes messages older than max age (in days) */ -/* or messages that exceed maximum */ -/****************************************************************************/ -void maint(void) -{ - int i; - ulong l,m,n,f,flagged=0; - time_t now; - smbstatus_t status; - smbmsg_t msg; - idxrec_t HUGE16 *idx; - -printf("Maintaining %s\r\n",smb_file); -now=time(NULL); -i=smb_locksmbhdr(10); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return; } -i=smb_getstatus(&status); -if(i) { - smb_unlocksmbhdr(); - printf("smb_getstatus returned %d\n",i); - return; } -if(!status.total_msgs) { - smb_unlocksmbhdr(); - printf("Empty\n"); - return; } -printf("Loading index...\n"); -if((idx=(idxrec_t *)LMALLOC(sizeof(idxrec_t)*status.total_msgs)) - ==NULL) { - smb_unlocksmbhdr(); - printf("can't allocate %lu bytes of memory\n" - ,sizeof(idxrec_t)*status.total_msgs); - return; } -fseek(sid_fp,0L,SEEK_SET); -for(l=0;l<status.total_msgs;l++) { - printf("%lu of %lu\r" - ,l+1,status.total_msgs); - if(!fread(&idx[l],1,sizeof(idxrec_t),sid_fp)) - break; } -printf("\nDone.\n\n"); - -printf("Scanning for pre-flagged messages...\n"); -for(m=0;m<l;m++) { - printf("\r%2u%%",m ? (long)(100.0/((float)l/m)) : 0); - if(idx[m].attr&MSG_DELETE) - flagged++; } -printf("\r100%% (%lu pre-flagged for deletion)\n",flagged); - -if(status.max_age) { - printf("Scanning for messages more than %u days old...\n" - ,status.max_age); - for(m=f=0;m<l;m++) { - printf("\r%2u%%",m ? (long)(100.0/((float)l/m)) : 0); - if(idx[m].attr&(MSG_PERMANENT|MSG_DELETE)) - continue; - if(now>idx[m].time && (now-idx[m].time)/(24L*60L*60L)>status.max_age) { - f++; - flagged++; - idx[m].attr|=MSG_DELETE; } } /* mark for deletion */ - printf("\r100%% (%lu flagged for deletion)\n",f); } - -printf("Scanning for read messages to be killed...\n"); -for(m=f=0;m<l;m++) { - printf("\r%2u%%",m ? (long)(100.0/((float)l/m)) : 0); - if(idx[m].attr&(MSG_PERMANENT|MSG_DELETE)) - continue; - if((idx[m].attr&(MSG_READ|MSG_KILLREAD))==(MSG_READ|MSG_KILLREAD)) { - f++; - flagged++; - idx[m].attr|=MSG_DELETE; } } -printf("\r100%% (%lu flagged for deletion)\n",f); - -if(l-flagged>status.max_msgs) { - printf("Flagging excess messages for deletion...\n"); - for(m=n=0,f=flagged;l-flagged>status.max_msgs && m<l;m++) { - if(idx[m].attr&(MSG_PERMANENT|MSG_DELETE)) - continue; - printf("%lu of %lu\r",++n,(l-f)-status.max_msgs); - flagged++; - idx[m].attr|=MSG_DELETE; } /* mark for deletion */ - printf("\nDone.\n\n"); } - -if(!flagged) { /* No messages to delete */ - LFREE(idx); - smb_unlocksmbhdr(); - return; } - -if(!(mode&NOANALYSIS)) { - - printf("Freeing allocated header and data blocks for deleted messages...\n"); - if(!(status.attr&SMB_HYPERALLOC)) { - i=smb_open_da(10); - if(i) { - smb_unlocksmbhdr(); - printf("smb_open_da returned %d\n",i); - exit(1); } - i=smb_open_ha(10); - if(i) { - smb_unlocksmbhdr(); - printf("smb_open_ha returned %d\n",i); - exit(1); } } - - for(m=n=0;m<l;m++) { - if(idx[m].attr&MSG_DELETE) { - printf("%lu of %lu\r",++n,flagged); - msg.idx=idx[m]; - msg.hdr.number=msg.idx.number; - if((i=smb_getmsgidx(&msg))!=0) { - printf("\nsmb_getmsgidx returned %d\n",i); - continue; } - i=smb_lockmsghdr(msg,10); - if(i) { - printf("\nsmb_lockmsghdr returned %d\n",i); - break; } - if((i=smb_getmsghdr(&msg))!=0) { - smb_unlockmsghdr(msg); - printf("\nsmb_getmsghdr returned %d\n",i); - break; } - msg.hdr.attr|=MSG_DELETE; /* mark header as deleted */ - if((i=smb_putmsg(msg))!=0) { - smb_freemsgmem(msg); - smb_unlockmsghdr(msg); - printf("\nsmb_putmsg returned %d\n",i); - break; } - smb_unlockmsghdr(msg); - if((i=smb_freemsg(msg,status))!=0) { - smb_freemsgmem(msg); - printf("\nsmb_freemsg returned %d\n",i); - break; } - smb_freemsgmem(msg); } } - if(!(status.attr&SMB_HYPERALLOC)) { - fclose(sha_fp); - fclose(sda_fp); } - printf("\nDone.\n\n"); } - -printf("Re-writing index...\n"); -rewind(sid_fp); -if(chsize(fileno(sid_fp),0L)) - printf("chsize failed!\n"); -for(m=n=0;m<l;m++) { - if(idx[m].attr&MSG_DELETE) - continue; - printf("%lu of %lu\r",++n,l-flagged); - fwrite(&idx[m],sizeof(idxrec_t),1,sid_fp); } -printf("\nDone.\n\n"); -fflush(sid_fp); - -LFREE(idx); -status.total_msgs-=flagged; -smb_putstatus(status); -smb_unlocksmbhdr(); -} - -/****************************************************************************/ -/* Kills 'msgs' number of messags */ -/* Returns actual number of messages killed. */ -/****************************************************************************/ -ulong kill(ulong msgs) -{ - int i; - ulong l,m,n,flagged=0; - smbstatus_t status; - smbmsg_t msg; - idxrec_t *idx; - -i=smb_locksmbhdr(10); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return(0); } -i=smb_getstatus(&status); -if(i) { - smb_unlocksmbhdr(); - printf("smb_getstatus returned %d\n",i); - return(0); } -printf("Loading index...\n"); -if((idx=(idxrec_t *)LMALLOC(sizeof(idxrec_t)*status.total_msgs)) - ==NULL) { - smb_unlocksmbhdr(); - printf("can't allocate %lu bytes of memory\n" - ,sizeof(idxrec_t)*status.total_msgs); - return(0); } -fseek(sid_fp,0L,SEEK_SET); -for(l=0;l<status.total_msgs;l++) { - printf("%lu of %lu\r" - ,l+1,status.total_msgs); - if(!fread(&idx[l],1,sizeof(idxrec_t),sid_fp)) - break; } -printf("\nDone.\n\n"); - -printf("Flagging messages for deletion...\n"); -for(m=0;m<l && flagged<msgs;m++) { - if(idx[m].attr&(MSG_PERMANENT)) - continue; - printf("%lu of %lu\r",++flagged,msgs); - idx[m].attr|=MSG_DELETE; } /* mark for deletion */ -printf("\nDone.\n\n"); - -printf("Freeing allocated header and data blocks for deleted messages...\n"); -if(!(status.attr&SMB_HYPERALLOC)) { - i=smb_open_da(10); - if(i) { - smb_unlocksmbhdr(); - printf("smb_open_da returned %d\n",i); - exit(1); } - i=smb_open_ha(10); - if(i) { - smb_unlocksmbhdr(); - printf("smb_open_ha returned %d\n",i); - exit(1); } } - -for(m=n=0;m<l;m++) { - if(idx[m].attr&MSG_DELETE) { - printf("%lu of %lu\r",++n,flagged); - msg.idx=idx[m]; - i=smb_lockmsghdr(msg,10); - if(i) { - printf("\nsmb_lockmsghdr returned %d\n",i); - break; } - msg.hdr.number=msg.idx.number; - if((i=smb_getmsgidx(&msg))!=0) { - smb_unlockmsghdr(msg); - printf("\nsmb_getmsgidx returned %d\n",i); - break; } - if((i=smb_getmsghdr(&msg))!=0) { - smb_unlockmsghdr(msg); - printf("\nsmb_getmsghdr returned %d\n",i); - break; } - msg.hdr.attr|=MSG_DELETE; /* mark header as deleted */ - if((i=smb_putmsg(msg))!=0) { - smb_unlockmsghdr(msg); - printf("\nsmb_putmsg returned %d\n",i); - break; } - smb_unlockmsghdr(msg); - smb_freemsg(msg,status); - smb_freemsgmem(msg); } } - -if(!(status.attr&SMB_HYPERALLOC)) { - fclose(sha_fp); - fclose(sda_fp); } - -printf("\nDone.\n\n"); - -printf("Re-writing index...\n"); -rewind(sid_fp); -chsize(fileno(sid_fp),0L); -for(m=n=0;m<l;m++) { - if(idx[m].attr&MSG_DELETE) - continue; - printf("%lu of %lu\r",++n,l-flagged); - fwrite(&idx[m],1,sizeof(idxrec_t),sid_fp); } -printf("\nDone.\n\n"); - -fflush(sid_fp); - -LFREE(idx); -status.total_msgs-=flagged; -smb_putstatus(status); -smb_unlocksmbhdr(); -return(flagged); -} - -typedef struct { - ulong old,new; - } datoffset_t; - -/****************************************************************************/ -/* Removes all unused blocks from SDT and SHD files */ -/****************************************************************************/ -void packmsgs(ulong packable) -{ - uchar buf[SDT_BLOCK_LEN],ch,fname[128],tmpfname[128]; - int i,file,size; - ulong l,m,n,datoffsets=0,length,total; - FILE *tmp_sdt,*tmp_shd,*tmp_sid; - smbhdr_t hdr; - smbstatus_t status; - smbmsg_t msg; - datoffset_t *datoffset=NULL; - -printf("Packing %s\n",smb_file); -i=smb_locksmbhdr(10); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return; } -i=smb_getstatus(&status); -if(i) { - smb_unlocksmbhdr(); - printf("smb_getstatus returned %d\n",i); - return; } - -if(!(status.attr&SMB_HYPERALLOC)) { - i=smb_open_ha(10); - if(i) { - smb_unlocksmbhdr(); - printf("smb_open_ha returned %d\n",i); - return; } - i=smb_open_da(10); - if(i) { - smb_unlocksmbhdr(); - fclose(sha_fp); - printf("smb_open_da returned %d\n",i); - return; } } - -if(!status.total_msgs) { - printf("Empty\n"); - rewind(shd_fp); - chsize(fileno(shd_fp),status.header_offset); - rewind(sdt_fp); - chsize(fileno(sdt_fp),0L); - rewind(sid_fp); - chsize(fileno(sid_fp),0L); - if(!(status.attr&SMB_HYPERALLOC)) { - rewind(sha_fp); - chsize(fileno(sha_fp),0L); - rewind(sda_fp); - chsize(fileno(sda_fp),0L); - fclose(sha_fp); - fclose(sda_fp); } - smb_unlocksmbhdr(); - return; } - - -if(!(status.attr&SMB_HYPERALLOC) && !(mode&NOANALYSIS)) { - printf("Analyzing data blocks...\n"); - - length=filelength(fileno(sda_fp)); - - fseek(sda_fp,0L,SEEK_SET); - for(l=m=0;l<length;l+=2) { - printf("\r%2u%% ",l ? (long)(100.0/((float)length/l)) : 0); - i=0; - if(!fread(&i,2,1,sda_fp)) - break; - if(!i) - m++; } - - printf("\rAnalyzing header blocks...\n"); - - length=filelength(fileno(sha_fp)); - - fseek(sha_fp,0L,SEEK_SET); - for(l=n=0;l<length;l++) { - printf("\r%2u%% ",l ? (long)(100.0/((float)length/l)) : 0); - ch=0; - if(!fread(&ch,1,1,sha_fp)) - break; - if(!ch) - n++; } - - if(!m && !n) { - printf("\rAlready compressed.\n\n"); - fclose(sha_fp); - fclose(sda_fp); - smb_unlocksmbhdr(); - return; } - - if(packable && (m*SDT_BLOCK_LEN)+(n*SHD_BLOCK_LEN)<packable*1024L) { - printf("\rLess than %luk compressable bytes.\n\n",packable); - fclose(sha_fp); - fclose(sda_fp); - smb_unlocksmbhdr(); - return; } - - printf("\rCompressing %lu data blocks (%lu bytes)\n" - " and %lu header blocks (%lu bytes)\n" - ,m,m*SDT_BLOCK_LEN,n,n*SHD_BLOCK_LEN); } - -if(!(status.attr&SMB_HYPERALLOC)) { - rewind(sha_fp); - chsize(fileno(sha_fp),0L); /* Reset both allocation tables */ - rewind(sda_fp); - chsize(fileno(sda_fp),0L); } - -if(status.attr&SMB_HYPERALLOC && !(mode&NOANALYSIS)) { - printf("Analyzing %s\n",smb_file); - - length=filelength(fileno(shd_fp)); - m=n=0; - for(l=status.header_offset;l<length;l+=size) { - printf("\r%2u%% ",(long)(100.0/((float)length/l))); - msg.idx.offset=l; - if((i=smb_lockmsghdr(msg,10))!=0) { - printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i); - size=SHD_BLOCK_LEN; - continue; } - if((i=smb_getmsghdr(&msg))!=0) { - smb_unlockmsghdr(msg); - m++; - size=SHD_BLOCK_LEN; - continue; } - smb_unlockmsghdr(msg); - if(msg.hdr.attr&MSG_DELETE) { - m+=smb_hdrblocks(msg.hdr.length); - total=0; - for(i=0;i<msg.hdr.total_dfields;i++) - total+=msg.dfield[i].length; - n+=smb_datblocks(total); } - size=smb_getmsghdrlen(msg); - if(size<1) size=SHD_BLOCK_LEN; - while(size%SHD_BLOCK_LEN) - size++; - smb_freemsgmem(msg); } - - - if(!m && !n) { - printf("\rAlready compressed.\n\n"); - smb_unlocksmbhdr(); - return; } - - if(packable && (n*SDT_BLOCK_LEN)+(m*SHD_BLOCK_LEN)<packable*1024L) { - printf("\rLess than %luk compressable bytes.\n\n",packable); - smb_unlocksmbhdr(); - return; } - - printf("\rCompressing %lu data blocks (%lu bytes)\n" - " and %lu header blocks (%lu bytes)\n" - ,n,n*SDT_BLOCK_LEN,m,m*SHD_BLOCK_LEN); } - -sprintf(fname,"%s.SD$",smb_file); -tmp_sdt=fopen(fname,"wb"); -sprintf(fname,"%s.SH$",smb_file); -tmp_shd=fopen(fname,"wb"); -sprintf(fname,"%s.SI$",smb_file); -tmp_sid=fopen(fname,"wb"); -if(!tmp_sdt || !tmp_shd || !tmp_sid) { - smb_unlocksmbhdr(); - if(!(status.attr&SMB_HYPERALLOC)) { - fclose(sha_fp); - fclose(sda_fp); } - printf("error opening temp file\n"); - return; } -setvbuf(tmp_sdt,NULL,_IOFBF,2*1024); -setvbuf(tmp_shd,NULL,_IOFBF,2*1024); -setvbuf(tmp_sid,NULL,_IOFBF,2*1024); -if(!(status.attr&SMB_HYPERALLOC) - && (datoffset=(datoffset_t *)LMALLOC(sizeof(datoffset_t)*status.total_msgs)) - ==NULL) { - smb_unlocksmbhdr(); - fclose(sha_fp); - fclose(sda_fp); - fclose(tmp_sdt); - fclose(tmp_shd); - fclose(tmp_sid); - printf("error allocating mem\n"); - return; } -fseek(shd_fp,0L,SEEK_SET); -fread(&hdr,1,sizeof(smbhdr_t),shd_fp); -fwrite(&hdr,1,sizeof(smbhdr_t),tmp_shd); -fwrite(&status,1,sizeof(smbstatus_t),tmp_shd); -for(l=sizeof(smbhdr_t)+sizeof(smbstatus_t);l<status.header_offset;l++) { - fread(&ch,1,1,shd_fp); /* copy additional base header records */ - fwrite(&ch,1,1,tmp_shd); } -fseek(sid_fp,0L,SEEK_SET); -total=0; -for(l=0;l<status.total_msgs;l++) { - printf("%lu of %lu\r",l+1,status.total_msgs); - if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) - break; - if(msg.idx.attr&MSG_DELETE) { - printf("\nDeleted index.\n"); - continue; } - i=smb_lockmsghdr(msg,10); - if(i) { - printf("\nsmb_lockmsghdr returned %d\n",i); - continue; } - i=smb_getmsghdr(&msg); - smb_unlockmsghdr(msg); - if(i) { - printf("\nsmb_getmsghdr returned %d\n",i); - continue; } - if(msg.hdr.attr&MSG_DELETE) { - printf("\nDeleted header.\n"); - smb_freemsgmem(msg); - continue; } - for(m=0;m<datoffsets;m++) - if(msg.hdr.offset==datoffset[m].old) - break; - if(m<datoffsets) { /* another index pointed to this data */ - printf("duplicate index\n"); - msg.hdr.offset=datoffset[m].new; - smb_incdat(datoffset[m].new,smb_getmsgdatlen(msg),1); } - else { - - if(!(status.attr&SMB_HYPERALLOC)) - datoffset[datoffsets].old=msg.hdr.offset; - - fseek(sdt_fp,msg.hdr.offset,SEEK_SET); - - m=smb_getmsgdatlen(msg); - if(m>16L*1024L*1024L) { - printf("\nInvalid data length (%lu)\n",m); - continue; } - - if(!(status.attr&SMB_HYPERALLOC)) { - datoffset[datoffsets].new=msg.hdr.offset - =smb_fallocdat(m,1); - datoffsets++; - fseek(tmp_sdt,msg.hdr.offset,SEEK_SET); } - else { - fseek(tmp_sdt,0L,SEEK_END); - msg.hdr.offset=ftell(tmp_sdt); } - - /* Actually copy the data */ - - n=smb_datblocks(m); - for(m=0;m<n;m++) { - fread(buf,1,SDT_BLOCK_LEN,sdt_fp); - if(!m && *(ushort *)buf!=XLAT_NONE && *(ushort *)buf!=XLAT_LZH) { - printf("\nUnsupported translation type (%04X)\n" - ,*(ushort *)buf); - break; } - fwrite(buf,1,SDT_BLOCK_LEN,tmp_sdt); } - if(m<n) - continue; } - - /* Write the new index entry */ - length=smb_getmsghdrlen(msg); - if(status.attr&SMB_HYPERALLOC) - msg.idx.offset=ftell(tmp_shd); - else - msg.idx.offset=smb_fallochdr(length)+status.header_offset; - fwrite(&msg.idx,1,sizeof(idxrec_t),tmp_sid); - - /* Write the new header entry */ - fseek(tmp_shd,msg.idx.offset,SEEK_SET); - fwrite(&msg.hdr,1,sizeof(msghdr_t),tmp_shd); - for(n=0;n<msg.hdr.total_dfields;n++) - fwrite(&msg.dfield[n],1,sizeof(dfield_t),tmp_shd); - for(n=0;n<msg.total_hfields;n++) { - fwrite(&msg.hfield[n],1,sizeof(hfield_t),tmp_shd); - fwrite(msg.hfield_dat[n],1,msg.hfield[n].length,tmp_shd); } - while(length%SHD_BLOCK_LEN) { /* pad with NULLs */ - fputc(0,tmp_shd); - length++; } - total++; - smb_freemsgmem(msg); } - -if(datoffset) - LFREE(datoffset); -if(!(status.attr&SMB_HYPERALLOC)) { - fclose(sha_fp); - fclose(sda_fp); } - -/* Change *.SH$ into *.SHD */ -fclose(shd_fp); -fclose(tmp_shd); -sprintf(fname,"%s.SHD",smb_file); -remove(fname); -sprintf(tmpfname,"%s.SH$",smb_file); -rename(tmpfname,fname); - -/* Change *.SD$ into *.SDT */ -fclose(sdt_fp); -fclose(tmp_sdt); -sprintf(fname,"%s.SDT",smb_file); -remove(fname); -sprintf(tmpfname,"%s.SD$",smb_file); -rename(tmpfname,fname); - -/* Change *.SI$ into *.SID */ -fclose(sid_fp); -fclose(tmp_sid); -sprintf(fname,"%s.SID",smb_file); -remove(fname); -sprintf(tmpfname,"%s.SI$",smb_file); -rename(tmpfname,fname); - -if((i=smb_open(10))!=0) { - printf("Error %d reopening %s\n",i,smb_file); - return; } - -status.total_msgs=total; -if((i=smb_putstatus(status))!=0) - printf("\nsmb_putstatus returned %d\n",i); -printf("\nDone.\n\n"); -} - - -/****************************************************************************/ -/* Read messages in message base */ -/****************************************************************************/ -void readmsgs(ulong start) -{ - char str[128],*inbuf,*outbuf; - int i,ch,done=0,domsg=1,lzh; - ushort xlat; - ulong l,count,outlen; - smbmsg_t msg; - -if(start) - msg.offset=start-1; -else - msg.offset=0; -while(!done) { - if(domsg) { - fseek(sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) - break; - i=smb_lockmsghdr(msg,10); - if(i) { - printf("smb_lockmsghdr returned %d\n",i); - break; } - i=smb_getmsghdr(&msg); - if(i) { - printf("smb_getmsghdr returned %d\n",i); - break; } - - printf("\n%lu (%lu)\n",msg.hdr.number,msg.offset+1); - printf("Subj : %s\n",msg.subj); - printf("To : %s",msg.to); - if(msg.to_net.type) - printf(" (%s)",msg.to_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.to_net.addr) : msg.to_net.addr); - printf("\nFrom : %s",msg.from); - if(msg.from_net.type) - printf(" (%s)",msg.from_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.from_net.addr) - : msg.from_net.addr); - printf("\nDate : %.24s %s",ctime((time_t *)&msg.hdr.when_written.time) - ,zonestr(msg.hdr.when_written.zone)); - printf("\n\n"); - for(i=0;i<msg.hdr.total_dfields;i++) - switch(msg.dfield[i].type) { - case TEXT_BODY: - case TEXT_TAIL: - fseek(sdt_fp,msg.hdr.offset+msg.dfield[i].offset - ,SEEK_SET); - fread(&xlat,2,1,sdt_fp); - l=2; - lzh=0; - while(xlat!=XLAT_NONE) { - if(xlat==XLAT_LZH) - lzh=1; - fread(&xlat,2,1,sdt_fp); - l+=2; } - if(lzh) { - if((inbuf=(char *)LMALLOC(msg.dfield[i].length)) - ==NULL) { - printf("Malloc error of %lu\n" - ,msg.dfield[i].length); - exit(1); } - fread(inbuf,msg.dfield[i].length-l,1,sdt_fp); - outlen=*(long *)inbuf; - if((outbuf=(char *)LMALLOC(outlen))==NULL) { - printf("Malloc error of lzh %lu\n" - ,outlen); - exit(1); } - lzh_decode(inbuf,msg.dfield[i].length-l,outbuf); - LFREE(inbuf); - for(l=0;l<outlen;l++) - putchar(outbuf[l]); - LFREE(outbuf); } - else { - for(;l<msg.dfield[i].length;l++) { - ch=fgetc(sdt_fp); - if(ch) - putchar(ch); } } - printf("\n"); - break; } - i=smb_unlockmsghdr(msg); - if(i) { - printf("smb_unlockmsghdr returned %d\n",i); - break; } - smb_freemsgmem(msg); } - domsg=1; - printf("\nReading %s (?=Menu): ",smb_file); - switch(toupper(getch())) { - case '?': - printf("\n" - "\n" - "(R)e-read current message\n" - "(L)ist messages\n" - "(T)en more titles\n" - "(V)iew message headers\n" - "(Q)uit\n" - "(+/-) Forward/Backward\n" - "\n"); - domsg=0; - break; - case 'Q': - printf("Quit\n"); - done=1; - break; - case 'R': - printf("Re-read\n"); - break; - case '-': - printf("Backwards\n"); - if(msg.offset) - msg.offset--; - break; - case 'T': - printf("Ten titles\n"); - listmsgs(msg.offset+2,10); - msg.offset+=10; - domsg=0; - break; - case 'L': - printf("List messages\n"); - listmsgs(1,-1); - domsg=0; - break; - case 'V': - printf("View message headers\n"); - viewmsgs(1,-1); - domsg=0; - break; - case CR: - case '+': - printf("Next\n"); - msg.offset++; - break; } } -} - -/***************/ -/* Entry point */ -/***************/ -int main(int argc, char **argv) -{ - char cmd[128]="",*p,*s; - int i,j,x,y; - ulong l; - smbstatus_t status; - -#ifdef __TURBOC__ - timezone=0; /* Fix for Borland C++ EST default */ - daylight=0; /* Fix for Borland C++ EDT default */ -#elif defined(__WATCOMC__) - putenv("TZ=UCT0"); /* Fix for Watcom C++ EDT default */ -#endif -setvbuf(stdout,0,_IONBF,0); - -smb_file[0]=0; -printf("\nSynchronet Message Base Utility v%s "\ - "Copyright 1995 Digital Dynamics\n\n" - ,SMBUTIL_VER); -for(x=1;x<argc;x++) { - if(argv[x][0]=='/') { - for(j=1;argv[x][j];j++) - switch(toupper(argv[x][j])) { - case 'A': - mode|=NOANALYSIS; - break; - case 'Z': - if(isdigit(argv[x][j+1])) - tzone=atoi(argv[x]+j+1); - else if(!stricmp(argv[x]+j+1,"EST")) - tzone=EST; - else if(!stricmp(argv[x]+j+1,"EDT")) - tzone=EDT; - else if(!stricmp(argv[x]+j+1,"CST")) - tzone=CST; - else if(!stricmp(argv[x]+j+1,"CDT")) - tzone=CDT; - else if(!stricmp(argv[x]+j+1,"MST")) - tzone=MST; - else if(!stricmp(argv[x]+j+1,"MDT")) - tzone=MDT; - else if(!stricmp(argv[x]+j+1,"PST")) - tzone=PST; - else if(!stricmp(argv[x]+j+1,"PDT")) - tzone=PDT; - j=strlen(argv[x])-1; - break; - default: - printf("\nUnknown opt '%c'\n",argv[x][j]); - case '?': - printf("%s",usage); - exit(1); - break; } } - else { - if(!cmd[0]) - strcpy(cmd,argv[x]); - else { - sprintf(smb_file,"%.64s",argv[x]); - p=strrchr(smb_file,'.'); - s=strrchr(smb_file,'\\'); - if(p>s) *p=0; - strupr(smb_file); - printf("Opening %s\r\n",smb_file); - if((i=smb_open(10))!=0) { - printf("error %d opening %s message base\n",i,smb_file); - exit(1); } - if(!filelength(fileno(shd_fp))) { - printf("Empty\n"); - smb_close(); - continue; } - for(y=0;cmd[y];y++) - switch(toupper(cmd[y])) { - case 'I': - strcpy(filein,cmd+1); - i=smb_locksmbhdr(10); - if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return(1); } - i=smb_getstatus(&status); - if(i) { - printf("smb_getstatus returned %d\n",i); - return(1); } - smb_unlocksmbhdr(); - postmsg(status); - y=strlen(cmd)-1; - break; - case 'K': - printf("Killing %lu messages...\n",atol(cmd+1)); - l=kill(atol(cmd+1)); - printf("%lu messages killed.\n",l); - y=strlen(cmd)-1; - break; - case 'S': - showstatus(); - break; - case 'C': - config(); - break; - case 'L': - listmsgs(atol(cmd+1),-1L); - y=strlen(cmd)-1; - break; - case 'P': - packmsgs(atol(cmd+y+1)); - y=strlen(cmd)-1; - break; - case 'R': - readmsgs(atol(cmd+1)); - y=strlen(cmd)-1; - break; - case 'V': - viewmsgs(atol(cmd+1),-1L); - y=strlen(cmd)-1; - break; - case 'M': - maint(); - break; - default: - printf("%s",usage); - break; } - smb_close(); } } } -if(!cmd[0]) - printf("%s",usage); -return(0); -} diff --git a/src/sbbs2/smb/121a/smbutil.h b/src/sbbs2/smb/121a/smbutil.h deleted file mode 100644 index 1c8284fec1..0000000000 --- a/src/sbbs2/smb/121a/smbutil.h +++ /dev/null @@ -1,10 +0,0 @@ -/* SMBUTIL.H */ - -#define NOANALYSIS (1L<<0) - -#ifdef __WATCOMC__ - #define ffblk find_t - #define findfirst(x,y,z) _dos_findfirst(x,z,y) - #define findnext(x) _dos_findnext(x) -#endif - diff --git a/src/sbbs2/smb/121a/smbutil.wat b/src/sbbs2/smb/121a/smbutil.wat deleted file mode 100644 index a5a588c627..0000000000 --- a/src/sbbs2/smb/121a/smbutil.wat +++ /dev/null @@ -1,60 +0,0 @@ -######################################################################### -# Makefile for SMBUTIL # -# For use with Watcom C # -# Tabstop=8 # -# # -# To use this makefile, you must create the following sub-directories: # -# DOS, OS2, and DOSX. # -# # -# You must also copy the file \WATCOM\SRC\STARTUP\WILDARGV.C into the # -# current directory. # -######################################################################### - -# Macros - -!ifndef OS -OS = DOS -!endif - -!ifeq OS DOS -CC = *wcc -ml -!else -CC = *wcc386 -!endif - -LD = *wlink -CFLAGS = -I=\watcom\h -bt=$(OS) -fo=$(OS)\ -DLZH_DYNAMIC_BUF -MAIN = $(OS)\smbutil.exe -OBJS = $(OS)\smbutil.obj $(OS)\smblib.obj $(OS)\smbvars.obj $(OS)\lzh.obj & - $(OS)\wildargv.obj -HEADERS = smbutil.h smblib.h smbdefs.h crc32.h lzh.h - -!ifeq OS DOS -SYSTEM = DOS -!endif -!ifeq OS OS2 -SYSTEM = OS2V2 -!endif -!ifeq OS DOSX -SYSTEM = DOS4G -!endif - -LFLAGS = system $(SYSTEM) - - -# Implicit C Compile Rule -.obj: $(OS) -.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... - $(LD) $(LFLAGS) file { $(OBJS) } - -# All .obj modules -$(OS)\smbutil.obj:: $(HEADERS) -$(OS)\smbvars.obj:: $(HEADERS) -$(OS)\smblib.obj:: $(HEADERS) -$(OS)\lzh.obj:: $(HEADERS) diff --git a/src/sbbs2/smb/121a/smbvars.c b/src/sbbs2/smb/121a/smbvars.c deleted file mode 100644 index 9b80d699e6..0000000000 --- a/src/sbbs2/smb/121a/smbvars.c +++ /dev/null @@ -1,22 +0,0 @@ -/* SMBVARS.C */ - -/*************************************************************************/ -/* Global variables for SMBLIB. Same file used for both header and code. */ -/*************************************************************************/ - -#ifndef GLOBAL -#define GLOBAL -#endif - -#include "smbdefs.h" -#include <stdio.h> - -GLOBAL char smb_file[128]; /* path and filename for SMB file (no ext) */ -GLOBAL char shd_buf[SHD_BLOCK_LEN]; -GLOBAL FILE *sdt_fp; -GLOBAL FILE *shd_fp; -GLOBAL FILE *sid_fp; -GLOBAL FILE *sda_fp; -GLOBAL FILE *sha_fp; -GLOBAL FILE *sch_fp; - diff --git a/src/sbbs2/smb/chksmb/chksmb.c b/src/sbbs2/smb/chksmb/chksmb.c deleted file mode 100644 index 9c8a5a86f9..0000000000 --- a/src/sbbs2/smb/chksmb/chksmb.c +++ /dev/null @@ -1,672 +0,0 @@ -/* CHKSMB.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <dos.h> -#include "smblib.h" - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/* Called from upload */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct find_t f; - -if(!_dos_findfirst(filespec,0,&f)) - return(1); -return(0); -} - -/****************************************************************************/ -/* Returns in 'string' a character representation of the number in l with */ -/* commas. */ -/****************************************************************************/ -char *ultoac(ulong l, char *string) -{ - char str[256]; - signed char i,j,k; - -ultoa(l,str,10); -i=strlen(str)-1; -j=i/3+1+i; -string[j--]=0; -for(k=1;i>-1;k++) { - string[j--]=str[i--]; - if(j>0 && !(k%3)) - string[j--]=','; } -return(string); -} - -/****************************************************************************/ -/* Returns an ASCII string for FidoNet address 'addr' */ -/****************************************************************************/ -char *faddrtoa(fidoaddr_t addr) -{ - static char str[25]; - char point[25]; - -sprintf(str,"%u:%u/%u",addr.zone,addr.net,addr.node); -if(addr.point) { - sprintf(point,".%u",addr.point); - strcat(str,point); } -return(str); -} - -char *usage="\nusage: chksmb [/opts] <filespec.SHD>\n" - "\n" - " opts:\n" - " s - stop after errored message base\n" - " p - pause after errored messsage base\n" - " q - quiet mode (no beeps while checking)\n" - " a - don't check allocation files\n" - " t - don't check translation strings\n" - " e - display extended info on corrupted msgs\n"; - -int main(int argc, char **argv) -{ - char str[128],*p,*s,*beep="\7"; - int i,j,x,y,lzh,errors,errlast,stop_on_error=0,pause_on_error=0 - ,chkxlat=1,chkalloc=1,lzhmsg,extinfo=0,msgerr; - ushort xlat; - ulong l,m,n,length,size,total=0,orphan=0,deleted=0,headers=0 - ,*offset,*number,xlaterr - ,delhdrblocks,deldatblocks,hdrerr=0,lockerr=0,hdrnumerr=0 - ,acthdrblocks,actdatblocks - ,dfieldlength=0,dfieldoffset=0 - ,dupenum=0,dupenumhdr=0,dupeoff=0,attr=0,actalloc=0 - ,datactalloc=0,misnumbered=0,timeerr=0,idxofferr=0,idxerr - ,zeronum,idxzeronum,idxnumerr,packable=0L,totallzhsaved=0L - ,totalmsgs=0,totallzhmsgs=0,totaldelmsgs=0,totalmsgbytes=0L - ,lzhblocks,lzhsaved; - smb_t smb; - idxrec_t idx; - smbmsg_t msg; - -fprintf(stderr,"\nCHKSMB v2.00� � Check Synchronet Message Base � " - "Devloped 1995-1997 Rob Swindell\n"); - -if(argc<2) { - printf("%s",usage); - exit(1); } - -errlast=errors=0; -for(x=1;x<argc;x++) { - if(stop_on_error && errors) - break; - if(pause_on_error && errlast!=errors) { - fprintf(stderr,"\7\nHit any key to continue..."); - if(!getch()) - getch(); - printf("\n"); } - errlast=errors; - if(argv[x][0]=='/') { - for(y=1;argv[x][y];y++) - switch(toupper(argv[x][y])) { - case 'Q': - beep=""; - break; - case 'P': - pause_on_error=1; - break; - case 'S': - stop_on_error=1; - break; - case 'T': - chkxlat=0; - break; - case 'A': - chkalloc=0; - break; - case 'E': - extinfo=1; - break; - default: - printf("%s",usage); - exit(1); } - continue; } - -strcpy(smb.file,argv[x]); -p=strrchr(smb.file,'.'); -s=strrchr(smb.file,'\\'); -if(p>s) *p=0; -strupr(smb.file); - -sprintf(str,"%s.SHD",smb.file); -if(!fexist(str)) { - printf("\n%s doesn't exist.\n",smb.file); - continue; } - -fprintf(stderr,"\nChecking %s Headers\n\n",smb.file); - -smb.retry_time=30; -if((i=smb_open(&smb))!=0) { - printf("smb_open returned %d\n",i); - errors++; - continue; } - -length=filelength(fileno(smb.shd_fp)); -if(length<sizeof(smbhdr_t)) { - printf("Empty\n"); - smb_close(&smb); - continue; } - -if((i=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - printf("smb_locksmbhdr returned %d\n",i); - errors++; - continue; } - -if((length/SHD_BLOCK_LEN)*sizeof(ulong)) { - if((number=(ulong *)MALLOC(((length/SHD_BLOCK_LEN)+2)*sizeof(ulong))) - ==NULL) { - printf("Error allocating %lu bytes of memory\n" - ,(length/SHD_BLOCK_LEN)*sizeof(ulong)); - return(++errors); } } -else - number=NULL; - -if(chkalloc && !(smb.status.attr&SMB_HYPERALLOC)) { - if((i=smb_open_ha(&smb))!=0) { - printf("smb_open_ha returned %d\n",i); - return(++errors); } - - if((i=smb_open_da(&smb))!=0) { - printf("smb_open_da returned %d\n",i); - return(++errors); } } - -headers=deleted=orphan=dupenumhdr=attr=zeronum=timeerr=lockerr=hdrerr=0; -actalloc=datactalloc=deldatblocks=delhdrblocks=xlaterr=0; -lzhblocks=lzhsaved=acthdrblocks=actdatblocks=0; - -for(l=smb.status.header_offset;l<length;l+=size) { - fprintf(stderr,"\r%2u%% ",(long)(100.0/((float)length/l))); - msg.idx.offset=l; - msgerr=0; - if((i=smb_lockmsghdr(&smb,&msg))!=0) { - printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i); - lockerr++; - headers++; - size=SHD_BLOCK_LEN; - continue; } - if((i=smb_getmsghdr(&smb,&msg))!=0) { - smb_unlockmsghdr(&smb,&msg); - if(chkalloc && !(smb.status.attr&SMB_HYPERALLOC)) { - fseek(smb.sha_fp - ,(l-smb.status.header_offset)/SHD_BLOCK_LEN,SEEK_SET); - j=fgetc(smb.sha_fp); - if(j) { /* Allocated block or at EOF */ - printf("%s\n(%06lX) smb_getmsghdr returned %d\n",beep,l,i); - hdrerr++; } - else - delhdrblocks++; } - else { - /* printf("%s\n(%06lX) smb_getmsghdr returned %d\n",beep,l,i); */ - delhdrblocks++; } - size=SHD_BLOCK_LEN; - continue; } - smb_unlockmsghdr(&smb,&msg); - fprintf(stderr,"#%-5lu (%06lX) %-25.25s ",msg.hdr.number,l,msg.from); - - lzhmsg=0; - if(msg.hdr.attr&MSG_DELETE) { - deleted++; - if(number) - number[headers]=0; - if(smb.status.attr&SMB_HYPERALLOC) - deldatblocks+=smb_datblocks(smb_getmsgdatlen(&msg)); } - else { - actdatblocks+=smb_datblocks(smb_getmsgdatlen(&msg)); - if(msg.hdr.number>smb.status.last_msg) { - fprintf(stderr,"%sOut-Of-Range message number\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header number (%lu) greater than last (%lu)\n" - ,msg.hdr.number,smb.status.last_msg); - hdrnumerr++; } - - if(smb_getmsgidx(&smb,&msg)) { - fprintf(stderr,"%sNot found in index\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header number (%lu) not found in index\n" - ,msg.hdr.number); - orphan++; } - else if(msg.hdr.attr!=msg.idx.attr) { - fprintf(stderr,"%sAttributes mismatch index\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header attributes (%04X) do not match index " - "attributes (%04X)\n" - ,msg.hdr.attr,msg.idx.attr); - attr++; } - else if(msg.hdr.when_imported.time!=msg.idx.time) { - fprintf(stderr,"%sImport date/time mismatch index\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header import date/time does not match " - "index import date/time\n"); - timeerr++; } - - if(msg.hdr.number==0) { - fprintf(stderr,"%sZero message number\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header number is zero (invalid)\n"); - zeronum++; } - if(number) { - for(m=0;m<headers;m++) - if(number[m] && msg.hdr.number==number[m]) { - fprintf(stderr,"%sDuplicate message number\n",beep); - msgerr=1; - if(extinfo) - printf("MSGERR: Header number (%lu) duplicated\n" - ,msg.hdr.number); - dupenumhdr++; - break; } - number[headers]=msg.hdr.number; } - if(chkxlat) { /* Check translation strings */ - for(i=0;i<msg.hdr.total_dfields;i++) { - fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset,SEEK_SET); - if(!fread(&xlat,2,1,smb.sdt_fp)) - xlat=0xffff; - lzh=0; - if(xlat==XLAT_LZH) { - lzh=1; - if(!fread(&xlat,2,1,smb.sdt_fp)) - xlat=0xffff; } - if(xlat!=XLAT_NONE) { - fprintf(stderr,"%sUnsupported Xlat %04X dfield[%u]\n" - ,beep,xlat,i); - msgerr=1; - if(extinfo) - printf("MSGERR: Unsupported translation type (%04X) " - "in dfield[%u]\n" - ,xlat,i); - xlaterr++; } - else { - if(lzh) { - lzhmsg=1; - if(fread(&m,4,1,smb.sdt_fp)) { /* Get uncompressed len */ - lzhsaved+=(smb_datblocks(m+2) - -smb_datblocks(msg.dfield[i].length)) - *SDT_BLOCK_LEN; - lzhblocks+=smb_datblocks(msg.dfield[i].length); - } } } } } } - - size=smb_getmsghdrlen(&msg); - while(size%SHD_BLOCK_LEN) - size++; - - if(chkalloc && !(smb.status.attr&SMB_HYPERALLOC)) { - fseek(smb.sha_fp,(l-smb.status.header_offset)/SHD_BLOCK_LEN,SEEK_SET); - for(m=0;m<size;m+=SHD_BLOCK_LEN) { -/*** - if(msg.hdr.attr&MSG_DELETE && (i=fgetc(smb.sha_fp))!=0) { - fprintf(stderr,"%sDeleted Header Block %lu marked %02X\n" - ,beep,m/SHD_BLOCK_LEN,i); - msgerr=1; - delalloc++; } -***/ - if(!(msg.hdr.attr&MSG_DELETE) && (i=fgetc(smb.sha_fp))!=1) { - fprintf(stderr,"%sActive Header Block %lu marked %02X\n" - ,beep,m/SHD_BLOCK_LEN,i); - msgerr=1; - if(extinfo) - printf("MSGERR: Active header block %lu marked %02X " - "instead of 01\n" - ,m/SHD_BLOCK_LEN,i); - actalloc++; } } - - if(!(msg.hdr.attr&MSG_DELETE)) { - acthdrblocks+=(size/SHD_BLOCK_LEN); - for(n=0;n<msg.hdr.total_dfields;n++) { - if(msg.dfield[n].offset&0x80000000UL) { - msgerr=1; - if(extinfo) - printf("MSGERR: Invalid Data Field [%u] Offset: %lu\n" - ,n,msg.dfield[n].offset); - dfieldoffset++; } - if(msg.dfield[n].length&0x80000000UL) { - msgerr=1; - if(extinfo) - printf("MSGERR: Invalid Data Field [%u] Length: %lu\n" - ,n,msg.dfield[n].length); - dfieldlength++; } - fseek(smb.sda_fp - ,((msg.hdr.offset+msg.dfield[n].offset)/SDT_BLOCK_LEN)*2 - ,SEEK_SET); - for(m=0;m<msg.dfield[n].length;m+=SDT_BLOCK_LEN) { - if(!fread(&i,2,1,smb.sda_fp) || !i) { - fprintf(stderr - ,"%sActive Data Block %lu.%lu marked free\n" - ,beep,n,m/SHD_BLOCK_LEN); - msgerr=1; - if(extinfo) - printf("MSGERR: Active Data Block %lu.%lu " - "marked free\n" - ,n,m/SHD_BLOCK_LEN); - datactalloc++; } } } } - else - delhdrblocks+=(size/SHD_BLOCK_LEN); } - - else { /* Hyper Alloc */ - if(msg.hdr.attr&MSG_DELETE) - delhdrblocks+=(size/SHD_BLOCK_LEN); - else - acthdrblocks+=(size/SHD_BLOCK_LEN); } - - totallzhmsgs+=lzhmsg; - headers++; - if(msgerr && extinfo) { - printf("\n"); - printf("%-20s: %s\n","Message Base",smb.file); - printf("%-20s: %lu (%lu)\n","Message Number" - ,msg.hdr.number,msg.offset+1); - printf("%-20s: %s\n","Subject",msg.subj); - printf("%-20s: %s","To",msg.to); - if(msg.to_net.type) - printf(" (%s)",msg.to_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.to_net.addr) : msg.to_net.addr); - printf("\n%-20s: %s","From",msg.from); - if(msg.from_net.type) - printf(" (%s)",msg.from_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.from_net.addr) - : msg.from_net.addr); - printf("\n"); - printf("%-20s: %.24s\n","When Written" - ,ctime((time_t *)&msg.hdr.when_written.time)); - printf("%-20s: %.24s\n","When Imported" - ,ctime((time_t *)&msg.hdr.when_imported.time)); - printf("%-20s: %04hXh\n","Type" - ,msg.hdr.type); - printf("%-20s: %04hXh\n","Version" - ,msg.hdr.version); - printf("%-20s: %u\n","Length" - ,msg.hdr.length); - printf("%-20s: %04hXh\n","Attributes" - ,msg.hdr.attr); - printf("%-20s: %08lXh\n","Auxilary Attributes" - ,msg.hdr.auxattr); - printf("%-20s: %08lXh\n","Network Attributes" - ,msg.hdr.netattr); - printf("%-20s: %06lXh\n","Header Offset" - ,msg.idx.offset); - printf("%-20s: %06lXh\n","Data Offset" - ,msg.hdr.offset); - printf("%-20s: %u\n","Total Data Fields" - ,msg.hdr.total_dfields); - printf("\n"); } - - smb_freemsgmem(&msg); } - -if(number) - FREE(number); - -fprintf(stderr,"\r%79s\r100%%\n",""); - - -if(chkalloc && !(smb.status.attr&SMB_HYPERALLOC)) { - - fprintf(stderr,"\nChecking %s Data Blocks\n\n",smb.file); - - length=filelength(fileno(smb.sda_fp)); - - fseek(smb.sda_fp,0L,SEEK_SET); - for(l=0;l<length;l+=2) { - fprintf(stderr,"\r%2u%% ",l ? (long)(100.0/((float)length/l)) : 0); - i=0; - if(!fread(&i,2,1,smb.sda_fp)) - break; - if(!i) - deldatblocks++; } - - fclose(smb.sha_fp); - fclose(smb.sda_fp); - - fprintf(stderr,"\r%79s\r100%%\n",""); } - -total=filelength(fileno(smb.sid_fp))/sizeof(idxrec_t); - -dupenum=dupeoff=misnumbered=idxzeronum=idxnumerr=idxofferr=idxerr=0; - -if(total) { - -fprintf(stderr,"\nChecking %s Index\n\n",smb.file); - -if((offset=(ulong *)MALLOC(total*sizeof(ulong)))==NULL) { - printf("Error allocating %lu bytes of memory\n",total*sizeof(ulong)); - return(++errors); } -if((number=(ulong *)MALLOC(total*sizeof(ulong)))==NULL) { - printf("Error allocating %lu bytes of memory\n",total*sizeof(ulong)); - return(++errors); } -fseek(smb.sid_fp,0L,SEEK_SET); - -for(l=0;l<total;l++) { - fprintf(stderr,"\r%2lu%% %5lu ",l ? (long)(100.0/((float)total/l)) : 0,l); - if(!fread(&idx,sizeof(idxrec_t),1,smb.sid_fp)) - break; - fprintf(stderr,"#%-5lu (%06lX) 1st Pass ",idx.number,idx.offset); -/*** - if(idx.attr&MSG_DELETE) { - fprintf(stderr,"%sMarked for deletion\n",beep); - delidx++; } -***/ - for(m=0;m<l;m++) - if(number[m]==idx.number) { - fprintf(stderr,"%sDuplicate message number\n",beep); - dupenum++; - break; } - for(m=0;m<l;m++) - if(offset[m]==idx.offset) { - fprintf(stderr,"%sDuplicate offset\n",beep,idx.offset); - dupeoff++; - break; } - if(idx.offset<smb.status.header_offset) { - fprintf(stderr,"%sInvalid offset\n",beep); - idxofferr++; - break; } - if(idx.number==0) { - fprintf(stderr,"%sZero message number\n",beep); - idxzeronum++; - break; } - if(idx.number>smb.status.last_msg) { - fprintf(stderr,"%sOut-Of-Range message number\n",beep); - idxnumerr++; - break; } - number[l]=idx.number; - offset[l]=idx.offset; } - -if(l<total) { - fprintf(stderr,"%sError reading index record\n",beep); - idxerr=1; } -else { - fprintf(stderr,"\r%79s\r",""); - for(m=0;m<total;m++) { - fprintf(stderr,"\r%2lu%% %5lu ",m ? (long)(100.0/((float)total/m)) : 0,m); - fprintf(stderr,"#%-5lu (%06lX) 2nd Pass ",number[m],offset[m]); - for(n=0;n<m;n++) - if(number[m] && number[n] && number[m]<number[n]) { - fprintf(stderr,"%sMisordered message number\n",beep); - misnumbered++; - number[n]=0; - break; } } - fprintf(stderr,"\r%79s\r100%%\n",""); } -FREE(number); -FREE(offset); - -} /* if(total) */ - -totalmsgs+=smb.status.total_msgs; -totalmsgbytes+=(acthdrblocks*SHD_BLOCK_LEN)+(actdatblocks*SDT_BLOCK_LEN); -totaldelmsgs+=deleted; -totallzhsaved+=lzhsaved; -printf("\n"); -printf("%-35.35s (=): %lu\n" - ,"Status Total" - ,smb.status.total_msgs); -printf("%-35.35s (=): %lu\n" - ,"Index Records" - ,total); -printf("%-35.35s (=): %lu\n" - ,"Active Headers" - ,headers-deleted); -printf("%-35.35s ( ): %-8lu %13s bytes used\n" - ,"Active Header Blocks" - ,acthdrblocks,ultoac(acthdrblocks*SHD_BLOCK_LEN,str)); -printf("%-35.35s ( ): %-8lu %13s bytes used\n" - ,"Active Data Blocks" - ,actdatblocks,ultoac(actdatblocks*SDT_BLOCK_LEN,str)); -if(lzhblocks) - printf("%-35.35s ( ): %-8lu %13s bytes saved\n" - ,"Active LZH Compressed Data Blocks" - ,lzhblocks,ultoac(lzhsaved,str)); -printf("%-35.35s ( ): %lu\n" - ,"Header Records" - ,headers); -printf("%-35.35s ( ): %lu\n" - ,"Deleted Headers" - ,deleted); -printf("%-35.35s ( ): %-8lu %13s bytes used\n" - ,"Deleted Header Blocks" - ,delhdrblocks,ultoac(delhdrblocks*SHD_BLOCK_LEN,str)); -packable+=(delhdrblocks*SHD_BLOCK_LEN); -printf("%-35.35s ( ): %-8lu %13s bytes used\n" - ,"Deleted Data Blocks" - ,deldatblocks,ultoac(deldatblocks*SDT_BLOCK_LEN,str)); -packable+=(deldatblocks*SDT_BLOCK_LEN); - -if(orphan) - printf("%-35.35s (!): %lu\n" - ,"Orphaned Headers" - ,orphan); -if(idxzeronum) - printf("%-35.35s (!): %lu\n" - ,"Zeroed Index Numbers" - ,idxzeronum); -if(zeronum) - printf("%-35.35s (!): %lu\n" - ,"Zeroed Header Numbers" - ,zeronum); -/*** -if(delidx) - printf("%-35.35s (!): %lu\n" - ,"Deleted Index Records" - ,delidx); -***/ -if(idxofferr) - printf("%-35.35s (!): %lu\n" - ,"Invalid Index Offsets" - ,idxofferr); -if(dupenum) - printf("%-35.35s (!): %lu\n" - ,"Duplicate Index Numbers" - ,dupenum); -if(dupeoff) - printf("%-35.35s (!): %lu\n" - ,"Duplicate Index Offsets" - ,dupeoff); -if(dupenumhdr) - printf("%-35.35s (!): %lu\n" - ,"Duplicate Header Numbers" - ,dupenumhdr); -if(misnumbered) - printf("%-35.35s (!): %lu\n" - ,"Misordered Index Numbers" - ,misnumbered); -if(lockerr) - printf("%-35.35s (!): %lu\n" - ,"Unlockable Header Records" - ,lockerr); -if(hdrerr) - printf("%-35.35s (!): %lu\n" - ,"Unreadable Header Records" - ,hdrerr); -if(idxnumerr) - printf("%-35.35s (!): %lu\n" - ,"Out-Of-Range Index Numbers" - ,idxnumerr); -if(hdrnumerr) - printf("%-35.35s (!): %lu\n" - ,"Out-Of-Range Header Numbers" - ,hdrnumerr); -if(attr) - printf("%-35.35s (!): %lu\n" - ,"Mismatched Header Attributes" - ,attr); -if(timeerr) - printf("%-35.35s (!): %lu\n" - ,"Mismatched Header Import Time" - ,timeerr); -if(xlaterr) - printf("%-35.35s (!): %lu\n" - ,"Unsupported Translation Types" - ,xlaterr); -if(datactalloc) - printf("%-35.35s (!): %lu\n" - ,"Misallocated Active Data Blocks" - ,datactalloc); -if(actalloc) - printf("%-35.35s (!): %lu\n" - ,"Misallocated Active Header Blocks" - ,actalloc); -/*** -if(delalloc) - printf("%-35.35s (!): %lu\n" - ,"Misallocated Deleted Header Blocks" - ,delalloc); -***/ - -if(dfieldoffset) - printf("%-35.35s (!): %lu\n" - ,"Invalid Data Field Offsets" - ,dfieldoffset); - -if(dfieldlength) - printf("%-35.35s (!): %lu\n" - ,"Invalid Data Field Lengths" - ,dfieldlength); - - -printf("\n%s Message Base ",smb.file); -if((headers-deleted)!=smb.status.total_msgs || total!=smb.status.total_msgs - || (headers-deleted)!=total || idxzeronum || zeronum - || orphan || dupenumhdr || dupenum || dupeoff || attr - || lockerr || hdrerr || hdrnumerr || idxnumerr || idxofferr - || actalloc || datactalloc || misnumbered || timeerr - || dfieldoffset || dfieldlength || xlaterr || idxerr) { - printf("%shas Errors!\n",beep); - errors++; } -else - printf("is OK\n"); - -smb_unlocksmbhdr(&smb); -smb_close(&smb); -} - -if((totalmsgs && (totalmsgs!=smb.status.total_msgs || totallzhmsgs)) - || packable) - printf("\n"); -if(totalmsgs && totalmsgs!=smb.status.total_msgs) - printf("%-39.39s: %-8lu %13s bytes used\n" - ,"Total Active Messages" - ,totalmsgs,ultoac(totalmsgbytes,str)); -if(totallzhmsgs && totalmsgs!=smb.status.total_msgs) - printf("%-39.39s: %-8lu %13s bytes saved\n" - ,"Total LZH Compressed Messages" - ,totallzhmsgs,ultoac(totallzhsaved,str)); -if(packable) - printf("%-39.39s: %-8lu %13s bytes used\n" - ,"Total Deleted Messages" - ,totaldelmsgs,ultoac(packable,str)); - -if(pause_on_error && errlast!=errors) { - fprintf(stderr,"\7\nHit any key to continue..."); - if(!getch()) - getch(); - fprintf(stderr,"\n"); } - - -return(errors); -} diff --git a/src/sbbs2/smb/chksmb/makefile b/src/sbbs2/smb/chksmb/makefile deleted file mode 100644 index 186a09f140..0000000000 --- a/src/sbbs2/smb/chksmb/makefile +++ /dev/null @@ -1,52 +0,0 @@ -############################### -# Makefile for CHKSMB # -# For use with Borland C++ # -# Tabstop=8 # -############################### - -# Macros - -OS = DOS -CC = bcc -LD = tlink -INCLUDE = \bc31\include;.. -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -w-pro -LFLAGS = -n -c - -!ifdef __OS2__ -OS = OS2 -CC = c:\bcos2\bin\bcc -LD = c:\bcos2\bin\tlink -INCLUDE = c:\bcos2\include;.. -LIB = c:\bcos2\lib -CFLAGS = -d -C -I$(INCLUDE) -w-pro -LFLAGS = -c -w-srf -!endif - -MAIN = $(OS)\chksmb.exe -OBJS = $(OS)\chksmb.obj $(OS)\smblib.obj -HEADERS = ..\smblib.h ..\smbdefs.h ..\crc32.h - -# Implicit C Compile Rule -{.;..}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) $(LIB)\wildargs.obj -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) $(LIB)\wildargs.obj -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# All .obj modules -$(OS)\chksmb.obj: $(HEADERS) -$(OS)\smblib.obj: $(HEADERS) diff --git a/src/sbbs2/smb/crc16.c b/src/sbbs2/smb/crc16.c deleted file mode 100644 index 81ba4c9a98..0000000000 --- a/src/sbbs2/smb/crc16.c +++ /dev/null @@ -1,39 +0,0 @@ -/* CRC16.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* 16-bit CRC routines */ - -#include "smblib.h" - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort SMBCALL crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - diff --git a/src/sbbs2/smb/crc32.c b/src/sbbs2/smb/crc32.c deleted file mode 100644 index f432032d1c..0000000000 --- a/src/sbbs2/smb/crc32.c +++ /dev/null @@ -1,23 +0,0 @@ -/* CRC32.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* 32-bit CRC of a buffer */ - -#include "smblib.h" -#include "crc32.h" - -#ifdef __NT__ -# define CRCCALL _pascal -#else -# define CRCCALL -#endif - -ulong CRCCALL crc32(char *buf, ulong len) -{ - ulong l,crc=0xffffffff; - -for(l=0;l<len;l++) - crc=ucrc32(buf[l],crc); -return(~crc); -} diff --git a/src/sbbs2/smb/crc32.h b/src/sbbs2/smb/crc32.h deleted file mode 100644 index d0127ab888..0000000000 --- a/src/sbbs2/smb/crc32.h +++ /dev/null @@ -1,42 +0,0 @@ -/* 32-bit CRC */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -long crc32tbl[]={ /* CRC polynomial 0xedb88320 */ -0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, -0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, -0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, -0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, -0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, -0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, -0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, -0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, -0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, -0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, -0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, -0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, -0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, -0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, -0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, -0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, -0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, -0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, -0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, -0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, -0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, -0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, -0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, -0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, -0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, -0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, -0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, -0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, -0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, -0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, -0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, -0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -#define ucrc32(ch,crc) (crc32tbl[(crc^ch)&0xff]^(crc>>8)) - - diff --git a/src/sbbs2/smb/docs/smb.hst b/src/sbbs2/smb/docs/smb.hst deleted file mode 100644 index c13f8c1a98..0000000000 --- a/src/sbbs2/smb/docs/smb.hst +++ /dev/null @@ -1,327 +0,0 @@ -Synchronet Message Base Specification Modification History -========================================================== - -****************************** -01/20/94 Initial Release v1.00 -****************************** - -Quite a few spelling errors in SMB.TXT corrected. - -Estimated maximum number of messages (in Introduction of SMB.TXT) formula -corrected (1500 rounded to nearest 256 is 1536, not 2048). - -Pages 32 and 38 (SENDEREXT and RECIPIENTEXT header field types) incorrectly -stated the index record contains CRC-32s, when in fact the index contains -CRC-16s of the agent names or extensions. - -FORWARDTO header field types incorrectly stated they were for replies, rather -than forwarding instructions. - -Trigger header field types incorrectly stated they were "attachments" rather -than triggers. - -Bug fixed in smb_open() function in smblib.c: was allocating buffer via -setvbuf for wrong file pointer when opening header file. Caused loss of -memory (2k) everytime smb_open() was called. - -Bug fixed in smb_getmsghdr() function in smblib.c: msg->from_agent,to_agent, -and replyto_agent were not initialized properly. - -Added from_ext, to_ext, and replyto_ext fields to msg struct. Initialized -with call to smb_getmsghdr() function. These are convenience pointers for -the to, from, and replyto agent extensions (user numbers, usually). - -Fixed a nasty bug in the smb_freemsgdat() function, causing odd values in the -SDA file and cross-linked messages when fast allocation mode was not used for -new messages. - -smb_putmsghdr() function replaced by smb_putmsg() and it calls smb_putmsghdr() -and smb_putmsgidx() - previously smb_putmsghdr() actually wrote the header -and the index. So you must change any occurances of smb_putmsghdr() to -smb_putmsg() if you intend to write to both the index and header records. - -smb_open() now takes a "retry_time" parameter (number of seconds) to lock -and read the message base header and verify the "id" and "version". Added -new error codes: -1 indicates failure to lock message base header, -2 indicates -id mismatch, and -3 indicates incompatible message base version. - -rewind() and clearerr() calls added to library functions to eliminate the -problem of "sticky" error flags when using fread() and fwrite(). Reordered -the use of chsize() to force seeking (with fseek()) before using the file -descriptor operation (chsize()) would would fail under some circumstances. - -smb_getmsgidx() function now uses "fast" message number look-up algorythm. - -Added smb_getlastidx() function to retrieve the last index in the message -base. - -Allocation strategy for hfield and dfield elements of the smbmsg_t structure -were changed to require less memory. Rather than an array of pointers (pointer -to a pointer) of type hfield_t or dfield_t, they are simply an array (pointer) -of type hfield_t or dfield_t. The only change you need to make are any -references to "smbmsg_t.hfield[x]->etc" to "smbmsg_t.hfield[x].etc". - -Added several new error codes to smb_getmsghdr(). -7 indicates missing one -of the three mandatory header fields (sender, recipient, or subject). -8 -indicates that total_dfields element of smbhdr_t is incorrect (extends beyond -smbhdr_t.length). -9 indicates incompatible header version. - -New error code to smb_addcrc(), -4 indicates error getting length of file. - -smb_putmsghdr() returns -2 on failure write header, -3 on failure to write -dfield, -4 on failure to write hfield (fixed), -5 on failure to write hfield -(data), and -6 on failure to pad record with NULLs. - -Bugs fixed in sample conversion source code and SMBUTIL: Overwriting first -two bytes of next record when using self-packing storage, SBBSFIDO would -crash on blank kludge lines, SEEN-BYs weren't converted properly by SBBSFIDO, -and more. - -*** IMPORTANT *** -Index format changed, added message time field to idxrec_t for fast pointer -manipulation by (import) date/time stamp. This is SMB format v1.10 and is -not compatible with the v1.00 format. A conversion program (100TO110.EXE) -is included with source code for converted any existing message bases. - -CHKSMB, a utility for checking message bases for corruption, included with -SMBLIB. - -SMBUTIL and CHKSMB both accept wildcard arguments for processing multiple -message bases. - -idxrec_t.to and idxrec_t.from may contain USER NUMBER instead of CRC of user -names. This implementation is currently specific to E-mail boxes on Synchronet -BBS. E-mail from non-local users are stored with a "from" field of 0. - -********************** -03/28/94 Release v1.10 -********************** - -Forgot to include this file (oops). - -*********************** -03/28/94 Release v1.10a -*********************** - -Fixed problem with buffered fread() routine attempting to read into a locked -regions. - -Added smb_stack() function for saving (pushing) currently open message base -and ability to pop it off later. - -Added fix for keeping original sender information in smbmsg_t structure when -a message has been forwarded. - -CHKSMB now correctly support multiple destination messages (without reporting -missallocated active data blocks) and now reports packable bytes available. - -SMBUTIL can now conditionally compress a message base, only if so many K are -compressable. - -Fixed problem with incorrect UTC value. - -Added NET_WWIV network type. - -********************** -06/02/94 Release v1.11 -********************** - -Created Watcom compatible MAKEFILE for DOS, 32-bit DOS, and 32-bit OS/2 -versions of SMBUTIL. - -Enhanced macro definitions in SMBDEFS.H for MALLOC, FREE, and REALLOC to -support Watcom and other compilers other than Borland. Also added LMALLOC -and LFREE macros for large allocation (>64k) operations. - -Fixed problem with multiple calls to setvbuf() when using Watcom C libraries. -Memory allocated by setvbuf() would never be released. To work around this -Watcom C bug, a static buffer, shd_buf[], is now used instead. - -Fixed bug in smb_getmsghdr() that would cause it to return -6 when attempting -to allocate 0 length header fields. - -Added LZH.C to SMBLIB for message data compression/decompression. - -Removed the 16-bit CRC functions from SMBUTIL and put them in CRC16.C (now part -of SMBLIB) for easier integration into other applications. - -Added Hyper Allocation storage method to specification: smbstatus_t.reserved -changed to smbstatus_t.attr and SMB_HYPERALLOC bit is set when Hyper Allocation -storage is used for a message base. This is the only change between v1.10 and -v1.20 of the message base format. No other bits in smbstatus_t.attr are -currently defined. See the specification for definition of the Hyper Allocation -storage method. - -Changed SMB Storage and Retrieval Protocol chapters in the specification to -Pseudo-code examples. - -Added SMBLIB Storage and Retrieval C example chapters to the specification. - -Added field descriptions for message base header record fields and Status Info -(base header #1) record fields to the specification. - -Changed SMBLIB smb_addmsghdr() 'fast' argument to 'storage' to specify the -storage method to use (either SMB_SELFPACK, SMB_FASTALLOC, or SMB_HYPERALLOC). -Previous usage (0 for self-pack, 1 for fast) still compatible. - -Added smb_hallocdat() and smb_hallochdr() to SMBLIB functions for the Hyper -Allocation storage method. - -Added SMB_STACK_XCHNG operation to smb_stack() function, to exchange the top -of the stack with the currently open message base. - -********************** -02/14/95 Release v1.20 -********************** - -smb_close() was modified in the following ways: - Only attempts to close non-NULL file pointers - If shd_fp is currently open, calls smb_unlocksmbhdr() before closing - (just in case it was left locked by application) - -smb_open() was modified in the following ways: - Initializes all file pointers to NULL - calls smb_close() if any of the files couldn't be opened - -smb_locksmbhdr() was modified in the following ways: - If lock fails, attempts to unlock the header before next lock - attempt (just incase application attempts to lock a locked - header without first unlocking it) - -smb_lockmsghdr() was modified in the following ways: - If lock fails, attempts to unlock the header before next lock - attempt (same reason stated above) - -CHKSMB (1.21) was modified in the following ways: - Tests for valid translations strings in the .SDT files - Displays totals for bytes used by header and data blocks, bytes used - by deleted messages, and bytes saved by LZH compression - -SMBUTIL (1.21) underwent some minor cosmetic changes. - -*********************** -03/18/95 Release v1.20a -*********************** - -SMBUTIL (1.22) now compiles correctly under Watcom, using correct time zone -information. SMBUTIL maint() will no longer delete messages if max_age is -specified in the SMB header and the when_imported time for a message is in the -future. - -Fixed problem in LZH.C that would cause lzh_decode() to generate exception -errors when compiled with a 32-bit compiler. - -CHKSMB (1.22) now supports /E command line switch to display extended -information about corrupted messages. CHKSMB.C is now Watcom compatible. - -Added fflush() calls to all smblib functions that write to the SDT, SHA, or SDA -files. This eliminates the problem of duplicate data offsets (data blocks for -multiple messages pointing to the same location) causing corrupted SDT files -(unsupported translation types reported by CHKSMB). - -Added fflush() call after writing to SDT file in SMB_PUT example in SMB.TXT. - -Fixed example *2SMB.C files to be compatible with SMBLIB v1.20 smb_create() -function. - -Fixed smb_hallocdat() function prototype to stop redeclaration warnings. - -Minor typos in specification fixed. - -*********************** -04/24/95 Release v1.20b -*********************** - -Added SMB_EMAIL (1<<0) attribute definition for the message base status header -to specify a local e-mail message base where index "to" and "from" fields are -stored as user numbers, not CRC-16s (this is the only change between v1.20 -and v1.21 of the SMB format). - -Version 1.21 of FIXSMB no longer needs the "/M" switch to correctly fix a -Synchronet e-mail message base (as long as the SMB_EMAIL status attr is set). - -Version 1.23 of SMBUTIL can now import text into a Synchronet e-mail message -base (as long as the SMB_EMAIL status attr has been set). It will ask for the -sender and recipient user numbers. Fixed an apparently nasty bug that would -cause damage to message bases when (I)mporting (check for SMB_HYPERALLOC -attribute was backwards). Excess baggage in the SMBUTIL source code was also -removed (no longer supports /L, /F, and /D command line switches). Only -supports self-packing and hyper-allocated message bases (it will not damage -fast allocated bases, however). "SMBUTIL M" now correctly handles message bases -that contain messages that have been pre-flagged for deletion (MSG_DELETE attr -set). - -Changed smb_open(int retry_count) function: if retry_count is 0, then a "fast -open" method is used which doesn't lock and read the status header to check -for compatibility and validity of message base. - -Added SMBLIB_VERSION definition (string constant) to contain the current -version and revision (if applicable) of the SMB library. This version number -may not always be the same as SMB_VERSION (version of the SMB format) or the -current version of the specification. It may be helpful to include a display -of this version number somewhere in your application (i.e. printf("SMBLIB v%s" -,SMBLIB_VERSION);). - -Changed smb_stack() example in the Performance Issues chapter to keep two -message bases always open using SMB_STACK_XCHNG. - -Fixed bug in SMBUTIL that would cause an infinite loop when analysing an -extrememly corrupted HyperAllocated message base. - -Fixed bug in smb_stack() function when using SMB_STACK_XCHNG operation. Would -previously set current message base to an undefined message base, rather than -the message base on top of the stack (last pushed or exchanged). - -CHKSMB v1.22 compiled in the 1.20b release did not support wildcards (wasn't -linked with WILDARGS.OBJ) - this has been fixed and is the only change in -CHKSMB v1.23. - -********************** -05/31/95 Release v1.21 -********************** - -Add uchar forwarded element to smbmsg_t structure. This variable is initialized -by the smb_getmsghdr() function. If the message has been forwarded, it will -be set to non-zero. - -Fixed bug in LZH.C which caused lzh_decode() to produce incorrect results -(usually t's and spaces) when compiled with a 32-bit compiler. - -Added HUGE16 and FAR16 macros to SMBDEFS.H for huge and far pointers for -16-bit compilers only (default pointer type for 32-bit compilers). - -Fixed bug in FIXSMB.C that would initialize the SDA file to the wrong length. - -Added net type NET_MHS for MHS gateways. - -SMBUTIL (1.24) will no longer free deleted headers when maintaining a message -base if the /A (no analysis) command line switch is used. This speeds up the -message base maintenance/pack operation significantly by using: SMBUTIL /A MP - -*********************** -08/31/95 Release v1.21a -*********************** - -All smb_*() functions changed to accept pointers to an smb_t structure. This -eliminates the use of global variables (making DLLs difficult or impossible -to program). A pointer is used even if the function doesn't modify the data -to maintain a consistent API and compatibility with languages that don't -support the passing of user defined types by value (e.g. Visual Basic). - -The smb_t structure contains a retry_time element that defines the maximum -number of seconds to wait while trying to open a locked message base or record. -If this element of the passed smb_t variable is 0, a default value of 10 -seconds is used. - -Added smb_getmsgtxt() and smb_freemsgtxt() functions to SMBLIB.C (only included -if SMB_GETMSGTXT is defined). - -******************* -11/18/95 Beta v2.00 -******************* - -Bug in smb_getmsgtxt() with message data field lengths less than 2. - -********************** -03/22/96 Release v2.01 -********************** diff --git a/src/sbbs2/smb/docs/smb.src b/src/sbbs2/smb/docs/smb.src deleted file mode 100644 index 35fe9b22c9..0000000000 --- a/src/sbbs2/smb/docs/smb.src +++ /dev/null @@ -1,3592 +0,0 @@ - - - - - - - - - - - - - - - - - - - - Synchronet Message Base Specification - Version 1.21 - Updated 08/31/95 - - Copyright 1995 Digital Dynamics - - PO Box 501 - Yorba Linda, CA 92686 - - Voice: 714-529-6328 BBS: 714-529-9525 V.32/V.32bis - FAX: 714-529-9721 714-529-9547 V.FC - Fido: 1:103/705 ftp: netcom.com /pub/sb/sbbs - -Table of Contents -================= -&&Contents - -Introduction....................................................@@INTRO___ -Implementation Levels...........................................@@IMPLEVEL -Definitions.....................................................@@DEFINES_ - Acronyms................................................@@ACRONYMS - Data Types..............................................@@DATATYPE -File Formats....................................................@@FILEFORM - Index.....................(*.SID).......................@@SID_FORM - Header....................(*.SHD).......................@@SHD_FORM - Header Allocation.........(*.SHA).......................@@SHA_FORM - Data......................(*.SDT).......................@@SDT_FORM - Data Allocation...........(*.SDA).......................@@SDA_FORM - CRC History...............(*.SCH).......................@@SCH_FORM -Header Field Types..............................................@@HFIELD_T -Data Field Types................................................@@DFIELD_T -Messsage Attributes.............................................@@ATTRBITS -Translation Types...............................................@@XLATTYPE -Agent Types.....................................................@@AGENTTYP -Network Types...................................................@@NETWORKS -Media Types.....................................................@@MEDIATYP -Message Storage Pseudo Code.....................................@@STORPCOD -Message Retrieval Pseudo Code...................................@@READPCOD -SMBUTIL.........................................................@@SMBUTIL_ -CHKSMB..........................................................@@CHKSMB__ -FIXSMB..........................................................@@FIXSMB__ -SMBLIB (C library)..............................................@@SMBLIB__ - Data Types and Constants..(SMBDEFS.H)...................@@SMBDEFS_ - Global Variables..........(SMBVARS.C)...................@@SMBVARS_ - Function Prototypes.......(SMBLIB.H)....................@@SMBLIB.H - Library Functions.........(SMBLIB.C)....................@@SMBLIB.C - Miscellaneous.............(CRC*.* and LZH.*)............@@SMB_MISC -SMBLIB Storage Example..........................................@@SMB_PUT_ -SMBLIB Retrieval Example........................................@@SMB_GET_ -SMBLIB Performance Issues.......................................@@PERFORM_ -Bibliography....................................................@@BIBLIOGR -Implementations.................................................@@IMPLEMEN - -Introduction -============ -&&Introduction -$$INTRO___ - -Q. What is SMB? - -A. SMB (Synchronet Message Base) is a technical specification for the storage - format of electronic mail messages. These e-mail messages may all be - contained in one database, or, more commonly, separated into catagorized - databases. These message databases (or message bases) are also referred to - as "sub-boards", "forums", "conferences", and "SIGs". The messages may be - directed to an individual person, sent to a group of individuals, or sent - to everyone who can read messages in that message base. Messages may be - created and read soley at one physical location, or imported from and - exported to a message network that may span continents. Message bases that - are connected to a message network are often called "echoes". - - -Q. Why SMB? - -A. The Synchronet Message Base is designed to store high volumes of messages - while maintaining optimum search, retrieval, and creation performance. - These messages are not limited to mere text. In addition to text, SMB - defines the storage of digitized sound, MIDI, graphics, fonts, animation, - as well as other multimedia data and triggers for localized multimedia. - SMB thrives on a multi-user environment where messages are being created, - read, modified, and deleted by multiple tasks simultaneously. With the - large message networks of today being the rule, rather than the exception, - and high volumes of messages being imported on a daily, sometimes hourly - basis, creation and deletion speed is of the utmost importance. This is - where SMB really shines. Being extensible enough to handle message formats - from networks of today and tomorrow, and fast enough to import more messages - that humanly readable, the SMB format will more than meet your message - storage needs. - - -Q. Why a specification? - -A. Message bases are often accessed and modified by a number of different - programs. Often these programs are developed by individuals or companies - other than the original designer of the message base format. This - specification is an attempt to aid developers in creating programs that - access or modify a message base stored in the SMB format. - - -Q. Who can use this specification? - -A. Anyone that has interest in the Synchronet Message Base format at either - an educational or professional level. Specifically, software developers - interested or currently involved in the development of message readers, - editors, echomail (toss/scan) programs, message transfer agents (MTAs), - network gateways, and bulletin board systems. Much of the information in - this specification is intended for those with preexisting programming - knowledge, so those with little or no programming experience may find it - hard to comprehend. - - -Q. What does the SMB specification include? - -A. The text you are reading is part of the SMB specification: a single text - document that defines the storage format of each of the six files of an - SMB format message base and how they are related to each other. - - Included with this specification is C source code to be used as an example - to programmers of how to access an SMB format message base and public domain - library functions (SMBLIB) that can be compiled and linked into programs - that access an SMB format message base developed by third parties. An SMB - utility program (SMBUTIL) is also included with C source code as an example - of how to use the SMBLIB functions. - - -Q. Where did the SMB specification come from? - -A. Digital Dynamics (southern California based software development company) - released "Synchronet Multinode BBS Software Version 1a" in June of 1992 as - one of the first BBS packages to be designed from the ground-up to operate - in a multinode environment with incredible speed and reliability, with a - large suite of multinode specific features and design innovations. - - The original message base format was designed with localized messaging and - low volume message networks in mind. By January of 1993, it was clear that - high volume message networks (FidoNet, RelayNet, Usenet, etc.) were the - preference of most BBS users and a new message base format was required to - allow for high volume message storage, improved storage, retrieval, and - maintenance performance, as well as lower storage space requirements. - - Rather than introduce another new message format, Digital Dynamics sought - to implement an existing public specification for a format that would meet - current and future message storage needs. More than a few specifications - were seriously considered at one time or another, but after careful - examination, design flaws and lack of extensibility eliminated them from the - long term plans of Digital Dynamics and Synchronet BBS Software. Thus began - the design of the "Synchronet Message Base" (SMB) format. - - At the request of many message related program developers, Digital Dynamics - created and released the SMB specification before the release of "Synchronet - Version 2.00" to allow lead-time on developing support programs for the new - format. - - Digital Dynamics strongly encourages developers of message related programs - (including software that directly competes with Synchronet or other Digital - Dynamics products) to implement support for SMB. Though this is a public - specification and Digital Dynamics encourages developer suggestions, it will - remain under the sole control of Digital Dynamics unless specifically stated - otherwise in a future revision of this specification. - - Digital Dynamics requests that any organizations that wish to adopt or - ratify this specification, in part or whole, notify Digital Dynamics through - any of the contact methods listed at the beginning of this document. - - -Q. How does SMB store messages? - -A. Each message base is stored in a set of binary files. This set consists - of between three and six files depending the storage method used. The base - filename (maximum of eight characters under DOS) is the same for all six - files of the same message base and unique amoung the filenames of other - message bases in the same directory. The six files each have a different - three character extension. The first character of the extension is always - the letter 'S' (for SMB), while the second and third characters define the - contents of the file. - - Two of the six files associated with each message base are not recreatable - and therefore are the most important when considering data integrity. These - two files are the data file (with a .SDT extension) and header file (.SHD - extension). Both of these files use 256 byte blocks and have associated - block allocation tables (stored in .SDA and .SHA respectively) so that - deleted message blocks may be used by new messages without creating odd - sized unused 'holes' in the files. The block allocation table files (.SDA - and .SHA) can be recreated with the information stored in the header (.SHD) - file. When using Hyper Allocation storage method, the allocation files (.SDA - and .SHA) are not used. - - For fast indexing, there is a small fixed length index file (with a .SID - extension). This file allows for the immediate location of message header - records based on sender's name or user number, recipient's name or user - number, subject, message number, or message attributes. This file can be - recreated with the data stored in the header (.SHD) file. - - The last file is an optional CRC history (.SCH) file. It contains 32-bit - CRCs of a configurable number of messages imported or created locally. This - is to help eliminate duplicate messages created by user or program error. - The CRC history file can be recreated with the combination of information - stored in the data (.SDT) and header (.SHD) files. - -Q. How fast do messages import into an SMB message base? - -A. This is a very important question for systems for that import large volumes - of messages. Of course, the answer depends on the storage format which you - are importing from, the average length of messages, the design of the - program which is peforming the import process, as well as the hardware and - system software being used. What's important is that SMB will allow the - fastest import process possible with any given combination of the above - factors. - - Since system storage capacity is rarely infinite, neither is the number - of messages which can be stored in a message base. System operators must - define the maximum number of messages to be stored in a message base, the - maximum age of the messages in that message base, or a combination of both. - When using the Self-packing storage method (defined later in this document), - the smaller the number of messages stored in a message base, the faster the - import process. The SMB format is flexible enough to support multiple levels - of import performance based on optimizations for storage space or speed. - Most system operators will almost invariably choose speed over space, but - which choices are available is determined by the importing program. This - specification defines three storage methods, from slowest to fastest: - Self-packing, Fast Allocation, and Hyper Allocation. Other options defined - in this specification may affect storage performance, including duplicate - message checking and message compression/encryption. - - -Q. How much storage is required for an SMB message base? - -A. The biggest factor in determining storage requirements for a message base - is the maximum number of messages to be stored in the base (defined by the - system operator) and the average size of each message. The minimum required - storage for a message base is 32 bytes plus 532 bytes per message (plus four - bytes per message if duplicate message checking is used and three bytes - per message if Self-packing or Fast Allocation storage methods are used). - - The SMB format was originally designed to be "self-packing", meaning purged - (deleted) message header and data blocks will be used automatically by new - messages. Relying solely on self-packing, an SMB format message base will - never "shrink" in size. This is not to say that it will continually "grow" - in size, but that without specific packing procedures, deleted message - blocks may remain unused for extended periods of time, meanwhile using some - amount of storage space that could be recovered using specific packing - procedures. The Fast Allocation and Hyper Allocation storage methods do not - use deleted message blocks for new messages so specific packing procedures - must be used if any messages are deleted and that storage space is to ever - be recovered. - - Limiting the maximum age of messages in an SMB message base is another way - to control the storage requirements. While maximum message age definition is - optional, the definition of the maximum number of messages is not. - -Q. How many messages can be stored per SMB message base? - -A. Without considering storage limitations or message data lengths greater than - 256, the theoretical maximum number of messages that can be stored in a - single SMB message base is 16.7 million. Considering the variable length - nature of message and header data, it is suggested that the system operator - allow no more than 1 million messages per base. - - To determine an estimated maximum number of messages for a message base - using the average message data length as a factor, use the following - formula: - - 4.2 billion divided by the average message length rounded up to be evenly - divisible by 256. - - If the average message data length is 1500 bytes, the estimated maximum - number of messages would be 2,734,375 (4.2 billion divided by 1536). - - Implementations of this format may be further limited by available system - memory. - -Implementation Levels -===================== -&&Implementation Levels -$$IMPLEVEL -The SMB format can be implemented to varying degrees between programs without -creating compatibilty issues. Rather than have developers specifically state -which features they have and have not implemented, we have defined seven levels -of implementation (represented by Roman numerals I through VII). For a program -or software package to meet an implementation level, it must have all of the -features listed for that level and all of those for each level below it. The -minimum suggested imlementation is level I. The SMBUTIL program included with -this specification is an example of a level I implementation with features -from some of the higher implementation levels. - -Level I -------- -The minimum suggested level of implementation. Messages contain merely ASCII -text displayable on an ANSI terminal. Messages can be added to the message -base and if the maximum number of messages is exceeded, messages are removed -or marked for deletion. - -Level II --------- -The addition of file attachments, multiple index/header entries per message -(multiple destinations), multiple text bodies for the separation of message -text and tag/origin lines (for example), forwarding, threading, and specific -FidoNet kludge header field support makes this level of implementation more -realistic for bulletin board system and EchoMail software implementation. - -Synchronet Multinode BBS Software v2.00 has a level II implementation of this -specification. - -Level III ---------- -This implementation adds support for translation strings defined later in this -document for data compression, encryption, escaping, and encoding. This level -is still limited to basic ASCII text and ANSI escape sequence entry and -retrieval. - -Synchronet Multinode BBS Software v2.10 has a level III implementation of this -specification. - -Level IV --------- -The storage and retrieval of embedded and attached images is added in this -level of implementation. Supported images are limited to single binary or text -data blocks that can be displayed or transferred to the user (automatically, -or by request) if their display and translation protocols define specific -support for the image type. - -Level V -------- -This level of implementation adds support for embedded and attached sound data. -This includes digitized sound and MIDI data. Supported sounds are limited to -single binary or text data blocks that can be played or transferred to the user -(automatically or by request) if their presentation and translation protocols -define specific support for the sound type. - -Level VI --------- -Localized sound and image data can be triggered by messages stored and -retrieved in an implementation of this level. - -Level VII ---------- -Complete multimedia support is reached in this implementation level with -support for embedded and attached animation, sound, and video data. - - -Definitions -=========== -&&Definitions -$$DEFINES_ - -Control Characters ------------------- -When specifying control characters (ASCII 1 through 31), the caret symbol "^" -or the abreviation "ctrl-" followed by a character will be used to indicate the -value. ^A is equivalent to ASCII 1, ^B ASCII 2, etc. The case of the control -character is not significant (i.e. ^z and ^Z are equivalent). The control -character ^@ (ASCII 0) will be specified as NULL or 0. - - -Hexadecimal ------------ -Base sixteen numbering system which includes the digits 0-9 and A-F. -Hexadecimal numbers are represented in this document with a prefix of "0x" or -"\x" or a suffix of "h". Hexadecimal letter digits are not case sensitive -(i.e. the number 0xff is the same as 0xFF). - - -File dump ---------- -When example file dumps are displayed, the format is similar to that of the -output from the DOS DEBUG program. With the exception of the ASCII characters, -all numbers are in hexadecimal. - -Offset Byte values ASCII characters - -000000 53 4D 42 1A 10 01 20 00 F4 01 00 00 F4 01 00 00 SMB... .�...�... -000010 20 00 00 00 D0 07 00 00 D0 07 00 00 00 00 00 00 ...�...�....... - - -Bit values ----------- -Bit (or flag) values are represented in C notation as (1<<x) where x is the bit -number. (i.e. bit number 7 (1<<7) is the same as 0x80). - - -Word storage ------------- -All words (16-bit) and double words (32-bit) are stored in Intel 80x86 (little -endian) format with bytes stored from low to high (reverse of the Motorola -680x0 word storage format). - -A 16-bit word with the value 1234h is stored as 34h 12h. - -Translation strings -------------------- -Translation strings (xlat variables) are arrays of words (16-bit) in the order -of the original storage translation. The last translation type is followed by a -16-bit zero (defined later as XLAT_NONE). If there are no translations, then -the first and only element of the array is XLAT_NONE. - -If multiple translations are used, the translation order must be reversed -upon retrieval to obtain the proper data. - - -Local e-mail ------------- -When referring to the local e-mail message base of a Synchronet BBS, we are -referring specifically the message base with the name "MAIL" stored in the -"DATA" directory (e.g. \SBBS\DATA\MAIL). - -Messages stored in this message base are different in the following respects: - - The SMB_EMAIL status header attribute is set ON - Hyper Allocation storage method is not supported - The "To" and and "From" fields of the message indexes do NOT contain CRCs - -Acronyms: -======== -&&Definition of Acronyms -$$ACRONYMS - -ANSI American National Standards Institute -ASCII American Standard Code for Information Interchange -BBS Bulletin Board System -C The C programming language as defined by ANSI X3.159-1989 -CR Carriage Return character (ASCII 13) -CRC Cyclic Redundancy Check -CRC-16 Standard 16-bit CRC using 1021h polynomial (seed 0) -CRC-32 Standard 32-bit CRC using EDB88320h polynomial (seed -1) -CRLF Carriage Return character followed by a Line Feed character -FSC FidoNet Standards Commitee (FTS proposal) -FTN FidoNet Technology Network -FTS FidoNet Technical Standard -LF Line Feed character (ASCII 10) -QWK Compressed message packet format for message reading/networking -RFC Request for Comments -SMB Synchronet Message Base -UT Universal Time (formerly called "Greenwhich Mean Time") - -Data types -========== -&&Definition of Data Types -$$DATATYPE - -uchar Unsigned 8-bit value (0 through 255). - C example: - - #define uchar unsigned char - - -short Signed 16-bit value (-32768 through 32767). - "short" is a C keyword indicating "short int". - - -ushort Unsigned 16-bit value (0 through 65535). - C example: - - #define ushort unsigned short - - -ulong Unsigned 32-bit value (0 through 4294967295). - C example: - - #define ulong unsigned long - - -time_t Unsigned 32-bit value. - Seconds since 00:00 Jan 01 1970 (Unix format). - Used for all time/date storage in SMB as part of the when_t - data type. This time format will support dates through the year - 2105. - time_t is defined by ANSI C as a long (signed) which can - limit its date support to the year 2038 depending on the - library routines used. - - -ASCII String (aka character array) of 8-bit ASCII characters. - Characters with the bit 7 set (80h through FFh) represent - the IBM PC extended ASCII character set. When data or header - fields of this type are stored in the header, a NULL - terminator may or may not be present. - C example: - - uchar str[80]; - - -ASCIIZ ASCII string with (non-optional) NULL terminator. - C example: - - uchar str[81]; - -nulstr ASCII string immediately terminated by NULL. - C example: - - uchar *nulstr=""; - - -undef Data buffer with undefined contents. - C example: - - uchar buf[BUF_LEN]; - -when_t Date/Time stamp including time-zone adjustment information. - C example: - - typedef struct { - - time_t time; // Time stamp (in local time) - short zone; // Zone constant or Minutes (+/-) from UT - - } when_t; - - time: - - A time value of 0 is invalid and indicates an uninitialized - time stamp. - - Time stamps are always stored in universal time. i.e. - Regardless of what the local time zone is, Jan 1st 1994 00:00 - will always be stored as 2D24BD00h. - - zone: - - If the zone is in the range -720 to +720, it represents the - number of minutes east or west of UT. Values in this range - should only be used for time zones not otherwise represented - here. - - If the zone is greater than 720 or less than -720, then the - following bits have special meaning: - - (1<<12) // Non-US time zone (east of UT) - (1<<13) // Non-US time zone (west of UT) - (1<<14) // U.S. time zone - (1<<15) // Daylight savings - - The lower 12 bits (0 through 11) contain the number of minutes - east or west of UT (not accounting for daylight savings). - - If the time zone is one specified in the U.S. Uniform Time Act, - the following values represent the zone: - - AST 0x40F0 // Atlantic (-04:00) - EST 0x412C // Eastern (-05:00) - CST 0x4168 // Central (-06:00) - MST 0x41A4 // Mountain (-07:00) - PST 0x41E0 // Pacific (-08:00) - YST 0x421C // Yukon (-09:00) - HST 0x4258 // Hawaii/Alaska (-10:00) - BST 0x4294 // Bering (-11:00) - - With bit 15 set, the following values represent the same zone - with the presence of daylight savings: - - ADT 0xC0F0 // Atlantic (-03:00) - EDT 0xC12C // Eastern (-04:00) - CDT 0xC168 // Central (-05:00) - MDT 0xC1A4 // Mountain (-06:00) - PDT 0xC1E0 // Pacific (-07:00) - YDT 0xC21C // Yukon (-08:00) - HDT 0xC258 // Hawaii/Alaska (-09:00) - BDT 0xC294 // Bering (-10:00) - - The following non-standard time zone specifications may also be - used: - - MID 0x2294 // Midway (-11:00) - VAN 0x21E0 // Vancouver (-08:00) - EDM 0x21A4 // Edmonton (-07:00) - WIN 0x2168 // Winnipeg (-06:00) - BOG 0x212C // Bogota (-05:00) - CAR 0x20F0 // Caracas (-04:00) - RIO 0x20B4 // Rio de Janeiro (-03:00) - FER 0x2078 // Fernando de Noronha (-02:00) - AZO 0x203C // Azores (-01:00) - LON 0x1000 // London (+00:00) - BER 0x103C // Berlin (+01:00) - ATH 0x1078 // Athens (+02:00) - MOS 0x10B4 // Moscow (+03:00) - DUB 0x10F0 // Dubai (+04:00) - KAB 0x110E // Kabul (+04:30) - KAR 0x112C // Karachi (+05:00) - BOM 0x114A // Bombay (+05:30) - KAT 0x1159 // Kathmandu (+05:45) - DHA 0x1168 // Dhaka (+06:00) - BAN 0x11A4 // Bangkok (+07:00) - HON 0x11E0 // Hong Kong (+08:00) - TOK 0x121C // Tokyo (+09:00) - SYD 0x1258 // Sydney (+10:00) - NOU 0x1294 // Noumea (+11:00) - WEL 0x12D0 // Wellington (+12:00) - -fidoaddr_t FidoNet address stored as four ushorts that represent the zone, - network, node, and point (in that order). - C example: - - typedef struct { - - ushort zone, - net, - node, - point; - - } fidoaddr_t; - - -typestr_t ASCIIZ string with ushort type prefix. - C example: - - typedef struct { - - ushort type; // Specifier for type of 'str' - uchar str[]; // ASCIIZ filename or other string data - - } typestr_t; - - -mattach_t File attachment information with type prefix, translation - string, and filename. - C example: - - typedef struct { - - ushort type; // Attachment type - ushort xlat[]; // Translations of data in attachment - uchar str[]; // ASCIIZ filename - - } mattach_t; - -vattach_t Video file attachment information with type, compression, - translation string, and filename. - C example: - - typedef struct { - - ushort type; // Attachment type - ushort comp; // Compression method - ushort xlat[]; // Translations of data in attachment - uchar str[]; // ASCIIZ filename - - } vattach_t; - -mtext_t Message text with translation string prefix. - C example: - - typedef struct { - - ushort xlat[]; // Translations of text - uchar text[]; // Actual text data - - } mtext_t; - - -ftext_t Formatted message text with translation string prefix and - format type. - C example: - - typedef struct { - - ushort type; // See Image Types for valid types - ushort xlat[]; // Translations of data - uchar data[]; // Actual formatted text data - - } ftext_t; - - -membed_t Embedded data with type prefix, translation string, and ASCIIZ - description. - C example: - - typedef struct { - - ushort type; // Specifier for type of 'dat' - ushort xlat[]; // Translations of embedded data - uchar name[]; // ASCIIZ char description of embedded data - uchar data[]; // Binary data - - } membed_t; - -vembed_t Embedded video data with type, compression method, translation - string, and ASCIIZ description. - C example: - - typedef struct { - - ushort type; // Specifier for type of 'dat' - ushort comp; // Compression method - ushort xlat[]; // Translations of embedded data - uchar name[]; // ASCIIZ char description of embedded data - uchar data[]; // Binary data - - } vembed_t; - -File formats -============ -&&File Formats -$$FILEFORM -&&Index (*.SID) File Format -$$SID_FORM - -Index File (*.SID) ------------------- -The index file for each message base contains one record per message in the -base. Each record is fixed length using the following format: - -Index Record: ------------- -C example: - -typedef struct { - - ushort to; // 16-bit CRC of recipient name (lower case) or user number - ushort from; // 16-bit CRC of sender name (lower case) or user number - ushort subj; // 16-bit CRC of title/subject (lower case) - ushort attr; // attributes (MSG_PRIVATE, MSG_READ, etc. flags) - ulong offset; // byte offset of message header in header file - ulong number; // message serial number (1 based) - time_t time; // import date/time stamp (Unix format) - - } idxrec_t; - - -Example file dump (16 messages starting with message number 15): ---------------------------------------------------------------- -000000 36 4F 13 07 2A 77 00 00 20 00 00 00 0F 00 00 00 6O..*w.. ....... -000010 BE 62 76 2C 36 4F 46 0A 7F B2 00 00 20 01 00 00 �bv,6OF.�.. ... -000020 10 00 00 00 C7 29 78 2C 36 4F 70 6F 46 FF 00 00 ....�)x,6OpoF�.. -000030 20 02 00 00 11 00 00 00 AD D3 7A 2C 70 6F 13 07 .......��z,po.. -000040 46 FF 00 00 20 03 00 00 12 00 00 00 D6 F8 7F 2C F�.. .......��, -000050 36 4F E1 EA E7 E9 00 00 20 04 00 00 13 00 00 00 6O����.. ....... -000060 1E 7B 85 2C 37 0D 2E DF 4D 79 00 00 20 05 00 00 .{�,7..�My.. ... -000070 14 00 00 00 5C E1 A1 2C 90 54 2D 5A 86 62 00 00 ....\�,�T-Z�b.. -000080 20 06 00 00 15 00 00 00 39 2E A2 2C 70 6F 1A 8B .......9.�,po.� -000090 46 FF 00 00 20 07 00 00 16 00 00 00 D0 7B A8 2C F�.. .......�{�, -0000A0 2E DF 1A 8B 4D 79 00 00 20 08 00 00 17 00 00 00 .�.�My.. ....... -0000B0 FF 7B A8 2C B4 D9 35 7C 23 B1 00 00 20 09 00 00 �{�,��5|#�.. ... -0000C0 18 00 00 00 CE D4 BA 2C 36 4F BC D8 B2 E7 00 00 ....�Ժ,6O�ز�.. -0000D0 20 0A 00 00 19 00 00 00 14 5F C3 2C BA A8 4E B0 ........_�,��N� -0000E0 67 76 00 00 20 0B 00 00 1A 00 00 00 6F 89 C3 2C gv.. .......o��, -0000F0 36 4F 0C 01 19 9C 00 00 20 0C 00 00 1B 00 00 00 6O...�.. ....... -000100 F8 30 C6 2C 36 4F FA 48 0E 55 00 00 20 0D 00 00 �0�,6O�H.U.. ... -000110 1C 00 00 00 6A 94 D3 2C 36 4F F1 CE CF A2 00 00 ....j��,6O��Ϣ.. -000120 20 0E 00 00 1D 00 00 00 53 DB D5 2C 8D A6 21 CE .......S��,��!� -000130 F7 AB 00 00 20 0F 00 00 1E 00 00 00 31 29 DC 2C ��.. .......1)�, - - -Field descriptions: ------------------- -To: -The 'To' field is the CRC-16 of the name of the intended recipient agent of -this message or the intended recipient's user number. If the CRC is stored, the -text must be converted to lower case (A-Z changed to a-z) before the CRC is -calculated. If the message is forwarded to another agent, the original or new -index record must be changed to contain the CRC-16 of the new recipient name or -user number. This field must always contain the recipient user number for local -e-mail on a Synchronet BBS. Outbound netmail stored in the Synchronet local -e-mail message base will contain 0 in this field. - -From: -This field, similar to the 'To' field, contains the CRC-16 of the name of the -sending agent of this message or the sender's user number. If the CRC is -stored, the text must be converted to lower case (A-Z changed to a-z) before -the CRC is calculated. If the message is forwarded to another agent, the -original or new index record must be changed to contain the CRC-16 of the new -sender name or user number. If the message was imported into the local e-mail -message base on a Synchronet BBS via netmail, this field will contain 0. - -Subj: -The 'Subj' field contains the CRC-16 of the message's subject. The subject -must be converted to lower case (A-Z changed to a-z) and all preceeding -"re: "'s and "re:"'s removed before calculating the CRC-16. - -Attr: -This ushort is a bit field of the specific attributes for this message. -It is a clone of the 'attr' element of the msghdr_t structure. - -Offset: -This ulong is the offset (in bytes) in the header file for this message's -header record. - -Number: -This ulong is the serial number of this message. Valid values are 1 through -0xffffffff. No two index records in the same message base may have the same -message number. All index records must have sequential, but not necessarily -consequetive, message numbers. - -Time: -This field is the date/time stamp the message was imported to or posted in -the message base. It is a clone of the 'when_imported.time' element of the -msghdr_t structure. - -Header File (*.SHD) -=================== -&&Header File (*.SHD) Format -$$SHD_FORM - -Each SMB header file is made up of two distinct sections: base header records -and message header records (usually the bulk of the file). - -Base Header Records: -------------------- -Base header records are blocks of data that apply to the entire message base -and are of variable length. This specification defines only one base header -record, the "Status info" (smbstatus_t) record. This status info record must be -the first base header record in the file and must be modified if additional -base header records are added. - -Additional header records allow other developers to store configuration and -status information particular to their application needs. It also allows for -future header record definitions as part of this specification without causing -backward compatibility issues. - -Each base header record contains a fixed length portion (smbhdr_t) and an -optional variable length portion. - -Whenever a base header record is read or updated (written), it must first -be successfully locked and subsequently unlocked. - -The first base header record (Status Info) is used as a semaphore when writing -to the message index (.SID) file and, when using the Hyper Allocation storage -method, writing to the message data (.SDT) file. This record must be -succesfully locked before writing and subsequently unlocked. This is to insure -that multiple applications simultaneously writing to the same message base -does result in corrrupted data. - - -Message Header Records: ----------------------- -Following the last base header record is the first message header record. Each -header record is stored in one or more 256 byte blocks. There must be exactly -one active message header record for every index record in the index file. -(Note: This does not include deleted message headers that have not been -overwritten by a new message header). - -Each message header record contains a fixed length portion (msghdr_t), a list -of zero or more fixed length data fields (dfield_t), and a list of three or -more variable length header fields (hfield_t). - -The value of the data stored in the zero or more unused bytes of the last -header record block have an undefined value, though whenever possible -developers should initialize to binary zero for human readability. - -Whenever a message header record is read or updated (written), it must first -be successfully locked and subsequently unlocked. - -Base Header Record (Fixed Portion): ----------------------------------- -C example: - -typedef struct { - - uchar id[4]; // text or binary unique hdr ID - ushort version; // version number (initially 100h for 1.00) - ushort length; // length including this struct - - } smbhdr_t; - - -Base Header Record Field Descriptions: -------------------------------------- -Id: -This is a four byte unique ID identifying the type of the base header record. -The bytes may contain any value, but printable ASCII characters are preferred. -The only ID defined in this specification is "SMB^Z" used by the Status Info -base header record. - -Version: -This is a version number of the base header record type. Base header records -of different versions may have different formats or contain different -information. This is to aid the application in determining if the record -is pertinent and if so, to what degree. The Status Info base header record -uses this version field to define the version of the format for the entire -message base (currently 0x121 for version 1.21). - -Length: -This is entire length in bytes of this header record (including both fixed -and variable portions). - - -Base Header #1 (Status info) Record (Variable Portion): ------------------------------------------------------- -C example: - -typedef struct { - - ulong last_msg; // last message number posted or imported - ulong total_msgs; // total messages currently in message base - ulong header_offset; // byte offset to first header record - ulong max_crcs; // Maximum number of CRCs to keep in history - ulong max_msgs; // Maximum number of messages to keep in base - ushort max_age; // Maximum age of messages (days) to keep in base - ushort attr; // Attribute bits - - } smbstatus_t; - -Base Header #1 (Status Info) Record (Variable Portion) Field Descriptions: -------------------------------------------------------------------------- -Last_msg: -This is the serial number of the last message imported or posted into this -message base. The index, header, and data records for this message may possibly -not exist (due to deletion). This field is used for determining the message -number to give to a new message being imported or posted into this message -base. This field must be updated for every message added to the message base. - -Total_msgs: -This is the total number of active messages currently in the message base. -This number should match the number of records in the index (.SID) file -and active header records in the header (.SHD) file. This field must be -updated whenever a message is added to or removed from the message base. - -Header_offset: -This is the byte offset to the first message header record. It is useful -for skipping all the base header records and going directly to the first -message header record. - -Max_crcs: -This is the maximum number of message CRCs to store in the CRC history (.SCH) -file for duplicate message checking. If this field contains 0, then duplicate -message checking is disabled. - -Max_msgs: -This is the preferred maximum number of messages to keep in this message -base as specified by the system operator. It is used by maintenance programs -that trim the message base down by removing old messages. This field should -be ignored by applications importing or posting messages allowing them to -exceed this maximum at will. - -Max_age: -This field is the maximum age (in days) of messages to keep in the message -base. It is used by maintenance programs to purge out-dated messages from -the message base. - -Attr: -This is a bit field containing specific attributes (or flags) that may define -the way messages are stored or retrieved from the this message base. The -following attributes are defined: - - SMB_EMAIL (1<<0) - - Indicates the message base is specifically for messages to or from local - users. When this bit is set, the idxrec.to and idxrec.from fields will - contain the user numbers (or 0 for non-user destination/source) instead of - the CRC-16 of the agent name. - - SMB_HYPERALLOC (1<<1) - - Indicates the message base uses the Hyper Allocation storage method. This - bit should not be cleared by an application without first deleting all the - messages in the message base. This is due to the fact the Hyper Allocation - is not downward compatible with the Self-packing and Fast Allocation - storage methods. - -When used with Synchronet BBS software, a message base must NOT have both of -the above attributes set. The only message base that should have the SMB_EMAIL -attribute set is the DATA\MAIL message base. - - -Base Header #1 (Status info) Record Contents: --------------------------------------------- -smbhdr.id="SMB\x1a"; // SMB^Z -smbhdr.version=0x121; // v1.21 -smbhdr.length=sizeof(smbhdr_t)+sizeof(smbstatus_t); smbstatus_t status; - - -Additional Base Headers: ------------------------ -Additional headers from developers must have initial 8 bytes in smbhdr_t -format, length must include size of smbhdr_t, and header_offset of smbstatus_t -must be changed to include the size of the additional header(s). - - -Example file dump (base header portion only): --------------------------------------------- -000000 53 4D 42 1A 20 01 20 00 F4 01 00 00 F4 01 00 00 SMB. . .�...�... -000010 20 00 00 00 D0 07 00 00 D0 07 00 00 00 00 00 00 ...�...�....... - - -Message Header Record (Fixed portion): -------------------------------------- -C example: - -typedef struct { - - uchar id[4]; // SHD^Z (same for all types and versions) - ushort type; // Message type (this is the definition of type 0) - ushort version; // Version of type (initially 100h for 1.00) - ushort length; // Total length of fixed portion + all fields - ushort attr; // Attributes (bit field) (duplicated in SID) - ulong auxattr; // Auxillary attributes (bit field) - ulong netattr; // Network attributes (bit field) - when_t when_written; // Date/Time message was originally created - when_t when_imported; // Date/Time message was imported (locally) - ulong number; // Message number (unique, not necessarily seq.) - ulong thread_orig; // Original message number in thread - ulong thread_next; // Next message in thread - ulong thread_first; // Number of first reply to this message - uchar reserved[16]; // 16 reserved bytes for future use - ulong offset; // Offset for buffer into data file (0 or mod 256) - ushort total_dfields; // Total number of data fields - - } msghdr_t; - -typedef struct { - - ushort type; // See "Data Field Types" values - ulong offset; // Offset into buffer - ulong length; // Length of data field in buffer - - } dfield_t; - -typedef struct { - - ushort type; // See "Header Field Types" for values - ushort length; // Length of buffer - uchar dat[length]; - - } hfield_t; - -Example file dump (one header record, both fixed and variable length portions): ------------------------------------------------------------------------------- -000020 53 48 44 1A 00 00 20 01 F5 00 00 00 00 00 00 00 SHD... .�....... -000030 00 00 00 00 46 DB F7 2C 00 00 7D D7 29 2D 00 00 ....F��,..}�)-.. -000040 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ -000060 00 00 00 00 02 00 00 00 00 00 00 00 4A 01 00 00 ............J... -000070 02 00 4A 01 00 00 53 00 00 00 00 00 13 00 4D 61 ..J...S.......Ma -000080 72 69 61 6E 6E 65 20 4D 6F 6E 74 67 6F 6D 65 72 rianne Montgomer -000090 79 30 00 0C 00 43 61 72 6F 6C 20 47 61 69 73 65 y0...Carol Gaise -0000A0 72 60 00 07 00 46 61 72 6E 68 61 6D A4 00 14 00 r`...Farnham�... -0000B0 31 3A 31 33 38 2F 31 30 32 2E 30 20 32 63 66 38 1:138/102.0 2cf8 -0000C0 30 35 37 36 A5 00 14 00 31 3A 33 34 33 2F 31 30 0576�...1:343/10 -0000D0 30 2E 30 20 32 63 66 33 62 39 30 61 A3 00 23 00 0.0 2cf3b90a�.#. -0000E0 31 33 38 2F 31 30 32 20 31 20 32 37 30 2F 31 30 138/102 1 270/10 -0000F0 31 20 32 30 39 2F 32 30 39 20 31 30 33 2F 30 20 1 209/209 103/0 -000100 33 35 35 02 00 02 00 02 00 03 00 08 00 01 00 8A 355............� -000110 00 66 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .f.............. - -Contents of example header: --------------------------- -id SHD^Z -type 0000h -version 0120h -length 245 -attr 0000h -auxattr 00000000h -netattr 00000000h -when_written Sat Nov 27 17:57:10 1993 -when_imported Tue Jan 04 15:54:21 1994 -number 1 -thread_orig 0 -thread_next 0 -thread_first 0 -reserved[16] -offset 0 -total_dfields 2 - -dfield[0].type 00h -dfield[0].offset 0 -dfield[0].length 330 -dfield[1].type 02h -dfield[1].offset 330 -dfield[1].length 83 - -hfield[0].type 00h -hfield[0].length 19 -hfield[0]_dat Marianne Montgomery -hfield[1].type 30h -hfield[1].length 12 -hfield[1]_dat Carol Gaiser -hfield[2].type 60h -hfield[2].length 7 -hfield[2]_dat Farnham -hfield[3].type A4h -hfield[3].length 20 -hfield[3]_dat 1:138/102.0 2cf80576 -hfield[4].type A5h -hfield[4].length 20 -hfield[4]_dat 1:343/100.0 2cf3b90a -hfield[5].type A3h -hfield[5].length 35 -hfield[5]_dat 138/102 1 270/101 209/209 103/0 355 -hfield[6].type 02h -hfield[6].length 2 -hfield[6]_dat 02 00 -hfield[7].type 03h -hfield[7].length 8 -hfield[7]_dat 01 00 8A 00 66 00 00 00 - -Fixed Portion Field descriptions: --------------------------------- -Id: -This field (regardless of the header type or version) must always contain the -the string "SHD^Z". This is to aid in the restoration of a corrupted header -file and give a visual indication of the beginning of a new header record when -viewing dumps of the header file. - -Type: -This is the message header type. Only one type is currently defined by this -specification (type 0). Any and all future header types will have the first -4 fields (10 bytes) in the same format of type 0. This allows other types -(with different lengths) to be skipped because the 4th field (length) will -always be in the same position. - -Version: -This is the version of this header type. This specification defines version -1.21 of message header type 0 (stored as 121h). - -Length: -This is the total length of this message header record (including both fixed -and variable length portions, but NOT including unused block space). - -Attr: -This is a bit field (16-bit) containing basic message attributes (flags) for -this message. An exact duplicate of this field is stored in the index file as -well. They must always match. - -Auxattr: -This is a bit field (32-bit) containing the auxillary attributes (flags) for -this message. The attributes stored in this variable are more specific in -nature and less critical than those in the Attr field. - -Netattr: -This is a bit field (32-bit) containing the network attributes (flags) for this -message. The attributes stored in this variable are related solely to message -networking. - -When_written: -This is the date and time when the message was originally created. - -When_imported: -This is the date and time when the message was posted on or imported into the -local message system. - -Number: -This is the message's unique serial number (from 1 to FFFFFFFFh). This field -is duplicated in the index file. They must always match. - -Thread_orig: -If this message is a reply, then this field contains the number of the original -message that was replied to. If this message was not a reply, this field will -contain the value 0. - -Thread_next: -If this message is a reply, and there are later replies to that message -(the message number contained in the Thread_orig field), then this field will -contain the number of the next reply in the chain. If this message is the only -reply to the orignal message, this field will contain the value 0. - -Thread_first: -If there are any replies to this message (after it has been posted), this field -will contain the number of the first reply to this message. If there are no -replies to this message, this field will contain the value 0. - -Reserved: -Unused bytes, reserved for future definition in the message header type 0 -specification. - -Offset: -The byte offset into the data file, specifying the start of the buffer for -all data associated with this message. This value must be either 0 or modula -256. When retrieving the actual data portion of data fields, the physical -offset into the file will be the offset of the message data buffer (this field) -plus the offset of the individual data field (msghdr_t.offset+dfield_t.offset). - -Total_dfields: -This field contains the total number of data fields associated with this -message. The value of this field must match the actual number of data fields -stored in the header (dfield_t data types following the fixed portion of the -message header). - - -Variable Portion Field descriptions: ------------------------------------ -See the Header Field Type and Data Field Type sections for the descriptions -of the values contained in these fields. - -Message Header Block Allocation (*.SHA) -======================================= -&&Header Allocation File (*.SHA) Format -$$SHA_FORM - -If this message base uses the Hyper Allocation storage method (the -SMB_HYPERALLOC bit is set in the smbstatus_t.attr field), then this file is -not created or used. - -This file contains no header or signature data. Each byte (uchar) in the file -specifies the allocation state of the corresponding 256 byte block in the -header (*.SHD) file. A value of 0 indicates a free header block, and a value of -1 indicates an allocated block. Other non-zero values are undefined. - -This file must always be opened DENY ALL (non-shareable). - -Message Data (*.SDT) -==================== -&&Data File (*.SDT) Format -$$SDT_FORM - -This file contains no header or signature data. It contains the text and other -embedded data for the messages in a single message base. The data for each -message always begins on a 256 byte block boundary. The data in the unused -portion of a data block is undefined, but should be initialized to NULL -whenever possible. - -This file must always be opened DENY NONE (shareable). - -Data fields of type TEXT_BODY and TEXT_TAIL must have all trailing white space -and control characters removed (i.e. the last character of the data record -must be in the range 21h to FFh). The only exception to this rule, is if the -TEXT_BODY is terminated with multiple contiguous CRLFs, only the last CRLF -should be removed. A CRLF should always be appended to the text data when it is -displayed. - -When reading from this file, it is a good idea to make sure the message header -for the data being read is currently locked (though no single message header -should be locked for extended durations of time). This will insure that no -other application will write to this portion of the file while it's being -read (read from disk, not displayed). - -When using the Hyper Allocation storage method, the Status Info message base -header must be successfully locked before writing to this file and subsequently -unlocked. - -Message Data Block Allocation (*.SDA) -===================================== -&&Data Allocation File (*.SDA) Format -$$SDA_FORM - -If this message base uses the Hyper Allocation storage method (the -SMB_HYPERALLOC bit is set in the smbstatus_t.attr field), then this file is -not created or used. - -This file contains no header or signature data. Each word (ushort) in the file -specifies the allocation state of the corresponding 256 byte block in the data -(*.SDT) file. A value of 0 indicates a free block, and a non-zero value -indicates the number of message header records associated with this message -data (most often 1). Each block can be used by up to 65,535 header records. - -This file must always be opened DENY ALL (non-shareable). - -CRC history for duplicate message checking (*.SCH) -================================================== -&&CRC History File (*.SCH) Format -$$SCH_FORM - -This file is optional and contains no header or signature data. Each long word -(ulong) in the file contains a CRC-32 of previously posted/imported messages. -These CRCs can be used to check a candidate message for posting/import to be -sure the message isn't a duplicate created by human or program error. The -maximum number of CRCs to store is defined in the first message base header -record (smbstatus_t.max_crcs). - -The CRC is calculated on the first TEXT_BODY data field before any translations -are applied (e.g. encoding, compression, encryption). - -This file must always be opened DENY ALL (non-shareable). - -Header Field Types: -================== -&&Header Field Types -$$HFIELD_T - -These are the defined valid values for hfield_t.type: - -Name : SENDER -Value : 00h -Data : ASCII -Multiple : Yes, order significant -Required : Yes -Summary : Name of agent that sent this message - -If blank (0 length or nulstr), assumed "Anonymous". If multiple SENDER fields -exist, then the message has been forwarded and the order of the fields in the -record must match the forwarding order (chronologically). When forwarding a -message, the original SENDER field should be left intact and new SENDER, -FORWARDED, and RECIPIENT fields added to the end of the record. - -Name : SENDERAGENT -Value : 01h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : AGENT_PERSON or previous SENDERAGENT if exists -Summary : Type of agent that sent this message - -If multiple SENDER fields exist, then the message has been forwarded. If any of the -forwarding agents is of a type other than AGENT_PERSON, then this field must -follow that SENDER field to specify the agent type. - -Name : SENDERNETTYPE -Value : 02h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : NET_NONE or previous SENDERNETTYPE if exists -Summary : Type of network message was sent from - -If multiple SENDERNETADDR fields are included, a SENDERNETTYPE field should be -included before each to determine what data type the address is stored in. - -Name : SENDERNETADDR -Value : 03h -Data : undef -Multiple : Yes, order significant -Required : No -Default : Previous SENDERNETADDR if exists -Summary : Network address for agent that sent this message - -The SENDERNETTYPE field indicates the data type of this field. If the -SENDERNETTYPE is of type NET_INTERNET, the local-part of the Internet -address is optional. If the local-part separator character ('@') is omitted, -the SENDER field is assumed to be the local-part of the address. - -Name : SENDEREXT -Value : 04h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous SENDEREXT if exists -Summary : Extension of sending agent - -This field is useful for storing the sending agent's extension, when the -agent's extension binds more tightly than the agent's name. - -For example, Synchronet Multinode BBS Software stores local e-mail with the -sending and receiving agent's user numbers stored as their respective -extensions. This is done so that if a user name changes for some reason, -messages will not "disappear" from the user's mail box. - -If the SMB_EMAIL status header attribute is set, then the "From" field in the -index must contain the binary value of this field rather than the CRC-16 of the -SENDER (name) field. - -Name : SENDERPOS -Value : 05h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous SENDERPOS if exists -Summary : Position of sending agent - -Primarily for documentary purposes, this field contains the position of the -sending agent (i.e. President, Sysop, C.E.O., MIS Director, etc). - -It can also be useful for getting a message or reply to the intended -recipient when the agent name is not located or is unknown, but the position -of the agent is known and specified. - -Name : SENDERORG -Value : 06h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous SENDERORG if exists -Summary : Organization name of sending agent - -Primarily for documentary purposes, this field contains the organization to -which the sending agent belongs (i.e. Microsoft, Joe's BBS, SoCal User's Group, -etc). - -Name : AUTHOR -Value : 10h -Data : ASCII -Multiple : Yes -Required : No -Default : First SENDER -Summary : Name of agent that created this message - -This field can only be added by the process that originally creates the -message. It should not be included if same as first SENDER field. If multiple -AUTHOR fields exist, then the message was created by multiple agents and is -considered valid. The order of multiple AUTHOR fields in the record is not -significant. - -Name : AUTHORAGENT -Value : 11h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : SENDERAGENT or previous AUTHORAGENT if exists -Summary : Type of agent that created this message - -This field can only be added by the process that originally creates the -message. It should not be included if same as first SENDERAGENT field. If -multiple AUTHOR fields exist, then the message was created by multiple agents -and if the agent type for any of the authors is other than AGENT_PERSON, an -AUTHORAGENT field must follow to specify the agent type. - -Name : AUTHORNETTYPE -Value : 12h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : SENDERNETTYPE or previous AUTHORNETTYPE if exists -Summary : Type of network this author is member of - -Name : AUTHORNETADDR -Value : 13h -Data : undef -Multiple : Yes, order significant -Required : No -Default : SENDERNETADDR or previous AUTHORNETADDR if exists -Summary : Network address of this author - -Name : AUTHOREXT -Value : 14h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : SENDEREXT or previous AUTHOREXT if exists -Summary : Extension of this author - -Name : AUTHORPOS -Value : 15h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : SENDERPOS or previous AUTHORPOS if exists -Summary : Position of this author - -Name : AUTHORORG -Value : 16h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : SENDERORG or previous AUTHORORG if exists -Summary : Organization this author belongs to - -Name : REPLYTO -Value : 20h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDER -Summary : Name of agent that replies should go to - -Name : REPLYTOAGENT -Value : 21h -Data : ushort -Multiple : Yes, but only last is valid -Required : No -Default : SENDERAGENT -Summary : Type of agent that replies should go to - -Name : REPLYTONETTYPE -Value : 22h -Data : ushort -Multiple : Yes, but only last is valid -Required : No -Default : SENDERNETTYPE -Summary : Type of network that replies should go to - -Name : REPLYTONETADDR -Value : 23h -Data : undef -Multiple : Yes, but only last is valid -Required : No -Default : SENDERNETADDR -Summary : Network address that replies should go to - -Name : REPLYTOEXT -Value : 24h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDEREXT -Summary : Extension of agent that replies should go to - -Name : REPLYTOPOS -Value : 25h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDERPOS -Summary : Position of agent that replies should go to - -Name : REPLYTOORG -Value : 26h -Data : ASCII -Multiple : Yes, but only last is valid -Required : No -Default : SENDERORG -Summary : Organization of agent that replies should go to - -Name : RECIPIENT -Value : 30h -Data : ASCII -Multiple : Yes, order significant -Required : Yes -Default : "All" -Summary : Name of agent to receive this message - -If multiple RECIPIENT fields exist, the message has been forwarded and for each -additional RECIPIENT field (after the initial RECIPIENT), there should be a -FORWARDED field. The order of the RECIPIENT fields in the record must match the -order in which the message was sent and forwarded (chronologically). - -Name : RECIPIENTAGENT -Value : 31h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : AGENT_PERSON or previous RECIPIENTAGENT if exists -Summary : Type of agent to receive this message - -If multiple RECIPIENT fields exist, the message has been forwarded. If any of -the recipient agents are of a type other than AGENT_PERSON, this field must -follow the RECIPIENT field to specify the agent type. - -Name : RECIPIENTNETTYPE -Value : 32h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : NET_NONE or previous RECIPIENTNETTYPE if exists -Summary : Type of network to receive this message - -Name : RECIPIENTNETADDR -Value : 33h -Data : undef -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTNETADDR if exists -Summary : Address of network to receive this message - -Name : RECIPIENTEXT -Value : 34h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTEXT if exists -Summary : Extension of agent to receive this message - -If SMB_EMAIL status header attribute is set, then the "To" field in the index -must contain the binary value of this field rather than the CRC-16 of the -RECIPIENT (name) field. This is the case specifically with the local e-mail -message base on a Synchronet BBS. - -Name : RECIPIENTPOS -Value : 35h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTPOS if exists -Summary : Position of agent to receive this message - -Name : RECIPIENTORG -Value : 36h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : Previous RECIPIENTORG if exists -Summary : Type of agent to receive this message - -Name : FORWARDTO -Value : 40h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Name of agent this message is to be forwarded to - -Name : FORWARDTOAGENT -Value : 41h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTAGENT or previous FORWARDTOAGENT if exists -Summary : Type of agent this message is to be forwarded to - -Name : FORWARDTONETTYPE -Value : 42h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETTYPE or previous FORWARDTONETTYPE if exists -Summary : Type of network this message is to be forwarded to - -Name : FORWARDTONETADDR -Value : 43h -Data : undef -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETADDR or previous FORWARDTONETADDR if exists -Summary : Network address this message is to be forwarded to - -Name : FORWARDTOEXT -Value : 44h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTEXT or previous FORWARDTOEXT if exists -Summary : Extension of agent this message is to be forwarded to - -Name : FORWARDTOPOS -Value : 45h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTPOS or previous FORWARDTOPOS if exists -Summary : Position of agent this message is to be forwarded to - -Name : FORWARDTOORG -Value : 46h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTORG or previous FORWARDTOORG if exists -Summary : Organization of agent this message is to be forwarded to - -Name : FORWARDED -Value : 48h -Data : when_t -Multiple : Yes, order significant -Required : Yes, if forwarded -Summary : Date/Time this message was forwarded to another agent - -Name : RECEIVEDBY -Value : 50h -Data : ASCII -Multiple : Yes, order significant -Required : Yes, if receiving agent is other than RECIPIENT -Summary : Name of agent that received this message - -Name : RECEIVEDBYAGENT -Value : 51h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTAGENT or previous RECEIVEDBYAGENT if exists -Summary : Type of agent that received this message - -Name : RECEIVEDBYNETTYPE -Value : 52h -Data : ushort -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETTYPE or previous RECEIVEDBYNETTYPE if exists -Summary : Type of network that received this message - -Name : RECEIVEDBYNETADDR -Value : 53h -Data : undef -Multiple : Yes, order significant -Required : No -Default : RECIPIENTNETADDR or previous RECEIVEDBYNETADDR if exists -Summary : Network address that received this message - -Name : RECEIVEDBYEXT -Value : 54h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTEXT or previous RECEIVEDBYEXT if exists -Summary : Extension of agent that received this message - -Name : RECEIVEDBYPOS -Value : 55h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTPOS or previous RECEIVEDBYPOS if exists -Summary : Position of agent that received this message - -Name : RECEIVEDBYORG -Value : 56h -Data : ASCII -Multiple : Yes, order significant -Required : No -Default : RECIPIENTORG or previous RECEIVEDBYORG if exists -Summary : Organization of agent that received this message - -Name : RECEIVED -Value : 58h -Data : when_t -Multiple : Yes, order significant -Required : Yes, if received -Default : NULL -Summary : Date/Time this message was received - -Name : SUBJECT -Value : 60h -Data : ASCII -Multiple : No -Required : Yes, but may be blank (0 length or nulstr) -Summary : Subject/title of message - -Name : SUMMARY -Value : 61h -Data : ASCII -Multiple : No -Required : No -Summary : Summary of message contents, created by AUTHOR - -Name : COMMENT -Value : 62h -Data : ASCII -Multiple : Yes -Required : No -Summary : Comment about this message, created by SENDER - -This field is useful for adding notes to a message when forwarding to a new -recipient. - -Name : CARBONCOPY -Value : 63h -Data : ASCII -Multiple : Yes -Required : No -Summary : List of agents this message was also sent to - -This field is optional and only for the use of notifying the recipient of who -else received the message. - -Name : GROUP -Value : 64h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of group of users to receive message on recipient system - -This field is used when sending to a group name across a network, where the -group can be expanded into multiple header records for each agent on the -destination system. - -Name : EXPIRATION -Value : 65h -Data : when_t -Multiple : No -Required : No -Summary : Date/Time that this message will expire - -Name : PRIORITY -Value : 66h -Data : ulong -Multiple : No -Required : No -Default : 0 -Summary : Message priority (0 is lowest, FFFFFFFFh is highest) - -Name : FILEATTACH -Value : 70h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name/file specification of attached file(s) - -Name of attached file(s). Wildcards allowed. MSG_FILEATTACH attribute must be -set. If the MSG_FILEATTACH attribute is set but this field is not included, -the SUBJECT field is assumed to be the filename(s). - -Name : DESTFILE -Value : 71h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Destination name for attached file(s) - -Wildcards allowed. FILEATTACH field must also be included. - -Name : FILEATTACHLIST -Value : 72h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of ASCII list of attached filenames - -Wildcards not allowed in ASCII list filename. Wildcards allowed in ASCII list. -MSG_FILEATTACH attribute must be set. - -Name : DESTFILELIST -Value : 73h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Name of ASCII list of destination filenames - -Wildcards not allowed in ASCII list filename. Wildcards allowed in ASCII list. - -Name : FILEREQUEST -Value : 74h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of requested file - -Wildcards allowed. MSG_FILEREQUEST attribute must be set - -Name : FILEPASSWORD -Value : 75h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Password for FILEREQUEST - -Name : FILEREQUESTLIST -Value : 76h -Data : ASCII -Multiple : Yes -Required : No -Summary : Name of ASCII list of filenames to request - -Wildcards allowed. - -Name : FILEPASSWORDLIST -Value : 77h -Data : ASCII -Multiple : Yes, order significant -Required : No -Summary : Name of ASCII list of passwords for FILEREQUESTLIST - -Name : IMAGEATTACH -Value : 80h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached image file for display - -MSG_FILEATTACH attribute must be set. See Image Types for valid -mattach_t.type values. - -Name : ANIMATTACH -Value : 81h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached graphical animation file for display - -MSG_FILEATTACH attribute must be set. See Animation Types for valid -mattach_t.type values. - -Name : FONTATTACH -Value : 82h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached font definition file - -MSG_FILEATTACH attribute must be set. See Font Types for valid mattach_t.type -values. - -Name : SOUNDATTACH -Value : 83h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached sound file for playback - -MSG_FILEATTACH attribute must be set. See Sound Types for valid mattach_t.type -values. - -Name : PRESENTATTACH -Value : 84h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached presentation definition file - -MSG_FILEATTACH attribute must be set. See Present Types for valid -mattach_t.type values. - -Name : VIDEOATTACH -Value : 85h -Data : vattach_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of attached interleaved video/sound file - -MSG_FILEATTACH attribute must be set. See Video Types for valid -vattach_t.type values and Video Compression Types for valid vattach_t.comp -values. - -Name : APPDATAATTACH -Value : 86h -Data : mattach_t -Multiple : Yes, order significant -Required : No -Summary : Name of attached application data file for process/display - -MSG_FILEATTACH attribute must be set. See Application Data Types for valid -mattach_t.type values. - -Name : IMAGETRIGGER -Value : 90h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of image file to trigger for display - -See Image Types for valid typestr_t.type values. - -Name : ANIMTRIGGER -Value : 91h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of animation file to trigger for display - -See Animation Types for valid typestr_t.type values. - -Name : FONTTRIGGER -Value : 92h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of font definition file to trigger - -See Font Types for valid typestr_t.type values. - -Name : SOUNDTRIGGER -Value : 93h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of sound file to trigger for playback - -See Sound Types for valid typestr_t.type values. - -Name : PRESENTTRIGGER -Value : 94h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of presentation definition file to trigger - -See Present Types for valid typestr_t.type values. - -Name : VIDEOTRIGGER -Value : 95h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of interleaved video/sound file to trigger - -See Video Types for valid typestr_t.type values. - -Name : APPDATATRIGGER -Value : 96h -Data : typestr_t -Multiple : Yes, order significant -Required : No -Summary : Type and filename of application data file to trigger - -See Application Data Types for valid typestr_t.type values. - -Name : FIDOCTRL -Value : A0h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : keyword ":" [" "] appdata -Summary : FTS/FSC-compliant control information line - -Any FidoNet FTS/FSC-compliant control information ("kludge") line that -does not have an equivalent representation here. All data not unique to the -actual control line, including leading and trailing white space, Ctrl-A (01h) -character and terminating CR must be ommited. Defined in FTS-0001. - -Name : FIDOAREA -Value : A1h -Data : ASCII -Multiple : No -Required : No -Summary : FTN EchoMail conference name. - -Defined in FTS-0004. - -Name : FIDOSEENBY -Value : A2h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : net"/"node [" "[net"/"]node] [...] -Summary : Used to store two-dimensional (net/node) SEEN-BY information - -Often used in FTN EchoMail environments. Only the actual SEEN-BY data is stored -and SEEN-BY: is stripped along with any leading and trailing white space -characters. Defined in FTS-0004. - -Name : FIDOPATH -Value : A3h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : net"/"node [" "[net"/"]node] [...] -Summary : Used to store two-dimensional (net/node) - -Defined in FTS-0004. ^aPATH: is stripped along with any leading and trailing -white space characters. - -Name : FIDOMSGID -Value : A4h -Data : ASCII -Multiple : No -Required : No -Format : origaddr " " serialno -Summary : MSGID field as specified in FTS-0009. - -Name : FIDOREPLYID -Value : A5h -Data : ASCII -Multiple : No -Required : No -Format : origaddr " " serialno -Summary : REPLY field as specified in FTS-0009. - -Name : FIDOPID -Value : A6h -Data : ASCII -Multiple : No -Required : No -Format : pID " " version [" "serialno] -Summary : Indentification string of program that created this message - -Defined FSC-0046. "^aPID:" and any white space is not included. - -Name : FIDOFLAGS -Value : A7h -Data : ASCII -Multiple : Yes -Required : No -Summary : Used to store the FTN FLAGS kludge information - -Note that all FLAG options that have binary representation in the message -header must be removed from the FLAGS string prior to storing it. Only the -actual flags option string is stored and ^aFLAGS is stripped along with any -leading and trailing white space characters. Defined in FSC-0053. - -Name : RFC822HEADER -Value : B0h -Data : ASCII -Multiple : Yes, order significant -Required : No -Format : field-name ":" [field-body] [CRLF] -Summary : Undefined RFC-822 header field - -Internet Message storage format, that does not have an equivalent -representation here. Folded header fields are allowed. Terminating CRLF may be -ommited. - -Name : RFC822MSGID -Value : B1h -Data : ASCII -Multiple : No -Required : No -Format : "<" addr-spec ">" -Summary : Message-ID field as specified in RFC-822. - -Name : RFC822REPLYID -Value : B2h -Data : ASCII -Multiple : No -Required : No -Format : "<" addr-spec ">" -Summary : In-Reply-To field as specified in RFC-822. - -Name : UNKNOWN -Value : F0h -Data : undef -Multiple : Yes -Required : No -Summary : Undefined header field of undefined type - -This field is useful for retaining binary header fields (that do not have an -equivalent representation here) between message storage formats. - -Name : UNKNOWNASCII -Value : F1h -Data : ASCII -Multiple : Yes -Required : No -Summary : Undefined header field of type ASCII - -This field is useful for retaining ASCII header fields (that do not have an -equivalent representation here) between message storage formats. - -Name : UNUSED -Value : FFh -Data : undef -Multiple : Yes -Required : No -Summary : Unused (deleted) header field - -The data contained in this header field is of an unknown type and should not be -processed. - - -Note: ----- -Specifically, not defined are the values F000h through FFFFh. These values -are to be used for user or system defined header fields. Digital Dynamics -requests that any developers or organizations that wish to have additional -header fields added to this specification notify Digital Dynamics through any -of the contact methods listed at the beginning of this document. - -Data Field Types: -================ -&&Data Field Types -$$DFIELD_T - -These are the defined valid values for dfield_t.type: - - -Val Name Data Description ---- ---- ---- ----------- -00h TEXT_BODY mtext_t Displayable text (body of message). - Included in duplicate message checking. - All terminating white space and control - characters are to be truncated from data - (except when multiple contiguous CRLFs - terminate the text, only the last CRLF - is removed). - -01h TEXT_SOUL mtext_t Non-displayed text. - Not normally displayed. Not necessarily - displayable. - Included in duplicate message checking. - -02h TEXT_TAIL mtext_t Displayable text (tag/tear/origin lines, - etc). - Not included in duplicate message checking. - All terminating white space and control - characters are to be truncated from data. - -03h TEXT_WING mtext_t Non-displayed text. - Not normally displayed. Not necessarily - displayable. - Not included in duplicate message checking. - -10h FTEXT_BODY ftext_t Formatted equivalent of TEXT_BODY to be - displayed in place of TEXT_BODY if format - is supported. See Image Types for valid - values of ftext_t.type. - -12h FTEXT_TAIL ftext_t Formatted equivalent of TEXT_TAIL to be - displayed in place of TEXT_TAIL if format - is supported. See Image Types for valid - values of ftext_t.type. - -20h IMAGEEMBED membed_t Type and data of embedded raster image file - for display. - See Image Types for valid membed.type - values. - -21h ANIMEMBED membed_t Type and data of embedded graphical - animation file for display. - See Animation Types for valid membed.type - values. - -22h FONTEMBED membed_t Type and data of embedded font definition - file. See Font Types for valid - membed_t.type values. - -23h SOUNDEMBED membed_t Type and data of embedded sound file for - playback. - See Sound Types for valid membed_t.type - values. - -24h PRESENTEMBED membed_t Type and data of embedded presentation - definition file. - See Present Types for valid membed_t.type - values. - -25h VIDEOEMBED vembed_t Type and data of embedded video/sound file - for playback. - See Video Types for valid vembed_t.type - values. - See Video Compression Types for valid - vembed_t.comp values. - -26h APPDATAEMBED membed_t Type and data of embedded application data - file for process/display. - See Application Data Types for valid - membed_t.type values. - -FFh UNUSED undef Space allocated for future update/expansion - - -Specifically, not defined are the values F000h through FFFFh. These values -are to be used for user or system defined data fields. Digital Dynamics -requests that any developers or organizations that wish to have additional -data fields added to this specification notify Digital Dynamics through any -of the contact methods listed at the beginning of this document. - - -Message Attributes: ------------------- -&&Message Attributes -$$ATTRBITS - -These are the bit values for idxrec_t.attr and msghdr_t.attr: - -MSG_PRIVATE (1<<0) // Private -MSG_READ (1<<1) // Read by addressee -MSG_PERMANENT (1<<2) // Permanent -MSG_LOCKED (1<<3) // Msg is locked, no editing possible -MSG_DELETE (1<<4) // Msg is marked for deletion -MSG_ANONYMOUS (1<<5) // Anonymous author -MSG_KILLREAD (1<<6) // Delete message after it has been read -MSG_MODERATED (1<<7) // This message must be validated before export -MSG_VALIDATED (1<<8) // This message has been validated by a moderator - - -Auxillary Attributes: --------------------- -These are the bit values for msghdr_t.auxattr: - -MSG_FILEREQUEST (1<<0) // File request -MSG_FILEATTACH (1<<1) // File(s) attached to Msg -MSG_TRUNCFILE (1<<2) // Truncate file(s) when sent -MSG_KILLFILE (1<<3) // Delete file(s) when sent -MSG_RECEIPTREQ (1<<4) // Return receipt requested -MSG_CONFIRMREQ (1<<5) // Confirmation receipt requested -MSG_NODISP (1<<6) // Msg may not be displayed to user - - -Network Attributes: ------------------- -These are the bit values for msghdr_t.netattr: - -MSG_LOCAL (1<<0) // Msg created locally -MSG_INTRANSIT (1<<1) // Msg is in-transit -MSG_SENT (1<<2) // Sent to remote -MSG_KILLSENT (1<<3) // Kill when sent -MSG_ARCHIVESENT (1<<4) // Archive when sent -MSG_HOLD (1<<5) // Hold for pick-up -MSG_CRASH (1<<6) // Crash -MSG_IMMEDIATE (1<<7) // Send Msg now, ignore restrictions -MSG_DIRECT (1<<8) // Send directly to destination -MSG_GATE (1<<9) // Send via gateway -MSG_ORPHAN (1<<10) // Unknown destination -MSG_FPU (1<<11) // Force pickup -MSG_TYPELOCAL (1<<12) // Msg is for local use only -MSG_TYPEECHO (1<<13) // Msg is for conference distribution -MSG_TYPENET (1<<14) // Msg is direct network mail - -Translation Types: ------------------ -&&Translation Types -$$XLATTYPE - -Definition for values of *.xlat[x]: - -XLAT_NONE 0 // No translation/End of translation list -XLAT_LF2CRLF 1 // Expand sole LF to CRLF -XLAT_ESCAPED 2 // 7-bit ASCII escaping for ctrl and 8-bit data -XLAT_HUFFMAN 3 // Static and adaptive Huffman coding compression -XLAT_LZW 4 // LZW (Lempel-Ziv-Welch) encoding for compression - // Terry Welch, IEEE Computer Vol 17, No 6 - // June 1984, pp 8-19 -XLAT_LZC 5 // LZC (modified LZW) encoding for compression - // Unix compress program -XLAT_RLE 6 // Run length encoding compression -XLAT_IMPLODE 7 // Implode compression (PKZIP v1.x) -XLAT_SHRINK 8 // Shrink compression (PKZIP v1.x) -XLAT_LZH 9 // LZH dynamic Huffman coding - // Haruyasu Yoshizaki, LHarc - // November, 1988 - -Agent Types: ------------ -&&Agent Types -$$AGENTTYP - -AGENT_PERSON 0 // To or from person -AGENT_PROCESS 1 // Unknown process, identified by agent name - -Agent types E000h through EFFFh are reserved for Synchronet process types -(defined specifically by Digital Dynamics). - -Note: ----- -Specifically not defined are agent types F000h through FFFFh. These values -are to be used for user or system defined agent types. Digital Dynamics -requests that any developers or organizations that wish to have additional -agent types added to this specification notify Digital Dynamics through any -of the contact methods listed at the beginning of this document. - -Network Types: -------------- -&&Network Types -$$NETWORKS - - // Net Type Address Format - // ----------------------------------- -NET_NONE 0 // Locally created none -NET_UNKNOWN 1 // Unknown undef -NET_FIDO 2 // FTN network fidoaddr_t -NET_POSTLINK 3 // PostLink network none -NET_QWK 4 // QWK based network ASCII -NET_INTERNET 5 // The Internet ASCII -NET_WWIV 6 // WWIV based network ulong -NET_MHS 7 // MHS network ASCII - - -Media Types: -=========== -&&Media Types -$$MEDIATYP - -Image Types: ------------ - -IMAGE_UNKNOWN 0x00 // Use image signature header to determine format -IMAGE_ASC 0x01 // ASCII text/IBM extended ASCII graphics -IMAGE_ANS 0x02 // ANSI X3.64 terminal escape sequences -IMAGE_AVT 0x03 // AVATAR terminal escape sequences -IMAGE_LVI 0x04 // LVI terminal escape sequences -IMAGE_GIF 0x05 // Compuserve Graphics Interchange Format (GIF) -IMAGE_TIF 0x06 // Tagged Image Format (AKA TIFF) -IMAGE_JPG 0x07 // Joint Photographers Electronics Group (JPEG) -IMAGE_T16 0x08 // TrueVision 16-bit bitmap (TGA) -IMAGE_T24 0x09 // TrueVision 24-bit bitmap (TGA) -IMAGE_T32 0x0a // TrueVision 32-bit bitmpa (TGA) -IMAGE_PCX 0x0b // ZSoft PaintBrush graphics -IMAGE_BMP 0x0c // Windows bitmap -IMAGE_RLE 0x0d // Windows bitmap (compressed) -IMAGE_DIB 0x0e // Display independant bitmap -IMAGE_PCD 0x0f // Kodak PhotoCD -IMAGE_G3F 0x10 // Group 3 FAX -IMAGE_EPS 0x11 // Ecapsulated PostScript -IMAGE_RTF 0x12 // Rich text format -IMAGE_RIP 0x13 // Remote Imaging Protocol Script (RIPscrip) -IMAGE_NAP 0x14 // NAPLPS -IMAGE_CDR 0x15 // Corel Draw! -IMAGE_CGM 0x16 // Computer graphics metafile -IMAGE_WMF 0x17 // Windows metafile -IMAGE_DFX 0x18 // Autodesk AutoCAD -IMAGE_IFF 0x19 // Amiga Interchange File Format -IMAGE_HTM 0x20 // HyperText Markup Language (MTML) Document -IMAGE_OS2 0x21 // OS/2 bitmap (BMP) - -Animation Types: ---------------- - -ANIM_UNKNOWN 0 // Use file signature header to determine format -ANIM_FLI 1 // Autodesk animator -ANIM_FLC 2 // Autodesk -ANIM_GL 3 // Grasprt -ANIM_IFF 4 // Amiga Interchange File Format - - -Video Types: ------------ - -VIDEO_UNKNOWN 0 // Use file signature header to determine format -VIDEO_QTIME 1 // Apple Quick-time -VIDEO_FQTIME 2 // Apple Flattened Quick-time -VIDEO_AVI 3 // Windows Auto/Video Interleave -VIDEO_ULT 4 // OS/2 Ultimotion - -Video Compression Types: ------------------------ - -VCOMP_UNKNOWN 0 // Use file signature header to determine codec -VCOMP_RLE 1 // Apple animation -VCOMP_SMC 2 // Apple graphics -VCOMP_RPZA 3 // Apple video -VCOMP_KLIC 4 // Captain crunch -VCOMP_CVID 5 // CinePak -VCOMP_RT21 6 // Intel indeo R2 -VCOMP_IV31 7 // Intel indeo R3 -VCOMP_YVU9 8 // Intel YVU9 -VCOMP_JPEG 9 // JPEG -VCOMP_MRLE 10 // Microsoft RLE -VCOMP_MSVC 11 // Microsoft video 1 - - -Font Types: ----------- - -FONT_UNKNOWN 0 // Use file signature header to determine format -FONT_TTF 1 // Windows TrueType -FONT_PFB 2 // PostScript Type 1 Font Binary -FONT_PFM 3 // PostScript Type 1 Font Metric -FONT_AMIGA 4 // Amiga Bitmapped -FONT_AGFA 5 // CompuGraphic Fonts - - -Sound Types: ------------ - -SOUND_UNKNOWN 0 // Use file signature header to determine format -SOUND_MOD 1 // MOD format -SOUND_VOC 2 // Sound Blaster VOC format -SOUND_WAV 3 // Windows 3.1 WAV RIFF format -SOUND_MID 4 // MIDI format -SOUND_GMID 5 // General MIDI format (standardized patches) -SOUND_SMP 6 // Turtle Beach SampleVision format -SOUND_SF 7 // IRCAM format -SOUND_AU 8 // Sun Microsystems AU format -SOUND_IFF 9 // Amiga Interchange File Format - -Application Data Types: ----------------------- - -APPDATA_UNKNOWN 0 // Use file signature header to determine format -APPDATA_WORDPERFECT 1 // WordPerfect Document -APPDATA_WKS 2 // Lotus 123 Worksheet (?) -APPDATA_WK1 3 // Lotus 123 Worksheet rev 1 -APPDATA_WK2 4 // Lotus 123 Worksheet rev 2 -APPDATA_WK3 5 // Lotus 123 Worksheet rev 3 -APPDATA_DBF 6 // dBase III data file -APPDATA_PDX 7 // Paradox data file -APPDATA_EXCEL 8 // Excel data file -APPDATA_QUATRO 9 // Borland Quatro Pro file -APPDATA_WORD 10 // Microsoft Word - -Message Storage Pseudo Code -=========================== -&&Message Storage Pseudo Code -$$STORPCOD - -The following is a "C like" pseudo code listing example of adding a message to -an SMB message base. SMBLIB contains C functions to do most of the following -operations. We are supplying this pseudo code as a general definition of the -order of required operations in writing to the message base. Many details have -been left out to simplify the code and to demonstrate only the basic -principles. - -shd = open ( MSGBASE.SHD , READ/WRITE/DENY_NONE ) -sdt = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) -sid = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) - -lock ( shd , smbhdr ) -read ( shd , smbstatus ) - -if ( smbstatus.attr & SMB_HYPERALLOC ) - msg.hdr.offset = filelength ( sdt ) - -else { - number_of_blocks = length_of_message_data / SDT_BLOCK_LEN - if ( length_of_message_data % SDT_BLOCK_LEN ) /* unevenly divisible */ - number_of_blocks = number_of_blocks + 1 - - sda = open ( MSGBASE.SDA , READ/WRITE/DENY_ALL ) - - if ( fast_allocation_mode ) - seek ( sda , END_OF_FILE ) - - else { - seek ( sda , BEGINNING_OF_FILE ) - while ( not end_of_file ( sda ) ) { - read ( sda , allocated , number_of_blocks * 2 ) - if ( allocated = 0 ) { - seek_backwards ( sda , number_of_blocks * 2 ) - break - } - } - } - - msg.hdr.offset = ( current_position ( sda ) / 2 ) * SDT_BLOCK_LEN - - allocated = 1 - - write ( sda , allocated , number_of_blocks * 2 ) - - close ( sda ) -} - -seek ( sdt , msg.hdr.offset ) - -write ( sdt , message_data ) - -if ( smbstatus.attr & SMB_HYPERALLOC ) - msg.idx.offset = filelength ( shd ) - -else { - number_of_blocks = length_of_message_header / SHD_BLOCK_LEN - if ( length_of_message_header % SHD_BLOCK_LEN ) /* unevenly divisible */ - number_of_blocks = number_of_blocks + 1 - - sha = open ( MSGBASE.SHA , READ/WRITE/DENY_ALL ) - - if ( fast_allocation_mode ) - seek ( sha , END_OF_FILE ) - - else { - seek ( sha , BEGINNING_OF_FILE ) - while ( not end_of_file ( sha ) ) { - read ( sha , allocated , number_of_blocks ) - if ( allocated = 0 ) { - seek_backwards ( sha , number_of_blocks ) - break - } - } - } - - msg.idx.offset = ( current_position ( sha ) * SHD_BLOCK_LEN ) - msg.idx.offset = msg.idx.offset + smbstatus.header_offset - - allocated = 1 - - write ( sha , allocated , number_of_blocks ) - - close ( sha ) -} - -seek ( shd , msg.idx.offset ) - -msg.hdr.number = smbstatus.last_msg+1 - -write ( shd , msg.hdr ) - -smbstatus.total_msgs = smbstatus.total_msgs + 1 -smbstatus.last_msg = msg.hdr.number - -write ( shd , smbstatus ) - -write ( sid , msg.idx ) - -unlock ( shd , smbstatus ) - -Message Retrieval Pseudo Code -============================= -&&Message Retrieval Pseudo Code -$$READPCOD - -shd = open ( MSGBASE.SHD , READ/WRITE/DENY_NONE ) -sdt = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) -sid = open ( MSGBASE.SDT , READ/WRITE/DENY_NONE ) - -read ( sid , msg.idx ) - -seek ( shd , msg.idx.offset ) - -lock ( shd , msg.hdr ) - -read ( shd , msg.hdr ) - -seek ( sdt , msg.hdr.offset ) - -read ( sdt , msg.hdr.data_length ) - -unlock ( shd , msg.hdr ) - -SMBUTIL -======= -&&SMBUTIL -$$SMBUTIL_ - -SMBUTIL is a utility that can perform various functions on an SMB message base. -The primary purpose of SMBUTIL is as an example to C programmers of how to use -the SMBLIB functions to access and modify an SMB message base. The complete C -source code for SMBUTIL is included and functions from it can be used or -modified by developers at their own discretion. The following files make up -SMBUTIL: - -SMBUTIL.EXE Compiled and linked for 16-bit DOS (ready to run) -SMBUTIL.C C functions -SMBUTIL.H C definitions and variable prototypes -SMBUTIL.WAT Makefile for Watcom C/C++ (type wmake -f smbutil.wat) -SMBUTIL.BOR Makefile for Borland C/C++ (type make -f smbutil.bor) - -The usage syntax is as follows: - -SMBUTIL [/opts] cmd smb_filespec.shd - -where cmd is one or more of the following: - - l[n] = list msgs starting at number n - r[n] = read msgs starting at number n - v[n] = view msg headers starting at number n - k[n] = kill (delete) n msgs - i<f> = import from text file f - s = display msg base status - c = change msg base status - m = maintain msg base - delete old msgs and msgs over max - p[k] = pack msg base (k specifies minimum packable Kbytes) - -where opts is one or more of the following: - - a = always (force) packing - z<n> = set time zone (n=min +/- from UT or 'EST','EDT','CST',etc) - -and smb_filespec is the base filename or file specification (wildcards) for the -message base. If wildcards are used, the ".SHD" extension must be specified. - -An example command line: - -SMBUTIL MP C:\SBBS\DATA\SUBS\*.SHD - -would maintain and pack all the message bases found in the C:\SBBS\DATA\SUBS -directory. - -CHKSMB -====== -&&CHKSMB -$$CHKSMB__ - -CHKSMB is a utility that performs a comprehensive analysis of a message base -to find any possible errors and calculate the number of packable bytes. It does -not "fix" a message base if any errors are found, it only reports the specific -errors (and exits with a non-zero error level). If any errors are reported, -packing the message base with SMBUTIL may rebuild the damaged files. If that -doesn't work, then use FIXSMB as a last resort. - -C source code for CHKSMB is also included as an example to programmers of how -to use SMBLIB functions. - -The usage syntax is as follows: - -CHKSMB [/opts] smb_filespec.shd - -where opts is one or more of the following: - - q = quiet mode (no beeps) - s = stop after an errored message base (for use with wildcards) - p = pause after an errored message base (wait for key press) - t = don't check for unsupported translation strings (faster) - e = display extended information on corrupted messages - -An example command line: - -CHKSMB /QP C:\SBBS\DATA\SUBS\*.SHD - -would check all the message bases in the C:\SBBS\DATA\SUBS directory, without -beeping on errors, and pausing after an errored message base. - -FIXSMB -====== -&&FIXSMB -$$FIXSMB__ - -FIXSMB is a utility that will rebuild the index and allocation files for a -message base. Since the message headers are not necessarily stored -sequentially, the order of the messages in the index may be changed when the -index is rebuilt. Messages are also re-numbered, so only use this program if -the index is corrupted and the messages are extremely important. - -C source code for FIXSMB is also included as an example to programmers of how -to use SMBLIB functions. - -The usage syntax is as follows: - -FIXSMB [/M] smb_file - -An example command line: - -FIXSMB \SBBS\DATA\MAIL - -Only use the "/M" command line switch if fixing an older Synchronet e-mail -message base (created with SBBS v2.1 or earlier). Once the SMB_EMAIL status -attr is set ("SMBUTIL S" will report a status attr of 1), the "/M" is not -required. - -SMBLIB -====== -&&SMBLIB -$$SMBLIB__ - -SMBLIB is a library of C functions for accessing and storing messages in an -SMB format message base. It can eliminate much of the development time for -developers that wish to use the library in whole or in part, or use the -functions as examples for their own message base function library. The library -consists of the following files: - -SMBDEFS.H Constant definitions, macros, and data types -SMBLIB.H Library constants and function prototypes -SMBLIB.C Function definitions -SMBVARS.C Global variable definitions (doubles as declaration file) - -For developers to use this library with their program, they must include the -"SMBLIB.H" header file at the top of each C file that uses any of the library -functions, global variables, data types, macros, and constants. This can be -done by simply adding the following line to each .C file: - -#include "smblib.h" - -If SMBLIB.H is included, there is no need to include SMBDEFS.H or SMBVARS.C. - -To link the library functions and variables with a main program, the files -SMBVARS.OBJ and SMBLIB.OBJ must be linked with the main program .OBJ files. -If the operating system is DOS, be sure that all .OBJ files are compiled for -the same memory model. - -Example MAKEFILEs for compiling and linking SMBUTIL with Borland C/C++ -(SMBUTIL.BOR) and Watcom C/C++ (SMBUTIL.WAT) are included. - -SMBDEFS.H -========= -&&SMBDEFS.H -$$SMBDEFS_ - -The SMBDEFS.H file contains important constant definitions and data types (also -defined in this document). If ever this document and SMBDEFS.H are inconsistent -with each other, then SMBDEFS.H is to be considered correct and this document -in error. If such a discrepency is found, please notifiy Digital Dynamics so it -can be corrected in a future revision of the specification. - -Most notable of the data types is a structure called smbmsg_t (not defined -in this document). It contains the fixed and variable portions of a message's -header record as well as convenience pointers to the sender's name -(smbmsg_t.to), recipient's name (smbmsg_t.from), network addresses, and more. -If multiple SENDER header fields are included (for example), then smbmsg_t.to -will point to the last SENDER header field in the header record. Convenience -pointers for other data items work in the same fasion if multiple header fields -of the same type exist in the header record. - -Variables of the smbmsg_t data type (and pointers to variables of smbmsg_t -type) are used as arguments to many of the SMBLIB functions. - -SMBVARS.C -========= -&&SMBVARS.C -$$SMBVARS_ - -The SMBVARS.C file contains definitions of the global variables used by the -SMBLIB functions. It is a fairly small file since there are a small number of -global variables (by design). This file is used for both definitions and -declarations, so no "extern" declarations need to be made in developers source -code as long as SMBVARS.C or (preferably) SMBLIB.H is included in the source -code. - -SMBLIB.H -======= -&&SMBLIB.H -$$SMBLIB.H - -The SMBLIB.H file contains prototypes of all the functions in the SMBLIB.C -file. It is necessary to include this file in C source code if any of the -SMBLIB functions are used. The following C source line will include this file: - -#include "smblib.h" - -and should be placed near the top of all C source files that use SMBLIB -functions, variables, constants, or data types. - -Function prototypes are necessary for compilers to know the correct calling -syntax of a function and detect incorrect usage. Prototypes are also useful -as a quick reference for programmers as to the correct calling syntax of a -specific function. - -SMBLIB.C -======= -&&SMBLIB.C -$$SMBLIB.C - -The SMBLIB.C file contains the actual SMBLIB library functions. This source -file is not a stand alone program, but instead must be compiled and linked -with a main source file to create the executable program. - -The functions in this file are organized in a logical order, but their order -is actually irrelevant to the compiling, linking, and execution of the -resulting program. - -A comment block preceeds each function, explaining what the function does, -how the passed parameters are used, and what the return code (if any) -indicates. A more detailed explanation of each function is included here: - -int smb_open(int retry_time) ----------------------------- -The smb_open() function must be called before the message base is accessed -(read from or written to). The parameter, retry_time, is the maximum number -of seconds to wait while retrying to lock the message base header. If -retry_time is 0, then the message base header is not locked or read (this is -called "Fast Open" and should only be used when speed is more important than -checking for compatibility and validity upon opening). The global variable -smb_file must be initialized with the path and base filename of the message -base. This function returns 0 on success, 1 if the .SDT file could not be -opened, 2 if the .SHD file could not be opened, and 3 if the .SID file could -not be opened. If the message base header could not be locked, this function -returns -1. If the message base ID is incorrect, it returns -2. And if the -message base is of an incompatible version, it returns -3. - -The errno global variable (standard of most C libraries) will most likely -contain the error code for open failure. - -int smb_open_da(int retry_time) -------------------------------- -The smb_open_da() function is used to open the data block allocation file for -writing messages to a message base. The parameter, retry_time, is the maximum -number of seconds to wait while retrying to open the file. This function -returns 0 on success. -1 is returned if an open error other than "Access -Denied" is returned from the operating system, and the global variable errno -will contain the error code. -2 is returned if the retry_time has been -reached, and -3 is returned if the file descriptor could not be converted to -a stream by the fdopen() function. - -fclose(sda_fp) should be called immediately after all necessary file access -has been completed. - -This function is not used with the Hyper Allocation storage method. - -int smb_open_ha(int retry_time) -------------------------------- -The smb_open_ha() function is used to open the header block allocation file for -writing messages to a message base. The parameter, retry_time, is the maximum -number of seconds to wait while retrying to open the file. This function -returns 0 on success. -1 is returned if an open error other than "Access -Denied" is returned from the operating system, and the global variable errno -will contain the error code. -2 is returned if the retry_time has been -reached, and -3 is returned if the file descriptor could not be converted to -a stream by the fdopen() function. - -fclose(sha_fp) should be called immediately after all necessary file access -has been completed. - -This function is not used with the Hyper Allocation storage method. - -int smb_create(ulong max_crcs, ulong max_msgs, ushort max_age, ushort attr - ,int retry_time) --------------------------------------------------------------------------- -The smb_create() function is used to create a new message base or reset an -existing message base. The parameters max_crcs, max_msgs, max_age, and attr -are used to set the initial status of the message base status header. The -parameter, retry_time is the maximum number of seconds to wait while retrying -to lock the message base header. This functions returns 0 on success or 1 if -the message base header could not be locked. - -int smb_trunchdr(int retry_time) --------------------------------- -The smb_trunchdr() function is used to truncate the header file when packing -the message base and writing the new header information back to the header -file. The parameter, retry_time is the maximum number of seconds to wait while -retrying to truncate the header file. Returns 0 on success, -1 if error was -other than "Access Denied", or -2 if retry_time reached. - -int smb_locksmbhdr(int retry_time) ----------------------------------- -The smb_locksmbhdr() function is used to lock the first message base (status) -header. The parameter, retry_time is the number of seconds to wait while -retrying to lock the header. The smb_unlocksmbhdr() function should always be -used to unlock the header after accessing the message base header (usually -with smb_getstatus() and/or smb_putstatus()). Returns 0 if successful, -1 if -unsuccessful. - -int smb_unlocksmbhdr() ----------------------- -The smb_unlocksmbhdr() function is used to unlock a previously locked message -base header (using smb_lockmsghdr()). Returns 0 on success, non-zero on -failure. - -int smb_getstatus(smbstatus_t *hdr) ------------------------------------ -The smb_getstatus() function is used to read the status message base header -into the hdr structure. Returns 0 on success, 1 on failure. - -int smb_putstatus(smbstatus_t hdr) ----------------------------------- -The smb_putstatus() function is used to write the status information to the -first message base header. The parameter hdr, contains the status information -to be written. Returns 0 on success, 1 on failure. - -int smb_getmsgidx(smbmsg_t *msg) --------------------------------- -The smb_getmsgidx() function is used to get the byte offset for a specific -message header in the message header file based on the message base index. - -If msg->hdr.number is non-zero when this function is called, then the index -will be searched for this message number. If the message number is found in -the index, the msg->idx.offset is set to the byte offset of the message header -record in the header file and msg->offset is set to the record offset of the -index record in the index file, and the function returns 0. If the message -number is not found in the index, the function returns 1. - -If msg->hdr.number is zero, msg->idx.offset and msg->idx.number are obtained -from the index record at record offset msg->offset. If msg->offset is an -invalid record offset when this function is called, the function returns 1. -Otherwise, the function returns 0. - -int smb_getlastidx(idxrec_t *idx) ---------------------------------- -Reads the last index record of the currently open message base into the -idxrec_t structure pointed to by idx. Returns 0 if successful, -1 if the index -is empty or unopened, or -2 if the record can't be read. - -int smb_getmsghdrlen(smbmsg_t msg) ----------------------------------- -The smb_getmsghdrlen() function is used to calculate the total length of -message header msg including both fixed and variable length portions. This -function returns the length of the header record in bytes. - -long smb_getmsgdatlen(smbmsg_t msg) ------------------------------------ -The smb_getmsgdatlen() function is used to calculate the total length of the -data for message msg. This function returns the length of all data fields -combined. - -int smb_lockmsghdr(smbmsg_t msg, int retry_time) ------------------------------------------------- -The smb_lockmsghdr() function is used to lock the header record for message -msg. The parameter retry_time is the maximum number of seconds to wait while -retrying to lock the header. Returns 0 on success, -1 on failure. The function -smb_unlockmsghdr() should immediately be called after accessing the message -header (usually with smb_getmsghdr() or smb_putmsghdr()). - -int smb_getmsghdr(smbmsg_t *msg) --------------------------------- -The function smb_getmsghdr() is used to read the header record for message -msg. msg->idx.offset must be initialized to the byte offset of the header -record in the header file before this function is called. The function -smb_freemsgmem() must be called to free the memory allocated by this function -for the header and data felds. This function returns 0 on success, -1 if -the fixed portion of the message header record could not be read, -2 if the -message header ID was incorrect, -3 if memory could not be allocated, -4 -if a data field could not be read, -5 if the fixed length portion of a header -field could not be read, -6 if the variable length portion of a header field -could not be read, -7 if one or more of the mandatory header fields (SENDER, -RECIPIENT, or SUBJECT) are missing, -8 if total_dfields extends beyond the -end of the header record, or -9 if incompatible header version. - -Several convenience pointers in the msg structure are initialized by this -function to point to the last occurance of the SENDER (msg->from), RECIPIENT -(msg->to), SUBJECT (msg->subj), etc. - -int smb_unlockmsghdr(smbmsg_t msg) ----------------------------------- -The smb_unlockmsghdr() function is used to unlock a previously locked message -header (with smb_lockmsghdr()). This function returns 0 on success, non-zero -on failure. - -int smb_addcrc(ulong max_crcs, ulong crc, int retry_time) ---------------------------------------------------------- -The smb_addcrc() function is used to add a CRC-32 to the CRC history file -for a message base, automatically checking for duplicates. The parameter -max_crcs should be the max_crcs defined in the status header of the message -base. The parameter crc, is the CRC-32 of the TEXT_BODY and TEXT_SOUL data -fields for the message. The parameter retry_time is the maximum number of -seconds to wait when retrying to open the CRC history file. - -This function returns -1 if there was an open error, -2 if the retry_time -was reached, -3 if there was a memory allocation error, 1 if the CRC already -exists in the CRC history file (indicating a duplicate message), or 0 on -success (and no duplicate). - -int smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data) ---------------------------------------------------------------------- -The smb_hfield() function is used to add a header field to the structure msg. -The parameters type, length, and data, must be specified according to the -header field values listed in this specification. This function returns 0 -on success, non-zero on memory allocation error. The function smb_freemsgmem() -must be called to free the memory allocated by this function. - -int smb_dfield(smbmsg_t *msg, ushort type, ulong length) --------------------------------------------------------- -The smb_dfield() function is used to add a data field to the structure msg. -The parameters type and length must be specified according to the data field -values listed in this specification. This function returns 0 on success, -non-zero on memory allocation error. The function smb_freemsgmem() must be -called to free the memory allocated by this function. - -int smb_addmsghdr(smbmsg_t *msg,smbstatus_t *status,int storage,int retry_time) -------------------------------------------------------------------------------- -The smb_addmsghdr() function is used to add a new message header to the message -header file and update the index file. The msg and status structures are -updated to reflect the new total messages, last message number, etc. The -storage parameter is used to indicate the storage method to use (either -SMB_SELFPACK, SMB_FASTALLOC, or SMB_HYPERALLOC). If the storage type is -SMB_SELFPACK, the header block allocation file will be searched for unused -block(s) to store this header. If the storage type is SMB_FASTALLOC or -SMB_HYPERALLOC, the header is stored at the end of the header file. Returns 0 -on success, non-zero on failure. The parameter retry_time is the maximum number -of seconds to wait while retrying to lock and open files. - -int smb_putmsg(smbmsg_t msg) ----------------------------- -The smb_putmsg() function calls both the smb_putmsghdr() and smb_putmsgidx() -functions to write the header and index elements of a message to the -appropriate files. Returns 0 on success, non-zero on failure. - -int smb_putmsgidx(smbmsg_t msg) -------------------------------- -The smb_putmsgidx() function is used to store a message index in the message -index file. The message index can be for a new message or an existing -message. Returns 0 on success, non-zero on failure. - -int smb_putmsghdr(smbmsg_t msg) -------------------------------- -The smb_putmsghdr() function is used to store a message header in the message -header file. The message header can be for a new message or an existing -message. Returns 0 on success, non-zero on failure. - -void smb_freemsgmem(smbmsg_t msg) ---------------------------------- -Frees allocated memory for the header and data fields in the msg structure. -This function must be called to free the memory allocated by the functions -smb_hfield(), smb_dfield(), and smb_getmsghdr(). - -long smb_hdrblocks(ulong length) --------------------------------- -The smb_hdrblocks() function is used to calculate the number of blocks -required to store a message header of length size (in bytes). This function -returns the number of blocks required. - -long smb_datblocks(ulong length) --------------------------------- -The smb_datblocks() function is used to calculate the number of blocks -required to store message data of length size (in byte). This function returns -the number of blocks required. - -long smb_allochdr(ulong length) -------------------------------- -The smb_allochdr() function is used to search for free blocks to store a -message header of length bytes and mark the free blocks as allocated in the -header allocation file. This function returns the byte offset to the header -record or a negative number on error. The function smb_open_ha() should be -called prior to calling this function and fclose(sha_fp) should be called -after. The function is called from smb_addmsghdr(), so you probably have no -need to call this function directly. - -long smb_fallochdr(ulong length) --------------------------------- -The smb_fallochdr() function works exactly the same as the smb_allochdr() -function except it is much faster because the header allocation file is not -searched for free blocks. The function is called from smb_addmsghdr(), so you -probably have no need to call this function directly. - -long smb_hallochdr(ulong header_offset) ---------------------------------------- -This smb_hallochdr() functions works exactly the same as the smb_fallochdr() -function except the status.header_offset is passed as the argument and the -header allocation (.SHA) file is not updated so smb_open_ha() need not be -called. The function is called from smb_addmsghdr(), so you probably have no -need to call this function directly. - -long smb_allocdat(ulong length, ushort headers) ------------------------------------------------ -The smb_allocdat() function is used to search for free blocks to store length -amount of data for a message. The parameter headers, indicates the number of -message headers that are associated with this data. Normally, the headers -parameter will be 1, unless this message is part of a mass mailing. The offset -to the allocated data blocks is returned, or a negative value on error. The -function smb_open_da() should be called prior to calling this function and -fclose(sda_fp) should be called after. - -long smb_fallocdat(ulong length, ushort headers) ------------------------------------------------- -The smb_fallocdat() function works exactly the same as the smb_allocdat() -function except it is much faster because the data allocation file is not -searched for free blocks. - -long smb_hallocdat() --------------------- -The smb_hallocdat() function works exactly the same as the smb_hallocdat() -function except no argument is passed and the data allocation file (.SDA) is -not updated so smb_open_da() need not be called. - -int smb_incdat(ulong offset, ulong length, ushort headers) ----------------------------------------------------------- -The smb_incdat() function is used to increment the header counter in the data -allocation file for the data starting at the byte offset and length size in -bytes. The parameter headers, indicates the number of headers to add to the -current allocation value in the data allocation file. Returns 0 on success, -non-zero on failure. - -int smb_freemsg(smbmsg_t msg, smbstatus_t status) -------------------------------------------------- -The smb_freemsg() function is used to free the disk space allocated for the -header and data fields of the message msg. Returns 0 on success, non-zero on -failure. The parameter, status, must be the current status from the message -base header for this message base. - -int smb_freemsgdat(ulong offset, ulong length, ushort headers) --------------------------------------------------------------- -The smb_freemsgdat() function is used to decrement the data block allocation -records in the data allocation file associated with the data in the data file -by the value of the headers parameter (normally 1). The parameter offset -indicates the byte offset to the beginning of the message data in the data -file and the parameter length is the total length of the message data. -Returns 0 on success, non-zero on failure. - -int smb_freemsghdr(ulong offset, ulong length) ----------------------------------------------- -The smb_freemsghdr() function is used to set the header block allocation -records in the header allocation file to 0 (indicated non-allocated block). -The parameter offset indicates the byte offset to the beginning of the header -record being freed and the parameter length indicates the total length of the -header record. Returns 0 on success, non-zero on failure. - -int smb_stack(int op) ---------------------- -The smb_stack() function is used to save and restore message base information -so that multiple message bases can be open simultaneously. The stack can -save up to 4 message bases (allowing 5 simultaneously open message bases). -The stack is a "last in, first out" storage area for open message bases. -If the op parameter is SMB_STACK_PUSH, smb_stack() will save (push) the current -message base onto the stack. Calling smb_stack(SMB_STACK_POP) will restore -(pop) the most recently pushed message base off the stack. Calling -smb_stack(SMB_STACK_XCHNG) will exchange the most recently pushed message base -and the current message base (replacing the top of the stack with the current -message base). - -void smb_close() ----------------- -Closes the header, data, and index files for the currently open message base. - - -Miscellaneous SMBLIB Files -========================== -&&Miscellaneous SMBLIB Files -$$SMB_MISC - -CRC32.H C header file for CRC-32 calculations ------------------------------------------------------ -This file contains a static 32-bit CRC table (crc32tbl[]) and a macro (ucrc32) -that uses this table to calculate 32-bit CRCs one byte at a time. - -Example: - - ulong crc=0xffffffff; - -for(i=0;i<length;i++) - crc=ucrc32(buf[i],crc); -crc=~crc; - - -CRC16.C C functions for 16-bit CRC calculations -------------------------------------------------------- -This file contains a function (ucrc16), to calculate 16-bit CRCs one byte at a -time and a function (crc16) that uses the ucrc16() function to calculate the -16-bit CRC of an ASCIIZ character string. - -Example: - - ushort crc; - -crc=crc16("Text"); - -LZH.H Function prototypes for LZH.C ---------------------------------------------- -This file contains function prototypes for the two most important functions -in LZH.C, lzh_encode() and lzh_decode(). - -Example: - - uchar str[256],lzh[512]; - long length; - -strcpy(str,"This is a string of text"); -length=lzh_encode(str,strlen(str),lzh); -lzh_decode(lzh,length,str); - - -LZH.C C functions for LZH encoding (compression/decompression) ------------------------------------------------------------------------- -This file contains the functions for encoding and decoding LZH compressed -data. If the macro LZH_DYNAMIC_BUF is defined when this file is compiled, -temporary buffers will be dynamically allocated as opposed to static. This -may be slower than the static buffer method, but frees the allocated memory -after encoding or decoding. If free memory for your application is an issue, -then define this macro when compiling this file. - -Example (Borland C): - -bcc -c -DLZH_DYNAMIC_BUF lzh - -Example (Watcom C): - -wcc -dLZH_DYNAMIC_BUF lzh - -SMBLIB Storage Example -====================== -&&SMBLIB Storage Example -$$SMB_PUT_ - -#include "smblib.h" -#include "crc16.c" - -int main(void) -{ - char str[256] // General purpose string - ,*msg_text="Hello, world!" // Message text - ,nul_buf[SDT_BLOCK_LEN]={0} // NULL initialized buffer - ; - int i // General purpose integer - ,storage=SMB_SELFPACK // Default storage method - ,retry=10 // Retry for opening/locking files - ; - ushort max_age=0 // Default maximum age of messages - ,xlat=XLAT_NONE // Translation string - ,tzone=PST // Time zone - ,copies=1 // Number of copies of this msg - ; - ulong max_msgs=500 // Default max number of msgs - ,max_crcs=0 // Default max crcs - ,length // Length of msg text - ,offset // Offset to msg text in data file - ; - smbmsg_t msg; // Message structure - smbstatus_t status; // Message base status record - -strcpy(smb_file,"MSGBASE"); // We'll use "MSGBASE" for the name -if((i=smb_open(retry))!=0) { // Can't open!?! - printf("smb_open returned %d\n",i); - return(1); } - -if(!filelength(fileno(shd_fp))) // Message base not created yet - smb_create(max_crcs // Create with default settings - ,max_msgs - ,max_age - ,storage==SMB_HYPERALLOC - ? SMB_HYPERALLOC : 0 // SMB_EMAIL if this was e-mail - ,retry - ); - -if((i=smb_locksmbhdr(retry))!=0) { // Can't lock status base header - printf("smb_locksmbhdr returned %d\n",i); - smb_close(); - return(1); } - -if((i=smb_getstatus(&status))!=0) { // Can't read status base header - smb_unlocksmbhdr(); - smb_close(); - printf("smb_getstatus returned %d\n",i); - return(1); } - -if(status.attr&SMB_HYPERALLOC) - storage=SMB_HYPERALLOC; -else - storage=SMB_SELFPACK; - -length=strlen(msg_text); // Get length of message -length+=sizeof(xlat); // Add length of xlat string - -if(storage==SMB_HYPERALLOC) // Allocate space for message text - offset=smb_hallocdat(); -else { - if((i=smb_open_da(retry))!=0) { - smb_unlocksmbhdr(); - printf("smb_open_da returned %d\n",i); - smb_close(); - return(1); } - if(storage==SMB_FASTALLOC) - offset=smb_fallocdat(length,copies); - else - offset=smb_allocdat(length,copies); - fclose(sda_fp); } - -fseek(sdt_fp,offset,SEEK_SET); // Seek to beginning of data block -fwrite(&xlat,sizeof(xlat),1,sdt_fp); // Write xlat string -fwrite(msg_text,strlen(msg_text),1,sdt_fp); // Write message text -fwrite(nul_buf,SDT_BLOCK_LEN-length // Write NULLs out to end of block - ,1,sdt_fp); -fflush(sdt_fp); // Flush output buffer -smb_unlocksmbhdr(); // Unlock status base header - -memset(&msg,0,sizeof(smbmsg_t)); // Initialize header to NULL -memcpy(msg.hdr.id,"SHD\x1a",4); // Always set to SHD^Z -msg.hdr.version=SMB_VERSION; -msg.hdr.when_written.time=time(NULL); -msg.hdr.when_written.zone=tzone; -msg.hdr.when_imported.time=time(NULL); -msg.hdr.when_imported.zone=tzone; -msg.hdr.offset=offset; - -strcpy(str,"All"); // Send message to "All" -if((i=smb_hfield(&msg,RECIPIENT,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_close(); - return(1); } -strlwr(str); // If this were e-mail, idx.to -msg.idx.to=crc16(str); // would be the "to" user number - -strcpy(str,"Sysop"); // Send message from "Sysop" -if((i=smb_hfield(&msg,SENDER,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } -strlwr(str); // If this were e-mail, idx.from -msg.idx.from=crc16(str); // would be the "from" user number - -strcpy(str,"This is a test"); // Set the message subject/title -if((i=smb_hfield(&msg,SUBJECT,strlen(str),str))!=0) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } -strlwr(str); -msg.idx.subj=crc16(str); - -if((i=smb_dfield(&msg,TEXT_BODY,length))!=0) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } - -if((i=smb_addmsghdr(&msg,&status,storage,retry))!=0) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(offset,length,copies); - smb_freemsgmem(msg); - smb_close(); - return(1); } - -smb_freemsgmem(msg); // Unnecessary if exiting main() -smb_close(); // Unnecessary if exiting main() -return(0); -} - -SMBLIB Retrieval Example -======================== -&&SMBLIB Retrieval Example -$$SMB_GET_ - -#include "smblib.h" - -int main(void) -{ - char ch; // General purpose character - int i, // General purpose integer - retry=10; // Retry for opening/locking files - ushort xlat; // Translation string - ulong l; // General purpose long integer - smbmsg_t msg; // Message structure - -strcpy(smb_file,"MSGBASE"); // We'll use "MSGBASE" for the name -if((i=smb_open(retry))!=0) { // Can't open!?! - printf("smb_open returned %d\n",i); - return(1); } - -if(!filelength(fileno(shd_fp))) { // Message base not created yet - printf("Empty\n"); - smb_close(); - return(0); } - -for(msg.offset=0;!ferror(sid_fp);msg.offset++) { - - fseek(sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg.idx,1,sizeof(idxrec_t),sid_fp)) - break; - - if((i=smb_lockmsghdr(msg,retry))!=0) { - printf("smb_lockmsghdr returned %d\n",i); - break; } - if((i=smb_getmsghdr(&msg))!=0) { - smb_unlockmsghdr(msg); - printf("smb_getmsghdr returned %d\n",i); - break; } - if((i=smb_unlockmsghdr(msg))!=0) { - smb_freemsgmem(msg); - printf("smb_unlockmsghdr returned %d\n",i); - break; } - - printf("Subj : %s\n",msg.subj); - printf("To : %s\n",msg.to); - printf("From : %s\n",msg.from); - printf("Date : %s\n",ctime((time_t *)&msg.hdr.when_written.time)); - - for(i=0;i<msg.hdr.total_dfields;i++) - switch(msg.dfield[i].type) { - case TEXT_BODY: // Only show BODY and TAIL data fields - case TEXT_TAIL: - fseek(sdt_fp,msg.hdr.offset+msg.dfield[i].offset - ,SEEK_SET); - fread(&xlat,sizeof(xlat),1,sdt_fp); - if(xlat!=XLAT_NONE) // No translations supported - continue; - for(l=sizeof(xlat);l<msg.dfield[i].length;l++) { - ch=fgetc(sdt_fp); - if(ch) - putchar(ch); } - printf("\n"); - break; } - printf("\n"); - - smb_freemsgmem(msg); } // Free memory allocated by smb_getmsghdr() - -smb_close(); -return(0); -} - -SMBLIB Performance Issues -========================= -&&SMBLIB Performance Issues -$$PERFORM_ - -Since importing messages is the usually the most time consuming task likely -undertaken by an SMB application, it is also the most susceptable to design -issues that effect performance. - -Opening and Closing -------------------- -When importing multiple messages for a single message base, it appears logical -to open the message base, import all the messages, then close it. This indeed -is preferred over opening and closing the message base for each message. - -When importing multiple messages for possibly non-consecutive message bases, -developers may easily make the mistake of opening and closing the message base -for each message. This is not necessary and can considerably hinder the -import performance. The easiest solution is to only close the message base and -open a new one if the next message to be imported is not for the same message -base as the previously imported message. Example: - -smb_file[0]=0; -for(i=0;i<total_messages_to_be_imported;i++) { - if(stricmp(get_messagebase_for_this_message(i),smb_file)) { - if(smb_file[0]) /* We've already opened one */ - smb_close(); - strcpy(smb_file,get_messagebase_for_this_message(i)); - smb_open(10); } - /* Import this message */ - } -if(smb_file[0]) - smb_close(); - -A more advanced method is to keep multiple message bases open at the same time. -Due to the likely limitation of total file handles on the system, it is -suggested to keep the number of simultaneously open message bases at or below -3. SMBLIB includes the function smb_stack() to easily "push" and "pop" message -bases without closing them (push is the equivalent to "save" and pop is the -equivalent to "restore"). The downside of this function is that you cannot -access message bases on the stack without actually popping them off (in reverse -of the order they were pushed). You can however "exchange" the current message -base with the message base on the top of the stack (most recently pushed). -To intelligently juggle more than two open message bases, the developer should -create their own equivalent of the smb_stack() function so they can access the -message bases on the stack without popping them off. An example of keeping a -maximum of two message bases open using smb_stack(): - - char last_messagebase[128],new_messagebase[128]; - -smb_file[0]=0; -last_messagebase[0]=0; -for(i=0;i<total_messages_to_be_imported;i++) { - strcpy(new_messagebase,get_messagebase_for_this_message(i)); - if(stricmp(new_messagebase,smb_file)) { /* Not current message base */ - if(smb_file[0]) { /* We've already opened one */ - if(!stricmp(new_messagebase,last_messagebase)) { /* Same as last */ - strcpy(last_messagebase,smb_file); - smb_stack(SMB_STACK_XCHNG); } /* Retore previous base */ - else { - if(last_messagebase[0]) { - smb_stack(SMB_STACK_XCHNG); - smb_close(); - strcpy(last_messagebase,new_messagebase); } - else { - strcpy(last_messagebase,smb_file); - smb_stack(SMB_STACK_PUSH); } /* Save current base */ - strcpy(smb_file,new_messagebase); - smb_open(10); } } - else { - strcpy(smb_file,new_messagebase); - smb_open(10); } } - /* Import this message */ - } -if(smb_file[0]) - smb_close(); -if(last_messagebase[0]) { - smb_stack(SMB_STACK_POP); - smb_close(); } - -The second example would be of negligible performance gain over the first -example (6 open operations versus 7) if the messages to import were in the -following order: - -msg[0] --> msgbase[0] // 0 opened -msg[1] --> msgbase[1] // 0 pushed 1 opened -msg[2] --> msgbase[1] -msg[3] --> msgbase[2] // 1 closed 0 popped 0 closed 2 opened -msg[4] --> msgbase[0] // 2 pushed 0 opened -msg[5] --> msgbase[2] // 0 pushed 2 popped (exchanged) -msg[6] --> msgbase[3] // 2 closed 0 popped 0 closed 3 opened -msg[7] --> msgbase[0] // 3 pushed 0 opened - -The second example would be of significant performance gain over the first -example (4 open operations versus 8) if the messages to import were in the -following order: - -msg[0] --> msgbase[0] // 0 opened -msg[1] --> msgbase[1] // 0 pushed 1 opened -msg[2] --> msgbase[0] // 1 pushed 0 popped (exchanged) -msg[3] --> msgbase[1] // 0 pushed 1 popped (exchanged) -msg[4] --> msgbase[0] // 1 pushed 0 popped (exchanged) -msg[5] --> msgbase[2] // 0 pushed 1 popped (exchanged) 1 closed 2 opened -msg[6] --> msgbase[3] // 2 pushed 0 popped (exchanged) 0 closed 3 opened -msg[7] --> msgbase[2] // 3 pushed 2 popped (exchanged) - -More advanced use of "stack-like" message base file handle storage can easily -reduce the number of open operations, therefore increasing import performance -under more adverse message base ordering conditions. - -Compression ------------ -If any message data compression features are offered by the application, it -is important the the application not unnecessarily compress data that will -not save any storage space. While this may seem an obvious statement, please -review the following pseudo-code example: - -if ( message_data_length < SDT_BLOCK_LEN ) - // Store uncompressed data -else { - // Compress data - if ( ( compressed_data_length / SDT_BLOCK_LEN ) - < ( message_data_length / SDT_BLOCK_LEN ) ) // Saves a block or more - // Store compressed data - else - // Store uncompressed data - } - -Since the SMB format stores message data in fixed length blocks, there is no -point in storing a message in compressed format if it requires the same number -of blocks as the uncompressed format (i.e. a message that is two blocks in -length in uncompressed format and only a block and a half in length when -compressed should not be stored in compressed format since it still requires -two full blocks of storage). It is important to note that in the above example, -the length of the data translation string was not taken into account in -determining the number of required blocks. Also, the smb_datblocks() function -is normally used in determing the number of required blocks to store a given -data length and it is a little more involved than simply dividing the length of -the data by SDT_BLOCK_LEN. - - -Bibliography -============ -&&Bibliography -$$BIBLIOGR - -Title : The C Programming Language -Publisher : Prentice Hall -Author : Brian W. Kernighan and Dennis M. Ritchie - -Document : ARPANET Request for Comments (RFC) #822 -Title : Standard for the Format of ARPA Internet text messages -Publisher : SRI International -Author : David H. Crocker, University of Delaware - -Document : FTS-0001 -Publisher : FSC -Author : Randy Bush, Pacific Systems Group - -Document : FTS-0004 -Title : EchoMail Specification -Publisher : FSC -Author : Bob Hartman - -Document : FTS-0009 -Title : A standard for unique message identifiers and reply chain linkage -Publisher : FSC -Author : Jim Nutt - -Document : FSC-00046 -Title : A Product Idenfifier for FidoNet Message Handlers -Publisher : FSC -Author : Joaquim H. Homrighausen - -Document : FSC-00053 -Title : Specifications for the ^aFLAGS field -Publisher : FSC -Author : Joaquim H. Homrighausen - - -Implementations -=============== -&&Implementations -$$IMPLEMEN - -Product : Synchronet Multinode BBS Software -Developer : Digital Dynamics -Level : III -Version : 2.20 - -Product : Synchronet/FidoNet Import/Export Utility (SBBSFIDO) -Developer : Digital Dynamics -Level : III -Version : 2.23 - -Product : Synchronet UTI (Universal Text Interface) Driver -Developer : Digital Dynamics -Level : III -Version : 2.23 - -Product : SBBSecho FidoNet Packet Tosser for Synchronet -Developer : Digital Dynamics -Level : III -Version : 1.11 - -Product : NetXpress Internet UUCP for Synchronet -Developer : Merlin Systems -Level : II -Version : 1.50 - -Product : InterEcho FidoNet Packet Tosser -Developer : InterMail Sales Inc -Level : II -Version : 1.11 diff --git a/src/sbbs2/smb/docs/smb_read.me b/src/sbbs2/smb/docs/smb_read.me deleted file mode 100644 index 9cccaf613b..0000000000 --- a/src/sbbs2/smb/docs/smb_read.me +++ /dev/null @@ -1,64 +0,0 @@ -Synchronet Message Base (SMB) Specification v2.01 - READ.ME - -============================================================= - -Files: - - Miscellaneous - ------------- - SMB_READ.ME This file - FILE_ID.DIZ Description of archive - SMB.HST History of changes made since v1.00 - - Technical Specification - ----------------------- - SMB.PRN Paginated, to be printed at 12cpi (!) - SMB.TXT Not paginated, for online viewing - - Message Base C Library - ---------------------- - SMBDEFS.H C data types and constants - SMBLIB.H C function prototypes - SMBLIB.C C library functions - CRC32.H C header file for 32-bit CRC calculations - CRC16.C C source file for 16-bit CRC calculations - LZH.H C header file for LZH compression functions - LZH.C C source file for LZH compression functions - - Message Base Utility - -------------------- - SMBUTIL.H C header file - SMBUTIL.C C source file - SMBUTIL.BOR C makefile (for Borland C: make -f smbutil.bor) - SMBUTIL.WAT C makefile (for Watcom C: wmake -f smbutil.wat - 32-bit OS2: wmake -f smbutil.wat OS=OS2 - 32-bit DOS: wmake -f smbutil.wat OS=DOSX) - SMBUTIL.EXE Compiled and linked for 16-bit DOS - - Check Message Base for Corruption - --------------------------------- - CHKSMB.C C source file - CHKSMB.MAK C makefile (for Borland C: make -f chksmb) - CHKSMB.EXE Compiled and linked for 16-bit DOS - - Rebuild Message Base Index and Allocation Files - ----------------------------------------------- - FIXSMB.C C source file - FIXSMB.MAK C makefile (for Borland C: make -f fixsmb) - FIXSMB.EXE Compiled and linked for 16-bit DOS - - Convert from FidoNet (FTSC-1) to SMB - ------------------------------------ - FIDO2SMB.C C source file - FIDO2SMB.MAK C makefile (for Borland C: make -f fido2smb) - - Convert from Internet (RFC-822) to SMB - -------------------------------------- - INET2SMB.C C source file - INET2SMB.MAK C makefile (for Borland C: make -f inet2smb) - - Convert from QWK to SMB - ----------------------- - QWK2SMB.C C source file - QWK2SMB.MAK C makefile (for Borland C: make -f qwk2smb) - -/* END of SMB_READ.ME */ diff --git a/src/sbbs2/smb/fixsmb/fixsmb.c b/src/sbbs2/smb/fixsmb/fixsmb.c deleted file mode 100644 index 4a6973822b..0000000000 --- a/src/sbbs2/smb/fixsmb/fixsmb.c +++ /dev/null @@ -1,226 +0,0 @@ -/* FIXSMB.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Re-generates an SMB message base based on SHD and SDT files */ - -#include "smblib.h" - -smb_t smb; - -char *usage="usage: fixsmb [/opts] <smb_file>\n" - "\n" - " opts:\n" - " m - force mail format instead of sub-board format\n" - "\n" - " ex: FIXSMB /M MAIL\n" - " or: FIXSMB DEBATE\n"; - -void remove_re(char *str) -{ -while(!strnicmp(str,"RE:",3)) { - strcpy(str,str+3); - while(str[0]==SP) - strcpy(str,str+1); } -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -#define MAIL (1<<0) - -int main(int argc, char **argv) -{ - char str[128],c; - int i,w,mode=0; - ulong l,length,size,n,m; - smbmsg_t msg; - smbstatus_t status; - -printf("\nFIXSMB v1.22 � Rebuild Synchronet Message Base � Developed 1995-1997 " - "Rob Swindell\n"); - -smb.file[0]=0; -for(i=1;i<argc;i++) - if(argv[i][0]=='/') - switch(toupper(argv[i][1])) { - case 'M': - mode|=MAIL; - break; - default: - printf(usage); - exit(1); } - else - strcpy(smb.file,argv[i]); - -if(!smb.file[0]) { - printf(usage); - exit(1); } - -strupr(smb.file); -smb.retry_time=30; - -if((i=smb_open(&smb))!=0) { - printf("smb_open returned %d\n",i); - exit(1); } - -if((i=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - printf("smb_locksmbhdr returned %d\n",i); - exit(1); } - -if((i=smb_getstatus(&smb))!=0) { - smb_unlocksmbhdr(&smb); - smb_close(&smb); - printf("smb_getstatus returned %d\n",i); - exit(1); } - -if(mode&MAIL && !(status.attr&SMB_EMAIL)) { - status.attr|=SMB_EMAIL; - if((i=smb_putstatus(&smb))!=0) { - smb_unlocksmbhdr(&smb); - smb_close(&smb); - printf("smb_putstatus returned %d\n",i); - exit(1); } } - -if(!(status.attr&SMB_HYPERALLOC)) { - - if((i=smb_open_ha(&smb))!=0) { - smb_close(&smb); - printf("smb_open_ha returned %d\n",i); - exit(1); } - - if((i=smb_open_da(&smb))!=0) { - smb_close(&smb); - printf("smb_open_da returned %d\n",i); - exit(1); } - - rewind(smb.sha_fp); - chsize(fileno(smb.sha_fp),0L); /* Truncate the header allocation file */ - rewind(smb.sda_fp); - chsize(fileno(smb.sda_fp),0L); /* Truncate the data allocation file */ - } - -rewind(smb.sid_fp); -chsize(fileno(smb.sid_fp),0L); /* Truncate the index */ - - -if(!(status.attr&SMB_HYPERALLOC)) { - length=filelength(fileno(smb.sdt_fp)); - w=0; - for(l=0;l<length;l+=SDT_BLOCK_LEN) /* Init .SDA file to NULL */ - fwrite(&w,2,1,smb.sda_fp); - - length=filelength(fileno(smb.shd_fp)); - c=0; - for(l=0;l<length;l+=SHD_BLOCK_LEN) /* Init .SHD file to NULL */ - fwrite(&c,1,1,smb.sha_fp); } -else - length=filelength(fileno(smb.shd_fp)); - -n=1; /* messsage number */ -for(l=status.header_offset;l<length;l+=size) { - printf("\r%2u%% ",(long)(100.0/((float)length/l))); - msg.idx.offset=l; - if((i=smb_lockmsghdr(&smb,&msg))!=0) { - printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i); - continue; } - if((i=smb_getmsghdr(&smb,&msg))!=0) { - smb_unlockmsghdr(&smb,&msg); - printf("\n(%06lX) smb_getmsghdr returned %d\n",l,i); - size=SHD_BLOCK_LEN; - continue; } - smb_unlockmsghdr(&smb,&msg); - printf("#%-5lu (%06lX) %-25.25s ",msg.hdr.number,l,msg.from); - if(!(msg.hdr.attr&MSG_DELETE)) { /* Don't index deleted messages */ - msg.offset=n-1; - msg.hdr.number=n; - msg.idx.number=n; - msg.idx.attr=msg.hdr.attr; - msg.idx.time=msg.hdr.when_imported.time; - strcpy(str,msg.subj); - strlwr(str); - remove_re(str); - msg.idx.subj=crc16(str); - if(status.attr&SMB_EMAIL) { - if(msg.to_ext) - msg.idx.to=atoi(msg.to_ext); - else - msg.idx.to=0; - if(msg.from_ext) - msg.idx.from=atoi(msg.from_ext); - else - msg.idx.from=0; } - else { - strcpy(str,msg.to); - strlwr(str); - msg.idx.to=crc16(str); - strcpy(str,msg.from); - strlwr(str); - msg.idx.from=crc16(str); } - if((i=smb_putmsg(&smb,&msg))!=0) { - printf("\nsmb_putmsg returned %d\n",i); - continue; } - n++; } - else - printf("Not indexing deleted message\n"); - size=smb_getmsghdrlen(&msg); - while(size%SHD_BLOCK_LEN) - size++; - - if(!(status.attr&SMB_HYPERALLOC)) { - /**************************/ - /* Allocate header blocks */ - /**************************/ - fseek(smb.sha_fp,(l-status.header_offset)/SHD_BLOCK_LEN,SEEK_SET); - if(msg.hdr.attr&MSG_DELETE) c=0; /* mark as free */ - else c=1; /* or allocated */ - - for(i=0;i<size/SHD_BLOCK_LEN;i++) - fputc(c,smb.sha_fp); - - /************************/ - /* Allocate data blocks */ - /************************/ - - if(!(msg.hdr.attr&MSG_DELETE)) - smb_incdat(&smb,msg.hdr.offset,smb_getmsgdatlen(&msg),1); - } - - smb_freemsgmem(&msg); } -printf("\nDone.\n"); -status.total_msgs=status.last_msg=n-1; -if((i=smb_putstatus(&smb))!=0) - printf("\nsmb_putstatus returned %d\n",i); -smb_unlocksmbhdr(&smb); -smb_close(&smb); -return(0); -} diff --git a/src/sbbs2/smb/fixsmb/makefile b/src/sbbs2/smb/fixsmb/makefile deleted file mode 100644 index aaa5a8c735..0000000000 --- a/src/sbbs2/smb/fixsmb/makefile +++ /dev/null @@ -1,52 +0,0 @@ -############################### -# Makefile for FIXSMB # -# For use with Borland C++ # -# Tabstop=8 # -############################### - -# Macros - -OS = DOS -CC = bcc -LD = tlink -INCLUDE = \bc31\include;.. -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -w-pro -LFLAGS = -n -c - -!ifdef __OS2__ -OS = OS2 -CC = c:\bcos2\bin\bcc -LD = c:\bcos2\bin\tlink -INCLUDE = c:\bcos2\include;.. -LIB = c:\bcos2\lib -CFLAGS = -d -C -I$(INCLUDE) -w-pro -LFLAGS = -c -w-srf -!endif - -MAIN = $(OS)\fixsmb.exe -OBJS = $(OS)\fixsmb.obj $(OS)\smblib.obj -HEADERS = ..\smblib.h ..\smbdefs.h ..\crc32.h - -# Implicit C Compile Rule -{.;..}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# All .obj modules -$(OS)\fixsmb.obj: $(HEADERS) -$(OS)\smblib.obj: $(HEADERS) diff --git a/src/sbbs2/smb/lzh.c b/src/sbbs2/smb/lzh.c deleted file mode 100644 index d7f2519beb..0000000000 --- a/src/sbbs2/smb/lzh.c +++ /dev/null @@ -1,784 +0,0 @@ -/* LZH.C */ - -/* Rob Swindell's conversion of 1988 LZH (LHarc) encoding functions */ -/* Based on Japanese version 29-NOV-1988 */ -/* LZSS coded by Haruhiko Okumura */ -/* Adaptive Huffman Coding coded by Haruyasu Yoshizaki */ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#ifndef __WATCOMC__ - #include <alloc.h> -#endif -#include "lzh.h" - -/****************************************************************************/ -/* Memory allocation macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) - #if defined(__TURBOC__) - #define REALLOC(x,y) farrealloc(x,y) - #define LMALLOC(x) farmalloc(x) - #define MALLOC(x) farmalloc(x) - #define LFREE(x) farfree(x) - #define FREE(x) farfree(x) - #elif defined(__WATCOMC__) - #define REALLOC realloc - #define LMALLOC(x) halloc(x,1) /* far heap, but slow */ - #define MALLOC malloc /* far heap, but 64k max */ - #define LFREE hfree - #define FREE free - #else /* Other 16-bit Compiler */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free - #endif -#else /* 32-bit Compiler or Small Memory Model */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free -#endif - - - -/* LZSS Parameters */ - -#define LZH_N 4096 /* Size of string buffer */ -#define LZH_F 60 /* Size of look-ahead buffer */ -#define LZH_THRESHOLD 2 -#define LZH_NIL LZH_N /* End of tree's node */ - -#ifdef LZH_DYNAMIC_BUF - -unsigned char *lzh_text_buf; -short int lzh_match_position, lzh_match_length, - *lzh_lson, *lzh_rson, *lzh_dad; - -#else - -unsigned char lzh_text_buf[LZH_N + LZH_F - 1]; -short int lzh_match_position, lzh_match_length, - lzh_lson[LZH_N + 1], lzh_rson[LZH_N + 257], lzh_dad[LZH_N + 1]; - -#endif - - -void lzh_init_tree(void) /* Initializing tree */ -{ - short int i; - - for (i = LZH_N + 1; i <= LZH_N + 256; i++) - lzh_rson[i] = LZH_NIL; /* root */ - for (i = 0; i < LZH_N; i++) - lzh_dad[i] = LZH_NIL; /* node */ -} - -/******************************/ -/* Inserting node to the tree */ -/* Only used during encoding */ -/******************************/ -void lzh_insert_node(short int r) -{ - short int i, p, cmp; - unsigned char *key; - unsigned c; - - cmp = 1; - key = lzh_text_buf+r; - p = LZH_N + 1 + key[0]; - lzh_rson[r] = lzh_lson[r] = LZH_NIL; - lzh_match_length = 0; - for ( ; ; ) { - if (cmp >= 0) { - if (lzh_rson[p] != LZH_NIL) - p = lzh_rson[p]; - else { - lzh_rson[p] = r; - lzh_dad[r] = p; - return; - } - } else { - if (lzh_lson[p] != LZH_NIL) - p = lzh_lson[p]; - else { - lzh_lson[p] = r; - lzh_dad[r] = p; - return; - } - } - for (i = 1; i < LZH_F; i++) - if ((cmp = key[i] - lzh_text_buf[p + i]) != 0) - break; - if (i > LZH_THRESHOLD) { - if (i > lzh_match_length) { - lzh_match_position = ((r - p) & (LZH_N - 1)) - 1; - if ((lzh_match_length = i) >= LZH_F) - break; - } - if (i == lzh_match_length) { - if ((c = ((r - p) & (LZH_N - 1)) - 1) < lzh_match_position) { - lzh_match_position = c; - } - } - } - } - lzh_dad[r] = lzh_dad[p]; - lzh_lson[r] = lzh_lson[p]; - lzh_rson[r] = lzh_rson[p]; - lzh_dad[lzh_lson[p]] = r; - lzh_dad[lzh_rson[p]] = r; - if (lzh_rson[lzh_dad[p]] == p) - lzh_rson[lzh_dad[p]] = r; - else - lzh_lson[lzh_dad[p]] = r; - lzh_dad[p] = LZH_NIL; /* remove p */ -} - -void lzh_delete_node(short int p) /* Deleting node from the tree */ -{ - short int q; - - if (lzh_dad[p] == LZH_NIL) - return; /* unregistered */ - if (lzh_rson[p] == LZH_NIL) - q = lzh_lson[p]; - else - if (lzh_lson[p] == LZH_NIL) - q = lzh_rson[p]; - else { - q = lzh_lson[p]; - if (lzh_rson[q] != LZH_NIL) { - do { - q = lzh_rson[q]; - } while (lzh_rson[q] != LZH_NIL); - lzh_rson[lzh_dad[q]] = lzh_lson[q]; - lzh_dad[lzh_lson[q]] = lzh_dad[q]; - lzh_lson[q] = lzh_lson[p]; - lzh_dad[lzh_lson[p]] = q; - } - lzh_rson[q] = lzh_rson[p]; - lzh_dad[lzh_rson[p]] = q; - } - lzh_dad[q] = lzh_dad[p]; - if (lzh_rson[lzh_dad[p]] == p) - lzh_rson[lzh_dad[p]] = q; - else - lzh_lson[lzh_dad[p]] = q; - lzh_dad[p] = LZH_NIL; -} - -/* Huffman coding parameters */ - -#define LZH_N_CHAR (256 - LZH_THRESHOLD + LZH_F) - /* character code (= 0..LZH_N_CHAR-1) */ -#define LZH_T (LZH_N_CHAR * 2 - 1) /* Size of table */ -#define LZH_R (LZH_T - 1) /* root position */ -#define MAX_FREQ 0x8000 - /* update when cumulative frequency */ - /* reaches to this value */ - -/* - * Tables for encoding/decoding upper 6 bits of - * sliding dictionary pointer - */ -/* encoder table */ -uchar lzh_p_len[64] = { - 0x03, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08 -}; - -uchar lzh_p_code[64] = { - 0x00, 0x20, 0x30, 0x40, 0x50, 0x58, 0x60, 0x68, - 0x70, 0x78, 0x80, 0x88, 0x90, 0x94, 0x98, 0x9C, - 0xA0, 0xA4, 0xA8, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC, - 0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, - 0xD0, 0xD2, 0xD4, 0xD6, 0xD8, 0xDA, 0xDC, 0xDE, - 0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE, - 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, - 0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF -}; - -/* decoder table */ -uchar lzh_d_code[256] = { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, - 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, - 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, - 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, - 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, - 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, - 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, - 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, - 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x17, - 0x18, 0x18, 0x19, 0x19, 0x1A, 0x1A, 0x1B, 0x1B, - 0x1C, 0x1C, 0x1D, 0x1D, 0x1E, 0x1E, 0x1F, 0x1F, - 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, - 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, - 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, - 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, - 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, -}; - -uchar lzh_d_len[256] = { - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, - 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, -}; - -#ifdef LZH_DYNAMIC_BUF - -unsigned short *lzh_freq=NULL; /* cumulative freq table */ - -/* - * pointing parent nodes. - * area [LZH_T..(LZH_T + LZH_N_CHAR - 1)] are pointers for leaves - */ -short int *lzh_prnt=NULL; - -/* pointing children nodes (son[], son[] + 1)*/ -short int *lzh_son=NULL; - -#else /* STATIC */ - -unsigned short lzh_freq[LZH_T + 1]; /* cumulative freq table */ -short int lzh_prnt[LZH_T + LZH_N_CHAR]; -short int lzh_son[LZH_T + 1]; /* bug fixed by Digital Dynamics */ - -#endif - - -unsigned short lzh_getbuf = 0; /* Was just "unsigned" fixed 04/12/95 */ -uchar lzh_getlen = 0; - -int lzh_getbit(uchar *inbuf, long *incnt, long inlen) /* get one bit */ -{ - short int i; - - while (lzh_getlen <= 8) { - if((*incnt)>=inlen) - i=0; - else - i=inbuf[(*incnt)++]; - lzh_getbuf |= i << (8 - lzh_getlen); - lzh_getlen += 8; - } - i = lzh_getbuf; - lzh_getbuf <<= 1; - lzh_getlen--; - return (i < 0); -} - -short int lzh_getbyte(uchar *inbuf, long *incnt, long inlen) /* get a byte */ -{ - unsigned short i; - - while (lzh_getlen <= 8) { - if((*incnt)>=inlen) - i=0; - else - i=inbuf[(*incnt)++]; - lzh_getbuf |= i << (8 - lzh_getlen); - lzh_getlen += 8; - } - i = lzh_getbuf; - lzh_getbuf <<= 8; - lzh_getlen -= 8; - return i >> 8; -} - -unsigned lzh_putbuf = 0; -uchar lzh_putlen = 0; - -/* output c bits */ -void lzh_putcode(short int l, unsigned short c, uchar *outbuf, long *outlen) -{ - lzh_putbuf |= c >> lzh_putlen; - if ((lzh_putlen += l) >= 8) { - outbuf[(*outlen)++]=(lzh_putbuf >> 8); - if ((lzh_putlen -= 8) >= 8) { - outbuf[(*outlen)++]=lzh_putbuf; - lzh_putlen -= 8; - lzh_putbuf = c << (l - lzh_putlen); - } else { - lzh_putbuf <<= 8; - } - } -} - - -/* initialize freq tree */ - -void lzh_start_huff() -{ - short int i, j; - -lzh_getbuf = 0; /* Added by Digital Dynamics for repeating operations */ -lzh_getlen = 0; -lzh_putbuf = 0; -lzh_putlen = 0; - - for (i = 0; i < LZH_N_CHAR; i++) { - lzh_freq[i] = 1; - lzh_son[i] = i + LZH_T; - lzh_prnt[i + LZH_T] = i; - } - i = 0; j = LZH_N_CHAR; - while (j <= LZH_R) { - lzh_freq[j] = lzh_freq[i] + lzh_freq[i + 1]; - lzh_son[j] = i; - lzh_prnt[i] = lzh_prnt[i + 1] = j; - i += 2; j++; - } - lzh_freq[LZH_T] = 0xffff; - lzh_prnt[LZH_R] = 0; -} - - -/* reconstruct freq tree */ - -void lzh_reconst() -{ - short int i, j, k; - unsigned short f, l; - - /* halven cumulative freq for leaf nodes */ - j = 0; - for (i = 0; i < LZH_T; i++) { - if (lzh_son[i] >= LZH_T) { - lzh_freq[j] = (lzh_freq[i] + 1) / 2; - lzh_son[j] = lzh_son[i]; - j++; - } - } - /* make a tree : first, connect children nodes */ - for (i = 0, j = LZH_N_CHAR; j < LZH_T; i += 2, j++) { - k = i + 1; - f = lzh_freq[j] = lzh_freq[i] + lzh_freq[k]; - for (k = j - 1; f < lzh_freq[k]; k--); - k++; - l = (j - k) * 2; - - /* movmem() is Turbo-C dependent - rewritten to memmove() by Kenji */ - - /* movmem(&lzh_freq[k], &lzh_freq[k + 1], l); */ - (void)memmove(lzh_freq+k+1,lzh_freq+k, l); - lzh_freq[k] = f; - /* movmem(&lzh_son[k], &lzh_son[k + 1], l); */ - (void)memmove(lzh_son+k+1,lzh_son+k, l); - lzh_son[k] = i; - } - /* connect parent nodes */ - for (i = 0; i < LZH_T; i++) { - if ((k = lzh_son[i]) >= LZH_T) { - lzh_prnt[k] = i; - } else { - lzh_prnt[k] = lzh_prnt[k + 1] = i; - } - } -} - -/* update freq tree */ - -void lzh_update(short int c) -{ - short int i, j, k, l; - - if (lzh_freq[LZH_R] == MAX_FREQ) { - lzh_reconst(); - } - c = lzh_prnt[c + LZH_T]; - do { - k = ++lzh_freq[c]; - - /* swap nodes to keep the tree freq-ordered */ - if (k > lzh_freq[l = c + 1]) { - while (k > lzh_freq[++l]); - l--; - lzh_freq[c] = lzh_freq[l]; - lzh_freq[l] = k; - - i = lzh_son[c]; - lzh_prnt[i] = l; - if (i < LZH_T) lzh_prnt[i + 1] = l; - - j = lzh_son[l]; - lzh_son[l] = i; - - lzh_prnt[j] = c; - if (j < LZH_T) lzh_prnt[j + 1] = c; - lzh_son[c] = j; - - c = l; - } - } while ((c = lzh_prnt[c]) != 0); /* do it until reaching the root */ -} - -unsigned short lzh_code, lzh_len; - -void lzh_encode_char(unsigned short c, uchar *outbuf, long *outlen) -{ - unsigned short i; - short int j, k; - - i = 0; - j = 0; - k = lzh_prnt[c + LZH_T]; - - /* search connections from leaf node to the root */ - do { - i >>= 1; - - /* - if node's address is odd, output 1 - else output 0 - */ - if (k & 1) i += 0x8000; - - j++; - } while ((k = lzh_prnt[k]) != LZH_R); - lzh_putcode(j, i, outbuf, outlen); - lzh_code = i; - lzh_len = j; - lzh_update(c); -} - -void lzh_encode_position(unsigned short c, uchar *outbuf, long *outlen) -{ - unsigned short i; - - /* output upper 6 bits with encoding */ - i = c >> 6; - lzh_putcode(lzh_p_len[i], (unsigned)lzh_p_code[i] << 8, outbuf, outlen); - - /* output lower 6 bits directly */ - lzh_putcode(6, (c & 0x3f) << 10, outbuf, outlen); -} - -void lzh_encode_end(uchar *outbuf, long *outlen) -{ - if (lzh_putlen) { - outbuf[(*outlen)++]=(lzh_putbuf >> 8); - } -} - -short int lzh_decode_char(uchar *inbuf, long *incnt, long inlen) -{ - unsigned short c; - - c = lzh_son[LZH_R]; - - /* - * start searching tree from the root to leaves. - * choose node #(lzh_son[]) if input bit == 0 - * else choose #(lzh_son[]+1) (input bit == 1) - */ - while (c < LZH_T) { - c += lzh_getbit(inbuf,incnt,inlen); - c = lzh_son[c]; - } - c -= LZH_T; - lzh_update(c); - return c; -} - -short int lzh_decode_position(uchar *inbuf, long *incnt, long inlen) -{ - unsigned short i, j, c; - - /* decode upper 6 bits from given table */ - i = lzh_getbyte(inbuf,incnt,inlen); - c = (unsigned)lzh_d_code[i] << 6; - j = lzh_d_len[i]; - - /* input lower 6 bits directly */ - j -= 2; - while (j--) { - i = (i << 1) + lzh_getbit(inbuf,incnt,inlen); - } - return c | i & 0x3f; -} - -/* Compression */ - -/* Encoding/Compressing */ -/* Returns length of outbuf */ -long LZHCALL lzh_encode(uchar *inbuf, long inlen, uchar *outbuf) -{ - short int i, c, len, r, s, last_match_length; - long incnt,outlen; /* textsize=0; */ - -#ifdef LZH_DYNAMIC_BUF - - if((lzh_text_buf=(uchar *)MALLOC(LZH_N + LZH_F - 1))==NULL) - return(-1); - if((lzh_freq=(unsigned short*)MALLOC((LZH_T + 1)*sizeof(unsigned short)))==NULL) { - FREE(lzh_text_buf); - return(-1); } - if((lzh_prnt=(short *)MALLOC((LZH_T + LZH_N_CHAR)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_freq); - return(-1); } - if((lzh_son=(short *)MALLOC((LZH_T + 1) * sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - return(-1); } - if((lzh_lson=(short *)MALLOC((LZH_N + 1)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - return(-1); } - if((lzh_rson=(short *)MALLOC((LZH_N + 257)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - return(-1); } - if((lzh_dad=(short *)MALLOC((LZH_N + 1)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - FREE(lzh_rson); - return(-1); } -#endif - - incnt=0; - memcpy(outbuf,&inlen,sizeof(inlen)); - outlen=sizeof(inlen); - if(!inlen) { -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - FREE(lzh_rson); - FREE(lzh_dad); -#endif - return(outlen); } - lzh_start_huff(); - lzh_init_tree(); - s = 0; - r = LZH_N - LZH_F; - for (i = s; i < r; i++) - lzh_text_buf[i] = ' '; - for (len = 0; len < LZH_F && incnt<inlen; len++) - lzh_text_buf[r + len] = inbuf[incnt++]; - /* textsize = len; */ - for (i = 1; i <= LZH_F; i++) - lzh_insert_node(r - i); - lzh_insert_node(r); - do { - if (lzh_match_length > len) - lzh_match_length = len; - if (lzh_match_length <= LZH_THRESHOLD) { - lzh_match_length = 1; - lzh_encode_char(lzh_text_buf[r],outbuf,&outlen); - } else { - lzh_encode_char(255 - LZH_THRESHOLD + lzh_match_length - ,outbuf,&outlen); - lzh_encode_position(lzh_match_position - ,outbuf,&outlen); - } - last_match_length = lzh_match_length; - for (i = 0; i < last_match_length && incnt<inlen; i++) { - lzh_delete_node(s); - c=inbuf[incnt++]; - lzh_text_buf[s] = c; - if (s < LZH_F - 1) - lzh_text_buf[s + LZH_N] = c; - s = (s + 1) & (LZH_N - 1); - r = (r + 1) & (LZH_N - 1); - lzh_insert_node(r); - } -/*** - if ((textsize += i) > printcount) { - printf("%12ld\r", textsize); - printcount += 1024; - } -***/ - while (i++ < last_match_length) { - lzh_delete_node(s); - s = (s + 1) & (LZH_N - 1); - r = (r + 1) & (LZH_N - 1); - if (--len) lzh_insert_node(r); - } - } while (len > 0); - lzh_encode_end(outbuf,&outlen); -/* - printf("input: %ld (%ld) bytes\n", inlen,textsize); - printf("output: %ld bytes\n", outlen); - printf("output/input: %.3f\n", (double)outlen / inlen); -*/ - -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); - FREE(lzh_lson); - FREE(lzh_rson); - FREE(lzh_dad); -#endif - - return(outlen); -} - -/* Decoding/Uncompressing */ -/* Returns length of outbuf */ -long LZHCALL lzh_decode(uchar *inbuf, long inlen, uchar *outbuf) -{ - short int i, j, k, r, c; - unsigned long int count; - long incnt,textsize; - -#ifdef LZH_DYNAMIC_BUF - - if((lzh_text_buf=(uchar *)MALLOC((LZH_N + LZH_F - 1)*2))==NULL) - return(-1); - if((lzh_freq=(unsigned short *)MALLOC((LZH_T + 1)*sizeof(unsigned short))) - ==NULL) { - FREE(lzh_text_buf); - return(-1); } - if((lzh_prnt=(short *)MALLOC((LZH_T + LZH_N_CHAR)*sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_freq); - return(-1); } - if((lzh_son=(short *)MALLOC((LZH_T + 1) * sizeof(short)))==NULL) { - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - return(-1); } - -#endif - - incnt=0; - memcpy(&textsize,inbuf,sizeof(textsize)); - incnt+=sizeof(textsize); - if (textsize == 0) { -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); -#endif - return(textsize); } - lzh_start_huff(); - for (i = 0; i < LZH_N - LZH_F; i++) - *(lzh_text_buf+i) = ' '; - r = LZH_N - LZH_F; - for (count = 0; count < textsize; ) { - c = lzh_decode_char(inbuf,&incnt,inlen); - if (c < 256) { - outbuf[count]=c; -#if 0 - if(r>(LZH_N + LZH_F - 1) || r<0) { - printf("Overflow! (%d)\n",r); - getch(); - exit(-1); } -#endif - *(lzh_text_buf+r) = c; - r++; - r &= (LZH_N - 1); - count++; - } else { - i = (r - lzh_decode_position(inbuf,&incnt,inlen) - 1) - & (LZH_N - 1); - j = c - 255 + LZH_THRESHOLD; - for (k = 0; k < j && count<textsize; k++) { - c = lzh_text_buf[(i + k) & (LZH_N - 1)]; - outbuf[count]=c; -#if 0 - if(r>(LZH_N + LZH_F - 1) || r<0) { - printf("Overflow! (%d)\n",r); - exit(-1); } -#endif - *(lzh_text_buf+r) = c; - r++; - r &= (LZH_N - 1); - count++; - } - } - } -/*** - printf("%12ld\n", count); -***/ - -#ifdef LZH_DYNAMIC_BUF - FREE(lzh_text_buf); - FREE(lzh_prnt); - FREE(lzh_freq); - FREE(lzh_son); -#endif - -return(count); -} - - diff --git a/src/sbbs2/smb/lzh.h b/src/sbbs2/smb/lzh.h deleted file mode 100644 index 4972cc3a1a..0000000000 --- a/src/sbbs2/smb/lzh.h +++ /dev/null @@ -1,21 +0,0 @@ -/* LZH.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#ifdef __NT__ -#define LZHCALL _pascal -#else -#define LZHCALL -#endif - -#ifndef uchar -#define uchar unsigned char -#endif - -long LZHCALL lzh_encode(uchar *inbuf, long inlen, uchar *outbuf); -long LZHCALL lzh_decode(uchar *inbuf, long inlen, uchar *outbuf); - -#ifdef __WATCOMC__ /* Use MSC standard (prepended underscore) */ -#pragma aux lzh_encode "_*" -#pragma aux lzh_decode "_*" -#endif diff --git a/src/sbbs2/smb/smbdefs.h b/src/sbbs2/smb/smbdefs.h deleted file mode 100644 index 2e845c0fd2..0000000000 --- a/src/sbbs2/smb/smbdefs.h +++ /dev/null @@ -1,476 +0,0 @@ -/* SMBDEFS.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#ifndef _SMBDEFS_H -#define _SMBDEFS_H - -#include <stdio.h> - -/**********/ -/* Macros */ -/**********/ - - /* Control characters */ -#define TAB 0x09 /* Horizontal tabulation ^I */ -#define LF 0x0a /* Line feed ^J */ -#define FF 0x0c /* Form feed ^L */ -#define CR 0x0d /* Carriage return ^M */ -#define ESC 0x1b /* Escape ^[ */ -#define SP 0x20 /* Space */ - -#define ulong unsigned long -#define ushort unsigned short -#define uchar unsigned char -#define uint unsigned int - -/****************************************************************************/ -/* Memory allocation macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) -# define HUGE16 huge -# define FAR16 far -# if defined(__TURBOC__) -# define REALLOC(x,y) farrealloc(x,y) -# define LMALLOC(x) farmalloc(x) -# define MALLOC(x) farmalloc(x) -# define LFREE(x) farfree(x) -# define FREE(x) farfree(x) -# elif defined(__WATCOMC__) -# define REALLOC realloc -# define LMALLOC(x) halloc(x,1) /* far heap, but slow */ -# define MALLOC malloc /* far heap, but 64k max */ -# define LFREE hfree -# define FREE free -# else /* Other 16-bit Compiler */ -# define REALLOC realloc -# define LMALLOC malloc -# define MALLOC malloc -# define LFREE free -# define FREE free -# endif -#else /* 32-bit Compiler or Small Memory Model */ -# define HUGE16 -# define FAR16 -# define REALLOC realloc -# define LMALLOC malloc -# define MALLOC malloc -# define LFREE free -# define FREE free -#endif - - -#define SDT_BLOCK_LEN 256 /* Size of data blocks */ -#define SHD_BLOCK_LEN 256 /* Size of header blocks */ - -#define SMB_SELFPACK 0 /* Self-packing storage allocation */ -#define SMB_FASTALLOC 1 /* Fast allocation */ -#define SMB_HYPERALLOC 2 /* No allocation */ - -#define SMB_EMAIL 1 /* User numbers stored in Indexes */ - - /* Time zone macros for when_t.zone */ -#define DAYLIGHT 0x8000 /* Daylight savings is active */ -#define US_ZONE 0x4000 /* U.S. time zone */ -#define WESTERN_ZONE 0x2000 /* Non-standard zone west of UT */ -#define EASTERN_ZONE 0x1000 /* Non-standard zone east of UT */ - - /* US Time Zones (standard) */ -#define AST 0x40F0 // Atlantic (-04:00) -#define EST 0x412C // Eastern (-05:00) -#define CST 0x4168 // Central (-06:00) -#define MST 0x41A4 // Mountain (-07:00) -#define PST 0x41E0 // Pacific (-08:00) -#define YST 0x421C // Yukon (-09:00) -#define HST 0x4258 // Hawaii/Alaska (-10:00) -#define BST 0x4294 // Bering (-11:00) - - /* US Time Zones (daylight) */ -#define ADT 0xC0F0 // Atlantic (-03:00) -#define EDT 0xC12C // Eastern (-04:00) -#define CDT 0xC168 // Central (-05:00) -#define MDT 0xC1A4 // Mountain (-06:00) -#define PDT 0xC1E0 // Pacific (-07:00) -#define YDT 0xC21C // Yukon (-08:00) -#define HDT 0xC258 // Hawaii/Alaska (-09:00) -#define BDT 0xC294 // Bering (-10:00) - - /* Non-standard Time Zones */ -#define MID 0x2294 // Midway (-11:00) -#define VAN 0x21E0 // Vancouver (-08:00) -#define EDM 0x21A4 // Edmonton (-07:00) -#define WIN 0x2168 // Winnipeg (-06:00) -#define BOG 0x212C // Bogota (-05:00) -#define CAR 0x20F0 // Caracas (-04:00) -#define RIO 0x20B4 // Rio de Janeiro (-03:00) -#define FER 0x2078 // Fernando de Noronha (-02:00) -#define AZO 0x203C // Azores (-01:00) -#define LON 0x1000 // London (+00:00) -#define BER 0x103C // Berlin (+01:00) -#define ATH 0x1078 // Athens (+02:00) -#define MOS 0x10B4 // Moscow (+03:00) -#define DUB 0x10F0 // Dubai (+04:00) -#define KAB 0x110E // Kabul (+04:30) -#define KAR 0x112C // Karachi (+05:00) -#define BOM 0x114A // Bombay (+05:30) -#define KAT 0x1159 // Kathmandu (+05:45) -#define DHA 0x1168 // Dhaka (+06:00) -#define BAN 0x11A4 // Bangkok (+07:00) -#define HON 0x11E0 // Hong Kong (+08:00) -#define TOK 0x121C // Tokyo (+09:00) -#define SYD 0x1258 // Sydney (+10:00) -#define NOU 0x1294 // Noumea (+11:00) -#define WEL 0x12D0 // Wellington (+12:00) - - /* Valid hfield_t.types */ -#define SENDER 0x00 -#define SENDERAGENT 0x01 -#define SENDERNETTYPE 0x02 -#define SENDERNETADDR 0x03 -#define SENDEREXT 0x04 -#define SENDERPOS 0x05 -#define SENDERORG 0x06 - -#define AUTHOR 0x10 -#define AUTHORAGENT 0x11 -#define AUTHORNETTYPE 0x12 -#define AUTHORNETADDR 0x13 -#define AUTHOREXT 0x14 -#define AUTHORPOS 0x15 -#define AUTHORORG 0x16 - -#define REPLYTO 0x20 -#define REPLYTOAGENT 0x21 -#define REPLYTONETTYPE 0x22 -#define REPLYTONETADDR 0x23 -#define REPLYTOEXT 0x24 -#define REPLYTOPOS 0x25 -#define REPLYTOORG 0x26 - -#define RECIPIENT 0x30 -#define RECIPIENTAGENT 0x31 -#define RECIPIENTNETTYPE 0x32 -#define RECIPIENTNETADDR 0x33 -#define RECIPIENTEXT 0x34 -#define RECIPIENTPOS 0x35 -#define RECIPIENTORG 0x36 - -#define FORWARDTO 0x40 -#define FORWARDTOAGENT 0x41 -#define FORWARDTONETTYPE 0x42 -#define FORWARDTONETADDR 0x43 -#define FORWARDTOEXT 0x44 -#define FORWARDTOPOS 0x45 -#define FORWARDTOORG 0x46 - -#define FORWARDED 0x48 - -#define RECEIVEDBY 0x50 -#define RECEIVEDBYAGENT 0x51 -#define RECEIVEDBYNETTYPE 0x52 -#define RECEIVEDBYNETADDR 0x53 -#define RECEIVEDBYEXT 0x54 -#define RECEIVEDBYPOS 0x55 -#define RECEIVEDBYORG 0x56 - -#define RECEIVED 0x58 - -#define SUBJECT 0x60 -#define SUMMARY 0x61 -#ifndef COMMENT -#define COMMENT 0x62 -#endif -#define CARBONCOPY 0x63 -#define GROUP 0x64 -#define EXPIRATION 0x65 -#define PRIORITY 0x66 - -#define FILEATTACH 0x70 -#define DESTFILE 0x71 -#define FILEATTACHLIST 0x72 -#define DESTFILELIST 0x73 -#define FILEREQUEST 0x74 -#define FILEPASSWORD 0x75 -#define FILEREQUESTLIST 0x76 -#define FILEPASSWORDLIST 0x77 - -#define IMAGEATTACH 0x80 -#define ANIMATTACH 0x81 -#define FONTATTACH 0x82 -#define SOUNDATTACH 0x83 -#define PRESENTATTACH 0x84 -#define VIDEOATTACH 0x85 -#define APPDATAATTACH 0x86 - -#define IMAGETRIGGER 0x90 -#define ANIMTRIGGER 0x91 -#define FONTTRIGGER 0x92 -#define SOUNDTRIGGER 0x93 -#define PRESENTTRIGGER 0x94 -#define VIDEOTRIGGER 0x95 -#define APPDATATRIGGER 0x96 - -#define FIDOCTRL 0xa0 -#define FIDOAREA 0xa1 -#define FIDOSEENBY 0xa2 -#define FIDOPATH 0xa3 -#define FIDOMSGID 0xa4 -#define FIDOREPLYID 0xa5 -#define FIDOPID 0xa6 -#define FIDOFLAGS 0xa7 - -#define RFC822HEADER 0xb0 -#define RFC822MSGID 0xb1 -#define RFC822REPLYID 0xb2 - -#define UNKNOWN 0xf1 -#define UNKNOWNASCII 0xf2 -#define UNUSED 0xff - - /* Valid dfield_t.types */ -#define TEXT_BODY 0x00 -#define TEXT_SOUL 0x01 -#define TEXT_TAIL 0x02 -#define TEXT_WING 0x03 -#define IMAGEEMBED 0x20 -#define ANIMEMBED 0x21 -#define FONTEMBED 0x22 -#define SOUNDEMBED 0x23 -#define PRESENTEMBED 0x24 -#define VIDEOEMBED 0x25 -#define APPDATAEMBED 0x26 -#define UNUSED 0xff - - - /* Message attributes */ -#define MSG_PRIVATE (1<<0) -#define MSG_READ (1<<1) -#define MSG_PERMANENT (1<<2) -#define MSG_LOCKED (1<<3) -#define MSG_DELETE (1<<4) -#define MSG_ANONYMOUS (1<<5) -#define MSG_KILLREAD (1<<6) -#define MSG_MODERATED (1<<7) -#define MSG_VALIDATED (1<<8) -#define MSG_REPLIED (1<<9) // User replied to this message - - /* Auxillary header attributes */ -#define MSG_FILEREQUEST (1<<0) // File request -#define MSG_FILEATTACH (1<<1) // File(s) attached to Msg -#define MSG_TRUNCFILE (1<<2) // Truncate file(s) when sent -#define MSG_KILLFILE (1<<3) // Delete file(s) when sent -#define MSG_RECEIPTREQ (1<<4) // Return receipt requested -#define MSG_CONFIRMREQ (1<<5) // Confirmation receipt requested -#define MSG_NODISP (1<<6) // Msg may not be displayed to user - - /* Message network attributes */ -#define MSG_LOCAL (1<<0) // Msg created locally -#define MSG_INTRANSIT (1<<1) // Msg is in-transit -#define MSG_SENT (1<<2) // Sent to remote -#define MSG_KILLSENT (1<<3) // Kill when sent -#define MSG_ARCHIVESENT (1<<4) // Archive when sent -#define MSG_HOLD (1<<5) // Hold for pick-up -#define MSG_CRASH (1<<6) // Crash -#define MSG_IMMEDIATE (1<<7) // Send Msg now, ignore restrictions -#define MSG_DIRECT (1<<8) // Send directly to destination -#define MSG_GATE (1<<9) // Send via gateway -#define MSG_ORPHAN (1<<10) // Unknown destination -#define MSG_FPU (1<<11) // Force pickup -#define MSG_TYPELOCAL (1<<12) // Msg is for local use only -#define MSG_TYPEECHO (1<<13) // Msg is for conference distribution -#define MSG_TYPENET (1<<14) // Msg is direct network mail - - -enum { - NET_NONE - ,NET_UNKNOWN - ,NET_FIDO - ,NET_POSTLINK - ,NET_QWK - ,NET_INTERNET - ,NET_WWIV - ,NET_MHS - -/* Add new ones here */ - - ,NET_TYPES - }; - -enum { - AGENT_PERSON - ,AGENT_PROCESS - -/* Add new ones here */ - - ,AGENT_TYPES - }; - -enum { - XLAT_NONE // No translation/End of translation list - ,XLAT_ENCRYPT // Encrypted data - ,XLAT_ESCAPED // 7-bit ASCII escaping for ctrl and 8-bit data - ,XLAT_HUFFMAN // Static and adaptive Huffman coding compression - ,XLAT_LZW // Limpel/Ziv/Welch compression - ,XLAT_MLZ78 // Modified LZ78 compression - ,XLAT_RLE // Run length encoding compression - ,XLAT_IMPLODE // Implode compression (PkZIP) - ,XLAT_SHRINK // Shrink compression (PkZIP) - ,XLAT_LZH // LHarc (LHA) Dynamic Huffman coding - -/* Add new ones here */ - - ,XLAT_TYPES - }; - - -/************/ -/* Typedefs */ -/************/ - -#ifdef _WIN32 /* necessary for compatibility with SBBS v2 */ -#pragma pack(push) -#pragma pack(1) -#endif - -typedef struct { // Time with time-zone - - ulong time; // Local time (unix format) - short zone; // Time zone - - } when_t; - -typedef struct { // Index record - - ushort to; // 16-bit CRC of recipient name (lower case) - ushort from; // 16-bit CRC of sender name (lower case) - ushort subj; // 16-bit CRC of subject (lower case, w/o RE:) - ushort attr; // attributes (read, permanent, etc.) - ulong offset; // offset into header file - ulong number; // number of message (1 based) - ulong time; // time/date message was imported/posted - - } idxrec_t; - -typedef struct { // Message base header (fixed portion) - - uchar id[4]; // text or binary unique hdr ID - ushort version; // version number (initially 100h for 1.00) - ushort length; // length including this struct - - } smbhdr_t; - -typedef struct { // Message base status header - - ulong last_msg; // last message number - ulong total_msgs; // total messages - ulong header_offset; // byte offset to first header record - ulong max_crcs; // Maximum number of CRCs to keep in history - ulong max_msgs; // Maximum number of message to keep in sub - ushort max_age; // Maximum age of message to keep in sub (in days) - ushort attr; // Attributes for this message base (SMB_HYPER,etc) - - } smbstatus_t; - -typedef struct { // Message header - - uchar id[4]; // SHD<^Z> - ushort type; // Message type (normally 0) - ushort version; // Version of type (initially 100h for 1.00) - ushort length; // Total length of fixed record + all fields - ushort attr; // Attributes (bit field) (duped in SID) - ulong auxattr; // Auxillary attributes (bit field) - ulong netattr; // Network attributes - when_t when_written; // Time message was written (unix format) - when_t when_imported; // Time message was imported - ulong number; // Message number - ulong thread_orig; // Original message number in thread - ulong thread_next; // Next message in thread - ulong thread_first; // First reply to this message - uchar reserved[16]; // Reserved for future use - ulong offset; // Offset for buffer into data file (0 or mod 256) - ushort total_dfields; // Total number of data fields - - } msghdr_t; - -typedef struct { // Data field - - ushort type; // Type of data field - ulong offset; // Offset into buffer - ulong length; // Length of data field - - } dfield_t; - -typedef struct { // Header field - - ushort type; - ushort length; // Length of buffer - - } hfield_t; - -typedef struct { // FidoNet address (zone:net/node.point) - - ushort zone; - ushort net; - ushort node; - ushort point; - - } fidoaddr_t; - -typedef struct { // Network (type and address) - - ushort type; - void *addr; - - } net_t; - -typedef struct { // Message - - idxrec_t idx; // Index - msghdr_t hdr; // Header record (fixed portion) - char *to, // To name - *to_ext, // To extension - *from, // From name - *from_ext, // From extension - *replyto, // Reply-to name - *replyto_ext, // Reply-to extension */ - *subj; // Subject - ushort to_agent, // Type of agent message is to - from_agent, // Type of agent message is from - replyto_agent; // Type of agent replies should be sent to - net_t to_net, // Destination network type and address - from_net, // Origin network address - replyto_net; // Network type and address for replies - ushort total_hfields; // Total number of header fields - hfield_t *hfield; // Header fields (fixed length portion) - void **hfield_dat; // Header fields (variable length portion) - dfield_t *dfield; // Data fields (fixed length portion) - ulong offset; // Offset (number of records) into index - uchar forwarded; // Forwarded from agent to another - when_t expiration; // Message will exipre on this day (if >0) - - } smbmsg_t; - -typedef struct { // Message base - - char file[128]; // Path and base filename (no extension) - FILE *sdt_fp; // File pointer for data (.sdt) file - FILE *shd_fp; // File pointer for header (.shd) file - FILE *sid_fp; // File pointer for index (.sid) file - FILE *sda_fp; // File pointer for data allocation (.sda) file - FILE *sha_fp; // File pointer for header allocation (.sha) file - ulong retry_time; // Maximum number of seconds to retry opens/locks - smbstatus_t status; // Status header record - char shd_buf[SHD_BLOCK_LEN]; // File I/O buffer for header file - - } smb_t; - -#ifdef _WIN32 -#pragma pack(pop) /* original packing */ -#endif - -#endif /* Don't add anything after this #endif statement */ diff --git a/src/sbbs2/smb/smblib.c b/src/sbbs2/smb/smblib.c deleted file mode 100644 index e414456e22..0000000000 --- a/src/sbbs2/smb/smblib.c +++ /dev/null @@ -1,1383 +0,0 @@ -/* SMBLIB.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "smblib.h" - -/* Use smb_ver() and smb_lib_ver() to obtain these values */ -#define SMBLIB_VERSION "2.10" /* SMB library version */ -#define SMB_VERSION 0x0121 /* SMB format version */ - /* High byte major, low byte minor */ - -#ifdef _MSC_VER /* Microsoft C */ -#define sopen(f,o,s,p) _sopen(f,o,s,p) -#define close(f) _close(f) -#define SH_DENYNO _SH_DENYNO -#define SH_DENYRW _SH_DENYRW - -#include <sys/locking.h> - -int lock(int file, long offset, int size) -{ - int i; - long pos; - - pos=tell(file); - if(offset!=pos) - lseek(file, offset, SEEK_SET); - i=locking(file,LK_NBLCK,size); - if(offset!=pos) - lseek(file, pos, SEEK_SET); - return(i); -} - -int unlock(int file, long offset, int size) -{ - int i; - long pos; - - pos=tell(file); - if(offset!=pos) - lseek(file, offset, SEEK_SET); - i=locking(file,LK_UNLCK,size); - if(offset!=pos) - lseek(file, pos, SEEK_SET); - return(i); -} - -#endif /* _MSC_VER */ - - -int SMBCALL smb_ver(void) -{ - return(SMB_VERSION); -} - -char * SMBCALL smb_lib_ver(void) -{ - return(SMBLIB_VERSION); -} - -/****************************************************************************/ -/* Open a message base of name 'smb->file' */ -/* Opens files for READing messages or updating message indices only */ -/****************************************************************************/ -int SMBCALL smb_open(smb_t *smb) -{ - int file; - char str[128]; - smbhdr_t hdr; - -if(!smb->retry_time) - smb->retry_time=10; -smb->shd_fp=smb->sdt_fp=smb->sid_fp=NULL; -sprintf(str,"%s.SHD",smb->file); -if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO,S_IWRITE|S_IREAD))==-1 - || (smb->shd_fp=fdopen(file,"r+b"))==NULL) { - if(file!=-1) - close(file); - return(2); } - -if(filelength(file)>=sizeof(smbhdr_t)) { - setvbuf(smb->shd_fp,smb->shd_buf,_IONBF,SHD_BLOCK_LEN); - if(smb_locksmbhdr(smb)) { - smb_close(smb); - return(-1); } - memset(&hdr,0,sizeof(smbhdr_t)); - fread(&hdr,sizeof(smbhdr_t),1,smb->shd_fp); - if(memcmp(hdr.id,"SMB\x1a",4)) { - smb_close(smb); - return(-2); } - if(hdr.version<0x110) { /* Compatibility check */ - smb_close(smb); - return(-3); } - if(fread(&(smb->status),1,sizeof(smbstatus_t),smb->shd_fp) - !=sizeof(smbstatus_t)) { - smb_close(smb); - return(-4); } - smb_unlocksmbhdr(smb); - rewind(smb->shd_fp); } - -setvbuf(smb->shd_fp,smb->shd_buf,_IOFBF,SHD_BLOCK_LEN); - -sprintf(str,"%s.SDT",smb->file); -if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO,S_IWRITE|S_IREAD))==-1 - || (smb->sdt_fp=fdopen(file,"r+b"))==NULL) { - if(file!=-1) - close(file); - smb_close(smb); - return(1); } -setvbuf(smb->sdt_fp,NULL,_IOFBF,2*1024); - -sprintf(str,"%s.SID",smb->file); -if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYNO,S_IWRITE|S_IREAD))==-1 - || (smb->sid_fp=fdopen(file,"r+b"))==NULL) { - if(file!=-1) - close(file); - smb_close(smb); - return(3); } -setvbuf(smb->sid_fp,NULL,_IOFBF,2*1024); - -return(0); -} - -/****************************************************************************/ -/* Closes the currently open message base */ -/****************************************************************************/ -void SMBCALL smb_close(smb_t *smb) -{ -if(smb->shd_fp!=NULL) { - smb_unlocksmbhdr(smb); /* In case it's been locked */ - fclose(smb->shd_fp); } -if(smb->sid_fp!=NULL) - fclose(smb->sid_fp); -if(smb->sdt_fp!=NULL) - fclose(smb->sdt_fp); -smb->sid_fp=smb->shd_fp=smb->sdt_fp=NULL; -} - -/****************************************************************************/ -/* Opens the data block allocation table message base 'smb->file' */ -/* Retrys for retry_time number of seconds */ -/* Return 0 on success, non-zero otherwise */ -/****************************************************************************/ -int SMBCALL smb_open_da(smb_t *smb) -{ - int file; - char str[128]; - ulong start=0; - -sprintf(str,"%s.SDA",smb->file); -while(1) { - if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IWRITE|S_IREAD))!=-1) - break; - if(errno!=EACCES) - return(-1); - if(!start) - start=time(NULL); - else - if(time(NULL)-start>=smb->retry_time) - return(-2); } -if((smb->sda_fp=fdopen(file,"r+b"))==NULL) { - close(file); - return(-3); } -setvbuf(smb->sda_fp,NULL,_IOFBF,2*1024); -return(0); -} - -void SMBCALL smb_close_da(smb_t *smb) -{ -if(smb->sda_fp!=NULL) - fclose(smb->sda_fp); -smb->sda_fp=NULL; -} - -/****************************************************************************/ -/* Opens the header block allocation table for message base 'smb.file' */ -/* Retrys for smb.retry_time number of seconds */ -/* Return 0 on success, non-zero otherwise */ -/****************************************************************************/ -int SMBCALL smb_open_ha(smb_t *smb) -{ - int file; - char str[128]; - ulong start=0; - -sprintf(str,"%s.SHA",smb->file); -while(1) { - if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IWRITE|S_IREAD))!=-1) - break; - if(errno!=EACCES) - return(-1); - if(!start) - start=time(NULL); - else - if(time(NULL)-start>=smb->retry_time) - return(-2); } -if((smb->sha_fp=fdopen(file,"r+b"))==NULL) { - close(file); - return(-3); } -setvbuf(smb->sha_fp,NULL,_IOFBF,2*1024); -return(0); -} - -void SMBCALL smb_close_ha(smb_t *smb) -{ -if(smb->sha_fp!=NULL) - fclose(smb->sha_fp); -smb->sha_fp=NULL; -} - - -/****************************************************************************/ -/* If the parameter 'push' is non-zero, this function stores the currently */ -/* open message base to the "virtual" smb stack. Up to SMB_STACK_LEN */ -/* message bases may be stored (defined in SMBDEFS.H). */ -/* The parameter 'op' is the operation to perform on the stack. Either */ -/* SMB_STACK_PUSH, SMB_STACK_POP, or SMB_STACK_XCHNG */ -/* If the operation is SMB_STACK_POP, this function restores a message base */ -/* previously saved with a SMB_STACK_PUSH call to this same function. */ -/* If the operation is SMB_STACK_XCHNG, then the current message base is */ -/* exchanged with the message base on the top of the stack (most recently */ -/* pushed. */ -/* If the current message base is not open, the SMB_STACK_PUSH and */ -/* SMB_STACK_XCHNG operations do nothing */ -/* Returns 0 on success, non-zero if stack full. */ -/* If operation is SMB_STACK_POP or SMB_STACK_XCHNG, it always returns 0. */ -/****************************************************************************/ -int SMBCALL smb_stack(smb_t *smb, int op) -{ - static char stack_file[SMB_STACK_LEN][128]; - static FILE *stack_sdt[SMB_STACK_LEN], - *stack_shd[SMB_STACK_LEN], - *stack_sid[SMB_STACK_LEN], - *stack_sda[SMB_STACK_LEN], - *stack_sha[SMB_STACK_LEN]; - static int stack_idx; - char tmp_file[128]; - FILE *tmp_sdt, - *tmp_shd, - *tmp_sid, - *tmp_sda, - *tmp_sha; - -if(op==SMB_STACK_PUSH) { - if(stack_idx>=SMB_STACK_LEN) - return(1); - if(smb->shd_fp==NULL || smb->sdt_fp==NULL || smb->sid_fp==NULL) - return(0); /* Msg base not open */ - memcpy(stack_file[stack_idx],smb->file,128); - stack_sdt[stack_idx]=smb->sdt_fp; - stack_shd[stack_idx]=smb->shd_fp; - stack_sid[stack_idx]=smb->sid_fp; - stack_sda[stack_idx]=smb->sda_fp; - stack_sha[stack_idx]=smb->sha_fp; - stack_idx++; - return(0); } -/* pop or xchng */ -if(!stack_idx) /* Nothing on the stack, so do nothing */ - return(0); -if(op==SMB_STACK_XCHNG) { - if(!smb->shd_fp) - return(0); - memcpy(tmp_file,smb->file,128); - tmp_sdt=smb->sdt_fp; - tmp_shd=smb->shd_fp; - tmp_sid=smb->sid_fp; - tmp_sda=smb->sda_fp; - tmp_sha=smb->sha_fp; } - -stack_idx--; -memcpy(smb->file,stack_file[stack_idx],128); -smb->sdt_fp=stack_sdt[stack_idx]; -smb->shd_fp=stack_shd[stack_idx]; -smb->sid_fp=stack_sid[stack_idx]; -smb->sda_fp=stack_sda[stack_idx]; -smb->sha_fp=stack_sha[stack_idx]; -if(op==SMB_STACK_XCHNG) { - stack_idx++; - memcpy(stack_file[stack_idx-1],tmp_file,128); - stack_sdt[stack_idx-1]=tmp_sdt; - stack_shd[stack_idx-1]=tmp_shd; - stack_sid[stack_idx-1]=tmp_sid; - stack_sda[stack_idx-1]=tmp_sda; - stack_sha[stack_idx-1]=tmp_sha; } -return(0); -} - -/****************************************************************************/ -/* Truncates header file */ -/* Retrys for smb.retry_time number of seconds */ -/* Return 0 on success, non-zero otherwise */ -/****************************************************************************/ -int SMBCALL smb_trunchdr(smb_t *smb) -{ - ulong start=0; - -rewind(smb->shd_fp); -while(1) { - if(!chsize(fileno(smb->shd_fp),0L)) - break; - if(errno!=EACCES) - return(-1); - if(!start) - start=time(NULL); - else - if(time(NULL)-start>=smb->retry_time) /* Time-out */ - return(-2); } -return(0); -} - -/*********************************/ -/* Message Base Header Functions */ -/*********************************/ - -/****************************************************************************/ -/* Attempts for smb.retry_time number of seconds to lock the msg base hdr */ -/****************************************************************************/ -int SMBCALL smb_locksmbhdr(smb_t *smb) -{ - ulong start=0; - -while(1) { - if(!lock(fileno(smb->shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t))) - return(0); - if(!start) - start=time(NULL); - else - if(time(NULL)-start>=smb->retry_time) - break; /* Incase we've already locked it */ - unlock(fileno(smb->shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t)); } -return(-1); -} - -/****************************************************************************/ -/* Read the SMB header from the header file and place into smb.status */ -/****************************************************************************/ -int SMBCALL smb_getstatus(smb_t *smb) -{ - int i; - -setvbuf(smb->shd_fp,smb->shd_buf,_IONBF,SHD_BLOCK_LEN); -clearerr(smb->shd_fp); -fseek(smb->shd_fp,sizeof(smbhdr_t),SEEK_SET); -i=fread(&(smb->status),1,sizeof(smbstatus_t),smb->shd_fp); -setvbuf(smb->shd_fp,smb->shd_buf,_IOFBF,SHD_BLOCK_LEN); -if(i==sizeof(smbstatus_t)) - return(0); -return(1); -} - -/****************************************************************************/ -/* Writes message base header */ -/****************************************************************************/ -int SMBCALL smb_putstatus(smb_t *smb) -{ - int i; - -clearerr(smb->shd_fp); -fseek(smb->shd_fp,sizeof(smbhdr_t),SEEK_SET); -i=fwrite(&(smb->status),1,sizeof(smbstatus_t),smb->shd_fp); -fflush(smb->shd_fp); -if(i==sizeof(smbstatus_t)) - return(0); -return(1); -} - -/****************************************************************************/ -/* Unlocks previously locks message base header */ -/****************************************************************************/ -int SMBCALL smb_unlocksmbhdr(smb_t *smb) -{ -return(unlock(fileno(smb->shd_fp),0L,sizeof(smbhdr_t)+sizeof(smbstatus_t))); -} - -/********************************/ -/* Individual Message Functions */ -/********************************/ - -/****************************************************************************/ -/* Attempts for smb.retry_time number of seconds to lock the hdr for 'msg' */ -/****************************************************************************/ -int SMBCALL smb_lockmsghdr(smb_t *smb, smbmsg_t *msg) -{ - ulong start=0; - -while(1) { - if(!lock(fileno(smb->shd_fp),msg->idx.offset,sizeof(msghdr_t))) - return(0); - if(!start) - start=time(NULL); - else - if(time(NULL)-start>=smb->retry_time) - break; - unlock(fileno(smb->shd_fp),msg->idx.offset,sizeof(msghdr_t)); } -return(-1); -} - -/****************************************************************************/ -/* Fills msg->idx with message index based on msg->hdr.number */ -/* OR if msg->hdr.number is 0, based on msg->offset (record offset). */ -/* if msg.hdr.number does not equal 0, then msg->offset is filled too. */ -/* Either msg->hdr.number or msg->offset must be initialized before */ -/* calling this function */ -/* Returns 1 if message number wasn't found, 0 if it was */ -/****************************************************************************/ -int SMBCALL smb_getmsgidx(smb_t *smb, smbmsg_t *msg) -{ - idxrec_t idx; - ulong l,length,total,bot,top; - -clearerr(smb->sid_fp); -if(!msg->hdr.number) { - fseek(smb->sid_fp,msg->offset*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg->idx,sizeof(idxrec_t),1,smb->sid_fp)) - return(1); - return(0); } - -length=filelength(fileno(smb->sid_fp)); -if(!length) - return(1); -total=length/sizeof(idxrec_t); -if(!total) - return(1); - -bot=0; -top=total; -l=total/2; /* Start at middle index */ -while(1) { - fseek(smb->sid_fp,l*sizeof(idxrec_t),SEEK_SET); - if(!fread(&idx,sizeof(idxrec_t),1,smb->sid_fp)) - return(1); - if(bot==top-1 && idx.number!=msg->hdr.number) - return(1); - if(idx.number>msg->hdr.number) { - top=l; - l=bot+((top-bot)/2); - continue; } - if(idx.number<msg->hdr.number) { - bot=l; - l=top-((top-bot)/2); - continue; } - break; } -msg->idx=idx; -msg->offset=l; -return(0); -} - -/****************************************************************************/ -/* Reads the last index record in the open message base */ -/****************************************************************************/ -int SMBCALL smb_getlastidx(smb_t *smb, idxrec_t *idx) -{ - long length; - -clearerr(smb->sid_fp); -length=filelength(fileno(smb->sid_fp)); -if(length<sizeof(idxrec_t)) - return(-1); -fseek(smb->sid_fp,length-sizeof(idxrec_t),SEEK_SET); -if(!fread(idx,sizeof(idxrec_t),1,smb->sid_fp)) - return(-2); -return(0); -} - -/****************************************************************************/ -/* Figures out the total length of the header record for 'msg' */ -/* Returns length */ -/****************************************************************************/ -uint SMBCALL smb_getmsghdrlen(smbmsg_t *msg) -{ - int i; - -/* fixed portion */ -msg->hdr.length=sizeof(msghdr_t); -/* data fields */ -msg->hdr.length+=msg->hdr.total_dfields*sizeof(dfield_t); -/* header fields */ -for(i=0;i<msg->total_hfields;i++) { - msg->hdr.length+=sizeof(hfield_t); - msg->hdr.length+=msg->hfield[i].length; } -return(msg->hdr.length); -} - -/****************************************************************************/ -/* Figures out the total length of the data buffer for 'msg' */ -/* Returns length */ -/****************************************************************************/ -ulong SMBCALL smb_getmsgdatlen(smbmsg_t *msg) -{ - int i; - ulong length=0L; - -for(i=0;i<msg->hdr.total_dfields;i++) - length+=msg->dfield[i].length; -return(length); -} - -/****************************************************************************/ -/* Read header information into 'msg' structure */ -/* msg->idx.offset must be set before calling this function */ -/* Must call smb_freemsgmem() to free memory allocated for var len strs */ -/* Returns 0 on success, non-zero if error */ -/****************************************************************************/ -int SMBCALL smb_getmsghdr(smb_t *smb, smbmsg_t *msg) -{ - void *vp,**vpp; - ushort i; - ulong l,offset; - idxrec_t idx; - -rewind(smb->shd_fp); -fseek(smb->shd_fp,msg->idx.offset,SEEK_SET); -idx=msg->idx; -offset=msg->offset; -memset(msg,0,sizeof(smbmsg_t)); -msg->idx=idx; -msg->offset=offset; -if(!fread(&msg->hdr,sizeof(msghdr_t),1,smb->shd_fp)) - return(-1); -if(memcmp(msg->hdr.id,"SHD\x1a",4)) - return(-2); -if(msg->hdr.version<0x110) - return(-9); -l=sizeof(msghdr_t); -if(msg->hdr.total_dfields && (msg->dfield - =(dfield_t *)MALLOC(sizeof(dfield_t)*msg->hdr.total_dfields))==NULL) { - smb_freemsgmem(msg); - return(-3); } -i=0; -while(i<msg->hdr.total_dfields && l<msg->hdr.length) { - if(!fread(&msg->dfield[i],sizeof(dfield_t),1,smb->shd_fp)) { - smb_freemsgmem(msg); - return(-4); } - i++; - l+=sizeof(dfield_t); } -if(i<msg->hdr.total_dfields) { - smb_freemsgmem(msg); - return(-8); } - -while(l<msg->hdr.length) { - i=msg->total_hfields; - if((vpp=(void **)REALLOC(msg->hfield_dat,sizeof(void *)*(i+1)))==NULL) { - smb_freemsgmem(msg); - return(-3); } - msg->hfield_dat=vpp; - if((vp=(hfield_t *)REALLOC(msg->hfield,sizeof(hfield_t)*(i+1)))==NULL) { - smb_freemsgmem(msg); - return(-3); } - msg->hfield=vp; - msg->total_hfields++; - if(!fread(&msg->hfield[i],sizeof(hfield_t),1,smb->shd_fp)) { - smb_freemsgmem(msg); - return(-5); } - l+=sizeof(hfield_t); - if((msg->hfield_dat[i]=(char *)MALLOC(msg->hfield[i].length+1)) - ==NULL) { /* Allocate 1 extra for NULL terminator */ - smb_freemsgmem(msg); /* or 0 length field */ - return(-3); } - memset(msg->hfield_dat[i],0,msg->hfield[i].length+1); /* init to NULL */ - if(msg->hfield[i].length - && !fread(msg->hfield_dat[i],msg->hfield[i].length,1,smb->shd_fp)) { - smb_freemsgmem(msg); - return(-6); } - - switch(msg->hfield[i].type) { /* convenience variables */ - case SENDER: - if(!msg->from) { - msg->from=msg->hfield_dat[i]; - break; } - case FORWARDED: /* fall through */ - msg->forwarded=1; - break; - case SENDERAGENT: - if(!msg->forwarded) - msg->from_agent=*(ushort *)msg->hfield_dat[i]; - break; - case SENDEREXT: - if(!msg->forwarded) - msg->from_ext=msg->hfield_dat[i]; - break; - case SENDERNETTYPE: - if(!msg->forwarded) - msg->from_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case SENDERNETADDR: - if(!msg->forwarded) - msg->from_net.addr=msg->hfield_dat[i]; - break; - case REPLYTO: - msg->replyto=msg->hfield_dat[i]; - break; - case REPLYTOEXT: - msg->replyto_ext=msg->hfield_dat[i]; - break; - case REPLYTOAGENT: - msg->replyto_agent=*(ushort *)msg->hfield_dat[i]; - break; - case REPLYTONETTYPE: - msg->replyto_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case REPLYTONETADDR: - msg->replyto_net.addr=msg->hfield_dat[i]; - break; - case RECIPIENT: - msg->to=msg->hfield_dat[i]; - break; - case RECIPIENTEXT: - msg->to_ext=msg->hfield_dat[i]; - break; - case RECIPIENTAGENT: - msg->to_agent=*(ushort *)msg->hfield_dat[i]; - break; - case RECIPIENTNETTYPE: - msg->to_net.type=*(ushort *)msg->hfield_dat[i]; - break; - case RECIPIENTNETADDR: - msg->to_net.addr=msg->hfield_dat[i]; - break; - case SUBJECT: - msg->subj=msg->hfield_dat[i]; - break; } - l+=msg->hfield[i].length; } - -if(!msg->from || !msg->to || !msg->subj) { - smb_freemsgmem(msg); - return(-7); } -return(0); -} - -/****************************************************************************/ -/* Frees memory allocated for 'msg' */ -/****************************************************************************/ -void SMBCALL smb_freemsgmem(smbmsg_t *msg) -{ - ushort i; - - if(msg->dfield) { - FREE(msg->dfield); - msg->dfield=NULL; - } - for(i=0;i<msg->total_hfields;i++) - if(msg->hfield_dat[i]) { - FREE(msg->hfield_dat[i]); - msg->hfield_dat[i]=NULL; - } - msg->total_hfields=0; - if(msg->hfield) { - FREE(msg->hfield); - msg->hfield=NULL; - } - if(msg->hfield_dat) { - FREE(msg->hfield_dat); - msg->hfield_dat=NULL; - } -} - -/****************************************************************************/ -/* Unlocks header for 'msg' */ -/****************************************************************************/ -int SMBCALL smb_unlockmsghdr(smb_t *smb, smbmsg_t *msg) -{ -return(unlock(fileno(smb->shd_fp),msg->idx.offset,sizeof(msghdr_t))); -} - - -/****************************************************************************/ -/* Adds a header field to the 'msg' structure (in memory only) */ -/****************************************************************************/ -int SMBCALL smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data) -{ - void *vp,**vpp; - int i; - -i=msg->total_hfields; -if((vp=(hfield_t *)REALLOC(msg->hfield,sizeof(hfield_t)*(i+1)))==NULL) - return(1); -msg->hfield=vp; -if((vpp=(void **)REALLOC(msg->hfield_dat,sizeof(void *)*(i+1)))==NULL) - return(2); -msg->hfield_dat=vpp; -msg->total_hfields++; -msg->hfield[i].type=type; -msg->hfield[i].length=length; -if(length) { - if((msg->hfield_dat[i]=(void *)MALLOC(length))==NULL) - return(4); - memcpy(msg->hfield_dat[i],data,length); } -else - msg->hfield_dat[i]=NULL; -return(0); -} - -/****************************************************************************/ -/* Adds a data field to the 'msg' structure (in memory only) */ -/* Automatically figures out the offset into the data buffer from existing */ -/* dfield lengths */ -/****************************************************************************/ -int SMBCALL smb_dfield(smbmsg_t *msg, ushort type, ulong length) -{ - void *vp; - int i,j; - -i=msg->hdr.total_dfields; -if((vp=(dfield_t *)REALLOC(msg->dfield,sizeof(dfield_t)*(i+1)))==NULL) - return(1); -msg->dfield=vp; -msg->hdr.total_dfields++; -msg->dfield[i].type=type; -msg->dfield[i].length=length; -for(j=msg->dfield[i].offset=0;j<i;j++) - msg->dfield[i].offset+=msg->dfield[j].length; -return(0); -} - -/****************************************************************************/ -/* Checks CRC history file for duplicate crc. If found, returns 1. */ -/* If no dupe, adds to CRC history and returns 0, or negative if error. */ -/****************************************************************************/ -int SMBCALL smb_addcrc(smb_t *smb, ulong crc) -{ - char str[128]; - int file; - long length; - ulong l,*buf; - ulong start=0; - -if(!smb->status.max_crcs) - return(0); - -sprintf(str,"%s.SCH",smb->file); -while(1) { - if((file=sopen(str,O_RDWR|O_CREAT|O_BINARY,SH_DENYRW,S_IWRITE|S_IREAD))!=-1) - break; - if(errno!=EACCES) - return(-1); - if(!start) - start=time(NULL); - else - if(time(NULL)-start>=smb->retry_time) - return(-2); } - -length=filelength(file); -if(length<0L) { - close(file); - return(-4); } -if((buf=(ulong *)MALLOC(smb->status.max_crcs*4))==NULL) { - close(file); - return(-3); } -if(length>=smb->status.max_crcs*4) { /* Reached or exceeds max crcs */ - read(file,buf,smb->status.max_crcs*4); - for(l=0;l<smb->status.max_crcs;l++) - if(crc==buf[l]) - break; - if(l<smb->status.max_crcs) { /* Dupe CRC found */ - close(file); - FREE(buf); - return(1); } - chsize(file,0L); /* truncate it */ - lseek(file,0L,SEEK_SET); - write(file,buf+4,(smb->status.max_crcs-1)*4); } - -else if(length/4) { /* Less than max crcs */ - read(file,buf,length); - for(l=0;l<length/4;l++) - if(crc==buf[l]) - break; - if(l<length/4) { /* Dupe CRC found */ - close(file); - FREE(buf); - return(1); } } - -lseek(file,0L,SEEK_END); -write(file,&crc,4); /* Write to the end */ -FREE(buf); -close(file); -return(0); -} - - -/****************************************************************************/ -/* Creates a new message header record in the header file. */ -/* If storage is SMB_SELFPACK, self-packing conservative allocation is used */ -/* If storage is SMB_FASTALLOC, fast allocation is used */ -/* If storage is SMB_HYPERALLOC, no allocation tables are used (fastest) */ -/****************************************************************************/ -int SMBCALL smb_addmsghdr(smb_t *smb, smbmsg_t *msg, int storage) -{ - int i; - long l; - -if(smb_locksmbhdr(smb)) - return(1); -if(smb_getstatus(smb)) - return(2); - -if(storage!=SMB_HYPERALLOC && (i=smb_open_ha(smb))!=0) - return(i); - -msg->hdr.length=smb_getmsghdrlen(msg); -if(storage==SMB_HYPERALLOC) - l=smb_hallochdr(smb); -else if(storage==SMB_FASTALLOC) - l=smb_fallochdr(smb,msg->hdr.length); -else - l=smb_allochdr(smb,msg->hdr.length); -if(l==-1L) { - smb_unlocksmbhdr(smb); - smb_close_ha(smb); - return(-1); } - -smb->status.last_msg++; -msg->idx.number=msg->hdr.number=smb->status.last_msg; -msg->idx.offset=smb->status.header_offset+l; -msg->idx.time=msg->hdr.when_imported.time; -msg->idx.attr=msg->hdr.attr; -msg->offset=smb->status.total_msgs; -smb->status.total_msgs++; -smb_putstatus(smb); - -if(storage!=SMB_HYPERALLOC) - smb_close_ha(smb); -i=smb_putmsg(smb,msg); -smb_unlocksmbhdr(smb); -return(i); -} - -/****************************************************************************/ -/* Writes both header and index information for msg 'msg' */ -/****************************************************************************/ -int SMBCALL smb_putmsg(smb_t *smb, smbmsg_t *msg) -{ - int i; - -i=smb_putmsghdr(smb,msg); -if(i) - return(i); -return(smb_putmsgidx(smb,msg)); -} - -/****************************************************************************/ -/* Writes index information for 'msg' */ -/* msg->idx */ -/* and msg->offset must be set prior to calling to this function */ -/* Returns 0 if everything ok */ -/****************************************************************************/ -int SMBCALL smb_putmsgidx(smb_t *smb, smbmsg_t *msg) -{ - -clearerr(smb->sid_fp); -fseek(smb->sid_fp,msg->offset*sizeof(idxrec_t),SEEK_SET); -if(!fwrite(&msg->idx,sizeof(idxrec_t),1,smb->sid_fp)) - return(1); -fflush(smb->sid_fp); -return(0); -} - -/****************************************************************************/ -/* Writes header information for 'msg' */ -/* msg->hdr.length */ -/* msg->idx.offset */ -/* and msg->offset must be set prior to calling to this function */ -/* Returns 0 if everything ok */ -/****************************************************************************/ -int SMBCALL smb_putmsghdr(smb_t *smb, smbmsg_t *msg) -{ - ushort i; - ulong l; - -clearerr(smb->shd_fp); -if(fseek(smb->shd_fp,msg->idx.offset,SEEK_SET)) - return(-1); - -/************************************************/ -/* Write the fixed portion of the header record */ -/************************************************/ -if(!fwrite(&msg->hdr,sizeof(msghdr_t),1,smb->shd_fp)) - return(-2); - -/************************************************/ -/* Write the data fields (each is fixed length) */ -/************************************************/ -for(i=0;i<msg->hdr.total_dfields;i++) - if(!fwrite(&msg->dfield[i],sizeof(dfield_t),1,smb->shd_fp)) - return(-3); - -/*******************************************/ -/* Write the variable length header fields */ -/*******************************************/ -for(i=0;i<msg->total_hfields;i++) { - if(!fwrite(&msg->hfield[i],sizeof(hfield_t),1,smb->shd_fp)) - return(-4); - if(msg->hfield[i].length /* more then 0 bytes long */ - && !fwrite(msg->hfield_dat[i],msg->hfield[i].length,1,smb->shd_fp)) - return(-5); } - -l=smb_getmsghdrlen(msg); -while(l%SHD_BLOCK_LEN) { - if(fputc(0,smb->shd_fp)==EOF) - return(-6); /* pad block with NULL */ - l++; } -fflush(smb->shd_fp); -return(0); -} - -/****************************************************************************/ -/* Creates a sub-board's initial header file */ -/* Truncates and deletes other associated SMB files */ -/****************************************************************************/ -int SMBCALL smb_create(smb_t *smb) -{ - char str[128]; - smbhdr_t hdr; - -if(filelength(fileno(smb->shd_fp))>=sizeof(smbhdr_t)+sizeof(smbstatus_t) - && smb_locksmbhdr(smb)) /* header exists, so lock it */ - return(1); -memset(&hdr,0,sizeof(smbhdr_t)); -memcpy(hdr.id,"SMB\x1a",4); /* <S> <M> <B> <^Z> */ -hdr.version=SMB_VERSION; -hdr.length=sizeof(smbhdr_t)+sizeof(smbstatus_t); -smb->status.last_msg=smb->status.total_msgs=0; -smb->status.header_offset=sizeof(smbhdr_t)+sizeof(smbstatus_t); -rewind(smb->shd_fp); -fwrite(&hdr,1,sizeof(smbhdr_t),smb->shd_fp); -fwrite(&(smb->status),1,sizeof(smbstatus_t),smb->shd_fp); -rewind(smb->shd_fp); -chsize(fileno(smb->shd_fp),sizeof(smbhdr_t)+sizeof(smbstatus_t)); -fflush(smb->shd_fp); - -rewind(smb->sdt_fp); -chsize(fileno(smb->sdt_fp),0L); -rewind(smb->sid_fp); -chsize(fileno(smb->sid_fp),0L); - -sprintf(str,"%s.SDA",smb->file); -remove(str); /* if it exists, delete it */ -sprintf(str,"%s.SHA",smb->file); -remove(str); /* if it exists, delete it */ -sprintf(str,"%s.SCH",smb->file); -remove(str); -smb_unlocksmbhdr(smb); -return(0); -} - -/****************************************************************************/ -/* Returns number of data blocks required to store "length" amount of data */ -/****************************************************************************/ -ulong SMBCALL smb_datblocks(ulong length) -{ - ulong blocks; - -blocks=length/SDT_BLOCK_LEN; -if(length%SDT_BLOCK_LEN) - blocks++; -return(blocks); -} - -/****************************************************************************/ -/* Returns number of header blocks required to store "length" size header */ -/****************************************************************************/ -ulong SMBCALL smb_hdrblocks(ulong length) -{ - ulong blocks; - -blocks=length/SHD_BLOCK_LEN; -if(length%SHD_BLOCK_LEN) - blocks++; -return(blocks); -} - -/****************************************************************************/ -/* Finds unused space in data file based on block allocation table and */ -/* marks space as used in allocation table. */ -/* File must be opened read/write DENY ALL */ -/* Returns offset to beginning of data (in bytes, not blocks) */ -/* Assumes smb_open_da() has been called */ -/* smb_close_da() should be called after */ -/* Returns negative on error */ -/****************************************************************************/ -long SMBCALL smb_allocdat(smb_t *smb, ulong length, ushort headers) -{ - ushort i,j; - ulong l,blocks,offset=0L; - -blocks=smb_datblocks(length); -j=0; /* j is consecutive unused block counter */ -fflush(smb->sda_fp); -rewind(smb->sda_fp); -while(!feof(smb->sda_fp)) { - if(!fread(&i,2,1,smb->sda_fp)) - break; - offset+=SDT_BLOCK_LEN; - if(!i) j++; - else j=0; - if(j==blocks) { - offset-=(blocks*SDT_BLOCK_LEN); - break; } } -clearerr(smb->sda_fp); -fseek(smb->sda_fp,(offset/SDT_BLOCK_LEN)*2L,SEEK_SET); -for(l=0;l<blocks;l++) - if(!fwrite(&headers,2,1,smb->sda_fp)) - return(-1); -fflush(smb->sda_fp); -return(offset); -} - -/****************************************************************************/ -/* Allocates space for data, but doesn't search for unused blocks */ -/* Returns negative on error */ -/****************************************************************************/ -long SMBCALL smb_fallocdat(smb_t *smb, ulong length, ushort headers) -{ - ulong l,blocks,offset; - -fflush(smb->sda_fp); -clearerr(smb->sda_fp); -blocks=smb_datblocks(length); -fseek(smb->sda_fp,0L,SEEK_END); -offset=(ftell(smb->sda_fp)/2L)*SDT_BLOCK_LEN; -for(l=0;l<blocks;l++) - if(!fwrite(&headers,2,1,smb->sda_fp)) - break; -fflush(smb->sda_fp); -if(l<blocks) - return(-1L); -return(offset); -} - -/****************************************************************************/ -/* De-allocates space for data */ -/* Returns non-zero on error */ -/****************************************************************************/ -int SMBCALL smb_freemsgdat(smb_t *smb, ulong offset, ulong length - , ushort headers) -{ - int da_opened=0; - ushort i; - ulong l,blocks; - -blocks=smb_datblocks(length); - -if(smb->sda_fp==NULL) { - if((i=smb_open_da(smb))!=0) - return(i); - da_opened=1; -} - -clearerr(smb->sda_fp); -for(l=0;l<blocks;l++) { - if(fseek(smb->sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET)) - return(1); - if(!fread(&i,2,1,smb->sda_fp)) - return(2); - if(headers>i) - i=0; /* don't want to go negative */ - else - i-=headers; - if(fseek(smb->sda_fp,-2L,SEEK_CUR)) - return(3); - if(!fwrite(&i,2,1,smb->sda_fp)) - return(4); } -fflush(smb->sda_fp); -if(da_opened) - smb_close_da(smb); -return(0); -} - -/****************************************************************************/ -/* Adds to data allocation records for blocks starting at 'offset' */ -/* Returns non-zero on error */ -/****************************************************************************/ -int SMBCALL smb_incdat(smb_t *smb, ulong offset, ulong length, ushort headers) -{ - ushort i; - ulong l,blocks; - -clearerr(smb->sda_fp); -blocks=smb_datblocks(length); -for(l=0;l<blocks;l++) { - fseek(smb->sda_fp,((offset/SDT_BLOCK_LEN)+l)*2L,SEEK_SET); - if(!fread(&i,2,1,smb->sda_fp)) - return(1); - i+=headers; - fseek(smb->sda_fp,-2L,SEEK_CUR); - if(!fwrite(&i,2,1,smb->sda_fp)) - return(2); } -fflush(smb->sda_fp); -return(0); -} - -/****************************************************************************/ -/* De-allocates blocks for header record */ -/* Returns non-zero on error */ -/****************************************************************************/ -int SMBCALL smb_freemsghdr(smb_t *smb, ulong offset, ulong length) -{ - uchar c=0; - ulong l,blocks; - -clearerr(smb->sha_fp); -blocks=smb_hdrblocks(length); -fseek(smb->sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET); -for(l=0;l<blocks;l++) - if(!fwrite(&c,1,1,smb->sha_fp)) - return(1); -fflush(smb->sha_fp); -return(0); -} - -/****************************************************************************/ -/* Frees all allocated header and data blocks for 'msg' */ -/****************************************************************************/ -int SMBCALL smb_freemsg(smb_t *smb, smbmsg_t *msg) -{ - int i; - ushort x; - -if(smb->status.attr&SMB_HYPERALLOC) /* Nothing to do */ - return(0); - -for(x=0;x<msg->hdr.total_dfields;x++) { - if((i=smb_freemsgdat(smb,msg->hdr.offset+msg->dfield[x].offset - ,msg->dfield[x].length,1))!=0) - return(i); } -return(smb_freemsghdr(smb,msg->idx.offset-smb->status.header_offset - ,msg->hdr.length)); -} - -/****************************************************************************/ -/* Finds unused space in header file based on block allocation table and */ -/* marks space as used in allocation table. */ -/* File must be opened read/write DENY ALL */ -/* Returns offset to beginning of header (in bytes, not blocks) */ -/* Assumes smb_open_ha() has been called */ -/* smb_close_ha() should be called after */ -/* Returns -1L on error */ -/****************************************************************************/ -long SMBCALL smb_allochdr(smb_t *smb, ulong length) -{ - uchar c; - ushort i; - ulong l,blocks,offset=0; - -blocks=smb_hdrblocks(length); -i=0; /* i is consecutive unused block counter */ -fflush(smb->sha_fp); -rewind(smb->sha_fp); -while(!feof(smb->sha_fp)) { - if(!fread(&c,1,1,smb->sha_fp)) - break; - offset+=SHD_BLOCK_LEN; - if(!c) i++; - else i=0; - if(i==blocks) { - offset-=(blocks*SHD_BLOCK_LEN); - break; } } -clearerr(smb->sha_fp); -fseek(smb->sha_fp,offset/SHD_BLOCK_LEN,SEEK_SET); -c=1; -for(l=0;l<blocks;l++) - if(!fwrite(&c,1,1,smb->sha_fp)) - return(-1L); -fflush(smb->sha_fp); -return(offset); -} - -/****************************************************************************/ -/* Allocates space for index, but doesn't search for unused blocks */ -/* Returns -1L on error */ -/****************************************************************************/ -long SMBCALL smb_fallochdr(smb_t *smb, ulong length) -{ - uchar c=1; - ulong l,blocks,offset; - -blocks=smb_hdrblocks(length); -fflush(smb->sha_fp); -clearerr(smb->sha_fp); -fseek(smb->sha_fp,0L,SEEK_END); -offset=ftell(smb->sha_fp)*SHD_BLOCK_LEN; -for(l=0;l<blocks;l++) - if(!fwrite(&c,1,1,smb->sha_fp)) - return(-1L); -fflush(smb->sha_fp); -return(offset); -} - -/************************************************************************/ -/* Allocate header blocks using Hyper Allocation */ -/* this function should be most likely not be called from anywhere but */ -/* smb_addmsghdr() */ -/************************************************************************/ -long SMBCALL smb_hallochdr(smb_t *smb) -{ - ulong l; - -fflush(smb->shd_fp); -fseek(smb->shd_fp,0L,SEEK_END); -l=ftell(smb->shd_fp); -if(l<smb->status.header_offset) /* Header file truncated?!? */ - return(smb->status.header_offset); -while((l-smb->status.header_offset)%SHD_BLOCK_LEN) /* Even block boundry */ - l++; -return(l-smb->status.header_offset); -} - -/************************************************************************/ -/* Allocate data blocks using Hyper Allocation */ -/* smb_locksmbhdr() should be called before this function and not */ -/* unlocked until all data fields for this message have been written */ -/* to the SDT file */ -/************************************************************************/ -long SMBCALL smb_hallocdat(smb_t *smb) -{ - long l; - -fflush(smb->sdt_fp); -fseek(smb->sdt_fp,0L,SEEK_END); -l=ftell(smb->sdt_fp); -if(l<=0) - return(l); -while(l%SDT_BLOCK_LEN) /* Make sure even block boundry */ - l++; -return(l); -} - - -int SMBCALL smb_feof(FILE *fp) -{ -return(feof(fp)); -} - -int SMBCALL smb_ferror(FILE *fp) -{ -return(ferror(fp)); -} - -int SMBCALL smb_fflush(FILE *fp) -{ -return(fflush(fp)); -} - -int SMBCALL smb_fgetc(FILE *fp) -{ -return(fgetc(fp)); -} - -int SMBCALL smb_fputc(int ch, FILE *fp) -{ -return(fputc(ch,fp)); -} - -int SMBCALL smb_fseek(FILE *fp, long offset, int whence) -{ -return(fseek(fp,offset,whence)); -} - -long SMBCALL smb_ftell(FILE *fp) -{ -return(ftell(fp)); -} - -long SMBCALL smb_fgetlength(FILE *fp) -{ -return(filelength(fileno(fp))); -} - -int SMBCALL smb_fsetlength(FILE *fp, long length) -{ -return(chsize(fileno(fp),length)); -} - -void SMBCALL smb_rewind(FILE *fp) -{ -rewind(fp); -} - -void SMBCALL smb_clearerr(FILE *fp) -{ -clearerr(fp); -} - -long SMBCALL smb_fread(void HUGE16 *buf, long bytes, FILE *fp) -{ -#ifdef __FLAT__ - return(fread(buf,1,bytes,fp)); -#else - long count; - -for(count=bytes;count>0x7fff;count-=0x7fff,(char*)buf+=0x7fff) - if(fread((char *)buf,1,0x7fff,fp)!=0x7fff) - return(bytes-count); -if(fread((char *)buf,1,(size_t)count,fp)!=(size_t)count) - return(bytes-count); -return(bytes); -#endif -} - -long SMBCALL smb_fwrite(void HUGE16 *buf, long bytes, FILE *fp) -{ -#ifdef __FLAT__ - return(fwrite(buf,1,bytes,fp)); -#else - long count; - -for(count=bytes;count>0x7fff;count-=0x7fff,(char*)buf+=0x7fff) - if(fwrite((char *)buf,1,0x7fff,fp)!=0x7fff) - return(bytes-count); -if(fwrite((char *)buf,1,(size_t)count,fp)!=(size_t)count) - return(bytes-count); -return(bytes); -#endif -} - -#ifdef SMB_GETMSGTXT - -char HUGE16 * SMBCALL smb_getmsgtxt(smb_t *smb, smbmsg_t *msg, ulong mode) -{ - char HUGE16 *buf=NULL,HUGE16 *lzhbuf,HUGE16 *p; - ushort xlat; - int i,lzh; - long l=0,lzhlen,length; - -for(i=0;i<msg->hdr.total_dfields;i++) { - if(!(msg->dfield[i].type==TEXT_BODY - || (mode&GETMSGTXT_TAILS && msg->dfield[i].type==TEXT_TAIL)) - || msg->dfield[i].length<=2L) - continue; - fseek(smb->sdt_fp,msg->hdr.offset+msg->dfield[i].offset - ,SEEK_SET); - fread(&xlat,2,1,smb->sdt_fp); - lzh=0; - if(xlat==XLAT_LZH) { - lzh=1; - fread(&xlat,2,1,smb->sdt_fp); } - if(xlat!=XLAT_NONE) /* no other translations currently supported */ - continue; - - length=msg->dfield[i].length-2L; - if(lzh) { - length-=2; - if(length<1) - continue; - if((lzhbuf=LMALLOC(length))==NULL) - return(buf); - smb_fread(lzhbuf,length,smb->sdt_fp); - lzhlen=*(long *)lzhbuf; - if((p=REALLOC(buf,l+lzhlen+3L))==NULL) { - FREE(lzhbuf); - return(buf); } - buf=p; - lzh_decode((char *)lzhbuf,length,(char *)buf+l); - FREE(lzhbuf); - l+=lzhlen; } - else { - if((p=REALLOC(buf,l+length+3L))==NULL) - return(buf); - buf=p; - p=buf+l; - l+=fread(p,1,length,smb->sdt_fp); - } - if(!l) - continue; - l--; - while(l && buf[l]==0) l--; - l++; - *(buf+l)=CR; - l++; - *(buf+l)=LF; - l++; - *(buf+l)=0; } -return(buf); -} - -void SMBCALL smb_freemsgtxt(char HUGE16 *buf) -{ -if(buf!=NULL) - FREE(buf); -} - -#endif - -/* End of SMBLIB.C */ diff --git a/src/sbbs2/smb/smblib.h b/src/sbbs2/smb/smblib.h deleted file mode 100644 index beab8210bb..0000000000 --- a/src/sbbs2/smb/smblib.h +++ /dev/null @@ -1,205 +0,0 @@ -/* SMBLIB.H */ - -/* Developed 1990-2000 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#ifndef _SMBLIB_H -#define _SMBLIB_H - -#include "lzh.h" - -#if defined(__WATCOMC__) || defined(__TURBOC__) || defined(_MSC_VER) -# include <io.h> -# include <share.h> -#endif - -#if defined(__WATCOMC__) || defined(__TURBOC__) -# include <mem.h> -#else -# include <memory.h> -#endif - -#if defined(__WATCOMC__) -# include <dos.h> -#elif defined(__TURBOC__) -# include <dir.h> -#endif - -#if defined(_WIN32) -# ifndef __FLAT__ -# define __FLAT__ -# endif -# define SMBCALL __stdcall /* VB Compatible */ -# if defined (EXPORT32) -# undef EXPORT32 -# endif -# if defined(SMBDLL) -# define EXPORT32 __declspec( dllexport ) -# else -# define EXPORT32 __declspec( dllimport ) -# endif -#elif defined(__FLAT__) -# if defined(SMBDLL) -# define SMBCALL _pascal -# define EXPORT32 _export -# else -# define SMBCALL -# define EXPORT32 -# endif -# -#else -# define SMBCALL -# define EXPORT32 -#endif - -#include <malloc.h> -#include <time.h> -#include <errno.h> -#include <fcntl.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/stat.h> -#include <sys/types.h> - -#include "smbdefs.h" - -#define SMB_STACK_LEN 4 /* Max msg bases in smb_stack() */ -#define SMB_STACK_POP 0 /* Pop a msg base off of smb_stack() */ -#define SMB_STACK_PUSH 1 /* Push a msg base onto smb_stack() */ -#define SMB_STACK_XCHNG 2 /* Exchange msg base w/last pushed */ - -#define GETMSGTXT_TAILS 1 /* Get message tail(s) too */ - -#ifdef __cplusplus -extern "C" { -#endif - -EXPORT32 int SMBCALL smb_ver(void); -EXPORT32 char * SMBCALL smb_lib_ver(void); -EXPORT32 int SMBCALL smb_open(smb_t *smb); -EXPORT32 void SMBCALL smb_close(smb_t *smb); -EXPORT32 int SMBCALL smb_open_da(smb_t *smb); -EXPORT32 void SMBCALL smb_close_da(smb_t *smb); -EXPORT32 int SMBCALL smb_open_ha(smb_t *smb); -EXPORT32 void SMBCALL smb_close_ha(smb_t *smb); -EXPORT32 int SMBCALL smb_create(smb_t *smb); -EXPORT32 int SMBCALL smb_stack(smb_t *smb, int op); -EXPORT32 int SMBCALL smb_trunchdr(smb_t *smb); -EXPORT32 int SMBCALL smb_locksmbhdr(smb_t *smb); -EXPORT32 int SMBCALL smb_getstatus(smb_t *smb); -EXPORT32 int SMBCALL smb_putstatus(smb_t *smb); -EXPORT32 int SMBCALL smb_unlocksmbhdr(smb_t *smb); -EXPORT32 int SMBCALL smb_getmsgidx(smb_t *smb, smbmsg_t *msg); -EXPORT32 int SMBCALL smb_getlastidx(smb_t *smb, idxrec_t *idx); -EXPORT32 uint SMBCALL smb_getmsghdrlen(smbmsg_t *msg); -EXPORT32 ulong SMBCALL smb_getmsgdatlen(smbmsg_t *msg); -EXPORT32 int SMBCALL smb_lockmsghdr(smb_t *smb, smbmsg_t *msg); -EXPORT32 int SMBCALL smb_getmsghdr(smb_t *smb, smbmsg_t *msg); -EXPORT32 int SMBCALL smb_unlockmsghdr(smb_t *smb, smbmsg_t *msg); -EXPORT32 int SMBCALL smb_addcrc(smb_t *smb, ulong crc); -EXPORT32 int SMBCALL smb_hfield(smbmsg_t *msg, ushort type, ushort length, void *data); -EXPORT32 int SMBCALL smb_dfield(smbmsg_t *msg, ushort type, ulong length); -EXPORT32 int SMBCALL smb_addmsghdr(smb_t *smb, smbmsg_t *msg,int storage); -EXPORT32 int SMBCALL smb_putmsg(smb_t *smb, smbmsg_t *msg); -EXPORT32 int SMBCALL smb_putmsgidx(smb_t *smb, smbmsg_t *msg); -EXPORT32 int SMBCALL smb_putmsghdr(smb_t *smb, smbmsg_t *msg); -EXPORT32 void SMBCALL smb_freemsgmem(smbmsg_t *msg); -EXPORT32 ulong SMBCALL smb_hdrblocks(ulong length); -EXPORT32 ulong SMBCALL smb_datblocks(ulong length); -EXPORT32 long SMBCALL smb_allochdr(smb_t *smb, ulong length); -EXPORT32 long SMBCALL smb_fallochdr(smb_t *smb, ulong length); -EXPORT32 long SMBCALL smb_hallochdr(smb_t *smb); -EXPORT32 long SMBCALL smb_allocdat(smb_t *smb, ulong length, ushort headers); -EXPORT32 long SMBCALL smb_fallocdat(smb_t *smb, ulong length, ushort headers); -EXPORT32 long SMBCALL smb_hallocdat(smb_t *smb); -EXPORT32 int SMBCALL smb_incdat(smb_t *smb, ulong offset, ulong length, ushort headers); -EXPORT32 int SMBCALL smb_freemsg(smb_t *smb, smbmsg_t *msg); -EXPORT32 int SMBCALL smb_freemsgdat(smb_t *smb, ulong offset, ulong length, ushort headers); -EXPORT32 int SMBCALL smb_freemsghdr(smb_t *smb, ulong offset, ulong length); -EXPORT32 void SMBCALL smb_freemsgtxt(char HUGE16 *buf); -EXPORT32 char HUGE16 * SMBCALL smb_getmsgtxt(smb_t *smb, smbmsg_t *msg, ulong mode); - -/* FILE pointer I/O functions */ - -EXPORT32 int SMBCALL smb_feof(FILE *fp); -EXPORT32 int SMBCALL smb_ferror(FILE *fp); -EXPORT32 int SMBCALL smb_fflush(FILE *fp); -EXPORT32 int SMBCALL smb_fgetc(FILE *fp); -EXPORT32 int SMBCALL smb_fputc(int ch, FILE *fp); -EXPORT32 int SMBCALL smb_fseek(FILE *fp, long offset, int whence); -EXPORT32 long SMBCALL smb_ftell(FILE *fp); -EXPORT32 long SMBCALL smb_fread(void HUGE16 *buf, long bytes, FILE *fp); -EXPORT32 long SMBCALL smb_fwrite(void HUGE16 *buf, long bytes, FILE *fp); -EXPORT32 long SMBCALL smb_fgetlength(FILE *fp); -EXPORT32 int SMBCALL smb_fsetlength(FILE *fp, long length); -EXPORT32 void SMBCALL smb_rewind(FILE *fp); -EXPORT32 void SMBCALL smb_clearerr(FILE *fp); - -#ifdef __cplusplus -} -#endif - -#ifdef __WATCOMC__ /* Use MSC standard (prepended underscore) */ -#pragma aux smb_ver "_*" -#pragma aux smb_lib_ver "_*" -#pragma aux smb_open "_*" -#pragma aux smb_close "_*" -#pragma aux smb_open_da "_*" -#pragma aux smb_close_da "_*" -#pragma aux smb_open_ha "_*" -#pragma aux smb_close_ha "_*" -#pragma aux smb_create "_*" -#pragma aux smb_stack "_*" -#pragma aux smb_trunchdr "_*" -#pragma aux smb_locksmbhdr "_*" -#pragma aux smb_getstatus "_*" -#pragma aux smb_putstatus "_*" -#pragma aux smb_unlocksmbhdr "_*" -#pragma aux smb_getmsgidx "_*" -#pragma aux smb_getlastidx "_*" -#pragma aux smb_getmsghdrlen "_*" -#pragma aux smb_getmsgdatlen "_*" -#pragma aux smb_lockmsghdr "_*" -#pragma aux smb_getmsghdr "_*" -#pragma aux smb_unlockmsghdr "_*" -#pragma aux smb_addcrc "_*" -#pragma aux smb_hfield "_*" -#pragma aux smb_dfield "_*" -#pragma aux smb_addmsghdr "_*" -#pragma aux smb_putmsg "_*" -#pragma aux smb_putmsgidx "_*" -#pragma aux smb_putmsghdr "_*" -#pragma aux smb_freemsgmem "_*" -#pragma aux smb_hdrblocks "_*" -#pragma aux smb_datblocks "_*" -#pragma aux smb_allochdr "_*" -#pragma aux smb_fallochdr "_*" -#pragma aux smb_hallochdr "_*" -#pragma aux smb_allocdat "_*" -#pragma aux smb_fallocdat "_*" -#pragma aux smb_hallocdat "_*" -#pragma aux smb_incdat "_*" -#pragma aux smb_freemsg "_*" -#pragma aux smb_freemsgdat "_*" -#pragma aux smb_freemsghdr "_*" -#pragma aux smb_getmsgtxt "_*" -#pragma aux smb_freemsgtxt "_*" -#pragma aux smb_feof "_*" -#pragma aux smb_ferror "_*" -#pragma aux smb_fflush "_*" -#pragma aux smb_fgetc "_*" -#pragma aux smb_fputc "_*" -#pragma aux smb_fseek "_*" -#pragma aux smb_ftell "_*" -#pragma aux smb_fread "_*" -#pragma aux smb_fwrite "_*" -#pragma aux smb_fgetlength "_*" -#pragma aux smb_fsetlength "_*" -#pragma aux smb_rewind "_*" -#pragma aux smb_clearerr "_*" -#pragma aux lzh_encode "_*" -#pragma aux lzh_decode "_*" -#endif /* Watcom */ - - -#endif /* Don't add anything after this #endif statement */ diff --git a/src/sbbs2/smb/smbutil/makeall.bat b/src/sbbs2/smb/smbutil/makeall.bat deleted file mode 100755 index e4036c9772..0000000000 --- a/src/sbbs2/smb/smbutil/makeall.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -wmake OS=DOS %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=DOS4G %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=OS2 %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=NT %1 %2 %3 %4 %5 -if errorlevel 1 goto end -:end - diff --git a/src/sbbs2/smb/smbutil/makefile b/src/sbbs2/smb/smbutil/makefile deleted file mode 100644 index 5877440fa5..0000000000 --- a/src/sbbs2/smb/smbutil/makefile +++ /dev/null @@ -1,73 +0,0 @@ -######################################################################### -# Makefile for SMBUTIL # -# For use with Watcom C # -# Tabstop=8 # -# # -# To use this makefile, you must create the following sub-directories: # -# DOS, OS2, and DOSX. # -# # -# *** IMPORTANT NOTE *** -# You must also copy the file \WATCOM\SRC\STARTUP\WILDARGV.C into the # -# current directory. # -######################################################################### - -# Macros - -!ifndef OS -OS = DOS -!endif - -!ifeq OS DOS -CC = *wcc -ml -!else -CC = *wcc386 -!endif - -LD = *wlink -MAIN = $(OS)\smbutil.exe -OBJS = $(OS)\smbutil.obj $(OS)\smblib.obj $(OS)\lzh.obj $(OS)\wildargv.obj -HEADERS = smbutil.h smblib.h smbdefs.h crc32.h lzh.h - -!ifeq OS DOS -CFLAGS = -I=\watcom\h;.. -bt=$(OS) -fo=$(OS)\ -DSMB_GETMSGTXT -!else -CFLAGS = -I=\watcom\h;.. -bt=$(OS) -fo=$(OS)\ -DSMB_GETMSGTXT -DLZH_DYNAMIC_BUF -!endif - -!ifeq OS NT -SYSTEM = NT -!endif -!ifeq OS DOS -SYSTEM = DOS -!endif -!ifeq OS OS2 -SYSTEM = OS2V2 -!endif -!ifeq OS DOS4G -SYSTEM = DOS4G -!endif - -LFLAGS = system $(SYSTEM) - - -# Implicit C Compile Rule -.obj: $(OS) -.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... - $(LD) $(LFLAGS) file { $(OBJS) } - -# All .obj modules -$(OS)\smbutil.obj:: $(HEADERS) - -$(OS)\smblib.obj: ..\smblib.c ..\smblib.h ..\smbdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) -DSMB_GETMSGTXT $(CFLAGS) $[@ - -$(OS)\lzh.obj: ..\lzh.c ..\lzh.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ diff --git a/src/sbbs2/smb/smbutil/makefile.bc b/src/sbbs2/smb/smbutil/makefile.bc deleted file mode 100644 index 993c75da1d..0000000000 --- a/src/sbbs2/smb/smbutil/makefile.bc +++ /dev/null @@ -1,57 +0,0 @@ -############################### -# Makefile for SMBUTIL # -# For use with Borland C++ # -# Tabstop=8 # -############################### - -# ATTN: To use this MAKEFILE, you must create a directory "l" off of the -# current directory to store the large model .OBJ files - -# Macros -OS = DOS -CC = bcc -LD = tlink -INCLUDE = \bc31\include;.. -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -N -C -m$(MODEL) -I$(INCLUDE) -DLZH_DYNAMIC_BUF -DSMB_GETMSGTXT -w-pro -LFLAGS = -n -c - -!ifdef __OS2__ -OS = OS2 -CC = c:\bcos2\bin\bcc -LD = c:\bcos2\bin\tlink -INCLUDE = c:\bcos2\include;.. -LIB = c:\bcos2\lib -MODEL = os2 -CFLAGS = -d -C -I$(INCLUDE) -DSMB_GETMSGTXT -w-pro -LFLAGS = -c -w-srf -!endif - -HEADERS = smbutil.h ..\smblib.h ..\smbdefs.h ..\crc32.h ..\lzh.h -MAIN = $(OS)\smbutil.exe -OBJS = $(OS)\smbutil.obj $(OS)\smblib.obj $(OS)\lzh.obj - - -# Implicit C Compile Rule -{.;..}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) $(LIB)\wildargs.obj -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) $(LIB)\wildargs.obj -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# All .obj modules -$(OS)\smbutil.obj: $(HEADERS) -$(OS)\smblib.obj: $(HEADERS) -$(OS)\lzh.obj: $(HEADERS) diff --git a/src/sbbs2/smb/smbutil/smbutil.c b/src/sbbs2/smb/smbutil/smbutil.c deleted file mode 100644 index 3a37a93914..0000000000 --- a/src/sbbs2/smb/smbutil/smbutil.c +++ /dev/null @@ -1,1428 +0,0 @@ -/* SMBUTIL.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Synchronet Message Base Utility */ - -#define SMBUTIL_VER "2.01" - -#include "smblib.h" -#include "smbutil.h" -#include "crc32.h" -#include "crc16.c" - -#ifdef __WATCOMC__ - #include <dos.h> -#endif - -/********************/ -/* Global variables */ -/********************/ - -smb_t smb; -ulong mode=0L; -ushort tzone=PST; -char filein[128]; -char attach[128]; - -/************************/ -/* Program usage/syntax */ -/************************/ - -char *usage= -"usage: smbutil [/opts] cmd <filespec.SHD>\n" -"\n" -"cmd:\n" -" l[n] = list msgs starting at number n\n" -" r[n] = read msgs starting at number n\n" -" v[n] = view msg headers starting at number n\n" -" i<f> = import msg from text file f\n" -" e<f> = import e-mail from text file f\n" -" n<f> = import netmail from text file f\n" -" s = display msg base status\n" -" c = change msg base status\n" -" m = maintain msg base - delete old msgs and msgs over max\n" -" p[k] = pack msg base (k specifies minimum packable Kbytes)\n" -"opts:\n" -" a = always pack msg base (disable compression analysis)\n" -" z[n] = set time zone (n=min +/- from UT or 'EST','EDT','CST',etc)\n" -; - -char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec"}; - - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(1); -return(0); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) -#ifdef __WATCOMC__ - return(f.size); -#else - return(f.ff_fsize); -#endif -return(-1L); -} - -void remove_re(char *str) -{ -while(!strnicmp(str,"RE:",3)) { - strcpy(str,str+3); - while(str[0]==SP) - strcpy(str,str+1); } -} - -/****************************************************************************/ -/* Adds a new message to the message base */ -/****************************************************************************/ -void postmsg(char type) -{ - char str[128],buf[SDT_BLOCK_LEN]; - ushort xlat,net; - int i,j,k,file; - long length; - ulong offset,crc=0xffffffffUL; - FILE *instream; - smbmsg_t msg; - -length=flength(filein); -if(length<1L) { - printf("Invalid file size for '%s'\n",filein); - exit(1); } -length+=2; /* for translation string */ -if(!(smb.status.attr&SMB_HYPERALLOC)) { - i=smb_open_da(&smb); - if(i) { - printf("smb_open_da returned %d\n",i); - exit(1); } - offset=smb_allocdat(&smb,length,1); - smb_close_da(&smb); } -else - offset=smb_hallocdat(&smb); - -if((file=open(filein,O_RDONLY|O_BINARY))==-1 - || (instream=fdopen(file,"rb"))==NULL) { - printf("Error opening %s for read\n",filein); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } -setvbuf(instream,NULL,_IOFBF,32*1024); -fseek(smb.sdt_fp,offset,SEEK_SET); -xlat=XLAT_NONE; -fwrite(&xlat,2,1,smb.sdt_fp); -k=SDT_BLOCK_LEN-2; -while(!feof(instream)) { - memset(buf,0,k); - j=fread(buf,1,k,instream); - if(smb.status.max_crcs) - for(i=0;i<j;i++) - crc=ucrc32(buf[i],crc); - fwrite(buf,k,1,smb.sdt_fp); - k=SDT_BLOCK_LEN; } -fflush(smb.sdt_fp); -fclose(instream); -crc=~crc; - -memset(&msg,0,sizeof(smbmsg_t)); -memcpy(msg.hdr.id,"SHD\x1a",4); -msg.hdr.version=SMB_VERSION; -msg.hdr.when_written.time=time(NULL); -msg.hdr.when_written.zone=tzone; -msg.hdr.when_imported=msg.hdr.when_written; - -if(smb.status.max_crcs) { - i=smb_addcrc(&smb,crc); - if(i) { - printf("smb_addcrc returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } } - -msg.hdr.offset=offset; - -printf("To User Name: "); -gets(str); -i=smb_hfield(&msg,RECIPIENT,strlen(str),str); -if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } -if(type=='E' || type=='N') - smb.status.attr|=SMB_EMAIL; -if(smb.status.attr&SMB_EMAIL) { - printf("To User Number (0=QWKnet or Internet): "); - gets(str); - i=smb_hfield(&msg,RECIPIENTEXT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - msg.idx.to=atoi(str); } -else { - strlwr(str); - msg.idx.to=crc16(str); } - -if(type=='N') { - printf("To Address: "); - gets(str); - if(*str) { - if(strchr(str,'.')) - net=NET_INTERNET; - else - net=NET_QWK; - i=smb_hfield(&msg,RECIPIENTNETTYPE,sizeof(net),&net); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - i=smb_hfield(&msg,RECIPIENTNETADDR,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } } } - -printf("From User Name: "); -gets(str); -i=smb_hfield(&msg,SENDER,strlen(str),str); -if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } -if(smb.status.attr&SMB_EMAIL) { - printf("From User Number: "); - gets(str); - i=smb_hfield(&msg,SENDEREXT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - msg.idx.from=atoi(str); } -else { - strlwr(str); - msg.idx.from=crc16(str); } - -printf("Subject: "); -gets(str); -i=smb_hfield(&msg,SUBJECT,strlen(str),str); -if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } -remove_re(str); -strlwr(str); -msg.idx.subj=crc16(str); - -i=smb_dfield(&msg,TEXT_BODY,length); -if(i) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - -i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC); - -if(i) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } -smb_freemsgmem(&msg); - -} - -/****************************************************************************/ -/* Shows the message base header */ -/****************************************************************************/ -void showstatus() -{ - int i; - -i=smb_locksmbhdr(&smb); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return; } -i=smb_getstatus(&smb); -smb_unlocksmbhdr(&smb); -if(i) { - printf("smb_getstatus returned %d\n",i); - return; } -printf("last_msg =%lu\n" - "total_msgs =%lu\n" - "header_offset =%lu\n" - "max_crcs =%lu\n" - "max_msgs =%lu\n" - "max_age =%u\n" - "attr =%04Xh\n" - ,smb.status.last_msg - ,smb.status.total_msgs - ,smb.status.header_offset - ,smb.status.max_crcs - ,smb.status.max_msgs - ,smb.status.max_age - ,smb.status.attr - ); -} - -/****************************************************************************/ -/* Configure message base header */ -/****************************************************************************/ -void config() -{ - char max_msgs[128],max_crcs[128],max_age[128],header_offset[128],attr[128]; - int i; - -i=smb_locksmbhdr(&smb); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return; } -i=smb_getstatus(&smb); -smb_unlocksmbhdr(&smb); -if(i) { - printf("smb_getstatus returned %d\n",i); - return; } -printf("Header offset =%-5lu New value (CR=No Change): " - ,smb.status.header_offset); -gets(header_offset); -printf("Max msgs =%-5lu New value (CR=No Change): " - ,smb.status.max_msgs); -gets(max_msgs); -printf("Max crcs =%-5lu New value (CR=No Change): " - ,smb.status.max_crcs); -gets(max_crcs); -printf("Max age =%-5u New value (CR=No Change): " - ,smb.status.max_age); -gets(max_age); -printf("Attributes =%-5u New value (CR=No Change): " - ,smb.status.attr); -gets(attr); -i=smb_locksmbhdr(&smb); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return; } -i=smb_getstatus(&smb); -if(i) { - printf("smb_getstatus returned %d\n",i); - smb_unlocksmbhdr(&smb); - return; } -if(isdigit(max_msgs[0])) - smb.status.max_msgs=atol(max_msgs); -if(isdigit(max_crcs[0])) - smb.status.max_crcs=atol(max_crcs); -if(isdigit(max_age[0])) - smb.status.max_age=atoi(max_age); -if(isdigit(header_offset[0])) - smb.status.header_offset=atol(header_offset); -if(isdigit(attr[0])) - smb.status.attr=atoi(attr); -i=smb_putstatus(&smb); -smb_unlocksmbhdr(&smb); -if(i) - printf("smb_putstatus returned %d\n",i); -} - -/****************************************************************************/ -/* Lists messages' to, from, and subject */ -/****************************************************************************/ -void listmsgs(ulong start, ulong count) -{ - int i; - ulong l=0; - smbmsg_t msg; - idxrec_t idxrec; - -if(!start) - start=1; -fseek(smb.sid_fp,(start-1L)*sizeof(idxrec_t),SEEK_SET); -while(l<count) { - if(!fread(&msg.idx,1,sizeof(idxrec_t),smb.sid_fp)) - break; - i=smb_lockmsghdr(&smb,&msg); - if(i) { - printf("smb_lockmsghdr returned %d\n",i); - break; } - i=smb_getmsghdr(&smb,&msg); - smb_unlockmsghdr(&smb,&msg); - if(i) { - printf("smb_getmsghdr returned %d\n",i); - break; } - printf("%4lu %-25.25s %-25.25s %.20s\n" - ,msg.hdr.number,msg.from,msg.to,msg.subj); - smb_freemsgmem(&msg); - l++; } -} - -/****************************************************************************/ -/* Returns an ASCII string for FidoNet address 'addr' */ -/****************************************************************************/ -char *faddrtoa(fidoaddr_t addr) -{ - static char str[25]; - char point[25]; - -sprintf(str,"%u:%u/%u",addr.zone,addr.net,addr.node); -if(addr.point) { - sprintf(point,".%u",addr.point); - strcat(str,point); } -return(str); -} - -char *binstr(uchar *buf, ushort length) -{ - static char str[128]; - char tmp[128]; - int i; - -str[0]=0; -for(i=0;i<length;i++) - if(buf[i] && (buf[i]<SP || buf[i]>=0x7f)) - break; -if(i==length) /* not binary */ - return(buf); -for(i=0;i<length;i++) { - sprintf(tmp,"%02X ",buf[i]); - strcat(str,tmp); } -return(str); -} - -/****************************************************************************/ -/* Generates a 24 character ASCII string that represents the time_t pointer */ -/* Used as a replacement for ctime() */ -/****************************************************************************/ -char *timestr(time_t *intime) -{ - static char str[256]; - char mer[3],hour; - struct tm *gm; - -printf("before localtime\n"); -gm=localtime(intime); -printf("after\n"); -if(gm==NULL) { - strcpy(str,"Invalid Time"); - return(str); } -if(gm->tm_hour>=12) { - if(gm->tm_hour==12) - hour=12; - else - hour=gm->tm_hour-12; - strcpy(mer,"pm"); } -else { - if(gm->tm_hour==0) - hour=12; - else - hour=gm->tm_hour; - strcpy(mer,"am"); } -sprintf(str,"%s %s %02d %4d %02d:%02d %s" - ,wday[gm->tm_wday],mon[gm->tm_mon],gm->tm_mday,1900+gm->tm_year - ,hour,gm->tm_min,mer); -return(str); -} - - -/****************************************************************************/ -/* Converts when_t.zone into ASCII format */ -/****************************************************************************/ -char *zonestr(short zone) -{ - static char str[32]; - -switch((ushort)zone) { - case 0: return("UT"); - case AST: return("AST"); - case EST: return("EST"); - case CST: return("CST"); - case MST: return("MST"); - case PST: return("PST"); - case YST: return("YST"); - case HST: return("HST"); - case BST: return("BST"); - case ADT: return("ADT"); - case EDT: return("EDT"); - case CDT: return("CDT"); - case MDT: return("MDT"); - case PDT: return("PDT"); - case YDT: return("YDT"); - case HDT: return("HDT"); - case BDT: return("BDT"); - case MID: return("MID"); - case VAN: return("VAN"); - case EDM: return("EDM"); - case WIN: return("WIN"); - case BOG: return("BOG"); - case CAR: return("CAR"); - case RIO: return("RIO"); - case FER: return("FER"); - case AZO: return("AZO"); - case LON: return("LON"); - case BER: return("BER"); - case ATH: return("ATH"); - case MOS: return("MOS"); - case DUB: return("DUB"); - case KAB: return("KAB"); - case KAR: return("KAR"); - case BOM: return("BOM"); - case KAT: return("KAT"); - case DHA: return("DHA"); - case BAN: return("BAN"); - case HON: return("HON"); - case TOK: return("TOK"); - case SYD: return("SYD"); - case NOU: return("NOU"); - case WEL: return("WEL"); - } - -sprintf(str,"%02d:%02u",zone/60,zone<0 ? (-zone)%60 : zone%60); -return(str); -} - - -/****************************************************************************/ -/* Displays message header information */ -/****************************************************************************/ -void viewmsgs(ulong start, ulong count) -{ - char when_written[128] - ,when_imported[128]; - int i; - ulong l=0; - smbmsg_t msg; - idxrec_t idxrec; - -if(!start) - start=1; -fseek(smb.sid_fp,(start-1L)*sizeof(idxrec_t),SEEK_SET); -while(l<count) { - if(!fread(&msg.idx,1,sizeof(idxrec_t),smb.sid_fp)) - break; - i=smb_lockmsghdr(&smb,&msg); - if(i) { - printf("smb_lockmsghdr returned %d\n",i); - break; } - i=smb_getmsghdr(&smb,&msg); - smb_unlockmsghdr(&smb,&msg); - if(i) { - printf("smb_getmsghdr returned %d\n",i); - break; } - - sprintf(when_written,"%.24s %s" - ,timestr((time_t *)msg.hdr.when_written.time) - ,zonestr(msg.hdr.when_written.zone)); - sprintf(when_imported,"%.24s %s" - ,timestr((time_t *)msg.hdr.when_imported.time) - ,zonestr(msg.hdr.when_imported.zone)); - - printf( "%-20.20s %s\n" - "%-20.20s %s\n" - "%-20.20s %s\n" - "%-20.20s %04Xh\n" - "%-20.20s %04Xh\n" - "%-20.20s %u\n" - "%-20.20s %04Xh\n" - "%-20.20s %08lXh\n" - "%-20.20s %08lXh\n" - "%-20.20s %s\n" - "%-20.20s %s\n" - "%-20.20s %ld (%ld)\n" - "%-20.20s %ld\n" - "%-20.20s %ld\n" - "%-20.20s %ld\n" - "%-20.20s %s\n" - "%-20.20s %06lXh\n" - "%-20.20s %u\n", - - "subj", - msg.subj, - - "from", - msg.from, - - "to", - msg.to, - - "type", - msg.hdr.type, - - "version", - msg.hdr.version, - - "length", - msg.hdr.length, - - "attr", - msg.hdr.attr, - - "auxattr", - msg.hdr.auxattr, - - "netattr", - msg.hdr.netattr, - - "when_written", - when_written, - - "when_imported", - when_imported, - - "number", - msg.hdr.number, - ftell(smb.sid_fp)/sizeof(idxrec_t), - - "thread_orig", - msg.hdr.thread_orig, - - "thread_next", - msg.hdr.thread_next, - - "thread_first", - msg.hdr.thread_first, - - "reserved[16]", - binstr(msg.hdr.reserved,16), - - "offset", - msg.hdr.offset, - - "total_dfields", - msg.hdr.total_dfields - ); - for(i=0;i<msg.hdr.total_dfields;i++) - printf("dfield[%02u].type %02Xh\n" - "dfield[%02u].offset %lu\n" - "dfield[%02u].length %lu\n" - ,i,msg.dfield[i].type - ,i,msg.dfield[i].offset - ,i,msg.dfield[i].length); - - for(i=0;i<msg.total_hfields;i++) - printf("hfield[%02u].type %02Xh\n" - "hfield[%02u].length %d\n" - "hfield[%02u]_dat %s\n" - ,i,msg.hfield[i].type - ,i,msg.hfield[i].length - ,i,binstr(msg.hfield_dat[i],msg.hfield[i].length)); - - if(msg.from_net.type) - printf("from_net.type %02Xh\n" - "from_net.addr %s\n" - ,msg.from_net.type - ,msg.from_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.from_net.addr) : msg.from_net.addr); - - if(msg.to_net.type) - printf("to_net.type %02Xh\n" - "to_net.addr %s\n" - ,msg.to_net.type - ,msg.to_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.to_net.addr) : msg.to_net.addr); - - if(msg.replyto_net.type) - printf("replyto_net.type %02Xh\n" - "replyto_net.addr %s\n" - ,msg.replyto_net.type - ,msg.replyto_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.replyto_net.addr) - : msg.replyto_net.addr); - - printf("from_agent %02Xh\n" - "to_agent %02Xh\n" - "replyto_agent %02Xh\n" - ,msg.from_agent - ,msg.to_agent - ,msg.replyto_agent); - - printf("\n"); - smb_freemsgmem(&msg); - l++; } -} - -/****************************************************************************/ -/* Maintain message base - deletes messages older than max age (in days) */ -/* or messages that exceed maximum */ -/****************************************************************************/ -void maint(void) -{ - int i; - ulong l,m,n,f,flagged=0; - time_t now; - smbmsg_t msg; - idxrec_t HUGE16 *idx; - -printf("Maintaining %s\r\n",smb.file); -now=time(NULL); -i=smb_locksmbhdr(&smb); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return; } -i=smb_getstatus(&smb); -if(i) { - smb_unlocksmbhdr(&smb); - printf("smb_getstatus returned %d\n",i); - return; } -if(!smb.status.total_msgs) { - smb_unlocksmbhdr(&smb); - printf("Empty\n"); - return; } -printf("Loading index...\n"); -if((idx=(idxrec_t *)LMALLOC(sizeof(idxrec_t)*smb.status.total_msgs)) - ==NULL) { - smb_unlocksmbhdr(&smb); - printf("can't allocate %lu bytes of memory\n" - ,sizeof(idxrec_t)*smb.status.total_msgs); - return; } -fseek(smb.sid_fp,0L,SEEK_SET); -for(l=0;l<smb.status.total_msgs;l++) { - printf("%lu of %lu\r" - ,l+1,smb.status.total_msgs); - if(!fread(&idx[l],1,sizeof(idxrec_t),smb.sid_fp)) - break; } -printf("\nDone.\n\n"); - -printf("Scanning for pre-flagged messages...\n"); -for(m=0;m<l;m++) { - printf("\r%2u%%",m ? (long)(100.0/((float)l/m)) : 0); - if(idx[m].attr&MSG_DELETE) - flagged++; } -printf("\r100%% (%lu pre-flagged for deletion)\n",flagged); - -if(smb.status.max_age) { - printf("Scanning for messages more than %u days old...\n" - ,smb.status.max_age); - for(m=f=0;m<l;m++) { - printf("\r%2u%%",m ? (long)(100.0/((float)l/m)) : 0); - if(idx[m].attr&(MSG_PERMANENT|MSG_DELETE)) - continue; - if(now>idx[m].time && (now-idx[m].time)/(24L*60L*60L) - >smb.status.max_age) { - f++; - flagged++; - idx[m].attr|=MSG_DELETE; } } /* mark for deletion */ - printf("\r100%% (%lu flagged for deletion)\n",f); } - -printf("Scanning for read messages to be killed...\n"); -for(m=f=0;m<l;m++) { - printf("\r%2u%%",m ? (long)(100.0/((float)l/m)) : 0); - if(idx[m].attr&(MSG_PERMANENT|MSG_DELETE)) - continue; - if((idx[m].attr&(MSG_READ|MSG_KILLREAD))==(MSG_READ|MSG_KILLREAD)) { - f++; - flagged++; - idx[m].attr|=MSG_DELETE; } } -printf("\r100%% (%lu flagged for deletion)\n",f); - -if(l-flagged>smb.status.max_msgs) { - printf("Flagging excess messages for deletion...\n"); - for(m=n=0,f=flagged;l-flagged>smb.status.max_msgs && m<l;m++) { - if(idx[m].attr&(MSG_PERMANENT|MSG_DELETE)) - continue; - printf("%lu of %lu\r",++n,(l-f)-smb.status.max_msgs); - flagged++; - idx[m].attr|=MSG_DELETE; } /* mark for deletion */ - printf("\nDone.\n\n"); } - -if(!flagged) { /* No messages to delete */ - LFREE(idx); - smb_unlocksmbhdr(&smb); - return; } - -if(!(mode&NOANALYSIS)) { - - printf("Freeing allocated header and data blocks for deleted messages...\n"); - if(!(smb.status.attr&SMB_HYPERALLOC)) { - i=smb_open_da(&smb); - if(i) { - smb_unlocksmbhdr(&smb); - printf("smb_open_da returned %d\n",i); - exit(1); } - i=smb_open_ha(&smb); - if(i) { - smb_unlocksmbhdr(&smb); - printf("smb_open_ha returned %d\n",i); - exit(1); } } - - for(m=n=0;m<l;m++) { - if(idx[m].attr&MSG_DELETE) { - printf("%lu of %lu\r",++n,flagged); - msg.idx=idx[m]; - msg.hdr.number=msg.idx.number; - if((i=smb_getmsgidx(&smb,&msg))!=0) { - printf("\nsmb_getmsgidx returned %d\n",i); - continue; } - i=smb_lockmsghdr(&smb,&msg); - if(i) { - printf("\nsmb_lockmsghdr returned %d\n",i); - break; } - if((i=smb_getmsghdr(&smb,&msg))!=0) { - smb_unlockmsghdr(&smb,&msg); - printf("\nsmb_getmsghdr returned %d\n",i); - break; } - msg.hdr.attr|=MSG_DELETE; /* mark header as deleted */ - if((i=smb_putmsg(&smb,&msg))!=0) { - smb_freemsgmem(&msg); - smb_unlockmsghdr(&smb,&msg); - printf("\nsmb_putmsg returned %d\n",i); - break; } - smb_unlockmsghdr(&smb,&msg); - if((i=smb_freemsg(&smb,&msg))!=0) { - smb_freemsgmem(&msg); - printf("\nsmb_freemsg returned %d\n",i); - break; } - smb_freemsgmem(&msg); } } - if(!(smb.status.attr&SMB_HYPERALLOC)) { - smb_close_ha(&smb); - smb_close_da(&smb); } - printf("\nDone.\n\n"); } - -printf("Re-writing index...\n"); -rewind(smb.sid_fp); -if(chsize(fileno(smb.sid_fp),0L)) - printf("chsize failed!\n"); -for(m=n=0;m<l;m++) { - if(idx[m].attr&MSG_DELETE) - continue; - printf("%lu of %lu\r",++n,l-flagged); - fwrite(&idx[m],sizeof(idxrec_t),1,smb.sid_fp); } -printf("\nDone.\n\n"); -fflush(smb.sid_fp); - -LFREE(idx); -smb.status.total_msgs-=flagged; -smb_putstatus(&smb); -smb_unlocksmbhdr(&smb); -} - - -typedef struct { - ulong old,new; - } datoffset_t; - -/****************************************************************************/ -/* Removes all unused blocks from SDT and SHD files */ -/****************************************************************************/ -void packmsgs(ulong packable) -{ - uchar str[128],buf[SDT_BLOCK_LEN],ch,fname[128],tmpfname[128]; - int i,file,size; - ulong l,m,n,datoffsets=0,length,total,now; - FILE *tmp_sdt,*tmp_shd,*tmp_sid; - smbhdr_t hdr; - smbmsg_t msg; - datoffset_t *datoffset=NULL; - -now=time(NULL); -printf("Packing %s\n",smb.file); -i=smb_locksmbhdr(&smb); -if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return; } -i=smb_getstatus(&smb); -if(i) { - smb_unlocksmbhdr(&smb); - printf("smb_getstatus returned %d\n",i); - return; } - -if(!(smb.status.attr&SMB_HYPERALLOC)) { - i=smb_open_ha(&smb); - if(i) { - smb_unlocksmbhdr(&smb); - printf("smb_open_ha returned %d\n",i); - return; } - i=smb_open_da(&smb); - if(i) { - smb_unlocksmbhdr(&smb); - smb_close_ha(&smb); - printf("smb_open_da returned %d\n",i); - return; } } - -if(!smb.status.total_msgs) { - printf("Empty\n"); - rewind(smb.shd_fp); - chsize(fileno(smb.shd_fp),smb.status.header_offset); - rewind(smb.sdt_fp); - chsize(fileno(smb.sdt_fp),0L); - rewind(smb.sid_fp); - chsize(fileno(smb.sid_fp),0L); - if(!(smb.status.attr&SMB_HYPERALLOC)) { - rewind(smb.sha_fp); - chsize(fileno(smb.sha_fp),0L); - rewind(smb.sda_fp); - chsize(fileno(smb.sda_fp),0L); - smb_close_ha(&smb); - smb_close_da(&smb); } - smb_unlocksmbhdr(&smb); - return; } - - -if(!(smb.status.attr&SMB_HYPERALLOC) && !(mode&NOANALYSIS)) { - printf("Analyzing data blocks...\n"); - - length=filelength(fileno(smb.sda_fp)); - - fseek(smb.sda_fp,0L,SEEK_SET); - for(l=m=0;l<length;l+=2) { - printf("\r%2u%% ",l ? (long)(100.0/((float)length/l)) : 0); - i=0; - if(!fread(&i,2,1,smb.sda_fp)) - break; - if(!i) - m++; } - - printf("\rAnalyzing header blocks...\n"); - - length=filelength(fileno(smb.sha_fp)); - - fseek(smb.sha_fp,0L,SEEK_SET); - for(l=n=0;l<length;l++) { - printf("\r%2u%% ",l ? (long)(100.0/((float)length/l)) : 0); - ch=0; - if(!fread(&ch,1,1,smb.sha_fp)) - break; - if(!ch) - n++; } - - if(!m && !n) { - printf("\rAlready compressed.\n\n"); - smb_close_ha(&smb); - smb_close_da(&smb); - smb_unlocksmbhdr(&smb); - return; } - - if(packable && (m*SDT_BLOCK_LEN)+(n*SHD_BLOCK_LEN)<packable*1024L) { - printf("\rLess than %luk compressable bytes.\n\n",packable); - smb_close_ha(&smb); - smb_close_da(&smb); - smb_unlocksmbhdr(&smb); - return; } - - printf("\rCompressing %lu data blocks (%lu bytes)\n" - " and %lu header blocks (%lu bytes)\n" - ,m,m*SDT_BLOCK_LEN,n,n*SHD_BLOCK_LEN); } - -if(!(smb.status.attr&SMB_HYPERALLOC)) { - rewind(smb.sha_fp); - chsize(fileno(smb.sha_fp),0L); /* Reset both allocation tables */ - rewind(smb.sda_fp); - chsize(fileno(smb.sda_fp),0L); } - -if(smb.status.attr&SMB_HYPERALLOC && !(mode&NOANALYSIS)) { - printf("Analyzing %s\n",smb.file); - - length=filelength(fileno(smb.shd_fp)); - m=n=0; - for(l=smb.status.header_offset;l<length;l+=size) { - printf("\r%2u%% ",(long)(100.0/((float)length/l))); - msg.idx.offset=l; - if((i=smb_lockmsghdr(&smb,&msg))!=0) { - printf("\n(%06lX) smb_lockmsghdr returned %d\n",l,i); - size=SHD_BLOCK_LEN; - continue; } - if((i=smb_getmsghdr(&smb,&msg))!=0) { - smb_unlockmsghdr(&smb,&msg); - m++; - size=SHD_BLOCK_LEN; - continue; } - smb_unlockmsghdr(&smb,&msg); - if(msg.hdr.attr&MSG_DELETE) { - m+=smb_hdrblocks(msg.hdr.length); - total=0; - for(i=0;i<msg.hdr.total_dfields;i++) - total+=msg.dfield[i].length; - n+=smb_datblocks(total); } - size=smb_getmsghdrlen(&msg); - if(size<1) size=SHD_BLOCK_LEN; - while(size%SHD_BLOCK_LEN) - size++; - smb_freemsgmem(&msg); } - - - if(!m && !n) { - printf("\rAlready compressed.\n\n"); - smb_unlocksmbhdr(&smb); - return; } - - if(packable && (n*SDT_BLOCK_LEN)+(m*SHD_BLOCK_LEN)<packable*1024L) { - printf("\rLess than %luk compressable bytes.\n\n",packable); - smb_unlocksmbhdr(&smb); - return; } - - printf("\rCompressing %lu data blocks (%lu bytes)\n" - " and %lu header blocks (%lu bytes)\n" - ,n,n*SDT_BLOCK_LEN,m,m*SHD_BLOCK_LEN); } - -sprintf(fname,"%s.SD$",smb.file); -tmp_sdt=fopen(fname,"wb"); -sprintf(fname,"%s.SH$",smb.file); -tmp_shd=fopen(fname,"wb"); -sprintf(fname,"%s.SI$",smb.file); -tmp_sid=fopen(fname,"wb"); -if(!tmp_sdt || !tmp_shd || !tmp_sid) { - smb_unlocksmbhdr(&smb); - if(!(smb.status.attr&SMB_HYPERALLOC)) { - smb_close_ha(&smb); - smb_close_da(&smb); } - printf("error opening temp file\n"); - return; } -setvbuf(tmp_sdt,NULL,_IOFBF,2*1024); -setvbuf(tmp_shd,NULL,_IOFBF,2*1024); -setvbuf(tmp_sid,NULL,_IOFBF,2*1024); -if(!(smb.status.attr&SMB_HYPERALLOC) - && (datoffset=(datoffset_t *)LMALLOC(sizeof(datoffset_t)*smb.status.total_msgs)) - ==NULL) { - smb_unlocksmbhdr(&smb); - smb_close_ha(&smb); - smb_close_da(&smb); - fclose(tmp_sdt); - fclose(tmp_shd); - fclose(tmp_sid); - printf("error allocating mem\n"); - return; } -fseek(smb.shd_fp,0L,SEEK_SET); -fread(&hdr,1,sizeof(smbhdr_t),smb.shd_fp); -fwrite(&hdr,1,sizeof(smbhdr_t),tmp_shd); -fwrite(&(smb.status),1,sizeof(smbstatus_t),tmp_shd); -for(l=sizeof(smbhdr_t)+sizeof(smbstatus_t);l<smb.status.header_offset;l++) { - fread(&ch,1,1,smb.shd_fp); /* copy additional base header records */ - fwrite(&ch,1,1,tmp_shd); } -fseek(smb.sid_fp,0L,SEEK_SET); -total=0; -for(l=0;l<smb.status.total_msgs;l++) { - printf("%lu of %lu\r",l+1,smb.status.total_msgs); - if(!fread(&msg.idx,1,sizeof(idxrec_t),smb.sid_fp)) - break; - if(msg.idx.attr&MSG_DELETE) { - printf("\nDeleted index.\n"); - continue; } - i=smb_lockmsghdr(&smb,&msg); - if(i) { - printf("\nsmb_lockmsghdr returned %d\n",i); - continue; } - i=smb_getmsghdr(&smb,&msg); - smb_unlockmsghdr(&smb,&msg); - if(i) { - printf("\nsmb_getmsghdr returned %d\n",i); - continue; } - if(msg.hdr.attr&MSG_DELETE) { - printf("\nDeleted header.\n"); - smb_freemsgmem(&msg); - continue; } - if(msg.expiration.time && msg.expiration.time<=now) { - printf("\nExpired message.\n"); - smb_freemsgmem(&msg); - continue; } - for(m=0;m<datoffsets;m++) - if(msg.hdr.offset==datoffset[m].old) - break; - if(m<datoffsets) { /* another index pointed to this data */ - printf("duplicate index\n"); - msg.hdr.offset=datoffset[m].new; - smb_incdat(&smb,datoffset[m].new,smb_getmsgdatlen(&msg),1); } - else { - - if(!(smb.status.attr&SMB_HYPERALLOC)) - datoffset[datoffsets].old=msg.hdr.offset; - - fseek(smb.sdt_fp,msg.hdr.offset,SEEK_SET); - - m=smb_getmsgdatlen(&msg); - if(m>16L*1024L*1024L) { - printf("\nInvalid data length (%lu)\n",m); - continue; } - - if(!(smb.status.attr&SMB_HYPERALLOC)) { - datoffset[datoffsets].new=msg.hdr.offset - =smb_fallocdat(&smb,m,1); - datoffsets++; - fseek(tmp_sdt,msg.hdr.offset,SEEK_SET); } - else { - fseek(tmp_sdt,0L,SEEK_END); - msg.hdr.offset=ftell(tmp_sdt); } - - /* Actually copy the data */ - - n=smb_datblocks(m); - for(m=0;m<n;m++) { - fread(buf,1,SDT_BLOCK_LEN,smb.sdt_fp); - if(!m && *(ushort *)buf!=XLAT_NONE && *(ushort *)buf!=XLAT_LZH) { - printf("\nUnsupported translation type (%04X)\n" - ,*(ushort *)buf); - break; } - fwrite(buf,1,SDT_BLOCK_LEN,tmp_sdt); } - if(m<n) - continue; } - - /* Write the new index entry */ - length=smb_getmsghdrlen(&msg); - if(smb.status.attr&SMB_HYPERALLOC) - msg.idx.offset=ftell(tmp_shd); - else - msg.idx.offset=smb_fallochdr(&smb,length)+smb.status.header_offset; - msg.idx.number=msg.hdr.number; - msg.idx.attr=msg.hdr.attr; - msg.idx.time=msg.hdr.when_imported.time; - sprintf(str,"%.128s",msg.subj); - strlwr(str); - remove_re(str); - msg.idx.subj=crc16(str); - if(smb.status.attr&SMB_EMAIL) { - if(msg.to_ext) - msg.idx.to=atoi(msg.to_ext); - else - msg.idx.to=0; - if(msg.from_ext) - msg.idx.from=atoi(msg.from_ext); - else - msg.idx.from=0; } - else { - sprintf(str,"%.128s",msg.to); - strlwr(str); - msg.idx.to=crc16(str); - sprintf(str,"%.128s",msg.from); - strlwr(str); - msg.idx.from=crc16(str); } - fwrite(&msg.idx,1,sizeof(idxrec_t),tmp_sid); - - /* Write the new header entry */ - fseek(tmp_shd,msg.idx.offset,SEEK_SET); - fwrite(&msg.hdr,1,sizeof(msghdr_t),tmp_shd); - for(n=0;n<msg.hdr.total_dfields;n++) - fwrite(&msg.dfield[n],1,sizeof(dfield_t),tmp_shd); - for(n=0;n<msg.total_hfields;n++) { - fwrite(&msg.hfield[n],1,sizeof(hfield_t),tmp_shd); - fwrite(msg.hfield_dat[n],1,msg.hfield[n].length,tmp_shd); } - while(length%SHD_BLOCK_LEN) { /* pad with NULLs */ - fputc(0,tmp_shd); - length++; } - total++; - smb_freemsgmem(&msg); } - -if(datoffset) - LFREE(datoffset); -if(!(smb.status.attr&SMB_HYPERALLOC)) { - smb_close_ha(&smb); - smb_close_da(&smb); } - -/* Change *.SH$ into *.SHD */ -fclose(smb.shd_fp); -fclose(tmp_shd); -sprintf(fname,"%s.SHD",smb.file); -remove(fname); -sprintf(tmpfname,"%s.SH$",smb.file); -rename(tmpfname,fname); - -/* Change *.SD$ into *.SDT */ -fclose(smb.sdt_fp); -fclose(tmp_sdt); -sprintf(fname,"%s.SDT",smb.file); -remove(fname); -sprintf(tmpfname,"%s.SD$",smb.file); -rename(tmpfname,fname); - -/* Change *.SI$ into *.SID */ -fclose(smb.sid_fp); -fclose(tmp_sid); -sprintf(fname,"%s.SID",smb.file); -remove(fname); -sprintf(tmpfname,"%s.SI$",smb.file); -rename(tmpfname,fname); - -if((i=smb_open(&smb))!=0) { - printf("Error %d reopening %s\n",i,smb.file); - return; } - -smb.status.total_msgs=total; -if((i=smb_putstatus(&smb))!=0) - printf("\nsmb_putstatus returned %d\n",i); -printf("\nDone.\n\n"); -} - - -/****************************************************************************/ -/* Read messages in message base */ -/****************************************************************************/ -void readmsgs(ulong start) -{ - char str[128],HUGE16 *inbuf,*outbuf; - int i,ch,done=0,domsg=1,lzh; - ushort xlat; - ulong l,count,outlen; - smbmsg_t msg; - -if(start) - msg.offset=start-1; -else - msg.offset=0; -while(!done) { - if(domsg) { - fseek(smb.sid_fp,msg.offset*sizeof(idxrec_t),SEEK_SET); - if(!fread(&msg.idx,1,sizeof(idxrec_t),smb.sid_fp)) - break; - i=smb_lockmsghdr(&smb,&msg); - if(i) { - printf("smb_lockmsghdr returned %d\n",i); - break; } - i=smb_getmsghdr(&smb,&msg); - if(i) { - printf("smb_getmsghdr returned %d\n",i); - break; } - - printf("\n%lu (%lu)\n",msg.hdr.number,msg.offset+1); - printf("Subj : %s\n",msg.subj); - printf("To : %s",msg.to); - if(msg.to_net.type) - printf(" (%s)",msg.to_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.to_net.addr) : msg.to_net.addr); - printf("\nFrom : %s",msg.from); - if(msg.from_net.type) - printf(" (%s)",msg.from_net.type==NET_FIDO - ? faddrtoa(*(fidoaddr_t *)msg.from_net.addr) - : msg.from_net.addr); -#if 1 - printf("\nDate : %.24s %s" - ,timestr((time_t *)msg.hdr.when_written.time) - ,zonestr(msg.hdr.when_written.zone)); -#endif - printf("\n\n"); -#if 0 - for(i=0;i<msg.hdr.total_dfields;i++) - switch(msg.dfield[i].type) { - case TEXT_BODY: - case TEXT_TAIL: - fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset - ,SEEK_SET); - fread(&xlat,2,1,smb.sdt_fp); - l=2; - lzh=0; - while(xlat!=XLAT_NONE) { - if(xlat==XLAT_LZH) - lzh=1; - fread(&xlat,2,1,smb.sdt_fp); - l+=2; } - if(lzh) { - if((inbuf=(char *)LMALLOC(msg.dfield[i].length)) - ==NULL) { - printf("Malloc error of %lu\n" - ,msg.dfield[i].length); - exit(1); } - fread(inbuf,msg.dfield[i].length-l,1,smb.sdt_fp); - outlen=*(long *)inbuf; - if((outbuf=(char *)LMALLOC(outlen))==NULL) { - printf("Malloc error of lzh %lu\n" - ,outlen); - exit(1); } - lzh_decode(inbuf,msg.dfield[i].length-l,outbuf); - LFREE(inbuf); - for(l=0;l<outlen;l++) - putchar(outbuf[l]); - LFREE(outbuf); } - else { - for(;l<msg.dfield[i].length;l++) { - ch=fgetc(smb.sdt_fp); - if(ch) - putchar(ch); } } - printf("\n"); - break; } -#else - if((inbuf=smb_getmsgtxt(&smb,&msg,GETMSGTXT_TAILS))!=NULL) { - printf("%s",inbuf); - FREE(inbuf); } -#endif - i=smb_unlockmsghdr(&smb,&msg); - if(i) { - printf("smb_unlockmsghdr returned %d\n",i); - break; } - smb_freemsgmem(&msg); } - domsg=1; - printf("\nReading %s (?=Menu): ",smb.file); - switch(toupper(getch())) { - case '?': - printf("\n" - "\n" - "(R)e-read current message\n" - "(L)ist messages\n" - "(T)en more titles\n" - "(V)iew message headers\n" - "(Q)uit\n" - "(+/-) Forward/Backward\n" - "\n"); - domsg=0; - break; - case 'Q': - printf("Quit\n"); - done=1; - break; - case 'R': - printf("Re-read\n"); - break; - case '-': - printf("Backwards\n"); - if(msg.offset) - msg.offset--; - break; - case 'T': - printf("Ten titles\n"); - listmsgs(msg.offset+2,10); - msg.offset+=10; - domsg=0; - break; - case 'L': - printf("List messages\n"); - listmsgs(1,-1); - domsg=0; - break; - case 'V': - printf("View message headers\n"); - viewmsgs(1,-1); - domsg=0; - break; - case CR: - case '+': - printf("Next\n"); - msg.offset++; - break; } } -} - -/***************/ -/* Entry point */ -/***************/ -int main(int argc, char **argv) -{ - char cmd[128]="",*p,*s; - int i,j,x,y; - ulong l; - -#ifdef __TURBOC__ - timezone=0; /* Fix for Borland C++ EST default */ - daylight=0; /* Fix for Borland C++ EDT default */ -#elif defined(__WATCOMC__) - putenv("TZ=UCT0"); /* Fix for Watcom C++ EDT default */ -#endif -setvbuf(stdout,0,_IONBF,0); - -smb.file[0]=0; -printf("\nSMBUTIL Version %s (%s) SMBLIB %s � Synchronet Message Base "\ - "Utility\n\n" - ,SMBUTIL_VER -#if defined(__OS2__) - ,"OS/2" -#elif defined(__NT__) - ,"Win32" -#elif defined(__DOS4G__) - ,"DOS4G" -#elif defined(__FLAT__) - ,"DOS32" -#else - ,"DOS16" -#endif - ,SMBLIB_VERSION - ); -for(x=1;x<argc;x++) { - if(argv[x][0]=='/') { - for(j=1;argv[x][j];j++) - switch(toupper(argv[x][j])) { - case 'A': - mode|=NOANALYSIS; - break; - case 'Z': - if(isdigit(argv[x][j+1])) - tzone=atoi(argv[x]+j+1); - else if(!stricmp(argv[x]+j+1,"EST")) - tzone=EST; - else if(!stricmp(argv[x]+j+1,"EDT")) - tzone=EDT; - else if(!stricmp(argv[x]+j+1,"CST")) - tzone=CST; - else if(!stricmp(argv[x]+j+1,"CDT")) - tzone=CDT; - else if(!stricmp(argv[x]+j+1,"MST")) - tzone=MST; - else if(!stricmp(argv[x]+j+1,"MDT")) - tzone=MDT; - else if(!stricmp(argv[x]+j+1,"PST")) - tzone=PST; - else if(!stricmp(argv[x]+j+1,"PDT")) - tzone=PDT; - j=strlen(argv[x])-1; - break; - default: - printf("\nUnknown opt '%c'\n",argv[x][j]); - case '?': - printf("%s",usage); - exit(1); - break; } } - else { - if(!cmd[0]) - strcpy(cmd,argv[x]); - else { - sprintf(smb.file,"%.64s",argv[x]); - p=strrchr(smb.file,'.'); - s=strrchr(smb.file,'\\'); - if(p>s) *p=0; - strupr(smb.file); - smb.retry_time=30; - printf("Opening %s\r\n",smb.file); - if((i=smb_open(&smb))!=0) { - printf("error %d opening %s message base\n",i,smb.file); - exit(1); } - if(!filelength(fileno(smb.shd_fp))) { - printf("Empty\n"); - smb_close(&smb); - continue; } - for(y=0;cmd[y];y++) - switch(toupper(cmd[y])) { - case 'I': - case 'E': - case 'N': - strcpy(filein,cmd+1); - i=smb_locksmbhdr(&smb); - if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return(1); } - postmsg(toupper(cmd[y])); - y=strlen(cmd)-1; - break; - case 'S': - showstatus(); - break; - case 'C': - config(); - break; - case 'L': - listmsgs(atol(cmd+1),-1L); - y=strlen(cmd)-1; - break; - case 'P': - packmsgs(atol(cmd+y+1)); - y=strlen(cmd)-1; - break; - case 'R': - readmsgs(atol(cmd+1)); - y=strlen(cmd)-1; - break; - case 'V': - viewmsgs(atol(cmd+1),-1L); - y=strlen(cmd)-1; - break; - case 'M': - maint(); - break; - default: - printf("%s",usage); - break; } - smb_close(&smb); } } } -if(!cmd[0]) - printf("%s",usage); -return(0); -} diff --git a/src/sbbs2/smb/smbutil/smbutil.h b/src/sbbs2/smb/smbutil/smbutil.h deleted file mode 100644 index 4b5462b12a..0000000000 --- a/src/sbbs2/smb/smbutil/smbutil.h +++ /dev/null @@ -1,12 +0,0 @@ -/* SMBUTIL.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#define NOANALYSIS (1L<<0) - -#ifdef __WATCOMC__ - #define ffblk find_t - #define findfirst(x,y,z) _dos_findfirst(x,z,y) - #define findnext(x) _dos_findnext(x) -#endif - diff --git a/src/sbbs2/smbactiv/makeall.bat b/src/sbbs2/smbactiv/makeall.bat deleted file mode 100755 index d68900c3d3..0000000000 --- a/src/sbbs2/smbactiv/makeall.bat +++ /dev/null @@ -1,11 +0,0 @@ -@echo off -wmake OS=DOS %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=DOSX %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=OS2 %1 %2 %3 %4 %5 -if errorlevel 1 goto end -wmake OS=NT %1 %2 %3 %4 %5 -if errorlevel 1 goto end -:end - diff --git a/src/sbbs2/smbactiv/makefile b/src/sbbs2/smbactiv/makefile deleted file mode 100644 index e2a9ad55aa..0000000000 --- a/src/sbbs2/smbactiv/makefile +++ /dev/null @@ -1,92 +0,0 @@ -############################################ -# Makefile for Synchronet SMBACTIV Utility # -# For use with Watcom C/C++ # -############################################ - -!ifndef OS -OS = DOS -!endif - -!ifeq OS DOS -CC = *wcc -!else -CC = *wcc386 -!endif - -LD = *wlink -INCLUDE = \watcom\h;\watcom\h\os2;..;..\smb;..\rio - - -!ifeq OS DOS -CFLAGS = -I$(INCLUDE) -s -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -ml -!else -CFLAGS = -I$(INCLUDE) -s -fh=$*.pch -bt=$(OS) -fo=$(OS)\ -!endif - -!ifeq OS DOS -SYSTEM = DOS -!endif -!ifeq OS OS2 -SYSTEM = OS2V2 -!endif -!ifeq OS DOSX -SYSTEM = DOS4G -!endif -!ifeq OS NT -SYSTEM = NT -!endif - -LFLAGS = option stack=16k system $(SYSTEM) - -MAIN = $(OS)\smbactiv.exe -OBJS = $(OS)\smbactiv.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj & - $(OS)\ars.obj $(OS)\scfglib2.obj $(OS)\smblib.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\gen_defs.h ..\scfgvars.c & - ..\smb\smbdefs.h ..\smb\smblib.h - -# Implicit C Compile Rule -.c.obj: - @echo Compiling (I) $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Main EXE Link Rule -$(MAIN): $(OBJS) -# @echo Linking $< ... - $(LD) $(LFLAGS) file { $(OBJS) } - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# ARS -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - -# Shared Functions -$(OS)\scfglib1.obj: ..\scfglib1.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) & --DNO_TEXT_CFG & --DNO_XTRN_CFG & --DNO_CMDS_CFG & --DNO_CHAT_CFG & -$[@ - -# Shared Functions -$(OS)\scfglib2.obj: ..\scfglib2.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c & - ..\scfglib.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) & --DNO_TEXT_CFG & --DNO_XTRN_CFG & --DNO_CMDS_CFG & --DNO_CHAT_CFG & -$[@ - -$(OS)\smblib.obj: ..\smb\smblib.c ..\smb\smblib.h ..\smb\smbdefs.h - @echo Compiling $[@ to $^@ ... - $(CC) $(CFLAGS) $[@ - diff --git a/src/sbbs2/smbactiv/makefile.bc b/src/sbbs2/smbactiv/makefile.bc deleted file mode 100644 index 65e62529f4..0000000000 --- a/src/sbbs2/smbactiv/makefile.bc +++ /dev/null @@ -1,78 +0,0 @@ -############################################ -# Makefile for Synchronet DEADSUBS Utility # -# For use with Borland C++ for DOS or OS/2 # -############################################ - -# Macros -CC = bcc -LD = tlink -!ifdef __OS2__ -OS = OS2 -INCLUDE = c:\bcos2\include;..;..\smb;..\rio -LIB = c:\bcos2\lib -CFLAGS = -d -C -I$(INCLUDE) -w-pro -LFLAGS = -c -!else -OS = DOS -INCLUDE = \bc31\include;..;..\smb;..\rio -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -N -C -m$(MODEL) -I$(INCLUDE) -w-pro -LFLAGS = -n -c -!endif -MAIN = $(OS)\smbactiv.exe -OBJS = $(OS)\smbactiv.obj $(OS)\scfgvars.obj $(OS)\scfglib1.obj \ - $(OS)\scfglib2.obj $(OS)\smblib.obj $(OS)\ars.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c \ - ..\smb\smbdefs.h ..\smb\smblib.h - -# Implicit C Compile Rule -{.}.c.obj: - @echo Compiling (I) $< to $@ ... - $(CC) $(CFLAGS) -n$(OS) -c $< - -# Main EXE Link Rule -$(MAIN): $(OBJS) - @echo Linking $< ... -!ifdef __OS2__ - $(LD) $(LFLAGS) @&&+ -$(LIB)\c02.obj $(OBJS) -+, $*, $*, $(LIB)\os2.lib $(LIB)\c2.lib -!else - $(LD) $(LFLAGS) @&&+ -$(LIB)\c0$(MODEL) $(OBJS) -+, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib -!endif - -# Global Variables -$(OS)\scfgvars.obj: ..\scfgvars.c ..\sbbsdefs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c -n$(OS) ..\$&.c - -# Shared Functions -$(OS)\scfglib1.obj: ..\scfglib1.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c \ - ..\scfglib.h - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_FILE_CFG --DNO_XTRN_CFG --DNO_CMDS_CFG --DNO_CHAT_CFG -! ..\$&.c - -$(OS)\scfglib2.obj: ..\scfglib2.c ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c \ - ..\scfglib.h - $(CC) $(CFLAGS) -c -n$(OS) @&&! --DNO_FILE_CFG --DNO_XTRN_CFG --DNO_CMDS_CFG --DNO_CHAT_CFG -! ..\$&.c - -$(OS)\smblib.obj: ..\smb\smblib.c ..\smb\smblib.h ..\smb\smbdefs.h - @echo Compiling SMBLIB ... - $(CC) $(CFLAGS) -n$(OS) -c ..\smb\smblib.c - -$(OS)\ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -n$(OS) -c ..\ars.c - diff --git a/src/sbbs2/smbactiv/smbactiv.c b/src/sbbs2/smbactiv/smbactiv.c deleted file mode 100644 index d932b8c31b..0000000000 --- a/src/sbbs2/smbactiv/smbactiv.c +++ /dev/null @@ -1,273 +0,0 @@ -/* SMBACTIV.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <share.h> -#include "sbbs.h" - -#define SMBACTIV_VER "1.01" - -typedef struct { - ulong read; - ulong firstmsg; -} sub_status_t; - -smb_t smb; - -ulong first_msg() -{ - smbmsg_t msg; - -msg.offset=0; -msg.hdr.number=0; -if(smb_getmsgidx(&smb,&msg)) /* Get first message index */ - return(0); -return(msg.idx.number); -} -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} -long lputs(char FAR16 *str) -{ - char tmp[256]; - int i,j,k; - -j=strlen(str); -for(i=k=0;i<j;i++) /* remove CRs */ - if(str[i]==CR && str[i+1]==LF) - continue; - else - tmp[k++]=str[i]; -tmp[k]=0; -return(fputs(tmp,stderr)); -} -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access==O_RDONLY) share=SH_DENYWR; - else share=SH_DENYRW; -while(((file=sopen(str,O_BINARY|access,share,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(access&O_WRONLY) access|=O_RDWR; /* fdopen can't open WRONLY */ - -if(((*file)=nopen(str,access))==-1) - return(NULL); - -if(access&O_APPEND) { - if(access&(O_RDONLY|O_RDWR)) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&(O_WRONLY|O_RDWR)) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - close(*file); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,16*1024); -return(stream); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) -{ - va_list argptr; - char sbuf[256]; - int chcount; - -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); -} -void bail(int code) -{ -exit(code); -} - -void main(int argc, char **argv) -{ - char str[256],*p; - int i,j,file; - ulong l,length,max_users=0xffffffff; - sub_status_t *sub_status; - read_cfg_text_t txt; - struct find_t f; - FILE *stream; - - _fmode=O_BINARY; - txt.openerr="\7\r\nError opening %s for read.\r\n"; - txt.reading="\r\nReading %s..."; - txt.readit="\rRead %s "; - txt.allocerr="\7\r\nError allocating %u bytes of memory\r\n"; - txt.error="\7\r\nERROR: Offset %lu in %s\r\n\r\n"; - -fprintf(stderr,"\nSMBACTIV Version %s (%s) - Synchronet Message Base Activity " - "Monitor\n" - ,SMBACTIV_VER -#if defined(__OS2__) - ,"OS/2" -#elif defined(__NT__) - ,"Win32" -#elif defined(__DOS4G__) - ,"DOS4G" -#elif defined(__FLAT__) - ,"DOS32" -#else - ,"DOS16" -#endif - ); - - if(argc>1 && (!stricmp(argv[1],"/?") || !stricmp(argv[1],"?"))) { - lprintf("\nusage: SMBACTIV [max_users]\n\n"); - lprintf("max_users = limit output to subs read by this many users " - "or less\n"); - exit(0); } - - if(argc>1) - max_users=atol(argv[1]); - - if(!node_dir[0]) { - p=getenv("SBBSNODE"); - if(p==NULL) { - printf("\7\nSBBSNODE environment variable not set.\n"); - exit(1); } - strcpy(node_dir,p); } - - strupr(node_dir); - - if(node_dir[strlen(node_dir)-1]!='\\') - strcat(node_dir,"\\"); - - read_node_cfg(txt); - if(ctrl_dir[0]=='.') { /* Relative path */ - strcpy(str,ctrl_dir); - sprintf(ctrl_dir,"%s%s",node_dir,str); - if(_fullpath(str,ctrl_dir,40)) - strcpy(ctrl_dir,str); } - backslash(ctrl_dir); - - read_main_cfg(txt); - if(data_dir[0]=='.') { /* Relative path */ - strcpy(str,data_dir); - sprintf(data_dir,"%s%s",node_dir,str); - if(_fullpath(str,data_dir,40)) - strcpy(data_dir,str); } - backslash(data_dir); - if(text_dir[0]=='.') { /* Relative path */ - strcpy(str,text_dir); - sprintf(text_dir,"%s%s",node_dir,str); - if(_fullpath(str,text_dir,40)) - strcpy(text_dir,str); } - backslash(text_dir); - read_msgs_cfg(txt); - - if((sub_status=(sub_status_t *)MALLOC - (total_subs*sizeof(sub_status_t)))==NULL) { - printf("ERROR Allocating memory for sub_status\r\n"); - exit(1); } - - lprintf("\nReading sub-board "); - for(i=0;i<total_subs;i++) { - lprintf("%5d of %-5d\b\b\b\b\b\b\b\b\b\b\b\b\b\b",i+1,total_subs); - sprintf(smb.file,"%s%s",sub[i]->data_dir,sub[i]->code); - if((j=smb_open(&smb))!=0) { - lprintf("Error %d opening %s\r\n",j,smb.file); - sub_status[i].read=0; - sub_status[i].firstmsg=0L; - continue; } - sub_status[i].read=0; - sub_status[i].firstmsg=first_msg(); - smb_close(&smb); } - - sprintf(str,"%sUSER\\PTRS\\*.IXB",data_dir); - if(_dos_findfirst(str,0,&f)) { - lprintf("Unable to find any user pointer files.\n"); - FREE(sub_status); - exit(1); } - - j=0; - lprintf("\nComparing user pointers "); - while(1) { - lprintf("%-5d\b\b\b\b\b",++j); - sprintf(str,"%sUSER\\PTRS\\%s",data_dir,f.name); - if((file=nopen(str,O_RDONLY))==-1) { - if(_dos_findnext(&f)) - break; - continue; } - length=filelength(file); - for(i=0;i<total_subs;i++) { - if(sub_status[i].read>max_users) - continue; - if(length<(sub[i]->ptridx+1)*10L) - continue; - else { - lseek(file,((long)sub[i]->ptridx*10L)+4L,SEEK_SET); - read(file,&l,4); } - if(l>sub_status[i].firstmsg) - sub_status[i].read++; } - close(file); - if(_dos_findnext(&f)) - break; } - - printf("NumUsers Sub-board\n"); - printf("-------- -------------------------------------------------" - "-----------\n"); - for(i=0;i<total_subs;i++) { - if(sub_status[i].read>max_users) - continue; - printf("%8lu %-*s %-*s\n" - ,sub_status[i].read - ,LEN_GSNAME,grp[sub[i]->grp]->sname - ,LEN_SLNAME,sub[i]->lname); } - -} diff --git a/src/sbbs2/smbfuncs.c b/src/sbbs2/smbfuncs.c deleted file mode 100644 index 8c8215138b..0000000000 --- a/src/sbbs2/smbfuncs.c +++ /dev/null @@ -1,76 +0,0 @@ -/* SMBFUNCS.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "smbdefs.h" - -int SMBCALL (smb_ver)(void); -char * SMBCALL (smb_lib_ver)(void); -int SMBCALL (smb_open)(smb_t *smb); -void SMBCALL (smb_close)(smb_t *smb); -int SMBCALL (smb_open_da)(smb_t *smb); -void SMBCALL (smb_close_da)(smb_t *smb); -int SMBCALL (smb_open_ha)(smb_t *smb); -void SMBCALL (smb_close_ha)(smb_t *smb); -int SMBCALL (smb_create)(smb_t *smb); -int SMBCALL (smb_stack)(smb_t *smb, int op); -int SMBCALL (smb_trunchdr)(smb_t *smb); -int SMBCALL (smb_locksmbhdr)(smb_t *smb); -int SMBCALL (smb_getstatus)(smb_t *smb); -int SMBCALL (smb_putstatus)(smb_t *smb); -int SMBCALL (smb_unlocksmbhdr)(smb_t *smb); -int SMBCALL (smb_getmsgidx)(smb_t *smb, smbmsg_t *msg); -int SMBCALL (smb_getlastidx)(smb_t *smb, idxrec_t *idx); -uint SMBCALL (smb_getmsghdrlen)(smbmsg_t *msg); -ulong SMBCALL (smb_getmsgdatlen)(smbmsg_t *msg); -int SMBCALL (smb_lockmsghdr)(smb_t *smb, smbmsg_t *msg); -int SMBCALL (smb_getmsghdr)(smb_t *smb, smbmsg_t *msg); -int SMBCALL (smb_unlockmsghdr)(smb_t *smb, smbmsg_t *msg); -int SMBCALL (smb_addcrc)(smb_t *smb, ulong crc); -int SMBCALL (smb_hfield)(smbmsg_t *msg, ushort type, ushort length - ,void *data); -int SMBCALL (smb_dfield)(smbmsg_t *msg, ushort type, ulong length); -int SMBCALL (smb_addmsghdr)(smb_t *smb, smbmsg_t *msg,int storage); -int SMBCALL (smb_putmsg)(smb_t *smb, smbmsg_t *msg); -int SMBCALL (smb_putmsgidx)(smb_t *smb, smbmsg_t *msg); -int SMBCALL (smb_putmsghdr)(smb_t *smb, smbmsg_t *msg); -void SMBCALL (smb_freemsgmem)(smbmsg_t *msg); -ulong SMBCALL (smb_hdrblocks)(ulong length); -ulong SMBCALL (smb_datblocks)(ulong length); -long SMBCALL (smb_allochdr)(smb_t *smb, ulong length); -long SMBCALL (smb_fallochdr)(smb_t *smb, ulong length); -long SMBCALL (smb_hallochdr)(smb_t *smb); -long SMBCALL (smb_allocdat)(smb_t *smb, ulong length, ushort headers); -long SMBCALL (smb_fallocdat)(smb_t *smb, ulong length, ushort headers); -long SMBCALL (smb_hallocdat)(smb_t *smb); -int SMBCALL (smb_incdat)(smb_t *smb, ulong offset, ulong length - ,ushort headers); -int SMBCALL (smb_freemsg)(smb_t *smb, smbmsg_t *msg); -int SMBCALL (smb_freemsgdat)(smb_t *smb, ulong offset, ulong length - ,ushort headers); -int SMBCALL (smb_freemsghdr)(smb_t *smb, ulong offset, ulong length); -char HUGE16 * SMBCALL smb_getmsgtxt(smb_t *smb, smbmsg_t *msg, ulong mode); -void SMBCALL (smb_freemsgtxt)(char HUGE16 *buf); - -/* FILE pointer I/O functions */ - -int SMBCALL (smb_feof(FILE *fp); -int SMBCALL (smb_ferror(FILE *fp); -int SMBCALL (smb_fflush(FILE *fp); -int SMBCALL (smb_fgetc(FILE *fp); -int SMBCALL (smb_fputc(int ch, FILE *fp); -int SMBCALL (smb_fseek(FILE *fp, long offset, int whence); -long SMBCALL (smb_ftell(FILE *fp); -long SMBCALL (smb_fread(char HUGE16 *buf, long bytes, FILE *fp); -long SMBCALL (smb_fwrite(char HUGE16 *buf, long bytes, FILE *fp); -long SMBCALL (smb_fgetlength(FILE *fp); -int SMBCALL (smb_fsetlength(FILE *fp, long length); -void SMBCALL (smb_rewind(FILE *fp); -void SMBCALL (smb_clearerr(FILE *fp); - -/* LZH functions */ - -long SMBCALL (lzh_encode(uchar *inbuf, long inlen, uchar *outbuf); -long SMBCALL (lzh_decode(uchar *inbuf, long inlen, uchar *outbuf); - -#endif /* Don't add anything after this #endif statement */ diff --git a/src/sbbs2/smm/addphoto.c b/src/sbbs2/smm/addphoto.c deleted file mode 100644 index 6f4294579c..0000000000 --- a/src/sbbs2/smm/addphoto.c +++ /dev/null @@ -1,310 +0,0 @@ -/* ADDPHOTO.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <io.h> -#include <dos.h> -#include <bios.h> -#include <time.h> -#include <ctype.h> -#include <stdio.h> -#include <share.h> -#include <conio.h> -#include <errno.h> -#include <fcntl.h> -#include <string.h> -#include <stdlib.h> -#include <stdarg.h> -#include <malloc.h> -#include <sys/stat.h> -#include <sys/types.h> - -#include "gen_defs.h" -#include "crc32.h" -#include "smmdefs.h" - -extern int daylight=0; -extern long timezone=0L; - - -char *base41(unsigned int i, char *str) -{ - char c; - unsigned int j=41*41,k; - -for(c=0;c<3;c++) { - k=i/j; - str[c]='0'+k; - i-=(k*j); - j/=41; - if(str[c]>=':') - str[c]='A'+(str[c]-':'); - if(str[c]>='[') - str[c]='#'+(str[c]-'['); } -str[c]=0; -return(str); -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC)==0) - return(1); -return(0); -} - -#define MV_BUFLEN 4096 - -/****************************************************************************/ -/* Moves or copies a file from one dir to another */ -/* both 'src' and 'dest' must contain full path and filename */ -/* returns 0 if successful, -1 if error */ -/****************************************************************************/ -int mv(char *src, char *dest, char copy) -{ - char str[256],*buf; - int ind,outd; - long length,chunk=MV_BUFLEN,l; - struct ftime ftime; - FILE *inp,*outp; - -if(copy) - printf("Copying %s to %s\n",src,dest); -else - printf("Moving %s to %s\n",src,dest); -if(!stricmp(src,dest)) /* source and destination are the same! */ - return(0); -if(!fexist(src)) - return(1); -if(!copy && fexist(dest)) - return(2); -if(!copy && ((src[1]!=':' && dest[1]!=':') - || (src[1]==':' && dest[1]==':' && toupper(src[0])==toupper(dest[0])))) { - if(rename(src,dest)) /* same drive, so move */ - return(3); - return(0); } -if((ind=open(src,O_RDONLY|O_BINARY))==-1) - return(4); -if((inp=fdopen(ind,"rb"))==NULL) { - close(ind); - return(5); } -setvbuf(inp,NULL,_IOFBF,32*1024); -if((outd=open(dest,O_WRONLY|O_CREAT|O_TRUNC|O_BINARY,S_IWRITE|S_IREAD))==-1) { - fclose(inp); - return(6); } -if((outp=fdopen(outd,"wb"))==NULL) { - close(outd); - fclose(inp); - return(7); } -setvbuf(outp,NULL,_IOFBF,8*1024); -length=filelength(ind); -if(!length) { - fclose(inp); - fclose(outp); - return(8); } -if((buf=(char *)MALLOC(MV_BUFLEN))==NULL) { - fclose(inp); - fclose(outp); - return(9); } -l=0L; -while(l<length) { - if(l+chunk>length) - chunk=length-l; - if(fread(buf,1,chunk,inp)!=chunk) { - FREE(buf); - fclose(inp); - fclose(outp); - return(10); } - if(fwrite(buf,1,chunk,outp)!=chunk) { - FREE(buf); - fclose(inp); - fclose(outp); - return(11); } - l+=chunk; } -getftime(ind,&ftime); -setftime(outd,&ftime); -FREE(buf); -fclose(inp); -fclose(outp); -if(!copy && remove(src)) - return(12); -return(0); -} - -time_t checktime() -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - - -int main(int argc, char **argv) -{ - char str[128],fname[128],path[128],tmp[128],*p; - int i,file; - FILE *index, *stream; - ulong number,crc; - user_t user; - ixb_t ixb; - -printf("\nADDPHOTO v1.01 - Synchronet Match Maker Photograph Addition\n\n"); - -if(checktime()) { - printf("Time problem!\n"); - exit(1); } - -if(argc<4) { - printf("usage: addphoto filename.ext user_number system_name\n"); - exit(1); } - -strupr(argv[1]); -if(!fexist(argv[1])) { - printf("%s doesn't exist\n",argv[1]); - exit(1); } - -if((file=open("SMM.DAB",O_RDWR|O_BINARY|O_DENYNONE|O_CREAT - ,S_IWRITE|S_IREAD))==-1) { - printf("\n\7Error opening/creating SMM.DAB\n"); - exit(1); } -if((stream=fdopen(file,"w+b"))==NULL) { - printf("\n\7Error converting SMM.DAB file handle to stream\n"); - exit(1); } -setvbuf(stream,0L,_IOFBF,4096); - -if((file=open("SMM.IXB",O_RDWR|O_BINARY|O_DENYNONE|O_CREAT - ,S_IWRITE|S_IREAD))==-1) { - printf("\n\7Error opening/creating SMM.IXB\n"); - exit(1); } -if((index=fdopen(file,"w+b"))==NULL) { - printf("\n\7Error converting SMM.IXB file handle to stream\n"); - exit(1); } -setvbuf(stream,0L,_IOFBF,1024); - -number=atol(argv[2]); -str[0]=0; -for(i=3;i<argc;i++) { - if(str[0]) - strcat(str," "); - strcat(str,argv[i]); } - -strupr(str); -str[25]=0; - -crc=crc32(str); -rewind(index); -i=0; -while(!feof(index)) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(!ixb.number) /* DELETED */ - continue; - if(ixb.system!=crc || ixb.number!=number) - continue; - fseek(stream - ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); - if(!fread(&user,sizeof(user_t),1,stream)) - continue; - i=1; - break; } -if(!i) { - printf("\7User #%lu @ %s not found!\n",number,str); - exit(2); } - -for(i=0;user.system[i];i++) - if(isalnum(user.system[i])) - break; -if(!user.system[i]) - fname[0]='~'; -else - fname[0]=user.system[i]; -for(i=strlen(user.system)-1;i>0;i--) - if(isalnum(user.system[i])) - break; -if(i<=0) - fname[1]='~'; -else - fname[1]=user.system[i]; -fname[2]=0; -strupr(user.system); -strcat(fname,base41(crc16(user.system),tmp)); -strcat(fname,base41(user.number,tmp)); -p=strrchr(argv[1],'.'); -if(p) - strcat(fname,p); -strupr(fname); -mkdir("PHOTO"); -sprintf(path,"PHOTO\\%s",fname); -if((i=mv(argv[1],path,1))!=0) { - printf("\7ERROR %d copying %s to %s\n",i,argv[1],path); - exit(3); } - -user.misc|=USER_PHOTO; -user.updated=time(NULL); -user.photo=0; -fseek(stream - ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); -fwrite(&user,sizeof(user_t),1,stream); -ixb.updated=user.updated; -fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET); -fwrite(&ixb,sizeof(ixb_t),1,index); - -printf("%s added successfully!\n",argv[1]); -return(0); -} - diff --git a/src/sbbs2/smm/delphoto.c b/src/sbbs2/smm/delphoto.c deleted file mode 100644 index 6934b2d96e..0000000000 --- a/src/sbbs2/smm/delphoto.c +++ /dev/null @@ -1,223 +0,0 @@ -/* DELPHOTO.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <io.h> -#include <dos.h> -#include <dir.h> -#include <bios.h> -#include <time.h> -#include <ctype.h> -#include <stdio.h> -#include <share.h> -#include <conio.h> -#include <errno.h> -#include <fcntl.h> -#include <string.h> -#include <stdlib.h> -#include <stdarg.h> -#include <malloc.h> -#include <sys/stat.h> -#include <sys/types.h> - -#include "gen_defs.h" -#include "crc32.h" -#include "smmdefs.h" - -extern int daylight=0; -extern long timezone=0L; - - - -char *base41(unsigned int i, char *str) -{ - char c; - unsigned int j=41*41,k; - -for(c=0;c<3;c++) { - k=i/j; - str[c]='0'+k; - i-=(k*j); - j/=41; - if(str[c]>=':') - str[c]='A'+(str[c]-':'); - if(str[c]>='[') - str[c]='#'+(str[c]-'['); } -str[c]=0; -return(str); -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - -time_t checktime() -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - - -int main(int argc, char **argv) -{ - char str[128],fname[128],path[128],tmp[128]; - int i,file; - FILE *index, *stream; - ulong number,crc; - user_t user; - ixb_t ixb; - struct ffblk ff; - -printf("\nDELPHOTO v1.00 - Synchronet Match Maker Photograph Deletion\n\n"); - -if(checktime()) { - printf("Time problem!\n"); - exit(1); } - -if(argc<3) { - printf("usage: delphoto user_number system_name\n"); - exit(1); } - -if((file=open("SMM.DAB",O_RDWR|O_BINARY|SH_DENYNO|O_CREAT - ,S_IWRITE|S_IREAD))==-1) { - printf("\n\7Error opening/creating SMM.DAB\n"); - exit(1); } -if((stream=fdopen(file,"w+b"))==NULL) { - printf("\n\7Error converting SMM.DAB file handle to stream\n"); - exit(1); } -setvbuf(stream,0L,_IOFBF,4096); - -if((file=open("SMM.IXB",O_RDWR|O_BINARY|SH_DENYNO|O_CREAT - ,S_IWRITE|S_IREAD))==-1) { - printf("\n\7Error opening/creating SMM.IXB\n"); - exit(1); } -if((index=fdopen(file,"w+b"))==NULL) { - printf("\n\7Error converting SMM.IXB file handle to stream\n"); - exit(1); } -setvbuf(stream,0L,_IOFBF,1024); - -number=atol(argv[1]); -str[0]=0; -for(i=2;i<argc;i++) { - if(str[0]) - strcat(str," "); - strcat(str,argv[i]); } - -strupr(str); -str[25]=0; - -crc=crc32(str); -rewind(index); -i=0; -while(!feof(index)) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(!ixb.number) /* DELETED */ - continue; - if(ixb.system!=crc || ixb.number!=number) - continue; - fseek(stream - ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); - if(!fread(&user,sizeof(user_t),1,stream)) - continue; - i=1; - break; } -if(!i) { - printf("\7User #%lu @ %s not found!\n",number,str); - exit(2); } - -if(!(user.misc&USER_PHOTO)) { - printf("\7User #%lu @ %s doesn't have a photo attached to their profile.\n" - ,number,str); - exit(3); } - -for(i=0;user.system[i];i++) - if(isalnum(user.system[i])) - break; -if(!user.system[i]) - fname[0]='~'; -else - fname[0]=user.system[i]; -for(i=strlen(user.system)-1;i>0;i--) - if(isalnum(user.system[i])) - break; -if(i<=0) - fname[1]='~'; -else - fname[1]=user.system[i]; -fname[2]=0; -strupr(user.system); -strcat(fname,base41(crc16(user.system),tmp)); -strcat(fname,base41(user.number,tmp)); -strcat(fname,".*"); -strupr(fname); -sprintf(path,"PHOTO\\%s",fname); -i=findfirst(path,&ff,0); -if(i) - printf("\7%s doesn't exist!\n",path); -else { - sprintf(path,"PHOTO\\%s",ff.ff_name); - if(remove(path)) - printf("\7%s couldn't be removed!\n",path); } - -user.misc&=~USER_PHOTO; -user.updated=time(NULL); -user.photo=0; -fseek(stream - ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); -fwrite(&user,sizeof(user_t),1,stream); -ixb.updated=user.updated; -fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET); -fwrite(&ixb,sizeof(ixb_t),1,index); - -printf("Photo removed successfully from database.\n"); -return(0); -} - diff --git a/src/sbbs2/smm/lstphoto.c b/src/sbbs2/smm/lstphoto.c deleted file mode 100644 index 3d5a4e908e..0000000000 --- a/src/sbbs2/smm/lstphoto.c +++ /dev/null @@ -1,182 +0,0 @@ -/* LSTPHOTO.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <io.h> -#include <dos.h> -#include <dir.h> -#include <bios.h> -#include <time.h> -#include <ctype.h> -#include <stdio.h> -#include <share.h> -#include <conio.h> -#include <errno.h> -#include <fcntl.h> -#include <string.h> -#include <stdlib.h> -#include <stdarg.h> -#include <malloc.h> -#include <sys/stat.h> -#include <sys/types.h> - -#include "gen_defs.h" -#include "crc32.h" -#include "smmdefs.h" - -extern int daylight=0; -extern long timezone=0L; - - - -char *base41(unsigned int i, char *str) -{ - char c; - unsigned int j=41*41,k; - -for(c=0;c<3;c++) { - k=i/j; - str[c]='0'+k; - i-=(k*j); - j/=41; - if(str[c]>=':') - str[c]='A'+(str[c]-':'); - if(str[c]>='[') - str[c]='#'+(str[c]-'['); } -str[c]=0; -return(str); -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - struct time curtime; - struct date date; - -if(!unix) - strcpy(str,"00/00/00"); -else { - unixtodos(unix,&date,&curtime); - if((unsigned)date.da_mon>12) { /* DOS leap year bug */ - date.da_mon=1; - date.da_year++; } - if((unsigned)date.da_day>31) - date.da_day=1; - sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day - ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); } -return(str); -} - - -time_t checktime() -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - - -int main() -{ - char str[128],fname[128],tmp[128]; - int i,file; - FILE *stream; - user_t user; - -printf("\nLSTPHOTO v1.00 - Synchronet Match Maker Photograph List\n\n"); - -if(checktime()) { - printf("Time problem!\n"); - exit(1); } - -if((file=open("SMM.DAB",O_RDWR|O_BINARY|SH_DENYNO|O_CREAT - ,S_IWRITE|S_IREAD))==-1) { - printf("\n\7Error opening/creating SMM.DAB\n"); - exit(1); } -if((stream=fdopen(file,"w+b"))==NULL) { - printf("\n\7Error converting SMM.DAB file handle to stream\n"); - exit(1); } -setvbuf(stream,0L,_IOFBF,4096); - -while(!feof(stream)) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - if(!(user.misc&USER_PHOTO) || user.misc&USER_DELETED || !user.number) - continue; - - printf("%-25.25s %5lu %-25.25s %s ",user.system,user.number,user.name - ,unixtodstr(user.photo,tmp)); - for(i=0;user.system[i];i++) - if(isalnum(user.system[i])) - break; - if(!user.system[i]) - fname[0]='~'; - else - fname[0]=user.system[i]; - for(i=strlen(user.system)-1;i>0;i--) - if(isalnum(user.system[i])) - break; - if(i<=0) - fname[1]='~'; - else - fname[1]=user.system[i]; - fname[2]=0; - strupr(fname); - strupr(user.system); - strcat(fname,base41(crc16(user.system),tmp)); - strcat(fname,base41(user.number,tmp)); - printf("%s\n",fname); } - -return(0); -} - diff --git a/src/sbbs2/smm/makefile b/src/sbbs2/smm/makefile deleted file mode 100644 index af70052dfb..0000000000 --- a/src/sbbs2/smm/makefile +++ /dev/null @@ -1,35 +0,0 @@ -# Macros -CC = \bc31\bin\bcc -LD = \bc31\bin\tlink -SDK = ..\sdk -MSWAIT = ..\..\mswait\dos -INCLUDE = \bc31\include;$(SDK);..\smb -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -w-prot -LFLAGS = /n /c -OBJS = xsdk.obj xsdkvars.obj $(MSWAIT)\mswait$(MODEL).obj ..\DOS\rciol.obj -HEADERS = $(SDK)\xsdk.h $(SDK)\xsdkdefs.h $(SDK)\xsdkvars.c smmdefs.h - -# Implicit C Compile Rule -.c.obj: - @echo Compiling $*.c to $*.obj ... - $(CC) $(CFLAGS) -c $*.c - -# Main EXE Link Rule -smm.exe: $(OBJS) smm.obj - @echo Linking $< ... - $(LD) $(LFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) smm.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -# All .obj modules -smm.obj: $(HEADERS) - -xsdk.obj: $(SDK)\xsdk.c $(HEADERS) - @echo Compiling $(SDK)\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c -w+pro $(SDK)\$*.c - -xsdkvars.obj: $(SDK)\xsdkvars.c $(SDK)\xsdkdefs.h - @echo Compiling $(SDK)\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c -w+pro $(SDK)\$*.c diff --git a/src/sbbs2/smm/makeio.bat b/src/sbbs2/smm/makeio.bat deleted file mode 100755 index 27cf740416..0000000000 --- a/src/sbbs2/smm/makeio.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -bcc -w-pro -N -ml -C -n. -DSMB_GETMSGTXT -I..;..\smb smb2smm.c ..\smb\smblib.c ..\smb\lzh.c -if errorlevel 1 goto end -bcc -w-pro -N -ml -C -n. -I..;..\smb smm2smb.c ..\smb\smblib.c -if errorlevel 1 goto end -bcc -w-pro -N -ml -C -n. -I..;..\smb outphoto.c ..\smb\smblib.c -:end diff --git a/src/sbbs2/smm/makemsg.c b/src/sbbs2/smm/makemsg.c deleted file mode 100644 index b2c0043394..0000000000 --- a/src/sbbs2/smm/makemsg.c +++ /dev/null @@ -1,70 +0,0 @@ -/* MAKEMSG.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <dos.h> -#include <stdio.h> -#include <time.h> -#include "gen_defs.h" - -/****************************************************************************/ -/* Converts a date string in format MM/DD/YY into unix time format */ -/****************************************************************************/ -time_t dstrtounix(char *str) -{ - struct date date; - struct time curtime; - -if(!strcmp(str,"00/00/00") || !str[0]) - return(NULL); -curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0; -if(str[6]<'7') - date.da_year=2000+((str[6]&0xf)*10)+(str[7]&0xf); -else - date.da_year=1900+((str[6]&0xf)*10)+(str[7]&0xf); -date.da_mon=((str[0]&0xf)*10)+(str[1]&0xf); -date.da_day=((str[3]&0xf)*10)+(str[4]&0xf); -return(dostounix(&date,&curtime)); -} - -uchar cryptchar(uchar ch, ulong seed) -{ -if(ch==1) - return(0xfe); -if(ch<0x20 || ch&0x80) /* Ctrl chars and ex-ASCII are not xlated */ - return(ch); -return(ch^(seed&0x1f)); -} - -int main(int argc, char **argv) -{ - char str[256]; - FILE *in,*out; - int i,j; - long l; - -if(argc<4) { - printf("usage: makemsg infile outfile mm/dd/yy\n"); - exit(1); } - -if((in=fopen(argv[1],"rb"))==NULL) { - printf("error opening %s\n",argv[1]); - exit(1); } - -if((out=fopen(argv[2],"wb"))==NULL) { - printf("error opening %s\n",argv[2]); - exit(1); } - -l=dstrtounix(argv[3]); -if(!l) { - printf("Invalid date %s\n",argv[3]); - exit(1); } -fprintf(out,"%lx\r\n",l^0x305F6C81UL); -i=ftell(out); -while(!feof(in)) { - if(!fgets(str,128,in)) - break; - for(j=0;str[j];j++,i++) - fputc(cryptchar(str[j],l^(i&7)),out); } -return(0); -} diff --git a/src/sbbs2/smm/makephot.bat b/src/sbbs2/smm/makephot.bat deleted file mode 100755 index 9b6388a531..0000000000 --- a/src/sbbs2/smm/makephot.bat +++ /dev/null @@ -1,7 +0,0 @@ -@echo off -bcc -I..;..\smb -w-pro -N -C -ml addphoto.c -if errorlevel 1 goto end -bcc -I..;..\smb -w-pro -N -C -ml delphoto.c -if errorlevel 1 goto end -bcc -I..;..\smb -w-pro -N -C -ml lstphoto.c -:end diff --git a/src/sbbs2/smm/makeutil.bat b/src/sbbs2/smm/makeutil.bat deleted file mode 100755 index 53649bc7fd..0000000000 --- a/src/sbbs2/smm/makeutil.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -w-pro -ml -I..;..\smb smmutil.c diff --git a/src/sbbs2/smm/outphoto.c b/src/sbbs2/smm/outphoto.c deleted file mode 100644 index 99e2b4e02e..0000000000 --- a/src/sbbs2/smm/outphoto.c +++ /dev/null @@ -1,347 +0,0 @@ -/* OUTPHOTO.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Scans SMM database and posts any photographs into the an SMB base */ - -#define uint unsigned int - -#include <dos.h> -#include <share.h> -#include "smblib.h" -#include "smmdefs.h" -#include "crc32.h" - -#define DAYS 15L // Hatch every 15 days - -smb_t smb; -extern int daylight=0; -extern long timezone=0L; - -unsigned _stklen=16000; /* Set stack size in code, not header */ - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(1); -return(0); -} - - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - - -char *base41(unsigned int i, char *str) -{ - char c; - unsigned int j=41*41,k; - -for(c=0;c<3;c++) { - k=i/j; - str[c]='0'+k; - i-=(k*j); - j/=41; - if(str[c]>=':') - str[c]='A'+(str[c]-':'); - if(str[c]>='[') - str[c]='#'+(str[c]-'['); } -str[c]=0; -return(str); -} - - - -time_t checktime() -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - -#define BUF_LEN 8192 - -int main(int argc, char **argv) -{ - uchar str[128],tmp[128],buf[BUF_LEN],fname[64],path[128],*p,ch; - int i,j,file,in,linelen,all=0; - ushort xlat; - long length,l; - ulong offset,crc; - time_t now; - struct ffblk ff; - user_t user; - smbmsg_t msg; - FILE *stream; - -fprintf(stderr,"\nOUTPHOTO %s - Write SMM photos to SMB - Developed 1995-1997 " - "Rob Swindell\n\n",__DATE__); - -if(checktime()) { - printf("Time problem!\n"); - return(-1); } - -if(argc<3) { - fprintf(stderr,"usage: outphoto <smm.dab> <smb_file>\n\n"); - fprintf(stderr,"example: outphoto c:\\sbbs\\xtrn\\smm\\smm.dab " - "c:\\sbbs\\data\\subs\\syncdata\n"); - return(1); } - -for(i=3;i<argc;i++) - if(!stricmp(argv[i],"/ALL")) - all=1; - -strcpy(smb.file,argv[2]); -strupr(smb.file); - -strcpy(str,argv[1]); -strupr(str); -if((file=open(str,O_RDWR|O_BINARY|O_DENYNONE))==-1) { - printf("error opening %s\n",str); - return(1); } -if((stream=fdopen(file,"w+b"))==NULL) { - printf("error fdopening %s\n",str); - return(1); } -setvbuf(stream,NULL,_IOFBF,4096); - -sprintf(str,"%s.SHD",smb.file); -if(!fexist(str)) { - printf("%s doesn't exist\n",smb.file); - return(0); } -fprintf(stderr,"Opening %s\n",smb.file); -smb.retry_time=30; -if((i=smb_open(&smb))!=0) { - printf("smb_open returned %d\n",i); - return(1); } - -now=time(NULL); -while(!feof(stream)) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - - if(user.misc&USER_DELETED || !(user.misc&USER_PHOTO)) - continue; - - printf("Photo: %-25.25s %.24s " - ,user.name,ctime(&user.photo)); - - if(user.photo && now-user.photo<DAYS*24L*60L*60L && !all) { - printf("skipping\n"); - continue; } - printf("hatching\n"); - - for(i=0;user.system[i];i++) - if(isalnum(user.system[i])) - break; - if(!user.system[i]) - fname[0]='~'; - else - fname[0]=user.system[i]; - for(i=strlen(user.system)-1;i>0;i--) - if(isalnum(user.system[i])) - break; - if(i<=0) - fname[1]='~'; - else - fname[1]=user.system[i]; - fname[2]=0; - strcpy(str,user.system); - strupr(str); - strcat(fname,base41(crc16(str),tmp)); - strcat(fname,base41(user.number,tmp)); - strcpy(path,argv[1]); - p=strchr(path,'\\'); - if(p) *(p+1)=0; - else path[0]=0; - sprintf(str,"%sPHOTO\\%s.*",path,fname); - if(findfirst(str,&ff,0)) { - printf("%s doesn't exist!\n",str); - continue; } - strcpy(fname,ff.ff_name); - strcpy(path,argv[1]); - p=strchr(path,'\\'); - if(p) *(p+1)=0; - else path[0]=0; - sprintf(str,"%sPHOTO\\%s",path,fname); - - printf("Exporting %s",str); - if((in=open(str,O_RDONLY|O_BINARY|SH_DENYWR))==-1) { - printf("\nError opening %s\n",str); - continue; } - - memset(buf,0,BUF_LEN); - crc=0xffffffffUL; - linelen=0; - sprintf(buf,"%lx\r\n",filelength(in)^4096); - l=strlen(buf); - while(l<(BUF_LEN-128)) { - if(!read(in,&ch,1)) - break; - crc=ucrc32(ch,crc); - if(ch=='`') { - buf[l++]='`'; - buf[l++]='`'; - linelen++; } - else if(ch==0xff) - buf[l++]='\xee'; - else if(ch<0xf) - buf[l++]=ch|0xf0; - else if(ch<0x20) { - buf[l++]='`'; - buf[l++]=ch+'@'; - linelen++; } - else if(ch>=0xf0) { - sprintf(str,"`%x",ch&0xf); - buf[l++]=str[0]; - buf[l++]=str[1]; - linelen++; } - else if(ch==0xe3) { - buf[l++]='`'; - buf[l++]='g'; - linelen++; } - else if(ch==0x8d) { - buf[l++]='`'; - buf[l++]='h'; - linelen++; } - else if(ch==0xee) { - buf[l++]='`'; - buf[l++]='i'; - linelen++; } - else - buf[l++]=ch; - linelen++; - if(linelen>=70) { - buf[l++]=CR; - buf[l++]=LF; - linelen=0; } } - buf[l]=0; - crc=~crc; - sprintf(str,"%lx\r\n--- OUTPHOTO %s",time(NULL),__DATE__); - strcat(buf,str); - printf("\n"); - - length=strlen(buf); /* +2 for translation string */ - - if(smb.status.attr&SMB_HYPERALLOC) - offset=smb_hallocdat(&smb); - else { - i=smb_open_da(&smb); - if(i) { - printf("smb_open_da returned %d\n",i); - exit(1); } - offset=smb_allocdat(&smb,length+2,1); - fclose(smb.sda_fp); } - - fseek(smb.sdt_fp,offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,smb.sdt_fp); - fwrite(buf,length,1,smb.sdt_fp); - length+=2; - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - msg.hdr.when_written.time=time(NULL); - - msg.hdr.offset=offset; - - strcpy(str,"SMM PHOTO"); - i=smb_hfield(&msg,RECIPIENT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.to=crc16(str); - - strcpy(str,"Digital Dynamics"); - i=smb_hfield(&msg,SENDER,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.from=crc16(str); - - sprintf(tmp,"%.25s",user.system); - strupr(tmp); - sprintf(str,"%04lx%08lx%08lx%.3s" - ,user.number^0x191L,crc32(tmp)^0x90120e71L,crc^0x05296328L,fname+9); - i=smb_hfield(&msg,SUBJECT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.subj=crc16(str); - - i=smb_dfield(&msg,TEXT_BODY,length); - if(i) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - - i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC); - if(i) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - smb_freemsgmem(&msg); - fseek(stream,ftell(stream)-sizeof(user_t),SEEK_SET); - user.photo=time(NULL); - fwrite(&user,sizeof(user_t),1,stream); - fseek(stream,ftell(stream),SEEK_SET); } -return(0); -} - diff --git a/src/sbbs2/smm/smb2smm.c b/src/sbbs2/smm/smb2smm.c deleted file mode 100644 index de596dd128..0000000000 --- a/src/sbbs2/smm/smb2smm.c +++ /dev/null @@ -1,970 +0,0 @@ -/* SMB2SMM */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Scans SMB message base for messages to "SMM" and adds them to the SMM */ -/* database. */ - -#define uint unsigned int - -#define LOOP_NOPEN 500 - -#include <dos.h> -#include "smblib.h" -#include "smmdefs.h" -#include "nodedefs.h" -#include "crc32.h" - -#define VERSION "2.01" - -extern int daylight=0; -extern long timezone=0L; - -unsigned _stklen=16000; /* Set stack size in code, not header */ - -char data_dir[128]; - -smb_t smb; -FILE *trashfile=NULL; - -uchar cryptchar(uchar ch, ulong seed) -{ -if(ch==0xfe) - return(1); -if(ch<0x20 || ch&0x80) /* Ctrl chars and ex-ASCII are not xlated */ - return(ch); -return(ch^(seed&0x1f)); -} - -void decrypt(char *str, ulong seed) -{ - char out[1024]; - int i,j; - -j=strlen(str); -for(i=0;i<j;i++) - out[i]=cryptchar(str[i],seed^(i&7)); -out[i]=0; -strcpy(str,out); -} - -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - -/***************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first CR */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\r")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while(*str>' ' && (l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(1); -return(0); -} - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(f.ff_fsize); -return(-1L); -} - - -/****************************************************************************/ -/* Converts a date string in format MM/DD/YY into unix time format */ -/****************************************************************************/ -time_t dstrtounix(char *str) -{ - struct date date; - struct time curtime; - -if(!strncmp(str,"00/00/00",8)) - return(0); -curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0; -if(str[6]<'7') - date.da_year=2000+((str[6]&0xf)*10)+(str[7]&0xf); -else - date.da_year=1900+((str[6]&0xf)*10)+(str[7]&0xf); -date.da_mon=((str[0]&0xf)*10)+(str[1]&0xf); -date.da_day=((str[3]&0xf)*10)+(str[4]&0xf); -return(dostounix(&date,&curtime)); -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns the age derived from the string 'birth' in the format MM/DD/YY */ -/****************************************************************************/ -char getage(char *birth) -{ - char age; - struct date date; - -if(birth[0]<=SP) - return(0); -getdate(&date); -age=(date.da_year-1900)-(((birth[6]&0xf)*10)+(birth[7]&0xf)); -if(age>90) - age-=90; -if(atoi(birth)>12 || atoi(birth+3)>31) - return(0); -if(((birth[0]&0xf)*10)+(birth[1]&0xf)>date.da_mon || - (((birth[0]&0xf)*10)+(birth[1]&0xf)==date.da_mon && - ((birth[3]&0xf)*10)+(birth[4]&0xf)>date.da_day)) - age--; -if(age<0) - return(0); -return(age); -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - - -char *base41(unsigned int i, char *str) -{ - char c; - unsigned int j=41*41,k; - -for(c=0;c<3;c++) { - k=i/j; - str[c]='0'+k; - i-=(k*j); - j/=41; - if(str[c]>=':') - str[c]='A'+(str[c]-':'); - if(str[c]>='[') - str[c]='#'+(str[c]-'['); } -str[c]=0; -return(str); -} - - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access&O_DENYNONE) share=O_DENYNONE; -else if(access==O_RDONLY) share=O_DENYWRITE; -else share=O_DENYALL; -while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN) - if(count>10) - delay(55); -if(file==-1 && errno==EACCES) - puts("\7\nNOPEN: ACCESS DENIED\n\7"); -return(file); -} - - -/****************************************************************************/ -/* Creates a short message for 'usernumber' than contains 'strin' */ -/****************************************************************************/ -void putsmsg(int usernumber, char *strin) -{ - char str[256]; - int file,i; - struct ffblk ff; - node_t node; - -sprintf(str,"%sMSGS\\%4.4u.MSG",data_dir,usernumber); -if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - printf("\7Error opening/creating %s for creat/append access\n",str); - return; } -i=strlen(strin); -if(write(file,strin,i)!=i) { - close(file); - printf("\7Error writing %u bytes to %s\n",i,str); - return; } -close(file); -} - -void puttgram(int usernumber, char *strin) -{ - char str[256]; - int file,i; - struct ffblk ff; - node_t node; - -sprintf(str,"%4.4u.MSG",usernumber); -if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - printf("\7Error opening/creating %s for creat/append access\n",str); - return; } -i=strlen(strin); -if(write(file,strin,i)!=i) { - close(file); - printf("\7Error writing %u bytes to %s\n",i,str); - return; } -close(file); -} - -int trash(char *instr) -{ - char str[1024],word[128]; - -if(!trashfile) - return(0); -strcpy(str,instr); -strupr(str); -rewind(trashfile); -while(!ferror(trashfile)) { - if(!fgets(word,125,trashfile)) - break; - truncsp(word); - if(!word[0]) - continue; - strupr(word); - if(strstr(str,word)) - return(1); } -return(0); -} - -time_t checktime() -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - -int main(int argc, char **argv) -{ - uchar str[256],system[128],telegram[1024],HUGE16 *buf,HUGE16 *hp, *p - ,min_age,fname[64],path[128],tmp[128],ch; - int i,j,file,out,wallfile,msgfile,tgramonly=0,wallonly=0,esc; - ulong l,m,last,high,system_crc,crc,length; - ushort smm,smm_photo,touser; - user_t user; - wall_t wall; - smbmsg_t msg; - FILE *stream,*index,*tmpfile; - ixb_t ixb; - -fprintf(stderr,"\nSMB2SMM v%s - Updates SMM via SMB - Developed 1995-1997 " - "Rob Swindell\n\n",VERSION); - -if(checktime()) { - printf("Time problem!\n"); - return(-1); } - -if(argc<3) { - fprintf(stderr,"usage: smb2smm <smb_file> <smm.dab>\n\n"); - fprintf(stderr,"example: smb2smm c:\\sbbs\\data\\subs\\syncdata " - "c:\\sbbs\\xtrn\\smm\\smm.dab\n"); - return(1); } - -p=getenv("SBBSNODE"); -if(p==NULL) { - printf("\7\nSBBSNODE environment variable not set.\n"); - exit(1); } -strcpy(str,p); -if(str[strlen(str)-1]!='\\') - strcat(str,"\\"); -strcat(str,"XTRN.DAT"); -if((file=nopen(str,O_RDONLY))==-1 || (stream=fdopen(file,"rb"))==NULL) { - printf("\7\nCan't open %s\n",str); - exit(1); } -fgets(str,81,stream); /* user name */ -fgets(system,81,stream); /* system name */ -truncsp(system); -fgets(str,81,stream); /* sysop name */ -fgets(str,81,stream); /* guru name */ -fgets(str,81,stream); /* ctrl dir */ -fgets(str,81,stream); /* data dir */ -truncsp(str); -if(str[0]=='.') { - strcpy(data_dir,p); /* node dir */ - if(data_dir[strlen(data_dir)-1]!='\\') - strcat(data_dir,"\\"); - strcat(data_dir,str); } -else - strcpy(data_dir,str); -fclose(stream); - -if(argc>3 && !stricmp(argv[3],"/t")) - tgramonly=1; - -if(argc>3 && !stricmp(argv[3],"/w")) - wallonly=1; - -strcpy(smb.file,argv[1]); -strupr(smb.file); - -strcpy(str,argv[2]); -strupr(str); -if((file=open(str,O_RDWR|O_BINARY|O_DENYNONE|O_CREAT,S_IWRITE|S_IREAD))==-1) { - printf("error opening %s\n",str); - return(1); } -if((stream=fdopen(file,"r+b"))==NULL) { - printf("error fdopening %s\n",str); - return(1); } -setvbuf(stream,NULL,_IOFBF,4096); - -p=strrchr(str,'.'); -if(!p) p=str; -else p++; -strcpy(p,"IXB"); -if((file=open(str,O_RDWR|O_BINARY|O_DENYNONE|O_CREAT,S_IWRITE|S_IREAD))==-1) { - printf("error opening %s\n",str); - return(1); } -if((index=fdopen(file,"r+b"))==NULL) { - printf("error fdopening %s\n",str); - return(1); } -setvbuf(index,NULL,_IOFBF,1024); - -p=strrchr(str,'.'); -if(!p) p=str; -else p++; -strcpy(p,"CAN"); -trashfile=NULL; -if((file=open(str,O_RDONLY|O_DENYNONE))!=-1) { - trashfile=fdopen(file,"rb"); - setvbuf(trashfile,NULL,_IOFBF,4096); } - -p=strrchr(str,'.'); -if(!p) p=str; -else p++; -strcpy(p,"CFG"); -if((file=nopen(str,O_RDONLY))==-1) { - printf("error opening %s\n",str); - return(1); } -if((tmpfile=fdopen(file,"rb"))==NULL) { - printf("error fdopening %s\n",str); - return(1); } -fgets(str,128,tmpfile); /* Min purity age */ -fgets(str,128,tmpfile); /* Min profile age */ -truncsp(str); -min_age=atoi(str); -fclose(tmpfile); - -sprintf(str,"%s.SMM",smb.file); -if((file=open(str,O_RDWR|O_BINARY|O_CREAT,S_IWRITE|S_IREAD))==-1) { - printf("error opening %s\n",str); - return(1); } -if(read(file,&last,4)!=4) - last=0; -high=last; - -sprintf(str,"%s.SHD",smb.file); -if(!fexist(str)) { - printf("%s doesn't exist\n",smb.file); - return(0); } -sprintf(str,"%s.SID",smb.file); -if(!flength(str)) { - printf("%s is empty\n",smb.file); - return(0); } -fprintf(stderr,"Opening %s\n",smb.file); -smb.retry_time=30; -if((i=smb_open(&smb))!=0) { - printf("smb_open returned %d\n",i); - return(1); } - -smm=crc16("smm"); -smm_photo=crc16("smm photo"); - -if((i=smb_locksmbhdr(&smb))!=0) { /* Be sure noone deletes or */ - printf("Error locking %d\n",i); /* adds while we're reading */ - return(1); } - -rewind(smb.sid_fp); -while(!feof(smb.sid_fp) && !ferror(smb.sid_fp)) { - if(!fread(&msg.idx,sizeof(idxrec_t),1,smb.sid_fp)) - break; - fprintf(stderr,"\r#%-5lu ",msg.idx.number); - if(msg.idx.to!=smm && msg.idx.to!=smm_photo) - continue; - if(msg.idx.number<=last || msg.idx.attr&MSG_DELETE) - continue; - high=msg.idx.number; - if((i=smb_lockmsghdr(&smb,&msg))!=0) { - printf("\7Error %d locking msg #%lu\n",i,msg.idx.number); - continue; } - if((i=smb_getmsghdr(&smb,&msg))!=0) { - smb_unlockmsghdr(&smb,&msg); - printf("\7Error %d reading msg #%lu\n",i,msg.idx.number); - continue; } - - smb_unlockmsghdr(&smb,&msg); - if(!msg.from_net.type || !strnicmp(msg.from,system,25)) { // ignore local msg - smb_freemsgmem(&msg); - continue; } - - printf("From: %-25.25s To: %-25.25s Subj: %s\n" - ,msg.from,msg.to,msg.subj); - - if(msg.idx.to==smm_photo) { - buf=smb_getmsgtxt(&smb,&msg,0); - if(!buf) { - smb_freemsgmem(&msg); - continue; } - sprintf(str,"%.4s",msg.subj); - l=ahtoul(str); - l^=0x0191; - sprintf(str,"%.8s",msg.subj+4); - system_crc=ahtoul(str); - system_crc^=0x90120e71; - fprintf(stderr,"Searching..."); - - rewind(index); - memset(&user,0,sizeof(user_t)); - while(1) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) { - memset(&user,0,sizeof(user_t)); - break; } - if(ixb.number==l && ixb.system==system_crc) { - fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET); - fseek(stream,(ftell(index)/sizeof(ixb_t))*sizeof(user_t) - ,SEEK_SET); - fread(&user,sizeof(user_t),1,stream); - break; } } - fprintf(stderr,"\n"); - - if(!user.number) { - printf("Profile Not found\n"); - smb_freemsgmem(&msg); - continue; } - - for(i=0;user.system[i];i++) - if(isalnum(user.system[i])) - break; - if(!user.system[i]) - fname[0]='~'; - else - fname[0]=user.system[i]; - for(i=strlen(user.system)-1;i>0;i--) - if(isalnum(user.system[i])) - break; - if(i<=0) - fname[1]='~'; - else - fname[1]=user.system[i]; - fname[2]=0; - strcpy(str,user.system); - strupr(str); - strcat(fname,base41(crc16(str),tmp)); - strcat(fname,base41(user.number,tmp)); - sprintf(str,".%.3s",msg.subj+20); - strcat(fname,str); - strupr(fname); - - if((out=nopen(fname,O_CREAT|O_WRONLY|O_TRUNC))==-1) { - printf("Error opening %s\n",fname); - smb_freemsgmem(&msg); - continue; } - - crc=0xffffffffUL; - esc=0; - for(l=0;buf[l]!=CR;l++) - ; - buf[l]=0; - length=ahtoul((char *)buf)^4096; - l+=2; /* Skip CRLF */ - for(m=0;buf[l] && m<length;l++) { - ch=buf[l]; - if(ch<SP) - continue; - if(ch=='`') { - if(esc) { - write(out,&ch,1); - m++; - crc=ucrc32(ch,crc); - esc=0; } - else - esc=1; - continue; } - if(esc) { - if(isalpha(ch)) { - if(isupper(ch)) - ch-='@'; - else if(ch=='g') - ch=0xe3; - else if(ch=='h') - ch=0x8d; - else if(ch=='i') - ch=0xee; - else - ch=0xfa+(ch-'a'); } - else - ch=0xf0+(ch-'0'); - write(out,&ch,1); - m++; - crc=ucrc32(ch,crc); - esc=0; - continue; } - if(ch>=0xf0) - ch&=0xf; - if(ch==0xee) - ch=0xff; - write(out,&ch,1); - m++; - crc=ucrc32(ch,crc); } - close(out); - crc=~crc; - crc^=0x05296328L; - sprintf(str,"%.8s",msg.subj+12); - smb_freemsgmem(&msg); - if(crc!=ahtoul(str)) { - printf("CRC error!\n"); - remove(fname); - continue; } - sprintf(path,"PHOTO\\%s",fname); - mkdir("PHOTO"); - if(rename(fname,path)) { - printf("Error renaming %s to %s!\n",fname,path); - remove(fname); - continue; } - user.misc|=USER_PHOTO; - fseek(stream,(ftell(index)/sizeof(ixb_t))*sizeof(user_t),SEEK_SET); - fwrite(&user,sizeof(user_t),1,stream); - if(!strnicmp(user.system,system,25)) - putsmsg(user.number - ,"\1n\1h\1mYour photo has been imported into " - "\1wMatch Maker\1n\7\r\n"); - continue; } - - if(!stricmp(msg.subj,"->WALL<-")) { - buf=smb_getmsgtxt(&smb,&msg,0); - smb_freemsgmem(&msg); - if(!buf) - continue; - memset(&wall,0,sizeof(wall_t)); - hp=buf; - while(*hp && *hp<SP) hp++; - for(i=0;*hp>=SP && i<25;i++,hp++) - wall.name[i]=*hp; - wall.name[i]=0; - hp+=2; /* Skip CRLF */ - for(i=0;*hp>=SP && i<40;i++,hp++) - wall.system[i]=*hp; - wall.system[i]=0; - hp+=2; /* Skip CRLF */ - for(i=0;i<5;i++) { - for(j=0;*hp>=SP && j<70;j++,hp++) - wall.text[i][j]=*hp; - wall.text[i][j]=0; - hp+=2; } - - wall.written=ahtoul((char *)hp); - wall.imported=time(NULL); - FREE((char *)buf); - decrypt(wall.name,wall.written); - decrypt(wall.system,wall.written); - for(i=0;i<5;i++) { - decrypt(wall.text[i],wall.written); - if(trash(wall.text[i])) { - printf("Rejected: Wall writing found in trash!\n"); - break; } } - if(i<5) - continue; - if((wallfile=sopen("WALL.DAB",O_WRONLY|O_BINARY|O_CREAT,SH_DENYNO - ,S_IWRITE|S_IREAD))==-1) { - printf("Couldn't open WALL.DAB!\n"); - continue; } - lseek(wallfile,0L,SEEK_END); - write(wallfile,&wall,sizeof(wall_t)); - close(wallfile); - continue; } - - if(wallonly) { - smb_freemsgmem(&msg); - continue; } - - if(!stricmp(msg.subj,"->ALL<-") - || !stricmp(msg.subj,"->SYS<-") - || !stricmp(msg.subj,"->ONE<-")) { - sprintf(str,"%.3s%05lu.MSG",msg.subj+2,msg.idx.number); - buf=smb_getmsgtxt(&smb,&msg,0); - smb_freemsgmem(&msg); - if(!buf) - continue; - l=ahtoul((char *)buf); - if(!l) - continue; - for(i=0;buf[i];i++) - if(buf[i]==LF) - break; - if(buf[i]!=LF) - continue; - if((msgfile=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - printf("error opening %s\n",str); - continue; } - if((tmpfile=fdopen(msgfile,"wb"))==NULL) { - close(msgfile); - printf("error fdopening %s\n",str); - continue; } - fprintf(tmpfile,"%08lx\r\n",l); - l^=0x305F6C81UL; - for(i++;buf[i];i++) - fputc(cryptchar(buf[i],l^(i&7)),tmpfile); - fclose(tmpfile); - putsmsg(1,"\1n\1h\1mNew announcement in \1wMatch Maker\1n\7\r\n"); - continue; } - - - j=strlen(msg.subj); - for(i=0;i<j;i++) - if(!isdigit(msg.subj[i])) - break; - if(i<j) { /* at least one non-digit, must be telegram */ - if(strnicmp(msg.subj,system,25)) { - smb_freemsgmem(&msg); - continue; } - buf=smb_getmsgtxt(&smb,&msg,0); - smb_freemsgmem(&msg); - if(!buf) - continue; - l=0; - while(buf[l] && buf[l]!='}') /* Find first text on line */ - l++; - if(!buf[l] || !buf[++l]) { - FREE(buf); - continue; } - touser=ahtoul((char *)buf+l); - while(buf[l] && buf[l]>=SP) /* Go to end of line */ - l++; - while(buf[l] && buf[l]<=SP) /* next line */ - l++; - i=0; - while(buf[l]) { - if(buf[l]==LF && buf[l+1]==CR) { /* blank line */ - telegram[i++]=LF; - break; } - telegram[i++]=buf[l++]; } - telegram[i]=0; - decrypt(telegram,touser); - printf("Telegram to %u\n",touser); - if(trash(telegram)) - printf("Rejected: Contents in trash!\n"); - else { - putsmsg(touser,TGRAM_NOTICE); - puttgram(touser,telegram); } - FREE(buf); - continue; - } - - if(tgramonly) { - smb_freemsgmem(&msg); - continue; } - - if(!msg.from[0]) { - smb_freemsgmem(&msg); - printf("Blank 'from' field.\n"); - continue; } - - l=atol(msg.subj); - if(!l || l>65535L) { - smb_freemsgmem(&msg); - printf("Invalid profile.\n"); - continue; } - fprintf(stderr,"Searching for %lu @ %s",l,msg.from); - sprintf(str,"%.25s",msg.from); - strupr(str); - system_crc=crc32(str); - - rewind(index); - memset(&user,0,sizeof(user_t)); - while(1) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) { - memset(&user,0,sizeof(user_t)); - break; } - if(ixb.number==l && ixb.system==system_crc) { - fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET); - fseek(stream,(ftell(index)/sizeof(ixb_t))*sizeof(user_t),SEEK_SET); - fread(&user,sizeof(user_t),1,stream); - if(!(user.misc&USER_FROMSMB)) { - memset(&user,0,sizeof(user_t)); - fread(&ixb,sizeof(ixb_t),1,index); - continue; } - break; } } - fprintf(stderr,"\n"); - - if(!user.number) { - fprintf(stderr,"Searching for unused record..."); - rewind(index); - while(1) { /* Find deleted record */ - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(ixb.number==0) { - fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET); - break; } } - user.created=time(NULL); - user.number=l; - sprintf(user.system,"%-.40s",msg.from); - fprintf(stderr,"\n"); } - - fseek(stream,(ftell(index)/sizeof(ixb_t))*sizeof(user_t),SEEK_SET); - user.updated=time(NULL); - user.misc|=USER_FROMSMB; - buf=smb_getmsgtxt(&smb,&msg,0); - l=0; - while(buf[l]) { - while(buf[l] && buf[l]<=SP) /* Find first text on line */ - l++; - if(!strnicmp((char *)buf+l,"0:",2)) { - l+=2; - sprintf(user.name,"%-.25s",(char *)buf+l); - truncsp(user.name); - decrypt(user.name,user.number); } - if(!strnicmp((char *)buf+l,"1:",2)) { - l+=2; - sprintf(user.realname,"%-.25s",(char *)buf+l); - truncsp(user.realname); - decrypt(user.realname,user.number); } - if(!strnicmp((char *)buf+l,"2:",2)) { - l+=2; - sprintf(user.birth,"%-.8s",(char *)buf+l); - decrypt(user.birth,user.number); } - if(!strnicmp((char *)buf+l,"3:",2)) { - l+=2; - sprintf(user.location,"%-.30s",(char *)buf+l); - truncsp(user.location); - decrypt(user.location,user.number); } - if(!strnicmp((char *)buf+l,"4:",2)) { - l+=2; - sprintf(user.zipcode,"%-.10s",(char *)buf+l); - truncsp(user.zipcode); - decrypt(user.zipcode,user.number); } - if(!strnicmp((char *)buf+l,"5:",2)) { - l+=2; - sprintf(user.min_zipcode,"%-.10s",(char *)buf+l); - truncsp(user.min_zipcode); - decrypt(user.min_zipcode,user.number); } - if(!strnicmp((char *)buf+l,"6:",2)) { - l+=2; - sprintf(user.max_zipcode,"%-.10s",(char *)buf+l); - truncsp(user.max_zipcode); - decrypt(user.max_zipcode,user.number); } - if(!strnicmp((char *)buf+l,"7:",2)) { - l+=2; - sprintf(user.mbtype,"%-.4s",(char *)buf+l); - truncsp(user.mbtype); - decrypt(user.mbtype,user.number); } - - if(!strnicmp((char *)buf+l,"A:",2)) { - l+=2; - sprintf(user.note[0],"%-.50s",(char *)buf+l); - truncsp(user.note[0]); - decrypt(user.note[0],user.number); } - if(!strnicmp((char *)buf+l,"B:",2)) { - l+=2; - sprintf(user.note[1],"%-.50s",(char *)buf+l); - truncsp(user.note[1]); - decrypt(user.note[1],user.number); } - if(!strnicmp((char *)buf+l,"C:",2)) { - l+=2; - sprintf(user.note[2],"%-.50s",(char *)buf+l); - truncsp(user.note[2]); - decrypt(user.note[2],user.number); } - if(!strnicmp((char *)buf+l,"D:",2)) { - l+=2; - sprintf(user.note[3],"%-.50s",(char *)buf+l); - truncsp(user.note[3]); - decrypt(user.note[3],user.number); } - if(!strnicmp((char *)buf+l,"E:",2)) { - l+=2; - sprintf(user.note[4],"%-.50s",(char *)buf+l); - truncsp(user.note[4]); - decrypt(user.note[4],user.number); } - - if(!strnicmp((char *)buf+l,"F:",2)) { - l+=2; - user.sex=buf[l]; - user.pref_sex=buf[l+1]; } - - if(!strnicmp((char *)buf+l,"G:",2)) { - l+=2; - user.marital=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"H:",2)) { - l+=2; - user.pref_marital=ahtoul((char *)buf+l); } - - if(!strnicmp((char *)buf+l,"I:",2)) { - l+=2; - user.race=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"J:",2)) { - l+=2; - user.pref_race=ahtoul((char *)buf+l); } - - if(!strnicmp((char *)buf+l,"K:",2)) { - l+=2; - user.hair=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"L:",2)) { - l+=2; - user.pref_hair=ahtoul((char *)buf+l); } - - if(!strnicmp((char *)buf+l,"M:",2)) { - l+=2; - user.eyes=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"N:",2)) { - l+=2; - user.pref_eyes=ahtoul((char *)buf+l); } - - if(!strnicmp((char *)buf+l,"O:",2)) { - l+=2; - user.weight=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"P:",2)) { - l+=2; - user.min_weight=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"Q:",2)) { - l+=2; - user.max_weight=ahtoul((char *)buf+l); } - - if(!strnicmp((char *)buf+l,"R:",2)) { - l+=2; - user.height=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"S:",2)) { - l+=2; - user.min_height=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"T:",2)) { - l+=2; - user.max_height=ahtoul((char *)buf+l); } - - if(!strnicmp((char *)buf+l,"U:",2)) { - l+=2; - user.min_age=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"V:",2)) { - l+=2; - user.max_age=ahtoul((char *)buf+l); } - - if(!strnicmp((char *)buf+l,"W:",2)) { - l+=2; - user.purity=ahtoul((char *)buf+l); } - - if(!strnicmp((char *)buf+l,"X:",2)) { - l+=2; - user.income=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"Y:",2)) { - l+=2; - user.min_income=ahtoul((char *)buf+l); } - if(!strnicmp((char *)buf+l,"Z:",2)) { - l+=2; - user.max_income=ahtoul((char *)buf+l); } - - if(toupper(buf[l])=='*' && isdigit(buf[l+1])) { /* Questionnaires */ - i=buf[l+1]-'0'; - l+=2; - sprintf(user.queans[i].name,"%-.8s",(char *)buf+l); - truncsp(user.queans[i].name); - decrypt(user.queans[i].name,user.number); - while(buf[l] && buf[l]>=SP) l++; /* Go to end of line */ - for(j=0;j<20;j++) { - while(buf[l] && buf[l]<=SP) l++; - user.queans[i].self[j]=ahtoul((char *)buf+l); - l+=5; - user.queans[i].pref[j]=ahtoul((char *)buf+l); - l+=5; } } - - while(buf[l] && buf[l]>=SP) /* Go to end of line */ - l++; } - - if(getage(user.birth)<min_age) /* Too young */ - printf("Rejected: User's age (%u) less than minimum age (%u)\n" - ,getage(user.birth),min_age); - else if(user.name[0]<SP || user.realname[0]<SP || user.system[0]<SP - || user.location[0]<SP || user.zipcode[0]<SP || user.birth[0]<SP) - printf("Rejected: Invalid user string\n"); - else if(trash(user.name)) - printf("Rejected: User's name (%s) in trash!\n",user.name); - else if(trash(user.location)) - printf("Rejected: User's location (%s) in trash!\n",user.location); - else if(trash(user.note[0]) || trash(user.note[1]) || trash(user.note[2]) - || trash(user.note[3]) || trash(user.note[4])) - printf("Rejected: User's personal text in trash!\n"); - else { - fwrite(&user,sizeof(user_t),1,stream); - strupr(user.name); - ixb.name=crc32(user.name); - strupr(user.system); - user.system[25]=0; - ixb.system=crc32(user.system); - ixb.number=user.number; - ixb.updated=user.updated; - fwrite(&ixb,sizeof(ixb_t),1,index); } - FREE((char *)buf); - smb_freemsgmem(&msg); - } - -lseek(file,0L,SEEK_SET); -write(file,&high,4); -close(file); -return(0); -} - diff --git a/src/sbbs2/smm/smm.c b/src/sbbs2/smm/smm.c deleted file mode 100644 index d71d058266..0000000000 --- a/src/sbbs2/smm/smm.c +++ /dev/null @@ -1,3993 +0,0 @@ -/* SMM.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Synchronet Match Maker */ - -#include "xsdk.h" -#include "crc32.h" -#include "smmdefs.h" -#include "smmvars.c" - -/* RCIOLL.ASM */ - -int rioini(int com,int irq); /* initialize com,irq */ -int setbaud(int rate); /* set baud rate */ -int rioctl(int action); /* remote i/o control */ -int dtr(char onoff); /* set/reset dtr */ -int outcom(int ch); /* send character */ -int incom(void); /* receive character */ -int ivhctl(int intcode); /* local i/o redirection */ - -/************************/ -/* Remote I/O Constants */ -/************************/ - - /* i/o mode and state flags */ -#define CTSCK 0x1000 /* check cts (mode only) */ -#define RTSCK 0x2000 /* check rts (mode only) */ -#define TXBOF 0x0800 /* transmit buffer overflow (outcom only) */ -#define ABORT 0x0400 /* check for ^C (mode), aborting (state) */ -#define PAUSE 0x0200 /* check for ^S (mode), pausing (state) */ -#define NOINP 0x0100 /* input buffer empty (incom only) */ - - /* status flags */ -#define RIODCD 0x80 /* DCD on */ -#define RI 0x40 /* Ring indicate */ -#define DSR 0x20 /* Dataset ready */ -#define CTS 0x10 /* CTS on */ -#define FERR 0x08 /* Frameing error */ -#define PERR 0x04 /* Parity error */ -#define OVRR 0x02 /* Overrun */ -#define RXLOST 0x01 /* Receive buffer overflow */ - -/* rioctl() arguments */ -/* returns mode or state flags in high 8 bits, status flags in low 8 bits */ - - /* the following return mode in high 8 bits */ -#define IOMODE 0 /* no operation */ -#define IOSM 1 /* i/o set mode flags */ -#define IOCM 2 /* i/o clear mode flags */ - /* the following return state in high 8 bits */ -#define IOSTATE 4 /* no operation */ -#define IOSS 5 /* i/o set state flags */ -#define IOCS 6 /* i/o clear state flags */ -#define IOFB 0x308 /* i/o buffer flush */ -#define IOFI 0x208 /* input buffer flush */ -#define IOFO 0x108 /* output buffer flush */ -#define IOCE 9 /* i/o clear error flags */ - - /* return count (16bit) */ -#define RXBC 0x0a /* get receive buffer count */ -#define TXBC 0x0b /* get transmit buffer count */ -#define TXSYNC 0x0c /* sync transmition (seconds<<8|0x0c) */ -#define IDLE 0x0d /* suspend communication routines */ -#define RESUME 0x10d /* return from suspended state */ -#define RLERC 0x000e /* read line error count and clear */ -#define CPTON 0x0110 /* set input translation flag for ctrl-p on */ -#define CPTOFF 0x0010 /* set input translation flag for ctrl-p off */ -#define GETCPT 0x8010 /* return the status of ctrl-p translation */ -#define MSR 0x0011 /* read modem status register */ -#define FIFOCTL 0x0012 /* FIFO UART control */ -#define TSTYPE 0x0013 /* Time-slice API type */ -#define GETTST 0x8013 /* Get Time-slice API type */ - - -#define I14DB 0x001d /* DigiBoard int 14h driver */ -#define I14PC 0x011d /* PC int 14h driver */ -#define I14PS 0x021d /* PS/2 int 14h driver */ -#define I14FO 0x031d /* FOSSIL int 14h driver */ - - - /* ivhctl() arguments */ -#define INT29R 1 /* copy int 29h output to remote */ -#define INT29L 2 /* Use _putlc for int 29h */ -#define INT16 0x10 /* return remote chars to int 16h calls */ -#define INTCLR 0 /* release int 16h, int 29h */ - -#define CLREOL 256 /* Character to erase to end of line */ -#define HIGH 8 /* High intensity for curatr */ - -extern uint riobp; -extern int mswtyp; - -unsigned _stklen=16000; /* Set stack size in code, not header */ - -int cbreakh(void); /* ctrl-break handler */ - -char getage(char *birth); -char long_user_info(user_t user); -void main_user_info(user_t user); - -char *nulstr=""; -char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec"}; -char tmp[256],door_sys[128]; - -char io_int=0; -struct date date; -struct time curtime; -time_t now; -int smm_pause=1,node_scrnlen; -questionnaire_t *que[5]; -int total_ques; -user_t useron,tmpuser; -ixb_t ixb; -ulong useron_record,system_crc; -FILE *stream,*index,*trashfile; - -char *PrevReadSendQuitOrMore="\r\n\1n\1b\1h[\1cP\1b]revious screen, " - "[\1cR\1b]ead profile, [\1cS\1b]end telegram, [\1cQ\1b]uit, or " - "[\1cM\1b]ore: \1w"; - -int intocm(int in) -{ -return(in*2.538071); -} - -int cmtoin(int cm) -{ - int i; - -i=cm*0.394; -if(((float)cm*0.394)-(float)i>=.5) - i++; -return(i); -} - -int kgtolp(int kg) -{ -return(kg*2.2046); -} - -int lptokg(int lp) -{ - int i; - -i=lp*0.453597; -if(((float)lp*0.453597)-(float)i>=.5) - i++; -return(i); -} - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) { - char sbuf[256]; - int chcount; - -chcount=vsprintf(sbuf,fmat,_va_ptr); -lputs(sbuf); -return(chcount); -} - -/*****************************************************************************/ -/* Returns command line generated from instr with %c replacments */ -/*****************************************************************************/ -char *cmdstr(char *instr, char *fpath, char *fspec, char *outstr) -{ - static char static_cmd[128]; - char str[256],str2[128],*cmd; - int i,j,len; - -if(outstr==NULL) - cmd=static_cmd; -else - cmd=outstr; -len=strlen(instr); -for(i=j=0;i<len && j<128;i++) { - if(instr[i]=='%') { - i++; - cmd[j]=0; - switch(toupper(instr[i])) { - case 'A': /* User alias */ - strcat(cmd,user_name); - break; - case 'B': /* Baud (DTE) Rate */ - strcat(cmd,ultoa(com_rate,str,10)); - break; - case 'C': /* Connect Description */ - strcat(cmd,ultoa(user_dce,str,10)); - break; - case 'F': /* File path */ - strcat(cmd,fpath); - break; - case 'G': /* Temp directory */ - strcat(cmd,temp_dir); - break; - case 'I': /* UART IRQ Line */ - strcat(cmd,itoa(com_irq,str,10)); - break; - case 'J': - strcat(cmd,data_dir); - break; - case 'K': - strcat(cmd,ctrl_dir); - break; - case 'N': /* Node Directory (same as SBBSNODE environment var) */ - strcat(cmd,node_dir); - break; - case 'O': /* SysOp */ - strcat(cmd,sys_op); - break; - case 'P': /* COM Port */ - strcat(cmd,itoa(com_port,str,10)); - break; - case 'Q': /* QWK ID */ - strcat(cmd,sys_id); - break; - case 'R': /* Rows */ - strcat(cmd,itoa(user_rows,str,10)); - break; - case 'S': /* File Spec */ - strcat(cmd,fspec); - break; - case 'T': /* Time left in seconds */ - strcat(cmd,itoa(time(NULL)-starttime,str,10)); - break; - case 'U': /* UART I/O Address (in hex) */ - strcat(cmd,itoa(com_base,str,16)); - break; - case 'W': /* Time-slice API type (mswtype) */ -#ifndef __OS2__ - strcat(cmd,itoa(mswtyp,str,10)); -#endif - break; - case '&': /* Address of msr */ - sprintf(str,"%lu",&riobp-1); - strcat(cmd,str); - break; - case 'Z': - strcat(cmd,text_dir); - break; - case '!': /* EXEC Directory */ - strcat(cmd,exec_dir); - break; - case '#': /* Node number (same as SBBSNNUM environment var) */ - sprintf(str,"%d",node_num); - strcat(cmd,str); - break; - case '*': - sprintf(str,"%03d",node_num); - strcat(cmd,str); - break; - case '$': /* Credits */ - strcat(cmd,ultoa(user_cdt,str,10)); - break; - case '%': /* %% for percent sign */ - strcat(cmd,"%"); - break; - default: /* unknown specification */ - if(isdigit(instr[i])) { - sprintf(str,"%0*d",instr[i]&0xf,user_number); - strcat(cmd,str); } - break; } - j=strlen(cmd); } - else - cmd[j++]=instr[i]; } -cmd[j]=0; - -return(cmd); -} - -char *base41(unsigned int i, char *str) -{ - char c; - unsigned int j=41*41,k; - -for(c=0;c<3;c++) { - k=i/j; - str[c]='0'+k; - i-=(k*j); - j/=41; - if(str[c]>=':') - str[c]='A'+(str[c]-':'); - if(str[c]>='[') - str[c]='#'+(str[c]-'['); } -str[c]=0; -return(str); -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - - -int cdt_warning(long cdt) -{ -if(cdt==0) - return(1); -if(cdt>0) { - bprintf("\1m\1hYou will receive \1w%luk\1m in credits for this action!\r\n" - ,cdt/1024L); - return(1); } - -bprintf("\1m\1hThis action will cost you \1w%luk\1m in credits.",(-cdt)/1024L); -if(user_cdt+cdt_adjustment<-cdt) { - bprintf("\r\n\r\n\1r\1hSorry, you only have \1w%luk\1m in credits.\r\n" - ,(user_cdt+cdt_adjustment)/1024L); - return(0); } -return(!noyes(" Continue")); -} - -void adjust_cdt(long cdt) -{ -if(cdt==0) - return; -cdt_adjustment+=cdt; -} - -int got_flags(char *req, char *got) -{ - int i,j; - -for(i=0;req[i];i++) { - for(j=0;got[j];j++) - if(req[i]==got[j]) - break; - if(!got[j]) - break; } -if(!req[i]) - return(1); -return(0); -} - -int can_add() -{ - uchar age=getage(user_birth); - -if(user_level<min_level || (age && getage(user_birth)<min_age) - || !got_flags(req_flags1,user_flags1) - || !got_flags(req_flags2,user_flags2) - || !got_flags(req_flags3,user_flags3) - || !got_flags(req_flags4,user_flags4) - ) - return(0); -return(1); -} - - -int trash(char *instr) -{ - char str[128],word[128]; - -if(!trashfile) - return(0); -strcpy(str,instr); -strupr(str); -rewind(trashfile); -while(!ferror(trashfile)) { - if(!fgets(word,125,trashfile)) - break; - truncsp(word); - if(!word[0]) - continue; - strupr(word); - if(strstr(str,word)) - return(1); } -return(0); -} - -long fdate_dir(char *filespec) -{ - struct ffblk f; - struct date fd; - struct time ft; - -if(findfirst(filespec,&f,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC)==NULL) { - fd.da_day=f.ff_fdate&0x1f; - fd.da_mon=(f.ff_fdate>>5)&0xf; - fd.da_year=1980+((f.ff_fdate>>9)&0x7f); - ft.ti_hour=(f.ff_ftime>>11)&0x1f; - ft.ti_min=(f.ff_ftime>>5)&0x3f; - ft.ti_sec=(f.ff_ftime&0xf)*2; - return(dostounix(&fd,&ft)); } -else return(NULL); -} - -/****************************************************************************/ -/* Generates a 24 character ASCII string that represents the time_t pointer */ -/* Used as a replacement for ctime() */ -/****************************************************************************/ -char *timestr(time_t *intime) -{ - static char str[256]; - char mer[3],hour; - struct tm *gm; - -gm=localtime(intime); -if(gm->tm_hour>=12) { - if(gm->tm_hour==12) - hour=12; - else - hour=gm->tm_hour-12; - strcpy(mer,"pm"); } -else { - if(gm->tm_hour==0) - hour=12; - else - hour=gm->tm_hour; - strcpy(mer,"am"); } -sprintf(str,"%s %s %02d %4d %02d:%02d %s" - ,wday[gm->tm_wday],mon[gm->tm_mon],gm->tm_mday,1900+gm->tm_year - ,hour,gm->tm_min,mer); -return(str); -} - - -void puttgram(int usernumber, char *strin) -{ - char str[256]; - int file,i; - -sprintf(str,"%4.4u.MSG",usernumber); -if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - printf("\7Error opening/creating %s for creat/append access\n",str); - return; } -i=strlen(strin); -if(write(file,strin,i)!=i) { - close(file); - printf("\7Error writing %u bytes to %s\n",i,str); - return; } -close(file); -} - - -int send_telegram(user_t user) -{ - uchar str[256],line[256],buf[1024]; - int i; - -if(!useron.number) { - bputs("\r\n\1h\1rYou must create a profile first.\r\n"); - pause(); - return(1); } - -if(user_level<telegram_level) { - bputs("\r\n\1h\1rYou have insufficient access to send telegrams." - "\r\n"); - pause(); - return(1); } - -main_user_info(user); -CRLF; -if(!cdt_warning(telegram_cdt)) - return(0); -if(telegram_cdt) - CRLF; -bprintf("\1n\1hSending a telegram to \1y%s\1w:\r\n\r\n" - ,user.name); -now=time(NULL); -memset(buf,0,512); -sprintf(buf,"\1n\1c\1hMatch Maker\1b telegram from \1c%s\1b " - "on %s:\1y\r\n" - ,useron.name,timestr(&now)); -for(i=0;i<5 && !aborted;i++) { - bprintf("\1n\1h\1g%u of 5: \1n\1g",i+1); - if(!getstr(line,70,i==4 ? K_MSG:K_MSG|K_WRAP)) - break; - sprintf(str,"\1n\1g%4s%s\r\n",nulstr,line); - strcat(buf,str); } -if(!i || aborted || !yesno("\r\nSave")) - return(0); -if(!(user.misc&USER_FROMSMB)) { - putsmsg(user.number,TGRAM_NOTICE); - puttgram(user.number,buf); } -else { - if((i=nopen("TELEGRAM.DAB",O_WRONLY|O_CREAT|O_APPEND|SH_DENYNO)) - ==-1) { - bprintf("\r\n\1r\1h\1iError writing telegram!\r\n"); - pause(); - return(1); } - write(i,useron.system,sizeof(useron.system)); - write(i,user.system,sizeof(user.system)); - write(i,&user.number,sizeof(user.number)); - write(i,buf,512); - close(i); } -adjust_cdt(telegram_cdt); -if(notify_user && notify_user!=user_number) { - sprintf(str,"\1n\1hSMM: \1y%s\1m sent a telegram to \1y%s\1m " - "from the Match Maker\r\n",user_name,user.name); - if(node_dir[0]) - putsmsg(notify_user,str); - else - puttgram(notify_user,str); } -return(1); -} - -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - -if(!unix) - strcpy(str,"00/00/00"); -else { - unixtodos(unix,&date,&curtime); - if((unsigned)date.da_mon>12) { /* DOS leap year bug */ - date.da_mon=1; - date.da_year++; } - if((unsigned)date.da_day>31) - date.da_day=1; - sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day - ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); } -return(str); -} - -/****************************************************************************/ -/* Converts a date string in format MM/DD/YY into unix time format */ -/****************************************************************************/ -time_t dstrtounix(char *str) -{ - -if(!strcmp(str,"00/00/00") || !str[0]) - return(NULL); -curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0; -if(str[6]<'7') - date.da_year=2000+((str[6]&0xf)*10)+(str[7]&0xf); -else - date.da_year=1900+((str[6]&0xf)*10)+(str[7]&0xf); -date.da_mon=((str[0]&0xf)*10)+(str[1]&0xf); -date.da_day=((str[3]&0xf)*10)+(str[4]&0xf); -return(dostounix(&date,&curtime)); -} - -/****************************************************************************/ -/* Returns the age derived from the string 'birth' in the format MM/DD/YY */ -/****************************************************************************/ -char getage(char *birth) -{ - char age; - -if(birth[0]<=SP) - return(0); -getdate(&date); -age=(date.da_year-1900)-(((birth[6]&0xf)*10)+(birth[7]&0xf)); -if(age>90) - age-=90; -if(atoi(birth)>12 || atoi(birth+3)>31) - return(0); -if(((birth[0]&0xf)*10)+(birth[1]&0xf)>date.da_mon || - (((birth[0]&0xf)*10)+(birth[1]&0xf)==date.da_mon && - ((birth[3]&0xf)*10)+(birth[4]&0xf)>date.da_day)) - age--; -if(age<0) - return(0); -return(age); -} - -char marital_ch(char user_marital) -{ -switch(user_marital) { - case MARITAL_SINGLE: - return('S'); - case MARITAL_DIVORCED: - return('D'); - case MARITAL_MARRIED: - return('M'); - case MARITAL_WIDOWED: - return('W'); - case MARITAL_OTHER: - return('O'); } -if(user_marital) - return('*'); -return(SP); -} - -char race_ch(char user_race) -{ -switch(user_race) { - case RACE_WHITE: - return('W'); - case RACE_BLACK: - return('B'); - case RACE_HISPANIC: - return('H'); - case RACE_AMERINDIAN: - return('I'); - case RACE_ASIAN: - return('A'); - case RACE_MIDEASTERN: - return('M'); - case RACE_OTHER: - return('O'); } -if(user_race) - return('*'); -return(SP); -} - -char *hair(char user_hair) -{ -switch(user_hair) { - case HAIR_BLONDE: - return("BLN"); - case HAIR_BROWN: - return("BRN"); - case HAIR_RED: - return("RED"); - case HAIR_BLACK: - return("BLK"); - case HAIR_GREY: - return("GRY"); - case HAIR_OTHER: - return("OTH"); } -if(user_hair) - return("*"); -return(nulstr); -} - -char *eyes(char user_eyes) -{ -switch(user_eyes) { - case EYES_BLUE: - return("BLU"); - case EYES_BROWN: - return("BRN"); - case EYES_GREEN: - return("GRN"); - case EYES_HAZEL: - return("HAZ"); - case EYES_OTHER: - return("OTH"); } -if(user_eyes) - return("*"); -return(nulstr); -} - -char *marital(char user_marital) -{ -switch(user_marital) { - case MARITAL_SINGLE: - return("Single"); - case MARITAL_MARRIED: - return("Married"); - case MARITAL_DIVORCED: - return("Divorced"); - case MARITAL_WIDOWED: - return("Widowed"); - case MARITAL_OTHER: - return("Other"); } -if(user_marital) - return("*"); -return(nulstr); -} - -char *race(char user_race) -{ -switch(user_race) { - case RACE_WHITE: - return("White"); - case RACE_BLACK: - return("Black"); - case RACE_HISPANIC: - return("Hispanic"); - case RACE_ASIAN: - return("Asian"); - case RACE_AMERINDIAN: - return("American Indian"); - case RACE_MIDEASTERN: - return("Middle Eastern"); - case RACE_OTHER: - return("Other"); } -if(user_race) - return("*"); -return(nulstr); -} - -ushort getzodiac(char *birth) -{ -if((!strncmp(birth,"03",2) && atoi(birth+3)>=21) - || (!strncmp(birth,"04",2) && atoi(birth+3)<=19)) - return(ZODIAC_ARIES); -if((!strncmp(birth,"04",2) && atoi(birth+3)>=20) - || (!strncmp(birth,"05",2) && atoi(birth+3)<=20)) - return(ZODIAC_TAURUS); -if((!strncmp(birth,"05",2) && atoi(birth+3)>=21) - || (!strncmp(birth,"06",2) && atoi(birth+3)<=20)) - return(ZODIAC_GEMINI); -if((!strncmp(birth,"06",2) && atoi(birth+3)>=21) - || (!strncmp(birth,"07",2) && atoi(birth+3)<=22)) - return(ZODIAC_CANCER); -if((!strncmp(birth,"07",2) && atoi(birth+3)>=23) - || (!strncmp(birth,"08",2) && atoi(birth+3)<=22)) - return(ZODIAC_LEO); -if((!strncmp(birth,"08",2) && atoi(birth+3)>=23) - || (!strncmp(birth,"09",2) && atoi(birth+3)<=22)) - return(ZODIAC_VIRGO); -if((!strncmp(birth,"09",2) && atoi(birth+3)>=23) - || (!strncmp(birth,"10",2) && atoi(birth+3)<=22)) - return(ZODIAC_LIBRA); -if((!strncmp(birth,"10",2) && atoi(birth+3)>=23) - || (!strncmp(birth,"11",2) && atoi(birth+3)<=21)) - return(ZODIAC_SCORPIO); -if((!strncmp(birth,"11",2) && atoi(birth+3)>=22) - || (!strncmp(birth,"12",2) && atoi(birth+3)<=21)) - return(ZODIAC_SAGITTARIUS); -if((!strncmp(birth,"12",2) && atoi(birth+3)>=22) - || (!strncmp(birth,"01",2) && atoi(birth+3)<=19)) - return(ZODIAC_CAPRICORN); -if((!strncmp(birth,"01",2) && atoi(birth+3)>=20) - || (!strncmp(birth,"02",2) && atoi(birth+3)<=18)) - return(ZODIAC_AQUARIUS); -if((!strncmp(birth,"02",2) && atoi(birth+3)>=19) - || (!strncmp(birth,"03",2) && atoi(birth+3)<=20)) - return(ZODIAC_PISCES); -return(0xff); -} - -char *zodiac(short user_zodiac) -{ -switch(user_zodiac) -{ - case ZODIAC_ARIES: - return("Aries"); - case ZODIAC_TAURUS: - return("Taurus"); - case ZODIAC_GEMINI: - return("Gemini"); - case ZODIAC_CANCER: - return("Cancer"); - case ZODIAC_LEO: - return("Leo"); - case ZODIAC_VIRGO: - return("Virgo"); - case ZODIAC_LIBRA: - return("Libra"); - case ZODIAC_SCORPIO: - return("Scorpio"); - case ZODIAC_SAGITTARIUS: - return("Sagittarius"); - case ZODIAC_CAPRICORN: - return("Capricorn"); - case ZODIAC_AQUARIUS: - return("Aquarius"); - case ZODIAC_PISCES: - return("Pisces"); } -return(nulstr); -} - -short ans2bits(char *str) -{ - int i,j; - ushort bits=0; - -j=strlen(str); -for(i=0;i<j;i++) { - if(str[i]=='*') - return(0xffff); - bits|=(1<<str[i]-'A'); } -return(bits); -} - -uchar ans2uchar(char *str) -{ - int i,j; - uchar bits=0; - -j=strlen(str); -for(i=0;i<j;i++) { - if(str[i]=='*') - return(0xff); - bits|=(1<<str[i]-'A'); } -return(bits); -} - - -void bits2ans(ushort bits, char *str) -{ - char tmp[25]; - int i; - -str[0]=0; -if(bits==0xffff) { - strcpy(str,"*"); - return; } -for(i=0;i<16;i++) - if(bits&(1<<i)) { - tmp[0]='A'+i; - tmp[1]=0; - strcat(str,tmp); } -} - -void bits2str(ushort user, char *str) -{ - int i; - -str[0]=0; -if(user==0xffff) { - strcpy(str,"*"); - return; } -for(i=0;i<16;i++) - if(user&(1<<i)) - str[i]='A'+i; - else - str[i]=SP; -str[i]=0; -} - -void uchar2ans(uchar bits, char *str) -{ - char tmp[25]; - int i; - -str[0]=0; -if(bits==0xff) { - strcpy(str,"*"); - return; } -for(i=0;i<8;i++) - if(bits&(1<<i)) { - tmp[0]='A'+i; - tmp[1]=0; - strcat(str,tmp); } -} - -int basic_match(user_t user, user_t mate) -{ - int max=0,match=0,age=getage(mate.birth),zodiac=getzodiac(mate.birth); - -if(user.pref_sex!='*' && user.pref_sex!=mate.sex - && !(user.misc&USER_FRIEND)) - return(0); - -if(zodiac&user.pref_zodiac) match++; -else if(user.misc&USER_REQZODIAC) - return(0); -if(zodiac==user.pref_zodiac) match++; -max+=2; - -if(stricmp(mate.zipcode,user.min_zipcode)>=0 - && stricmp(mate.zipcode,user.max_zipcode)<=0) match+=2; -else if(user.misc&USER_REQZIP) return(0); -max+=2; - -if(mate.marital&user.pref_marital) match++; -else if(user.misc&USER_REQMARITAL) - return(0); -if(mate.marital==user.pref_marital) match++; -max+=2; - -if(mate.race&user.pref_race) match++; -else if(user.misc&USER_REQRACE) - return(0); -if(mate.race==user.pref_race) match++; -max+=2; - -if(mate.hair&user.pref_hair) match++; -else if(user.misc&USER_REQHAIR) - return(0); -if(mate.hair==user.pref_hair) match++; -max+=2; - -if(mate.eyes&user.pref_eyes) match++; -else if(user.misc&USER_REQEYES) - return(0); -if(mate.eyes==user.pref_eyes) match++; -max+=2; - -if(age>=user.min_age - && (!user.max_age || age<=user.max_age)) match+=2; -else { - if(user.misc&USER_REQAGE) return(0); - if(age<user.min_age-((user.max_age-user.min_age)/2) - || (user.max_age && age>user.max_age+((user.max_age-user.min_age)/2))) - match-=4; - else if(age<user.min_age-((user.max_age-user.min_age)/3) - || (user.max_age && age>user.max_age+((user.max_age-user.min_age)/3))) - match-=3; - else if(age<user.min_age-((user.max_age-user.min_age)/4) - || (user.max_age && age>user.max_age+((user.max_age-user.min_age)/4))) - match-=2; - else if(age<user.min_age-((user.max_age-user.min_age)/5) - || (user.max_age && age>user.max_age+((user.max_age-user.min_age)/5))) - match--; } - -max+=2; - -if(mate.weight>=user.min_weight - && (!user.max_weight || mate.weight<=user.max_weight)) match+=2; -else { - if(user.misc&USER_REQWEIGHT) return(0); - if(mate.weight<user.min_weight-((user.max_weight-user.min_weight)/2) - || (user.max_weight - && mate.weight>user.max_weight+((user.max_weight-user.min_weight)/2))) - match-=4; - else if(mate.weight<user.min_weight-((user.max_weight-user.min_weight)/3) - || (user.max_weight - && mate.weight>user.max_weight+((user.max_weight-user.min_weight)/3))) - match-=3; - else if(mate.weight<user.min_weight-((user.max_weight-user.min_weight)/4) - || (user.max_weight - && mate.weight>user.max_weight+((user.max_weight-user.min_weight)/4))) - match-=2; - else if(mate.weight<user.min_weight-((user.max_weight-user.min_weight)/5) - || (user.max_weight - && mate.weight>user.max_weight+((user.max_weight-user.min_weight)/5))) - match--; } -max+=2; - -if(mate.height>=user.min_height - && (!user.max_height || mate.height<=user.max_height)) match+=2; -else { - if(user.misc&USER_REQHEIGHT) return(0); - if(mate.height<user.min_height-((user.max_height-user.min_height)/2) - || (user.max_height - && mate.height>user.max_height+((user.max_height-user.min_height)/2))) - match-=4; - else if(mate.height<user.min_height-((user.max_height-user.min_height)/3) - || (user.max_height - && mate.height>user.max_height+((user.max_height-user.min_height)/3))) - match-=3; - else if(mate.height<user.min_height-((user.max_height-user.min_height)/4) - || (user.max_height - && mate.height>user.max_height+((user.max_height-user.min_height)/4))) - match-=2; - else if(mate.height<user.min_height-((user.max_height-user.min_height)/5) - || (user.max_height - && mate.height>user.max_height+((user.max_height-user.min_height)/5))) - match--; } -max+=2; - -if(mate.income>=user.min_income - && (!user.max_income || mate.income==0xffffffffUL - || mate.income<=user.max_income)) match++; -else { - if(user.misc&USER_REQINCOME) return(0); - if(mate.income<user.min_income-((user.max_income-user.min_income)/2) - || (user.max_income - && mate.income>user.max_income+((user.max_income-user.min_income)/2))) - match-=4; - else if(mate.income<user.min_income-((user.max_income-user.min_income)/3) - || (user.max_income - && mate.income>user.max_income+((user.max_income-user.min_income)/3))) - match-=3; - else if(mate.income<user.min_income-((user.max_income-user.min_income)/4) - || (user.max_income - && mate.income>user.max_income+((user.max_income-user.min_income)/4))) - match-=2; - else if(mate.income<user.min_income-((user.max_income-user.min_income)/5) - || (user.max_income - && mate.income>user.max_income+((user.max_income-user.min_income)/5))) - match--; } -max++; - -if(match<=0) - return(0); - -return(((float)match/max)*100.0); -} - -int sys_quenum(char *name) -{ - int i; - -for(i=0;i<total_ques;i++) - if(!stricmp(que[i]->name,name)) - break; -if(i<total_ques) - return(i); -return(-1); -} - -int user_quenum(char *name, user_t user) -{ - int i; - -for(i=0;i<5;i++) - if(!stricmp(user.queans[i].name,name)) - break; -if(i<5) - return(i); -return(-1); -} - -int total_match(user_t user, user_t mate) -{ - int i,j,s,u,match1,match2,quematches=0,quemax=0,quematch; - -match1=basic_match(user,mate); -if(!match1) return(0); -match2=basic_match(mate,user); -if(!match2) return(0); - -for(i=0;i<5;i++) { - if(!user.queans[i].name[0]) - continue; - s=sys_quenum(user.queans[i].name); - if(s==-1) - continue; - u=user_quenum(user.queans[i].name,mate); - if(u==-1) - continue; - for(j=0;j<que[s]->total_ques;j++) { - if(user.queans[u].pref[j]&mate.queans[i].self[j]) quematches+=4; - if(user.queans[u].pref[j]==mate.queans[i].self[j]) quematches+=2; - if(user.queans[u].self[j]&mate.queans[i].pref[j]) quematches+=2; - if(user.queans[u].self[j]==mate.queans[i].pref[j]) quematches++; - quemax+=9; } } - -if(!quemax) /* no questionnaires in common */ - return((match1+match1+match1+match1+match2+match2)/6); - -quematch=((float)quematches/quemax)*100.0; -return((match1+match1+match1+match1+match2+match2+quematch)/7); -} - - -void main_user_info(user_t user) -{ - char str[128],min[64],max[64]; - int i; - -attr(LIGHTGRAY); -cls(); -if(SYSOP) - bprintf("\1n\1gReal: \1h%.25s #%lu (%.40s)\r\n" - ,user.realname,user.number,user.system); -bprintf("\1n\1gName: \1h%-25.25s \1b%-10s \1c%-15s \1m%s\r\n" - ,user.name - ,marital(user.marital),race(user.race) - ,user.sex=='M' ? "Male":"Female"); -if(smm_misc&SMM_METRIC) - sprintf(str," %-4u",intocm(user.height)); -else - sprintf(str,"%2u'%-2u",user.height/12,user.height%12); -bprintf("\1n\1gHair: \1h%3s \1n\1gEyes: \1h%3s \1n\1gHeight:" - "\1h%s \1n\1gWeight: \1h%-3u \1n\1gAge: \1h%-3u " - "\1n\1gZodiac: \1h%s\r\n" - ,hair(user.hair),eyes(user.eyes),str - ,smm_misc&SMM_METRIC ? lptokg(user.weight) : user.weight - ,getage(user.birth),zodiac(getzodiac(user.birth))); -bprintf("\1n\1gFrom: \1h%-30.30s \1n\1gZip: \1h%-10.10s " - "\1n\1gIncome: \1h$%sK\1n\1g/year\r\n" - ,user.location,user.zipcode - ,user.income==0xffffffffUL ? "?":ultoa(user.income/1000UL,tmp,10)); -if(smm_misc&SMM_METRIC) { - sprintf(min,"%u",intocm(user.min_height)); - sprintf(max,"%u",intocm(user.max_height)); } -else { - sprintf(min,"%u'%u",user.min_height/12,user.min_height%12); - sprintf(max,"%u'%u",user.max_height/12,user.max_height%12); } -bprintf("\1n\1gPref: \1h\1%c%c\1%c%c\1m%c \1%c%3u\1n\1g-\1h\1%c%u\1n\1h " - "\1%c%s \1n\1ghair \1h\1%c%s \1n\1geyes \1h\1%c%s\1n\1g-\1h\1%c%s " - "\1%c%u\1n\1g-\1h\1%c%u\1n\1glbs \1h\1%c$%luK\1n\1g-\1h\1%c%luK\1n\1%c " - "\1h%.3s\r\n" - ,user.misc&USER_REQMARITAL ? 'w':'b' - ,marital_ch(user.pref_marital) - ,user.misc&USER_REQRACE ? 'w':'g' - ,race_ch(user.pref_race) - ,user.pref_sex - ,user.misc&USER_REQAGE ? 'w':'g' - ,user.min_age - ,user.misc&USER_REQAGE ? 'w':'g' - ,user.max_age - ,user.misc&USER_REQHAIR ? 'w':'g' - ,hair(user.pref_hair) - ,user.misc&USER_REQEYES ? 'w':'g' - ,eyes(user.pref_eyes) - ,user.misc&USER_REQHEIGHT ? 'w':'g' - ,min - ,user.misc&USER_REQHEIGHT ? 'w':'g' - ,max - ,user.misc&USER_REQWEIGHT ? 'w':'g' - ,smm_misc&SMM_METRIC ? lptokg(user.min_weight) : user.min_weight - ,user.misc&USER_REQWEIGHT ? 'w':'g' - ,smm_misc&SMM_METRIC ? lptokg(user.max_weight) : user.max_weight - ,user.misc&USER_REQINCOME ? 'w':'g' - ,user.min_income/1000L - ,user.misc&USER_REQINCOME ? 'w':'g' - ,user.max_income/1000L - ,user.misc&USER_REQZODIAC ? 'w':'g' - ,zodiac(user.pref_zodiac)); - -bprintf("\1r\1i%s\1n\1w\1h\r\n",user.misc&USER_PHOTO ? "PHOTO":nulstr); -for(i=0;i<5;i++) { - if(!user.note[i][0]) - break; - bprintf("%15s%.50s\r\n",nulstr,user.note[i]); } -} - -char long_user_info(user_t user) -{ - char str[128],fname[128],path[128],ch; - int i,j,k,s,u,max,match1,match2,user_match,mate_match; - -while(1) { -checkline(); -main_user_info(user); - -CRLF; -/** -if(user.misc&USER_FROMSMB) - bprintf("\1r\1hImported via message base from \1w%s\1r.\r\n" - ,user.system); -**/ -bprintf("\1h\1mThis user meets your profile preferences:\1w%3u%% " - ,match1=basic_match(useron,user)); -bprintf("\1n\1gCreated: \1h%s\r\n",unixtodstr(user.created,str)); -bprintf("\1h\1mYou meet this user's profile preferences:\1w%3u%% " - ,match2=basic_match(user,useron)); -bprintf("\1n\1gUpdated: \1h%s\r\n",unixtodstr(user.updated,str)); - -if(!smm_pause) - lncntr=0; - -CRLF; -bputs("\1n\1b\1hQuestionnaires:\r\n"); -for(i=0;i<5;i++) { - max=mate_match=user_match=0; - if(!user.queans[i].name[0]) - continue; - s=sys_quenum(user.queans[i].name); - if(s==-1) - continue; - if(que[s]->req_age>getage(useron.birth)) - continue; - if(match1 && match2) - u=user_quenum(user.queans[i].name,useron); - else - u=-1; - bprintf("\1h\1c%-25s ",que[s]->desc); - if(u==-1) { - CRLF; - continue; } - for(j=0;j<que[s]->total_ques;j++) { - if(useron.queans[u].pref[j]&user.queans[i].self[j]) user_match+=2; - if(useron.queans[u].pref[j]==user.queans[i].self[j]) user_match++; - if(useron.queans[u].self[j]&user.queans[i].pref[j]) mate_match+=2; - if(useron.queans[u].self[j]==user.queans[i].pref[j]) mate_match++; - max+=3; } - bprintf("\1n\1c%s matches your pref:\1h%3u%% " - "\1n\1cYou match %s pref:\1h%3u%%\r\n" - ,user.sex=='M' ? "He":"She" - ,(int)(((float)user_match/max)*100.0) - ,user.sex=='M' ? "his":"her" - ,(int)(((float)mate_match/max)*100.0)); } - -bprintf("\r\n\1r\1hOverall match: \1w%u%%",total_match(useron,user)); -if(user.purity) - bprintf(" \1r\1hPurity test: \1w%u%%",user.purity); -if(user.mbtype[0]) - bprintf(" \1r\1hPersonality type: \1w%s",user.mbtype); -CRLF; - -if(aborted) { - aborted=0; - return(0); } -if(!smm_pause) { - if(kbhit()) - return(0); - return(1); } -nodesync(); -if(lncntr>=user_rows-2) - lncntr=0; -CRLF; -bputs("\1h\1b[\1cV\1b]iew questionnaires, "); -if(user.misc&USER_PHOTO) - bputs("[\1cD\1b]ownload photo, "); -bputs("[\1cS\1b]end telegram, [\1cQ\1b]uit, or [Next]: \1c"); -strcpy(str,"VSQN\r"); -if(user.misc&USER_PHOTO) - strcat(str,"D"); -if(SYSOP) - strcat(str,"+"); -switch(getkeys(str,0)) { - case '+': - user.misc|=USER_PHOTO; - break; - case 'Q': - return(0); - case CR: - case 'N': - return(1); - case 'D': - if(!useron.number) { - bputs("\r\n\1h\1rYou must create a profile first.\r\n"); - pause(); - break; } - if(!(useron.misc&USER_PHOTO)) { - bputs("\r\n\1h\1rYou cannot download photos until your photo is " - "added.\r\n"); - pause(); - break; } - for(i=0;user.system[i];i++) - if(isalnum(user.system[i])) - break; - if(!user.system[i]) - fname[0]='~'; - else - fname[0]=user.system[i]; - for(i=strlen(user.system)-1;i>0;i--) - if(isalnum(user.system[i])) - break; - if(i<=0) - fname[1]='~'; - else - fname[1]=user.system[i]; - fname[2]=0; - strupr(user.system); - strcat(fname,base41(crc16(user.system),tmp)); - strcat(fname,base41(user.number,tmp)); - strcat(fname,".JPG"); - strupr(fname); - sprintf(path,"PHOTO\\%s",fname); - if(!fexist(path)) { - bputs("\r\n\1n\1hUnpacking..."); - sprintf(str,"%spkunzip photo %s photo",exec_dir,fname); - system(str); - bputs("\r\n"); - if(!fexist(path)) { - bputs("\r\n\1n\1h\1i\1rUnpacking failed!\1n\r\n"); - pause(); - break; } } - if(com_port) { - cmdstr(zmodem_send,path,path,str); - ivhctl(INTCLR); - ivhctl(INT29L); - system(str); - ivhctl(INTCLR); - i=INT29L; - i|=(INT29R|INT16); - ivhctl(i); } - else - system(cmdstr(local_view,path,path,str)); - pause(); - break; - - - case 'S': - send_telegram(user); - break; - case 'V': - - if(user_level<que_level) { - bputs("\r\n\1h\1rYou have insufficient access to read " - "questoinnaires.\r\n"); - pause(); - break; } - - for(i=0;i<5;i++) { - aborted=0; - if(!user.queans[i].name[0]) - continue; - s=sys_quenum(user.queans[i].name); - if(s==-1) - continue; - if(que[s]->req_age>getage(useron.birth)) - continue; - if(match1 && match2) - u=user_quenum(user.queans[i].name,useron); - else - u=-1; - sprintf(str,"\r\nDo you wish to view the \1w%s\1b questionnaire" - ,que[s]->desc); - if(!yesno(str)) - continue; - if(!cdt_warning(que_cdt)) - continue; - adjust_cdt(que_cdt); - for(j=0;j<que[s]->total_ques && !aborted;) { - cls(); - bprintf("\1n\1m\1hQuestionnaire: \1y%-25s \1mQuestion: " - "\1y%d \1mof \1y%d \1h\1b(Ctrl-C to Abort)\r\n\r\n" - ,que[s]->desc,j+1,que[s]->total_ques); - bprintf("\1w\1h%s\r\n\r\n",que[s]->que[j].txt); - for(k=0;k<que[s]->que[j].answers;k++) - bprintf("\1h\1b%c\1w) \1g%s\r\n",'A'+k - ,que[s]->que[j].ans[k]); - bits2str(user.queans[i].self[j],str); - bprintf("\1n\1g\r\n%25s: \1h%-16s " - ,user.name,str); - bits2str(user.queans[i].pref[j],str); - bprintf("\1n\1g %15s: \1h%s","Preferred mate",str); - if(u!=-1) { - bits2str(useron.queans[u].pref[j],str); - bprintf("\1n\1g\r\n%25s: \1h%-16s " - ,"Your preferred mate",str); - bits2str(useron.queans[u].self[j],str); - bprintf("\1n\1g %15s: \1h%s","You",str); } - CRLF; - if(!aborted) { - lncntr=0; - bputs("\r\n\1h\1b[\1cP\1b]revious, [\1cQ\1b]uit, " - "or [Next]: \1c"); - ch=getkeys("PQN\r",0); - if(ch=='P') { - if(j) j--; - continue; } - if(ch=='Q') - break; - j++; } } } - break; - - } } -return(0); -} - - -/* Returns 0 if aborted, 1 if continue, negative if previous */ -int short_user_info(user_t user) -{ - char str[128],height[64],ch; - int i,match; - int records; - ulong name_crc; - static char name[26],lastname[26],highmatch; - static long topixb,topdab,lastixb,lastdab; - static int count; - -if(!lncntr && smm_pause) { - topdab=ftell(stream)-sizeof(user_t); - topixb=ftell(index)-sizeof(ixb_t); - if(!topdab) - lastdab=lastixb=0; - count=0; - printfile("LIST_HDR.ASC"); - strcpy(lastname,name); - name[0]=highmatch=0; } -if(user.number) { - match=total_match(useron,user); - if(!match) str[0]=0; - else if(match>=90) sprintf(str,"\1w%u%%",match); - else if(match>=80) sprintf(str,"\1c%u%%",match); - else if(match>=70) sprintf(str,"\1y%u%%",match); - else if(match>=60) sprintf(str,"\1g%u%%",match); - else if(match>=50) sprintf(str,"\1m%u%%",match); - else if(match>=40) sprintf(str,"\1r%u%%",match); - else if(match>=30) sprintf(str,"\1b%u%%",match); - else if(match>=20) sprintf(str,"\1n\1g%u%%",match); - else if(match>=10) sprintf(str,"\1n\1c%u%%",match); - else sprintf(str,"\1n%u%%",match); - if(smm_misc&SMM_METRIC) - sprintf(height," %-4u",intocm(user.height)); - else - sprintf(height,"%2u'%-2u",user.height/12,user.height%12); - bprintf("\1n\1h%c\1n\1g%c\1h\1c%c\1b%3u \1g%3s \1m%3s\1r%s \1y%-3u " - "\1n\1g%-25.25s\1r\1h\1i%c\1n\1h%-25.25s%s\r\n" - ,user.sex==user.pref_sex ? 'G':user.sex=='*' ? 'B' - : marital_ch(user.marital) - ,race_ch(user.race) - ,user.sex - ,getage(user.birth) - ,hair(user.hair) - ,eyes(user.eyes) - ,height - ,smm_misc&SMM_METRIC ? lptokg(user.weight) : user.weight - ,user.location - ,user.misc&USER_PHOTO ? '+':SP - ,user.name - ,str - ); - if(match && - (!name[0] || !stricmp(name,lastname) - || (stricmp(user.name,lastname) && match>highmatch))) { - highmatch=match; - sprintf(name,"%.25s",user.name); - strupr(name); } - } - -if(lncntr>=user_rows-2 || !user.number) { - lncntr=0; - bputs(PrevReadSendQuitOrMore); - ch=getkey(K_UPPER); - if(ch=='Q') { - cls(); - aborted=1; } - else if(ch=='P') { - cls(); - records=((ftell(stream)-topdab)/sizeof(user_t)); - fseek(stream,lastdab,SEEK_SET); - fseek(index,lastixb,SEEK_SET); - lastdab-=(records)*sizeof(user_t); - lastixb-=(records)*sizeof(ixb_t); - if(lastdab<0) lastdab=0; - if(lastixb<0) lastixb=0; - return(-count); } - else if(ch=='R' || ch=='G' || ch=='S') { - bprintf("\1n\r\1>\1y\1hUser name: "); - if(getstr(name,25,K_NOCRLF|K_LINE|K_EDIT|K_AUTODEL|K_UPPER)) { - truncsp(name); - name_crc=crc32(name); - cls(); - rewind(index); - while(!feof(index)) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(!ixb.number) /* DELETED */ - continue; - if(ixb.name!=name_crc) - continue; - fseek(stream - ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); - if(!fread(&user,sizeof(user_t),1,stream)) - continue; - if(ch=='S' && send_telegram(user)) - break; - if(ch!='S' && !long_user_info(user)) - break; } } - fseek(stream,topdab,SEEK_SET); - fseek(index,topixb,SEEK_SET); - cls(); - return(-1); } - else { - lastixb=topixb; - lastdab=topdab; - cls(); } } - -count++; -if(aborted) - return(0); -return(1); -} - - -int get_your_det(user_t *user) -{ - char str[128],*p,*hdr; - int i; - -while(1) { -checkline(); -cls(); -bputs("\1h\0014 Your Detailed Personal Information \1n \1h\1b" - "(Ctrl-C to Abort)\r\n\r\n"); - -nodesync(); -bputs("\1h\1bPlease enter your name or alias: "); -strcpy(str,user->name); -if(!getstr(str,25,K_LINE|K_EDIT|K_AUTODEL|K_UPRLWR)) - return(0); -truncsp(str); -if(trash(str)) { - bprintf("\r\n\1h\1rSorry, you can't use that name.\r\n\r\n\1p"); - continue; } -strcpy(user->name,str); - -CRLF; -nodesync(); -bprintf("\1h\1gPlease enter your height in %s: " - ,smm_misc&SMM_METRIC ? "centimeters" : "feet'inches (example: 5'7)"); -if(user->height) { - if(smm_misc&SMM_METRIC) - sprintf(str,"%u",intocm(user->height)); - else - sprintf(str,"%u'%u",user->height/12,user->height%12); } -else - str[0]=0; -if(!getstr(str,4,K_LINE|K_EDIT|K_AUTODEL)) - return(0); -if(smm_misc&SMM_METRIC) - user->height=cmtoin(atoi(str)); -else { - user->height=atoi(str)*12; - p=strchr(str,'\''); - if(p) user->height+=atoi(p+1); } - -CRLF; -nodesync(); -bprintf("\1h\1mPlease enter your weight (in %s): " - ,smm_misc&SMM_METRIC ? "kilograms":"pounds"); -if(user->weight) - sprintf(str,"%u" - ,smm_misc&SMM_METRIC ? lptokg(user->weight) : user->weight); -else - str[0]=0; -if(!getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL|K_LINE)) - return(0); -if(smm_misc&SMM_METRIC) - user->weight=kgtolp(atoi(str)); -else - user->weight=atoi(str); - -CRLF; -nodesync(); -bputs("\1h\1rPlease enter your annual income in dollars (ENTER=undisclosed): "); -if(user->income && user->income!=0xffffffff) - sprintf(str,"%luK",user->income/1000); -else - str[0]=0; -getstr(str,6,K_UPPER|K_EDIT|K_AUTODEL|K_LINE); -if(aborted) - return(0); -if(strchr(str,'K')) - user->income=atol(str)*1000L; -else if(str[0]==0) - user->income=0xffffffffUL; -else - user->income=atol(str); - -CRLF; -nodesync(); -bputs("\1h\1cPlease enter your location (city, state): "); -strcpy(str,user->location); -if(!getstr(str,30,K_LINE|K_EDIT|K_AUTODEL|K_UPRLWR)) - return(0); -truncsp(str); -if(trash(str)) { - bprintf("\r\n\1r\1hSorry, you can't use that location.\r\n\r\n\1p"); - continue; } -strcpy(user->location,str); - - -CRLF; -nodesync(); -bputs("\1h\1gPlease enter your zip/postal code: "); -if(!getstr(user->zipcode,10,K_LINE|K_EDIT|K_AUTODEL)) - return(0); - -CRLF; -nodesync(); -for(i=0;i<5;i++) { - bprintf("\1n\1gPersonal text - Line %u of 5: ",i+1); - if(wordwrap[0]) - user->note[i][0]=0; - strcpy(str,user->note[i]); - if(!getstr(str,50,i==4 ? K_LINE|K_EDIT:K_LINE|K_EDIT|K_WRAP)) - break; - if(trash(str)) { - bprintf("\r\n\1r\1hSorry, you can't use that text.\r\n\r\n"); - i--; - continue; } - strcpy(user->note[i],str); } -while(i++<5) - user->note[i][0]=0; -aborted=0; -nodesync(); -if(yesno("\r\nIs the above information correct")) - break; } -return(1); -} - -int get_pref_det(user_t *user) -{ - char str[128],*p,*hdr; - int i; - -while(1) { -checkline(); -cls(); -bputs("\1h\0014 Detailed Information on Your Preferred Mate \1n " - "\1h\1b(Ctrl-C to Abort)\r\n\r\n"); - -nodesync(); -bputs("\1n\1cPlease enter the minimum age of your preferred mate: \1h"); -if(user->min_age) - sprintf(str,"%u",user->min_age); -else - str[0]=0; -getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL); -if(aborted) - return(0); -user->min_age=atoi(str); - -nodesync(); -bputs("\1h\1cPlease enter the maximum age of your preferred mate: \1h"); -if(user->max_age) - sprintf(str,"%u",user->max_age); -else - str[0]=0; -getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL); -if(aborted) - return(0); -user->max_age=atoi(str); -if(user->min_age) { - strcpy(str,"Do you require your mate's age fall within this range"); - if(user->misc&USER_REQAGE) - i=yesno(str); - else - i=!noyes(str); - if(i) - user->misc|=USER_REQAGE; - else - user->misc&=~USER_REQAGE; } -else - user->misc&=~USER_REQAGE; -if(aborted) - return(0); - -CRLF; -nodesync(); -bprintf("\1n\1gPlease enter the minimum height of your preferred mate " - "in %s: \1w\1h",smm_misc&SMM_METRIC ? "centimeters":"feet'inches"); -if(user->min_height) { - if(smm_misc&SMM_METRIC) - sprintf(str,"%u",intocm(user->min_height)); - else - sprintf(str,"%u'%u",user->min_height/12,user->min_height%12); } -else - str[0]=0; -getstr(str,4,K_EDIT|K_AUTODEL); -if(aborted) - return(0); -if(smm_misc&SMM_METRIC) - user->min_height=cmtoin(atoi(str)); -else { - user->min_height=atoi(str)*12; - p=strchr(str,'\''); - if(p) user->min_height+=atoi(p+1); } -nodesync(); -bprintf("\1h\1gPlease enter the maximum height of your preferred mate " - "in %s: \1w",smm_misc&SMM_METRIC ? "centimeters":"feet'inches"); -if(user->max_height) { - if(smm_misc&SMM_METRIC) - sprintf(str,"%u",intocm(user->max_height)); - else - sprintf(str,"%u'%u",user->max_height/12,user->max_height%12); } -else - str[0]=0; -getstr(str,4,K_EDIT|K_AUTODEL); -if(aborted) - return(0); -if(smm_misc&SMM_METRIC) - user->max_height=cmtoin(atoi(str)); -else { - user->max_height=atoi(str)*12; - p=strchr(str,'\''); - if(p) user->max_height+=atoi(p+1); } -strcpy(str,"Do you require your mate's height fall within this range"); -if(user->misc&USER_REQHEIGHT) - i=yesno(str); -else - i=!noyes(str); -if(i) - user->misc|=USER_REQHEIGHT; -else - user->misc&=~USER_REQHEIGHT; -if(aborted) - return(0); - - -CRLF; -nodesync(); -bprintf("\1n\1mPlease enter the minimum weight of your preferred mate in %s:" - " \1w\1h",smm_misc&SMM_METRIC ? "kilograms":"pounds"); -if(user->min_weight) { - if(smm_misc&SMM_METRIC) - sprintf(str,"%u",lptokg(user->min_weight)); - else - sprintf(str,"%u",user->min_weight); } -else - str[0]=0; -getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL); -if(aborted) - return(0); -if(smm_misc&SMM_METRIC) - user->min_weight=kgtolp(atoi(str)); -else - user->min_weight=atoi(str); - -nodesync(); -bprintf("\1h\1mPlease enter the maximum weight of your preferred mate in %s:" - " \1w",smm_misc&SMM_METRIC ? "kilograms":"pounds"); -if(user->max_weight) { - if(smm_misc&SMM_METRIC) - sprintf(str,"%u",lptokg(user->max_weight)); - else - sprintf(str,"%u",user->max_weight); } -else - str[0]=0; -getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL); -if(aborted) - return(0); -if(smm_misc&SMM_METRIC) - user->max_weight=kgtolp(atoi(str)); -else - user->max_weight=atoi(str); -if(user->max_weight) { - strcpy(str,"Do you require your mate's weight fall within this range"); - if(user->misc&USER_REQWEIGHT) - i=yesno(str); - else - i=!noyes(str); - if(i) - user->misc|=USER_REQWEIGHT; - else - user->misc&=~USER_REQWEIGHT; } -else - user->misc&=~USER_REQWEIGHT; -if(aborted) - return(0); - - -CRLF; -nodesync(); -bputs("\1h\1cPlease enter the lowest zip/postal code of your preferred " - "mate: \1w"); -getstr(user->min_zipcode,10,K_EDIT|K_AUTODEL|K_UPPER); -if(aborted) - return(0); -bputs("\1h\1bPlease enter the highest zip/postal code of your preferred " - "mate: \1w"); -getstr(user->max_zipcode,10,K_EDIT|K_AUTODEL|K_UPPER); -if(aborted) - return(0); -strcpy(str,"Do you require your mate's zip/postal code fall within this range"); -if(user->misc&USER_REQZIP) - i=yesno(str); -else - i=!noyes(str); -if(i) - user->misc|=USER_REQZIP; -else - user->misc&=~USER_REQZIP; -if(aborted) - return(0); - - -CRLF; -nodesync(); -bputs("\1h\1gPlease enter the minimum annual income of your " - "mate in dollars: \1w"); -if(user->min_income) - sprintf(str,"%lu",user->min_income); -else - str[0]=0; -getstr(str,6,K_NUMBER|K_EDIT|K_AUTODEL); -if(aborted) return(0); -user->min_income=atol(str); - -nodesync(); -bputs("\1h\1yPlease enter the maximum annual income of your " - "mate in dollars: \1w"); -if(user->max_income) - sprintf(str,"%lu",user->max_income); -else - str[0]=0; -getstr(str,6,K_NUMBER|K_EDIT|K_AUTODEL); -if(aborted) return(0); -user->max_income=atol(str); -if(user->min_income) { - strcpy(str,"Do you require that your mate's income fall within this range"); - if(user->misc&USER_REQINCOME) - i=yesno(str); - else - i=!noyes(str); - if(i) - user->misc|=USER_REQINCOME; - else - user->misc&=~USER_REQINCOME; } -else - user->misc&=~USER_REQINCOME; -if(aborted) - return(0); - - -nodesync(); -if(yesno("\r\nIs the above information correct")) - break; } -return(1); -} - -int get_your_multi(user_t *user) -{ - char str[128],*hdr,*p; - -while(1) { -checkline(); -hdr="\1n\1l\1h\0014 Your Profile \1n \1h\1b(Ctrl-C to Abort)\r\n\r\n"; -bputs(hdr); -bputs("\1n\1h\1cYour Marital Status:\r\n\r\n"); -mnemonics("~A) Single\r\n~B) Married\r\n~C) Divorced\r\n~D) Widowed\r\n" - "~E) Other\r\n"); -nodesync(); -bputs("\r\n\1y\1hWhich: \1w"); -uchar2ans(user->marital,str); -if(!getstr(str,1,K_ALPHA|K_LINE|K_EDIT|K_AUTODEL|K_UPPER)) - return(0); -if(str[0]<='E') - break; } -user->marital=ans2uchar(str); - -while(1) { -checkline(); -bputs(hdr); -bputs("\1n\1h\1cYour Race:\r\n\r\n"); -mnemonics("~A) White\r\n~B) Black\r\n~C) Hispanic\r\n~D) Asian\r\n" - "~E) American Indian\r\n~F) Middle Eastern\r\n~G) Other\r\n"); -nodesync(); -bputs("\r\n\1y\1hWhich: \1w"); -uchar2ans(user->race,str); -if(!getstr(str,1,K_ALPHA|K_LINE|K_EDIT|K_AUTODEL|K_UPPER)) - return(0); -if(str[0]<='G') - break; } -user->race=ans2uchar(str); - -while(1) { -checkline(); -bputs(hdr); -bputs("\1n\1h\1cYour Hair Color:\r\n\r\n"); -mnemonics("~A) Blonde\r\n~B) Brown\r\n~C) Red\r\n~D) Black\r\n" - "~E) Grey\r\n~F) Other\r\n"); -nodesync(); -bputs("\r\n\1y\1hWhich: \1w"); -uchar2ans(user->hair,str); -if(!getstr(str,1,K_ALPHA|K_LINE|K_EDIT|K_AUTODEL|K_UPPER)) - return(0); -if(str[0]<='F') - break; } -user->hair=ans2uchar(str); - -while(1) { -checkline(); -bputs(hdr); -bputs("\1n\1h\1cYour Eye Color:\r\n\r\n"); -mnemonics("~A) Blue\r\n~B) Green\r\n~C) Hazel\r\n~D) Brown\r\n" - "~E) Other\r\n"); -nodesync(); -bputs("\r\n\1y\1hWhich: \1w"); -uchar2ans(user->eyes,str); -if(!getstr(str,1,K_ALPHA|K_LINE|K_EDIT|K_AUTODEL|K_UPPER)) - return(0); -if(str[0]<='E') - break; } -user->eyes=ans2uchar(str); -return(1); -} - -int get_pref_multi(user_t *user) -{ - char str[128],*hdr,*p; - int i; - -while(1) { -checkline(); -hdr="\1n\1l\1h\0014 Profile of Your Preferred Mate \1n \1h\1b" - "(Ctrl-C to Abort)\r\n\r\n"; -bputs(hdr); -bputs("\1n\1h\1cSex of Your Preferred (Intimate/Romantic) Mate:\r\n\r\n"); -mnemonics("~M) Male\r\n~F) Female\r\n~*) Either\r\n"); -nodesync(); -bputs("\r\n\1y\1hWhich: "); -str[0]=user->pref_sex; -str[1]=0; -if(!getstr(str,1,K_UPPER|K_EDIT|K_AUTODEL|K_LINE)) - break; -if(user->sex==str[0] && noyes("\r\nYou are homosexual")) - continue; -if(str[0]=='M' || str[0]=='F' || str[0]=='*') - break; } -user->pref_sex=str[0]; -if(aborted) return(0); - -strcpy(str,"\r\nAre you seeking an any-sex (non-romantic) friendship"); -if(user->misc&USER_FRIEND) - i=yesno(str); -else - i=!noyes(str); -if(i) - user->misc|=USER_FRIEND; -else - user->misc&=~USER_FRIEND; - -bputs(hdr); -bputs("\1n\1h\1cMarital Status of Your Preferred Mate:\r\n\r\n"); -mnemonics("~A) Single\r\n~B) Married\r\n~C) Divorced\r\n~D) Widowed\r\n" - "~E) Other\r\n~*) Any of the above\r\n"); -nodesync(); -bputs("\r\n\1y\1hPlease enter up to 4 answers: "); -uchar2ans(user->pref_marital,str); -if(!getstr(str,4,K_UPPER|K_LINE|K_EDIT|K_AUTODEL)) - return(0); -user->pref_marital=ans2uchar(str); -if(user->pref_marital!=0xff) { - strcpy(str,"\r\nDo you require your mate have the martial status you " - "indicated"); - if(user->misc&USER_REQMARITAL) - i=yesno(str); - else - i=!noyes(str); - if(i) - user->misc|=USER_REQMARITAL; - else - user->misc&=~USER_REQMARITAL; } -else - user->misc&=~USER_REQMARITAL; -if(aborted) return(0); - -bputs(hdr); -bputs("\1n\1h\1cRace of Your Preferred Mate:\r\n\r\n"); -mnemonics("~A) White\r\n~B) Black\r\n~C) Hispanic\r\n~D) Asian\r\n" - "~E) American Indian\r\n~F) Middle Eastern\r\n~G) Other\r\n" - "~*) Any of the above\r\n"); -nodesync(); -bputs("\r\n\1y\1hPlease enter up to 6 answers: "); -uchar2ans(user->pref_race,str); -if(!getstr(str,6,K_UPPER|K_LINE|K_EDIT|K_AUTODEL)) - return(0); -user->pref_race=ans2uchar(str); -if(user->pref_race!=0xff) { - strcpy(str,"\r\nDo you require your mate be of the race" - " you indicated"); - if(user->misc&USER_REQRACE) - i=yesno(str); - else - i=!noyes(str); - if(i) - user->misc|=USER_REQRACE; - else - user->misc&=~USER_REQRACE; } -else - user->misc&=~USER_REQRACE; -if(aborted) return(0); - -bputs(hdr); -bputs("\1n\1h\1cHair Color of Your Preferred Mate:\r\n\r\n"); -mnemonics("~A) Blonde\r\n~B) Brown\r\n~C) Red\r\n~D) Black\r\n" - "~E) Grey\r\n~F) Other\r\n~*) Any of the Above\r\n"); -nodesync(); -bputs("\r\n\1y\1hPlease enter up to 5 answers: "); -uchar2ans(user->pref_hair,str); -if(!getstr(str,5,K_UPPER|K_LINE|K_EDIT|K_AUTODEL)) - return(0); -user->pref_hair=ans2uchar(str); -if(user->pref_hair!=0xff) { - strcpy(str,"\r\nDo you require your mate have the hair color" - " you indicated"); - if(user->misc&USER_REQHAIR) - i=yesno(str); - else - i=!noyes(str); - if(i) - user->misc|=USER_REQHAIR; - else - user->misc&=~USER_REQHAIR; } -else - user->misc&=~USER_REQHAIR; -if(aborted) return(0); - - -bputs(hdr); -bputs("\1n\1h\1cEye Color of Your Preferred Mate:\r\n\r\n"); -mnemonics("~A) Blue\r\n~B) Green\r\n~C) Hazel\r\n~D) Brown\r\n" - "~E) Other\r\n~*) Any of the above\r\n"); -nodesync(); -bputs("\r\n\1y\1hPlease enter up to 4 answers: "); -uchar2ans(user->pref_eyes,str); -if(!getstr(str,4,K_UPPER|K_LINE|K_EDIT|K_AUTODEL)) - return(0); -user->pref_eyes=ans2uchar(str); -if(user->pref_eyes!=0xff) { - strcpy(str,"\r\nDo you require your mate have the eye color" - " you indicated"); - if(user->misc&USER_REQEYES) - i=yesno(str); - else - i=!noyes(str); - if(i) - user->misc|=USER_REQEYES; - else - user->misc&=~USER_REQEYES; } -else - user->misc&=~USER_REQEYES; -if(aborted) return(0); - -bputs(hdr); -bputs("\1n\1h\1cZodiac Sign of Your Preferred Mate:\r\n\r\n"); -mnemonics("~A) Aries\r\n~B) Taurus\r\n~C) Gemini\r\n~D) Cancer\r\n" - "~E) Leo\r\n~F) Virgo\r\n~G) Libra\r\n~H) Scorpio\r\n"); -mnemonics("~I) Sagittarius\r\n~J) Capricorn\r\n~K) Aquarius\r\n" - "~L) Pisces\r\n~*) Any of the above\r\n"); -nodesync(); -bputs("\r\n\1y\1hPlease enter up to 11 answers: "); -bits2ans(user->pref_zodiac,str); -if(!getstr(str,11,K_UPPER|K_LINE|K_EDIT|K_AUTODEL)) - return(0); -user->pref_zodiac=ans2bits(str); -if(user->pref_zodiac!=0xffff) { - strcpy(str,"\r\nDo you require your mate have the zodiac sign" - " you indicated"); - if(user->misc&USER_REQZODIAC) - i=yesno(str); - else - i=!noyes(str); - if(i) - user->misc|=USER_REQZODIAC; - else - user->misc&=~USER_REQZODIAC; } -else - user->misc&=~USER_REQZODIAC; -if(aborted) return(0); - -return(1); -} - -void mbtype_desc(char *mbtype) -{ - char str[128],type[128]; - -while(1) { - checkline(); - cls(); - printfile("MB-TYPE.ASC"); - nodesync(); - bprintf("\r\n\1y\1hYour Type: \1w%s\r\n",mbtype); - bputs("\1y\1hLetter or Type to define: "); - memset(type,0,5); - if(!getstr(type,4,K_ALPHA|K_UPPER|K_LINE)) - break; - sprintf(str,"MB-%s.ASC",type); - if(!fexist(str)) { - bputs("\r\nInvalid Letter or Type!\r\n\r\n"); - pause(); - continue; } - cls(); - printfile(str); - if(lncntr && !aborted) - pause(); } -} - - -int get_mbtype(user_t *user) -{ - char str[256]; - int file,i=0,e=0,n=0,s=0,f=0,t=0,p=0,j=0,q=0,ch; - FILE *stream; - -aborted=0; -cls(); -printfile("MB-INTRO.ASC"); -if(aborted) - return(0); -bputs("\1n\1hYour answers will be kept secret.\r\n\r\n" - "Only your personality type will be visible to other users.\r\n\r\n"); -nodesync(); -if(!yesno("Continue with test")) - return(0); - -if((file=nopen("MB-TYPE.QUE",O_RDONLY))==-1 || - (stream=fdopen(file,"r"))==NULL) { - bputs("\7\r\i\hCan't open MBTYPE.QUE\r\n\1p"); - return(0); } -while(!feof(stream)) { - if(!fgets(str,200,stream)) - break; - str[57]=0; - truncsp(str); - if(!str[0]) - break; - cls(); - nodesync(); - bprintf("\1y\1hMyers-Briggs Personality Test \1bQuestion #\1w%u " - "\1b(Ctrl-C to Abort)\r\n" - "\r\n%s:\r\n\r\n" - "[\1wA\1b] %.44s\r\n" - "[\1wB\1b] %.44s\r\n" - "[\1wC\1b] cannot decide\r\n\r\n" - "Which: \1w" - ,q+1,str,str+58,str+102); - ch=getkeys("ABC",0); - if(aborted) { - fclose(stream); - return(0); } - if(ch=='C') { - q++; - continue; } - - if(ch=='A') - ch=str[146]; - else - ch=str[147]; - - switch(ch) { - case 'E': - e++; - break; - case 'I': - i++; - break; - case 'S': - s++; - break; - case 'N': - n++; - break; - case 'T': - t++; - break; - case 'F': - f++; - break; - case 'J': - j++; - break; - case 'P': - p++; - break; } - q++; } - -fclose(stream); - -if(i>e) - user->mbtype[0]='I'; -else if(i==e) - user->mbtype[0]='*'; -else - user->mbtype[0]='E'; - -if(s>n) - user->mbtype[1]='S'; -else if(s==n) - user->mbtype[1]='*'; -else - user->mbtype[1]='N'; - -if(t>f) - user->mbtype[2]='T'; -else if(t==f) - user->mbtype[2]='*'; -else - user->mbtype[2]='F'; - -if(p>j) - user->mbtype[3]='P'; -else if(p==j) - user->mbtype[3]='*'; -else - user->mbtype[3]='J'; - -bprintf("\1l\1y\1hYour Myers-Briggs Personality Type is \1w%s\r\n\r\n" - ,user->mbtype); - -if(yesno("Would you like to see the personality type descriptions")) - mbtype_desc(user->mbtype); -return(1); -} - - -int get_purity(user_t *user) -{ - char str[128]; - int file,no_ans=0,pos_ans=0; - FILE *stream; - -aborted=0; -if(!fexist("PURITY.QUE") || purity_age>getage(user->birth)) - return(0); -cls(); -printfile("PURITY.ASC"); -if(aborted) - return(0); -bputs("\1n\1hYour answers will be kept secret.\r\n\r\n" - "Only your purity score will be visible to other users.\r\n\r\n"); -nodesync(); -if(!yesno("Continue with test")) - return(0); -if((file=nopen("PURITY.QUE",O_RDONLY))==-1 || - (stream=fdopen(file,"r"))==NULL) { - bputs("\7\r\i\hCan't open PURITY.QUE\r\n\1p"); - return(0); } -while(!feof(stream)) { - if(!fgets(str,81,stream)) - break; - truncsp(str); - cls(); - if(str[0]=='*') { - printfile(str+1); - if(lncntr && !aborted) - pause(); - if(aborted) - break; - continue; } - nodesync(); - bprintf("\1y\1hPurity Test \1bQuestion #\1w%u \1b(Ctrl-C to Abort)\r\n" - "\r\nHave you ever:\r\n\r\n" - ,++pos_ans); - if(noyes(str)) - no_ans++; - if(aborted) - break; } - -fclose(stream); -if(aborted) - return(0); - -user->purity=((float)no_ans/pos_ans)*100.0; -bprintf("\1l\1y\1hCongratulations, you are \1w%u%%\1y pure!\r\n\r\n" - ,user->purity); -pause(); -return(1); -} - -int get_que(int i, user_t *inuser) -{ - char str[128]; - int j,k,x,y,u; - user_t user=*inuser; - -if(que[i]->req_age>getage(inuser->birth)) - return(0); -for(j=0;j<que[i]->total_ques && !aborted;j++) { - - u=user_quenum(que[i]->name,user); - if(u==-1) { /* not already answered */ - for(u=0;u<5;u++) /* search for unused questionnaire slot */ - if(sys_quenum(user.queans[u].name)==-1) - break; - if(u==5) { /* All questionnaire slots used!?? */ - bputs("\r\n\7Questionnaire error, inform sysop!\r\n"); - pause(); - return(0); } } - strcpy(user.queans[u].name,que[i]->name); - cls(); - bprintf("\1n\1m\1hQuestionnaire: \1y%-25s \1mQuestion: " - "\1y%d \1mof \1y%d \1h\1b(Ctrl-C to Abort)\r\n\r\n" - ,que[i]->desc,j+1,que[i]->total_ques); - bprintf("\1w\1h%s\r\n\r\n",que[i]->que[j].txt); - for(k=0;k<que[i]->que[j].answers;k++) - bprintf("\1h\1b%c\1w) \1g%s\r\n",'A'+k,que[i]->que[j].ans[k]); - nodesync(); - bprintf("\1n\1g\r\nChoose %s%d answer%s to describe " - "\1hyourself\1n\1g%s: " - ,que[i]->que[j].allowed > 1 ? "up to ":"" - ,que[i]->que[j].allowed,que[i]->que[j].allowed > 1 ? "s":"" - ,j ? " or \1h-\1n\1g to go back" : ""); - bits2ans(user.queans[u].self[j],str); - getstr(str,que[i]->que[j].allowed,K_UPPER|K_LINE|K_EDIT|K_AUTODEL); - if(aborted) - return(0); - truncsp(str); - if(!str[0]) { - j--; - continue; } - if(str[0]=='-') { - if(j) j-=2; - else j--; - continue; } - y=strlen(str); - for(x=0;x<y;x++) - if(!isalpha(str[x]) || str[x]-'A'>que[i]->que[j].answers-1) - break; - if(x<y) { - j--; - continue; } - user.queans[u].self[j]=ans2bits(str); - nodesync(); - bprintf("\1n\1g\r\n%s%d answer%s to describe your \1hpreferred mate" - "\1n\1g or \1h*\1n\1g for any: " - ,que[i]->que[j].answers > 1 ? "Up to ":"" - ,que[i]->que[j].answers,que[i]->que[j].answers > 1 ? "s":""); - if(user.queans[u].pref[j]) - bits2ans(user.queans[u].pref[j],str); - getstr(str,que[i]->que[j].answers,K_UPPER|K_LINE|K_EDIT|K_AUTODEL); - if(aborted) - return(0); - truncsp(str); - if(!str[0]) { - j--; - continue; } - y=strlen(str); - for(x=0;x<y;x++) - if(isalpha(str[x]) && str[x]-'A'>que[i]->que[j].answers-1) - break; - if(x<y) { - j--; - continue; } - user.queans[u].pref[j]=ans2bits(str); } -*inuser=user; -return(1); -} - -/* Gets/updates profile from user. Returns 0 if aborted. */ - -char get_user_info(user_t *user) -{ - char str[128],*p,*hdr; - int i,j,k,x,y; - -while(1) { - checkline(); - timeleft=0xffff; - aborted=0; - main_user_info(*user); - CRLF; - bputs("\1n\1h"); - bputs("\1b[\1wA\1b] Your name, height, weight, income, location, and " - "text\r\n" - "\1b[\1wB\1b] Your marital status, race, hair color, and eye " - "color\r\n" - "\1b[\1wC\1b] Preferred age, height, weight, location, and income\r\n" - "\1b[\1wD\1b] Preferred sex, marital status, race, hair color, eye " - "color, and zodiac\r\n" - ); - for(i=0;i<total_ques;i++) { - if(que[i]->req_age>getage(user->birth)) - continue; - bprintf("\1b[\1w%u\1b] \1w%s \1bquestionnaire\1b (%u questions) \1w%s\r\n" - ,i+1,que[i]->desc,que[i]->total_ques - ,user_quenum(que[i]->name,*user)==-1 ? "[Unanswered]":"[Answered]"); - } - bprintf("\1b[\1wM\1b] Myers-Briggs personality test (70 questions) " - "\1w[%s]\r\n",user->mbtype[0] ? user->mbtype : "Unanswered"); - if(fexist("PURITY.QUE") && purity_age<=getage(user->birth)) - bprintf("\1b[\1wP\1b] Purity test \1w(%u%% pure)\r\n" - ,user->purity); - bputs("\r\n\1bWhich or [\1wQ\1b]uit: \1w"); - i=getkeys("ABCDMPQ",total_ques); - if(i&0x8000) { - i&=~0x8000; - i--; - get_que(i,user); - continue; } - - switch(i) { - case 'A': - get_your_det(user); - break; - case 'C': - get_pref_det(user); - break; - case 'B': - get_your_multi(user); - break; - case 'D': - get_pref_multi(user); - break; - case 'M': - get_mbtype(user); - break; - case 'P': - get_purity(user); - break; - case 'Q': - return(1); } } -} - -void write_user() -{ - char str[256]; - -if(auto_update && time(NULL)-useron.updated>(long)auto_update*24L*60L*60L) - useron.updated=time(NULL); -fseek(stream,useron_record*sizeof(user_t),SEEK_SET); -fwrite(&useron,sizeof(user_t),1,stream); -fflush(stream); - -ixb.updated=useron.updated; -if(useron.misc&USER_DELETED) - ixb.number=0; -else - ixb.number=useron.number; -strcpy(str,useron.name); -strupr(str); -ixb.name=crc32(str); -ixb.system=system_crc; -fseek(index,useron_record*sizeof(ixb_t),SEEK_SET); -fwrite(&ixb,sizeof(ixb_t),1,index); -fflush(index); -if(!ixb.number) { - sprintf(str,"%04u.MSG",useron.number); - remove(str); } -} - - -void add_userinfo() -{ - static user_t user; - char str[128]; - ushort tleft=timeleft; - int i; - -if(!cdt_warning(profile_cdt)) - return; -timeleft=0xffff; -user.number=user_number; -user.sex=user_sex; -strcpy(user.name,user_name); -strcpy(user.realname,user_name); -strcpy(user.system,system_name); -strcpy(user.birth,user_birth); -strcpy(user.zipcode,user_zipcode); -sprintf(user.min_zipcode,"%c0000",user_zipcode[0]); -sprintf(user.max_zipcode,"%c9999",user_zipcode[0]); -strcpy(user.location,user_location); -if(user.sex!='M' && user.sex!='F') { - if(yesno("Are you of male gender")) - user.sex='M'; - else - user.sex='F'; } -if(!getage(user.birth)) - while(1) { - checkline(); - cls(); - bputs("\1l\1y\1hYour birthdate (MM/DD/YY): "); - if(!getstr(user.birth,8,K_UPPER|K_LINE)) - return; - if(getage(user.birth)) - break; } - -user.pref_sex=user.sex=='M' ? 'F' : 'M'; -user.created=time(NULL); -if(!get_your_det(&user) || !get_your_multi(&user) || !get_pref_multi(&user) - || !get_pref_det(&user)) { - timeleft=tleft; - return; } -for(i=0;i<total_ques;i++) { - aborted=0; - if(que[i]->req_age>getage(user.birth)) - continue; - timeleft=0xffff; - cls(); - bprintf("\1w\1h%s Questionnaire: \1y%u questions\r\n\r\n" - "\1cAnswers will be viewable by other users.\r\n\r\n" - ,que[i]->desc,que[i]->total_ques); - if(yesno("Continue with questionnaire")) - get_que(i,&user); } -timeleft=0xffff; -get_mbtype(&user); -timeleft=0xffff; -get_purity(&user); -if(!get_user_info(&user)) { - timeleft=tleft; - return; } -user.updated=time(NULL); -useron=user; -bputs("\1n\1h\r\nSaving..."); -rewind(index); -while(!feof(index)) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(!ixb.number) { /* Deleted User */ - fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET); - break; } } - -useron_record=ftell(index)/sizeof(ixb_t); - -write_user(); -adjust_cdt(profile_cdt); - -if(notify_user && notify_user!=user_number) { - sprintf(str,"\1n\1hSMM: \1y%s \1madded %s profile to the Match Maker.\r\n" - ,user_name,user_sex=='M' ? "his":"her"); - if(node_dir[0]) - putsmsg(notify_user,str); - else - puttgram(notify_user,str); } - -timeleft=tleft; -} - -void delphoto(user_t user) -{ - char fname[64],path[128]; - int i; - struct ffblk ff; - -if(!(user.misc&USER_PHOTO)) - return; -for(i=0;user.system[i];i++) - if(isalnum(user.system[i])) - break; -if(!user.system[i]) - fname[0]='~'; -else - fname[0]=user.system[i]; -for(i=strlen(user.system)-1;i>0;i--) - if(isalnum(user.system[i])) - break; -if(i<=0) - fname[1]='~'; -else - fname[1]=user.system[i]; -fname[2]=0; -strupr(user.system); -strcat(fname,base41(crc16(user.system),tmp)); -strcat(fname,base41(user.number,tmp)); -strcat(fname,".*"); -strupr(fname); -sprintf(path,"PHOTO\\%s",fname); -i=findfirst(path,&ff,0); -if(i) - return; -sprintf(path,"PHOTO\\%s",ff.ff_name); -if(remove(path)) - bprintf("\1r\1h\7%s couldn't be removed!\1n\r\n",path); -else - bprintf("\1r\1hPhoto removed.\r\n"); -} - - -void smm_exit() -{ - char str[128]; - int i; - FILE *in,*out; - -if(io_int) { - io_int=0; - ivhctl(0); } -if(com_port) { - for(i=0;i<5;i++) - if(!rioctl(TXBC)) /* wait for rest of output */ - break; - else - mswait(1000); - rioini(0,0); } -if(useron.number) { - useron.lastin=time(NULL); - write_user(); } -if(stream) - fclose(stream); -if(cdt_adjustment) { - if(node_dir[0]) { - sprintf(str,"%sMODUSER.DAT",node_dir); - if((out=fopen(str,"wt"))==NULL) { - bprintf("Error opening %s for write\r\n",str); - return; } - fprintf(out,"%ld",cdt_adjustment); - fclose(out); } - else { /* Write back credits to DOOR.SYS */ - strcpy(str,door_sys); - str[strlen(str)-1]='_'; - remove(str); - rename(door_sys,str); - if((in=fopen(str,"rb"))==NULL) { - bprintf("Error opening %s for read\r\n",str); - return; } - if((out=fopen(door_sys,"wb"))==NULL) { - bprintf("Error opening %s for write\r\n",door_sys); - return; } - for(i=0;!feof(in);i++) { - if(!fgets(tmp,128,in)) - break; - if(i+1==30) - fprintf(out,"%ld\r\n",-(cdt_adjustment/1024L)); - else if(i+1==31) - fprintf(out,"%ld\r\n",(user_cdt+cdt_adjustment)/1024L); - else - fprintf(out,"%s",tmp); } - fclose(in); - fclose(out); - remove(str); - } } -} - -time_t checktime() -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - -void statusline(void) -{ - int col,row; - -col=lclwx(); -row=lclwy(); -lclxy(1,node_scrnlen); -lclatr(CYAN|HIGH|(BLUE<<4)); -lputs(" "); -lprintf("%-25.25s %02d %-25.25s %02d %c %s" - ,user_name,user_level,user_realname[0] ? user_realname : user_location - ,getage(user_birth) - ,user_sex ? user_sex : SP - ,user_phone); -lputc(CLREOL); -lclatr(LIGHTGRAY); -lclxy(col,row); -} - - -int minor_protection(user_t user) -{ -if(!user_number || !age_split || SYSOP) - return(0); -if(getage(user_birth)<age_split && getage(user.birth)>=age_split) - return(1); -if(getage(user_birth)>=age_split && getage(user.birth)<age_split) - return(1); -return(0); -} - -void main(int argc, char **argv) -{ - char str[512],name[128],desc[128],gotoname[128],*p,ext,ch; - int i,j,k,file,match,found; - uint base=0xffff; - ushort tleft; - long l,offset; - ulong name_crc,sys_crc,*crc_lst,ul; - FILE *fp,*que_lst; - user_t user; - wall_t wall; - struct ffblk ff; - -nodefile=-1; -node_misc=NM_LOWPRIO; -com_port=-1; -com_base=0; -com_irq=com_rate=0; -node_dir[0]=exec_dir[0]=temp_dir[0]=ctrl_dir[0]=door_sys[0]=system_name[0]=0; -sys_name[0]=0; - -p=getenv("SBBSNODE"); -if(p) { - strcpy(node_dir,p); - if(node_dir[strlen(node_dir)-1]!='\\') - strcat(node_dir,"\\"); - initdata(); } - -gotoname[0]=0; -for(i=1;i<argc;i++) { - if(argv[i][0]=='/') { - switch(toupper(argv[i][1])) { - case 'P': - com_port=atoi(argv[i]+2); - break; - case 'I': - com_irq=atoi(argv[i]+2); - break; - case 'C': - com_base=ahtoul(argv[i]+2); - break; - case 'R': - com_rate=atol(argv[i]+2); - break; - case 'T': - mswtyp=atoi(argv[i]+2); - break; - case 'N': - node_dir[0]=0; - break; - default: - printf("\nusage: SMM [DOOR.SYS] [/option] [/option] [...] [user name]\n"); - printf("\n"); - printf("where:\n"); - printf(" DOOR.SYS is the path and filename of DOOR.SYS\n"); - printf("\n"); - printf(" /p# sets com port\n"); - printf(" /i# sets com irq\n"); - printf(" /c# sets com I/O address (or DIGI or FOSSIL)\n"); - printf(" /r# sets com rate\n"); - printf(" /t# sets time-slice API support\n"); - printf("\n"); - printf(" user name (if specified) is user to look-up\n"); - exit(1); } - continue; } - if(!node_dir[0] && !door_sys[0]) { - strcpy(door_sys,argv[i]); - continue; } - if(gotoname[0]) - strcat(gotoname," "); - strcat(gotoname,argv[i]); } - -if(!node_dir[0] && !door_sys[0]) { - printf("\n\7SBBSNODE environment variable not set and DOOR.SYS not " - "specified.\n"); - exit(1); } - -if(door_sys[0]) { - #ifdef __TURBOC__ - ctrlbrk(cbreakh); - #endif - - #ifdef __WATCOMC__ - putenv("TZ=UCT0"); - setvbuf(stdout,NULL,_IONBF,0); - setvbuf(stderr,NULL,_IONBF,0); - #endif - - if(setmode(fileno(stderr),O_BINARY)==-1) { /* eliminate LF expansion */ - printf("\n\7Can't set stderr to BINARY\n"); - exit(1); } - - starttime=time(NULL); /* initialize start time stamp */ - wordwrap[0]=0; /* set wordwrap to null */ - attr(LIGHTGRAY); /* initialize color and curatr to plain */ - mnehigh=LIGHTGRAY|HIGH; /* mnemonics highlight color */ - mnelow=GREEN; /* mnemonics normal text color */ - sec_warn=180; /* seconds till inactivity warning */ - sec_timeout=300; /* seconds till inactivity timeout */ - tos=lncntr=0; /* init topofscreen and linecounter to 0 */ - lastnodemsg=0; /* Last node to send message to */ - aborted=0; /* Ctrl-C hit flag */ - - fp=fopen(door_sys,"rb"); - if(!fp) { - printf("\n\7ERROR opening %s\n",door_sys); - exit(2); } - user_misc=user_flags2[0]=user_flags3[0]=user_flags4[0]=0; - user_rest[0]=user_exempt[0]=0; - user_sex=user_address[0]=user_zipcode[0]=user_realname[0]=0; - str[0]=0; - fgets(str,81,fp); // 01: COM port - if local - if(com_port==-1) - com_port=atoi(str+3); - str[0]=0; - fgets(str,81,fp); // 02: DCE Rate - user_dce=atoi(str); - fgets(str,81,fp); // 03: Data bits - str[0]=0; - fgets(str,81,fp); // 04: Node num - node_num=atoi(str); - str[0]=0; - fgets(str,81,fp); // 05: DTE rate - if(!com_rate) - com_rate=atol(str); - fgets(str,81,fp); // 06: Screen display - fgets(str,81,fp); // 07: Printer toggle - fgets(str,81,fp); // 08: Page bell - fgets(str,81,fp); // 09: Caller alarm - str[0]=0; - fgets(str,81,fp); // 10: User name - sprintf(user_name,"%.25s",str); - truncsp(user_name); - str[0]=0; - fgets(str,81,fp); // 11: User location - sprintf(user_location,"%.30s",str); - truncsp(user_location); - str[0]=0; - fgets(str,81,fp); // 12: Home phone - sprintf(user_phone,"%.12s",str); - truncsp(user_phone); - fgets(str,81,fp); // 13: Work phone - fgets(str,81,fp); // 14: Password - str[0]=0; - fgets(str,81,fp); // 15: Security Level - user_level=atoi(str); - fgets(str,81,fp); // 16: Total logons - fgets(str,81,fp); // 17: Last on date - str[0]=0; - fgets(str,81,fp); // 18: Time left in seconds - timeleft=atoi(str); - fgets(str,81,fp); // 19: Time left in minutes - str[0]=0; - fgets(str,81,fp); // 20: Graphics - if(!strnicmp(str,"GR",2)) - user_misc|=(COLOR|ANSI); - str[0]=0; - fgets(str,81,fp); // 21: Screen length - user_rows=atoi(str); - if(user_rows<10) - user_rows=24; - fgets(str,81,fp); // 22: Expert? - str[0]=0; - fgets(str,81,fp); // 23: Registered conferences - sprintf(user_flags1,"%.26s",str); - truncsp(user_flags1); - fgets(str,81,fp); // 24: Conference came from - str[0]=0; - fgets(str,81,fp); // 25: User's expiration date - user_expire=dstrtounix(str); - str[0]=0; - fgets(str,81,fp); // 26: User's number - user_number=atoi(str); - fgets(str,81,fp); // 27: Default protocol - fgets(str,81,fp); // 28: Total uploads - fgets(str,81,fp); // 29: Total downloads - fgets(str,81,fp); // 30: Kbytes downloaded today - str[0]=0; - fgets(str,81,fp); // 31: Max Kbytes to download today - user_cdt=atol(str)*1024UL; - str[0]=0; - fgets(str,81,fp); // 32: Birthday - truncsp(str); - sprintf(user_birth,"%.8s",str); - fgets(str,81,fp); // 33: Path to MAIN - fgets(str,81,fp); // 34: Path to GEN - str[0]=0; - fgets(str,81,fp); // 35: Sysop's name - sprintf(sys_op,"%.40s",str); - truncsp(sys_op); - fclose(fp); - con_fp=stderr; - if(setmode(fileno(con_fp),O_BINARY)==-1) { /* eliminate LF expansion */ - printf("Can't set console output to BINARY\n"); - exit(1); } - } - -if(!user_number) { - printf("\7\nERROR: Invalid user number (%u)\n",user_number); - exit(5); } - -if(*(&riobp-1)!=23) { - printf("Wrong rciol.obj\n"); - exit(1); } - -node_scrnlen=lclini(0xd<<8); /* Tab expansion, no CRLF expansion */ -lclini(node_scrnlen-1); - -if(com_port) { - lprintf("\r\nInitializing COM port %u: ",com_port); - switch(com_base) { - case 0xb: - lputs("PC BIOS"); - rioctl(I14PC); - if(!com_irq) com_irq=com_port-1; - break; - case 0xffff: - case 0xd: - lputs("DigiBoard"); - rioctl(I14DB); - if(!com_irq) com_irq=com_port-1; - break; - case 0xe: - lputs("PS/2 BIOS"); - rioctl(I14PS); - if(!com_irq) com_irq=com_port-1; - break; - case 0xf: - lputs("FOSSIL"); - rioctl(I14FO); - if(!com_irq) com_irq=com_port-1; - break; - case 0: - base=com_port; - lputs("UART I/O (BIOS), "); - if(com_irq) - lprintf("IRQ %d",com_irq); - else lputs("default IRQ"); - break; - default: - base=com_base; - lprintf("UART I/O %Xh, ",com_base); - if(com_irq) - lprintf("IRQ %d",com_irq); - else lputs("default IRQ"); - break; } - - if(base==0xffff) - lprintf(" channel %u",com_irq); - i=rioini(base,com_irq); - if(i) { - lprintf(" - Failed! (%d)\r\n",i); - exit(1); } - if(mdm_misc&MDM_FLOWCTRL) - rioctl(IOSM|CTSCK|RTSCK); /* set rts/cts chk */ - if(com_rate) - setbaud((uint)(com_rate&0xffffL)); - msr=&riobp-1; } - -/* STATUS LINE */ -statusline(); - -rioctl(TSTYPE|mswtyp); /* set time-slice API type */ - -rioctl(CPTON); /* ctrl-p translation */ - -i=INT29L; -if(com_port) - i|=(INT29R|INT16); -ivhctl(i); -io_int=1; - -atexit(smm_exit); - -printf("\r\nSynchronet Match Maker v%s Developed 1995-1997 Rob Swindell\n\n" - ,SMM_VER); - -if(checktime()) { - printf("Time problem!\n"); - return; } - -if((file=nopen("SMM.CFG",O_RDONLY))==-1) { - bprintf("\r\n\7Error opening/creating SMM.DAB\r\n"); - exit(1); } -if((stream=fdopen(file,"w+b"))==NULL) { - bprintf("\r\n\7Error converting SMM.DAB file handle to stream\r\n"); - exit(1); } -str[0]=0; -fgets(str,128,stream); -purity_age=atoi(str); -str[0]=0; -fgets(str,128,stream); -min_age=atoi(str); -str[0]=0; -fgets(str,128,stream); -min_level=atoi(str); - -req_flags1[0]=0; -fgets(req_flags1,128,stream); -req_flags1[27]=0; -truncsp(req_flags1); - -req_flags2[0]=0; -fgets(req_flags2,128,stream); -req_flags2[27]=0; -truncsp(req_flags2); - -req_flags3[0]=0; -fgets(req_flags3,128,stream); -req_flags3[27]=0; -truncsp(req_flags3); - -req_flags4[0]=0; -fgets(req_flags4,128,stream); -req_flags4[27]=0; -truncsp(req_flags4); - -str[0]=0; -fgets(str,128,stream); -profile_cdt=atol(str); -str[0]=0; -fgets(str,128,stream); -telegram_cdt=atol(str); -str[0]=0; -fgets(str,128,stream); -auto_update=atoi(str); -str[0]=0; -fgets(str,128,stream); -notify_user=atoi(str); - -fgets(str,128,stream); // regnum - -str[0]=0; -fgets(str,128,stream); -telegram_level=atoi(str); - -str[0]=0; -fgets(str,128,stream); -que_level=atoi(str); - -str[0]=0; -fgets(str,128,stream); -wall_level=atoi(str); - -str[0]=0; -fgets(str,128,stream); -wall_cdt=atol(str); - -str[0]=0; -fgets(str,128,stream); -que_cdt=atol(str); - -fgets(zmodem_send,128,stream); -if(!zmodem_send[0]) - strcpy(zmodem_send,DEFAULT_ZMODEM_SEND); -truncsp(zmodem_send); - -str[0]=0; -fgets(str,128,stream); -smm_misc=atol(str); - -fgets(str,128,stream); -sprintf(system_name,"%.40s",str); -truncsp(system_name); - -fgets(local_view,128,stream); -truncsp(local_view); - -str[0]=0; -fgets(str,128,stream); -sysop_level=atoi(str); -if(!sysop_level) - sysop_level=90; - -str[0]=0; -fgets(str,128,stream); -wall_age=atoi(str); - -str[0]=0; -fgets(str,128,stream); -age_split=atoi(str); - -fclose(stream); - -if(!system_name[0] && sys_name[0]) - strcpy(system_name,sys_name); -if(!system_name[0]) { - printf("\7\nERROR: System name not specified\n"); - exit(3) ; } - -sprintf(str,"%.25s",system_name); -strupr(str); -system_crc=crc32(str); - -if((file=open("SMM.DAB",O_RDWR|O_BINARY|SH_DENYNO|O_CREAT - ,S_IWRITE|S_IREAD))==-1) { - bprintf("\r\n\7Error opening/creating SMM.DAB\r\n"); - exit(1); } -if((stream=fdopen(file,"w+b"))==NULL) { - bprintf("\r\n\7Error converting SMM.DAB file handle to stream\r\n"); - exit(1); } -setvbuf(stream,0L,_IOFBF,4096); - -if((file=open("SMM.IXB",O_RDWR|O_BINARY|SH_DENYNO|O_CREAT - ,S_IWRITE|S_IREAD))==-1) { - bprintf("\r\n\7Error opening/creating SMM.IXB\r\n"); - exit(1); } -if((index=fdopen(file,"w+b"))==NULL) { - bprintf("\r\n\7Error converting SMM.IXB file handle to stream\r\n"); - exit(1); } -setvbuf(stream,0L,_IOFBF,1024); - -trashfile=NULL; -if((file=open("SMM.CAN",O_RDONLY|SH_DENYNO))!=-1) { - trashfile=fdopen(file,"rb"); - setvbuf(trashfile,NULL,_IOFBF,4096); } - -total_ques=0; -i=nopen("QUE.LST",O_RDONLY); -if(i!=-1) - que_lst=fdopen(i,"rb"); -else - que_lst=NULL; -i=0; -while(que_lst && !feof(que_lst) && i<5) { - if(!fgets(name,81,que_lst)) - break; - truncsp(name); - strupr(name); - sprintf(str,"%s.QUE",name); - if(!fgets(desc,81,que_lst)) - break; - truncsp(desc); - if(!fgets(tmp,81,que_lst)) - break; - truncsp(tmp); - if((file=nopen(str,O_RDONLY))!=-1) { - fp=fdopen(file,"rb"); - total_ques++; - if((que[i]=(questionnaire_t *)MALLOC(sizeof(questionnaire_t)))==NULL) { - bprintf("Can't malloc questionnaires!\r\n"); - exit(1); } - sprintf(que[i]->name,"%.8s",name); - sprintf(que[i]->desc,"%.25s",desc); - que[i]->req_age=atoi(tmp); - fgets(str,128,fp); - que[i]->total_ques=atoi(str); - if(que[i]->total_ques<1 || que[i]->total_ques>20) { - bprintf("Invalid number of questions (%d) in questionnaire #%d\r\n" - ,que[i]->total_ques,i+1); - exit(1); } - for(j=0;j<que[i]->total_ques;j++) { - if(!fgets(str,128,fp)) - break; - truncsp(str); - if(!str[0]) - break; - str[80]=0; - strcpy(que[i]->que[j].txt,str); - fgets(str,128,fp); - que[i]->que[j].answers=atoi(str); - if(que[i]->que[j].answers<1 || que[i]->que[j].answers>16) { - bprintf("Invalid number of answers (%d) in question #%d " - "of questionnaire #%d\r\n" - ,que[i]->que[j].answers,j+1,i+1); - exit(1); } - fgets(str,128,fp); - que[i]->que[j].allowed=atoi(str); - for(k=0;k<que[i]->que[j].answers;k++) { - if(!fgets(str,128,fp)) - break; - truncsp(str); - if(!str[0]) - break; - str[60]=0; - strcpy(que[i]->que[j].ans[k],str); } - que[i]->que[j].answers=k; } - - que[i]->total_ques=j; } - fclose(fp); - i++; } -fclose(que_lst); - -lncntr=0; -getsmsg(user_number); -if(lncntr) - pause(); - -memset(&useron,0,sizeof(user_t)); - -atexit(smm_exit); - -bputs("\1n\1hSearching for your profile..."); -rewind(index); -while(!feof(index)) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(ixb.system==system_crc && ixb.number==user_number) { - useron_record=(ftell(index)-sizeof(ixb_t))/sizeof(ixb_t); - fseek(stream,useron_record*sizeof(user_t),SEEK_SET); - fread(&user,sizeof(user_t),1,stream); - if(stricmp(user.realname,user_name)) { /* new name, so delete it */ - user.misc|=USER_DELETED; - fseek(stream,ftell(stream)-sizeof(user_t),SEEK_SET); - fwrite(&user,sizeof(user_t),1,stream); - fseek(stream,0,SEEK_CUR); - fseek(index,ftell(index)-sizeof(ixb_t),SEEK_SET); - ixb.number=0; - fwrite(&ixb,sizeof(ixb_t),1,index); - sprintf(str,"%04u.MSG",user_number); - remove(str); - continue; } - useron=user; /* name matches, same user */ - break; } } -fflush(stream); -fflush(index); -CRLF; - -if(useron.number && useron.sex!='M' && useron.sex!='F') { - if(yesno("Are you of male gender")) - useron.sex='M'; - else - useron.sex='F'; - write_user(); - user_sex=useron.sex; } - -if(!useron.number && user_sex!='M' && user_sex!='F' && can_add()) { - if(yesno("Are you of male gender")) - user_sex='M'; - else - user_sex='F'; } - -if(!useron.number && can_add()) { - sprintf(str,"%04u.MSG",user_number); - remove(str); - printfile("SMM_LOGO.ASC"); - if(yesno("\r\nYour profile doesn't exist. Create it now")) - add_userinfo(); } - -if(gotoname[0]) { - strupr(gotoname); - name_crc=crc32(gotoname); - rewind(index); - i=0; - while(!feof(index)) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(!ixb.number) /* DELETED */ - continue; - if(ixb.name!=name_crc) - continue; - fseek(stream - ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); - if(!fread(&user,sizeof(user_t),1,stream)) - continue; - if(minor_protection(user)) - continue; - i=1; - if(!long_user_info(user)) - break; } - if(!i) { - bprintf("\r\n\1n\1h%s \1rnot found.\r\n",gotoname); - pause(); } - return; } - -/*********************************************/ -/* ALL User Messages (from Digital Dynamics) */ -/*********************************************/ -for(i=findfirst("ALL*.MSG",&ff,0);!i;i=findnext(&ff)) { - if((j=nopen(ff.ff_name,O_RDONLY))==-1) { - bprintf("\1n\1r\1hCan't open \1w%s\r\n",ff.ff_name); - pause(); - continue; } - if((fp=fdopen(j,"rb"))==NULL) { - bprintf("\1n\1r\1hCan't fdopen \1w%s\r\n",ff.ff_name); - pause(); - continue; } - str[0]=0; - fgets(str,128,fp); - truncsp(str); - ul=ahtoul(str); /* Expiration date */ - ul^=0x305F6C81UL; - attr(LIGHTGRAY); - cls(); - while(!feof(fp)) { - if(!fgets(str,128,fp)) - break; - bputs(str); } - fclose(fp); - CRLF; - if(ul<=time(NULL)) - remove(ff.ff_name); } - -/**************************************************/ -/* One-time User Messages (from Digital Dynamics) */ -/**************************************************/ -for(i=findfirst("ONE*.MSG",&ff,0);!i;i=findnext(&ff)) { - if(fdate_dir(ff.ff_name)<useron.lastin) - continue; - if((j=nopen(ff.ff_name,O_RDONLY))==-1) { - bprintf("\1n\1r\1hCan't open \1w%s\r\n",ff.ff_name); - pause(); - continue; } - if((fp=fdopen(j,"rb"))==NULL) { - bprintf("\1n\1r\1hCan't fdopen \1w%s\r\n",ff.ff_name); - pause(); - continue; } - str[0]=0; - fgets(str,128,fp); - truncsp(str); - ul=ahtoul(str); /* Expiration date */ - ul^=0x305F6C81UL; - attr(LIGHTGRAY); - cls(); - while(!feof(fp)) { - if(!fgets(str,128,fp)) - break; - bputs(str); } - fclose(fp); - CRLF; - if(ul<=time(NULL)) - remove(ff.ff_name); } - -/******************************************/ -/* Sysop Messages (from Digital Dynamics) */ -/******************************************/ -for(i=findfirst("SYS*.MSG",&ff,0);SYSOP && !i;i=findnext(&ff)) { - if((j=nopen(ff.ff_name,O_RDONLY))==-1) { - bprintf("\1n\1r\1hCan't open \1w%s\r\n",ff.ff_name); - pause(); - continue; } - if((fp=fdopen(j,"rb"))==NULL) { - bprintf("\1n\1r\1hCan't fdopen \1w%s\r\n",ff.ff_name); - pause(); - continue; } - str[0]=0; - fgets(str,128,fp); - truncsp(str); - ul=ahtoul(str); /* Expiration date */ - ul^=0x305F6C81UL; - attr(LIGHTGRAY); - cls(); - while(!feof(fp)) { - if(!fgets(str,128,fp)) - break; - bputs(str); } - fclose(fp); - CRLF; - if(ul<=time(NULL) || !noyes("Delete message")) - remove(ff.ff_name); } - -statusline(); -while(1) { - checkline(); - aborted=0; - attr(LIGHTGRAY); - cls(); - - bprintf("\1n \1b\1hSynchronet \1cMatch Maker \1bv%s (XSDK v%s) " - "Developed 1995-1997 Rob Swindell\1n\r\n\r\n",SMM_VER,xsdk_ver); - printfile("SMM_LOGO.ASC"); - CRLF; - - l=filelength(fileno(stream)); - if(l<0) l=0; - sprintf(str,"\1n\1cThere are \1h%lu\1n\1c entries in the user profile " - "database.\r\n",l/(long)sizeof(user_t)); - center(str); - - sprintf(str,"%04u.MSG",user_number); - if(fexist(str)) - center("\1h\1mYou have awaiting telegrams!\r\n"); - - if(flength("WALL.DAB")>0) - center("\1h\1cThere is writing on the Wall.\r\n"); - - if(!useron.number) - center("\1h\1rYou have not yet created a profile!\r\n"); - - printfile("SMM_MAIN.ASC"); - - nodesync(); /* Display any waiting messages */ - - bprintf("\r\n%32s\1b\1hWhich or [\1wQ\1b]uit: \1h\1w",nulstr); - ch=getkey(K_UPPER); -// bprintf("%c\r\n",ch); - bputs("\r\1>"); - switch(ch) { - case '?': - break; - case '*': - if(!SYSOP) - break; - bputs("\1n\1hSearching..."); - rewind(stream); - while(!feof(stream) && !aborted) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - if(user.misc&USER_DELETED) { - sprintf(str,"\r\nUndelete \1c%s \1b(\1c%s@%s\1b)" - ,user.name,user.realname,user.system); - if(!yesno(str)) - continue; - fseek(stream,ftell(stream)-sizeof(user_t),SEEK_SET); - user.misc&=~USER_DELETED; - fwrite(&user,sizeof(user_t),1,stream); - fseek(stream,0,SEEK_CUR); - fseek(index - ,((ftell(stream)-sizeof(user_t))/sizeof(user_t)) - *sizeof(ixb_t),SEEK_SET); - strcpy(str,user.name); - strupr(str); - ixb.name=crc32(str); - sprintf(str,"%.25s",user.system); - strupr(str); - ixb.system=crc32(str); - ixb.updated=user.updated; - ixb.number=user.number; - fwrite(&ixb,sizeof(ixb_t),1,index); - } } - fflush(stream); - fflush(index); - break; - case '!': - if(!SYSOP) - break; - cls(); - bputs("\1n\1hSystems Participating in Your Database:\r\n\r\n\1m"); - crc_lst=NULL; - j=0; - rewind(stream); - while(!feof(stream) && !aborted) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - if(user.misc&USER_DELETED || !(user.misc&USER_FROMSMB)) - continue; - if(!smm_pause) - lncntr=0; - sprintf(str,"%.25s",user.system); - strupr(str); - sys_crc=crc32(str); - for(i=0;i<j;i++) - if(sys_crc==crc_lst[i]) - break; - if(i==j) { - crc_lst=REALLOC(crc_lst,(j+1)*sizeof(ulong)); - if(crc_lst==NULL) { - printf("REALLOC error!\n"); - pause(); - break; } - crc_lst[j++]=sys_crc; - bprintf("%s\r\n",user.system); } } - if(crc_lst) - FREE(crc_lst); - if(j) - bprintf("\1n\r\n\1h%u systems listed.\r\n",j); - pause(); - break; - case '\\': - if(!SYSOP) - break; - bprintf("Rebuilding Index..."); - rewind(stream); - rewind(index); - while(!feof(stream)) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - if(user.misc&USER_DELETED) - ixb.number=0; - else - ixb.number=user.number; - strupr(user.name); - ixb.name=crc32(user.name); - strupr(user.system); - user.system[25]=0; - ixb.system=crc32(user.system); - ixb.updated=user.updated; - fwrite(&ixb,sizeof(ixb_t),1,index); } - break; - case 'R': - if(useron.number) { - bputs("\1y\1hMinimum match percentage: \1w"); - sprintf(str,"%u",useron.min_match); - if(!getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL) || aborted) - break; - useron.min_match=atoi(str); - if(useron.min_match>100) - useron.min_match=100; } - rewind(stream); - bprintf("\1n\1l\1hSearching..."); - while(!feof(stream) && !aborted) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - if(user.misc&USER_DELETED) - continue; - if(minor_protection(user)) - continue; - if(useron.min_match && useron.number) { - match=total_match(useron,user); - if(match<useron.min_match) - continue; } - if(!long_user_info(user)) - break; - if(!smm_pause) - lncntr=0; - bprintf("\1n\1l\1hSearching..."); } - break; - case 'F': - bputs("\1y\1hText to search for: "); - if(!getstr(str,25,K_UPPER|K_LINE)) - break; - ext=yesno("\r\nDisplay extended profiles"); - cls(); - if(!smm_pause && !ext) - printfile("LIST_HDR.ASC"); - rewind(stream); - i=0; - while(!aborted) { - bprintf("\1n\1l\1hSearching..."); - while(!feof(stream) && !aborted) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - if(user.misc&USER_DELETED) - continue; - if(minor_protection(user)) - continue; - tmpuser=user; - sprintf(tmp,"%lu",user.number); - strupr(user.name); - strupr(user.realname); - strupr(user.system); - strupr(user.location); - strupr(user.note[0]); - strupr(user.note[1]); - strupr(user.note[2]); - strupr(user.note[3]); - strupr(user.note[4]); - if(strstr(user.name,str) - || strstr(user.location,str) - || strstr(user.mbtype,str) - || strstr(user.note[0],str) - || strstr(user.note[1],str) - || strstr(user.note[2],str) - || strstr(user.note[3],str) - || strstr(user.note[4],str) - || (SYSOP && strstr(user.realname,str)) - || (SYSOP && strstr(user.system,str)) - || (SYSOP && !strcmp(tmp,str)) - ) { - i=1; - if(ext && !long_user_info(tmpuser)) - break; - if(!ext && short_user_info(tmpuser)==0) - break; - if(!smm_pause) - lncntr=0; } } - if(aborted || ext || !lncntr) - break; - user.number=0; - if(short_user_info(user)>=0) - break; } - if(!i) - bprintf("\r\n\1n\1h%s \1rnot found.\r\n",str); - break; - case 'G': - bputs("\1y\1hUser name: "); - if(!getstr(str,25,K_UPPER|K_LINE)) - break; - truncsp(str); - name_crc=crc32(str); - rewind(index); - i=0; - while(!feof(index)) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(!ixb.number) /* DELETED */ - continue; - if(ixb.name!=name_crc) - continue; - fseek(stream - ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); - if(!fread(&user,sizeof(user_t),1,stream)) - continue; - if(minor_protection(user)) - continue; - i=1; - if(!long_user_info(user)) - break; } - if(!i) - bprintf("\r\n\1n\1h%s \1rnot found.\r\n",str); - break; - case 'L': - if(useron.number) { - bputs("\1y\1hMinimum match percentage: \1w"); - sprintf(str,"%u",useron.min_match); - if(!getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL) || aborted) - break; - useron.min_match=atoi(str); - if(useron.min_match>100) - useron.min_match=100; } - cls(); - if(!smm_pause) - printfile("LIST_HDR.ASC"); - rewind(stream); - while(!aborted) { - while(!feof(stream) && !aborted) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - if(user.misc&USER_DELETED) - continue; - if(minor_protection(user)) - continue; - if(useron.min_match && useron.number) { - match=total_match(useron,user); - if(match<useron.min_match) - continue; } - if(!short_user_info(user)) - break; - if(!smm_pause) - lncntr=0; } - if(aborted || !lncntr) - break; - user.number=0; - if(short_user_info(user)>=0) - break; } - break; - - case 'N': - while(1) { - checkline(); - bputs("\1y\1hLast update (MM/DD/YY): "); - if(useron.number) - unixtodstr(useron.lastin,str); - else - str[0]=0; - if(!getstr(str,8,K_UPPER|K_LINE|K_EDIT|K_AUTODEL)) - break; - if(isdigit(str[0]) && isdigit(str[1]) && str[2]=='/' - && isdigit(str[3]) && isdigit(str[4]) && str[5]=='/' - && isdigit(str[6]) && isdigit(str[7])) - break; - bputs("\r\n\1h\1rInvalid date!\r\n\r\n"); } - if(!str[0] || aborted) - break; - l=dstrtounix(str); - if(useron.number) { - bputs("\1y\1h\r\nMinimum match percentage: \1w"); - sprintf(str,"%u",useron.min_match); - if(!getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL) || aborted) - break; - useron.min_match=atoi(str); - if(useron.min_match>100) - useron.min_match=100; } - ext=!noyes("\r\nDisplay extended profiles"); - if(aborted) - break; - cls(); - if(!ext && !smm_pause) - printfile("LIST_HDR.ASC"); - rewind(index); - while(!aborted) { - while(!feof(index) && !aborted) { - if(!smm_pause) - lncntr=0; - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(!ixb.number) /* DELETED */ - continue; - if(ixb.updated>=l) { - fseek(stream - ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); - if(!fread(&user,sizeof(user_t),1,stream)) - continue; - if(minor_protection(user)) - continue; - if(useron.min_match && useron.number) { - match=total_match(useron,user); - if(match<useron.min_match) - continue; } - if(ext && !long_user_info(user)) - break; - if(!ext && short_user_info(user)==0) - break; - continue; } } - if(aborted || ext || !lncntr) - break; - user.number=0; - if(short_user_info(user)>=0) - break; } - break; - - case 'U': - case 'W': /* Create/Edit Profile */ - if(!can_add()) { - bprintf("\1h\1rYou have insufficient access to create a " - "profile.\r\n\r\n"); - break; } - - if(!useron.number) { - add_userinfo(); - break; } - - user=useron; - tleft=timeleft; - if(!get_user_info(&user)) { - timeleft=tleft; - break; } - - if(!memcmp(&user,&useron,sizeof(user_t))) { - timeleft=tleft; - break; } - - if(!yesno("Save changes")) { - timeleft=tleft; - break; } - timeleft=tleft; - user.updated=time(NULL); - useron=user; - write_user(); - break; - - case 'D': - if(SYSOP) { - bputs("Name to Delete: "); - if(useron.number) { - strcpy(str,useron.name); - strupr(str); } - else - str[0]=0; - getstr(str,25,K_UPPER|K_LINE|K_EDIT|K_AUTODEL); - rewind(stream); - while(!feof(stream)) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - strcpy(tmp,user.name); - strupr(tmp); - if(!(user.misc&USER_DELETED) && strstr(tmp,str)) { - sprintf(tmp,"Delete %s (%s@%s)" - ,user.name,user.realname,user.system); - i=noyes(tmp); - if(aborted) - break; - if(i) - continue; - fseek(stream,ftell(stream)-sizeof(user_t),SEEK_SET); - fseek(index - ,((ftell(stream)-sizeof(user_t))/sizeof(user_t)) - *sizeof(ixb_t),SEEK_SET); - user.misc|=USER_DELETED; - fwrite(&user,sizeof(user_t),1,stream); - fseek(stream,0,SEEK_CUR); - memset(&ixb,0,sizeof(ixb_t)); - fwrite(&ixb,sizeof(ixb_t),1,index); - fflush(stream); - fflush(index); - delphoto(user); - if(user.number==user_number - && !stricmp(user.system,system_name)) - useron.number=0; - break; } } - if(aborted) - break; - break; } - if(!useron.number) { - bputs("\1h\1rYour profile doesn't exist.\r\n\r\n"); - break; } - if(noyes("Are you sure you want to delete your profile")) - break; - if(!cdt_warning(-profile_cdt)) - break; - sprintf(str,"%04u.MSG",user_number); - remove(str); - fseek(stream,useron_record*sizeof(user_t),SEEK_SET); - useron.misc|=USER_DELETED; - fwrite(&useron,sizeof(user_t),1,stream); - fflush(stream); - memset(&ixb,0,sizeof(ixb_t)); - fseek(index,useron_record*sizeof(ixb_t),SEEK_SET); - fwrite(&ixb,sizeof(ixb_t),1,index); - fflush(index); - delphoto(user); - useron.number=0; - aborted=0; - bputs("\r\n\1h\1r\1iProfile deleted.\r\n"); - adjust_cdt(-profile_cdt); - break; - case 'P': - smm_pause=!smm_pause; - bprintf("\1r\1hScreen pause is now \1w%s\r\n\r\n" - ,smm_pause ? "ON":"OFF"); - break; - case 'M': - mbtype_desc(useron.mbtype); - break; - case 'H': - cls(); - printfile("SMM_HELP.ASC"); - break; - case 'O': - if(noyes("Hang-up now")) - break; - dtr(5); - if(node_dir) { - sprintf(str,"%sHANGUP.NOW",node_dir); - fopen(str,"wb"); - nodesync(); } - return; - case 'S': - bputs("\1y\1hUser name: "); - if(!getstr(str,25,K_UPPER|K_LINE)) - break; - truncsp(str); - name_crc=crc32(str); - rewind(index); - i=0; - while(!feof(index)) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(!ixb.number) /* DELETED */ - continue; - if(ixb.name!=name_crc) - continue; - fseek(stream - ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); - if(!fread(&user,sizeof(user_t),1,stream)) - continue; - if(minor_protection(user)) - continue; - i=1; - if(send_telegram(user)) - break; } - if(!i) - bprintf("\r\n\1n\1h%s \1rnot found.\r\n",str); - break; - case 'T': - sprintf(str,"%04u.MSG",user_number); - if(!fexist(str)) { - bputs("\1r\1hYou have no telegrams waiting.\r\n\r\n"); - break; } - cls(); - printfile(str); - if(noyes("\r\nDelete all telegrams waiting for you")) - break; - remove(str); - break; - case 'V': /* Visit the wall */ - if(getage(user_birth)<wall_age && !SYSOP) { - bputs("\1r\1hSorry, you're too young to view the wall.\r\n"); - pause(); - break; } - while(1) { - checkline(); - bputs("\1y\1hView writing since (MM/DD/YY): "); - if(useron.number) - unixtodstr(useron.lastin,str); - else - str[0]=0; - if(!getstr(str,8,K_UPPER|K_LINE|K_EDIT|K_AUTODEL)) - break; - if(isdigit(str[0]) && isdigit(str[1]) && str[2]=='/' - && isdigit(str[3]) && isdigit(str[4]) && str[5]=='/' - && isdigit(str[6]) && isdigit(str[7])) - break; - bputs("\r\n\1h\1rInvalid date!\r\n\r\n"); } - if(aborted) - break; - l=dstrtounix(str); - ext=yesno("\r\nDisplay extended information when available"); - if(aborted) - break; - strcpy(str,"WALL.DAB"); - if((file=sopen(str,O_RDWR|O_BINARY|O_CREAT,SH_DENYNO - ,S_IREAD|S_IWRITE))==-1) { - bprintf("\r\nError opening %s\r\n",str); - break; } - cls(); - offset=0L; - while(!eof(file) && !aborted) { - if(read(file,&wall,sizeof(wall_t))!=sizeof(wall_t)) - break; - if(wall.imported<l) - continue; - strcpy(str,wall.name); - strupr(str); - name_crc=crc32(str); - sprintf(str,"%.25s",wall.system); - strupr(str); - sys_crc=crc32(str); - rewind(index); - i=0; - user.sex=0; - while(ext && !feof(index) && !aborted) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(!ixb.number) /* DELETED */ - continue; - if(ixb.name!=name_crc || ixb.system!=sys_crc) - continue; - fseek(stream - ,((ftell(index)-sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); - if(!fread(&user,sizeof(user_t),1,stream)) - continue; - if(minor_protection(user)) - break; - main_user_info(user); - if(useron.number) { - CRLF; - bprintf("\1h\1mThis user meets your profile " - "preferences:\1w%3u%% " - ,basic_match(useron,user)); - bprintf("\1n\1gCreated: \1h%s\r\n" - ,unixtodstr(user.created,str)); - bprintf("\1h\1mYou meet this user's profile " - "preferences:\1w%3u%% " - ,basic_match(user,useron)); - bprintf("\1n\1gUpdated: \1h%s\r\n" - ,unixtodstr(user.updated,str)); } - - i=1; - CRLF; - break; } - if(!i) { - if(ext) - cls(); - bprintf("\1n\1h%s ",wall.name); } - bprintf("\1n\1h\1cWrote on %s:\r\n" - ,timestr(&wall.written)); - for(j=0;j<5;j++) { - if(!wall.text[j][0]) - break; - bprintf("\1n\1%c%5s%s\r\n" - ,user.sex=='F'?'m':'g',"",wall.text[j]); } - if(aborted) - break; - if(ext) { - nodesync(); - if(i) { - bputs(PrevReadSendQuitOrMore); - ch=getkey(K_UPPER); - if(ch=='R') - long_user_info(user); - if(ch=='S') - send_telegram(user); - if(ch=='R' || ch=='S') /* Don't move forward */ - lseek(file,tell(file)-sizeof(wall_t),SEEK_SET); } - else { - bputs("\r\n\1n\1hProfile not found.\r\n\r\n"); - bputs("\1b[\1cP\1b]revious, [\1cQ\1b]uit, " - "or [\1cM\1b]ore: \1c"); - ch=getkey(K_UPPER); } - if(ch=='P') { - lseek(file,offset,SEEK_SET); - if(tell(file)) - lseek(file,tell(file)-sizeof(wall_t),SEEK_SET); - offset=tell(file); - continue; } - if(ch=='Q') { - cls(); - break; } - offset=tell(file); } - else if(lncntr+7>=user_rows || eof(file)) { - lncntr=0; - bputs(PrevReadSendQuitOrMore); - ch=getkey(K_UPPER); - if(ch=='Q') - break; - else if(ch=='S' || ch=='R') { - bprintf("\1n\r\1>\1y\1hUser name: "); - if(getstr(name,25,K_UPPER|K_LINE|K_NOCRLF)) { - truncsp(name); - name_crc=crc32(name); - rewind(index); - i=0; - while(!feof(index)) { - if(!fread(&ixb,sizeof(ixb_t),1,index)) - break; - if(!ixb.number) /* DELETED */ - continue; - if(ixb.name!=name_crc) - continue; - fseek(stream - ,((ftell(index) - -sizeof(ixb_t))/sizeof(ixb_t)) - *sizeof(user_t),SEEK_SET); - if(!fread(&user,sizeof(user_t),1,stream)) - continue; - if(minor_protection(user)) - continue; - i=1; - if(ch=='S' && send_telegram(user)) - break; - if(ch=='R' && !long_user_info(user)) - break; } - if(!i) - bprintf("\r\n\1n\1h%s \1rnot found.\r\n",name); - } - lseek(file,offset,SEEK_SET); } - else if(ch=='P') { - lseek(file,offset,SEEK_SET); - for(i=0;i<4;i++) - if(tell(file)) - lseek(file,tell(file)-sizeof(wall_t),SEEK_SET); - } - cls(); - offset=tell(file); } } - cls(); - if(user_level<wall_level) { - close(file); - bputs("\r\n\1h\1rYou have insufficient access to write on the " - "wall.\r\n"); - pause(); - break; } - if(aborted || noyes("Write on the Wall")) { - close(file); - break; } - if(!useron.number) { - bputs("\r\n\1h\1rYou must create a profile first.\r\n"); - close(file); - break; } - if(!cdt_warning(wall_cdt)) { - close(file); - break; } - memset(&wall,0,sizeof(wall_t)); - strcpy(wall.name,useron.name); - strcpy(wall.system,system_name); - wall.written=wall.imported=time(NULL); - bputs("\1l\1n\1hWriting on the Wall:\r\n\r\n"); - for(i=0;i<5 && !aborted;i++) { - bprintf("\1n\1h\1%c%u of 5: \1n\1%c" - ,useron.sex=='F'?'m':'g',i+1,useron.sex=='F'?'m':'g'); - if(!getstr(wall.text[i],70,i==4 ? K_MSG:K_MSG|K_WRAP)) - break; - if(trash(wall.text[i])) { - bprintf("\r\n\1r\1hSorry, you can't use that text." - "\r\n\r\n"); - i--; - continue; } } - if(!i || aborted || !yesno("\r\nSave")) { - close(file); - break; } - lseek(file,0L,SEEK_END); - write(file,&wall,sizeof(wall_t)); - close(file); - adjust_cdt(wall_cdt); - if(notify_user && notify_user!=user_number) { - sprintf(str,"\1n\1hSMM: \1y%s\1m wrote on the Match Maker " - "Wall\r\n",user_name); - if(node_dir[0]) - putsmsg(notify_user,str); - else - puttgram(notify_user,str); } - break; - case 'Q': - return; } } -} - -/* End of SMM.C */ diff --git a/src/sbbs2/smm/smm2msg.c b/src/sbbs2/smm/smm2msg.c deleted file mode 100644 index 6e9a05da3c..0000000000 --- a/src/sbbs2/smm/smm2msg.c +++ /dev/null @@ -1,539 +0,0 @@ -/* SMM2MSG.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Scans SMM database and posts any additions/updates into an MSG file */ - -#define uint unsigned int - -#include <dos.h> -#include "smblib.h" -#include "smmdefs.h" - -#define VERSION "1.00�" - -smb_t smb; -extern int daylight=0; -extern long timezone=0L; - -unsigned _stklen=16000; /* Set stack size in code, not header */ - -uchar cryptchar(uchar ch, ulong seed) -{ -if(ch==1) - return(0xfe); -if(ch<0x20 || ch&0x80) /* Ctrl chars and ex-ASCII are not xlated */ - return(ch); -return(ch^(seed&0x1f)); -} - -char *encrypt(uchar *str, ulong seed) -{ - static uchar out[1024]; - int i,j; - -j=strlen(str); -for(i=0;i<j;i++) - out[i]=cryptchar(str[i],seed^(i&7)); -out[i]=0; -return(out); -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(1); -return(0); -} - - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - struct time curtime; - struct date date; - -if(!unix) - strcpy(str,"00/00/00"); -else { - unixtodos(unix,&date,&curtime); - if((unsigned)date.da_mon>12) { /* DOS leap year bug */ - date.da_mon=1; - date.da_year++; } - if((unsigned)date.da_day>31) - date.da_day=1; - sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day - ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); } -return(str); -} - -time_t checktime() -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - -#define BUF_LEN 8192 - -int main(int argc, char **argv) -{ - uchar str[128],tmp[128],msg_dir[128],buf[BUF_LEN],telegram[513],*p; - int i,j,file; - ushort xlat; - long length; - ulong offset; - time_t last,t; - user_t user,from; - wall_t wall; - smbmsg_t msg; - FILE *stream; - -fprintf(stderr,"\nSMM2MSG v%s - Write SMM data to MSG - Developed 1995-1997 " - "Rob Swindell\n\n",VERSION); - -if(checktime()) { - printf("Time problem!\n"); - return(-1); } - -if(argc<3) { - fprintf(stderr,"usage: smm2msg <smm.dab> <msg_dir>\n\n"); - fprintf(stderr,"example: smm2msg c:\\sbbs\\xtrn\\smm\\smm.dab " - "c:\\im\\mail\n"); - return(1); } - - -strcpy(msg_dir,argv[2]); -strupr(msg_dir); - -strcpy(str,argv[1]); -strupr(str); -if((file=open(str,O_RDONLY|O_BINARY|O_DENYNONE))==-1) { - printf("error opening %s\n",str); - return(1); } -if((stream=fdopen(file,"rb"))==NULL) { - printf("error fdopening %s\n",str); - return(1); } -setvbuf(stream,NULL,_IOFBF,4096); - -strcpy(tmp,str); -p=strrchr(tmp,'.'); -if(p) { - (*p)=0; - strcat(tmp,"2MSG.DAB"); - if((file=open(tmp,O_RDWR|O_BINARY|O_CREAT,S_IWRITE|S_IREAD))==-1) { - printf("error opening %s\n",str); - return(1); } - t=time(NULL); - if(read(file,&last,sizeof(time_t))!=sizeof(time_t)) - last=0; - lseek(file,0L,SEEK_SET); - write(file,&t,sizeof(time_t)); - close(file); } - -//sprintf(str,"%s.SHD",smb.file); -//if(!fexist(str)) { -// printf("%s doesn't exist\n",smb.file); -// return(0); } -//fprintf(stderr,"Opening %s\n",smb.file); -//smb.retry_time=30; -//if((i=smb_open(&smb))!=0) { -// printf("smb_open returned %d\n",i); -// return(1); } - -strcpy(str,argv[1]); -strupr(str); -p=strrchr(str,'\\'); -if(p) p++; -else p=str; -strcpy(p,"TELEGRAM.DAB"); -if((file=open(str,O_RDWR|O_DENYNONE|O_BINARY))!=-1) { - while(!eof(file)) { - read(file,from.system,sizeof(user.system)); - read(file,user.system,sizeof(user.system)); - read(file,&user.number,sizeof(user.number)); - printf("Telegram to: %lu@%s\n",user.number,user.system); - read(file,telegram,512); - telegram[512]=0; - sprintf(buf,"}%lx\r\n%s",user.number,encrypt(telegram,user.number)); - strcat(buf,"\r\n"); /* blank line terminates telegram */ - strcat(buf,"\r\n--- SMM2MSG v"); - strcat(buf,VERSION); - - length=strlen(buf); /* +2 for translation string */ - - if(smb.status.attr&SMB_HYPERALLOC) - offset=smb_hallocdat(&smb); - else { - i=smb_open_da(&smb); - if(i) { - printf("smb_open_da returned %d\n",i); - exit(1); } - offset=smb_allocdat(&smb,length+2,1); - fclose(smb.sda_fp); } - - fseek(smb.sdt_fp,offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,smb.sdt_fp); - fwrite(buf,length,1,smb.sdt_fp); - length+=2; - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - msg.hdr.when_written.time=time(NULL); - - msg.hdr.offset=offset; - - strcpy(str,"SMM"); - i=smb_hfield(&msg,RECIPIENT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.to=crc16(str); - - strcpy(str,from.system); - i=smb_hfield(&msg,SENDER,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.from=crc16(str); - - strcpy(str,user.system); - i=smb_hfield(&msg,SUBJECT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.subj=crc16(str); - - i=smb_dfield(&msg,TEXT_BODY,length); - if(i) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - - i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC); - if(i) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - smb_freemsgmem(&msg); } - chsize(file,0L); - close(file); } - -strcpy(str,argv[1]); -strupr(str); -p=strrchr(str,'\\'); -if(p) p++; -else p=str; -strcpy(p,"WALL.DAB"); -if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYNO))!=-1) { - while(!eof(file)) { - if(!read(file,&wall,sizeof(wall_t))) - break; - if(last && wall.imported<last) - continue; - - if(wall.imported!=wall.written) /* Imported from SMB */ - continue; - - printf("Wall writing from: %s\n",wall.name); - sprintf(buf,"%s\r\n",encrypt(wall.name,wall.written)); - sprintf(str,"%s\r\n",encrypt(wall.system,wall.written)); - strcat(buf,str); - for(i=0;i<5;i++) { - sprintf(str,"%s\r\n",encrypt(wall.text[i],wall.written)); - strcat(buf,str); } - sprintf(str,"%lx\r\n",wall.written); - strcat(buf,str); - strcat(buf,"\r\n--- SMM2SMB v"); - strcat(buf,VERSION); - - length=strlen(buf); /* +2 for translation string */ - - if(smb.status.attr&SMB_HYPERALLOC) - offset=smb_hallocdat(&smb); - else { - i=smb_open_da(&smb); - if(i) { - printf("smb_open_da returned %d\n",i); - exit(1); } - offset=smb_allocdat(&smb,length+2,1); - fclose(smb.sda_fp); } - - fseek(smb.sdt_fp,offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,smb.sdt_fp); - fwrite(buf,length,1,smb.sdt_fp); - length+=2; - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - msg.hdr.when_written.time=time(NULL); - - msg.hdr.offset=offset; - - strcpy(str,"SMM"); - i=smb_hfield(&msg,RECIPIENT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.to=crc16(str); - - strcpy(str,wall.system); - i=smb_hfield(&msg,SENDER,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.from=crc16(str); - - strcpy(str,"->WALL<-"); - i=smb_hfield(&msg,SUBJECT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.subj=crc16(str); - - i=smb_dfield(&msg,TEXT_BODY,length); - if(i) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - - i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC); - if(i) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - smb_freemsgmem(&msg); } - close(file); } - - -while(!feof(stream)) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - if(user.misc&(USER_FROMSMB|USER_DELETED) - || (last && user.updated<last && user.created<last) - || user.number&0xffff0000L - || user.number==0 - || user.system[0]<SP - || user.name[0]<SP - || user.realname[0]<SP - || user.location[0]<SP - || user.zipcode[0]<SP - || user.birth[0]<SP) - continue; - - printf("Profile: %s\n",user.name); - memset(buf,0,BUF_LEN); - - sprintf(str,"0:%.25s\r\n",encrypt(user.name,user.number)); - strcat(buf,str); - sprintf(str,"1:%.25s\r\n",encrypt(user.realname,user.number)); - strcat(buf,str); - - sprintf(str,"2:%.8s\r\n",encrypt(user.birth,user.number)); - strcat(buf,str); - - sprintf(str,"3:%.30s\r\n",encrypt(user.location,user.number)); - strcat(buf,str); - - sprintf(str,"4:%.10s\r\n",encrypt(user.zipcode,user.number)); - strcat(buf,str); - sprintf(str,"5:%.10s\r\n",encrypt(user.min_zipcode,user.number)); - strcat(buf,str); - sprintf(str,"6:%.10s\r\n",encrypt(user.max_zipcode,user.number)); - strcat(buf,str); - sprintf(str,"7:%.4s\r\n",encrypt(user.mbtype,user.number)); - strcat(buf,str); - - sprintf(str,"A:%.50s\r\n",encrypt(user.note[0],user.number)); - strcat(buf,str); - sprintf(str,"B:%.50s\r\n",encrypt(user.note[1],user.number)); - strcat(buf,str); - sprintf(str,"C:%.50s\r\n",encrypt(user.note[2],user.number)); - strcat(buf,str); - sprintf(str,"D:%.50s\r\n",encrypt(user.note[3],user.number)); - strcat(buf,str); - sprintf(str,"E:%.50s\r\n",encrypt(user.note[4],user.number)); - strcat(buf,str); - - sprintf(str,"F:%c%c\r\n",user.sex,user.pref_sex); - strcat(buf,str); - - sprintf(str,"G:%x\r\n",user.marital); - strcat(buf,str); - sprintf(str,"H:%x\r\n",user.pref_marital); - strcat(buf,str); - - sprintf(str,"I:%x\r\n",user.race); - strcat(buf,str); - sprintf(str,"J:%x\r\n",user.pref_race); - strcat(buf,str); - - sprintf(str,"K:%x\r\n",user.hair); - strcat(buf,str); - sprintf(str,"L:%x\r\n",user.pref_hair); - strcat(buf,str); - - sprintf(str,"M:%x\r\n",user.eyes); - strcat(buf,str); - sprintf(str,"N:%x\r\n",user.pref_eyes); - strcat(buf,str); - - sprintf(str,"O:%x\r\nP:%x\r\nQ:%x\r\n" - ,user.weight,user.min_weight,user.max_weight); - strcat(buf,str); - - sprintf(str,"R:%x\r\nS:%x\r\nT:%x\r\n" - ,user.height,user.min_height,user.max_height); - strcat(buf,str); - - sprintf(str,"U:%x\r\nV:%x\r\nW:%x\r\n" - ,user.min_age,user.max_age,user.purity); - strcat(buf,str); - - sprintf(str,"X:%lx\r\nY:%lx\r\nZ:%lx\r\n!:%lx\r\n" - ,user.income,user.min_income,user.max_income,time(NULL)); - strcat(buf,str); - - for(i=0;i<5;i++) { - if(!user.queans[i].name[0]) - continue; - sprintf(str,"*%d%.8s\r\n",i,encrypt(user.queans[i].name,user.number)); - strcat(buf,str); - for(j=0;j<20;j++) { - sprintf(str," %04x %04x" - ,user.queans[i].self[j] - ,user.queans[i].pref[j]); - strcat(buf,str); - if(!((j+1)%7)) - strcat(buf,"\r\n"); } - strcat(buf,"\r\n"); } - - strcat(buf,"\r\n--- SMM2MSG v"); - strcat(buf,VERSION); - - length=strlen(buf); /* +2 for translation string */ - - if(smb.status.attr&SMB_HYPERALLOC) - offset=smb_hallocdat(&smb); - else { - i=smb_open_da(&smb); - if(i) { - printf("smb_open_da returned %d\n",i); - exit(1); } - offset=smb_allocdat(&smb,length+2,1); - fclose(smb.sda_fp); } - - fseek(smb.sdt_fp,offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,smb.sdt_fp); - fwrite(buf,length,1,smb.sdt_fp); - length+=2; - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - msg.hdr.when_written.time=time(NULL); - - msg.hdr.offset=offset; - - strcpy(str,"SMM"); - i=smb_hfield(&msg,RECIPIENT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.to=crc16(str); - - strcpy(str,user.system); - i=smb_hfield(&msg,SENDER,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.from=crc16(str); - - sprintf(str,"%lu",user.number); - i=smb_hfield(&msg,SUBJECT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.subj=crc16(str); - - i=smb_dfield(&msg,TEXT_BODY,length); - if(i) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - - i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC); - if(i) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - smb_freemsgmem(&msg); } -return(0); -} - diff --git a/src/sbbs2/smm/smm2smb.c b/src/sbbs2/smm/smm2smb.c deleted file mode 100644 index ffb670a48a..0000000000 --- a/src/sbbs2/smm/smm2smb.c +++ /dev/null @@ -1,540 +0,0 @@ -/* SMM2SMB.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Scans SMM database and posts any additions/updates into the an SMB base */ - -#define uint unsigned int - -#include <dos.h> -#include "smblib.h" -#include "smmdefs.h" - -#define VERSION "2.01" - -smb_t smb; -extern int daylight=0; -extern long timezone=0L; - -unsigned _stklen=16000; - -uchar cryptchar(uchar ch, ulong seed) -{ -if(ch==1) - return(0xfe); -if(ch<0x20 || ch&0x80) /* Ctrl chars and ex-ASCII are not xlated */ - return(ch); -return(ch^(seed&0x1f)); -} - -char *encrypt(uchar *str, ulong seed) -{ - static uchar out[1024]; - int i,j; - -j=strlen(str); -for(i=0;i<j;i++) - out[i]=cryptchar(str[i],seed^(i&7)); -out[i]=0; -return(out); -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==0) - return(1); -return(0); -} - - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - struct time curtime; - struct date date; - -if(!unix) - strcpy(str,"00/00/00"); -else { - unixtodos(unix,&date,&curtime); - if((unsigned)date.da_mon>12) { /* DOS leap year bug */ - date.da_mon=1; - date.da_year++; } - if((unsigned)date.da_day>31) - date.da_day=1; - sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day - ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); } -return(str); -} - -time_t checktime() -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - -#define BUF_LEN 8192 - -int main(int argc, char **argv) -{ - uchar str[128],tmp[128],buf[BUF_LEN],telegram[513],*p; - int i,j,file; - ushort xlat; - long length; - ulong offset; - time_t last,t; - user_t user,from; - wall_t wall; - smbmsg_t msg; - FILE *stream; - -fprintf(stderr,"\nSMM2SMB v%s - Write SMM data to SMB - Developed 1994-1997 " - "Rob Swindell\n\n",VERSION); - -if(checktime()) { - printf("Time problem!\n"); - return(-1); } - -if(argc<3) { - fprintf(stderr,"usage: smm2smb <smm.dab> <smb_file>\n\n"); - fprintf(stderr,"example: smm2smb c:\\sbbs\\xtrn\\smm\\smm.dab " - "c:\\sbbs\\data\\subs\\syncdata\n"); - return(1); } - - -strcpy(smb.file,argv[2]); -strupr(smb.file); - -strcpy(str,argv[1]); -strupr(str); -if((file=open(str,O_RDONLY|O_BINARY|O_DENYNONE))==-1) { - printf("error opening %s\n",str); - return(1); } -if((stream=fdopen(file,"rb"))==NULL) { - printf("error fdopening %s\n",str); - return(1); } -setvbuf(stream,NULL,_IOFBF,4096); - -strcpy(tmp,str); -p=strrchr(tmp,'.'); -if(p) { - (*p)=0; - strcat(tmp,"2SMB.DAB"); - if((file=open(tmp,O_RDWR|O_BINARY|O_CREAT,S_IWRITE|S_IREAD))==-1) { - printf("error opening %s\n",str); - return(1); } - t=time(NULL); - if(read(file,&last,sizeof(time_t))!=sizeof(time_t)) - last=0; - lseek(file,0L,SEEK_SET); - write(file,&t,sizeof(time_t)); - close(file); } - -sprintf(str,"%s.SHD",smb.file); -if(!fexist(str)) { - printf("%s doesn't exist\n",smb.file); - return(0); } -fprintf(stderr,"Opening %s\n",smb.file); -smb.retry_time=30; -if((i=smb_open(&smb))!=0) { - printf("smb_open returned %d\n",i); - return(1); } - -strcpy(str,argv[1]); -strupr(str); -p=strrchr(str,'\\'); -if(p) p++; -else p=str; -strcpy(p,"TELEGRAM.DAB"); -if((file=open(str,O_RDWR|O_DENYNONE|O_BINARY))!=-1) { - while(!eof(file)) { - read(file,from.system,sizeof(user.system)); - read(file,user.system,sizeof(user.system)); - read(file,&user.number,sizeof(user.number)); - printf("Telegram to: %lu@%s\n",user.number,user.system); - read(file,telegram,512); - telegram[512]=0; - sprintf(buf,"}%lx\r\n%s",user.number,encrypt(telegram,user.number)); - strcat(buf,"\r\n"); /* blank line terminates telegram */ - strcat(buf,"\r\n--- SMM2SMB v"); - strcat(buf,VERSION); - - length=strlen(buf); /* +2 for translation string */ - - if(smb.status.attr&SMB_HYPERALLOC) - offset=smb_hallocdat(&smb); - else { - i=smb_open_da(&smb); - if(i) { - printf("smb_open_da returned %d\n",i); - exit(1); } - offset=smb_allocdat(&smb,length+2,1); - fclose(smb.sda_fp); } - - fseek(smb.sdt_fp,offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,smb.sdt_fp); - fwrite(buf,length,1,smb.sdt_fp); - length+=2; - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - msg.hdr.when_written.time=time(NULL); - - msg.hdr.offset=offset; - - strcpy(str,"SMM"); - i=smb_hfield(&msg,RECIPIENT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.to=crc16(str); - - strcpy(str,from.system); - i=smb_hfield(&msg,SENDER,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.from=crc16(str); - - strcpy(str,user.system); - i=smb_hfield(&msg,SUBJECT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.subj=crc16(str); - - i=smb_dfield(&msg,TEXT_BODY,length); - if(i) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - - i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC); - if(i) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - smb_freemsgmem(&msg); } - chsize(file,0L); - close(file); } - -strcpy(str,argv[1]); -strupr(str); -p=strrchr(str,'\\'); -if(p) p++; -else p=str; -strcpy(p,"WALL.DAB"); -if((file=sopen(str,O_RDONLY|O_BINARY,SH_DENYNO))!=-1) { - while(!eof(file)) { - if(!read(file,&wall,sizeof(wall_t))) - break; - if(last && wall.imported<last) - continue; - - if(wall.imported!=wall.written) /* Imported from SMB */ - continue; - - printf("Wall writing from: %s\n",wall.name); - sprintf(buf,"%s\r\n",encrypt(wall.name,wall.written)); - sprintf(str,"%s\r\n",encrypt(wall.system,wall.written)); - strcat(buf,str); - for(i=0;i<5;i++) { - sprintf(str,"%s\r\n",encrypt(wall.text[i],wall.written)); - strcat(buf,str); } - sprintf(str,"%lx\r\n",wall.written); - strcat(buf,str); - strcat(buf,"\r\n--- SMM2SMB v"); - strcat(buf,VERSION); - - length=strlen(buf); /* +2 for translation string */ - - if(smb.status.attr&SMB_HYPERALLOC) - offset=smb_hallocdat(&smb); - else { - i=smb_open_da(&smb); - if(i) { - printf("smb_open_da returned %d\n",i); - exit(1); } - offset=smb_allocdat(&smb,length+2,1); - fclose(smb.sda_fp); } - - fseek(smb.sdt_fp,offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,smb.sdt_fp); - fwrite(buf,length,1,smb.sdt_fp); - length+=2; - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - msg.hdr.when_written.time=time(NULL); - - msg.hdr.offset=offset; - - strcpy(str,"SMM"); - i=smb_hfield(&msg,RECIPIENT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.to=crc16(str); - - strcpy(str,wall.system); - i=smb_hfield(&msg,SENDER,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.from=crc16(str); - - strcpy(str,"->WALL<-"); - i=smb_hfield(&msg,SUBJECT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.subj=crc16(str); - - i=smb_dfield(&msg,TEXT_BODY,length); - if(i) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - - i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC); - if(i) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - smb_freemsgmem(&msg); } - close(file); } - - -while(!feof(stream)) { - if(!fread(&user,sizeof(user_t),1,stream)) - break; - if(user.misc&(USER_FROMSMB|USER_DELETED) - || (last && user.updated<last && user.created<last) - || user.number&0xffff0000L - || user.number==0 - || user.system[0]<SP - || user.name[0]<SP - || user.realname[0]<SP - || user.location[0]<SP - || user.zipcode[0]<SP - || user.birth[0]<SP) - continue; - - printf("Profile: %s\n",user.name); - memset(buf,0,BUF_LEN); - - sprintf(str,"0:%.25s\r\n",encrypt(user.name,user.number)); - strcat(buf,str); - sprintf(str,"1:%.25s\r\n",encrypt(user.realname,user.number)); - strcat(buf,str); - - sprintf(str,"2:%.8s\r\n",encrypt(user.birth,user.number)); - strcat(buf,str); - - sprintf(str,"3:%.30s\r\n",encrypt(user.location,user.number)); - strcat(buf,str); - - sprintf(str,"4:%.10s\r\n",encrypt(user.zipcode,user.number)); - strcat(buf,str); - sprintf(str,"5:%.10s\r\n",encrypt(user.min_zipcode,user.number)); - strcat(buf,str); - sprintf(str,"6:%.10s\r\n",encrypt(user.max_zipcode,user.number)); - strcat(buf,str); - sprintf(str,"7:%.4s\r\n",encrypt(user.mbtype,user.number)); - strcat(buf,str); - - sprintf(str,"A:%.50s\r\n",encrypt(user.note[0],user.number)); - strcat(buf,str); - sprintf(str,"B:%.50s\r\n",encrypt(user.note[1],user.number)); - strcat(buf,str); - sprintf(str,"C:%.50s\r\n",encrypt(user.note[2],user.number)); - strcat(buf,str); - sprintf(str,"D:%.50s\r\n",encrypt(user.note[3],user.number)); - strcat(buf,str); - sprintf(str,"E:%.50s\r\n",encrypt(user.note[4],user.number)); - strcat(buf,str); - - sprintf(str,"F:%c%c\r\n",user.sex,user.pref_sex); - strcat(buf,str); - - sprintf(str,"G:%x\r\n",user.marital); - strcat(buf,str); - sprintf(str,"H:%x\r\n",user.pref_marital); - strcat(buf,str); - - sprintf(str,"I:%x\r\n",user.race); - strcat(buf,str); - sprintf(str,"J:%x\r\n",user.pref_race); - strcat(buf,str); - - sprintf(str,"K:%x\r\n",user.hair); - strcat(buf,str); - sprintf(str,"L:%x\r\n",user.pref_hair); - strcat(buf,str); - - sprintf(str,"M:%x\r\n",user.eyes); - strcat(buf,str); - sprintf(str,"N:%x\r\n",user.pref_eyes); - strcat(buf,str); - - sprintf(str,"O:%x\r\nP:%x\r\nQ:%x\r\n" - ,user.weight,user.min_weight,user.max_weight); - strcat(buf,str); - - sprintf(str,"R:%x\r\nS:%x\r\nT:%x\r\n" - ,user.height,user.min_height,user.max_height); - strcat(buf,str); - - sprintf(str,"U:%x\r\nV:%x\r\nW:%x\r\n" - ,user.min_age,user.max_age,user.purity); - strcat(buf,str); - - sprintf(str,"X:%lx\r\nY:%lx\r\nZ:%lx\r\n!:%lx\r\n" - ,user.income,user.min_income,user.max_income,time(NULL)); - strcat(buf,str); - - for(i=0;i<5;i++) { - if(!user.queans[i].name[0]) - continue; - sprintf(str,"*%d%.8s\r\n",i,encrypt(user.queans[i].name,user.number)); - strcat(buf,str); - for(j=0;j<20;j++) { - sprintf(str," %04x %04x" - ,user.queans[i].self[j] - ,user.queans[i].pref[j]); - strcat(buf,str); - if(!((j+1)%7)) - strcat(buf,"\r\n"); } - strcat(buf,"\r\n"); } - - strcat(buf,"\r\n--- SMM2SMB v"); - strcat(buf,VERSION); - - length=strlen(buf); /* +2 for translation string */ - - if(smb.status.attr&SMB_HYPERALLOC) - offset=smb_hallocdat(&smb); - else { - i=smb_open_da(&smb); - if(i) { - printf("smb_open_da returned %d\n",i); - exit(1); } - offset=smb_allocdat(&smb,length+2,1); - fclose(smb.sda_fp); } - - fseek(smb.sdt_fp,offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,smb.sdt_fp); - fwrite(buf,length,1,smb.sdt_fp); - length+=2; - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - msg.hdr.when_written.time=time(NULL); - - msg.hdr.offset=offset; - - strcpy(str,"SMM"); - i=smb_hfield(&msg,RECIPIENT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.to=crc16(str); - - strcpy(str,user.system); - i=smb_hfield(&msg,SENDER,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.from=crc16(str); - - sprintf(str,"%lu",user.number); - i=smb_hfield(&msg,SUBJECT,strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.subj=crc16(str); - - i=smb_dfield(&msg,TEXT_BODY,length); - if(i) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - - i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC); - if(i) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - smb_freemsgmem(&msg); } -return(0); -} - -/* End of SMM2SMB.C */ diff --git a/src/sbbs2/smm/smmcfg.c b/src/sbbs2/smm/smmcfg.c deleted file mode 100644 index b4e5003e07..0000000000 --- a/src/sbbs2/smm/smmcfg.c +++ /dev/null @@ -1,616 +0,0 @@ -/* SMMCFG.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <uifc.h> -#include <sys\stat.h> -#include "gen_defs.h" -#include "smmdefs.h" -#include "smmvars.c" - -char **opt; - -void bail(int code); -void main(); -char fexist(char *filespec); - -unsigned _stklen=16000; /* Set stack size in code, not header */ - -void bail(int code) -{ - -if(code) - getch(); -uifcbail(); -exit(code); -} - -void main() -{ - char str[256]; - int i,j,k,file,dflt,sysop_level; - FILE *stream; - -savnum=0; -if((opt=(char **)MALLOC(sizeof(char *)*300))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } -for(i=0;i<300;i++) - if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL) { - cputs("memory allocation error\r\n"); - bail(1); } -uifcini(); -sprintf(str,"Synchronet Match Maker v%s",SMM_VER); -uscrn(str); - -if((file=open("SMM.CFG",O_RDONLY|O_BINARY|O_DENYNONE))==-1) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error opening SMM.CFG\r\n"); - bail(1); } -if((stream=fdopen(file,"rb"))==NULL) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error fdopen SMM.CFG\r\n"); - bail(1); } - -str[0]=0; -fgets(str,128,stream); -purity_age=atoi(str); -str[0]=0; -fgets(str,128,stream); -min_age=atoi(str); -str[0]=0; -fgets(str,128,stream); -min_level=atoi(str); - -req_flags1[0]=0; -fgets(req_flags1,128,stream); -req_flags1[27]=0; -truncsp(req_flags1); - -req_flags2[0]=0; -fgets(req_flags2,128,stream); -req_flags2[27]=0; -truncsp(req_flags2); - -req_flags3[0]=0; -fgets(req_flags3,128,stream); -req_flags3[27]=0; -truncsp(req_flags3); - -req_flags4[0]=0; -fgets(req_flags4,128,stream); -req_flags4[27]=0; -truncsp(req_flags4); - -str[0]=0; -fgets(str,128,stream); -profile_cdt=atol(str); -str[0]=0; -fgets(str,128,stream); -telegram_cdt=atol(str); -str[0]=0; -fgets(str,128,stream); -auto_update=atoi(str); -str[0]=0; -fgets(str,128,stream); -notify_user=atoi(str); - -str[0]=0; -fgets(str,128,stream); // regnum - -str[0]=0; -fgets(str,128,stream); -telegram_level=atoi(str); - -str[0]=0; -fgets(str,128,stream); -que_level=atoi(str); - -str[0]=0; -fgets(str,128,stream); -wall_level=atoi(str); - -str[0]=0; -fgets(str,128,stream); -wall_cdt=atol(str); - -str[0]=0; -fgets(str,128,stream); -que_cdt=atol(str); - -zmodem_send[0]=0; -fgets(zmodem_send,128,stream); -if(!zmodem_send[0]) - strcpy(zmodem_send,DEFAULT_ZMODEM_SEND); -truncsp(zmodem_send); - -str[0]=0; -fgets(str,128,stream); -smm_misc=atol(str); - -str[0]=0; -fgets(str,128,stream); -sprintf(system_name,"%.25s",str); -truncsp(system_name); - -local_view[0]=0; -fgets(local_view,128,stream); -truncsp(local_view); - -str[0]=0; -fgets(str,128,stream); -sysop_level=atoi(str); -if(!sysop_level) - sysop_level=90; - -str[0]=0; -fgets(str,128,stream); -wall_age=atoi(str); - -str[0]=0; -fgets(str,128,stream); -age_split=atoi(str); - -fclose(stream); - - -dflt=0; -while(1) { - helpbuf= -" Synchronet Match Maker Configuration \r\n\r\n" -"Move through the various options using the arrow keys. Select the\r\n" -"highlighted options by pressing ENTER.\r\n\r\n"; - j=0; - sprintf(opt[j++],"%-40.40s %s","System Name",system_name); - sprintf(opt[j++],"Wall Security..."); - sprintf(opt[j++],"Profile Database Security..."); - sprintf(str,"Credit %s for Adding Profile" - ,profile_cdt>0 ? "Bonus":"Cost"); - sprintf(opt[j++],"%-40.40s %ldk",str - ,profile_cdt>0 ? profile_cdt/1024L : (-profile_cdt)/1024L); - sprintf(str,"Credit %s for Sending Telegram" - ,telegram_cdt>0 ? "Bonus":"Cost"); - sprintf(opt[j++],"%-40.40s %ldk",str - ,telegram_cdt>0 ? telegram_cdt/1024L : (-telegram_cdt)/1024L); - sprintf(str,"Credit %s for Writing on the Wall" - ,wall_cdt>0 ? "Bonus":"Cost"); - sprintf(opt[j++],"%-40.40s %ldk",str - ,wall_cdt>0 ? wall_cdt/1024L : (-wall_cdt)/1024L); - sprintf(str,"Credit %s for Reading Questionnaire" - ,que_cdt>0 ? "Bonus":"Cost"); - sprintf(opt[j++],"%-40.40s %ldk",str - ,que_cdt>0 ? que_cdt/1024L : (-que_cdt)/1024L); - sprintf(opt[j++],"%-40.40s %u","Minimum Level to Send Telegrams" - ,telegram_level); - sprintf(opt[j++],"%-40.40s %u","Minimum Level to Read Questionnaires" - ,que_level); - sprintf(opt[j++],"%-40.40s %s","Minor Segregation (Protection) Age" - ,age_split ? itoa(age_split,str,10):"Disabled"); - sprintf(opt[j++],"%-40.40s %u","Sysop Level",sysop_level); - sprintf(opt[j++],"%-40.40s %s","Auto-Update Profiles" - ,auto_update ? itoa(auto_update,str,10):"Disabled"); - sprintf(opt[j++],"%-40.40s %s","Notify User of Activity" - ,notify_user ? itoa(notify_user,str,10):"Disabled"); - sprintf(opt[j++],"%-40.40s %s","Use Metric System" - ,smm_misc&SMM_METRIC ? "Yes":"No"); - sprintf(opt[j++],"%-40.40s %.25s","Zmodem Send Command" - ,zmodem_send); - sprintf(opt[j++],"%-40.40s %.25s","Local Photo Viewer" - ,local_view); - opt[j][0]=NULL; - switch(ulist(WIN_ORG|WIN_MID|WIN_ACT|WIN_ESC,0,0,60,&dflt,0 - ,"Synchronet Match Maker Configuration",opt)) { - case 0: -helpbuf= -" System Name \r\n\r\n" -"This is your BBS name. Once you have configured your BBS name here, you\r\n" -"will not be able to change it, without losing all of your local users'\r\n" -"profiles in your database.\r\n" -"\r\n" -"It is highly recommended that you do not change your BBS name here,\r\n" -"even if you decide to change your actual BBS name in the future.\r\n" -"\r\n" -"All BBS names in a match maker network must be unique."; - uinput(WIN_MID,0,0,"System Name" - ,system_name,40,K_EDIT|K_UPPER); - break; - case 1: - j=0; - while(1) { - k=0; - sprintf(opt[k++],"%-40.40s %u" - ,"Minimum User Age to Access Wall" - ,wall_age); - sprintf(opt[k++],"%-40.40s %u" - ,"Minimum Security Level to Write on Wall" - ,wall_level); - opt[k][0]=NULL; -helpbuf= -" Wall Security \r\n\r\n" -"This menu allows you to specify which users can access the wall.\r\n"; - - j=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,0,0,0,&j,0 - ,"Wall Security",opt); - if(j==-1) - break; - switch(j) { - case 0: -helpbuf= -" Minimum User Age \r\n\r\n" -"This is the minimum user age that will be allowed to access (read or\r\n" -"write) the wall."; - sprintf(str,"%u",wall_age); - uinput(WIN_L2R|WIN_SAV,0,0, - "Minimum Age to Access Wall" - ,str,2,K_EDIT|K_NUMBER); - wall_age=atoi(str); - break; - case 1: -helpbuf= -" Minimum User Level \r\n\r\n" -"This is the minimum user level required to write on the wall.\r\n"; - sprintf(str,"%u",wall_level); - uinput(WIN_L2R|WIN_SAV,0,0, - "Minimum Level to Write on Wall" - ,str,2,K_EDIT|K_NUMBER); - wall_level=atoi(str); - break; } } - break; - case 2: - j=0; - while(1) { - k=0; - sprintf(opt[k++],"%-40.40s %u" - ,"Minimum User Age to Add Profile" - ,min_age); - sprintf(opt[k++],"%-40.40s %u" - ,"Minimum User Age to Take Purity Test" - ,purity_age); - sprintf(opt[k++],"%-40.40s %u" - ,"Minimum Security Level to Add Profile" - ,min_level); - sprintf(opt[k++],"%-40.40s %s" - ,"Required Flags (Set 1) to Add Profile" - ,req_flags1); - sprintf(opt[k++],"%-40.40s %s" - ,"Required Flags (Set 2) to Add Profile" - ,req_flags2); - sprintf(opt[k++],"%-40.40s %s" - ,"Required Flags (Set 3) to Add Profile" - ,req_flags3); - sprintf(opt[k++],"%-40.40s %s" - ,"Required Flags (Set 4) to Add Profile" - ,req_flags4); - opt[k][0]=NULL; -helpbuf= -" Profile Security \r\n\r\n" -"This menu allows you to specify which users can create profiles\r\n" -"and take the purity test."; - - j=ulist(WIN_ACT|WIN_SAV|WIN_RHT|WIN_BOT,0,0,0,&j,0 - ,"Profile Database Security",opt); - if(j==-1) - break; - switch(j) { - case 0: -helpbuf= -" Minimum User Age \r\n\r\n" -"This is the minimum user age that will be allowed to add a profile to\r\n" -"the database."; - sprintf(str,"%u",min_age); - uinput(WIN_L2R|WIN_SAV,0,0, - "Minimum Age",str,2,K_EDIT|K_NUMBER); - min_age=atoi(str); - break; - case 1: -helpbuf= -" Minimum User Age for Purity Test\r\n\r\n" -"This is the minimum user age that will be allowed to take the purity\r\n" -"test."; - sprintf(str,"%u",purity_age); - uinput(WIN_L2R|WIN_SAV,0,0, - "Minimum Age for Purity Test" - ,str,2,K_EDIT|K_NUMBER); - purity_age=atoi(str); - break; - case 2: -helpbuf= -" Minimum Security Level \r\n\r\n" -"This is the minimum security level that is required to add a profile\r\n" -"to the database."; - sprintf(str,"%u",min_level); - uinput(WIN_L2R|WIN_SAV,0,0, - "Security Level",str,3,K_EDIT|K_NUMBER); - min_level=atoi(str); - break; - case 3: -helpbuf= -" Required Flags from Flag Set 1 \r\n\r\n" -"These are the flags that a required for the user to add a profile\r\n" -"to the database."; - uinput(WIN_L2R|WIN_SAV,0,0,"Flag Set 1" - ,req_flags1 - ,26,K_EDIT|K_UPPER|K_ALPHA); - break; - case 4: -helpbuf= -" Required Flags from Flag Set 2 \r\n\r\n" -"These are the flags that a required for the user to add a profile\r\n" -"to the database."; - uinput(WIN_L2R|WIN_SAV,0,0,"Flag Set 2" - ,req_flags2 - ,26,K_EDIT|K_UPPER|K_ALPHA); - break; - case 5: -helpbuf= -" Required Flags from Flag Set 3 \r\n\r\n" -"These are the flags that a required for the user to add a profile\r\n" -"to the database."; - uinput(WIN_L2R|WIN_SAV,0,0,"Flag Set 3" - ,req_flags3 - ,26,K_EDIT|K_UPPER|K_ALPHA); - break; - case 6: -helpbuf= -" Required Flags from Flag Set 4 \r\n\r\n" -"These are the flags that a required for the user to add a profile\r\n" -"to the database."; - uinput(WIN_L2R|WIN_SAV,0,0,"Flag Set 4" - ,req_flags4 - ,26,K_EDIT|K_UPPER|K_ALPHA); - break; } } - break; - case 3: -helpbuf= -" Credit Adjustment for Adding Profile \r\n\r\n" -"You can have Synchronet Match Maker either give credits to or take\r\n" -"credits from the user for adding a profile to the database."; - strcpy(opt[0],"Add Credits"); - strcpy(opt[1],"Remove Credits"); - opt[2][0]=0; - i=1; - i=ulist(WIN_L2R|WIN_BOT|WIN_ACT,0,0,0,&i,0 - ,"Credit Adjustment for Adding Profile",opt); - if(i==-1) - break; - sprintf(str,"%ld",profile_cdt<0 ? -profile_cdt:profile_cdt); - uinput(WIN_MID,0,0,"Credits (K=1024)" - ,str,10,K_EDIT|K_UPPER); - if(strchr(str,'K')) - profile_cdt=atol(str)*1024L; - else - profile_cdt=atol(str); - if(i==1) - profile_cdt=-profile_cdt; - break; - case 4: -helpbuf= -" Credit Adjustment for Sending Telegram \r\n\r\n" -"You can have Synchronet Match Maker either give credits to or take\r\n" -"credits from the user for sending a telegram to another user in SMM."; - strcpy(opt[0],"Add Credits"); - strcpy(opt[1],"Remove Credits"); - opt[2][0]=0; - i=1; - i=ulist(WIN_L2R|WIN_BOT|WIN_ACT,0,0,0,&i,0 - ,"Credit Adjustment for Sending Telegram",opt); - if(i==-1) - break; - sprintf(str,"%ld",telegram_cdt<0 ? -telegram_cdt:telegram_cdt); - uinput(WIN_MID,0,0,"Credits (K=1024)" - ,str,10,K_EDIT|K_UPPER); - if(strchr(str,'K')) - telegram_cdt=atol(str)*1024L; - else - telegram_cdt=atol(str); - if(i==1) - telegram_cdt=-telegram_cdt; - break; - case 5: -helpbuf= -" Credit Adjustment for Writing on the Wall \r\n\r\n" -"You can have Synchronet Match Maker either give credits to or take\r\n" -"credits from the user for writing on the wall."; - strcpy(opt[0],"Add Credits"); - strcpy(opt[1],"Remove Credits"); - opt[2][0]=0; - i=1; - i=ulist(WIN_L2R|WIN_BOT|WIN_ACT,0,0,0,&i,0 - ,"Credit Adjustment for Writing on the Wall",opt); - if(i==-1) - break; - sprintf(str,"%ld",wall_cdt<0 ? -wall_cdt:wall_cdt); - uinput(WIN_MID,0,0,"Credits (K=1024)" - ,str,10,K_EDIT|K_UPPER); - if(strchr(str,'K')) - wall_cdt=atol(str)*1024L; - else - wall_cdt=atol(str); - if(i==1) - wall_cdt=-wall_cdt; - break; - case 6: -helpbuf= -" Credit Adjustment for Reading Questionnaire \r\n\r\n" -"You can have Synchronet Match Maker either give credits to or take\r\n" -"credits from the user when reading another user's questionnaire"; - strcpy(opt[0],"Add Credits"); - strcpy(opt[1],"Remove Credits"); - opt[2][0]=0; - i=1; - i=ulist(WIN_L2R|WIN_BOT|WIN_ACT,0,0,0,&i,0 - ,"Credit Adjustment for Reading Questionnaire",opt); - if(i==-1) - break; - sprintf(str,"%ld",que_cdt<0 ? -que_cdt:que_cdt); - uinput(WIN_MID,0,0,"Credits (K=1024)" - ,str,10,K_EDIT|K_UPPER); - if(strchr(str,'K')) - que_cdt=atol(str)*1024L; - else - que_cdt=atol(str); - if(i==1) - que_cdt=-que_cdt; - break; - case 7: -helpbuf= -" Minimum Level to Send Telegrams \r\n\r\n" -"Use this option to restrict the sending of telegrams to users of a\r\n" -"specific security level or higher."; - sprintf(str,"%u",telegram_level); - uinput(WIN_MID,0,0,"Minimum Level to Send Telegrams" - ,str,3,K_EDIT|K_NUMBER); - telegram_level=atoi(str); - break; - case 8: -helpbuf= -" Minimum Level to Read Questionnaires \r\n\r\n" -"Users will only be allowed to read other users' questionnaires if\r\n" -"their security level is this value or higher."; - sprintf(str,"%u",que_level); - uinput(WIN_MID,0,0,"Minimum Level to Read Questionnaires" - ,str,3,K_EDIT|K_NUMBER); - que_level=atoi(str); - break; - case 9: -helpbuf= -" Minor Segregation (Protection) Age \r\n\r\n" -"This option (if enabled) separates all users into two groups:\r\n" -"\r\n" -"Minors: Those users below the specified age (normally 18)\r\n" -"Adults: Those users at or above the specified age\r\n" -"\r\n" -"If enabled, adults cannot see minors' profiles or send telegrams to\r\n" -"minors and vice versa.\r\n" -"\r\n" -"If disabled, all users can see eachother's profiles regardless of age.\r\n"; - sprintf(str,"%u",age_split); - uinput(WIN_MID,0,0,"Minor Segregation Age (0=Disabled)" - ,str,2,K_EDIT|K_NUMBER); - age_split=atoi(str); - break; - case 10: -helpbuf= -" Sysop Level \r\n\r\n" -"Every user of this level or higher will be given access to sysop\r\n" -"commands in the match maker."; - sprintf(str,"%u",sysop_level); - uinput(WIN_MID,0,0,"Sysop Level",str,3,K_EDIT|K_NUMBER); - sysop_level=atoi(str); - break; - - case 11: -helpbuf= -" Auto-Update Profiles \r\n\r\n" -"If you would like to have Synchronet Match Maker automatically send\r\n" -"a network update message for a user that is active in SMM, but hasn't\r\n" -"actually made any changes to his or her profile, set this option to the\r\n" -"number of days between Auto-Updates (e.g. 30 days is a good value).\r\n" -"\r\n" -"Setting this option to 0 disables this feature."; - sprintf(str,"%u",auto_update); - uinput(WIN_MID,0,0,"Auto-Update Profiles (in Days)" - ,str,3,K_EDIT|K_NUMBER); - auto_update=atoi(str); - break; - case 12: -helpbuf= -" Notify User of Activity \r\n\r\n" -"If you would like to have Synchronet Match Maker automatically send\r\n" -"a message to a specific user (most commonly the sysop) whenever a user\r\n" -"adds a profile to the database or sends a telegram from SMM, set this\r\n" -"option to the number of that user (e.g. 1 would indicate user #1).\r\n" -"\r\n" -"Setting this option to 0 disables this feature."; - sprintf(str,"%u",notify_user); - uinput(WIN_MID,0,0,"Notify User Number (0=disabled)" - ,str,5,K_EDIT|K_NUMBER); - notify_user=atoi(str); - break; - case 13: -helpbuf= -" Use Metric System \r\n\r\n" -"If you wish to use centimeters and kilograms instead of inches and\r\n" -"pounds for height and weight measurements, set this option to Yes."; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=1; - i=ulist(WIN_MID|WIN_ACT,0,0,0,&i,0 - ,"Use Metric Measurement System",opt); - if(i==-1) - break; - if(i==1) - smm_misc&=~SMM_METRIC; - else - smm_misc|=SMM_METRIC; - break; - - case 14: -helpbuf= -" Zmodem Send Command \r\n\r\n" -"This is the command line to execute to send files to remote user.\r\n"; - uinput(WIN_MID,0,0,"Zmodem Send" - ,zmodem_send,50,K_EDIT); - break; - case 15: -helpbuf= -" Local Photo Viewer \r\n\r\n" -"This is the command line to execute to view photos when logged on\r\n" -"locally.\r\n"; - uinput(WIN_MID,0,0,"Local Viewer" - ,local_view,50,K_EDIT); - break; - case -1: -helpbuf= -" Save Configuration File \r\n\r\n" -"Select Yes to save the config file, No to quit without saving,\r\n" -"or hit ESC to go back to the menu.\r\n\r\n"; - i=0; - strcpy(opt[0],"Yes"); - strcpy(opt[1],"No"); - opt[2][0]=0; - i=ulist(WIN_MID,0,0,0,&i,0,"Save Config File",opt); - if(i==-1) break; - if(i) bail(0); - if((file=open("SMM.CFG" - ,O_WRONLY|O_BINARY|O_CREAT|O_DENYALL|O_TRUNC,S_IWRITE))==-1) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error opening SMM.CFG\r\n"); - bail(1); } - if((stream=fdopen(file,"wb"))==NULL) { - textattr(LIGHTGRAY); - clrscr(); - lprintf("Error fdopen SMM.CFG\r\n"); - bail(1); } - fprintf(stream,"%u\r\n%u\r\n%u\r\n%s\r\n%s\r\n%s\r\n%s\r\n" - ,purity_age,min_age,min_level - ,req_flags1,req_flags2,req_flags3,req_flags4); - fprintf(stream,"%ld\r\n%ld\r\n%u\r\n%u\r\n%s\r\n%u\r\n%u\r\n" - ,profile_cdt,telegram_cdt,auto_update,notify_user,"" - ,telegram_level,que_level); - fprintf(stream,"%u\r\n%ld\r\n%ld\r\n%s\r\n%ld\r\n%s\r\n" - ,wall_level,wall_cdt,que_cdt,zmodem_send,smm_misc,system_name); - fprintf(stream,"%s\r\n%u\r\n%u\r\n%u\r\n" - ,local_view,sysop_level,wall_age,age_split); - fclose(stream); - bail(0); - } -} -} -/****************************************************************************/ -/* Checks the disk drive for the existance of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/* Called from upload */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==NULL) - return(1); -return(0); -} diff --git a/src/sbbs2/smm/smmcfg.mak b/src/sbbs2/smm/smmcfg.mak deleted file mode 100644 index eeb956f5cb..0000000000 --- a/src/sbbs2/smm/smmcfg.mak +++ /dev/null @@ -1,35 +0,0 @@ - -# Macros -CC = bcc -LD = tlink -SDK = ..\sdk -UIFC = ..\..\uifc -MSWAIT = ..\..\mswait -INCLUDE = \bc45\include;$(UIFC);.. -LIB = \bc45\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -w-pro -LDFLAGS = /n /c -OBJS = $(MSWAIT)\dos\mswait$(MODEL).obj uifc.obj -HEADERS = $(UIFC)\uifc.h smmdefs.h - -# Implicit C Compile Rule -.c.obj: - @echo Compiling $*.c to $*.obj ... - $(CC) $(CFLAGS) -c $*.c - -# Main EXE Link Rule -smmcfg.exe: $(OBJS) smmcfg.obj - @echo Linking $< ... - $(LD) $(LDFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) smmcfg.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - - -# All .obj modules -smmcfg.obj: $(HEADERS) - -uifc.obj: $(UIFC)\uifc.h $(UIFC)\uifc.c - @echo Compiling $(UIFC)\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c -DSCFG $(UIFC)\$*.c - diff --git a/src/sbbs2/smm/smmdefs.h b/src/sbbs2/smm/smmdefs.h deleted file mode 100644 index 5d88b9d8f1..0000000000 --- a/src/sbbs2/smm/smmdefs.h +++ /dev/null @@ -1,160 +0,0 @@ -/* SMMDEFS.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#define SMM_VER "2.10" - -#define SMM_METRIC (1<<0) /* Use metric measurements */ - -#define USER_DELETED (1<<0) /* Bits for user.misc field */ -#define USER_FROMSMB (1<<1) /* Imported from SMB */ -#define USER_REQZIP (1<<2) /* Require mate in zip range */ -#define USER_REQAGE (1<<3) /* Require mate in age range */ -#define USER_REQWEIGHT (1<<4) /* Require mate in weight range */ -#define USER_REQHEIGHT (1<<5) /* Require mate in height range */ -#define USER_REQINCOME (1<<6) /* Require mate in income range */ -#define USER_REQMARITAL (1<<7) /* Require marital status */ -#define USER_REQZODIAC (1<<8) /* Require zodiac */ -#define USER_REQRACE (1<<9) /* Require race */ -#define USER_REQHAIR (1<<10) /* Require hair */ -#define USER_REQEYES (1<<11) /* Require eyes */ -#define USER_FRIEND (1<<12) /* Seeking same-sex friendship */ -#define USER_PHOTO (1<<13) /* Photo attached to profile */ - - -#define ZODIAC_ARIES (1<<0) /* Mar 21 - Apr 19 */ -#define ZODIAC_TAURUS (1<<1) /* Apr 20 - May 20 */ -#define ZODIAC_GEMINI (1<<2) /* May 21 - Jun 20 */ -#define ZODIAC_CANCER (1<<3) /* Jun 21 - Jul 22 */ -#define ZODIAC_LEO (1<<4) /* Jul 23 - Aug 22 */ -#define ZODIAC_VIRGO (1<<5) /* Aug 23 - Sep 22 */ -#define ZODIAC_LIBRA (1<<6) /* Sep 23 - Oct 22 */ -#define ZODIAC_SCORPIO (1<<7) /* Oct 23 - Nov 21 */ -#define ZODIAC_SAGITTARIUS (1<<8) /* Nov 22 - Dec 21 */ -#define ZODIAC_CAPRICORN (1<<9) /* Dec 22 - Jan 19 */ -#define ZODIAC_AQUARIUS (1<<10) /* Jan 20 - Feb 18 */ -#define ZODIAC_PISCES (1<<11) /* Feb 19 - Mar 20 */ - -#define HAIR_BLONDE (1<<0) -#define HAIR_BROWN (1<<1) -#define HAIR_RED (1<<2) -#define HAIR_BLACK (1<<3) -#define HAIR_GREY (1<<4) -#define HAIR_OTHER (1<<5) - -#define EYES_BLUE (1<<0) -#define EYES_GREEN (1<<1) -#define EYES_HAZEL (1<<2) -#define EYES_BROWN (1<<3) -#define EYES_OTHER (1<<4) - -#define RACE_WHITE (1<<0) -#define RACE_BLACK (1<<1) -#define RACE_HISPANIC (1<<2) -#define RACE_ASIAN (1<<3) -#define RACE_AMERINDIAN (1<<4) -#define RACE_MIDEASTERN (1<<5) -#define RACE_OTHER (1<<6) - -#define MARITAL_SINGLE (1<<0) -#define MARITAL_MARRIED (1<<1) -#define MARITAL_DIVORCED (1<<2) -#define MARITAL_WIDOWED (1<<3) -#define MARITAL_OTHER (1<<4) - -typedef struct { - - uchar txt[82]; - uchar answers; /* Total answers */ - uchar allowed; /* number of answers allowed for self */ - uchar ans[16][62]; /* Answers */ - - } question_t; - -typedef struct { - - uchar name[9]; - uchar desc[26]; - uchar req_age; - uchar total_ques; - question_t que[20]; - - } questionnaire_t; - -typedef struct { - - uchar name[9]; /* Name of questionnaire */ - ushort self[20]; /* Answers to questions */ - ushort pref[20]; /* Preferred partner's answer(s) */ - - } queans_t; - -typedef struct { - - ulong number; /* User's number on BBS */ - ulong system; /* CRC-32 of system name */ - ulong name; - ulong updated; - - } ixb_t; - -typedef struct { - - uchar name[26]; /* User's name or alias */ - uchar realname[26]; /* User's name or alias on the BBS */ - uchar system[41]; /* BBS name */ - ulong number; /* User's number on BBS */ - uchar birth[9]; /* MM/DD/YY format */ - uchar zipcode[11]; /* Zip code */ - uchar location[31]; /* City, state */ - ushort pref_zodiac; /* Preferred zodiac sign */ - uchar sex; /* 'M' or 'F' */ - uchar pref_sex; - uchar marital; - uchar pref_marital; - uchar race; - uchar pref_race; - uchar hair; /* hair color */ - uchar pref_hair; /* preferred hair color */ - uchar eyes; /* eye color */ - uchar pref_eyes; /* preferred eye color */ - ushort weight; /* Sad, we have to use 16-bits! */ - uchar height; /* in inches */ - ushort min_weight; - ushort max_weight; - uchar min_height; - uchar max_height; - uchar min_age; - uchar max_age; - uchar min_zipcode[11]; - uchar max_zipcode[11]; - ulong income; - ulong min_income; - ulong max_income; - time_t created; - time_t updated; - uchar note[5][51]; - ulong misc; - time_t lastin; - uchar min_match; - uchar purity; /* Purity % */ - uchar mbtype[5]; /* Myers-Briggs personality type */ - time_t photo; /* Date last photo hatched */ - uchar filler[60]; /* Available for future use */ - queans_t queans[5]; - - } user_t; - -typedef struct { - - uchar name[26]; /* User's name or alias */ - uchar system[41]; /* BBS name */ - uchar text[5][71]; /* Writing */ - time_t written; /* Date/time created */ - time_t imported; - - } wall_t; - -#define TGRAM_NOTICE "\1n\1h\1mNew telegram in \1wMatch Maker \1mfor you!" \ - "\7\1n\r\n" -#define DEFAULT_ZMODEM_SEND "%!dsz portx %u,%i sz %f" diff --git a/src/sbbs2/smm/smmutil.c b/src/sbbs2/smm/smmutil.c deleted file mode 100644 index d2c5eaa695..0000000000 --- a/src/sbbs2/smm/smmutil.c +++ /dev/null @@ -1,713 +0,0 @@ -/* SMMUTIL.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <stdio.h> -#include <time.h> -#include <stdlib.h> -#include <io.h> -#include <dos.h> -#include <fcntl.h> -#include <sys\stat.h> -#include <malloc.h> -#include <stdarg.h> -#include "gen_defs.h" -#include "smmdefs.h" -#include "crc32.h" - -struct date date; -struct time curtime; - -FILE *log=NULL; - -/****************************************************************************/ -/* Returns 32-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ulong crc32(char *str) -{ - int i=0; - ulong crc=0xffffffffUL; - - while(str[i]) - crc=ucrc32(str[i++],crc); - crc=~crc; - return(crc); -} - -/****************************************************************************/ -/* Returns the age derived from the string 'birth' in the format MM/DD/YY */ -/****************************************************************************/ -char getage(char *birth) -{ - char age; - -if(birth[0]<=SP) - return(0); -getdate(&date); -age=(date.da_year-1900)-(((birth[6]&0xf)*10)+(birth[7]&0xf)); -if(age>90) - age-=90; -if(atoi(birth)>12 || atoi(birth+3)>31) - return(0); -if(((birth[0]&0xf)*10)+(birth[1]&0xf)>date.da_mon || - (((birth[0]&0xf)*10)+(birth[1]&0xf)==date.da_mon && - ((birth[3]&0xf)*10)+(birth[4]&0xf)>date.da_day)) - age--; -if(age<0) - return(0); -return(age); -} - -/**********************/ -/* Log print function */ -/**********************/ -void logprintf(char *str, ...) -{ - va_list argptr; - char buf[256]; - time_t now; - struct tm *gm; - -va_start(argptr,str); -vsprintf(buf,str,argptr); -va_end(argptr); -fprintf(stderr,"\n%s",buf); -if(!log) return; -now=time(NULL); -gm=localtime(&now); -fseek(log,0L,SEEK_END); -fprintf(log,"%02u/%02u/%02u %02u:%02u:%02u %s\r\n" - ,gm->tm_mon+1,gm->tm_mday,TM_YEAR(gm->tm_year),gm->tm_hour,gm->tm_min,gm->tm_sec - ,buf); -fflush(log); -} - - -char *base41(unsigned int i, char *str) -{ - char c; - unsigned int j=41*41,k; - -for(c=0;c<3;c++) { - k=i/j; - str[c]='0'+k; - i-=(k*j); - j/=41; - if(str[c]>=':') - str[c]='A'+(str[c]-':'); - if(str[c]>='[') - str[c]='#'+(str[c]-'['); } -str[c]=0; -return(str); -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - - -void delphoto(user_t user) -{ - char fname[64],path[128],tmp[128]; - int i; - struct ffblk ff; - -if(!(user.misc&USER_PHOTO)) - return; -for(i=0;user.system[i];i++) - if(isalnum(user.system[i])) - break; -if(!user.system[i]) - fname[0]='~'; -else - fname[0]=user.system[i]; -for(i=strlen(user.system)-1;i>0;i--) - if(isalnum(user.system[i])) - break; -if(i<=0) - fname[1]='~'; -else - fname[1]=user.system[i]; -fname[2]=0; -strupr(user.system); -strcat(fname,base41(crc16(user.system),tmp)); -strcat(fname,base41(user.number,tmp)); -strcat(fname,".*"); -strupr(fname); -sprintf(path,"PHOTO\\%s",fname); -i=findfirst(path,&ff,0); -if(i) - return; -sprintf(path,"PHOTO\\%s",ff.ff_name); -if(remove(path)) - logprintf("Photo (%s) couldn't be removed!",path); -else - logprintf("Photo (%s) removed",path); -} - - -int main(int argc, char **argv) -{ - int i,file,max_age=0,max_wall=0,age; - long l,m,total_ixbs=0 - ,users=0,photos=0,networked=0 - ,male_straight=0 - ,male_gay=0 - ,male_bi=0 - ,female_straight=0 - ,female_gay=0 - ,female_bi=0 - ,age12=0 - ,age15=0 - ,age20=0,age25=0 - ,age30=0,age35=0 - ,age40=0,age45=0 - ,age50=0,age55=0 - ,age60=0,age65=0 - ,age70=0,age71=0 - ,zodiac_aries=0 - ,zodiac_taurus=0 - ,zodiac_gemini=0 - ,zodiac_cancer=0 - ,zodiac_leo=0 - ,zodiac_virgo=0 - ,zodiac_libra=0 - ,zodiac_scorpio=0 - ,zodiac_sagittarius=0 - ,zodiac_capricorn=0 - ,zodiac_aquarius=0 - ,zodiac_pisces=0 - ,hair_blonde=0 - ,hair_brown=0 - ,hair_red=0 - ,hair_black=0 - ,hair_grey=0 - ,hair_other=0 - ,eyes_blue=0 - ,eyes_green=0 - ,eyes_hazel=0 - ,eyes_brown=0 - ,eyes_other=0 - ,race_white=0 - ,race_black=0 - ,race_hispanic=0 - ,race_asian=0 - ,race_amerindian=0 - ,race_mideastern=0 - ,race_other=0 - ,marital_single=0 - ,marital_married=0 - ,marital_divorced=0 - ,marital_widowed=0 - ,marital_other=0 - ; - FILE *ixb_fp,*dab_fp,*tmp_fp; - ixb_t huge *ixb=NULL,ixbrec; - user_t user; - wall_t wall; - time_t now; - -fprintf(stderr,"\nSMMUTIL � Synchronet Match Maker Utility � v2.01�\n\n"); - -for(i=1;i<argc;i++) - if(isdigit(argv[i][0])) { - if(max_age) - max_wall=atoi(argv[i]); - else - max_age=atoi(argv[i]); } - else { - printf("usage: SMMUTIL max_profile_age_in_days " - "max_wall_writing_age_in_days\n"); - printf("\n"); - printf("example: SMMUTIL 90 7\n"); - exit(1); } - -if((file=open("SMM.IXB",O_RDWR|O_BINARY|O_CREAT|O_DENYNONE - ,S_IWRITE|S_IREAD))==-1 - || (ixb_fp=fdopen(file,"r+b"))==NULL) { - printf("Error opening SMM.IXB\n"); - exit(1); } - -if((file=open("SMM.DAB",O_RDWR|O_BINARY|O_DENYNONE))==-1 - || (dab_fp=fdopen(file,"r+b"))==NULL) { - printf("Error opening SMM.DAB\n"); - exit(1); } - -if((file=open("SMM.TMP",O_WRONLY|O_CREAT|O_TRUNC|O_BINARY|O_DENYALL - ,S_IWRITE|S_IREAD))==-1 - || (tmp_fp=fdopen(file,"r+b"))==NULL) { - printf("Error opening SMM.TMP\n"); - exit(1); } - -if((file=open("SMMUTIL.LOG",O_WRONLY|O_CREAT|O_APPEND|O_BINARY|O_DENYALL - ,S_IWRITE|S_IREAD))==-1 - || (log=fdopen(file,"w+b"))==NULL) { - printf("Error opening SMMUTIL.LOG\n"); - exit(1); } - -fprintf(stderr,"Reading profile data..."); -rewind(dab_fp); -while(!feof(dab_fp)) { - if(!fread(&user,sizeof(user_t),1,dab_fp)) - break; - if((ixb=REALLOC(ixb,sizeof(ixb_t)*(total_ixbs+1)))==NULL) { - printf("Malloc error\n"); - exit(1); } - user.name[25]=0; - strupr(user.name); - ixb[total_ixbs].name=crc32(user.name); - user.system[25]=0; - strupr(user.system); - ixb[total_ixbs].system=crc32(user.system); - ixb[total_ixbs].updated=user.updated; - if(user.misc&USER_DELETED) - ixb[total_ixbs].number=0; - else - ixb[total_ixbs].number=user.number; - total_ixbs++; } -fprintf(stderr,"\n"); - -now=time(NULL); -fprintf(stderr,"Creating new profile index and data files..."); -chsize(fileno(ixb_fp),0); -rewind(ixb_fp); -rewind(tmp_fp); -for(l=0;l<total_ixbs;l++) { - fseek(dab_fp,l*sizeof(user_t),SEEK_SET); - if(!fread(&user,sizeof(user_t),1,dab_fp)) { - logprintf("%04lX Couldn't read user record",l); - continue; } - - /* Make sure all strings are NULL terminated */ - user.name[25]=user.realname[25]=user.system[40]=user.birth[8]=0; - user.zipcode[10]=user.location[30]=0; - user.min_zipcode[10]=user.max_zipcode[10]=0; - for(i=0;i<5;i++) - user.note[i][50]=0; - - if(!ixb[l].number) { - logprintf("%04lX %5lu %-25s Deleted user" - ,l,user.number,user.system); - delphoto(user); - continue; } - if(ixb[l].number&0xffff0000UL) { - logprintf("%04lX %5lu %-25s Invalid user number" - ,l,ixb[l].number,user.system); - delphoto(user); - continue; } - if(max_age - && now>ixb[l].updated // Not in the future - && (now-ixb[l].updated)/(24UL*60UL*60UL)>max_age) { - logprintf("%04lX %5lu %-25s Not updated in %lu days" - ,l,user.number,user.system,(now-ixb[l].updated)/(24UL*60UL*60UL)); - delphoto(user); - continue; } - for(m=l+1;m<total_ixbs;m++) - if(ixb[l].number - && ixb[l].number==ixb[m].number && ixb[l].system==ixb[m].system) - break; - if(m<total_ixbs) { /* Duplicate found! */ - logprintf("%04lX %5lu %-25s Duplicate user" - ,l,user.number,user.system); - delphoto(user); - continue; } - - if(user.name[0]<SP || user.realname[0]<SP || user.system[0]<SP - || user.location[0]<SP || user.zipcode[0]<SP || user.birth[0]<SP) { - logprintf("%04lX %5lu %-25s Invalid user string" - ,l,user.number,user.system); - delphoto(user); - continue; } - if(!user.sex || !user.marital || !user.race || !user.hair || !user.eyes) { - logprintf("%04lX %5lu %-25s Null field" - ,l,user.number,user.system); - delphoto(user); - continue; } - if(user.sex=='M') { - if(user.pref_sex=='F') - male_straight++; - else if(user.pref_sex=='M') - male_gay++; - else - male_bi++; } - else if(user.sex=='F') { - if(user.pref_sex=='M') - female_straight++; - else if(user.pref_sex=='F') - female_gay++; - else - female_bi++; } - else { - logprintf("%04lX %5lu %-25s Invalid sex (%02X)" - ,l,user.number,user.system,user.sex); - delphoto(user); - continue; } - users++; - if(user.misc&USER_PHOTO) - photos++; - if(user.misc&USER_FROMSMB) - networked++; - age=getage(user.birth); - if(age<13) age12++; - else if(age<16) age15++; - else if(age<21) age20++; - else if(age<26) age25++; - else if(age<31) age30++; - else if(age<36) age35++; - else if(age<41) age40++; - else if(age<46) age45++; - else if(age<51) age50++; - else if(age<56) age55++; - else if(age<61) age60++; - else if(age<66) age65++; - else if(age<71) age70++; - else age71++; - switch(user.hair) { - case HAIR_BLONDE: - hair_blonde++; - break; - case HAIR_BROWN: - hair_brown++; - break; - case HAIR_RED: - hair_red++; - break; - case HAIR_BLACK: - hair_black++; - break; - case HAIR_GREY: - hair_grey++; - break; - default: - hair_other++; - break; } - - switch(user.eyes) { - case EYES_BLUE: - eyes_blue++; - break; - case EYES_BROWN: - eyes_brown++; - break; - case EYES_GREEN: - eyes_green++; - break; - case EYES_HAZEL: - eyes_hazel++; - break; - default: - eyes_other++; - break; } - switch(user.marital) { - case MARITAL_SINGLE: - marital_single++; - break; - case MARITAL_MARRIED: - marital_married++; - break; - case MARITAL_DIVORCED: - marital_divorced++; - break; - case MARITAL_WIDOWED: - marital_widowed++; - break; - default: - marital_other++; - break; } - - switch(user.race) { - case RACE_WHITE: - race_white++; - break; - case RACE_BLACK: - race_black++; - break; - case RACE_HISPANIC: - race_hispanic++; - break; - case RACE_ASIAN: - race_asian++; - break; - case RACE_AMERINDIAN: - race_amerindian++; - break; - case RACE_MIDEASTERN: - race_mideastern++; - break; - default: - race_other++; - break; } - - if((!strncmp(user.birth,"03",2) && atoi(user.birth+3)>=21) - || (!strncmp(user.birth,"04",2) && atoi(user.birth+3)<=19)) - zodiac_aries++; - else if((!strncmp(user.birth,"04",2) && atoi(user.birth+3)>=20) - || (!strncmp(user.birth,"05",2) && atoi(user.birth+3)<=20)) - zodiac_taurus++; - else if((!strncmp(user.birth,"05",2) && atoi(user.birth+3)>=21) - || (!strncmp(user.birth,"06",2) && atoi(user.birth+3)<=20)) - zodiac_gemini++; - else if((!strncmp(user.birth,"06",2) && atoi(user.birth+3)>=21) - || (!strncmp(user.birth,"07",2) && atoi(user.birth+3)<=22)) - zodiac_cancer++; - else if((!strncmp(user.birth,"07",2) && atoi(user.birth+3)>=23) - || (!strncmp(user.birth,"08",2) && atoi(user.birth+3)<=22)) - zodiac_leo++; - else if((!strncmp(user.birth,"08",2) && atoi(user.birth+3)>=23) - || (!strncmp(user.birth,"09",2) && atoi(user.birth+3)<=22)) - zodiac_virgo++; - else if((!strncmp(user.birth,"09",2) && atoi(user.birth+3)>=23) - || (!strncmp(user.birth,"10",2) && atoi(user.birth+3)<=22)) - zodiac_libra++; - else if((!strncmp(user.birth,"10",2) && atoi(user.birth+3)>=23) - || (!strncmp(user.birth,"11",2) && atoi(user.birth+3)<=21)) - zodiac_scorpio++; - else if((!strncmp(user.birth,"11",2) && atoi(user.birth+3)>=22) - || (!strncmp(user.birth,"12",2) && atoi(user.birth+3)<=21)) - zodiac_sagittarius++; - else if((!strncmp(user.birth,"12",2) && atoi(user.birth+3)>=22) - || (!strncmp(user.birth,"01",2) && atoi(user.birth+3)<=19)) - zodiac_capricorn++; - else if((!strncmp(user.birth,"01",2) && atoi(user.birth+3)>=20) - || (!strncmp(user.birth,"02",2) && atoi(user.birth+3)<=18)) - zodiac_aquarius++; - else if((!strncmp(user.birth,"02",2) && atoi(user.birth+3)>=19) - || (!strncmp(user.birth,"03",2) && atoi(user.birth+3)<=20)) - zodiac_pisces++; - - fwrite(&ixb[l],sizeof(ixb_t),1,ixb_fp); - fwrite(&user,sizeof(user_t),1,tmp_fp); - } -fprintf(stderr,"\n"); -fcloseall(); -remove("SMM.DAB"); -rename("SMM.TMP","SMM.DAB"); - -printf("Synchronet Match Maker Statistics\n"); -printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); -printf("\n"); -printf("%-25s : %lu\n","Total",users); -printf("%-25s : %lu\n","Photos",photos); -printf("%-25s : %lu\n","Networked",networked); -// if(male_straight) - printf("%-25s (%4.1f%%) : %lu\n","Sex: male (hetero)" - ,(((float)male_straight/users)*100.0),male_straight); -// if(male_gay) - printf("%-25s (%4.1f%%) : %lu\n","Sex: male (gay)" - ,(((float)male_gay/users)*100.0),male_gay); -// if(male_bi) - printf("%-25s (%4.1f%%) : %lu\n","Sex: male (bi)" - ,(((float)male_bi/users)*100.0),male_bi); -// if(female_straight) - printf("%-25s (%4.1f%%) : %lu\n","Sex: female (hetero)" - ,(((float)female_straight/users)*100.0),female_straight); -// if(female_gay) - printf("%-25s (%4.1f%%) : %lu\n","Sex: female (gay)" - ,(((float)female_gay/users)*100.0),female_gay); -// if(female_bi) - printf("%-25s (%4.1f%%) : %lu\n","Sex: female (bi)" - ,(((float)female_bi/users)*100.0),female_bi); -// if(age12) - printf("%-25s (%4.1f%%) : %lu\n","Age: 12 and younger" - ,(((float)age12/users)*100.0),age12); -// if(age15) - printf("%-25s (%4.1f%%) : %lu\n","Age: 13 to 15 years old" - ,(((float)age15/users)*100.0),age15); -// if(age20) - printf("%-25s (%4.1f%%) : %lu\n","Age: 16 to 20 years old" - ,(((float)age20/users)*100.0),age20); -// if(age25) - printf("%-25s (%4.1f%%) : %lu\n","Age: 21 to 25 years old" - ,(((float)age25/users)*100.0),age25); -// if(age30) - printf("%-25s (%4.1f%%) : %lu\n","Age: 26 to 30 years old" - ,(((float)age30/users)*100.0),age30); -// if(age35) - printf("%-25s (%4.1f%%) : %lu\n","Age: 31 to 35 years old" - ,(((float)age35/users)*100.0),age35); -// if(age40) - printf("%-25s (%4.1f%%) : %lu\n","Age: 36 to 40 years old" - ,(((float)age40/users)*100.0),age40); -// if(age45) - printf("%-25s (%4.1f%%) : %lu\n","Age: 41 to 45 years old" - ,(((float)age45/users)*100.0),age45); -// if(age50) - printf("%-25s (%4.1f%%) : %lu\n","Age: 46 to 50 years old" - ,(((float)age50/users)*100.0),age50); -// if(age55) - printf("%-25s (%4.1f%%) : %lu\n","Age: 51 to 55 years old" - ,(((float)age55/users)*100.0),age55); -// if(age60) - printf("%-25s (%4.1f%%) : %lu\n","Age: 56 to 60 years old" - ,(((float)age60/users)*100.0),age60); -// if(age65) - printf("%-25s (%4.1f%%) : %lu\n","Age: 61 to 65 years old" - ,(((float)age65/users)*100.0),age65); -// if(age70) - printf("%-25s (%4.1f%%) : %lu\n","Age: 66 to 70 years old" - ,(((float)age70/users)*100.0),age70); -// if(age71) - printf("%-25s (%4.1f%%) : %lu\n","Age: 71 and older" - ,(((float)age71/users)*100.0),age71); -// if(hair_blonde) - printf("%-25s (%4.1f%%) : %lu\n","Hair: blonde" - ,(((float)hair_blonde/users)*100.0),hair_blonde); -// if(hair_brown) - printf("%-25s (%4.1f%%) : %lu\n","Hair: brown" - ,(((float)hair_brown/users)*100.0),hair_brown); -// if(hair_black) - printf("%-25s (%4.1f%%) : %lu\n","Hair: black" - ,(((float)hair_black/users)*100.0),hair_black); -// if(hair_red) - printf("%-25s (%4.1f%%) : %lu\n","Hair: red" - ,(((float)hair_red/users)*100.0),hair_red); -// if(hair_grey) - printf("%-25s (%4.1f%%) : %lu\n","Hair: grey" - ,(((float)hair_grey/users)*100.0),hair_grey); -// if(hair_other) - printf("%-25s (%4.1f%%) : %lu\n","Hair: other" - ,(((float)hair_other/users)*100.0),hair_other); -// if(eyes_blue) - printf("%-25s (%4.1f%%) : %lu\n","Eyes: blue" - ,(((float)eyes_blue/users)*100.0),eyes_blue); -// if(eyes_brown) - printf("%-25s (%4.1f%%) : %lu\n","Eyes: brown" - ,(((float)eyes_brown/users)*100.0),eyes_brown); -// if(eyes_green) - printf("%-25s (%4.1f%%) : %lu\n","Eyes: green" - ,(((float)eyes_green/users)*100.0),eyes_green); -// if(eyes_hazel) - printf("%-25s (%4.1f%%) : %lu\n","Eyes: hazel" - ,(((float)eyes_hazel/users)*100.0),eyes_hazel); -// if(eyes_other) - printf("%-25s (%4.1f%%) : %lu\n","Eyes: other" - ,(((float)eyes_other/users)*100.0),eyes_other); -// if(race_white) - printf("%-25s (%4.1f%%) : %lu\n","Race: white" - ,(((float)race_white/users)*100.0),race_white); -// if(race_black) - printf("%-25s (%4.1f%%) : %lu\n","Race: black" - ,(((float)race_black/users)*100.0),race_black); -// if(race_asian) - printf("%-25s (%4.1f%%) : %lu\n","Race: asian" - ,(((float)race_asian/users)*100.0),race_asian); -// if(race_amerindian) - printf("%-25s (%4.1f%%) : %lu\n","Race: amerindian" - ,(((float)race_amerindian/users)*100.0),race_amerindian); -// if(race_mideastern) - printf("%-25s (%4.1f%%) : %lu\n","Race: mideastern" - ,(((float)race_mideastern/users)*100.0),race_mideastern); -// if(race_hispanic) - printf("%-25s (%4.1f%%) : %lu\n","Race: hispanic" - ,(((float)race_hispanic/users)*100.0),race_hispanic); -// if(race_other) - printf("%-25s (%4.1f%%) : %lu\n","Race: other" - ,(((float)race_other/users)*100.0),race_other); -// if(marital_single) - printf("%-25s (%4.1f%%) : %lu\n","Marital: single" - ,(((float)marital_single/users)*100.0),marital_single); -// if(marital_married) - printf("%-25s (%4.1f%%) : %lu\n","Marital: married" - ,(((float)marital_married/users)*100.0),marital_married); -// if(marital_divorced) - printf("%-25s (%4.1f%%) : %lu\n","Marital: divorced" - ,(((float)marital_divorced/users)*100.0),marital_divorced); -// if(marital_widowed) - printf("%-25s (%4.1f%%) : %lu\n","Marital: widowed" - ,(((float)marital_widowed/users)*100.0),marital_widowed); -// if(marital_other) - printf("%-25s (%4.1f%%) : %lu\n","Marital: other" - ,(((float)marital_other/users)*100.0),marital_other); -// if(zodiac_aries) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: aries" - ,(((float)zodiac_aries/users)*100.0),zodiac_aries); -// if(zodiac_taurus) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: taurus" - ,(((float)zodiac_taurus/users)*100.0),zodiac_taurus); -// if(zodiac_gemini) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: gemini" - ,(((float)zodiac_gemini/users)*100.0),zodiac_gemini); -// if(zodiac_cancer) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: cancer" - ,(((float)zodiac_cancer/users)*100.0),zodiac_cancer); -// if(zodiac_leo) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: leo" - ,(((float)zodiac_leo/users)*100.0),zodiac_leo); -// if(zodiac_virgo) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: virgo" - ,(((float)zodiac_virgo/users)*100.0),zodiac_virgo); -// if(zodiac_libra) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: libra" - ,(((float)zodiac_libra/users)*100.0),zodiac_libra); -// if(zodiac_scorpio) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: scorpio" - ,(((float)zodiac_scorpio/users)*100.0),zodiac_scorpio); -// if(zodiac_sagittarius) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: sagittarius" - ,(((float)zodiac_sagittarius/users)*100.0),zodiac_sagittarius); -// if(zodiac_capricorn) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: capricorn" - ,(((float)zodiac_capricorn/users)*100.0),zodiac_capricorn); -// if(zodiac_aquarius) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: aquarius" - ,(((float)zodiac_aquarius/users)*100.0),zodiac_aquarius); -// if(zodiac_pisces) - printf("%-25s (%4.1f%%) : %lu\n","Zodiac: pisces" - ,(((float)zodiac_pisces/users)*100.0),zodiac_pisces); - -if(!max_wall) - return(0); - -if((file=open("WALL.DAB",O_RDWR|O_BINARY|O_DENYNONE))==-1 - || (dab_fp=fdopen(file,"r+b"))==NULL) { - printf("Error opening WALL.DAB\n"); - exit(1); } - -if((file=open("WALL.TMP",O_WRONLY|O_CREAT|O_TRUNC|O_BINARY|O_DENYALL - ,S_IWRITE|S_IREAD))==-1 - || (tmp_fp=fdopen(file,"r+b"))==NULL) { - printf("Error opening WALL.TMP\n"); - exit(1); } - -fprintf(stderr,"Reading wall data..."); -rewind(dab_fp); -while(!feof(dab_fp)) { - if(!fread(&wall,sizeof(wall_t),1,dab_fp)) - break; - if((now-wall.imported)/(24UL*60UL*60UL)<=max_wall) - fwrite(&wall,sizeof(wall_t),1,tmp_fp); } - -fprintf(stderr,"\n"); -fcloseall(); -remove("WALL.DAB"); -rename("WALL.TMP","WALL.DAB"); - -return(0); -} diff --git a/src/sbbs2/smm/smmvars.c b/src/sbbs2/smm/smmvars.c deleted file mode 100644 index 0e828145b4..0000000000 --- a/src/sbbs2/smm/smmvars.c +++ /dev/null @@ -1,27 +0,0 @@ -/* SMMVARS.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -uchar purity_age=18; -uchar min_age=15; -uint min_level=0; -uchar req_flags1[128]=""; -uchar req_flags2[128]=""; -uchar req_flags3[128]=""; -uchar req_flags4[128]=""; -uchar zmodem_send[128]=""; -uchar local_view[128]=""; -uint auto_update=0; -long profile_cdt=0; -long telegram_cdt=0; -uint telegram_level=0; -long wall_cdt=0; -uint wall_level=0; -uchar wall_age=0; -uchar age_split=0; -uint que_level=0; -long que_cdt=0; -long cdt_adjustment=0; -uint notify_user=0; -ulong smm_misc=0; -uchar system_name[41]=""; diff --git a/src/sbbs2/str.c b/src/sbbs2/str.c deleted file mode 100644 index 6d4e2ade02..0000000000 --- a/src/sbbs2/str.c +++ /dev/null @@ -1,1080 +0,0 @@ -#line 1 "STR.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/*****************************************************/ -/* Functions that perform lengthy string i/o rotines */ -/*****************************************************/ - -#include "sbbs.h" - -/****************************************************************************/ -/* Lists all users who have access to the current sub. */ -/****************************************************************************/ -void userlist(char mode) -{ - uchar name[256],sort=0; - int i,j,k,users=0; - uchar *line[1000]; - user_t user; - -if(lastuser()<=1000) - sort=yesno(text[SortAlphaQ]); -if(sort) { - bputs(text[CheckingSlots]); } -else { - CRLF; } -j=0; -k=lastuser(); -for(i=1;i<=k && !msgabort();i++) { - if(sort && (online==ON_LOCAL || !rioctl(TXBC))) - bprintf("%-4d\b\b\b\b",i); - user.number=i; - getuserdat(&user); - if(user.misc&(DELETED|INACTIVE)) - continue; - users++; - if(mode==UL_SUB) { - if(!usrgrps) - continue; - if(!chk_ar(grp[usrgrp[curgrp]]->ar,user)) - continue; - if(!chk_ar(sub[usrsub[curgrp][cursub[curgrp]]]->ar,user) - || (sub[usrsub[curgrp][cursub[curgrp]]]->read_ar[0] - && !chk_ar(sub[usrsub[curgrp][cursub[curgrp]]]->read_ar,user))) - continue; } - else if(mode==UL_DIR) { - if(user.rest&FLAG('T')) - continue; - if(!usrlibs) - continue; - if(!chk_ar(lib[usrlib[curlib]]->ar,user)) - continue; - if(!chk_ar(dir[usrdir[curlib][curdir[curlib]]]->ar,user)) - continue; } - if(sort) { - if((line[j]=(char *)MALLOC(128))==0) { - errormsg(WHERE,ERR_ALLOC,nulstr,83); - for(i=0;i<j;i++) - FREE(line[i]); - return; } - sprintf(name,"%s #%d",user.alias,i); - sprintf(line[j],text[UserListFmt],name - ,sys_misc&SM_LISTLOC ? user.location : user.note - ,unixtodstr(user.laston,tmp) - ,user.modem); } - else { - sprintf(name,"%s #%u",user.alias,i); - bprintf(text[UserListFmt],name - ,sys_misc&SM_LISTLOC ? user.location : user.note - ,unixtodstr(user.laston,tmp) - ,user.modem); } - j++; } -if(i<=k) { /* aborted */ - if(sort) - for(i=0;i<j;i++) - FREE(line[i]); - return; } -if(!sort) { - CRLF; } -bprintf(text[NTotalUsers],users); -if(mode==UL_SUB) - bprintf(text[NUsersOnCurSub],j); -else if(mode==UL_DIR) - bprintf(text[NUsersOnCurDir],j); -if(!sort) - return; -CRLF; -qsort((void *)line,j,sizeof(line[0]) - ,(int(*)(const void*, const void*))pstrcmp); -for(i=0;i<j && !msgabort();i++) - bputs(line[i]); -for(i=0;i<j;i++) - FREE(line[i]); -} - -/****************************************************************************/ -/* SIF input function. See SIF.DOC for more info */ -/****************************************************************************/ -void sif(char *fname, char *answers, long len) -{ - char str[256],template[256],HUGE16 *buf,t,max,min,mode,cr; - int file; - ulong length,l=0,m,top,a=0; - -sprintf(str,"%s%s.SIF",text_dir,strupr(fname)); -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - answers[0]=0; - return; } -length=filelength(file); -if((buf=(char *)MALLOC(length))==0) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - answers[0]=0; - return; } -if(lread(file,buf,length)!=length) { - close(file); - errormsg(WHERE,ERR_READ,str,length); - answers[0]=0; - return; } -close(file); -while(l<length && online) { - mode=min=max=t=cr=0; - top=l; - while(l<length && buf[l++]!=STX); - for(m=l;m<length;m++) - if(buf[m]==ETX || !buf[m]) { - buf[m]=0; - break; } - if(l>=length) break; - if(online==ON_REMOTE) { - rioctl(IOCM|ABORT); - rioctl(IOCS|ABORT); } - putmsg(buf+l,P_SAVEATR); - m++; - if(toupper(buf[m])!='C' && toupper(buf[m])!='S') - continue; - SYNC; - if(online==ON_REMOTE) - rioctl(IOSM|ABORT); - if(a>=len) { - errormsg(WHERE,ERR_LEN,fname,len); - break; } - if((buf[m]&0xdf)=='C') { - if((buf[m+1]&0xdf)=='U') { /* Uppercase only */ - mode|=K_UPPER; - m++; } - else if((buf[m+1]&0xdf)=='N') { /* Numbers only */ - mode|=K_NUMBER; - m++; } - if((buf[m+1]&0xdf)=='L') { /* Draw line */ - if(useron.misc&COLOR) - attr(color[clr_inputline]); - else - attr(BLACK|(LIGHTGRAY<<4)); - bputs(" \b"); - m++; } - if((buf[m+1]&0xdf)=='R') { /* Add CRLF */ - cr=1; - m++; } - if(buf[m+1]=='"') { - m+=2; - for(l=m;l<length;l++) - if(buf[l]=='"') { - buf[l]=0; - break; } - answers[a++]=getkeys((char *)buf+m,0); } - else { - answers[a]=getkey(mode); - outchar(answers[a++]); - attr(LIGHTGRAY); - CRLF; } - if(cr) { - answers[a++]=CR; - answers[a++]=LF; } } - else if((buf[m]&0xdf)=='S') { /* String */ - if((buf[m+1]&0xdf)=='U') { /* Uppercase only */ - mode|=K_UPPER; - m++; } - else if((buf[m+1]&0xdf)=='F') { /* Force Upper/Lowr case */ - mode|=K_UPRLWR; - m++; } - else if((buf[m+1]&0xdf)=='N') { /* Numbers only */ - mode|=K_NUMBER; - m++; } - if((buf[m+1]&0xdf)=='L') { /* Draw line */ - mode|=K_LINE; - m++; } - if((buf[m+1]&0xdf)=='R') { /* Add CRLF */ - cr=1; - m++; } - if(isdigit(buf[m+1])) { - max=buf[++m]&0xf; - if(isdigit(buf[m+1])) - max=max*10+(buf[++m]&0xf); } - if(buf[m+1]=='.' && isdigit(buf[m+2])) { - m++; - min=buf[++m]&0xf; - if(isdigit(buf[m+1])) - min=min*10+(buf[++m]&0xf); } - if(buf[m+1]=='"') { - m++; - mode&=~K_NUMBER; - while(buf[++m]!='"' && t<80) - template[t++]=buf[m]; - template[t]=0; - max=strlen(template); } - if(t) { - if(gettmplt(str,template,mode)<min) { - l=top; - continue; } } - else { - if(!max) - continue; - if(getstr(str,max,mode)<min) { - l=top; - continue; } } - if(!cr) { - for(cr=0;str[cr];cr++) - answers[a+cr]=str[cr]; - while(cr<max) - answers[a+cr++]=ETX; - a+=max; } - else { - putrec(answers,a,max,str); - putrec(answers,a+max,2,crlf); - a+=max+2; } } } -answers[a]=0; -FREE((char *)buf); -} - -/****************************************************************************/ -/* SIF output function. See SIF.DOC for more info */ -/****************************************************************************/ -void sof(char *fname, char *answers, long len) -{ - char str[256],HUGE16 *buf,max,min,cr; - int file; - ulong length,l=0,m,a=0; - -sprintf(str,"%s%s.SIF",text_dir,strupr(fname)); -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - answers[0]=0; - return; } -length=filelength(file); -if((buf=(char *)MALLOC(length))==0) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - answers[0]=0; - return; } -if(lread(file,buf,length)!=length) { - close(file); - errormsg(WHERE,ERR_READ,str,length); - answers[0]=0; - return; } -close(file); -while(l<length && online) { - min=max=cr=0; - while(l<length && buf[l++]!=STX); - for(m=l;m<length;m++) - if(buf[m]==ETX || !buf[m]) { - buf[m]=0; - break; } - if(l>=length) break; - if(online==ON_REMOTE) { - rioctl(IOCM|ABORT); - rioctl(IOCS|ABORT); } - putmsg(buf+l,P_SAVEATR); - m++; - if(toupper(buf[m])!='C' && toupper(buf[m])!='S') - continue; - SYNC; - if(online==ON_REMOTE) - rioctl(IOSM|ABORT); - if(a>=len) { - bprintf("\r\nSOF: %s defined more data than buffer size " - "(%lu bytes)\r\n",fname,len); - break; } - if((buf[m]&0xdf)=='C') { - if((buf[m+1]&0xdf)=='U') /* Uppercase only */ - m++; - else if((buf[m+1]&0xdf)=='N') /* Numbers only */ - m++; - if((buf[m+1]&0xdf)=='L') { /* Draw line */ - if(useron.misc&COLOR) - attr(color[clr_inputline]); - else - attr(BLACK|(LIGHTGRAY<<4)); - bputs(" \b"); - m++; } - if((buf[m+1]&0xdf)=='R') { /* Add CRLF */ - cr=1; - m++; } - outchar(answers[a++]); - attr(LIGHTGRAY); - CRLF; - if(cr) - a+=2; } - else if((buf[m]&0xdf)=='S') { /* String */ - if((buf[m+1]&0xdf)=='U') - m++; - else if((buf[m+1]&0xdf)=='F') - m++; - else if((buf[m+1]&0xdf)=='N') /* Numbers only */ - m++; - if((buf[m+1]&0xdf)=='L') { - if(useron.misc&COLOR) - attr(color[clr_inputline]); - else - attr(BLACK|(LIGHTGRAY<<4)); - m++; } - if((buf[m+1]&0xdf)=='R') { - cr=1; - m++; } - if(isdigit(buf[m+1])) { - max=buf[++m]&0xf; - if(isdigit(buf[m+1])) - max=max*10+(buf[++m]&0xf); } - if(buf[m+1]=='.' && isdigit(buf[m+2])) { - m++; - min=buf[++m]&0xf; - if(isdigit(buf[m+1])) - min=min*10+(buf[++m]&0xf); } - if(buf[m+1]=='"') { - max=0; - m++; - while(buf[++m]!='"' && max<80) - max++; } - if(!max) - continue; - getrec(answers,a,max,str); - bputs(str); - attr(LIGHTGRAY); - CRLF; - if(!cr) - a+=max; - else - a+=max+2; } } -FREE((char *)buf); -} - -/****************************************************************************/ -/* Creates data file 'datfile' from input via sif file 'siffile' */ -/****************************************************************************/ -void create_sif_dat(char *siffile, char *datfile) -{ - char *buf; - int file; - -if((buf=(char *)MALLOC(SIF_MAXBUF))==NULL) { - errormsg(WHERE,ERR_ALLOC,siffile,SIF_MAXBUF); - return; } -memset(buf,SIF_MAXBUF,0); /* initialize to null */ -sif(siffile,buf,SIF_MAXBUF); -if((file=nopen(datfile,O_WRONLY|O_TRUNC|O_CREAT))==-1) { - FREE(buf); - errormsg(WHERE,ERR_OPEN,datfile,O_WRONLY|O_TRUNC|O_CREAT); - return; } -write(file,buf,strlen(buf)); -close(file); -FREE(buf); -} - -/****************************************************************************/ -/* Reads data file 'datfile' and displays output via sif file 'siffile' */ -/****************************************************************************/ -void read_sif_dat(char *siffile, char *datfile) -{ - char *buf; - int file; - long length; - -if((file=nopen(datfile,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,datfile,O_RDONLY); - return; } -length=filelength(file); -if(!length) { - close(file); - return; } -if((buf=(char *)MALLOC(length))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,datfile,length); - return; } -read(file,buf,length); -close(file); -sof(siffile,buf,length); -FREE(buf); -} - -/****************************************************************************/ -/* Get string by template. A=Alpha, N=Number, !=Anything */ -/* First character MUST be an A,N or !. */ -/* Modes - K_LINE and K_UPPER are supported. */ -/****************************************************************************/ -char gettmplt(char *strout,char *template,int mode) -{ - uchar t=strlen(template),c=0,ch,str[256]; - -sys_status&=~SS_ABORT; -strupr(template); -if(useron.misc&ANSI) { - if(mode&K_LINE) { - if(useron.misc&COLOR) - attr(color[clr_inputline]); - else - attr(BLACK|(LIGHTGRAY<<4)); } - while(c<t) { - if(template[c]=='N' || template[c]=='A' || template[c]=='!') - outchar(SP); - else - outchar(template[c]); - c++; } - bprintf("\x1b[%dD",t); } -c=0; -if(mode&K_EDIT) { - strcpy(str,strout); - bputs(str); - c=strlen(str); } -while((ch=getkey(mode))!=CR && online && !(sys_status&SS_ABORT)) { - if(ch==BS) { - if(!c) - continue; - for(ch=1,c--;c;c--,ch++) - if(template[c]=='N' || template[c]=='A' || template[c]=='!') - break; - if(useron.misc&ANSI) - bprintf("\x1b[%dD",ch); - else while(ch--) - outchar(BS); - bputs(" \b"); - continue; } - if(ch==24) { /* Ctrl-X */ - for(c--;c!=0xff;c--) { - outchar(BS); - if(template[c]=='N' || template[c]=='A' || template[c]=='!') - bputs(" \b"); } - c=0; } - else if(c<t) { - if(template[c]=='N' && !isdigit(ch)) - continue; - if(template[c]=='A' && !isalpha(ch)) - continue; - outchar(ch); - str[c++]=ch; - while(c<t && template[c]!='N' && template[c]!='A' && template[c]!='!'){ - str[c]=template[c]; - outchar(template[c++]); } } } -str[c]=0; -attr(LIGHTGRAY); -CRLF; -if(!(sys_status&SS_ABORT)) - strcpy(strout,str); -return(c); -} - -/*****************************************************************************/ -/* Accepts a user's input to change a new-scan time pointer */ -/* Returns 0 if input was aborted or invalid, 1 if complete */ -/*****************************************************************************/ -char inputnstime(time_t *dt) -{ - int hour; - struct date tmpdate; - struct time tmptime; - char pm,str[256]; - -bputs(text[NScanDate]); -bputs(timestr(dt)); -CRLF; -unixtodos(*dt,&tmpdate,&tmptime); -bputs(text[NScanYear]); -itoa(tmpdate.da_year,str,10); -if(!getstr(str,4,K_EDIT|K_AUTODEL|K_NUMBER|K_NOCRLF) || sys_status&SS_ABORT) { - CRLF; - return(0); } -tmpdate.da_year=atoi(str); -if(tmpdate.da_year<1970) { - CRLF; - return(0); } -bputs(text[NScanMonth]); -itoa(tmpdate.da_mon,str,10); -if(!getstr(str,2,K_EDIT|K_AUTODEL|K_NUMBER|K_NOCRLF) || sys_status&SS_ABORT) { - CRLF; - return(0); } -tmpdate.da_mon=atoi(str); -if(tmpdate.da_mon<1 || tmpdate.da_mon>12) { - CRLF; - return(0); } -bputs(text[NScanDay]); -itoa(tmpdate.da_day,str,10); -if(!getstr(str,2,K_EDIT|K_AUTODEL|K_NUMBER|K_NOCRLF) || sys_status&SS_ABORT) { - CRLF; - return(0); } -tmpdate.da_day=atoi(str); -if(tmpdate.da_day<1 || tmpdate.da_day>31) { - CRLF; - return(0); } -bputs(text[NScanHour]); -if(sys_misc&SM_MILITARY) - hour=tmptime.ti_hour; -else { - if(tmptime.ti_hour==0) { /* 12 midnite */ - pm=0; - hour=12; } - else if(tmptime.ti_hour>12) { - hour=tmptime.ti_hour-12; - pm=1; } - else { - hour=tmptime.ti_hour; - pm=0; } } -itoa(hour,str,10); -if(!getstr(str,2,K_EDIT|K_AUTODEL|K_NUMBER|K_NOCRLF) || sys_status&SS_ABORT) { - CRLF; - return(0); } - -tmptime.ti_hour=atoi(str); -if(tmptime.ti_hour>24) { - CRLF; - return(0); } -bputs(text[NScanMinute]); -itoa(tmptime.ti_min,str,10); -if(!getstr(str,2,K_EDIT|K_AUTODEL|K_NUMBER|K_NOCRLF) || sys_status&SS_ABORT) { - CRLF; - return(0); } - -tmptime.ti_min=atoi(str); -if(tmptime.ti_min>59) { - CRLF; - return(0); } -tmptime.ti_sec=0; -if(!(sys_misc&SM_MILITARY) && tmptime.ti_hour && tmptime.ti_hour<13) { - if(pm && yesno(text[NScanPmQ])) { - if(tmptime.ti_hour<12) - tmptime.ti_hour+=12; } - else if(!pm && !yesno(text[NScanAmQ])) { - if(tmptime.ti_hour<12) - tmptime.ti_hour+=12; } - else if(tmptime.ti_hour==12) - tmptime.ti_hour=0; } -else { - CRLF; } -*dt=dostounix(&tmpdate,&tmptime); -return(1); -} - -/*****************************************************************************/ -/* Checks a password for uniqueness and validity */ -/*****************************************************************************/ -char chkpass(char *pass, user_t user) -{ - char c,d,first[128],last[128],sysop[41],sysname[41],*p; - -if(strlen(pass)<4) { - bputs(text[PasswordTooShort]); - return(0); } -if(!strcmp(pass,user.pass)) { - bputs(text[PasswordNotChanged]); - return(0); } -d=strlen(pass); -for(c=1;c<d;c++) - if(pass[c]!=pass[c-1]) - break; -if(c==d) { - bputs(text[PasswordInvalid]); - return(0); } -for(c=0;c<3;c++) /* check for 1234 and ABCD */ - if(pass[c]!=pass[c+1]+1) - break; -if(c==3) { - bputs(text[PasswordObvious]); - return(0); } -for(c=0;c<3;c++) /* check for 4321 and ZYXW */ - if(pass[c]!=pass[c+1]-1) - break; -if(c==3) { - bputs(text[PasswordObvious]); - return(0); } -strupr(user.name); -strupr(user.alias); -strcpy(first,user.alias); -p=strchr(first,SP); -if(p) { - *p=0; - strcpy(last,p+1); } -else - last[0]=0; -strupr(user.handle); -strcpy(sysop,sys_op); -strupr(sysop); -strcpy(sysname,sys_name); -strupr(sysname); -if((user.pass[0] - && (strstr(pass,user.pass) || strstr(user.pass,pass))) - || (user.name[0] - && (strstr(pass,user.name) || strstr(user.name,pass))) - || strstr(pass,user.alias) || strstr(user.alias,pass) - || strstr(pass,first) || strstr(first,pass) - || (last[0] - && (strstr(pass,last) || strstr(last,pass))) - || strstr(pass,user.handle) || strstr(user.handle,pass) - || (user.zipcode[0] - && (strstr(pass,user.zipcode) || strstr(user.zipcode,pass))) - || (sysname[0] - && (strstr(pass,sysname) || strstr(sysname,pass))) - || (sysop[0] - && (strstr(pass,sysop) || strstr(sysop,pass))) - || (sys_id[0] - && (strstr(pass,sys_id) || strstr(sys_id,pass))) - || (node_phone[0] && strstr(pass,node_phone)) - || (user.phone[0] && strstr(user.phone,pass)) - || !strncmp(pass,"QWER",3) - || !strncmp(pass,"ASDF",3) - || !strncmp(pass,"!@#$",3) - ) - { - bputs(text[PasswordObvious]); - return(0); } -return(1); -} - -/****************************************************************************/ -/* Prompts user for detailed information regarding their computer */ -/* and places that information into 'computer' */ -/* Called from function newuser */ -/****************************************************************************/ -void getcomputer(char *computer) -{ - char str[256]; - -if(!(uq&UQ_MC_COMP)) { - while(online) { - bputs(text[EnterYourComputer]); - if(getstr(computer,LEN_COMP,K_LINE)) - break; } - return; } -bputs(text[ComputerTypeMenu]); -bputs(text[ComputerTypePrompt]); -switch(getkeys("ABCDE",0)) { - case 'A': - sif("COMPUTER",str,8); - if(!online) return; - switch(str[0]) { - case 'A': - strcpy(computer,"XT"); - break; - case 'B': - strcpy(computer,"286"); - break; - case 'C': - strcpy(computer,"386SX"); - break; - case 'D': - strcpy(computer,"386DX"); - break; - case 'E': - strcpy(computer,"486"); - break; } - switch(str[1]) { - case 'A': - strcat(computer,"-4 "); - break; - case 'B': - strcat(computer,"-6 "); - break; - case 'C': - strcat(computer,"-8 "); - break; - case 'D': - strcat(computer,"-10 "); - break; - case 'E': - strcat(computer,"-12 "); - break; - case 'F': - strcat(computer,"-16 "); - break; - case 'G': - strcat(computer,"-20 "); - break; - case 'H': - strcat(computer,"-25 "); - break; - case 'I': - strcat(computer,"-33 "); - break; - case 'J': - strcat(computer,"-40 "); - break; - case 'K': - strcat(computer,"-50 "); - break; } - switch(str[2]) { - case 'A': - strcat(computer,"8bit "); - break; - case 'B': - strcat(computer,"ISA "); - break; - case 'C': - strcat(computer,"MCA "); - break; - case 'D': - strcat(computer,"EISA "); - break; } - switch(str[3]) { - case 'A': - strcat(computer,"MDA "); - break; - case 'B': - strcat(computer,"HERC "); - break; - case 'C': - strcat(computer,"CGA "); - break; - case 'D': - strcat(computer,"EGA "); - break; - case 'E': - strcat(computer,"MCGA "); - break; - case 'F': - strcat(computer,"VGA "); - break; - case 'G': - strcat(computer,"SVGA "); - break; - case 'H': - strcat(computer,"MVGA "); - break; - case 'I': - strcat(computer,"8514 "); - break; - case 'J': - strcat(computer,"XGA "); - break; - case 'K': - strcat(computer,"TIGA "); - break; } - switch(str[4]) { - case 'A': - strcat(computer,"<1 "); - break; - case 'B': - strcat(computer,"1 "); - break; - case 'C': - strcat(computer,"2 "); - break; - case 'D': - strcat(computer,"3 "); - break; - case 'E': - strcat(computer,"4 "); - break; - case 'F': - strcat(computer,"5 "); - break; - case 'G': - strcat(computer,"6 "); - break; - case 'H': - strcat(computer,"8 "); - break; - case 'I': - strcat(computer,"10 "); - break; - case 'J': - strcat(computer,"12 "); - break; - case 'K': - strcat(computer,"16 "); - break; - case 'L': - strcat(computer,"18 "); - break; - case 'M': - strcat(computer,"24 "); - break; - case 'N': - strcat(computer,"32 "); - break; - case 'O': - strcat(computer,"64 "); - break; } - switch(str[5]) { - case 'A': - strcat(computer,"0 "); - break; - case 'B': - strcat(computer,"10 "); - break; - case 'C': - strcat(computer,"20 "); - break; - case 'D': - strcat(computer,"30 "); - break; - case 'E': - strcat(computer,"40 "); - break; - case 'F': - strcat(computer,"60 "); - break; - case 'G': - strcat(computer,"80 "); - break; - case 'H': - strcat(computer,"100 "); - break; - case 'I': - strcat(computer,"120 "); - break; - case 'J': - strcat(computer,"150 "); - break; - case 'K': - strcat(computer,"200 "); - break; - case 'L': - strcat(computer,"250 "); - break; - case 'M': - strcat(computer,"300 "); - break; - case 'N': - strcat(computer,"400 "); - break; - case 'O': - strcat(computer,"500 "); - break; - case 'P': - strcat(computer,"600 "); - break; - case 'Q': - strcat(computer,"700 "); - break; - case 'R': - strcat(computer,"800 "); - break; - case 'S': - strcat(computer,"900 "); - break; - case 'T': - strcat(computer,"1GB "); - break; } - switch(str[6]) { - case 'A': - strcat(computer,"ST506"); - break; - case 'B': - strcat(computer,"SCSI"); - break; - case 'C': - strcat(computer,"SCSI2"); - break; - case 'D': - strcat(computer,"ESDI"); - break; - case 'E': - strcat(computer,"IDE"); } - break; - case 'B': - sprintf(computer,"%.*s",LEN_COMP,text[ComputerTypeB]); - return; - case 'C': - sprintf(computer,"%.*s",LEN_COMP,text[ComputerTypeC]); - return; - case 'D': - sprintf(computer,"%.*s",LEN_COMP,text[ComputerTypeD]); - return; - case 'E': - sprintf(computer,"%.*s",LEN_COMP,text[ComputerTypeE]); - return; } -} - -/****************************************************************************/ -/* Displays information about sub-board subnum */ -/****************************************************************************/ -void subinfo(uint subnum) -{ - char str[256]; - -bputs(text[SubInfoHdr]); -bprintf(text[SubInfoLongName],sub[subnum]->lname); -bprintf(text[SubInfoShortName],sub[subnum]->sname); -bprintf(text[SubInfoQWKName],sub[subnum]->qwkname); -bprintf(text[SubInfoMaxMsgs],sub[subnum]->maxmsgs); -if(sub[subnum]->misc&SUB_QNET) - bprintf(text[SubInfoTagLine],sub[subnum]->tagline); -if(sub[subnum]->misc&SUB_FIDO) - bprintf(text[SubInfoFidoNet] - ,sub[subnum]->origline - ,faddrtoa(sub[subnum]->faddr)); -sprintf(str,"%s%s.MSG",sub[subnum]->data_dir,sub[subnum]->code); -if(fexist(str) && yesno(text[SubInfoViewFileQ])) - printfile(str,0); -} - -/****************************************************************************/ -/* Displays information about transfer directory dirnum */ -/****************************************************************************/ -void dirinfo(uint dirnum) -{ - char str[256]; - -bputs(text[DirInfoHdr]); -bprintf(text[DirInfoLongName],dir[dirnum]->lname); -bprintf(text[DirInfoShortName],dir[dirnum]->sname); -if(dir[dirnum]->exts[0]) - bprintf(text[DirInfoAllowedExts],dir[dirnum]->exts); -bprintf(text[DirInfoMaxFiles],dir[dirnum]->maxfiles); -sprintf(str,"%s%s.MSG",dir[dirnum]->data_dir,dir[dirnum]->code); -if(fexist(str) && yesno(text[DirInfoViewFileQ])) - printfile(str,0); -} - -/****************************************************************************/ -/* Searches the file <name>.CAN in the TEXT directory for matches */ -/* Returns 1 if found in list, 0 if not. */ -/****************************************************************************/ -char trashcan(char *insearch, char *name) -{ - char str[256],search[256],c,found=0; - int file; - FILE *stream; - -sprintf(str,"%s%s.CAN",text_dir,name); -if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - if(fexist(str)) - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return(0); } -strcpy(search,insearch); -strupr(search); -while(!feof(stream) && !ferror(stream) && !found) { - if(!fgets(str,81,stream)) - break; - truncsp(str); - c=strlen(str); - if(c) { - c--; - strupr(str); - if(str[c]=='~') { - str[c]=0; - if(strstr(search,str)) - found=1; } - - else if(str[c]=='^') { - str[c]=0; - if(!strncmp(str,search,c)) - found=1; } - - else if(!strcmp(str,search)) - found=1; } } -fclose(stream); -if(found) { - sprintf(str,"%sBAD%s.MSG",text_dir,name); - if(fexist(str)) - printfile(str,0); - return(1); } -return(0); -} - -/****************************************************************************/ -/* Error handling routine. Prints to local and remote screens the error */ -/* information, function, action, object and access and then attempts to */ -/* write the error information into the file ERROR.LOG and NODE.LOG */ -/****************************************************************************/ -void errormsg(int line, char *source, char action, char *object, ulong access) -{ - char str[512]; - char actstr[256]; - -switch(action) { - case ERR_OPEN: - strcpy(actstr,"opening"); - break; - case ERR_CLOSE: - strcpy(actstr,"closing"); - break; - case ERR_FDOPEN: - strcpy(actstr,"fdopen"); - break; - case ERR_READ: - strcpy(actstr,"reading"); - break; - case ERR_WRITE: - strcpy(actstr,"writing"); - break; - case ERR_REMOVE: - strcpy(actstr,"removing"); - break; - case ERR_ALLOC: - strcpy(actstr,"allocating memory"); - break; - case ERR_CHK: - strcpy(actstr,"checking"); - break; - case ERR_LEN: - strcpy(actstr,"checking length"); - break; - case ERR_EXEC: - strcpy(actstr,"executing"); - break; - case ERR_CHDIR: - strcpy(actstr,"changing directory"); - break; - case ERR_CREATE: - strcpy(actstr,"creating"); - break; - case ERR_LOCK: - strcpy(actstr,"locking"); - break; - case ERR_UNLOCK: - strcpy(actstr,"unlocking"); - break; - default: - strcpy(actstr,"UNKNOWN"); } -bprintf("\7\r\nERROR - action: %s",actstr); /* tell user about error */ -bprintf("\7\r\n object: %s",object); -bprintf("\7\r\n access: %ld",access); -if(access>9 && (long)access!=-1 && (short)access!=-1 && (char)access!=-1) - bprintf(" (%lXh)",access); -if(sys_misc&SM_ERRALARM) { - beep(500,220); beep(250,220); - beep(500,220); beep(250,220); - beep(500,220); beep(250,220); - nosound(); } -bputs("\r\n\r\nThe sysop has been notified. <Hit a key>"); -getkey(0); -CRLF; -sprintf(str,"\r\n file: %s\r\n line: %d\r\n action: %s\r\n" - " object: %s\r\n access: %ld" - ,source,line,actstr,object,access); -if(access>9 && (long)access!=-1 && (short)access!=-1 && (char)access!=-1) { - sprintf(tmp," (%lXh)",access); - strcat(str,tmp); } -if(errno) { - sprintf(tmp,"\r\n errno: %d",errno); - strcat(str,tmp); } -if(_doserrno && _doserrno!=errno) { - sprintf(tmp,"\r\n doserrno: %d",_doserrno); - strcat(str,tmp); } -errno=_doserrno=0; -errorlog(str); -} - -/*****************************************************************************/ -/* Error logging to NODE.LOG and DATA\ERROR.LOG function */ -/*****************************************************************************/ -void errorlog(char *text) -{ - static char inside; - char hdr[256],str[256],tmp2[256]; - int file; - -if(inside) /* let's not go recursive on this puppy */ - return; -inside=1; -getnodedat(node_num,&thisnode,1); -criterrs=++thisnode.errors; -putnodedat(node_num,thisnode); -now=time(NULL); -logline("!!",text); -sprintf(str,"%sERROR.LOG",data_dir); -if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - sprintf(tmp2,"ERROR opening/creating %s",str); - logline("!!",tmp2); - inside=0; - return; } -sprintf(hdr,"%s Node %2d: %s #%d" - ,timestr(&now),node_num,useron.alias,useron.number); -write(file,hdr,strlen(hdr)); -write(file,crlf,2); -write(file,text,strlen(text)); -write(file,"\r\n\r\n",4); -close(file); -inside=0; -} - diff --git a/src/sbbs2/text.h b/src/sbbs2/text.h deleted file mode 100644 index c1b29aa404..0000000000 --- a/src/sbbs2/text.h +++ /dev/null @@ -1,737 +0,0 @@ -/* TEXT.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/****************************************************************************/ -/* Macros for elements of the array of pointers (text[]) to static text */ -/* Should correlate with CTRL\TEXT.DAT */ -/****************************************************************************/ - -#ifndef _TEXT_H -#define _TEXT_H - -enum { - MsgSubj -,MsgAttr -,MsgTo -,MsgToExt -,MsgToNet -,MsgFrom -,MsgFromExt -,MsgFromNet -,MsgDate -,Email -,Post -,TooManyEmailsToday -,TooManyPostsToday -,CantAddToQueue -,R_Email -,R_Post -,R_Feedback -,Emailing -,Posting -,NewFile -,TitlePrompt -,EnterMsgNow -,EnterMsgNowRaw -,NoMoreLines -,OnlyNLinesLeft -,OutOfBytes -,InvalidLineNumber -,MsgCleared -,WithLineNumbers -,Aborted -,AnonymousQ -,Anonymous -,Saving -,SavedNBytes -,WritingIndx -,Emailed -,Posted -,EmailNodeMsg -,R_Forward -,ForwardedFrom -,Forwarded -,AutoMsgBy -,AutoMsg -,R_AutoMsg -,NoMailWaiting -,MailWaitingLstHdr -,MailWaitingLstFmt -,StartWithN -,ReadingMail -,CantReplyToAnonMsg -,Regarding -,RegardingBy -,RegardingByTo -,DeleteMailQ -,OK -,ForwardMailTo -,SaveMsgToFile -,FileToWriteTo -,NoMailSent -,MailSentLstHdr -,ReadingSentMail -,CantDelForwardedMail -,NoMailOnSystem -,ReadingAllMail -,MailOnSystemLstHdr -,MailOnSystemLstFmt -,NScanStatusFmt -,SearchSubFmt -,NoMsgsOnSub -,ZScanPostHdr -,ReadingSub -,YouDidntPostMsgN -,DeletePostQ -,DeletingPost -,DeletedPost -,SearchStringPrompt -,SubMsgLstHdr -,SubMsgLstFmt -,ChangeMsgPurgeQ -,NoTextSections -,TextSectionLstHdr -,TextSectionLstFmt -,WhichTextSection -,TextFilesLstHdr -,TextFilesLstFmt -,WhichTextFileSysop -,WhichTextFile -,AddTextFileBeforeWhich -,AddTextFilePath -,AddTextFileDesc -,RemoveWhichTextFile -,DeleteTextFileQ -,EditWhichTextFile -,NScanAllGrpsQ -,SScanAllGrpsQ -,AreYouSureQ -,R_Chat -,ReFeedback -,SiHdr -,SiSysName -,SiSysID -,SiSysFaddr -,SiSysPsite -,SiSysLocation -,SiSysop -,SiSysNodes -,SiNodeNumberName -,SiNodePhone -,SiTotalLogons -,SiLogonsToday -,SiTotalTime -,SiTimeToday -,ViewSysInfoFileQ -,ViewLogonMsgQ -,R_ReadSentMail -,MessageScan -,MessageScanComplete -,MessageScanAborted -,LogOffQ -,CantPostOnSub -,R_TransferSection -,NoOtherActiveNodes -,R_ExternalPrograms -,UserStats -,SubLstHdr -,SubLstFmt -,GrpLstHdr -,GrpLstFmt -,NScanCfgWhichGrp -,SScanCfgWhichGrp -,CfgSubLstHdr -,CfgSubLstFmt -,CfgGrpLstHdr -,CfgGrpLstFmt -,NScanCfgWhichSub -,SScanCfgWhichSub -,SubPtrLstFmt -,WhichOrAll -,RawMsgInputModeIsNow -,OFF -,ON -,LineStatus -,SystemStatsHdr -,NodeStatsHdr -,StatsTotalLogons -,StatsLogonsToday -,StatsTotalTime -,StatsTimeToday -,StatsUploadsToday -,StatsDownloadsToday -,StatsPostsToday -,StatsEmailsToday -,StatsFeedbacksToday -,ChUserPrompt -,ChUserPwPrompt -,NBytesFreeMemory -,ErrorLogHdr -,DeleteErrorLogQ -,NoErrorLogExists -,ClearErrCounter -,InvalidNode -,RerunThisNodeNowQ -,DeleteGuruLogQ -,NScanAllLibsQ -,R_Download -,SearchingAllDirs -,SearchingAllLibs -,NFilesListed -,EmptyDir -,NScanHdr -,R_RemoveFiles -,DirFull -,R_Upload -,CantUploadHere -,FileSpec -,UserTransferStats -,NoSysopDir -,CantUploadToSysop -,DirLstHdr -,DirLstFmt -,LibLstHdr -,LibLstFmt -,BatDownloadFlagIsNow -,TransferPolicyHdr -,TpCreditValue -,TpUpload -,TpDownload -,NoUserDir -,NoFilesForYou -,UserDirFull -,CantUploadToUser -,BoxHdrLib -,BoxHdrDir -,BoxHdrFiles -,ShortHdrLib -,ShortHdrDir -,BatchDlFlags -,BatchDlQueueIsFull -,FileSpecStarDotStar -,LowDiskSpace -,DiskNBytesFree -,Filename -,BadFilename -,UploadToSysopDirQ -,UploadToUserDirQ -,UploadToCurDirQ -,FileAlreadyThere -,FileOnDiskAddQ -,FileNotOnDisk -,TheseFileExtsOnly -,FileAlreadyOnline -,EnterAfterLastDestUser -,SendFileToUser -,DuplicateUser -,UserWontBeAbleToDl -,CantSendYourselfFiles -,UserAddedToDestList -,RateThisFile -,Rated -,MultipleDiskQ -,HowManyDisksTotal -,NumberOfFile -,FileOneOfTen -,FileOneOfTwo -,EnterDescNow -,NoDescription -,ProtocolOrQuit -,ProtocolBatchOrQuit -,BatchUlQueueIsFull -,FileAddedToUlQueue -,UserToUserXferNodeMsg -,FileInfoPrompt -,QuitOrNext -,RExemptRemoveFilePrompt -,MoveToLibLstFmt -,MoveToLibPrompt -,MoveToDirLstFmt -,MoveToDirPrompt -,MovedFile -,CloseFileRecordQ -,SysopRemoveFilePrompt -,UserRemoveFilePrompt -,FileNotThere -,CouldntRemoveFile -,DeleteFileQ -,AddToOfflineDirQ -,RemoveCreditsQ -,UserNotFound -,CreditsToRemove -,FileRemovedUserMsg -,EditFilename -,CouldntRenameFile -,FileRenamed -,EditDescription -,DeleteExtDescriptionQ -,EditUploader -,EditCreditValue -,EditTimesDownloaded -,EditOpenCount -,EditAltPath -,YouOnlyHaveNCredits -,NotEnoughCredits -,NotEnoughTimeToDl -,ProtocolBatchQuitOrNext -,BulkUpload -,BulkUploadDescPrompt -,NoFilesInBatchQueue -,BatchMenuPrompt -,ClearUploadQueueQ -,UploadQueueCleared -,ClearDownloadQueueQ -,DownloadQueueCleared -,DownloadQueueIsEmpty -,UploadQueueLstHdr -,UploadQueueLstFmt -,DownloadQueueLstHdr -,DownloadQueueLstFmt -,DownloadQueueTotals -,RemoveWhichFromUlQueue -,RemoveWhichFromDlQueue -,UploadQueueIsEmpty -,HangUpAfterXferQ -,StartXferNow -,Disconnecting -,Disconnected -,FileNotSent -,RemovingTempFiles -,ExtractFrom -,UnextractableFile -,FileNotFound -,ExtractFilesPrompt -,TempDirPrompt -,TempFileNotCreatedYet -,TempFileInfo -,TempDirTotal -,NFilesRemoved -,ResortWarning -,ResortLineFmt -,ResortEmptyDir -,Sorting -,Sorted -,Compressed -,FileAlreadyInQueue -,FileIsNotOnline -,FileAddedToBatDlQueue -,NonviewableFile -,FileNotReceived -,FileHadErrors -,FileZeroLength -,FileNBytesReceived -,FileNBytesSent -,DownloadUserMsg -,Partially -,FiLib -,FiDir -,FiFilename -,FiFileSize -,FiCredits -,FiDescription -,FiUploadedBy -,FiFileDate -,FiDateUled -,FiDateDled -,FiTimesDled -,FiTransferTime -,FiAlternatePath -,InvalidAlternatePathN -,FileIsOpen -,HappyBirthday -,TimeToChangePw -,NewPasswordQ -,NewPassword -,VerifyPassword -,Wrong -,PasswordChanged -,NoMoreLogons -,R_Logons -,EnterYourAlias -,EnterYourRealName -,EnterYourCompany -,EnterYourHandle -,EnterYourSex -,EnterYourAddress -,EnterYourPhoneNumber -,EnterYourBirthday -,EnterYourCityState -,EnterYourZipCode -,EnterYourComputer -,CallingFromNorthAmericaQ -,UserInfoCorrectQ -,LiUserNumberName -,LiLogonsToday -,LiTimeonToday -,LiMailWaiting -,LiSysopIs -,LiSysopAvailable -,LiSysopNotAvailable -,UserOnTwoNodes -,CriticalErrors -,UserXferForYou -,UnreceivedUserXfer -,ReadYourMailNowQ -,NoNewUsers -,NewUserPasswordPrompt -,AutoTerminalQ -,AnsiTerminalQ -,ColorTerminalQ -,RipTerminalQ -,ExAsciiTerminalQ -,YouCantUseThatName -,YourPasswordIs -,NewUserPasswordVerify -,IncorrectPassword -,MagicWordPrompt -,FailedMagicWord -,SystemFull -,NewUserFeedbackHdr -,NoFeedbackWarning -,NoXtrnPrograms -,XtrnProgLstHdr -,XtrnProgLstTitles -,XtrnProgLstUnderline -,XtrnProgLstFmt -,WhichXtrnProg -,UserRunningXtrn -,RemoveNodeLockQ -,MinimumModemSpeed -,NoNodeAccess -,NodeLocked -,UnknownUser -,InvalidLogon -,SlogFmt -,Locally -,SortAlphaQ -,CheckingSlots -,UserListFmt -,NTotalUsers -,NUsersOnCurSub -,NUsersOnCurDir -,NScanDate -,NScanYear -,NScanMonth -,NScanDay -,NScanHour -,NScanMinute -,NScanPmQ -,NScanAmQ -,PasswordTooShort -,PasswordNotChanged -,PasswordInvalid -,PasswordObvious -,ComputerTypeMenu -,ComputerTypePrompt -,ComputerTypeB -,ComputerTypeC -,ComputerTypeD -,ComputerTypeE -,NoUserData -,Deleted -,Inactive -,UeditAliasPassword -,UeditRealNamePhone -,UeditAddressBirthday -,UeditLocationZipcode -,UeditNoteHandle -,UeditComputerModem -,UeditCommentLine -,UserDates -,UserTimes -,UserLogons -,UserEmails -,UserNetMail -,UserUploads -,UserDownloads -,UserLeech -,UserCredits -,UserMinutes -,UeditSecLevel -,UeditFlags -,UeditExempts -,UeditPrompt -,UeditRestoreQ -,UeditActivateQ -,UeditDeleteQ -,UeditReadUserMailWQ -,UeditReadUserMailSQ -,UeditDeactivateUserQ -,ChangeExemptionQ -,FlagEditing -,GoToUser -,UeditLastOn -,UeditFirstOn -,UeditExpire -,UeditPwModDate -,UeditML -,UeditNote -,UeditComment -,UeditUlBytes -,UeditUploads -,UeditDlBytes -,UeditDownloads -,UeditLeech -,QuickValidateFmt -,QuickValidatePrompt -,UeditPassword -,UeditCredits -,UeditMinutes -,UeditCopyUserQ -,UeditCopyUserToSlot -,ChangeRestrictsQ -,ModifyCredits -,ModifyMinutes -,DeleteQuestionaireQ -,UserDefaultsHdr -,UserDefaultsTerminal -,UserDefaultsXeditor -,UserDefaultsRows -,UserDefaultsMenuMode -,UserDefaultsPause -,UserDefaultsHotKey -,UserDefaultsCursor -,UserDefaultsCLS -,UserDefaultsAskNScan -,UserDefaultsAskSScan -,UserDefaultsANFS -,UserDefaultsRemember -,UserDefaultsBatFlag -,UserDefaultsNetMail -,UserDefaultsCommandSet -,UserDefaultsQuiet -,UserDefaultsPassword -,UserDefaultsArcType -,UserDefaultsProtocol -,UserDefaultsWhich -,On -,Off -,HowManyRows -,CurrentPassword -,ForwardMailQ -,EnterNetMailAddress -,SelectItemHdr -,SelectItemFmt -,SelectItemWhich -,SysopIsHere -,EndOfChat -,ChatPrompt -,AnonUserChatHandle -,WelcomeToMultiChat -,WelcomeToChannelN -,NodeInMultiChatLocally -,YoureOnTheAir -,NodeJoinedMultiChat -,NodeLeftMultiChat -,MultiChatCommandPrompt -,PasswordProtected -,CorrectPassword -,WrongPassword -,PasswordProtectChanQ -,PasswordPrompt -,ChatLineFmt -,SysopPageIsNow -,SysopIsNotAvailable -,ChatWithGuruInsteadQ -,PrivateMsgPrompt -,NodeToPrivateChat -,NodeNAlreadyInPChat -,NodeNIsNotInUse -,NoNeedToPageSelf -,CantPageNode -,NodePageMsg -,AllNodePageMsg -,NodePChatPageMsg -,R_SendMessages -,NodeToSendMsgTo -,NoNeedToSendMsgToSelf -,NodeMsgPrompt -,NodeMsgFmt -,AllNodeMsgFmt -,PagingGuru -,WaitingForNodeInPChat -,NodeJoinedPrivateChat -,NodeLeftPrivateChat -,NoOneHasLoggedOnToday -,LastFewCallers -,LastFewCallersFmt -,CallersToday -,DoYouMeanThisUserQ -,UNKNOWN_USER -,TimesUp -,NodeLoggedOff -,NodeLoggedOnAtNbps -,TiLogon -,TiNow -,TiTimeon -,TiTimeLeft -,ControlKeyMenu -,TakenTooLongToLogon -,CallBackWhenYoureThere -,YesNoQuestion -,Yes -,No -,NoYesQuestion -,Pause -,Wait -,SysStatsLogHdr -,NodeStatsLogHdr -,ReducedTime -,EventInfo -,UploadBeforeEvent -,QWKPrompt -,QWKCtrlACodes -,QWKPackingSubboard -,QWKPackedSubboard -,QWKPackingEmail -,QWKPackedEmail -,QWKUnpacking -,QWKUnpacked -,QWKNoNewMessages -,QWKCompressionFailed -,QWKExtractionFailed -,QWKReplyNotReceived -,QWKInvalidConferenceN -,CreatingFileList -,CreatedFileList -,NoFiles -,MsgPtrsInitialized -,ConversionRate -,CreditsToMin -,YouHaveTooManyMinutes -,BillingNodeMsg -,Convert100ktoNminQ -,CreditedAccount -,ANSICaptureIsNow -,RetrievingFile -,AltULPathIsNow -,PrivatePostQ -,PostTo -,NoToUser -,UsingRealName -,PostingPrivately -,PostingAnonymously -,CantDeletePosts -,SubInfoHdr -,SubInfoLongName -,SubInfoShortName -,SubInfoQWKName -,SubInfoMaxMsgs -,SubInfoTagLine -,SubInfoFidoNet -,SubInfoViewFileQ -,DirInfoHdr -,DirInfoLongName -,DirInfoShortName -,DirInfoAllowedExts -,DirInfoMaxFiles -,DirInfoViewFileQ -,NoNetMailAllowed -,NetMailCostContinueQ -,NetMailing -,RemoveFromNewScanQ -,SubGroupOrAll -,DirLibOrAll -,EnterPath -,SearchExtendedQ -,DisplayTitlesOnlyQ -,EchoIsNow -,WelcomeToPrivateChat -,UploadingREP -,ReceivedFileViaQWK -,QWKmsgLimitReached -,PrivatePostsNotAllowed -,LoadingMsgPtrs -,LoadedMsgPtrs -,QuoteMessageQ -,QuoteLinesPrompt -,ChatChanLstHdr -,ChatChanLstTitles -,ChatChanLstUnderline -,ChatChanLstFmt -,CantAccessThatChannel -,CantDownloadFromDir -,SearchingForDupes -,SearchedForDupes -,AccountWillExpireInNDays -,AccountHasExpired -,DownloadBatchQ -,WaitingForDeviceN -,UserSentYouMail -,UserSentYouFile -,UserReadYourMail -,UserReadYourMailNodeMsg -,JoinWhichGrp -,JoinWhichSub -,JoinWhichLib -,JoinWhichDir -,CfgDirLstHdr -,CfgDirLstFmt -,CfgLibLstHdr -,CfgLibLstFmt -,BatchFlagPrompt -,FileListBatchCommands -,DownloadAttachedFileQ -,FreeMinLeft -,FreeMinToDeposit -,EmailFilesNotAllowed -,CantRunThatProgram -,OnlyXminutesLeft -,AreYouThere -,NoAccessLevel -,NoAccessAge -,NoAccessBPS -,NoAccessCredit -,NoAccessNode -,NoAccessUser -,NoAccessExpire -,NoAccessTimeLeft -,NoAccessTimeUsed -,NoAccessTime -,NoAccessPCR -,NoAccessUDR -,NoAccessUDFR -,NoAccessFlag1 -,NoAccessFlag2 -,NoAccessFlag3 -,NoAccessFlag4 -,NoAccessSex -,NoAccessExempt -,NoAccessRest -,NoAccessDay -,NoAccessGroup -,NoAccessSub -,NoAccessLib -,NoAccessDir -,NodeLstHdr -,NodeActionMain -,NodeActionReadMsgs -,NodeActionReadMail -,NodeActionSendMail -,NodeActionReadTxt -,NodeActionReadSentMail -,NodeActionPostMsg -,NodeActionAutoMsg -,NodeActionXtrn -,NodeActionDefaults -,NodeActionXfer -,NodeActionDLing -,NodeActionULing -,NodeActionBiXfer -,NodeActionListFiles -,NodeActionLoggingOn -,NodeActionLocalChat -,NodeActionMultiChat -,NodeActionGuruChat -,NodeActionChatSec -,NodeActionSysopAct -,NodeActionQWK -,NodeActionPrivateChat -,NodeActionPaging -,NodeActionRetrieving -,YN - -,TOTAL_TEXT }; - -#endif diff --git a/src/sbbs2/text_sec.c b/src/sbbs2/text_sec.c deleted file mode 100644 index a63c268944..0000000000 --- a/src/sbbs2/text_sec.c +++ /dev/null @@ -1,200 +0,0 @@ -#line 1 "TEXT_SEC.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -#define MAX_TXTSECS 500 /* Maximum number of text file sections */ -#define MAX_TXTFILES 500 /* Maximum number of text files per section */ - -/****************************************************************************/ -/* General Text File Section. */ -/* Called from function main_sec */ -/* Returns 1 if no text sections available, 0 otherwise. */ -/****************************************************************************/ -char text_sec() -{ - char str[256],usrsec[MAX_TXTSECS],usrsecs,cursec,usemenu - ,*file[MAX_TXTFILES],addpath[83],addstr[83],*buf,ch; - long i,j; - long l,length; - FILE *stream; - -// ch=getage(useron.birth); Removed 05/19/96 -for(i=j=0;i<total_txtsecs;i++) { - if(!chk_ar(txtsec[i]->ar,useron)) - continue; - usrsec[j++]=i; } -usrsecs=j; -if(!usrsecs) { - bputs(text[NoTextSections]); - return(1); } -action=NODE_RTXT; -while(online) { - sprintf(str,"%sMENU\\TEXT_SEC.*",text_dir); - if(fexist(str)) - menu("TEXT_SEC"); - else { - bputs(text[TextSectionLstHdr]); - for(i=0;i<usrsecs && !msgabort();i++) { - sprintf(str,text[TextSectionLstFmt],i+1,txtsec[usrsec[i]]->name); - if(i<9) outchar(SP); - bputs(str); } } - ASYNC; - mnemonics(text[WhichTextSection]); - if((cursec=getnum(usrsecs))<1) - break; - cursec--; - while(online) { - sprintf(str,"%sMENU\\TEXT%u.*",text_dir,cursec+1); - if(fexist(str)) { - sprintf(str,"TEXT%u",cursec+1); - menu(str); - usemenu=1; } - else { - bprintf(text[TextFilesLstHdr],txtsec[usrsec[cursec]]->name); - usemenu=0; } - sprintf(str,"%sTEXT\\%s.IXT",data_dir,txtsec[usrsec[cursec]]->code); - j=0; - if(fexist(str)) { - if((stream=fnopen((int *)&i,str,O_RDONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return(0); } - while(!ferror(stream) && !msgabort()) { /* file open too long */ - if(!fgets(str,81,stream)) - break; - str[strlen(str)-2]=0; /* chop off CRLF */ - if((file[j]=MALLOC(strlen(str)+1))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,strlen(str)+1); - continue; } - strcpy(file[j],str); - fgets(str,81,stream); - if(!usemenu) bprintf(text[TextFilesLstFmt],j+1,str); - j++; } - fclose(stream); } - ASYNC; - if(SYSOP) { - strcpy(str,"QARE?"); - mnemonics(text[WhichTextFileSysop]); } - else { - strcpy(str,"Q?"); - mnemonics(text[WhichTextFile]); } - i=getkeys(str,j); - if(!(i&0x80000000L)) { /* no file number */ - for(l=0;l<j;l++) - FREE(file[l]); - if((i=='E' || i=='R') && !j) - continue; } - if(i=='Q' || !i) - break; - if(i==-1) { /* ctrl-c */ - for(i=0;i<j;i++) - FREE(file[i]); - return(0); } - if(i=='?') /* ? means re-list */ - continue; - if(i=='A') { /* Add text file */ - if(j) { - bputs(text[AddTextFileBeforeWhich]); - i=getnum(j+1); - if(i<1) - continue; - i--; /* number of file entries to skip */ } - else - i=0; - bprintf(text[AddTextFilePath] - ,data_dir,txtsec[usrsec[cursec]]->code); - if(!getstr(addpath,80,K_UPPER)) - continue; - strcat(addpath,crlf); - bputs(text[AddTextFileDesc]); - if(!getstr(addstr,74,0)) - continue; - strcat(addstr,crlf); - sprintf(str,"%sTEXT\\%s.IXT" - ,data_dir,txtsec[usrsec[cursec]]->code); - if(i==j) { /* just add to end */ - if((i=nopen(str,O_WRONLY|O_APPEND|O_CREAT))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_APPEND|O_CREAT); - return(0); } - write(i,addpath,strlen(addpath)); - write(i,addstr,strlen(addstr)); - close(i); - continue; } - j=i; /* inserting in middle of file */ - if((stream=fnopen((int *)&i,str,O_RDWR))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_RDWR); - return(0); } - length=filelength(i); - for(i=0;i<j;i++) { /* skip two lines for each entry */ - fgets(tmp,81,stream); - fgets(tmp,81,stream); } - l=ftell(stream); - if((buf=(char *)MALLOC(length-l))==NULL) { - fclose(stream); - errormsg(WHERE,ERR_ALLOC,str,length-l); - return(0); } - fread(buf,1,length-l,stream); - fseek(stream,l,SEEK_SET); /* go back to where we need to insert */ - fputs(addpath,stream); - fputs(addstr,stream); - fwrite(buf,1,length-l,stream); - fclose(stream); - FREE(buf); - continue; } - if(i=='R' || i=='E') { /* Remove or Edit text file */ - ch=i; - if(ch=='R') - bputs(text[RemoveWhichTextFile]); - else - bputs(text[EditWhichTextFile]); - i=getnum(j); - if(i<1) - continue; - sprintf(str,"%sTEXT\\%s.IXT" - ,data_dir,txtsec[usrsec[cursec]]->code); - j=i-1; - if((stream=fnopen((int *)&i,str,O_RDONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return(0); } - // length=filelength(i); Removed 05/19/96 - for(i=0;i<j;i++) { /* skip two lines for each entry */ - fgets(tmp,81,stream); - fgets(tmp,81,stream); } - fgets(addpath,81,stream); - truncsp(addpath); - fclose(stream); - if(!strchr(addpath,'\\')) - sprintf(tmp,"%sTEXT\\%s\\%s" - ,data_dir,txtsec[usrsec[cursec]]->code,addpath); - else - strcpy(tmp,addpath); - if(ch=='R') { /* Remove */ - if(fexist(tmp)) { - sprintf(str,text[DeleteTextFileQ],tmp); - if(!noyes(str)) - if(remove(tmp)) errormsg(WHERE,ERR_REMOVE,tmp,0); } - sprintf(str,"%sTEXT\\%s.IXT" - ,data_dir,txtsec[usrsec[cursec]]->code); - removeline(str,addpath,2,0); } - else { /* Edit */ - strcpy(str,tmp); - editfile(str); } - continue; } - i=(i&~0x80000000L)-1; - if(!strchr(file[i],'\\')) - sprintf(str,"%sTEXT\\%s\\%s" - ,data_dir,txtsec[usrsec[cursec]]->code,file[i]); - else - strcpy(str,file[i]); - attr(LIGHTGRAY); - printfile(str,0); - sprintf(str,"Read Text File: %s",file[i]); - logline("T-",str); - pause(); - sys_status&=~SS_ABORT; - for(i=0;i<j;i++) - FREE(file[i]); } } -return(0); -} - diff --git a/src/sbbs2/un_qwk.c b/src/sbbs2/un_qwk.c deleted file mode 100644 index d8cfe2b6c7..0000000000 --- a/src/sbbs2/un_qwk.c +++ /dev/null @@ -1,200 +0,0 @@ -#line 1 "UN_QWK.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "qwk.h" - -/****************************************************************************/ -/* Unpacks .QWK packet, hubnum is the number of the QWK net hub */ -/****************************************************************************/ -void unpack_qwk(char *packet,uint hubnum) -{ - uchar str[256],fname[128],block[128],ch; - int k,file; - uint i,j,n,msgs,lastsub=INVALID_SUB; - long l,size,misc; - time_t t; - struct ffblk ff; - FILE *qwk; - -useron.number=1; -getuserdat(&useron); -console=CON_L_ECHO; -i=external(cmdstr(qhub[hubnum]->unpack,packet,"*.*",NULL),EX_OUTL); -if(i) { - errormsg(WHERE,ERR_EXEC,cmdstr(qhub[hubnum]->unpack,packet,"*.*",NULL),i); - return; } -sprintf(str,"%sMESSAGES.DAT",temp_dir); -if(!fexist(str)) { - sprintf(str,"%s.QWK doesn't contain MESSAGES.DAT",qhub[hubnum]->id); - errorlog(str); - return; } -if((qwk=fnopen(&file,str,O_RDONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -size=filelength(file); -/********************/ -/* Process messages */ -/********************/ -bputs(text[QWKUnpacking]); - -for(l=128;l<size;l+=i*128) { - fseek(qwk,l,SEEK_SET); - fread(block,128,1,qwk); - sprintf(tmp,"%.6s",block+116); - i=atoi(tmp); /* i = number of 128 byte records */ - if(i<2) { - i=1; - continue; } - /*********************************/ - /* public message on a sub-board */ - /*********************************/ - n=(uint)block[123]|(((uint)block[124])<<8); /* conference number */ - - if(!n) { /* NETMAIL */ - sprintf(str,"%25.25s",block+21); - truncsp(str); - if(!stricmp(str,"NETMAIL")) { /* QWK to FidoNet NetMail */ - qwktonetmail(qwk,block,NULL,hubnum+1); - continue; } - if(strchr(str,'@')) { - qwktonetmail(qwk,block,str,hubnum+1); - continue; } - j=atoi(str); - if(j && j>lastuser()) - j=0; - if(!j && !stricmp(str,"SYSOP")) - j=1; - if(!j) - j=matchuser(str); - if(!j && !stricmp(str,sys_id)) - j=1; - if(!j) { - bputs(text[UnknownUser]); - continue; } - - getuserrec(j,U_MISC,8,str); - misc=ahtoul(str); - if(misc&NETMAIL && sys_misc&SM_FWDTONET) { - getuserrec(j,U_NETMAIL,LEN_NETMAIL,str); - qwktonetmail(qwk,block,str,hubnum+1); - continue; } - - smb_stack(&smb,SMB_STACK_PUSH); - sprintf(smb.file,"%sMAIL",data_dir); - smb.retry_time=smb_retry_time; - if((k=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,k); - smb_stack(&smb,SMB_STACK_POP); - continue; } - if(!filelength(fileno(smb.shd_fp))) { - smb.status.max_crcs=mail_maxcrcs; - smb.status.max_msgs=MAX_SYSMAIL; - smb.status.max_age=mail_maxage; - smb.status.attr=SMB_EMAIL; - if((k=smb_create(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_CREATE,smb.file,k); - smb_stack(&smb,SMB_STACK_POP); - continue; } } - if((k=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,k); - smb_stack(&smb,SMB_STACK_POP); - continue; } - if((k=smb_getstatus(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,k); - smb_stack(&smb,SMB_STACK_POP); - continue; } - smb_unlocksmbhdr(&smb); - qwktomsg(qwk,block,hubnum+1,INVALID_SUB,j); - smb_close(&smb); - smb_stack(&smb,SMB_STACK_POP); - sprintf(tmp,"%-25.25s",block+46); - truncsp(tmp); - sprintf(str,text[UserSentYouMail],tmp); - putsmsg(j,str); - continue; - } - - for(j=0;j<qhub[hubnum]->subs;j++) - if(qhub[hubnum]->conf[j]==n) - break; - if(j>=qhub[hubnum]->subs) /* ignore messages for subs not in config */ - continue; - - j=qhub[hubnum]->sub[j]; - - if(j!=lastsub) { - if(lastsub!=INVALID_SUB) - smb_close(&smb); - lastsub=INVALID_SUB; - sprintf(smb.file,"%s%s",sub[j]->data_dir,sub[j]->code); - smb.retry_time=smb_retry_time; - if((k=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,k); - continue; } - if(!filelength(fileno(smb.shd_fp))) { - smb.status.max_crcs=sub[j]->maxcrcs; - smb.status.max_msgs=sub[j]->maxmsgs; - smb.status.max_age=sub[j]->maxage; - smb.status.attr=sub[j]->misc&SUB_HYPER ? SMB_HYPERALLOC :0; - if((k=smb_create(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_CREATE,smb.file,k); - continue; } } - if((k=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,k); - continue; } - if((k=smb_getstatus(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,k); - continue; } - smb_unlocksmbhdr(&smb); - lastsub=j; } - - if(!qwktomsg(qwk,block,hubnum+1,j,0)) - continue; - - if(sub[j]->misc&SUB_FIDO && sub[j]->echomail_sem[0]) /* update semaphore */ - if((file=nopen(sub[j]->echomail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(file); - bprintf(text[Posted],grp[sub[j]->grp]->sname,sub[j]->lname); } - -update_qwkroute(NULL); /* Write ROUTE.DAT */ - -fclose(qwk); -if(lastsub!=INVALID_SUB) - smb_close(&smb); - -delfiles(temp_dir,"*.NDX"); -sprintf(str,"%sMESSAGES.DAT",temp_dir); -remove(str); -sprintf(str,"%sDOOR.ID",temp_dir); -remove(str); -sprintf(str,"%sCONTROL.DAT",temp_dir); -remove(str); -sprintf(str,"%sNETFLAGS.DAT",temp_dir); -remove(str); - -sprintf(str,"%s*.*",temp_dir); -i=findfirst(str,&ff,0); -if(!i) { - sprintf(str,"%sQNET\\%s.IN",data_dir,qhub[hubnum]->id); - mkdir(str); } -while(!i) { - sprintf(str,"%s%s",temp_dir,ff.ff_name); - sprintf(fname,"%sQNET\\%s.IN\\%s",data_dir,qhub[hubnum]->id,ff.ff_name); - mv(str,fname,1); - sprintf(str,text[ReceivedFileViaQWK],ff.ff_name,qhub[hubnum]->id); - putsmsg(1,str); - i=findnext(&ff); } - -bputs(text[QWKUnpacked]); -CRLF; -remove(packet); - -} diff --git a/src/sbbs2/un_rep.c b/src/sbbs2/un_rep.c deleted file mode 100644 index c26bc8ca34..0000000000 --- a/src/sbbs2/un_rep.c +++ /dev/null @@ -1,382 +0,0 @@ -#line 1 "UN_REP.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "qwk.h" - -/****************************************************************************/ -/* Unpacks .REP packet, 'repname' is the path and filename of the packet */ -/****************************************************************************/ -void unpack_rep() -{ - uchar ch,str[256],fname[128],block[128] - ,*AttemptedToUploadREPpacket="Attempted to upload REP packet"; - int file; - uint h,i,j,k,msgs,lastsub=INVALID_SUB; - ulong n; - long l,size,misc,crc; - node_t node; - time_t t; - file_t f; - struct ffblk ff; - FILE *rep; - -sprintf(str,"%s%s.REP",temp_dir,sys_id); -if(!fexist(str)) { - bputs(text[QWKReplyNotReceived]); - logline("U!",AttemptedToUploadREPpacket); - logline(nulstr,"REP file not received"); - return; } -for(k=0;k<total_fextrs;k++) - if(!stricmp(fextr[k]->ext,useron.tmpext) && chk_ar(fextr[k]->ar,useron)) - break; -if(k>=total_fextrs) - k=0; -i=external(cmdstr(fextr[k]->cmd,str,"*.*",NULL),EX_OUTL|EX_OUTR); -if(i) { - bputs(text[QWKExtractionFailed]); - logline("U!",AttemptedToUploadREPpacket); - logline(nulstr,"Extraction failed"); - return; } -sprintf(str,"%s%s.MSG",temp_dir,sys_id); -if(!fexist(str)) { - bputs(text[QWKReplyNotReceived]); - logline("U!",AttemptedToUploadREPpacket); - logline(nulstr,"MSG file not received"); - return; } -if((rep=fnopen(&file,str,O_RDONLY))==NULL) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return; } -size=filelength(file); -fread(block,128,1,rep); -if(strncmpi(block,sys_id,strlen(sys_id))) { - fclose(rep); - bputs(text[QWKReplyNotReceived]); - logline("U!",AttemptedToUploadREPpacket); - logline(nulstr,"Incorrect BBSID"); - return; } -logline("U+","Uploaded REP packet"); -/********************/ -/* Process messages */ -/********************/ -bputs(text[QWKUnpacking]); - -for(l=128;l<size;l+=i*128) { - lncntr=0; /* defeat pause */ - fseek(rep,l,SEEK_SET); - fread(block,128,1,rep); - sprintf(tmp,"%.6s",block+116); - i=atoi(tmp); /* i = number of 128 byte records */ - if(i<2) { - sprintf(tmp,"%s blocks",str); - errormsg(WHERE,ERR_CHK,tmp,i); - i=1; - continue; } - if(atoi(block+1)==0) { /**********/ - if(useron.rest&FLAG('E')) { /* E-mail */ - bputs(text[R_Email]); /**********/ - continue; } - - sprintf(str,"%25.25s",block+21); - truncsp(str); - if(!stricmp(str,"NETMAIL")) { /* QWK to FidoNet NetMail */ - qwktonetmail(rep,block,NULL,0); - continue; } - if(strchr(str,'@')) { - qwktonetmail(rep,block,str,0); - continue; } - if(!stricmp(str,"SBBS")) { /* to SBBS, config stuff */ - qwkcfgline(block+71,INVALID_SUB); - continue; } - - if(useron.etoday>=level_emailperday[useron.level] - && !(useron.rest&FLAG('Q'))) { - bputs(text[TooManyEmailsToday]); - continue; } - j=atoi(str); - if(j && j>lastuser()) - j=0; - if(!j && - (!stricmp(str,"SYSOP") - || !stricmp(str,sys_id) - || !stricmp(str,sys_op))) - j=1; - if(!j) - j=matchuser(str); - if(!j) { - bputs(text[UnknownUser]); - continue; } - if(j==1 && useron.rest&FLAG('S')) { - bprintf(text[R_Feedback],sys_op); - continue; } - - getuserrec(j,U_MISC,8,str); - misc=ahtoul(str); - if(misc&NETMAIL && sys_misc&SM_FWDTONET) { - getuserrec(j,U_NETMAIL,LEN_NETMAIL,str); - qwktonetmail(rep,block,str,0); - continue; } - - sprintf(smb.file,"%sMAIL",data_dir); - smb.retry_time=smb_retry_time; - - if(lastsub!=INVALID_SUB) { - smb_close(&smb); - lastsub=INVALID_SUB; } - - if((k=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,k); - continue; } - - if(!filelength(fileno(smb.shd_fp))) { - smb.status.max_crcs=mail_maxcrcs; - smb.status.max_msgs=MAX_SYSMAIL; - smb.status.max_age=mail_maxage; - smb.status.attr=SMB_EMAIL; - if((k=smb_create(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_CREATE,smb.file,k); - continue; } } - - if((k=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,k); - continue; } - - if((k=smb_getstatus(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,k); - continue; } - - smb_unlocksmbhdr(&smb); - - if(!qwktomsg(rep,block,0,INVALID_SUB,j)) { - smb_close(&smb); - continue; } - smb_close(&smb); - - if(j==1) { - useron.fbacks++; - logon_fbacks++; - putuserrec(useron.number,U_FBACKS,5 - ,itoa(useron.fbacks,tmp,10)); } - else { - useron.emails++; - logon_emails++; - putuserrec(useron.number,U_EMAILS,5 - ,itoa(useron.emails,tmp,10)); } - useron.etoday++; - putuserrec(useron.number,U_ETODAY,5 - ,itoa(useron.etoday,tmp,10)); - bprintf(text[Emailed],username(j,tmp),j); - sprintf(str,"E-mailed %s #%d",username(j,tmp),j); - logline("E+",str); - if(useron.rest&FLAG('Q')) { - sprintf(tmp,"%-25.25s",block+46); - truncsp(tmp); } - else - strcpy(tmp,useron.alias); - for(k=1;k<=sys_nodes;k++) { /* Tell user, if online */ - getnodedat(k,&node,0); - if(node.useron==j && !(node.misc&NODE_POFF) - && (node.status==NODE_INUSE - || node.status==NODE_QUIET)) { - sprintf(str,text[EmailNodeMsg] - ,node_num,tmp); - putnmsg(k,str); - break; } } - if(k>sys_nodes) { - sprintf(str,text[UserSentYouMail],tmp); - putsmsg(j,str); } } /* end of email */ - - /**************************/ - else { /* message on a sub-board */ - /**************************/ - n=atol((char *)block+1); /* conference number */ - for(j=0;j<usrgrps;j++) { - for(k=0;k<usrsubs[j];k++) - if(sub[usrsub[j][k]]->qwkconf==n) - break; - if(k<usrsubs[j]) - break; } - - if(j>=usrgrps) { - if(n<1000) { /* version 1 method, start at 101 */ - j=n/100; - k=n-(j*100); } - else { /* version 2 method, start at 1001 */ - j=n/1000; - k=n-(j*1000); } - j--; /* j is group */ - k--; /* k is sub */ - if(j>=usrgrps || k>=usrsubs[j]) { - bprintf(text[QWKInvalidConferenceN],n); - sprintf(str,"Invalid conference number %d",n); - logline("P!",str); - continue; } } - - n=usrsub[j][k]; - - /* if posting, add to new-scan config for QWKnet nodes automatically */ - if(useron.rest&FLAG('Q')) - sub[n]->misc|=SUB_NSCAN; - - sprintf(str,"%-25.25s","SBBS"); - if(!strnicmp((char *)block+21,str,25)) { /* to SBBS, config stuff */ - qwkcfgline((char *)block+71,n); - continue; } - - if(!SYSOP && sub[n]->misc&SUB_QNET) { /* QWK Netted */ - sprintf(str,"%-25.25s","DROP"); /* Drop from new-scan? */ - if(!strnicmp((char *)block+71,str,25)) /* don't allow post */ - continue; - sprintf(str,"%-25.25s","ADD"); /* Add to new-scan? */ - if(!strnicmp((char *)block+71,str,25)) /* don't allow post */ - continue; } - - if(useron.rest&FLAG('Q') && !(sub[n]->misc&SUB_QNET)) { - bputs(text[CantPostOnSub]); - logline("P!","Attempted to post on non-QWKnet sub"); - continue; } - - if(useron.rest&FLAG('P')) { - bputs(text[R_Post]); - logline("P!","Post attempted"); - continue; } - - if(useron.ptoday>=level_postsperday[useron.level] - && !(useron.rest&FLAG('Q'))) { - bputs(text[TooManyPostsToday]); - continue; } - - if(useron.rest&FLAG('N') - && sub[n]->misc&(SUB_FIDO|SUB_PNET|SUB_QNET|SUB_INET)) { - bputs(text[CantPostOnSub]); - logline("P!","Networked post attempted"); - continue; } - - if(!chk_ar(sub[n]->post_ar,useron)) { - bputs(text[CantPostOnSub]); - logline("P!","Post attempted"); - continue; } - - if((block[0]=='*' || block[0]=='+') - && !(sub[n]->misc&SUB_PRIV)) { - bputs(text[PrivatePostsNotAllowed]); - logline("P!","Private post attempt"); - continue; } - - if(block[0]=='*' || block[0]=='+' /* Private post */ - || sub[n]->misc&SUB_PONLY) { - sprintf(str,"%-25.25s",nulstr); - sprintf(tmp,"%-25.25s","ALL"); - if(!strnicmp((char *)block+21,str,25) - || !strnicmp((char *)block+21,tmp,25)) { /* to blank */ - bputs(text[NoToUser]); /* or all */ - continue; } } - - if(!SYSOP && !(useron.rest&FLAG('Q'))) { - sprintf(str,"%-25.25s","SYSOP"); - if(!strnicmp((char *)block+21,str,25)) { - sprintf(str,"%-25.25s",username(1,tmp)); - memcpy((char *)block+21,str,25); } } /* change from sysop */ - /* to user #1 */ - -#if 0 /* TWIT FILTER */ - sprintf(str,"%25.25s",block+46); /* From user */ - truncsp(str); - - if(!stricmp(str,"Lee Matherne") - || !stricmp(str,"Big Joe") - ) { - bprintf(text[Posted],grp[sub[n]->grp]->sname - ,sub[n]->lname); - continue; } -#endif - - if(n!=lastsub) { - if(lastsub!=INVALID_SUB) - smb_close(&smb); - lastsub=INVALID_SUB; - sprintf(smb.file,"%s%s",sub[n]->data_dir,sub[n]->code); - smb.retry_time=smb_retry_time; - if((j=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,j); - continue; } - - if(!filelength(fileno(smb.shd_fp))) { - smb.status.max_crcs=sub[n]->maxcrcs; - smb.status.max_msgs=sub[n]->maxmsgs; - smb.status.max_age=sub[n]->maxage; - smb.status.attr=sub[n]->misc&SUB_HYPER ? SMB_HYPERALLOC:0; - if((j=smb_create(&smb))!=0) { - smb_close(&smb); - lastsub=INVALID_SUB; - errormsg(WHERE,ERR_CREATE,smb.file,j); - continue; } } - - if((j=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - lastsub=INVALID_SUB; - errormsg(WHERE,ERR_LOCK,smb.file,j); - continue; } - if((j=smb_getstatus(&smb))!=0) { - smb_close(&smb); - lastsub=INVALID_SUB; - errormsg(WHERE,ERR_READ,smb.file,j); - continue; } - smb_unlocksmbhdr(&smb); - lastsub=n; } - - if(!qwktomsg(rep,block,0,n,0)) - continue; - - useron.ptoday++; - useron.posts++; -// if(!(useron.rest&FLAG('Q'))) - logon_posts++; - putuserrec(useron.number,U_POSTS,5,itoa(useron.posts,str,10)); - putuserrec(useron.number,U_PTODAY,5,itoa(useron.ptoday,str,10)); - bprintf(text[Posted],grp[sub[n]->grp]->sname - ,sub[n]->lname); - sprintf(str,"Posted on %s %s",grp[sub[n]->grp]->sname - ,sub[n]->lname); - if(sub[n]->misc&SUB_FIDO && sub[n]->echomail_sem[0]) /* semaphore */ - if((file=nopen(sub[n]->echomail_sem,O_WRONLY|O_CREAT|O_TRUNC))!=-1) - close(file); - logline("P+",str); } } /* end of public message */ - -update_qwkroute(NULL); /* Write ROUTE.DAT */ - -if(lastsub!=INVALID_SUB) - smb_close(&smb); -fclose(rep); - -if(useron.rest&FLAG('Q')) { /* QWK Net Node */ - sprintf(str,"%s%s.MSG",temp_dir,sys_id); - remove(str); - sprintf(str,"%s%s.REP",temp_dir,sys_id); - remove(str); - - sprintf(str,"%s*.*",temp_dir); - i=findfirst(str,&ff,0); - if(!i) { - sprintf(str,"%sQNET\\%s.IN",data_dir,useron.alias); - mkdir(str); } - while(!i) { /* Extra files */ - sprintf(str,"%s%s",temp_dir,ff.ff_name); - sprintf(fname,"%sQNET\\%s.IN\\%s",data_dir,useron.alias,ff.ff_name); - mv(str,fname,1); - sprintf(str,text[ReceivedFileViaQWK],ff.ff_name,useron.alias); - putsmsg(1,str); - i=findnext(&ff); } } - -bputs(text[QWKUnpacked]); -CRLF; -/**********************************************/ -/* Hang-up now if that's what the user wanted */ -/**********************************************/ -autohangup(); - -} diff --git a/src/sbbs2/useredit.c b/src/sbbs2/useredit.c deleted file mode 100644 index 0b3c4fbd9f..0000000000 --- a/src/sbbs2/useredit.c +++ /dev/null @@ -1,966 +0,0 @@ -#line 1 "USEREDIT.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/*******************************************************************/ -/* The function useredit(), and functions that are closely related */ -/*******************************************************************/ - -#include "sbbs.h" - -#define SEARCH_TXT 0 -#define SEARCH_ARS 1 - -int searchup(char *search,int usernum); -int searchdn(char *search,int usernum); - -/****************************************************************************/ -/* Edits user data. Can only edit users with a Main Security Level less */ -/* than or equal to the current user's Main Security Level */ -/* Called from functions waitforcall, main_sec, xfer_sec and inkey */ -/****************************************************************************/ -void useredit(int usernumber, int local) -{ - uchar str[256],tmp2[256],tmp3[256],c,stype=SEARCH_TXT; - uchar search[256]={""},artxt[128]={""},*ar=NULL; - int i,j,k; - long l; - user_t user; - -if(online==ON_REMOTE && console&(CON_R_ECHO|CON_R_INPUT) && !chksyspass(local)) - return; -if(online==ON_LOCAL) { - if(!(sys_misc&SM_L_SYSOP)) - return; - if(node_misc&NM_SYSPW && !chksyspass(local)) - return; } -if(usernumber) - user.number=usernumber; -else - user.number=useron.number; -action=NODE_SYSP; -if(sys_status&SS_INUEDIT) - return; -sys_status|=SS_INUEDIT; -while(online) { - CLS; - attr(LIGHTGRAY); - getuserdat(&user); - if(!user.number) { - user.number=1; - getuserdat(&user); - if(!user.number) { - bputs(text[NoUserData]); - getkey(0); - sys_status&=~SS_INUEDIT; - return; } } - unixtodstr(time(NULL),str); - unixtodstr(user.laston,tmp); - if(strcmp(str,tmp) && user.ltoday) { - user.ltoday=user.ttoday=user.ptoday=user.etoday=user.textra=0; - user.freecdt=level_freecdtperday[user.level]; - putuserdat(user); } /* Leave alone */ - if(user.misc&DELETED) - bputs(text[Deleted]); - else if(user.misc&INACTIVE) - bputs(text[Inactive]); - bprintf(text[UeditAliasPassword] - ,user.alias, (user.level>useron.level && console&CON_R_ECHO) - || !(sys_misc&SM_ECHO_PW) ? "XXXXXXXX" : user.pass - , unixtodstr(user.pwmod,tmp)); - bprintf(text[UeditRealNamePhone] - ,user.level>useron.level && console&CON_R_ECHO - ? "XXXXXXXX" : user.name - ,user.level>useron.level && console&CON_R_ECHO - ? "XXX-XXX-XXXX" : user.phone); - bprintf(text[UeditAddressBirthday] - ,user.address,getage(user.birth),user.sex,user.birth); - bprintf(text[UeditLocationZipcode],user.location,user.zipcode); - bprintf(text[UeditNoteHandle],user.note,user.handle); - bprintf(text[UeditComputerModem],user.comp,user.modem); - sprintf(str,"%sUSER\\%4.4u.MSG",data_dir,user.number); - i=fexist(str); - if(user.comment[0] || i) - bprintf(text[UeditCommentLine],i ? '+' : SP - ,user.comment); - else - CRLF; - unixtodos(user.laston,&date,&curtime); - bprintf(text[UserDates] - ,unixtodstr(user.firston,str),unixtodstr(user.expire,tmp) - ,unixtodstr(user.laston,tmp2),curtime.ti_hour,curtime.ti_min); - bprintf(text[UserTimes] - ,user.timeon,user.ttoday,level_timeperday[user.level] - ,user.tlast,level_timepercall[user.level],user.textra); - if(user.posts) - i=user.logons/user.posts; - else - i=0; - bprintf(text[UserLogons] - ,user.logons,user.ltoday,level_callsperday[user.level],user.posts - ,i ? 100/i : user.posts>user.logons ? 100 : 0 - ,user.ptoday); - bprintf(text[UserEmails] - ,user.emails,user.fbacks,getmail(user.number,0),user.etoday); - if(user.misc&NETMAIL) - bprintf(text[UserNetMail],user.netmail); - else - CRLF; - bprintf(text[UserUploads],ultoac(user.ulb,tmp),user.uls); - if(user.leech) - sprintf(str,text[UserLeech],user.leech); - else - str[0]=0; - bprintf(text[UserDownloads],ultoac(user.dlb,tmp),user.dls,str); - bprintf(text[UserCredits],ultoac(user.cdt,tmp) - ,ultoac(user.freecdt,tmp2),ultoac(level_freecdtperday[user.level],str)); - bprintf(text[UserMinutes],ultoac(user.min,tmp)); - bprintf(text[UeditSecLevel],user.level); - bprintf(text[UeditFlags],ltoaf(user.flags1,tmp),ltoaf(user.flags3,tmp2) - ,ltoaf(user.flags2,tmp3),ltoaf(user.flags4,str)); - bprintf(text[UeditExempts],ltoaf(user.exempt,tmp),ltoaf(user.rest,tmp2)); - l=lastuser(); - ASYNC; - if(lncntr>=rows-2) - lncntr=0; - bprintf(text[UeditPrompt],user.number,l); - if(user.level>useron.level && console&CON_R_INPUT) - strcpy(str,"QG[]?/{},"); - else - strcpy(str,"ABCDEFGHIJKLMNOPQRSTUVWXYZ+[]?/{}~*$#"); - l=getkeys(str,l); - if(l&0x80000000L) { - user.number=l&~0x80000000L; - continue; } - switch(l) { - case 'A': - bputs(text[EnterYourAlias]); - getstr(user.alias,LEN_ALIAS,K_LINE|K_EDIT|K_AUTODEL); - putuserrec(user.number,U_ALIAS,LEN_ALIAS,user.alias); - if(!(user.misc&DELETED)) - putusername(user.number,user.alias); - bputs(text[EnterYourHandle]); - getstr(user.handle,LEN_HANDLE,K_LINE|K_EDIT|K_AUTODEL); - putuserrec(user.number,U_HANDLE,LEN_HANDLE,user.handle); - break; - case 'B': - bputs(text[EnterYourBirthday]); - gettmplt(user.birth,"nn/nn/nn",K_LINE|K_EDIT|K_AUTODEL); - putuserrec(user.number,U_BIRTH,LEN_BIRTH,user.birth); - break; - case 'C': - bputs(text[EnterYourComputer]); - getstr(user.comp,LEN_COMP,K_LINE|K_EDIT|K_AUTODEL); - putuserrec(user.number,U_COMP,LEN_COMP,user.comp); - break; - case 'D': - if(user.misc&DELETED) { - if(!noyes(text[UeditRestoreQ])) { - putuserrec(user.number,U_MISC,8 - ,ultoa(user.misc&~DELETED,str,16)); - putusername(user.number,user.alias); } - break; } - if(user.misc&INACTIVE) { - if(!noyes(text[UeditActivateQ])) - putuserrec(user.number,U_MISC,8 - ,ultoa(user.misc&~INACTIVE,str,16)); - break; } - if(!noyes(text[UeditDeleteQ])) { - getsmsg(user.number); - if(getmail(user.number,0)) { - if(yesno(text[UeditReadUserMailWQ])) - readmail(user.number,MAIL_YOUR); } - if(getmail(user.number,1)) { - if(yesno(text[UeditReadUserMailSQ])) - readmail(user.number,MAIL_SENT); } - putuserrec(user.number,U_MISC,8 - ,ultoa(user.misc|DELETED,str,16)); - putusername(user.number,nulstr); - break; } - if(!noyes(text[UeditDeactivateUserQ])) { - if(getmail(user.number,0)) { - if(yesno(text[UeditReadUserMailWQ])) - readmail(user.number,MAIL_YOUR); } - if(getmail(user.number,1)) { - if(yesno(text[UeditReadUserMailSQ])) - readmail(user.number,MAIL_SENT); } - putuserrec(user.number,U_MISC,8 - ,ultoa(user.misc|INACTIVE,str,16)); - break; } - break; - case 'E': - if(!yesno(text[ChangeExemptionQ])) - break; - while(online) { - bprintf(text[FlagEditing],ltoaf(user.exempt,tmp)); - c=getkeys("ABCDEFGHIJKLMNOPQRSTUVWXYZ?\r",0); - if(sys_status&SS_ABORT) - break; - if(c==CR) break; - if(c=='?') { - menu("EXEMPT"); - continue; } - if(!(useron.exempt&FLAG(c)) && console&CON_R_INPUT) - continue; - user.exempt^=FLAG(c); - putuserrec(user.number,U_EXEMPT,8,ultoa(user.exempt,tmp,16)); } - break; - case 'F': - i=1; - while(online) { - bprintf("\r\nFlag Set #%d\r\n",i); - switch(i) { - case 1: - bprintf(text[FlagEditing],ltoaf(user.flags1,tmp)); - break; - case 2: - bprintf(text[FlagEditing],ltoaf(user.flags2,tmp)); - break; - case 3: - bprintf(text[FlagEditing],ltoaf(user.flags3,tmp)); - break; - case 4: - bprintf(text[FlagEditing],ltoaf(user.flags4,tmp)); - break; } - c=getkeys("ABCDEFGHIJKLMNOPQRSTUVWXYZ?1234\r",0); - if(sys_status&SS_ABORT) - break; - if(c==CR) break; - if(c=='?') { - sprintf(str,"FLAGS%d",i); - menu(str); - continue; } - if(isdigit(c)) { - i=c&0xf; - continue; } - if(console & CON_R_INPUT) - switch(i) { - case 1: - if(!(useron.flags1&FLAG(c))) - continue; - break; - case 2: - if(!(useron.flags2&FLAG(c))) - continue; - break; - case 3: - if(!(useron.flags3&FLAG(c))) - continue; - break; - case 4: - if(!(useron.flags4&FLAG(c))) - continue; - break; } - switch(i) { - case 1: - user.flags1^=FLAG(c); - putuserrec(user.number,U_FLAGS1,8 - ,ultoa(user.flags1,tmp,16)); - break; - case 2: - user.flags2^=FLAG(c); - putuserrec(user.number,U_FLAGS2,8 - ,ultoa(user.flags2,tmp,16)); - break; - case 3: - user.flags3^=FLAG(c); - putuserrec(user.number,U_FLAGS3,8 - ,ultoa(user.flags3,tmp,16)); - break; - case 4: - user.flags4^=FLAG(c); - putuserrec(user.number,U_FLAGS4,8 - ,ultoa(user.flags4,tmp,16)); - break; } } - break; - case 'G': - bputs(text[GoToUser]); - if(getstr(str,LEN_ALIAS,K_UPPER|K_LINE)) { - if(isdigit(str[0])) { - i=atoi(str); - if(i>lastuser()) - break; - if(i) user.number=i; } - else { - i=finduser(str); - if(i) user.number=i; } } - break; - case 'H': /* edit user's information file */ - attr(LIGHTGRAY); - sprintf(str,"%sUSER\\%4.4u.MSG",data_dir,user.number); - editfile(str); - break; - case 'I': - maindflts(user); - break; - case 'J': /* Edit Minutes */ - bputs(text[UeditMinutes]); - ultoa(user.min,str,10); - if(getstr(str,10,K_NUMBER|K_LINE)) - putuserrec(user.number,U_MIN,10,str); - break; - case 'K': /* date changes */ - bputs(text[UeditLastOn]); - unixtodstr(user.laston,str); - gettmplt(str,"nn/nn/nn",K_LINE|K_EDIT); - if(sys_status&SS_ABORT) - break; - user.laston=dstrtounix(str); - putuserrec(user.number,U_LASTON,8,ultoa(user.laston,tmp,16)); - bputs(text[UeditFirstOn]); - unixtodstr(user.firston,str); - gettmplt(str,"nn/nn/nn",K_LINE|K_EDIT); - if(sys_status&SS_ABORT) - break; - user.firston=dstrtounix(str); - putuserrec(user.number,U_FIRSTON,8,ultoa(user.firston,tmp,16)); - bputs(text[UeditExpire]); - unixtodstr(user.expire,str); - gettmplt(str,"nn/nn/nn",K_LINE|K_EDIT); - if(sys_status&SS_ABORT) - break; - user.expire=dstrtounix(str); - putuserrec(user.number,U_EXPIRE,8,ultoa(user.expire,tmp,16)); - bputs(text[UeditPwModDate]); - unixtodstr(user.pwmod,str); - gettmplt(str,"nn/nn/nn",K_LINE|K_EDIT); - if(sys_status&SS_ABORT) - break; - user.pwmod=dstrtounix(str); - putuserrec(user.number,U_PWMOD,8,ultoa(user.pwmod,tmp,16)); - break; - case 'L': - bputs(text[EnterYourAddress]); - getstr(user.address,LEN_ADDRESS,K_LINE|K_EDIT|K_AUTODEL); - if(sys_status&SS_ABORT) - break; - putuserrec(user.number,U_ADDRESS,LEN_ADDRESS,user.address); - bputs(text[EnterYourCityState]); - getstr(user.location,LEN_LOCATION,K_LINE|K_EDIT|K_AUTODEL); - if(sys_status&SS_ABORT) - break; - putuserrec(user.number,U_LOCATION,LEN_LOCATION,user.location); - bputs(text[EnterYourZipCode]); - getstr(user.zipcode,LEN_ZIPCODE,K_LINE|K_EDIT|K_AUTODEL|K_UPPER); - if(sys_status&SS_ABORT) - break; - putuserrec(user.number,U_ZIPCODE,LEN_ZIPCODE,user.zipcode); - break; - case 'M': - bputs(text[UeditML]); - itoa(user.level,str,10); - if(getstr(str,2,K_NUMBER|K_LINE)) - if(!(atoi(str)>useron.level && console&CON_R_INPUT)) - putuserrec(user.number,U_LEVEL,2,str); - break; - case 'N': - bputs(text[UeditNote]); - getstr(user.note,LEN_NOTE,K_LINE|K_EDIT|K_AUTODEL); - putuserrec(user.number,U_NOTE,LEN_NOTE,user.note); - break; - case 'O': - bputs(text[UeditComment]); - getstr(user.comment,60,K_LINE|K_EDIT|K_AUTODEL); - putuserrec(user.number,U_COMMENT,60,user.comment); - break; - case 'P': - bputs(text[EnterYourPhoneNumber]); - getstr(user.phone,LEN_PHONE,K_UPPER|K_LINE|K_EDIT|K_AUTODEL); - putuserrec(user.number,U_PHONE,LEN_PHONE,user.phone); - break; - case 'Q': - CLS; - sys_status&=~SS_INUEDIT; - if(ar) - FREE(ar); - return; - case 'R': - bputs(text[EnterYourRealName]); - getstr(user.name,LEN_NAME,K_LINE|K_EDIT|K_AUTODEL); - putuserrec(user.number,U_NAME,LEN_NAME,user.name); - break; - case 'S': - bputs(text[EnterYourSex]); - if(getstr(str,1,K_UPPER|K_LINE)) - putuserrec(user.number,U_SEX,1,str); - break; - case 'T': /* Text Search */ - bputs(text[SearchStringPrompt]); - if(getstr(search,30,K_UPPER|K_LINE)) - stype=SEARCH_TXT; - break; - case 'U': - bputs(text[UeditUlBytes]); - ultoa(user.ulb,str,10); - if(getstr(str,10,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) - putuserrec(user.number,U_ULB,10,str); - if(sys_status&SS_ABORT) - break; - bputs(text[UeditUploads]); - sprintf(str,"%u",user.uls); - if(getstr(str,5,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) - putuserrec(user.number,U_ULS,5,str); - if(sys_status&SS_ABORT) - break; - bputs(text[UeditDlBytes]); - ultoa(user.dlb,str,10); - if(getstr(str,10,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) - putuserrec(user.number,U_DLB,10,str); - if(sys_status&SS_ABORT) - break; - bputs(text[UeditDownloads]); - sprintf(str,"%u",user.dls); - if(getstr(str,5,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL)) - putuserrec(user.number,U_DLS,5,str); - break; - case 'V': - CLS; - attr(LIGHTGRAY); - for(i=0;i<10;i++) { - bprintf(text[QuickValidateFmt] - ,i,val_level[i],ltoaf(val_flags1[i],str) - ,ltoaf(val_exempt[i],tmp) - ,ltoaf(val_rest[i],tmp3)); } - ASYNC; - bputs(text[QuickValidatePrompt]); - c=getkey(0); - if(!isdigit(c)) - break; - i=c&0xf; - user.level=val_level[i]; - user.flags1=val_flags1[i]; - user.flags2=val_flags2[i]; - user.flags3=val_flags3[i]; - user.flags4=val_flags4[i]; - user.exempt=val_exempt[i]; - user.rest=val_rest[i]; - user.cdt+=val_cdt[i]; - now=time(NULL); - if(val_expire[i]) { - if(user.expire<now) - user.expire=now+((long)val_expire[i]*24L*60L*60L); - else - user.expire+=((long)val_expire[i]*24L*60L*60L); } - putuserdat(user); - break; - case 'W': - bputs(text[UeditPassword]); - getstr(user.pass,LEN_PASS,K_UPPER|K_LINE|K_EDIT|K_AUTODEL); - putuserrec(user.number,U_PASS,LEN_PASS,user.pass); - break; - case 'X': - attr(LIGHTGRAY); - sprintf(str,"%sUSER\\%4.4u.MSG",data_dir,user.number); - printfile(str,0); - pause(); - break; - case 'Y': - if(!noyes(text[UeditCopyUserQ])) { - bputs(text[UeditCopyUserToSlot]); - i=getnum(lastuser()); - if(i>0) { - user.number=i; - putusername(user.number,user.alias); - putuserdat(user); } } - break; - case 'Z': - if(!yesno(text[ChangeRestrictsQ])) - break; - while(online) { - bprintf(text[FlagEditing],ltoaf(user.rest,tmp)); - c=getkeys("ABCDEFGHIJKLMNOPQRSTUVWXYZ?\r",0); - if(sys_status&SS_ABORT) - break; - if(c==CR) break; - if(c=='?') { - menu("RESTRICT"); - continue; } - user.rest^=FLAG(c); - putuserrec(user.number,U_REST,8,ultoa(user.rest,tmp,16)); } - break; - case '?': - CLS; - menu("UEDIT"); /* Sysop Uedit Edit Menu */ - pause(); - break; - case '~': - bputs(text[UeditLeech]); - if(getstr(str,2,K_NUMBER|K_LINE)) - putuserrec(user.number,U_LEECH,2,itoa(atoi(str),tmp,16)); - break; - case '+': - bputs(text[ModifyCredits]); - getstr(str,10,K_UPPER|K_LINE); - l=atol(str); - if(strstr(str,"M")) - l*=0x100000L; - else if(strstr(str,"K")) - l*=1024; - else if(strstr(str,"$")) - l*=cdt_per_dollar; - if(l<0L && l*-1 > user.cdt) - user.cdt=0L; - else - user.cdt+=l; - putuserrec(user.number,U_CDT,10,ultoa(user.cdt,tmp,10)); - break; - case '*': - bputs(text[ModifyMinutes]); - getstr(str,10,K_UPPER|K_LINE); - l=atol(str); - if(strstr(str,"H")) - l*=60L; - if(l<0L && l*-1 > user.min) - user.min=0L; - else - user.min+=l; - putuserrec(user.number,U_MIN,10,ultoa(user.min,tmp,10)); - break; - case '#': /* read new user questionaire */ - sprintf(str,"%sUSER\\%4.4u.DAT",data_dir,user.number); - if(!new_sof[0] || !fexist(str)) - break; - read_sif_dat(new_sof,str); - if(!noyes(text[DeleteQuestionaireQ])) - remove(str); - break; - case '$': - bputs(text[UeditCredits]); - ultoa(user.cdt,str,10); - if(getstr(str,10,K_NUMBER|K_LINE)) - putuserrec(user.number,U_CDT,10,str); - break; - case '/': - bputs(text[SearchStringPrompt]); - if(getstr(artxt,40,K_UPPER|K_LINE)) - stype=SEARCH_ARS; - if(ar && ar[0]) - FREE(ar); - ar=arstr(0,artxt); - break; - case '{': - if(stype==SEARCH_TXT) - user.number=searchdn(search,user.number); - else { - if(!ar) - break; - k=user.number; - for(i=k-1;i;i--) { - user.number=i; - getuserdat(&user); - if(chk_ar(ar,user)) { - outchar(7); - break; } } - if(!i) - user.number=k; } - break; - case '}': - if(stype==SEARCH_TXT) - user.number=searchup(search,user.number); - else { - if(!ar) - break; - j=lastuser(); - k=user.number; - for(i=k+1;i<=j;i++) { - user.number=i; - getuserdat(&user); - if(chk_ar(ar,user)) { - outchar(7); - break; } } - if(i>j) - user.number=k; } - break; - case ']': - if(user.number==lastuser()) - user.number=1; - else user.number++; - break; - case '[': - if(user.number==1) - user.number=lastuser(); - else user.number--; - break; } } -sys_status&=~SS_INUEDIT; -} - -/****************************************************************************/ -/* Seaches forward through the USER.DAT file for the ocurrance of 'search' */ -/* starting at the offset for usernum+1 and returning the usernumber of the */ -/* record where the string was found or the original usernumber if the */ -/* string wasn't found */ -/* Called from the function useredit */ -/****************************************************************************/ -int searchup(char *search,int usernum) -{ - char userdat[U_LEN+1]; - int file,count; - uint i=usernum+1; - -if(!search[0]) - return(usernum); -sprintf(userdat,"%sUSER\\USER.DAT",data_dir); -if((file=nopen(userdat,O_RDONLY|O_DENYNONE))==-1) - return(usernum); -lseek(file,(long)((long)usernum*U_LEN),0); - -while(!eof(file)) { - count=0; - while(count<LOOP_NODEDAB - && lock(file,(long)((long)(i-1)*U_LEN),U_LEN)==-1) { - if(count>10) - mswait(55); - count++; } - - if(count>=LOOP_NODEDAB) { - close(file); - errormsg(WHERE,ERR_LOCK,"USER.DAT",i); - return(usernum); } - - if(read(file,userdat,U_LEN)!=U_LEN) { - unlock(file,(long)((long)(i-1)*U_LEN),U_LEN); - close(file); - errormsg(WHERE,ERR_READ,"USER.DAT",U_LEN); - return(usernum); } - - unlock(file,(long)((long)(i-1)*U_LEN),U_LEN); - userdat[U_LEN]=0; - strupr(userdat); - if(strstr(userdat,search)) { - outchar(7); - close(file); - return(i); } - i++; } -close(file); -return(usernum); -} - -/****************************************************************************/ -/* Seaches backward through the USER.DAT file for the ocurrance of 'search' */ -/* starting at the offset for usernum-1 and returning the usernumber of the */ -/* record where the string was found or the original usernumber if the */ -/* string wasn't found */ -/* Called from the function useredit */ -/****************************************************************************/ -int searchdn(char *search,int usernum) -{ - char userdat[U_LEN+1]; - int file,count; - uint i=usernum-1; - -if(!search[0]) - return(usernum); -sprintf(userdat,"%sUSER\\USER.DAT",data_dir); -if((file=nopen(userdat,O_RDONLY))==-1) - return(usernum); -while(i) { - lseek(file,(long)((long)(i-1)*U_LEN),0); - count=0; - while(count<LOOP_NODEDAB - && lock(file,(long)((long)(i-1)*U_LEN),U_LEN)==-1) { - if(count>10) - mswait(55); - count++; } - - if(count>=LOOP_NODEDAB) { - close(file); - errormsg(WHERE,ERR_LOCK,"USER.DAT",i); - return(usernum); } - - if(read(file,userdat,U_LEN)==-1) { - unlock(file,(long)((long)(i-1)*U_LEN),U_LEN); - close(file); - errormsg(WHERE,ERR_READ,"USER.DAT",U_LEN); - return(usernum); } - unlock(file,(long)((long)(i-1)*U_LEN),U_LEN); - userdat[U_LEN]=0; - strupr(userdat); - if(strstr(userdat,search)) { - outchar(7); - close(file); - return(i); } - i--; } -close(file); -return(usernum); -} - -/****************************************************************************/ -/* This function view/edits the users main default settings. */ -/****************************************************************************/ -void maindflts(user_t user) -{ - char str[256],ch; - int i; - -action=NODE_DFLT; -while(online) { - CLS; -/* - if(user.number==useron.number && useron.rest&FLAG('G')) /* Guest */ - user=useron; - else -*/ - getuserdat(&user); - if(user.rows) - rows=user.rows; - bprintf(text[UserDefaultsHdr],user.alias,user.number); - sprintf(str,"%s%s%s%s%s" - ,user.misc&AUTOTERM ? "Auto Detect ":nulstr - ,user.misc&ANSI ? "ANSI ":"TTY " - ,user.misc&COLOR ? "(Color) ":"(Mono) " - ,user.misc&WIP ? "WIP" : user.misc&RIP ? "RIP " - :nulstr - ,user.misc&NO_EXASCII ? "ASCII Only":nulstr); - bprintf(text[UserDefaultsTerminal],str); - if(total_xedits) - bprintf(text[UserDefaultsXeditor] - ,user.xedit ? xedit[user.xedit-1]->name : "None"); - if(user.rows) - itoa(user.rows,tmp,10); - else - sprintf(tmp,"Auto Detect (%d)",rows); - bprintf(text[UserDefaultsRows],tmp); - if(total_shells>1) - bprintf(text[UserDefaultsCommandSet] - ,shell[user.shell]->name); - bprintf(text[UserDefaultsArcType] - ,user.tmpext); - bprintf(text[UserDefaultsMenuMode] - ,user.misc&EXPERT ? text[On] : text[Off]); - bprintf(text[UserDefaultsPause] - ,user.misc&UPAUSE ? text[On] : text[Off]); - bprintf(text[UserDefaultsHotKey] - ,user.misc&COLDKEYS ? text[Off] : text[On]); - bprintf(text[UserDefaultsCursor] - ,user.misc&SPIN ? text[On] : text[Off]); - bprintf(text[UserDefaultsCLS] - ,user.misc&CLRSCRN ? text[On] : text[Off]); - bprintf(text[UserDefaultsAskNScan] - ,user.misc&ASK_NSCAN ? text[On] : text[Off]); - bprintf(text[UserDefaultsAskSScan] - ,user.misc&ASK_SSCAN ? text[On] : text[Off]); - bprintf(text[UserDefaultsANFS] - ,user.misc&ANFSCAN ? text[On] : text[Off]); - bprintf(text[UserDefaultsRemember] - ,user.misc&CURSUB ? text[On] : text[Off]); - bprintf(text[UserDefaultsBatFlag] - ,user.misc&BATCHFLAG ? text[On] : text[Off]); - if(sys_misc&SM_FWDTONET) - bprintf(text[UserDefaultsNetMail] - ,user.misc&NETMAIL ? text[On] : text[Off]); - if(useron.exempt&FLAG('Q') || user.misc&QUIET) - bprintf(text[UserDefaultsQuiet] - ,user.misc&QUIET ? text[On] : text[Off]); - if(user.prot!=SP) - sprintf(str,"%c",user.prot); - else - strcpy(str,"None"); - bprintf(text[UserDefaultsProtocol],str - ,user.misc&AUTOHANG ? "(Hang-up After Xfer)":nulstr); - if(sys_misc&SM_PWEDIT && !(user.rest&FLAG('G'))) - bputs(text[UserDefaultsPassword]); - - ASYNC; - bputs(text[UserDefaultsWhich]); - strcpy(str,"HTBALPRSYFNCQXZ\r"); - if(sys_misc&SM_PWEDIT && !(user.rest&FLAG('G'))) - strcat(str,"W"); - if(useron.exempt&FLAG('Q') || user.misc&QUIET) - strcat(str,"D"); - if(total_xedits) - strcat(str,"E"); - if(sys_misc&SM_FWDTONET) - strcat(str,"M"); - if(total_shells>1) - strcat(str,"K"); - ch=getkeys(str,0); - switch(ch) { - case 'T': - if(yesno(text[AutoTerminalQ])) { - user.misc|=AUTOTERM; - user.misc&=~(ANSI|RIP|WIP); - user.misc|=autoterm; } - else - user.misc&=~AUTOTERM; - if(!(user.misc&AUTOTERM)) { - if(yesno(text[AnsiTerminalQ])) - user.misc|=ANSI; - else - user.misc&=~(ANSI|COLOR); } - if(user.misc&ANSI) { - if(yesno(text[ColorTerminalQ])) - user.misc|=COLOR; - else - user.misc&=~COLOR; } - if(!yesno(text[ExAsciiTerminalQ])) - user.misc|=NO_EXASCII; - else - user.misc&=~NO_EXASCII; - if(!(user.misc&AUTOTERM)) { - if(!noyes(text[RipTerminalQ])) - user.misc|=RIP; - else - user.misc&=~RIP; } - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'B': - user.misc^=BATCHFLAG; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'E': - if(noyes("Use an external editor")) { - putuserrec(user.number,U_XEDIT,8,nulstr); - break; } - if(user.xedit) - user.xedit--; - for(i=0;i<total_xedits;i++) - uselect(1,i,"External Editor",xedit[i]->name,xedit[i]->ar); - if((i=uselect(0,user.xedit,0,0,0))>=0) - putuserrec(user.number,U_XEDIT,8,xedit[i]->code); - break; - case 'K': /* Command shell */ - for(i=0;i<total_shells;i++) - uselect(1,i,"Command Shell",shell[i]->name,shell[i]->ar); - if((i=uselect(0,user.shell,0,0,0))>=0) - putuserrec(user.number,U_SHELL,8,shell[i]->code); - break; - case 'A': - for(i=0;i<total_fcomps;i++) - uselect(1,i,"Archive Type",fcomp[i]->ext,fcomp[i]->ar); - if((i=uselect(0,0,0,0,0))>=0) - putuserrec(user.number,U_TMPEXT,3,fcomp[i]->ext); - break; - case 'L': - bputs(text[HowManyRows]); - if((ch=getnum(99))!=-1) - putuserrec(user.number,U_ROWS,2,itoa(ch,tmp,10)); - break; - case 'P': - user.misc^=UPAUSE; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'H': - user.misc^=COLDKEYS; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'S': - user.misc^=SPIN; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'F': - user.misc^=ANFSCAN; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'X': - user.misc^=EXPERT; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'R': /* Remember current sub/dir */ - user.misc^=CURSUB; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'Y': /* Prompt for scanning message to you */ - user.misc^=ASK_SSCAN; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'N': /* Prompt for new message/files scanning */ - user.misc^=ASK_NSCAN; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'M': /* NetMail address */ - if(noyes(text[ForwardMailQ])) - user.misc&=~NETMAIL; - else { - user.misc|=NETMAIL; - bputs(text[EnterNetMailAddress]); - if(!getstr(user.netmail,LEN_NETMAIL,K_EDIT|K_AUTODEL|K_LINE)) - break; - putuserrec(user.number,U_NETMAIL,LEN_NETMAIL,user.netmail); } - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'C': - user.misc^=CLRSCRN; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'D': - user.misc^=QUIET; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - case 'W': - if(noyes(text[NewPasswordQ])) - break; - bputs(text[CurrentPassword]); - console|=CON_R_ECHOX; - if(!(sys_misc&SM_ECHO_PW)) - console|=CON_L_ECHOX; - ch=getstr(str,LEN_PASS,K_UPPER); - console&=~(CON_R_ECHOX|CON_L_ECHOX); - if(strcmp(str,user.pass)) { - bputs(text[WrongPassword]); - pause(); - break; } - bputs(text[NewPassword]); - if(!getstr(str,LEN_PASS,K_UPPER|K_LINE)) - break; - truncsp(str); - if(!chkpass(str,user)) { - CRLF; - pause(); - break; } - bputs(text[VerifyPassword]); - console|=CON_R_ECHOX; - if(!(sys_misc&SM_ECHO_PW)) - console|=CON_L_ECHOX; - getstr(tmp,LEN_PASS,K_UPPER); - console&=~(CON_R_ECHOX|CON_L_ECHOX); - if(strcmp(str,tmp)) { - bputs(text[WrongPassword]); - pause(); - break; } - if(!online) - break; - putuserrec(user.number,U_PASS,LEN_PASS,str); - now=time(NULL); - putuserrec(user.number,U_PWMOD,8,ultoa(now,tmp,16)); - bputs(text[PasswordChanged]); - logline(nulstr,"Changed password"); - pause(); - break; - case 'Z': - menu("DLPROT"); - SYNC; - mnemonics(text[ProtocolOrQuit]); - strcpy(str,"Q"); - for(i=0;i<total_prots;i++) - if(prot[i]->dlcmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(str,tmp); } - ch=getkeys(str,0); - if(ch=='Q' || sys_status&SS_ABORT) { - ch=SP; - putuserrec(user.number,U_PROT,1,&ch); } - else - putuserrec(user.number,U_PROT,1,&ch); - if(yesno(text[HangUpAfterXferQ])) - user.misc|=AUTOHANG; - else - user.misc&=~AUTOHANG; - putuserrec(user.number,U_MISC,8,ultoa(user.misc,str,16)); - break; - default: - return; } } -} - -void purgeuser(int usernumber) -{ - uchar str[128]; - user_t user; - -user.number=usernumber; -getuserdat(&user); -sprintf(str,"Purged %s #%u",user.alias,usernumber); -logentry("!*",str); -delallmail(usernumber); -putusername(usernumber,nulstr); -putuserrec(usernumber,U_MISC,8,ultoa(user.misc|DELETED,str,16)); -} diff --git a/src/sbbs2/userrec.c b/src/sbbs2/userrec.c deleted file mode 100644 index 91fe764d72..0000000000 --- a/src/sbbs2/userrec.c +++ /dev/null @@ -1,194 +0,0 @@ -#line 1 "USERREC.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -/****************************************************************************/ -/* Fills 'str' with record for usernumber starting at start for length bytes*/ -/* Called from function ??? */ -/****************************************************************************/ -void getuserrec(int usernumber,int start, char length, char *str) -{ - char c,path[256]; - int i,file; - -if(!usernumber) { - errormsg(WHERE,ERR_CHK,"user number",0); - return; } -sprintf(path,"%sUSER\\USER.DAT",data_dir); -if((file=nopen(path,O_RDONLY|O_DENYNONE))==-1) { - errormsg(WHERE,ERR_OPEN,path,O_RDONLY); - return; } -if(usernumber<1 - || filelength(file)<(long)((long)(usernumber-1L)*U_LEN)+(long)start) { - close(file); - errormsg(WHERE,ERR_CHK,"user number",usernumber); - return; } -lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); - -i=0; -while(i<LOOP_NODEDAB - && lock(file,(long)((long)(usernumber-1)*U_LEN)+start,length)==-1) { - if(i>10) - mswait(55); - i++; } - -if(i>=LOOP_NODEDAB) { - close(file); - errormsg(WHERE,ERR_LOCK,"USER.DAT",usernumber); - return; } - -if(read(file,str,length)!=length) { - unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length); - close(file); - errormsg(WHERE,ERR_READ,"USER.DAT",length); - return; } - -unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length); -close(file); -for(c=0;c<length;c++) - if(str[c]==ETX || str[c]==CR) break; -str[c]=0; -} - -/****************************************************************************/ -/* Places into USER.DAT at the offset for usernumber+start for length bytes */ -/* Called from various locations */ -/****************************************************************************/ -void putuserrec(int usernumber,int start, char length, char *str) -{ - char c,str2[256]; - int file,i; - node_t node; - -if(usernumber<1) { - errormsg(WHERE,ERR_CHK,"user number",usernumber); - return; } -sprintf(str2,"%sUSER\\USER.DAT",data_dir); -if((file=nopen(str2,O_WRONLY|O_DENYNONE))==-1) { - errormsg(WHERE,ERR_OPEN,str2,O_WRONLY); - return; } -strcpy(str2,str); -if(strlen(str2)<length) { - for(c=strlen(str2);c<length;c++) - str2[c]=ETX; - str2[c]=0; } -lseek(file,(long)((long)((long)((long)usernumber-1)*U_LEN)+start),SEEK_SET); - -i=0; -while(i<LOOP_NODEDAB - && lock(file,(long)((long)(usernumber-1)*U_LEN)+start,length)==-1) { - if(i>10) - mswait(55); - i++; } - -if(i>=LOOP_NODEDAB) { - close(file); - errormsg(WHERE,ERR_LOCK,"USER.DAT",usernumber); - return; } - -write(file,str2,length); -unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length); -close(file); -for(i=1;i<=sys_nodes;i++) { /* instant user data update */ - if(i==node_num) - continue; - getnodedat(i,&node,0); - if(node.useron==usernumber && (node.status==NODE_INUSE - || node.status==NODE_QUIET)) { - getnodedat(i,&node,1); - node.misc|=NODE_UDAT; - putnodedat(i,node); - break; } } -} - -/****************************************************************************/ -/* Updates user 'usernumber's record (numeric string) by adding 'adj' to it */ -/* returns the new value. */ -/****************************************************************************/ -ulong adjustuserrec(int usernumber,int start, char length, long adj) -{ - char str[256],c,path[256]; - int i,file; - ulong val; - node_t node; - -if(usernumber<1) { - errormsg(WHERE,ERR_CHK,"user number",usernumber); - return(0UL); } -sprintf(path,"%sUSER\\USER.DAT",data_dir); -if((file=nopen(path,O_RDWR|O_DENYNONE))==-1) { - errormsg(WHERE,ERR_OPEN,path,O_RDWR); - return(0UL); } -lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); - -i=0; -while(i<LOOP_NODEDAB - && lock(file,(long)((long)(usernumber-1)*U_LEN)+start,length)==-1) { - if(i>10) - mswait(55); - i++; } - -if(i>=LOOP_NODEDAB) { - close(file); - errormsg(WHERE,ERR_LOCK,"USER.DAT",usernumber); - return(0); } - -if(read(file,str,length)!=length) { - unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length); - close(file); - errormsg(WHERE,ERR_READ,path,length); - return(0UL); } -for(c=0;c<length;c++) - if(str[c]==ETX || str[c]==CR) break; -str[c]=0; -val=atol(str); -if(adj<0L && val<-adj) /* don't go negative */ - val=0UL; -else val+=adj; -lseek(file,(long)((long)(usernumber-1)*U_LEN)+start,SEEK_SET); -putrec(str,0,length,ultoa(val,tmp,10)); -if(write(file,str,length)!=length) { - unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length); - close(file); - errormsg(WHERE,ERR_WRITE,path,length); - return(val); } -unlock(file,(long)((long)(usernumber-1)*U_LEN)+start,length); -close(file); -for(i=1;i<=sys_nodes;i++) { /* instant user data update */ - if(i==node_num) - continue; - getnodedat(i,&node,0); - if(node.useron==usernumber && (node.status==NODE_INUSE - || node.status==NODE_QUIET)) { - getnodedat(i,&node,1); - node.misc|=NODE_UDAT; - putnodedat(i,node); - break; } } -return(val); -} - -/****************************************************************************/ -/* Subtract credits from the current user online, accounting for the new */ -/* "free credits" field. */ -/****************************************************************************/ -void subtract_cdt(long amt) -{ - long mod; - -if(!amt) - return; -if(useron.freecdt) { - if(amt>useron.freecdt) { /* subtract both credits and */ - mod=amt-useron.freecdt; /* free credits */ - putuserrec(useron.number,U_FREECDT,10,"0"); - useron.freecdt=0; - useron.cdt=adjustuserrec(useron.number,U_CDT,10,-mod); } - else { /* subtract just free credits */ - useron.freecdt-=amt; - putuserrec(useron.number,U_FREECDT,10 - ,ultoa(useron.freecdt,tmp,10)); } } -else /* no free credits */ - useron.cdt=adjustuserrec(useron.number,U_CDT,10,-amt); -} diff --git a/src/sbbs2/uti/makefile b/src/sbbs2/uti/makefile deleted file mode 100644 index fc92d412c3..0000000000 --- a/src/sbbs2/uti/makefile +++ /dev/null @@ -1,90 +0,0 @@ -############################### -# Makefile for Synchronet UTI # -# For use with Turbo C++ # -# Tabstop=8 # -############################### - -# Macros -CC = bcc -LD = tlink -INCLUDE = \bc31\include;..;..\smb;..\rio -LIB = \bc31\lib -MODEL = l -CFLAGS = -d -C -m$(MODEL) -I$(INCLUDE) -w-pro -LFLAGS = /n /c -OBJS = scfgvars.obj scfglib1.obj uti.obj ars.obj -SMB = smblib.obj -LZH = lzh.obj -HEADERS = ..\sbbs.h ..\sbbsdefs.h ..\scfgvars.c \ - ..\smb\smblib.h ..\smb\smbdefs.h - -# Implicit C Compile Rule -.c.obj: - @echo Compiling $*.c to $*.obj ... - $(CC) $(CFLAGS) -o$*.obj -c $*.c - -all: utilist.exe utihigh.exe utiexprt.exe utilstrd.exe utiimprt.exe utiver.exe - -utilist.exe: $(OBJS) utilist.obj - @echo Linking $< ... - $(LD) $(LFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) utilist.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -utihigh.exe: $(OBJS) $(SMB) utihigh.obj - @echo Linking $< ... - $(LD) $(LFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) $(SMB) utihigh.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -utiexprt.exe: $(OBJS) $(SMB) $(LZH) utiexprt.obj - @echo Linking $< ... - $(LD) $(LFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) $(SMB) $(LZH) utiexprt.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -utiimprt.exe: $(OBJS) $(SMB) $(LZH) utiimprt.obj - @echo Linking $< ... - $(LD) $(LFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) $(SMB) $(LZH) utiimprt.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -utilstrd.exe: $(OBJS) utilstrd.obj - @echo Linking $< ... - $(LD) $(LFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) utilstrd.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -utiver.exe: uti.h utiver.obj utiver.c - bcc -w-pro utiver.c - -# SMBLIB Functions -smblib.obj: ..\smb\smblib.c ..\smb\smbdefs.h ..\smb\smblib.h - @echo Compiling ..\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c ..\smb\$*.c - -# SMB LZH Functions -lzh.obj: ..\smb\lzh.c ..\smb\lzh.h - @echo Compiling ..\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c ..\smb\$*.c - -# Global Variables -scfgvars.obj: ..\scfgvars.c ..\smb\smbdefs.h - @echo Compiling ..\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c ..\$*.c - -ars.obj: ..\ars.c ..\ars_defs.h - @echo Compiling ..\$&.c to $< ... - $(CC) $(CFLAGS) -c ..\ars.c - - -# Shared Functions -scfglib1.obj: ..\sbbs.h ..\sbbsdefs.h ..\scfglib1.c ..\scfgvars.c ..\scfglib.h - @echo Compiling ..\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c ..\$*.c - -utiimprt.obj: uti.h -utiexprt.obj: uti.h -utilstrd.obj: uti.h -utihigh.obj: uti.h -utilist.obj: uti.h diff --git a/src/sbbs2/uti/uti.c b/src/sbbs2/uti/uti.c deleted file mode 100644 index fb290e0a33..0000000000 --- a/src/sbbs2/uti/uti.c +++ /dev/null @@ -1,298 +0,0 @@ -#line 1 "UTI.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Shared routines for most of the UTI driver programs */ - -#include "sbbs.h" -#include "uti.h" - -#define bputs lputs -#define bprintf lprintf - -int logfile; -char scrnbuf[4000],tmp[256]; -struct text_info txtinfo; - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/* Called from everywhere */ -/****************************************************************************/ -int lprintf(char *fmat, ...) { - char sbuf[256]; - int chcount; - -chcount=vsprintf(sbuf,fmat,_va_ptr); -lputs(sbuf); -return(chcount); -} - -long lputs(char far *str) -{ - char tmp[256]; - int i,j,k; - -j=strlen(str); -for(i=k=0;i<j;i++) /* remove CRs */ - if(str[i]==CR && str[i+1]==LF) - continue; - else - tmp[k++]=str[i]; -tmp[k]=0; -return(fputs(tmp,stdout)); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - -i=strlen(str); -if(i && str[i-1]!='\\') { - str[i]='\\'; str[i+1]=0; } -} - - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char logstr[256]; - int file,share,count=0; - -if(access==O_RDONLY) share=O_DENYWRITE; - else share=O_DENYALL; -while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(count>(LOOP_NOPEN/2)) - lprintf("NOPEN COLLISION - File: %s Count: %d" - ,str,count); -if(file==-1 && errno==EACCES) - lputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - -/****************************************************************************/ -/* This function performs an nopen, but returns a file stream with a buffer */ -/* allocated. */ -/****************************************************************************/ -FILE *fnopen(int *file, char *str, int access) -{ - char mode[128]; - FILE *stream; - -if(((*file)=nopen(str,access))==-1) - return(NULL); - -if(access&O_APPEND) { - if(access&O_RDONLY) - strcpy(mode,"a+"); - else - strcpy(mode,"a"); } -else { - if(access&O_WRONLY) - strcpy(mode,"r+"); - else - strcpy(mode,"r"); } -stream=fdopen((*file),mode); -if(stream==NULL) { - close(*file); - return(NULL); } -setvbuf(stream,NULL,_IOFBF,16*1024); -return(stream); -} - - -/****************************************************************************/ -/* Returns the length of the file in 'filespec' */ -/****************************************************************************/ -long flength(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==NULL) - return(f.ff_fsize); -return(-1L); -} - - -/****************************************************************************/ -/* Error handling routine. Prints to local and remote screens the error */ -/* information, function, action, object and access and then attempts to */ -/* write the error information into the file ERROR.LOG and NODE.LOG */ -/****************************************************************************/ -void errormsg(int line, char *source, char action, char *object, ulong access) -{ - char str[512]; - char actstr[256]; - -switch(action) { - case ERR_OPEN: - strcpy(actstr,"opening"); - break; - case ERR_CLOSE: - strcpy(actstr,"closeing"); - break; - case ERR_FDOPEN: - strcpy(actstr,"fdopen"); - break; - case ERR_READ: - strcpy(actstr,"reading"); - break; - case ERR_WRITE: - strcpy(actstr,"writing"); - break; - case ERR_REMOVE: - strcpy(actstr,"removing"); - break; - case ERR_ALLOC: - strcpy(actstr,"allocating memory"); - break; - case ERR_CHK: - strcpy(actstr,"checking"); - break; - case ERR_LEN: - strcpy(actstr,"checking length"); - break; - case ERR_EXEC: - strcpy(actstr,"executing"); - break; - default: - strcpy(actstr,"UNKNOWN"); } -lprintf("\7\r\nERROR - file: %s",source); -lprintf("\7\r\n line: %u",line); -lprintf("\7\r\n action: %s",actstr); /* tell user about error */ -lprintf("\7\r\n object: %s",object); -lprintf("\7\r\n access: %lu (%lxh)",access,access); -lputs("\r\n\r\n<Hit any key>"); -getch(); -lputs("\r\n"); -} - - -void allocfail(uint size) -{ -lprintf("\7Error allocating %u bytes of memory.\r\n",size); -exit(1); -} - -void bail(int code) -{ - char str[256]; - time_t t; - struct time curtime; - struct date date; - -if(!code) { - puttext(1,1,80,25,scrnbuf); /* restore screen if no error */ - textattr(txtinfo.attribute); - gotoxy(txtinfo.curx,txtinfo.cury); } -t=time(NULL); -unixtodos(t,&date,&curtime); -sprintf(str,"%02u/%02u/%u %02u:%02u:%02u Exiting (%d)\r\n\r\n" - ,date.da_mon,date.da_day,date.da_year - ,curtime.ti_hour,curtime.ti_min,curtime.ti_sec - ,code); -write(logfile,str,strlen(str)); -exit(code); -} - -int getsubnum(char *code) -{ - int i; - -for(i=0;i<total_subs;i++) { -// printf("%s vs %s\n",code,sub[i]->code); - if(!stricmp(code,sub[i]->code)) - return(i); } -return(-1); -} - -void uti_init(char *name, int argc, char **argv) -{ - char str[256],*p; - int i; - read_cfg_text_t txt; - time_t t; - struct tm *tm; - -setvbuf(stdout,NULL,_IONBF,0); -putenv("TZ=UTC0"); - -txt.openerr="\7\r\nError opening %s for read.\r\n"; -txt.reading="\r\nReading %s..."; -txt.readit="\rRead %s "; -txt.allocerr="\7\r\nError allocating %u bytes of memory\r\n"; -txt.error="\7\r\nERROR: Offset %lu in %s\r\n\r\n"; - -p=getenv("SBBSNODE"); -if(p==NULL) { - printf("\7\nSBBSNODE environment variable not set.\n"); - exit(1); } -strcpy(node_dir,p); - -strupr(node_dir); - -if(node_dir[strlen(node_dir)-1]!='\\') - strcat(node_dir,"\\"); - -read_node_cfg(txt); -if(ctrl_dir[0]=='.') { /* Relative path */ - strcpy(str,ctrl_dir); - sprintf(ctrl_dir,"%s%s",node_dir,str); } -read_main_cfg(txt); -if(data_dir[0]=='.') { /* Relative path */ - strcpy(str,data_dir); - sprintf(data_dir,"%s%s",node_dir,str); } -read_msgs_cfg(txt); -sprintf(str,"%sUTI.LOG",data_dir); -if((logfile=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - printf("\7\nCan't open %s\n",str); - exit(-1); } -t=time(NULL); -tm=gmtime(&t); -sprintf(str,"%02u/%02u/%02u %02u:%02u:%02u %-8s %s \"" - ,tm->tm_mon+1,tm->tm_mday,TM_YEAR(tm->tm_year) - ,tm->tm_hour,tm->tm_min,tm->tm_sec - ,name,VER); -printf("\n\n"); -for(i=1;i<argc;i++) { - if(i>1) - strcat(str," "); - strcat(str,argv[i]); - printf("%s ",argv[i]); } -strcat(str,"\""); -write(logfile,str,strlen(str)); -write(logfile,"\r\n",2); -printf("\n\nWorking..."); -} diff --git a/src/sbbs2/uti/uti.h b/src/sbbs2/uti/uti.h deleted file mode 100644 index a5e0ba2786..0000000000 --- a/src/sbbs2/uti/uti.h +++ /dev/null @@ -1,14 +0,0 @@ -/* UTI.H */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -extern char scrnbuf[4000]; -extern struct text_info txtinfo; -extern int logfile; - -#define PREPSCREEN gettext(1,1,80,25,scrnbuf); gettextinfo(&txtinfo); \ - textattr(LIGHTGRAY); clrscr() - -#define VER "2.30" - -void uti_init(char *name,int argc, char **argv); diff --git a/src/sbbs2/uti/utiexprt.c b/src/sbbs2/uti/utiexprt.c deleted file mode 100644 index a5a44daf2b..0000000000 --- a/src/sbbs2/uti/utiexprt.c +++ /dev/null @@ -1,228 +0,0 @@ -/* UTIEXPRT.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "uti.h" -#include "post.h" - -char *nulstr=""; -smb_t smb; - -ulong loadmsgs(post_t huge **post, ulong ptr) -{ - int i; - long l=0; - idxrec_t idx; - - -if((i=smb_locksmbhdr(&smb))!=0) { /* Be sure noone deletes or */ - errormsg(WHERE,ERR_LOCK,smb.file,i); /* adds while we're reading */ - return(0L); } - -fseek(smb.sid_fp,0L,SEEK_SET); -while(!feof(smb.sid_fp)) { - if(!fread(&idx,sizeof(idxrec_t),1,smb.sid_fp)) - break; - - if(idx.number<ptr || idx.attr&MSG_DELETE) - continue; - - if(idx.attr&MSG_MODERATED && !(idx.attr&MSG_VALIDATED)) - break; - - if(((*post)=(post_t huge *)REALLOC((*post),sizeof(post_t)*(l+1))) - ==NULL) { - smb_unlocksmbhdr(&smb); - errormsg(WHERE,ERR_ALLOC,smb.file,sizeof(post_t)*(l+1)); - return(l); } - (*post)[l].offset=idx.offset; - (*post)[l].number=idx.number; - l++; } -smb_unlocksmbhdr(&smb); -return(l); -} - - -int main(int argc, char **argv) -{ - char str[512],*buf,ch,*outbuf; - ushort xlat; - int i,file,tear,cr,net=0,lzh; - uint subnum; - long l,m,length,buflen; - ulong msgnum,posts,exported=0; - FILE *stream; - post_t huge *post; - smbmsg_t msg; - struct date date; - struct time curtime; - -PREPSCREEN; - -printf("Synchronet UTIEXPRT v%s\n",VER); - -if(argc<3) - exit(1); - -if(argc>4 && !stricmp(argv[4],"/NETWORK")) - net=1; - -uti_init("UTIEXPRT",argc,argv); - -if((file=nopen(argv[3],O_CREAT|O_TRUNC|O_WRONLY))==-1) - bail(2); -if((stream=fdopen(file,"wb"))==NULL) - bail(2); -setvbuf(stream,0,_IOFBF,4096); - -subnum=getsubnum(argv[1]); -if((int)subnum==-1) - bail(7); -msgnum=atol(argv[2]); - -sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smb.retry_time=30; -if((i=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - bail(5); } - -post=NULL; -posts=loadmsgs(&post,msgnum); - -printf("\nExporting\n\n"); -for(l=0;l<posts;l++) { - printf("\rScanning: %lu of %lu Exported: %lu",l+1,posts,exported); - msg.idx.offset=post[l].offset; - if((i=smb_lockmsghdr(&smb,&msg))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); - continue; } - i=smb_getmsghdr(&smb,&msg); - if(i || msg.hdr.number!=post[l].number) { - smb_unlockmsghdr(&smb,&msg); - smb_freemsgmem(&msg); - - msg.hdr.number=post[l].number; - if((i=smb_getmsgidx(&smb,&msg))!=0) { - errormsg(WHERE,ERR_READ,smb.file,i); - continue; } - if((i=smb_lockmsghdr(&smb,&msg))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); - continue; } - if((i=smb_getmsghdr(&smb,&msg))!=0) { - smb_unlockmsghdr(&smb,&msg); - errormsg(WHERE,ERR_READ,smb.file,i); - continue; } } - - if(net /* Network */ - && (!strncmpi(msg.subj,"NE:",3) /* No Echo */ - || msg.from_net.type==NET_POSTLINK)) { /* from PostLink */ - smb_unlockmsghdr(&smb,&msg); - smb_freemsgmem(&msg); - continue; } /* From a Fido node, ignore it */ - - if(net && !(sub[subnum]->misc&SUB_GATE) && msg.from_net.type) { - smb_unlockmsghdr(&smb,&msg); - smb_freemsgmem(&msg); - continue; } - - exported++; - - fprintf(stream,"%s\r\n%s\r\n%s\r\n" - ,msg.to,msg.from,msg.subj); - unixtodos(msg.hdr.when_written.time,&date,&curtime); - fprintf(stream,"%lu\r\n%lu\r\n%02u/%02u/%02u\r\n%02u:%02u\r\n" - "%s\r\n%c\r\n%c\r\nTEXT:\r\n" - ,msg.hdr.number - ,msg.hdr.thread_orig - ,date.da_mon,date.da_day,TM_YEAR(date.da_year-1900) - ,curtime.ti_hour,curtime.ti_min - ,msg.hdr.attr&MSG_PRIVATE ? "PRIVATE" : "PUBLIC" - ,msg.hdr.attr&MSG_READ ? 'Y':'N' - ,strncmpi(msg.subj,"NE:",3) ? 'Y':'N'); - - for(i=0;i<msg.hdr.total_dfields;i++) { - - if(msg.dfield[i].type!=TEXT_BODY - && msg.dfield[i].type!=TEXT_TAIL) - continue; /* skip non-text data fields */ - - if(msg.dfield[i].length<3) /* need at least 3 bytes */ - continue; - - fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset,SEEK_SET); - - lzh=0; - fread(&xlat,2,1,smb.sdt_fp); - if(xlat==XLAT_LZH) { - lzh=1; - fread(&xlat,2,1,smb.sdt_fp); } - if(xlat!=XLAT_NONE) /* no translations supported */ - continue; - - length=msg.dfield[i].length-2; - if(lzh) - length-=2; - - if((buf=MALLOC(length))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,length); - continue; } - - fread(buf,length,1,smb.sdt_fp); - - if(lzh) { - buflen=*(long *)buf; - if((outbuf=MALLOC(buflen))==NULL) { - errormsg(WHERE,ERR_ALLOC,"lzh",buflen); - FREE(buf); - continue; } - length=lzh_decode(buf,length,outbuf); - FREE(buf); - buf=outbuf; } - - tear=0; - for(m=0,cr=1;m<length;m++) { - if(buf[m]==1) { /* Ctrl-A, so skip it and the next char */ - m++; - continue; } - if(buf[m]==0) /* Ignore line feeds */ - continue; - - if(m+3<length && cr && buf[m]=='-' && buf[m+1]=='-' - && buf[m+2]=='-' && (buf[m+3]==CR || buf[m+3]==SP)) - tear=1; - - if(buf[m]==LF) - cr=1; - else - cr=0; - - if(sub[subnum]->misc&SUB_ASCII) { - if(buf[m]<SP && buf[m]!=CR) /* Ctrl ascii */ - buf[m]='.'; /* converted to '.' */ - if((uchar)buf[m]>0x7f) /* extended ASCII */ - buf[m]='*'; } /* converted to '*' */ - fputc(buf[m],stream); } - fprintf(stream,"\r\n"); - FREE(buf); } - - if(!(sub[subnum]->misc&SUB_NOTAG)) { - if(!tear) /* No previous tear line */ - fprintf(stream,"---\r\n"); /* so add one */ - if(sub[subnum]->misc&SUB_ASCII) ch='*'; - else ch='�'; - fprintf(stream," %c Synchronet UTI v%s\r\n",ch,VER); } - - fprintf(stream,"\xff\r\n"); - smb_unlockmsghdr(&smb,&msg); - smb_freemsgmem(&msg); } - -sprintf(str,"%20s Scanned %lu, Exported %lu\r\n" - ,"",posts,exported); -write(logfile,str,strlen(str)); -printf("\nDone.\n"); -smb_close(&smb); -FREE(post); -bail(0); -return(0); -} diff --git a/src/sbbs2/uti/utihigh.c b/src/sbbs2/uti/utihigh.c deleted file mode 100644 index 49e29ebca0..0000000000 --- a/src/sbbs2/uti/utihigh.c +++ /dev/null @@ -1,86 +0,0 @@ -/* UTIHIGH.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "uti.h" - -smb_t smb; - -/****************************************************************************/ -/* Returns the total number of msgs in the sub-board and sets 'ptr' to the */ -/* number of the last message in the sub (0) if no messages. */ -/****************************************************************************/ -ulong getlastmsg(uint subnum, ulong *ptr, time_t *t) -{ - char str[256]; - int i; - ulong total; - idxrec_t idx; - -if(ptr) - (*ptr)=0; -if(t) - (*t)=0; - -sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smb.retry_time=30; -if((i=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - return(0); } - -if(!filelength(fileno(smb.sid_fp))) { /* Empty base */ - smb_close(&smb); - return(0); } -if((i=smb_locksmbhdr(&smb))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_LOCK,smb.file,i); - return(0); } -if((i=smb_getlastidx(&smb,&idx))!=0) { - smb_close(&smb); - errormsg(WHERE,ERR_READ,smb.file,i); - return(0); } -total=filelength(fileno(smb.sid_fp))/sizeof(idxrec_t); -smb_unlocksmbhdr(&smb); -smb_close(&smb); -if(ptr) - (*ptr)=idx.number; -if(t) - (*t)=idx.time; -return(total); -} - - -int main(int argc, char **argv) -{ - char str[256]; - int file,subnum,i; - ulong ptr; - -PREPSCREEN; - -printf("Synchronet UTIHIGH v%s\n",VER); - - -if(argc<3) - exit(1); - -uti_init("UTIHIGH",argc,argv); - -subnum=getsubnum(argv[1]); -if((int)subnum==-1) - bail(7); -getlastmsg(subnum,&ptr,0); - -if((file=nopen(argv[2],O_CREAT|O_TRUNC|O_WRONLY))==-1) - bail(2); - -sprintf(str,"%lu",ptr); -write(file,str,strlen(str)); -close(file); -sprintf(str,"%20s Last message #%lu\r\n","",ptr); -write(logfile,str,strlen(str)); -printf("\nDone.\n"); -bail(0); -return(0); -} diff --git a/src/sbbs2/uti/utiimprt.c b/src/sbbs2/uti/utiimprt.c deleted file mode 100644 index acfac0697e..0000000000 --- a/src/sbbs2/uti/utiimprt.c +++ /dev/null @@ -1,335 +0,0 @@ -/* UTIIMPRT.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "uti.h" -#include "crc32.h" - -smb_t smb; - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - - -#define PRIVATE 0 -#define PUBLIC 1 - -#define DEBUG 0 - - -char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec"}; - -void remove_re(char *str) -{ -while(!strnicmp(str,"RE:",3)) { - strcpy(str,str+3); - while(str[0]==SP) - strcpy(str,str+1); } -} - -/****************************************************************************/ -/* Converts a date string in format MM/DD/YY into unix time format */ -/****************************************************************************/ -time_t dstrtounix(char *str) -{ - struct time curtime; - struct date date; - -#if DEBUG -printf("\rdstrtounix "); -#endif - -curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0; -date.da_year=((str[6]&0xf)*10)+(str[7]&0xf); -if(date.da_year<Y2K_2DIGIT_WINDOW) - date.da_year+=100; -date.da_year+=1900; -date.da_mon=((str[0]&0xf)*10)+(str[1]&0xf); -date.da_day=((str[3]&0xf)*10)+(str[4]&0xf); -return(dostounix(&date,&curtime)); -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/* Called from upload */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==NULL) - return(1); -return(0); -} - -/****************************************************************************/ -/* This function reads files that are potentially larger than 32k. */ -/* Up to one megabyte of data can be read with each call. */ -/****************************************************************************/ -long lread(int file, char huge *buf,long bytes) -{ - long count; - -for(count=bytes;count>32767;count-=32767,buf+=32767) - if(read(file,(char *)buf,32767)!=32767) - return(-1L); -if(read(file,(char *)buf,(int)count)!=count) - return(-1L); -return(bytes); -} - - -int main(int argc, char **argv) -{ - char str[256],to[256],from[256],title[256],*p,*buf,*outbuf; - ushort xlat,net=0; - int i,j,file,lzh,storage; - uint subnum,imported=0; - ulong l,length,lzhlen,offset,crc; - FILE *stream; - smbmsg_t msg; - smbstatus_t status; - -PREPSCREEN; - -printf("Synchronet UTIIMPRT v%s\n",VER); - -if(argc<3) - exit(1); - -if((argc>3 && !stricmp(argv[3],"/NETWORK")) - || (argc>4 && !stricmp(argv[4],"/NETWORK"))) - net=NET_POSTLINK; - -uti_init("UTIIMPRT",argc,argv); - -if((file=nopen(argv[2],O_RDONLY))==-1) - bail(2); -if((stream=fdopen(file,"rb"))==NULL) - bail(2); - -subnum=getsubnum(argv[1]); -if((int)subnum==-1) - bail(7); - -sprintf(smb.file,"%s%s",sub[subnum]->data_dir,sub[subnum]->code); -smb.retry_time=30; -if((i=smb_open(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - bail(5); } - -if(filelength(fileno(smb.shd_fp))<1) { /* Create it if it doesn't exist */ - smb.status.max_crcs=sub[subnum]->maxcrcs; - smb.status.max_msgs=sub[subnum]->maxmsgs; - smb.status.max_age=sub[subnum]->maxage; - smb.status.attr=sub[subnum]->misc&SUB_HYPER ? SMB_HYPERALLOC : 0; - if((i=smb_create(&smb))!=0) { - errormsg(WHERE,ERR_CREATE,smb.file,i); - bail(5); } } - -printf("\r\nImporting "); - -while(!feof(stream) && !ferror(stream)) { - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=SMB_VERSION; - msg.hdr.when_imported.time=time(NULL); - msg.hdr.when_imported.zone=sys_timezone; - if(sub[subnum]->misc&SUB_AONLY) - msg.hdr.attr|=MSG_ANONYMOUS; - - if(!fgets(to,250,stream)) - break; - if(!fgets(from,250,stream)) - break; - if(!fgets(title,250,stream)) - break; - imported++; - printf("%-5u\b\b\b\b\b",imported); - truncsp(to); - truncsp(from); - truncsp(title); - - smb_hfield(&msg,RECIPIENT,strlen(to),to); - strlwr(to); - msg.idx.to=crc16(to); - - smb_hfield(&msg,SENDER,strlen(from),from); - strlwr(from); - msg.idx.from=crc16(from); - - if(net) - i=smb_hfield(&msg,SENDERNETTYPE,2,&net); - - i=smb_hfield(&msg,SUBJECT,strlen(title),title); - strlwr(title); - remove_re(title); - msg.idx.subj=crc16(title); - - fgets(str,128,stream); /* skip msg # */ - fgets(str,128,stream); /* ref # */ - msg.hdr.thread_orig=atol(str); - fgets(str,128,stream); /* date */ - msg.hdr.when_written.time=dstrtounix(str); - fgets(str,128,stream); /* time */ - msg.hdr.when_written.time+=atoi(str)*60*60; /* hours */ - p=strchr(str,':'); - if(p) - msg.hdr.when_written.time+=atoi(p+1)*60; /* mins */ - fgets(str,128,stream); /* private/public */ - if(!stricmp(str,"PRIVATE")) - msg.hdr.attr|=MSG_PRIVATE; - fgets(str,128,stream); /* Read? Y/N */ - if(toupper(str[0])=='Y') - msg.hdr.attr|=MSG_READ; - fgets(str,128,stream); /* Net? Y/N - ignore */ - if(toupper(str[0])=='Y') - msg.hdr.netattr|=MSG_TYPELOCAL; - while(!feof(stream) && !ferror(stream)) { - fgets(str,128,stream); - if(!strcmp(str,"TEXT:\r\n")) - break; } - - buf=NULL; - length=0; - crc=0xffffffff; - while(!feof(stream) && !ferror(stream)) { - fgets(str,128,stream); - if(!strcmp(str,"\xff\r\n")) /* end of text */ - break; - j=strlen(str); - if((buf=REALLOC(buf,length+j+1))==NULL) { - errormsg(WHERE,ERR_ALLOC,argv[1],length+j+1); - bail(3); } - if(sub[subnum]->maxcrcs) { - for(i=0;i<j;i++) - crc=ucrc32(str[i],crc); } - strcpy(buf+length,str); - length+=strlen(str); } - crc=~crc; - - if((i=smb_locksmbhdr(&smb))!=0) { - errormsg(WHERE,ERR_LOCK,smb.file,i); - bail(11); } - - if((i=smb_getstatus(&smb))!=0) { - errormsg(WHERE,ERR_READ,smb.file,i); - bail(12); } - - if(sub[subnum]->maxcrcs) { - i=smb_addcrc(&smb,crc); - if(i) { - printf("\nDuplicate message!\n"); - FREE(buf); - smb_unlocksmbhdr(&smb); - smb_freemsgmem(&msg); - continue; } } - - if(length>=2 && buf[length-1]==LF && buf[length-2]==CR) - length-=2; - if(length>=2 && buf[length-1]==LF && buf[length-2]==CR) - length-=2; - - lzh=0; - if(sub[subnum]->misc&SUB_LZH && length+2>=SDT_BLOCK_LEN) { - if((outbuf=(char *)MALLOC(length*2))==NULL) { - errormsg(WHERE,ERR_ALLOC,"lzh",length*2); - smb_unlocksmbhdr(&smb); - smb_freemsgmem(&msg); - bail(3); } - lzhlen=lzh_encode(buf,length,outbuf); - if(lzhlen>1 - && smb_datblocks(lzhlen+4) - <smb_datblocks(length+2)) { /* Compressable */ - length=lzhlen+2; - FREE(buf); - lzh=1; - buf=outbuf; } - else /* Uncompressable */ - FREE(outbuf); } - - length+=2; /* for translation string */ - - if(status.attr&SMB_HYPERALLOC) { - offset=smb_hallocdat(&smb); - storage=SMB_HYPERALLOC; } - else { - if((i=smb_open_da(&smb))!=0) { - errormsg(WHERE,ERR_OPEN,smb.file,i); - bail(5); } - if(sub[subnum]->misc&SUB_FAST) { - offset=smb_fallocdat(&smb,length,1); - storage=SMB_FASTALLOC; } - else { - offset=smb_allocdat(&smb,length,1); - storage=SMB_SELFPACK; } - fclose(smb.sda_fp); } - - msg.hdr.offset=offset; - - smb_dfield(&msg,TEXT_BODY,length); - - fseek(smb.sdt_fp,offset,SEEK_SET); - if(lzh) { - xlat=XLAT_LZH; - fwrite(&xlat,2,1,smb.sdt_fp); } - xlat=XLAT_NONE; - fwrite(&xlat,2,1,smb.sdt_fp); - j=SDT_BLOCK_LEN-2; /* Don't read/write more than 255 */ - if(lzh) - j-=2; - l=0; - length-=2; - if(lzh) - length-=2; - while(l<length) { - if(l+j>length) - j=length-l; - fwrite(buf+l,j,1,smb.sdt_fp); - l+=j; - j=SDT_BLOCK_LEN; } - fflush(smb.sdt_fp); - FREE(buf); - smb_unlocksmbhdr(&smb); - smb_addmsghdr(&smb,&msg,storage); - smb_freemsgmem(&msg); } - -sprintf(str,"%20s Imported %u\r\n","",imported); -write(logfile,str,strlen(str)); -printf("\nDone.\n"); -bail(0); -return(0); -} - diff --git a/src/sbbs2/uti/utilist.c b/src/sbbs2/uti/utilist.c deleted file mode 100644 index a880ba429b..0000000000 --- a/src/sbbs2/uti/utilist.c +++ /dev/null @@ -1,37 +0,0 @@ -/* UTILIST.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "uti.h" - -int main(int argc, char **argv) -{ - char str[256]; - int i,j,file; - -PREPSCREEN; - -printf("Synchronet UTILIST v%s\n",VER); - -if(argc<2) - exit(1); - -uti_init("UTILIST",argc,argv); - -if((file=nopen(argv[1],O_CREAT|O_TRUNC|O_WRONLY))==-1) - exit(2); - -for(j=0;j<total_grps;j++) - for(i=0;i<total_subs;i++) { - if(sub[i]->grp!=j) - continue; - sprintf(str,"%s\r\n%s\r\n",sub[i]->code,sub[i]->code); - write(file,str,strlen(str)); - sprintf(str,"%s\r\n",sub[i]->lname); - write(file,str,strlen(str)); } -close(file); -printf("\nDone.\n"); -bail(0); -return(0); -} diff --git a/src/sbbs2/uti/utilstrd.c b/src/sbbs2/uti/utilstrd.c deleted file mode 100644 index 1c8bf05222..0000000000 --- a/src/sbbs2/uti/utilstrd.c +++ /dev/null @@ -1,86 +0,0 @@ -/* UTILSTRD.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" -#include "uti.h" - -#define READ 1 -#define WRITE 2 - -int main(int argc, char **argv) -{ - char *p,str[256],name[256],mode=0; - int i,file; - uint usernumber; - time_t ptr; - FILE *stream; - -PREPSCREEN; - -printf("Synchronet UTILSTRD v%s\n",VER); - -if(argc<4) - exit(1); - -if(!stricmp(argv[1],"READ")) - mode=READ; -else if(!stricmp(argv[1],"WRITE")) - mode=WRITE; -if(!mode) - exit(1); - -uti_init("UTILSTRD",argc,argv); - -if(mode==READ) { - if((file=nopen(argv[2],O_CREAT|O_TRUNC|O_WRONLY))==-1) - exit(2); } -else { - if((file=nopen(argv[2],O_RDONLY))==-1) - exit(2); } - -if((stream=fdopen(file,"wb"))==NULL) - exit(2); - - -strcpy(name,argv[3]); /* build the user name */ -for(i=4;i<argc;i++) { - strcat(name," "); - strcat(name,argv[i]); } - -sprintf(str,"%sUSER\\NAME.DAT",data_dir); -if((file=nopen(str,O_RDONLY))==-1) - exit(8); - -usernumber=1; -while(!eof(file)) { - read(file,str,LEN_ALIAS+2); - str[25]=0; - p=strchr(str,3); - if(p) *p=0; - if(!stricmp(str,name)) - break; - usernumber++; } -if(stricmp(str,name)) { - printf("Username '%s' not found.\n",name); - exit(9); } -close(file); - -sprintf(str,"%sUSER\\PTRS\\%4.4u.IXB",data_dir,usernumber); -if((file=nopen(str,mode==READ ? O_RDONLY : O_WRONLY|O_CREAT))==-1) - exit(10); -for(i=0;i<total_subs;i++) { - lseek(file,((long)sub[i]->ptridx)*10L,SEEK_SET); - if(mode==READ) { - read(file,&ptr,4); - fprintf(stream,"%lu\r\n",ptr); } - else { - fgets(str,81,stream); - ptr=atol(str); - write(file,&ptr,4); } } -close(file); -printf("\nDone.\n"); -bail(0); -return(0); -} - diff --git a/src/sbbs2/uti/utiver.c b/src/sbbs2/uti/utiver.c deleted file mode 100644 index 6f0111f25b..0000000000 --- a/src/sbbs2/uti/utiver.c +++ /dev/null @@ -1,26 +0,0 @@ -/* UTIVER.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <stdio.h> -#include <conio.h> -#include <io.h> -#include <fcntl.h> -#include <sys/stat.h> -#include "uti.h" - -int main(int argc, char **argv) -{ - char str[1024]; - int file; - -sprintf(str,"2\r\nSynchronet UTI Driver v%s - " - "Developed 1995-1997 Rob Swindell\r\n",VER); -if(argc<2) - exit(1); -if((file=open(argv[1],O_WRONLY|O_CREAT|O_TRUNC,S_IWRITE))==-1) - exit(2); -write(file,str,strlen(str)); -close(file); -return(0); -} diff --git a/src/sbbs2/vars.c b/src/sbbs2/vars.c deleted file mode 100644 index 5fb3e2bc22..0000000000 --- a/src/sbbs2/vars.c +++ /dev/null @@ -1,154 +0,0 @@ -/* VARS.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/*************************************************************/ -/* External (Global/Public) Variables for use only with SBBS */ -/*************************************************************/ - -#include <stdio.h> -#include <dos.h> - -#ifndef GLOBAL -#define GLOBAL -unsigned _stklen=22000; /* Set stack size in code, not header */ - /* 20k, NOT enough */ -#endif - -#include "sbbsdefs.h" -#include "smbdefs.h" -#include "text.h" - -GLOBAL char *envp[128]; /* Original environment */ - -GLOBAL char menu_dir[128]; /* Over-ride default menu dir */ -GLOBAL char menu_file[128]; /* Over-ride menu file */ - -GLOBAL user_t useron; /* User currently online */ -GLOBAL node_t thisnode; /* Node information */ -GLOBAL smb_t smb; /* Currently open message base */ - - /* Batch download queue */ -GLOBAL char **batdn_name; /* Filenames */ -GLOBAL ushort *batdn_alt; /* Alternate path */ -GLOBAL uint *batdn_dir, /* Directory for each file */ - batdn_total; /* Total files */ -GLOBAL long *batdn_offset; /* Offset for data */ -GLOBAL ulong *batdn_size; /* Size of file in bytes */ -GLOBAL ulong *batdn_cdt; /* Credit value of file */ - - /* Batch upload queue */ -GLOBAL char **batup_desc, /* Description for each file */ - **batup_name, /* Filenames */ - *batup_misc; /* Miscellaneous bits */ -GLOBAL ushort *batup_alt; /* Alternate path */ -GLOBAL uint *batup_dir, /* Directory for each file */ - batup_total; /* Total files */ - -/*********************************/ -/* Color Configuration Variables */ -/*********************************/ -GLOBAL char *text[TOTAL_TEXT]; /* Text from CTRL\TEXT.DAT */ -GLOBAL char *text_sav[TOTAL_TEXT]; /* Text from CTRL\TEXT.DAT */ -GLOBAL int directvideo; /* Turbo C's video flag - direct or bios */ -GLOBAL char qoc; /* Quit after one caller */ -GLOBAL long freedosmem; /* Amount of free DOS memory */ -GLOBAL char orgcmd[129]; /* Original command to execute bbs */ -GLOBAL char dszlog[127]; /* DSZLOG enviornment variable */ -GLOBAL char debug; /* Flag to allow debug writes */ -GLOBAL int keybuftop,keybufbot; /* Keyboard input buffer pointers */ -GLOBAL char keybuf[KEY_BUFSIZE]; /* Keyboard input buffer */ -GLOBAL char connection[LEN_MODEM+1];/* Connection Description */ -GLOBAL ulong cur_rate; /* Current Connection (DCE) Rate */ -GLOBAL ulong cur_cps; /* Current Average Transfer CPS */ -GLOBAL ulong dte_rate; /* Current COM Port (DTE) Rate */ -GLOBAL time_t timeout; /* User inactivity timeout reference */ -GLOBAL char timeleft_warn; /* low timeleft warning flag */ -GLOBAL char curatr; /* Current Text Attributes Always */ -GLOBAL long lncntr; /* Line Counter - for PAUSE */ -GLOBAL long tos; /* Top of Screen */ -GLOBAL long rows; /* Current Rows for User */ -GLOBAL long autoterm; /* Autodetected terminal type */ -GLOBAL char slbuf[SAVE_LINES][LINE_BUFSIZE+1]; /* Saved for redisplay */ -GLOBAL char slatr[SAVE_LINES]; /* Starting attribute of each line */ -GLOBAL char slcnt; /* Number of lines currently saved */ -GLOBAL char lbuf[LINE_BUFSIZE+1];/* Temp storage for each line output */ -GLOBAL int lbuflen; /* Number of characters in line buffer */ -GLOBAL char latr; /* Starting attribute of line buffer */ -GLOBAL ulong console; /* Defines current Console settings */ -GLOBAL char tmp[256]; /* Used all over as temp string */ -GLOBAL char *nulstr; /* Null string pointer */ -GLOBAL char *crlf; /* CRLF string pointer */ -GLOBAL char wordwrap[81]; /* Word wrap buffer */ -GLOBAL time_t now, /* Used to store current time in Unix format */ - answertime, /* Time call was answered */ - logontime, /* Time user logged on */ - starttime, /* Time stamp to use for time left calcs */ - ns_time, /* File new-scan time */ - last_ns_time; /* Most recent new-file-scan this call */ -GLOBAL uchar action; /* Current action of user */ -GLOBAL char statline; /* Current Status Line number */ -GLOBAL long online; /* Remote/Local or not online */ -GLOBAL long sys_status; /* System Status */ -GLOBAL char *sub_misc; /* Save misc and ptrs for subs */ -GLOBAL ulong *sub_ptr; /* for fast pointer update */ -GLOBAL ulong *sub_last; /* last read message pointer */ - -GLOBAL ulong logon_ulb, /* Upload Bytes This Call */ - logon_dlb, /* Download Bytes This Call */ - logon_uls, /* Uploads This Call */ - logon_dls, /* Downloads This Call */ - logon_posts, /* Posts This Call */ - logon_emails, /* Emails This Call */ - logon_fbacks; /* Feedbacks This Call */ -GLOBAL uchar logon_ml; /* ML of the user apon logon */ - -GLOBAL int node_disk; /* Number of Node's disk */ -GLOBAL uint main_cmds; /* Number of Main Commands this call */ -GLOBAL uint xfer_cmds; /* Number of Xfer Commands this call */ -GLOBAL ulong posts_read; /* Number of Posts read this call */ -GLOBAL char temp_uler[31]; /* User who uploaded the files to temp dir */ -GLOBAL char temp_file[41]; /* Origin of extracted temp files */ -GLOBAL long temp_cdt; /* Credit value of file that was extracted */ -GLOBAL char autohang; /* Used for auto-hangup after transfer */ -GLOBAL char cap_fname[41]; /* Capture filename - default is CAPTURE.TXT */ -GLOBAL FILE *capfile; /* File string to use for capture file */ -GLOBAL int inputfile; /* File handle to use for input */ -GLOBAL int logfile; /* File handle for node.log */ -GLOBAL int nodefile; /* File handle for node.dab */ -GLOBAL int node_ext; /* File handle for node.exb */ -GLOBAL char logcol; /* Current column of log file */ -GLOBAL uint criterrs; /* Critical error counter */ -GLOBAL struct date date; /* Used for DOS compatible date pointer */ -GLOBAL struct time curtime; /* Used for DOS compatible time pointer */ - -GLOBAL uint curgrp, /* Current group */ - *cursub, /* Current sub-board for each group */ - curlib, /* Current library */ - *curdir; /* Current directory for each library */ -GLOBAL uint *usrgrp, /* Real group numbers */ - usrgrps; /* Number groups this user has access to */ -GLOBAL uint *usrlib, /* Real library numbers */ - usrlibs; /* Number of libs this user can access */ -GLOBAL uint **usrsub, /* Real sub numbers */ - *usrsubs; /* Num of subs with access for each grp */ -GLOBAL uint **usrdir, /* Real dir numbers */ - *usrdirs; /* Num of dirs with access for each lib */ -GLOBAL int cursubnum; /* For ARS */ -GLOBAL int curdirnum; /* For ARS */ -GLOBAL long timeleft; /* Number of seconds user has left online */ -GLOBAL uchar sbbsnode[81]; /* Environment var to contain node dir path */ -GLOBAL uchar sbbsnnum[81]; /* Environment var to contain node num */ -GLOBAL char *comspec; /* Pointer to environment variable COMSPEC */ -GLOBAL ushort altul; /* Upload to alternate path flag */ -GLOBAL uint inDV; /* DESQview version, or 0 if not under DV */ -GLOBAL uchar lastnodemsg; /* Number of node last message was sent to */ -GLOBAL char color[TOTAL_COLORS]; /* Different colors for the BBS */ -GLOBAL time_t next_event; /* Next event time - from front-end */ -GLOBAL char lastuseron[LEN_ALIAS+1]; /* Name of user last online */ -GLOBAL char cid[LEN_CID+1]; /* Caller ID of current caller */ -GLOBAL uint emshandle; /* EMS handle for overlay swap */ -GLOBAL char emsver; /* Version of EMS installed */ -GLOBAL char *noaccess_str; /* Why access was denied via ARS */ -GLOBAL long noaccess_val; /* Value of parameter not met in ARS */ -GLOBAL int errorlevel; /* Error level of external program */ diff --git a/src/sbbs2/ver.c b/src/sbbs2/ver.c deleted file mode 100644 index caac3f66c7..0000000000 --- a/src/sbbs2/ver.c +++ /dev/null @@ -1,91 +0,0 @@ -/* VER.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include <dos.h> -#include "sbbs.h" -#include "riolib.h" -#include "riodefs.h" -#include "etext.h" - -extern uint inDV; -extern uint asmrev; -extern uint emshandle; -extern char emsver; - -char *compile_time=__TIME__,*compile_date=__DATE__; - -char *decrypt(ulong [], char *str); - -void ver() -{ - char str[128],tmp[128]; - int i; - -i=rioctl(FIFOCTL); -CRLF; -#if defined(__OS2__) -strcpy(str,decrypt(VersionNoticeOS2,0)); -#elif defined(__WIN32__) -strcpy(str,decrypt(VersionNoticeW32,0)); -#else -strcpy(str,decrypt(VersionNoticeDOS,0)); -#endif -center(str); -CRLF; - -sprintf(str,"Revision %c%s %s %.5s " -#ifdef __FLAT__ - "RIOLIB %u.%02u" -#else - "RCIOL %u" -#endif - " SMBLIB %s BCC %X.%02X" - ,REVISION,BETA,compile_date,compile_time -#ifdef __FLAT__ - ,rioctl(GVERS)/100,rioctl(GVERS)%100 -#else - ,rioctl(GVERS) -#endif - ,smb_lib_ver() - ,__BORLANDC__>>8 - ,__BORLANDC__&0xff); -center(str); -CRLF; - -center(decrypt(CopyrightAddress,0)); -CRLF; - -#if defined(__OS2__) - -sprintf(str,"OS/2 %u.%u (%u.%u)",_osmajor/10,_osminor/10,_osmajor,_osminor); - -#elif defined(__WIN32__) - -sprintf(str,"Win32 %u.%02u",_osmajor,_osminor); - -#else /* DOS */ - -sprintf(str,"DOS %u.%02u",_osmajor,_osminor); -if(inDV) { - sprintf(tmp," DESQview %u.%02u",inDV>>8,inDV&0xff); - strcat(str,tmp); } -if(emsver) { - sprintf(tmp," EMS %u.%u",(emsver&0xf0)>>4,emsver&0xf); - strcat(str,tmp); - if(emshandle!=0xffff) - strcat(str," (overlay)"); } - -#endif - -if(i&0xc0) { - strcat(str," 16550 UART"); - if(i&0xc) - strcat(str," FIFO"); } -#if DEBUG - i=open("NODE.CFG",0); - bprintf(" Files (%d)",i); - close(i); -#endif -center(str); -} diff --git a/src/sbbs2/viewfile.c b/src/sbbs2/viewfile.c deleted file mode 100644 index 24c234f674..0000000000 --- a/src/sbbs2/viewfile.c +++ /dev/null @@ -1,73 +0,0 @@ -#line 1 "VIEWFILE.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -void viewfilecontents(file_t f) -{ - char str[128],cmd[128]; - int i; - -if(f.size<=0L) { - bputs(text[FileNotThere]); - return; } - -sprintf(str,"%s%s",f.altpath > 0 && f.altpath<=altpaths - ? altpath[f.altpath-1] : dir[f.dir]->path - ,unpadfname(f.name,tmp)); -strcpy(tmp,f.name); -truncsp(tmp); -for(i=0;i<total_fviews;i++) { - if(!stricmp(tmp+9,fview[i]->ext) - && chk_ar(fview[i]->ar,useron)) { - strcpy(cmd,fview[i]->cmd); - break; } } -if(i==total_fviews) - bprintf(text[NonviewableFile],tmp+9); -else - if((i=external(cmdstr(cmd,str,str,NULL) - ,EX_OUTL|EX_OUTR|EX_INR|EX_CC))!=0) - errormsg(WHERE,ERR_EXEC,cmdstr(cmd,str,str,NULL),i); -} - -/****************************************************************************/ -/* Views file with: */ -/* (B)atch download, (V)iew file (E)xtended info, (Q)uit, or [Next]: */ -/* call with ext=1 for default to extended info, or 0 for file view */ -/* Returns -1 for Batch, 1 for Next, or 0 for Quit */ -/****************************************************************************/ -int viewfile(file_t f, int ext) -{ - char ch,str[256]; - int i; - -curdirnum=f.dir; /* for ARS */ -while(online) { - if(ext) - fileinfo(f); - else - viewfilecontents(f); - ASYNC; - CRLF; - sprintf(str,text[FileInfoPrompt],unpadfname(f.name,tmp)); - mnemonics(str); - ch=getkeys("BEVQ\r",0); - if(ch=='Q' || sys_status&SS_ABORT) - return(0); - switch(ch) { - case 'B': - addtobatdl(f); - CRLF; - return(-1); - case 'E': - ext=1; - continue; - case 'V': - ext=0; - continue; - case CR: - return(1); } } -return(0); -} - diff --git a/src/sbbs2/xfer_hi.c b/src/sbbs2/xfer_hi.c deleted file mode 100644 index 78e8f36bc7..0000000000 --- a/src/sbbs2/xfer_hi.c +++ /dev/null @@ -1,1516 +0,0 @@ -#line 1 "XFER_HI.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -uint temp_dirnum; - -/****************************************************************************/ -/* Uploads files */ -/****************************************************************************/ -void upload(uint dirnum) -{ - static char lastdesc[59]; - uchar str[256],src[256]={""},descbeg[25]={""},descend[25]={""},path[256] - ,fname[13],keys[256],ch,*p; - time_t start,end; - int i,j,file,destuser[MAX_USERXFER],destusers=0; - uint k; - file_t f; - struct dfree d; - user_t user; - node_t node; - -if(sys_status&SS_EVENT && online==ON_REMOTE && !dir_op(dirnum)) - bprintf(text[UploadBeforeEvent],timeleft/60); -if(altul) - strcpy(path,altpath[altul-1]); -else - strcpy(path,dir[dirnum]->path); -if(path[1]==':') - i=path[0]-'A'+1; -else i=0; -getdfree(i,&d); -if(d.df_sclus==0xffff) - errormsg(WHERE,ERR_CHK,path,0); -if((ulong)d.df_bsec*(ulong)d.df_sclus - *(ulong)d.df_avail<(ulong)min_dspace*1024L) { - bputs(text[LowDiskSpace]); - sprintf(str,"Diskspace is low: %s",path); - errorlog(str); - if(!dir_op(dirnum)) - return; } -bprintf(text[DiskNBytesFree],ultoac((ulong)d.df_bsec - *(ulong)d.df_sclus*(ulong)d.df_avail,tmp)); -f.dir=curdirnum=dirnum; -f.misc=0; -f.altpath=altul; -bputs(text[Filename]); -if(!getstr(fname,12,K_UPPER) || strchr(fname,'?') || strchr(fname,'*') - || !checkfname(fname) || (trashcan(fname,"FILE") && !dir_op(dirnum))) { - if(fname[0]) - bputs(text[BadFilename]); - return; } -if(dirnum==sysop_dir) - sprintf(str,text[UploadToSysopDirQ],fname); -else if(dirnum==user_dir) - sprintf(str,text[UploadToUserDirQ],fname); -else - sprintf(str,text[UploadToCurDirQ],fname,lib[dir[dirnum]->lib]->sname - ,dir[dirnum]->sname); -if(!yesno(str)) return; -action=NODE_ULNG; -padfname(fname,f.name); -sprintf(str,"%s%s",path,fname); -if(fexist(str)) { /* File is on disk */ - if(!dir_op(dirnum) && online!=ON_LOCAL) { /* local users or sysops */ - bprintf(text[FileAlreadyThere],fname); - return; } - if(!yesno(text[FileOnDiskAddQ])) - return; } -else if(online==ON_LOCAL) { - bputs(text[FileNotOnDisk]); - bputs(text[EnterPath]); - if(!getstr(tmp,60,K_LINE|K_UPPER)) - return; - backslash(tmp); - sprintf(src,"%s%s",tmp,fname); } -strcpy(str,dir[dirnum]->exts); -strcpy(tmp,f.name); -truncsp(tmp); -j=strlen(str); -for(i=0;i<j;i+=ch+1) { /* Check extension of upload with allowable exts */ - p=strchr(str+i,','); - if(p!=NULL) - *p=0; - ch=strlen(str+i); - if(!strcmp(tmp+9,str+i)) - break; } -if(j && i>=j) { - bputs(text[TheseFileExtsOnly]); - bputs(dir[dirnum]->exts); - CRLF; - if(!dir_op(dirnum)) return; } -bputs(text[SearchingForDupes]); -for(i=k=0;i<usrlibs;i++) - for(j=0;j<usrdirs[i];j++,k++) { - outchar('.'); - if(k && !(k%5)) - bputs("\b\b\b\b\b \b\b\b\b\b"); - if((usrdir[i][j]==dirnum || dir[usrdir[i][j]]->misc&DIR_DUPES) - && findfile(usrdir[i][j],f.name)) { - bputs(text[SearchedForDupes]); - bprintf(text[FileAlreadyOnline],f.name); - if(!dir_op(dirnum)) - return; /* File is in database for another dir */ - if(usrdir[i][j]==dirnum) - return; } } /* don't allow duplicates */ -bputs(text[SearchedForDupes]); -if(dirnum==user_dir) { /* User to User transfer */ - bputs(text[EnterAfterLastDestUser]); - while((!dir_op(dirnum) && destusers<max_userxfer) || destusers<MAX_USERXFER) { - bputs(text[SendFileToUser]); - if(!getstr(str,LEN_ALIAS,K_UPRLWR)) - break; - if((user.number=finduser(str))!=0) { - if(!dir_op(dirnum) && user.number==useron.number) { - bputs(text[CantSendYourselfFiles]); - continue; } - for(i=0;i<destusers;i++) - if(user.number==destuser[i]) - break; - if(i<destusers) { - bputs(text[DuplicateUser]); - continue; } - getuserdat(&user); - if((user.rest&(FLAG('T')|FLAG('D'))) - || !chk_ar(lib[dir[user_dir]->lib]->ar,user) - || !chk_ar(dir[user_dir]->dl_ar,user)) { - bprintf(text[UserWontBeAbleToDl],user.alias); } - else { - bprintf(text[UserAddedToDestList],user.alias); - destuser[destusers++]=user.number; } } - else { - CRLF; } } - if(!destusers) - return; } -if(dir[dirnum]->misc&DIR_RATE) { - SYNC; - bputs(text[RateThisFile]); - ch=getkey(K_ALPHA); - if(!isalpha(ch) || sys_status&SS_ABORT) - return; - CRLF; - sprintf(descbeg,text[Rated],toupper(ch)); } -if(dir[dirnum]->misc&DIR_ULDATE) { - now=time(NULL); - if(descbeg[0]) - strcat(descbeg," "); - sprintf(str,"%s ",unixtodstr(now,tmp)); - strcat(descbeg,str); } -if(dir[dirnum]->misc&DIR_MULT) { - SYNC; - if(!noyes(text[MultipleDiskQ])) { - bputs(text[HowManyDisksTotal]); - if((i=getnum(99))<2) - return; - bputs(text[NumberOfFile]); - if((j=getnum(i))<1) - return; - if(j==1) - lastdesc[0]=0; - if(i>9) - sprintf(descend,text[FileOneOfTen],j,i); - else - sprintf(descend,text[FileOneOfTwo],j,i); } - else - lastdesc[0]=0; } -else - lastdesc[0]=0; -bputs(text[EnterDescNow]); -i=LEN_FDESC-(strlen(descbeg)+strlen(descend)); -getstr(lastdesc,i,K_LINE|K_EDIT|K_AUTODEL); -if(sys_status&SS_ABORT) - return; -if(descend[0]) /* end of desc specified, so pad desc with spaces */ - sprintf(f.desc,"%s%-*s%s",descbeg,i,lastdesc,descend); -else /* no end specified, so string ends at desc end */ - sprintf(f.desc,"%s%s",descbeg,lastdesc); - -if(dir[dirnum]->misc&DIR_ANON && !(dir[dirnum]->misc&DIR_AONLY) - && (dir_op(dirnum) || useron.exempt&FLAG('A'))) { - if(!noyes(text[AnonymousQ])) - f.misc|=FM_ANON; } -sprintf(str,"%s%s",path,fname); -if(src[0]) { /* being copied from another local dir */ - bprintf(text[RetrievingFile],fname); - if(mv(src,str,1)) - return; - CRLF; } -if(fexist(str)) { /* File is on disk */ - if(!uploadfile(&f)) - return; } -else { - menu("ULPROT"); - SYNC; - strcpy(keys,"Q"); - if(dirnum==user_dir || !max_batup) /* no batch user to user xfers */ - mnemonics(text[ProtocolOrQuit]); - else { - mnemonics(text[ProtocolBatchOrQuit]); - strcat(keys,"B"); } - for(i=0;i<total_prots;i++) - if(prot[i]->ulcmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(keys,tmp); } - ch=getkeys(keys,0); - if(ch=='Q') - return; - if(ch=='B') { - if(batup_total>=max_batup) - bputs(text[BatchUlQueueIsFull]); - else { - for(i=0;i<batup_total;i++) - if(!strcmp(batup_name[i],f.name)) { - bprintf(text[FileAlreadyInQueue],f.name); - return; } - strcpy(batup_name[batup_total],f.name); - strcpy(batup_desc[batup_total],f.desc); - batup_dir[batup_total]=dirnum; - batup_misc[batup_total]=f.misc; - batup_alt[batup_total]=altul; - batup_total++; - bprintf(text[FileAddedToUlQueue] - ,f.name,batup_total,max_batup); } } - else { - for(i=0;i<total_prots;i++) - if(prot[i]->ulcmd[0] && prot[i]->mnemonic==ch - && chk_ar(prot[i]->ar,useron)) - break; - if(i<total_prots) { - start=time(NULL); - protocol(cmdstr(prot[i]->ulcmd,str,nulstr,NULL),0); - end=time(NULL); - if(!(dir[dirnum]->misc&DIR_ULTIME)) /* Don't deduct upload time */ - starttime+=end-start; - ch=uploadfile(&f); - autohangup(); - if(!ch) /* upload failed, don't process user to user xfer */ - return; } } } -if(dirnum==user_dir) { /* Add files to XFER.IXT in INDX dir */ - sprintf(str,"%sXFER.IXT",data_dir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); - return; } - for(j=0;j<destusers;j++) { - for(i=1;i<=sys_nodes;i++) { /* Tell user, if online */ - getnodedat(i,&node,0); - if(node.useron==destuser[j] && !(node.misc&NODE_POFF) - && (node.status==NODE_INUSE || node.status==NODE_QUIET)) { - sprintf(str,text[UserToUserXferNodeMsg],node_num,useron.alias); - putnmsg(i,str); - break; } } - if(i>sys_nodes) { /* User not online */ - sprintf(str,text[UserSentYouFile],useron.alias); - putsmsg(destuser[j],str); } - sprintf(str,"%4.4u %12.12s %4.4u\r\n" - ,destuser[j],f.name,useron.number); - write(file,str,strlen(str)); } - close(file); } -} - -/****************************************************************************/ -/* Checks directory for 'dir' and prompts user to enter description for */ -/* the files that aren't in the database. */ -/* Returns 1 if the user aborted, 0 if not. */ -/****************************************************************************/ -char bulkupload(uint dirnum) -{ - char done,str[256]; - struct ffblk ff; - file_t f; - -memset(&f,0,sizeof(file_t)); -f.dir=dirnum; -f.altpath=altul; -bprintf(text[BulkUpload],lib[dir[dirnum]->lib]->sname,dir[dirnum]->sname); -sprintf(str,"%s*.*",altul>0 && altul<=altpaths ? altpath[altul-1] - : dir[dirnum]->path); -done=findfirst(str,&ff,0); -action=NODE_ULNG; -SYNC; -while(!done && !msgabort()) { - if(gettotalfiles(dirnum)>dir[dirnum]->maxfiles) { - bputs(text[DirFull]); - return(0); } - strupr(ff.ff_name); - padfname(ff.ff_name,str); - if(findfile(f.dir,str)==0) { - strcpy(f.name,str); - f.cdt=ff.ff_fsize; - bprintf(text[BulkUploadDescPrompt],f.name,f.cdt); - getstr(f.desc,LEN_FDESC,K_LINE); - if(sys_status&SS_ABORT) - return(1); - uploadfile(&f); } /* used to abort here if the file failed upload */ - done=findnext(&ff); } -return(0); -} - - - -/****************************************************************************/ -/* This is the batch menu section */ -/****************************************************************************/ -void batchmenu() -{ - char str[129],tmp2[250],done=0,ch; - uint i,j,xfrprot,xfrdir; - ulong totalcdt,totalsize,totaltime; - time_t start,end; - int file,n; - file_t f; - -if(!batdn_total && !batup_total && upload_dir==INVALID_DIR) { - bputs(text[NoFilesInBatchQueue]); - return; } -if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT)) - menu("BATCHXFR"); -lncntr=0; -while(online && !done && (batdn_total || batup_total - || upload_dir!=INVALID_DIR)) { - if(!(useron.misc&(EXPERT|RIP|WIP))) { - sys_status&=~SS_ABORT; - if(lncntr) { - SYNC; - CRLF; - if(lncntr) /* CRLF or SYNC can cause pause */ - pause(); } - menu("BATCHXFR"); } - ASYNC; - bputs(text[BatchMenuPrompt]); - ch=getkeys("BCDLQRU?\r",0); - if(ch>SP) - logch(ch,0); - switch(ch) { - case '?': - if(useron.misc&(EXPERT|RIP|WIP)) - menu("BATCHXFR"); - break; - case CR: - case 'Q': - lncntr=0; - done=1; - break; - case 'B': /* Bi-directional transfers */ - if(useron.rest&FLAG('D')) { - bputs(text[R_Download]); - break; } - if(useron.rest&FLAG('U')) { - bputs(text[R_Upload]); - break; } - if(!batdn_total) { - bputs(text[DownloadQueueIsEmpty]); - break; } - if(!batup_total && upload_dir==INVALID_DIR) { - bputs(text[UploadQueueIsEmpty]); - break; } - for(i=0,totalcdt=0;i<batdn_total;i++) - totalcdt+=batdn_cdt[i]; - if(!(useron.exempt&FLAG('D')) - && totalcdt>useron.cdt+useron.freecdt) { - bprintf(text[YouOnlyHaveNCredits] - ,ultoac(useron.cdt+useron.freecdt,tmp)); - break; } - for(i=0,totalsize=totaltime=0;i<batdn_total;i++) { - totalsize+=batdn_size[i]; - if(!(dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps) - totaltime+=batdn_size[i]/(ulong)cur_cps; } - if(!(useron.exempt&FLAG('T')) && !SYSOP && totaltime>timeleft) { - bputs(text[NotEnoughTimeToDl]); - break; } - menu("BIPROT"); - if(!create_batchdn_lst()) - break; - if(!create_batchup_lst()) - break; - if(!create_bimodem_pth()) - break; - SYNC; - mnemonics(text[ProtocolOrQuit]); - strcpy(tmp2,"Q"); - for(i=0;i<total_prots;i++) - if(prot[i]->bicmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(tmp2,tmp); } - ungetkey(useron.prot); - ch=getkeys(tmp2,0); - if(ch=='Q') - break; - for(i=0;i<total_prots;i++) - if(prot[i]->bicmd[0] && prot[i]->mnemonic==ch - && chk_ar(prot[i]->ar,useron)) - break; - if(i<total_prots) { - xfrprot=i; - action=NODE_BXFR; - SYNC; - for(i=0;i<batdn_total;i++) - if(dir[batdn_dir[i]]->seqdev) { - lncntr=0; - unpadfname(batdn_name[i],tmp); - sprintf(tmp2,"%s%s",temp_dir,tmp); - if(!fexist(tmp2)) { - seqwait(dir[batdn_dir[i]]->seqdev); - bprintf(text[RetrievingFile],tmp); - sprintf(str,"%s%s" - ,batdn_alt[i]>0 && batdn_alt[i]<=altpaths - ? altpath[batdn_alt[i]-1] - : dir[batdn_dir[i]]->path - ,tmp); - mv(str,tmp2,1); /* copy the file to temp dir */ - getnodedat(node_num,&thisnode,1); - thisnode.aux=0xff; - putnodedat(node_num,thisnode); - CRLF; } } - sprintf(str,"%sBATCHDN.LST",node_dir); - sprintf(tmp2,"%sBATCHUP.LST",node_dir); - start=time(NULL); - protocol(cmdstr(prot[xfrprot]->bicmd,str,tmp2,NULL),0); - end=time(NULL); - for(i=0;i<batdn_total;i++) - if(dir[batdn_dir[i]]->seqdev) { - unpadfname(batdn_name[i],tmp); - sprintf(tmp2,"%s%s",temp_dir,tmp); - remove(tmp2); } - batch_upload(); - batch_download(xfrprot); - if(batdn_total) /* files still in queue, not xfered */ - notdownloaded(totalsize,start,end); - autohangup(); } - break; - case 'C': - if(batup_total) { - if(!noyes(text[ClearUploadQueueQ])) { - batup_total=0; - bputs(text[UploadQueueCleared]); } } - if(batdn_total) { - if(!noyes(text[ClearDownloadQueueQ])) { - for(i=0;i<batdn_total;i++) { - f.dir=batdn_dir[i]; - f.datoffset=batdn_offset[i]; - f.size=batdn_size[i]; - strcpy(f.name,batdn_name[i]); - closefile(f); } - batdn_total=0; - bputs(text[DownloadQueueCleared]); } } - break; - case 'D': - if(useron.rest&FLAG('D')) { - bputs(text[R_Download]); - break; } - if(!batdn_total) { - bputs(text[DownloadQueueIsEmpty]); - break; } - start_batch_download(); - break; - case 'L': - if(batup_total) { - bputs(text[UploadQueueLstHdr]); - for(i=0;i<batup_total;i++) - bprintf(text[UploadQueueLstFmt],i+1,batup_name[i] - ,batup_desc[i]); } - if(batdn_total) { - bputs(text[DownloadQueueLstHdr]); - for(i=0,totalcdt=0,totalsize=0;i<batdn_total;i++) { - bprintf(text[DownloadQueueLstFmt],i+1 - ,batdn_name[i],ultoac(batdn_cdt[i],tmp) - ,ultoac(batdn_size[i],str) - ,cur_cps - ? sectostr(batdn_size[i]/(ulong)cur_cps,tmp2) - : "??:??:??"); - totalsize+=batdn_size[i]; - totalcdt+=batdn_cdt[i]; } - bprintf(text[DownloadQueueTotals] - ,ultoac(totalcdt,tmp),ultoac(totalsize,str),cur_cps - ? sectostr(totalsize/(ulong)cur_cps,tmp2) - : "??:??:??"); } - break; /* Questionable line ^^^, see note above function */ - case 'R': - if(batup_total) { - bprintf(text[RemoveWhichFromUlQueue],batup_total); - n=getnum(batup_total); - if(n>=1) { - n--; - batup_total--; - while(n<batup_total) { - batup_dir[n]=batup_dir[n+1]; - batup_misc[n]=batup_misc[n+1]; - batup_alt[n]=batup_alt[n+1]; - strcpy(batup_name[n],batup_name[n+1]); - strcpy(batup_desc[n],batup_desc[n+1]); - n++; } - if(!batup_total) - bputs(text[UploadQueueCleared]); } } - if(batdn_total) { - bprintf(text[RemoveWhichFromDlQueue],batdn_total); - n=getnum(batdn_total); - if(n>=1) { - n--; - f.dir=batdn_dir[n]; - strcpy(f.name,batdn_name[n]); - f.datoffset=batdn_offset[n]; - f.size=batdn_size[n]; - closefile(f); - batdn_total--; - while(n<batdn_total) { - strcpy(batdn_name[n],batdn_name[n+1]); - batdn_dir[n]=batdn_dir[n+1]; - batdn_cdt[n]=batdn_cdt[n+1]; - batdn_alt[n]=batdn_alt[n+1]; - batdn_size[n]=batdn_size[n+1]; - batdn_offset[n]=batdn_offset[n+1]; - n++; } - if(!batdn_total) - bputs(text[DownloadQueueCleared]); } } - break; - case 'U': - if(useron.rest&FLAG('U')) { - bputs(text[R_Upload]); - break; } - if(!batup_total && upload_dir==INVALID_DIR) { - bputs(text[UploadQueueIsEmpty]); - break; } - menu("BATUPROT"); - if(!create_batchup_lst()) - break; - if(!create_bimodem_pth()) - break; - ASYNC; - mnemonics(text[ProtocolOrQuit]); - strcpy(str,"Q"); - for(i=0;i<total_prots;i++) - if(prot[i]->batulcmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(str,tmp); } - ch=getkeys(str,0); - if(ch=='Q') - break; - for(i=0;i<total_prots;i++) - if(prot[i]->batulcmd[0] && prot[i]->mnemonic==ch - && chk_ar(prot[i]->ar,useron)) - break; - if(i<total_prots) { - sprintf(str,"%sBATCHUP.LST",node_dir); - xfrprot=i; - if(batup_total) - xfrdir=batup_dir[0]; - else - xfrdir=upload_dir; - action=NODE_ULNG; - SYNC; - if(online==ON_REMOTE) { - delfiles(temp_dir,"*.*"); - start=time(NULL); - protocol(cmdstr(prot[xfrprot]->batulcmd,str,nulstr,NULL),1); - end=time(NULL); - if(!(dir[xfrdir]->misc&DIR_ULTIME)) - starttime+=end-start; } - batch_upload(); - delfiles(temp_dir,"*.*"); - autohangup(); } - break; } } -delfiles(temp_dir,"*.*"); -} - -/****************************************************************************/ -/* Download files from batch queue */ -/****************************************************************************/ -void start_batch_download() -{ - char ch,str[256],tmp2[256],tmp3[128],fname[64]; - int j; - uint i,xfrprot; - ulong totalcdt,totalsize,totaltime; - time_t start,end; - file_t f; - -if(useron.rest&FLAG('D')) { /* Download restriction */ - bputs(text[R_Download]); - return; } -for(i=0,totalcdt=0;i<batdn_total;i++) - totalcdt+=batdn_cdt[i]; -if(!(useron.exempt&FLAG('D')) - && totalcdt>useron.cdt+useron.freecdt) { - bprintf(text[YouOnlyHaveNCredits] - ,ultoac(useron.cdt+useron.freecdt,tmp)); - return; } - -if(online==ON_LOCAL) { /* Local download */ - bputs(text[EnterPath]); - if(!getstr(str,60,K_LINE|K_UPPER)) - return; - backslash(str); - for(i=0;i<batdn_total;i++) { - curdirnum=batdn_dir[i]; /* for ARS */ - lncntr=0; - unpadfname(batdn_name[i],tmp); - sprintf(tmp2,"%s%s",str,tmp); - seqwait(dir[batdn_dir[i]]->seqdev); - bprintf(text[RetrievingFile],tmp); - sprintf(tmp3,"%s%s" - ,batdn_alt[i]>0 && batdn_alt[i]<=altpaths - ? altpath[batdn_alt[i]-1] - : dir[batdn_dir[i]]->path - ,tmp); - j=mv(tmp3,tmp2,1); - getnodedat(node_num,&thisnode,1); - thisnode.aux=30; /* clear the seq dev # */ - putnodedat(node_num,thisnode); - CRLF; - if(j) /* copy unsuccessful */ - return; - for(j=0;j<total_dlevents;j++) - if(!stricmp(dlevent[j]->ext,batdn_name[i]+9) - && chk_ar(dlevent[j]->ar,useron)) { - bputs(dlevent[j]->workstr); - external(cmdstr(dlevent[j]->cmd,tmp2,nulstr,NULL),EX_OUTL); - CRLF; } - } - for(i=0;i<batdn_total;i++) { - curdirnum=batdn_dir[i]; /* for ARS */ - f.dir=batdn_dir[i]; - strcpy(f.name,batdn_name[i]); - f.datoffset=batdn_offset[i]; - f.size=batdn_size[i]; - f.altpath=batdn_alt[i]; - downloadfile(f); - closefile(f); } - batdn_total=0; - return; } - -for(i=0,totalsize=totaltime=0;i<batdn_total;i++) { - totalsize+=batdn_size[i]; - if(!(dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps) - totaltime+=batdn_size[i]/(ulong)cur_cps; } -if(!(useron.exempt&FLAG('T')) && !SYSOP && totaltime>timeleft) { - bputs(text[NotEnoughTimeToDl]); - return; } -menu("BATDPROT"); -if(!create_batchdn_lst()) - return; -if(!create_bimodem_pth()) - return; -ASYNC; -mnemonics(text[ProtocolOrQuit]); -strcpy(tmp2,"Q"); -for(i=0;i<total_prots;i++) - if(prot[i]->batdlcmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(tmp2,tmp); } -ungetkey(useron.prot); -ch=getkeys(tmp2,0); -if(ch=='Q' || sys_status&SS_ABORT) - return; -for(i=0;i<total_prots;i++) - if(prot[i]->batdlcmd[0] && prot[i]->mnemonic==ch - && chk_ar(prot[i]->ar,useron)) - break; -if(i<total_prots) { - xfrprot=i; - /* delfiles(temp_dir,"*.*"); fix for CD-ROM */ - for(i=0;i<batdn_total;i++) { - curdirnum=batdn_dir[i]; /* for ARS */ - unpadfname(batdn_name[i],fname); - if(dir[batdn_dir[i]]->seqdev) { - lncntr=0; - sprintf(tmp2,"%s%s",temp_dir,fname); - if(!fexist(tmp2)) { - seqwait(dir[batdn_dir[i]]->seqdev); - bprintf(text[RetrievingFile],fname); - sprintf(str,"%s%s" - ,batdn_alt[i]>0 && batdn_alt[i]<=altpaths - ? altpath[batdn_alt[i]-1] - : dir[batdn_dir[i]]->path - ,fname); - mv(str,tmp2,1); /* copy the file to temp dir */ - getnodedat(node_num,&thisnode,1); - thisnode.aux=40; /* clear the seq dev # */ - putnodedat(node_num,thisnode); - CRLF; } } - else - sprintf(tmp2,"%s%s" - ,batdn_alt[i]>0 && batdn_alt[i]<=altpaths - ? altpath[batdn_alt[i]-1] - : dir[batdn_dir[i]]->path - ,fname); - sprintf(str,"total_dlevents=%d",total_dlevents); -// logline("dl",str); - for(j=0;j<total_dlevents;j++) { -// logline("dl",dlevent[j]->ext); - // logline("dl",dlevent[j]->cmd); - // logline("dl",tmp2); - if(stricmp(dlevent[j]->ext,batdn_name[i]+9)) - continue; -// logline("dl","chkar"); - if(!chk_ar(dlevent[j]->ar,useron)) - continue; -// logline("dl","bputs"); - bputs(dlevent[j]->workstr); -// logline("dl","external"); - external(cmdstr(dlevent[j]->cmd,tmp2,nulstr,NULL),EX_OUTL); -// logline("dl","crlf"); - CRLF; } -// logline("dl","after dlevents"); - } - - sprintf(str,"%sBATCHDN.LST",node_dir); - getnodedat(node_num,&thisnode,1); - action=NODE_DLNG; - if(cur_cps) - unixtodos(now+(totalsize/(ulong)cur_cps) - ,&date,&curtime); - thisnode.aux=(curtime.ti_hour*60)+curtime.ti_min; - thisnode.action=action; - putnodedat(node_num,thisnode); /* calculate ETA */ - start=time(NULL); - protocol(cmdstr(prot[xfrprot]->batdlcmd,str,nulstr,NULL),0); - end=time(NULL); - batch_download(xfrprot); - if(batdn_total) - notdownloaded(totalsize,start,end); - /* delfiles(temp_dir,"*.*"); fix for CD-ROM */ - autohangup(); } -} - -/*****************************************************************************/ -/* Temp directory section. Files must be extracted here and both temp_uler */ -/* and temp_uler fields should be filled before entrance. */ -/*****************************************************************************/ -void temp_xfer() -{ - char str[256],tmp2[256],done=0,ch; - uint i,dirnum=total_dirs,j,files; - ulong bytes; - time_t start,end; - struct ffblk ff; - struct dfree d; - file_t f; - -if(!usrlibs) - return; -if(useron.rest&FLAG('D')) { - bputs(text[R_Download]); - return; } -/*************************************/ -/* Create TEMP directory information */ -/*************************************/ -if((dir[dirnum]=(dir_t *)MALLOC(sizeof(dir_t)))==0) { - errormsg(WHERE,ERR_ALLOC,"temp_dir",sizeof(dir_t)); - return; } -memset(dir[dirnum],0,sizeof(dir_t)); -dir[dirnum]->lname="Temporary"; -dir[dirnum]->sname="Temp"; -strcpy(dir[dirnum]->code,"TEMP"); -dir[dirnum]->path=temp_dir; -dir[dirnum]->maxfiles=MAX_FILES; -dir[dirnum]->data_dir=dir[0]->data_dir; -dir[dirnum]->op_ar=nulstr; -temp_dirnum=curdirnum=usrdir[curlib][curdir[curlib]]; -total_dirs++; - -/****************************/ -/* Fill filedat information */ -/****************************/ -sprintf(f.name,"TEMP_%3.3d.%s",node_num,useron.tmpext); -strcpy(f.desc,"Temp File"); -f.dir=dirnum; -f.misc=f.timesdled=f.dateuled=f.datedled=0L; - -if(useron.misc&(RIP|WIP) && !(useron.misc&EXPERT)) - menu("TEMPXFER"); -lncntr=0; -while(online && !done) { - if(!(useron.misc&(EXPERT|RIP|WIP))) { - sys_status&=~SS_ABORT; - if(lncntr) { - SYNC; - CRLF; - if(lncntr) /* CRLF or SYNC can cause pause */ - pause(); } - menu("TEMPXFER"); } - ASYNC; - bputs(text[TempDirPrompt]); - strcpy(f.uler,temp_uler); - ch=getkeys("ADEFNILQRVX?\r",0); - if(ch>SP) - logch(ch,0); - switch(ch) { - case 'A': /* add to temp file */ - if(temp_dir[1]==':') - i=temp_dir[0]-'A'+1; - else i=0; - getdfree(i,&d); - if(d.df_sclus==0xffff) - errormsg(WHERE,ERR_CHK,temp_dir,0); - if((ulong)d.df_bsec*(ulong)d.df_sclus - *(ulong)d.df_avail<(ulong)min_dspace*1024L) { - bputs(text[LowDiskSpace]); - sprintf(str,"Diskspace is low: %s",temp_dir); - errorlog(str); - if(!dir_op(dirnum)) - break; } - bprintf(text[DiskNBytesFree],ultoac((ulong)d.df_bsec - *(ulong)d.df_sclus*(ulong)d.df_avail,tmp)); - if(!getfilespec(str)) - break; - if(!checkfname(str)) - break; - sprintf(tmp2,"Added %s to %s",str,f.name); - logline(nulstr,tmp2); - sprintf(tmp2,"%s%s",temp_dir,str); - sprintf(str,"%s%s",temp_dir,f.name); - external(cmdstr(temp_cmd(),str,tmp2,NULL),EX_CC|EX_OUTL|EX_OUTR); - break; - case 'D': /* download from temp dir */ - sprintf(str,"%s%s",temp_dir,f.name); - if(!fexist(str)) { - bprintf(text[TempFileNotCreatedYet],f.name); - break; } - f.size=f.cdt=flength(str); - f.opencount=0; - if(temp_cdt) /* if file was not free */ - f.cdt=f.size; - else - f.cdt=0; - if(!(useron.exempt&FLAG('D')) - && f.cdt>useron.cdt+useron.freecdt) { - bprintf(text[YouOnlyHaveNCredits] - ,ultoac(useron.cdt+useron.freecdt,tmp)); - break; } /* f.cdt must equal size here */ - if(!(useron.exempt&FLAG('T')) && !dir_op(dirnum) - && !(dir[temp_dirnum]->misc&DIR_TFREE) && cur_cps - && f.size/(ulong)cur_cps>timeleft) { - bputs(text[NotEnoughTimeToDl]); - break; } - if(!chk_ar(dir[temp_dirnum]->dl_ar,useron)) { - bputs(text[CantDownloadFromDir]); - break; } - addfiledat(&f); - menu("DLPROT"); - SYNC; - mnemonics(text[ProtocolOrQuit]); - strcpy(tmp2,"Q"); - for(i=0;i<total_prots;i++) - if(prot[i]->dlcmd[0] && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(tmp2,tmp); } - ungetkey(useron.prot); - ch=getkeys(tmp2,0); - for(i=0;i<total_prots;i++) - if(prot[i]->dlcmd[0] && prot[i]->mnemonic==ch - && chk_ar(prot[i]->ar,useron)) - break; - if(i<total_prots) { - getnodedat(node_num,&thisnode,1); - action=NODE_DLNG; - if(cur_cps) - unixtodos(now+(f.size/(ulong)cur_cps) - ,&date,&curtime); - thisnode.aux=(curtime.ti_hour*60)+curtime.ti_min; - putnodedat(node_num,thisnode); /* calculate ETA */ - start=time(NULL); - j=protocol(cmdstr(prot[i]->dlcmd,str,nulstr,NULL),0); - end=time(NULL); - if(dir[temp_dirnum]->misc&DIR_TFREE) - starttime+=end-start; - if(prot[i]->misc&PROT_DSZLOG) { - if(checkprotlog(f)) - downloadfile(f); - else - notdownloaded(f.size,start,end); } - else { - if(!j) - downloadfile(f); - else { - bprintf(text[FileNotSent],f.name); - notdownloaded(f.size,start,end); } } - autohangup(); } - removefiledat(f); - break; - case 'E': - extract(usrdir[curlib][curdir[curlib]]); - sys_status&=~SS_ABORT; - break; - case 'F': /* Create a file list */ - delfiles(temp_dir,"*.*"); - create_filelist("FILELIST.TXT",0); - if(!(sys_status&SS_ABORT)) - logline(nulstr,"Created list of all files"); - CRLF; - sys_status&=~SS_ABORT; - break; - case 'I': /* information on what's here */ - bprintf(text[TempFileInfo],f.uler,temp_file); - break; - case 'L': /* list files in dir */ - if(!getfilespec(str)) - break; - if(!checkfname(str)) - break; - bytes=files=0L; - CRLF; - sprintf(tmp2,"%s%s",temp_dir,str); - i=findfirst(tmp2,&ff,0); - while(!i && !msgabort()) { - bprintf("%s %10s\r\n",padfname(ff.ff_name,str) - ,ultoac(ff.ff_fsize,tmp)); - files++; - bytes+=ff.ff_fsize; - i=findnext(&ff); } - if(!files) - bputs(text[EmptyDir]); - else if(files>1) - bprintf(text[TempDirTotal],ultoac(bytes,tmp),files); - break; - case 'N': /* Create a list of new files */ - delfiles(temp_dir,"*.*"); - create_filelist("NEWFILES.TXT",FL_ULTIME); - if(!(sys_status&SS_ABORT)) - logline(nulstr,"Created list of new files"); - CRLF; - sys_status&=~SS_ABORT; - break; - case 'R': /* Remove files from dir */ - if(!getfilespec(str)) - break; - // padfname(str,tmp); Removed 04/14/96 - bprintf(text[NFilesRemoved],delfiles(temp_dir,tmp)); - break; - case 'V': /* view files in dir */ - bputs(text[FileSpec]); - if(!getstr(str,12,K_UPPER) || !checkfname(str)) - break; - viewfiles(dirnum,str); - break; - case CR: - case 'Q': /* quit */ - done=1; - break; - case 'X': /* extract from archive in temp dir */ - extract(dirnum); - sys_status&=~SS_ABORT; - break; - case '?': /* menu */ - if(useron.misc&(EXPERT|RIP|WIP)) - menu("TEMPXFER"); - break; } - if(sys_status&SS_ABORT) - break; } -FREE(dir[dirnum]); -total_dirs--; -} - - -/****************************************************************************/ -/* Re-sorts file directory 'dirnum' according to dir[dirnum]->sort type */ -/****************************************************************************/ -void resort(uint dirnum) -{ - char str[25],ixbfname[128],datfname[128],exbfname[128],txbfname[128] - ,ext[512],nulbuf[512]; - uchar HUGE16 *ixbbuf, HUGE16 *datbuf; - uchar HUGE16 *ixbptr[MAX_FILES]; - int ixbfile,datfile,exbfile,txbfile,i,j; - ulong ixblen,datlen,offset,newoffset,l; - -memset(nulbuf,0,512); -bprintf(text[ResortLineFmt],lib[dir[dirnum]->lib]->sname,dir[dirnum]->sname); -sprintf(ixbfname,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); -sprintf(datfname,"%s%s.DAT",dir[dirnum]->data_dir,dir[dirnum]->code); -sprintf(exbfname,"%s%s.EXB",dir[dirnum]->data_dir,dir[dirnum]->code); -sprintf(txbfname,"%s%s.TXB",dir[dirnum]->data_dir,dir[dirnum]->code); - -if(flength(ixbfname)<1L || flength(datfname)<1L) { - remove(exbfname); - remove(txbfname); - remove(ixbfname); - remove(datfname); - bputs(text[ResortEmptyDir]); - return; } -bputs(text[Sorting]); -if((ixbfile=nopen(ixbfname,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,ixbfname,O_RDONLY); - return; } -if((datfile=nopen(datfname,O_RDONLY))==-1) { - close(ixbfile); - errormsg(WHERE,ERR_OPEN,datfname,O_RDONLY); - return; } -ixblen=filelength(ixbfile); -datlen=filelength(datfile); -if((ixbbuf=MALLOC(ixblen))==NULL) { - close(ixbfile); - close(datfile); - errormsg(WHERE,ERR_ALLOC,ixbfname,ixblen); - return; } -if((datbuf=MALLOC(datlen))==NULL) { - close(ixbfile); - close(datfile); - FREE((char *)ixbbuf); - errormsg(WHERE,ERR_ALLOC,datfname,datlen); - return; } -if(lread(ixbfile,ixbbuf,ixblen)!=ixblen) { - close(ixbfile); - close(datfile); - FREE((char *)ixbbuf); - FREE((char *)datbuf); - errormsg(WHERE,ERR_READ,ixbfname,ixblen); - return; } -if(lread(datfile,datbuf,datlen)!=datlen) { - close(ixbfile); - close(datfile); - FREE((char *)ixbbuf); - FREE((char *)datbuf); - errormsg(WHERE,ERR_READ,datfname,datlen); - return; } -close(ixbfile); -close(datfile); -if((ixbfile=nopen(ixbfname,O_WRONLY|O_TRUNC))==-1) { - FREE((char *)ixbbuf); - FREE((char *)datbuf); - errormsg(WHERE,ERR_OPEN,ixbfname,O_WRONLY|O_TRUNC); - return; } -if((datfile=nopen(datfname,O_WRONLY|O_TRUNC))==-1) { - close(ixbfile); - FREE((char *)ixbbuf); - FREE((char *)datbuf); - errormsg(WHERE,ERR_OPEN,datfname,O_WRONLY|O_TRUNC); - return; } -for(l=0,i=0;l<ixblen && i<MAX_FILES;l+=F_IXBSIZE,i++) - ixbptr[i]=ixbbuf+l; -switch(dir[dirnum]->sort) { - case SORT_NAME_A: - qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0]) - ,(int(*)(const void*, const void*))fnamecmp_a); - break; - case SORT_NAME_D: - qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0]) - ,(int(*)(const void*, const void*))fnamecmp_d); - break; - case SORT_DATE_A: - qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0]) - ,(int(*)(const void*, const void*))fdatecmp_a); - break; - case SORT_DATE_D: - qsort((void *)ixbptr,ixblen/F_IXBSIZE,sizeof(ixbptr[0]) - ,(int(*)(const void*, const void*))fdatecmp_d); - break; } - -if((exbfile=nopen(exbfname,O_RDWR|O_CREAT))==-1) { - close(ixbfile); - close(datfile); - FREE((char *)ixbbuf); - FREE((char *)datbuf); - errormsg(WHERE,ERR_OPEN,exbfname,O_RDWR|O_CREAT); - return; } -if((txbfile=nopen(txbfname,O_RDWR|O_CREAT))==-1) { - close(exbfile); - close(datfile); - close(exbfile); - FREE((char *)ixbbuf); - FREE((char *)datbuf); - errormsg(WHERE,ERR_OPEN,txbfname,O_RDWR|O_CREAT); - return; } - -for(i=0;i<ixblen/F_IXBSIZE;i++) { - offset=ixbptr[i][11]|((long)ixbptr[i][12]<<8)|((long)ixbptr[i][13]<<16); - lwrite(datfile,&datbuf[offset],F_LEN); - - newoffset=(ulong)i*(ulong)F_LEN; - - j=datbuf[offset+F_MISC]; /* misc bits */ - if(j!=ETX) j-=SP; - if(j&FM_EXTDESC) { /* extended description */ - lseek(exbfile,(offset/F_LEN)*512L,SEEK_SET); - memset(ext,0,512); - read(exbfile,ext,512); - while(filelength(txbfile)<(newoffset/F_LEN)*512L) { -// lseek(txbfile,0L,SEEK_END); - write(txbfile,nulbuf,512); } - lseek(txbfile,(newoffset/F_LEN)*512L,SEEK_SET); - write(txbfile,ext,512); } - - str[0]=newoffset&0xff; /* Get offset within DAT file for IXB file */ - str[1]=(newoffset>>8)&0xff; - str[2]=(newoffset>>16)&0xff; - lwrite(ixbfile,ixbptr[i],11); /* filename */ - lwrite(ixbfile,str,3); /* offset */ - lwrite(ixbfile,ixbptr[i]+14,8); } /* upload and download times */ -close(exbfile); -close(txbfile); -close(ixbfile); -close(datfile); -remove(exbfname); -rename(txbfname,exbfname); -if(!flength(exbfname)) - remove(exbfname); -FREE((char *)ixbbuf); -FREE((char *)datbuf); -if(ixblen/F_IXBSIZE==datlen/F_LEN) - bputs(text[Sorted]); -else - bprintf(text[Compressed] - ,(uint)((datlen/F_LEN)-(ixblen/F_IXBSIZE)) - ,ultoac(((datlen/F_LEN)-(ixblen/F_IXBSIZE))*F_LEN,tmp)); -} - -/*****************************************************************************/ -/* Handles extraction from a normal transfer file to the temp directory */ -/*****************************************************************************/ -void extract(uint dirnum) -{ - char fname[13],str[256],excmd[256],path[256],done - ,files[256],tmp[256],intmp=0; - int i,j; - struct ffblk ff; - file_t f; - struct dfree d; - -temp_dirnum=curdirnum=dirnum; -if(!strcmp(dir[dirnum]->code,"TEMP")) - intmp=1; -if(temp_dir[1]==':') - i=temp_dir[0]-'A'+1; -else i=0; -getdfree(i,&d); -if(d.df_sclus==0xffff) - errormsg(WHERE,ERR_CHK,temp_dir,0); -if((ulong)d.df_bsec*(ulong)d.df_sclus - *(ulong)d.df_avail<(ulong)min_dspace*1024L) { - bputs(text[LowDiskSpace]); - sprintf(str,"Diskspace is low: %s",temp_dir); - errorlog(str); - if(!dir_op(dirnum)) - return; } -else if(!intmp) { /* not in temp dir */ - CRLF; } -bprintf(text[DiskNBytesFree],ultoac((ulong)d.df_bsec - *(ulong)d.df_sclus*(ulong)d.df_avail,tmp)); -if(!intmp) { /* not extracting FROM temp directory */ - sprintf(str,"%s*.*",temp_dir); - if(fexist(str)) { - bputs(text[RemovingTempFiles]); - done=findfirst(str,&ff,0); - while(!done) { - sprintf(str,"%s%s",temp_dir,ff.ff_name); - remove(str); - done=findnext(&ff); } - CRLF; } } -bputs(text[ExtractFrom]); -if(!getstr(fname,12,K_UPPER) || !checkfname(fname) || strchr(fname,'*') - || strchr(fname,'?')) - return; -padfname(fname,f.name); -strcpy(str,f.name); -truncsp(str); -for(i=0;i<total_fextrs;i++) - if(!strcmp(str+9,fextr[i]->ext) && chk_ar(fextr[i]->ar,useron)) { - strcpy(excmd,fextr[i]->cmd); - break; } -if(i==total_fextrs) { - bputs(text[UnextractableFile]); - return; } -if(!intmp && !findfile(dirnum,f.name)) { /* not temp dir */ - bputs(text[SearchingAllDirs]); - for(i=0;i<usrdirs[curlib] && !msgabort();i++) { - if(i==dirnum) continue; - if(findfile(usrdir[curlib][i],f.name)) - break; } - if(i==usrdirs[curlib]) { /* not found in cur lib */ - bputs(text[SearchingAllLibs]); - for(i=0;i<usrlibs;i++) { - if(i==curlib) continue; - for(j=0;j<usrdirs[i] && !msgabort();j++) - if(findfile(usrdir[i][j],f.name)) - break; - if(j<usrdirs[i]) - break; } - if(i==usrlibs) { - bputs(text[FileNotFound]); /* not in database */ - return; } - dirnum=usrdir[i][j]; } - else - dirnum=usrdir[curlib][i]; } -if(sys_status&SS_ABORT) - return; -sprintf(path,"%s%s",dir[dirnum]->path,fname); -if(!intmp) { /* not temp dir, so get temp_file info */ - f.datoffset=f.dateuled=f.datedled=0L; - f.dir=dirnum; - getfileixb(&f); - if(!f.datoffset && !f.dateuled && !f.datedled) /* error reading ixb */ - return; - f.size=0; - getfiledat(&f); - fileinfo(f); - if(f.altpath>0 && f.altpath<=altpaths) - sprintf(path,"%s%s",altpath[f.altpath-1],fname); - temp_dirnum=dirnum; - if(dir[f.dir]->misc&DIR_FREE) - temp_cdt=0L; - else - temp_cdt=f.cdt; - strcpy(temp_uler,f.uler); - strcpy(temp_file,f.name); } /* padded filename */ -if(!fexist(path)) { - bputs(text[FileNotThere]); /* not on disk */ - return; } -done=0; -while(online && !done) { - mnemonics(text[ExtractFilesPrompt]); - switch(getkeys("EVQ",0)) { - case 'E': - if(!getfilespec(str)) - break; - if(!checkfname(str)) - break; - if((i=external(cmdstr(excmd,path,str,NULL) - ,EX_INR|EX_OUTL|EX_OUTR|EX_CC))!=0) { - errormsg(WHERE,ERR_EXEC,cmdstr(excmd,path,str,NULL),i); - return; } - sprintf(tmp,"Extracted %s from %s",str,path); - logline(nulstr,tmp); - CRLF; - break; - case 'V': - viewfiles(dirnum,fname); - break; - default: - done=1; - break; } } -} - -/****************************************************************************/ -/* Creates the file BATCHDN.LST in the node directory. Returns 1 if */ -/* everything goes okay. 0 if not. */ -/****************************************************************************/ -int create_batchdn_lst() -{ - char str[256]; - int i,file; - -sprintf(str,"%sBATCHDN.LST",node_dir); -if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return(0); } -for(i=0;i<batdn_total;i++) { - if(batdn_dir[i]>=total_dirs || dir[batdn_dir[i]]->seqdev) - strcpy(str,temp_dir); - else - strcpy(str,batdn_alt[i]>0 && batdn_alt[i]<=altpaths - ? altpath[batdn_alt[i]-1] : dir[batdn_dir[i]]->path); - write(file,str,strlen(str)); - unpadfname(batdn_name[i],str); - strcat(str,crlf); - write(file,str,strlen(str)); } -close(file); -return(1); -} - -/****************************************************************************/ -/* Creates the file BATCHUP.LST in the node directory. Returns 1 if */ -/* everything goes okay. 0 if not. */ -/* This list is not used by any protocols to date. */ -/****************************************************************************/ -int create_batchup_lst() -{ - char str[256]; - int i,file; - -sprintf(str,"%sBATCHUP.LST",node_dir); -if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return(0); } -for(i=0;i<batup_total;i++) { - if(batup_dir[i]>=total_dirs) - strcpy(str,temp_dir); - else - strcpy(str,batup_alt[i]>0 && batup_alt[i]<=altpaths - ? altpath[batup_alt[i]-1] : dir[batup_dir[i]]->path); - write(file,str,strlen(str)); - unpadfname(batup_name[i],str); - strcat(str,crlf); - write(file,str,strlen(str)); } -close(file); -return(1); -} - -/****************************************************************************/ -/* Creates the file BIMODEM.PTH in the node directory. Returns 1 if */ -/* everything goes okay. 0 if not. */ -/****************************************************************************/ -int create_bimodem_pth() -{ - char str[256],tmp2[512]; - int i,file; - -sprintf(str,"%sBIMODEM.PTH",node_dir); /* Create bimodem file */ -if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return(0); } -for(i=0;i<batup_total;i++) { - sprintf(str,"%s%s",batup_dir[i]>=total_dirs ? temp_dir - : batup_alt[i]>0 && batup_alt[i]<=altpaths - ? altpath[batup_alt[i]-1] : dir[batup_dir[i]]->path - ,unpadfname(batup_name[i],tmp)); - sprintf(tmp2,"D %-80.80s%-160.160s" - ,unpadfname(batup_name[i],tmp),str); - write(file,tmp2,248); } -for(i=0;i<batdn_total;i++) { - sprintf(str,"%s%s" - ,(batdn_dir[i]>=total_dirs || dir[batdn_dir[i]]->seqdev) - ? temp_dir : batdn_alt[i]>0 && batdn_alt[i]<=altpaths - ? altpath[batdn_alt[i]-1] : dir[batdn_dir[i]]->path - ,unpadfname(batdn_name[i],tmp)); - sprintf(tmp2,"U %-240.240s",str); - write(file,tmp2,248); } -close(file); -return(1); -} - -/****************************************************************************/ -/* Processes files that were supposed to be received in the batch queue */ -/****************************************************************************/ -void batch_upload() -{ - char str1[256],str2[256]; - int i,j,x,y; - file_t f; - struct ffblk ff; - -for(i=0;i<batup_total;) { - curdirnum=batup_dir[i]; /* for ARS */ - lncntr=0; /* defeat pause */ - unpadfname(batup_name[i],tmp); - sprintf(str1,"%s%s",temp_dir,tmp); - sprintf(str2,"%s%s",dir[batup_dir[i]]->path,tmp); - if(fexist(str1) && fexist(str2)) { /* file's in two places */ - bprintf(text[FileAlreadyThere],batup_name[i]); - remove(str1); /* this is the one received */ - i++; - continue; } - if(fexist(str1)) - mv(str1,str2,0); - strcpy(f.name,batup_name[i]); - strcpy(f.desc,batup_desc[i]); - f.dir=batup_dir[i]; - f.misc=batup_misc[i]; - f.altpath=batup_alt[i]; - if(uploadfile(&f)) { - batup_total--; - for(j=i;j<batup_total;j++) { - batup_dir[j]=batup_dir[j+1]; - batup_alt[j]=batup_alt[j+1]; - batup_misc[j]=batup_misc[j+1]; - strcpy(batup_name[j],batup_name[j+1]); - strcpy(batup_desc[j],batup_desc[j+1]); } } - else i++; } -if(upload_dir==INVALID_DIR) - return; -sprintf(str1,"%s*.*",temp_dir); -i=findfirst(str1,&ff,0); -while(!i) { - memset(&f,0,sizeof(file_t)); - f.dir=upload_dir; - padfname(ff.ff_name,f.name); - strupr(f.name); - sprintf(str1,"%s%s",temp_dir,ff.ff_name); - for(x=0;x<usrlibs;x++) { - for(y=0;y<usrdirs[x];y++) - if(dir[usrdir[x][y]]->misc&DIR_DUPES - && findfile(usrdir[x][y],f.name)) - break; - if(y<usrdirs[x]) - break; } - sprintf(str2,"%s%s",dir[f.dir]->path,ff.ff_name); - if(x<usrlibs || fexist(str2)) { - bprintf(text[FileAlreadyOnline],f.name); - remove(str1); } - else { - mv(str1,str2,0); - uploadfile(&f); } - i=findnext(&ff); } -} - -/****************************************************************************/ -/* Processes files that were supposed to be sent from the batch queue */ -/* xfrprot is -1 if downloading files from within QWK (no DSZLOG) */ -/****************************************************************************/ -void batch_download(int xfrprot) -{ - int i,j; - file_t f; - -for(i=0;i<batdn_total;) { - lncntr=0; /* defeat pause */ - f.dir=curdirnum=batdn_dir[i]; - strcpy(f.name,batdn_name[i]); - f.datoffset=batdn_offset[i]; - f.size=batdn_size[i]; -/* Removed 05/18/95 - if(dir[f.dir]->misc&DIR_TFREE && cur_cps) Looks like it gave back double - starttime+=f.size/(ulong)cur_cps; -*/ - f.altpath=batdn_alt[i]; - if(xfrprot==-1 || (prot[xfrprot]->misc&PROT_DSZLOG && checkprotlog(f)) - || !(prot[xfrprot]->misc&PROT_DSZLOG)) { - if(dir[f.dir]->misc&DIR_TFREE && cur_cps) - starttime+=f.size/(ulong)cur_cps; - downloadfile(f); - closefile(f); - batdn_total--; - for(j=i;j<batdn_total;j++) { - strcpy(batdn_name[j],batdn_name[j+1]); - batdn_dir[j]=batdn_dir[j+1]; - batdn_cdt[j]=batdn_cdt[j+1]; - batdn_alt[j]=batdn_alt[j+1]; - batdn_size[j]=batdn_size[j+1]; - batdn_offset[j]=batdn_offset[j+1]; } } - else i++; } -} - -/****************************************************************************/ -/* Adds a list of files to the batch download queue */ -/****************************************************************************/ -void batch_add_list(char *list) -{ - char str[128]; - int file,i,j,k; - FILE *stream; - file_t f; - -if((stream=fnopen(&file,list,O_RDONLY))!=NULL) { - bputs(text[SearchingAllLibs]); - while(!feof(stream)) { - checkline(); - if(!online) - break; - if(!fgets(str,127,stream)) - break; - truncsp(str); - sprintf(f.name,"%.12s",str); - strupr(f.name); - lncntr=0; - for(i=k=0;i<usrlibs;i++) { - for(j=0;j<usrdirs[i];j++,k++) { - outchar('.'); - if(k && !(k%5)) - bputs("\b\b\b\b\b \b\b\b\b\b"); - if(findfile(usrdir[i][j],f.name)) - break; } - if(j<usrdirs[i]) - break; } - if(i<usrlibs) { - f.dir=usrdir[i][j]; - getfileixb(&f); - f.size=0; - getfiledat(&f); - if(f.size==-1L) - bprintf(text[FileIsNotOnline],f.name); - else - addtobatdl(f); } } - fclose(stream); - remove(list); - CRLF; } -} - -/****************************************************************************/ -/* Creates a text file named NEWFILES.DAT in the temp directory that */ -/* all new files since p-date. Returns number of files in list. */ -/****************************************************************************/ -ulong create_filelist(char *name, char mode) -{ - char str[256]; - int i,j,d,file; - ulong l,k; - -bprintf(text[CreatingFileList],name); -sprintf(str,"%s%s",temp_dir,name); -if((file=nopen(str,O_CREAT|O_WRONLY|O_APPEND))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_CREAT|O_WRONLY|O_APPEND); - return(0); } -k=0; -if(mode&FL_ULTIME) { - sprintf(str,"New files since: %s\r\n",timestr(&ns_time)); - write(file,str,strlen(str)); } -for(i=d=0;i<usrlibs;i++) { - for(j=0;j<usrdirs[i];j++,d++) { - outchar('.'); - if(d && !(d%5)) - bputs("\b\b\b\b\b \b\b\b\b\b"); - if(mode&FL_ULTIME /* New-scan */ - && (lib[usrlib[i]]->offline_dir==usrdir[i][j] - || dir[usrdir[i][j]]->misc&DIR_NOSCAN)) - continue; - l=listfiles(usrdir[i][j],nulstr,file,mode); - if((long)l==-1) - break; - k+=l; } - if(j<usrdirs[i]) - break; } -if(k>1) { - sprintf(str,"\r\n%d Files Listed.\r\n",k); - write(file,str,strlen(str)); } -close(file); -if(k) - bprintf(text[CreatedFileList],name); -else { - bputs(text[NoFiles]); - sprintf(str,"%s%s",temp_dir,name); - remove(str); } -strcpy(temp_file,name); -strcpy(temp_uler,"File List"); -return(k); -} - diff --git a/src/sbbs2/xfer_lo.c b/src/sbbs2/xfer_lo.c deleted file mode 100644 index 21fb1e7f96..0000000000 --- a/src/sbbs2/xfer_lo.c +++ /dev/null @@ -1,209 +0,0 @@ -#line 1 "XFER_LO.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -/****************************************************************************/ -/* Prompts user for file specification. <CR> is *.* and .* is assumed. */ -/* Returns padded file specification. */ -/* Returns NULL if input was aborted. */ -/****************************************************************************/ -char *getfilespec(char *str) -{ -bputs(text[FileSpecStarDotStar]); -if(!getstr(str,12,K_UPPER)) - strcpy(str,"*.*"); -else if(!strchr(str,'.') && strlen(str)<=8) - strcat(str,".*"); -if(sys_status&SS_ABORT) - return(0); -return(str); -} - -/****************************************************************************/ -/* Turns FILE.EXT into FILE .EXT */ -/****************************************************************************/ -char *padfname(char *filename, char *str) -{ - char c,d; - -for(c=0;c<8;c++) - if(filename[c]=='.' || !filename[c]) break; - else str[c]=filename[c]; -d=c; -if(filename[c]=='.') c++; -while(d<8) - str[d++]=SP; -str[d++]='.'; -while(d<12) - if(!filename[c]) break; - else str[d++]=filename[c++]; -while(d<12) - str[d++]=SP; -str[d]=0; -return(str); -} - -/****************************************************************************/ -/* Turns FILE .EXT into FILE.EXT */ -/****************************************************************************/ -char *unpadfname(char *filename, char *str) -{ - char c,d; - -for(c=0,d=0;c<strlen(filename);c++) - if(filename[c]!=SP) str[d++]=filename[c]; -str[d]=0; -return(str); -} - -/****************************************************************************/ -/* Checks to see if filename matches filespec. Returns 1 if yes, 0 if no */ -/****************************************************************************/ -char filematch(char *filename, char *filespec) -{ - char c; - -for(c=0;c<8;c++) /* Handle Name */ - if(filespec[c]=='*') break; - else if(filespec[c]=='?') continue; - else if(filename[c]!=filespec[c]) return(0); -for(c=9;c<12;c++) - if(filespec[c]=='*') break; - else if(filespec[c]=='?') continue; - else if(filename[c]!=filespec[c]) return(0); -return(1); -} - -/****************************************************************************/ -/* Deletes all files in dir 'path' that match file spec 'spec' */ -/****************************************************************************/ -int delfiles(char *inpath, char *spec) -{ - char str[256],path[128],done; - int files=0; - struct ffblk ff; - -strcpy(path,inpath); -backslash(path); -sprintf(str,"%s%s",path,spec); -done=findfirst(str,&ff,0); -while(!done) { - sprintf(str,"%s%s",path,ff.ff_name); - _chmod(str,1,FA_NORMAL); // Incase it's been marked RDONLY - if(remove(str)) - errormsg(WHERE,ERR_REMOVE,str,0); - else - files++; - done=findnext(&ff); } -return(files); -} - -/*****************************************************************************/ -/* Checks the filename 'fname' for invalid symbol or character sequences */ -/*****************************************************************************/ -char checkfname(char *fname) -{ - char str[256],c=0,d; - -if(strcspn(fname,"\\/|<>+[]:=\";,%")!=strlen(fname)) { - sprintf(str,"Suspicious filename attempt: '%s'",fname); - errorlog(str); - return(0); } -if(strstr(fname,"..")) - return(0); -if(strcspn(fname,".")>8) - return(0); -d=strlen(fname); -while(c<d) { - if(fname[c]<=SP || fname[c]&0x80) - return(0); - c++; } -return(1); -} - -/**************************************************************************/ -/* Add file 'f' to batch download queue. Return 1 if successful, 0 if not */ -/**************************************************************************/ -char addtobatdl(file_t f) -{ - char str[256],tmp2[256]; - uint i; - ulong totalcdt, totalsize, totaltime; - -if(useron.rest&FLAG('D')) { - bputs(text[R_Download]); - return(0); } -/*** -sprintf(str,"%s%s",f.altpath>0 && f.altpath<=altpaths ? altpath[f.altpath-1] - : dir[f.dir]->path,unpadfname(f.name,tmp)); -***/ -for(i=0;i<batdn_total;i++) { - if(!strcmp(batdn_name[i],f.name) && f.dir==batdn_dir[i]) { - bprintf(text[FileAlreadyInQueue],f.name); - return(0); } } -if(f.size<=0 /* !fexist(str) */) { - bprintf(text[CantAddToQueue],f.name); - bputs(text[FileIsNotOnline]); - return(0); } -if(batdn_total>=max_batdn) { - bprintf(text[CantAddToQueue],f.name); - bputs(text[BatchDlQueueIsFull]); - return(0); } -for(i=0,totalcdt=0;i<batdn_total;i++) - totalcdt+=batdn_cdt[i]; -if(dir[f.dir]->misc&DIR_FREE) f.cdt=0L; -totalcdt+=f.cdt; -if(!(useron.exempt&FLAG('D')) && totalcdt>useron.cdt+useron.freecdt) { - bprintf(text[CantAddToQueue],f.name); - bprintf(text[YouOnlyHaveNCredits],ultoac(useron.cdt+useron.freecdt,tmp)); - return(0); } -if(!chk_ar(dir[f.dir]->dl_ar,useron)) { - bprintf(text[CantAddToQueue],f.name); - bputs(text[CantDownloadFromDir]); - return(0); } -for(i=0,totalsize=totaltime=0;i<batdn_total;i++) { - totalsize+=batdn_size[i]; - if(!(dir[batdn_dir[i]]->misc&DIR_TFREE) && cur_cps) - totaltime+=batdn_size[i]/(ulong)cur_cps; } -totalsize+=f.size; -if(!(dir[f.dir]->misc&DIR_TFREE) && cur_cps) - totaltime+=f.size/(ulong)cur_cps; -if(!(useron.exempt&FLAG('T')) && totaltime>timeleft) { - bprintf(text[CantAddToQueue],f.name); - bputs(text[NotEnoughTimeToDl]); - return(0); } -strcpy(batdn_name[batdn_total],f.name); -batdn_dir[batdn_total]=f.dir; -batdn_cdt[batdn_total]=f.cdt; -batdn_offset[batdn_total]=f.datoffset; -batdn_size[batdn_total]=f.size; -batdn_alt[batdn_total]=f.altpath; -batdn_total++; -openfile(f); -bprintf(text[FileAddedToBatDlQueue] - ,f.name,batdn_total,max_batdn,ultoac(totalcdt,tmp) - ,ultoac(totalsize,tmp2) - ,sectostr(totalsize/(ulong)cur_cps,str)); -return(1); -} - -/****************************************************************************/ -/* This function returns the command line for the temp file extension for */ -/* current user online. */ -/****************************************************************************/ -char *temp_cmd(void) -{ - int i; - -if(!total_fcomps) { - errormsg(WHERE,ERR_CHK,"compressable file types",0); - return(nulstr); } -for(i=0;i<total_fcomps;i++) - if(!stricmp(useron.tmpext,fcomp[i]->ext) - && chk_ar(fcomp[i]->ar,useron)) - return(fcomp[i]->cmd); -return(fcomp[0]->cmd); -} - diff --git a/src/sbbs2/xfer_mid.c b/src/sbbs2/xfer_mid.c deleted file mode 100644 index 4d1cbfe6ce..0000000000 --- a/src/sbbs2/xfer_mid.c +++ /dev/null @@ -1,792 +0,0 @@ -#line 1 "XFER_MID.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -/****************************************************************************/ -/* This function is called when a file is unsuccessfully downloaded. */ -/* It logs the tranfer time and checks for possible leech protocol use. */ -/****************************************************************************/ -void notdownloaded(ulong size, time_t start, time_t end) -{ - char str[256],tmp2[256]; - -sprintf(str,"Estimated Time: %s Transfer Time: %s" - ,sectostr(cur_cps ? size/cur_cps : 0,tmp) - ,sectostr((uint)end-start,tmp2)); -logline(nulstr,str); -if(leech_pct && cur_cps /* leech detection */ - && end-start>=leech_sec - && end-start>=(double)(size/cur_cps)*(double)leech_pct/100.0) { - sprintf(str,"Possible use of leech protocol (leech=%u downloads=%u)" - ,useron.leech+1,useron.dls); - errorlog(str); - useron.leech=adjustuserrec(useron.number,U_LEECH,2,1); } -} - -/****************************************************************************/ -/* List detailed information about the files in 'filespec'. Prompts for */ -/* action depending on 'mode.' */ -/* Returns number of files matching filespec that were found */ -/****************************************************************************/ -int listfileinfo(uint dirnum, char *filespec, char mode) -{ - uchar str[258],path[258],dirpath[256],done=0,ch,fname[13],ext[513]; - uchar HUGE16 *ixbbuf,*usrxfrbuf=NULL,*p; - int i,j,found=0,file; - ulong l,m,usrcdt,usrxfrlen; - time_t start,end; - file_t f; - -sprintf(str,"%sXFER.IXT",data_dir); -if(mode==FI_USERXFER && flength(str)>0L) { - if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_RDONLY); - return(0); } - usrxfrlen=filelength(file); - if((usrxfrbuf=MALLOC(usrxfrlen))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,usrxfrlen); - return(0); } - if(read(file,usrxfrbuf,usrxfrlen)!=usrxfrlen) { - close(file); - FREE(usrxfrbuf); - errormsg(WHERE,ERR_READ,str,usrxfrlen); - return(0); } - close(file); } -sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_RDONLY))==-1) - return(0); -l=filelength(file); -if(!l) { - close(file); - return(0); } -if((ixbbuf=(char *)MALLOC(l))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,l); - return(0); } -if(lread(file,ixbbuf,l)!=l) { - close(file); - errormsg(WHERE,ERR_READ,str,l); - FREE((char *)ixbbuf); - if(usrxfrbuf) - FREE(usrxfrbuf); - return(0); } -close(file); -sprintf(str,"%s%s.DAT",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_RDONLY))==-1) { - errormsg(WHERE,ERR_READ,str,O_RDONLY); - FREE((char *)ixbbuf); - if(usrxfrbuf) - FREE(usrxfrbuf); - return(0); } -close(file); -m=0; -while(online && !done && m<l) { - if(mode==FI_REMOVE && dir_op(dirnum)) - action=NODE_SYSP; - else action=NODE_LFIL; - if(msgabort()) { - found=-1; - break; } - for(i=0;i<12 && m<l;i++) - if(i==8) - str[i]='.'; - else - str[i]=ixbbuf[m++]; /* Turns FILENAMEEXT into FILENAME.EXT */ - str[i]=0; - unpadfname(str,fname); - if(filespec[0] && !filematch(str,filespec)) { - m+=11; - continue; } - f.datoffset=ixbbuf[m]|((long)ixbbuf[m+1]<<8)|((long)ixbbuf[m+2]<<16); - f.dateuled=ixbbuf[m+3]|((long)ixbbuf[m+4]<<8) - |((long)ixbbuf[m+5]<<16)|((long)ixbbuf[m+6]<<24); - f.datedled=ixbbuf[m+7]|((long)ixbbuf[m+8]<<8) - |((long)ixbbuf[m+9]<<16)|((long)ixbbuf[m+10]<<24); - m+=11; - if(mode==FI_OLD && f.datedled>ns_time) - continue; - if((mode==FI_OLDUL || mode==FI_OLD) && f.dateuled>ns_time) - continue; - f.dir=curdirnum=dirnum; - strcpy(f.name,str); - f.size=0; - getfiledat(&f); - if(mode==FI_OFFLINE && f.size>=0) - continue; - if(f.altpath>0 && f.altpath<=altpaths) - strcpy(dirpath,altpath[f.altpath-1]); - else - strcpy(dirpath,dir[f.dir]->path); - if(mode==FI_CLOSE && !f.opencount) - continue; - if(mode==FI_USERXFER) { - for(p=usrxfrbuf;p<usrxfrbuf+usrxfrlen;p+=24) { - sprintf(str,"%17.17s",p); /* %4.4u %12.12s */ - if(!strcmp(str+5,f.name) && useron.number==atoi(str)) - break; } - if(p>=usrxfrbuf+usrxfrlen) /* file wasn't found */ - continue; } - if((mode==FI_REMOVE) && (!dir_op(dirnum) && strcmpi(f.uler - ,useron.alias) && !(useron.exempt&FLAG('R')))) - continue; - found++; - if(mode==FI_INFO) { - if(!viewfile(f,1)) { - done=1; - found=-1; } } - else - fileinfo(f); - if(mode==FI_CLOSE) { - if(!noyes(text[CloseFileRecordQ])) { - f.opencount=0; - putfiledat(f); } } - else if(mode==FI_REMOVE || mode==FI_OLD || mode==FI_OLDUL - || mode==FI_OFFLINE) { - SYNC; - CRLF; - if(f.opencount) { - mnemonics(text[QuitOrNext]); - strcpy(str,"Q\r"); } - else if(dir_op(dirnum)) { - mnemonics(text[SysopRemoveFilePrompt]); - strcpy(str,"VEFMCQR\r"); } - else if(useron.exempt&FLAG('R')) { - mnemonics(text[RExemptRemoveFilePrompt]); - strcpy(str,"VEMQR\r"); } - else { - mnemonics(text[UserRemoveFilePrompt]); - strcpy(str,"VEQR\r"); } - switch(getkeys(str,0)) { - case 'V': - viewfilecontents(f); - CRLF; - ASYNC; - pause(); - m-=F_IXBSIZE; - continue; - case 'E': /* edit file information */ - if(dir_op(dirnum)) { - bputs(text[EditFilename]); - strcpy(str,fname); - getstr(str,12,K_EDIT|K_AUTODEL|K_UPPER); - if(strcmp(str,fname)) { /* rename */ - padfname(str,path); - if(findfile(f.dir,path)) - bprintf(text[FileAlreadyThere],path); - else { - sprintf(path,"%s%s",dirpath,fname); - sprintf(tmp,"%s%s",dirpath,str); - if(rename(path,tmp)) - bprintf(text[CouldntRenameFile],path,tmp); - else { - bprintf(text[FileRenamed],path,tmp); - strcpy(fname,str); - removefiledat(f); - strcpy(f.name,padfname(str,tmp)); - addfiledat(&f); } } } } - bputs(text[EditDescription]); - getstr(f.desc,LEN_FDESC,K_LINE|K_EDIT|K_AUTODEL); - if(f.misc&FM_EXTDESC) { - if(!noyes(text[DeleteExtDescriptionQ])) { - remove(str); - f.misc&=~FM_EXTDESC; } } - if(!dir_op(dirnum)) { - putfiledat(f); - break; } - bputs(text[EditUploader]); - getstr(f.uler,LEN_ALIAS,K_UPRLWR|K_EDIT|K_AUTODEL); - ultoa(f.cdt,str,10); - bputs(text[EditCreditValue]); - getstr(str,7,K_NUMBER|K_EDIT|K_AUTODEL); - f.cdt=atol(str); - itoa(f.timesdled,str,10); - bputs(text[EditTimesDownloaded]); - getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL); - f.timesdled=atoi(str); - if(f.opencount) { - itoa(f.opencount,str,10); - bputs(text[EditOpenCount]); - getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL); - f.opencount=atoi(str); } - if(altpaths || f.altpath) { - itoa(f.altpath,str,10); - bputs(text[EditAltPath]); - getstr(str,3,K_NUMBER|K_EDIT|K_AUTODEL); - f.altpath=atoi(str); - if(f.altpath>altpaths) - f.altpath=0; } - putfiledat(f); - inputnstime(&f.dateuled); - update_uldate(f); - break; - case 'F': /* delete file only */ - sprintf(str,"%s%s",dirpath,fname); - if(!fexist(str)) - bputs(text[FileNotThere]); - else { - if(!noyes(text[AreYouSureQ])) { - if(remove(str)) - bprintf(text[CouldntRemoveFile],str); - else { - sprintf(tmp,"Deleted %s",str); - logline(nulstr,tmp); } } } - break; - case 'R': /* remove file from database */ - if(noyes(text[AreYouSureQ])) - break; - removefiledat(f); - sprintf(str,"Removed %s from %s %s",f.name - ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname); - logline("U-",str); - sprintf(str,"%s%s",dirpath,fname); - if(fexist(str)) { - if(dir_op(dirnum)) { - if(!noyes(text[DeleteFileQ])) { - if(remove(str)) - bprintf(text[CouldntRemoveFile],str); - else { - sprintf(tmp,"Deleted %s",str); - logline(nulstr,tmp); } } } - else if(remove(str)) /* always remove if not sysop */ - bprintf(text[CouldntRemoveFile],str); } - if(dir_op(dirnum) || useron.exempt&FLAG('R')) { - i=lib[dir[f.dir]->lib]->offline_dir; - if(i!=dirnum && i!=(int)INVALID_DIR - && !findfile(i,f.name)) { - sprintf(str,text[AddToOfflineDirQ] - ,fname,lib[dir[i]->lib]->sname,dir[i]->sname); - if(yesno(str)) { - getextdesc(f.dir,f.datoffset,ext); - f.dir=i; - addfiledat(&f); - if(f.misc&FM_EXTDESC) - putextdesc(f.dir,f.datoffset,ext); } } } - if(dir_op(dirnum) || strcmpi(f.uler,useron.alias)) { - if(noyes(text[RemoveCreditsQ])) -/* Fall through */ break; } - case 'C': /* remove credits only */ - if((i=matchuser(f.uler))==0) { - bputs(text[UnknownUser]); - break; } - if(dir_op(dirnum)) { - usrcdt=(ulong)(f.cdt*(dir[f.dir]->up_pct/100.0)); - if(f.timesdled) /* all downloads */ - usrcdt+=(ulong)((long)f.timesdled - *f.cdt*(dir[f.dir]->dn_pct/100.0)); - ultoa(usrcdt,str,10); - bputs(text[CreditsToRemove]); - getstr(str,10,K_NUMBER|K_LINE|K_EDIT|K_AUTODEL); - f.cdt=atol(str); } - usrcdt=adjustuserrec(i,U_CDT,10,-f.cdt); - if(i==useron.number) - useron.cdt=usrcdt; - sprintf(str,text[FileRemovedUserMsg] - ,f.name,f.cdt ? ultoac(f.cdt,tmp) : text[No]); - putsmsg(i,str); - usrcdt=adjustuserrec(i,U_ULB,10,-f.size); - if(i==useron.number) - useron.ulb=usrcdt; - usrcdt=adjustuserrec(i,U_ULS,5,-1); - if(i==useron.number) - useron.uls=usrcdt; - break; - case 'M': /* move the file to another dir */ - CRLF; - for(i=0;i<usrlibs;i++) - bprintf(text[MoveToLibLstFmt],i+1,lib[usrlib[i]]->lname); - SYNC; - bprintf(text[MoveToLibPrompt],dir[dirnum]->lib+1); - if((i=getnum(usrlibs))==-1) - continue; - if(!i) - i=dir[dirnum]->lib; - else - i--; - CRLF; - for(j=0;j<usrdirs[i];j++) - bprintf(text[MoveToDirLstFmt] - ,j+1,dir[usrdir[i][j]]->lname); - SYNC; - bprintf(text[MoveToDirPrompt],usrdirs[i]); - if((j=getnum(usrdirs[i]))==-1) - continue; - if(!j) - j=usrdirs[i]-1; - else j--; - CRLF; - if(findfile(usrdir[i][j],f.name)) { - bprintf(text[FileAlreadyThere],f.name); - break; } - getextdesc(f.dir,f.datoffset,ext); - removefiledat(f); - if(f.dir==upload_dir || f.dir==sysop_dir) - f.dateuled=time(NULL); - f.dir=usrdir[i][j]; - addfiledat(&f); - bprintf(text[MovedFile],f.name - ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname); - sprintf(str,"Moved %s to %s %s",f.name - ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname); - logline(nulstr,str); - if(!f.altpath) { /* move actual file */ - sprintf(str,"%s%s",dir[dirnum]->path,fname); - if(fexist(str)) { - sprintf(path,"%s%s",dir[f.dir]->path,fname); - mv(str,path,0); } } - if(f.misc&FM_EXTDESC) - putextdesc(f.dir,f.datoffset,ext); - break; - case 'Q': /* quit */ - found=-1; - done=1; - break; } } - else if(mode==FI_DOWNLOAD || mode==FI_USERXFER) { - sprintf(path,"%s%s",dirpath,fname); - if(f.size<1L) { /* getfiledat will set this to -1 if non-existant */ - SYNC; /* and 0 byte files shouldn't be d/led */ - mnemonics(text[QuitOrNext]); - if(getkeys("\rQ",0)=='Q') { - found=-1; - break; } - continue; } - if(!(dir[f.dir]->misc&DIR_FREE) && !(useron.exempt&FLAG('D')) - && f.cdt>(useron.cdt+useron.freecdt)) { - SYNC; - bprintf(text[YouOnlyHaveNCredits] - ,ultoac(useron.cdt+useron.freecdt,tmp)); - mnemonics(text[QuitOrNext]); - if(getkeys("\rQ",0)=='Q') { - found=-1; - break; } - continue; } - if(!chk_ar(dir[f.dir]->dl_ar,useron)) { - SYNC; - bputs(text[CantDownloadFromDir]); - mnemonics(text[QuitOrNext]); - if(getkeys("\rQ",0)=='Q') { - found=-1; - break; } - continue; } - if(!(dir[f.dir]->misc&DIR_TFREE) && f.timetodl>timeleft && !dir_op(dirnum) - && !(useron.exempt&FLAG('T'))) { - SYNC; - bputs(text[NotEnoughTimeToDl]); - mnemonics(text[QuitOrNext]); - if(getkeys("\rQ",0)=='Q') { - found=-1; - break; } - continue; } - menu("DLPROT"); - openfile(f); - SYNC; - mnemonics(text[ProtocolBatchQuitOrNext]); - strcpy(str,"BQ\r"); - for(i=0;i<total_prots;i++) - if(prot[i]->dlcmd[0] - && chk_ar(prot[i]->ar,useron)) { - sprintf(tmp,"%c",prot[i]->mnemonic); - strcat(str,tmp); } -// ungetkey(useron.prot); - ch=getkeys(str,0); - if(ch=='Q') { - found=-1; - done=1; } - else if(ch=='B') { - if(!addtobatdl(f)) { - closefile(f); - break; } } - else if(ch!=CR) { - for(i=0;i<total_prots;i++) - if(prot[i]->dlcmd[0] && prot[i]->mnemonic==ch - && chk_ar(prot[i]->ar,useron)) - break; - if(i<total_prots) { - if(online==ON_LOCAL) { - bputs(text[EnterPath]); - if(getstr(path,60,K_UPPER|K_LINE)) { - backslash(path); - strcat(path,fname); - sprintf(str,"%s%s",dirpath,fname); - if(!mv(str,path,1)) - downloadfile(f); - for(j=0;j<total_dlevents;j++) - if(!stricmp(dlevent[j]->ext,f.name+9) - && chk_ar(dlevent[j]->ar,useron)) { - bputs(dlevent[j]->workstr); - external(cmdstr(dlevent[j]->cmd,path,nulstr - ,NULL) - ,EX_OUTL); - CRLF; } - } } - else { - delfiles(temp_dir,"*.*"); - if(dir[f.dir]->seqdev) { - lncntr=0; - seqwait(dir[f.dir]->seqdev); - bprintf(text[RetrievingFile],fname); - sprintf(str,"%s%s",dirpath,fname); - sprintf(path,"%s%s",temp_dir,fname); - mv(str,path,1); /* copy the file to temp dir */ - getnodedat(node_num,&thisnode,1); - thisnode.aux=0xf0; - putnodedat(node_num,thisnode); - CRLF; } - for(j=0;j<total_dlevents;j++) - if(!stricmp(dlevent[j]->ext,f.name+9) - && chk_ar(dlevent[j]->ar,useron)) { - bputs(dlevent[j]->workstr); - external(cmdstr(dlevent[j]->cmd,path,nulstr,NULL) - ,EX_OUTL); - CRLF; } - getnodedat(node_num,&thisnode,1); - action=NODE_DLNG; - unixtodos(now+f.timetodl,&date,&curtime); - thisnode.aux=(curtime.ti_hour*60)+curtime.ti_min; - putnodedat(node_num,thisnode); /* calculate ETA */ - start=time(NULL); - j=protocol(cmdstr(prot[i]->dlcmd,path,nulstr,NULL),0); - end=time(NULL); - if(dir[f.dir]->misc&DIR_TFREE) - starttime+=end-start; - if(prot[i]->misc&PROT_DSZLOG) { - if(checkprotlog(f)) - downloadfile(f); - else - notdownloaded(f.size,start,end); } - else { - if(!j) - downloadfile(f); - else { - bprintf(text[FileNotSent],f.name); - notdownloaded(f.size,start,end); } } - delfiles(temp_dir,"*.*"); - autohangup(); } } } - closefile(f); } - if(filespec[0] && !strchr(filespec,'*') && !strchr(filespec,'?')) break; } -FREE((char *)ixbbuf); -if(usrxfrbuf) - FREE(usrxfrbuf); -return(found); -} - - -/****************************************************************************/ -/* Checks directory data file for 'filename' (must be padded). If found, */ -/* it returns the 1, else returns 0. */ -/* Called from upload and bulkupload */ -/****************************************************************************/ -char findfile(uint dirnum, char *filename) -{ - char str[256],c,fname[13],HUGE16 *ixbbuf; - int file; - ulong length,l; - -sprintf(fname,"%.12s",filename); -strupr(fname); -for(c=8;c<12;c++) /* Turn FILENAME.EXT into FILENAMEEXT */ - fname[c]=fname[c+1]; -sprintf(str,"%s%s.IXB",dir[dirnum]->data_dir,dir[dirnum]->code); -if((file=nopen(str,O_RDONLY))==-1) return(0); -length=filelength(file); -if(!length) { - close(file); - return(0); } -if((ixbbuf=(char *)MALLOC(length))==NULL) { - close(file); - errormsg(WHERE,ERR_ALLOC,str,length); - return(0); } -if(lread(file,ixbbuf,length)!=length) { - close(file); - errormsg(WHERE,ERR_READ,str,length); - FREE((char *)ixbbuf); - return(0); } -close(file); -for(l=0;l<length;l+=F_IXBSIZE) { - for(c=0;c<11;c++) - if(fname[c]!=toupper(ixbbuf[l+c])) break; - if(c==11) break; } -FREE((char *)ixbbuf); -if(l!=length) - return(1); -return(0); -} - -/****************************************************************************/ -/* Prints one file's information on a single line to a file 'file' */ -/****************************************************************************/ -void listfiletofile(char *fname, char HUGE16 *buf, uint dirnum, int file) -{ - char str[256],exist=1; - uchar alt; - ulong cdt; - -strcpy(str,fname); -if(buf[F_MISC]!=ETX && (buf[F_MISC]-SP)&FM_EXTDESC) - strcat(str,"+"); -else - strcat(str," "); -write(file,str,13); -getrec((char *)buf,F_ALTPATH,2,str); -alt=(uchar)ahtoul(str); -sprintf(str,"%s%s",alt>0 && alt<=altpaths ? altpath[alt-1] - : dir[dirnum]->path,unpadfname(fname,tmp)); -if(dir[dirnum]->misc&DIR_FCHK && !fexist(str)) - exist=0; -getrec((char *)buf,F_CDT,LEN_FCDT,str); -cdt=atol(str); -if(!cdt) - strcpy(str," FREE"); -else - sprintf(str,"%7lu",cdt); -if(exist) - strcat(str," "); -else - strcat(str,"-"); -write(file,str,8); -getrec((char *)buf,F_DESC,LEN_FDESC,str); -write(file,str,strlen(str)); -write(file,crlf,2); -} - - - -/****************************************************************************/ -/* Handles start and stop routines for transfer protocols */ -/****************************************************************************/ -int protocol(char *cmdline, int cd) -{ - char tmp[128]; - int i; - -sprintf(tmp,"%sPROTOCOL.LOG",node_dir); -remove(tmp); /* Deletes the protocol log */ -if(useron.misc&AUTOHANG) - autohang=1; -else - autohang=yesno(text[HangUpAfterXferQ]); -if(sys_status&SS_ABORT) { /* if ctrl-c */ - autohang=0; - return(-1); } -bputs(text[StartXferNow]); -RIOSYNC(0); -lprintf("%s\r\n",cmdline); -if(cd) { - if(temp_dir[1]==':') /* fix for DSZ */ - setdisk(toupper(temp_dir[0])-'A'); - strcpy(tmp,temp_dir); - tmp[strlen(tmp)-1]=0; /* take off '\' */ - if(chdir(tmp)) - errormsg(WHERE,ERR_CHDIR,tmp,0); } -i=external(cmdline,EX_OUTL); /* EX_CC removed because of error level prob */ -if(online==ON_REMOTE) - rioctl(IOFB); -CRLF; -if(autohang) sys_status|=SS_PAUSEOFF; /* Pause off after download */ -return(i); -} - -/****************************************************************************/ -/* Invokes the timed auto-hangup after transfer routine */ -/****************************************************************************/ -void autohangup() -{ - char a,c,k; - -SYNC; -sys_status&=~SS_PAUSEOFF; /* turn pause back on */ -rioctl(IOFI); -if(!autohang) return; -lncntr=0; -bputs(text[Disconnecting]); -attr(GREEN); -outchar('['); -for(c=9,a=0;c>-1 && online && !a;c--) { - checkline(); - attr(LIGHTGRAY|HIGH); - bputs(itoa(c,tmp,10)); - attr(GREEN); - outchar(']'); - while((k=inkey(0))!=0 && online) { - if(toupper(k)=='H') { - c=0; - break; } - if(toupper(k)=='A') { - a=1; - break; } } - mswait(DELAY_AUTOHG); - if(!a) { - outchar(BS); - outchar(BS); } } -if(c==-1) { - bputs(text[Disconnected]); - hangup(); } -else - CRLF; -} - -/****************************************************************************/ -/* Checks dsz compatible log file for errors in transfer */ -/* Returns 1 if the file in the struct file_t was successfuly transfered */ -/****************************************************************************/ -char checkprotlog(file_t f) -{ - char str[256],size[128]; - int file; - FILE *stream; - -sprintf(str,"%sPROTOCOL.LOG",node_dir); -if((stream=fnopen(&file,str,O_RDONLY))==NULL) { - bprintf(text[FileNotSent],f.name); - if(f.dir<total_dirs) - sprintf(str,"Attempted to download %s (%s) from %s %s" - ,f.name,ultoac(f.size,size) - ,lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname); - else if(f.dir==total_dirs) - strcpy(str,"Attempted to download QWK packet"); - else if(f.dir==total_dirs+1) - sprintf(str,"Attempted to download attached file: %s",f.name); - logline("D!",str); - return(0); } -unpadfname(f.name,tmp); -if(tmp[strlen(tmp)-1]=='.') /* DSZ log uses FILE instead of FILE. */ - tmp[strlen(tmp)-1]=0; /* when there isn't an extension. */ -while(!ferror(stream)) { - if(!fgets(str,256,stream)) - break; - if(str[strlen(str)-2]==CR) - str[strlen(str)-2]=0; /* chop off CRLF */ - strupr(str); - if(strstr(str,tmp)) { /* Only check for name, Bimodem doesn't put path */ - logline(nulstr,str); - if(str[0]=='E' || str[0]=='L' || (str[6]==SP && str[7]=='0')) - break; /* E for Error or L for Lost Carrier */ - fclose(stream); /* or only sent 0 bytes! */ - return(1); } } -fclose(stream); -bprintf(text[FileNotSent],f.name); -if(f.dir<total_dirs) - sprintf(str,"Attempted to download %s (%s) from %s %s",f.name - ,ultoac(f.size,tmp),lib[dir[f.dir]->lib]->sname,dir[f.dir]->sname); -else - strcpy(str,"Attempted to download QWK packet"); -logline("D!",str); -return(0); -} - -/*****************************************************************************/ -/* View viewable file types from dir 'dirnum' */ -/* 'fspec' must be padded */ -/*****************************************************************************/ -void viewfiles(uint dirnum, char *fspec) -{ - char viewcmd[256]; - int i; - -curdirnum=dirnum; /* for ARS */ -sprintf(viewcmd,"%s%s",dir[dirnum]->path,fspec); -if(!fexist(viewcmd)) { - bputs(text[FileNotFound]); - return; } -padfname(fspec,tmp); -truncsp(tmp); -for(i=0;i<total_fviews;i++) - if(!strcmp(tmp+9,fview[i]->ext) && chk_ar(fview[i]->ar,useron)) { - strcpy(viewcmd,fview[i]->cmd); - break; } -if(i==total_fviews) { - bprintf(text[NonviewableFile],tmp+9); - return; } -sprintf(tmp,"%s%s",dir[dirnum]->path,fspec); -if((i=external(cmdstr(viewcmd,tmp,tmp,NULL),EX_OUTL|EX_OUTR|EX_INR|EX_CC))!=0) - errormsg(WHERE,ERR_EXEC,viewcmd,i); /* must of EX_CC to ^C */ -} - -/****************************************************************************/ -/* Compares filenames for ascending name sort */ -/****************************************************************************/ -int fnamecmp_a(char **str1, char **str2) -{ -return(strncmp(*str1,*str2,11)); -} - -/****************************************************************************/ -/* Compares filenames for descending name sort */ -/****************************************************************************/ -int fnamecmp_d(char **str1, char **str2) -{ -return(strncmp(*str2,*str1,11)); -} - -/****************************************************************************/ -/* Compares file upload dates for ascending date sort */ -/****************************************************************************/ -int fdatecmp_a(uchar **buf1, uchar **buf2) -{ - time_t date1,date2; - -date1=((*buf1)[14]|((long)(*buf1)[15]<<8)|((long)(*buf1)[16]<<16) - |((long)(*buf1)[17]<<24)); -date2=((*buf2)[14]|((long)(*buf2)[15]<<8)|((long)(*buf2)[16]<<16) - |((long)(*buf2)[17]<<24)); -if(date1>date2) return(1); -if(date1<date2) return(-1); -return(0); -} - -/****************************************************************************/ -/* Compares file upload dates for descending date sort */ -/****************************************************************************/ -int fdatecmp_d(uchar **buf1, uchar **buf2) -{ - time_t date1,date2; - -date1=((*buf1)[14]|((long)(*buf1)[15]<<8)|((long)(*buf1)[16]<<16) - |((long)(*buf1)[17]<<24)); -date2=((*buf2)[14]|((long)(*buf2)[15]<<8)|((long)(*buf2)[16]<<16) - |((long)(*buf2)[17]<<24)); -if(date1>date2) return(-1); -if(date1<date2) return(1); -return(0); -} - -/************************************************************************/ -/* Wait (for a limited period of time) for sequential dev to become */ -/* available for file retrieval */ -/************************************************************************/ -void seqwait(uint devnum) -{ - char loop=0; - int i; - time_t start; - node_t node; - - -if(!devnum) - return; -for(start=now=time(NULL);online && now-start<90;now=time(NULL)) { - if(msgabort()) /* max wait ^^^^ sec */ - break; - getnodedat(node_num,&thisnode,1); /* open and lock this record */ - for(i=1;i<=sys_nodes;i++) { - if(i==node_num) continue; - getnodedat(i,&node,1); - if((node.status==NODE_INUSE || node.status==NODE_QUIET) - && node.action==NODE_RFSD && node.aux==devnum) { - putnodedat(i,node); - break; } - putnodedat(i,node); } - if(i>sys_nodes) { - thisnode.action=NODE_RFSD; - thisnode.aux=devnum; - putnodedat(node_num,thisnode); /* write devnum, unlock, and ret */ - return; } - putnodedat(node_num,thisnode); - if(!loop) - bprintf(text[WaitingForDeviceN],devnum); - loop=1; - mswait(100); } - -} diff --git a/src/sbbs2/xfer_sec.c b/src/sbbs2/xfer_sec.c deleted file mode 100644 index 4b3ec2afec..0000000000 --- a/src/sbbs2/xfer_sec.c +++ /dev/null @@ -1,134 +0,0 @@ -#line 1 "XFER_SEC.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/*****************************************************/ -/* This file contains the single function xfer_sec() */ -/*****************************************************/ - -#include "sbbs.h" - -void xfer_cfg_cmd(); -void xfer_ext_cmd(char ch); -void xfer_str_cmd(char *str); - -void scandirs(char mode); - -extern char no_rip_menu; - -/****************************************************************************/ -/* Used to scan single or multiple directories. 'mode' is the scan type. */ -/****************************************************************************/ -void scandirs(char mode) -{ - char ch,str[256]; - int s; - uint i,k; - -if(!usrlibs) return; -mnemonics(text[DirLibOrAll]); -ch=getkeys("DLA\r",0); -if(sys_status&SS_ABORT || ch==CR) { - lncntr=0; - return; } -if(ch!='A') { - if(mode&FL_ULTIME) { /* New file scan */ - bprintf(text[NScanHdr],timestr(&ns_time)); - str[0]=0; } - else if(mode==FL_NO_HDR) { /* Search for a string */ - if(!getfilespec(tmp)) - return; - padfname(tmp,str); } - else if(mode==FL_FINDDESC) { /* Find text in description */ - if(!noyes(text[SearchExtendedQ])) - mode=FL_EXFIND; - if(sys_status&SS_ABORT) { - lncntr=0; - return; } - bputs(text[SearchStringPrompt]); - if(!getstr(str,40,K_LINE|K_UPPER)) { - lncntr=0; - return; } } } -if(ch=='D') { - if((s=listfiles(usrdir[curlib][curdir[curlib]],str,0,mode))==-1) - return; - bputs("\r\1>"); - if(s>1) - bprintf(text[NFilesListed],s); - else if(!s && !(mode&FL_ULTIME)) - bputs(text[FileNotFound]); - return; } -if(ch=='L') { - k=0; - for(i=0;i<usrdirs[curlib] && !msgabort();i++) { - attr(LIGHTGRAY); - outchar('.'); - if(i && !(i%5)) - bputs("\b\b\b\b\b \b\b\b\b\b"); - if(mode&FL_ULTIME /* New-scan */ - && (lib[usrlib[curlib]]->offline_dir==usrdir[curlib][i] - || dir[usrdir[curlib][i]]->misc&DIR_NOSCAN)) - continue; - else if((s=listfiles(usrdir[curlib][i],str,0,mode))==-1) - return; - else k+=s; } - bputs("\r\1>"); - if(k>1) - bprintf(text[NFilesListed],k); - else if(!k && !(mode&FL_ULTIME)) - bputs(text[FileNotFound]); - return; } - -scanalldirs(mode); -} - -/****************************************************************************/ -/* Scan all directories in all libraries for files */ -/****************************************************************************/ -void scanalldirs(char mode) -{ - char str[256]; - int s; - uint i,j,k,d; - -if(!usrlibs) return; -k=0; -if(mode&FL_ULTIME) { /* New file scan */ - bprintf(text[NScanHdr],timestr(&ns_time)); - str[0]=0; } -else if(mode==FL_NO_HDR) { /* Search for a string */ - if(!getfilespec(tmp)) - return; - padfname(tmp,str); } -else if(mode==FL_FINDDESC) { /* Find text in description */ - if(!noyes(text[SearchExtendedQ])) - mode=FL_EXFIND; - if(sys_status&SS_ABORT) { - lncntr=0; - return; } - bputs(text[SearchStringPrompt]); - if(!getstr(str,40,K_LINE|K_UPPER)) { - lncntr=0; - return; } } -for(i=d=0;i<usrlibs;i++) { - for(j=0;j<usrdirs[i] && !msgabort();j++,d++) { - attr(LIGHTGRAY); - outchar('.'); - if(d && !(d%5)) - bputs("\b\b\b\b\b \b\b\b\b\b"); - if(mode&FL_ULTIME /* New-scan */ - && (lib[usrlib[i]]->offline_dir==usrdir[i][j] - || dir[usrdir[i][j]]->misc&DIR_NOSCAN)) - continue; - else if((s=listfiles(usrdir[i][j],str,0,mode))==-1) - return; - else k+=s; } - if(j<usrdirs[i]) /* aborted */ - break; } -bputs("\r\1>"); -if(k>1) - bprintf(text[NFilesListed],k); -else if(!k && !(mode&FL_ULTIME)) - bputs(text[FileNotFound]); -} - diff --git a/src/sbbs2/xtrn.c b/src/sbbs2/xtrn.c deleted file mode 100644 index d7a1d14c93..0000000000 --- a/src/sbbs2/xtrn.c +++ /dev/null @@ -1,500 +0,0 @@ -#line 1 "XTRN.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/***************************************************************************/ -/* Functions that pertain to external programs (other EXE or COM programs) */ -/***************************************************************************/ - -#include "sbbs.h" -#include "cmdshell.h" - -#ifndef __FLAT__ - -#include "spawno.h" - -void interrupt (*oldfunc)(void); - -/*****************************************************************************/ -/* Interrupt routine to expand WWIV Ctrl-C# codes into ANSI escape sequences */ -/*****************************************************************************/ -void interrupt wwiv_expand() -{ - char str[256],al; - static int ctrl_c; - int i,j; - -al=_AL; -if(al!=3 && !ctrl_c) - oldfunc(); -else if(al!=3 && ctrl_c) { - ctrl_c=0; - if(useron.misc&ANSI) { - switch(al) { - default: - strcpy(str,"\x1b[0m"); /* low grey */ - break; - case '1': - strcpy(str,"\x1b[0;1;36m"); /* high cyan */ - break; - case '2': - strcpy(str,"\x1b[0;1;33m"); /* high yellow */ - break; - case '3': - strcpy(str,"\x1b[0;35m"); /* low magenta */ - break; - case '4': - strcpy(str,"\x1b[0;1;44m"); /* white on blue */ - break; - case '5': - strcpy(str,"\x1b[0;32m"); /* low green */ - break; - case '6': - strcpy(str,"\x1b[0;1;5;31m"); /* high blinking red */ - break; - case '7': - strcpy(str,"\x1b[0;1;34m"); /* high blue */ - break; - case '8': - strcpy(str,"\x1b[0;34m"); /* low blue */ - break; - case '9': - strcpy(str,"\x1b[0;36m"); /* low cyan */ - break; } - j=strlen(str); - for(i=0;i<j;i++) { - _AL=str[i]; - oldfunc(); } } } -else - ctrl_c=1; -} -#endif - -/****************************************************************************/ -/* Runs an external program directly using spawnvp */ -/****************************************************************************/ -int external(char *cmdline,char mode) -{ - char c,d,cmdlen,*arg[30],str[256],str2[256],fname[128],*p,x,y; - int i,file,rmode=0; - long l; - FILE *fp; -#ifdef __OS2__ - RESULTCODES rc; -#endif - -if(cmdline[0]=='*') { /* Baja module */ - strcpy(str,cmdline+1); - p=strchr(str,SP); - if(p) { - strcpy(main_csi.str,p+1); - *p=0; } - return(exec_bin(str,&main_csi)); } - -#ifdef __MSDOS__ -nosound(); /* if page is on, turn off sound */ -#endif -attr(LIGHTGRAY); /* set attributes to normal text */ - -strcpy(str,cmdline); /* Set str to program name only */ -p=strchr(str,SP); -if(p) *p=0; -strcpy(fname,str); - - -if(!(mode&EX_CC)) { - if(strcspn(cmdline,"<>|")!=strlen(cmdline)) - mode|=EX_CC; /* DOS I/O redirection; so, use command.com */ - else { - i=strlen(str); - if(i>4 && !stricmp(str+(i-4),".BAT")) /* specified .BAT file */ - mode|=EX_CC; - else { - strcat(str,".BAT"); - if(fexist(str)) /* and it's a .BAT file */ - mode|=EX_CC; } } } - -p=strrchr(fname,'\\'); -if(!p) p=strchr(fname,':'); -if(!p) p=fname; -else p++; - -#ifndef __FLAT__ - -for(i=0;i<total_swaps;i++) - if(!stricmp(p,swap[i]->cmd)) - break; -if(i<total_swaps) - mode|=EX_SWAP; - -#else - -for(i=0;i<total_os2pgms;i++) - if(!stricmp(p,os2pgm[i]->name)) - break; -if(i<total_os2pgms) { - mode|=EX_OS2; - if(os2pgm[i]->misc&OS2_POPEN) - mode|=EX_POPEN; } - -#endif - -#ifndef __FLAT__ - -if(node_swap&SWAP_NONE || mode&EX_WWIV) - mode&=~EX_SWAP; - -if(mode&EX_SWAP) { - if(lclwy()>1 || lclwx()>1) - lputs(crlf); - lputs("Swapping...\r\n"); } - -#endif - - -if(!(mode&EX_OS2) && mode&EX_CC) - sprintf(str,"%s /C %s", -#ifdef __OS2__ - node_comspec // Only used node_comspec for OS/2 ver -#else - comspec -#endif - ,cmdline); - -else strcpy(str,cmdline); -if(!(mode&EX_OS2) && strlen(str)>126) { - errormsg(WHERE,ERR_LEN,str,strlen(str)); - errorlevel=-1; - return(-1); } - -#ifndef __FLAT__ - -arg[0]=str; /* point to the beginning of the string */ -cmdlen=strlen(str); -for(c=0,d=1;c<cmdlen;c++) /* Break up command line */ - if(str[c]==SP) { - str[c]=0; /* insert nulls */ - arg[d++]=str+c+1; } /* point to the beginning of the next arg */ -arg[d]=0; - -#endif - -if(mode&EX_OUTR && (console&CON_R_ECHO)) - rmode|=INT29R; -if(mode&EX_OUTL) - rmode|=INT29L; -if(mode&EX_INR && (console&CON_R_INPUT)) - rmode|=INT16; - -#ifndef __FLAT__ - -if(rmode) - ivhctl(rmode); /* set DOS output interception vectors */ - -if(mode&EX_WWIV) { /* WWIV code expansion */ - rioctl(CPTOFF); /* turn off ctrl-p translation */ - oldfunc=getvect(0x29); - setvect(0x29,wwiv_expand); } - -if(com_port && sys_status&SS_COMISR && !(mode&(EX_OUTR|EX_INR))) { - riosync(0); - rioini(0,0); - sys_status&=~SS_COMISR; } - -if(!rmode) { /* clear the status line */ - lclini(node_scrnlen); - x=lclwx(); - y=lclwy(); - STATUSLINE; - lclxy(1,node_scrnlen); - lputc(CLREOL); - TEXTWINDOW; - lclxy(x,y); } - -if(mode&EX_SWAP) { /* set the resident size */ - if(rmode) - __spawn_resident=7000; /* was 6000 */ - else - __spawn_resident=0; - i=spawnvpeo(node_swapdir,arg[0],(const char **)arg - ,(const char **)environ); } -else - i=spawnvpe(P_WAIT,arg[0],arg,environ); - -#else //lif defined(__OS2__) - -if(com_port && !(mode&EX_POPEN) - && sys_status&SS_COMISR) { /* Uninstall COM routines */ - riosync(0); - rioini(0,0); - sys_status&=~SS_COMISR; } - -textattr(LIGHTGRAY); // Redundant -if(!(mode&EX_OS2)) { /* DOS pgm */ - if(lclwy()>1 || lclwx()>1) - lputs(crlf); - lprintf("Executing DOS program: %s\r\n",str); - sprintf(str2,"%sEXECDOS.DAT",node_dir); - if((file=nopen(str2,O_WRONLY|O_TRUNC|O_CREAT))!=-1) { - sprintf(str2,"V1.00\r\n%X\r\n%lu\r\n%u\r\n%X\r\n%X\r\n%lX\r\n%u\r\n" - "%s\r\n" - ,online==ON_REMOTE ? com_base:0 - ,com_irq,dte_rate,rmode,mode,useron.misc,node_num,str); - write(file,str2,strlen(str2)); - sprintf(str2,"%u\r\nDSZLOG=%s\r\n" - ,1 /* Total env vars to setup */ - ,getenv("DSZLOG")); - write(file,str2,strlen(str2)); - if(online) { - sprintf(str2,"%s\r\n%s\r\n%u\r\n%u\r\n%c\r\n%s\r\n%s\r\n" - ,useron.alias - ,useron.name - ,useron.level - ,getage(useron.birth) - ,useron.sex - ,useron.phone - ,useron.location); - write(file,str2,strlen(str2)); } - close(file); } - - sprintf(str,"%sEXECDOS.EXE %s",exec_dir,node_dir); - - x=wherex(); - y=wherey(); - i=system(str); - gotoxy(x,y); } -else { /* OS/2 pgm */ - window(1,1,80,node_scrnlen); - x=lclwx(); - y=lclwy(); - lclxy(1,node_scrnlen); - lputc(CLREOL); - lclxy(x,y); - i=system(cmdline); - lputs(crlf); - lputs(crlf); - lclxy(1,node_scrnlen-1); - } - -#ifdef __OS2__ -fixkbdmode(); -#endif -textattr(LIGHTGRAY); - -#endif - -#ifndef __WIN32__ -while(lkbrd(0)) /* suck up any chars in the keyboard buffer */ - ; -#endif - -#ifdef __MSDOS__ -setcbrk(0); - -lclatr(LIGHTGRAY); -c=wherey(); -if(c>=node_scrnlen) - c=node_scrnlen-1; -lclxy(wherex(),c); /* put the cursor where BIOS thinks it is */ - -#endif - -if(com_port && !(mode&EX_POPEN) -#ifndef __OS2__ - && !(mode&(EX_OUTR|EX_INR)) -#endif - ) { - comini(); - setrate(); - rioctl(IOSM|PAUSE|ABORT); } - -rioctl(CPTON); /* turn on ctrl-p translation */ - -#ifndef __FLAT__ -if(mode&EX_WWIV) - setvect(0x29,oldfunc); - -if(rmode) - ivhctl(0); /* replace DOS output interrupt vectors */ -#endif - -setdisk(node_disk); -strcpy(str,node_dir); -str[strlen(str)-1]=0; -if(chdir(str)) - errormsg(WHERE,ERR_CHDIR,str,0); - -#ifndef __FLAT__ -lclini(node_scrnlen-1); -#endif - -lncntr=0; -if(online) - statusline(); /* Replace status line after calling external program */ -errorlevel=i; -return(i); -} - -#ifndef __FLAT__ -extern uint riobp; -extern mswtyp; -#endif - -uint fakeriobp=0xffff; - -/*****************************************************************************/ -/* Returns command line generated from instr with %c replacments */ -/*****************************************************************************/ -char *cmdstr(char *instr, char *fpath, char *fspec, char *outstr) -{ - static char static_cmd[128]; - char str[256],str2[128],*cmd; - int i,j,len; - -if(outstr==NULL) - cmd=static_cmd; -else - cmd=outstr; -len=strlen(instr); -for(i=j=0;i<len && j<128;i++) { - if(instr[i]=='%') { - i++; - cmd[j]=0; - switch(toupper(instr[i])) { - case 'A': /* User alias */ - strcat(cmd,useron.alias); - break; - case 'B': /* Baud (DTE) Rate */ - strcat(cmd,ultoa(dte_rate,str,10)); - break; - case 'C': /* Connect Description */ - strcat(cmd,connection); - break; - case 'D': /* Connect (DCE) Rate */ - strcat(cmd,ultoa((ulong)cur_rate,str,10)); - break; - case 'E': /* Estimated Rate */ - strcat(cmd,ultoa((ulong)cur_cps*10,str,10)); - break; - case 'F': /* File path */ - strcat(cmd,fpath); - break; - case 'G': /* Temp directory */ - strcat(cmd,temp_dir); - break; - case 'H': /* Port Handle or Hardware Flow Control */ -#ifdef __OS2__ - strcat(cmd,itoa(rio_handle,str,10)); -#else - if(mdm_misc&MDM_CTS) - strcat(cmd,"Y"); - else - strcat(cmd,"N"); -#endif - break; - case 'I': /* UART IRQ Line */ - strcat(cmd,itoa(com_irq,str,10)); - break; - case 'J': - strcat(cmd,data_dir); - break; - case 'K': - strcat(cmd,ctrl_dir); - break; - case 'L': /* Lines per message */ - strcat(cmd,itoa(level_linespermsg[useron.level],str,10)); - break; - case 'M': /* Minutes (credits) for user */ - strcat(cmd,ultoa(useron.min,str,10)); - break; - case 'N': /* Node Directory (same as SBBSNODE environment var) */ - strcat(cmd,node_dir); - break; - case 'O': /* SysOp */ - strcat(cmd,sys_op); - break; - case 'P': /* COM Port */ - strcat(cmd,itoa(online==ON_LOCAL ? 0:com_port,str,10)); - break; - case 'Q': /* QWK ID */ - strcat(cmd,sys_id); - break; - case 'R': /* Rows */ - strcat(cmd,itoa(rows,str,10)); - break; - case 'S': /* File Spec */ - strcat(cmd,fspec); - break; - case 'T': /* Time left in seconds */ - gettimeleft(); - strcat(cmd,itoa(timeleft,str,10)); - break; - case 'U': /* UART I/O Address (in hex) */ - strcat(cmd,itoa(com_base,str,16)); - break; - case 'V': /* Synchronet Version */ - sprintf(str,"%s%c",VERSION,REVISION); - break; - case 'W': /* Time-slice API type (mswtype) */ -#ifndef __FLAT__ - strcat(cmd,itoa(mswtyp,str,10)); -#endif - break; - case 'X': - strcat(cmd,shell[useron.shell]->code); - break; - case '&': /* Address of msr */ -#ifndef __FLAT__ - sprintf(str,"%lu",sys_status&SS_DCDHIGH ? &fakeriobp - : online==ON_REMOTE ? &riobp-1 : 0); - strcat(cmd,str); -#else - strcat(cmd,"%&"); -#endif - break; - case 'Y': - strcat(cmd, -#ifdef __OS2__ - node_comspec -#else - comspec -#endif - ); - break; - case 'Z': - strcat(cmd,text_dir); - break; - case '!': /* EXEC Directory */ - strcat(cmd,exec_dir); - break; - case '#': /* Node number (same as SBBSNNUM environment var) */ - sprintf(str,"%d",node_num); - strcat(cmd,str); - break; - case '*': - sprintf(str,"%03d",node_num); - strcat(cmd,str); - break; - case '$': /* Credits */ - strcat(cmd,ultoa(useron.cdt+useron.freecdt,str,10)); - break; - case '%': /* %% for percent sign */ - strcat(cmd,"%"); - break; - default: /* unknown specification */ - if(isdigit(instr[i])) { - sprintf(str,"%0*d",instr[i]&0xf,useron.number); - strcat(cmd,str); } -/* - else - errormsg(WHERE,ERR_CHK,instr,i); -*/ - break; } - j=strlen(cmd); } - else - cmd[j++]=instr[i]; } -cmd[j]=0; - -return(cmd); -} - diff --git a/src/sbbs2/xtrn_ovl.c b/src/sbbs2/xtrn_ovl.c deleted file mode 100644 index 3066305eb9..0000000000 --- a/src/sbbs2/xtrn_ovl.c +++ /dev/null @@ -1,1459 +0,0 @@ -#line 1 "XTRN_OVL.C" - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -#include "sbbs.h" - -char *hungupstr="\1n\1h%s\1n hung up on \1h%s\1n %s\r\n"; - -#ifndef __FLAT__ -extern uint riobp; -#endif - -extern mswtyp; -extern uint fakeriobp; - -/****************************************************************************/ -/* Convert C string to pascal string */ -/****************************************************************************/ -void str2pas(char *instr, char *outstr) -{ - int i; - -outstr[0]=strlen(instr); -for(i=0;i<outstr[0];i++) - outstr[i+1]=instr[i]; -} - -/****************************************************************************/ -/* Convert from unix time (seconds since 1/70) to julian (days since 1900) */ -/****************************************************************************/ -int unixtojulian(time_t unix) -{ - int days[12]={0,31,59,90,120,151,181,212,243,273,304,334}; - long j; - struct date d; - struct time t; - -unixtodos(unix,&d,&t); -j=36525L*d.da_year; -if(!(j%100) && d.da_mon<3) - j--; -j=(j-(1900*36525))/100; -j+=d.da_day+days[d.da_mon-1]; -return(j); -} - -/****************************************************************************/ -/* Convert julian date into unix format */ -/****************************************************************************/ -time_t juliantounix(ulong j) -{ - int days[2][12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, - 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335}; - long temp; - int leap,counter; - - if(!j) return(0L); - - date.da_year=(100L*j)/36525L; - temp=(long)date.da_year*36525L; - date.da_year+=1900; - j-=temp/100L; - - if (!(temp%100)) { - j++; - leap=1; } - else leap=0; - - for(date.da_mon=counter=0;counter<12;counter++) - if(days[leap][counter]<j) - date.da_mon=counter; - - date.da_day=j-days[leap][date.da_mon]; - date.da_mon++; /* go from 0 to 1 based */ - - curtime.ti_hour=curtime.ti_min=curtime.ti_sec=0; - return(dostounix(&date,&curtime)); -} - -/****************************************************************************/ -/* Creates various types of xtrn (Doors, Chains, etc.) data files. */ -/****************************************************************************/ -void xtrndat(char *name, char *dropdir, uchar type, ulong tleft) -{ - char str[1024],tmp2[128],c,*p; - int i,file; - long l; - ushort w; - FILE * stream; - struct time lastcall; - stats_t stats; - -if(type==XTRN_SBBS) { /* SBBS XTRN.DAT file */ - sprintf(str,"%sXTRN.DAT",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - sprintf(str,"%s\r\n%s\r\n%s\r\n%s\r\n" - ,name /* User name */ - ,sys_name /* System name */ - ,sys_op /* Sysop name */ - ,sys_guru); /* Guru name */ - write(file,str,strlen(str)); - - sprintf(str,"%s\r\n%s\r\n%u\r\n%u\r\n%lu\r\n%s\r\n%lu\r\n%lu\r\n" - ,ctrl_dir /* Ctrl dir */ - ,data_dir /* Data dir */ - ,sys_nodes /* Total system nodes */ - ,node_num /* Current node */ - ,tleft /* User Timeleft in seconds */ - ,useron.misc&ANSI /* User ANSI ? (Yes/Mono/No) */ - ? useron.misc&COLOR - ? "Yes":"Mono":"No" - ,rows /* User Screen lines */ - ,useron.cdt+useron.freecdt); /* User Credits */ - write(file,str,strlen(str)); - - sprintf(str,"%u\r\n%u\r\n%s\r\n%c\r\n%u\r\n%s\r\n" - ,useron.level /* User main level */ - ,useron.level /* User transfer level */ - ,useron.birth /* User birthday */ - ,useron.sex /* User sex (M/F) */ - ,useron.number /* User number */ - ,useron.phone); /* User phone number */ - write(file,str,strlen(str)); - - sprintf(str,"%u\r\n%u\r\n%x\r\n%lu\r\n%s\r\n%s\r\n" - "%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%lu\r\n" - ,online==ON_LOCAL ? 0:com_port /* Com port or 0 if local */ - ,com_irq /* Com IRQ */ - ,com_base /* Com base in hex */ - ,dte_rate /* Com rate */ - ,mdm_misc&MDM_CTS ? "Yes":"No" /* Hardware flow ctrl Y/N */ - ,mdm_misc&MDM_STAYHIGH ? "Yes":"No" /* Locked DTE rate Y/N */ - ,mdm_init /* Modem initialization string */ - ,mdm_spec /* Modem special init string */ - ,mdm_term /* Modem terminal mode init str */ - ,mdm_dial /* Modem dial string */ - ,mdm_offh /* Modem off-hook string */ - ,mdm_answ /* Modem answer string */ -#ifndef __FLAT__ - ,sys_status&SS_DCDHIGH ? &fakeriobp : &riobp-1 /* Modem status register */ -#else - ,0 -#endif - ); - write(file,str,strlen(str)); - - sprintf(str,"%u\r\n",total_xtrns); - write(file,str,strlen(str)); /* Total external programs */ - - for(i=0;i<total_xtrns;i++) { /* Each program's name */ - if(SYSOP || chk_ar(xtrn[i]->ar,useron)) - strcpy(str,xtrn[i]->name); - else - str[0]=0; /* Blank if no access */ - strcat(str,crlf); - write(file,str,strlen(str)); } - - sprintf(str,"%s\r\n%s\r\n" - ,ltoaf(useron.flags1,tmp) /* Main flags */ - ,ltoaf(useron.flags2,tmp2) /* Transfer flags */ - ); - write(file,str,strlen(str)); - - sprintf(str,"%s\r\n%s\r\n%lx\r\n%s\r\n%s\r\n%s\r\n" - ,ltoaf(useron.exempt,tmp) /* Exemptions */ - ,ltoaf(useron.rest,tmp2) /* Restrictions */ - ,useron.expire /* Expiration date in unix form */ - ,useron.address /* Address */ - ,useron.location /* City/State */ - ,useron.zipcode /* Zip/Postal code */ - ); - write(file,str,strlen(str)); - - sprintf(str,"%s\r\n%s\r\n%d\r\n%s\r\n%lu\r\n%s\r\n%s\r\n%s\r\n%s\r\n" - "%lx\r\n%d\r\n" - ,ltoaf(useron.flags3,tmp) /* Flag set #3 */ - ,ltoaf(useron.flags4,tmp2) /* Flag set #4 */ - ,mswtyp /* Time-slice type */ - ,useron.name /* Real name/company */ - ,cur_rate /* DCE rate */ - ,exec_dir - ,text_dir - ,temp_dir - ,sys_id - ,node_misc -#ifdef __FLAT__ - ,rio_handle -#else - ,-1 -#endif - ); - write(file,str,strlen(str)); - - close(file); } - -else if(type==XTRN_WWIV) { /* WWIV CHAIN.TXT File */ - sprintf(str,"%sCHAIN.TXT",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - sprintf(str,"%u\r\n%s\r\n%s\r\n%s\r\n%u\r\n%c\r\n" - ,useron.number /* User number */ - ,name /* User name */ - ,useron.name /* User real name */ - ,nulstr /* User call sign */ - ,getage(useron.birth) /* User age */ - ,useron.sex); /* User sex (M/F) */ - strupr(str); - write(file,str,strlen(str)); - - sprintf(str,"%lu\r\n%s\r\n%u\r\n%lu\r\n%u\r\n%u\r\n%u\r\n%u\r\n%u\r\n" - ,useron.cdt+useron.freecdt /* Gold */ - ,unixtodstr(useron.laston,tmp) /* User last on date */ - ,80 /* User screen width */ - ,rows /* User screen length */ - ,useron.level /* User SL */ - ,0 /* Cosysop? */ - ,SYSOP /* Sysop? (1/0) */ - ,(useron.misc&ANSI) ? 1:0 /* ANSI ? (1/0) */ - ,online==ON_REMOTE); /* Remote (1/0) */ - write(file,str,strlen(str)); - - sprintf(str,"%lu\r\n%s\r\n%s\r\n%s\r\n%lu\r\n%d\r\n%s\r\n%s\r\n" - "%u\r\n%u\r\n%lu\r\n%u\r\n%lu\r\n%u\r\n%s\r\n" - ,tleft /* Time left in seconds */ - ,node_dir /* Gfiles dir (log dir) */ - ,data_dir /* Data dir */ - ,"NODE.LOG" /* Name of log file */ - ,dte_rate /* DTE rate */ - ,com_port /* COM port number */ - ,sys_name /* System name */ - ,sys_op /* Sysop name */ - ,0 /* Logon time (sec past 12am) */ - ,0 /* Current time (sec past 12am) */ - ,useron.ulb/1024UL /* User uploaded kbytes */ - ,useron.uls /* User uploaded files */ - ,useron.dlb/1024UL /* User downloaded kbytes */ - ,useron.dls /* User downloaded files */ - ,"8N1"); /* Data, parity, stop bits */ - write(file,str,strlen(str)); - - close(file); } - -else if(type==XTRN_GAP) { /* Gap DOOR.SYS File */ - sprintf(str,"%sDOOR.SYS",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - sprintf(str,"COM%d:\r\n%lu\r\n%u\r\n%u\r\n%lu\r\n%c\r\n%c\r\n%c\r\n%c\r\n" - ,online==ON_REMOTE ? com_port:0 /* 01: COM port - 0 if Local */ - ,cur_rate /* 02: DCE rate */ - ,8 /* 03: Data bits */ - ,node_num /* 04: Node number */ - ,dte_rate /* 05: DTE rate */ - ,console&CON_L_ECHO ? 'Y':'N' /* 06: Screen display */ - ,'Y' /* 07: Printer toggle */ - ,'Y' /* 08: Page bell */ - ,'Y'); /* 09: Caller alarm */ - write(file,str,strlen(str)); - - sprintf(str,"%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n" - ,name /* 10: User name */ - ,useron.location /* 11: User location */ - ,useron.phone /* 12: User home phone */ - ,useron.phone /* 13: User work/data phone */ - ,useron.pass); /* 14: User password */ - write(file,str,strlen(str)); - - sprintf(str,"%u\r\n%u\r\n%s\r\n%lu\r\n%lu\r\n%s\r\n" - ,useron.level /* 15: User security level */ - ,useron.logons /* 16: User total logons */ - ,unixtodstr(useron.laston,tmp) /* 17: User last on date */ - ,tleft /* 18: User time left in sec */ - ,tleft/60 /* 19: User time left in min */ - ,useron.misc&NO_EXASCII /* 20: GR if COLOR ANSI */ - ? "7E" : (useron.misc&(ANSI|COLOR))==(ANSI|COLOR) ? "GR" : "NG"); - write(file,str,strlen(str)); - - sprintf(str,"%lu\r\n%c\r\n%s\r\n%u\r\n%s\r\n%u\r\n%c\r\n%u\r\n%u\r\n" - ,rows /* 21: User screen length */ - ,useron.misc&EXPERT ? 'Y':'N' /* 22: Expert? (Y/N) */ - ,ltoaf(useron.flags1,tmp2) /* 23: Registered conferences */ - ,0 /* 24: Conference came from */ - ,unixtodstr(useron.expire,tmp) /* 25: User expiration date */ - ,useron.number /* 26: User number */ - ,'Y' /* 27: Default protocol */ - ,useron.uls /* 28: User total uploads */ - ,useron.dls); /* 29: User total downloads */ - write(file,str,strlen(str)); - - sprintf(str,"%u\r\n%lu\r\n%s\r\n%s\r\n%s\r\n%s" - "\r\n%s\r\n%02d:%02d\r\n%c\r\n" - ,0 /* 30: Kbytes downloaded today */ - ,(useron.cdt+useron.freecdt)/1024UL /* 31: Max Kbytes to download today */ - ,useron.birth /* 32: User birthday */ - ,node_dir /* 33: Path to MAIN directory */ - ,data_dir /* 34: Path to GEN directory */ - ,sys_op /* 35: Sysop name */ - ,nulstr /* 36: Alias name */ - ,0 // sys_eventtime/60 /* 37: Event time HH:MM */ - ,0 // sys_eventtime%60 - ,'Y'); /* 38: Error correcting connection */ - write(file,str,strlen(str)); - - unixtodos(ns_time,&date,&curtime); - sprintf(str,"%c\r\n%c\r\n%u\r\n%lu\r\n%02d/%02d/%02d\r\n" - ,(useron.misc&(NO_EXASCII|ANSI|COLOR))==ANSI - ? 'Y':'N' /* 39: ANSI supported but NG mode */ - ,'Y' /* 40: Use record locking */ - ,14 /* 41: BBS default color */ - ,useron.min /* 42: Time credits in minutes */ - ,date.da_mon /* 43: File new-scan date */ - ,date.da_day - ,TM_YEAR(date.da_year-1900)); - write(file,str,strlen(str)); - - unixtodos(logontime,&date,&curtime); - unixtodos(useron.laston,&date,&lastcall); - sprintf(str,"%02d:%02d\r\n%02d:%02d\r\n%u\r\n%u\r\n%lu\r\n" - "%lu\r\n%s\r\n%u\r\n%u\r\n" - ,curtime.ti_hour /* 44: Time of this call */ - ,curtime.ti_min - ,lastcall.ti_hour /* 45: Time of last call */ - ,lastcall.ti_min - ,999 /* 46: Max daily files available */ - ,0 /* 47: Files downloaded so far today */ - ,useron.ulb/1024UL /* 48: Total Kbytes uploaded */ - ,useron.dlb/1024UL /* 49: Total Kbytes downloaded */ - ,useron.comment /* 50: User comment */ - ,0 /* 51: Total doors opened */ - ,useron.posts); /* 52: User message left */ - write(file,str,strlen(str)); - - close(file); } - -else if(type==XTRN_RBBS || type==XTRN_RBBS1) { - if(type==XTRN_RBBS) - sprintf(str,"%sDORINFO%X.DEF",dropdir,node_num); /* support 1-F */ - else - sprintf(str,"%sDORINFO1.DEF",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - strcpy(tmp,sys_op); - p=strchr(tmp,SP); - if(p) - *(p++)=0; - else - p=nulstr; - - sprintf(str,"%s\r\n%s\r\n%s\r\nCOM%d\r\n%lu BAUD,N,8,1\r\n%u\r\n" - ,sys_name /* Name of BBS */ - ,tmp /* Sysop's firstname */ - ,p /* Sysop's lastname */ - ,online==ON_REMOTE ? com_port:0 /* COM port number, 0 if local */ - ,dte_rate /* DTE rate */ - ,0); /* Network type */ - strupr(str); - write(file,str,strlen(str)); - - strcpy(tmp,name); - p=strchr(tmp,SP); - if(p) - *(p++)=0; - else - p=nulstr; - sprintf(str,"%s\r\n%s\r\n%s\r\n%u\r\n%u\r\n%lu\r\n" - ,tmp /* User's firstname */ - ,p /* User's lastname */ - ,useron.location /* User's city */ - ,(useron.misc&ANSI)==ANSI /* 1=ANSI 0=ASCII */ - ,useron.level /* Security level */ - ,tleft/60); /* Time left in minutes */ - strupr(str); - write(file,str,strlen(str)); - - close(file); - - sprintf(str,"%sEXITINFO.BBS",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - w=dte_rate; - write(file,&w,sizeof(short)); /* BaudRate */ - /* SysInfo */ - getstats(0,&stats); - write(file,&stats.logons,sizeof(long)); /* CallCount */ - write(file,nulstr,36); /* LastCallerName */ - write(file,nulstr,36); /* LastCallerAlias */ - write(file,nulstr,92); /* ExtraSpace */ - /* TimeLogInfo */ - write(file,nulstr,9); /* StartDate */ - write(file,nulstr,24*sizeof(short)); /* BusyPerHour */ - write(file,nulstr,7*sizeof(short)); /* BusyPerDay */ - /* UserInfo */ - str2pas(name,str); /* Name */ - write(file,str,36); - str2pas(useron.location,str); - write(file,str,26); /* City */ - str2pas(useron.pass,str); - write(file,str,16); /* Pwd */ - str2pas(useron.phone,str); - write(file,str,13); /* DataPhone */ - write(file,str,13); /* HomePhone */ - unixtodos(useron.laston,&date,&lastcall); - sprintf(tmp,"%02d:%02d",lastcall.ti_hour,lastcall.ti_min); - str2pas(tmp,str); - write(file,str,6); /* LastTime */ - unixtodstr(useron.laston,tmp); - str2pas(tmp,str); - write(file,str,9); /* LastDate */ - c=0; - if(useron.misc&DELETED) c|=(1<<0); - if(useron.misc&CLRSCRN) c|=(1<<1); - if(useron.misc&UPAUSE) c|=(1<<2); - if(useron.misc&ANSI) c|=(1<<3); - if(useron.sex=='F') c|=(1<<7); - write(file,&c,1); /* Attrib */ - write(file,&useron.flags1,4); /* Flags */ - i=0; - w=0; - write(file,&w,sizeof(short)); /* Credit */ - write(file,&w,sizeof(short)); /* Pending */ - write(file,&useron.posts,sizeof(short)); /* TimesPosted */ - write(file,&w,sizeof(short)); /* HighMsgRead */ - w=useron.level; - write(file,&w,sizeof(short)); /* SecLvl */ - w=0; - write(file,&w,sizeof(short)); /* Times */ - write(file,&useron.uls,sizeof(short)); /* Ups */ - write(file,&useron.dls,sizeof(short)); /* Downs */ - w=useron.ulb/1024UL; - write(file,&w,sizeof(short)); /* UpK */ - w=useron.dlb/1024UL; - write(file,&w,sizeof(short)); /* DownK */ - w=logon_dlb/1024UL; - write(file,&w,sizeof(short)); /* TodayK */ - w=0; - write(file,&w,sizeof(short)); /* Elapsed */ - write(file,&w,sizeof(short)); /* Len */ - write(file,&w,sizeof(short)); /* CombinedPtr */ - write(file,&w,sizeof(short)); /* AliasPtr */ - l=0; - write(file,&l,sizeof(long)); /* Birthday (as a long?) */ - /* EventInfo */ - c=0; - write(file,&c,sizeof(char)); /* Status */ - write(file,&l /* sys_eventtime */,sizeof(long)); /* RunTime */ - write(file,&c,sizeof(char)); /* ErrorLevel */ - c=0xff; - write(file,&c,sizeof(char)); /* Days */ - // c=sys_eventnode==node_num || sys_misc&SM_TIMED_EX ? 1 : 0; - c=0; - write(file,&c,sizeof(char)); /* Forced */ - if(!total_events) - l=0; - else - l=event[0]->last; - write(file,&l,sizeof(long)); /* LastTimeRun */ - memset(str,0,40); - write(file,str,7); /* Spare */ - - c=0; - write(file,&c,1); /* NetMailEntered */ - write(file,&c,1); /* EchoMailEntered */ - - unixtodos(logontime,&date,&curtime); - sprintf(tmp,"%02d:%02d",curtime.ti_hour,curtime.ti_min); - str2pas(tmp,str); - write(file,str,6); /* LoginTime */ - unixtodstr(logontime,tmp); - str2pas(tmp,str); - write(file,str,9); /* LoginDate */ - write(file,&level_timepercall[useron.level],sizeof(short)); /* TmLimit */ - write(file,&logontime,sizeof(long)); /* LoginSec */ - write(file,&useron.cdt,sizeof(long)); /* Credit */ - write(file,&useron.number,sizeof(short)); /* UserRecNum */ - write(file,&i,2); /* ReadThru */ - write(file,&i,2); /* PageTimes */ - write(file,&i,2); /* DownLimit */ - c=sys_status&SS_SYSPAGE ? 1:0; - write(file,&c,1); /* WantChat */ - c=0; - write(file,&c,1); /* GosubLevel */ - - memset(str,0,255); - for(i=1;i<20;i++) - write(file,str,9); /* GosubData */ - write(file,str,9); /* Menu */ - c=useron.misc&CLRSCRN ? 1:0; - write(file,&c,1); /* ScreenClear */ - c=useron.misc&UPAUSE ? 1:0; - write(file,&c,1); /* MorePrompts */ - c=useron.misc&NO_EXASCII ? 0:1; - write(file,&c,1); /* GraphicsMode */ - c=useron.xedit ? 1:0; - write(file,&c,1); /* ExternEdit */ - i=rows; - write(file,&i,2); /* ScreenLength */ - c=1; - write(file,&c,1); /* MNP_Connect */ - write(file,str,49); /* ChatReason */ - c=0; - write(file,&c,1); /* ExternLogoff */ - c=useron.misc&ANSI ? 1:0; - write(file,&c,1); /* ANSI_Capable */ - close(file); - } - -else if(type==XTRN_WILDCAT) { /* WildCat CALLINFO.BBS File */ - sprintf(str,"%sCALLINFO.BBS",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - if(online==ON_LOCAL) i=5; - else - switch(dte_rate) { - case 300: - i=1; - break; - case 1200: - i=2; - break; - case 2400: - i=0; - break; - case 9600: - i=3; - break; - case 19200: - i=4; - break; - case 38400: - i=6; - break; - default: - i=7; - break; } - sprintf(str,"%s\r\n%u\r\n%s\r\n%u\r\n%lu\r\n%s\r\n%s\r\n%u\r\n" - ,name /* User name */ - ,i /* DTE rate */ - ,useron.location /* User location */ - ,useron.level /* Security level */ - ,tleft/60 /* Time left in min */ - ,useron.misc&ANSI ? "COLOR":"MONO" /* ANSI ??? */ - ,useron.pass /* Password */ - ,useron.number); /* User number */ - write(file,str,strlen(str)); - - unixtodos(now,&date,&curtime); - sprintf(str,"%lu\r\n%02d:%02d\r\n%02d:%02d %02d/%02d/%02d\r\n%s\r\n" - ,tleft /* Time left in seconds */ - ,curtime.ti_hour,curtime.ti_min /* Current time HH:MM */ - ,curtime.ti_hour,curtime.ti_min /* Current time and date HH:MM */ - ,date.da_mon,date.da_day /* MM/DD/YY */ - ,TM_YEAR(date.da_year-1900) - ,nulstr); /* Conferences with access */ - write(file,str,strlen(str)); - - unixtodos(useron.laston,&date,&lastcall); - sprintf(str,"%u\r\n%u\r\n%u\r\n%u\r\n%s\r\n%s %02u:%02u\r\n" - ,0 /* Daily download total */ - ,0 /* Max download files */ - ,0 /* Daily download k total */ - ,0 /* Max download k total */ - ,useron.phone /* User phone number */ - ,unixtodstr(useron.laston,tmp) /* Last on date and time */ - ,lastcall.ti_hour /* MM/DD/YY HH:MM */ - ,lastcall.ti_min); - write(file,str,strlen(str)); - - unixtodos(ns_time,&date,&curtime); - sprintf(str,"%s\r\n%s\r\n%02d/%02d/%02d\r\n%u\r\n%lu\r\n%u" - "\r\n%u\r\n%u\r\n" - ,useron.misc&EXPERT /* Expert or Novice mode */ - ? "EXPERT":"NOVICE" - ,"All" /* Transfer Protocol */ - ,date.da_mon,date.da_day /* File new-scan date */ - ,TM_YEAR(date.da_year-1900) /* in MM/DD/YY */ - ,useron.logons /* Total logons */ - ,rows /* Screen length */ - ,0 /* Highest message read */ - ,useron.uls /* Total files uploaded */ - ,useron.dls); /* Total files downloaded */ - write(file,str,strlen(str)); - - sprintf(str,"%u\r\n%s\r\nCOM%u\r\n%s\r\n%lu\r\n%s\r\n%s\r\n" - ,8 /* Data bits */ - ,online==ON_LOCAL?"LOCAL":"REMOTE" /* Online local or remote */ - ,com_port /* COMx port */ - ,useron.birth /* User birthday */ - ,dte_rate /* DTE rate */ - ,"FALSE" /* Already connected? */ - ,"Normal Connection"); /* Normal or ARQ connect */ - write(file,str,strlen(str)); - - sprintf(str,"%02d/%02d/%02d %02d:%02d\r\n%u\r\n%u\r\n" - ,date.da_mon,date.da_day /* Current date MM/DD/YY */ - ,TM_YEAR(date.da_year-1900) - ,curtime.ti_hour,curtime.ti_min /* Current time HH:MM */ - ,node_num /* Node number */ - ,0); /* Door number */ - write(file,str,strlen(str)); - - close(file); } - -else if(type==XTRN_PCBOARD) { /* PCBoard Files */ - sprintf(str,"%sPCBOARD.SYS",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - sprintf(str,"%2d%2d%2d%2d%c%2d%c%c%5u%-5.5s" - ,-1 /* Display on/off */ - ,0 /* Printer on/off */ - ,sys_status&SS_SYSPAGE ? -1:0 /* Page Bell on/off */ - ,node_misc&NM_ANSALARM ? -1:0 /* Caller Alarm on/off */ - ,SP /* Sysop next flag */ - ,0 /* Error corrected */ - ,useron.misc&NO_EXASCII ? '7' /* Graphics mode */ - : (useron.misc&(COLOR|ANSI))==(COLOR|ANSI) ? 'Y':'N' - ,'A' /* Node chat status */ - ,(uint)dte_rate /* DTE Port Speed */ - ,connection /* Connection description */ - ); - write(file,str,23); - - write(file,&useron.number,2); /* User record number */ - - strcpy(tmp,name); - p=strchr(tmp,SP); - if(p) *p=0; - sprintf(str,"%-15.15s%-12s" - ,tmp /* User's first name */ - ,useron.pass); /* User's password */ - write(file,str,27); - - unixtodos(logontime,&date,&curtime); - i=(curtime.ti_hour*60)+curtime.ti_min; - write(file,&i,2); /* Logon time in min since mid */ - - now=time(NULL); - i=-(((now-starttime)/60)+useron.ttoday); /* Negative minutes used */ - write(file,&i,2); - - sprintf(str,"%02d:%02d",curtime.ti_hour,curtime.ti_min); - write(file,str,5); - - i=level_timepercall[useron.level]; /* Time allowed on */ - write(file,&i,2); - - i=0; /* Allowed K-bytes for D/L */ - write(file,&i,2); - write(file,&i,1); /* Conference user was in */ - write(file,&i,2); /* Conferences joined */ - write(file,&i,2); /* "" */ - write(file,&i,2); /* "" */ - write(file,&i,2); /* Conferences scanned */ - write(file,&i,2); /* "" */ - write(file,&i,2); /* Conference add time */ - write(file,&i,2); /* Upload/Sysop Chat time min */ - - strcpy(str," "); - write(file,str,4); /* Language extension */ - - sprintf(str,"%-25.25s",name); /* User's full name */ - write(file,str,25); - - i=(tleft/60); - write(file,&i,2); /* Minutes remaining */ - - write(file,&node_num,1); /* Node number */ - - sprintf(str,"%02d:%02d%2d%2d" /* Scheduled Event time */ - ,0 // sys_eventtime/60 - ,0 // sys_eventtime%60 - ,0 // sys_timed[0] ? -1:0 /* Event active ? */ - ,0 /* Slide event ? */ - ); - write(file,str,9); - - l=0L; - write(file,&l,4); /* Memorized message number */ - - sprintf(str,"%d%c%c%d%s%c%c%d%d%d%c%c" - ,com_port /* COM Port number */ - ,SP /* Reserved */ - ,SP /* "" */ - ,(useron.misc&ANSI)==ANSI /* 1=ANSI 0=NO ANSI */ - ,"01-01-80" /* last event date */ - ,0,0 /* last event minute */ - ,0 /* caller exited to dos */ - ,sys_status&SS_EVENT ? 1:0 /* event up coming */ - ,0 /* stop uploads */ - ,0,0 /* conference user was in */ - ); - write(file,str,19); - - close(file); /* End of PCBOARD.SYS creation */ - - sprintf(str,"%sUSERS.SYS",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - /* Write goof-ball header */ - - i=145; - write(file,&i,2); /* PCBoard version number (i.e. 145) */ - l=useron.number; - write(file,&l,4); /* Record number for USER's file */ - i=218; - write(file,&i,2); /* Size of "fixed" user record */ - i=1; - write(file,&i,2); /* Number of conference areas */ - i=7; - write(file,&i,2); /* Number of bit map fields for conferences */ - i=5; - write(file,&i,2); /* Size of each bit map field */ - memset(str,0,15); - write(file,str,15); /* Name of Third Party Application (if any) */ - i=0; - write(file,&i,2); /* Version number for application (if any) */ - write(file,&i,2); /* Size of a "fixed length" record (if any) */ - write(file,&i,2); /* Size of conference record (if any) */ - l=0; - write(file,&l,4); /* Offset of AppRec into USERS.INF (if any) */ - i=0; - write(file,&i,1); /* 1, if USERS.SYS file has been updated */ - - /* Write fixed record portion */ - - write(file,name,26); /* Name */ - sprintf(str,"%.24s",useron.location); - write(file,str,25); /* Location */ - write(file,useron.pass,13); /* Password */ - write(file,useron.phone,14); /* Business or Data Phone */ - write(file,useron.phone,14); /* Home or Voice Phone */ - i=unixtojulian(useron.laston); - write(file,&i,2); /* Date last on */ - unixtodos(useron.laston,&date,&curtime); - sprintf(str,"%02d:%02d",curtime.ti_hour,curtime.ti_min); - write(file,str,6); /* Last time on */ - if(useron.misc&EXPERT) - i=1; - else - i=0; - write(file,&i,1); /* Expert mode */ - i='Z'; - write(file,&i,1); /* Protocol (A-Z) */ - if(useron.misc&CLRSCRN) - i=2; - else - i=0; - write(file,&i,1); /* bit packed flags */ - i=0; - write(file,&i,2); /* DOS date for last DIR Scan */ - i=useron.level; - write(file,&i,2); /* Security level */ - write(file,&useron.logons,2); /* Number of times caller has connected */ - c=rows; - write(file,&c,1); /* Page length */ - write(file,&useron.uls,2); /* Number of uploads */ - write(file,&useron.dls,2); /* Number of downloads */ - l=0; - write(file,&l,4); /* Number of download bytes today */ - write(file,&useron.note,31); /* Comment #1 */ - write(file,&useron.comp,31); /* Comment #2 */ - i=(now-starttime)/60; - write(file,&i,2); /* Minutes online (this logon?) */ - i=unixtojulian(useron.expire); - write(file,&i,2); /* Expiration date */ - i=expired_level; - write(file,&i,2); /* Expired security level */ - i=1; - write(file,&i,2); /* Current conference */ - write(file,&useron.dlb,4); /* Bytes downloaded */ - write(file,&useron.ulb,4); /* Bytes uploaded */ - if(useron.misc&DELETED) - i=1; - else - i=0; - write(file,&i,1); /* Deleted? */ - l=useron.number; - write(file,&l,4); /* Record number in USERS.INF file */ - l=0; - memset(str,0,9); - write(file,str,9); /* Reserved */ - write(file,&l,4); /* Number of messages read */ - l=useron.posts+useron.emails+useron.fbacks; - write(file,&l,4); /* Number of messages left */ - close(file); - - /* End of USERS.SYS creation */ - - } - -else if(type==XTRN_SPITFIRE) { /* SpitFire SFDOORS.DAT File */ - sprintf(str,"%sSFDOORS.DAT",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - now=time(NULL); - unixtodos(now,&date,&curtime); - l=((((long)curtime.ti_hour*60L)+(long)curtime.ti_min)*60L) - +(long)curtime.ti_sec; - - strcpy(tmp,name); - if((p=strchr(tmp,SP))!=NULL) - *p=0; - - sprintf(str,"%u\r\n%s\r\n%s\r\n%s\r\n%lu\r\n%u\r\n%lu\r\n%lu\r\n" - ,useron.number /* User number */ - ,name /* User name */ - ,useron.pass /* Password */ - ,tmp /* User's first name */ - ,dte_rate /* DTE Rate */ - ,com_port /* COM Port */ - ,tleft/60 /* Time left in minutes */ - ,l /* Seconds since midnight (now) */ - ); - write(file,str,strlen(str)); - - unixtodos(logontime,&date,&curtime); - l=((((long)curtime.ti_hour*60L)+(long)curtime.ti_min)*60L) - +(long)curtime.ti_sec; - - sprintf(str,"%s\r\n%s\r\n%u\r\n%u\r\n%u\r\n%u\r\n%lu\r\n%lu\r\n%s\r\n" - "%s\r\n%s\r\n%lu\r\n%s\r\n%u\r\n%u\r\n%u\r\n%u\r\n%u\r\n%lu\r\n%u\r\n" - "%lu\r\n%lu\r\n%s\r\n%s\r\n" - ,dropdir - ,useron.misc&ANSI ? "TRUE":"FALSE" /* ANSI ? True or False */ - ,useron.level /* Security level */ - ,useron.uls /* Total uploads */ - ,useron.dls /* Total downloads */ - ,level_timepercall[useron.level] /* Minutes allowed this call */ - ,l /* Secs since midnight (logon) */ - ,starttime-logontime /* Extra time in seconds */ - ,"FALSE" /* Sysop next? */ - ,"FALSE" /* From Front-end? */ - ,"FALSE" /* Software Flow Control? */ - ,dte_rate /* DTE Rate */ - ,"FALSE" /* Error correcting connection? */ - ,0 /* Current conference */ - ,0 /* Current file dir */ - ,node_num /* Node number */ - ,15 /* Downloads allowed per day */ - ,0 /* Downloads already this day */ - ,100000 /* Download bytes allowed/day */ - ,0 /* Downloaded bytes already today */ - ,useron.ulb/1024L /* Kbytes uploaded */ - ,useron.dlb/1024L /* Kbytes downloaded */ - ,useron.phone /* Phone Number */ - ,useron.location /* City, State */ - ); - write(file,str,strlen(str)); - - close(file); } - -else if(type==XTRN_UTI) { /* UTI v2.1 - UTIDOOR.TXT */ - sprintf(str,"%sUTIDOOR.TXT",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - strcpy(tmp,name); - strupr(tmp); - sprintf(str,"%s\r\n%lu\r\n%u\r\n%lu\r\n%lu\r\n" - ,tmp /* User name */ - ,cur_rate /* Actual BPS rate */ - ,online==ON_LOCAL ? 0: com_port /* COM Port */ - ,dte_rate /* DTE rate */ - ,tleft); /* Time left in sec */ - write(file,str,strlen(str)); - - close(file); } - -else if(type==XTRN_SR) { /* Solar Realms DOORFILE.SR */ - sprintf(str,"%sDOORFILE.SR",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - sprintf(str,"%s\r\n%d\r\n%d\r\n%lu\r\n%lu\r\n%u\r\n%lu\r\n" - ,name /* Complete name of user */ - ,useron.misc&ANSI ? 1:0 /* ANSI ? */ - ,useron.misc&NO_EXASCII ? 0:1 /* IBM characters ? */ - ,rows /* Page length */ - ,dte_rate /* Baud rate */ - ,online==ON_LOCAL ? 0:com_port /* COM port */ - ,tleft/60 /* Time left (in minutes) */ - ); - write(file,str,strlen(str)); - close(file); } - -else if(type==XTRN_TRIBBS) { /* TRIBBS.SYS */ - sprintf(str,"%sTRIBBS.SYS",dropdir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_TRUNC); - return; } - - sprintf(str,"%u\r\n%s\r\n%s\r\n%u\r\n%c\r\n%c\r\n%lu\r\n%s\r\n%s\r\n%s\r\n" - ,useron.number /* User's record number */ - ,name /* User's name */ - ,useron.pass /* User's password */ - ,useron.level /* User's level */ - ,useron.misc&EXPERT ? 'Y':'N' /* Expert? */ - ,useron.misc&ANSI ? 'Y':'N' /* ANSI? */ - ,tleft/60 /* Minutes left */ - ,useron.phone /* User's phone number */ - ,useron.location /* User's city and state */ - ,useron.birth /* User's birth date */ - ); - write(file,str,strlen(str)); - - sprintf(str,"%u\r\n%u\r\n%lu\r\n%lu\r\n%c\r\n%c\r\n%s\r\n%s\r\n%s\r\n" - ,node_num /* Node number */ - ,com_port /* Serial port */ - ,online==ON_LOCAL ? 0L:cur_rate /* Baud rate */ - ,dte_rate /* Locked rate */ - ,mdm_misc&(MDM_RTS|MDM_CTS) ? 'Y':'N' - ,'Y' /* Error correcting connection */ - ,sys_name /* Board's name */ - ,sys_op /* Sysop's name */ - ,useron.handle /* User's alias */ - ); - write(file,str,strlen(str)); - close(file); } - -else if(type) - errormsg(WHERE,ERR_CHK,"Drop file type",type); - -} - -/****************************************************************************/ -/* Reads in MODUSER.DAT, EXITINFO.BBS, or DOOR.SYS and modify the current */ -/* user's values. */ -/****************************************************************************/ -void moduserdat(uint xtrnnum) -{ - char str[256],path[256],c,startup[128]; - uint i; - long mod; - int file; - FILE *stream; - -sprintf(startup,"%s\\",xtrn[xtrnnum]->path); -if(xtrn[xtrnnum]->type==XTRN_RBBS) { - sprintf(path,"%sEXITINFO.BBS" - ,xtrn[xtrnnum]->misc&STARTUPDIR ? startup : node_dir); - if((file=nopen(path,O_RDONLY))!=-1) { - lseek(file,361,SEEK_SET); - read(file,&useron.flags1,4); /* Flags */ - putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,tmp,16)); - lseek(file,373,SEEK_SET); - read(file,&i,2); /* SecLvl */ - if(i<90) { - useron.level=i; - putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,tmp,10)); } - close(file); - remove(path); } - return; } -else if(xtrn[xtrnnum]->type==XTRN_GAP) { - sprintf(path,"%sDOOR.SYS" - ,xtrn[xtrnnum]->misc&STARTUPDIR ? startup : node_dir); - if((stream=fopen(path,"rb"))!=NULL) { - for(i=0;i<15;i++) /* skip first 14 lines */ - if(!fgets(str,128,stream)) - break; - if(i==15 && isdigit(str[0])) { - mod=atoi(str); - if(mod<90) { - useron.level=mod; - putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,tmp,10)); } } - - for(;i<23;i++) - if(!fgets(str,128,stream)) - break; - if(i==23) { /* set main flags */ - useron.flags1=aftol(str); - putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,tmp,16)); } - - for(;i<25;i++) - if(!fgets(str,128,stream)) - break; - if(i==25 && isdigit(str[0]) && isdigit(str[1]) - && (str[2]=='/' || str[2]=='-') /* xx/xx/xx or xx-xx-xx */ - && isdigit(str[3]) && isdigit(str[4]) - && (str[5]=='/' || str[5]=='-') - && isdigit(str[6]) && isdigit(str[7])) { /* valid expire date */ - useron.expire=dstrtounix(str); - putuserrec(useron.number,U_EXPIRE,8,ultoa(useron.expire,tmp,16)); } - - for(;i<29;i++) /* line 29, total downloaded files */ - if(!fgets(str,128,stream)) - break; - if(i==29) { - truncsp(str); - useron.dls=atoi(str); - putuserrec(useron.number,U_DLS,5,str); } - - if(fgets(str,128,stream)) { /* line 30, Kbytes downloaded today */ - i++; - truncsp(str); - mod=atol(str)*1024L; - if(mod) { - useron.dlb=adjustuserrec(useron.number,U_DLB,10,mod); - subtract_cdt(mod); } } - - for(;i<42;i++) - if(!fgets(str,128,stream)) - break; - if(i==42 && isdigit(str[0])) { /* Time Credits in Minutes */ - useron.min=atol(str); - putuserrec(useron.number,U_MIN,10,ultoa(useron.min,tmp,10)); } - - fclose(stream); } - return; } - -else if(xtrn[xtrnnum]->type==XTRN_PCBOARD) { - sprintf(path,"%sUSERS.SYS" - ,xtrn[xtrnnum]->misc&STARTUPDIR ? startup : node_dir); - if((file=nopen(path,O_RDONLY))!=-1) { - lseek(file,39,SEEK_SET); - read(file,&c,1); - if(c==1) { /* file has been updated */ - lseek(file,105,SEEK_CUR); /* read security level */ - read(file,&i,2); - if(i<90) { - useron.level=i; - putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,tmp,10)); } - lseek(file,75,SEEK_CUR); /* read in expiration date */ - read(file,&i,2); /* convert from julian to unix */ - useron.expire=juliantounix(i); - putuserrec(useron.number,U_EXPIRE,8,ltoa(useron.expire,tmp,16)); } - close(file); } - return; } - -sprintf(path,"%sMODUSER.DAT" - ,xtrn[xtrnnum]->misc&STARTUPDIR ? startup : node_dir); -if((stream=fopen(path,"rb"))!=NULL) { /* File exists */ - if(fgets(str,81,stream) && (mod=atol(str))!=0) { - ultoac(mod>0L ? mod : -mod,tmp); /* put commas in the # */ - strcpy(str,"Credit Adjustment: "); - if(mod<0L) - strcat(str,"-"); /* negative, put '-' */ - strcat(str,tmp); - if(mod>0L) - strcpy(tmp,"$+"); - else - strcpy(tmp,"$-"); - logline(tmp,str); - if(mod>0L) /* always add to real cdt */ - useron.cdt=adjustuserrec(useron.number,U_CDT,10,mod); - else - subtract_cdt(-mod); } /* subtract from free cdt first */ - if(fgets(str,81,stream)) { /* main level */ - mod=atoi(str); - if(isdigit(str[0]) && mod<90) { - useron.level=mod; - putuserrec(useron.number,U_LEVEL,2,itoa(useron.level,tmp,10)); } } - fgets(str,81,stream); /* was transfer level, now ignored */ - if(fgets(str,81,stream)) { /* flags #1 */ - if(strchr(str,'-')) /* remove flags */ - useron.flags1&=~aftol(str); - else /* add flags */ - useron.flags1|=aftol(str); - putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,tmp,16)); } - - if(fgets(str,81,stream)) { /* flags #2 */ - if(strchr(str,'-')) /* remove flags */ - useron.flags2&=~aftol(str); - else /* add flags */ - useron.flags2|=aftol(str); - putuserrec(useron.number,U_FLAGS2,8,ultoa(useron.flags2,tmp,16)); } - - if(fgets(str,81,stream)) { /* exemptions */ - if(strchr(str,'-')) - useron.exempt&=~aftol(str); - else - useron.exempt|=aftol(str); - putuserrec(useron.number,U_EXEMPT,8,ultoa(useron.exempt,tmp,16)); } - if(fgets(str,81,stream)) { /* restrictions */ - if(strchr(str,'-')) - useron.rest&=~aftol(str); - else - useron.rest|=aftol(str); - putuserrec(useron.number,U_REST,8,ultoa(useron.rest,tmp,16)); } - if(fgets(str,81,stream)) { /* Expiration date */ - if(isxdigit(str[0])) - putuserrec(useron.number,U_EXPIRE,8,str); } - if(fgets(str,81,stream)) { /* additional minutes */ - mod=atol(str); - if(mod) { - sprintf(str,"Minute Adjustment: %s",ultoac(mod,tmp)); - logline("*+",str); - useron.min=adjustuserrec(useron.number,U_MIN,10,mod); } } - - if(fgets(str,81,stream)) { /* flags #3 */ - if(strchr(str,'-')) /* remove flags */ - useron.flags3&=~aftol(str); - else /* add flags */ - useron.flags3|=aftol(str); - putuserrec(useron.number,U_FLAGS3,8,ultoa(useron.flags3,tmp,16)); } - - if(fgets(str,81,stream)) { /* flags #4 */ - if(strchr(str,'-')) /* remove flags */ - useron.flags4&=~aftol(str); - else /* add flags */ - useron.flags4|=aftol(str); - putuserrec(useron.number,U_FLAGS4,8,ultoa(useron.flags4,tmp,16)); } - - if(fgets(str,81,stream)) { /* flags #1 to REMOVE only */ - useron.flags1&=~aftol(str); - putuserrec(useron.number,U_FLAGS1,8,ultoa(useron.flags1,tmp,16)); } - if(fgets(str,81,stream)) { /* flags #2 to REMOVE only */ - useron.flags2&=~aftol(str); - putuserrec(useron.number,U_FLAGS2,8,ultoa(useron.flags2,tmp,16)); } - if(fgets(str,81,stream)) { /* flags #3 to REMOVE only */ - useron.flags3&=~aftol(str); - putuserrec(useron.number,U_FLAGS3,8,ultoa(useron.flags3,tmp,16)); } - if(fgets(str,81,stream)) { /* flags #4 to REMOVE only */ - useron.flags4&=~aftol(str); - putuserrec(useron.number,U_FLAGS4,8,ultoa(useron.flags4,tmp,16)); } - if(fgets(str,81,stream)) { /* exemptions to remove */ - useron.exempt&=~aftol(str); - putuserrec(useron.number,U_EXEMPT,8,ultoa(useron.exempt,tmp,16)); } - if(fgets(str,81,stream)) { /* restrictions to remove */ - useron.rest&=~aftol(str); - putuserrec(useron.number,U_REST,8,ultoa(useron.rest,tmp,16)); } - - fclose(stream); - remove(path); } -} - -/****************************************************************************/ -/* This is the external programs (doors) section of the bbs */ -/* Return 1 if no externals available, 0 otherwise. */ -/****************************************************************************/ -char xtrn_sec() -{ - char str[256]; - int file,j,k,xsec,*usrxtrn,usrxtrns,*usrxsec,usrxsecs; - uint i; - -if(!total_xtrns || !total_xtrnsecs) { - bputs(text[NoXtrnPrograms]); - return(1); } - -if((usrxtrn=(int *)MALLOC(total_xtrns*sizeof(int)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_xtrns); - return(1); } -if((usrxsec=(int *)MALLOC(total_xtrnsecs*sizeof(int)))==NULL) { - errormsg(WHERE,ERR_ALLOC,nulstr,total_xtrnsecs); - FREE(usrxtrn); - return(1); } - -while(online) { - for(i=0,usrxsecs=0;i<total_xtrnsecs;i++) - if(chk_ar(xtrnsec[i]->ar,useron)) - usrxsec[usrxsecs++]=i; - if(!usrxsecs) { - bputs(text[NoXtrnPrograms]); - FREE(usrxtrn); - FREE(usrxsec); - return(1); } - if(usrxsecs>1) { - sprintf(str,"%sMENU\\XTRN_SEC.*",text_dir); - if(fexist(str)) { - menu("XTRN_SEC"); - xsec=getnum(usrxsecs); - if(xsec<=0) - break; - xsec--; - xsec=usrxsec[xsec]; } - else { - for(i=0;i<total_xtrnsecs;i++) - uselect(1,i,"External Program Section" - ,xtrnsec[i]->name,xtrnsec[i]->ar); - xsec=uselect(0,0,0,0,0); } - if(xsec==-1) - break; } - else - xsec=0; - - while(!chk_ar(xtrnsec[xsec]->ar,useron)) - xsec++; - - if(xsec>=total_xtrnsecs) { - bputs(text[NoXtrnPrograms]); - FREE(usrxtrn); - FREE(usrxsec); - return(1); } - - while(online) { - for(i=0,usrxtrns=0;i<total_xtrns; i++) { - if(xtrn[i]->sec!=xsec) - continue; - if(xtrn[i]->misc&EVENTONLY) - continue; - if(!chk_ar(xtrn[i]->ar,useron)) - continue; - usrxtrn[usrxtrns++]=i; } - if(!usrxtrns) { - bputs(text[NoXtrnPrograms]); - pause(); - break; } - sprintf(str,"%sMENU\\XTRN%u.*",text_dir,xsec+1); - if(fexist(str)) { - sprintf(str,"XTRN%u",xsec+1); - menu(str); } - else { - bprintf(text[XtrnProgLstHdr],xtrnsec[xsec]->name); - bputs(text[XtrnProgLstTitles]); - if(usrxtrns>=10) { - bputs(" "); - bputs(text[XtrnProgLstTitles]); } - CRLF; - bputs(text[XtrnProgLstUnderline]); - if(usrxtrns>=10) { - bputs(" "); - bputs(text[XtrnProgLstUnderline]); } - CRLF; - if(usrxtrns>=10) - j=(usrxtrns/2)+(usrxtrns&1); - else - j=usrxtrns; - for(i=0;i<j && !msgabort();i++) { - bprintf(text[XtrnProgLstFmt],i+1 - ,xtrn[usrxtrn[i]]->name,xtrn[usrxtrn[i]]->cost); - if(usrxtrns>=10) { - k=(usrxtrns/2)+i+(usrxtrns&1); - if(k<usrxtrns) { - bputs(" "); - bprintf(text[XtrnProgLstFmt],k+1 - ,xtrn[usrxtrn[k]]->name - ,xtrn[usrxtrn[k]]->cost); } } - CRLF; } - ASYNC; - mnemonics(text[WhichXtrnProg]); } - getnodedat(node_num,&thisnode,1); - thisnode.aux=0; /* aux is 0, only if at menu */ - putnodedat(node_num,thisnode); - action=NODE_XTRN; - SYNC; - if((j=getnum(usrxtrns))<1) - break; - exec_xtrn(usrxtrn[j-1]); } - if(usrxsecs<2) - break; } -FREE(usrxtrn); -FREE(usrxsec); -return(0); -} - -/****************************************************************************/ -/* This function handles configured external program execution. */ -/****************************************************************************/ -void exec_xtrn(uint xtrnnum) -{ - char str[256],str2[256],path[256],dropdir[128],name[32],c,e,mode; - int file; - uint i; - long mod; - ulong tleft; - FILE *stream; - node_t node; - time_t start,end; - - -if(!chk_ar(xtrn[xtrnnum]->run_ar,useron) - || !chk_ar(xtrnsec[xtrn[xtrnnum]->sec]->ar,useron)) { - bputs(text[CantRunThatProgram]); - return; } - -if(xtrn[xtrnnum]->cost && !(useron.exempt&FLAG('X'))) { /* costs */ - if(xtrn[xtrnnum]->cost>useron.cdt+useron.freecdt) { - bputs(text[NotEnoughCredits]); - pause(); - return; } - subtract_cdt(xtrn[xtrnnum]->cost); } - -if(!(xtrn[xtrnnum]->misc&MULTIUSER)) { - for(i=1;i<=sys_nodes;i++) { - getnodedat(i,&node,0); - c=i; - if((node.status==NODE_INUSE || node.status==NODE_QUIET) - && node.action==NODE_XTRN && node.aux==(xtrnnum+1)) { - if(node.status==NODE_QUIET) { - strcpy(str,sys_guru); - c=sys_nodes+1; } - else if(node.misc&NODE_ANON) - strcpy(str,"UNKNOWN USER"); - else - username(node.useron,str); - bprintf(text[UserRunningXtrn],str - ,xtrn[xtrnnum]->name,c); - pause(); - break; } } - if(i<=sys_nodes) - return; } - -sprintf(str,"%s\\",xtrn[xtrnnum]->path); -strcpy(path,xtrn[xtrnnum]->misc&STARTUPDIR ? str : node_dir); -strcpy(dropdir,xtrn[xtrnnum]->misc&STARTUPDIR ? str : node_dir); - -switch(xtrn[xtrnnum]->type) { - case XTRN_WWIV: - strcat(path,"CHAIN.TXT"); - break; - case XTRN_GAP: - strcat(path,"DOOR.SYS"); - break; - case XTRN_RBBS: - sprintf(str,"DORINFO%X.DEF",node_num); - strcat(path,str); - break; - case XTRN_RBBS1: - strcat(path,"DORINFO1.DEF"); - break; - case XTRN_WILDCAT: - strcat(path,"CALLINFO.BBS"); - break; - case XTRN_PCBOARD: - strcat(path,"PCBOARD.SYS"); - break; - case XTRN_UTI: - strcat(path,"UTIDOOR.TXT"); - break; - case XTRN_SR: - strcat(path,"DOORFILE.SR"); - break; - default: - strcat(path,"XTRN.DAT"); - break; } -getnodedat(node_num,&thisnode,1); -thisnode.aux=xtrnnum+1; -thisnode.action=NODE_XTRN; -putnodedat(node_num,thisnode); - -if(xtrn[xtrnnum]->misc&REALNAME) - strcpy(name,useron.name); -else - strcpy(name,useron.alias); - -gettimeleft(); -tleft=timeleft+(xtrn[xtrnnum]->textra*60); -if(xtrn[xtrnnum]->maxtime && tleft>xtrn[xtrnnum]->maxtime) - tleft=(xtrn[xtrnnum]->maxtime*60); -xtrndat(name,dropdir,xtrn[xtrnnum]->type,tleft); -if(!online) - return; -sprintf(str,"Ran external: %s",xtrn[xtrnnum]->name); -logline("X-",str); -if(xtrn[xtrnnum]->cmd[0]!='*' && sys_status&SS_LOGOPEN) { - close(logfile); - sys_status&=~SS_LOGOPEN; } - -sprintf(str,"%sINTRSBBS.DAT" - ,xtrn[xtrnnum]->path[0] ? xtrn[xtrnnum]->path : node_dir); -remove(str); -sprintf(str,"%sHANGUP.NOW",node_dir); -remove(str); -sprintf(str,"%sFILE\\%04u.DWN",data_dir,useron.number); -remove(str); - -mode=0; /* EX_CC */ -if(xtrn[xtrnnum]->misc&IO_INTS) - mode|=(EX_OUTR|EX_INR|EX_OUTL); -if(xtrn[xtrnnum]->misc&WWIVCOLOR) - mode|=EX_WWIV; -if(xtrn[xtrnnum]->misc&SWAP) - mode|=EX_SWAP; -if(xtrn[xtrnnum]->misc&MODUSERDAT) { /* Delete MODUSER.DAT */ - sprintf(str,"%sMODUSER.DAT",dropdir); /* if for some weird */ - remove(str); } /* reason it's there */ - -if(xtrn[xtrnnum]->path[0]) { - if(xtrn[xtrnnum]->path[1]==':') /* drive letter specified */ - setdisk(toupper(xtrn[xtrnnum]->path[0])-'A'); - if(chdir(xtrn[xtrnnum]->path)) - errormsg(WHERE,ERR_CHDIR,xtrn[xtrnnum]->path,0); } - -start=time(NULL); -external(cmdstr(xtrn[xtrnnum]->cmd,path,dropdir,NULL),mode); -end=time(NULL); -if(xtrn[xtrnnum]->misc&FREETIME) - starttime+=end-start; -if(xtrn[xtrnnum]->clean[0]) { - if(xtrn[xtrnnum]->path[0]) { - if(xtrn[xtrnnum]->path[1]==':') /* drive letter specified */ - setdisk(toupper(xtrn[xtrnnum]->path[0])-'A'); - if(chdir(xtrn[xtrnnum]->path)) - errormsg(WHERE,ERR_CHDIR,xtrn[xtrnnum]->path,0); } - external(cmdstr(xtrn[xtrnnum]->clean,path,nulstr,NULL) - ,mode&~EX_INR); } -/* Re-open the logfile */ -if(!(sys_status&SS_LOGOPEN)) { - sprintf(str,"%sNODE.LOG",node_dir); - if((logfile=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); - else - sys_status|=SS_LOGOPEN; } - -sprintf(str,"%sFILE\\%04u.DWN",data_dir,useron.number); -batch_add_list(str); - -sprintf(str,"%sHANGUP.NOW",node_dir); -if(fexist(str)) { - remove(str); - hangup(); } -if(online==ON_REMOTE) { - checkline(); - if(!online) { - sprintf(str,"%sHUNGUP.LOG",data_dir); - if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - errormsg(WHERE,ERR_OPEN,str,O_WRONLY|O_CREAT|O_APPEND); - return; } - getnodedat(node_num,&thisnode,0); - now=time(NULL); - sprintf(str,hungupstr,useron.alias,xtrn[thisnode.aux-1]->name - ,timestr(&now)); - write(file,str,strlen(str)); - close(file); } } -if(xtrn[xtrnnum]->misc&MODUSERDAT) { /* Modify user data */ - moduserdat(xtrnnum); - statusline(); } - -getnodedat(node_num,&thisnode,1); -thisnode.aux=0; /* aux is 0, only if at menu */ -putnodedat(node_num,thisnode); -} - -/****************************************************************************/ -/* This function will execute an external program if it is configured to */ -/* run during the event specified. */ -/****************************************************************************/ -void user_event(char event) -{ - uint i; - -for(i=0;i<total_xtrns;i++) { - if(xtrn[i]->event!=event) - continue; - if(!chk_ar(xtrn[i]->ar,useron) - || !chk_ar(xtrnsec[xtrn[i]->sec]->ar,useron)) - continue; - exec_xtrn(i); } -} - - diff --git a/src/stp/make.bat b/src/stp/make.bat deleted file mode 100755 index 3d8cfa45b0..0000000000 --- a/src/stp/make.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -P-c -N -C -ms -w-pro stp rciols.obj ..\mswait\dos\mswaits.obj diff --git a/src/stp/rciols.obj b/src/stp/rciols.obj deleted file mode 100644 index 1103dcd172d4b32820e0783ff1b1fccc9d3ee1ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8736 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 H7#K<bK}9B) diff --git a/src/stp/stp.c b/src/stp/stp.c deleted file mode 100644 index 6ed9f706ce..0000000000 --- a/src/stp/stp.c +++ /dev/null @@ -1,2017 +0,0 @@ -/* STP.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Synchronet Transfer Protocols */ - -#include <io.h> -#include <dos.h> -#include <dir.h> -#include <time.h> -#include <alloc.h> -#include <stdio.h> -#include <fcntl.h> -#include <errno.h> -#include <string.h> -#include <stdlib.h> -#include <stdarg.h> -#include <sys/stat.h> - -#define STP 1 - -#include "zmodem.h" - -#define MAXERRORS 10 - -#define ERROR -1 - /* Various Character/Ctrl-Code Definitions */ -#define SP 32 /* Space bar */ -#define ESC 27 /* ESC Char */ -#define CR 13 /* Carriage Return */ -#define FF 12 /* Form Feed */ -#define LF 10 /* Line Feed */ -#define TAB 9 /* Horizontal Tabulation */ -#define BS 8 /* Back Space */ -#define SOH 1 /* Start of header */ -#define STX 2 /* Start of text */ -#define ETX 3 /* End of text */ -#define EOT 4 /* End of transmission */ -#define ACK 6 /* Acknowledge */ -#define DLE 16 /* Data link escape */ -#define XON 17 /* Ctrl-Q - resume transmission */ -#define XOFF 19 /* Ctrl-S - pause transmission */ -#define NAK 21 /* Negative Acknowledge */ -#define CAN 24 /* Cancel */ -#define CPMEOF 26 /* CP/M End of file (^Z) */ -#define LOC_ABORT 0x2e03 /* Local abort key (^C) */ - -#define uchar unsigned char -#define uint unsigned int -#define ulong unsigned long - -#define SEND (1<<0) /* Sending file(s) */ -#define RECV (1<<1) /* Receiving file(s) */ -#define XMODEM (1<<2) /* Use Xmodem */ -#define YMODEM (1<<3) /* Use Ymodem */ -#define ZMODEM (1<<4) /* Use Zmodem */ -#define CRC (1<<5) /* Use CRC error correction */ -#define GMODE (1<<6) /* For Qmodem-G and Ymodem-G */ -#define DIR (1<<7) /* Directory specified to download to */ -#define DEBUG (1<<8) /* Debug output */ -#define OVERWRITE (1<<9) /* Overwrite receiving files */ -#define IGNORE_DCD (1<<10) /* Ignore DCD */ -#define ALARM (1<<11) /* Alarm when starting and stopping xfer */ -#define NO_LOCAL (1<<12) /* Don't check local keyboard */ - - /* Zmodem mode bits */ -#define CTRL_ESC (1<<0) /* Escape all control chars */ -#define VAR_HDRS (1<<1) /* Use variable headers */ - -#define LOOP_NOPEN 50 - -#define MAX_FNAMES 100 /* Up to 100 filenames */ - -/************************/ -/* Remote I/O Constants */ -/************************/ - - /* i/o mode and state flags */ -#define CTSCK 0x1000 /* check cts (mode only) */ -#define RTSCK 0x2000 /* check rts (mode only) */ -#define TXBOF 0x0800 /* transmit buffer overflow (outcom only) */ -#define ABORT 0x0400 /* check for ^C (mode), aborting (state) */ -#define PAUSE 0x0200 /* check for ^S (mode), pausing (state) */ -#define NOINP 0x0100 /* input buffer empty (incom only) */ - - /* status flags */ -#define DCD 0x80 /* DCD on */ -#define RI 0x40 /* Ring indicate */ -#define DSR 0x20 /* Dataset ready */ -#define CTS 0x10 /* CTS on */ -#define FERR 0x08 /* Frameing error */ -#define PERR 0x04 /* Parity error */ -#define OVRR 0x02 /* Overrun */ -#define RXLOST 0x01 /* Receive buffer overflow */ - -/* rioctl() arguments */ -/* returns mode or state flags in high 8 bits, status flags in low 8 bits */ - - /* the following return mode in high 8 bits */ -#define IOMODE 0 /* no operation */ -#define IOSM 1 /* i/o set mode flags */ -#define IOCM 2 /* i/o clear mode flags */ - -#define GVERS 0x007 /* get version */ -#define GUART 0x107 /* get uart */ -#define GIRQN 0x207 /* get IRQ number */ -#define GBAUD 0x307 /* get baud */ - - /* the following return state in high 8 bits */ -#define IOSTATE 4 /* no operation */ -#define IOSS 5 /* i/o set state flags */ -#define IOCS 6 /* i/o clear state flags */ -#define IOFB 0x308 /* i/o buffer flush */ -#define IOFI 0x208 /* input buffer flush */ -#define IOFO 0x108 /* output buffer flush */ -#define IOCE 9 /* i/o clear error flags */ - -#define TS_INT28 1 -#define TS_WINOS2 2 -#define TS_NODV 4 - - /* return count (16bit) */ -#define RXBC 0x000a /* get receive buffer count */ -#define RXBS 0x010a /* get receive buffer size */ -#define TXBC 0x000b /* get transmit buffer count */ -#define TXBS 0x010b /* get transmit buffer size */ -#define TXBF 0x020b /* get transmit buffer free space */ -#define TXSYNC 0x000c /* sync transmition (seconds<<8|0x0c) */ -#define IDLE 0x000d /* suspend communication routines */ -#define RESUME 0x010d /* return from suspended state */ -#define RLERC 0x000e /* read line error count and clear */ -#define CPTON 0x0110 /* set input translation flag for ctrl-p on */ -#define CPTOFF 0x0010 /* set input translation flag for ctrl-p off */ -#define GETCPT 0x8010 /* return the status of ctrl-p translation */ -#define MSR 0x0011 /* read modem status register */ -#define FIFOCTL 0x0012 /* FIFO UART control */ -#define TSTYPE 0x0013 /* Time-slice API type */ -#define GETTST 0x8013 /* Get Time-slice API type */ - - /* ivhctl() arguments */ -#define INT29R 1 /* copy int 29h output to remote */ -#define INT29L 2 /* Use _putlc for int 29h */ -#define INT16 0x10 /* return remote chars to int 16h calls */ -#define INTCLR 0 /* release int 16h, int 29h */ - -#define DCDHIGH (rioctl(IOSTATE)&DCD || mode&IGNORE_DCD) - -/**************/ -/* Prototypes */ -/**************/ - -/* LCLOLL.ASM */ -int lclini(int); -void lclxy(int,int); -int lclwx(void); -int lclwy(void); -int lclatr(int); -int lclaes(void); -void lputc(int); -long lputs(char far *); -uint lkbrd(int); - -/* RCIOLL.ASM */ - -int rioini(int com,int irq); /* initialize com,irq */ -int setbaud(int rate); /* set baud rate */ -int rioctl(int action); /* remote i/o control */ -int dtr(char onoff); /* set/reset dtr */ -int incom(void); /* receive character */ -int ivhctl(int intcode); /* local i/o redirection */ - -void riosync(); -void cancel(); - -extern mswtyp; -extern uint riobp; - -uint asmrev; - -/***************/ -/* Global Vars */ -/***************/ -long mode=0L; /* Program mode */ -long zmode=0L; /* Zmodem mode */ -uchar hdr_block_num; /* Block number received in header */ -uchar block[1024]; /* Block buffer */ -uint block_size; /* Block size (128 or 1024) */ -ulong block_num; /* Block number */ -ulong last_block_num; /* Last block number sent */ -uint flows=0; /* Number of flow controls */ - -/**************************************/ -/* Zmodem specific, from Chuck's RZSZ */ -/**************************************/ -char Txhdr[ZMAXHLEN]; /* Zmodem transmit header */ -char Rxhdr[ZMAXHLEN]; /* Zmodem receive header */ -char attn[ZATTNLEN]; /* Attention string for sender */ -char zconv; -char zmanag; -char ztrans; -int tryzhdrtype; -int Rxtimeout = 100; /* Tenths of seconds to wait for something */ -int Rxframeind; /* ZBIN ZBIN32, or ZHEX type of frame */ -int Rxtype; /* Type of header received */ -int Rxhlen; /* Length of header received */ -int Rxcount; /* Count of data bytes received */ - -/********/ -/* Code */ -/********/ - -int cbreakh() -{ -return(1); -} - -/****************************************************************************/ -/* Performs printf() through local assembly routines */ -/****************************************************************************/ -int lprintf(char *fmat, ...) -{ - va_list argptr; - char sbuf[2048]; - int chcount; - -va_start(argptr,fmat); -chcount=vsprintf(sbuf,fmat,argptr); -va_end(argptr); -lputs(sbuf); -return(chcount); -} - -void newline() -{ -if(lclwx()>1) - lputs("\r\n"); -} - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char count=0,logstr[256]; - int file,share; - -if(access==O_RDONLY) share=O_DENYWRITE; - else share=O_DENYALL; -while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1) - && errno==EACCES && count++<LOOP_NOPEN); -if(file==-1 && errno==EACCES) - lprintf("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); -return(file); -} - - -/****************************************************************************/ -/* Converts an ASCII Hex string into an ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - -while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; -return(val); -} - -/****************************************************************************/ -/* Checks the disk drive for the existence of a file. Returns 1 if it */ -/* exists, 0 if it doesn't. */ -/****************************************************************************/ -char fexist(char *filespec) -{ - struct ffblk f; - -if(findfirst(filespec,&f,0)==NULL) - return(1); -return(0); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\t")]=0; -c=strlen(str); -while(c && str[c-1]<=SP) c--; -str[c]=0; -} - -/**************/ -/* Exit Point */ -/**************/ -void bail(int code) -{ - -if(mode&ALARM) { - sound(2000); - mswait(500); - sound(1000); - mswait(500); - nosound(); } -riosync(); -rioini(0,0); /* uninstall com routines */ -newline(); -lprintf("Exiting - Error level: %d Flow restraint count: %u\r\n",code,flows); -fcloseall(); -exit(code); -} - -/************************************************************/ -/* Get a character from com port, time out after 10 seconds */ -/************************************************************/ -int getcom(char timeout) -{ - uint i,ch; - time_t start; - -if((ch=incom())!=NOINP) - return(ch); -for(i=0;i<10000;i++) /* ten consecutive re-tries */ - if((ch=incom())!=NOINP) - return(ch); -flows++; -start=time(NULL); -while(time(NULL)-start<(long)timeout) { /* wait up to ten seconds */ - if((ch=incom())!=NOINP) - return(ch); - if(!DCDHIGH) { - newline(); - lprintf("No carrier\r\n"); - bail(1); } - mswait(0); - if(!(mode&NO_LOCAL) && lkbrd(0)==LOC_ABORT) { - newline(); - lprintf("Local abort\r\n"); - cancel(); - bail(1); } } -newline(); -lprintf("Input timeout\r\n"); -return(NOINP); -} - -/**********************************/ -/* Output a character to COM port */ -/**********************************/ -void putcom(uchar ch) -{ - int i=0; - -while(outcom(ch)&TXBOF && i<180) { /* 10 sec delay */ - if(!i) lputc('F'); - if(!DCDHIGH) { - newline(); - lprintf("No carrier\r\n"); - bail(1); } - i++; - mswait(1); - if(!(mode&NO_LOCAL) && lkbrd(0)==LOC_ABORT) { - newline(); - lprintf("Local abort\r\n"); - bail(1); } } -if(i) { - lprintf("\b \b"); - flows++; - if(i==180) { - newline(); - lprintf("Output timeout\r\n"); - bail(1); } } -} - -void put_nak() -{ -while(getcom(1)!=NOINP && (mode&NO_LOCAL || lkbrd(0)!=LOC_ABORT)) - ; /* wait for any trailing data */ -putcom(NAK); -} - -void cancel() -{ - int i; - -for(i=0;i<10;i++) - putcom(CAN); -for(i=0;i<10;i++) - putcom(BS); -} - -/********************************/ -/* Update the CRC bytes */ -/********************************/ -/**** -void update_crc(uchar c, uchar *crc1, uchar *crc2) -{ - int i, temp; - uchar carry, c_crc1, c_crc2; - -for (i=0; i < 8; i++) { - temp = c * 2; - c = temp; /* rotate left */ - carry = ((temp > 255) ? 1 : 0); - temp = (*crc2) * 2; - (*crc2) = temp; - (*crc2) |= carry; /* rotate with carry */ - c_crc2 = ((temp > 255) ? 1 : 0); - temp = (*crc1) * 2; - (*crc1) = temp; - (*crc1) |= c_crc2; - c_crc1 = ((temp > 255) ? 1 : 0); - if (c_crc1) { - (*crc2) ^= 0x21; - (*crc1) ^= 0x10; } } -} -****/ - -void ucrc16(uchar ch, uint *rcrc) { - uint i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - - -char *chr(uchar ch) -{ - static char str[25]; - -switch(ch) { - case SOH: - return("SOH"); - case STX: - return("STX"); - case ETX: - return("ETX"); - case EOT: - return("EOT"); - case ACK: - return("ACK"); - case NAK: - return("NAK"); - case CAN: - return("CAN"); - default: - sprintf(str,"%02Xh",ch); - return(str); } -} - -/****************************************************************/ -/* Gets the filename from the filename and optional path in buf */ -/****************************************************************/ -char *justfname(char *buf, char *out) -{ - char *p1,*p2; - -if(mode&DEBUG) - lprintf("justfname: in: '%s'\r\n",buf); -p1=buf; -while(*p1) { - if((p2=strchr(p1,':'))!=NULL) { /* Remove path */ - p1=p2+1; - continue; } - if((p2=strchr(p1,'/'))!=NULL) { - p1=p2+1; - continue; } - if((p2=strchr(p1,'\\'))!=NULL) { - p1=p2+1; - continue; } - break; } -if(!*p1) { - lprintf("Invalid filename\r\n"); - strcpy(out,""); } -else - strcpy(out,p1); /* Use just the filename */ -if(mode&DEBUG) - lprintf("justfname: out: '%s'\r\n",out); -return(out); -} - -/****************************************************************************/ -/* Receive a X/Y/Zmodem block (sector) from COM port */ -/* hdrblock is 1 if attempting to get Ymodem header block, 0 if data block */ -/* Returns 0 if all went well, -1 on error or CAN, and EOT if EOT */ -/****************************************************************************/ -int get_block(int hdrblock) -{ - uchar chksum,calc_chksum; - int i,b,errors,eot=0,can=0; - uint crc,calc_crc; - -for(errors=0;errors<MAXERRORS;errors++) { - i=getcom(10); - if(eot && i!=EOT) - eot=0; - if(can && i!=CAN) - can=0; - switch(i) { - case SOH: /* 128 byte blocks */ - block_size=128; - break; - case STX: /* 1024 byte blocks */ - block_size=1024; - break; - case EOT: - if((mode&(YMODEM|GMODE))==YMODEM && !eot) { - eot=1; - put_nak(); /* chuck's double EOT trick */ - continue; } - return(EOT); - case CAN: - newline(); - if(!can) { /* must get two CANs in a row */ - can=1; - lprintf("Received CAN Expected SOH, STX, or EOT\r\n"); - continue; } - lprintf("Cancelled remotely\r\n"); - return(-1); - case NOINP: /* Nothing came in */ - continue; - default: - newline(); - lprintf("Received %s Expected SOH, STX, or EOT\r\n",chr(i)); - if(hdrblock) /* Trying to get Ymodem header block */ - return(-1); - put_nak(); - continue; } - i=getcom(1); - if(i==NOINP) { - put_nak(); - continue; } - hdr_block_num=i; - i=getcom(1); - if(i==NOINP) { - put_nak(); - continue; } - if(hdr_block_num!=(uchar)~i) { - newline(); - lprintf("Block number error\r\n"); - put_nak(); - continue; } - calc_crc=calc_chksum=0; - for(b=0;b<block_size;b++) { - i=getcom(1); - if(i==NOINP) - break; - block[b]=i; - if(mode&CRC) - ucrc16(block[b],&calc_crc); - else - calc_chksum+=block[b]; } - - if(b<block_size) { - put_nak(); - continue; } - - if(mode&CRC) { - crc=getcom(1)<<8; - crc|=getcom(1); } - else - chksum=getcom(1); - - if(mode&CRC) { - ucrc16(0,&calc_crc); - ucrc16(0,&calc_crc); - if(crc==calc_crc) - break; - newline(); - lprintf("CRC error\r\n"); } - - else { /* CHKSUM */ - if(chksum==calc_chksum) - break; - newline(); - lprintf("Checksum error\r\n"); } - - if(mode&GMODE) { /* Don't bother sending a NAK. He's not listening */ - cancel(); - bail(1); } - put_nak(); } - -if(errors>=MAXERRORS) { - newline(); - lprintf("Too many errors\r\n"); - return(-1); } -return(0); -} - -/*****************/ -/* Sends a block */ -/*****************/ -void put_block() -{ - uchar ch,chksum; - int i; - uint crc; - -if(block_size==128) - putcom(SOH); -else /* 1024 */ - putcom(STX); -ch=(block_num&0xff); -putcom(ch); -putcom(~ch); -chksum=crc=0; -for(i=0;i<block_size;i++) { - putcom(block[i]); - if(mode&CRC) - ucrc16(block[i],&crc); - else - chksum+=block[i]; } - -if(mode&CRC) { - ucrc16(0,&crc); - ucrc16(0,&crc); - putcom(crc>>8); - putcom(crc&0xff); } -else - putcom(chksum); -} - -/************************************************************/ -/* Gets an acknowledgement - usually after sending a block */ -/* Returns 1 if ack received, 0 otherwise. */ -/************************************************************/ -int get_ack() -{ - int i,errors,can=0; - -for(errors=0;errors<MAXERRORS;errors++) { - - if(mode&GMODE) { /* Don't wait for ACK on Ymodem-G */ - if(incom()==CAN) { - newline(); - lprintf("Cancelled remotely\r\n"); - cancel(); - bail(1); } - return(1); } - - i=getcom(10); - if(can && i!=CAN) - can=0; - if(i==ACK) - return(1); - if(i==CAN) { - if(can) { - newline(); - lprintf("Cancelled remotely\r\n"); - cancel(); - bail(1); } - can=1; } - if(i!=NOINP) { - newline(); - lprintf("Received %s Expected ACK\r\n",chr(i)); - if(i!=CAN) - return(0); } } - -return(0); -} - -/****************************************************************************/ -/* Syncronizes the remote and local machines */ -/****************************************************************************/ -void riosync() -{ - int i=0; - -while(rioctl(TXBC) && i<180) { /* 10 sec */ - if(!(mode&NO_LOCAL) && lkbrd(0)==LOC_ABORT) { - newline(); - lprintf("Local abort\r\n"); - cancel(); - break; } - if(!DCDHIGH) - break; - mswait(1); - i++; } -} - -/*********************************************************/ -/* Returns the number of blocks required to send n bytes */ -/*********************************************************/ -long blocks(long n) -{ - long l; - -l=n/(long)block_size; -if(l*(long)block_size<n) - l++; -return(l); -} - -/****************************************/ -/* Zmodem specific functions start here */ -/****************************************/ - -/**********************************************/ -/* Output single byte as two hex ASCII digits */ -/**********************************************/ -void putzhex(uchar val) -{ - char *digits="0123456789abcdef"; - -putcom(digits[(val&0xF0)>>4]); -putcom(digits[val&0xF]); -} - -/***********************/ -/* Output a hex header */ -/***********************/ -void putzhhdr(char type) -{ - uint i,crc=0; - -putcom(ZPAD); -putcom(ZPAD); -putcom(ZDLE); -if(zmode&VAR_HDRS) { - putcom(ZVHEX); - putzhex(4); } -else - putcom(ZHEX); -putzhex(type); -ucrc16(type,&crc); -for(i=0;i<4;i++) { - putzhex(Txhdr[i]); - ucrc16(Txhdr[i],&crc); } -ucrc16(0,&crc); -ucrc16(0,&crc); -putzhex(crc>>8); -putzhex(crc&0xff); -putcom(CR); -putcom(LF); /* Chuck's RZ.C sends LF|0x80 for some unknown reason */ -if(type!=ZFIN && type!=ZACK) - putcom(XON); -} - -/****************************************************************************/ -/* Stores a long in the Zmodem transmit header (usually position offset) */ -/****************************************************************************/ -void ltohdr(long l) -{ - -Txhdr[ZP0] = l; -Txhdr[ZP1] = l>>8; -Txhdr[ZP2] = l>>16; -Txhdr[ZP3] = l>>24; -} - -/****************************************************************************/ -/* Outputs single Zmodem character, escaping with ZDLE when appropriate */ -/****************************************************************************/ -void putzcom(uchar ch) -{ - static lastsent; - -if(ch&0x60) /* not a control char */ - putcom(lastsent=ch); -else - switch(ch) { - case DLE: - case DLE|0x80: /* even if high-bit set */ - case XON: - case XON|0x80: - case XOFF: - case XOFF|0x80: - case ZDLE: - putcom(ZDLE); - ch^=0x40; - putcom(lastsent=ch); - break; - case CR: - case CR|0x80: - if(!(zmode&CTRL_ESC) && (lastsent&0x7f)!='@') - putcom(lastsent=ch); - else { - putcom(ZDLE); - ch^=0x40; - putcom(lastsent=ch); } - break; - default: - if(zmode&CTRL_ESC && !(ch&0x60)) { /* it's a ctrl char */ - putcom(ZDLE); - ch^=0x40; } - putcom(lastsent=ch); - break; } -} - -/* - * Read a byte, checking for ZMODEM escape encoding - * including CAN*5 which represents a quick abort - */ -int getzcom() -{ - int i; - -while(1) { - /* Quick check for non control characters */ - if((i=getcom(Rxtimeout))&0x60) - return(i); - if(i==ZDLE) - break; - if((i&0x7f)==XOFF || (i&0x7f)==XON) - continue; - if(zmode&CTRL_ESC && !(i&0x60)) - continue; - return(i); } - -while(1) { /* Escaped characters */ - if((i=getcom(Rxtimeout))<0) - return(i); - if(i==CAN && (i=getcom(Rxtimeout))<0) - return(i); - if(i==CAN && (i=getcom(Rxtimeout))<0) - return(i); - if(i==CAN && (i=getcom(Rxtimeout))<0) - return(i); - switch (i) { - case CAN: - return(GOTCAN); - case ZCRCE: - case ZCRCG: - case ZCRCQ: - case ZCRCW: - return(i|GOTOR); - case ZRUB0: - return(0x7f); - case ZRUB1: - return(0xff); - case XON: - case XON|0x80: - case XOFF: - case XOFF|0x80: - continue; - default: - if (zmode&CTRL_ESC && !(i&0x60)) - continue; - if ((i&0x60)==0x40) - return(i^0x40); - break; } - break; } -return(ERROR); -} - - - -/* - * Read a character from the modem line with timeout. - * Eat parity, XON and XOFF characters. - */ -int getcom7() -{ - int i; - -while(1) { - i=getcom(10); - switch(i) { - case XON: - case XOFF: - continue; - case CR: - case LF: - case NOINP: - case ZDLE: - return(i); - default: - if(!(i&0x60) && zmode&CTRL_ESC) - continue; - return(i); } } -} - - -#if 0 - -int getzhdr() -{ - int done=0; - -while(!done) { - i=getcom(10); - switch(i) { - case NOINP: - done=1; - continue; - case XON: - case XON|0x80: - continue; - case ZPAD|0x80: - case ZPAD: - break; - case CAN: - cancount++; - if(cancount>=5) { - i=ZCAN; - done=1; - break; } - i=getcom(10); - switch(i) { - case NOINP: - continue; - case ZCRCW: - switch(getcom(10)) { - case NOINP: - i=ERROR - done=1; - break; - case RCDO: - done=1; - break; - default: - continue; } - break; - case RCDO: - done=1; - break; - case CAN: - cancount++; - if(cancount>=5) { - i=ZCAN; - done=1; - continue; - default: - break; } - continue; - default: - continue; } - - i=Rxframeind=getcom7(); - switch (i) { - case ZVBIN32: - if((Rxhlen=c=getzcom())<0) - goto fifi; - if(c>ZMAXHLEN) - goto agn2; - Crc32r=1; - c=zrbhd32(hdr); - break; - case ZBIN32: - if(zmode&VAR_HDRS) - goto agn2; - Crc32r=1; - c=zrbhd32(hdr); - break; - case ZVBINR32: - if((Rxhlen=c=getzcom())<0) - goto fifi; - if(c>ZMAXHLEN) - goto agn2; - Crc32r=2; - c=zrbhd32(hdr); - break; - case ZBINR32: - if(zmode&VAR_HDRS) - goto agn2; - Crc32r=2; - c=zrbhd32(hdr); - break; - case RCDO: - case TIMEOUT: - goto fifi; - case ZVBIN: - if((Rxhlen=c=getzcom())<0) - goto fifi; - if(c>ZMAXHLEN) - goto agn2; - Crc32r=0; - c=zrbhdr(hdr); - break; - case ZBIN: - if(zmode&VAR_HDRS) - goto agn2; - Crc32r=0; - c=zrbhdr(hdr); - break; - case ZVHEX: - if((Rxhlen=c=zgethex()) < 0) - goto fifi; - if(c>ZMAXHLEN) - goto agn2; - Crc32r=0; - c=zrhhdr(hdr); - break; - case ZHEX: - if(zmode&VAR_HDRS) - goto agn2; - Crc32r=0; - c=zrhhdr(hdr); - break; - case CAN: - goto gotcan; - default: - goto agn2; - } - - - -/****************************************************************************/ -/* Get the receiver's init parameters */ -/****************************************************************************/ -int getzrxinit() -{ - int i; - struct stat f; - -for(i=0;i<10;i++) { - switch(zgethdr(Rxhdr,1)) { - case ZCHALLENGE: /* Echo receiver's challenge numbr */ - ltohdr(Rxpos); - putzhhdr(ZACK); - continue; - case ZCOMMAND: /* They didn't see out ZRQINIT */ - ltohdr(0L); - putzhhdr(ZRQINIT); - continue; - case ZRINIT: - Rxflags=Rxhdr[ZF0]&0x7f; - if(Rxhdr[ZF1]&CANVHDR) - zmode|=VAR_HDRS; - Txfcs32 = (Wantfcs32 && (Rxflags & CANFC32)); - Zctlesc |= Rxflags & TESCCTL; - Rxbuflen = (0377 & Rxhdr[ZP0])+((0377 & Rxhdr[ZP1])<<8); - if ( !(Rxflags & CANFDX)) - Txwindow = 0; - - /* Override to force shorter frame length */ - if (Rxbuflen && (Rxbuflen>Tframlen) && (Tframlen>=32)) - Rxbuflen = Tframlen; - if ( !Rxbuflen && (Tframlen>=32) && (Tframlen<=1024)) - Rxbuflen = Tframlen; - vfile("Rxbuflen=%d", Rxbuflen); - - /* - * If input is not a regular file, force ACK's to - * prevent running beyond the buffer limits - */ - if ( !Command) { - fstat(fileno(in), &f); - if ((f.st_mode & S_IFMT) != S_IFREG) { - Canseek = -1; - ef TXBSIZE - Txwindow = TXBSIZE - 1024; - Txwspac = TXBSIZE/4; - e - return ERROR; - if - } - } - - /* Set initial subpacket length */ - if (blklen < 1024) { /* Command line override? */ - if (Effbaud > 300) - blklen = 256; - if (Effbaud > 1200) - blklen = 512; - if (Effbaud > 2400) - blklen = 1024; - } - if (Rxbuflen && blklen>Rxbuflen) - blklen = Rxbuflen; - if (blkopt && blklen > blkopt) - blklen = blkopt; - vfile("Rxbuflen=%d blklen=%d", Rxbuflen, blklen); - vfile("Txwindow = %u Txwspac = %d", Txwindow, Txwspac); - - - if (Lztrans == ZTRLE && (Rxflags & CANRLE)) - Txfcs32 = 2; - else - Lztrans = 0; - - return (sendzsinit()); - case ZCAN: - case TIMEOUT: - return ERROR; - case ZRQINIT: - if (Rxhdr[ZF0] == ZCOMMAND) - continue; - default: - putzhhdr(ZNAK); - continue; } } -return(ERROR); -} - - -getzdata(char *buf, int length) -{ - int c,d; - uint crc; - char *end; - - switch (Crc32r) { - case 1: - return zrdat32(buf, length); - case 2: - return zrdatr32(buf, length); - } - - crc = Rxcount = 0; end = buf + length; - while (buf <= end) { - if ((c = getzcom()) & ~0377) { -crcfoo: - switch (c) { - case GOTCRCE: - case GOTCRCG: - case GOTCRCQ: - case GOTCRCW: - crc = updcrc((d=c)&0377, crc); - if ((c = getzcom()) & ~0377) - goto crcfoo; - crc = updcrc(c, crc); - if ((c = getzcom()) & ~0377) - goto crcfoo; - crc = updcrc(c, crc); - if (crc & 0xFFFF) { - zperr(badcrc); - return ERROR; - } - Rxcount = length - (end - buf); -#ifndef DSZ - vfile("zrdata: %d %s", Rxcount, - Zendnames[d-GOTCRCE&3]); -#endif - return d; - case GOTCAN: - zperr("Sender Canceled"); - return ZCAN; - case TIMEOUT: - zperr("TIMEOUT"); - return c; - default: - garbitch(); return c; - } - } - *buf++ = c; - crc = updcrc(c, crc); - } -#ifdef DSZ - garbitch(); -#else - zperr("Data subpacket too long"); -#endif - return ERROR; -} - -#endif - -/************************************************/ -/* Dump the current blockm contents - for debug */ -/************************************************/ -void dump_block() -{ - long l; - -for(l=0;l<block_size;l++) - lprintf("%02X ",block[l]); -lputs("\r\n"); -} - -char *usage= -"usage: STP <port> [chan] [opts] <cmd> [file | path | +list]\r\n\r\n" -"where:\r\n\r\n" -"port = COM port (1-4), D for DigiBoard, or UART I/O address (hex)\r\n" -"chan = IRQ channel (2-15) or DigiBoard channel (4+)\r\n" -"opts = b# to set DTE rate to #bps\r\n" -" t# to set time-slice API type (default=1)\r\n" -" o to overwrite files when receiving\r\n" -" d to disable dropped carrier detection\r\n" -" a to sound alarm at start and stop of transfer\r\n" -" l to disable local keyboard (Ctrl-C) checking\r\n" -"cmd = sx to send Xmodem rx to recv Xmodem\r\n" -" sX to send Xmodem-1k rc to recv Xmodem-CRC\r\n" -" sy to send Ymodem ry to recv Ymodem\r\n" -" sY to send Ymodem-1k rg to recv Ymodem-G\r\n" -" sz to send Zmodem rz to recv Zmodem\r\n" -"file = filename to send or receive\r\n" -"path = path to receive files into\r\n" -"list = name of text file with list of filenames to send or receive\r\n"; - -/***************/ -/* Entry Point */ -/***************/ -int main(int argc, char **argv) -{ - char str[256],tmp[256],tmp2[256],irq,errors,*p,*p2,first_block - ,*fname[MAX_FNAMES],fnames=0,fnum,success; - int ch,i,j,k,file,last,total_files=0,sent_files=0,can; - uint base=0,baud=0,cps; - long b,l,m,file_bytes_left,serial_num; - ulong file_bytes=0,total_bytes=0,sent_bytes=0; - time_t t,startall,startfile,ftime; - struct ffblk ff; - struct ftime ft; - struct date dosdate; - struct time dostime; - FILE *stream,*log=NULL; - -mswtyp=TS_INT28; /* default to int 28 only */ - -ctrlbrk(cbreakh); - -if((asmrev=*(&riobp-1))!=19) { - printf("Wrong rciol.obj\n"); - exit(1); } - -lclini(0xd<<8); - -lprintf("\r\nSynchronet Transfer Protocols v1.00" - " Developed 1993-1997 Rob Swindell\r\n\r\n"); - -lputs("Command line: "); -for(i=1;i<argc;i++) - lprintf("%s ",argv[i]); -lputs("\r\n"); - -if(argc<3) { - lprintf(usage); - exit(1); } - -i=1; - -base=ahtoul(argv[i]); -if(base>4 && base<0x100) /* 'D' and 'FFFF' are the same */ - base=0xffff; -if(base!=0xffff && base<5) - switch(atoi(argv[i])) { - case 1: - base=0x3f8; - irq=4; - break; - case 2: - base=0x2f8; - irq=3; - break; - case 3: - base=0x3e8; - irq=4; - break; - case 4: - base=0x2e8; - irq=3; - break; - default: - lprintf("Invalid COM Port (%s)\r\n",argv[1]); - lprintf(usage); - exit(1); } - -if(base>4 || isdigit(argv[i+1][0])) - irq=atoi(argv[++i]); - -for(i++;i<argc;i++) { - - if(!(mode&(SEND|RECV))) { - if(toupper(argv[i][0])=='S' || toupper(argv[i][0])=='R') { /* cmd */ - if(toupper(argv[i][0])=='R') - mode|=RECV; - else - mode|=SEND; - - block_size=1024; - - switch(argv[i][1]) { - case 'c': - case 'C': - mode|=CRC; - case 'x': - block_size=128; - case 'X': - mode|=XMODEM; - break; - case 'y': - block_size=128; - case 'Y': - mode|=(YMODEM|CRC); - break; - case 'g': - case 'G': - mode|=(YMODEM|CRC|GMODE); - break; - case 'z': - case 'Z': - mode|=(ZMODEM|CRC); - break; - default: - lprintf("Unrecognized command '%s'\r\n\r\n",argv[i]); - lprintf(usage); - exit(1); } } - - else if(toupper(argv[i][0])=='B') - baud=atoi(argv[i]+1); - - else if(toupper(argv[i][0])=='T') - mswtyp=atoi(argv[i]+1); - - else if(toupper(argv[i][0])=='O') - mode|=OVERWRITE; - - else if(toupper(argv[i][0])=='D') - mode|=IGNORE_DCD; - - else if(toupper(argv[i][0])=='A') - mode|=ALARM; - - else if(toupper(argv[i][0])=='L') - mode|=NO_LOCAL; - - else if(argv[i][0]=='*') - mode|=DEBUG; } - - else if(argv[i][0]=='+') { - if(mode&DIR) { - lprintf("Cannot specify both directory and filename\r\n"); - exit(1); } - sprintf(str,"%s",argv[i]+1); - if((file=nopen(str,O_RDONLY))==-1 - || (stream=fdopen(file,"rb"))==NULL) { - lprintf("Error opening filelist %s\r\n",str); - exit(1); } - while(!feof(stream) && !ferror(stream) && fnames<MAX_FNAMES) { - if(!fgets(str,128,stream)) - break; - truncsp(str); - strupr(str); - if((fname[fnames]=(char *)malloc(strlen(str)+1))==NULL) { - lprintf("Error allocating memory for filename\r\n"); - exit(1); } - strcpy(fname[fnames++],str); } - fclose(stream); } - - else if(mode&(SEND|RECV)){ - if((fname[fnames]=(char *)malloc(128))==NULL) { - lprintf("Error allocating memory for filename\r\n"); - exit(1); } - strcpy(fname[fnames],argv[i]); - strupr(fname[fnames]); - j=strlen(fname[fnames]); - if(fname[fnames][j-1]=='\\' /* Ends in \ */ - || !strcmp(fname[fnames]+1,":")) { /* Drive letter only */ -/* || !findfirst(fname[fnames],&ff,FA_DIREC)) { is a directory */ - if(mode&DIR) { - lprintf("Only one directory can be specified\r\n"); - exit(1); } - if(fnames) { - lprintf("Cannot specify both directory and filename\r\n"); - exit(1); } - if(mode&SEND) { - lprintf("Cannot send directory '%s'\r\n",fname[fnames]); - exit(1);} - mode|=DIR; } - fnames++; } } - -if(!(mode&(SEND|RECV))) { - lprintf("No command specified\r\n"); - lprintf(usage); - exit(1); } - -if(mode&(SEND|XMODEM) && !fnames) { /* Sending with any or recv w/Xmodem */ - lprintf("Must specify filename or filelist\r\n"); - lprintf(usage); - exit(1); } - -i=strlen(fname[0]); /* Make sure the directory ends in \ or : */ -if(mode&DIR && fname[0][i-1]!='\\' && fname[0][i-1]!=':') - strcat(fname[0],"\\"); - -i=rioini(base,irq); -if(i) { - lprintf("STP: Error (%d) initializing COM port base %x irq %d\r\n" - ,i,base,irq); - exit(1); } - -if(mode&ALARM) { - sound(1000); - mswait(500); - sound(2000); - mswait(500); - nosound(); } - -if(baud) { - i=setbaud(baud); - if(i) { - lprintf("STP: Error setting baud rate to %u\r\n",baud); - bail(1); } } -else - baud=rioctl(GBAUD); - -rioctl(IOSM|CTSCK|RTSCK); - -rioctl(TSTYPE|mswtyp); /* set time-slice API type */ - -if(!DCDHIGH) { - newline(); - lprintf("No carrier\r\n"); - bail(1); } - -p=getenv("DSZLOG"); -if(p) { - if((file=open(p,O_WRONLY|O_BINARY|O_CREAT,S_IWRITE|S_IREAD))==-1 - || (log=fdopen(file,"wb"))==NULL) { - lprintf("Error opening DSZLOG file '%s'\r\n",p); - bail(1); } - setvbuf(log,NULL,_IOFBF,16*1024); } - -startall=time(NULL); - -if(mode&RECV) { - if(fnames>1) - lprintf("Receiving %u files\r\n",fnames); - fnum=0; - while(1) { - if(mode&XMODEM) { - strcpy(str,fname[0]); - file_bytes=file_bytes_left=0x7fffffff; - serial_num=-1; } - - else if(mode&YMODEM) { - lprintf("Fetching Ymodem header block\r\n"); - for(errors=0;errors<MAXERRORS;errors++) { - if(errors>3 && mode&CRC && !(mode&GMODE)) - mode&=~CRC; - if(mode&GMODE) /* G for Ymodem-G */ - putcom('G'); - else if(mode&CRC) /* C for CRC */ - putcom('C'); - else /* NAK for checksum */ - putcom(NAK); - for(i=60;i;i--) { - if(rioctl(RXBC)) /* no chars in-bound */ - break; - mswait(100); } /* so wait */ - - if(!i) { /* none after 6 secs */ - if(errors) - lprintf("Ymodem header timeout (%d)\r\n",errors); - continue; } - if(!get_block(1)) { /* block received successfully */ - putcom(ACK); - break; } } - if(errors==MAXERRORS) { - lprintf("Error fetching Ymodem header block\r\n"); - cancel(); - bail(1); } - if(!block[0]) { - lputs("Received Ymodem termination block\r\n"); - bail(0); } - p=block+strlen(block)+1; - sscanf(p,"%ld %lo %lo %lo %d %ld" - ,&file_bytes /* file size (decimal) */ - ,&ftime /* file time (octal unix format) */ - ,&m /* file mode (not used) */ - ,&serial_num /* program serial number */ - ,&total_files /* remaining files to be sent */ - ,&total_bytes /* remaining bytes to be sent */ - ); - if(!file_bytes) - file_bytes=0x7fffffff; - file_bytes_left=file_bytes; - if(!total_files) - total_files=fnames-fnum; - if(!total_files) - total_files=1; - if(total_bytes<file_bytes) - total_bytes=file_bytes; - if(!serial_num) - serial_num=-1; - strupr(block); - lprintf("Incoming filename: %.64s ",block); - if(mode&DIR) - sprintf(str,"%s%s",fname[0],justfname(block,tmp)); - else { - justfname(block,str); - for(i=0;i<fnames;i++) { - if(!fname[i][0]) /* name blank or already used */ - continue; - justfname(fname[i],tmp); - if(!stricmp(tmp,str)) { - strcpy(str,fname[i]); - fname[i][0]=0; - break; } } - if(i==fnames) { /* Not found in list */ - if(fnames) - lputs(" - Not in receive list!"); - if(!fnames || fnum>=fnames || !fname[fnum][0]) - justfname(block,str); /* worst case */ - else { - strcpy(str,fname[fnum]); - fname[fnum][0]=0; } } } - lputs("\r\n"); } - - else { /* Zmodem */ -#if 0 - tryzhdrtype=ZRINIT; - while(1) { - Txhdr[ZF0]=(CANFC32|CANFDX|CANOVIO|CANRLE); - /* add CANBRK if we can send break signal */ - if(zmode&CTRL_ESC) - Txhdr[ZF0]|=TESCCTL; - Txhdr[ZF1]=CANVHDR; - Txhdr[ZP0]=0; - Txhdr[ZP1]=0; - putzhhdr(tryzhdrtype); - done=0; - while(!done) { - done=1; - switch(getzhdr()) { - case ZRQINIT: - if(Rxhdr[ZF3]&0x80) - zmode|=VAR_HDRS; /* we can var header */ - break; - case ZFILE: - zconv=Rxhdr[ZF0]; - zmanag=Rxhdr[ZF1]; - ztrans=Rxhdr[ZF2]; - if(Rxhdr[ZF3]&ZCANVHDR) - zmode|=VAR_HDRS; - tryzhdrtype=ZRINIT; - if(getzdata(block, 1024)==GOTCRCW) { - /* something */ - done=1; } - putzhhdr(ZNAK); - done=0; - break; - case ZSINIT: - if(Rxhdr[ZF0]&TESCCTL) - zmode|=CTRL_ESC; - if (getzdata(attn,ZATTNLEN)==GOTCRCW) { - ltohdr(1L); - putzhhdr(ZACK); } - else - putzhhdr(ZNAK); - done=0; - break; - case ZFREECNT: - ltohdr(0); /* should be free disk space */ - putzhhdr(ZACK); - done=0; - break; - case ZCOMMAND: -/*** - cmdzack1flg = Rxhdr[ZF0]; - if(getzdata(block,1024)==GOTCRCW) { - if (cmdzack1flg & ZCACK1) - ltohdr(0L); - else - ltohdr((long)sys2(block)); - purgeline(); /* dump impatient questions */ - do { - zshhdr(4,ZCOMPL, Txhdr); - } - while (++errors<20 && zgethdr(Rxhdr,1)!=ZFIN); - ackbibi(); - if (cmdzack1flg & ZCACK1) - exec2(block); - return ZCOMPL; - } -***/ - putzhhdr(ZNAK); - done=0; - break; - case ZCOMPL: - done=0; - break; - case ZFIN: - ackbibi(); - return ZCOMPL; - case ZCAN: - return ERROR; } } -#endif - } - - fnum++; - - if(!(mode&DIR) && fnames && fnum>fnames) { - newline(); - lprintf("Attempt to send more files than specified\r\n"); - cancel(); - break; } - - k=strlen(str); /* strip out control characters and high ASCII */ - for(i=j=0;i<k;i++) - if(str[i]>SP && (uchar)str[i]<0x7f) - str[j++]=str[i]; - str[j]=0; - strupr(str); - if(fexist(str) && !(mode&OVERWRITE)) { - lprintf("%s already exists\r\n",str); - cancel(); - bail(1); } - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1 - || (stream=fdopen(file,"wb"))==NULL) { - lprintf("Error creating %s\r\n",str); - cancel(); - bail(1); } - setvbuf(stream,NULL,_IOFBF,8*1024); - startfile=time(NULL); - lprintf("Receiving %s (%lu bytes) via %s %s\r\n" - ,str - ,mode&XMODEM ? 0 : file_bytes - ,mode&XMODEM ? "Xmodem" : mode&YMODEM ? mode&GMODE ? "Ymodem-G" - : "Ymodem" :"Zmodem" - ,mode&CRC ? "CRC-16":"Checksum"); - - errors=0; - block_num=0; - if(mode&GMODE) /* G for Ymodem-G */ - putcom('G'); - else if(mode&CRC) /* C for CRC */ - putcom('C'); - else /* NAK for checksum */ - putcom(NAK); - while(errors<MAXERRORS) { - if(block_num && !(mode&GMODE)) - putcom(ACK); - i=get_block(0); /* returns 0 if block okay */ - if(i==EOT) /* end of transfer */ - break; - if(i) { /* other error */ - cancel(); - bail(1); } - if(file_bytes_left<=0L) { /* No more bytes to send */ - newline(); - lputs("Attempt to send more than header specified\r\n"); - break; } - if(hdr_block_num==((block_num+1)&0xff)) { /* correct block */ - block_num++; - if(file_bytes_left<block_size) { - if(fwrite(block,1,file_bytes_left,stream) - !=file_bytes_left) { - newline(); - lprintf("Error writing to file\r\n"); - cancel(); - bail(1); } } - else { - if(fwrite(block,1,block_size,stream) - !=block_size) { - newline(); - lprintf("Error writing to file\r\n"); - cancel(); - bail(1); } } - file_bytes_left-=block_size; } - else { - newline(); - lprintf("Block number %u instead of %u\r\n" - ,hdr_block_num,(block_num+1)&0xff); - // dump_block(); - errors++; } - t=time(NULL)-startfile; - if(!t) t=1; - cps=(uint)((block_num*(long)block_size)/t); /* cps so far */ - if(!cps) cps=1; - l=file_bytes/cps; /* total transfer est time */ - l-=t; /* now, it's est time left */ - if(l<0) l=0; - b=blocks(file_bytes); - if(mode&YMODEM) - lprintf("\rBlock (%lu%s): %lu/%lu Byte: %lu Time: %lu:%02lu " - "Left: %lu:%02lu CPS: %u %lu%% " - ,block_size%1024L ? block_size: block_size/1024L - ,block_size%1024L ? "" : "k" - ,block_num - ,b - ,block_num*(long)block_size - ,t/60L - ,t%60L - ,l/60L - ,l%60L - ,cps - ,(long)(((float)block_num/(float)b)*100.0) - ); - else /* Xmodem */ - lprintf("\rBlock (%lu%s): %lu Byte: %lu Time: %lu:%02lu " - "CPS: %u " - ,block_size%1024L ? block_size: block_size/1024L - ,block_size%1024L ? "" : "k" - ,block_num - ,block_num*(long)block_size - ,t/60L - ,t%60L - ,cps - ); - } - - putcom(ACK); - if(!(mode&XMODEM) && ftime) { - unixtodos(ftime,&dosdate,&dostime); - if(dosdate.da_year>=1980) { - ft.ft_min=dostime.ti_min; - ft.ft_hour=dostime.ti_hour; - ft.ft_tsec=dostime.ti_sec/2; - ft.ft_year=dosdate.da_year-1980; - ft.ft_day=dosdate.da_day; - ft.ft_month=dosdate.da_mon; - setftime(file,&ft); } } - fclose(stream); - t=time(NULL)-startfile; - if(!t) t=1; - l=(block_num-1)*(long)block_size; - if(l>file_bytes) - l=file_bytes; - newline(); - lprintf("Successsful - Time: %lu:%02lu CPS: %lu\r\n" - ,t/60,t%60,l/t); - if(log) { - fprintf(log,"%c %6lu %5u bps %4lu cps %3u errors %5u %4u " - "%s %d\r\n" - ,mode&ZMODEM ? 'Z' : 'R' - ,l - ,baud - ,l/t - ,errors - ,flows - ,block_size - ,str - ,serial_num); } - if(mode&XMODEM) - break; - total_files--; - total_bytes-=file_bytes; - if(total_files>1 && total_bytes) - lprintf("Remaining - Time: %lu:%02lu Files: %u Bytes: %lu\r\n" - ,(total_bytes/cps)/60 - ,(total_bytes/cps)%60 - ,total_files - ,total_bytes - ); - } - bail(0); } - -/********/ -/* SEND */ -/********/ - -/****************************************************/ -/* Search through all to find total files and bytes */ -/****************************************************/ -for(fnum=0;fnum<fnames;fnum++) { - last=findfirst(fname[fnum],&ff,0); /* incase wildcards are used */ - if(last) - lprintf("%s not found\r\n",fname[fnum]); - while(!last) { - total_files++; - total_bytes+=ff.ff_fsize; - last=findnext(&ff); } } - -if(fnames>1) - lprintf("Sending %u files (%lu bytes total)\r\n" - ,total_files,total_bytes); - -rioctl(IOFB); - -/***********************************************/ -/* Send every file matching names or filespecs */ -/***********************************************/ -for(fnum=0;fnum<fnames;fnum++) { - last=findfirst(fname[fnum],&ff,0); - while(!last) { - if(mode&ZMODEM) { -#if 0 - putcom('r'); putcom('z'); putcom(CR); /* send rz\r */ - ltohdr(0L); /* Zero the header */ - putzhhdr(ZRQINIT); - getzrxinit(); -#endif - } /* Zmodem */ - else { - mode&=~GMODE; - flows=0; - for(errors=can=0;errors<MAXERRORS;errors++) { - i=getcom(10); - if(can && i!=CAN) - can=0; - if(i==NAK) { /* csum */ - mode&=~CRC; - break; } - if(i=='C') { - mode|=CRC; - break; } - if(i=='G') { - mode|=(GMODE|CRC); - break; } - if(i==CAN) { - if(can) { - newline(); - lprintf("Cancelled remotely\r\n"); - bail(1); } - can=1; } - rioctl(IOFB); /* flush buffers cause we have crap-o-la */ - if(i!=NOINP) { - newline(); - lprintf("Received %s Expected NAK, C, or G\r\n" - ,chr(i)); } } - if(errors==MAXERRORS) { - lprintf("Timeout starting transfer\r\n"); - cancel(); - bail(1); } } /* X/Ymodem */ - - strcpy(str,fname[fnum]); - if(strchr(str,'*') || strchr(str,'?')) { /* wildcards used */ - p=strrchr(str,'\\'); - if(!p) - p=strchr(str,':'); - if(p) - *(p+1)=NULL; - else - str[0]=0; - strcat(str,ff.ff_name); } - - lprintf("Sending %s (%lu bytes) via %s %s\r\n" - ,str,ff.ff_fsize - ,mode&XMODEM ? "Xmodem" : mode&YMODEM ? mode&GMODE ? "Ymodem-G" - : "Ymodem" :"Zmodem" - ,mode&CRC ? "CRC-16":"Checksum"); - - if((file=nopen(str,O_RDONLY))==-1 - || (stream=fdopen(file,"rb"))==NULL) { - lprintf("Error opening %s for read\r\n",str); - cancel(); - bail(1); } - setvbuf(stream,NULL,_IOFBF,8*1024); - rioctl(IOFB); /* flush buffers cause extra 'G', 'C', or NAKs */ - if(!(mode&XMODEM)) { - getftime(file,&ft); - dostime.ti_min=ft.ft_min; - dostime.ti_hour=ft.ft_hour; - dostime.ti_hund=0; - dostime.ti_sec=ft.ft_tsec*2; - dosdate.da_year=1980+ft.ft_year; - dosdate.da_day=ft.ft_day; - dosdate.da_mon=ft.ft_month; - t=dostounix(&dosdate,&dostime); - memset(block,NULL,128); - strcpy(block,ff.ff_name); - strlwr(block); - sprintf(block+strlen(block)+1,"%lu %lo 0 0 %d %ld" - ,ff.ff_fsize,t,total_files-sent_files,total_bytes-sent_bytes); - /* - lprintf("Sending Ymodem block '%s'\r\n",block+strlen(block)+1); - */ - block_num=0; - i=block_size; - block_size=128; /* Always use 128 for first block */ - for(errors=0;errors<MAXERRORS;errors++) { - put_block(); - if(get_ack()) - break; } - if(errors==MAXERRORS) { - newline(); - lprintf("Failed to send header block\r\n"); - cancel(); - bail(1); } - block_size=i; /* Restore block size */ - mode&=~GMODE; - for(errors=can=0;errors<MAXERRORS;errors++) { - i=getcom(10); - if(can && i!=CAN) - can=0; - if(i==NAK) { /* csum */ - mode&=~CRC; - break; } - if(i=='C') { - mode|=CRC; - break; } - if(i=='G') { - mode|=(GMODE|CRC); - break; } - if(i==CAN) { - if(can) { - newline(); - lprintf("Cancelled remotely\r\n"); - bail(1); } - can=1; } - rioctl(IOFB); - if(i!=NOINP) { - newline(); - lprintf("Received %s Expected NAK, C, or G\r\n" - ,chr(i)); } } - if(errors==MAXERRORS) { - newline(); - lprintf("Too many errors waiting for receiver\r\n"); - cancel(); - bail(1); } } - last_block_num=block_num=1; - startfile=time(NULL); - errors=0; - while((block_num-1)*(long)block_size<ff.ff_fsize && errors<MAXERRORS) { - if(last_block_num==block_num) { /* block_num didn't increment */ - fseek(stream,(block_num-1)*(long)block_size,SEEK_SET); - i=fread(block,1,block_size,stream); - while(i<block_size) - block[i++]=CPMEOF; } - last_block_num=block_num; - put_block(); - i=fread(block,1,block_size,stream); /* read next block from disk */ - while(i<block_size) - block[i++]=CPMEOF; - t=time(NULL)-startfile; - if(!t) t=1; /* t is time so far */ - cps=(uint)((block_num*(long)block_size)/t); /* cps so far */ - if(!cps) cps=1; - l=ff.ff_fsize/cps; /* total transfer est time */ - l-=t; /* now, it's est time left */ - if(l<0) l=0; - b=blocks(ff.ff_fsize); - lprintf("\rBlock (%lu%s): %lu/%lu Byte: %lu " - "Time: %lu:%02lu Left: %lu:%02lu CPS: %u %lu%% " - ,block_size%1024L ? block_size: block_size/1024L - ,block_size%1024L ? "" : "k" - ,block_num - ,b - ,block_num*(long)block_size - ,t/60L - ,t%60L - ,l/60L - ,l%60L - ,cps - ,(long)(((float)block_num/(float)b)*100.0) - ); - if(!get_ack()) - errors++; - else - block_num++; } - fclose(stream); - success=0; - if((block_num-1)*(long)block_size>=ff.ff_fsize) { - sent_files++; - sent_bytes+=ff.ff_fsize; - riosync(); - lprintf("\n"); - - for(i=0;i<10;i++) { - lprintf("\rSending EOT (%d)",i+1); - rioctl(IOFI); - putcom(EOT); - ch=getcom(10); - if(ch==ACK) - break; - if(ch==NAK && i==0 && (mode&(YMODEM|GMODE))==YMODEM) - continue; /* chuck's double EOT trick so don't complain */ - if(ch!=NOINP) { - newline(); - lprintf("Received %s Expected ACK\r\n" - ,chr(ch)); } } - if(i==3) - lprintf("\rNo ACK on EOT \n"); - t=time(NULL)-startfile; - if(!t) t=1; - lprintf("\rSuccesssful - Time: %lu:%02lu CPS: %lu\r\n" - ,t/60,t%60,ff.ff_fsize/t); - success=1; } - else { - newline(); - lputs("Unsuccessful!\r\n"); - t=time(NULL)-startfile; - if(!t) t=1; } - - if(total_files>1 && total_files-sent_files>1) - lprintf("Remaining - Time: %lu:%02lu Files: %u Bytes: %lu\r\n" - ,((total_bytes-sent_bytes)/cps)/60 - ,((total_bytes-sent_bytes)/cps)%60 - ,total_files-sent_files - ,total_bytes-sent_bytes - ); - if(log) { - l=(block_num-1)*(long)block_size; - if(l>ff.ff_fsize) - l=ff.ff_fsize; - fprintf(log,"%c %6lu %5u bps %4lu cps %3u errors %5u %4u " - "%s -1\r\n" - ,success ? (mode&ZMODEM ? 'z':'S') : 'E' - ,l - ,baud - ,l/t - ,errors - ,flows - ,block_size - ,fname[fnum]); } - - last=findnext(&ff); } } -if(mode&XMODEM) - bail(0); -mode&=~GMODE; -i=getcom(10); -if(i==NAK) - mode&=~CRC; -else if(i=='C') - mode|=CRC; -else if(i=='G') - mode|=(GMODE|CRC); -if(i!=NOINP && i!=NAK && i!='C' && i!='G') { - newline(); - lprintf("Received %s Expected NAK, C, or G\r\n",chr(i)); } -else if(i!=NOINP) { - block_num=0; - block[0]=0; - block_size=128; - put_block(); - if(!get_ack()) { - newline(); - lprintf("Failed to receive ACK after terminating block\r\n"); } } -if(total_files>1) { - t=time(NULL)-startall; - if(!t) t=1; - newline(); - lprintf("Overall - Time %02lu:%02lu Bytes: %lu CPS: %lu\r\n" - ,t/60,t%60,sent_bytes,sent_bytes/t); } -bail(0); -return(0); -} - diff --git a/src/stp/zmodem.h b/src/stp/zmodem.h deleted file mode 100644 index e04b4fca24..0000000000 --- a/src/stp/zmodem.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Z M O D E M . H Manifest constants for ZMODEM - * application to application file transfer protocol - * Copyright 1991 Omen Technology Inc All Rights Reserved - * 04-17-89 Chuck Forsberg Omen Technology Inc - */ -#define ZPAD '*' /* 052 Padding character begins frames */ -#define ZDLE 030 /* Ctrl-X Zmodem escape - `ala BISYNC DLE */ -#define ZDLEE (ZDLE^0100) /* Escaped ZDLE as transmitted */ -#define ZBIN 'A' /* Binary frame indicator (CRC-16) */ -#define ZHEX 'B' /* HEX frame indicator */ -#define ZBIN32 'C' /* Binary frame with 32 bit FCS */ -#define ZBINR32 'D' /* RLE packed Binary frame with 32 bit FCS */ -#define ZVBIN 'a' /* Binary frame indicator (CRC-16) */ -#define ZVHEX 'b' /* HEX frame indicator */ -#define ZVBIN32 'c' /* Binary frame with 32 bit FCS */ -#define ZVBINR32 'd' /* RLE packed Binary frame with 32 bit FCS */ -#define ZRESC 0176 /* RLE flag/escape character */ -#define ZMAXHLEN 16 /* Max header information length NEVER CHANGE */ -#define ZMAXSPLEN 1024 /* Max subpacket length NEVER CHANGE */ - -/* Frame types (see array "frametypes" in zm.c) */ -#define ZRQINIT 0 /* Request receive init */ -#define ZRINIT 1 /* Receive init */ -#define ZSINIT 2 /* Send init sequence (optional) */ -#define ZACK 3 /* ACK to above */ -#define ZFILE 4 /* File name from sender */ -#define ZSKIP 5 /* To sender: skip this file */ -#define ZNAK 6 /* Last packet was garbled */ -#define ZABORT 7 /* Abort batch transfers */ -#define ZFIN 8 /* Finish session */ -#define ZRPOS 9 /* Resume data trans at this position */ -#define ZDATA 10 /* Data packet(s) follow */ -#define ZEOF 11 /* End of file */ -#define ZFERR 12 /* Fatal Read or Write error Detected */ -#define ZCRC 13 /* Request for file CRC and response */ -#define ZCHALLENGE 14 /* Receiver's Challenge */ -#define ZCOMPL 15 /* Request is complete */ -#define ZCAN 16 /* Other end canned session with CAN*5 */ -#define ZFREECNT 17 /* Request for free bytes on filesystem */ -#define ZCOMMAND 18 /* Command from sending program */ -#define ZSTDERR 19 /* Output to standard error, data follows */ - -/* ZDLE sequences */ -#define ZCRCE 'h' /* CRC next, frame ends, header packet follows */ -#define ZCRCG 'i' /* CRC next, frame continues nonstop */ -#define ZCRCQ 'j' /* CRC next, frame continues, ZACK expected */ -#define ZCRCW 'k' /* CRC next, ZACK expected, end of frame */ -#define ZRUB0 'l' /* Translate to rubout 0177 */ -#define ZRUB1 'm' /* Translate to rubout 0377 */ - -/* zdlread return values (internal) */ -/* -1 is general error, -2 is timeout */ -#define GOTOR 0400 -#define GOTCRCE (ZCRCE|GOTOR) /* ZDLE-ZCRCE received */ -#define GOTCRCG (ZCRCG|GOTOR) /* ZDLE-ZCRCG received */ -#define GOTCRCQ (ZCRCQ|GOTOR) /* ZDLE-ZCRCQ received */ -#define GOTCRCW (ZCRCW|GOTOR) /* ZDLE-ZCRCW received */ -#define GOTCAN (GOTOR|030) /* CAN*5 seen */ - -/* Byte positions within header array */ -#define ZF0 3 /* First flags byte */ -#define ZF1 2 -#define ZF2 1 -#define ZF3 0 -#define ZP0 0 /* Low order 8 bits of position */ -#define ZP1 1 -#define ZP2 2 -#define ZP3 3 /* High order 8 bits of file position */ - -/* Bit Masks for ZRINIT flags byte ZF0 */ -#define CANFDX 01 /* Rx can send and receive true FDX */ -#define CANOVIO 02 /* Rx can receive data during disk I/O */ -#define CANBRK 04 /* Rx can send a break signal */ -#define CANRLE 010 /* Receiver can decode RLE */ -#define CANLZW 020 /* Receiver can uncompress */ -#define CANFC32 040 /* Receiver can use 32 bit Frame Check */ -#define ESCCTL 0100 /* Receiver expects ctl chars to be escaped */ -#define ESC8 0200 /* Receiver expects 8th bit to be escaped */ - -/* Bit Masks for ZRINIT flags byte ZF1 */ -#define CANVHDR 01 /* Variable headers OK */ - -/* Parameters for ZSINIT frame */ -#define ZATTNLEN 32 /* Max length of attention string */ -#define ALTCOFF ZF1 /* Offset to alternate canit string, 0 if not used */ -/* Bit Masks for ZSINIT flags byte ZF0 */ -#define TESCCTL 0100 /* Transmitter expects ctl chars to be escaped */ -#define TESC8 0200 /* Transmitter expects 8th bit to be escaped */ - -/* Parameters for ZFILE frame */ -/* Conversion options one of these in ZF0 */ -#define ZCBIN 1 /* Binary transfer - inhibit conversion */ -#define ZCNL 2 /* Convert NL to local end of line convention */ -#define ZCRESUM 3 /* Resume interrupted file transfer */ -/* Management include options, one of these ored in ZF1 */ -#define ZMSKNOLOC 0200 /* Skip file if not present at rx */ -/* Management options, one of these ored in ZF1 */ -#define ZMMASK 037 /* Mask for the choices below */ -#define ZMNEWL 1 /* Transfer if source newer or longer */ -#define ZMCRC 2 /* Transfer if different file CRC or length */ -#define ZMAPND 3 /* Append contents to existing file (if any) */ -#define ZMCLOB 4 /* Replace existing file */ -#define ZMNEW 5 /* Transfer if source newer */ - /* Number 5 is alive ... */ -#define ZMDIFF 6 /* Transfer if dates or lengths different */ -#define ZMPROT 7 /* Protect destination file */ -#define ZMCHNG 8 /* Change filename if destination exists */ -/* Transport options, one of these in ZF2 */ -#define ZTLZW 1 /* Lempel-Ziv compression */ -#define ZTRLE 3 /* Run Length encoding */ -/* Extended options for ZF3, bit encoded */ -#define ZXSPARS 64 /* Encoding for sparse file operations */ -#define ZCANVHDR 01 /* Variable headers OK */ -/* Receiver window size override */ -#define ZRWOVR 4 /* byte position for receive window override/256 */ - -/* Parameters for ZCOMMAND frame ZF0 (otherwise 0) */ -#define ZCACK1 1 /* Acknowledge, then do command */ - -#ifndef STP - -long rclhdr(); - -/* Globals used by ZMODEM functions */ -extern Rxframeind; /* ZBIN ZBIN32, or ZHEX type of frame */ -extern Rxtype; /* Type of header received */ -extern Rxcount; /* Count of data bytes received */ -extern Rxtimeout; /* Tenths of seconds to wait for something */ -extern long Rxpos; /* Received file position */ -extern long Txpos; /* Transmitted file position */ -extern Txfcs32; /* TURE means send binary frames with 32 bit FCS */ -extern Crc32t; /* Display flag indicating 32 bit CRC being sent */ -extern Crc32; /* Display flag indicating 32 bit CRC being received */ -extern Znulls; /* Number of nulls to send at beginning of ZDATA hdr */ -extern char Attn[ZATTNLEN+1]; /* Attention string rx sends to tx on err */ -extern char *Altcan; /* Alternate canit string */ - -#endif - -/* End of ZMODEM.H */ diff --git a/src/tone/cvt$$a.c b/src/tone/cvt$$a.c deleted file mode 100644 index 07589cc3c2..0000000000 --- a/src/tone/cvt$$a.c +++ /dev/null @@ -1,66 +0,0 @@ -/* CVT$$A*/ - -/* Converts OS/2 tune editor files to tone format */ - -#include <stdio.h> -#include <stdlib.h> - -void main() -{ - char str[128] - ,*note="abcdefgabcdefgabcdefgabcdefg" - ,*flat="GABCDEFGABCDEFGABCDEFGABCDEFG"; - unsigned int bt=200,o,n,t,i; - -while(1) { - fprintf(stderr,"top\n"); - if(!fgets(str,81,stdin)) - break; - if(str[1]==':') { - printf("%s",str+1); - continue; } - if(str[2]!=' ') { - str[4]=0; - bt=atoi(str); - continue; } - t=atoi(str); - if(!t) - continue; - fprintf(stderr,"rest\n"); - if(t>=10) { - if(t==10) - t=bt*4; - else if(t==11) - t=bt*2; - else if(t==12) - t=bt; - else if(t==13) - t=bt/2; - else if(t==14) - t=bt/4; - else if(t==14) - t=bt/8; - printf("r %u\n",t); - continue; } - fprintf(stderr,"time\n"); - t=(bt*4)/t; - i=atoi(str+3); - o=2; - fprintf(stderr,"note\n"); - if(i<=20) { - n=note[20-i]; - if(20-i) - o+=((20-i)/7); } - else if(i<=41) { /* flats */ - n=flat[41-i]; - if(41-i) - o+=((41-i)/7); } - else { - n=toupper(note[62-i]); - if(62-i) - o+=((62-i)/7); } - if(toupper(n)=='A' || toupper(n)=='B' || n=='G') - o--; - printf("%c%u %u\n",n,o,t); } -} - diff --git a/src/tone/make.bat b/src/tone/make.bat deleted file mode 100755 index 7d0c2958d7..0000000000 --- a/src/tone/make.bat +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -bcc -P-c -w-prot tone ..\mswait\dos\mswaits.obj diff --git a/src/tone/tone.c b/src/tone/tone.c deleted file mode 100644 index 915665094c..0000000000 --- a/src/tone/tone.c +++ /dev/null @@ -1,349 +0,0 @@ -/* TONE.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Linux modifications by Casey Martin 2000. - - Note: Permissions on /dev/console must be at least 006 for this - to work properly -*/ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* Test sound freqs and durations from command line */ - -#ifdef __OS2__ - #define INCL_DOS - #include <os2.h> -#endif - -#ifndef __unix__ - #include <io.h> - #include <dos.h> -#else - #include <unistd.h> - #include <math.h> - #include <time.h> - #include <sys/ioctl.h> - #include <sys/kd.h> - #include <sys/time.h> - #include <sys/types.h> - #include <termios.h> - #include <signal.h> -#endif - -#include <math.h> -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <fcntl.h> - -#ifdef __OS2__ - #define mswait(x) DosSleep(x) - #define delay(x) DosSleep(x) - #define sound(x) DosBeep(x,0) - #define nosound() DosBeep(0,0) -#endif - -#define NOT_ABORTABLE (1<<0) -#define SHOW_DOT (1<<1) -#define SHOW_FREQ (1<<2) -#define NO_VISUAL (1<<3) -#define USE_MSWAIT (1<<4) - -#ifdef __unix__ - #define nosound() ioctl(fd, KIOCSOUND, 0) - #define sound(f) ioctl(fd, KIOCSOUND, (int) (1193180 / f)) - #define mswait(x) delay(x) - #define kbhit() select(1, &inp, NULL, NULL, &timeout) - #define delay(ms) usleep(ms * 1000) - #define OPENARGS O_RDONLY -#else - #define OPENARGS (O_RDONLY | O_BINARY | O_DENYNONE) -#endif - - -#if defined __OS2__ || defined __unix__ - int mswtyp; -#else - extern mswtyp; -#endif - -int aborted=0; /* Ctrl-C hit? */ -int mode=0; /* Optional modes */ -int t=1; /* Timing */ -int s=0; /* Stacato */ -int octave=4; /* Default octave */ - - -#ifdef __unix__ - int fd = 0; // file descriptor for the console - struct termios stored; // for storing old term settings - struct timeval timeout = {0, 0}; // passed in select() call - fd_set inp; // passes in select() call -#endif - -double pitch=523.50/32.0; /* low 'C' */ - - - -void play(char *freq, char *dur) -{ - char *notes="c d ef g a b"; - char *sharp="BC D EF G A "; - int i,n,d,o=octave; - double f; - - d=atoi(dur); - if(isdigit(freq[0])) - f=atoi(freq); - - else - switch(toupper(freq[0])) { - case 'O': /* default octave */ - if(isdigit(dur[0])) - octave=d; - else - octave+=d; - return; - case 'P': /* pitch variation */ - if(isdigit(dur[0])) - pitch=atof(dur)/32.0; - else - pitch+=atof(dur); - return; - case 'Q': /* quit */ - nosound(); - exit(0); - case 'R': /* rest */ - f=0; - break; - case 'S': /* stacato */ - if(isdigit(dur[0])) - s=d; - else - s+=d; - return; - case 'T': /* time adjust */ - t=d; - return; - case 'V': - if(mode&NO_VISUAL) - return; - n=strlen(dur); - while(n && dur[n]<=' ') - n--; - dur[n+1]=0; - if(dur[n]=='\\') { - dur[n]=0; - printf("%s",dur); } - else - printf("%s\r\n",dur); - return; - case 'X': /* exit */ - exit(1); - default: - for(n=0;notes[n];n++) - if(freq[0]==notes[n] || freq[0]==sharp[n]) - break; - if(isdigit(freq[1])) - o=(freq[1]&0xf); - else - o=octave; - f=pitch*pow(2,o+(double)n/12); - break; } - if(!f) - nosound(); - else - sound(f); - if(f && mode&SHOW_FREQ) { - for(i=0;freq[i]>' ';i++) - ; - freq[i]=0; - printf("%-4.4s",freq); } - if(mode&SHOW_DOT) - printf("."); - if(t>10) { - if(mode&USE_MSWAIT) - mswait((d*t)-(d*s)); - else - delay((d*t)-(d*s)); } - else { - if(mode&USE_MSWAIT) - mswait(d*t); - else - delay(d*t); } - if(s) { - nosound(); - if(t>10) { - if(mode&USE_MSWAIT) - mswait(d*s); - else - delay(d*s); } - else { - if(mode&USE_MSWAIT) - mswait(s); - else - delay(s); } } -} - -void usage(void) -{ - printf("usage: tone [/opts] [(note[oct]|freq) dur | (cmd val) [...]] " - "[+filename]\n\n"); - printf("where: note = a,b,c,d,e,f, or g (naturals) or A,B,C,D,E,F, or " - "G (sharps)\n"); - printf(" oct = octave 1 through 9 (default=%d)\n",octave); - printf(" freq = frequency (in Hz) or 0 for silence\n"); - printf(" dur = duration (in timer counts)\n"); - printf(" cmd = o set default octave (+/- to adjust) " - "(default=%d)\n",octave); - printf(" p set middle c pitch (+/- to adjust) " - "(default=%.2f)\n",pitch*32.0); - printf(" q quit program immediately\n"); - printf(" r rest (silence) for val timer counts\n"); - printf(" s set stacato duration (in ms) (+/- to adjust) " - "(default=%d)\n",s); - printf(" t set timer count value (in ms) " - "(default=%d)\n",t); - printf(" v visual text diplay of val (no val=cr/lf)\n"); - printf(" x quit program immediately (leave tone on)\n"); - printf(" opts = d display dot for each note\n"); - printf(" f display frequency or note value\n"); - printf(" n not abortable with key-stroke\n"); - printf(" v disable visual text commands\n"); - printf(" t use time-slice aware delays\n"); - exit(0); -} - -#ifdef __unix__ - -void cbreakh(int sig) -{ - nosound(); - exit(0); -} - -#else /* !unix */ - -int cbreakh() /* ctrl-break handler */ -{ - aborted=1; - return(1); /* 1 to continue, 0 to abort */ -} - -#endif - -int main(int argc, char **argv) -{ - char *p,str[128]; - int i,j,file; - FILE *stream; - -#ifdef __unix__ - - // sets up the terminal for one key entry (to cancel playback) - struct termios newterm; - tcgetattr(0,&stored); - - memcpy(&newterm,&stored,sizeof(struct termios)); - newterm.c_lflag &= (~ICANON); - newterm.c_cc[VTIME] = 0; - newterm.c_cc[VMIN] = 1; - tcsetattr(0,TCSANOW,&newterm); - - // set up select() args - FD_ZERO(&inp); - FD_SET(0, &inp); - - // install Ctrl-C handler... - signal(SIGINT, cbreakh); - -#endif - -#ifndef __OS2__ - #ifndef __unix__ - ctrlbrk(cbreakh); - #else - fd = open("/dev/console", O_NOCTTY); - if (fd < 0) { - perror("open(\"/dev/console\""); - exit(-1); - } - #endif -#endif - - printf("\nTone Generation Utility v1.01 Developed 1993 Rob Swindell\n\n"); - - if(argc<2) - usage(); - - mswtyp=0; - delay(0); - for(i=1;i<argc;i++) { - if(argv[i][0]=='/') { - for(j=1;argv[i][j];j++) - switch(toupper(argv[i][j])) { - case 'D': - mode^=SHOW_DOT; - break; - case 'F': - mode^=SHOW_FREQ; - break; - case 'N': - mode^=NOT_ABORTABLE; - break; - case 'V': - mode^=NO_VISUAL; - break; - case 'T': - mode^=USE_MSWAIT; - mswtyp=atoi(argv[i]+j+1); - while(isdigit(argv[i][j+1])) - j++; - break; - default: - usage(); } - continue; } - if(argv[i][0]=='+') { - if((file=open(argv[i]+1, OPENARGS))==-1 || (stream=fdopen(file,"rb"))==NULL) { - strcpy(str,argv[0]); - p=strrchr(str,'\\'); - if(p) - *(p+1)=0; - strcat(str,argv[i]+1); - if((file=open(str, OPENARGS))==-1 - || (stream=fdopen(file,"rb"))==NULL) { - printf("\7Error opening %s\n",argv[i]+1); - exit(1); } } - while(mode&NOT_ABORTABLE || !kbhit()) { - if(!fgets(str,81,stream)) - break; - if(!isalnum(str[0])) - continue; - p=str; - while(*p>' ') - p++; - while(*p && *p<=' ') - p++; - play(str,p); } - fclose(stream); - continue; } - play(argv[i],argv[i+1]); - i++; - if(aborted) - break; } - nosound(); - -#ifdef __unix__ - close(fd); // close /dev/console - tcsetattr(0,TCSANOW,&stored); // reset terminal to previous state -#endif - -return(0); -} diff --git a/src/uifc/uifc.c b/src/uifc/uifc.c deleted file mode 100644 index 6992b56304..0000000000 --- a/src/uifc/uifc.c +++ /dev/null @@ -1,1829 +0,0 @@ -/* uifc.c */ - -/* Original implementation of UIFC (user interface) library based on conio */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2002 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "uifc.h" -#include <share.h> -#include <conio.h> - -#if defined(__OS2__) - -#define INCL_BASE -#include <os2.h> - -void mswait(int msec) -{ -DosSleep(msec ? msec : 1); -} - -#elif defined(_WIN32) - #include <windows.h> - #define mswait(x) Sleep(x) -#elif defined(__FLAT__) - #define mswait(x) delay(x) -#endif - - /* Bottom line elements */ -#define BL_INS (1<<0) /* INS key */ -#define BL_DEL (1<<1) /* DEL key */ -#define BL_GET (1<<2) /* Get key */ -#define BL_PUT (1<<3) /* Put key */ - -static char hclr,lclr,bclr,cclr,show_free_mem=0; -static int cursor; -static char* helpfile=0; -static uint helpline=0; -static char blk_scrn[MAX_BFLN]; -static win_t sav[MAX_BUFS]; -static uint max_opts=MAX_OPTS; -static uifcapi_t* api; - -/* Prototypes */ -static int uprintf(char x, char y, char attr, char *fmt,...); -static void bottomline(int line); -static char *utimestr(time_t *intime); -static void help(); - -/* API routines */ -static void uifcbail(void); -static int uscrn(char *str); -static int ulist(int mode, char left, int top, char width, int *dflt, int *bar - ,char *title, char **option); -static int uinput(int imode, char left, char top, char *prompt, char *str - ,char len ,int kmode); -static void umsg(char *str); -static void upop(char *str); -static void sethelp(int line, char* file); - -#ifdef __FLAT__ -int inkey(int mode) -{ - int c; - -if(mode) - return(kbhit()); -c=getch(); -if(!c) - c=(getch()<<8); -return(c); -} -#else -int inkey(int mode) -{ -if(mode) - return(bioskey(1)); -while(!bioskey(1)); -return(bioskey(0)); -} -#endif - -static uint mousecursor=0x28; - -/****************************************************************************/ -/* Initialization function, see uifc.h for details. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uifcini(uifcapi_t* uifcapi) -{ - int i; - struct text_info txtinfo; -#ifndef __FLAT__ - union REGS r; -#endif - - if(uifcapi==NULL || uifcapi->size!=sizeof(uifcapi_t)) - return(-1); - - api=uifcapi; - - /* install function handlers */ - api->bail=uifcbail; - api->scrn=uscrn; - api->msg=umsg; - api->pop=upop; - api->list=ulist; - api->input=uinput; - api->sethelp=sethelp; - - if(api->scrn_len!=0) { - switch(api->scrn_len) { - case 14: - textmode(C80X14); - break; - case 21: - textmode(C80X21); - break; - case 25: - textmode(C80); - break; - case 28: - textmode(C80X28); - break; - case 43: - textmode(C80X43); - break; - case 50: - textmode(C80X50); - break; - case 60: - textmode(C80X60); - break; - default: - textmode(C4350); - break; - } - } - - clrscr(); - gettextinfo(&txtinfo); - /* unsupported mode? */ - if(txtinfo.screenheight<MIN_LINES - || txtinfo.screenheight>MAX_LINES - || txtinfo.screenwidth<80) { - textmode(C80); /* set mode to 80x25*/ - gettextinfo(&txtinfo); - } - - api->scrn_len=txtinfo.screenheight; - if(api->scrn_len<MIN_LINES || api->scrn_len>MAX_LINES) { - cprintf("\7UIFC: Screen length (%u) must be between %d and %d lines\r\n" - ,api->scrn_len,MIN_LINES,MAX_LINES); - return(-2); - } - api->scrn_len--; /* account for status line */ - - if(txtinfo.screenwidth<80) { - cprintf("\7UIFC: Screen width (%u) must be at least 80 characters\r\n" - ,txtinfo.screenwidth); - return(-3); - } - -#ifndef __FLAT__ - - r.w.ax=0x0000; /* reset mouse and get driver status */ - INT_86(0x33,&r,&r); - - if(r.w.ax==0xffff) { /* mouse driver installed */ - uifc_status|=UIFC_MOUSE; - - - r.w.ax=0x0020; /* enable mouse driver */ - INT_86(0x33,&r,&r); - - r.w.ax=0x000a; /* set text pointer type */ - r.w.bx=0x0000; /* software cursor */ - r.w.cx=0x77ff; - r.w.dx=mousecursor<<8; - INT_86(0x33,&r,&r); - - r.w.ax=0x0013; /* set double speed threshold */ - r.w.dx=32; /* double speed threshold */ - INT_86(0x33,&r,&r); - - r.w.ax=0x0001; /* show mouse pointer */ - INT_86(0x33,&r,&r); } - - #endif - - - if(!(api->mode&UIFC_COLOR) - && (api->mode&UIFC_MONO - || txtinfo.currmode==MONO || txtinfo.currmode==BW80)) { - bclr=BLACK; - hclr=WHITE; - lclr=LIGHTGRAY; - cclr=LIGHTGRAY; - } else { - bclr=BLUE; - hclr=YELLOW; - lclr=WHITE; - cclr=CYAN; - } - for(i=0;i<MAX_BFLN;i+=2) { - blk_scrn[i]='�'; - blk_scrn[i+1]=cclr|(bclr<<4); - } - - cursor=_NOCURSOR; - _setcursortype(cursor); - - return(0); -} - -static void hidemouse(void) -{ -#ifndef __FLAT__ - union REGS r; - -if(uifc_status&UIFC_MOUSE) { - r.w.ax=0x0002; /* hide mouse pointer */ - INT_86(0x33,&r,&r); } -#endif -} - -static void showmouse(void) -{ -#ifndef __FLAT__ - union REGS r; - -if(uifc_status&UIFC_MOUSE) { - r.w.ax=0x0001; /* show mouse pointer */ - INT_86(0x33,&r,&r); } -#endif -} - - -void uifcbail(void) -{ - -hidemouse(); -_setcursortype(_NORMALCURSOR); -textattr(LIGHTGRAY); -clrscr(); -} - -/****************************************************************************/ -/* Clear screen, fill with background attribute, display application title. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uscrn(char *str) -{ - textattr(bclr|(cclr<<4)); - gotoxy(1,1); - clreol(); - gotoxy(3,1); - cputs(str); - if(!puttext(1,2,80,api->scrn_len,blk_scrn)) - return(-1); - gotoxy(1,api->scrn_len+1); - clreol(); - return(0); -} - -/****************************************************************************/ -/****************************************************************************/ -static void scroll_text(int x1, int y1, int x2, int y2, int down) -{ - uchar buf[MAX_BFLN]; - -gettext(x1,y1,x2,y2,buf); -if(down) - puttext(x1,y1+1,x2,y2,buf); -else - puttext(x1,y1,x2,y2-1,buf+(((x2-x1)+1)*2)); -} - -/****************************************************************************/ -/* Updates time in upper left corner of screen with current time in ASCII/ */ -/* Unix format */ -/****************************************************************************/ -static void timedisplay() -{ - static time_t savetime; - time_t now; - -now=time(NULL); -if(difftime(now,savetime)>=60) { - uprintf(55,1,bclr|(cclr<<4),utimestr(&now)); - savetime=now; } -} - -/****************************************************************************/ -/* General menu function, see uifc.h for details. */ -/****************************************************************************/ -int ulist(int mode, char left, int top, char width, int *cur, int *bar - , char *title, char **option) -{ - uchar line[256],shade[256],win[MAX_BFLN],*ptr,a,b,c,longopt - ,search[MAX_OPLN],bline=0; - int height,y; - int i,j,opts=0,s=0; /* s=search index into options */ - -#ifndef __FLAT__ - union REGS reg,r; - -hidemouse(); - -r.w.ax=0x0006; /* Get button release info */ -r.w.bx=0x0000; /* Left button */ -INT_86(0x33,&r,&r); /* Clears any buffered mouse clicks */ - -r.w.ax=0x0006; /* Get button release info */ -r.w.bx=0x0001; /* Right button */ -INT_86(0x33,&r,&r); /* Clears any buffered mouse clicks */ - -#endif - -if(mode&WIN_SAV && api->savnum>=MAX_BUFS-1) - putch(7); -i=0; -if(mode&WIN_INS) bline|=BL_INS; -if(mode&WIN_DEL) bline|=BL_DEL; -if(mode&WIN_GET) bline|=BL_GET; -if(mode&WIN_PUT) bline|=BL_PUT; -bottomline(bline); -while(opts<max_opts && opts<MAX_OPTS) - if(option[opts][0]==0) - break; - else opts++; -if(mode&WIN_XTR && opts<max_opts && opts<MAX_OPTS) - option[opts++][0]=0; -height=opts+4; -if(top+height>api->scrn_len-3) - height=(api->scrn_len-3)-top; -if(!width || width<strlen(title)+6) { - width=strlen(title)+6; - for(i=0;i<opts;i++) { - truncsp(option[i]); - if((j=strlen(option[i])+5)>width) - width=j; } } -if(width>(SCRN_RIGHT+1)-SCRN_LEFT) - width=(SCRN_RIGHT+1)-SCRN_LEFT; -if(mode&WIN_L2R) - left=36-(width/2); -else if(mode&WIN_RHT) - left=SCRN_RIGHT-(width+4+left); -if(mode&WIN_T2B) - top=(api->scrn_len/2)-(height/2)-2; -else if(mode&WIN_BOT) - top=api->scrn_len-height-3-top; -if(mode&WIN_SAV && api->savdepth==api->savnum) { - if((sav[api->savnum].buf=(char *)MALLOC((width+3)*(height+2)*2))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,(width+3)*(height+2)*2); - return(-1); } - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,sav[api->savnum].buf); - sav[api->savnum].left=SCRN_LEFT+left; - sav[api->savnum].top=SCRN_TOP+top; - sav[api->savnum].right=SCRN_LEFT+left+width+1; - sav[api->savnum].bot=SCRN_TOP+top+height; - api->savdepth++; } -else if(mode&WIN_SAV - && (sav[api->savnum].left!=SCRN_LEFT+left - || sav[api->savnum].top!=SCRN_TOP+top - || sav[api->savnum].right!=SCRN_LEFT+left+width+1 - || sav[api->savnum].bot!=SCRN_TOP+top+height)) { /* dimensions have changed */ - puttext(sav[api->savnum].left,sav[api->savnum].top,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); /* put original window back */ - FREE(sav[api->savnum].buf); - if((sav[api->savnum].buf=(char *)MALLOC((width+3)*(height+2)*2))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes." - ,__LINE__,(width+3)*(height+2)*2); - return(-1); } - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,sav[api->savnum].buf); /* save again */ - sav[api->savnum].left=SCRN_LEFT+left; - sav[api->savnum].top=SCRN_TOP+top; - sav[api->savnum].right=SCRN_LEFT+left+width+1; - sav[api->savnum].bot=SCRN_TOP+top+height; } - - -#ifndef __FLAT__ -if(show_free_mem) { - #if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) - uprintf(58,1,bclr|(cclr<<4),"%10ld bytes free",farcoreleft()); - #else - uprintf(58,1,bclr|(cclr<<4),"%10u bytes free",coreleft()); - #endif - } -#endif - - -if(mode&WIN_ORG) { /* Clear around menu */ - if(top) - puttext(SCRN_LEFT,SCRN_TOP,SCRN_RIGHT+2,SCRN_TOP+top-1,blk_scrn); - if(SCRN_TOP+height+top<=api->scrn_len) - puttext(SCRN_LEFT,SCRN_TOP+height+top,SCRN_RIGHT+2,api->scrn_len,blk_scrn); - if(left) - puttext(SCRN_LEFT,SCRN_TOP+top,SCRN_LEFT+left-1,SCRN_TOP+height+top - ,blk_scrn); - if(SCRN_LEFT+left+width<=SCRN_RIGHT) - puttext(SCRN_LEFT+left+width,SCRN_TOP+top,SCRN_RIGHT+2 - ,SCRN_TOP+height+top,blk_scrn); } -ptr=win; -*(ptr++)='�'; -*(ptr++)=hclr|(bclr<<4); - -if(api->mode&UIFC_MOUSE) { - *(ptr++)='['; - *(ptr++)=hclr|(bclr<<4); - *(ptr++)='�'; - *(ptr++)=lclr|(bclr<<4); - *(ptr++)=']'; - *(ptr++)=hclr|(bclr<<4); - *(ptr++)='['; - *(ptr++)=hclr|(bclr<<4); - *(ptr++)='?'; - *(ptr++)=lclr|(bclr<<4); - *(ptr++)=']'; - *(ptr++)=hclr|(bclr<<4); - i=6; } -else - i=0; -for(;i<width-2;i++) { - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); } -*(ptr++)='�'; -*(ptr++)=hclr|(bclr<<4); -*(ptr++)='�'; -*(ptr++)=hclr|(bclr<<4); -a=strlen(title); -b=(width-a-1)/2; -for(i=0;i<b;i++) { - *(ptr++)=' '; - *(ptr++)=hclr|(bclr<<4); } -for(i=0;i<a;i++) { - *(ptr++)=title[i]; - *(ptr++)=hclr|(bclr<<4); } -for(i=0;i<width-(a+b)-2;i++) { - *(ptr++)=' '; - *(ptr++)=hclr|(bclr<<4); } -*(ptr++)='�'; -*(ptr++)=hclr|(bclr<<4); -*(ptr++)='�'; -*(ptr++)=hclr|(bclr<<4); -for(i=0;i<width-2;i++) { - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); } -*(ptr++)='�'; -*(ptr++)=hclr|(bclr<<4); - -if((*cur)>=opts) - (*cur)=opts-1; /* returned after scrolled */ - -if(!bar) { - if((*cur)>height-5) - (*cur)=height-5; - i=0; } -else { - if((*bar)>=opts) - (*bar)=opts-1; - if((*bar)>height-5) - (*bar)=height-5; - if((*cur)==opts-1) - (*bar)=height-5; - if((*bar)<0) - (*bar)=0; - if((*cur)<(*bar)) - (*cur)=(*bar); - i=(*cur)-(*bar); -// - if(i+(height-5)>=opts) { - i=opts-(height-4); - (*cur)=i+(*bar); - } - } -if((*cur)<0) - (*cur)=0; - -j=0; -if(i<0) i=0; -longopt=0; -while(j<height-4 && i<opts) { - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - *(ptr++)=' '; - *(ptr++)=hclr|(bclr<<4); - *(ptr++)='�'; - *(ptr++)=lclr|(bclr<<4); - if(i==(*cur)) - a=bclr|(LIGHTGRAY<<4); - else - a=lclr|(bclr<<4); - b=strlen(option[i]); - if(b>longopt) - longopt=b; - if(b+4>width) - b=width-4; - for(c=0;c<b;c++) { - *(ptr++)=option[i][c]; - *(ptr++)=a; } - while(c<width-4) { - *(ptr++)=' '; - *(ptr++)=a; - c++; } - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); - i++; - j++; } -*(ptr++)='�'; -*(ptr++)=hclr|(bclr<<4); -for(i=0;i<width-2;i++) { - *(ptr++)='�'; - *(ptr++)=hclr|(bclr<<4); } -*(ptr++)='�'; -*(ptr++)=hclr|(bclr<<4); -puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width-1 - ,SCRN_TOP+top+height-1,win); -if(bar) - y=top+3+(*bar); -else - y=top+3+(*cur); -if(opts+4>height && ((!bar && (*cur)!=opts-1) - || (bar && ((*cur)-(*bar))+(height-4)<opts))) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - textattr(lclr|(bclr<<4)); - putch(31); /* put down arrow */ - textattr(hclr|(bclr<<4)); } - -if(bar && (*bar)!=(*cur)) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(30); /* put the up arrow */ - textattr(hclr|(bclr<<4)); } - -if(bclr==BLUE) { - gettext(SCRN_LEFT+left+width,SCRN_TOP+top+1,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height-1,shade); - for(i=1;i<height*4;i+=2) - shade[i]=DARKGRAY; - puttext(SCRN_LEFT+left+width,SCRN_TOP+top+1,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height-1,shade); - gettext(SCRN_LEFT+left+2,SCRN_TOP+top+height,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,shade); - for(i=1;i<width*2;i+=2) - shade[i]=DARKGRAY; - puttext(SCRN_LEFT+left+2,SCRN_TOP+top+height,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,shade); } -showmouse(); -while(1) { -#if 0 /* debug */ - gotoxy(30,1); - cprintf("y=%2d h=%2d c=%2d b=%2d s=%2d o=%2d" - ,y,height,*cur,bar ? *bar :0xff,api->savdepth,opts); -#endif - if(!show_free_mem) - timedisplay(); -#ifndef __FLAT__ - if(api->mode&UIFC_MOUSE) { - - r.w.ax=0x0003; /* Get button status and mouse position */ - INT_86(0x33,&r,&r); - - if(r.w.bx&1) { /* Left button down */ - - if(r.w.cx/8>=SCRN_LEFT+left - && r.w.cx/8<=SCRN_LEFT+left+width - && r.w.dx/8>=SCRN_TOP+top+2 - && r.w.dx/8<=(SCRN_TOP+top+height)-3) { - - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - - (*cur)=(r.w.dx/8)-(SCRN_TOP+top+2); - if(bar) - (*bar)=(*cur); - y=top+3+((r.w.dx/8)-(SCRN_TOP+top+2)); - - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=bclr|(LIGHTGRAY<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); } } - - r.w.ax=0x0006; /* Get button release information */ - r.w.bx=0x0000; /* left button */ - INT_86(0x33,&r,&r); - - if(r.w.bx) { /* Left button release same as CR */ - - if(r.w.cx/8>=SCRN_LEFT+left - && r.w.cx/8<=SCRN_LEFT+left+width - && r.w.dx/8>=SCRN_TOP+top+2 - && r.w.dx/8<=(SCRN_TOP+top+height)-3) { - - (*cur)=(r.w.dx/8)-(SCRN_TOP+top+2); - if(bar) - (*bar)=(*cur); - y=top+3+((r.w.dx/8)-(SCRN_TOP+top+2)); - - if(!opts || (mode&WIN_XTR && (*cur)==opts-1)) - continue; - - if(mode&WIN_ACT) { - hidemouse(); - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - for(i=1;i<(width*height*2);i+=2) - win[i]=lclr|(cclr<<4); - j=(((y-top)*width)*2)+7+((width-4)*2); - for(i=(((y-top)*width)*2)+7;i<j;i+=2) - win[i]=hclr|(cclr<<4); - - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - showmouse(); } - else if(mode&WIN_SAV) { - hidemouse(); - puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - showmouse(); - FREE(sav[api->savnum].buf); - api->savdepth--; } - return(*cur); } - else if(r.w.cx/8>=SCRN_LEFT+left+3 - && r.w.cx/8<=SCRN_LEFT+left+5 - && r.w.dx/8==(SCRN_TOP+top)-1) /* Clicked help icon */ - help(); - else - goto hitesc; } - - r.w.ax=0x0006; /* Get button release information */ - r.w.bx=0x0001; /* right button */ - INT_86(0x33,&r,&r); - - if(r.w.bx) { /* Right button down, same as ESC */ -hitesc: - if(mode&WIN_ESC || (mode&WIN_CHE && api->changes) - && !(mode&WIN_SAV)) { - hidemouse(); - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - for(i=1;i<(width*height*2);i+=2) - win[i]=lclr|(cclr<<4); - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - showmouse(); } - else if(mode&WIN_SAV) { - hidemouse(); - puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - showmouse(); - FREE(sav[api->savnum].buf); - api->savdepth--; } - return(-1); } - } -#endif - - if(inkey(1)) { - i=inkey(0); - if(!(i&0xff)) { - s=0; - switch(i>>8) { - case 71: /* home */ - if(!opts) - break; - if(opts+4>height) { - hidemouse(); - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(' '); /* Delete the up arrow */ - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(31); /* put the down arrow */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3 - ,bclr|(LIGHTGRAY<<4) - ,"%-*.*s",width-4,width-4,option[0]); - for(i=1;i<height-4;i++) /* re-display options */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - (*cur)=0; - if(bar) - (*bar)=0; - y=top+3; - showmouse(); - break; } - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - (*cur)=0; - if(bar) - (*bar)=0; - y=top+3; - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=bclr|(LIGHTGRAY<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - break; - case 72: /* up arrow */ - if(!opts) - break; - if(!(*cur) && opts+4>height) { - hidemouse(); - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); /* like end */ - textattr(lclr|(bclr<<4)); - putch(30); /* put the up arrow */ - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(' '); /* delete the down arrow */ - for(i=(opts+4)-height,j=0;i<opts;i++,j++) - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+j - ,i==opts-1 ? bclr|(LIGHTGRAY<<4) - : lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - (*cur)=opts-1; - if(bar) - (*bar)=height-5; - y=top+height-2; - showmouse(); - break; } - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - if(!(*cur)) { - y=top+height-2; - (*cur)=opts-1; - if(bar) - (*bar)=height-5; } - else { - (*cur)--; - y--; - if(bar && *bar) - (*bar)--; } - if(y<top+3) { /* scroll */ - hidemouse(); - if(!(*cur)) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(' '); } /* delete the up arrow */ - if((*cur)+height-4==opts-1) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - textattr(lclr|(bclr<<4)); - putch(31); } /* put the dn arrow */ - y++; - scroll_text(SCRN_LEFT+left+2,SCRN_TOP+top+3 - ,SCRN_LEFT+left+width-3,SCRN_TOP+top+height-2,1); - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3 - ,bclr|(LIGHTGRAY<<4) - ,"%-*.*s",width-4,width-4,option[*cur]); - showmouse(); } - else { - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=bclr|(LIGHTGRAY<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); } - break; -#if 0 - case 0x49; /* PgUp */ - case 0x51; /* PgDn */ - if(!opts || (*cur)==(opts-1)) - break; - (*cur)+=(height-4); - if((*cur)>(opts-1)) - (*cur)=(opts-1); - - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - - for(i=(opts+4)-height,j=0;i<opts;i++,j++) - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+j - ,i==(*cur) bclr|(LIGHTGRAY<<4) : lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - y=top+height-2; - if(bar) - (*bar)=height-5; - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<148;i+=2) - line[i]=bclr|(LIGHTGRAY<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - break; -#endif - case 79: /* end */ - if(!opts) - break; - if(opts+4>height) { /* Scroll mode */ - hidemouse(); - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(30); /* put the up arrow */ - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(' '); /* delete the down arrow */ - for(i=(opts+4)-height,j=0;i<opts;i++,j++) - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+j - ,i==opts-1 ? bclr|(LIGHTGRAY<<4) - : lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - (*cur)=opts-1; - y=top+height-2; - if(bar) - (*bar)=height-5; - showmouse(); - break; } - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - (*cur)=opts-1; - y=top+height-2; - if(bar) - (*bar)=height-5; - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<148;i+=2) - line[i]=bclr|(LIGHTGRAY<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - break; - case 80: /* dn arrow */ - if(!opts) - break; - if((*cur)==opts-1 && opts+4>height) { /* like home */ - hidemouse(); - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(' '); /* Delete the up arrow */ - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(31); /* put the down arrow */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3 - ,bclr|(LIGHTGRAY<<4) - ,"%-*.*s",width-4,width-4,option[0]); - for(i=1;i<height-4;i++) /* re-display options */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - (*cur)=0; - y=top+3; - if(bar) - (*bar)=0; - showmouse(); - break; } - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - if((*cur)==opts-1) { - (*cur)=0; - y=top+3; - if(bar) { - /* gotoxy(1,1); cprintf("bar=%08lX ",bar); */ - (*bar)=0; } } - else { - (*cur)++; - y++; - if(bar && (*bar)<height-5) { - /* gotoxy(1,1); cprintf("bar=%08lX ",bar); */ - (*bar)++; } } - if(y==top+height-1) { /* scroll */ - hidemouse(); - if(*cur==opts-1) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - textattr(lclr|(bclr<<4)); - putch(' '); } /* delete the down arrow */ - if((*cur)+4==height) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(30); } /* put the up arrow */ - y--; - /* gotoxy(1,1); cprintf("\rdebug: %4d ",__LINE__); */ - scroll_text(SCRN_LEFT+left+2,SCRN_TOP+top+3 - ,SCRN_LEFT+left+width-3,SCRN_TOP+top+height-2,0); - /* gotoxy(1,1); cprintf("\rdebug: %4d ",__LINE__); */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+height-2 - ,bclr|(LIGHTGRAY<<4) - ,"%-*.*s",width-4,width-4,option[*cur]); - showmouse(); } - else { - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y - ,line); - for(i=1;i<width*2;i+=2) - line[i]=bclr|(LIGHTGRAY<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y - ,line); - showmouse(); } - break; - case 0x3b: /* F1 */ - help(); - break; - case 0x3f: /* F5 */ - if(mode&WIN_GET && !(mode&WIN_XTR && (*cur)==opts-1)) - return((*cur)|MSK_GET); - break; - case 0x40: /* F6 */ - if(mode&WIN_PUT && !(mode&WIN_XTR && (*cur)==opts-1)) - return((*cur)|MSK_PUT); - break; - case 82: /* insert */ - if(mode&WIN_INS) { - if(mode&WIN_INSACT) { - hidemouse(); - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - for(i=1;i<(width*height*2);i+=2) - win[i]=lclr|(cclr<<4); - if(opts) { - j=(((y-top)*width)*2)+7+((width-4)*2); - for(i=(((y-top)*width)*2)+7;i<j;i+=2) - win[i]=hclr|(cclr<<4); } - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - showmouse(); } - if(!opts) - return(MSK_INS); - return((*cur)|MSK_INS); } - break; - case 83: /* delete */ - if(mode&WIN_XTR && (*cur)==opts-1) /* can't delete */ - break; /* extra line */ - if(mode&WIN_DEL) { - if(mode&WIN_DELACT) { - hidemouse(); - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - for(i=1;i<(width*height*2);i+=2) - win[i]=lclr|(cclr<<4); - j=(((y-top)*width)*2)+7+((width-4)*2); - for(i=(((y-top)*width)*2)+7;i<j;i+=2) - win[i]=hclr|(cclr<<4); - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - showmouse(); } - return((*cur)|MSK_DEL); } - break; } } - else { - i&=0xff; - if(isalnum(i) && opts && option[0][0]) { - search[s]=i; - search[s+1]=0; - for(j=(*cur)+1,a=b=0;a<2;j++) { /* a = search count */ - if(j==opts) { /* j = option count */ - j=-1; /* b = letter count */ - continue; } - if(j==(*cur)) { - b++; - continue; } - if(b>=longopt) { - b=0; - a++; } - if(a==1 && !s) - break; - if(strlen(option[j])>b - && ((!a && s && !strncmpi(option[j]+b,search,s+1)) - || ((a || !s) && toupper(option[j][b])==toupper(i)))) { - if(a) s=0; - else s++; - if(y+(j-(*cur))+2>height+top) { - (*cur)=j; - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - putch(30); /* put the up arrow */ - if((*cur)==opts-1) { - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(' '); } /* delete the down arrow */ - for(i=((*cur)+5)-height,j=0;i<(*cur)+1;i++,j++) - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+j - ,i==(*cur) ? bclr|(LIGHTGRAY<<4) - : lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4,option[i]); - y=top+height-2; - if(bar) - (*bar)=height-5; - break; } - if(y-((*cur)-j)<top+3) { - (*cur)=j; - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+3); - textattr(lclr|(bclr<<4)); - if(!(*cur)) - putch(' '); /* Delete the up arrow */ - gotoxy(SCRN_LEFT+left+1,SCRN_TOP+top+height-2); - putch(31); /* put the down arrow */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3 - ,bclr|(LIGHTGRAY<<4) - ,"%-*.*s",width-4,width-4,option[(*cur)]); - for(i=1;i<height-4;i++) /* re-display options */ - uprintf(SCRN_LEFT+left+3,SCRN_TOP+top+3+i - ,lclr|(bclr<<4) - ,"%-*.*s",width-4,width-4 - ,option[(*cur)+i]); - y=top+3; - if(bar) - (*bar)=0; - break; } - hidemouse(); - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=lclr|(bclr<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - if((*cur)>j) - y-=(*cur)-j; - else - y+=j-(*cur); - if(bar) { - if((*cur)>j) - (*bar)-=(*cur)-j; - else - (*bar)+=j-(*cur); } - (*cur)=j; - gettext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - for(i=1;i<width*2;i+=2) - line[i]=bclr|(LIGHTGRAY<<4); - puttext(SCRN_LEFT+3+left,SCRN_TOP+y - ,SCRN_LEFT+left+width-2,SCRN_TOP+y,line); - showmouse(); - break; } } - if(a==2) - s=0; } - else - switch(i) { - case CR: - if(!opts || (mode&WIN_XTR && (*cur)==opts-1)) - break; - if(mode&WIN_ACT) { - hidemouse(); - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - for(i=1;i<(width*height*2);i+=2) - win[i]=lclr|(cclr<<4); - j=(((y-top)*width)*2)+7+((width-4)*2); - for(i=(((y-top)*width)*2)+7;i<j;i+=2) - win[i]=hclr|(cclr<<4); - - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - showmouse(); } - else if(mode&WIN_SAV) { - hidemouse(); - puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - showmouse(); - FREE(sav[api->savnum].buf); - api->savdepth--; } - return(*cur); - case ESC: - if(mode&WIN_ESC || (mode&WIN_CHE && api->changes) - && !(mode&WIN_SAV)) { - hidemouse(); - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - for(i=1;i<(width*height*2);i+=2) - win[i]=lclr|(cclr<<4); - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT - +left+width-1,SCRN_TOP+top+height-1,win); - showmouse(); } - else if(mode&WIN_SAV) { - hidemouse(); - puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - showmouse(); - FREE(sav[api->savnum].buf); - api->savdepth--; } - return(-1); } } } - else - mswait(1); - } -} - - -/*************************************************************************/ -/* This function is a windowed input string input routine. */ -/*************************************************************************/ -int uinput(int mode, char left, char top, char *prompt, char *str, - char max, int kmode) -{ - unsigned char c,tmp[81],save_buf[2048],in_win[2048] - ,shade[160],width,height=3; - int i,j,plen,slen; - -hidemouse(); -plen=strlen(prompt); -if(!plen) - slen=4; -else - slen=6; -width=plen+slen+max; -if(mode&WIN_T2B) - top=(api->scrn_len/2)-(height/2)-2; -if(mode&WIN_L2R) - left=36-(width/2); -if(mode&WIN_SAV) - gettext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,save_buf); -i=0; -in_win[i++]='�'; -in_win[i++]=hclr|(bclr<<4); -for(c=1;c<width-1;c++) { - in_win[i++]='�'; - in_win[i++]=hclr|(bclr<<4); } -in_win[i++]='�'; -in_win[i++]=hclr|(bclr<<4); -in_win[i++]='�'; -in_win[i++]=hclr|(bclr<<4); - -if(plen) { - in_win[i++]=SP; - in_win[i++]=lclr|(bclr<<4); } - -for(c=0;prompt[c];c++) { - in_win[i++]=prompt[c]; - in_win[i++]=lclr|(bclr<<4); } - -if(plen) { - in_win[i++]=':'; - in_win[i++]=lclr|(bclr<<4); - c++; } - -for(c=0;c<max+2;c++) { - in_win[i++]=SP; - in_win[i++]=lclr|(bclr<<4); } - -in_win[i++]='�'; -in_win[i++]=hclr|(bclr<<4); -in_win[i++]='�'; -in_win[i++]=hclr|(bclr<<4); -for(c=1;c<width-1;c++) { - in_win[i++]='�'; - in_win[i++]=hclr|(bclr<<4); } -in_win[i++]='�'; -in_win[i++]=hclr|(bclr<<4); -puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width-1 - ,SCRN_TOP+top+height-1,in_win); - -if(bclr==BLUE) { - gettext(SCRN_LEFT+left+width,SCRN_TOP+top+1,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+(height-1),shade); - for(c=1;c<12;c+=2) - shade[c]=DARKGRAY; - puttext(SCRN_LEFT+left+width,SCRN_TOP+top+1,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+(height-1),shade); - gettext(SCRN_LEFT+left+2,SCRN_TOP+top+3,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,shade); - for(c=1;c<width*2;c+=2) - shade[c]=DARKGRAY; - puttext(SCRN_LEFT+left+2,SCRN_TOP+top+3,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,shade); } - -textattr(lclr|(bclr<<4)); -if(!plen) - gotoxy(SCRN_LEFT+left+2,SCRN_TOP+top+1); -else - gotoxy(SCRN_LEFT+left+plen+4,SCRN_TOP+top+1); -i=getstr(str,max,kmode); -if(mode&WIN_SAV) - puttext(SCRN_LEFT+left,SCRN_TOP+top,SCRN_LEFT+left+width+1 - ,SCRN_TOP+top+height,save_buf); -showmouse(); -return(i); -} - -/****************************************************************************/ -/* Displays the message 'str' and waits for the user to select "OK" */ -/****************************************************************************/ -void umsg(char *str) -{ - int i=0; - char *ok[2]={"OK",""}; - -if(api->mode&UIFC_INMSG) /* non-cursive */ - return; -api->mode|=UIFC_INMSG; -if(api->savdepth) api->savnum++; -ulist(WIN_SAV|WIN_MID,0,0,0,&i,0,str,ok); -if(api->savdepth) api->savnum--; -api->mode&=~UIFC_INMSG; -} - -/****************************************************************************/ -/* Gets a string of characters from the user. Turns cursor on. Allows */ -/* Different modes - K_* macros. ESC aborts input. */ -/* Cursor should be at END of where string prompt will be placed. */ -/****************************************************************************/ -static int getstr(char *outstr, int max, long mode) -{ - uchar ch,str[256],ins=0,buf[256],y; - int i,j,k,f=0; /* i=offset, j=length */ -#ifndef __FLAT__ - union REGS r; -#endif - -cursor=_NORMALCURSOR; -_setcursortype(cursor); -y=wherey(); -if(mode&K_EDIT) { -/*** - truncsp(outstr); -***/ - outstr[max]=0; - textattr(bclr|(LIGHTGRAY<<4)); - cputs(outstr); - textattr(lclr|(bclr<<4)); - strcpy(str,outstr); - i=j=strlen(str); - while(inkey(1)==0) { -#ifndef __FLAT__ - if(api->mode&UIFC_MOUSE) { - r.w.ax=0x0006; /* Get button release information */ - r.w.bx=0x0000; /* Left button */ - INT_86(0x33,&r,&r); - if(r.w.bx) { /* Left button release same as CR */ - cursor=_NOCURSOR; - _setcursortype(cursor); - return(i); } - r.w.ax=0x0006; /* Get button release information */ - r.w.bx=0x0001; /* Right button */ - INT_86(0x33,&r,&r); - if(r.w.bx) { /* Right button release same as ESC */ - cursor=_NOCURSOR; - _setcursortype(cursor); - return(-1); } } -#endif - mswait(1); - } - f=inkey(0); - gotoxy(wherex()-i,y); - if(!isprint(f&0xff) && f!=0x5300) - cputs(outstr); - else { - cprintf("%*s",i,""); - gotoxy(wherex()-i,y); - i=j=0; } } -else - i=j=0; - - -while(1) { - - - if(i>j) j=i; -#ifndef __FLAT__ - if(api->mode&UIFC_MOUSE) { - r.w.ax=0x0006; /* Get button release information */ - r.w.bx=0x0000; /* Left button */ - INT_86(0x33,&r,&r); - if(r.w.bx) /* Left button release same as CR */ - break; - r.w.ax=0x0006; /* Get button release information */ - r.w.bx=0x0001; /* Right button */ - INT_86(0x33,&r,&r); - if(r.w.bx) { /* Right button release same as ESC */ - cursor=_NOCURSOR; - _setcursortype(cursor); - return(-1); } } -#endif - if(f || inkey(1)) { - if(f) k=f; /* First key */ - else k=inkey(0); - f=0; - ch=k&0xff; - if(!ch) { - switch(k>>8) { - case 0x3b: /* F1 Help */ - help(); - continue; - case 0x4b: /* left arrow */ - if(i) { - gotoxy(wherex()-1,y); - i--; } - continue; - case 0x4d: /* right arrow */ - if(i<j) { - gotoxy(wherex()+1,y); - i++; } - continue; - case 0x47: /* home */ - if(i) { - gotoxy(wherex()-i,y); - i=0; } - continue; - case 0x4f: /* end */ - if(i<j) { - gotoxy(wherex()+(j-i),y); - i=j; } - continue; - case 0x52: /* insert */ - ins=!ins; - if(ins) - cursor=_SOLIDCURSOR; - else - cursor=_NORMALCURSOR; - _setcursortype(cursor); - continue; - case 0x53: /* delete */ - if(i<j) { - gettext(wherex()+1,y,wherex()+(j-i),y,buf); - puttext(wherex(),y,wherex()+(j-i)-1,y,buf); - gotoxy(wherex()+(j-i),y); - putch(SP); - gotoxy(wherex()-((j-i)+1),y); - for(k=i;k<j;k++) - str[k]=str[k+1]; - j--; } - continue; } - continue; } - if(ch==03 || ch==ESC) { - cursor=_NOCURSOR; - _setcursortype(cursor); - return(-1); } - if(ch==BS && i) { - if(i==j) { - cputs("\b \b"); - j--; - i--; } - else { - gettext(wherex(),y,wherex()+(j-i),y,buf); - puttext(wherex()-1,y,wherex()+(j-i)-1,y,buf); - gotoxy(wherex()+(j-i),y); - putch(SP); - gotoxy(wherex()-((j-i)+2),y); - i--; - j--; - for(k=i;k<j;k++) - str[k]=str[k+1]; } - continue; } - if(ch==CR) - break; - if(ch==24) { /* ctrl-x */ - if(j) { - gotoxy(wherex()-i,y); - cprintf("%*s",j,""); - gotoxy(wherex()-j,y); - i=j=0; } - continue; } - if(ch==25) { /* ctrl-y */ - if(i<j) { - cprintf("%*s",(j-i),""); - gotoxy(wherex()-(j-i),y); - j=i; } - continue; } - if(mode&K_NUMBER && !isdigit(ch)) - continue; - if(mode&K_ALPHA && !isalpha(ch)) - continue; - if((ch>=SP || (ch==1 && mode&K_MSG)) && i<max && (!ins || j<max)) { - if(mode&K_UPPER) - ch=toupper(ch); - if(ins) { - gettext(wherex(),y,wherex()+(j-i),y,buf); - puttext(wherex()+1,y,wherex()+(j-i)+1,y,buf); - for(k=++j;k>i;k--) - str[k]=str[k-1]; } - putch(ch); - str[i++]=ch; } } - else - mswait(1); - } -str[j]=0; -if(mode&K_EDIT) { - truncsp(str); - if(strcmp(outstr,str)) - api->changes=1; } -else { - if(j) - api->changes=1; } -strcpy(outstr,str); -cursor=_NOCURSOR; -_setcursortype(cursor); -return(j); -} - -/****************************************************************************/ -/* Performs printf() through puttext() routine */ -/****************************************************************************/ -static int uprintf(char x, char y, char attr, char *fmat, ...) -{ - va_list argptr; - char str[256],buf[512]; - int i,j; - - va_start(argptr,fmat); - vsprintf(str,fmat,argptr); - va_end(argptr); - for(i=j=0;str[i];i++) { - buf[j++]=str[i]; - buf[j++]=attr; } - puttext(x,y,x+(i-1),y,buf); - return(i); -} - - -/****************************************************************************/ -/* Display bottom line of screen in inverse */ -/****************************************************************************/ -void bottomline(int line) -{ - int i=4; -uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"F1 "); -i+=3; -uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Help "); -i+=6; -if(line&BL_GET) { - uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"F5 "); - i+=3; - uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Copy Item "); - i+=11; } -if(line&BL_PUT) { - uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"F6 "); - i+=3; - uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Paste "); - i+=7; } -if(line&BL_INS) { - uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"INS "); - i+=4; - uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Add Item "); - i+=10; } -if(line&BL_DEL) { - uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"DEL "); - i+=4; - uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Delete Item "); - i+=13; } -uprintf(i,api->scrn_len+1,bclr|(cclr<<4),"ESC "); -i+=4; -uprintf(i,api->scrn_len+1,BLACK|(cclr<<4),"Exit"); -i+=4; -gotoxy(i,api->scrn_len+1); -textattr(BLACK|(cclr<<4)); -clreol(); -} - - -/*****************************************************************************/ -/* Generates a 24 character ASCII string that represents the time_t pointer */ -/* Used as a replacement for ctime() */ -/*****************************************************************************/ -char *utimestr(time_t *intime) -{ - static char str[25]; - char wday[4],mon[4],mer[3],hour; - struct tm *gm; - -gm=localtime(intime); -switch(gm->tm_wday) { - case 0: - strcpy(wday,"Sun"); - break; - case 1: - strcpy(wday,"Mon"); - break; - case 2: - strcpy(wday,"Tue"); - break; - case 3: - strcpy(wday,"Wed"); - break; - case 4: - strcpy(wday,"Thu"); - break; - case 5: - strcpy(wday,"Fri"); - break; - case 6: - strcpy(wday,"Sat"); - break; } -switch(gm->tm_mon) { - case 0: - strcpy(mon,"Jan"); - break; - case 1: - strcpy(mon,"Feb"); - break; - case 2: - strcpy(mon,"Mar"); - break; - case 3: - strcpy(mon,"Apr"); - break; - case 4: - strcpy(mon,"May"); - break; - case 5: - strcpy(mon,"Jun"); - break; - case 6: - strcpy(mon,"Jul"); - break; - case 7: - strcpy(mon,"Aug"); - break; - case 8: - strcpy(mon,"Sep"); - break; - case 9: - strcpy(mon,"Oct"); - break; - case 10: - strcpy(mon,"Nov"); - break; - case 11: - strcpy(mon,"Dec"); - break; } -if(gm->tm_hour>12) { - strcpy(mer,"pm"); - hour=gm->tm_hour-12; } -else { - if(!gm->tm_hour) - hour=12; - else - hour=gm->tm_hour; - strcpy(mer,"am"); } -sprintf(str,"%s %s %02d %4d %02d:%02d %s",wday,mon,gm->tm_mday,1900+gm->tm_year - ,hour,gm->tm_min,mer); -return(str); -} - -#if 0 -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c,tmp[256]; - - tmp[0]=TAB; - tmp[1]=0; - str[strcspn(str,tmp)]=0; - c=strlen(str); - while(c && (uchar)str[c-1]<=SP) c--; - str[c]=0; -} -#endif - -/****************************************************************************/ -/* Status popup/down function, see uifc.h for details. */ -/****************************************************************************/ -void upop(char *str) -{ - static char sav[26*3*2]; - char buf[26*3*2]; - int i,j,k; - - hidemouse(); - if(!str) { - puttext(28,12,53,14,sav); - showmouse(); - return; } - gettext(28,12,53,14,sav); - memset(buf,SP,25*3*2); - for(i=1;i<26*3*2;i+=2) - buf[i]=(hclr|(bclr<<4)); - buf[0]='�'; - for(i=2;i<25*2;i+=2) - buf[i]='�'; - buf[i]='�'; i+=2; - buf[i]='�'; i+=2; - i+=2; - k=strlen(str); - i+=(((23-k)/2)*2); - for(j=0;j<k;j++,i+=2) { - buf[i]=str[j]; - buf[i+1]|=BLINK; } - i=((25*2)+1)*2; - buf[i]='�'; i+=2; - buf[i]='�'; i+=2; - for(;i<((26*3)-1)*2;i+=2) - buf[i]='�'; - buf[i]='�'; - - puttext(28,12,53,14,buf); - showmouse(); -} - -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ -void sethelp(int line, char* file) -{ - helpline=line; - helpfile=file; -} - -/************************************************************/ -/* Help (F1) key function. Uses helpbuf as the help input. */ -/************************************************************/ -void help() -{ - char *savscrn,*buf,inverse=0,high=0 - ,hbuf[HELPBUF_SIZE],str[256]; - char *p; - uint i,j,k,len; - unsigned short line; - long l; - FILE *fp; -#ifndef __FLAT__ - union REGS r; -#endif - - _setcursortype(_NOCURSOR); - - if((savscrn=(char *)MALLOC(80*25*2))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes\r\n" - ,__LINE__,80*25*2); - _setcursortype(cursor); - return; } - if((buf=(char *)MALLOC(76*21*2))==NULL) { - cprintf("UIFC line %d: error allocating %u bytes\r\n" - ,__LINE__,76*21*2); - FREE(savscrn); - _setcursortype(cursor); - return; } - hidemouse(); - gettext(1,1,80,25,savscrn); - memset(buf,SP,76*21*2); - for(i=1;i<76*21*2;i+=2) - buf[i]=(hclr|(bclr<<4)); - buf[0]='�'; - for(i=2;i<30*2;i+=2) - buf[i]='�'; - buf[i]='�'; i+=4; - buf[i]='O'; i+=2; - buf[i]='n'; i+=2; - buf[i]='l'; i+=2; - buf[i]='i'; i+=2; - buf[i]='n'; i+=2; - buf[i]='e'; i+=4; - buf[i]='H'; i+=2; - buf[i]='e'; i+=2; - buf[i]='l'; i+=2; - buf[i]='p'; i+=4; - buf[i]='�'; i+=2; - for(j=i;j<i+(30*2);j+=2) - buf[j]='�'; - i=j; - buf[i]='�'; i+=2; - j=i; /* leave i alone */ - for(k=0;k<19;k++) { /* the sides of the box */ - buf[j]='�'; j+=2; - j+=(74*2); - buf[j]='�'; j+=2; } - buf[j]='�'; j+=2; - for(k=j;k<j+(23*2);k+=2) - buf[k]='�'; - buf[k]='�'; k+=4; - buf[k]='H'; k+=2; - buf[k]='i'; k+=2; - buf[k]='t'; k+=4; - buf[k]='a'; k+=2; - buf[k]='n'; k+=2; - buf[k]='y'; k+=4; - buf[k]='k'; k+=2; - buf[k]='e'; k+=2; - buf[k]='y'; k+=4; - buf[k]='t'; k+=2; - buf[k]='o'; k+=4; - buf[k]='c'; k+=2; - buf[k]='o'; k+=2; - buf[k]='n'; k+=2; - buf[k]='t'; k+=2; - buf[k]='i'; k+=2; - buf[k]='n'; k+=2; - buf[k]='u'; k+=2; - buf[k]='e'; k+=4; - buf[k]='�'; k+=2; - for(j=k;j<k+(24*2);j+=2) - buf[j]='�'; - buf[j]='�'; - - if(!api->helpbuf) { - if((fp=_fsopen(api->helpixbfile,"rb",SH_DENYWR))==NULL) - sprintf(hbuf," ERROR Cannot open help index:\r\n %s" - ,api->helpixbfile); - else { - p=strrchr(helpfile,'/'); - if(p==NULL) - p=strrchr(helpfile,'\\'); - if(p==NULL) - p=helpfile; - else - p++; - l=-1L; - while(!feof(fp)) { - if(!fread(str,12,1,fp)) - break; - str[12]=0; - fread(&line,2,1,fp); - if(stricmp(str,p) || line!=helpline) { - fseek(fp,4,SEEK_CUR); - continue; } - fread(&l,4,1,fp); - break; } - fclose(fp); - if(l==-1L) - sprintf(hbuf," ERROR Cannot locate help key (%s:%u) in:\r\n" - " %s",p,helpline,api->helpixbfile); - else { - if((fp=_fsopen(api->helpdatfile,"rb",SH_DENYWR))==NULL) - sprintf(hbuf," ERROR Cannot open help file:\r\n %s" - ,api->helpdatfile); - else { - fseek(fp,l,SEEK_SET); - fread(hbuf,HELPBUF_SIZE,1,fp); - fclose(fp); } } } } - else - strcpy(hbuf,api->helpbuf); - - len=strlen(hbuf); - - i+=78*2; - for(j=0;j<len;j++,i+=2) { - if(hbuf[j]==LF) { - while(i%(76*2)) i++; - i+=2; } - else if(hbuf[j]==2) { /* Ctrl-b toggles inverse */ - inverse=!inverse; - i-=2; } - else if(hbuf[j]==1) { /* Ctrl-a toggles high intensity */ - high=!high; - i-=2; } - else if(hbuf[j]!=CR) { - buf[i]=hbuf[j]; - buf[i+1]=inverse ? (bclr|(cclr<<4)) - : high ? (hclr|(bclr<<4)) : (lclr|(bclr<<4)); } } - puttext(3,3,78,23,buf); - showmouse(); - while(1) { - if(inkey(1)) { - inkey(0); - break; } - #ifndef __FLAT__ - if(api->mode&UIFC_MOUSE) { - r.w.ax=0x0006; /* Get button release information */ - r.w.bx=0x0000; /* Left button */ - INT_86(0x33,&r,&r); - if(r.w.bx) /* Left button release same as CR */ - break; - r.w.ax=0x0006; /* Get button release information */ - r.w.bx=0x0001; /* Right button */ - INT_86(0x33,&r,&r); - if(r.w.bx) /* Left button release same as CR */ - break; } - #endif - mswait(1); - } - - hidemouse(); - puttext(1,1,80,25,savscrn); - showmouse(); - FREE(savscrn); - FREE(buf); - _setcursortype(cursor); -} - diff --git a/src/uifc/uifc.h b/src/uifc/uifc.h deleted file mode 100644 index ef7a6663b7..0000000000 --- a/src/uifc/uifc.h +++ /dev/null @@ -1,335 +0,0 @@ -/* uifc.h */ - -/* Rob Swindell's Text-mode User Interface Library */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2002 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <time.h> -#include <fcntl.h> -#include <ctype.h> -#include <stdio.h> -#include <string.h> -#include <stdarg.h> -#include <stdlib.h> -/* OS Specific */ -#if defined(_WIN32) - #include <windows.h> -#endif -#if !defined(__unix__) - #include <io.h> -#endif -#if !defined(__FreeBSD__) - #include <malloc.h> /* malloc prototype */ -#endif -#if (defined(__unix__) || defined(_WIN32)) && !defined(__FLAT__) - #define __FLAT__ -#endif - -#if defined(__FLAT__) - #define far -#endif - -#if !defined(__FLAT__) - #include <bios.h> -#endif - -#if defined(__unix__) && !defined(stricmp) - #define stricmp strcasecmp - #define strnicmp strncasecmp -#endif - -/****************************************************************************/ -/* MALLOC/FREE Macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) - #if defined(__TURBOC__) - #define REALLOC(x,y) farrealloc(x,y) - #define LMALLOC(x) farmalloc(x) - #define MALLOC(x) farmalloc(x) - #define LFREE(x) farfree(x) - #define FREE(x) farfree(x) - #elif defined(__WATCOMC__) - #define REALLOC realloc - #define LMALLOC(x) halloc(x,1) /* far heap, but slow */ - #define MALLOC malloc /* far heap, but 64k max */ - #define LFREE hfree - #define FREE free - #else /* Other 16-bit Compiler */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free - #endif -#else /* 32-bit Compiler or Small Memory Model */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free -#endif - -#ifdef __DPMI32__ - #define INT_86(i,j,k) int386(i,j,k) -#else - #define INT_86(i,j,k) int86(i,j,k) -#endif - -#ifdef __FLAT__ - #define MAX_OPTS 10000 - #define MSK_ON 0xf0000000 - #define MSK_OFF 0x0fffffff - #define MSK_INS 0x10000000 - #define MSK_DEL 0x20000000 - #define MSK_GET 0x30000000 - #define MSK_PUT 0x40000000 -#else - #define MAX_OPTS 500 /* Maximum number of options per menu call */ - #define MSK_ON 0xf000 - #define MSK_OFF 0x0fff - #define MSK_INS 0x1000 - #define MSK_DEL 0x2000 - #define MSK_GET 0x3000 - #define MSK_PUT 0x4000 -#endif -#define MAX_OPLN 75 /* Maximum length of each option per menu call */ -#define MAX_BUFS 7 /* Maximum number of screen buffers to save */ -#define MIN_LINES 20 /* Minimum number of screen lines supported */ -#define MAX_LINES 60 /* Maximum number of screen rows supported */ -#define MAX_BFLN 80*MAX_LINES*2 /* Maximum size of screen buffers */ - -#ifndef uint -#define uint unsigned int -#endif - - /* Bits in uifcapi_t.mode */ -#define UIFC_INMSG (1<<0) /* Currently in Message Routine non-recursive */ -#define UIFC_MOUSE (1<<1) /* Mouse installed and available */ -#define UIFC_MONO (1<<2) /* Force monochrome mode */ -#define UIFC_COLOR (1<<3) /* Force color mode */ - - /* Bits in uifcapi_t.list mode */ -#define WIN_ORG (1<<0) /* Original menu - destroy valid screen area */ -#define WIN_SAV (1<<1) /* Save existing text and replace when finished */ -#define WIN_ACT (1<<2) /* Menu remains active after a selection */ -#define WIN_L2R (1<<3) /* Center the window based on 'width' */ -#define WIN_T2B (1<<4) /* Center the window based on 'height' */ -#define WIN_INS (1<<5) /* Allows user to user insert key */ -#define WIN_INSACT (1<<6) /* Remains active after insert key */ -#define WIN_DEL (1<<7) /* Allows user to use delete key */ -#define WIN_DELACT (1<<8) /* Remains active after delete key */ -#define WIN_ESC (1<<9) /* Screen is active when escape is hit */ -#define WIN_RHT (1<<10) /* Place window against right side of screen */ -#define WIN_BOT (1<<11) /* Place window against botton of screen */ -#define WIN_GET (1<<12) /* Allows F5 to Get a menu item */ -#define WIN_PUT (1<<13) /* Allows F6 to Put a menu item */ -#define WIN_CHE (1<<14) /* Stay active after escape if changes */ -#define WIN_XTR (1<<15) /* Add extra line at end for inserting at end */ - -#define WIN_MID WIN_L2R|WIN_T2B /* Place window in middle of screen */ - -#define SCRN_TOP 3 -#define SCRN_LEFT 5 -#define SCRN_RIGHT 76 - - /* Bits in 'mode' for getkey and getstr */ -#define K_UPPER (1L<<0) /* Converts all letters to upper case */ -#define K_UPRLWR (1L<<1) /* Upper/Lower case automatically */ -#define K_NUMBER (1L<<2) /* Allow numbers only */ -#define K_WRAP (1L<<3) /* Allows word wrap */ -#define K_MSG (1L<<4) /* Allows ANSI, ^N ^A ^G */ -#define K_SPIN (1L<<5) /* Spinning cursor (same as SPIN) */ -#define K_LINE (1L<<6) /* Input line (inverse color) */ -#define K_EDIT (1L<<7) /* Edit string passed */ -#define K_CHAT (1L<<8) /* In chat multi-chat */ -#define K_NOCRLF (1L<<9) /* Don't print CRLF after string input */ -#define K_ALPHA (1L<<10) /* Only allow alphabetic characters */ - -#define HELPBUF_SIZE 4000 - -#ifndef TAB - /* Control characters */ -#define STX 0x02 /* Start of text ^B */ -#define ETX 0x03 /* End of text ^C */ -#define BS '\b' /* Back space ^H */ -#define TAB '\t' /* Horizontal tabulation ^I */ -#define LF '\n' /* Line feed ^J */ -#define FF 0x0c /* Form feed ^L */ -#define CR '\r' /* Carriage return ^M */ -#define ESC 0x1b /* Escape ^[ */ -#define SP ' ' /* Space */ - -#endif - -#define CLREOL 256 - -#ifndef uchar /* Short-hand for unsigned data types */ -#define uchar unsigned char -#endif -#ifndef uint -#define uint unsigned int -#endif -#ifndef ulong -#define ulong unsigned long -#endif - -#ifndef BOOL -#define BOOL int -#define TRUE 1 -#define FALSE 0 -#endif - -typedef struct { - uint left,top,right,bot; - uchar *buf; -} win_t; - -#if !defined(__FLAT__) - /* LCLOLL.ASM */ - int lclini(int); - void lclxy(int,int); - int lclwx(void); - int lclwy(void); - int lclatr(int); - void lputc(int); - long lputs(char far *); -#endif - -#if defined(__OS2__) || !defined(__FLAT__) -void mswait(int msecs); -extern mswtyp; -#endif - -typedef struct { -/****************************************************************************/ -/* Size of the structure (for version compatibility verification). */ -/****************************************************************************/ - size_t size; -/****************************************************************************/ -/* Controls general UIFC library behavior. */ -/****************************************************************************/ - long mode; -/****************************************************************************/ -/* Set to TRUE when changes to data have been made by input function. */ -/****************************************************************************/ - BOOL changes; -/****************************************************************************/ -/* The overlapped-window save buffer number. */ -/****************************************************************************/ - uint savnum; -/****************************************************************************/ -/* The current overlapped-window save buffer depth. */ -/****************************************************************************/ - uint savdepth; -/****************************************************************************/ -/* Screen length */ -/****************************************************************************/ - uint scrn_len; -/****************************************************************************/ -/* Alternative method of setting current help text. */ -/****************************************************************************/ - char* helpbuf; -/****************************************************************************/ -/* Location of the help data and index files. */ -/****************************************************************************/ - char helpdatfile[256]; - char helpixbfile[256]; -/****************************************************************************/ -/* Exit/uninitialize function. */ -/****************************************************************************/ - void (*bail) (void); -/****************************************************************************/ -/* Fill the screen with the appropriate background attribute. */ -/* str is the title for the application banner. */ -/* Returns 0 on success, non-zero on failure. */ -/****************************************************************************/ - int (*scrn) (char* str); -/****************************************************************************/ -/* Popup a message, maybe wait for the user to hit a key or click button. */ -/****************************************************************************/ - void (*msg) (char* str); -/****************************************************************************/ -/* Popup/down a status message. */ -/* str is the message to display on popup. */ -/* if str==NULL, then the the status is to be cleared (popdown). */ -/****************************************************************************/ - void (*pop) (char* str); -/****************************************************************************/ -/* General menu function. */ -/* mode contains WIN_* flags to control display and functionality. */ -/* left, top and width specify desired screen locations and window size. */ -/* cur is a pointer to the current (default) option. */ -/* bar is a pointer to the current location of the lightbar (which used). */ -/* title is the caption for the menu. */ -/* Menus can centered left to right and top to bottom automatically. */ -/* mode bits are set with macros WIN_*. */ -/* option is an array of char arrays, first element of last char array */ -/* must be NULL. */ -/* Returns the 0-based selected option number, -1 for ESC, or the selected */ -/* option number OR'd with MSK_INS, MSK_DEL, MSK_GET, or MSK_PUT. */ -/****************************************************************************/ - int (*list) (int mode, char left, int top, char width, int* dflt - ,int* bar, char *title, char** option); -/****************************************************************************/ -/* Windowed string input routine. */ -/* mode contains WIN_* flags to control display and functionality. */ -/* left and top specify desired screen location. */ -/* prompt is displayed before the input is requested. */ -/* str is the string to input or edit. */ -/* len is the maximum length of the string. */ -/* kmode contains flags that control the string input (K_* macros). */ -/* This function sets uifcapi_t.changes to TRUE if the string is modified. */ -/* Returns the length of the string or -1 on escape/abort. */ -/****************************************************************************/ - int (*input)(int mode, char left, char top, char* prompt, char* str - ,char len, int kmode); -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ - void (*sethelp)(int line, char* file); -} uifcapi_t; - -/****************************************************************************/ -/* Initialization routines for each UIFC implementation. */ -/* Returns 0 on success, non-zero on failure. */ -/****************************************************************************/ -int uifcini(uifcapi_t*); /* Original implementation based on conio */ -int uifcinix(uifcapi_t*); /* Standard I/O implementation */ -int uifcinid(uifcapi_t*); /* Unix libdialog implementation (by Deuce) */ -/****************************************************************************/ diff --git a/src/uifc/uifcd.c b/src/uifc/uifcd.c deleted file mode 100644 index b82c6d1a88..0000000000 --- a/src/uifc/uifcd.c +++ /dev/null @@ -1,420 +0,0 @@ -/* uifcd.c */ - -/* Unix libdialog implementation of UIFC library (by Deuce) */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2002 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "uifc.h" -#include "dialog.h" - -static char app_title[81]=""; -static char *helpfile=0; -static uint helpline=0; -static uifcapi_t* api; - -/* Prototypes */ -static void help(); - -/* API routines */ -static void uifcbail(void); -static int uscrn(char *str); -static int ulist(int mode, char left, int top, char width, int *dflt, int *bar - ,char *title, char **option); -static int uinput(int imode, char left, char top, char *prompt, char *str - ,char len ,int kmode); -static void umsg(char *str); -static void upop(char *str); -static void sethelp(int line, char* file); - -/****************************************************************************/ -/* Initialization function, see uifc.h for details. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uifcinid(uifcapi_t* uifcapi) -{ - - if(uifcapi==NULL || uifcapi->size!=sizeof(uifcapi_t)) - return(-1); - - api=uifcapi; - - /* install function handlers */ - api->bail=uifcbail; - api->scrn=uscrn; - api->msg=umsg; - api->pop=upop; - api->list=ulist; - api->input=uinput; - api->sethelp=sethelp; - - setvbuf(stdout,NULL,_IONBF,0); - api->scrn_len=24; - - init_dialog(); - - return(0); -} - -/****************************************************************************/ -/* Exit/uninitialize UIFC implementation. */ -/****************************************************************************/ -void uifcbail(void) -{ - end_dialog(); -} - -/****************************************************************************/ -/* Clear screen, fill with background attribute, display application title. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uscrn(char *str) -{ - sprintf(app_title,"%.*s",sizeof(app_title)-1,str); - /**********************************************************************/ - /* ToDo - Does not display application title... mostly 'cause I clear */ - /* the screen so often */ - /**********************************************************************/ - dialog_clear(); - return(0); -} - -/**************************************************************************/ -/* General menu display function. see uifc.h for details */ -/**************************************************************************/ -int ulist(int mode, char left, int top, char width, int *cur, int *bar - , char *title, char **option) -{ - - int cnt; - int cnt2; - int options; - int freecnt; - int i; - int scrollpos; - int height=14; /* default menu height */ - size_t app_title_len; - char **it; - char str[128]; - char tmpstr[128]; // Used for restoring the <-- At End --> bit - char tmpstr2[128]; // for Add and Paste - int ret; - - /* Count number of menu options */ - for(cnt=0;cnt<MAX_OPTS;cnt++) - if(option[cnt][0]==0) - break; - options=cnt; - freecnt=cnt+5; /* Add, Delete, Copy, Paste, At End */ - - // Allocate and fill **it - it=(char **)MALLOC(sizeof(char *)*2*(freecnt)); - if(it==NULL) - return(-1); - - for(i=0;i<freecnt*2;i++) { - it[i]=(char *)MALLOC(MAX_OPLN+1); - if(it[i]==NULL) - return(-1); - } - - strcpy(str,"1"); - - cnt2 = 0; - for(i=0;i<cnt;i++) { - sprintf(it[cnt2++],"%u",i+1); - strcpy(it[cnt2++],option[i]); - - /* Adjust width if it's too small */ - if(width<strlen(option[i])+12) - width=strlen(option[i])+12; - } - - // Make up for expanding first column in width adjustment. - i=cnt; - while(i>9) { - i /= 10; - width+=1; - } - - if(mode&WIN_INS) { - strcpy(it[cnt2++],"A"); /* Changed from "I" */ - strcpy(it[cnt2++],"Add New"); - cnt++; - } - if(mode&WIN_DEL) { - strcpy(it[cnt2++],"D"); - strcpy(it[cnt2++],"Delete"); - cnt++; - } - if(mode&WIN_GET) { - strcpy(it[cnt2++],"C"); - strcpy(it[cnt2++],"Copy"); - cnt++; - } - if(mode&WIN_PUT) { - strcpy(it[cnt2++],"P"); - strcpy(it[cnt2++],"Paste"); - cnt++; - } - - if(width<strlen(title)+4) - width=strlen(title)+4; - app_title_len=strlen(app_title); - - if(*cur<0 || *cur>cnt)*cur=0; - - if(height>cnt) - height=cnt; /* no reason to display overly "tall" menus */ - - while(1) { - i=*cur; - if(i<0) i=0; - if(cnt==2 && strcmp(option[0],"Yes")==0 && strcmp(option[1],"No")==0) { - if(i==0) - ret=dialog_yesno((char*)NULL,title,5,width); - else - ret=dialog_noyes((char*)NULL,title,5,width); - break; - } - /* make sure we're wide enough to display the application title */ - if(width<app_title_len+4) - width=app_title_len+4; - dialog_clear_norefresh(); - scrollpos=0; - - if(i>=height) // Whenever advanced was returned from, it had something - scrollpos=i-height+1; // Beyond the bottom selected - i=i-scrollpos; // Apparently, *ch is the current position ON THE SCREEN - ret=dialog_menu(app_title, title, height+8, width, height, cnt, it, str, &i, &scrollpos); - - if(ret==1) { /* Cancel */ - ret = -1; - *cur = -1; - break; - } - if(ret==-1) /* ESC */ - break; - if(ret==-2) { /* Help */ - help(); - continue; - } - if(ret!=0) /* ??? */ - continue; - switch(str[0]) { - case 'A': /* Add */ - dialog_clear_norefresh(); - if(options>0) { - strncpy(tmpstr,it[options*2],127); - sprintf(it[options*2],"%u",options+1); - strncpy(tmpstr2,it[options*2+1],127); - strcpy(it[options*2+1],"<-- At End -->"); - ret=dialog_menu(title, "Insert Where?", height+8, width, height, options+1, it, str, 0, 0); - strncpy(it[options*2],tmpstr,127); - strncpy(it[options*2+1],tmpstr2,127); - if(ret==0) { - *cur=atoi(str)-1; - ret=*cur|MSK_INS; - } - } - else { - *cur=0; - ret=MSK_INS; - } - break; - case 'D': /* Delete */ - dialog_clear_norefresh(); - if(options>0) { - ret=dialog_menu(title, "Delete Which?", height+8, width, height, options, it, str, 0, 0); - if(ret==0) { - *cur=atoi(str)-1; - ret=*cur|MSK_DEL; - } - } - else { - *cur=0; - ret=MSK_DEL; - } - break; - case 'C': /* Copy */ - dialog_clear_norefresh(); - if(options>0) { - ret=dialog_menu(title, "Copy Which?", height+8, width, height, options, it, str, 0, 0); - if(ret==0) { - *cur=atoi(str)-1; - ret=*cur|MSK_GET; - } - } - else { - *cur=0; - ret=MSK_GET; - } - break; - case 'P': /* Paste */ - dialog_clear_norefresh(); - if(options>0) { - strncpy(tmpstr,it[options*2],127); - sprintf(it[options*2],"%u",options+1); - strncpy(tmpstr2,it[options*2+1],127); - strcpy(it[options*2+1],"<-- At End -->"); - ret=dialog_menu(title, "Paste Where?", height+8, width, height, options+1, it, str, 0, 0); - strncpy(it[options*2],tmpstr,127); - strncpy(it[options*2+1],tmpstr2,127); - if(ret==0) { - *cur=atoi(str)-1; - ret=*cur|MSK_PUT; - } - } - else { - *cur=0; - ret=MSK_PUT; - } - break; - default: - *cur=atoi(str)-1; - ret=*cur; - break; - } - break; - } - - // free() the strings! - for(i=0;i<freecnt*2;i++) - free(it[i]); - free(it); - - return(ret); -} - - -/*************************************************************************/ -/* This function is a windowed input string input routine. */ -/*************************************************************************/ -int uinput(int mode, char left, char top, char *prompt, char *outstr, - char max, int kmode) -{ - char str[256]; - if(!(kmode&K_EDIT)) - outstr[0]=0; - sprintf(str,"%.*s",sizeof(str)-1,outstr); - while(dialog_inputbox((char*)NULL, prompt, 9, max+4, outstr)==-2) - help(); - if(kmode&K_UPPER) /* convert to uppercase? */ - strupr(str); - if(strcmp(str,outstr)) - api->changes=TRUE; - return strlen(outstr); -} - -/****************************************************************************/ -/* Displays the message 'str' and waits for the user to select "OK" */ -/****************************************************************************/ -void umsg(char *str) -{ - dialog_mesgbox((char*)NULL, str, 7, strlen(str)+4); -} - -/****************************************************************************/ -/* Status popup/down function, see uifc.h for details. */ -/****************************************************************************/ -void upop(char *str) -{ - // Pop-down doesn't do much... the mext item should over-write this. - dialog_gauge((char*)NULL,str,8,20,7,40,0); -} - -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ -void sethelp(int line, char* file) -{ - helpfile=file; - helpline=line; -} - -/************************************************************/ -/* Help function. */ -/************************************************************/ -void help() -{ - char hbuf[HELPBUF_SIZE],str[256]; - char *p; - unsigned short line; - long l; - FILE *fp; - - printf("\n"); - if(!api->helpbuf) { - if((fp=fopen(api->helpixbfile,"rb"))==NULL) - sprintf(hbuf,"ERROR: Cannot open help index: %s" - ,api->helpixbfile); - else { - p=strrchr(helpfile,'/'); - if(p==NULL) - p=strrchr(helpfile,'\\'); - if(p==NULL) - p=helpfile; - else - p++; - l=-1L; - while(!feof(fp)) { - if(!fread(str,12,1,fp)) - break; - str[12]=0; - fread(&line,2,1,fp); - if(stricmp(str,p) || line!=helpline) { - fseek(fp,4,SEEK_CUR); - continue; } - fread(&l,4,1,fp); - break; } - fclose(fp); - if(l==-1L) - sprintf(hbuf,"ERROR: Cannot locate help key (%s:%u) in: %s" - ,p,helpline,api->helpixbfile); - else { - if((fp=fopen(api->helpdatfile,"rb"))==NULL) - sprintf(hbuf,"ERROR: Cannot open help file: %s" - ,api->helpdatfile); - else { - fseek(fp,l,SEEK_SET); - fread(hbuf,HELPBUF_SIZE,1,fp); - fclose(fp); - } - } - } - } - else - strcpy(hbuf,api->helpbuf); - - dialog_mesgbox((char*)NULL, hbuf, 24, 80); -} diff --git a/src/uifc/uifcx.c b/src/uifc/uifcx.c deleted file mode 100644 index b840420499..0000000000 --- a/src/uifc/uifcx.c +++ /dev/null @@ -1,394 +0,0 @@ -/* uifcx.c */ - -/* Standard I/O Implementation of UIFC (user interface) library */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2002 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include "uifc.h" - -#include <sys/types.h> - -#ifdef __unix__ -/* #include <sys/time.h> why? */ - #include <unistd.h> -#endif - -static char *helpfile=0; -static uint helpline=0; -static uifcapi_t* api; - -/* Prototypes */ -static void help(); - -/* API routines */ -static void uifcbail(void); -static int uscrn(char *str); -static int ulist(int mode, char left, int top, char width, int *dflt, int *bar - ,char *title, char **option); -static int uinput(int imode, char left, char top, char *prompt, char *str - ,char len ,int kmode); -static void umsg(char *str); -static void upop(char *str); -static void sethelp(int line, char* file); - -/****************************************************************************/ -/* Initialization function, see uifc.h for details. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uifcinix(uifcapi_t* uifcapi) -{ - - if(uifcapi==NULL || uifcapi->size!=sizeof(uifcapi_t)) - return(-1); - - api=uifcapi; - - /* install function handlers */ - api->bail=uifcbail; - api->scrn=uscrn; - api->msg=umsg; - api->pop=upop; - api->list=ulist; - api->input=uinput; - api->sethelp=sethelp; - - setvbuf(stdin,NULL,_IONBF,0); - setvbuf(stdout,NULL,_IONBF,0); - api->scrn_len=24; - - return(0); -} - -/****************************************************************************/ -/* Exit/uninitialize UIFC implementation. */ -/****************************************************************************/ -void uifcbail(void) -{ -} - -/****************************************************************************/ -/* Clear screen, fill with background attribute, display application title. */ -/* Returns 0 on success. */ -/****************************************************************************/ -int uscrn(char *str) -{ - return(0); -} - -static int getstr(char* str, int maxlen) -{ - char ch; - int len=0; - int istty; - - istty=isatty(fileno(stdin)); - while(1) { - fread(&ch,1,1,stdin); - if(!istty) { - printf("%c",ch); - fflush(stdout); - } - if(ch=='\r' || ch=='\n') /* enter */ - break; - if(ch=='\b') { /* backspace */ - if(len) len--; - continue; - } - if(len<maxlen) - str[len++]=ch; - } - str[len]=0; /* we need The Terminator */ - - return(len); -} - - -/****************************************************************************/ -/* Local utility function. */ -/****************************************************************************/ -static int which(char* prompt, int max) -{ - char str[41]; - int i; - - while(1) { - printf("%s which (1-%d): ",prompt,max); - str[0]=0; - getstr(str,sizeof(str)-1); - i=atoi(str); - if(i>0 && i<=max) - return(i-1); - } -} - -/****************************************************************************/ -/* General menu function, see uifc.h for details. */ -/****************************************************************************/ -int ulist(int mode, char left, int top, char width, int *cur, int *bar - , char *title, char **option) -{ - char str[128]; - int i,j,opts; - int optnumlen; - int yesno=0; - int lines; - - for(opts=0;opts<MAX_OPTS;opts++) - if(option[opts][0]==0) - break; - - if((*cur)>=opts) - (*cur)=opts-1; /* returned after scrolled */ - - if((*cur)<0) - (*cur)=0; - - if(opts>999) - optnumlen=4; - else if(opts>99) - optnumlen=3; - else if(opts>9) - optnumlen=2; - else - optnumlen=1; - while(1) { - if(opts==2 && !stricmp(option[0],"Yes") && !stricmp(option[1],"No")) { - yesno=1; - printf("%s? ",title); - } else { - printf("\n[%s]\n",title); - lines=2; - for(i=0;i<opts;i++) { - printf("%*d: %s\n",optnumlen,i+1,option[i]); - lines++; - if(!(lines%api->scrn_len)) { - printf("More? "); - str[0]=0; - getstr(str,sizeof(str)-1); - if(toupper(*str)=='N') - break; - } - } - str[0]=0; - if(mode&WIN_GET) - strcat(str,", Copy"); - if(mode&WIN_PUT) - strcat(str,", Paste"); - if(mode&WIN_INS) - strcat(str,", Add"); - if(mode&WIN_DEL) - strcat(str,", Delete"); - printf("\nWhich (Help%s or Quit): ",str); - } - str[0]=0; - getstr(str,sizeof(str)-1); - - truncsp(str); - i=atoi(str); - if(i>0) { - *cur=--i; - return(*cur); - } - i=atoi(str+1); - switch(toupper(*str)) { - case 0: - case ESC: - case 'Q': - printf("Quit\n"); - return(-1); - case 'Y': - if(!yesno) - break; - printf("Yes\n"); - return(0); - case 'N': - if(!yesno) - break; - printf("No\n"); - return(1); - case 'H': - case '?': - printf("Help\n"); - help(); - break; - case 'A': /* Add/Insert */ - if(!opts) - return(MSK_INS); - if(i>0 && i<=opts+1) - return((i-1)|MSK_INS); - return(which("Add before",opts+1)|MSK_INS); - case 'D': /* Delete */ - if(!opts) - break; - if(i>0 && i<=opts) - return((i-1)|MSK_DEL); - if(opts==1) - return(MSK_DEL); - return(which("Delete",opts)|MSK_DEL); - case 'C': /* Copy/Get */ - if(!opts) - break; - if(i>0 && i<=opts) - return((i-1)|MSK_GET); - if(opts==1) - return(MSK_GET); - return(which("Copy",opts)|MSK_GET); - case 'P': /* Paste/Put */ - if(!opts) - break; - if(i>0 && i<=opts) - return((i-1)|MSK_PUT); - if(opts==1) - return(MSK_PUT); - return(which("Paste",opts)|MSK_PUT); - } - } -} - - -/*************************************************************************/ -/* This function is a windowed input string input routine. */ -/*************************************************************************/ -int uinput(int mode, char left, char top, char *prompt, char *outstr, - char max, int kmode) -{ - char str[256]; - - while(1) { - printf("%s (maxlen=%u): ",prompt,max); - - getstr(str,max); - truncsp(str); - if(strcmp(str,"?")) - break; - help(); - } - if(strcmp(outstr,str)) - api->changes=1; - if(kmode&K_UPPER) /* convert to uppercase? */ - strupr(str); - strcpy(outstr,str); - return(strlen(outstr)); -} - -/****************************************************************************/ -/* Displays the message 'str' and waits for the user to select "OK" */ -/****************************************************************************/ -void umsg(char *str) -{ - printf("%s\n",str); -} - -/****************************************************************************/ -/* Status popup/down function, see uifc.h for details. */ -/****************************************************************************/ -void upop(char *str) -{ - if(str==NULL) - printf("\n"); - else - printf("\r%-79s",str); -} - -/****************************************************************************/ -/* Sets the current help index by source code file and line number. */ -/****************************************************************************/ -void sethelp(int line, char* file) -{ - helpline=line; - helpfile=file; -} - -/****************************************************************************/ -/* Help function. */ -/****************************************************************************/ -void help() -{ - char hbuf[HELPBUF_SIZE],str[256]; - char *p; - unsigned short line; - long l; - FILE *fp; - - printf("\n"); - if(!api->helpbuf) { - if((fp=fopen(api->helpixbfile,"rb"))==NULL) - sprintf(hbuf,"ERROR: Cannot open help index: %s" - ,api->helpixbfile); - else { - p=strrchr(helpfile,'/'); - if(p==NULL) - p=strrchr(helpfile,'\\'); - if(p==NULL) - p=helpfile; - else - p++; - l=-1L; - while(!feof(fp)) { - if(!fread(str,12,1,fp)) - break; - str[12]=0; - fread(&line,2,1,fp); - if(stricmp(str,p) || line!=helpline) { - fseek(fp,4,SEEK_CUR); - continue; } - fread(&l,4,1,fp); - break; } - fclose(fp); - if(l==-1L) - sprintf(hbuf,"ERROR: Cannot locate help key (%s:%u) in: %s" - ,p,helpline,api->helpixbfile); - else { - if((fp=fopen(api->helpdatfile,"rb"))==NULL) - sprintf(hbuf,"ERROR: Cannot open help file: %s" - ,api->helpdatfile); - else { - fseek(fp,l,SEEK_SET); - fread(hbuf,HELPBUF_SIZE,1,fp); - fclose(fp); - } - } - } - } - else - strcpy(hbuf,api->helpbuf); - - puts(hbuf); - if(strlen(hbuf)>200) { - printf("Hit enter"); - getstr(str,sizeof(str)-1); - } -} - - diff --git a/src/wmakeall.bat b/src/wmakeall.bat deleted file mode 100755 index a11b4e41fa..0000000000 --- a/src/wmakeall.bat +++ /dev/null @@ -1,38 +0,0 @@ -@echo off -rem -rem Makes all Watcom compiled Synchronet projects - April 1997 Rob Swindell -rem -cd sbbs\addfiles -call makeall.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\delfiles -call makeall.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\dupefind -call makeall.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\echo -wmake -f sbbsecho.wat OS=OS2 %1 %2 %3 %4 %5 -if errorlevel 1 goto err -wmake -f sbbsecho.wat OS=DOS4G %1 %2 %3 %4 %5 -if errorlevel 1 goto err -wmake -f sbbsecho.wat OS=NT %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\filelist -call makeall.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\smb\smbutil -call makeall.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -cd ..\..\smbactiv -call makeall.bat %1 %2 %3 %4 %5 -if errorlevel 1 goto err -rem End of makes -cd ..\.. -goto end -:err -rem Error occurred -echo. -echo There was an error! -echo. -:end diff --git a/text/answer.asc b/text/answer.asc deleted file mode 100644 index 33e72461b6..0000000000 --- a/text/answer.asc +++ /dev/null @@ -1,7 +0,0 @@ -ncConnection established at h@BPS@ncbps on h@DATE@nc at h@TIME@ - -b@SYSOP@ welcomes you to y@BBS@b (Node @NODE@) - -If you are a new user to the system, type c"New"b now. -Otherwise, enter your user name or number now. -yh diff --git a/text/answer.wip b/text/answer.wip deleted file mode 100644 index 1440290a3c..0000000000 --- a/text/answer.wip +++ /dev/null @@ -1,18 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=15 -!|M=@BBS@ -!|L=2505 -!|T=105 -!|W=3750 -!|H=5100 -!|B=16777215 -!| -!|[Form] -!|001=0B`c`70`265`100`30`1`Login to BBS`0`12632256`MS Sans Serif`8.25`Continue` -!|002=0T`text`1`20`240`40`1``0`16777215`MS Sans Serif`8.25`Synchronet BBS Software Version @VER@|mDeveloped 1990-1997 Rob Swindell`1`0 -!|003=0P`wiplogo`45`65`150`180`3``-2147483643`WIPLOGO.BMP -!| -$0E diff --git a/text/computer.sif b/text/computer.sif deleted file mode 100644 index 13bac67083..0000000000 --- a/text/computer.sif +++ /dev/null @@ -1,109 +0,0 @@ -This is the Synchronet Computer Information Questionaire. - - -n -hMicroprocessorn - -A) 8088 (XT) -B) 80286 (AT) -C) 80386SX -D) 80386DX -E) 80486 - -yhWhich:n c"ABCDE" - -hClock Speedn - -A) 4.77mhz -B) 6mhz -C) 8mhz -D) 10mhz -E) 12mhz -F) 16mhz -G) 20mhz -H) 25mhz -I) 33mhz -J) 40mhz -K) 50mhz - -yhWhich: nc"ABCDEFGHIJK" - -hArchitecturen - -A) 8bit (XT) -B) ISA (AT) -C) MCA (PS/2) -D) EISA - -yhWhich: nc"ABCD" - -hDisplayn - -A) MDA (Monochrome - no graphics) -B) Hercules (Monochrome - graphics) -C) CGA -D) EGA -E) MCGA -F) VGA -G) SVGA (640x480x256) -H) MVGA (Monochrome VGA) -I) 8514/A (1024x768x256) -J) XGA -K) TIGA (34010) - -yhWhich: nc"ABCDEFGHIJK" - -hSystem RAMn - -A) <1mb -B) 1mb -C) 2mb -D) 3mb -E) 4mb -F) 5mb -G) 6mb -H) 8mb -I) 10mb -J) 12mb -K) 16mb -L) 18mb -M) 24mb -N) 32mb -O) 64mb - -yhWhich: nc"ABCDEFGHIJKLMNO" - -hTotal Hard Disk Capacityn - -A) None -B) 10mb -C) 20mb -D) 30mb -E) 40mb -F) 60mb -G) 80mb -H) 100mb -I) 120mb -J) 150mb -K) 200mb -L) 250mb -M) 300mb -N) 400mb -O) 500mb -P) 600mb -Q) 700mb -R) 800mb -S) 900mb -T) 1gb or more - -yhWhich: nc"ABCDEFGHIJKLMNOPQRST" - -hHard Disk Interfacen - -A) ST506 (Standard) -B) SCSI -C) SCSI2 -D) ESDI -E) IDE - -yhWhich: nc"ABCDE" diff --git a/text/example.sif b/text/example.sif deleted file mode 100644 index e8af4378cf..0000000000 --- a/text/example.sif +++ /dev/null @@ -1,68 +0,0 @@ -This is an example of the Synchronet Interface File (SIF) Format: - -To execute this SIF, yype ;SIF at the main prompt and enter EXAMPLE as the -filename. - -Only text between STX (Start of text / Ctrl-B) and ETX (End of text / Ctrl-C) -will be displayed to the user. After each ETX is the input mode specifier -('c'haracter or 's'tring), then an optional mode modifier ('u'ppercase, -'n'umeric, or 'f'orced captialization), then an optional 'l' for an input line -to be displayed, then an optional 'r' if the data file should contain a CRLF -after this field, then the maximum length of the string (if 's'tring mode and a -template isn't specified), then an optional . followed by the minimum length -of the string, and last an optional string in double-quotes that either -specifies what keys will be accepted ('c'haracter mode) or an input template -('s'tring mode). - -Inside the text area, we should use Synchronet Ctrl-A sequences for changing -the text attributes and clearing the screen. Embeded ANSI sequences can be used -but are not suggested as they will be displayed to ALL users (ANSI or not), and -Ctrl-A sequences are filtered for non-ANSI users, and modified for Monochrome -ANSI users. See SBBS\TEXT\MENU\ATTR.ALL for more information on Ctrl-A codes. - -Text is going to start here: -n -Hello, this is an example hSIFn file. - -Please answer the following input prompts. - -mhSelect Onen - -A) Selection A -B) Selection B -C) Selection C - -yhWhich: nc"ABC" Text in this area is just for comments - -yhEnter any character: rc - -yhEnter any character (converted to uppercase automatically): ncu - -yhEnter any number (allows CR): cnl - -yhEnter any number (disallows CR): bc"0123456789" - -bhEnter a string: ws30 - -yhEnter a string of at least 4 characters: sl8.4 - -yhEnter a string (converted to uppercase automatically): nsu10 - -yhEnter a numeric value of at least one digit: snl5.1 - -yhEnter your name (forced capitalization): nsf30 - -yhEnter your phone number (must be complete): ws.12"NNN-NNN-NNNN" - ^ notice that the max - length wasn't needed because the template was specified - -yhEnter your birthdate (can be incomplete): sl"NN/NN/NN" - -bhAre you sure (Y/N) ? wc"YN" - -chAll done! - -everything after this point doesn't matter..... (cause we're not between STX -and ETX) - -See Customization chapter in the sysop manual for more information. diff --git a/text/feedback.msg b/text/feedback.msg deleted file mode 100644 index d08c65cb60..0000000000 --- a/text/feedback.msg +++ /dev/null @@ -1,10 +0,0 @@ -hy -As a new user, your access to some of the system's facilities will be -restricted until the letter you are about to write has been reviewed by a -sysop and your account has been "validated." - -ngPlease include in your letter: - - ho ngWhere you found the number to this BBS - ho ngWhat prompted you to call - ho ngWhat your expectations are diff --git a/text/menu/allmail.asc b/text/menu/allmail.asc deleted file mode 100644 index 6bd691f938..0000000000 --- a/text/menu/allmail.asc +++ /dev/null @@ -1,9 +0,0 @@ - yh��� wReading All Mail y��� -�����������������������������������������������������������������������������ͻ -�w<CR> bNext Message wR bReread Last Message y� -� w- bPrevious Message wD bDelete Last Message y� -� wL bList All Messages wS bSave Last Message to File y� -� wT bList Ten More Messages wE bEdit Last Message y� -� wU bEdit Author of Last Message wC bChange Last Message's Flag y� -� wQ bQuit to Main Section w# bGo to Message # y� -�����������������������������������������������������������������������������ͼ diff --git a/text/menu/attr.asc b/text/menu/attr.asc deleted file mode 100644 index ca29b7d6f7..0000000000 --- a/text/menu/attr.asc +++ /dev/null @@ -1,18 +0,0 @@ - Synchronet Text Attribute Menu - (All attribute codes must be preceeded by a Ctrl-A) - - Foreground Background -Black K k(Low) h(High)n 0 hWhite on Blackn -Red R r(Low) h(High)n 1 k1Black on Redn -Green G g(Low) h(High)n 2 k2Black on Greenn -Yellow Y y(Low) h(High)n 3 k3Black on Yellown -Blue B b(Low) h(High)n 4 wh4White on Bluen -Magenta M m(Low) h(High)n 5 wh5White on Magentan -Cyan C c(Low) h(High)n 6 k6Black on Cyann -White W w(Low) h(High)n 7 k7Black on Whiten - -High H hHigh Intensityn -Blink I iBlinkingn -Normal N No Special Attributes -Pause P Insert a Pause Prompt into message -CLS L Insert a Form Feed into message diff --git a/text/menu/batchxfr.asc b/text/menu/batchxfr.asc deleted file mode 100644 index 59ad69c759..0000000000 --- a/text/menu/batchxfr.asc +++ /dev/null @@ -1,13 +0,0 @@ -0lnc4���������������������������k�0 -4c� hyBatch/Bidirectional Menu nk4�0 -4c�k���������������������������0 -4b0�����4 0�4 hwUpload/Downloadnb�hw4Filesnb�����������������4 hwBatch Queue Managementnb��������� -����� -� hyU ngUpload files in upload queue�b� hyL ngList files in batch queues�b� -� hyD ngDownload files in download queue b� hyR ngRemove files from batch queues b� -��� hyC ngClear batch queues�b� -�������4 hwBidirectional Transfersnb������������ -����������������������������������������� -� hyB ngBidirectional file transfer�b� hyQ ngQuit to File Transfer menu�b� -����� -4 hyAnytime: cCtrl-U nc4Who's online hCtrl-P nc4Send private msg hCtrl-C nc4Abort cmd/text n diff --git a/text/menu/batchxfr.rip b/text/menu/batchxfr.rip deleted file mode 100644 index 466931069f..0000000000 --- a/text/menu/batchxfr.rip +++ /dev/null @@ -1,13 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Batch Transfers<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL2S0000<><> -!|1B0000020QPC010E000F080200000000000000|Y00000100|1U0M161K1G0000<>U<>U -!|1U0M1K1K1U0000<>D<>D|1U0M1Y1K280000<>B<>B -!|1B0000020QPE010E000F080400000000000000|1U0M2C1K2M0000<>Q<>Q -!|1B0000020QPC010E000F080200000000000000|1U9616A41G0000<>L<>L -!|1U961KA41U0000<>R<>R|1U961YA4280000<>C<>C|c00|@1Y16Upload|@1Y1KDownload -!|@1Y1YBidirectional Transfer|@1Y2CQuit to the Transfer Section -!|@AK1YClear Batch Queue|@AK16List Files in Batch Queue -!|@AK1KRemove Files from Batch Queue|w000G271610|10000$ETW$|#|#|# - diff --git a/text/menu/batdprot.asc b/text/menu/batdprot.asc deleted file mode 100644 index 4e32fe9013..0000000000 --- a/text/menu/batdprot.asc +++ /dev/null @@ -1 +0,0 @@ -hwY bYmodem wZ bZmodem wG bYmodem-G wH bHS/Link diff --git a/text/menu/batflag.asc b/text/menu/batflag.asc deleted file mode 100644 index 6300697723..0000000000 --- a/text/menu/batflag.asc +++ /dev/null @@ -1,23 +0,0 @@ -lnhcFile Listing: - -�nc���������If nhc+ ncthen extended description exists, but not displayed -����������File flag for fast tagging -�Filename �� ���File size -� Extension��� � �If nhc- ncthen file is offline -����� � ���Description -nhbSBBS200G.ZIP+ngA nm851k-ngSynchronet v2.00g Multinode BBS Software - -nhcBatch Flagging Commands: - -nhb[nhcBnhb]atch Download�ncAdd file(s) to batch download queue -nhb[nhcVnhb]iew Files�ncView archive listing or contents of file(s) -nhb[nhcEnhb]xtended Info�ncDisplay extended information on file(s) -nhb[nhcSnhb]kip Directory�ncSkip this directory (during scans) -nhb[nhcPnhb]revious�ncMove backwards through this directory -nhb[nhcQnhb]uit�ncStop listing files -( -nhcSysop Commands: - -nhb[nhcDnhb]elete Files�ncDelete file(s) from disk and/or database -nhb[nhcMnhb]ove Files�ncMove file(s) to another directoryn -) diff --git a/text/menu/batuprot.asc b/text/menu/batuprot.asc deleted file mode 100644 index 4e32fe9013..0000000000 --- a/text/menu/batuprot.asc +++ /dev/null @@ -1 +0,0 @@ -hwY bYmodem wZ bZmodem wG bYmodem-G wH bHS/Link diff --git a/text/menu/biprot.asc b/text/menu/biprot.asc deleted file mode 100644 index 26816be463..0000000000 --- a/text/menu/biprot.asc +++ /dev/null @@ -1 +0,0 @@ -nhH bHS/Link diff --git a/text/menu/chat.asc b/text/menu/chat.asc deleted file mode 100644 index f6351c8cf9..0000000000 --- a/text/menu/chat.asc +++ /dev/null @@ -1,11 +0,0 @@ -nlc4��������������������nk4�0 -nc4� nhy4Chat Command Menu nk4�0 -nc4�nk4��������������������0 -nb��������������������nb4 nh4Join a Chat nb�����������������������nb4 nb����nb4 nh4Togglesnb���������� -����� -� nhyJ ngJoin/initiate multinode chat�nb� nhyD ngAllow paging off/on�nb� -� nhyP ngJoin/initiate private node to node chat�nb� nhyA ngActivity alerts off/on nb� -� nhyC ngChat with the sysop�nb� nhyS ngSplit screen pvt chat nb� -� nhyT ngTalk with the system Guru (Artificial Person) nb� nhyQ ngQuit from Chat section nb� -����� -nb4 nhy4Anytime: nhc4Ctrl-U nc4Who's online nhc4Ctrl-P nc4Send private msg nhc4Ctrl-C nc4Abort cmd/text n diff --git a/text/menu/chat.rip b/text/menu/chat.rip deleted file mode 100644 index ee13258675..0000000000 --- a/text/menu/chat.rip +++ /dev/null @@ -1,14 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Chat Section<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL2S0000<><> -!|1B0000020QPC010E000F080500000000000000|Y00000100|1U0M161K1G0000<>D<>D -!|1U0M1K1K1U0000<>A<>A|1U0M1Y1K280000<>J<>J -!|1B0000020QPE010E000F080400000000000000|1U0M2C1K2M0000<>Q<>Q -!|1B0000020QPC010E000F080500000000000000|1U9616A41G0000<>T<>T -!|1U961KA41U0000<>P<>P|1U961YA4280000<>C<>C|w000E271610|c00 -!|@1Y16Disable/Enable Paging|@1Y1KActivity Alert Disable/Enable -!|@1Y1YJoin/Initiate Multinode Chat|@1Y2CQuit from Chat Section -!|@AK16Talk with the Guru|@AK1KPrivate Node to Node Chat|@AK1YChat with Sysop -!|10000$ETW$|#|#|# - diff --git a/text/menu/chat.wip b/text/menu/chat.wip deleted file mode 100644 index 5e5d48173b..0000000000 --- a/text/menu/chat.wip +++ /dev/null @@ -1,23 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=15 -!|M=Chat -!|L=1665 -!|T=555 -!|W=4050 -!|H=4500 -!|B=12632256 -!| -!|[Form] -!|001=0B`p`20`20`100`60`1`Private User-to-User Chat`0`12632256`MS Sans Serif`8.25`Private`ORDER.ICO -!|002=0B`j`140`20`100`60`2``0`12632256`MS Sans Serif`8.25`Multinode`EAR.ICO -!|003=0B`c`20`100`100`60`3``0`12632256`MS Sans Serif`8.25`Sysop`CONTACT.ICO -!|004=0B`t`140`100`100`60`4``0`12632256`MS Sans Serif`8.25`Guru`SOUND.ICO -!|005=0B`d`20`180`100`30`5``0`12632256`MS Sans Serif`8.25`Pager` -!|006=0B`a`20`225`100`30`6``0`12632256`MS Sans Serif`8.25`Activity` -!|007=0B`s`140`180`100`30`7``0`12632256`MS Sans Serif`8.25`Split-screen` -!|008=0B`q`140`225`100`30`8``0`12632256`MS Sans Serif`8.25`Quit` -!| -$0E \ No newline at end of file diff --git a/text/menu/dlprot.asc b/text/menu/dlprot.asc deleted file mode 100644 index 2339a77346..0000000000 --- a/text/menu/dlprot.asc +++ /dev/null @@ -1 +0,0 @@ -hwX bXmodem wY bYmodem wZ bZmodem wG bYmodem-G diff --git a/text/menu/e-mail.asc b/text/menu/e-mail.asc deleted file mode 100644 index 6e61c7ffb6..0000000000 --- a/text/menu/e-mail.asc +++ /dev/null @@ -1,11 +0,0 @@ -0lnc4�����������������������k�0 -4c� hyElectronic Mail Menu nk4�0 -4c�k�����������������������0 -b��������4 hwSend Mail nb���������������4 hwRead Mail nb�������� -����� -� hyS ngSend mail�b� hyR ngRead mail sent to you b� -��hy0N ngSend NetMail�b� hyK ngRead mail you have sent b� -������������������������������������������������������������ -� hyF ngSend feedback to the sysop b� hyQ ngQuit back to Main menu b� -� hyU ngUpload file to a mailbox b��� -������������������������������������������������������������n diff --git a/text/menu/e-mail.rip b/text/menu/e-mail.rip deleted file mode 100644 index f98a4b507a..0000000000 --- a/text/menu/e-mail.rip +++ /dev/null @@ -1,12 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Electronic Mail Menu<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL2E0000<><> -!|1B0000020QPE010E000F080200000000000000|Y00000100|1U0M161K1G0000<>S<>S -!|1U0M1K1K1U0000<>N<>N|1U9616A41G0000<>R<>R|1U961KA41U0000<>K<>K -!|1U0M1Y1K280000<>F<>F|1B0000020QPE010E000F080400000000000000 -!|1U961YA4280000<>Q<>Q|c00|@1Y16Send Mail|@1Y1KSend NetMail -!|@1Y1YSend Feedback to the Sysop|@AK16Read Your Mail -!|@AK1KRead Mail You Have Sent|@AK1YQuit to the Main Menu|w000C271610 -!|10000$ETW$|#|#|# - diff --git a/text/menu/e-mail.wip b/text/menu/e-mail.wip deleted file mode 100644 index 451e6cacfa..0000000000 --- a/text/menu/e-mail.wip +++ /dev/null @@ -1,21 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=15 -!|M=E-mail -!|L=1425 -!|T=195 -!|W=4050 -!|H=4350 -!|B=12632256 -!| -!|[Form] -!|001=0B`s`20`20`100`60`1``0`12632256`MS Sans Serif`8.25`Send E-mail`EDIT.ICO -!|002=0B`r`140`20`100`60`2``0`12632256`MS Sans Serif`8.25`Read E-mail`DETAIL.ICO -!|003=0B`k`140`100`100`60`3``0`12632256`MS Sans Serif`8.25`Read Sent E-mail`SEARCH.ICO -!|004=0B`f`20`100`100`60`4``0`12632256`MS Sans Serif`8.25`Feedback`CONTACT.ICO -!|005=0B`n`20`180`100`60`5``0`12632256`MS Sans Serif`8.25`Send NetMail`EDIT.ICO -!|006=0B`q`140`180`100`60`6``0`12632256`MS Sans Serif`8.25`Quit`EXIT.ICO -!| -$0E \ No newline at end of file diff --git a/text/menu/editor.asc b/text/menu/editor.asc deleted file mode 100644 index e9ba7f799b..0000000000 --- a/text/menu/editor.asc +++ /dev/null @@ -1,19 +0,0 @@ -hy Synchronet Message Editor Commands - (* ANSI users only) -w -/? This Menu Ctrl-C Cancel Line -/S Save Message Ctrl-V Center Line -/L List Message Ctrl-R Redraw Line -/Lx List Message from Line x Ctrl-X Delete Line -/E Edit Last Line Ctrl-Y * Delete to End of Line -/Ex Edit Line x Ctrl-W Delete Word Left -/D Delete Last Line Ctrl-D * Delete Word Right -/Dx Delete Line x Ctrl-B * Move to Beginning of Line -/I Insert Line Before Last Ctrl-E * Move to End of Line -/Ix Insert Line Before Line x Ctrl-N * Move to Next Word -/T Edit Message Title Ctrl-\ * Move to Previous Word - Ctrl-F * Move Cursor Position Forward -/ABT Abort Message Ctrl-[ * Move Cursor Position Backward -/CLR Clear Message (Start Over) Ctrl-Minus * Toggle Insert/Overwrite Mode -/ATTR Menu for ^Ax Sequences Ctrl-Ax * Type /ATTR for more info -n \ No newline at end of file diff --git a/text/menu/exempt.asc b/text/menu/exempt.asc deleted file mode 100644 index 9473b704c3..0000000000 --- a/text/menu/exempt.asc +++ /dev/null @@ -1,7 +0,0 @@ -A=Anonymous H= O= V= -B= I=Interrupt Nodes P=Permanent W= -C=Chat Page J=Chat Cost Q=Quiet/Anon Node X=Xtrn Program Cost -D=Download Cost K= R=Remove Files Y= -E=Expire by Time L=Logons S=NetMail Cost Z= -F=CR/FR/RR NetMail M=Modem Rate T=Time Online -G=Multiple Nodes N=Node Locking U= diff --git a/text/menu/flags1.asc b/text/menu/flags1.asc deleted file mode 100644 index 582f3b131c..0000000000 --- a/text/menu/flags1.asc +++ /dev/null @@ -1,7 +0,0 @@ -A= H= O= V= -B= I= P= W= -C= J= Q= X= -D= K= R= Y= -E= L= S= Z= -F= M= T= -G= N= U= diff --git a/text/menu/flags2.asc b/text/menu/flags2.asc deleted file mode 100644 index 582f3b131c..0000000000 --- a/text/menu/flags2.asc +++ /dev/null @@ -1,7 +0,0 @@ -A= H= O= V= -B= I= P= W= -C= J= Q= X= -D= K= R= Y= -E= L= S= Z= -F= M= T= -G= N= U= diff --git a/text/menu/flags3.asc b/text/menu/flags3.asc deleted file mode 100644 index 582f3b131c..0000000000 --- a/text/menu/flags3.asc +++ /dev/null @@ -1,7 +0,0 @@ -A= H= O= V= -B= I= P= W= -C= J= Q= X= -D= K= R= Y= -E= L= S= Z= -F= M= T= -G= N= U= diff --git a/text/menu/flags4.asc b/text/menu/flags4.asc deleted file mode 100644 index 582f3b131c..0000000000 --- a/text/menu/flags4.asc +++ /dev/null @@ -1,7 +0,0 @@ -A= H= O= V= -B= I= P= W= -C= J= Q= X= -D= K= R= Y= -E= L= S= Z= -F= M= T= -G= N= U= diff --git a/text/menu/info.wip b/text/menu/info.wip deleted file mode 100644 index 3e5f12920c..0000000000 --- a/text/menu/info.wip +++ /dev/null @@ -1,21 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=15 -!|M=Information -!|L=4590 -!|T=180 -!|W=4050 -!|H=4350 -!|B=12632256 -!| -!|[Form] -!|001=0B`t`20`20`100`60`1`Text Files`0`12632256`MS Sans Serif`8.25`Text Files`DETAIL.ICO -!|002=0B`y`140`20`100`60`2`Your Statistics`0`12632256`MS Sans Serif`8.25`Your Stats`CATPLUS.ICO -!|003=0B`i`20`100`100`60`3`System Information`0`12632256`MS Sans Serif`8.25`System`INFO.ICO -!|004=0B`l`140`100`101`59`4``0`12632256`MS Sans Serif`8.25`Calls Today`PHONE.ICO -!|005=0B`u`20`180`100`60`5`List Users`0`12632256`MS Sans Serif`8.25`List Users`LIST.ICO -!|006=0B`q`140`180`100`60`6`Quit to Main Menu`0`12632256`MS Sans Serif`8.25`Quit`EXIT.ICO -!| -$0E \ No newline at end of file diff --git a/text/menu/keyboard.wip b/text/menu/keyboard.wip deleted file mode 100644 index a26ff67770..0000000000 --- a/text/menu/keyboard.wip +++ /dev/null @@ -1,42 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=8 -!|M=Keyboard -!|L=2910 -!|T=1440 -!|W=4725 -!|H=1875 -!|B=12632256 -!| -!|[Form] -!|001=0B`q`10`10`20`20`1``0`255`MS Sans Serif`8.25`Q` -!|002=0B`w`40`10`20`20`2``0`12632256`MS Sans Serif`8.25`W` -!|003=0B`E`70`10`20`20`3``0`12632256`MS Sans Serif`8.25`E` -!|004=0B`r`100`10`20`20`4``0`12632256`MS Sans Serif`8.25`R` -!|005=0B`T`130`10`20`20`5``0`12632256`MS Sans Serif`8.25`T` -!|006=0B`y`160`10`20`20`5``0`12632256`MS Sans Serif`8.25`Y` -!|007=0B`u`190`10`20`20`6``0`12632256`MS Sans Serif`8.25`U` -!|008=0B`i`220`10`20`20`7``0`12632256`MS Sans Serif`8.25`I` -!|009=0B`o`250`10`20`20`8``0`12632256`MS Sans Serif`8.25`O` -!|010=0B`p`280`10`20`20`9``0`12632256`MS Sans Serif`8.25`P` -!|011=0B`a`20`40`20`20`10``0`12632256`MS Sans Serif`8.25`A` -!|012=0B`S`50`40`20`20`11``0`12632256`MS Sans Serif`8.25`S` -!|013=0B`d`80`40`20`20`12``0`12632256`MS Sans Serif`8.25`D` -!|014=0B`f`110`40`20`20`13``0`12632256`MS Sans Serif`8.25`F` -!|015=0B`g`140`40`20`20`14``0`12632256`MS Sans Serif`8.25`G` -!|016=0B`h`170`40`20`20`15``0`12632256`MS Sans Serif`8.25`H` -!|017=0B`j`200`40`20`20`16``0`12632256`MS Sans Serif`8.25`J` -!|018=0B`k`230`40`20`20`17``0`12632256`MS Sans Serif`8.25`K` -!|019=0B`l`260`40`20`20`18``0`12632256`MS Sans Serif`8.25`L` -!|020=0B`Z`30`70`20`20`20``0`12632256`MS Sans Serif`8.25`Z` -!|021=0B`x`60`70`20`20`21``0`12632256`MS Sans Serif`8.25`X` -!|022=0B`c`90`70`20`20`22``0`12632256`MS Sans Serif`8.25`C` -!|023=0B`v`120`70`20`20`23``0`12632256`MS Sans Serif`8.25`V` -!|024=0B`b`150`70`20`20`24``0`12632256`MS Sans Serif`8.25`B` -!|025=0B`n`180`70`20`20`25``0`12632256`MS Sans Serif`8.25`N` -!|026=0B`m`210`70`20`20`26``0`12632256`MS Sans Serif`8.25`M` -!|027=0B`|M`240`70`40`20`27``0`12632256`MS Sans Serif`8.25`Enter` -!| -$0E \ No newline at end of file diff --git a/text/menu/login.wip b/text/menu/login.wip deleted file mode 100644 index 66a7da29d3..0000000000 --- a/text/menu/login.wip +++ /dev/null @@ -1,20 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=15 -!|M=@BBS@ -!|L=1650 -!|T=525 -!|W=4050 -!|H=3225 -!|B=12632256 -!| -!|[Form] -!|001=0T`rate`20`20`220`20`1``0`12632256`MS Sans Serif`8.25`Connected at @BPS@bps`1`2 -!|002=0B`l`20`60`100`60`0`Test`0`12632256`MS Sans Serif`8.25`Login`WELCOME.ICO -!|003=0B`h`140`60`100`60`1`Test`0`12632256`MS Sans Serif`8.25`Hang-up`CANCEL.ICO -!|004=0B`g`20`140`100`30`2`Test`0`12632256`MS Sans Serif`8.25`Guest` -!|005=0B`n`140`140`100`30`3`Test`0`12632256`MS Sans Serif`8.25`New Account` -!| -$0E \ No newline at end of file diff --git a/text/menu/logoff.asc b/text/menu/logoff.asc deleted file mode 100644 index 21495b84aa..0000000000 --- a/text/menu/logoff.asc +++ /dev/null @@ -1,6 +0,0 @@ -lnbhLog off requested on c@DATE@b at c@TIME@ - -Time used: w@TUSED@ - -gThank you for calling y@BBS@g, another fine Synchronet BBS... -n diff --git a/text/menu/logoff.msg b/text/menu/logoff.msg deleted file mode 100644 index d0e0fe764a..0000000000 --- a/text/menu/logoff.msg +++ /dev/null @@ -1,28 +0,0 @@ -l -nk0c1��3��1�y7�������hr2�w1���ny7��hr6�w3��r7��w3��r7�w3�y5�r7�y5����7�5���w1�y5�����������������������������������������nk -h3��nc3�1�y7�c3�y7�������hw1�����r6�w3��y5�w3��y5���w3�y5��w1�y5�����w1�y5��������������������������������������r7�y5���nk -h1���3�1�3�nc1���3�y7���r�y�r�y���hw1��r7�6�w3��y5�w3�����y5�r7�y5�w3�y5����w3�y5������w3�y5��������w3�y5���������r7�y5�����������r7�y5�nk -h0�1��0��r�k1��������3�ny7�c3�1�hk3�nc1�y7�c3�y7���r�y��hr6�ny7�hw1�ny7�hw1�3�����y5�w3����y5�r7�w3����r7�w3�r7�w3�r7����y5����������������������nk -h0��r�k�nk3�h0�1��0��nk3��h1��������3�1��3��1��3�1�3�nc1���3�1��r7�y��c3�y7�r�y������hw1��r2�w1��r6��w1�r6�7��w3�r7�w3�y5����������w3��y5��w3�y5��nk -h1������0�1�����0�1����0����1���0���nk3�����h0�nk3�h0�nk3��hr0�k��r�k1�������3�1�3�����nc1�r7��y��hr2�w1�r6�7�w3�y5�r7��w3�y5�r7�w3�y5����r7�y5��nk -h3�nc1�hk3�1�3��1�3���1�������0���1��0�1�0�1�0��nk3�h0�����nk3�h0���nk3��h0���nk3��h0�r�nk3��hr0�k�1�������nc1�3�r7�y��hr6�w3�r7�w3�r7�w3�r7�w3�y5�r7����w3�y5��nk -h3������1��3�1�3�����nc1�hk�3�1��������0����nk3��������h0���nk3�h0�r�k����r�k�1���r0�k1��r0�k1����3�nc1�r7�y�hw1�r6�w3�r7��y5�r7��y5��r7��y5��nk -h3�nc1�hk3�nc1�hk3���1�����r0���nk3�h0�nk3�h0���nk0������������������h�nk0��������h�����nk3��h0�1��3���nc1�hk3�nc1�r7�y����hr6��7��y5��w3�r7�y5��nk -h1�����r0���k�nk3��h0��nk0����������������h����nk0�h����������nk0�����h�����������1�3�nc1��y7�c3�r7�y�����hw1�r7���y5��w3�nk -hr0������nk3�h0����nk0��h�nk0�����������h��n�r6�c7�w�nk7�h0���4���6�w�n�0�7�nc7�hk0�nk0�����h��6�4��0��7�c1�w3�r7�ny7�r�c1��3�r7��y���r�y��r�hw1�3�r7�y5�nk -hr0���nk3��h0�������nk0����������h��nk7�y�hw3�6�0�7�0�k7�4������0�4��0�nk0�������h��4�nb7�hk6�4�0�nk7�hr�w�y�w1��y5�w3��nw7�hn�y7�nr7�y�hw1�r6����w1�r6�w3��nk -hr0��nk3�hr0�nk3��h0�����nk0���������h��3�ny7�hw3�7�����6�c7�nk7�h4���nb7���hk4�0����nk0��h���4�nb7�hk4�6�nb7�hk6�nk7�c�hw�1��3�1�7�1�nw7�h1��3�y5��w1�r6�7�y5�r6�y5�w3��r7�nk -hr0�k1�r0��nk3��h0���nk0�������h���nk3�h�nr7�y�hw�0�1����7�1�7��c1�k6�4��nb7�hk4�nb7�hk6�4���6�4�����6�4���r6�w7�1�7��1�7�1�y7�w1�3�r6��7�y5�r6�7�w3��y5����w1�y5�nk -h3�1�r0�nk3��h0����nk0�����h�nk3�h�nc1�hk�r0�k3�r6�7�w3�1�0�1��3�7��1�7����r6�k7�4��nb7�hk4�nb7��hk6�4����6�4�7�nw7�h0�7�1���3�r7�w3�r7�ny7�r�y�hr6���y5��w1�3�1������3�nk -y7���hk3��1��r0�k1�r0�k����nk3��hr0��k3�ny7���r�h�w3��7�0��1��7�������6�0�7��c���nc7�hw6�7���1�0�7�1�r7�y5�r7�w3�r6��7����y5�w1���3��1��3�1���y5�w1�y5�nk -hr7�6�w1�r6�2�w1�nc1�hk���3�1�r0�nk3�h0��nk3��hr0�k1�3�nc3�y7�r�h6�7��nw7�h1�nw7�h��0��7��0�7���0���7�0��7��1�r7�6�ny7�hw1�ny7�r�h6�7�w1�r7�w1�r7��y5�w1�r7�y5��w1��r7�y5����r7��y5�w1��nk -hw3���r7�6�7�w3�nr7�h6�y5�r6�ny7�c1�hk3�1�r0�nk3�h0�����r�k1��3�nc3�1�r7����h6�w3�nr7��h6��nr7�h6�c1�nr7�c1�k7�h1��3�ny7�r��c1�r7�hw1�nc1�hw3�r6�7�w3��nr7�h6��w3�y5�w3�r6�w1�r6�w3�r6�w3��r7�w1������nk -hw3�y5�r7�w3�y5�r7�y5�r7�w3���nr7�y���hk3�nc3�hk1��0�nk3�h0���nk3�h0�nk3���h0��nk3���h0��nk3�h�1�nc3�hk1�3��ny7�c1�hk3�nr7�y��hw1�3�r7�w1�3�nr7�y�hr6�ny7�hr6��w1�r6�w3�1�3���r7�y5��w1��3��1�3��1��nk -hw3��y5��w3�y5�w3�y5��r7�w3����ny7�hw3�nc3�1���3�hk�1���nk3�h1���nc1�hk��0�1�3���w�nr7�hk3�r6�ny7��hw1�nr7�y�hw1�nr7���h6�nr7�h6�7��6�nr7�h6���7�6�7���w3��1����3���1��7�1��nk -hr7��w3�y5���w3�y5��r7�w3�r7��w3���1�ny7�hw3�1�ny7�r�hw3�ny7��hw1��nr7�hy5�r7�ny7�hw3�ny7�hr6�ny7���hw1�ny7�r�hw3�1�ny7�r�h6�nr7�h6�ny7�hr6���ny7�hw1�r6��w1�r6�w1�3���y5��r7��w1����������3�1���nk -hr7��w3�y5�������r7�y5�r7�y5�w3�y5�w3�r7�y5�w3���r6��w3��1��r6�w1�ny7�hr6��w1�r7�6�w1�r6��ny7�hw1��3��1�r6���w1�r6��w1�3�r6�7�w3��r7�y5��w1�y5��w1��y5�w1��3�1�7�1�3��1�3�1�3�1�nk -hr7�6�7�w3�r7�w3�y5��r7�w3�r7�y5�r7�y5���r7��y5���nw7�hr�y5�r7�w3�r7�w3����r7�w3����r7�6�w3����r6�w3�r7�w3��r6�7�w3�r7�y5�w1�y5�r7�y5���w1�y5�w1����y5�w1�����3��1�������nk -hw�r7���w3�r7�w3��y5�r7�y5��w3�y5�w1�y5��w1�y5��r7�y5��w1�r7�y5�r7���y5�r7��w3���r7�w3����r7�w3�r7��w3�r7��y5�w1�r7�y5�r7�y5�w1��������������������������nk -hr6�w1�r7�y5�r7��y5�w3�y5�w3��r7�y5������w1�y5����w1�y5���nw7�hy5��r7�y5��w1����y5��w1��3�r7��w3�r7�y5�r7�y5�r7�w1����y5�w1�y5��w1������3�1�3�1����3�1������3�nk -nw0 -lhyBig Brother is watching... diff --git a/text/menu/logon.asc b/text/menu/logon.asc deleted file mode 100644 index f98ccd8cb1..0000000000 --- a/text/menu/logon.asc +++ /dev/null @@ -1,23 +0,0 @@ -nl - - -nhbWelcome to... - - -n���nh��˿ n�� nh˿ n���nh� ˿ n���nh��˿ n�� nh˿ n���nh��˿ n���nh��˿ n���nh� ˿ n���nh��˿ n���nh��Ϳ -nc���nhc��˿ nc��nhc����� nc�� nhc� �� nc������nhc��δ nc���nhc���� nc�� nhc�� nc�� nhc� �� nc���nhc��nc�nhc�� -nb���nhb���� nb�nhb�� nb�� nhb���� nb���nhb���� nb�� nhb�� nb�� nhb��� nb���nhb���� nb�� nhb���� nb���nhb���� nb�nhb�� - -��������� �������� ������� -���� ��� ��� ��� ��� -��������� �������� ������� -���� ��� ��� ������� -��������� �������� ������� - - -�nbڿ nhb� nb��nhb�Ŀ nb��nhb�Ŀ nb��nhb�Ŀ nb�nhb� nb��nhb�Ŀ nb��nhbĿ � nb��nhb�¿ nb��nhb�¿ -�nc�� nhc� nc��nhc� nc��nhc��� nc��nhc�¿ nc�nhc� ncô nhc� ncô nhc� � nc��nhc��� nc��nhc��� -�n�nh��� n��nh��� n�� nh� n��nh��� n�nh� n��nh��� n�� nh��� n��nh��� o n��nh��� -n - - diff --git a/text/menu/mailread.asc b/text/menu/mailread.asc deleted file mode 100644 index ec39e205fc..0000000000 --- a/text/menu/mailread.asc +++ /dev/null @@ -1,11 +0,0 @@ -0lnc4������������������������k�0 -4c� hyReading Mail Menu nk4�0 -4c�k������������������������b0�������������������������� -����� -� hy<CR> ngNext message�b� hyA ngReply to last message b� -� hy- ngPrevious message b� hyF ngForward mail�b� -� hyL ngList messages b� hyD ngDelete last message b� -� hyR ngReread last msg b��������������������������� -� hy# ngGo to message # b� b� -� hyN ngNext unread msg b� hyQ ngQuit to Main section b� -���������������������������������������������������n diff --git a/text/menu/mailread.rip b/text/menu/mailread.rip deleted file mode 100644 index bdd8279207..0000000000 --- a/text/menu/mailread.rip +++ /dev/null @@ -1,15 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Reading Mail<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL360000<><> -!|1B0000020QPC010E000F080900000000000000|Y00000100|1U0M161K1G0000<><CR><>^M -!|1U0M1K1K1U0000<>-<>-|1U0M1Y1K280000<>L<>L -!|1B0000020QPE010E000F080400000000000000|1U0M2Q1K300000<>Q<>Q -!|1B0000020QPC010E000F080900000000000000|1U0M2C1K2M0000<>#<>+ -!|1U9616A41G0000<>R<>R|1U961KA41U0000<>A<>A|1U961YA4280000<>F<>F -!|1U962CA42M0000<>D<>D|c00|@1Y16Next Message|@1Y1KPrevious Message -!|@1Y1YList Message Titles and Authors|@1Y2QQuit to Main Section -!|@1Y2CGo to Message Number|@AK16Reread Last Message -!|@AK1KAuto-Reply to Last Message|@AK1YForward Mail to Another User -!|@AK2CDelete Last Message|w000F271610|10000$ETW$|#|#|# - diff --git a/text/menu/mailread.wip b/text/menu/mailread.wip deleted file mode 100644 index 348d8ae5f9..0000000000 --- a/text/menu/mailread.wip +++ /dev/null @@ -1,29 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=4 -!|M=Reading E-mail -!|L=3885 -!|T=3960 -!|W=5550 -!|H=1470 -!|B=12632256 -!| -!|[Form] -!|001=0B`-`10`10`40`40`1`Previous Message`0`12632256`MS Sans Serif`8.25``PREV.ICO -!|002=0B`|M`60`10`40`40`2`Next Message`0`12632256`MS Sans Serif`8.25``NEXT.ICO -!|003=0B`l`160`10`40`40`3``0`12632256`MS Sans Serif`8.25``LIST.ICO -!|004=0B`r`110`10`40`40`4``0`12632256`MS Sans Serif`8.25``BACK.ICO -!|005=0B`a`210`10`40`40`5`Reply to Last E-mail Message`0`12632256`MS Sans Serif`8.25``EDIT.ICO -!|006=0B`q`310`10`40`40`7`Delete Last E-mail Message`0`12632256`MS Sans Serif`8.25``EXIT.ICO -!|007=0B`d`260`10`40`40`7``0`12632256`MS Sans Serif`8.25``DELETE.ICO -!|008=0T`prev`10`50`40`15`8``0`12632256`MS Sans Serif`8.25`Prev`1`0 -!|009=0T`Next`60`50`40`15`9``0`12632256`MS Sans Serif`8.25`Next`1`0 -!|010=0T`reread`110`50`40`15`10``0`12632256`MS Sans Serif`8.25`Again`1`0 -!|011=0T`list`160`50`40`15`11``0`12632256`MS Sans Serif`8.25`List`1`0 -!|012=0T`reply`210`50`40`15`12``0`12632256`MS Sans Serif`8.25`Reply`1`0 -!|013=0T`delete`260`50`40`15`13``0`12632256`MS Sans Serif`8.25`Delete`1`0 -!|014=0T`quit`310`50`40`15`14``0`12632256`MS Sans Serif`8.25`Quit`1`0 -!| -$0E \ No newline at end of file diff --git a/text/menu/main.asc b/text/menu/main.asc deleted file mode 100644 index d490a512c3..0000000000 --- a/text/menu/main.asc +++ /dev/null @@ -1,20 +0,0 @@ -0lnc4�����������������������k�0 -4c� hySynchronet Main Menu nk4�0 -4c�k�����������������������0 -4b0����4 hwRead/Post Messages nb����4 hwMessage Area Selection nb�����4 hwElectronic Mail nb����� -������� -� hyN ngNew message scan�b� hyJ ngJump to new msg area b� hyE ngRead/Send E-mail�b� -� hyR ngRead message prompt b����������������������������� -� hyZ ngContinuous new scan b��hy* ngList sub-boards b������4 hwOther Commands nb����� -� hyB ngBrowse new scan�b��hy/* ngList groups�b��� -� hyQ ngQWK packet transfer b� hy{ } # ngSelect sub-board b� hyD ngDefault user config b� -��������������������������� hy[ ] /# ngSelect group�b� hy& ngMessage scan config b� -� hyP ngPost a message�b��� hyU ngUser lists�b� -� hyA ngPost auto-message�b����������4 hwGo to nb���������� hyI ngInformation�b� -����� hyM ngMinute Bank�b� -������4 hwMessage Search nb����� hyT ngFile Transfer section b� hy/L ngNode activity�b� -��� hyG ngText file section�b� hy^K ngCtrl-key Menu�b� -� hyF ngFind text in messages b� hyC ngChat section�b��������������������������� -� hyS ngScan for msgs to you b� hyX ngExternal programs�b� hyO ngLogoff BBS (or /O) b� -������� -4 hyAnytime: cCtrl-U nc4Who's online hCtrl-P nc4Send private msg hCtrl-C nc4Abort cmd/text n diff --git a/text/menu/main.rip b/text/menu/main.rip deleted file mode 100644 index 3333ca77f9..0000000000 --- a/text/menu/main.rip +++ /dev/null @@ -1,48 +0,0 @@ - -!|1K|w0010271610|W00|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Synchronet Main Menu<>|1B0000020PWW050E000F080700000000000000 -!|1U0710HL7T0000<><>|c00|Y00000100|1B0000020QPI010E000F080900000000000000 -!|1U0Y1E1W1O2800<> P <>P|1U0Y1S1W222A00<> R <>R -!|1U0Y261W2G2600<> N <>((Make a choice::ns@_S_ub-board,ng@_G_roup,na@_A_ll,^\ -M@_Q_uit)) -!|1U0Y2K1W2U2I00<> Z <>((Make a choice::zs@_S_ub-board,zg@_G_roup,za@_A_ll,^\ -M@_Q_uit)) -!|1U0Y2Y1W381U00<> B <>((Make a choice::bs@_S_ub-board,bg@_G_roup,ba@_A_ll,^\ -M@_Q_uit)) -!|1U0Y3C1W3M2900<> Q <>Q -!|1U0Y3Q1W401YY0<> F <>((Make a choice::fs@_S_ub-board,fg@_G_roup,fa@_A_ll,^\ -M@_Q_uit)) -!|1U0Y441W4E2B00<> S <>((Make a choice::ss@_S_ub-board,sg@_G_roup,sa@_A_ll,^\ -M@_Q_uit)) -!|1U0Y4I1W4S1T00<> A <>((Choose one::ar@_R_ead,aw@_W_rite,^M@_Q_uit)) -!|1B0000020QPI010E000F080100000000000000|1U0Y5A1W5K1600<> * <>* -!|1U0Y5O1W5Y2500<> M <>/* -!|1U0Y621W6C2100<> I <>((Choose one::ii@_S_ystem,iv@_V_ersion,iy@_Y_our Stat\ -s,is@S_u_b-board,^M@_Q_uit)) -!|1U0Y6G1W6Q2D00<> U <>((Choose one::ul@_L_ogons Today,us@_S_ub-board,ua@_A_\ -ll,^M@_Q_uit)) -!|1U0Y6U1W742400<> L <>/L|1U0Y781W7I2200<> J <>J -!|1B0000020QPI010E000F080300000000000000|1U8W1E9U1O1200<>&<>& -!|1U8W1S9U222700<>O<>O$MKILL$|1U8W269U2G0L00<> ^U <>^U -!|1U8W2K9U2U0G00<> ^P <>^P|1U8W2Y9U380B00<> ^K <>^K -!|1B0000020QPE010E000F080C00000000000000|1U7U3Y8S483G00<>{<>{ -!|1U8W3Y9U483I00<>}<>}|1U7U4C8S4M2K00<>[<>[|1U8W4C9U4M2L00<>]<>] -!|1B0000020QPI010E000F080200000000000000|1U8W5A9U5K1X00<> E <>E -!|1U8W5O9U5Y2C00<> T <>T|1U8W629U6C1Z00<> G <>G|1U8W6G9U6Q2G00<> X <>X -!|1U8W6U9U741V00<> C <>C|1U8W789U7I1W00<> D <>D|@2S11Message Functions|c0F -!|@2T12Message Functions|c00|@B111Control Functions|c0F|@B212Control Functions -!|c00|@2N4VListing Functions|c0F|@2O4WListing Functions|c00 -!|@AV3HSub-board Selection|c0F|@AW3ISub-board Selection|c00 -!|@B44VOther Selections|c0F|@B54WOther Selections|c00|@281FPost Message -!|@281TRead Messages|@2827New Message Scan|@282LContinuous Message Scan -!|@282ZBrowse Message Scan|@283DQWK Packet Transfer|@283RFind Text in Messages -!|@2845Search for Your Messages|@284JRead/Write Auto-Message -!|@285BSub-boards within Group|@285PMessage Groups|@2863Information Commands -!|@286HUser Lists|@286VList All Nodes|@2879Jump to a Message Area -!|@AA1FConfiguration Commands|@AA1TLogoff (also /0) -!|@AA27List Users Online (Anywhere)|@AA2LSend Message to Another Node -!|@AA2ZControl Key Command Menu|@AA3YChange Sub, or Type Number -!|@AA4CChange Group, or Type /Number|@AA5BElectronic Mail Commands -!|@AA5PFile Transfers|@AA63General Text File Sections|@AA6HExternal Programs -!|@AA6VChat Commands|@AA79Account Default Configuration|100AC$ETW$|#|#|# - diff --git a/text/menu/maincfg.asc b/text/menu/maincfg.asc deleted file mode 100644 index f7182823ce..0000000000 --- a/text/menu/maincfg.asc +++ /dev/null @@ -1,8 +0,0 @@ -lnc4�����������������������������k�0 -4c� hyMessage Scan Configuration nk4�0 -4c�k�����������������������������b0������������������������������������ -����� -� hyN ngNew-scan configuration�b� hyS ngYour message scan config b� -� hyP ngSet new-scan pointers�b������������������������������� -� hyI ngReinitialize new-scan pointers b� hyQ ngQuit to Main menu�b� -������������������������������������������������������������������n diff --git a/text/menu/maincfg.rip b/text/menu/maincfg.rip deleted file mode 100644 index dacf7d2e58..0000000000 --- a/text/menu/maincfg.rip +++ /dev/null @@ -1,12 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Configuration Menu<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL2E0000<><> -!|1B0000020QPE010E000F080300000000000000|Y00000100|1U0M161K1G0000<>C<>C -!|1U0M1K1K1U0000<>R<>R|1U9616A41G0000<>N<>N|1U961KA41U0000<>P<>P -!|1U961YA4280000<>I<>I|1B0000020QPE010E000F080400000000000000 -!|1U0M1Y1K280000<>Q<>Q|c00|@1Y16Convert Credits to Minutes -!|@1Y1KUnfiltered (Raw) Input Mode|@AK1YReinitialize Message Pointers -!|@AK16New Message Scan Configuration|@AK1KNew Message Scan Pointers -!|@1Y1YQuit to the Main Menu|w000C271610|10000$ETW$|#|#|# - diff --git a/text/menu/maininfo.asc b/text/menu/maininfo.asc deleted file mode 100644 index 40c0627e20..0000000000 --- a/text/menu/maininfo.asc +++ /dev/null @@ -1,8 +0,0 @@ -0lnc4��������������������������������k�0 -4c� hyMain Section Information Menu nk4�0 -4c�k��������������������������������b0��������������������������� -����� -� hyI ngSystem information�b� hyY ngYour statistics b� -��hy0V ngSynchronet version information b����������������������� -� hyS ngInformation on current sub-board b� hyQ ngQuit to Main menu b� -������������������������������������������������������������n diff --git a/text/menu/maininfo.rip b/text/menu/maininfo.rip deleted file mode 100644 index 9c1ce1d85b..0000000000 --- a/text/menu/maininfo.rip +++ /dev/null @@ -1,10 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Information Menu<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL2E0000<><> -!|1B0000020QPC010E000F080100000000000000|Y00000100|1U0M161K1G0000<>I<>I -!|1U0M1K1K1U0000<>V<>V|1U961KA41U0000<>S<>S|1U9616A41G0000<>Y<>Y -!|1B0000020QPE010E000F080400000000000000|1U0M1Y1K280000<>Q<>Q|c00|@1Y16System -!|@1Y1KVersion|@AK1KSub-board|@AK16Your Statistics|@1Y1YQuit to the Main Menu -!|w000F271610|10000$ETW$|#|#|# - diff --git a/text/menu/major/email.asc b/text/menu/major/email.asc deleted file mode 100644 index 8d4c1495b9..0000000000 --- a/text/menu/major/email.asc +++ /dev/null @@ -1,10 +0,0 @@ -ghThe following E-mail services are available: - -c R y=> Read message(s) -c W y=> Write a message -c E y=> Erase a message - -c S y=> Send NetMail -c U y=> Upload a file attachment -cs -Select a letter from this list, or X to exit: n \ No newline at end of file diff --git a/text/menu/major/file.asc b/text/menu/major/file.asc deleted file mode 100644 index 61780b1b3a..0000000000 --- a/text/menu/major/file.asc +++ /dev/null @@ -1,9 +0,0 @@ -ghThe following Library services are available: - -c F y=> File directory -c D y=> Download a file -c U y=> Upload a file -c S y=> Select a LIB -cs -Current LIB: @LIB@ @DIR@ -Select a letter from this list (or X to exit): n \ No newline at end of file diff --git a/text/menu/major/main.asc b/text/menu/major/main.asc deleted file mode 100644 index 9121960557..0000000000 --- a/text/menu/major/main.asc +++ /dev/null @@ -1,15 +0,0 @@ -ghPlease select one of the following: - -c T y... Teleconference -c I y... Information Center -c F y... Forums (Public Message Bases) -c E y... Electronic Mail -c L y... Library of Files -c D y... Doors (External Programs) -c A y... Account Display/Edit -c R y... Registry of Users -(c S y... System Management -)c X y... Exit System (Logoff) -cs -(TOP) -Make your selection (T,I,F,E,L,A,P,R,S,? for help, or X to exit): n \ No newline at end of file diff --git a/text/menu/major/msg.asc b/text/menu/major/msg.asc deleted file mode 100644 index 673753a6cc..0000000000 --- a/text/menu/major/msg.asc +++ /dev/null @@ -1,9 +0,0 @@ -ghWelcome, @NAME@, to @GRP@ @SUB@ - -c R y... Read messages -c W y... Write a message -c Q y... Quickscan Menu -c T y... Teleconference -c S y... Select a new Forum -cs -Select a letter from this list, or X to exit: n \ No newline at end of file diff --git a/text/menu/major/quickscn.asc b/text/menu/major/quickscn.asc deleted file mode 100644 index 6282734acf..0000000000 --- a/text/menu/major/quickscn.asc +++ /dev/null @@ -1,9 +0,0 @@ -ghQuickscan functions: - -c S y... scan through messages -c L y... list messages to you -c K y... keyword-search for messages - -c C y... configure your quickscan -cs -Select a letter from the above list, or X to exit: n \ No newline at end of file diff --git a/text/menu/major/userdefs.asc b/text/menu/major/userdefs.asc deleted file mode 100644 index 355f83e3b7..0000000000 --- a/text/menu/major/userdefs.asc +++ /dev/null @@ -1,6 +0,0 @@ -gh User-ID: @NAME@ - -c S y=> Display statistics on your account -c A y=> Display or edit account information -cs -Your choice (or 'X' to exit): n \ No newline at end of file diff --git a/text/menu/msgattr.asc b/text/menu/msgattr.asc deleted file mode 100644 index 7d8a91ea63..0000000000 --- a/text/menu/msgattr.asc +++ /dev/null @@ -1 +0,0 @@ -nhb[nhRnhb]ead, [nhPnhb]rivate, [nhAnhb]non, [nhKnhb]ill, [nhMnhb]oderated, [nhVnhb]alidated, [nhNnhb]on-purgable:n z diff --git a/text/menu/msgs.wip b/text/menu/msgs.wip deleted file mode 100644 index b76df9a9c1..0000000000 --- a/text/menu/msgs.wip +++ /dev/null @@ -1,21 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=15 -!|M=Messages -!|L=1770 -!|T=345 -!|W=4050 -!|H=4350 -!|B=12632256 -!| -!|[Form] -!|001=0B`r`20`20`100`60`1`Read Messages`0`12632256`MS Sans Serif`8.25`Read`DETAIL.ICO -!|002=0B`p`140`20`100`60`2`Post Message`0`12632256`MS Sans Serif`8.25`Post`EDIT.ICO -!|003=0B`s`20`100`100`60`3`Search Messages for Specific Text`0`12632256`MS Sans Serif`8.25`Text Search`SEARCH.ICO -!|004=0B`n`140`100`100`60`4`Search for New Messages`0`12632256`MS Sans Serif`8.25`New`FIND.ICO -!|005=0B`q`20`180`100`60`5`QWK Message Upload/Download for Offline Readers`0`12632256`MS Sans Serif`8.25`QWK`SAVE.ICO -!|006=0B`x`140`180`100`60`6`Quit to Main Menu`0`12632256`MS Sans Serif`8.25`Quit`EXIT.ICO -!| -$0E \ No newline at end of file diff --git a/text/menu/msgscan.asc b/text/menu/msgscan.asc deleted file mode 100644 index 904ca0398d..0000000000 --- a/text/menu/msgscan.asc +++ /dev/null @@ -1,19 +0,0 @@ -0lnc4������������������������k�0 -4c� hyReading Messages Menu nk4�0 -4c�k������������������������0 -4b0������4 hwRead Messages nb��������4 hwPost/Reply Messages nb������4 hwMessage Threading nb���� -������� -� hy<CR> ngNext message�b� hyP ngPost a message�b� hy< > ng-/+ by Title�b� -� hy- ngPrevious message b� hyD ngDelete a message�b� hy{ } ng-/+ by Author�b� -� hyC ngContiunous read b��������������������������� hy[ ] ng-/+ by 'To User' b� -� hyR ngReread last msg b� hyA ngReply to last message b��� -� hy# ngGo to message # b� hyM ngReply in mail to last b������4 hwOther Commands nb����� -������� -�������4 hwList Titles nb�������������4 hwSearch/Find nb������� hyB ngBypass current sub b� -����� hyI ngInformation on sub b� -� hyL ngTitles and authors b� hyY ngMessages to you�b��������������������������� -� hyT ngNext ten msg titles b� hyF ngFind text in messages b� hyQ ngQuit to Main menu�b� -������� -4 hyAnytime: cCtrl-U nc4Who's online hCtrl-P nc4Send private msg hCtrl-C nc4Abort cmd/text n -( - hyO ngOperator Commandsn diff --git a/text/menu/msgscan.rip b/text/menu/msgscan.rip deleted file mode 100644 index 65985a8162..0000000000 --- a/text/menu/msgscan.rip +++ /dev/null @@ -1,20 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0O0000<>Reading Messages<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL4G0000<><> -!|1B0000020QPE010E000F080900000000000000|Y00000100|1U0M161K1G0000<><CR><>^M -!|1U0M1K1K1U0000<>-<>-|1U0M1Y1K280000<>L<>L|1U0M2C1K2M0000<>T<>T -!|1U0M2Q1K300000<>B<>B|1U9616A41G0000<>R<>R|1U961KA41U0000<>A<>A -!|1U961YA4280000<>M<>M|1U962CA42M0000<>Y<>Y|1U0M341K3E0000<>C<>C -!|1B0000020QPC010E000F080400000000000000|1U0M3W1K460000<>Q<>Q -!|1B0000020QPC010E000F080900000000000000|1U0M3I1K3S0000<>#<> -!|1U962QA4300000<>F<>F|1U9634A43E0000<>D<>D|1U963IA43S0000<>P<>P -!|1U963WA4460000<>I<>I|c00|@1Y16Next Message|@1Y1KPrevious Message -!|@1Y1YList Message Titles and Authors|@1Y2CTitles of Next Ten Messages -!|@1Y2QBypass Current Sub-Board|@1Y34Continuous Read|@1Y3WQuit to Main Section -!|@1Y3IGo to Message Number|@AK16Reread Last Message|@AK1KReply to Last Message -!|@AK1YReply in Mail to Last Message|@AK2CTitles of Your Messages -!|@AK2QFind Text in All Messages|@AK34Delete Message|@AK3IPost a Message -!|@AK3WInformation on Sub-board|w000L271610|L1V2Z1V2Z|L1D2U1D2U|100AC$ETW$|#|# -!|# - diff --git a/text/menu/msgscan.wip b/text/menu/msgscan.wip deleted file mode 100644 index 9cacaacd79..0000000000 --- a/text/menu/msgscan.wip +++ /dev/null @@ -1,39 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=4 -!|M=Reading Messages -!|L=90 -!|T=3960 -!|W=9300 -!|H=1500 -!|B=12632256 -!| -!|[Form] -!|001=0B`-`10`10`40`40`1`Previous Message`0`12632256`MS Sans Serif`8.25``PREV.ICO -!|002=0B`|M`60`10`40`40`2`Next Message`0`12632256`MS Sans Serif`8.25``NEXT.ICO -!|003=0B`l`210`10`40`40`3``0`12632256`MS Sans Serif`8.25``LIST.ICO -!|004=0B`r`110`10`40`40`4``0`12632256`MS Sans Serif`8.25``BACK.ICO -!|005=0B`a`260`10`40`40`5`Reply to Last E-mail Message`0`12632256`MS Sans Serif`8.25``EDIT.ICO -!|006=0B`m`360`10`40`40`7`Delete Last E-mail Message`0`12632256`MS Sans Serif`8.25``NOTEPAD.ICO -!|007=0B`d`310`10`40`40`7``0`12632256`MS Sans Serif`8.25``DELETE.ICO -!|008=0T`prev`10`50`40`15`8``0`12632256`MS Sans Serif`8.25`Prev`1`0 -!|009=0T`Next`60`50`40`15`9``0`12632256`MS Sans Serif`8.25`Next`1`0 -!|010=0T`reread`110`50`40`15`10``0`12632256`MS Sans Serif`8.25`Again`1`0 -!|011=0T`list`210`50`40`15`11``0`12632256`MS Sans Serif`8.25`List`1`0 -!|012=0T`reply`260`50`40`15`12``0`12632256`MS Sans Serif`8.25`Reply`1`0 -!|013=0T`delete`310`50`40`15`13``0`12632256`MS Sans Serif`8.25`Delete`1`0 -!|014=0T`e-mail`360`50`40`15`14``0`12632256`MS Sans Serif`8.25`E-mail`1`0 -!|015=0B`t`160`10`40`40`15``0`12632256`MS Sans Serif`8.25``2NDPAGE.ICO -!|016=0T`ten`160`50`40`15`16``0`12632256`MS Sans Serif`8.25`Titles`1`0 -!|017=0B`p`410`10`40`40`17``0`12632256`MS Sans Serif`8.25``EDIT.ICO -!|018=0T`post`410`50`40`15`18``0`12632256`MS Sans Serif`8.25`Post`1`0 -!|019=0B`y`460`10`40`40`19``0`12632256`MS Sans Serif`8.25``CONTACT.ICO -!|020=0T`yours`460`50`40`15`20``0`12632256`MS Sans Serif`8.25`Yours`1`0 -!|021=0B`f`510`10`40`40`21``0`12632256`MS Sans Serif`8.25``SEARCH.ICO -!|022=0T`find`510`50`40`15`22``0`12632256`MS Sans Serif`8.25`Find`1`0 -!|023=0B`q`560`10`40`40`23``0`12632256`MS Sans Serif`8.25``EXIT.ICO -!|024=0T`quit`560`50`40`15`24``0`12632256`MS Sans Serif`8.25`Quit`1`0 -!| -$0E \ No newline at end of file diff --git a/text/menu/multchat.asc b/text/menu/multchat.asc deleted file mode 100644 index bb022f2028..0000000000 --- a/text/menu/multchat.asc +++ /dev/null @@ -1,10 +0,0 @@ -nlc4����������������������k�0 -4c� hyMultinode Chat Menu nk4�0 -4c�k����������������������b0�������������������������������������������������������� -����� -� hy/W ngWhisper to another user �b� hy/E ngToggle echo status�b� -� hy/L ngList all node activity�b� hy/A ngToggle action commands b� -� hy/* ngList Chat channels�b� hy/C ngList action commands b� -� hy/# ngChange Chat channel (# is channel number) b� hy/Q ngQuit multinode chat b� -����� -4 hyAnytime: cCtrl-U nc4Who's online hCtrl-P nc4Send private msg hCtrl-C nc4Abort cmd/text n diff --git a/text/menu/multchat.rip b/text/menu/multchat.rip deleted file mode 100644 index bd0e9484c9..0000000000 --- a/text/menu/multchat.rip +++ /dev/null @@ -1,13 +0,0 @@ - -!|1K|*|e|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Multinode Chat<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL2S0000<><> -!|1B0000020QPE010E000F080500000000000000|Y00000100|1U0M161K1G0000<>/W<>^M/P -!|1U0M1K1K1U0000<>/L<>^M/L|1U961KA41U0000<>/#<>|1U961YA4280000<>^U<>^U -!|1U962CA42M0000<>^P<>^P|1U0M1Y1K280000<>/E<>^M/E|1U9616A41G0000<>/*<>^M/* -!|1B0000020QPE010E000F080400000000000000|1U0M2C1K2M0000<>/Q<>^M/Q|c00 -!|@1Y16Whisper to another user|@1Y1KList All Nodes|@1Y1YToggle Echo Status -!|@1Y2CQuit Chat Session|@AK16List Channels|@AK1KChange Channel Number -!|@AK1YList Users Online|@AK2CSend Message to Another Node|w000E271610 -!|10000$ETW$|#|#|# - diff --git a/text/menu/namepass.wip b/text/menu/namepass.wip deleted file mode 100644 index 1965ae1c11..0000000000 --- a/text/menu/namepass.wip +++ /dev/null @@ -1,20 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=8 -!|M=Login -!|L=3555 -!|T=225 -!|W=3375 -!|H=3375 -!|B=12632256 -!| -!|[Form] -!|001=1T`name`10`30`200`30`1``0`12632256`MS Sans Serif`8.25`0`2 -!|002=0T`label`10`10`200`20`2``0`12632256`MS Sans Serif`8.25`Please enter your user name`0`0 -!|003=0B`|M`60`130`100`60`3``0`12632256`MS Sans Serif`8.25`Login`WELCOME.ICO -!|004=1T`password`10`90`200`30`2``12632256`12632256`MS Sans Serif`8.25`0`2 -!|005=0T`enter pass`10`70`160`20`5``0`12632256`MS Sans Serif`8.25`Please enter your password`0`0 -!| -$0E \ No newline at end of file diff --git a/text/menu/noyes.wip b/text/menu/noyes.wip deleted file mode 100644 index cccb3c7a73..0000000000 --- a/text/menu/noyes.wip +++ /dev/null @@ -1,20 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=8 -!|M=No or Yes -!|L=1815 -!|T=510 -!|W=3000 -!|H=2100 -!|B=12632256 -!| -!|[Form] -!|001=0T`question`10`10`170`35`1``0`12632256`MS Sans Serif`8.25`@QUESTION@`1`0 -!|002=0B`n`50`50`40`40`2``0`12632256`MS Sans Serif`8.25``CANCEL.ICO -!|003=0B`y`100`50`40`40`3``0`12632256`MS Sans Serif`8.25``DONE.ICO -!|004=0T`no`50`90`40`15`4``0`12632256`MS Sans Serif`8.25`No`1`0 -!|005=0T`yes`100`90`40`15`5``0`12632256`MS Sans Serif`8.25`Yes`1`0 -!| -$0E \ No newline at end of file diff --git a/text/menu/number.wip b/text/menu/number.wip deleted file mode 100644 index 0730b2f393..0000000000 --- a/text/menu/number.wip +++ /dev/null @@ -1,26 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=8 -!|M=Pick a Number -!|L=1605 -!|T=555 -!|W=1575 -!|H=2475 -!|B=12632256 -!| -!|[Form] -!|001=0B`1`10`10`20`20`1``0`12632256`MS Sans Serif`8.25`1` -!|002=0B`2`40`10`20`20`2``0`12632256`MS Sans Serif`8.25`2` -!|003=0B`3`70`10`20`20`3``0`12632256`MS Sans Serif`8.25`3` -!|004=0B`4`10`40`20`20`4``0`12632256`MS Sans Serif`8.25`4` -!|005=0B`5`40`40`20`20`5``0`12632256`MS Sans Serif`8.25`5` -!|006=0B`6`70`40`20`20`6``0`12632256`MS Sans Serif`8.25`6` -!|007=0B`7`10`70`20`20`7``0`12632256`MS Sans Serif`8.25`7` -!|008=0B`8`40`70`20`20`8``0`12632256`MS Sans Serif`8.25`8` -!|009=0B`9`70`70`20`20`9``0`12632256`MS Sans Serif`8.25`9` -!|010=0B`q`10`100`32`32`10``0`12632256`MS Sans Serif`8.25``CANCEL.ICO -!|011=0B`|M`60`100`32`32`11``0`12632256`MS Sans Serif`8.25``DONE.ICO -!| -$0E \ No newline at end of file diff --git a/text/menu/pause.wip b/text/menu/pause.wip deleted file mode 100644 index 5f4a9dadd9..0000000000 --- a/text/menu/pause.wip +++ /dev/null @@ -1,15 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=12 -!|M=Continue -!|L=1695 -!|T=615 -!|W=2925 -!|H=1275 -!|B=12632256 -!|[Form] -!|001=0B`|M`10`10`80`40`1``0`12632256`MS Sans Serif`8.25`OK` -!|002=0B`n`100`10`80`40`2``0`12632256`MS Sans Serif`8.25`Cancel` -$0E \ No newline at end of file diff --git a/text/menu/pcboard/brdm.asc b/text/menu/pcboard/brdm.asc deleted file mode 100644 index 67c74c8c1f..0000000000 --- a/text/menu/pcboard/brdm.asc +++ /dev/null @@ -1,21 +0,0 @@ -nlk4������������������������������������������������������������������������������nhb4�0 -nk4� nhc4Date: nhg4@SYSDATE@ nh4M a i n M e n u nhc4Time: nhg4@SYSTIME@0nhb4 �0 -nk4�nc4� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � �nhb4�0 -nk4� nh4(nhr4Fnh4)ile Directories (nhr4Lnh4)ocate a filename (nhr4EXTnh4)ended file info nhb4�0 -nk4� nh4(nhr4Dnh4)ownload a file (nhr4Nnh4)ew file scan (nhr4VIEWnh4) a file before d/l nhb4�0 -nk4� nh4(nhr4Unh4)pload a file (nhr4Znh4)ippy Text Search (nhr4BATCHnh4) transfer menu nhb4�0 -nk4� nh4(nhr4Tnh4)emp archive menu (nhr4REMOVEnh4) or edit a file nhb4�0 -nk4� nhb4�0 -nk4� nh4(nhr4Jnh4)oin a conference (nhr4Anh4)djust pointers (nhr4TSnh4) Text search msgs. nhb4�0 -nk4� nh4(nhr4Enh4)nter a message (nhr4Cnh4)omment to SysOp (nhr4QWKnh4) Transfer QWK mail nhb4�0 -nk4� nh4(nhr4Rnh4)ead messages (nhr4Ynh4)our messages (nhr4AUTOnh4) message nhb4�0 -nk4� nh4(nhr4RNnh4) Read New messages (nhr4RCnh4) Read New Continuous (nhr4SELECTnh4) confs. to scan nhb4�0 -nk4� nhb4�0 -nk4� nh4(nhr4Mnh4)ail Send/Receive (nhr4Xnh4)pert mode toggle (nhr4Onh4) Page SysOp nhb4�0 -nk4� nh4(nhr4Bnh4)ulletins (nhr4Gnh4)oodbye (Logoff) (nhr4Inh4)nitial logon screen nhb4�0 -nk4� nh4(nhr4Snh4)ystem Information (nhr4Wnh4) Change your info (nhr4Pnh4)rivate node message nhb4�0 -nk4� nh4(nhr4Vnh4)iew your statistics nhb4�0 -nk4� nhb4�0 -nk4� nh4(nhy4CHATnh4) with other users (nhy4OPENnh4) a door nhb4�0 -nk4� nh4(nhy4NEWSnh4) Display system news (nhy4USERnh4) List conference members nhb4�0 -nk4�nhb4������������������������������������������������������������������������������n diff --git a/text/menu/pcboard/welcome.asc b/text/menu/pcboard/welcome.asc deleted file mode 100644 index 9a52c68c24..0000000000 --- a/text/menu/pcboard/welcome.asc +++ /dev/null @@ -1,22 +0,0 @@ -nl -nh�n������������������������������������������ -������������������������������������������� -������������������������������������������� -������������������������������������������� - nk5�����������������������������������������������������������������������nhm5�0 -nhnh nh nh nh nk5� nh5���� ��� ���� ��� � nhm5�0 -nhnh nh nh nh nk5� nh5� � � � � � � � � nhm5�0 -nhnh nh nh nh nk5� nh5S Y N C H R O N E T ���� � ���� � � ���� ���� ���� nhm5�0 -nhnh nh nh nh nk5� V e r s i o n 2 nh5� � � � � � � � � � � � ��� nhm5�0 -nhnh nh nh nh nk5� nh5��� ��� ���� ��� � �� � � �� nhm5�0 -nhnh nh nh nh nk5�nhm5�����������������������������������������������������������������������0 -nh�nhk������������������������������������������ -������������������������������������������� -�n������������������������������������������ -������������������������������������������� -������������������������������������������� - -�nhk2�����������������������������������������nhg2�0 -nh�nhk2� nh2Your SysOp is: { this space for rent } nhg2�0 -nh�nhk2�nhg2�����������������������������������������0 -n \ No newline at end of file diff --git a/text/menu/privchat.asc b/text/menu/privchat.asc deleted file mode 100644 index c3fc712358..0000000000 --- a/text/menu/privchat.asc +++ /dev/null @@ -1,8 +0,0 @@ -0lnc4��������������������k�0 -4c� hyPrivate Chat Menu nk4�0 -4c�k��������������������b0��������������������������������������� -����� -� hy/L ngList all node activity b� hyCtrl-U ngWho's online�b� -� hy/E ngToggle echo status�b� hyCtrl-P ngSend private message b� -� hy/Q ngQuit private chat�b��� -������������������������������������������������������������n diff --git a/text/menu/privchat.rip b/text/menu/privchat.rip deleted file mode 100644 index 1bde8bc148..0000000000 --- a/text/menu/privchat.rip +++ /dev/null @@ -1,11 +0,0 @@ - -!|1K|*|e|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Private Chat<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL2E0000<><> -!|1B0000020QPE010E000F080500000000000000|Y00000100|1U0M161K1G0000<>/L<>^M/L -!|1U9616A41G0000<>^U<>^U|1U961KA41U0000<>^P<>^P|1U0M1K1K1U0000<>/E<>^M/E -!|1B0000020QPE010E000F080400000000000000|1U0M1Y1K280000<>/Q<>^M/Q|c00 -!|@1Y16List All Nodes|@1Y1KToggle Echo Status|@1Y1YQuit Chat Session -!|@AK16List Users Online|@AK1KSend Message to Another Node|w000E271610 -!|10000$ETW$|#|#|# - diff --git a/text/menu/qwk.asc b/text/menu/qwk.asc deleted file mode 100644 index c0d080a101..0000000000 --- a/text/menu/qwk.asc +++ /dev/null @@ -1,13 +0,0 @@ -lnc4����������������������������k�0 -4c� hyQWK Offline Reader Menu nk4�0 -4c�k����������������������������b0������� -��� -� hyC ngChange Packet Configuration b� -� hyS ngSelect Message Areas to Scan b� -� hyP ngModify New-message Pointers b� -� hyU ngUpload REP reply packet�b� -� hyD ngDownload QWK message packet b� -� hyB ngBidirectional REP/QWK transfer b� -������������������������������������ -� hyQ ngQuit back to Main menu�b� -������������������������������������n diff --git a/text/menu/qwk.rip b/text/menu/qwk.rip deleted file mode 100644 index 9834eb1cbc..0000000000 --- a/text/menu/qwk.rip +++ /dev/null @@ -1,11 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>QWK Packet Transfer Menu<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL200000<><> -!|1B0000020QPE010E000F080100000000000000|Y00000100|1U0M161K1G0000<>U<>U -!|1U0M1K1K1U0000<>D<>D|1U9616A51G0000<>B<>B -!|1B0000020QPE010E000F080400000000000000|1U961KA51U0000<>Q<>Q|c00 -!|@1Y16Upload REP Reply Packet|@1Y1KDownload QWK Message Packet -!|@AK16Bidirectional REP/QWK Transfer|@AK1KQuit to the Main Menu|w000A271610 -!|10000$ETW$|#|#|# - diff --git a/text/menu/qwk.wip b/text/menu/qwk.wip deleted file mode 100644 index 8f93eed81a..0000000000 --- a/text/menu/qwk.wip +++ /dev/null @@ -1,21 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=15 -!|M=QWK Offline Reader -!|L=1425 -!|T=195 -!|W=4050 -!|H=4350 -!|B=12632256 -!| -!|[Form] -!|001=0B`d`20`20`100`60`1``0`12632256`MS Sans Serif`8.25`Download QWK`DOWNLOAD.ICO -!|002=0B`u`140`20`100`60`2``0`12632256`MS Sans Serif`8.25`Upload REP`EDIT.ICO -!|003=0B`s`140`100`100`60`3``0`12632256`MS Sans Serif`8.25`Select Areas`LIST.ICO -!|004=0B`c`20`100`100`60`4``0`12632256`MS Sans Serif`8.25`Setup`DETAIL.ICO -!|005=0B`p`20`180`100`60`5``0`12632256`MS Sans Serif`8.25`MSG Pointers`CATPLUS.ICO -!|006=0B`q`140`180`100`60`6``0`12632256`MS Sans Serif`8.25`Quit`EXIT.ICO -!| -$0E \ No newline at end of file diff --git a/text/menu/renegade/email.asc b/text/menu/renegade/email.asc deleted file mode 100644 index aa27a7d26d..0000000000 --- a/text/menu/renegade/email.asc +++ /dev/null @@ -1,7 +0,0 @@ -�nhr������������������������������������������������������Ŀ -��4 wSynchronet Reneclone Email System Menu r0� -��������������������������������������������������������� - c4��������������������������������������������������������������������������Ŀ0 - 4� [yRc]ead Email [yEc]nter Email �0 - 4� [yVc]iew Outgoing [yQc]uit to Main [yGc]oodbye [y/Gc]oodbye Fast! �0 - 4����������������������������������������������������������������������������0n diff --git a/text/menu/renegade/main.asc b/text/menu/renegade/main.asc deleted file mode 100644 index 03aa3e1342..0000000000 --- a/text/menu/renegade/main.asc +++ /dev/null @@ -1,10 +0,0 @@ -�nhr������������������������������������������������������Ŀ -��4 wSynchronet Reneclone Main System Menu r0� -��������������������������������������������������������� - c4��������������������������������������������������������������������������Ŀ0 - 4� [yMc]essage System [yFc]ile System [yOc]nline System [yEc]mail System �0 - 4� [ySc]ystem Bulletins [yUc]ser Listing [yYc]our Info [yAc]uto-message �0 - 4� [yWc]ho's online [yLc]ist of Callers [y!c]Offline Mail [yPc]ersonal Info �0 - 4� [yNc]ote to SysOp [yCc]hat System [yIc]nfo on System [yXc]pert Toggle �0 - 4� [yGc]oodbye & Logoff [y/Gc]oodbye Fast! [y$c]Time Bank [y/Lc]ist Nodes �0 - 4����������������������������������������������������������������������������0n diff --git a/text/menu/renegade/message.asc b/text/menu/renegade/message.asc deleted file mode 100644 index 8fcb58d5e9..0000000000 --- a/text/menu/renegade/message.asc +++ /dev/null @@ -1,10 +0,0 @@ -�nhr������������������������������������������������������Ŀ -��4 wSynchronet Reneclone Message System Menu r0� -��������������������������������������������������������� - c4�������������������������������������������������������������������������Ŀ0 - 4� [y#c]Sub Change [y/#c]Group Change [y[c]Previous Sub [y]c]Next Sub �0 - 4� [yCc]hat System [yRc]ead Messages [ySc]can Messages [yPc]ost Message �0 - 4� [yFc]ile Menu [yGc]oodbye [y/Gc]oodbye [yUc]sers w/Access �0 - 4� [yNc]ew Message Scan [yQc]uit to Main [yEc]nter Email [yZc]Set Scan Areas�0 - 4� [yAc]rea List [yJc]ump to Area [y/Lc]ist Nodes [yYc]our Messages �0 - 4���������������������������������������������������������������������������0n diff --git a/text/menu/renegade/transfer.asc b/text/menu/renegade/transfer.asc deleted file mode 100644 index 8f8fb5007d..0000000000 --- a/text/menu/renegade/transfer.asc +++ /dev/null @@ -1,11 +0,0 @@ -�nhr������������������������������������������������������Ŀ -��4 wSynchronet Reneclone File System Menu r0� -��������������������������������������������������������� - c4��������������������������������������������������������������������������Ŀ0 - 4� [y#c]Dir Change [y/#c]Lib Change [y[c]Previous Dir [y]c]Next Dir �0 - 4� [y/Ac]rchive Menu [yAc]rea List [yCc]hat System [yDc]ownload �0 - 4� [yEc]nter Batch Mode [yFc]ind Description [yGc]oodbye [y/Gc]oodbye �0 - 4� [yPc]ointer Date [yLc]ist Files [yMc]essage Menu [yNc]ew Files �0 - 4� [yUc]pload! [yQc]uit to Main [yVc]iew Archive [ySc]earch Filespec �0 - 4� [yYc]our File info [yJc]ump to Area [y/Lc]ist Nodes �0 - 4����������������������������������������������������������������������������0n diff --git a/text/menu/restrict.asc b/text/menu/restrict.asc deleted file mode 100644 index fd796cd5be..0000000000 --- a/text/menu/restrict.asc +++ /dev/null @@ -1,7 +0,0 @@ -A=ANSI H= O= V= -B=Beep I= P=Post W=Auto-message -C=Chat J=Quoting Q=QWK Network Node X=External Programs -D=Download K=Read Mail Sent R=Remove Files Y=Are you sure? -E=E-mail L=Logon one/day S=Email Sysop Z= -F=Forward mail M=Networked Mail T=Transfers -G=Edit Defaults N=Networked Subs U=Upload diff --git a/text/menu/sdos/files.asc b/text/menu/sdos/files.asc deleted file mode 100644 index 4ebd352de5..0000000000 --- a/text/menu/sdos/files.asc +++ /dev/null @@ -1,21 +0,0 @@ - Volume in drive C is BBS - Volume Serial Number is 8317-6BE8 - Directory of C:\FILES - -. <DIR> 08/01/94 02:34 pm -.. <DIR> 08/01/94 02:34 pm -DOWNLOAD EXE 24343 06/02/94 08:36 am -UPLOAD EXE 48321 06/02/94 08:36 am -REMOVE COM 2377 06/04/94 04:55 pm -BATCH EXE 30566 06/02/94 08:36 am -VIEW EXE 10485 06/02/94 08:36 am -TEMP EXE 114705 06/02/94 08:37 am -LIST EXE 81380 06/04/94 04:56 pm -NEWSCAN COM 3146 06/02/94 08:36 am -EXTENDED EXE 287347 06/04/94 04:56 pm -SEARCH COM 1969 06/04/94 04:56 pm -FIND COM 5193 06/04/94 04:57 pm -AREA COM 905 06/02/94 08:35 am -CONFIG COM 2517 06/02/94 08:35 am - 15 file(s) 1350784 bytes - @FREESPACE@ bytes free diff --git a/text/menu/sdos/mail.asc b/text/menu/sdos/mail.asc deleted file mode 100644 index 45afc742f9..0000000000 --- a/text/menu/sdos/mail.asc +++ /dev/null @@ -1,21 +0,0 @@ - Volume in drive C is BBS - Volume Serial Number is 8317-6BE8 - Directory of C:\MAIL - -. <DIR> 08/01/94 02:34 pm -.. <DIR> 08/01/94 02:34 pm -SEND EXE 54343 06/02/94 08:36 am -SENDFILE EXE 58981 06/02/94 08:36 am -NETMAIL EXE 30566 06/02/94 08:36 am -READ EXE 102485 06/02/94 08:36 am -READSENT EXE 114705 06/02/94 08:37 am -POST EXE 81380 06/04/94 04:56 pm -NEWSCAN COM 3146 06/02/94 08:36 am -READMSGS EXE 287347 06/04/94 04:56 pm -YOURMSGS COM 1969 06/04/94 04:56 pm -FIND COM 5193 06/04/94 04:57 pm -QWK EXE 159876 06/02/94 08:35 am -AREA COM 905 06/02/94 08:35 am -CONFIG COM 2517 06/02/94 08:35 am - 15 file(s) 1350784 bytes - @FREESPACE@ bytes free diff --git a/text/menu/sdos/root.asc b/text/menu/sdos/root.asc deleted file mode 100644 index f8896a1aa2..0000000000 --- a/text/menu/sdos/root.asc +++ /dev/null @@ -1,20 +0,0 @@ - Volume in drive C is BBS - Volume Serial Number is 8317-6BE8 - Directory of C:\ - -FILES <DIR> 08/01/94 02:34 pm -MAIL <DIR> 08/01/94 02:34 pm -SETUP EXE 54343 06/02/94 08:36 am -CHAT EXE 102485 06/02/94 08:36 am -AUTOMSG COM 894 06/04/94 04:55 pm -DOORS EXE 326501 07/11/94 11:01 am -GFILES EXE 31024 06/02/94 08:36 am -LOGOFF COM 2193 05/22/94 04:27 pm -NODES TXT 593 @LASTDATEON@ @LASTTIMEON@ -LOGON LST 1984 @LASTDATEON@ @LASTTIMEON@ -USERS LST 148394 @LASTDATEON@ @LASTTIMEON@ -SYSTEM NFO 733 04/01/94 06:30 am -YOUR NFO 252 @LASTDATEON@ @LASTTIMEON@ -(SYSOP EXE 208419 01/01/80 00:00 am -) 13 file(s) 1350784 bytes - @FREESPACE@ bytes free diff --git a/text/menu/sentmail.asc b/text/menu/sentmail.asc deleted file mode 100644 index c6a942c0ba..0000000000 --- a/text/menu/sentmail.asc +++ /dev/null @@ -1,9 +0,0 @@ -0lnc4������������������������k�0 -4c� hyRead Sent Mail Menu nk4�0 -4c�k������������������������b0�������������������������� -����� -� hy<CR> ngNext message�b� hyD ngDelete last message b� -� hy- ngPrevious message b� hyR ngReread last message b� -� hyL ngList messages b� hyE ngEdit last message b� -� hy# ngGo to message # b� hyQ ngQuit to Main section b� -���������������������������������������������������n diff --git a/text/menu/sentmail.rip b/text/menu/sentmail.rip deleted file mode 100644 index 3fe25f80ee..0000000000 --- a/text/menu/sentmail.rip +++ /dev/null @@ -1,13 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Reading Sent Mail<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL2S0000<><> -!|1B0000020QPC010E000F080900000000000000|Y00000100|1U0M161K1G0000<><CR><>^M -!|1U0M1K1K1U0000<>-<>-|1U0M1Y1K280000<>L<>L -!|1B0000020QPE010E000F080400000000000000|1U0M2C1K2M0000<>Q<>Q -!|1B0000020QPC010E000F080900000000000000|1U961YA4280000<>#<>+ -!|1U9616A41G0000<>R<>R|1U961KA41U0000<>D<>D|c00|@1Y16Next Message -!|@1Y1KPrevious Message|@1Y1YList Messages|@1Y2CQuit to Main Section -!|@AK1YGo to Message #|@AK16Reread Last Message|@AK1KDelete Last Message -!|w000G271610|10000$ETW$|#|#|# - diff --git a/text/menu/sentmail.wip b/text/menu/sentmail.wip deleted file mode 100644 index 8e71d3444f..0000000000 --- a/text/menu/sentmail.wip +++ /dev/null @@ -1,29 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=4 -!|M=Reading Sent E-mail -!|L=3885 -!|T=3960 -!|W=5550 -!|H=1470 -!|B=12632256 -!| -!|[Form] -!|001=0B`-`10`10`40`40`1`Previous Message`0`12632256`MS Sans Serif`8.25``PREV.ICO -!|002=0B`|M`60`10`40`40`2`Next Message`0`12632256`MS Sans Serif`8.25``NEXT.ICO -!|003=0B`l`160`10`40`40`3``0`12632256`MS Sans Serif`8.25``LIST.ICO -!|004=0B`r`110`10`40`40`4``0`12632256`MS Sans Serif`8.25``BACK.ICO -!|005=0B`e`210`10`40`40`5`Reply to Last E-mail Message`0`12632256`MS Sans Serif`8.25``EDIT.ICO -!|006=0B`q`310`10`40`40`7`Delete Last E-mail Message`0`12632256`MS Sans Serif`8.25``EXIT.ICO -!|007=0B`d`260`10`40`40`7``0`12632256`MS Sans Serif`8.25``DELETE.ICO -!|008=0T`prev`10`50`40`15`8``0`12632256`MS Sans Serif`8.25`Prev`1`0 -!|009=0T`Next`60`50`40`15`9``0`12632256`MS Sans Serif`8.25`Next`1`0 -!|010=0T`reread`110`50`40`15`10``0`12632256`MS Sans Serif`8.25`Again`1`0 -!|011=0T`list`160`50`40`15`11``0`12632256`MS Sans Serif`8.25`List`1`0 -!|012=0T`edit`210`50`40`15`12``0`12632256`MS Sans Serif`8.25`Edit`1`0 -!|013=0T`delete`260`50`40`15`13``0`12632256`MS Sans Serif`8.25`Delete`1`0 -!|014=0T`quit`310`50`40`15`14``0`12632256`MS Sans Serif`8.25`Quit`1`0 -!| -$0E \ No newline at end of file diff --git a/text/menu/simple/filelist.asc b/text/menu/simple/filelist.asc deleted file mode 100644 index 0b0e8f3654..0000000000 --- a/text/menu/simple/filelist.asc +++ /dev/null @@ -1,9 +0,0 @@ -nhm�nhc� nhySynchronet Listing Files nhc� -�nhg2����������������������������������������ķ0 -nhm�nhg2� nhy2Anh2) All files in a directory nhg2�0 -nhm�nhg2� �0 -nhm�nhg2� nhy2Nnh2) New since @NEWFILETIME@ nhg2 �0 -nhm�nhg2� nhy2Snh2) Search for a filename nhg2�0 -nhm�nhg2� nhy2Fnh2) Find text in file descriptions nhg2�0 -nhm�nhg2� �0 -�nhg2� nhy2Qnh2) Quit to Main Menu nhg2�0 \ No newline at end of file diff --git a/text/menu/simple/main.asc b/text/menu/simple/main.asc deleted file mode 100644 index f399de8eaa..0000000000 --- a/text/menu/simple/main.asc +++ /dev/null @@ -1,11 +0,0 @@ -nh�nhc� nhySynchronet Main nhc� -�nhg2����������������������������������������ķ0 -nh�nhg2� nhy2Fnh2)ile list nhy2Rnh2)ead messages/mail nhg2�0 -nh�nhg2� nhy2Dnh2)ownload file nhy2Snh2)end messages/mail nhg2�0 -�nhg2� nhy2Unh2)pload a file nhy2Lnh2)ist users online nhg2�0 -nh�nhg2� nhy2Qnh2)WK offline msgs nhy2Pnh2)age user nhg2�0 -nh�nhg2� �0 -nh�nhg2� nhy2Onh2)nline programs nhy2Cnh2)hat menu nhg2�0 -nh�nhg2� �0 -nh�nhg2� nhy2Anh2)ccount configuration nhg2�0 -�nhg2� nhy2Gnh2)ood-bye (hang-up) nhg2�0 \ No newline at end of file diff --git a/text/menu/simple/prompt.ans b/text/menu/simple/prompt.ans deleted file mode 100644 index c098e78e0e..0000000000 --- a/text/menu/simple/prompt.ans +++ /dev/null @@ -1,2 +0,0 @@ -�nhg2����������������������������������������Ķ -�nhg2� n hg2 �[B[�nhg2����������������������������������������Ľ[A[[22CnmhCommand: n \ No newline at end of file diff --git a/text/menu/simple/prompt.asc b/text/menu/simple/prompt.asc deleted file mode 100644 index e2f3b7e790..0000000000 --- a/text/menu/simple/prompt.asc +++ /dev/null @@ -1,2 +0,0 @@ -�nhg2����������������������������������������Ľ -� mhCommand: n \ No newline at end of file diff --git a/text/menu/simple/readmsg.asc b/text/menu/simple/readmsg.asc deleted file mode 100644 index 73f3c6f4eb..0000000000 --- a/text/menu/simple/readmsg.asc +++ /dev/null @@ -1,11 +0,0 @@ -nhm�nhc� nhySynchronet Reading Messages nhc� -�nhg2����������������������������������������ķ0 -nhm�nhg2� nhy2Enh2) Email TO: YOU nhy2Fnh2) Email FROM: YOU nhg2�0 -nhm�nhg2� �0 -nhm�nhg2� nhy2Bnh2) Bulletins nhg2�0 -nhm�nhg2� nhy2Anh2) All messages in a conference nhg2�0 -nhm�nhg2� nhy2Nnh2) New messages in all conferences nhg2�0 -nhm�nhg2� nhy2Ynh2) New messages TO: YOU in all conf's nhg2�0 -nhm�nhg2� nhy2Cnh2) Configure new message scan nhg2�0 -nhm�nhg2� �0 -�nhg2� nhy2Qnh2) Quit to Main Menu nhg2�0 \ No newline at end of file diff --git a/text/menu/simple/sendmsg.asc b/text/menu/simple/sendmsg.asc deleted file mode 100644 index f0914a8b43..0000000000 --- a/text/menu/simple/sendmsg.asc +++ /dev/null @@ -1,7 +0,0 @@ -nhm�nhc� nhySynchronet Sending Messages nhc� -�nhy2����������������������������������������ķ0 -nhm�nhy2� Enh2) Send Email nhy2Nnh2) Send Netmail nhy2�0 -nhm�nhy2� �0 -nhm�nhy2� Pnh2) Post a message in a conference nhy2�0 -nhm�nhy2� �0 -nhm�nhy2� Qnh2) Quit to Main Menu nhy2�0 \ No newline at end of file diff --git a/text/menu/sysmailr.asc b/text/menu/sysmailr.asc deleted file mode 100644 index 0c92196b89..0000000000 --- a/text/menu/sysmailr.asc +++ /dev/null @@ -1,4 +0,0 @@ -nk4������������������������������������������������������������������������������c�0 -4k� hyS n4Save/Append last message to file hyU n4Edit author of last message c�0 -4k� hyC n4Change attributes of last message hyP n4Purge author of last message c�0 -4k�c������������������������������������������������������������������������������n diff --git a/text/menu/sysmain.asc b/text/menu/sysmain.asc deleted file mode 100644 index 9bda1e7053..0000000000 --- a/text/menu/sysmain.asc +++ /dev/null @@ -1,22 +0,0 @@ -0l�nhSynchronet Sysop Main Menu - b(All commands preceeded by a 'w;b')�(Optional parameters shown in m[]b) - (Required parameters shown in r<>b)�(Required exemptions shown in y()b) - -yNode Display/Control:�Editing: -wNODE m[args] cNode Utility�wUEDIT m[user] cEdit User Account -wDOWN r<nodes> cToggle Down Flag�wEDIT�cEdit Text/MSG File -wLOCK r<nodes> cLock/Unlock m(N) -wINTR r<nodes> cToggle Interrupt m(I)�yViewing: -wANON�cToggle Anonymous m(Q)�wLIST m[file] cView Text/ANSI/MSG File -wQUIET�cToggle Quiet�m(Q)�wLOG�cToday's Log -�wYLOG�cYesterday's Log -yMiscellaneous:�wNS m[node]�cNode Statistics -wCHUSER�cChange into Another User wSS�cSystem Statistics -wBULKMAIL�cSend Bulk E-mail�wNLOG�cNode Statistics Log -wSHELL�cOS Command Shell�wSLOG�cSystem Statistics Log -wCALL r<hub> cForce QWKnet Call-out�wERR�cCritical Error Log -wCHAT�cPage sysop m(C)�wGURU�cDiscussions w/The Guru -wLOAD r<file> cLoad alternate text.dat wMAIL�cAll Mail on System -wEXEC r<cmd> cExecute DOS Program�wSPY m[node] cSpy/control Node -wEXEC *r<mod> cExecute Baja Module -wFOSSIL r<cmd> cExecute FOSSIL Program diff --git a/text/menu/sysmscan.asc b/text/menu/sysmscan.asc deleted file mode 100644 index 16846c01a3..0000000000 --- a/text/menu/sysmscan.asc +++ /dev/null @@ -1,15 +0,0 @@ -nlc4����������������������������k�0 -4c� hySub-board Operator Menu nk4�0 -4c�k����������������������������b0������� -��� -� hyC ngChange Message Attributes�b� -� hyE ngEdit Message Text�b� -� hyH ngView Message Header�b� -� hyM ngMove Message to Another Sub b� -� hyS ngSave Message to Text File�b� -� hyU ngEdit Author's User Account�b� -� hyP ngPurge Author's User Account b� -� hyV ngValidate Previous Message�b� -������������������������������������ -� hyQ ngQuit back to Main menu�b� -������������������������������������n diff --git a/text/menu/syssmail.asc b/text/menu/syssmail.asc deleted file mode 100644 index b2484e597e..0000000000 --- a/text/menu/syssmail.asc +++ /dev/null @@ -1,3 +0,0 @@ -nk4������������������������������������������������������������������������������c�0 -4k� hwE n4Edit Last Message c�0 -4k�c������������������������������������������������������������������������������n diff --git a/text/menu/sysxfer.asc b/text/menu/sysxfer.asc deleted file mode 100644 index 895c330e0c..0000000000 --- a/text/menu/sysxfer.asc +++ /dev/null @@ -1,15 +0,0 @@ - Synchronet Sysop Transfer Menu - (All commands are preceeded by a ';') - -PUT [s] Direct upload file s to any drive or directory (remote) -GET [s] Direct download file s from any drive or directory (remote) -OLD * Remove, Edit, or Move files not downloaded since new-scan date -OLDUL * Remove, Edit, or Move files uploaded before new-scan date -CLOSE * Search for and optionally close open file records -ALTUL [x] Perform uploads using alternate file path number x -UPLOAD * Bulk local upload - add files on disk to database -RESORT * Re-sort files by sort value and compress empty slots -OFFLINE * Remove, Edit, or Move files in database that aren't on disk - -* Commands can be followed by LIB or ALL to specify the action to take place -on all directories of the current library, or all directories in all libraries. diff --git a/text/menu/tempxfer.asc b/text/menu/tempxfer.asc deleted file mode 100644 index dbf5a8fa46..0000000000 --- a/text/menu/tempxfer.asc +++ /dev/null @@ -1,14 +0,0 @@ -0lnc4������������������������������k�0 -4c� hyTemp Directory Command Menu nk4�0 -4c�k������������������������������0 -4b0����������������hw4Extract from Archive nb������������������hw4Other Commands nb������ -����� -� hyE ngExtract from archive in any directory�b� hyL ngList files in temp dir b� -� hyX ngExtract from archive in temp directory�b������������������������������ -��� hyI ngInformation on files�b� -�������hw4Create Listnb�����������4 hwTemp Archive nb����� hyV ngView archive contents b� -����� hyR ngRemove files from temp b� -� hyN ngList of new files b� hyA ngCreate/add to archive b������������������������������ -� hyF ngList of all files b� hyD ngDownload temp archive b� hyQ ngQuit to transfer menu b� -������� -4 hyAnytime: cCtrl-U nc4Who's online hCtrl-P nc4Send private msg hCtrl-C nc4Abort cmd/text n diff --git a/text/menu/tempxfer.rip b/text/menu/tempxfer.rip deleted file mode 100644 index d246bb9210..0000000000 --- a/text/menu/tempxfer.rip +++ /dev/null @@ -1,17 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Temp Directory<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL3K0000<><> -!|1B0000020QPC010E000F080100000000000000|Y00000100|1U0M161K1G0000<>E<>E -!|1U0M1K1K1U0000<>N<>N|1U0M1Y1K280000<>F<>F|1U0M2C1K2M0000<>A<>A -!|1U0M2Q1K300000<>D<>D|1B0000020QPE010E000F080400000000000000 -!|1U0M341K3E0000<>Q<>Q|1B0000020QPC010E000F080100000000000000 -!|1U9616A41G0000<>I<>I|1U961KA41U0000<>V<>V|1U961YA4280000<>L<>L -!|1U962CA42M0000<>X<>X|1U962QA4300000<>R<>R|c00|@1Y16Extract from an Archive -!|@1Y1KCreate a List of New Files|@1Y1YCreate a List of All Files -!|@1Y2CAdd to/Create Temp Archive|@1Y2QDownload Temp Archive -!|@1Y34Quit to the Transfer Section|@AK1YList Files in Temp Directory -!|@AK16Information on Files|@AK1KView Contents in Archives -!|@AK2CExtract From Archive in Temp|@AK2QRemove Files from Temp|w000G271610 -!|10000$ETW$|#|#|# - diff --git a/text/menu/transfer.asc b/text/menu/transfer.asc deleted file mode 100644 index 416807d7fc..0000000000 --- a/text/menu/transfer.asc +++ /dev/null @@ -1,19 +0,0 @@ -0lnc4��������������������������������k�0 -4c� hySynchronet File Transfer Menu nk4�0 -4c�k��������������������������������0 -4b0�����4 hwList/Flag Files nb�������4 hwFile Area Selection nb���������4 hwFile Search nb������ -������� -� hyL ngList files in dir�b� hyJ ngJump to new file area b� hyF ngFind text in descrp b� -� hyN ngNew file scan�b��������������������������� hyS ngSearch for filename b� -� hyE ngExtended file info b��hy* ngList directories b��� -����hy/* ngList libraries b������4 hwOther Commands nb����� -�����4 hwUpload/Download nb����� hy{ } # ngSelect directory b��� -��� hy[ ] /# ngSelect library b� hy& ngFile scan config�b� -� hyD ngDownload file�b��� hyR ngRemove/edit file�b� -� hyU ngUpload file�b����������4 hwGo to nb���������� hyI ngInformation�b� -� hy/D ngDownload from user b��� hyV ngView file contents b� -� hy/U ngUpload to user�b� hyQ ngMain/Message section b� hy/L ngNode activity�b� -� hyZ ngUpload to sysop�b� hyC ngChat section�b� hy^K ngCtrl-key menu�b� -� hyB ngBatch/Bi-dir xfers b� hyT ngTemp dir/Archive cmds b� hyO ngLogoff BBS (or /O) b� -������� -4 hyAnytime: cCtrl-U nc4Who's online hCtrl-P nc4Send private msg hCtrl-C nc4Abort cmd/text n diff --git a/text/menu/transfer.rip b/text/menu/transfer.rip deleted file mode 100644 index 1501d23d4b..0000000000 --- a/text/menu/transfer.rip +++ /dev/null @@ -1,37 +0,0 @@ - -!|1K|w0010271610|W00|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Synchronet File Transfer Menu<> -!|1B0000020PWW050E000F080700000000000000|1U0710HL7T0000<><>|c00|Y00000100 -!|1B0000020QPI010E000F080900000000000000|1U0Y1E1W1O1600<>*<>* -!|1U0Y1S1W221T00<> A <>/*|1U0Y261W2G2400<>L<>L|1U0Y2K1W2U1X00<>E<>E -!|1U0Y2Y1W382E00<>V<>V|1U0Y3C1W3M2600<>N<>N|1U0Y3Q1W402BY0<>S<>S -!|1U0Y441W4E1Y00<>F<>F|1U0Y4I1W4S2100<>I<>I|1U0Y4W1W560000<> /L <>/L -!|1U0Y5A1W5K2200<>J<>J|1B0000020QPI010E000F080100000000000000 -!|1U0Y6G1W6Q2C00<>T<>T|1U0Y6U1W741V00<>C<>C -!|1B0000020QPI010E000F080400000000000000|1U0Y781W7I2900<>Q<>Q -!|1B0000020QPI010E000F080300000000000000|1U8W1E9U1O1200<>&<>& -!|1U8W1S9U222A00<> R <>R|1B0000020QPE010E000F080300000000000000 -!|1U8W269U2G2700<>O<>O$MKILL$|1B0000020QPI010E000F080300000000000000 -!|1U8W2K9U2U0L00<> ^U <>^U|1U8W2Y9U380G00<> ^P <>^P|1U8W3C9U3M0B00<> ^K <>^K -!|1B0000020QPE010E000F080C00000000000000|1U7U3Y8S483G00<>{<>{ -!|1U8W3Y9U483I00<>}<>}|1U7U4C8S4M2K00<>[<>[|1U8W4C9U4M2M00<>]<>] -!|1B0000020QPI010E000F080200000000000000|1U8W5A9U5K1W00<> D <>D -!|1U8W5O9U5Y0000<> /D <>/D|1U8W629U6C1U00<>B<>B|1U8W6G9U6Q2D00<>U<>U -!|1U8W6U9U740000<> /U <>/U|1U8W789U7I2I00<>Z<>Z|@2S11Listing Functions|c0F -!|@2T12Listing Functions|c00|@B111Control Functions|c0F|@B212Control Functions -!|c00|@2N62Other Sections|c0F|@2O63Other Sections|c00|@B44VTransfer Functions -!|c0F|@B54WTransfer Functions|c00|@281EDirectories within Library -!|@281SFile Libraries|@2826Files in Current Directory -!|@282KExtended File Information|@282YView Contents of File|@283CNew File Scan -!|@283QSearch for Filename|@2844Find Text in Description -!|@284IInformation Commands|@284WList All Nodes|@285AJump to a File Area -!|@286GTemp Dir/Archive Commands|@286UChat Commands|@2878Quit to Main Menu -!|@AA1EConfiguration Commands|@AA1SRemove/Edit File, Any Directory -!|@AA26Logoff (also /O)|@AA2KList Users Online (Anywhere) -!|@AA2YSend Message to Another Node|@AA3CControl Key Command Menu -!|@AA3YChange Directory, or Type Number|@A94BChange Library, or Type /Number -!|@AA5ADownload File from Any Directory|@AA5ODownload User to User -!|@AA62Batch/Bidirectional|@AA6GUpload File to Current Directory -!|@AA6UUpload File User to User|@AA78Upload File to Sysop Directory|10000$ETW$ -!|#|#|# - diff --git a/text/menu/uedit.asc b/text/menu/uedit.asc deleted file mode 100644 index 1ccf24a2b8..0000000000 --- a/text/menu/uedit.asc +++ /dev/null @@ -1,21 +0,0 @@ - yh��� wUser Edit Menu y��� -�����������������������������������������������������������������������������Ŀ -� wA bAlias and Handle wS bSex (Gender) y� -� wB bBirthday wT bSet Text Search String y� -� wC bComputer wU bUpload and Download Stats y� -� wD bDelete/Deactivate/Restore wV bQuick-Validate User y� -� wE bExemptions wW bPassword y� -� wF bFlags wX bView Extended Comment y� -� wG bGo to a User wY bCopy User to Another Slot y� -� wH bEdit/Create Extended Comment wZ bRestrictions y� -� wI bInspect/Edit User's Defaults w] bGo Up One User y� -� wJ bEdit Minutes w[ bGo Down One User y� -� wK bEdit Dates w} bSearch Up (Text or ARS) y� -� wL bLocation, Address, and Zip Code w{ bSearch Down (Text or ARS) y� -� wM bMain Security Level w/ bSet AR String for Search y� -� wN bNote w~ bSet Leech Download Counter y� -� wO bComment w+ bAdjust Credits y� -� wP bPhone Number w* bAdjust Minutes y� -� wQ bQuit w$ bEdit Credits y� -� wR bReal Name w# bView User Questionnaire y� -������������������������������������������������������������������������������� diff --git a/text/menu/ulprot.asc b/text/menu/ulprot.asc deleted file mode 100644 index 2339a77346..0000000000 --- a/text/menu/ulprot.asc +++ /dev/null @@ -1 +0,0 @@ -hwX bXmodem wY bYmodem wZ bZmodem wG bYmodem-G diff --git a/text/menu/wfc.asc b/text/menu/wfc.asc deleted file mode 100644 index 5ab9a55135..0000000000 --- a/text/menu/wfc.asc +++ /dev/null @@ -1,3 +0,0 @@ -�nc4�������������������������������k�0 -47������������������������c4� hSynchronet Multinode BBS nk4�7�����������������������hw�nk7� c4� hyWaiting for Call nk4�7 hw�nk7� c4�k�������������������������������7 hw�nk7� hw�nk7� hw����nk7� hw����nk7� hw����nk7� hw�nk7� hw� yL nk7� bToday's caller log hw� yC nk7� bConfigure BBS hw� yM nk7� bRead all mail hw�nk7� hw�nk7���� hw�nk7���� hw�nk7���� hw�nk7� hw����nk7� hw����nk7� hw����nk7� hw�nk7� hw� yY nk7� bYesterday's log hw� yU nk7� bUser editor hw� yR nk7� bRead feedback hw�nk7� hw�nk7���� hw�nk7���� hw�nk7���� hw�nk7� hw����nk7� hw����nk7� hw����nk7� hw�nk7� hw� yN nk7� bNode statistics hw� yT nk7� bTerminal mode hw� yE nk7� bSend mail/netmail hw�nk7� hw�nk7���� hw�nk7���� hw�nk7���� hw�nk7� hw����nk7� hw����nk7� hw����nk7� hw�nk7� hw� yS nk7� bSystem statistics hw� yD nk7� bDOS shell hw� yX nk7� bQuit (on-hook) hw�nk7� hw�nk7���� hw�nk7���� hw�nk7���� hw�nk7� hw����nk7� hw����nk7� hw����nk7� hw�nk7� hw� yA nk7� bForce answer hw� yF nk7� bForce QWKnet hw� yQ nk7� bQuit (off-hook) hw�nk7� hw�nk7���� hw�nk7���� hw�nk7���� hw�nk7� hw�nk7� c4�������������������������k�7 hw�nk7�hw��������������������������nc4� hySpace Bar n4to logon k�hw7���������������������������nk.�c4�k�������������������������0 -g0Synchronet BBS Version 2�(C) 1995 Digital Dynamicsn \ No newline at end of file diff --git a/text/menu/wildcat/file.asc b/text/menu/wildcat/file.asc deleted file mode 100644 index 7a12f146af..0000000000 --- a/text/menu/wildcat/file.asc +++ /dev/null @@ -1,20 +0,0 @@ -0 -nh�nh��������������������������������������������������Ŀ -�� ���ķ��ķ�ķ�� -�� ��� � � ��ķ ��ķ � �� � ��ķ ��ķ � � � -�� � � � ��� ��ķ � ӽ � ��� � � � � � -�� � � ��Ľ ��Ľ ��Ľ � � ��Ľ � � ��Ľ � -����������������������������������������������������������������Ĵn���nh���������� -nhg��������������nh��nhySynchronet Wildclone�nh�ng���nhg���������� -nhy��������������nh����������������������������������������������������n���nhy���������� -nhc������������������nc���������������������������������������������������nhc���������� -nhb���nh��������������������Ŀnhb�nh�������������������������Ŀnhb�nh��������������������Ŀnb��� -nh��ܳ nhyQ nhuit to Main��ܳ nhyL nhist Available Files �ܳ nhyD nhownload a File �n��� -nhg���nh� nhyU nhpload a File��nhg�nh� nhyN nhew Files Since [N] �nhg�nh� nhyV nhiew a ZIP File �ng��� -nhy���nh� nhyM nhessage Menu��nhy�nh� nhyS nhearch for Files��nhy�nh� nhyG nhoodbye & Logoff �n��� - nh� nhyI nhnfo on a File � � nhyJ nhoin a Conference�� � nhyP nhersonal Stats � - � nhyE nhdit Marked List � � nhyF nhile Transfer Info�� � nhyH nhelp Level�� - ���������������������� ��������������������������� ���������������������� - (nhy1 nhSysop Menu ) -nhyConference: nh@LIB@ @DIR@ nhyTime On: nh@TIMEON@ nhyTime Remaining: nh@LEFT@ -n \ No newline at end of file diff --git a/text/menu/wildcat/main.asc b/text/menu/wildcat/main.asc deleted file mode 100644 index 9c17a85ced..0000000000 --- a/text/menu/wildcat/main.asc +++ /dev/null @@ -1,20 +0,0 @@ -0 -nh�nh��������������������������������������������������Ŀ -�� �ķ�ķ��ķ�ķ�� -�� � �� � ��ķ � ��ķ � �� � ��ķ ��ķ � � � -�� � ӽ � ��Ķ � � � � ӽ � ��� � � � � � -�� � � � � � � � � � ��Ľ � � ��Ľ � -����������������������������������������������������������������Ĵn���nh���������� -nhg��������������nh��nhySynchronet Wildclone�nh�ng���nhg���������� -nhy��������������nh����������������������������������������������������n���nhy���������� -nhc������������������nc���������������������������������������������������nhc���������� -nhb���nh������������������Ŀnhb�nh�������������Ŀnhb�nh�������������Ŀnhb�nh������������������Ŀnb��� -nh��ܳ nhyM nhessage Menu �ܳ nhyE nhmail��ܳ nhyU nhser List �ܳ nhyA nhuto-message �n��� -nhg���nh� nhyC nhomments��nhg�nh� nhyN nhewsletter �nhg�nh� nhyF nhiles Menu �nhg�nh� nhyT nhalk to Nodes �ng��� -nhy���nh� nhyJ nhoin Conference �nhy�nh� nhyG nhoodbye �nhy�nh� nhyP nhage Sysop �nhy�nh� nhyI nhnitial Welcome �n��� - nh� nhyY nhour Settings � � nhyW nhhos Online� � nhyV nherify User� � nhyR nhead Your Stats � - � nhyS nhystem Stats � � nhyB nhulletins � � nhyD nhoors�� � nhyH nhelp Level�� - �������������������� ��������������� ��������������� �������������������� -� (nhy1 nhSysop Menu ) - nhyConference: nh@CONF@ nhyTime On: nh@TIMEON@ nhyTime Remaining: nh@LEFT@ -n \ No newline at end of file diff --git a/text/menu/wildcat/msg.asc b/text/menu/wildcat/msg.asc deleted file mode 100644 index 4405ba83e0..0000000000 --- a/text/menu/wildcat/msg.asc +++ /dev/null @@ -1,18 +0,0 @@ -0 -nh�nh��������������������������������������������������������������Ŀ -�� �ķ�ķ��ķ�ķ�� -�� � �� � ��ķ ��ķ ��ķ ��ķ ��ķ ��ķ � �� � ��ķ ��ķ � � � -�� � ӽ � ��� ��ķ ��ķ ��Ķ � ķ ��� � ӽ � ��� � � � � � -�� � � ��Ľ ��Ľ ��Ľ � � ��Ľ ��Ľ � � ��Ľ � � ��Ľ � -����������������������������������������������������������������������Ĵn���nh���� -nhg��������nh��nhySynchronet Wildclone�nh�ng���nhg���� -nhy��������nh����������������������������������������������������������������n���nhy���� -nhc������������nc���������������������������������������������������������������nhc���� -nhb���nh��������������������Ŀnhb�nh�������������������������Ŀnhb�nh��������������������Ŀnb��� -nh��ܳ nhyR nhead Messages��ܳ nhyE nhnter a New Message �ܳ nhyF nhiles Section��n��� -nhg���nh� nhyS nhearch Messages �nhg�nh� nhyQ nhuit to Main Menu��nhg�nh� nhyG nhoodbye & Logoff �ng��� -nhy���nh� nhyC nhheck Personal Msg�nhy�nh� nhyU nhpdate Conf Scan/Read �nhy�nh� nhyH nhelp Level��n��� - nh� nhyJ nhoin a Conference � � nhyT nhQWK Message Menu�� � nhy? nhCommand Help�� - ���������������������� ��������������������������� ���������������������� - (nhy1 nhSysop Menu ) - nhyConference: nh@CONF@ nhyTime On: nh@TIMEON@ nhyTime Remaining: nh@LEFT@n diff --git a/text/menu/wildcat/sysop.asc b/text/menu/wildcat/sysop.asc deleted file mode 100644 index ce3537ade8..0000000000 --- a/text/menu/wildcat/sysop.asc +++ /dev/null @@ -1,16 +0,0 @@ -�nh����������������������������������������������������Ŀ -�� ���ķ��ķ�ķ�� -�� ���ķ � � ��ķ ��ķ ��ķ � �� � ��ķ ��ķ � � � -���� ��Ľ ��ķ � � ��Ľ � ӽ � ��� � � � � � -�� ���Ľ � ��Ľ ��Ľ ��� � ��Ľ � � ��Ľ � -�����������������������������������������������������������������Ĵn���nh��������� -nhg�������������nh��nhySynchronet Wildclone�nh�ng���nhg��������� -nhy�������������nh������������������������������������������������������n���nhy��������� -nhc�����������������nc���������nh�������������������������Ŀnc�����������������nhc��������� -nhb���nh��������������������Ŀnhb�nh� nhyJ nhoin Conference��nhb�nh��������������������Ŀnb��� -nh��ܳ nhyU nhser Database��ܳ nhyQ nhuit to Main Menu��ܳ nhy? nhCommand Help��n��� -nhg���nh� nhyN nhode Management �nhg�nh� nhyA nhctivity Log Listing �nhg�nh� nhy1 nhMessage Menu��ng��� -nhy���nh� nhyD nhrop to DOS��nhy�nh� nhy2 nhFile Menu��nhy�nh� nhyG nhoodbye & Logoff �n��� - nh���������������������� ��������������������������� ���������������������� - nhyConference: nh@CONF@ nhyTime On: nh@TIMEON@ nhyTime Remaining: nh@LEFT@ -n \ No newline at end of file diff --git a/text/menu/wipfile.wip b/text/menu/wipfile.wip deleted file mode 100644 index 76ad5bc648..0000000000 --- a/text/menu/wipfile.wip +++ /dev/null @@ -1,27 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=15 -!|M=File Transfers -!|L=2055 -!|T=360 -!|W=5175 -!|H=4725 -!|B=12632256 -!| -!|[Form] -!|001=0B`d`10`10`100`60`1`Read/Write E-mail Messages`0`12632256`MS Sans Serif`8.25`Download`SAVE.ICO -!|002=0B`l`120`10`100`60`2``0`12632256`MS Sans Serif`8.25`List Files`LIST.ICO -!|003=0B`u`230`10`100`60`3``0`12632256`MS Sans Serif`8.25`Upload`ADD.ICO -!|004=0B`b`10`80`100`60`4``0`12632256`MS Sans Serif`8.25`Batch Queue`DOWNLOAD.ICO -!|005=0B`n`120`80`100`60`5``0`12632256`MS Sans Serif`8.25`New Files`DONE.ICO -!|006=0B`c`230`80`100`60`6``0`12632256`MS Sans Serif`8.25`Setup`DETAIL.ICO -!|007=0B`v`10`150`100`60`7``0`12632256`MS Sans Serif`8.25`View File`PCAL.ICO -!|008=0B`s`120`150`100`60`8``0`12632256`MS Sans Serif`8.25`Find Filename`FIND.ICO -!|009=0B`e`230`150`100`60`9``0`12632256`MS Sans Serif`8.25`File Info`NOTEPAD.ICO -!|010=0B`r`10`220`100`60`10``0`12632256`MS Sans Serif`8.25`Remove File`CANCEL.ICO -!|011=0B`f`120`220`100`60`11``0`12632256`MS Sans Serif`8.25`Find Text`SEARCH.ICO -!|012=0B`q`230`220`100`60`12``0`12632256`MS Sans Serif`8.25`Quit`EXIT.ICO -!| -$0E \ No newline at end of file diff --git a/text/menu/wipmain.wip b/text/menu/wipmain.wip deleted file mode 100644 index 07f2b70992..0000000000 --- a/text/menu/wipmain.wip +++ /dev/null @@ -1,33 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=15 -!|M=Main Menu -!|L=570 -!|T=3855 -!|W=8400 -!|H=1650 -!|B=12632256 -!| -!|[Form] -!|001=0B`e`10`10`50`50`1`Read/Write E-mail Messages`0`12632256`MS Sans Serif`8.25``EDIT.ICO -!|002=0B`f`70`10`50`50`2`File Transfers (Upload/Download)`0`12632256`MS Sans Serif`8.25``DOWNLOAD.ICO -!|003=0B`c`130`10`50`50`3``0`12632256`MS Sans Serif`8.25``ORDER.ICO -!|004=0B`m`190`10`50`50`4``0`12632256`MS Sans Serif`8.25``NEWS.ICO -!|005=0B`s`250`10`50`50`5``0`12632256`MS Sans Serif`8.25``MMD.ICO -!|006=0B`i`310`10`50`50`6``0`12632256`MS Sans Serif`8.25``INFO.ICO -!|007=0B`x`370`10`50`50`7`Run External Programs (doors)`0`12632256`MS Sans Serif`8.25``WELCOME.ICO -!|008=0B`d`430`10`50`50`8``0`12632256`MS Sans Serif`8.25``DETAIL.ICO -!|009=0B`o`490`10`50`50`9``0`12632256`MS Sans Serif`8.25``EXITSGN.ICO -!|010=0T`email`10`60`50`15`10``0`12632256`MS Sans Serif`8.25`E-mail`1`0 -!|011=0T`files`70`60`50`15`11``0`12632256`MS Sans Serif`8.25`Files`1`0 -!|012=0T`chat`130`60`50`15`11``0`12632256`MS Sans Serif`8.25`Chat`1`0 -!|013=0T`msgs`190`60`50`15`12``0`12632256`MS Sans Serif`8.25`Msgs`1`0 -!|014=0T`match`250`60`50`15`13``0`12632256`MS Sans Serif`8.25`Match`1`0 -!|015=0T`info`310`60`50`15`14``0`12632256`MS Sans Serif`8.25`Info`1`0 -!|016=0T`doors`370`60`50`15`16``0`12632256`MS Sans Serif`8.25`Doors`1`0 -!|017=0T`config`430`60`50`15`17``0`12632256`MS Sans Serif`8.25`Setup`1`0 -!|018=0T`logoff`490`60`50`15`18``0`12632256`MS Sans Serif`8.25`Logoff`1`0 -!| -$0E \ No newline at end of file diff --git a/text/menu/xfercfg.asc b/text/menu/xfercfg.asc deleted file mode 100644 index dd85dbbf4c..0000000000 --- a/text/menu/xfercfg.asc +++ /dev/null @@ -1,9 +0,0 @@ -0lnc4��������������������������k�0 -4c� hyFile Scan Configuration nk4�0 -4c�k��������������������������b0������������ -��� -� hyP ngSet new-scan pointer �b� -��hy0B ngToggle batch file flagging on/off b� -� hyE ngToggle extended descriptions b� -� hyQ ngQuit to File Transfer menu�b� -���������������������������������������n diff --git a/text/menu/xfercfg.rip b/text/menu/xfercfg.rip deleted file mode 100644 index 48a36c55fd..0000000000 --- a/text/menu/xfercfg.rip +++ /dev/null @@ -1,10 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Transfer Configuration Menu<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL200000<><> -!|1B0000020QPE010E000F080300000000000000|Y00000100|1U0M161K1G0000<>B<>B -!|1U9616A41G0000<>P<>P|1B0000020QPE010E000F080400000000000000 -!|1U0M1K1K1U0000<>Q<>Q|c00|@1Y16Batch Download File Flagging -!|@AK16New File Scan Pointers|@1Y1KQuit to the Main Menu|w000A271610 -!|10000$ETW$|#|#|# - diff --git a/text/menu/xferinfo.asc b/text/menu/xferinfo.asc deleted file mode 100644 index 8ed16973bb..0000000000 --- a/text/menu/xferinfo.asc +++ /dev/null @@ -1,8 +0,0 @@ -0lnc4��������������������������������k�0 -4c� hyFile Section Information Menu nk4�0 -4c�k����������������������������������b0������������������������������������� -����� -� hyT ngFile transfer policy�b� hyY ngYour file transfer statistics b� -��hy0D ngInformation on current directory b����������������������������������� -� hyU ngUsers with access to current dir b� hyQ ngQuit to File Transfer menu b� -������������������������������������������������������������������������n diff --git a/text/menu/xferinfo.rip b/text/menu/xferinfo.rip deleted file mode 100644 index 94ad01176a..0000000000 --- a/text/menu/xferinfo.rip +++ /dev/null @@ -1,11 +0,0 @@ - -!|1K|w0010271610|W0|=00000001|1B0000020PX4050E000F080700000000000000 -!|1U0707HL0P0000<>Transfer Information Menu<>|c0F|S0107 -!|1B0000020PWW050E000F080700000000000000|1U0710HL2E0000<><> -!|1B0000020QPE010E000F080900000000000000|Y00000100|1U0M161K1G0000<>T<>T -!|1U0M1K1K1U0000<>D<>D|1U9616A41G0000<>U<>U|1U961KA41U0000<>Y<>Y -!|1B0000020QPE010E000F080400000000000000|1U0M1Y1K280000<>Q<>Q|c00 -!|@1Y16Transfer Policy|@1Y1KDirectory|@AK16Users with Access to Directory -!|@AK1KYour Transfer Statistics|@1Y1YQuit to the Main Menu|w000C271610 -!|10000$ETW$|#|#|# - diff --git a/text/menu/yesno.wip b/text/menu/yesno.wip deleted file mode 100644 index b1c077883c..0000000000 --- a/text/menu/yesno.wip +++ /dev/null @@ -1,20 +0,0 @@ -$00000D -!|[Startup] -!|V=1.10 -!|D=` -!|O=8 -!|M=Yes or No -!|L=1815 -!|T=510 -!|W=3000 -!|H=2100 -!|B=12632256 -!| -!|[Form] -!|001=0T`question`10`10`170`35`5``0`12632256`MS Sans Serif`8.25`@QUESTION@`1`0 -!|002=0B`y`50`50`40`40`1``0`12632256`MS Sans Serif`8.25``DONE.ICO -!|003=0B`n`100`50`40`40`2``0`12632256`MS Sans Serif`8.25``CANCEL.ICO -!|004=0T`yes`50`90`40`15`3``0`12632256`MS Sans Serif`8.25`Yes`1`0 -!|005=0T`no`100`90`40`15`4``0`12632256`MS Sans Serif`8.25`No`1`0 -!| -$0E \ No newline at end of file diff --git a/text/name.can b/text/name.can deleted file mode 100644 index b42d651356..0000000000 --- a/text/name.can +++ /dev/null @@ -1,33 +0,0 @@ -new -all -sysop~ -netmail -@~ -#~ -!~ -a -b -c -d -e -f -g -h -i -j -k -l -m -n -o -p -q -r -s -t -u -v -w -x -y -z diff --git a/text/newuser.msg b/text/newuser.msg deleted file mode 100644 index b2466a562a..0000000000 --- a/text/newuser.msg +++ /dev/null @@ -1,8 +0,0 @@ -ngThe rules of the BBS are normally displayed here, but the sysop has not -yet defined them. So in the meantime, please use common sense and follow the -golden rule: "hTreat others as you yourself wish to be treatedng." - -Of course technical rules like "hDo not upload commercial softwareng" and -"hDo not upload virus or trojan horse filesng" also apply, so please ask the -sysop for details. - diff --git a/text/phone.can b/text/phone.can deleted file mode 100644 index ebdfcaa4d4..0000000000 --- a/text/phone.can +++ /dev/null @@ -1,20 +0,0 @@ -0-^ -1-^ -000-~ -111-~ -123-^ -222-^ -333-^ -444-^ -555-~ -666-^ -777-^ -888-^ -999-^ -900-^ -411-~ -911-~ -976-~ -411^ -911^ - diff --git a/text/sbbs.msg b/text/sbbs.msg deleted file mode 100644 index e867b88254..0000000000 --- a/text/sbbs.msg +++ /dev/null @@ -1,19 +0,0 @@ - nch1 � Synchronet � n - yhMultinode BBS Software - - bDeveloped 1990-1997 by Rob Swindell - - ng������������������ - � hKeys to Rememberng � - ������������������͵ - � whCtrl-C ngAbort � - � whCtrl-S ngPause � - � whCtrl-Q ngContinue � - � wh? ngMenu � - �������������������� - - hExample Prompt: wOngne, hwTngwo, or [Three]: - - hIndicates: wO ngOne - whT ngTwo - whEnter ngThree diff --git a/text/system.msg b/text/system.msg deleted file mode 100644 index 244aae3ce7..0000000000 --- a/text/system.msg +++ /dev/null @@ -1,8 +0,0 @@ -ncThis is h@BBS@nc BBS... - - with your sysop, h@SYSOP@nc here to serve you. - -This system has received h@TCALLS@nc calls to date. - -Other system information will be available in this space soon. - diff --git a/text/zipmsg.txt b/text/zipmsg.txt deleted file mode 100644 index 44da951b3f..0000000000 --- a/text/zipmsg.txt +++ /dev/null @@ -1,4 +0,0 @@ - - -This file was downloaded from a Synchronet BBS - use PKUNZIP -D <filename> - diff --git a/xtrn/sbj/Makefile.gnu b/xtrn/sbj/Makefile.gnu deleted file mode 100644 index 1dee963d4d..0000000000 --- a/xtrn/sbj/Makefile.gnu +++ /dev/null @@ -1,50 +0,0 @@ -# Makefile.gnu - -######################################################################### -# Makefile for Synchronet Blackjack # -# For use with GNU make and GNU C Compiler # -# @format.tab-size 4, @format.use-tabs true # -# # -# Linux: make -f Makefile.gnu # -# Win32: make -f Makefile.gnu os=win32 # -# FreeBSD: make -f Makefile.gnu os=freebsd # -######################################################################### - -# $Id$ - -# Macros -CC = gcc -LD = ld - -ifeq ($(os),win32) # Windows - -EXEFILE = .exe -LIBDIR := /gcc/i386-mingw32/lib -CFLAGS := -mno-cygwin -LFLAGS := --target=i386-mingw32 -mno-cygwin -DELETE = echo y | del -LIBS = $(LIBDIR)/libwsock32.a - -else # Linux - -EXEFILE = -LIBODIR := gcc.linux.lib -EXEODIR := gcc.linux.exe -LIBDIR := /usr/lib -CFLAGS := -LFLAGS := -DELETE = rm -f -v -ifeq ($(os),freebsd) # FreeBSD -LIBS = -pthread -else -LIBS = $(LIBDIR)/libpthread.a -endif #! FreeBSD - -endif - -CFLAGS := $(CFLAGS) -I../sdk - -SBJ: sbj$(EXEFILE) - -sbj$(EXEFILE) : sbj.c ../sdk/xsdk.c ../sdk/xsdkvars.c ../sdk/xsdkwrap.c - $(CC) $(CFLAGS) $^ -o $@ $(LIBS) diff --git a/xtrn/sbj/sbj.bpf b/xtrn/sbj/sbj.bpf deleted file mode 100644 index d58a17ed04..0000000000 --- a/xtrn/sbj/sbj.bpf +++ /dev/null @@ -1,8 +0,0 @@ -USEUNIT("Sbj.c"); -USEUNIT("..\SDK\Xsdkvars.c"); -USEUNIT("..\SDK\Xsdk.c"); -USEUNIT("..\sdk\xsdkwrap.c"); -//--------------------------------------------------------------------------- -This file is used by the project manager only and should be treated like the project file - - main \ No newline at end of file diff --git a/xtrn/sbj/sbj.bpr b/xtrn/sbj/sbj.bpr deleted file mode 100644 index 71b1ef5126..0000000000 --- a/xtrn/sbj/sbj.bpr +++ /dev/null @@ -1,96 +0,0 @@ -<?xml version='1.0' encoding='utf-8' ?> -<!-- C++Builder XML Project --> -<PROJECT> - <MACROS> - <VERSION value="BCB.05.03"/> - <PROJECT value="sbj.exe"/> - <OBJFILES value="Sbj.obj ..\SDK\Xsdkvars.obj ..\SDK\Xsdk.obj ..\sdk\xsdkwrap.obj"/> - <RESFILES value=""/> - <IDLFILES value=""/> - <IDLGENFILES value=""/> - <DEFFILE value=""/> - <RESDEPEN value="$(RESFILES)"/> - <LIBFILES value=""/> - <LIBRARIES value=""/> - <SPARELIBS value=""/> - <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi VCLDB50.bpi VCLADO50.bpi ibsmp50.bpi - VCLBDE50.bpi VCLDBX50.bpi QRPT50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi - DSS50.bpi TEEQR50.bpi VCLIB50.bpi VCLMID50.bpi VCLIE50.bpi INETDB50.bpi - INET50.bpi NMFAST50.bpi WEBMID50.bpi bcbie50.bpi dclocx50.bpi"/> - <PATHCPP value=".;..\SDK"/> - <PATHPAS value=".;"/> - <PATHRC value=".;"/> - <PATHASM value=".;"/> - <DEBUGLIBPATH value="$(BCB)\lib\debug"/> - <RELEASELIBPATH value="$(BCB)\lib\release"/> - <LINKER value="tlink32"/> - <USERDEFINES value="_DEBUG"/> - <SYSDEFINES value="NO_STRICT;_NO_VCL"/> - <MAINSOURCE value="sbj.bpf"/> - <INCLUDEPATH value="..\SDK;$(BCB)\include;$(BCB)\include\vcl"/> - <LIBPATH value="..\SDK;$(BCB)\lib\obj;$(BCB)\lib"/> - <WARNINGS value="-w-par"/> - </MACROS> - <OPTIONS> - <IDLCFLAGS value="-I..\SDK -I$(BCB)\include -I$(BCB)\include\vcl -src_suffix cpp -D_DEBUG -boa"/> - <CFLAG1 value="-Od -H=$(BCB)\lib\vcl50.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -tWC - -tWM -c"/> - <PFLAGS value="-$YD -$W -$O- -v -JPHNE -M"/> - <RFLAGS value=""/> - <AFLAGS value="/mx /w2 /zd"/> - <LFLAGS value="-D"" -ap -Tpe -x -Gn -v"/> - </OPTIONS> - <LINKER> - <ALLOBJ value="c0x32.obj $(OBJFILES)"/> - <ALLRES value="$(RESFILES)"/> - <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mt.lib"/> - </LINKER> - <IDEOPTIONS> -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 - -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= - -[Debugging] -DebugSourceDirs=$(BCB)\source\vcl - -[Parameters] -RunParams= -HostApplication= -RemoteHost= -RemotePath= -RemoteDebug=0 - -[Compiler] -ShowInfoMsgs=0 -LinkDebugVcl=0 -LinkCGLIB=0 - -[CORBA] -AddServerUnit=1 -AddClientUnit=1 -PrecompiledHeaders=1 - </IDEOPTIONS> -</PROJECT> \ No newline at end of file diff --git a/xtrn/sbj/sbj.c b/xtrn/sbj/sbj.c deleted file mode 100644 index 36966cac71..0000000000 --- a/xtrn/sbj/sbj.c +++ /dev/null @@ -1,1907 +0,0 @@ -/* SBJ.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/************************/ -/* Synchronet Blackjack */ -/************************/ - -/*******************************************************/ -/* Multiuser Blackjack game for Synchronet BBS systems */ -/*******************************************************/ - -/****************************************************************************/ -/* This source code is completely Public Domain and can be modified and */ -/* distributed freely (as long as changes are documented). */ -/* It is meant as an example to programmers of how to use the XSDK */ -/****************************************************************************/ - -/***********/ -/* History */ -/****************************************************************************\ - - Many bugs. Especially multiplayer. -v1.0 - Many bugs fixed. Timing problems still exist. -v1.01 - Fixed yet more bugs. No more timing problems. Appears bullet-proof. -v1.02 - Fixed dealer card up always showing card symbol (even when symbols off). - Added ctrl-e answer detection and user notification. - Fixed three 7's bug. - Raised maximum number of decks to 100 for large multinode systems. - Fixed /<CR> bug. - Fixed multiple split bug. - Fixed non-symbols being sent to other nodes bug. - Changed this node's hands to say "You" instead of the user name. -v1.03 - Changed the warning and timeout times -v1.04 - Fixed symbols being displayed on dealer's hand even when disabled. - Made different inactivity warning and timeout values for the main - menu and when in play. -v1.05 - Fixed invalid (usually negative) card bug. THELP random() doc error. - Card now actually contains all the cards minus one. - Fixed multinode play join and hang bug. -v1.06 - If player gets blackjack and dealer gets 21, player wins. Used to push. -v1.07 - Fixed split, then double bug. -v1.08 - Replaced bioskey(1) calls with inkey() and used XSDK v2.0 with node - intercommunication with users on BBS or in other external programs. -v2.00 - Fixed problem with loosing first character of chat lines - Added DESQview awareness -v2.01 - Replaced all calls to delay() with fdelay() -v2.02 - Listing users now displays what external program they're running. - Fixed problem with max bet being too small when users have over - 65mb of credit. -v2.02 - XSDK (and consequently SBJ) now supports shrinking Synchronet to run - (available in v1b r1). - SBBSNODE environment variable will be used for the current node's dir - if the node dir is not specified on the command line. -v2.03 - XSDK and SBJ now support the new message services of Synchronet - (added in v1b r2) for more full-proof internode messaging. -v2.10 - New XSDK that supports new file retrieval node status display. -v2.11 - Changed getnodemsg to eliminate tiny void where messages could fall. - - -\****************************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <ctype.h> - -#include "xsdk.h" - -#define MAX_DECKS 100 -#define MAX_CARDS 10 /* maximum number of cards per hand */ -#define MAX_HANDS 4 /* maximum number of hands per player */ - -#define DEBUG 0 - -#define J 11 /* jack */ -#define Q 12 /* queen */ -#define K 13 /* king */ -#define A 14 /* ace */ - -#define H 0 /* heart */ -#define D 1 /* diamond */ -#define C 2 /* club */ -#define S 3 /* spade */ - /* bits used in misc variable */ -#define INPLAY (1<<0) /* hand in play */ - -enum { /* values for status bytes */ - BET /* betting */ - ,WAIT /* waiting for turn */ - ,PLAY /* playing his hand */ - ,SYNC_P /* In sync area - player */ - ,SYNC_D /* In sync area - dealer */ - }; - -typedef struct { char value, suit; } card_t; - -card_t newdeck[52]={ - 2,H, 2,D, 2,C, 2,S, - 3,H, 3,D, 3,C, 3,S, - 4,H, 4,D, 4,C, 4,S, - 5,H, 5,D, 5,C, 5,S, - 6,H, 6,D, 6,C, 6,S, - 7,H, 7,D, 7,C, 7,S, - 8,H, 8,D, 8,C, 8,S, - 9,H, 9,D, 9,C, 9,S, - 10,H,10,D,10,C,10,S, - J,H, J,D, J,C, J,S, - Q,H, Q,D, Q,C, Q,S, - K,H, K,D, K,C, K,S, - A,H, A,D, A,C, A,S }; - -uchar misc; -uchar curplayer; -uchar total_decks,sys_decks; -uchar total_nodes; -int cur_card; -uchar dc; -card_t dealer[MAX_CARDS]; -int gamedab; /* file handle for data file */ -card_t card[MAX_DECKS*52]; -card_t player[MAX_HANDS][MAX_CARDS]; -char hands,pc[MAX_HANDS]; -uchar total_players; -uchar symbols=1; -char autoplay=0; -int logit=0,tutor=0; -uint node[MAX_NODES]; /* the usernumber in each node */ -char status[MAX_NODES]; -ulong credits; -uint bet[MAX_HANDS],ibet,min_bet,max_bet; -char tmp[81]; -char *UserSays="\1n\1m\1h%s \1n\1msays \"\1c\1h%s\1n\1m\"\r\n"; -char *UserWhispers="\1n\1m\1h%s \1n\1mwhispers \"\1c\1h%s\1n\1m\"\r\n"; -char *ShoeStatus="\r\n\1_\1w\1hShoe: %u/%u\r\n"; - -#ifndef SBJCLEAN - -void play(void); -char *cardstr(card_t card); -char hand(card_t card[MAX_CARDS], char count); -char soft(card_t card[MAX_CARDS], char count); -char pair(card_t card[MAX_CARDS], char count); -void getgamedat(char lockit); -void putgamedat(void); -void getcarddat(void); -void putcarddat(void); -void shuffle(void); -void waitturn(void); -void nextplayer(void); -char lastplayer(void); -char firstplayer(void); -void getnodemsg(void); -void putnodemsg(char *msg, uint nodenumber); -void putallnodemsg(char *msg); -void syncplayer(void); -void syncdealer(void); -void moduserdat(void); -char *hit(void); -char *stand(void); -char *doubit(void); -char *split(void); -void open_gamedab(void); -void create_gamedab(void); -char *activity(char status_type); -void chat(void); -void listplayers(void); -char *joined(void); -char *left(void); -void strip_symbols(char *str); -void debug(void); - -int my_random(int n) -{ - float f; - - if(n<2) - return(0); - f=(float)rand()/(float)RAND_MAX; - - return((int)(n*f)); -} - -/****************************************************************************/ -/* Entry point */ -/****************************************************************************/ -int main(int argc, char **argv) -{ - char str[81],compiler[32],*p; - int i,file; - FILE *stream; - - node_dir[0]=0; - for(i=1;i<argc;i++) - if(!stricmp(argv[i],"/L")) - logit=1; - else if(!stricmp(argv[i],"/T")) - tutor=2; - else if(!stricmp(argv[i],"/S")) - tutor=1; - else strcpy(node_dir,argv[i]); - - p=getenv("SBBSNODE"); - if(!node_dir[0] && p) - strcpy(node_dir,p); - - if(!node_dir[0]) { /* node directory not specified */ - printf("usage: sbj <node directory> [/options]\r\n"); - printf("\r\noptions: L = log wins/losses for each day\r\n"); - getch(); - return(1); } - - if(node_dir[strlen(node_dir)-1]!='\\' - && node_dir[strlen(node_dir)-1]!='/') /* make sure node_dir ends in '\' */ - strcat(node_dir,"/"); - - initdata(); /* read XTRN.DAT and more */ - credits=user_cdt; - total_nodes=sys_nodes; - - remove("debug.log"); - - if((file=nopen("sbj.cfg",O_RDONLY))==-1) { /* open config file */ - bputs("Error opening sbj.cfg\r\n"); - pause(); - return(1); } - if((stream=fdopen(file,"rb"))==NULL) { /* convert to stream */ - bputs("Error converting sbj.cfg handle to stream\r\n"); - pause(); - return(1); } - fgets(str,81,stream); /* number of decks in shoe */ - total_decks=sys_decks=atoi(str); - fgets(str,81,stream); /* min bet (in k) */ - min_bet=atoi(str); - fgets(str,81,stream); /* max bet (in k) */ - max_bet=atoi(str); - fgets(str,81,stream); /* default bet (in k) */ - ibet=atoi(str); - fclose(stream); - if(!total_decks || total_decks>MAX_DECKS) { - bputs("Invalid number of decks in sbj.cfg\r\n"); - pause(); - return(1); } - if(!max_bet) { - bputs("Invalid max bet in sbj.cfg\r\n"); - pause(); - return(1); } - if(min_bet>max_bet) { - bputs("Invalid min bet in sbj.cfg\r\n"); - pause(); - return(1); } - if(ibet>max_bet || ibet<min_bet) { - bputs("Invalid default bet in sbj.cfg\r\n"); - pause(); - return(1); } - - if(!fexist("card.dab")) { - cur_card=0; - dc=0; - memset(dealer,0,sizeof(dealer)); - memset(card,0,sizeof(card)); - putcarddat(); } - else { - getcarddat(); - if(total_decks!=sys_decks) { - remove("card.dab"); - total_decks=sys_decks; - putcarddat(); } } - - if(!fexist("game.dab")) /* File's not there */ - create_gamedab(); - - open_gamedab(); - - getgamedat(0); - if(total_nodes!=sys_nodes) { /* total nodes changed */ - close(gamedab); - total_nodes=sys_nodes; - create_gamedab(); - open_gamedab(); } - - srand((unsigned)time(NULL)); - -#ifdef __16BIT__ - while(_bios_keybrd(1)) /* clear input buffer */ - _bios_keybrd(0); -#endif - - putchar(5); /* ctrl-e */ - mswait(500); - if(kbhit()) { -#ifdef __16BIT__ - while(_bios_keybrd(1)) - _bios_keybrd(0); -#else - getkey(0); -#endif - bputs("\r\n\1r\1h\1i*** ATTENTION ***\1n\1h\r\n"); - bputs("\r\nSynchronet Blackjack uses Ctrl-E (ENQ) for the 'club' card " - "symbol."); - bputs("\r\nYour terminal responded to this control character with an " - "answerback string."); - bputs("\r\nYou will need to disable all Ctrl-E (ENQ) answerback " - "strings (Including \r\nCompuserve Quick B transfers) if you wish to " - "toggle card symbols on.\r\n\r\n"); - symbols=0; - pause(); } - - getgamedat(1); - node[node_num-1]=0; - putgamedat(); - - /* Override default mnemonic colors */ - mnehigh=RED|HIGH; - mnelow=CYAN|HIGH; - - /* Override default inactivity timeout values */ - sec_warn=120; - sec_timeout=180; - - COMPILER_DESC(compiler); - -#define SBJ_INDENT " " - while(1) { - cls(); - sprintf(str,"\1n\1h\1cSynchronet \1rBlackjack! \1cv3.11 for %s\r\n" - ,PLATFORM_DESC); - center(str); - sprintf(str,"\1w(XSDK v%s %s %s)\r\n\r\n" - ,xsdk_ver,compiler,__DATE__); - center(str); - - aborted=0; - mnemonics(SBJ_INDENT"~Instructions\r\n"); - mnemonics(SBJ_INDENT"~Join/Begin Game\r\n"); - mnemonics(SBJ_INDENT"~List Players\r\n"); - mnemonics(SBJ_INDENT"~Rules of the Game\r\n"); - mnemonics(SBJ_INDENT"~Toggle Card Symbols\r\n"); - sprintf(str,SBJ_INDENT"~Quit to %s\r\n",sys_name); - mnemonics(str); - nodesync(); - bprintf("\1_\r\n"SBJ_INDENT"\1y\1hWhich: \1n"); - switch(getkeys("IJBLRTQ|!",0)) { - #if DEBUG - case '!': - if(!com_port) - autoplay=1; - break; - case '|': - debug(); - break; - #endif - case 'I': - cls(); - printfile("sbj.msg"); - break; - case 'L': - listplayers(); - bprintf(ShoeStatus,cur_card,total_decks*52); - break; - case 'R': - bprintf("\1n\1c\r\nMinimum bet: \1h%uk",min_bet); - bprintf("\1n\1c\r\nMaximum bet: \1h%uk\r\n",max_bet); - bprintf("\1w\1h\r\nCard decks in shoe: \1h%u\r\n",sys_decks); - break; - case 'T': - symbols=!symbols; - bprintf("\1_\1w\r\nCard symbols now: %s\r\n",symbols ? "ON":"OFF"); - break; - case 'Q': - exit(0); - case 'J': - case 'B': - sec_warn=60; /* Override default inactivity timeout values */ - sec_timeout=90; - play(); - sec_warn=120; - sec_timeout=180; - break; - } - } -} - -#if DEBUG -void debug() -{ - int i; - -if(user_level<90) - return; -getgamedat(0); -getcarddat(); - -bprintf("\r\nDeck (%d) Current: %d\r\n\r\n",total_decks,cur_card); -for(i=0;i<total_decks*52;i++) { - if(!(i%11)) - bputs("\r\n"); - bprintf("%3d:%-11s",i,cardstr(card[i])); } - -pause(); -bprintf("\1n\r\nDealer (%d)\r\n\r\n",dc); -for(i=0;i<dc;i++) - bprintf("%s ",cardstr(dealer[i])); -bprintf("\1n\r\nNodes (%d) Current: %d\r\n\r\n" - ,total_nodes,curplayer); -for(i=0;i<total_nodes;i++) - bprintf("%d: node=%d status=%d %s\r\n",i+1,node[i] - ,status[i],activity(status[i])); -} - -void debugline(char *line) -{ - char str[256]; - int file; - time_t now; - struct dosdate_t date; - struct dostime_t curtime; - -#if 1 -now=time(NULL); -unixtodos(now,&date,&curtime); -if((file=nopen("debug.log",O_WRONLY|O_APPEND|O_CREAT))==-1) - return; -sprintf(str,"%d %02u:%02u:%02u %s\r\n" - ,node_num,curtime.ti_hour,curtime.ti_min,curtime.ti_sec,line); -write(file,str,strlen(str)); -close(file); -#endif -} - -#endif - -void suggest(char action) -{ -bputs("Dealer suggests you "); -switch(action) { - case 'H': - bputs("hit"); - break; - case 'S': - bputs("stand"); - break; - case 'D': - bputs("double"); - break; - case 'P': - bputs("split"); - break; } -bputs("\r\n"); -} - -void wrong(char action) -{ -#ifdef __16BIT__ -sound(100); -mswait(500); -nosound(); -#endif -bputs("Dealer says you should have "); -switch(action) { - case 'H': - bputs("hit"); - break; - case 'S': - bputs("stood"); - break; - case 'D': - bputs("doubled"); - break; - case 'P': - bputs("split"); - break; } -bputs("\r\n"); -} - -/****************************************************************************/ -/* This function is the actual game playing loop. */ -/****************************************************************************/ -void play() -{ - char str[256],str2[256],log[81],done,doub,dh,split_card,suggestion - ,*YouWereDealt="\1n\1k\0015 You \1n\1m were dealt: %s\r\n" - ,*UserWasDealt="\1n\1m\1h%s\1n\1m was dealt: %s\r\n" - ,*YourHand="\1n\1k\0015 You \1n\1m (%2d) %s" - ,*UserHand="\1n\1m\1h%-25s \1n\1m(%2d) %s" - ,*DealerHand="\1n\1hDealer \1n\1m(%2d) " - ,*Bust="\1n\1r\1hBust\1n\r\n" - ,*Natural="\1g\1h\1iNatural " - ,*Three7s="\1r\1h\1iThree 7's " - ,*Blackjack="\1n\0011\1k Blackjack! \1n\r\n" - ,*TwentyOne="\1n\0012\1k Twenty-one \1n\r\n"; - int h,i,j,file; - uint max; - long val; - time_t start,now; - struct tm* tm; - -sprintf(str,"MESSAGE.%d",node_num); /* remove message if waiting */ -if(fexist(str)) - remove(str); - -getgamedat(0); -if(node[node_num-1]) { - getgamedat(1); - node[node_num-1]=0; - putgamedat(); - getgamedat(0); } - -if(total_players && misc&INPLAY) { - bputs("\r\n\1hWaiting for end of hand (^A to abort)...\1n"); - start=now=time(NULL); - getgamedat(0); - while(total_players && misc&INPLAY) { - if((i=inkey(0))!=0) { /* if key was hit */ - if(i==1) { /* if ctrl-a */ - bputs("\r\n"); - return; } } /* return */ - mswait(100); - getgamedat(0); - now=time(NULL); - if(now-start>300) { /* only wait up to 5 minutes */ - bputs("\r\ntimeout\r\n"); - return; } } - bputs("\r\n"); } - -getgamedat(1); -node[node_num-1]=user_number; -putgamedat(); - -if(!total_players) - shuffle(); -else - listplayers(); - -sprintf(str,"\1n\1m\1h%s \1n\1m%s\r\n",user_name,joined()); -putallnodemsg(str); - -while(1) { - aborted=0; - #if DEBUG - debugline("top of loop"); - #endif - if(autoplay) - lncntr=0; - bprintf(ShoeStatus,cur_card,total_decks*52); - if(cur_card>(total_decks*52)-(total_players*10)-10 && lastplayer()) - shuffle(); - getgamedat(1); - misc&=~INPLAY; - status[node_num-1]=BET; - node[node_num-1]=user_number; - putgamedat(); - - bprintf("\r\n\1n\1cYou have \1h%s\1n\1ck credits\r\n" - ,ultoac(credits/1024L,str)); - if(credits<min_bet/1024) { - bprintf("\1n\1cMinimum bet: \1h%uk\r\n",min_bet); - bputs("\1n\1r\1hCome back when you have more credits.\r\n"); - break; } - if(credits/1024L>(ulong)max_bet) - max=max_bet; - else - max=credits/1024L; - sprintf(str,"\r\nBet amount (in kilobytes) or ~Quit [%u]: " - ,ibet<credits/1024L ? ibet : credits/1024L); - chat(); - mnemonics(str); - if(autoplay && kbhit()) - autoplay=0; - if(autoplay) - i=ibet; - else - i=getnum(max); - if(i==-1) /* if user hit ^C or 'Q' */ - break; - bputs("\r\n"); - if(i) /* if user entered a value */ - bet[0]=i; - else /* if user hit enter */ - bet[0]=ibet<credits/1024L ? ibet : credits/1024L; - if(bet[0]<min_bet) { - bprintf("\1n\1cMinimum bet: \1h%uk\r\n",min_bet); - bputs("\1n\1r\1hCome back when you're ready to bet more.\r\n"); - break; } - ibet=bet[0]; - getgamedat(0); /* to get all new arrivals */ - sprintf(str,"\1m\1h%s\1n\1m bet \1n\1h%u\1n\1mk\r\n",user_name,bet[0]); - putallnodemsg(str); - - pc[0]=2; /* init player's 1st hand to 2 cards */ - for(i=1;i<MAX_HANDS;i++) /* init player's other hands to 0 cards */ - pc[i]=0; - hands=1; /* init total player's hands to 1 */ - - getgamedat(1); /* first come first serve to be the */ - for(i=0;i<total_nodes;i++) /* dealer in control of sync */ - if(node[i] && status[i]==SYNC_D) - break; - if(i==total_nodes) { - #if DEBUG - debugline("syncdealer"); - #endif - syncdealer(); } /* all players meet here */ - else { /* first player is current after here */ - #if DEBUG - debugline("syncplayer"); - #endif - syncplayer(); } /* game is closed (INPLAY) at this point */ - - #if DEBUG - debugline("waitturn 1"); - #endif - waitturn(); - getnodemsg(); - /* Initial deal card #1 */ - getcarddat(); - player[0][0]=card[cur_card++]; - putcarddat(); - sprintf(str,YouWereDealt,cardstr(card[cur_card-1])); - if(!symbols) - strip_symbols(str); - bputs(str); - sprintf(str,UserWasDealt,user_name,cardstr(card[cur_card-1])); - putallnodemsg(str); - - if(lastplayer()) { - getcarddat(); - dealer[0]=card[cur_card++]; - dc=1; - putcarddat(); } - nextplayer(); - #if DEBUG - debugline("waitturn 2"); - #endif - waitturn(); - getnodemsg(); - - getcarddat(); /* Initial deal card #2 */ - player[0][1]=card[cur_card++]; - putcarddat(); - sprintf(str,YouWereDealt,cardstr(card[cur_card-1])); - if(!symbols) - strip_symbols(str); - bputs(str); - sprintf(str,UserWasDealt,user_name,cardstr(card[cur_card-1])); - putallnodemsg(str); - - if(lastplayer()) { - getcarddat(); - dealer[1]=card[cur_card++]; - dc=2; - putcarddat(); } - nextplayer(); - #if DEBUG - debugline("waitturn 3"); - #endif - waitturn(); - getnodemsg(); - getcarddat(); - - for(i=0;i<hands;i++) { - if(autoplay) - lncntr=0; - done=doub=0; - while(!done && pc[i]<MAX_CARDS && cur_card<total_decks*52) { - h=hand(player[i],pc[i]); - str[0]=0; - for(j=0;j<pc[i];j++) { - strcat(str,cardstr(player[i][j])); - strcat(str," "); } - j=bstrlen(str); - while(j++<19) - strcat(str," "); - if(h>21) { - strcat(str,Bust); - sprintf(str2,YourHand,h,str); - if(!symbols) - strip_symbols(str2); - bputs(str2); - sprintf(str2,UserHand,user_name,h,str); - putallnodemsg(str2); - break; } - if(h==21) { - if(pc[i]==2) { /* blackjack */ - if(player[i][0].suit==player[i][1].suit) - strcat(str,Natural); - strcat(str,Blackjack); } - else { - if(player[i][0].value==7 - && player[i][1].value==7 - && player[i][2].value==7) - strcat(str,Three7s); - strcat(str,TwentyOne); } - sprintf(str2,YourHand,h,str); - if(!symbols) - strip_symbols(str2); - bputs(str2); - sprintf(str2,UserHand,user_name,h,str); - putallnodemsg(str2); - // fdelay(500); - break; } - strcat(str,"\r\n"); - sprintf(str2,YourHand,h,str); - if(!symbols) - strip_symbols(str2); - bputs(str2); - sprintf(str2,UserHand,user_name,h,str); - putallnodemsg(str2); - if(doub) - break; - sprintf(str,"\1n\1hDealer\1n\1m card up: %s\r\n" - ,cardstr(dealer[1])); - if(!symbols) - strip_symbols(str); - bputs(str); - - if(tutor) { - if(pc[i]==2) - split_card=pair(player[i],pc[i]); - else - split_card=0; - if(split_card==A - || (split_card==9 && (dealer[1].value<7 - || (dealer[1].value>7 && dealer[1].value<10))) - || split_card==8 - || (split_card==7 && dealer[1].value<9) - || (split_card==6 && dealer[1].value<7) - || (split_card==4 && dealer[1].value==5) - || (split_card && split_card<4 && dealer[1].value<8)) - suggestion='P'; - else if(soft(player[i],pc[i])) { - if(h>18) - suggestion='S'; - else if(pc[i]==2 - && ((h==18 - && dealer[1].value>3 && dealer[1].value<7) - || (h==17 - && dealer[1].value>2 && dealer[1].value<7) - || (h>13 - && dealer[1].value>3 && dealer[1].value<7) - || (h==12 - && dealer[1].value>4 && dealer[1].value<7))) - suggestion='D'; - else - suggestion='H'; } - else { /* hard */ - if(h>16 || (h>13 && dealer[1].value<7) - || (h==12 && dealer[1].value>3 && dealer[1].value<7)) - suggestion='S'; - else if(pc[i]==2 - && (h==11 || (h==10 && dealer[1].value<10) - || (h==9 && dealer[1].value<7))) - suggestion='D'; - else - suggestion='H'; } } - - if(tutor==1) - suggest(suggestion); - strcpy(str,"\r\n~Hit"); - strcpy(tmp,"H\r"); - if(bet[i]+ibet<=credits/1024L && pc[i]==2) { - strcat(str,", ~Double"); - strcat(tmp,"D"); } - if(bet[i]+ibet<=credits/1024L && pc[i]==2 && hands<MAX_HANDS - && player[i][0].value==player[i][1].value) { - strcat(str,", ~Split"); - strcat(tmp,"S"); } - strcat(str,", or [Stand]: "); - chat(); - mnemonics(str); - if(autoplay && kbhit()) - autoplay=0; - - - if(autoplay) { - lncntr=0; - bputs("\r\n"); - strcpy(str,stand()); - bputs(str); - putallnodemsg(str); - done=1; } - else - switch(getkeys(tmp,0)) { - case 'H': /* hit */ - if(tutor==2 && suggestion!='H') - wrong(suggestion); - strcpy(str,hit()); - bputs(str); - putallnodemsg(str); - getcarddat(); - player[i][pc[i]++]=card[cur_card++]; - putcarddat(); - break; - case 'D': /* double down */ - if(tutor==2 && suggestion!='D') - wrong(suggestion); - strcpy(str,doubit()); - bputs(str); - putallnodemsg(str); - getcarddat(); - player[i][pc[i]++]=card[cur_card++]; - putcarddat(); - doub=1; - bet[i]+=ibet; - break; - case 'S': /* split */ - if(tutor==2 && suggestion!='P') - wrong(suggestion); - strcpy(str,split()); - bputs(str); - putallnodemsg(str); - player[hands][0]=player[i][1]; - getcarddat(); - player[i][1]=card[cur_card++]; - player[hands][1]=card[cur_card++]; - putcarddat(); - pc[hands]=2; - bet[hands]=ibet; - hands++; - break; - case CR: - if(tutor==2 && suggestion!='S') - wrong(suggestion); - strcpy(str,stand()); - bputs(str); - putallnodemsg(str); - done=1; - break; } } } - - if(lastplayer()) { /* last player plays the dealer's hand */ - getcarddat(); - while(hand(dealer,dc)<17 && dc<MAX_CARDS && cur_card<total_decks*52) - dealer[dc++]=card[cur_card++]; - putcarddat(); } - - nextplayer(); - #if DEBUG - debugline("waitturn 4"); - #endif - waitturn(); - getnodemsg(); - - if(firstplayer()==node_num) { - strcpy(str,"\1n\0014\1h Final \1n\r\n"); - bputs(str); - putallnodemsg(str); } - getcarddat(); - dh=hand(dealer,dc); /* display dealer's hand */ - sprintf(str,DealerHand,dh); - for(i=0;i<dc;i++) { - strcat(str,cardstr(dealer[i])); - strcat(str," "); } - i=bstrlen(str); - while(i++<50) /* was 50 */ - strcat(str," "); - if(dh>21) { - strcat(str,Bust); - if(!symbols) - strip_symbols(str); - bputs(str); } - else if(dh==21) { - if(dc==2) { /* blackjack */ - if(dealer[0].suit==dealer[1].suit) - strcat(str,Natural); - strcat(str,Blackjack); } - else { /* twenty-one */ - if(dc==3 && dealer[0].value==7 && dealer[1].value==7 - && dealer[2].value==7) - strcat(str,Three7s); - strcat(str,TwentyOne); } - if(!symbols) - strip_symbols(str); - bputs(str); } - else { - if(!symbols) - strip_symbols(str); - bprintf("%s\r\n",str); } - - for(i=0;i<hands;i++) { /* display player's hand(s) */ - h=hand(player[i],pc[i]); - str[0]=0; - for(j=0;j<pc[i];j++) { - strcat(str,cardstr(player[i][j])); - strcat(str," "); } - j=bstrlen(str); - while(j++<19) - strcat(str," "); - if(logit) { - now=time(NULL); - tm=localtime(&now); - sprintf(log,"%02d%02d%02d.log" /* log winnings */ - ,tm->tm_mon+1,tm->tm_mday,tm->tm_year%100); - if((file=nopen(log,O_RDONLY))!=-1) { - read(file,tmp,filelength(file)); - tmp[filelength(file)]=0; - val=atol(tmp); - close(file); } - else - val=0L; - if((file=nopen(log,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - bprintf("error opening %s\r\n",log); - return; } } - if(h<22 && (h>dh || dh>21 /* player won */ - || (h==21 && pc[i]==2 && dh==21 && dh>2))) { /* blackjack */ - j=bet[i]; /* and dealer got 21 */ - if(h==21 && /* natural blackjack or three 7's */ - ((player[i][0].value==7 && player[i][1].value==7 - && player[i][2].value==7) - || (pc[i]==2 && player[i][0].suit==player[i][1].suit))) - j*=2; - else if(h==21 && pc[i]==2) /* regular blackjack */ - j*=1.5; /* blackjack pays 1 1/2 to 1 */ - sprintf(tmp,"\1n\1h\1m\1iWon!\1n\1h %u\1n\1mk",j); - strcat(str,tmp); - credits+=j*1024L; - val-=j*1024L; - moduserdat(); } - else if(h<22 && h==dh) - strcat(str,"\1n\1hPush"); - else { - strcat(str,"\1nLost"); - credits-=bet[i]*1024L; - val+=bet[i]*1024L; - moduserdat(); } - if(logit) { - sprintf(tmp,"%ld",val); - write(file,tmp,strlen(tmp)); - close(file); } /* close winning log */ - strcat(str,"\1n\r\n"); - sprintf(str2,YourHand,h,str); - if(!symbols) - strip_symbols(str2); - bputs(str2); - sprintf(str2,UserHand,user_name,h,str); - putallnodemsg(str2); } - - nextplayer(); - if(!lastplayer()) { - #if DEBUG - debugline("lastplayer waitturn"); - #endif - waitturn(); - nextplayer(); } - #if DEBUG - debugline("end of loop"); - #endif - getnodemsg(); } - -getgamedat(1); -node[node_num-1]=0; -putgamedat(); -sprintf(str,"\1n\1m\1h%s \1n\1m%s\r\n",user_name,left()); -putallnodemsg(str); -} - -/****************************************************************************/ -/* This function returns a static string that describes the status byte */ -/****************************************************************************/ -char *activity(char status_type) -{ - static char str[50]; - -switch(status_type) { - case BET: - strcpy(str,"betting"); - break; - case WAIT: - strcpy(str,"waiting for turn"); - break; - case PLAY: - strcpy(str,"playing"); - break; - case SYNC_P: - strcpy(str,"synchronizing"); - break; - case SYNC_D: - strcpy(str,"synchronizing (dealer)"); - break; - default: - strcat(str,"UNKNOWN"); - break; } -return(str); -} - -/****************************************************************************/ -/* This function returns the string that represents a playing card. */ -/****************************************************************************/ -char *cardstr(card_t card) -{ - static char str[20]; - char tmp[20]; - -strcpy(str,"\1n\0017"); /* card color - background always white */ -if(card.suit==H || card.suit==D) - strcat(str,"\1r"); /* hearts and diamonds - foreground red */ -else - strcat(str,"\1k"); /* spades and clubs - foreground black */ -if(card.value>10) /* face card */ - switch(card.value) { - case J: - strcat(str,"J"); - break; - case Q: - strcat(str,"Q"); - break; - case K: - strcat(str,"K"); - break; - case A: - strcat(str,"A"); - break; } -else { - sprintf(tmp,"%d",card.value); - strcat(str,tmp); } -switch(card.suit) { /* suit */ - case H: - strcat(str,"\3"); - break; - case D: - strcat(str,"\4"); - break; - case C: - strcat(str,"\5"); - break; - case S: - strcat(str,"\6"); - break; } -strcat(str,"\1n"); -return(str); -} - - -/****************************************************************************/ -/* This function returns the best value of a given hand. */ -/****************************************************************************/ -char hand(card_t card[MAX_CARDS],char count) -{ - char c,total=0,ace=0; - -for(c=0;c<count;c++) { - if(card[c].value==A) { /* Ace */ - if(total+11>21) - total++; - else { - ace++; - total+=11; } } - else if(card[c].value>=J) /* Jack, Queen, King */ - total+=10; - else /* Number cards */ - total+=card[c].value; } -while(total>21 && ace) { /* ace is low if bust */ - total-=10; - ace--; } -return(total); -} - -/****************************************************************************/ -/* This function returns number of soft aces in a given hand */ -/****************************************************************************/ -char soft(card_t card[MAX_CARDS],char count) -{ - char c,total=0,ace=0; - -for(c=0;c<count;c++) { - if(card[c].value==A) { /* Ace */ - if(total+11>21) - total++; - else { - ace++; - total+=11; } } - else if(card[c].value>=J) /* Jack, Queen, King */ - total+=10; - else /* Number cards */ - total+=card[c].value; } -while(total>21 && ace) { /* ace is low if bust */ - total-=10; - ace--; } -return(ace); -} - -/****************************************************************************/ -/* This function returns card that is paired in the hand */ -/****************************************************************************/ -char pair(card_t card[MAX_CARDS],char count) -{ - char c,d; - -for(c=0;c<count;c++) - for(d=c+1;d<count;d++) - if(card[c].value==card[d].value) /* Ace */ - return(card[c].value); -return(0); -} - - -/****************************************************************************/ -/* This function shuffles the deck. */ -/****************************************************************************/ -void shuffle() -{ - char str[81]; - uint i,j; - card_t shufdeck[52*MAX_DECKS]; - - -getcarddat(); - -sprintf(str,"\1_\1w\1h\r\nShuffling %d Deck Shoe...",total_decks); -bputs(str); -strcat(str,"\r\n"); /* add crlf for other nodes */ -putallnodemsg(str); - -for(i=0;i<total_decks;i++) - memcpy(shufdeck+(i*52),newdeck,sizeof(newdeck)); /* fresh decks */ - -i=0; -while(i<(uint)(total_decks*52)-1) { - j=my_random((total_decks*52)-1); - if(!shufdeck[j].value) /* card already used */ - continue; - card[i]=shufdeck[j]; - shufdeck[j].value=0; /* mark card as used */ - i++; } - -cur_card=0; -for(i=0;i<MAX_HANDS;i++) - pc[i]=0; -hands=0; -dc=0; -putcarddat(); -bputs("\r\n"); -} - -/****************************************************************************/ -/* This function reads and displays a message waiting for this node, if */ -/* there is one. */ -/****************************************************************************/ -void getnodemsg() -{ - char str[81], *buf; - int file; - ulong length; - -nodesync(); -sprintf(str,"message.%d",node_num); -if(flength(str)<1L) /* v1.02 fix */ - return; -if((file=nopen(str,O_RDWR))==-1) { - bprintf("Couldn't open %s\r\n",str); - return; } -length=filelength(file); -if((buf=malloc(length+1L))==NULL) { - close(file); - bprintf("\7\r\ngetnodemsg: Error allocating %lu bytes of memory for %\r\n" - ,length+1L,str); - return; } -buf[read(file,buf,length)]=0; -chsize(file,0); -close(file); -if(!symbols) - strip_symbols(buf); -bputs(buf); -free(buf); -} - -/****************************************************************************/ -/* This function creates a message for a certain node. */ -/****************************************************************************/ -void putnodemsg(char *msg, uint nodenumber) -{ - char str[81]; - int file; - -sprintf(str,"message.%d",nodenumber); -if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - bprintf("\r\n\7putnodemsg: error opening/creating %s\r\n",str); - return; } -write(file,msg,strlen(msg)); -close(file); -} - -/****************************************************************************/ -/* This function creates a message for all nodes in the game. */ -/****************************************************************************/ -void putallnodemsg(char *msg) -{ - int i; - -for(i=0;i<total_nodes;i++) - if(node[i] && i+1!=node_num) - putnodemsg(msg,i+1); -} - -/****************************************************************************/ -/* This function waits until it is the current player. */ -/****************************************************************************/ -void waitturn() -{ - time_t start,now; - -start=now=time(NULL); -getgamedat(1); -status[node_num-1]=WAIT; -putgamedat(); -while(curplayer!=node_num) { - chat(); - mswait(100); - getgamedat(0); - if(curplayer && !node[curplayer-1] /* || status[curplayer-1]==BET */ ) - nextplayer(); /* current player is not playing? */ - - if(!node[node_num-1]) { /* current node not in game? */ - getgamedat(1); - node[node_num-1]=user_number; /* fix it */ - putgamedat(); } - - now=time(NULL); - if(now-start>300) { /* only wait upto 5 minutes */ - bputs("\r\nwaitturn: timeout\r\n"); - break; } } -getgamedat(1); -status[node_num-1]=PLAY; -putgamedat(); -} - -/****************************************************************************/ -/* This is the function that is called to see if the user has hit a key, */ -/* and if so, read in a line of chars and send them to the other nodes. */ -/****************************************************************************/ -void chat() -{ - char str1[150],str2[256],ch; - int i; - -aborted=0; -if((ch=inkey(0))!=0 || wordwrap[0]) { - if(ch=='/') { - bputs("\1n\1y\1hCommand: \1n"); - ch=getkeys("?LS|%\r",0); - switch(ch) { - case CR: - return; - #if DEBUG - case '|': - debug(); - return; - #endif - case '%': - if(!com_port) /* only if local */ - exit(0); - break; - case '?': - mnemonics("\r\n~List Players"); - mnemonics("\r\n~Send Private Message to Player"); - bputs("\r\n"); - return; - case 'L': - listplayers(); - bprintf(ShoeStatus,cur_card,total_decks*52); - return; - case 'S': - listplayers(); - bputs("\1n\r\n\1y\1hWhich node: \1n"); - i=getnum(sys_nodes); - getgamedat(0); - if(i>0 && i!=node_num && node[i-1]) { - bputs("\r\n\1n\1y\1hMessage: "); - if(getstr(str1,50,K_LINE)) { - sprintf(str2,UserWhispers,user_name - ,str1); - putnodemsg(str2,i); } } - else - bputs("\1n\r\n\1r\1hInvalid node.\1n\r\n"); - return; } } - ungetkey(ch); - if(!getstr(str1,50,K_CHAT|K_WRAP)) - return; - sprintf(str2,UserSays,user_name,str1); - putallnodemsg(str2); } -getnodemsg(); -} - -/****************************************************************************/ -/* This function returns 1 if the current node is the highest (or last) */ -/* node in the game, or 0 if there is another node with a higher number */ -/* in the game. Used to determine if this node is to perform the dealer */ -/* function */ -/****************************************************************************/ -char lastplayer() -{ - int i; - -getgamedat(0); -if(total_players==1 && node[node_num-1]) /* if only player, definetly */ - return(1); /* the last */ - -for(i=node_num;i<total_nodes;i++) /* look for a higher number */ - if(node[i]) - break; -if(i<total_nodes) /* if one found, return 0 */ - return(0); -return(1); /* else return 1 */ -} - -/****************************************************************************/ -/* Returns the node number of the lower player in the game */ -/****************************************************************************/ -char firstplayer() -{ - int i; - -for(i=0;i<total_nodes;i++) - if(node[i]) - break; -if(i==total_nodes) - return(0); -return(i+1); -} - -/****************************************************************************/ -/* This function is only run on the highest node number in the game. It */ -/* waits until all other nodes are waiting in their sync routines, and then */ -/* releases them by changing the status byte from SYNC_P to PLAY */ -/* it is assumed that getgamedat(1) is called immediately prior. */ -/****************************************************************************/ -void syncdealer() -{ - char *Dealing="\1n\1hDealing...\r\n\1n"; - int i; - time_t start,now; - -status[node_num-1]=SYNC_D; -putgamedat(); -start=now=time(NULL); -// fdelay(1000); /* wait for stragglers to join game v1.02 */ -getgamedat(0); -while(total_players) { - for(i=0;i<total_nodes;i++) - if(i!=node_num-1 && node[i] && status[i]!=SYNC_P) - break; - if(i==total_nodes) /* all player nodes are waiting */ - break; - chat(); - mswait(100); - getgamedat(0); - if(!node[node_num-1]) { /* current node not in game? */ - getgamedat(1); - node[node_num-1]=user_number; /* fix it */ - putgamedat(); } - now=time(NULL); - if(now-start>300) { /* only wait upto 5 minutes */ - bputs("\r\nsyncdealer: timeout\r\n"); - break; } } - -getgamedat(1); -misc|=INPLAY; -curplayer=firstplayer(); -putgamedat(); - -getnodemsg(); -bputs(Dealing); -putallnodemsg(Dealing); - -getgamedat(1); -for(i=0;i<total_nodes;i++) /* release player nodes */ - if(node[i]) - status[i]=PLAY; -putgamedat(); -} - - -/****************************************************************************/ -/* This function halts this node until the dealer releases it by changing */ -/* the status byte from SYNC_P to PLAY */ -/* it is assumed that getgamedat(1) is called immediately prior. */ -/****************************************************************************/ -void syncplayer() -{ - time_t start,now; - -status[node_num-1]=SYNC_P; -putgamedat(); -start=now=time(NULL); -while(node[node_num-1] && status[node_num-1]==SYNC_P) { - chat(); - mswait(100); - getgamedat(0); - if(!node[node_num-1]) { /* current node not in game? */ - getgamedat(1); - node[node_num-1]=user_number; /* fix it */ - putgamedat(); } - now=time(NULL); - if(now-start>300) { /* only wait upto 5 minutes */ - bputs("\r\nsyncplayer: timeout\r\n"); - break; } } -} - -/****************************************************************************/ -/* Updates the MODUSER.DAT file that SBBS reads to ajust the user's credits */ -/* This function is called whenever the user's credits are adjust so that */ -/* the file will be current in any event. */ -/****************************************************************************/ -void moduserdat() -{ - char str[128]; - FILE *stream; - -sprintf(str,"%sMODUSER.DAT",node_dir); -if((stream=fopen(str,"wt"))==NULL) { - bprintf("Error opening %s for write\r\n",str); - return; } -fprintf(stream,"%ld",credits-user_cdt); -fclose(stream); - -} - -/****************************************************************************/ -/* This function reads the entire shoe of cards and the dealer's hand from */ -/* the card database file (CARD.DAB) */ -/****************************************************************************/ -void getcarddat() -{ - int file; - -if((file=nopen("card.dab",O_RDONLY))==-1) { - bputs("getcarddat: Error opening card.dab\r\n"); - return; } -read(file,&dc,1); -read(file,dealer,sizeof(dealer)); -read(file,&total_decks,1); -read(file,&cur_card,2); -read(file,card,total_decks*52*sizeof(card_t)); -close(file); -} - -/****************************************************************************/ -/* This function writes the entire shoe of cards and the dealer's hand to */ -/* the card database file (CARD.DAB) */ -/****************************************************************************/ -void putcarddat() -{ - int file; - -if((file=nopen("card.dab",O_WRONLY|O_CREAT))==-1) { - bputs("putcarddat: Error opening card.dab\r\n"); - return; } -write(file,&dc,1); -write(file,dealer,sizeof(dealer)); -write(file,&total_decks,1); -write(file,&cur_card,2); -write(file,card,total_decks*52*sizeof(card_t)); -close(file); -} - -/****************************************************************************/ -/* This function creates random ways to say "hit" */ -/****************************************************************************/ -char *hit() -{ - static char str[81]; - -strcpy(str,"\1n\1r\1h"); -switch(rand()%10) { - case 1: - strcat(str,"Hit it."); - break; - case 2: - strcat(str,"Hit me, Baby!"); - break; - case 3: - strcat(str,"Give me an ace."); - break; - case 4: - strcat(str,"One more."); - break; - case 5: - strcat(str,"Just one more."); - break; - case 6: - strcat(str,"Give me a baby card."); - break; - case 7: - strcat(str,"Hit it, Dude."); - break; - case 8: - strcat(str,"Hit."); - break; - case 9: - strcat(str,"Um... Hit."); - break; - case 10: - strcat(str,"Thank you Sir, may I have another."); - break; - default: - strcat(str,"Face card, please."); - break; } -strcat(str,"\1n\r\n"); -return(str); -} - -/****************************************************************************/ -/* This function creates random ways to say "double" */ -/****************************************************************************/ -char *doubit() -{ - static char str[81]; - -strcpy(str,"\1n\1b\1h"); -switch(rand()%10) { - case 1: - strcat(str,"Double."); - break; - case 2: - strcat(str,"Double Down, Man."); - break; - case 3: - strcat(str,"Double it, Dude."); - break; - case 4: - strcat(str,"One more card for double the dough."); - break; - case 5: - strcat(str,"Double me."); - break; - case 6: - strcat(str,"Oh yeah... Double!"); - break; - case 7: - strcat(str,"I shouldn't do it, but... Double!"); - break; - case 8: - strcat(str,"Double my bet and give me one more card."); - break; - case 9: - strcat(str,"Um... Double."); - break; - case 10: - strcat(str,"Thank you Sir, may I Double?"); - break; - default: - strcat(str,"Double - face card, please."); - break; } -strcat(str,"\1n\r\n"); -return(str); -} - -/****************************************************************************/ -/* This function creates random ways to say "stand" */ -/****************************************************************************/ -char *stand() -{ - static char str[81]; - -strcpy(str,"\1n\1c\1h"); -switch(rand()%10) { - case 1: - strcat(str,"Stand."); - break; - case 2: - strcat(str,"Stay."); - break; - case 3: - strcat(str,"No more."); - break; - case 4: - strcat(str,"Just right."); - break; - case 5: - strcat(str,"I should hit, but I'm not gonna."); - break; - case 6: - strcat(str,"Whoa!"); - break; - case 7: - strcat(str,"Hold it."); - break; - case 8: - strcat(str,"No way, Jose!"); - break; - case 9: - strcat(str,"Um... Stand."); - break; - case 10: - strcat(str,"Thanks, but no thanks."); - break; - default: - strcat(str,"No card, no bust."); - break; } -strcat(str,"\1n\r\n"); -return(str); -} - -/****************************************************************************/ -/* This function creates random ways to say "split" */ -/****************************************************************************/ -char *split() -{ - static char str[81]; - -strcpy(str,"\1n\1y\1h"); -switch(rand()%10) { - case 1: - strcat(str,"Split."); - break; - case 2: - strcat(str,"Split 'em."); - break; - case 3: - strcat(str,"Split it."); - break; - case 4: - strcat(str,"Split, please."); - break; - case 5: - strcat(str,"I should hit, but I'm gonna split instead."); - break; - case 6: - strcat(str,"Whoa! Split them puppies..."); - break; - case 7: - strcat(str,"Split 'em, Dude."); - break; - case 8: - strcat(str,"Double the cards, for double the money."); - break; - case 9: - strcat(str,"Um... Split."); - break; - case 10: - strcat(str,"Thank you Sir, I think I'll split 'em."); - break; - default: - strcat(str,"Banana Split."); - break; } -strcat(str,"\1n\r\n"); -return(str); -} - -/****************************************************************************/ -/* This function creates random ways to say "joined" */ -/****************************************************************************/ -char *joined() -{ - static char str[81]; - -switch(rand()%10) { - case 1: - strcpy(str,"joined."); - break; - case 2: - strcpy(str,"sat down to play."); - break; - case 3: - strcpy(str,"plopped on the chair next to you."); - break; - case 4: - strcpy(str,"belched loudly to announce his entrance."); - break; - case 5: - strcpy(str,"dropped in."); - break; - case 6: - strcpy(str,"joined our game."); - break; - case 7: - strcpy(str,"fell on his face entering the casino!"); - break; - case 8: - strcpy(str,"slams a roll of credits on the table."); - break; - case 9: - strcpy(str,"rolled in to join the game."); - break; - case 10: - strcpy(str,"smiles widely as he takes your wife's seat."); - break; - default: - strcpy(str,"spills a drink on your pants while sitting down."); - break; } -return(str); -} - -/****************************************************************************/ -/* This function creates random ways to say "left" */ -/****************************************************************************/ -char *left() -{ - static char str[81]; - -switch(rand()%10) { - case 1: - strcpy(str,"left abruptly."); - break; - case 2: - strcpy(str,"sneaked away."); - break; - case 3: - strcpy(str,"took the credits and ran."); - break; - case 4: - strcpy(str,"fell out of the chair."); - break; - case 5: - strcpy(str,"left the game."); - break; - case 6: - strcpy(str,"slipped out the door."); - break; - case 7: - strcpy(str,"giggled as he left the table."); - break; - case 8: - strcpy(str,"left clenching empty pockets."); - break; - case 9: - strcpy(str,"went to the pawn shop to hawk a watch."); - break; - case 10: - strcpy(str,"bailed out the back door."); - break; - default: - strcpy(str,"made like a train and left."); - break; } -return(str); -} - -/****************************************************************************/ -/* This function creates the file "GAME.DAB" in the current directory. */ -/****************************************************************************/ -void create_gamedab() -{ - -if((gamedab=sopen("game.dab" - ,O_WRONLY|O_CREAT|O_BINARY,SH_DENYNO))==-1) { - bputs("Error creating game.dab\r\n"); - pause(); - exit(1); } -misc=0; -curplayer=0; -memset(node,0,sizeof(node)); -memset(status,0,sizeof(status)); -write(gamedab,&misc,1); -write(gamedab,&curplayer,1); -write(gamedab,&total_nodes,1); -write(gamedab,node,total_nodes*2); -write(gamedab,status,total_nodes); -close(gamedab); -} - -/****************************************************************************/ -/* This function opens the file "GAME.DAB" in the current directory and */ -/* leaves it open with deny none access. This file uses record locking */ -/* for shared access. */ -/****************************************************************************/ -void open_gamedab() -{ -if((gamedab=sopen("game.dab",O_RDWR|O_BINARY,SH_DENYNO))==-1) { - bputs("Error opening game.dab\r\n"); /* open deny none */ - pause(); - exit(1); } -} - -/****************************************************************************/ -/* Lists the players currently in the game and the status of the shoe. */ -/****************************************************************************/ -void listplayers() -{ - int i; - -getgamedat(0); -bputs("\r\n"); -if(!total_players) { - bputs("\1_\1w\1hNo game in progress\r\n"); - return; } -for(i=0;i<total_nodes;i++) - if(node[i]) - bprintf("\1-\1mNode %2d: \1h%s \1n\1m%s\r\n" - ,i+1,username(node[i]),activity(status[i])); -getcarddat(); -/*** -bprintf("\r\nCurrent player=Node %d user #%d\r\n",curplayer,node[curplayer-1]); -***/ -} - -/****************************************************************************/ -/* This function replaces the card symbols in 'str' with letters to */ -/* represent the different suits. */ -/****************************************************************************/ -void strip_symbols(char *str) -{ - int i,j; - -j=strlen(str); -for(i=0;i<j;i++) - if(str[i]>=3 && str[i]<=6) - switch(str[i]) { - case 3: - str[i]='H'; - break; - case 4: - str[i]='D'; - break; - case 5: - str[i]='C'; - break; - case 6: - str[i]='S'; - break; } -} - -#endif /* end of function not needed for SBJCLEAN.C */ - -/****************************************************************************/ -/* Reads information from GAME.DAB file. If 'lockit' is 1, the file is */ -/* and putgamedat must be called to unlock it. If your updating the info */ -/* in GAME.DAB, you must first call getgamedat(1), then putgamedat(). */ -/****************************************************************************/ -void getgamedat(char lockit) -{ - int i=0; - -/* retry 100 times taking at least 3 seconds */ -while(lock(gamedab,0L,filelength(gamedab))==-1 && i++<100) - mswait(30); /* lock the whole thing */ -if(i>=100) { -// printf("gamedab=%d %04X:%p %04X\r\n",gamedab,_psp,&gamedab,_DS); - printf("\7getgamedat: error locking game.dab\r\n"); } - -lseek(gamedab,0L,SEEK_SET); -read(gamedab,&misc,1); -read(gamedab,&curplayer,1); -read(gamedab,&total_nodes,1); -read(gamedab,node,total_nodes*2); /* user number playing for each node */ -read(gamedab,status,total_nodes); /* the status of the player */ -total_players=0; -for(i=0;i<total_nodes;i++) - if(node[i]) - total_players++; -if(!lockit) - unlock(gamedab,0L,filelength(gamedab)); -} - -/****************************************************************************/ -/* Writes information to GAME.DAB file. getgamedat(1) MUST be called before */ -/* this function is called. */ -/****************************************************************************/ -void putgamedat() -{ - -lseek(gamedab,0L,SEEK_SET); -write(gamedab,&misc,1); -write(gamedab,&curplayer,1); -write(gamedab,&total_nodes,1); -write(gamedab,node,total_nodes*2); -write(gamedab,status,total_nodes); -unlock(gamedab,0L,filelength(gamedab)); -} - -/***************************************************************/ -/* This function makes the next active node the current player */ -/***************************************************************/ -void nextplayer() -{ - int i; - -getgamedat(1); /* get current info and lock */ - -if((!curplayer /* if no current player */ - || total_players==1) /* or only one player in game */ - && node[node_num-1]) { /* and this node is in the game */ - curplayer=node_num; /* make this node current player */ - putgamedat(); /* write data and unlock */ - return; } /* and return */ - -for(i=curplayer;i<total_nodes;i++) /* search for the next highest node */ - if(node[i]) /* that is active */ - break; -if(i>=total_nodes) { /* if no higher active nodes, */ - for(i=0;i<curplayer-1;i++) /* start at bottom and go up */ - if(node[i]) - break; - if(i==curplayer-1) /* if no active nodes found */ - curplayer=0; /* make current player 0 */ - else - curplayer=i+1; } -else - curplayer=i+1; /* else active node current player */ - -putgamedat(); /* write info and unlock */ -} - -/* End of SBJ.C */ diff --git a/xtrn/sbj/sbj.cfg b/xtrn/sbj/sbj.cfg deleted file mode 100644 index 9e5236e6ed..0000000000 --- a/xtrn/sbj/sbj.cfg +++ /dev/null @@ -1,4 +0,0 @@ -6 Number of decks -10 Minimum bet (in kilobytes) -1000 Maximum bet (in kilobytes) -100 Default bet (in kilobytes) diff --git a/xtrn/sbj/sbj.doc b/xtrn/sbj/sbj.doc deleted file mode 100644 index 8066b29359739102e2da37ed88d4cfdb2047633b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2131 zcmd<&R8UX|uFOl$D9X=EEm3gFNlebpN=(jH&<J+&(o}HCPcF?(%_~VP$;{8=0;{eg z5^!;aWTYyj<>%z&muKdsE2L%Sq!ue^Xes37mnh_=CZ`q`Cl*yIq~#YOY}K^l;^GW; z^3rpSa8=;M;j)0D{Pd#4T(ClCA6G{|kZN3topVwX^K?rK6p(f4IdgJqDFo-27A2=D zB<H7qoLQs*wHL`;XY8urmV%Y)IlH-o-0Ga4mzJ4cS_BR%1-Hx`xTz3jF8<CSWg!`v z#o(}ji24SDHGAe2mlTyIgF?BOi!&l5$WPD3F$83NVs1fBszR`nQ?P<-MM-K=USbZ+ zFA6D%C5ce8B7$AKq25BoCWeM!7jG_3uu>0D2q-Dw14<C3VU9t;dZ3UXO0|otTd<x7 zr<MXi)xM72u5O+_uAEv5zKPkXpyUBg4A5v$NX$zCMF}FXxq>tDOLI~bl2R2i^OAE) zQ&LkDGV>HlKmi)%82}Clu&&gKlA^@q60mehzCxlxN@h`Na!Gzsr9yFOa)v@;u@#rI zRSYOhV?aS26YS*0#pRfnqELd8Vl(s7@{4jI@mUPFJ0mrxAgwe9WOXt$%0bCH*vU&F zu~;E7Pa!`qCo?aVD-{-71(5V=#l_{9n48MU$;pW=!zpqFmn0UI=#~~JxWJst$*HG@ zaG`U4ZZ0TLd@}PurW7Y-Dd^{L!4o*Dba7HvGAQYDIr;^ADg>n#mSz^Erf_m{`sH)^ zmgbaXmKLWLadL7-rWSK~=9Q!tC8rjYD0u4oD}Z@Lr3EF$V9DT&qRhN(1t+IqsOJ2X z%(O~{(Bjl01((E<M6eMG`9%tT`COsJsl^K6;htd%&iOg{MGDUODXGO^D?!N@q*?)- zFG4B{Qc*$y6bqmP&%njS<(Z~XnO~|<o>`os0E)eo6oo{E;?(5)ycC7>#N1Sc{4_*? zp-_^MSfWs#nUe!9RuYp-N)vN(DixA567$kiLGj52@~C>TLUK`RN@hthDB3`=oRn0o zpy8LV5R_S*t*N7so0y#nio4W`#N-l%<otq4kToEMiAniosR~@Ms0OD79fhRQ5{Mp< zl01;Bl(0rB!VV=Jg`(74kXa=esa#6>IZ6s?MftfPCn_i*$DNWwegUW)&;h4qgh!yl z3QE3cF`%TtRg$lu<d?6c#|0^LQ5*}&7og%CR8nawWP%fEVsUb2rb0<-MF~W{JhLPN z>=t-|%>{8ru@x5=B*nR;7AF^Fg53sA#HH!!sl}jN7M7S(n#x6FwLnN2mmw#oUukYq zY7r;~Qc{z%!EqLxk)Nu-$!W%A#L4NKnU|ScnyZkMS^|pBY)(#2Ljx{jPEOy%3QP$D z11=LzPM6fQ#L}D+R6Pb<TwFf+>EJ|JjPL*`34-D^8Jgih*;%2uJhLP@LqT2NM;#P| zrNyZ!I-me6N`)l9q*R5Rd{`})T$Gv!3K?+ml*$Dv8xUm>L=aTg<tCOW`1-oIL`LfQ z_`5^Wa&mrNNn&OmD9vZ)rRSt76lbRArKTw4<maU;aAoF|q^749L6jDyrsbq2mlP|M zXXfQ)=A{>d%mld!lv@=v3i69HOESw+74pErsR_!YIr+t)Jj$h!mzti4Bw4Hp)|*<E zT2!f!l2{3`02Bz&(n}#Du~;D~H8oEmwIVgSv?Mh}kBduROTpF81r$%gPF{MT3QkL( F3jjt7tG56E diff --git a/xtrn/sbj/sbj.dsp b/xtrn/sbj/sbj.dsp deleted file mode 100644 index 567f753f39..0000000000 --- a/xtrn/sbj/sbj.dsp +++ /dev/null @@ -1,102 +0,0 @@ -# Microsoft Developer Studio Project File - Name="sbj" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=sbj - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "sbj.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "sbj.mak" CFG="sbj - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "sbj - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "sbj - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "sbj - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "win32" -# PROP Intermediate_Dir "msvc.win32.release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "c:\sbbs\xtrn\sdk" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:console /map /machine:I386 - -!ELSEIF "$(CFG)" == "sbj - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "win32" -# PROP Intermediate_Dir "msvc.win32.debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\sdk" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:console /map /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "sbj - Win32 Release" -# Name "sbj - Win32 Debug" -# Begin Source File - -SOURCE=.\Sbj.c -# End Source File -# Begin Source File - -SOURCE=..\Sdk\Xsdk.c -# End Source File -# Begin Source File - -SOURCE=..\Sdk\Xsdkvars.c -# End Source File -# Begin Source File - -SOURCE=..\sdk\xsdkwrap.c -# End Source File -# End Target -# End Project diff --git a/xtrn/sbj/sbj.msg b/xtrn/sbj/sbj.msg deleted file mode 100644 index 3c4d55db67..0000000000 --- a/xtrn/sbj/sbj.msg +++ /dev/null @@ -1,23 +0,0 @@ - chSynchronet - r Blackjack! -w - As you might have guessed, this is a blackjack game. But not just any -blackjack game. With Synchronet Blackjack, you play against the house for -credits and your friends can play along side you simultaneously from the same -card shoe. You can even carry on a conversation while a hand is in play! - - Beware, you are gambling with your credits if you choose to play, but -the odds are pretty good. House pays double on a natural blackjack or three -sevens, 1� to 1 on regular blackjack, even money on other winning hands and -ties (pushes) break even. You can double down if you have enough dough and even -split pairs! - - If you choose to play, note that it is much more enjoyable with a -friend at the table with you. While the dealer is fast and curteous, he doesn't -make a very good conversationalist. - - If you notice that you're not seeing the card symbols for 'clubs' you -may have Compuserve Quick B transfers enabled or another answerback to Ctrl-E. -This should be disabled, or you should toggle card symbols OFF. - - diff --git a/xtrn/sbj/sbjclean.c b/xtrn/sbj/sbjclean.c deleted file mode 100644 index 814f3edba8..0000000000 --- a/xtrn/sbj/sbjclean.c +++ /dev/null @@ -1,48 +0,0 @@ -/* SBJCLEAN.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Clean-up program for Synchronet Blackjack Online External Program */ - -#define SBJCLEAN - -#include "sbj.c" - - -int main(int argc, char **argv) -{ - char *p; - int i; - -node_dir[0]=0; -for(i=1;i<argc;i++) - if(!stricmp(argv[i],"/L")) - logit=1; - else strcpy(node_dir,argv[i]); - -p=getenv("SBBSNODE"); -if(!node_dir[0] && p) - strcpy(node_dir,p); - -if(!node_dir[0]) { /* node directory not specified */ - printf("usage: sbjclean <node directory>\r\n"); - getch(); - return(1); } - -if(node_dir[strlen(node_dir)-1]!='\\') /* make sure node_dir ends in '\' */ - strcat(node_dir,"\\"); - -initdata(); /* read XTRN.DAT and more */ - -if((gamedab=open("GAME.DAB",O_RDWR|O_DENYNONE|O_BINARY))==-1) { - printf("Error opening GAME.DAB\r\n"); /* open deny none */ - return(1); } -getgamedat(1); -node[node_num-1]=0; -status[node_num-1]=0; -putgamedat(); -if(curplayer==node_num) - nextplayer(); -close(gamedab); -return(0); -} diff --git a/xtrn/sbl/Makefile.gnu b/xtrn/sbl/Makefile.gnu deleted file mode 100644 index ce3996ed49..0000000000 --- a/xtrn/sbl/Makefile.gnu +++ /dev/null @@ -1,50 +0,0 @@ -# Makefile.gnu - -######################################################################### -# Makefile for Synchronet BBS List # -# For use with GNU make and GNU C Compiler # -# @format.tab-size 4, @format.use-tabs true # -# # -# Linux: make -f Makefile.gnu # -# Win32: make -f Makefile.gnu os=win32 # -# FreeBSD: make -f Makefile.gnu os=freebsd # -######################################################################### - -# $Id$ - -# Macros -CC = gcc -LD = ld - -ifeq ($(os),win32) # Windows - -EXEFILE = .exe -LIBDIR := /gcc/i386-mingw32/lib -CFLAGS := -mno-cygwin -LFLAGS := --target=i386-mingw32 -mno-cygwin -DELETE = echo y | del -LIBS = $(LIBDIR)/libwsock32.a - -else # Linux - -EXEFILE = -LIBODIR := gcc.linux.lib -EXEODIR := gcc.linux.exe -LIBDIR := /usr/lib -CFLAGS := -LFLAGS := -DELETE = rm -f -v -ifeq ($(os),freebsd) # FreeBSD -LIBS = -pthread -else -LIBS = $(LIBDIR)/libpthread.a -endif - -endif - -CFLAGS := $(CFLAGS) -I../sdk - -SBL: sbl$(EXEFILE) - -sbl$(EXEFILE) : sbl.c ../sdk/xsdk.c ../sdk/xsdkvars.c ../sdk/xsdkwrap.c - $(CC) $(CFLAGS) $^ -o $@ $(LIBS) diff --git a/xtrn/sbl/makefile.bor b/xtrn/sbl/makefile.bor deleted file mode 100644 index 71c853b6c6..0000000000 --- a/xtrn/sbl/makefile.bor +++ /dev/null @@ -1,40 +0,0 @@ -################################################################## -# Makefile for SBL (Synchronet BBS List Online External Program) # -# For use with Turbo C++ # -# Tabstop=8 # -################################################################## - -# Macros -CC = \bc31\bin\bcc -LD = \bc31\bin\tlink -SDK = ..\sdk -INCLUDE = \bc31\include;$(SDK) -LIB = \bc31\lib -MODEL = l -CFLAGS = -N -d -C -m$(MODEL) -I$(INCLUDE) -LFLAGS = /n /c -OBJS = xsdk.obj xsdkvars.obj $(SDK)\mswait$(MODEL).obj -HEADERS = $(SDK)\xsdk.h $(SDK)\xsdkdefs.h $(SDK)\xsdkvars.c sbldefs.h - -# Implicit C Compile Rule -.c.obj: - @echo Compiling $*.c to $*.obj ... - $(CC) $(CFLAGS) -c $*.c - -# Main EXE Link Rule -sbl.exe: $(OBJS) sbl.obj - @echo Linking $< ... - $(LD) $(LFLAGS) @&&! -$(LIB)\c0$(MODEL) $(OBJS) sbl.obj -!, $*, $*, $(LIB)\c$(MODEL).lib $(LIB)\math$(MODEL).lib $(LIB)\emu.lib - -# All .obj modules -sbl.obj: $(HEADERS) - -xsdk.obj: $(SDK)\xsdk.c $(HEADERS) - @echo Compiling $(SDK)\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c $(SDK)\$*.c - -xsdkvars.obj: $(SDK)\xsdkvars.c $(SDK)\xsdkdefs.h - @echo Compiling $(SDK)\$*.c to $*.obj ... - $(CC) $(CFLAGS) -c $(SDK)\$*.c diff --git a/xtrn/sbl/sbbslist.c b/xtrn/sbl/sbbslist.c deleted file mode 100644 index dc2fdd7644..0000000000 --- a/xtrn/sbl/sbbslist.c +++ /dev/null @@ -1,768 +0,0 @@ -/* SBBSLIST.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Converts Synchronet BBS List (SBL.DAB) to text file */ - -#include "xsdk.h" -#include "telnet.h" -#include "sbldefs.h" - -char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec"}; -char *nulstr=""; -char tmp[256]; - -extern int daylight=0; -extern long timezone=0L; - -#undef ERROR_VALUE -#define ERROR_VALUE (GetLastError()-WSABASEERR) - -#define SORT TRUE -#define VERIFY TRUE - -typedef struct { - - time_t date; - ulong count; - ulong attempts; - short offset; - - } sort_t; - - -int sort_cmp(sort_t **str1, sort_t **str2) -{ - int diff; - - /* sort descending by date */ - diff=((*str2)->date&0xffff0000)-((*str1)->date&0xffff0000); - - if(diff) - return(diff); - - /* sort descending by verfication counter */ - diff=(((*str2)->count)-((*str1)->count)); - - if(diff) - return(diff); - - /* sort ascending by verification attempts */ - return(((*str1)->attempts)-((*str2)->attempts)); -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' */ -/****************************************************************************/ -void truncsp(uchar *str) -{ - uint c; - - c=strlen(str); - while(c && (uchar)str[c-1]<=SP) c--; - str[c]=0; -} - -/****************************************************************************/ -/* Generates a 24 character ASCII string that represents the time_t pointer */ -/* Used as a replacement for ctime() */ -/****************************************************************************/ -char *timestr(time_t *intime) -{ - static char str[256]; - char mer[3],hour; - struct tm *gm; - - gm=localtime(intime); - - if(gm==NULL) { - sprintf(str,"Invalid time: %08lX",*intime); - return(str); - } - - if(gm->tm_hour>=12) { - if(gm->tm_hour==12) - hour=12; - else - hour=gm->tm_hour-12; - strcpy(mer,"pm"); } - else { - if(gm->tm_hour==0) - hour=12; - else - hour=gm->tm_hour; - strcpy(mer,"am"); } - sprintf(str,"%s %s %02d %4d %02d:%02d %s" - ,wday[gm->tm_wday],mon[gm->tm_mon],gm->tm_mday,1900+gm->tm_year - ,hour,gm->tm_min,mer); - return(str); -} - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - struct tm* tm; - - if(!unix) - strcpy(str,"00/00/00"); - else { - tm=gmtime(&unix); - if(tm==NULL) - strcpy(str,"00/00/00"); - else { - if(tm->tm_mon>11) { /* DOS leap year bug */ - tm->tm_mon=0; - tm->tm_year++; } - if(tm->tm_mday>31) - tm->tm_mday=1; - sprintf(str,"%02u/%02u/%02u",tm->tm_mon+1,tm->tm_mday - ,tm->tm_year%100); } - } - return(str); -} - - -void long_bbs_info(FILE *out, bbs_t bbs) -{ - int i; - -fprintf(out,"BBS Name: %s since %s\r\n" - ,bbs.name,unixtodstr(bbs.birth,tmp)); -fprintf(out,"Operator: "); -for(i=0;i<bbs.total_sysops && i<MAX_SYSOPS;i++) { - if(i) { - if(bbs.total_sysops>2) - fprintf(out,", "); - else - fputc(SP,out); - if(!(i%4)) - fprintf(out,"\r\n "); - if(i+1==bbs.total_sysops) - fprintf(out,"and "); } - fprintf(out,"%s",bbs.sysop[i]); } -fprintf(out,"\r\n"); -fprintf(out,"Software: %-15.15s Nodes: %-5u " - "Users: %-5u Doors: %u\r\n" - ,bbs.software,bbs.nodes,bbs.users,bbs.xtrns); -fprintf(out,"Download: %lu files in %u directories of " - "%luMB total space\r\n" - ,bbs.files,bbs.dirs,bbs.megs); -fprintf(out,"Messages: %lu messages in %u sub-boards\r\n" - ,bbs.msgs,bbs.subs); -fprintf(out,"Networks: "); -for(i=0;i<bbs.total_networks && i<MAX_NETS;i++) { - if(i) { - if(bbs.total_networks>2) - fprintf(out,", "); - else - fputc(SP,out); - if(!(i%3)) - fprintf(out,"\r\n "); - if(i+1==bbs.total_networks) - fprintf(out,"and "); } - fprintf(out,"%s [%s]",bbs.network[i],bbs.address[i]); } -fprintf(out,"\r\n"); -fprintf(out,"Terminal: "); -for(i=0;i<bbs.total_terminals && i<MAX_TERMS;i++) { - if(i) { - if(bbs.total_terminals>2) - fprintf(out,", "); - else - fputc(SP,out); - if(i+1==bbs.total_terminals) - fprintf(out,"and "); } - fprintf(out,"%s",bbs.terminal[i]); } -fprintf(out,"\r\n\r\n"); -for(i=0;i<bbs.total_numbers && i<MAX_NUMBERS;i++) { - fprintf(out,"%-30.30s " - ,i && !strcmp(bbs.number[i].modem.location,bbs.number[i-1].modem.location) - ? nulstr : bbs.number[i].modem.location); - if(bbs.number[i].modem.min_rate==0xffff) - fprintf(out,"%s:%d\r\n" - ,bbs.number[i].telnet.addr - ,bbs.number[i].telnet.port); - else - fprintf(out,"%12.12s %5u %-15.15s " - "Minimum: %u\r\n" - ,bbs.number[i].modem.number - ,bbs.number[i].modem.max_rate,bbs.number[i].modem.desc - ,bbs.number[i].modem.min_rate); -} -fprintf(out,"\r\n"); -for(i=0;i<5;i++) { - if(!bbs.desc[i][0]) - break; - fprintf(out,"%15s%s\r\n",nulstr,bbs.desc[i]); } - -fprintf(out,"\r\n"); -fprintf(out,"Entry created on %s by %s\r\n" - ,timestr(&bbs.created),bbs.user); -if(bbs.updated && bbs.userupdated[0]) - fprintf(out," Last updated on %s by %s\r\n" - ,timestr(&bbs.updated),bbs.userupdated); -if(bbs.verified && bbs.userverified[0]) - fprintf(out,"Last verified on %s by %s\r\n" - ,timestr(&bbs.verified),bbs.userverified); -} - -u_long resolve_ip(char *addr) -{ - HOSTENT* host; - - if(isdigit(addr[0])) - return(inet_addr(addr)); - if ((host=gethostbyname(addr))==NULL) { -// printf("!ERROR resolving hostname: %s\n",addr); - return(0); - } - return(*((ulong*)host->h_addr_list[0])); -} - -int telnet_negotiate(SOCKET sock, uchar* buf, int rd, int max_rd) -{ - int i; - int rsplen; - uchar rsp[512]; - - return(rd); - - do { - rsplen=0; - for(i=0; i<rd && rsplen<sizeof(rsp)-2;i++) { - if(buf[i]!=TELNET_IAC) - continue; - i++; - printf("telnet cmd: %02X %02X\n" - ,buf[i],buf[i+1]); - if(buf[i]==TELNET_DO) { - rsp[rsplen++]=TELNET_IAC; - rsp[rsplen++]=TELNET_WILL; - rsp[rsplen++]=buf[i+1]; - } - if(buf[i]==TELNET_DONT) { - rsp[rsplen++]=TELNET_IAC; - rsp[rsplen++]=TELNET_WONT; - rsp[rsplen++]=buf[i+1]; - } - i++; - } - if(!rsplen) - break; - printf("telnet rsp: "); - for(i=0; i<rsplen; i++) - printf("%02X ",rsp[i]); - printf("\n"); - send(sock,rsp,rsplen,0); - Sleep(3000); - rd=recv(sock,buf,max_rd,0); - - } while(rd>0); - - return(rd); - -} - -int main(int argc, char **argv) -{ - char str[128],name[128],*location,nodes[32],*sysop; - char sysop_email[128]; - char buf[256]; - char verify_result[128]; - char version[128]; - char* p; - char* sp; - char* tp; - char* for_os; - char* fontstr="<FONT FACE=\"Arial\" SIZE=\"-1\">"; - char telnet_addr_buf[128]; - char* telnet_addr; - char telnet_portstr[32]; - ushort telnet_port; - BOOL verified; - ushort index; - int i,j,file,ff,rd; - long l; - ulong ip_addr; - ulong total_systems; - ulong total_attempts=0; - ulong total_verified=0; - FILE *in,*shrt,*lng,*html; - bbs_t bbs; - sort_t **sort=NULL; - time_t now; - - /* socket stuff */ - SOCKET sock; - SOCKADDR_IN addr; - int status; /* Status Code */ - WSADATA WSAData; - - if((status = WSAStartup(MAKEWORD(1,1), &WSAData))!=0) { - printf("!WinSock startup ERROR %d\n", status); - return(1); - } - - if(_putenv("TZ=UCT0")) - printf("!putenv() FAILED"); - tzset(); - - now=time(NULL); - - if((i=_sopen("SBL.DAB",O_RDWR|O_BINARY,SH_DENYNO,S_IREAD|S_IWRITE))==-1) { - printf("error opening SBL.DAB\n"); - return(1); } - - if((in=fdopen(i,"rb"))==NULL) { - printf("error opening SBL.DAB\n"); - return(1); } - - if((shrt=fopen("SBBS.LST","wb"))==NULL) { - printf("error opening/creating SBBS.LST\n"); - return(1); } - - if((lng=fopen("SBBS_DET.LST","wb"))==NULL) { - printf("error opening/creating SBBS_DET.LST\n"); - return(1); } - - if((html=fopen("sbbslist.html","w"))==NULL) { - printf("error opening/creating sbbslist.html\n"); - return(1); } - - fprintf(shrt,"Synchronet BBS List exported from Vertrauen on %s\r\n" - "=======================================================" - "\r\n\r\n" - ,unixtodstr(time(NULL),str)); - - fprintf(lng,"Detailed Synchronet BBS List exported from Vertrauen on %s\r\n" - "================================================================" - "\r\n\r\n" - ,unixtodstr(time(NULL),str)); - - fprintf(html,"<HTML><HEAD><TITLE>Synchronet BBS List</TITLE></HEAD>\n"); - fprintf(html,"<BODY><FONT FACE=\"Arial\" SIZE=\"-1\">\n"); - - printf("Sorting..."); - fseek(in,0L,SEEK_SET); - i=j=0; - while(1) { - if(!fread(&bbs,sizeof(bbs_t),1,in)) - break; - j++; - printf("%4u\b\b\b\b",j); - if(!bbs.name[0] || strnicmp(bbs.software,"SYNCHRONET",10)) { -// printf("%s\n",bbs.software); - continue; - } - i++; - if((sort=(sort_t **)REALLOC(sort - ,sizeof(sort_t *)*i))==NULL) { - printf("\r\n\7Memory allocation error\r\n"); - return(1); } - if((sort[i-1]=(sort_t *)LMALLOC(sizeof(sort_t) - ))==NULL) { - printf("\r\n\7Memory allocation error\r\n"); - return(1); } - sort[i-1]->date=bbs.verified; - sort[i-1]->count=bbs.verification_count; - sort[i-1]->attempts=bbs.verification_attempts; - sort[i-1]->offset=j-1; - } - total_systems=i; - -#if SORT - qsort((void *)sort,total_systems,sizeof(sort[0]) - ,(int(*)(const void *, const void *))sort_cmp); -#endif - printf(" Done.\n"); - - printf("Creating index..."); - sprintf(str,"SBBSSORT.NDX"); - if((file=open(str,O_RDWR|O_CREAT|O_TRUNC|O_BINARY,S_IWRITE|S_IREAD))==-1) { - printf("\n\7Error creating %s\n",str); - return(1); } - for(j=0;j<(int)total_systems;j++) - write(file,&sort[j]->offset,2); - lseek(file,0L,SEEK_SET); - printf(" Done.\n"); - - - printf("Creating lists...\n"); - - fprintf(html,"<CENTER>"); - fprintf(html,"<H1><I><A HREF=http://www.synchro.net>Synchronet" - "</A> BBS List</H1></I>\n"); - - fprintf(html,"(%d systems) exported from " - "<B><A HREF=http://vert.synchro.net>Vertrauen</A></B> on %s\n" - ,total_systems ,timestr(&now)); - - fprintf(html,"<P></CENTER>\n"); - - fprintf(html,"<TABLE WIDTH=\"100%%\">\n"); - fprintf(html,"<COLGROUP ALIGN=LEFT><COLGROUP ALIGN=LEFT>" - "<COLGROUP ALIGN=CENTER><COLGROUP ALIGN=CENTER>" - "<COLGROUP ALIGN=RIGHT><COLGROUP ALIGN=CENTER>\n"); - fprintf(html,"<TR BGCOLOR=\"#000000\">\n"); - fprintf(html,"<TH><FONT FACE=\"Arial\" SIZE=\"-1\" COLOR=\"#FFFFFF\">BBS Name\n"); - fprintf(html,"<TH><FONT FACE=\"Arial\" SIZE=\"-1\" COLOR=\"#FFFFFF\">Sysop\n"); - fprintf(html,"<TH><FONT FACE=\"Arial\" SIZE=\"-1\" COLOR=\"#FFFFFF\">Location\n"); - fprintf(html,"<TH><FONT FACE=\"Arial\" SIZE=\"-1\" COLOR=\"#FFFFFF\">Nodes\n"); - fprintf(html,"<TH><FONT FACE=\"Arial\" SIZE=\"-1\" COLOR=\"#FFFFFF\">Modem/Telnet Address\n"); - fprintf(html,"<TH><FONT FACE=\"Arial\" SIZE=\"-1\" COLOR=\"#FFFFFF\">Verification Results\n"); - ff=0; - while(1) { - if(read(file,&index,2)!=2) - break; - fseek(in,(long)index*sizeof(bbs_t),SEEK_SET); - if(!fread(&bbs,sizeof(bbs_t),1,in)) - break; - long_bbs_info(lng,bbs); - if(ff) - fprintf(lng,"\x0c\r\n"); - else - fprintf(lng,"\r\n---------------------------------------------" - "----------------------------------\r\n\r\n"); - ff=!ff; - verified=FALSE; - total_attempts++; - for(i=0;i<bbs.total_numbers && i<MAX_NUMBERS;i++) { - if(!i) { - if(bbs.sysop_email[0]) { - sprintf(sysop_email,"<A HREF=mailto:%s>%s</A>",bbs.sysop_email,bbs.sysop[0]); - sysop=sysop_email; - } else - sysop=bbs.sysop[0]; - sprintf(nodes,"%u",bbs.nodes); - } else { - sysop=""; - nodes[0]=0; - } - if(i && !stricmp(bbs.number[i].modem.number,bbs.number[i-1].modem.number)) - continue; // duplicate - if(i && !stricmp(bbs.number[i].modem.location,bbs.number[i-1].modem.location)) - location=""; - else - location=bbs.number[i].modem.location; - fprintf(shrt,"%-25.25s %-25.25s %s\r\n" - ,i ? "" : bbs.name, location - ,bbs.number[i].modem.number); - if(!i) { - fprintf(html,"<A NAME=\"%s.index\">",bbs.name); - fprintf(html,"<TR BGCOLOR=\"#EEEEEE\">"); - } else - fprintf(html,"<TR>"); - sprintf(name,"<A HREF=\"#%s\">%s</A>",bbs.name,bbs.name); - - if(bbs.number[i].modem.min_rate==0xffff /* && bbs.name[0]=='E' */) { - - telnet_port=bbs.number[i].telnet.port; - if(telnet_port==0) - telnet_port=23; - strcpy(telnet_addr_buf,bbs.number[i].telnet.addr); - telnet_addr=telnet_addr_buf; - - if(!strnicmp(telnet_addr,"TELNET:",7)) - telnet_addr+=7; - if(!strnicmp(telnet_addr,"//",2)) - telnet_addr+=2; - p=strchr(telnet_addr,':'); - if(p!=NULL) { - *p=0; - telnet_port=atoi(p+1); - } - -#if !VERIFY /* set to 1 for no-verification */ - verified=TRUE; - strcpy(verify_result,"<B>v3.00x for Win32</B>"); -#else - printf("Verifying %d/%d %s:%d " - ,total_attempts,total_systems,telnet_addr,telnet_port); - - ip_addr=resolve_ip(telnet_addr); - if(!ip_addr) - strcpy(verify_result,"bad hostname"); - else { - - if((sock = socket(AF_INET,SOCK_STREAM,IPPROTO_IP)) == INVALID_SOCKET) { - printf("\n\7Error %d opening socket",ERROR_VALUE); - return(1); - } - - memset(&addr,0,sizeof(addr)); - addr.sin_family = AF_INET; - - if(bind(sock, (struct sockaddr *) &addr, sizeof (addr))!=0) { - closesocket(sock); - printf("!ERROR %d binding to socket %d",ERROR_VALUE, sock); - return(1); - } - - memset(&addr,0,sizeof(addr)); - addr.sin_addr.S_un.S_addr = ip_addr; - addr.sin_family = AF_INET; - addr.sin_port = htons(telnet_port); - - if(connect(sock, (struct sockaddr *)&addr, sizeof(addr))!=0) - sprintf(verify_result,"no connect (%ld)" - ,ERROR_VALUE); - else { - l=1; - ioctlsocket(sock, FIONBIO, &l); - Sleep(3000); - - buf[0]=0; - rd=recv(sock,buf,sizeof(buf)-1,0); - if((rd=telnet_negotiate(sock,buf,rd,sizeof(buf)-1))<1) - sprintf(verify_result,"no data (%ld)" - ,rd==SOCKET_ERROR ? ERROR_VALUE : rd); - else { - - buf[rd]=0; - sp=buf+(rd-1); - while(*sp && sp!=buf) sp--; // Skip garbage (with null) - if(*sp==0) - sp++; - p=strstr(sp,"Synchronet"); - if(p!=NULL) { - verified=TRUE; - for_os=strstr(sp," for "); - if(for_os==NULL) - for_os=""; - p=strstr(sp,"Version "); - if(p==NULL) - version[0]=0; - else { - p+=8; - tp=strchr(p,'\r'); - if(tp!=NULL) *tp=0; - truncsp(p); - for_os[11]=0; - truncsp(for_os); - sprintf(version,"v%s%s",p,for_os); - } - sprintf(verify_result,"<B>%s</B>" - ,version[0] ? version : "Verified"); - } else { - printf("rd=%d buf='%s' sp='%s'\n",rd,buf,sp); - sprintf(verify_result,"non-Synchronet"); - } - } - } - - closesocket(sock); - } - - printf("%s\n",verify_result); - bbs.verification_attempts++; -#endif - - if(telnet_port==23) - telnet_portstr[0]=0; - else - sprintf(telnet_portstr,":%d",telnet_port); - - fprintf(html,"<TD><B>%s%s</B><TD>%s%s<TD>%s%s<TD>%s%s<TD%s>" - "<A HREF=telnet://%s%s>%s%s%s%s%s</A><TD%s>%s%s\n" - ,fontstr,i ? "":name - ,fontstr,sysop - ,fontstr,location - ,fontstr,nodes - ,i ? " BGCOLOR=\"#EEEEEE\"":"" - ,telnet_addr, telnet_portstr - ,fontstr - ,verified ? "<B>":"", telnet_addr, telnet_portstr - , verified ? "</B>":"" - ,i ? " BGCOLOR=\"#EEEEEE\"":"" - ,fontstr,verify_result); - } else - fprintf(html,"<TD><B>%s%s</B><TD>%s%s<TD>%s%s<TD>%s%s<TD%s>%s%s" - "<TD%s>%s%s\n" - ,fontstr,i ? "":name - ,fontstr,sysop - ,fontstr,location - ,fontstr,nodes - ,i ? " BGCOLOR=\"#EEEEEE\"":"" - ,fontstr,bbs.number[i].modem.number - ,i ? " BGCOLOR=\"#EEEEEE\"":"" - ,fontstr,"N/A"); - } /* for(numbers) */ -#if VERIFY - if(verified) { - total_verified++; - bbs.verified=time(NULL); - bbs.verification_count++; - strcpy(bbs.userverified,"SBBS List Verifier"); - } - fseek(in,(long)index*sizeof(bbs_t),SEEK_SET); - fwrite(&bbs,sizeof(bbs_t),1,in); -#endif - } - fprintf(html,"</TABLE>\n"); - - now=time(NULL); - fprintf(html,"<CENTER>\n"); - fprintf(html,"%d systems verified from " - "<B><A HREF=http://vert.synchro.net>Vertrauen</A></B> on %s\n" - ,total_verified ,timestr(&now)); - fprintf(html,"<H1><I>Detailed Synchronet BBS List</I></H1>\n"); - fprintf(html,"</CENTER>\n"); - - /* Generate Detailed List */ - lseek(file,0L,SEEK_SET); - while(1) { - if(read(file,&index,2)!=2) - break; - fseek(in,(long)index*sizeof(bbs_t),SEEK_SET); - if(!fread(&bbs,sizeof(bbs_t),1,in)) - break; - - fprintf(html,"<P><A NAME=\"%s\">\n",bbs.name); - - fprintf(html,"<H2><A HREF=\"#%s.index\">%s</A></H2>",bbs.name,bbs.name); - fprintf(html,"<FONT FACE=\"Arial\" SIZE=\"-1\">\n"); - - fprintf(html,"Online since: %s<BR>\n",unixtodstr(bbs.birth,tmp)); - - if(bbs.sysop_email[0]) { - sprintf(sysop_email,"<A HREF=mailto:%s>%s</A>",bbs.sysop_email,bbs.sysop[0]); - sysop=sysop_email; - } else - sysop=bbs.sysop[0]; - - fprintf(html,"Operator: %s", sysop); - - for(i=1;i<bbs.total_sysops && i<MAX_SYSOPS;i++) { - if(bbs.total_sysops>2) - fprintf(html,", "); - else - fputc(SP,html); - if(i+1==bbs.total_sysops) - fprintf(html,"and "); - fprintf(html,"%s",bbs.sysop[i]); - } - fprintf(html,"<BR>\n"); - - if(bbs.web_url[0]) - fprintf(html,"Web-site: <A HREF=http://%s>%s</A><BR>\n",bbs.web_url,bbs.web_url); - - fprintf(html,"Nodes: %u, " - "Users: %u, Doors: %u<BR>\n" - ,bbs.nodes,bbs.users,bbs.xtrns); - fprintf(html,"Download: %lu files in %u directories of " - "%luMB total space<BR>\n" - ,bbs.files,bbs.dirs,bbs.megs); - fprintf(html,"Messages: %lu messages in %u sub-boards<BR>\n" - ,bbs.msgs,bbs.subs); - - if(bbs.total_networks) { - fprintf(html,"Networks: "); - for(i=0;i<bbs.total_networks && i<MAX_NETS;i++) { - if(i) { - if(bbs.total_networks>2) - fprintf(html,", "); - else - fputc(SP,html); - if(!(i%2)) - fprintf(html,"<BR>"); - if(i+1==bbs.total_networks) - fprintf(html,"and "); - } - fprintf(html,"%s [%s]",bbs.network[i],bbs.address[i]); } - fprintf(html,"<BR>\n"); - } - - if(bbs.total_terminals) { - fprintf(html,"Terminal: "); - for(i=0;i<bbs.total_terminals && i<MAX_TERMS;i++) { - if(i) { - if(bbs.total_terminals>2) - fprintf(html,", "); - else - fputc(SP,html); - if(i+1==bbs.total_terminals) - fprintf(html,"and "); } - fprintf(html,"%s",bbs.terminal[i]); } - fprintf(html,"<BR>\n"); - } - - fprintf(html,"<BR>\n"); - for(i=0;i<bbs.total_numbers && i<MAX_NUMBERS;i++) { - if(bbs.number[i].modem.min_rate==0xffff) { - - telnet_port=bbs.number[i].telnet.port; - if(telnet_port==0) - telnet_port=23; - strcpy(telnet_addr_buf,bbs.number[i].telnet.addr); - telnet_addr=telnet_addr_buf; - - if(!strnicmp(telnet_addr,"TELNET:",7)) - telnet_addr+=7; - if(!strnicmp(telnet_addr,"//",2)) - telnet_addr+=2; - p=strchr(telnet_addr,':'); - if(p!=NULL) { - *p=0; - telnet_port=atoi(p+1); - } - - if(telnet_port==23) - telnet_portstr[0]=0; - else - sprintf(telnet_portstr,":%d",telnet_port); - - fprintf(html,"<A HREF=telnet://%s%s>telnet://%s%s</A>" - ,telnet_addr - ,telnet_portstr - ,telnet_addr - ,telnet_portstr); - } else - fprintf(html,"%s %u %s " - "Minimum: %u" - ,bbs.number[i].modem.number - ,bbs.number[i].modem.max_rate,bbs.number[i].modem.desc - ,bbs.number[i].modem.min_rate); - - fprintf(html," %s<BR>\n" - ,i && !strcmp(bbs.number[i].modem.location,bbs.number[i-1].modem.location) - ? nulstr : bbs.number[i].modem.location); - } - fprintf(html,"<BR>\n"); - - fprintf(html,"<BLOCKQUOTE>\n"); - for(i=0;i<5;i++) { - if(!bbs.desc[i][0]) - break; - fprintf(html,"%s<BR>\n",bbs.desc[i]); - } - fprintf(html,"</BLOCKQUOTE>\n"); - - fprintf(html,"<PRE>\n"); - fprintf(html,"Entry created on %s by %s\n" - ,timestr(&bbs.created),bbs.user); - if(bbs.updated && bbs.userupdated[0]) - fprintf(html," Last updated on %s by %s\n" - ,timestr(&bbs.updated),bbs.userupdated); - if(bbs.verified && bbs.userverified[0]) - fprintf(html,"Last verified on %s by %s\n" - ,timestr(&bbs.verified),bbs.userverified); - - fprintf(html,"</PRE></P>\n"); - } - fprintf(html,"<CENTER><H1>End</H1></CENTER>\n"); - - fprintf(html,"<P>If you are a sysop of a <B>Synchronet BBS</B> and you would " - "like to add your system to this list, please do one of the following:\n"); - fprintf(html,"<UL>\n"); - fprintf(html,"<LI>Install <I>Synchronet BBS List <B>v2.00+</B></I> on your BBS and " - "link it into the <B>SYNCDATA</B> message conference (on <B>DOVE-Net</B> or <B>FidoNet</B>)\n"); - fprintf(html,"<LI><B>OR</B> log on to <A HREF=telnet://vert.synchro.net>Vertrauen</A> and " - "manually add your system into the online BBS List database.\n"); - fprintf(html,"</UL>\n"); - fprintf(html,"</BODY></HTML>\n"); - printf(" Done.\n"); - return(0); -} diff --git a/xtrn/sbl/sbl.bpf b/xtrn/sbl/sbl.bpf deleted file mode 100644 index 4d4d9faa08..0000000000 --- a/xtrn/sbl/sbl.bpf +++ /dev/null @@ -1,9 +0,0 @@ -USEUNIT("Sbl.c"); -USEUNIT("..\SDK\Xsdkvars.c"); -USEUNIT("..\SDK\Xsdk.c"); -USELIB("D:\Borland\CBuilder5\Lib\ws2_32.lib"); -USEUNIT("..\sdk\xsdkwrap.c"); -//--------------------------------------------------------------------------- -This file is used by the project manager only and should be treated like the project file - - main \ No newline at end of file diff --git a/xtrn/sbl/sbl.bpr b/xtrn/sbl/sbl.bpr deleted file mode 100644 index 00d8b4fdb9..0000000000 --- a/xtrn/sbl/sbl.bpr +++ /dev/null @@ -1,120 +0,0 @@ -<?xml version='1.0' encoding='utf-8' ?> -<!-- C++Builder XML Project --> -<PROJECT> - <MACROS> - <VERSION value="BCB.05.03"/> - <PROJECT value="sbl.exe"/> - <OBJFILES value="Sbl.obj ..\SDK\Xsdkvars.obj ..\SDK\Xsdk.obj ..\sdk\xsdkwrap.obj"/> - <RESFILES value=""/> - <IDLFILES value=""/> - <IDLGENFILES value=""/> - <DEFFILE value=""/> - <RESDEPEN value="$(RESFILES)"/> - <LIBFILES value="D:\Borland\CBuilder5\Lib\ws2_32.lib"/> - <LIBRARIES value=""/> - <SPARELIBS value=""/> - <PACKAGES value="VCL50.bpi VCLX50.bpi bcbsmp50.bpi VCLDB50.bpi VCLADO50.bpi ibsmp50.bpi - VCLBDE50.bpi VCLDBX50.bpi QRPT50.bpi TEEUI50.bpi TEEDB50.bpi TEE50.bpi - DSS50.bpi TEEQR50.bpi VCLIB50.bpi VCLMID50.bpi VCLIE50.bpi INETDB50.bpi - INET50.bpi NMFAST50.bpi WEBMID50.bpi bcbie50.bpi dclocx50.bpi"/> - <PATHCPP value=".;..\SDK"/> - <PATHPAS value=".;"/> - <PATHRC value=".;"/> - <PATHASM value=".;"/> - <DEBUGLIBPATH value="$(BCB)\lib\debug"/> - <RELEASELIBPATH value="$(BCB)\lib\release"/> - <LINKER value="tlink32"/> - <USERDEFINES value="_DEBUG"/> - <SYSDEFINES value="NO_STRICT;_NO_VCL"/> - <MAINSOURCE value="sbl.bpf"/> - <INCLUDEPATH value="$(BCB)\include;$(BCB)\include\vcl;..\sdk"/> - <LIBPATH value="..\SDK;$(BCB)\lib\obj;$(BCB)\lib"/> - <WARNINGS value="-w-par"/> - </MACROS> - <OPTIONS> - <IDLCFLAGS value="-I$(BCB)\include -I$(BCB)\include\vcl -I..\sdk -src_suffix cpp -D_DEBUG -boa"/> - <CFLAG1 value="-Od -H=$(BCB)\lib\vcl50.csm -Hc -Vx -Ve -X- -r- -a8 -b- -k -y -v -vi- -tWC - -tWM -c"/> - <PFLAGS value="-$YD -$W -$O- -v -JPHNE -M"/> - <RFLAGS value=""/> - <AFLAGS value="/mx /w2 /zd"/> - <LFLAGS value="-D"" -ap -Tpe -x -Gn -v"/> - </OPTIONS> - <LINKER> - <ALLOBJ value="c0x32.obj $(OBJFILES)"/> - <ALLRES value="$(RESFILES)"/> - <ALLLIB value="$(LIBFILES) $(LIBRARIES) import32.lib cw32mt.lib"/> - </LINKER> - <IDEOPTIONS> -[Version Info] -IncludeVerInfo=0 -AutoIncBuild=0 -MajorVer=1 -MinorVer=0 -Release=0 -Build=0 -Debug=0 -PreRelease=0 -Special=0 -Private=0 -DLL=0 -Locale=1033 -CodePage=1252 - -[Version Info Keys] -CompanyName= -FileDescription= -FileVersion=1.0.0.0 -InternalName= -LegalCopyright= -LegalTrademarks= -OriginalFilename= -ProductName= -ProductVersion=1.0.0.0 -Comments= - -[HistoryLists\hlIncludePath] -Count=3 -Item0=$(BCB)\include;$(BCB)\include\vcl;..\sdk -Item1=$(BCB)\include;$(BCB)\include\vcl;c:\sbbs\xtrn\sdk -Item2=$(BCB)\include;$(BCB)\include\vcl - -[HistoryLists\hlLibraryPath] -Count=2 -Item0=..\SDK;$(BCB)\lib\obj;$(BCB)\lib -Item1=$(BCB)\lib\obj;$(BCB)\lib - -[HistoryLists\hlDebugSourcePath] -Count=1 -Item0=$(BCB)\source\vcl - -[HistoryLists\hlConditionals] -Count=1 -Item0=_DEBUG - -[Debugging] -DebugSourceDirs=$(BCB)\source\vcl - -[Parameters] -RunParams= -HostApplication= -RemoteHost= -RemotePath= -RemoteDebug=0 - -[Compiler] -ShowInfoMsgs=0 -LinkDebugVcl=0 -LinkCGLIB=0 - -[CORBA] -AddServerUnit=1 -AddClientUnit=1 -PrecompiledHeaders=1 - -[Language] -ActiveLang= -ProjectLang= -RootDir= - </IDEOPTIONS> -</PROJECT> \ No newline at end of file diff --git a/xtrn/sbl/sbl.c b/xtrn/sbl/sbl.c deleted file mode 100644 index efa3b2f24c..0000000000 --- a/xtrn/sbl/sbl.c +++ /dev/null @@ -1,1525 +0,0 @@ -/* sbl.c */ - -/* Synchronet BBS List Door */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/*********** - * History * - *********** - -****************** -* RELEASE: v1.00 * -****************** - -07/03/93 03:16am -Fixed bug with "Auto-deleting" already deleted entries. This would cause a -long list of "Auto-deletion" messages once a day. - -07/03/93 03:30am -The name of the user who last updated the entry is now stored and displayed. - -07/03/93 03:45am -Adding/Updating entries is now much easier and user friendly. - -07/03/93 04:00am -Added support for user "verification" of BBS entries. - -07/03/93 04:10am -Users may now update or remove entries using partial system names. - -07/03/93 04:30am -Sysops may now un-delete purged entries with the '*' key. - -****************** -* RELEASE: v1.10 * -****************** - -10/18/93 06:04pm -Fixed bug that would cause entries to be purged almost immediately. - -10/18/93 07:01pm -(F)ind text now searches user names who last updated and verified. - -10/19/93 01:34am -Added option for users to change the format of BBS listings. - -****************** -* RELEASE: v1.20 * -****************** - -10/20/93 04:44pm -Fixed cosmetic problem with opening menu (for users, not sysop). - -****************** -* RELEASE: v1.21 * -****************** - -11/29/93 09:40pm -More cosmetic changes. Added "Saving..." message. - -****************** -* RELEASE: v1.22 * -****************** - -02/02/94 -Added warning for pending auto-deletion of BBS entries. - -02/02/94 -Added option for turning screen pause off/on. - -02/03/94 -Added option in SBL.CFG for sysop/co-sysop notification of changes made to -BBS list by users. - -02/03/94 -Converted all file operations from handles to streams for buffered i/o (speed). - -02/09/94 -Added options for generating a sort index and displaying sorted list based on -various criteria. - -02/09/94 -Added nodesync() calls to display any messages waiting for this user/node. - -02/10/94 -Added search for duplicate names when adding new BBS entries. - -02/10/94 -Notification notice of actual auto-deletion sent to author of BBS entry upon -auto-deletion. - -****************** -* RELEASE: v1.30 * -****************** - -03/14/94 -Added /M switch to force daily maintenance. - -03/22/94 -Fixed occasional double pause after listings. - -03/22/94 -Added total entries found to find text listings. - -03/22/94 -If a user verifies an entry, the user who created the entry is notified. - -03/29/94 -Sysop can define/change the "owner" of an entry when adding or updating. - -04/18/94 -Fixed bug in the sort-by-string functions that caused lock-ups when sorting -more than 312 entries. - -04/18/94 -Lowered memory requirements for all sort functions. - -****************** -* RELEASE: v1.31 * -****************** - -08/23/94 -BBS entries now know whether they were created by a user or by SMB2SBL (via -message base). - -08/23/94 -Fixed problem with hitting Ctrl-C locally during regular (not extended) -listing. Returning to main menu would not clear screen or have correct colors. -'aborted' variable is now reset in main() loop. - -****************** -* RELEASE: v1.32 * -****************** - -08/30/94 -Fixed stack overflow that would cause periodic lock-ups on some systems. - -****************** -* RELEASE: v1.33 * -****************** - -09/08/94 -When deleting an entry, the name of the BBS deleted wasn't being printed. - -02/01/95 -Import utility made mistake of ignoring READ messages to SBL. This has been -fixed. - -12/16/99 -Fixed Y2K window bug in dstrtounix(). - -12/16/99 -Fixed bug that caused SMB imported entries to never be autodeleted. - -06/01/00 -Added support for XSDK 3.0 - -06/01/00 -Added support for MSVC 5+ - -06/01/00 -Changed cosmetic appearance of main menu a bit - -06/14/99 -Added support for C++Builder 5 -*/ - -#include <stddef.h> /* offsetof() macro */ -#include <xsdk.h> -#include "sbldefs.h" - -unsigned _stklen=16000; /* Set stack size in code, not header */ - -#define Y2K_2DIGIT_WINDOW 70 -#define VERIFICATION_MOD FALSE - -typedef struct { - - char str[32]; - short offset; - - } sortstr_t; - -typedef struct { - - long i; - short offset; - - } sortint_t; - -char *nulstr=""; -char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec"}; -char tmp[256]; -char list_fmt[128]; -uint del_days,add_ml,update_ml,remove_ml,verify_ml,sbl_pause=1,notify_user; -time_t now; - -/****************************************************************************/ -/* Generates a 24 character ASCII string that represents the time_t pointer */ -/* Used as a replacement for ctime() */ -/****************************************************************************/ -char *timestr(time_t *intime) -{ - static char str[256]; - char mer[3],hour; - struct tm *gm; - -gm=localtime(intime); -if(gm->tm_hour>=12) { - if(gm->tm_hour==12) - hour=12; - else - hour=gm->tm_hour-12; - strcpy(mer,"pm"); } -else { - if(gm->tm_hour==0) - hour=12; - else - hour=gm->tm_hour; - strcpy(mer,"am"); } -sprintf(str,"%s %s %02d %4d %02d:%02d %s" - ,wday[gm->tm_wday],mon[gm->tm_mon],gm->tm_mday,1900+gm->tm_year - ,hour,gm->tm_min,mer); -return(str); -} - - -/****************************************************************************/ -/* Converts a date string in format MM/DD/YY into unix time format */ -/****************************************************************************/ -time_t dstrtounix(char *str) -{ - struct tm tm; - - if(!strncmp(str,"00/00/00",8)) - return(0); - memset(&tm,0,sizeof(tm)); - tm.tm_year=((str[6]&0xf)*10)+(str[7]&0xf); - if (tm.tm_year<Y2K_2DIGIT_WINDOW) - tm.tm_year+=100; - tm.tm_mon=((str[0]&0xf)*10)+(str[1]&0xf); - tm.tm_mday=((str[3]&0xf)*10)+(str[4]&0xf); - if (tm.tm_mon) - tm.tm_mon--; /* zero-based month field */ - return(mktime(&tm)); -} - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char * unixtodstr(time_t t, char *str) -{ - struct tm* tm; - - if(t==0) - strcpy(str,"00/00/00"); - else { - tm=gmtime(&t); - if(tm==NULL) { - strcpy(str,"00/00/00"); - return(str); - } - if(tm->tm_mon>11) { /* DOS leap year bug */ - tm->tm_mon=0; - tm->tm_year++; } - if(tm->tm_mday>31) - tm->tm_mday=1; - sprintf(str,"%02u/%02u/%02u",tm->tm_mon+1,tm->tm_mday - ,tm->tm_year%100); } - return(str); -} - -void dots(int show) -{ - static int i; - -if(!show) { /* reset */ - i=0; - return; } -if(++i>5) { - bputs("\b\b\b\b\b \b\b\b\b\b"); - i=0; - return; } -outchar('.'); -} - - -/* Displays short information about BBS. Returns 0 if aborted. */ - -char short_bbs_info(bbs_t bbs) -{ - char str[128]; - int i,j; - -for(i=0;i<bbs.total_numbers && i<MAX_NUMBERS;i++) { - for(j=0;list_fmt[j];j++) { - if(j) bputs(" "); - switch(toupper(list_fmt[j])) { - case 'N': - bprintf("\1h\1m%-25.25s",i ? nulstr : bbs.name); - break; - case 'S': - bprintf("\1h\1c%-15.15s",i ? nulstr : bbs.software); - break; - case 'P': - if(bbs.number[i].modem.min_rate==0xffff) { - if(bbs.number[i].telnet.port!=0 - && bbs.number[i].telnet.port!=IPPORT_TELNET) - sprintf(str,"%s:%hu" - ,bbs.number[i].telnet.addr - ,bbs.number[i].telnet.port); - else - strcpy(str,bbs.number[i].telnet.addr); - bprintf("\1h\1b%-28.28s",str); - } else - bprintf("\1n\1g%12.12s",bbs.number[i].modem.number); - break; - case 'B': - if(bbs.number[i].modem.min_rate!=0xffff) - bprintf("\1h\1g%5u",bbs.number[i].modem.max_rate); - break; - case 'M': - if(bbs.number[i].modem.min_rate!=0xffff) - bprintf("\1h\1b%-15.15s",bbs.number[i].modem.desc); - break; - case 'Y': - bprintf("\1h\1y%-25.25s",i ? nulstr : bbs.sysop[0]); - break; - case 'T': - if(i) bputs(" "); - else bprintf("\1y\1h%3u",bbs.nodes); - break; - case 'U': - if(i) bputs(" "); - else bprintf("\1n\1r%5u",bbs.users); - break; - case 'H': - if(i) bprintf("%10.10s",nulstr); - else bprintf("\1h\1r%10u",bbs.megs); - break; - case 'L': - bprintf("\1n\1c%-20.20s",bbs.number[i].modem.location); - break; - case 'F': - bprintf("\1n\1b%s",i ? nulstr : unixtodstr(bbs.birth,tmp)); - break; - case 'V': - bprintf("\1n\1m%s",i ? nulstr : unixtodstr(bbs.verified,tmp)); - break; - case 'D': - bprintf("\1n%s",i ? nulstr : unixtodstr(bbs.updated,tmp)); - break; - case 'C': - bprintf("\1n\1y%s",i ? nulstr : unixtodstr(bbs.created,tmp)); - break; - default: - bprintf("%c",list_fmt[j]); - break; - } } - bputs("\r\n"); } -if(kbhit()) - return(0); -return(1); -} - -char long_bbs_info(bbs_t bbs) -{ - int i; - -cls(); -bprintf("\1n\1gBBS Name: \1h%s \1n\1gsince \1h%s\r\n" - ,bbs.name,unixtodstr(bbs.birth,tmp)); -bprintf("\1n\1gOperator: "); -for(i=0;i<bbs.total_sysops && i<MAX_SYSOPS;i++) { - if(i) { - if(bbs.total_sysops>2) - bputs(", "); - else - outchar(SP); - if(!(i%4)) - bputs("\r\n "); - if(i+1==bbs.total_sysops) - bputs("and "); } - bprintf("\1h%s\1n\1g",bbs.sysop[i]); - if(!i && bbs.sysop_email[0]) - bprintf(" <\1h%s\1n\1g>", bbs.sysop_email); -} -CRLF; -bprintf("\1n\1gSoftware: \1h%-15.15s \1n\1gNodes: \1h%-5u \1n\1g" - "Users: \1h%-5u \1n\1gDoors: \1h%u\r\n" - ,bbs.software,bbs.nodes,bbs.users,bbs.xtrns); -bprintf("\1n\1gDownload: \1h%lu \1n\1gfiles in \1h%u \1n\1gdirectories of \1h" - "%luMB \1n\1gtotal space\r\n" - ,bbs.files,bbs.dirs,bbs.megs); -bprintf("Messages: \1h%lu \1n\1gmessages in \1h%u \1n\1gsub-boards\r\n" - ,bbs.msgs,bbs.subs); -bprintf("Networks: "); -for(i=0;i<bbs.total_networks && i<MAX_NETS;i++) { - if(i) { - if(bbs.total_networks>2) - bputs(", "); - else - outchar(SP); - if(!(i%3)) - bputs("\r\n "); - if(i+1==bbs.total_networks) - bputs("and "); } - bprintf("\1h%s [%s]\1n\1g",bbs.network[i],bbs.address[i]); } -CRLF; -bprintf("Terminal: "); -for(i=0;i<bbs.total_terminals && i<MAX_TERMS;i++) { - if(i) { - if(bbs.total_terminals>2) - bputs(", "); - else - outchar(SP); - if(i+1==bbs.total_terminals) - bputs("and "); } - bprintf("\1h%s\1n\1g",bbs.terminal[i]); } -CRLF; -if(bbs.web_url[0]) - bprintf("Web-site: http://\1h%s\r\n",bbs.web_url); -CRLF; -for(i=0;i<bbs.total_numbers && i<MAX_NUMBERS;i++) { - bprintf("\1h\1b%-30.30s " - ,i && !strcmp(bbs.number[i].modem.location,bbs.number[i-1].modem.location) - ? nulstr : bbs.number[i].modem.location); - if(bbs.number[i].modem.min_rate==0xffff) { - if(bbs.number[i].telnet.port!=0 - && bbs.number[i].telnet.port!=IPPORT_TELNET) - bprintf("\1n\1mtelnet://\1h%s:%hu\r\n" - ,bbs.number[i].telnet.addr - ,bbs.number[i].telnet.port); - else - bprintf("\1n\1mtelnet://\1h%s\r\n" - ,bbs.number[i].telnet.addr); - } else - bprintf("\1n\1g%12.12s \1h%5u \1b%-15.15s \1n\1cMinimum: \1h%u\r\n" - ,bbs.number[i].modem.number - ,bbs.number[i].modem.max_rate - ,bbs.number[i].modem.desc - ,bbs.number[i].modem.min_rate); -} -bputs("\r\n\1w\1h"); -for(i=0;i<DESC_LINES;i++) { - if(!bbs.desc[i][0]) - break; - bprintf("%15s%s\r\n",nulstr,bbs.desc[i]); } - -CRLF; -if(bbs.misc&FROM_SMB) - bputs("\1r\1hImported from message base.\r\n"); -bprintf("\1n\1cEntry created on \1h%s\1n\1c by \1h%s\r\n" - ,timestr(&bbs.created),bbs.user); -if(bbs.updated && bbs.userupdated[0]) - bprintf("\1n\1c Last updated on \1h%s\1n\1c by \1h%s\r\n" - ,timestr(&bbs.updated),bbs.userupdated); -if(bbs.verified && bbs.userverified[0]) - bprintf("\1n\1cLast verified on \1h%s\1n\1c by \1h%s" -#if VERIFICATION_MOD - " \1y(%d/%d)" -#endif - "\r\n" - ,timestr(&bbs.verified),bbs.userverified - ,bbs.verification_count,bbs.verification_attempts); -CRLF; -if(aborted) { - aborted=0; - return(0); } -if(!sbl_pause) { - if(kbhit()) - return(0); - return(1); } -nodesync(); -#if VERIFICATION_MOD - bputs("More? Y/N/V "); -switch(getkeys("YNV\r",0)) { - case '\r': - case 'Y': - return(1); - case 'V': - return(2); - default: - return(0); -} -#else - return(yesno("More")); -#endif -} - -/* Gets/updates BBS info from user. Returns 0 if aborted. */ - -char get_bbs_info(bbs_t *bbs) -{ - char str[128]; - int i; - -aborted=0; -if(!(bbs->user[0])) - strcpy(bbs->user,user_name); -if(SYSOP) { - bputs("\1y\1hUser Name (Creator/Owner of Entry): "); - if(!getstr(bbs->user,25,K_EDIT|K_LINE|K_AUTODEL)) - return(0); } -bputs("\1y\1hSystem Name: "); -if(getstr(bbs->name,25,K_EDIT|K_LINE|K_AUTODEL)<2) - return(0); -if(!bbs->software[0]) - strcpy(bbs->software,"Synchronet"); -bprintf("\1y\1hSoftware: \1w",bbs->software); -if(!getstr(bbs->software,15,K_AUTODEL|K_EDIT)) - return(0); - -for(i=0;i<MAX_SYSOPS && !aborted;i++) { - bprintf("\1y\1hName of System Operator #%d [\1wNone\1y]: ",i+1); - if(!getstr(bbs->sysop[i],25,K_EDIT|K_LINE|K_AUTODEL)) - break; - if(!i) { - bprintf("\1y\1hInternet E-mail Address [\1wNone\1y]:\1w "); - getstr(bbs->sysop_email,40,K_EDIT|K_AUTODEL); - } -} -bbs->total_sysops=i; -if(aborted) - return(0); - -unixtodstr(bbs->birth,str); -bprintf("\1y\1hFirst Day Online (MM/DD/YY): \1w"); -if(getstr(str,8,K_UPPER|K_EDIT|K_AUTODEL)) - bbs->birth=dstrtounix(str); -if(aborted) return(0); - -for(i=0;i<MAX_NETS && !aborted;i++) { - bprintf("\1y\1hName of Message Network #%d [\1wNone\1y]: ",i+1); - if(!getstr(bbs->network[i],15,K_EDIT|K_AUTODEL|K_LINE)) - break; - bprintf("\1y\1hNetwork Message \1wAddress\1y #%d [\1wNone\1y]: \1w",i+1); - getstr(bbs->address[i],25,K_EDIT|K_AUTODEL); } -bbs->total_networks=i; -if(aborted) return(0); - -for(i=0;i<MAX_TERMS && !aborted;i++) { - bprintf("\1y\1hSupported Terminal Type #%d (i.e. TTY, ANSI, RIP) " - "[\1wNone\1y]: ",i+1); - if(!getstr(bbs->terminal[i],15,K_EDIT|K_AUTODEL|K_LINE)) - break; } -bbs->total_terminals=i; -if(aborted) return(0); - -bprintf("\1y\1hWeb-site [\1wNone\1y] http://\1w"); -getstr(bbs->web_url,60,K_EDIT|K_AUTODEL); - -if(!bbs->nodes) - bbs->nodes=1; -bprintf("\1y\1hNodes (maximum number of simultaneous REMOTE users): \1w"); -sprintf(str,"%u",bbs->nodes); -if(getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->nodes=atoi(str); -if(!bbs->nodes) - bbs->nodes=1; -if(aborted) return(0); - -for(i=0;i<MAX_NUMBERS;i++) { -#if 0 - if(!i && !bbs->number[i].modem.number[0]) - sprintf(bbs->number[i].modem.number,"%.8s",user_phone); -#endif - bprintf("\1y\1hPhone Number or \1mTelnet address\1y #%d [\1wNone\1y]: ",i+1); - if(!getstr(bbs->number[i].telnet.addr,28,K_EDIT|K_LINE)) - break; - if(!bbs->number[i].modem.location[0]) { - if(!i) - strcpy(bbs->number[i].modem.location,user_location); - else - strcpy(bbs->number[i].modem.location,bbs->number[i-1].modem.location); } - if(aborted) return(0); - if(isalpha(bbs->number[i].telnet.addr[0]) - || yesno("Is the above a Telnet address")) { - bbs->number[i].modem.min_rate=0xffff; - if(bbs->number[i].telnet.port==0) - bbs->number[i].telnet.port=IPPORT_TELNET; - bprintf("\1y\1hTCP Port: \1w"); - sprintf(str,"%u",bbs->number[i].telnet.port); - if(getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->number[i].telnet.port=atoi(str); - if(aborted) return(0); - - } else { - if(bbs->number[i].modem.min_rate==0xffff) - bbs->number[i].modem.min_rate=300; - bbs->number[i].modem.number[13]=0; - if(!bbs->number[i].modem.min_rate) { - if(i) - bbs->number[i].modem.min_rate=bbs->number[i-1].modem.min_rate; - else - bbs->number[i].modem.min_rate=300; } - bprintf("\1y\1hMinimum Connect Rate: \1w"); - sprintf(str,"%u",bbs->number[i].modem.min_rate); - if(getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->number[i].modem.min_rate=atoi(str); - if(aborted) return(0); - - if(!bbs->number[i].modem.max_rate) { - if(i) - bbs->number[i].modem.max_rate=bbs->number[i-1].modem.max_rate; - else - bbs->number[i].modem.max_rate=2400; } - if(bbs->number[i].modem.max_rate<bbs->number[i].modem.min_rate) - bbs->number[i].modem.max_rate=bbs->number[i].modem.min_rate; - bprintf("\1y\1hMaximum Connect Rate (i.e. 2400, 9600, 14400, etc): \1w"); - sprintf(str,"%u",bbs->number[i].modem.max_rate); - if(getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->number[i].modem.max_rate=atoi(str); - if(aborted) return(0); - bprintf("\1y\1hModem Description (i.e. Hayes, HST, V.32, etc): \1w"); - getstr(bbs->number[i].modem.desc,15,K_EDIT|K_AUTODEL); - } - - bprintf("\1y\1hLocation (City, State): \1w"); - if(!getstr(bbs->number[i].modem.location,30,K_EDIT|K_AUTODEL)) - break; - -} -if(!i) - return(0); -bbs->total_numbers=i; -if(aborted) - return(0); - -if(!bbs->users) - bbs->users=100; -bprintf("\1y\1hTotal Number of Users: \1w"); -sprintf(str,"%u",bbs->users); -if(getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->users=atoi(str); -if(aborted) return(0); - -if(!bbs->subs) - bbs->subs=10; -bprintf("\1y\1hTotal Number of Sub-boards (Message Areas): \1w"); -sprintf(str,"%u",bbs->subs); -if(getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->subs=atoi(str); -if(aborted) return(0); - -if(!bbs->msgs) - bbs->msgs=500; -bprintf("\1y\1hTotal Number of Public Messages: \1w"); -sprintf(str,"%lu",bbs->msgs); -if(getstr(str,10,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->msgs=atol(str); -if(aborted) return(0); - -if(!bbs->dirs) - bbs->dirs=5; -bprintf("\1y\1hTotal Number of Directories (File Areas): \1w"); -sprintf(str,"%u",bbs->dirs); -if(getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->dirs=atoi(str); -if(aborted) return(0); - -if(!bbs->files) - bbs->files=250; -bprintf("\1y\1hTotal Number of Downloadable Files: \1w"); -sprintf(str,"%lu",bbs->files); -if(getstr(str,10,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->files=atol(str); -if(aborted) return(0); - -if(!bbs->xtrns) - bbs->xtrns=5; -bprintf("\1y\1hTotal Number of External Programs (Doors): \1w"); -sprintf(str,"%u",bbs->xtrns); -if(getstr(str,5,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->xtrns=atoi(str); -if(aborted) return(0); - -if(!bbs->megs) - bbs->megs=40; -bprintf("\1y\1hTotal Storage Space (in Megabytes): \1w"); -sprintf(str,"%lu",bbs->megs); -if(getstr(str,10,K_NUMBER|K_EDIT|K_AUTODEL)) - bbs->megs=atol(str); -if(aborted) return(0); - -for(i=0;i<DESC_LINES;i++) { - bprintf("\1y\1hBBS Description (%d of %d): ",i+1,DESC_LINES); - if(!getstr(bbs->desc[i],50,K_EDIT|K_AUTODEL|K_LINE)) - break; } - -return(1); -} - -char partname(char *inname, char *inpart) -{ - char name[128],part[128],str[256]; - -strcpy(name,inname); -strupr(name); -strcpy(part,inpart); -strupr(part); -if(inname[0] && (strstr(name,part) || strstr(part,name))) { - sprintf(str,"\r\nDo you mean %s",inname); - if(yesno(str)) - return(1); } -return(0); -} - -int sortint_cmp(sortint_t *int1, sortint_t *int2) -{ - -if(int1->i>int2->i) - return(-1); -if(int1->i<int2->i) - return(1); -return(0); -} - -int sortstr_cmp(sortstr_t *str1, sortstr_t *str2) -{ -return(stricmp(str1->str,str2->str)); -} - -int main(int argc, char **argv) -{ - char str[512],name[128],*p,ch; - short i,j,file,done,sort_by_str; - int maint=0; - long l,found; - bbs_t bbs,tmpbbs; - FILE *stream; - sortstr_t *sortstr; - sortint_t *sortint; - - for(i=1;i<argc;i++) - if(argv[i][0]=='/') - switch(toupper(argv[i][1])) { - case 'M': - maint=1; - xsdk_mode&=~XSDK_MODE_NOCONSOLE; - break; } - - p=getenv("SBBSNODE"); - if(p) - strcpy(node_dir,p); - else { - printf("\nSBBSNODE environment variable must be set\n"); - exit(0); } - - if(node_dir[strlen(node_dir)-1]!='\\' && node_dir[strlen(node_dir)-1]!='/') - strcat(node_dir,"/"); - - strcpy(str,"sbl.cfg"); - if((file=sopen(str,O_RDONLY,SH_DENYNO))==-1) { - printf("error opening %s\r\n",str); - exit(1); } - if((stream=fdopen(file,"rb"))==NULL) { - printf("fdopen error with %s\r\n",str); - exit(1); } - fgets(str,81,stream); - del_days=atoi(str); - fgets(str,81,stream); - add_ml=atoi(str); - fgets(str,81,stream); - update_ml=atoi(str); - fgets(str,81,stream); - remove_ml=atoi(str); - fgets(str,81,stream); - verify_ml=atoi(str); - fgets(str,81,stream); - notify_user=atoi(str); - fclose(stream); - - initdata(); - if(maint) - client_socket=INVALID_SOCKET; - - mnehigh=HIGH|LIGHTGRAY; - mnelow=HIGH|YELLOW; - if(maint) - user_misc=(ANSI|COLOR); - - if((file=sopen("sbl.dab",O_RDWR|O_BINARY|O_CREAT,SH_DENYNO))==-1) { - bprintf("\r\n\7Error opening/creating sbl.dab\r\n"); - exit(1); } - if((stream=fdopen(file,"w+b"))==NULL) { - bprintf("\r\n\7Error converting sbl.dab file handle to stream\r\n"); - exit(1); } - setvbuf(stream,0L,_IOFBF,2048); - - if(del_days) { - now=time(NULL); - strcpy(str,"sblpurge.dab"); - if((file=nopen(str,O_RDWR|O_CREAT))==-1) { - printf("Error creating %s\r\n",str); - exit(1); } - l=0; - read(file,&l,4); - if(now-l>(24L*60L*60L) || maint) { /* more than a day since update */ - bputs("\r\n\1n\1hRunning daily maintenance for Synchronet BBS List..."); - lseek(file,0L,SEEK_SET); - write(file,&now,4); - close(file); - fseek(stream,0L,SEEK_SET); - while(!feof(stream)) { - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(bbs.name[0]) { - if((now-bbs.updated)/(24L*60L*60L)>(time_t)del_days - && (now-bbs.created)/(24L*60L*60L)>(time_t)del_days - && (now-bbs.verified)/(24L*60L*60L)>(time_t)del_days) { - lncntr=0; - bprintf("\r\n\1n\1hAuto-deleting \1m%s\r\n",bbs.name); - if(!(bbs.misc&FROM_SMB)) { - sprintf(str,"\1n\1hSBL: \1mYour BBS entry for \1y%s\1m\r\n" - " was auto-deleted from the \1cSynchronet BBS " - "List\r\n",bbs.name); - i=usernumber(bbs.user); - if(i) putsmsg(i,str); - } - bbs.name[0]=0; - fseek(stream,-(long)(sizeof(bbs_t)),SEEK_CUR); - fwrite(&bbs,sizeof(bbs_t),1,stream); - fflush(stream); - } else if (!(bbs.misc&FROM_SMB)) { /* Warn user */ - l=bbs.created; - if(l<bbs.updated) - l=bbs.updated; - if(l<bbs.verified) - l=bbs.verified; - if((now-l)/(24L*60L*60L)>=(time_t)(del_days/2)) { - bprintf("\r\n\1n\1hWarning \1y%s\r\n",bbs.user); - lncntr=0; - sprintf(str,"\1n\1hSBL: \1mPlease verify your BBS " - "entry for \1y%s\1m\r\n " - "in the \1cSynchronet BBS List " - "\1mor it will be deleted in \1i\1r%u " - "\1n\1h\1mdays.\r\n" - ,bbs.name - ,del_days-((now-l)/(24L*60L*60L))); - i=usernumber(bbs.user); - if(i) putsmsg(i,str); } } } } } - else - close(file); } - - if(maint) - return(0); - - strcpy(list_fmt,DEF_LIST_FMT); - while(1) { - aborted=0; - attr(LIGHTGRAY); - cls(); - COMPILER_DESC(str); - bprintf("\1n\1m\1hSynchronet \1wBBS List \1mv3.11 for %s\r\n (XSDK v%s %s %s) " - "\r\n\r\n" - ,PLATFORM_DESC - ,xsdk_ver - ,str - ,__DATE__ - ); - - #define SBL_INDENT " " - sprintf(str,SBL_INDENT"~List all systems (condensed)\r\n" - SBL_INDENT"~Change list format\r\n" - SBL_INDENT"~Extended information on all systems\r\n" - SBL_INDENT"~Turn screen pause %s\r\n" - SBL_INDENT"~Find text in BBS entries\r\n" - SBL_INDENT"~Generate sorted list\r\n" - SBL_INDENT"~Display sorted list\r\n" - SBL_INDENT"~New entry scan\r\n" - SBL_INDENT"~Add a BBS entry\r\n" - SBL_INDENT"~Update a BBS entry\r\n" - SBL_INDENT"~Verify a BBS entry\r\n" - SBL_INDENT"~Remove a BBS entry\r\n" - SBL_INDENT"~Quit back to BBS\r\n" - ,sbl_pause ? "OFF" : "ON"); - mnemonics(str); - if(SYSOP) - mnemonics(SBL_INDENT"~* Undelete entries\r\n"); - - bputs("\r\n"); - - l=filelength(fileno(stream)); - if(l>0) - bprintf(SBL_INDENT"\1n\1cThere are \1h%lu\1n\1c entries in the online BBS list " - "database.\r\n",l/(long)sizeof(bbs_t)); - - if(del_days) { - bprintf(SBL_INDENT"\1n\1cEntries are auto-deleted \1h%u\1n\1c days after " - "last update or verification.\r\n",del_days); - bputs(SBL_INDENT"Users are encouraged to \1hV\1n\1cerify (vouch for) any listed " - "systems they call.\r\n"); } - - nodesync(); /* Display any waiting messages */ - - bputs("\r\n"SBL_INDENT"\1y\1hWhich: \1w"); - switch(getkeys("CLGDEFSNAURTQV!*",0)) { - case '!': - bprintf("\r\nsizeof(bbs_t)=%u\r\n",sizeof(bbs_t)); - bprintf("\r\noffsetof(verification_count=%x)\r\n",offsetof(bbs_t,verification_count)); - pause(); - break; - case '*': - cls(); - if(!SYSOP) - break; - fseek(stream,0L,SEEK_SET); - while(!feof(stream) && !aborted) { - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(!bbs.name[0] && bbs.total_numbers>0) { - bbs.name[0]='?'; - bbs.verified=time(NULL); - sprintf(bbs.userverified,"%.25s",user_name); - if(yesno(bbs.name)) { - bprintf("\1n\1gFirst char: \1h"); - bbs.name[0]=getkey(0); - bprintf("%s\r\n",bbs.name); - fseek(stream,-(long)sizeof(bbs_t),SEEK_CUR); - fwrite(&bbs,sizeof(bbs_t),1,stream); - fflush(stream); - } - } - } - break; - case 'L': - cls(); - fseek(stream,0L,SEEK_SET); - i=0; - while(!feof(stream) && !aborted) { - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(!bbs.name[0] || bbs.total_numbers<1) - continue; - i++; - if(!short_bbs_info(bbs)) - break; - if(!sbl_pause) - lncntr=0; } - bprintf("\r\n\1n\1h%u systems listed.\r\n",i); - if(kbhit()) - getch(); - if(lncntr) - pause(); - break; - case 'C': - cls(); - bputs("\1n\1c\1hList Format Specifier Definitions:\1n\r\n\r\n"); - bputs("\1h\1w(\1mN\1w) \1n\1mName of System\r\n"); - bputs("\1h\1w(\1mS\1w) \1n\1mSoftware Used\r\n"); - bputs("\1h\1w(\1mP\1w) \1n\1mPhone Number\r\n"); - bputs("\1h\1w(\1mB\1w) \1n\1mMaximum Connect Rate (in bps)\r\n"); - bputs("\1h\1w(\1mM\1w) \1n\1mModem Type\r\n"); - bputs("\1h\1w(\1mY\1w) \1n\1mSysop's Name\r\n"); - bputs("\1h\1w(\1mT\1w) \1n\1mTotal Number of Nodes\r\n"); - bputs("\1h\1w(\1mU\1w) \1n\1mTotal Number of Users\r\n"); - bputs("\1h\1w(\1mH\1w) \1n\1mTotal Storage Capacity (in megabytes)\r\n"); - bputs("\1h\1w(\1mL\1w) \1n\1mLocation (City, State)\r\n"); - bputs("\1h\1w(\1mF\1w) \1n\1mDate System was First Online\r\n"); - bputs("\1h\1w(\1mC\1w) \1n\1mDate Entry was Created\r\n"); - bputs("\1h\1w(\1mV\1w) \1n\1mDate Entry was Last Verified\r\n"); - bputs("\1h\1w(\1mD\1w) \1n\1mDate Entry was Last Updated\r\n"); - bprintf("\r\n\1n\1gDefault Format: \1h%s",DEF_LIST_FMT); - bprintf("\r\n\1n\1gCurrent Format: \1h%s\r\n",list_fmt); - bprintf("\r\n\1y\1hNew Format: "); - if(getstr(tmp,10,K_UPPER|K_LINE)) { - if(!strchr(tmp,'P') || !strchr(tmp,'N')) { - bputs("\r\n\1h\1mP\1n\1mhone and \1hN\1n\1mame specifiers " - "must be present in format.\r\n\r\n"); - pause(); } - else - strcpy(list_fmt,tmp); } - break; - case 'E': - fseek(stream,0L,SEEK_SET); - while(!feof(stream) && !aborted) { - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(!bbs.name[0] || bbs.total_numbers<1) - continue; - i=long_bbs_info(bbs); - if(bbs.name[0] && !i) - break; -#if VERIFICATION_MOD - if(i==2) { - bbs.verification_count++; - fseek(stream,-(int)sizeof(bbs_t),SEEK_CUR); - fwrite(&bbs,sizeof(bbs_t),1,stream); - fflush(stream); - fseek(stream,-(int)sizeof(bbs_t),SEEK_CUR); - } -#endif - if(!sbl_pause) - lncntr=0; } - break; - case 'F': /* Find text */ - cls(); - bputs("\1y\1hText to search for: "); - if(!getstr(name,25,K_UPPER|K_LINE)) - break; - ch=yesno("\r\nDisplay extended information"); - - found=0; - bputs("\1n\1h\r\nSearching...\r\n\r\n"); - fseek(stream,0L,SEEK_SET); - while(!feof(stream) && !aborted) { - if(!sbl_pause) - lncntr=0; - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(!bbs.name[0] || bbs.total_numbers<1) - continue; - tmpbbs=bbs; - strupr(tmpbbs.name); - strupr(tmpbbs.user); - strupr(tmpbbs.software); - strupr(tmpbbs.userverified); - strupr(tmpbbs.userupdated); - strupr(tmpbbs.web_url); - for(i=0;i<DESC_LINES;i++) { - strupr(tmpbbs.desc[i]); - if(strstr(tmpbbs.desc[i],name)) - break; - } - if(i<DESC_LINES - || strstr(tmpbbs.name,name) - || strstr(tmpbbs.user,name) - || strstr(tmpbbs.software,name) - || strstr(tmpbbs.userverified,name) - || strstr(tmpbbs.userupdated,name) - || strstr(tmpbbs.web_url,name) - ) { - found++; - if(ch && !long_bbs_info(bbs)) - break; - if(!ch && !short_bbs_info(bbs)) - break; - continue; } - - for(i=0;i<tmpbbs.total_sysops;i++) { - strupr(tmpbbs.sysop[i]); - if(strstr(tmpbbs.sysop[i],name)) - break; } - if(i<tmpbbs.total_sysops) { - found++; - if(ch && !long_bbs_info(bbs)) - break; - if(!ch && !short_bbs_info(bbs)) - break; - continue; } - - for(i=0;i<tmpbbs.total_networks;i++) { - strupr(tmpbbs.network[i]); - strupr(tmpbbs.address[i]); - if(strstr(tmpbbs.network[i],name) - || strstr(tmpbbs.address[i],name)) - break; } - if(i<tmpbbs.total_networks) { - found++; - if(ch && !long_bbs_info(bbs)) - break; - if(!ch && !short_bbs_info(bbs)) - break; - continue; } - - for(i=0;i<tmpbbs.total_terminals;i++) { - strupr(tmpbbs.terminal[i]); - if(strstr(tmpbbs.terminal[i],name)) - break; } - if(i<tmpbbs.total_terminals) { - found++; - if(ch && !long_bbs_info(bbs)) - break; - if(!ch && !short_bbs_info(bbs)) - break; - continue; } - - for(i=0;i<tmpbbs.total_numbers;i++) { - strupr(tmpbbs.number[i].modem.number); - strupr(tmpbbs.number[i].modem.desc); - strupr(tmpbbs.number[i].modem.location); - if(strstr(tmpbbs.number[i].modem.number,name) - || strstr(tmpbbs.number[i].modem.desc,name) - || strstr(tmpbbs.number[i].modem.location,name)) - break; } - if(i<tmpbbs.total_numbers) { - found++; - if(ch && !long_bbs_info(bbs)) - break; - if(!ch && !short_bbs_info(bbs)) - break; - continue; } } - if(!ch || !found) { - CRLF; - if(kbhit()) - getch(); - if(found) - bprintf("\1n\1h%u systems listed.\r\n",found); - pause(); } - break; - case 'G': /* Generated sorted list */ - cls(); - if(!filelength(fileno(stream))) { - bprintf("No BBS list exists.\r\n"); - pause(); - break; } - bputs("\1n\1c\1hSort Options:\1n\r\n\r\n"); - bputs("\1h\1w(\1mN\1w) \1n\1mName of System\r\n"); - bputs("\1h\1w(\1mS\1w) \1n\1mSoftware Used\r\n"); - bputs("\1h\1w(\1mP\1w) \1n\1mPhone Number\r\n"); - bputs("\1h\1w(\1mB\1w) \1n\1mMaximum Connect Rate (in bps)\r\n"); - bputs("\1h\1w(\1mM\1w) \1n\1mModem Type\r\n"); - bputs("\1h\1w(\1mY\1w) \1n\1mSysop's Name\r\n"); - bputs("\1h\1w(\1mT\1w) \1n\1mTotal Number of Nodes\r\n"); - bputs("\1h\1w(\1mU\1w) \1n\1mTotal Number of Users\r\n"); - bputs("\1h\1w(\1mH\1w) \1n\1mTotal Storage Capacity (in megabytes)\r\n"); - bputs("\1h\1w(\1mL\1w) \1n\1mLocation (City, State)\r\n"); - bputs("\1h\1w(\1mF\1w) \1n\1mDate System was First Online\r\n"); - bputs("\1h\1w(\1mC\1w) \1n\1mDate Entry was Created\r\n"); - bputs("\1h\1w(\1mV\1w) \1n\1mDate Entry was Last Verified\r\n"); - bputs("\1h\1w(\1mD\1w) \1n\1mDate Entry was Last Updated\r\n"); - bprintf("\r\n\1y\1hSort by (\1wQ\1y=Quit): \1w"); - ch=getkeys("NSPBMYTUHLFCVDQ",0); - if(!ch || ch=='Q') - break; - cls(); - bputs("\1n\1hSorting... \1m"); - fseek(stream,0L,SEEK_SET); - i=j=done=0; - sort_by_str=0; - sortstr=NULL; - sortint=NULL; - while(!feof(stream) && !done) { - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - j++; - bprintf("\b\b\b\b%4u",j); - if(!bbs.name[0]) /* don't sort deleted entries */ - continue; - if(bbs.total_numbers<1) /* don't sort corrupted entries */ - continue; - i++; - switch(ch) { - case 'N': - sprintf(str,"%.30s",bbs.name); - sort_by_str=1; - break; - case 'S': - sprintf(str,"%.30s",bbs.software); - sort_by_str=1; - break; - case 'P': - sprintf(str,"%.30s",bbs.number[0].modem.number); - sort_by_str=1; - break; - case 'M': - sprintf(str,"%.30s",bbs.number[0].modem.desc); - sort_by_str=1; - break; - case 'Y': - sprintf(str,"%.30s",bbs.sysop[0]); - sort_by_str=1; - break; - case 'L': - sprintf(str,"%.30s",bbs.number[0].modem.location); - sort_by_str=1; - break; - case 'B': - l=bbs.number[0].modem.max_rate; - break; - case 'T': - l=bbs.nodes; - break; - case 'U': - l=bbs.users; - break; - case 'H': - l=bbs.megs; - break; - case 'F': - l=bbs.birth; - break; - case 'C': - l=bbs.created; - break; - case 'V': - l=bbs.verified; - break; - case 'D': - l=bbs.updated; - break; } - if(sort_by_str) { - if((sortstr=(sortstr_t *)REALLOC(sortstr - ,sizeof(sortstr_t)*i))==NULL) { - bprintf("\r\n\7Memory allocation error\r\n"); - LFREE(sortstr); - done=1; - continue; } - strcpy(sortstr[i-1].str,str); - sortstr[i-1].offset=j-1; } - else { - if((sortint=(sortint_t *)REALLOC(sortint - ,sizeof(sortint_t)*i))==NULL) { - bprintf("\r\n\7Memory allocation error\r\n"); - LFREE(sortint); - done=1; - continue; } - sortint[i-1].i=l; - sortint[i-1].offset=j-1; } } - - if(done) { - pause(); - break; } - - if(sort_by_str) - qsort((void *)sortstr,i,sizeof(sortstr[0]) - ,(int(*)(const void *, const void *))sortstr_cmp); - else - qsort((void *)sortint,i,sizeof(sortint[0]) - ,(int(*)(const void *, const void *))sortint_cmp); - - bprintf("\r\n\r\n\1h\1gCreating index..."); - sprintf(str,"sort_%03d.ndx",node_num); - if((file=nopen(str,O_WRONLY|O_CREAT|O_TRUNC))==-1) { - bprintf("\r\n\7Error creating %s\r\n",str); - if(sort_by_str) - LFREE(sortstr); - else - LFREE(sortint); - pause(); - break; } - for(j=0;j<i;j++) - if(sort_by_str) - write(file,&sortstr[j].offset,2); - else - write(file,&sortint[j].offset,2); - close(file); - if(sort_by_str) - LFREE(sortstr); - else - LFREE(sortint); - bputs("\r\n\r\n\1n\1hDone.\r\n"); - pause(); - break; - case 'D': - cls(); - sprintf(str,"sort_%03d.ndx",node_num); - if((file=nopen(str,O_RDONLY))==-1) { - bputs("\1n\1r\1hSorted list not generated.\r\n"); - pause(); } - ch=yesno("Display extended information"); - cls(); - while(/* !eof(file) && not on unix */ !aborted) { - if(read(file,&i,2)!=2) - break; - fseek(stream,(long)i*sizeof(bbs_t),SEEK_SET); - if(!sbl_pause) - lncntr=0; - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(!bbs.name[0] || bbs.total_numbers<1) - continue; - if(ch && !long_bbs_info(bbs)) - break; - if(!ch && !short_bbs_info(bbs)) - break; } - close(file); - if(kbhit()) - getch(); - if(lncntr) - pause(); - break; - case 'N': /* New (updated) entry scan */ - cls(); - bputs("\1y\1hLast update (MM/DD/YY): "); - if(!getstr(str,8,K_UPPER|K_LINE)) - break; - l=dstrtounix(str); - ch=yesno("\r\nDisplay extended information"); - found=0; - bputs("\1n\1h\r\nSearching...\r\n\r\n"); - fseek(stream,0L,SEEK_SET); - while(!feof(stream) && !aborted) { - if(!sbl_pause) - lncntr=0; - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(!bbs.name[0] || bbs.total_numbers<1) - continue; - if(bbs.updated>=l || bbs.created>=l) { - if(ch && !long_bbs_info(bbs)) - break; - if(!ch && !short_bbs_info(bbs)) - break; - found++; - continue; } } - if(!ch || !found) { - CRLF; - pause(); } - break; - case 'A': - cls(); - if((uint)user_level<add_ml) { - bprintf("\1h\1rYou have insufficient access.\r\n\r\n"); - pause(); - break; } - bputs("\1g\1hAdding a BBS entry:\1n\r\n\r\n"); - bputs("\1n\1gHit ENTER for unknown data items.\r\n\r\n"); - memset(&bbs,0,sizeof(bbs_t)); - if(!get_bbs_info(&bbs)) - break; - bputs("\1n\1h\r\nSearching for duplicates..."); - fseek(stream,0L,SEEK_SET); - i=0; - dots(0); - while(!feof(stream) && !i) { - dots(1); - if(!fread(&tmpbbs,sizeof(bbs_t),1,stream)) - break; - if(!stricmp(tmpbbs.name,bbs.name)) i=1; } - if(i) { - bprintf("\7\1n\1h\1r\1i\r\n\r\n%s \1n\1h\1ralready exists!" - "\r\n\r\n" - ,bbs.name); - pause(); - break; } - - bputs("\1n\1h\r\nSaving..."); - fseek(stream,0L,SEEK_SET); - dots(0); - while(!feof(stream)) { - dots(1); - if(!fread(&ch,1,1,stream)) - break; - if(!ch) { /* first byte is null */ - fseek(stream,-1L,SEEK_CUR); - break; } - fseek(stream,(long)sizeof(bbs_t)-1L,SEEK_CUR); } - bbs.created=time(NULL); - fwrite(&bbs,sizeof(bbs_t),1,stream); - fflush(stream); - if(notify_user && notify_user!=user_number) { - sprintf(str,"\1n\1hSBL: \1y%s \1madded \1c%s\1m " - "to the BBS List\r\n",user_name,bbs.name); - putsmsg(notify_user,str); } - break; - case 'R': /* Remove an entry */ - cls(); - if((uint)user_level<remove_ml) { - bprintf("\1h\1rYou have insufficient access.\r\n\r\n"); - pause(); - break; } - bprintf("\1y\1hRemove which system: "); - if(!getstr(name,25,K_LINE|K_UPPER)) - break; - bputs("\1n\1h\r\nSearching..."); - fseek(stream,0L,SEEK_SET); - found=0; - dots(0); - while(!feof(stream) && !aborted) { - dots(1); - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(!stricmp(bbs.name,name) || partname(bbs.name,name)) { - found=1; - for(i=0;i<bbs.total_sysops && i<MAX_SYSOPS;i++) - if(!stricmp(bbs.sysop[i],user_name)) - break; - if(SYSOP || !stricmp(bbs.user,user_name) - || i<bbs.total_sysops) { - fseek(stream,-(long)(sizeof(bbs_t)),SEEK_CUR); - strcpy(tmp,bbs.name); - bbs.name[0]=0; - bbs.updated=time(NULL); - fwrite(&bbs,sizeof(bbs_t),1,stream); - fflush(stream); - bprintf("\r\n\r\n\1m%s\1c deleted." - ,tmp); - if(notify_user && notify_user!=user_number) { - sprintf(str,"\1n\1hSBL: \1y%s \1mremoved \1c%s\1m " - "from the BBS List\r\n",user_name,tmp); - putsmsg(notify_user,str); } } - else - bprintf("\r\n\r\n\1rYou did not create \1m%s\1n." - ,bbs.name); - break; } } - if(!found) - bprintf("\r\n\r\n\1m%s\1c not found.",name); - CRLF; - CRLF; - pause(); - break; - case 'T': - sbl_pause=!sbl_pause; - break; - case 'V': /* Verify an entry */ - cls(); - if((uint)user_level<verify_ml) { - bprintf("\1h\1rYou have insufficient access.\r\n\r\n"); - pause(); - break; } - bprintf("\1y\1hVerify which system: "); - if(!getstr(name,25,K_LINE|K_UPPER)) - break; - bputs("\1n\1h\r\nSearching..."); - fseek(stream,0L,SEEK_SET); - found=0; - dots(0); - while(!feof(stream) && !aborted) { - dots(1); - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(!stricmp(bbs.name,name) || partname(bbs.name,name)) { - found=1; - bbs.verified=time(NULL); - sprintf(bbs.userverified,"%.25s",user_name); - fseek(stream,-(long)(sizeof(bbs_t)),SEEK_CUR); - fwrite(&bbs,sizeof(bbs_t),1,stream); - fflush(stream); - bprintf("\r\n\r\n\1m%s\1c verified. \1r\1h\1iThank you!" - ,bbs.name); - sprintf(str,"\1n\1hSBL: \1y%s \1mverified \1c%s\1m " - "in the BBS List\r\n",user_name,bbs.name); - if(notify_user && notify_user!=user_number) - putsmsg(notify_user,str); - if(stricmp(bbs.user,user_name)) { - i=usernumber(bbs.user); - if(i && i!=(int)user_number) putsmsg(i,str); } - break; } } - if(!found) - bprintf("\r\n\r\n\1m%s\1c not found.",name); - CRLF; - CRLF; - pause(); - break; - case 'U': /* Update an entry */ - cls(); - if((uint)user_level<update_ml) { - bprintf("\1h\1rYou have insufficient access.\r\n\r\n"); - pause(); - break; } - bprintf("\1y\1hUpdate which system: "); - if(!getstr(name,25,K_LINE|K_UPPER)) - break; - bputs("\1n\1h\r\nSearching..."); - fseek(stream,0L,SEEK_SET); - found=0; - dots(0); - while(!feof(stream) && !aborted) { - dots(1); - l=ftell(stream); - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(!stricmp(bbs.name,name) || partname(bbs.name,name)) { - found=1; - break; } } - if(found) { - for(i=0;i<bbs.total_sysops && i<MAX_SYSOPS;i++) - if(!bbs.sysop[i][0] || !stricmp(bbs.sysop[i],user_name)) - break; - if(SYSOP || !stricmp(bbs.user,user_name) - || i<bbs.total_sysops) { - CRLF; - CRLF; - if(get_bbs_info(&bbs)) { - bbs.misc&=~FROM_SMB; - bbs.updated=time(NULL); - sprintf(bbs.userupdated,"%.25s",user_name); - fseek(stream,l,SEEK_SET); - fwrite(&bbs,sizeof(bbs_t),1,stream); - fflush(stream); - bprintf("\r\n\1h\1m%s\1c updated.",bbs.name); - if(notify_user && notify_user!=user_number) { - sprintf(str,"\1n\1hSBL: \1y%s \1mupdated \1c%s\1m " - "in the BBS List\r\n",user_name,bbs.name); - putsmsg(notify_user,str); } } } - else - bprintf("\r\n\r\n\1h\1rYou did not create \1m%s\1n." - ,bbs.name); } - else - bprintf("\r\n\r\n\1h\1m%s\1c not found.",name); - CRLF; - CRLF; - pause(); - break; - case 'Q': - return(0); } } - return(-1); -} - -/* End of SBL.C */ diff --git a/xtrn/sbl/sbl.cfg b/xtrn/sbl/sbl.cfg deleted file mode 100644 index 6b27510098..0000000000 --- a/xtrn/sbl/sbl.cfg +++ /dev/null @@ -1,6 +0,0 @@ -90 Days to keep non-updated entries -10 Minimum security level to add -10 Minimum security level to update -10 Minimum security level to remove -10 Minimum security level to verify -1 User to notify of changes (0=none) diff --git a/xtrn/sbl/sbl.doc b/xtrn/sbl/sbl.doc deleted file mode 100644 index 642ba2b573..0000000000 --- a/xtrn/sbl/sbl.doc +++ /dev/null @@ -1,95 +0,0 @@ -Synchronet BBS List v3.11 for Win32 -=================================== - -Create the directory: SBL off of your Synchronet XTRN directory. -(Example: C:\SBBS\XTRN\SBL) - -Make sure SBL.EXE and SBL.CFG are in this directory. - -Use an ASCII editor to edit the Synchronet BBS List config file (SBL.CFG) to -your liking. - -Under SCFG->External Programs->Online Programs->Main, hit INS and add -Synchronet BBS List with the following configuration: - -Name Synchronet BBS List -Internal Code SBL -Start-up Directory ..\XTRN\SBL -Command Line sbl -Clean-up Command Line -Execution Cost None -Access Requirements -Execution Requirements -Multiple Concurrent Users Yes -Intercept I/O Interrupts No -Swap BBS out of Memory Yes -Modify User Data No -Execute on Event No -BBS Drop File Type Synchronet XTRN.DAT -Place Drop File In Node Directory - -Since SBL v3 is a 32-bit program, you MUST add it ("SBL") to your native -(OS/2) program list under SCFG->External Programs->OS/2 Program List. - -SBL Utilities -============= - -SBLPACK.EXE Remove deleted entries to save disk space and speed up listings -SBL2TXT.EXE Convert SBL listing to a text file - -Networking the Synchronet BBS List -================================== - -If you wish to link your SBL database with other Synchronet BBSs, you must -carry the Synchronet Data echo via DOVE-Net, FidoNet, or RIME and add -the following two events in SCFG->External Programs->Timed Events: - -Internal Code SMB2SBL -Start-up Directory ..\XTRN\SBL -Command Line SMB2SBL %jSUBS\SYNCDATA SBL.DAB -Execution Node 1 -Execution Days Sun Mon Tue Wed Thu Fri Sat -Execution Time 04:30 -Requires Exclusive Execution No -Force Users Off-line for Event No - -Internal Code SBL2SMB -Start-up Directory ..\XTRN\SBL -Command Line SBL2SMB SBL.DAB %jSUBS\SYNCDATA -Execution Node 1 -Execution Days Sun Mon Tue Wed Thu Fri Sat -Execution Time 04:31 -Requires Exclusive Execution No -Force Users Off-line for Event No - -Change "SYNCDATA" to the internal code of the Synchronet Data sub-board on -your BBS. We used SYNCDATA, since that is the example given in the Synchronet -manual for the DOVE-Net Synchronet Data sub-board internal code. It is okay -if you used a completely different internal code, as long as you specify that -code instead of "SYNCDATA" on the above command lines. - -Make note that all networked SBL entries will be deleted from Vertrauen -(Home of the Synchronet BBS List) after 90 days unless the entry is -retransmitted in the message base or updated manually on Vertrauen in that -time. To cause a retransmission from your BBS, you must (U)pdate the entry -using SBL and then SBL2SMB will re-export it automatically next time it is run -(via Timed Event). (V)erified entries are not re-exported by SBL2SMB, only new -and updated entries. You can also create a BBS entry message by hand (not -using SBL). Download SBBSLIST.ZIP from Vertrauen for more details. - -Source Code -=========== - -If you are a C programmer, you may find the included source code interesting -and/or useful as an example for writing your own XSDK and/or SMB utilities. - -MAKEFILE is for use with Borland C++ v3.x or v4.x and the Synchronet XSDK -to create SBL.EXE. SBL.C and SBLDEFS.H must also in the current directory when -MAKE is run. - -The SMB C library (SMB_120.ZIP) is required to compile SBL2SMB.C and SMB2SBL.C -(MAKE.BAT included to compile them). - -SBL2TXT.C is included as an SBL.DAB to SBL.TXT converter. - -/* End of SBL.DOC */ diff --git a/xtrn/sbl/sbl.dsp b/xtrn/sbl/sbl.dsp deleted file mode 100644 index 413b232b25..0000000000 --- a/xtrn/sbl/sbl.dsp +++ /dev/null @@ -1,106 +0,0 @@ -# Microsoft Developer Studio Project File - Name="sbl" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=sbl - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "sbl.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "sbl.mak" CFG="sbl - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "sbl - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "sbl - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "sbl - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "sbl___Win32_Release" -# PROP BASE Intermediate_Dir "sbl___Win32_Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "win32" -# PROP Intermediate_Dir "msvc.win32.release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\sdk" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "sbl - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "sbl___Win32_Debug" -# PROP BASE Intermediate_Dir "sbl___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "win32" -# PROP Intermediate_Dir "msvc.win32.debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\sdk" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib /nologo /subsystem:console /map /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "sbl - Win32 Release" -# Name "sbl - Win32 Debug" -# Begin Source File - -SOURCE=.\sbl.c -# End Source File -# Begin Source File - -SOURCE=.\sbldefs.h -# End Source File -# Begin Source File - -SOURCE=..\Sdk\xsdk.c -# End Source File -# Begin Source File - -SOURCE=..\Sdk\xsdkvars.c -# End Source File -# Begin Source File - -SOURCE=..\sdk\xsdkwrap.c -# End Source File -# End Target -# End Project diff --git a/xtrn/sbl/sbl2smb.c b/xtrn/sbl/sbl2smb.c deleted file mode 100644 index b67ae606c2..0000000000 --- a/xtrn/sbl/sbl2smb.c +++ /dev/null @@ -1,421 +0,0 @@ -/* sbl2smb.c */ - -/* Scans SBL database and posts any additions/updates into the an SMB base */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout xtrn * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#define uint unsigned int - -#ifdef _WIN32 -#include <windows.h> -#endif - -#include <io.h> /* access */ -#include <time.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> -#include <sys/stat.h> -#include <share.h> - -#include "sbbsdefs.h" -#include "smblib.h" -#include "smbwrap.h" -#include "sbldefs.h" -#include "xsdkwrap.h" /* PLATFORM_DESC */ - -#define SBL2SMB_VER "2.20/" PLATFORM_DESC - -smb_t smb; -extern int daylight=0; -extern long timezone=0L; - -unsigned _stklen=16000; - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' */ -/****************************************************************************/ -void truncsp(char *str) -{ - uint c; - - c=strlen(str); - while(c && (uchar)str[c-1]<=SP) c--; - str[c]=0; -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char* unixtodstr(time_t unix_time, char *str) -{ - struct tm* tm; - - if(!unix_time) - strcpy(str,"00/00/00"); - else { - tm=gmtime(&unix_time); - if(tm==NULL) { - strcpy(str,"00/00/00"); - return(str); - } - if(tm->tm_mon>11) { /* DOS leap year bug */ - tm->tm_mon=0; - tm->tm_year++; } - if(tm->tm_mday>31) - tm->tm_mday=1; - sprintf(str,"%02u/%02u/%02u",tm->tm_mday,tm->tm_mon+1 - ,TM_YEAR(tm->tm_year)); - } - return(str); -} - - - -#define BUF_LEN 8192 - -int main(int argc, char **argv) -{ - uchar str[128],tmp[128],buf[BUF_LEN],*p,software[128]; - int i,file; - ushort xlat; - long length; - ulong offset; - time_t last,t; - bbs_t bbs; - smbmsg_t msg; - FILE *stream; - - fprintf(stderr,"\nSBL2SMB v%s - Write SBL to SMB - Developed 1994-2000 " - "Rob Swindell\n\n",SBL2SMB_VER); - if(argc<3) { - fprintf(stderr,"usage: sbl2smb <sbl.dab> <smb_file> [/s:software]\n\n"); - fprintf(stderr,"ex: sbl2smb c:\\sbbs\\xtrn\\sbl\\sbl.dab " - "c:\\sbbs\\data\\subs\\syncdata /s:syn\n"); - return(1); } - - software[0]=0; - if(argc>3 && !strnicmp(argv[3],"/S:",3)) - strcpy(software,argv[3]+3); - - strcpy(smb.file,argv[2]); - strupr(smb.file); - - strcpy(str,argv[1]); - strupr(str); - if((file=sopen(str,O_RDWR|O_BINARY,SH_DENYNO))==-1) { - printf("error opening %s\n",str); - return(1); } - if((stream=fdopen(file,"rb"))==NULL) { - printf("error fdopening %s\n",str); - return(1); } - strcpy(tmp,str); - p=strrchr(tmp,'.'); - if(p) { - (*p)=0; - strcat(tmp,"2smb.dab"); - if((file=open(tmp,O_RDWR|O_BINARY|O_CREAT,S_IWRITE|S_IREAD))==-1) { - printf("error opening %s\n",str); - return(1); } - t=time(NULL); - if(read(file,&last,sizeof(time_t))!=sizeof(time_t)) - last=0; - lseek(file,0L,SEEK_SET); - write(file,&t,sizeof(time_t)); - close(file); } - - sprintf(str,"%s.SHD",smb.file); - if(!fexist(str)) { - printf("%s doesn't exist\n",smb.file); - return(0); } - fprintf(stderr,"Opening %s\n",smb.file); - smb.retry_time=30; - if((i=smb_open(&smb))!=0) { - printf("smb_open returned %d\n",i); - return(1); } - i=smb_locksmbhdr(&smb); - if(i) { - printf("smb_locksmbhdr returned %d\n",i); - return(1); } - i=smb_getstatus(&smb); - smb_unlocksmbhdr(&smb); - if(i) { - printf("smb_getstatus returned %d\n",i); - return(1); } - - while(!feof(stream)) { - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(bbs.total_numbers<1 /* corrupted? */ - || bbs.total_numbers>MAX_NUMBERS) - continue; - truncsp(bbs.name); - if(bbs.name[0]<=' ' /* corrupted? */ - || bbs.misc&FROM_SMB - || (bbs.updated<last && bbs.created<last - && bbs.verified<last)) - continue; - if(software[0] && strnicmp(software,bbs.software,strlen(software))) - continue; - - truncsp(bbs.user); - if(bbs.user[0]<=' ') /* corrupted? */ - continue; - truncsp(bbs.software); - if(bbs.software[0]<=' ') /* corrupted? */ - continue; - - printf("%s\r\n",bbs.name); - memset(buf,0,BUF_LEN); - - sprintf(str,"%-15.15s%s\r\n" - ,"Name:",bbs.name); - strcat(buf,str); - - sprintf(str,"%-15.15s%s\r\n" - ,"Birth:",unixtodstr(bbs.birth,tmp)); - strcat(buf,str); - - sprintf(str,"%-15.15s%s\r\n" - ,"Software:",bbs.software); - strcat(buf,str); - - for(i=0;i<bbs.total_sysops;i++) { - truncsp(bbs.sysop[i]); - sprintf(str,"%-15.15s%s\r\n" - ,"Sysop:",bbs.sysop[i]); - strcat(buf,str); } - - strcat(buf,"\r\n"); - - truncsp(bbs.sysop_email); - if(bbs.sysop_email[0]) { - sprintf(str,"%-15.15s%s\r\n" - ,"E-mail:",bbs.sysop_email); - strcat(buf,str); - } - - truncsp(bbs.web_url); - if(bbs.web_url[0]) { - sprintf(str,"%-15.15s%s\r\n" - ,"Web-site:",bbs.web_url); - strcat(buf,str); - } - - strcat(buf,"\r\n"); - - for(i=0;i<bbs.total_numbers;i++) { - truncsp(bbs.number[i].modem.number); - sprintf(str,"%-15.15s%s\r\n" - ,"Number:",bbs.number[i].modem.number); - strcat(buf,str); - - sprintf(str,"%-15.15s%u\r\n" - ,"MinRate:",bbs.number[i].modem.min_rate); - strcat(buf,str); - - sprintf(str,"%-15.15s%u\r\n" - ,"MaxRate:",bbs.number[i].modem.max_rate); - strcat(buf,str); - - if(bbs.number[i].modem.min_rate!=0xffff) { - - sprintf(str,"%-15.15s%s\r\n" - ,"Modem:",bbs.number[i].modem.desc); - strcat(buf,str); - } - truncsp(bbs.number[i].modem.location); - sprintf(str,"%-15.15s%s\r\n" - ,"Location:",bbs.number[i].modem.location); - strcat(buf,str); - if(i+1<bbs.total_numbers) - strcat(buf,"\r\n"); } - - if(bbs.total_networks) - strcat(buf,"\r\n"); - for(i=0;i<bbs.total_networks;i++) { - sprintf(str,"%-15.15s%s\r\n" - ,"Network:",bbs.network[i]); - strcat(buf,str); - sprintf(str,"%-15.15s%s\r\n" - ,"Address:",bbs.address[i]); - strcat(buf,str); - if(i+1<bbs.total_networks) - strcat(buf,"\r\n"); } - - strcat(buf,"\r\n"); - for(i=0;i<bbs.total_terminals;i++) { - sprintf(str,"%-15.15s%s\r\n" - ,"Terminal:",bbs.terminal[i]); - strcat(buf,str); } - - strcat(buf,"\r\n"); - sprintf(str,"%-15.15s%lu\r\n" - ,"Megs:",bbs.megs); - strcat(buf,str); - sprintf(str,"%-15.15s%lu\r\n" - ,"Msgs:",bbs.msgs); - strcat(buf,str); - sprintf(str,"%-15.15s%lu\r\n" - ,"Files:",bbs.files); - strcat(buf,str); - sprintf(str,"%-15.15s%u\r\n" - ,"Nodes:",bbs.nodes); - strcat(buf,str); - sprintf(str,"%-15.15s%u\r\n" - ,"Users:",bbs.users); - strcat(buf,str); - sprintf(str,"%-15.15s%u\r\n" - ,"Subs:",bbs.subs); - strcat(buf,str); - sprintf(str,"%-15.15s%u\r\n" - ,"Dirs:",bbs.dirs); - strcat(buf,str); - sprintf(str,"%-15.15s%u\r\n" - ,"Xtrns:",bbs.xtrns); - strcat(buf,str); - - if(bbs.desc[0][0]) - strcat(buf,"\r\n"); - for(i=0;i<5;i++) { - if(!bbs.desc[i][0]) - break; - sprintf(str,"%-15.15s%s\r\n" - ,"Desc:",bbs.desc[i]); - strcat(buf,str); } - - strcat(buf,"\r\n--- SBL2SMB v"); - strcat(buf,SBL2SMB_VER); - - length=strlen(buf); /* +2 for translation string */ - - if(smb.status.attr&SMB_HYPERALLOC) - offset=smb_hallocdat(&smb); - else { - i=smb_open_da(&smb); - if(i) { - printf("smb_open_da returned %d\n",i); - exit(1); } - offset=smb_allocdat(&smb,length+2,1); - fclose(smb.sda_fp); } - - fseek(smb.sdt_fp,offset,SEEK_SET); - xlat=XLAT_NONE; - fwrite(&xlat,2,1,smb.sdt_fp); - fwrite(buf,length,1,smb.sdt_fp); - length+=2; - - memset(&msg,0,sizeof(smbmsg_t)); - memcpy(msg.hdr.id,"SHD\x1a",4); - msg.hdr.version=smb_ver(); - msg.hdr.when_written.time=time(NULL); - - msg.hdr.offset=offset; - - strcpy(str,"SBL"); - i=smb_hfield(&msg,RECIPIENT,(ushort)strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.to=crc16(str); - - strcpy(str,bbs.user); - i=smb_hfield(&msg,SENDER,(ushort)strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.from=crc16(str); - - strcpy(str,bbs.name); - i=smb_hfield(&msg,SUBJECT,(ushort)strlen(str),str); - if(i) { - printf("smb_hfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - strlwr(str); - msg.idx.subj=crc16(str); - - i=smb_dfield(&msg,TEXT_BODY,length); - if(i) { - printf("smb_dfield returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - - i=smb_addmsghdr(&smb,&msg,smb.status.attr&SMB_HYPERALLOC); - if(i) { - printf("smb_addmsghdr returned %d\n",i); - smb_freemsgdat(&smb,offset,length,1); - exit(1); } - smb_freemsgmem(&msg); } - return(0); -} - -/* End of SBL2SMB.C */ diff --git a/xtrn/sbl/sbl2smb.dsp b/xtrn/sbl/sbl2smb.dsp deleted file mode 100644 index 6af82f5bc1..0000000000 --- a/xtrn/sbl/sbl2smb.dsp +++ /dev/null @@ -1,96 +0,0 @@ -# Microsoft Developer Studio Project File - Name="sbl2smb" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=sbl2smb - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "sbl2smb.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "sbl2smb.mak" CFG="sbl2smb - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "sbl2smb - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "sbl2smb - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "sbl2smb - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "win32" -# PROP Intermediate_Dir "msvc.win32.release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "c:\src\sbbs3" /I "..\sdk" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "sbl2smb - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "sbl2smb___Win32_Debug" -# PROP BASE Intermediate_Dir "sbl2smb___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "win32" -# PROP Intermediate_Dir "msvc.win32.debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "c:\src\sbbs3" /I "..\sdk" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "sbl2smb - Win32 Release" -# Name "sbl2smb - Win32 Debug" -# Begin Source File - -SOURCE=.\sbl2smb.c -# End Source File -# Begin Source File - -SOURCE=C:\src\sbbs3\smblib.c -# End Source File -# Begin Source File - -SOURCE=C:\src\sbbs3\smbwrap.c -# End Source File -# End Target -# End Project diff --git a/xtrn/sbl/sbl2txt.c b/xtrn/sbl/sbl2txt.c deleted file mode 100644 index 8dd55531a0..0000000000 --- a/xtrn/sbl/sbl2txt.c +++ /dev/null @@ -1,190 +0,0 @@ -/* SBL2TXT.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/* Converts Synchronet BBS List (SBL.DAB) to text file */ - -#include "xsdk.h" -#include "sbldefs.h" - -char *wday[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; -char *mon[]={"Jan","Feb","Mar","Apr","May","Jun" - ,"Jul","Aug","Sep","Oct","Nov","Dec"}; -char *nulstr=""; -char tmp[256]; -struct date date; -struct time curtime; - -extern int daylight=0; -extern long timezone=0L; - -/****************************************************************************/ -/* Generates a 24 character ASCII string that represents the time_t pointer */ -/* Used as a replacement for ctime() */ -/****************************************************************************/ -char *timestr(time_t *intime) -{ - static char str[256]; - char mer[3],hour; - struct tm *gm; - -gm=localtime(intime); -if(gm->tm_hour>=12) { - if(gm->tm_hour==12) - hour=12; - else - hour=gm->tm_hour-12; - strcpy(mer,"pm"); } -else { - if(gm->tm_hour==0) - hour=12; - else - hour=gm->tm_hour; - strcpy(mer,"am"); } -sprintf(str,"%s %s %02d %4d %02d:%02d %s" - ,wday[gm->tm_wday],mon[gm->tm_mon],gm->tm_mday,gm->tm_year%100 - ,hour,gm->tm_min,mer); -return(str); -} - -/****************************************************************************/ -/* Converts unix time format (long - time_t) into a char str MM/DD/YY */ -/****************************************************************************/ -char *unixtodstr(time_t unix, char *str) -{ - -if(!unix) - strcpy(str,"00/00/00"); -else { - unixtodos(unix,&date,&curtime); - if((unsigned)date.da_mon>12) { /* DOS leap year bug */ - date.da_mon=1; - date.da_year++; } - if((unsigned)date.da_day>31) - date.da_day=1; - sprintf(str,"%02u/%02u/%02u",date.da_mon,date.da_day - ,date.da_year>=2000 ? date.da_year-2000 : date.da_year-1900); } -return(str); -} - - -void long_bbs_info(FILE *out, bbs_t bbs) -{ - int i; - -fprintf(out,"BBS Name: %s since %s\r\n" - ,bbs.name,unixtodstr(bbs.birth,tmp)); -fprintf(out,"Operator: "); -for(i=0;i<bbs.total_sysops;i++) { - if(i) { - if(bbs.total_sysops>2) - fprintf(out,", "); - else - fputc(SP,out); - if(!(i%4)) - fprintf(out,"\r\n "); - if(i+1==bbs.total_sysops) - fprintf(out,"and "); } - fprintf(out,"%s",bbs.sysop[i]); } -fprintf(out,"\r\n"); -fprintf(out,"Software: %-15.15s Nodes: %-5u " - "Users: %-5u Doors: %u\r\n" - ,bbs.software,bbs.nodes,bbs.users,bbs.xtrns); -fprintf(out,"Download: %lu files in %u directories of " - "%luMB total space\r\n" - ,bbs.files,bbs.dirs,bbs.megs); -fprintf(out,"Messages: %lu messages in %u sub-boards\r\n" - ,bbs.msgs,bbs.subs); -fprintf(out,"Networks: "); -for(i=0;i<bbs.total_networks;i++) { - if(i) { - if(bbs.total_networks>2) - fprintf(out,", "); - else - fputc(SP,out); - if(!(i%3)) - fprintf(out,"\r\n "); - if(i+1==bbs.total_networks) - fprintf(out,"and "); } - fprintf(out,"%s [%s]",bbs.network[i],bbs.address[i]); } -fprintf(out,"\r\n"); -fprintf(out,"Terminal: "); -for(i=0;i<bbs.total_terminals;i++) { - if(i) { - if(bbs.total_terminals>2) - fprintf(out,", "); - else - fputc(SP,out); - if(i+1==bbs.total_terminals) - fprintf(out,"and "); } - fprintf(out,"%s",bbs.terminal[i]); } -fprintf(out,"\r\n\r\n"); -for(i=0;i<bbs.total_numbers;i++) - fprintf(out,"%-30.30s %12.12s %5u %-15.15s " - "Minimum: %u\r\n" - ,i && !strcmp(bbs.number[i].modem.location,bbs.number[i-1].modem.location) - ? nulstr : bbs.number[i].modem.location - ,bbs.number[i].modem.number - ,bbs.number[i].modem.max_rate - ,bbs.number[i].modem.desc - ,bbs.number[i].modem.min_rate); - -fprintf(out,"\r\n"); -for(i=0;i<5;i++) { - if(!bbs.desc[i][0]) - break; - fprintf(out,"%15s%s\r\n",nulstr,bbs.desc[i]); } - -fprintf(out,"\r\n"); -fprintf(out,"Entry created on %s by %s\r\n" - ,timestr(&bbs.created),bbs.user); -fprintf(out," Last updated on %s\r\n\r\n",timestr(&bbs.updated)); -} - - -void main(int argc, char **argv) -{ - char software[16]=""; - char telnet_port[16]; - int i,in; - FILE *out; - bbs_t bbs; - -for(i=1;i<argc;i++) - if(argv[i][0]=='s' && argv[i][1]=='=') - sprintf(software,"%.15s",argv[i]+2); - -if((in=open("SBL.DAB",O_RDONLY|O_BINARY))==-1) { - printf("error opening SBL.DAB\n"); - return; } - -if((out=fopen("SBL.TXT","wb"))==NULL) { - printf("error opening/creating SBL.TXT\n"); - return; } - -while(!eof(in)) { - read(in,&bbs,sizeof(bbs_t)); - if(!bbs.name[0]) - continue; - if(software[0] && strnicmp(bbs.software,software,strlen(software))) - continue; - // long_bbs_info(out,bbs); - for(i=0;i<bbs.total_numbers;i++) - if(bbs.number[i].modem.min_rate==0xffff) { - if(bbs.number[i].telnet.port && bbs.number[i].telnet.port!=23) - sprintf(telnet_port,":%u",bbs.number[i].telnet.port); - else - telnet_port[0]=0; - fprintf(out,"%-25.25s telnet://%s%s\r\n" - ,bbs.name - ,bbs.number[i].telnet.addr - ,telnet_port); - } else - fprintf(out,"%-25.25s %12.12s %5u %s\r\n" - ,bbs.name,bbs.number[i].modem.number - ,bbs.number[i].modem.max_rate - ,bbs.number[i].modem.desc); - } -close(in); -fclose(out); -} diff --git a/xtrn/sbl/sbldefs.h b/xtrn/sbl/sbldefs.h deleted file mode 100644 index ae1b7e25e4..0000000000 --- a/xtrn/sbl/sbldefs.h +++ /dev/null @@ -1,128 +0,0 @@ -/* sbldefs.h */ - -/* Synchronet BBS List Macros, constants, and type definitions */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout src * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#define MAX_SYSOPS 5 -#define MAX_NUMBERS 20 -#define MAX_NETS 10 -#define MAX_TERMS 5 -#define DESC_LINES 5 -#define DEF_LIST_FMT "NSTP" - -#ifndef IPPORT_TELNET -#define IPPORT_TELNET 23 -#endif - -#define Y2K_2DIGIT_WINDOW 70 - -/* Misc bits */ - -#define FROM_SMB (1L<<0) /* BBS info imported from message base */ - -#ifdef _WIN32 /* necessary for compatibility with SBL */ -#pragma pack(push) -#pragma pack(1) -#endif - -typedef union _PACK { - - struct { - char number[13]; /* Phone number */ - char desc[16]; /* Modem description */ - char location[31]; /* Location of phone number */ - ushort min_rate; /* Minimum connect rate */ - ushort max_rate; /* Maximum connect rate */ - } modem; - - struct { - char addr[29]; /* Telnet address */ - char location[31]; /* Location */ - ushort unused; /* 0xffff */ - ushort port; /* TCP port number */ - } telnet; - -} number_t; - -typedef struct _PACK { - char name[26] /* System name */ - ,user[26] /* User who created entry */ - ,software[16] /* BBS software */ - ,total_sysops - ,sysop[MAX_SYSOPS][26] /* Sysop names */ - ,total_numbers - ,total_networks - ,network[MAX_NETS][16] /* Network names */ - ,address[MAX_NETS][26] /* Network addresses */ - ,total_terminals - ,terminal[MAX_TERMS][16] /* Terminals supported */ - ,desc[DESC_LINES][51] /* 5 line description */ - ; - ushort nodes /* Total nodes */ - ,users /* Total users */ - ,subs /* Total sub-boards */ - ,dirs /* Total file dirs */ - ,xtrns /* Total external programs */ - ; - time_t created /* Time/date entry was created */ - ,updated /* Time/date last updated */ - ,birth /* Birthdate of BBS */ - ; - ulong megs /* Storage space in megabytes */ - ,msgs /* Total messages */ - ,files /* Total files */ - ,misc /* Miscellaneous bits */ - ; - number_t number[MAX_NUMBERS]; /* Access numbers */ - - char userupdated[26]; /* User who last updated */ - time_t verified; /* Time/Date last vouched for */ - char userverified[26]; /* User who last vouched */ - char web_url[61]; /* Web-site address */ - char sysop_email[61]; /* Sysop's e-mail address */ - time_t exported; /* Date last exported to SMB */ - ulong verification_count; /* Number of successful auto-verifications */ - ulong verification_attempts; /* Number of auto-verification attempts */ - char unused[310]; /* Unused space */ -} bbs_t; - -#ifdef _WIN32 -#pragma pack(pop) /* original packing */ -#endif - - - -/* End of SBL.H */ - diff --git a/xtrn/sbl/sblpack.c b/xtrn/sbl/sblpack.c deleted file mode 100644 index 4e31ce01b5..0000000000 --- a/xtrn/sbl/sblpack.c +++ /dev/null @@ -1,69 +0,0 @@ -/* SBLPACK.C */ - -/* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ - -/***************************************/ -/* Synchronet BBS List Database Packer */ -/***************************************/ - -#include <stdio.h> -#include <stdlib.h> /* exit() */ -#include <share.h> -#include <time.h> -#include <io.h> -#include <fcntl.h> -#include <sys/stat.h> -#include "xsdkwrap.h" /* PLATFORM_DESC */ -#include "xsdkdefs.h" -#include "sbldefs.h" - -int main(void) -{ - int file; - FILE * in; - FILE * out; - bbs_t bbs; - ulong records=0; - ulong deleted=0; - - printf("\nSBLPACK v1.10/%s Developed 1995-2001 Rob Swindell\n\n" - ,PLATFORM_DESC); - - if((file=sopen("sbl.dab",O_RDWR|O_BINARY,SH_DENYNO))==-1) { - printf("\n\7Error opening/creating sbl.dab\n"); - exit(1); } - if((in=fdopen(file,"w+b"))==NULL) { - printf("\n\7Error converting sbl.dab file handle to stream\n"); - exit(1); } - setvbuf(in,0L,_IOFBF,2048); - if((out=fopen("sbl.tmp","wb"))==NULL) { - printf("\n\7Error opening sbl.tmp file\n"); - exit(1); } - - while(!feof(in)) { - if(!fread(&bbs,sizeof(bbs_t),1,in)) - break; - records++; - putchar('.'); - if(bbs.name[0]==0 - || bbs.user[0]==0 - || bbs.total_numbers<1) { - deleted++; - continue; - } - fwrite(&bbs,sizeof(bbs_t),1,out); - } - fcloseall(); - putchar('\n'); - if(remove("sbl.dab")) { - printf("\n\7Data file in use, can't remove.\n"); - remove("sbl.tmp"); - exit(1); - } - rename("sbl.tmp","sbl.dab"); - printf("\nDone.\n"); - printf("\n%lu records in original file, %lu deleted (packed), new total = %lu.\n" - ,records,deleted,records-deleted); - return(0); -} - diff --git a/xtrn/sbl/sblpack.dsp b/xtrn/sbl/sblpack.dsp deleted file mode 100644 index 6881368d1f..0000000000 --- a/xtrn/sbl/sblpack.dsp +++ /dev/null @@ -1,89 +0,0 @@ -# Microsoft Developer Studio Project File - Name="sblpack" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=sblpack - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "sblpack.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "sblpack.mak" CFG="sblpack - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "sblpack - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "sblpack - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "sblpack - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "win32" -# PROP Intermediate_Dir "msvc.win32.release" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "..\sdk" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "sblpack - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "sblpack___Win32_Debug" -# PROP BASE Intermediate_Dir "sblpack___Win32_Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\sdk" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "sblpack - Win32 Release" -# Name "sblpack - Win32 Debug" -# Begin Source File - -SOURCE=.\sblpack.c -# End Source File -# End Target -# End Project diff --git a/xtrn/sbl/smb2sbl.c b/xtrn/sbl/smb2sbl.c deleted file mode 100644 index 4d33de6d03..0000000000 --- a/xtrn/sbl/smb2sbl.c +++ /dev/null @@ -1,521 +0,0 @@ -/* smb2sbl.c */ - -/* Scans SMB message base for messages to "SBL" and adds them to the SBL */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This program is free software; you can redistribute it and/or * - * modify it under the terms of the GNU General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU General Public License for more details: gpl.txt or * - * http://www.fsf.org/copyleft/gpl.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout xtrn * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#define uint unsigned int - -/* #include <dos.h> */ -#include <stdio.h> -#include <time.h> -#include <io.h> /* open */ -#include <fcntl.h> /* O_RDWR */ -#include <sys/stat.h> /* S_IWRITE */ -#include <ctype.h> /* isdigit */ -#include <stdlib.h> /* atoi */ -#ifndef __FreeBSD__ - #include <malloc.h> -#endif -#include <string.h> -#include "smblib.h" -#include "smbwrap.h" /* fexist/flength */ -#include "sbldefs.h" -#include "xsdkwrap.h" /* PLATFORM_DESC */ - -#define VERSION "2.20/" PLATFORM_DESC - -extern int daylight=0; -extern long timezone=0L; -smb_t smb; - -char *loadmsgtxt(smbmsg_t msg, int tails) -{ - char *buf=NULL,*lzhbuf; - ushort xlat; - int i,lzh; - long l=0,lzhlen,length; - -for(i=0;i<msg.hdr.total_dfields;i++) { - if(!(msg.dfield[i].type==TEXT_BODY - || (tails && msg.dfield[i].type==TEXT_TAIL))) - continue; - fseek(smb.sdt_fp,msg.hdr.offset+msg.dfield[i].offset - ,SEEK_SET); - fread(&xlat,2,1,smb.sdt_fp); - lzh=0; - if(xlat==XLAT_LZH) { - lzh=1; - fread(&xlat,2,1,smb.sdt_fp); } - if(xlat!=XLAT_NONE) /* no other translations supported */ - continue; - - length=msg.dfield[i].length-2; - if(lzh) { - length-=2; - if((lzhbuf=MALLOC(length))==NULL) { - printf("ERR_ALLOC lzhbuf of %lu\n",length); - return(buf); } - fread(lzhbuf,1,length,smb.sdt_fp); - lzhlen=*(long *)lzhbuf; - if((buf=REALLOC(buf,l+lzhlen+3))==NULL) { - FREE(lzhbuf); - printf("ERR_ALLOC lzhoutbuf of %l\n",l+lzhlen+1); - return(buf); } - lzh_decode(lzhbuf,length,buf+l); - FREE(lzhbuf); - l+=lzhlen; } - else { - if((buf=REALLOC(buf,l+msg.dfield[i].length+3))==NULL) { - printf("ERR_ALLOC of %lu\n",l+msg.dfield[i].length+1); - return(buf); } - l+=fread(buf+l,1,length,smb.sdt_fp); } - buf[l]=CR; - l++; - buf[l]=LF; - l++; - buf[l]=0; } -return(buf); -} - - -/***************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first CR */ -/****************************************************************************/ -void truncsp(char *str) -{ - char c; - -str[strcspn(str,"\r")]=0; -c=strlen(str); -while(c && (uchar)str[c-1]<=SP) c--; -str[c]=0; -} - -/****************************************************************************/ -/* Converts a date string in format MM/DD/YY into unix time format */ -/****************************************************************************/ -time_t dstrtounix(char *instr) -{ - char* p; - char* day; - char str[16]; - struct tm tm; - - if(!instr[0] || !strncmp(instr,"00/00/00",8)) - return(0); - - if(isdigit(instr[0]) && isdigit(instr[1]) - && isdigit(instr[3]) && isdigit(instr[4]) - && isdigit(instr[6]) && isdigit(instr[7])) - p=instr; /* correctly formatted */ - else { - p=instr; /* incorrectly formatted */ - while(*p && isdigit(*p)) p++; - if(*p==0) - return(0); - p++; - day=p; - while(*p && isdigit(*p)) p++; - if(*p==0) - return(0); - p++; - sprintf(str,"%02u/%02u/%02u" - ,atoi(instr)%100,atoi(day)%100,atoi(p)%100); - p=str; - } - - memset(&tm,0,sizeof(tm)); - tm.tm_year=((p[6]&0xf)*10)+(p[7]&0xf); - if (tm.tm_year<Y2K_2DIGIT_WINDOW) - tm.tm_year+=100; - tm.tm_mon=((p[0]&0xf)*10)+(p[1]&0xf); - tm.tm_mday=((p[3]&0xf)*10)+(p[4]&0xf); - if (tm.tm_mon) - tm.tm_mon--; /* zero-based month field */ - return(mktime(&tm)); -} - -/****************************************************************************/ -/* Updates 16-bit "rcrc" with character 'ch' */ -/****************************************************************************/ -void ucrc16(uchar ch, ushort *rcrc) { - ushort i, cy; - uchar nch=ch; - -for (i=0; i<8; i++) { - cy=*rcrc & 0x8000; - *rcrc<<=1; - if (nch & 0x80) *rcrc |= 1; - nch<<=1; - if (cy) *rcrc ^= 0x1021; } -} - -/****************************************************************************/ -/* Returns 16-crc of string (not counting terminating NULL) */ -/****************************************************************************/ -ushort crc16(char *str) -{ - int i=0; - ushort crc=0; - -ucrc16(0,&crc); -while(str[i]) - ucrc16(str[i++],&crc); -ucrc16(0,&crc); -ucrc16(0,&crc); -return(crc); -} - -time_t checktime() -{ - struct tm tm; - -memset(&tm,0,sizeof(tm)); -tm.tm_year=94; -tm.tm_mday=1; -return(mktime(&tm)^0x2D24BD00L); -} - -int main(int argc, char **argv) -{ - uchar str[128],*buf; - int i,file,sysop,number,network,terminal,desc; - ulong l,last,high; - ushort sbl; - bbs_t bbs; - smbmsg_t msg; - FILE *stream; - - fprintf(stderr,"\nSMB2SBL v%s - Updates SBL via SMB - Developed 1994-2000 " - "Rob Swindell\n\n",VERSION); - - if(putenv("TZ=UCT0")) - fprintf(stderr,"!putenv() FAILED\n"); - tzset(); - - if(checktime()) { - printf("Time problem!\n"); - return(-1); } - - if(argc<3) { - fprintf(stderr,"usage: smb2sbl <smb_file> <sbl.dab>\n\n"); - fprintf(stderr,"ex: smb2sbl /sbbs/data/subs/syncdata " - "/sbbs/xtrn/sbl/sbl.dab\n"); - return(1); } - - strcpy(smb.file,argv[1]); - strupr(smb.file); - - strcpy(str,argv[2]); - strupr(str); - if((file=sopen(str,O_RDWR|O_BINARY|O_CREAT,SH_DENYNO))==-1) { - printf("error opening %s\n",str); - return(1); } - if((stream=fdopen(file,"r+b"))==NULL) { - printf("error fdopening %s\n",str); - return(1); } - setvbuf(stream,NULL,_IOFBF,4096); - - sprintf(str,"%s.SBL",smb.file); - if((file=open(str,O_RDWR|O_BINARY|O_CREAT,S_IWRITE|S_IREAD))==-1) { - printf("error opening %s\n",str); - return(1); } - if(read(file,&last,4)!=4) - last=0; - high=last; - - sprintf(str,"%s.SHD",smb.file); - if(!fexist(str)) { - printf("%s doesn't exist\n",smb.file); - return(0); } - sprintf(str,"%s.SID",smb.file); - if(!flength(str)) { - printf("%s is empty\n",smb.file); - return(0); } - fprintf(stderr,"Opening %s\n",smb.file); - smb.retry_time=30; - if((i=smb_open(&smb))!=0) { - printf("smb_open returned %d\n",i); - return(1); } - - sbl=crc16("sbl"); - - if((i=smb_locksmbhdr(&smb))!=0) { /* Be sure noone deletes or */ - printf("Error locking %d\n",i); /* adds while we're reading */ - return(1); } - - while(!feof(smb.sid_fp)) { - if(!fread(&msg.idx,sizeof(idxrec_t),1,smb.sid_fp)) - break; - fprintf(stderr,"\r%lu ",msg.idx.number); - if(msg.idx.number<=last || msg.idx.to!=sbl) - continue; - high=msg.idx.number; - if((i=smb_lockmsghdr(&smb,&msg))!=0) { - printf("\7Error %d locking msg #%lu\n",i,msg.idx.number); - continue; } - if((i=smb_getmsghdr(&smb,&msg))!=0) { - smb_unlockmsghdr(&smb,&msg); - printf("\7Error %d reading msg #%lu\n",i,msg.idx.number); - continue; } - smb_unlockmsghdr(&smb,&msg); - if(!msg.from_net.type /* ignore local message */ - || msg.from[0]<=' ' /* corrupted? */ - || msg.subj[0]<=' ' /* corrupted */ - ) { - smb_freemsgmem(&msg); - continue; - } - - printf("\nMessage #%lu by %s on %.24s\n" - ,msg.hdr.number,msg.from,ctime(&(time_t)msg.hdr.when_written.time)); - - truncsp(msg.subj); - if(!msg.subj[0]) { - smb_freemsgmem(&msg); - continue; } - fprintf(stderr,"Searching for %s...",msg.subj); - fseek(stream,0L,SEEK_SET); - memset(&bbs,0,sizeof(bbs_t)); - while(1) { - l=ftell(stream); - if(!fread(&bbs,sizeof(bbs_t),1,stream)) { - memset(&bbs,0,sizeof(bbs_t)); - break; } - if(msg.subj[0] && !stricmp(bbs.name,msg.subj)) { - fseek(stream,l,SEEK_SET); - break; } } - fprintf(stderr,"\n"); - if(bbs.name[0] && strnicmp(bbs.user,msg.from,25)) { - printf("%s didn't create the entry for %s\n",msg.from,msg.subj); - smb_freemsgmem(&msg); - continue; } - if(!bbs.name[0]) { - fprintf(stderr,"Searching for unused record..."); - fseek(stream,0L,SEEK_SET); - while(1) { /* Find deleted record */ - l=ftell(stream); - if(!fread(&bbs,sizeof(bbs_t),1,stream)) - break; - if(!bbs.name[0]) { - fseek(stream,l,SEEK_SET); - break; } } - fprintf(stderr,"\n"); - memset(&bbs,0,sizeof(bbs_t)); - bbs.created=time(NULL); - if(!bbs.birth) - bbs.birth=bbs.created; - sprintf(bbs.user,"%-.25s",msg.from); } - sprintf(bbs.name,"%-.25s",msg.subj); - bbs.updated=time(NULL); - bbs.misc|=FROM_SMB; - sprintf(bbs.userupdated,"%-.25s",msg.from); - buf=loadmsgtxt(msg,0); - sysop=number=network=terminal=desc=0; - l=0; - while(buf[l]) { - while(buf[l] && buf[l]<=SP) /* Find first text on line */ - l++; - if(!strnicmp(buf+l,"NAME:",5)) { - l+=5; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - sprintf(bbs.name,"%-.25s",buf+l); - truncsp(bbs.name); } - if(!strnicmp(buf+l,"BIRTH:",6)) { - l+=6; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - bbs.birth=dstrtounix(buf+l); } - if(!strnicmp(buf+l,"SOFTWARE:",9)) { - l+=9; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - sprintf(bbs.software,"%-.15s",buf+l); - truncsp(bbs.software); } - if(!strnicmp(buf+l,"WEB-SITE:",9)) { - l+=9; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - sprintf(bbs.web_url,"%-.60s",buf+l); - truncsp(bbs.web_url); } - if(!strnicmp(buf+l,"E-MAIL:",7)) { - l+=7; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - sprintf(bbs.sysop_email,"%-.60s",buf+l); - truncsp(bbs.sysop_email); } - - if(!strnicmp(buf+l,"SYSOP:",6)) { - l+=6; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - sprintf(bbs.sysop[sysop],"%-.25s",buf+l); - truncsp(bbs.sysop[sysop]); - if(sysop<MAX_SYSOPS-1) - sysop++; } - if(!strnicmp(buf+l,"NUMBER:",7)) { - l+=7; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - sprintf(bbs.number[number].modem.number,"%-.28s",buf+l); - truncsp(bbs.number[number].modem.number); - if(number<MAX_NUMBERS-1) - number++; } - if(!strnicmp(buf+l,"MODEM:",6)) { - l+=6; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - i=number; - if(i) i--; - sprintf(bbs.number[i].modem.desc,"%-.15s",buf+l); - truncsp(bbs.number[i].modem.desc); } - if(!strnicmp(buf+l,"LOCATION:",9)) { - l+=9; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - i=number; - if(i) i--; - sprintf(bbs.number[i].modem.location,"%-.30s",buf+l); - truncsp(bbs.number[i].modem.location); } - if(!strnicmp(buf+l,"MINRATE:",8)) { - l+=8; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - i=number; - if(i) i--; - bbs.number[i].modem.min_rate=atoi(buf+l); } - if(!strnicmp(buf+l,"MAXRATE:",8)) { - l+=8; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - i=number; - if(i) i--; - bbs.number[i].modem.max_rate=atoi(buf+l); } - if(!strnicmp(buf+l,"NETWORK:",8)) { - l+=8; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - sprintf(bbs.network[network],"%-.15s",buf+l); - truncsp(bbs.network[network]); - if(network<MAX_NETS-1) - network++; } - if(!strnicmp(buf+l,"ADDRESS:",8)) { - l+=8; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - i=network; - if(i) i--; - sprintf(bbs.address[i],"%-.25s",buf+l); - truncsp(bbs.address[i]); } - if(!strnicmp(buf+l,"TERMINAL:",9)) { - l+=9; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - sprintf(bbs.terminal[terminal],"%-.15s",buf+l); - truncsp(bbs.terminal[terminal]); - if(terminal<MAX_TERMS-1) - terminal++; } - if(!strnicmp(buf+l,"DESC:",5)) { - l+=5; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - sprintf(bbs.desc[desc],"%-.50s",buf+l); - truncsp(bbs.desc[desc]); - if(desc<4) - desc++; } - - if(!strnicmp(buf+l,"MEGS:",5)) { - l+=5; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - bbs.megs=atol(buf+l); } - if(!strnicmp(buf+l,"MSGS:",5)) { - l+=5; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - bbs.msgs=atol(buf+l); } - if(!strnicmp(buf+l,"FILES:",6)) { - l+=6; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - bbs.files=atol(buf+l); } - if(!strnicmp(buf+l,"NODES:",6)) { - l+=6; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - bbs.nodes=atoi(buf+l); } - if(!strnicmp(buf+l,"USERS:",6)) { - l+=6; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - bbs.users=atoi(buf+l); } - if(!strnicmp(buf+l,"SUBS:",5)) { - l+=5; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - bbs.subs=atoi(buf+l); } - if(!strnicmp(buf+l,"DIRS:",5)) { - l+=5; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - bbs.dirs=atoi(buf+l); } - if(!strnicmp(buf+l,"XTRNS:",6)) { - l+=6; - while(buf[l] && buf[l]<=SP && buf[l]!=CR) - l++; - bbs.xtrns=atoi(buf+l); } - while(buf[l] && buf[l]>=SP) { /* Go to end of line */ - putchar(buf[l]); - l++; } - printf("\n"); } - // if(bbs.total_sysops<sysop) - bbs.total_sysops=sysop; - // if(bbs.total_networks<network) - bbs.total_networks=network; - // if(bbs.total_terminals<terminal) - bbs.total_terminals=terminal; - // if(bbs.total_numbers<number) - bbs.total_numbers=number; - fwrite(&bbs,sizeof(bbs_t),1,stream); - FREE(buf); - smb_freemsgmem(&msg); - } - lseek(file,0L,SEEK_SET); - write(file,&high,4); - close(file); - return(0); -} - diff --git a/xtrn/sbl/smb2sbl.dsp b/xtrn/sbl/smb2sbl.dsp deleted file mode 100644 index c1029cfe2b..0000000000 --- a/xtrn/sbl/smb2sbl.dsp +++ /dev/null @@ -1,100 +0,0 @@ -# Microsoft Developer Studio Project File - Name="smb2sbl" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Console Application" 0x0103 - -CFG=smb2sbl - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "smb2sbl.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "smb2sbl.mak" CFG="smb2sbl - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "smb2sbl - Win32 Release" (based on "Win32 (x86) Console Application") -!MESSAGE "smb2sbl - Win32 Debug" (based on "Win32 (x86) Console Application") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "smb2sbl - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "win32" -# PROP Intermediate_Dir "msvc.win32.release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD CPP /nologo /W3 /GX /O2 /I "c:\src\sbbs3" /I "..\sdk" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c -# ADD BASE RSC /l 0x409 /d "NDEBUG" -# ADD RSC /l 0x409 /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 - -!ELSEIF "$(CFG)" == "smb2sbl - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "win32" -# PROP Intermediate_Dir "msvc.win32.debug" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "c:\src\sbbs3" /I "..\sdk" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c -# ADD BASE RSC /l 0x409 /d "_DEBUG" -# ADD RSC /l 0x409 /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept - -!ENDIF - -# Begin Target - -# Name "smb2sbl - Win32 Release" -# Name "smb2sbl - Win32 Debug" -# Begin Source File - -SOURCE=C:\src\sbbs3\lzh.c -# End Source File -# Begin Source File - -SOURCE=.\smb2sbl.c -# End Source File -# Begin Source File - -SOURCE=C:\src\sbbs3\smblib.c -# End Source File -# Begin Source File - -SOURCE=C:\src\sbbs3\smbwrap.c -# End Source File -# End Target -# End Project diff --git a/xtrn/sbl/sysop.txt b/xtrn/sbl/sysop.txt deleted file mode 100644 index d3351eaf0a..0000000000 --- a/xtrn/sbl/sysop.txt +++ /dev/null @@ -1,139 +0,0 @@ -Synchronet BBS List Sysop Information -===================================== - -This list is created and distributed every Monday. It is exported from the -online BBS List database on Vertrauen and distributed via the SYNCMAIN FidoNet -filebone file echo as SBBSLIST.ZIP. - -If you are a sysop of a Synchronet BBS and would like to have your BBS included -in future versions of this list, do any one of the following: - - o Call Vertrauen at 714-529-9525 and use the Synchronet BBS List - (external program) to add your system information. - - o See \SBBS\XTRN\SBL\SBL.DOC for instructions on networking your SBL - database (v1.32+) with Vertrauen through DOVE-Net or FidoNet. - - o Post a message on the Synchronet Data echo (via DOVE-Net or the - SYNCDATA echo on FidoNet backbone) in the following format: - -To: SBL -Subj: bbs name - -Body Text: ------------------------------------------------------------------------------- -Name: bbs name (max length: 25) -Birth: MM/DD/YY (first day online) -Sysop: your name (max length: 25) -Sysop: co-sysop (up to 5 sysops) -Software: Synchronet - -Desc: description (max length: 50) -Desc: more description (up to 5 description lines) - -Nodes: number of nodes (numbers only) -Megs: megabytes of storage (numbers only) -Users: number of users (numbers only) -Subs: message areas (numbers only) -Msgs: total messages (numbers only) -Dirs: file directories (numbers only) -Files: total files online (numbers only) -Xtrns: externals (doors) (numbers only) - -Network: name of network (max length: 15) -Address: network address (max length: 25) -Network: another network (up to 10 networks) -Address: another address - -Terminal: supported terminnal (max length: 15) -Terminal: another terminal (up to 5 terminals) - -Number: phone number (max length: 12) -Location: city, state (max length: 30) -Modem: modem description (max length: 15) -MaxRate: maximum connect rate (numbers only) -MinRate: minimum connect rate (numbers only) - (up to 20 phone numbers) -------------------------------------------------------------------------------- - -The message must be posted to "SBL". If updating an existing entry, the message -must be posted by the person who created the original entry. The title -(subject) must be your BBS name. If changing the BBS name, the title must be -the original name, and "NAME:" must be specified in the body text. - -All entry fields are optional. Only one field can be specified per line. The -amount of whitespace between the colon and the data is irrelevant. All lines -that do not begin with a valid field name and colon (like these) are ignored. -Field names are not case sensitive (e.g. NAME: and Name: are equivalent). -The order of the entry fields in the body text is not significant. - -Entries must be updated at least once every 90 days or they are automatically -deleted. If you wish to delete your entry, send a message to SBL with the BBS -name in the title and include a blank "Name:" field. - -If you want to just update an entry (to keep it from being auto-deleted), you -do not have to specify any fields in the body text. But, it is suggested that -you re-post all of your fields for all updates so that any new systems that are -"watching" this sub-board can add your complete entry to their list. - -Up to 20 phone numbers can be specified. The number is limited to 12 -characters (so please use AAA-PPP-SSSS format), location is limited to 30 -characters, and modem description is limited to 15 characters. Do NOT put -38400 or 57600 for maximum connect rate (MaxRate), as such standards do not -yet exist. - -For all numeric files (noted as: "numbers only"), do not use commas, symbols, -or letters. A MaxRate of 14,400bps must be specified as "14400". - -An example of a valid BBS post body text: -------------------------------------------------------------------------------- -Name: Vertrauen -Birth: 08/01/88 -Software: Synchronet -Sysop: Digital Man -Sysop: Ille Homine Albe - -Desc: Home of Synchronet Multinode BBS Software - -Nodes: 6 -Megs: 1800 -Users: 1600 -Subs: 100 -Msgs: 45000 -Dirs: 150 -Files: 7000 -Xtrns: 10 - -Network: FidoNet -Address: 1:103/705 -Network: RIME -Address: 5115 -Network: DOVE-Net -Address: VERT - -Terminal: TTY -Terminal: ANSI -Terminal: RIP - -Number: 714-529-9525 -Location: Yorba Linda, Ca -Modem: V.32bis -MaxRate: 14400 -MinRate: 300 - -Number: 714-529-9547 -Location: Yorba Linda, Ca -Modem: V.FC -MaxRate: 28800 -MinRate: 16800 - -Number: 714-529-9721 -Location: Yorba Linda, Ca -Modem: ZyXEL -MaxRate: 19200 -MinRate: 16800 -------------------------------------------------------------------------------- - -Rob Swindell, Digital Dynamics -(Keeper of the Synchronet BBS List) - diff --git a/xtrn/scb/instruct.msg b/xtrn/scb/instruct.msg deleted file mode 100644 index 26b95fdb36..0000000000 --- a/xtrn/scb/instruct.msg +++ /dev/null @@ -1,22 +0,0 @@ -l chSynchronet Callback - - ngWhen you continue the automatic validation process, chSynchronet Callback -(SCB) ngwill ask you for your phone number. This rhMUSTng be the phone number that -your modem is connected to and it must contain all of the digits necessary for -chSCBng to call you back (including a '1' and area code if necessary). - - If you choose not to continue with the validation process, answer hNOng -to the 'hContinue with verification?ng' question that chSCBng will ask you next. - - After you have entered an hACCEPTABLEng phone number, chSCBng will display a -short message, and call you back. When your phone rings you will need to -answer it with your modem. You should see a 'hRINGng' appear on your screen -(and you may also hear your phone ring if one is connected to the same line as -your modem), when this happens, you will need to type 'hATAng' and press hENTERng. -rhDO NOTng answer the phone by voice! - - The modems will then connect, and you will be given several chances to -enter your correct password. Once you have entered the hCORRECTng password, chSCBng -will display a short message notifying you of this, validate your account, -and then disconnect. If you enter your password hINCORRECTLYng, chSCBng will rhNOTng -validate your account. diff --git a/xtrn/scb/ld_time.msg b/xtrn/scb/ld_time.msg deleted file mode 100644 index cee29fdbf3..0000000000 --- a/xtrn/scb/ld_time.msg +++ /dev/null @@ -1 +0,0 @@ -Please try again later. diff --git a/xtrn/scb/no_one.msg b/xtrn/scb/no_one.msg deleted file mode 100644 index 6d72f2a2f9..0000000000 --- a/xtrn/scb/no_one.msg +++ /dev/null @@ -1 +0,0 @@ -Phone numbers beginning with '1' are not allowed. diff --git a/xtrn/scb/no_zero.msg b/xtrn/scb/no_zero.msg deleted file mode 100644 index 2905d1f464..0000000000 --- a/xtrn/scb/no_zero.msg +++ /dev/null @@ -1,2 +0,0 @@ -Phone numbers beginning with '0' are not allowed. - \ No newline at end of file diff --git a/xtrn/scb/phonecan.msg b/xtrn/scb/phonecan.msg deleted file mode 100644 index 66ddf7f9f7..0000000000 --- a/xtrn/scb/phonecan.msg +++ /dev/null @@ -1,2 +0,0 @@ -The number you entered was found in a list of invalid or previously verified -numbers. diff --git a/xtrn/scb/refused.msg b/xtrn/scb/refused.msg deleted file mode 100644 index 9b984fd684..0000000000 --- a/xtrn/scb/refused.msg +++ /dev/null @@ -1,7 +0,0 @@ - - ngYou have chosen to refuse the callback verification process. As a -result, you may not be given access to the BBS. If you intend to gain access -to the system, you may wish to leave a note to the Sysop explaining that you -refused the callback verification, and your reasons for doing so, as well as -a number where you CAN be called at. - diff --git a/xtrn/scb/scb.cfg b/xtrn/scb/scb.cfg deleted file mode 100644 index e8672699ba..0000000000 --- a/xtrn/scb/scb.cfg +++ /dev/null @@ -1,32 +0,0 @@ -5 -NYNNNNNN -\SBBS\TEXT\PHONE.CAN -\SBBS\TEXT\PHONE.CAN - - - - - - - - - - - -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -7 -11 - diff --git a/xtrn/scb/scb.doc b/xtrn/scb/scb.doc deleted file mode 100644 index 878b3e6983..0000000000 --- a/xtrn/scb/scb.doc +++ /dev/null @@ -1,329 +0,0 @@ - Synchronet Callback v1.32 Copyright 1995 Digital Dynamics - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - Callback Verification Program for Synchronet Multinode BBS Software - - -Installation: -============ - - 1. Create a directory called "SCB" off of your Synchronet XTRN directory. - - Example: - - MD C:\SBBS\XTRN\SCB - - 2. Copy all SCB files into this new directory. - - Example: - - COPY *.* C:\SBBS\XTRN\SCB - - Note, SCB files include: - - SCB.DOC This file - ORDER.TXT Purchase order form - SCB.EXE Callback verifier external program - SCBCFG.EXE Sysop configuration program for SCB - ALLOWED.DAT List of allowable number prefixes - LDPREFIX.DAT List of same-area prefixes that are long dist - SCB.MSG The opening screen for SCB - REFUSED.MSG Verification refused - INSTRUCT.MSG Instructions - NO_ONE.MSG Long distance starting with 1 not allowed - NO_ZERO.MSG Long distance starting with 0 not allowed - NO_LD.MSG Long distance in same area code not allowed - LD_TIME.MSG Not within long distance callback time range - TOOSHORT.MSG Phone number less than minimum number of digits - TOOLONG.MSG Phone number more than maximum number of digits - PHONECAN.MSG Phone number found in trash can file - VERIFIED.MSG Displayed to users after verification - - 3. Run SCFG from your NODE1 directory. - - 4. Go to the External Programs->Online Programs menu. - - 5. Hit the <INSERT> key and enter "Synchronet Callback". - - 6. Hit <ENTER> to edit the configuration for this new program. - - 7. Set the "Start-up Directory" to "..\XTRN\SCB". - - 8. Set "Multiuser" to "Yes". - - 9. Set "Modify Uesr Data" to "Yes". - -10. Set "BBS Drop File Type" to "Synchronet XTRN.DAT" - -11. If you wish to have SCB run automatically for new users or as a logon - event for unvalidated users, set the "Execute on Event" option to the - appropriate event type. Use "Access Requirements" if you wish SCB to be - only available to unvalidated users (i.e. "LEVEL NOT 20"). - -Example SCFG screen: - - �[�][?]���������������������������������������������������ͻ - � Synchronet Callback � - ���������������������������������������������������������� - � �Name Synchronet Callback � - � �Internal Code SCB � - � �Start-up Directory ..\XTRN\SCB � - � �Command Line scb � - � �Clean-up Command Line � - � �Cost in Credits 0 � - � �Access Requirements LEVEL NOT 20 � - � �Execution Requirements � - � �Multiple Concurrent Users Yes � - � �Intercept I/O Interrupts No � - � �Swap BBS out of Memory No � - � �Modify User Data Yes � - � �Execute on Event Logon � - � �BBS Drop File Type Synchronet XTRN.DAT � - � �Place Drop File In Node Directory � - ����������������������������������������������������������ͼ - - -Configuration: -============= - - 1. Go into your SCB directory and run SCBCFG. - - Example: - - CD \SBBS\XTRN\SCB - SCBCFG - - You will see a menu similar to the following: - - �[�][?]���������������������������������������������������ͻ - � Synchronet Callback Configuration � - ���������������������������������������������������������� - � �Toggle Options... � - � �Validation Values... � - � �Allowed Prefix List... � - � �Long Distance Prefix List... � - � �Long Distance Calling Times... � - � �Phone Number Trash Can \SBBS\TEXT\PHONE.CAN � - � �Validated Phone List \SBBS\TEXT\PHONE.CAN � - � �Callback Attempts 4 � - � �Minimum Phone Length 7 � - � �Maximum Phone Length 11 � - � �BBS Area Code 714 � - � �Send Message to Sysop User #1 � - � �Registration Number UNREGISTERED � - ����������������������������������������������������������ͼ - - 2. If your Synchronet text directory is in a directory or drive other - than "\SBBS\TEXT", change the Phone Can and Validated Phone List options - to reflect the correct location of your PHONE.CAN file. - - If you want to allow duplicate validated phone numbers, change the - Validated Phone List to another path and/or filename. If left blank, - the validated phone numbers will not be written to a file at all - (other than the SCB.LOG and possibly the user data). - - The phone number list(s) use the same syntax for trashcan files as - Synchronet BBS. Appending a '~' to a line specifies that the string - cannot be located anywhere within the phone number. Appending a '^' - indicates that the phone number cannot begin with the string. - - The stock PHONE.CAN for Synchronet BBS contains the following: - - 0-^ - 1-^ - 000-~ - 111-~ - 123-^ - 222-^ - 333-^ - 444-^ - 555-~ - 666-^ - 777-^ - 888-^ - 999-^ - 900-^ - 411-~ - 911-~ - 976-~ - 411^ - 911^ - - Since SCB does not allow non-numeric characters in phone numbers, all - entries with the dash (-) character above are ignored. - - 3. SCB uses the dial string specified in the modem configuration in SCFG - for each node for dialing the remote user's modem. The default dial - string is "ATDT". - - 4. Use the "Toggle Options" sub-menu to configure your preferences. - - �[�][?]����������������������������������������������ͻ - � Toggle Options � - ����������������������������������������������������� - � �Validate if Unable to Verify No � - � �Put Result in User Note Yes � - � �Long Distance if not an Allowed Prefix No � - � �Allow Long Distance (Starting with 0) No � - � �Allow Long Distance (Starting with 1) Yes � - � �Allow Long Distance (Same Area Code) Yes � - � �U.S. Style Phone Format (AAA-PPP-SSSS) Yes � - � �Stay Connected After Callback No � - �����������������������������������������������������ͼ - - If the "Validate if Unable to Verify" option is set to "Yes", users will - always be validated. Even if their number was not verified. - - If the "Put Result in User Note" option is set to "Yes", the result of - the verification attempt will be placed in the user's note field - (in the Synchronet BBS user database). - - If the "Long Distance if not an Allowed Prefix" option is set to "Yes", - then all numbers will be considered long distance unless the prefix - is specifically listed in the "Allowed Prefix List" off of the main - menu. If this option is set to "Yes", the "Long Distance Prefix List" - is not used. - - If the "Allow Long Distance (starting with 0)" option is set to "Yes", - then numbers starting with '0' will be allowed. This option does not - effect numbers included in the "Allowed Prefix List". - - If the "Allow Long Distance (starting with 1)" option is set to "Yes", - then numbers starting with '1' will be allowed. This option does not - effect numbers included in the "Allowed Prefix List". - - If the "Allow Long Distance (same area code)" option is set to "Yes", - then numbers that begin with a prefix located in the "Long Distance - Prefix List" will not be allowed. This option does not effect numbers - included in the "Allowed Prefix List". - - If the "U.S. Style Phone Format" option is set to "Yes", then SCB will - assume that phone numbers are in the AAA-PPP-SSSS format, and will - automatically strip the BBS area code from the prefix if the user - entered a number in the same area code as the BBS and included the - area code (both AAA and 1AAA will be stripped). - - The "Stay Connected After Callback" option can be set to "Yes", "No", - or "Local Only". SCB will not disconnect after calling the user back - if this option is set to "Yes". If set to "Local Only", SCB will only - remain connected if the number verfied does not begin with a '1' or '0'. - - 5. Use the "Validation Values" sub-menu to configure how you want validated - users' accounts to be modified. - - �[�][?]�������������������������������������������������������ͻ - � Validation Values � - �������������������������������������������������������������� - � �Security Level 23 � - � �Flag Set 1 CDLN � - � �Flag Set 2 � - � �Flag Set 3 � - � �Flag Set 4 -V � - � �Exemptions � - � �Restrictions -CX � - � �Days to Extend Expiration 0 � - � �Credits to Add � - � �Minutes to Add � - ��������������������������������������������������������������ͼ - - Note: The DEMO version will only set new security level and add credits. - The other validation options are only available in the registered - version. - - 6. Use the "Allowed Prefix List" sub-menu to set which prefixes will NOT be - affected by long distance restrictions (such as long distance - calling times, and numbers starting with 0 or 1). This option is useful - for specifying local numbers in other area codes. For example, in the - 714 area code, 529 prefix, the following non-714 prefixes are local (*): - - 1310690 1310691 1310694 1310697 1310902 1310905 1310943 1310947 - 1818330 1818333 1818336 1818369 1818810 1818854 1818855 1818912 - 1818913 1818937 1818961 1818964 1818965 1818968 1909396 1909468 - 1909594 1909595 1909598 1909860 1909861 1909869 - - * Multiple entries per line to conserve documentation space - - If the "Long Distance if not an Allowed Prefix" toggle option is set to - "Yes", then any number that is NOT included in this list will be - considered long distance. - - 7. Use the "Long Distance Prefix List" sub-menu to set which SAME-AREA - prefixes will be considered long distance. If the "Long Distance if not - an Allowed Prefix" toggle option is set to "Yes", then this list is not - used. For example, in the 714 area code, 529 prefix, the following - 714 prefixes are long distance (*): - - 241 258 259 265 285 418 432 433 434 435 436 437 438 479 480 - 505 513 531 540 541 542 543 544 545 546 547 549 550 554 556 - 557 558 560 564 565 566 567 568 569 571 573 641 647 648 662 - 664 665 667 668 669 691 708 730 731 751 754 755 775 832 834 - 835 836 838 839 850 953 954 957 966 967 972 973 977 979 - - * Multiple entries per line to conserve documentation space - - 8. Use the "Long Distance Calling Times" sub-menu to set the times on each day - when SCB is allowed to place long distance calls. All times are entered - in 24-hour format and ranges crossing midnight (e.g. 18:00 to 09:00) are - valid. Numbers included in the "Allowed Prefix List" will not be limited - to these calling times. - - 9. If you are a registered owner of SCB, be sure to enter your registration - number on the main menu. - -10. Hit ESC from the main SCB configuration menu and select "Yes" to save - the configuration file. - - -Notes: -===== - -All SCB activity is logged to the file SCB.LOG in the SCB directory in -the format: - - Node 7 : Mon Sep 27 16:44:31 1993 - User Name : Digital Man - Voice Number : 714-529-6328 - Modem Number : 5295313 - Result : Verified - -Results Description -------- ----------- -Hung up User hung up before or during validation process -Refused User refused validation -Long Dist User is a long distance call and long distance is disallowed -Invalid # User entered a number that is in the trashcan file, less than - minimum length, or begins with a disallowed number (0 or 1) -No Init Modem could not be initialized -No Connect Modem could not connect to user's modem (possibly wrong #) -Verified User was called, modem connected, and password verified -Bad Pass User was called, modem connected, and incorrect password - - -Customizations: -============== - -The following files can be modified (optionally using Ctrl-A codes for color): - -SCB.MSG The opening screen for SCB -REFUSED.MSG Verification refused -INSTRUCT.MSG Instructions -NO_ONE.MSG Long distance numbers starting with 1 not allowed -NO_ZERO.MSG Long distance numbers starting with 0 not allowed -LD_TIME.MSG Not within allowed long distance callback time range -TOOSHORT.MSG Phone number is less than configured minimum number of digits -PHONECAN.MSG Phone number found in trashcan file -VERIFIED.MSG Displayed to users after verification - - -Registration: -============ - -If you wish to order a registered copy of SCB at the same time as Synchronet, -use the Synchronet ORDER.TXT file (in the SBBS\DOCS directory). - -If registering SCB after already purchasing a copy of Synchronet, call -Digital Dynamics voice at 714-529-6328, Support BBS at 714-529-9525 (and use -Domain Shopper), or complete the ORDER.TXT file in the SCB directory and mail -or fax it to Digital Dynamics. - -/* End of SCB.DOC */ diff --git a/xtrn/scb/scb.msg b/xtrn/scb/scb.msg deleted file mode 100644 index 617338c75d..0000000000 --- a/xtrn/scb/scb.msg +++ /dev/null @@ -1,8 +0,0 @@ -ng Synchronet Callback can be used to verify your modem phone number. -If your modem phone number is verified, your access on the BBS may be -immediately upgraded or the sysop will be notified of the verification and your -access may be upgraded later. - - Some BBSs may not allow long distance verification calls. If you are -not a local call from this BBS and it doesn't allow long distance calls, -you will be notified of this when you start the verification procedure. diff --git a/xtrn/scb/toolong.msg b/xtrn/scb/toolong.msg deleted file mode 100644 index 079411abde..0000000000 --- a/xtrn/scb/toolong.msg +++ /dev/null @@ -1,2 +0,0 @@ -Your phone number is too long to be valid. - diff --git a/xtrn/scb/tooshort.msg b/xtrn/scb/tooshort.msg deleted file mode 100644 index e31e216680..0000000000 --- a/xtrn/scb/tooshort.msg +++ /dev/null @@ -1 +0,0 @@ -Your phone number is too short to be valid. diff --git a/xtrn/scb/verified.msg b/xtrn/scb/verified.msg deleted file mode 100644 index ae5b1c8f29..0000000000 --- a/xtrn/scb/verified.msg +++ /dev/null @@ -1,5 +0,0 @@ - -ghYour number has been verified and your access upgraded. Please call back -to use your upgraded security! - -p \ No newline at end of file diff --git a/xtrn/scb/whats.new b/xtrn/scb/whats.new deleted file mode 100644 index 2945099c7f..0000000000 --- a/xtrn/scb/whats.new +++ /dev/null @@ -1,21 +0,0 @@ -What's new in SCB v1.20 -======================= - - o Supports new communications routines, supporting UART, FOSSIL, - BIOS (PC BIOS), EBIOS (PS/2 BIOS), and DigiBoard support. - -If installing over existing SCB install, just update SCB*.EXE and SCB.DOC. - - -What's new in SCB v1.12 -======================= - - o Updated and more comprehensive documentation. - o New "Long Distance if not an Allowed Prefix" toggle option. - o If the user's expiration date is already set to the future, it will be - extended by the number of days in SCBCFG. Previously, expiration dates - would always be set to the current date plus the number of days set in - SCBCFG. - -If installing over existing SCB install, just update SCB*.EXE and SCB.DOC. - diff --git a/xtrn/sdk/xsdk.c b/xtrn/sdk/xsdk.c deleted file mode 100644 index b61b049df5..0000000000 --- a/xtrn/sdk/xsdk.c +++ /dev/null @@ -1,2677 +0,0 @@ -/* xsdk.c */ - -/* Synchronet External Program Software Development Kit */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout xtrn * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/***************************** Revision History *****************************\ - - Initial version for use with Synchronet v1a r6 - 1.0� - Added bgotoxy() macro - Added mnehigh and mnelow vars for control of the mnemonic colors - Added sys_nodes and node_num variables to xtrn_sdk.c - Added MAX_NODES to xtrn_sdk.h - Added printfile() function to xtrn_sdk.c - Added rputs() (Raw put string) - Added getstr() (Get string) - Added redrwstr() (Redraw string) - Added stripattr() (String attributes) - Added sys_op var and the reading from the xtrn.dat - Removed user_min and the reading from the xtrn.dat - Changed read_xtrn_dat() to initdata() - Added ctrl-break handler to xtrn_sdk - Changed xtrn.dat format (again), adding system operator, - guru name, user ml, tl, birthdate and sex. - Added username() function - Renamed xtrn_sdk.* to xsdk.* and xtrnvars.c to xsdkvars.c - and xtrndefs.h to xsdkdefs.h - Added fexist() function - 1.0 - Ctrl-p is now switched into ctrl-^ by SBBS - Fixed relative data_dir bug in username() - 1.01 - Added flength() function and lowered disk activity - Lowered MAX_CARDS from 20 to 10 and made the re-shuffling happen - less often. - 1.02 - Fixed bug in attr() for monochrome users - 1.03 - Made warning and timeout times variables (sec_warn and sec_timeout) - Added SYSOP macro - Made it so sysop won't get timeout - Added user's phone number to XTRN.DAT - Added modem and com port information to XTRN.DAT - Added ahtoul function - Changed getstr commands Ctrl-L to Ctrl-R and Ctrl-P to Ctrl-\ - 1.04 - Added intercommunication between the external programs and users - on the BBS or other external programs written with XSDK. - Added rprintf() function - Made many changes to getstr() function - 2.00 - Added DESQview awareness - Removed difftime() function calls completely - Added ungetkey() function - Added memory address of last modem status register for com routines - so we can track DCD incase user hangs up. - Added checkline function that does the checking of DCD. - Added new bug-free fdelay() routine to replace TC's delay() that - crashes multi-taskers such as DESQview and Windows - 2.01 - Added external program name access for user listings. - Added last node to send message to remembering and defaulting. - Added MALLOC and FREE macros for memory model non-specific memory - allocation. - 2.02 - Added INTRSBBS.DAT support for Synchronet shrinking to run programs - written with XSDK (new with v1b rev 01). - Added user's main flags, transfer flags, exemptions, and - restrictions to XTRN.DAT - Added support for the NODE_PAGE action (paging for private chat) - when listing nodes (printnodedat()). - Added user expiration date support to XTRN.DAT - 2.03 - Fixed bug with com_base variable being messed up. - New messaging system supported (for v1b r2 and higher) - (putnmsg and getnmsg functions). - 2.10 - Added support for file retrieving node status display. - NOPEN collision notice only appears after 25 retries. - 2.11 - Changed getnmsg function to not use IXB files. - Changed getsmsg function to not re-open for truncate. - Added user address, location, and zip/postal code suppport. - Added support for local arrow keys, home, end, ins, and del. - Remote keys ^] (back one space) and ^BkSpc (del) supported now. - Added support for high-bit Ctrl-A codes (for cursor positioning) - Removed file locking check - slowed down initialization sometimes. - Change user_ml to user_level, removed user_tl, changed user_mf to - user_flags1, changed user_tf to user_flags2, and added - user_flags3 and user_flags4. - cls() now updates lncntr like it should have. - Added ctrl-break handler so that users can abort printfile() - If a ctrl-c is received by inkey, the aborted flag is set. - Removed fdelay from XSDK and replaced with mswait for better - multitasker performance - 2.20 - New mswait that support OS2/Windows, DOS Idle, and non-DV modes. - XTRN.DAT passes mode of mswait configured in node setup. - 2.21 - Added user's real name/company name (user_realname) to XTRN.DAT - 2.22 - Added usernumber() function to get user number from a user name. - 2.23 - DTE rate (com_rate) now a ulong (instead of uint) to allow 115.2K - 2.24 - New K_AUTODEL mode for getstr() function, to be used in conjunction - with the K_EDIT mode. Makes overwriting existing strings very - easy for users. - Supports intelligent timeslice APIs while waiting for a key with - getkey() and with getstr() if K_LOWPRIO mode is used. - Hitting Ctrl-C sets the 'aborted' variable to 1. - Time zone and daylight savings automatically initialized to 0. - Modem strings up to 63 chars in XTRN.DAT now supported. - Fixed 10 character zip code bug in XSDKVARS.C. - Node directories (node_dir) up to 127 chars now supported. - nopen() can now open DENYNONE if passed access O_DENYNONE. - 2.30 - Added support for the following Ctrl-A codes: ;,.<>[]A - Changed definitions of TAB, SP, etc. to hex - 2.31 - C restriction disallows users to use Ctrl-P. - T exemption disables "Time's up" message. - Added center() function for outputting centered lines of text. - Added auto-pause to cls() and outchar() functions when clearing - the screen and lncntr is greater than 1 - Changed bstrlen() to not count control characters (CR,LF,TAB,etc) - XSDK is now Watcom C++ compatible (although SBJ.C and SBL.C aren't) - XSDK.H is now *.CPP compatible - Added support for Ctrl-AQ (reset pause) and Ctrl-AZ (premature EOF) - 2.32 - Change bstrlen(char *str) to bstrlen(uchar *str) - Fixed bug in getstr() when word-wrapping a line that contains - ctrl-a codes and the input string did not begin at column 1. - Added user_dce variable (initialized by initdata from XTRN.DAT) - Fixed printnodedat() to not show Waiting for call (M) - Fixed typo in C restriction Ctrl-P message. - Moved call of checkline() in getkey() to immediately abort when - user hangs-up, even when keys are in the input buffer. - Added setmode() call to initdata() to set stderr to binary mode - Changed putchar() to write() in outchar() to elminate LF to CRLF - expansion - 2.33 - Improved cls() routine for auto-pause feature. - Added get_term() automatic RIP and WIP terminal detection function. - 2.34 - Added exec_dir, text_dir, and temp_dir variables to XTRN.DAT - format and initdata() function. - Added _fullpath() calls to initdata() to fix dir paths. - Added sys_id (QWK ID) to XTRN.DAT format and initdat() func. - Added node_misc to XTRN.DAT format and initdata() function. - If NM_LOWPRIO (low priority string input) is toggled on in - node_misc, then time-slices are always given up during input. - XSDK is now Symantec C++ compatible - 2.40 - node_misc was being read as a decimal number (it's stored in - the XTRN.DAT as hex), thus causing time-slice APIs to not - function correctly. - 2.41 - Ctrl-T is now intercepted by inkey() and displays the time the - program was launched, the current time, time used, and time - left (similar to SBBS). - Users are now warned of their last 5 minutes available (like SBBS). - 2.42 - Added Microsoft/Borland 32-bit compiler compatibility - Added socket (Telnet) compatibility - Changed Ctrl-Minus (Insert key) to Ctrl-V - Changed Ctrl-V (Center text key) to Ctrl-L - Added support for telnet nodes (connection=0xffff) - 3.00 - Fixed problem with clear screen (form feed) in node messages. - checkline() now exits when the remote user disconnects on 32-bit - programs. Use atexit() to add cleanup code. - 3.01 - Eliminated warnings in ctrl_a() when compiled with VC++ 6.0. - Added Linux/GCC support (xsdkwrap.c, xsdkwrap.h, and xsdkinet.h) - 3.10 - Added COMPILER_DESC and PLATFORM_DESC macros to xsdkwrap.h - Added support for no local console (XSDK_MODE_NOCONSOLE) - - This is now the default mode when building 32-bit programs - Eliminated use of ungetch() in favor of ungetkey() - more secure - 3.11 - -\****************************************************************************/ - -#include "xsdk.h" - -#ifdef _WINSOCKAPI_ -WSADATA WSAData; // WinSock data -#endif - -char *xsdk_ver="3.11"; -ulong xsdk_mode=XSDK_MODE_NOCONSOLE; - -/****************************************************************************/ -/* This allows users to abort the listing of text by using Ctrl-C */ -/****************************************************************************/ -int cbreakh(void) /* ctrl-break handler */ -{ - aborted=1; - return(1); /* 1 to continue, 0 to abort */ -} - -/****************************************************************************/ -/* Performs printf() using bbs bputs function */ -/****************************************************************************/ -int bprintf(char *fmt, ...) -{ - va_list argptr; - char sbuf[1024]; - int chcount; - - va_start(argptr,fmt); - chcount=vsprintf(sbuf,fmt,argptr); - va_end(argptr); - bputs(sbuf); - return(chcount); -} - -/****************************************************************************/ -/* Performs printf() using bbs rputs function */ -/****************************************************************************/ -int rprintf(char *fmt, ...) -{ - va_list argptr; - char sbuf[1024]; - int chcount; - - va_start(argptr,fmt); - chcount=vsprintf(sbuf,fmt,argptr); - va_end(argptr); - rputs(sbuf); - return(chcount); -} - -/****************************************************************************/ -/* Outputs a NULL terminated string locally and remotely (if applicable) */ -/****************************************************************************/ -void bputs(char *str) -{ - ulong l=0; - - while(str[l] && !aborted) { - if(str[l]==1) { /* ctrl-a */ - ctrl_a(str[++l]); /* skip the ctrl-a */ - if(str[l]=='Z') /* Ctrl-AZ marks premature end of file */ - break; - l++; } /* skip the attribute code */ - else - outchar(str[l++]); } -} - -/****************************************************************************/ -/* Outputs a NULL terminated string locally and remotely (if applicable) */ -/* Does not process ctrl-a codes (raw output) */ -/* Max length of str is 64 kbytes */ -/****************************************************************************/ -void rputs(char *str) -{ - ulong l=0; - - while(str[l]) - outchar(str[l++]); -} - -/****************************************************************************/ -/* Returns the number of characters in 'str' not counting ctrl-ax codes */ -/* or the null terminator */ -/****************************************************************************/ -int bstrlen(uchar *str) -{ - int i=0; - - while(*str) { - if(*str<SP) { /* ctrl char */ - if(*str==1) /* ctrl-A */ - str++; - else if(*str!=CR && *str!=LF && *str!=FF) - i++; } - else - i++; - if(!(*str)) - break; - str++; } - return(i); -} - -/****************************************************************************/ -/* Outputs the string 'str' centered for an 80 column display */ -/* Automatically appends "\r\n" to output */ -/****************************************************************************/ -void center(char *str) -{ - int i,j; - - j=bstrlen(str); - for(i=0;i<(80-j)/2;i++) - outchar(SP); - bputs(str); -} - -#ifndef __16BIT__ - -char outbuf[5000]; -ulong outbufbot=0; -ulong outbuftop=0; -sem_t output_sem; - -void output_thread(void* arg) -{ - int i,len; - char str[256]; - - sem_init(&output_sem,0,0); - - while(client_socket!=INVALID_SOCKET) { - if(outbufbot==outbuftop) { - sem_init(&output_sem,0,0); - sem_wait(&output_sem); - continue; - } - - if(outbuftop>outbufbot) - len=outbuftop-outbufbot; - else - len=sizeof(outbuf)-outbufbot; - i=send(client_socket,outbuf+outbufbot,len,0); - if(i!=len) { - sprintf(str,"!XSDK Error %d (%d) sending on socket %d\n" - ,i,ERROR_VALUE,client_socket); -#ifdef _WIN32 - OutputDebugString(str); -#else - fprintf(stderr,"%s",str); -#endif - } - outbufbot+=len; - if(outbufbot>=sizeof(outbuf)) - outbufbot=0; - } -} -#endif - -/****************************************************************************/ -/* Outputs one character to the screen. Handles, pause, saving and */ -/* restoring lines, etc. */ -/****************************************************************************/ -void outchar(char ch) -{ - -#ifndef __16BIT__ - if(client_socket!=INVALID_SOCKET) { - ulong top=outbuftop+1; - - if(top==sizeof(outbuf)) - top=0; - if(top!=outbufbot) { - outbuf[outbuftop++]=ch; - if(outbuftop==sizeof(outbuf)) - outbuftop=0; - sem_post(&output_sem); - } - } -#endif - - if(con_fp!=NULL) - write(fileno(con_fp),&ch,1); - - if(ch==LF) { - lncntr++; - lbuflen=0; - tos=0; - } - else if(ch==FF) { - if(lncntr>1) { - lncntr=0; - CRLF; - bpause(); - } - lncntr=0; - lbuflen=0; - tos=1; - } - else if(ch==BS) { - if(lbuflen) - lbuflen--; - } - else { - if(!lbuflen) - latr=curatr; - if(lbuflen>=LINE_BUFSIZE) lbuflen=0; - lbuf[lbuflen++]=ch; - } - if(lncntr==user_rows-1) { - lncntr=0; - bpause(); - } -} - -/****************************************************************************/ -/* Prints PAUSE message and waits for a key stoke */ -/****************************************************************************/ -void bpause(void) -{ - char ch; - uchar tempattrs=curatr,*msg="\1_\1r\1h[Hit a key] "; - int i,j; - - lncntr=0; - bputs(msg); - j=bstrlen(msg); - ch=getkey(K_UPPER); - for(i=0;i<j;i++) - bputs("\b \b"); - attr(tempattrs); - if(ch=='N' || ch=='Q') - aborted=1; -} - -/****************************************************************************/ -/* Prompts user for Y or N (yes or no) and CR is interpreted as a Y */ -/* Returns 1 for Y or 0 for N */ -/* Called from quite a few places */ -/****************************************************************************/ -char yesno(char *str) -{ - char ch; - - bprintf("\1_\1b\1h%s (Y/n) ? \1w",str); - while(1) { - ch=getkey(K_UPPER); - if(ch=='Y' || ch==CR) { - bputs("Yes\r\n"); - return(1); } - if(ch=='N' || aborted) { - bputs("No\r\n"); - return(0); - } - } -} - -/****************************************************************************/ -/* Prompts user for N or Y (no or yes) and CR is interpreted as a N */ -/* Returns 1 for N or 0 for Y */ -/* Called from quite a few places */ -/****************************************************************************/ -char noyes(char *str) -{ - char ch; - - bprintf("\1_\1b\1h%s (y/N) ? \1w",str); - while(1) { - ch=getkey(K_UPPER); - if(ch=='N' || ch==CR || aborted) { - bputs("No\r\n"); - return(1); } - if(ch=='Y') { - bputs("Yes\r\n"); - return(0); - } - } -} - -/****************************************************************************/ -/* Outputs a string highlighting characters preceeded by a tilde with the */ -/* color specified in mnehigh and the rest of the line is in color mnelow. */ -/* If the user doesn't have ANSI, it puts the character following the tilde */ -/* in parenthesis. */ -/****************************************************************************/ -void mnemonics(char *str) -{ - long l; - - attr(mnelow); - l=0L; - while(str[l]) { - if(str[l]=='~' && str[l+1]) { - if(!(user_misc&ANSI)) - outchar('('); - l++; - attr(mnehigh); - outchar(str[l]); - l++; - if(!(user_misc&ANSI)) - outchar(')'); - attr(mnelow); - } - else - outchar(str[l++]); - } - attr(LIGHTGRAY); -} - -/****************************************************************************/ -/* If a key has been pressed, the ASCII code is returned. If not, 0 is */ -/* returned. Ctrl-P and Ctrl-U are intercepted here. */ -/****************************************************************************/ -char inkey(long mode) -{ - static in_ctrl_p; - uchar ch=0,hour,min,sec; - long tleft; - int i=0; - time_t now; - -#ifndef __16BIT__ - char str[256]; - ulong cnt=0; - - if(client_socket!=INVALID_SOCKET) { - i=ioctlsocket(client_socket,FIONREAD,&cnt); - if(i) { - sprintf(str,"!XSDK Error %d (%d) checking readcnt on socket %d\n" - ,i,ERROR_VALUE,client_socket); -#ifdef _WIN32 - OutputDebugString(str); -#else - fprintf(stderr,"%s",str); -#endif - } - } - - if(i==0 && cnt) - recv(client_socket,&ch,1,0); - else -#endif - - if(keybufbot!=keybuftop) { - ch=keybuf[keybufbot++]; - if(keybufbot==KEY_BUFSIZE) - keybufbot=0; } - else if(!(xsdk_mode&XSDK_MODE_NOCONSOLE) && kbhit()) { - i=getch(); -#ifdef __unix__ - if(i==LF) i=CR; /* Enter key returns Ctrl-J on Unix! (ohmygod) */ -#endif - if(i==0 || i==0xE0) { /* Local Alt or Function key hit */ - i=getch(); - switch(i) { - case 0x47: /* Home - Same as Ctrl-B */ - return(2); /* ctrl-b beginning of line */ - case 0x4b: /* Left Arrow - same as ctrl-] */ - return(0x1d); - case 0x4d: /* Right Arrow - same as ctrl-f */ - return(6); - case 0x48: /* Up arrow - same as ctrl-^ */ - return(0x1e); - case 0x50: /* Down arrow - same as CR */ - return(CR); - case 0x4f: /* End - same as Ctrl-E */ - return(5); /* ctrl-e - end of line */ - case 0x52: /* Insert */ - return(0x1f); /* ctrl-minus - insert mode */ - case 0x53: /* Delete */ - return(0x7f); /* ctrl-bkspc - del cur char */ - } - return(0); } - ch=i; - } - - if(ch==0x10 || ch==0x1e) { /* Ctrl-P or Ctrl-^ */ - if(in_ctrl_p || !ctrl_dir[0]) /* keep from being recursive */ - return(0); - in_ctrl_p=1; - SAVELINE; - CRLF; - nodemsg(); - CRLF; - RESTORELINE; - lncntr=0; - in_ctrl_p=0; - return(0); } - - if(ch==20) { /* Ctrl-T Time left online */ - SAVELINE; - attr(LIGHTGRAY); - now=time(NULL); - checktimeleft(); - CRLF; - bprintf("\r\nStart : %.24s",ctime(&starttime)); - bprintf("\r\nNow : %.24s",ctime(&now)); - i=now-starttime; - hour=(i/60)/60; - min=(i/60)-(hour*60); - sec=i-((min+(hour*60))*60); - bprintf("\r\nTime Used : %02u:%02u:%02u",hour,min,sec); - tleft=timeleft-(now-starttime); - hour=(tleft/60)/60; - min=(tleft/60)-(hour*60); - sec=tleft-((min+(hour*60))*60); - bprintf("\r\nTime Left : %02u:%02u:%02u\r\n\r\n",hour,min,sec); - RESTORELINE; - lncntr=0; - return(0); } - - if(ch==21) { /* Ctrl-U Users online */ - if(!ctrl_dir[0]) - return(0); - SAVELINE; - CRLF; - whos_online(1); - CRLF; - RESTORELINE; - lncntr=0; - return(0); } - -#ifndef __16BIT__ - if(ch==LF) - ch=0; /* Ignore LF of Telnet CR/LF sequence */ -#endif - - if(ch==3) - aborted=1; - else if(aborted) - ch=3; - - if(!ch && (!(mode&K_GETSTR) || mode&K_LOWPRIO|| node_misc&NM_LOWPRIO)) - mswait(1); - return(ch); -} - -/****************************************************************************/ -/* Waits for remote or local user to hit a key. Inactivity timer is checked */ -/* and hangs up if inactive for 4 minutes. Returns key hit, or uppercase of */ -/* key hit if mode&K_UPPER or key out of KEY BUFFER. Does not print key. */ -/****************************************************************************/ -char getkey(long mode) -{ - char ch,warn=0; - long tleft; - time_t timeout,now; - - aborted=lncntr=0; - timeout=time(NULL); - do { - checkline(); - ch=inkey(mode); - now=time(NULL); - if(ch) { - if(mode&K_NUMBER && isprint(ch) && !isdigit(ch)) - continue; - if(mode&K_ALPHA && isprint(ch) && !isalpha(ch)) - continue; - if(ch==LF) continue; - if(mode&K_UPPER) - return(toupper(ch)); - return(ch); - } - checktimeleft(); - - tleft=timeleft-(now-starttime); - if((tleft/60)<(5-timeleft_warn)) { /* Running out of time warning */ - timeleft_warn=5-(tleft/60); - SAVELINE; - bprintf("\1n\1h\r\n\7\r\nYou only have \1r\1i%u\1n\1h minute%s " - "left.\r\n\r\n" - ,((ushort)tleft/60)+1,(tleft/60) ? "s" : ""); - RESTORELINE; - } - - if(now-timeout>=(time_t)sec_warn && !warn) /* Inactivity warning */ - for(warn=0;warn<5;warn++) - outchar(7); - } while(now-timeout<(time_t)sec_timeout); - - bputs("\r\nInactive too long.\r\n"); - exit(0); - return(0); /* never gets here, but makes compiler happy */ -} - -/****************************************************************************/ -/* If remote user, checks DCD to see if user has hung up or not. */ -/****************************************************************************/ -void checkline(void) -{ -#ifdef __16BIT__ - if(com_port && !((*msr)&DCD)) exit(0); -#else - char str[256]; - char ch; - int i; - fd_set socket_set; - struct timeval timeout; - - if(client_socket!=INVALID_SOCKET) { - FD_ZERO(&socket_set); - FD_SET(client_socket,&socket_set); - timeout.tv_sec=0; - timeout.tv_usec=100; - - if((i=select(client_socket+1,&socket_set,NULL,NULL,&timeout))>0) { - if((i=recv(client_socket,&ch,1,MSG_PEEK))!=1) { - sprintf(str,"!XSDK Error %d (%d) checking state of socket %d\n" - ,i,ERROR_VALUE,client_socket); - #ifdef _WIN32 - OutputDebugString(str); - #else - fprintf(stderr,"%s",str); - fflush(stderr); - #endif - exit(0); - } - } - } -#endif -} - -/****************************************************************************/ -/* Waits for remote or local user to hit a key that is contained inside str.*/ -/* 'str' should contain uppercase characters only. When a valid key is hit, */ -/* it is echoed (upper case) and is the return value. */ -/* If max is non-zero and a number is hit that is not in str, it will be */ -/* returned with the high bit set. If the return of this function has the */ -/* high bit set (&0x8000), just flip the bit (^0x8000) to get the number. */ -/****************************************************************************/ -int getkeys(char *instr,int max) -{ - char str[256]; - uchar ch,n=0; - int i=0; - - sprintf(str,"%.*s",sizeof(str)-1,instr); - strupr(str); - while(!aborted) { - ch=getkey(K_UPPER); - if(max && ch>0x7f) /* extended ascii chars are digits to isdigit() */ - continue; - if(ch && !n && (strchr(str,ch))) { /* return character if in string */ - outchar(ch); - attr(LIGHTGRAY); - CRLF; - return(ch); - } - if(ch==CR && max) { /* return 0 if no number */ - attr(LIGHTGRAY); - CRLF; - if(n) - return(i|0x8000); /* return number plus high bit */ - return(0); - } - if(ch==BS && n) { - bputs("\b \b"); - i/=10; - n--; - } - else if(max && isdigit(ch) && (i*10)+(ch&0xf)<=max && (ch!='0' || n)) { - i*=10; - n++; - i+=ch&0xf; - outchar(ch); - if(i*10>max) { - attr(LIGHTGRAY); - CRLF; - return(i|0x8000); - } - } - } - return(0); -} - -/****************************************************************************/ -/* Hot keyed number input routine. */ -/****************************************************************************/ -int getnum(int max) -{ - uchar ch,n=0; - int i=0; - - while(1) { - ch=getkey(K_UPPER); - if(ch>0x7f) - continue; - if(ch=='Q') { - outchar('Q'); - CRLF; - break; - } - else if(ch==3) { /* ctrl-c */ - CRLF; - break; - } - else if(ch==CR) { - CRLF; - return(i); - } - else if(ch==BS && n) { - bputs("\b \b"); - i/=10; - n--; - } - else if(isdigit(ch) && (i*10)+(ch&0xf)<=max && (ch!='0' || n)) { - i*=10; - n++; - i+=ch&0xf; - outchar(ch); - if(i*10>max) { - CRLF; - return(i); - } - } - } - return(-1); -} - -/****************************************************************************/ -/* Waits for remote or local user to input a CR terminated string. 'length' */ -/* is the maximum number of characters that getstr will allow the user to */ -/* input into the string. 'mode' specifies upper case characters are echoed */ -/* or wordwrap or if in message input (^A sequences allowed). ^W backspaces */ -/* a word, ^X backspaces a line, ^Gs, BSs, TABs are processed, LFs ignored. */ -/* ^N non-destructive BS, ^V center line. Valid keys are echoed. */ -/****************************************************************************/ -int getstr(char *strout, size_t maxlen, long mode) -{ - size_t i,l,x,z; /* i=current position, l=length, j=printed chars */ - /* x&z=misc */ - uchar ch,str1[256],str2[256],ins=0,atr; - - if(mode&K_LINE && user_misc&ANSI) { - attr(LIGHTGRAY|HIGH|(BLUE<<4)); /* white on blue */ - for(i=0;i<maxlen;i++) - outchar(SP); - bprintf("\x1b[%dD",maxlen); - } - i=l=0; /* i=total number of chars, j=number of printable chars */ - if(wordwrap[0]) { - strcpy(str1,wordwrap); - wordwrap[0]=0; - } - else str1[0]=0; - if(mode&K_EDIT) - strcat(str1,strout); - if(strlen(str1)>maxlen) - str1[maxlen]=0; - atr=curatr; - if(mode&K_AUTODEL && str1[0]) - attr(BLUE|(LIGHTGRAY<<4)); - rputs(str1); - if(mode&K_EDIT && !(mode&(K_LINE|K_AUTODEL)) && user_misc&ANSI) - bputs("\x1b[K"); /* destroy to eol */ - i=l=strlen(str1); - - if(mode&K_AUTODEL && str1[0]) { - ch=getkey(mode); - attr(atr); - if(isprint(ch) || ch==0x7f) { - for(i=0;i<l;i++) - bputs("\b \b"); - i=l=0; - } - else { - for(i=0;i<l;i++) - outchar(BS); - rputs(str1); - i=l; - } - if(ch!=SP && ch!=TAB) - ungetkey(ch); - } - - while((ch=getkey(mode|K_GETSTR))!=CR && !aborted) { - switch(ch) { - case 1: /* Ctrl-A for ANSI */ - if(!(mode&K_MSG) || i>maxlen-3) - break; - if(ins) { - if(l<maxlen) - l++; - for(x=l;x>i;x--) - str1[x]=str1[x-1]; - rprintf("%.*s",l-i,str1+i); - rprintf("\x1b[%dD",l-i); - if(i==maxlen-1) - ins=0; - } - outchar(str1[i++]=1); - break; - case 2: /* Ctrl-B Beginning of Line */ - if(user_misc&ANSI && i) { - bprintf("\x1b[%dD",i); - i=0; - } - break; - case 4: /* Ctrl-D Delete word right */ - if(i<l) { - x=i; - while(x<l && str1[x]!=SP) { - outchar(SP); - x++; - } - while(x<l && str1[x]==SP) { - outchar(SP); - x++; - } - bprintf("\x1b[%dD",x-i); /* move cursor back */ - z=i; - while(z<l-(x-i)) { /* move chars in string */ - outchar(str1[z]=str1[z+(x-i)]); - z++; - } - while(z<l) { /* write over extra chars */ - outchar(SP); - z++; - } - bprintf("\x1b[%dD",z-i); - l-=x-i; /* l=new length */ - } - break; - case 5: /* Ctrl-E End of line */ - if(user_misc&ANSI && i<l) { - bprintf("\x1b[%dC",l-i); /* move cursor right one */ - i=l; - } - break; - case 6: /* Ctrl-F move cursor forewards */ - if(i<l && (user_misc&ANSI)) { - bputs("\x1b[C"); /* move cursor right one */ - i++; - } - break; - case 7: - if(!(mode&K_MSG)) - break; - if(ins) { - if(l<maxlen) - l++; - for(x=l;x>i;x--) - str1[x]=str1[x-1]; - if(i==maxlen-1) - ins=0; - } - if(i<maxlen) { - str1[i++]=7; - outchar(7); - } - break; - case 14: /* Ctrl-N Next word */ - if(i<l && (user_misc&ANSI)) { - x=i; - while(str1[i]!=SP && i<l) - i++; - while(str1[i]==SP && i<l) - i++; - bprintf("\x1b[%dC",i-x); - } - break; - case 0x1c: /* Ctrl-\ Previous word */ - if(i && (user_misc&ANSI)) { - x=i; - while(str1[i-1]==SP && i) - i--; - while(str1[i-1]!=SP && i) - i--; - bprintf("\x1b[%dD",x-i); - } - break; - case 18: /* Ctrl-R Redraw Line */ - redrwstr(str1,i,l,0); - break; - case TAB: - if(!(i%TABSIZE)) { - if(ins) { - if(l<maxlen) - l++; - for(x=l;x>i;x--) - str1[x]=str1[x-1]; - if(i==maxlen-1) - ins=0; - } - str1[i++]=SP; - outchar(SP); - } - while(i<maxlen && i%TABSIZE) { - if(ins) { - if(l<maxlen) - l++; - for(x=l;x>i;x--) - str1[x]=str1[x-1]; - if(i==maxlen-1) - ins=0; - } - str1[i++]=SP; - outchar(SP); - } - if(ins) - redrwstr(str1,i,l,0); - break; - case BS: - if(!i) - break; - i--; - l--; - if(i!=l) { /* Deleting char in middle of line */ - outchar(BS); - z=i; - while(z<l) { /* move the characters in the line */ - outchar(str1[z]=str1[z+1]); - z++; - } - outchar(SP); /* write over the last char */ - bprintf("\x1b[%dD",(l-i)+1); - } - else - bputs("\b \b"); - break; - case 12: /* Ctrl-L Center line (used to be Ctrl-V) */ - str1[l]=0; - l=bstrlen(str1); - for(x=0;x<(maxlen-l)/2;x++) - str2[x]=SP; - str2[x]=0; - strcat(str2,str1); - strcpy(strout,str2); - l=strlen(strout); - if(mode&K_MSG) - redrwstr(strout,i,l,K_MSG); - else { - while(i--) - bputs("\b"); - bputs(strout); - if(mode&K_LINE) - attr(LIGHTGRAY); - } - CRLF; - return(l); - case 23: /* Ctrl-W Delete word left */ - if(i<l) { - x=i; /* x=original offset */ - while(i && str1[i-1]==SP) { - outchar(BS); - i--; - } - while(i && str1[i-1]!=SP) { - outchar(BS); - i--; - } - z=i; /* i=z=new offset */ - while(z<l-(x-i)) { /* move chars in string */ - outchar(str1[z]=str1[z+(x-i)]); - z++; - } - while(z<l) { /* write over extra chars */ - outchar(SP); - z++; - } - bprintf("\x1b[%dD",z-i); /* back to new x corridnant */ - l-=x-i; /* l=new length */ - } - else { - while(i && str1[i-1]==SP) { - i--; - l--; - bputs("\b \b"); - } - while(i && str1[i-1]!=SP) { - i--; - l--; - bputs("\b \b"); - } - } - break; - case 24: /* Ctrl-X Delete entire line */ - while(i<l) { - outchar(SP); - i++; - } - while(l) { - l--; - bputs("\b \b"); - } - i=0; - break; - case 25: /* Ctrl-Y Delete to end of line */ - if(user_misc&ANSI) { - bputs("\x1b[s\x1b[K\x1b[u"); - l=i; - } - break; - case 22: /* Ctrl-V Toggles Insert/Overwrite */ - if(!(user_misc&ANSI)) - break; - if(ins) { - ins=0; - redrwstr(str1,i,l,0); - } - else if(i<l) { - ins=1; - bprintf("\x1b[s\x1b[%dC",80-i); /* save pos */ - z=curatr; /* and got to EOL */ - attr(z|BLINK|HIGH); - outchar('�'); - attr(z); - bputs("\x1b[u"); /* restore pos */ - } - break; - case 0x1d: /* Ctrl-] Reverse Cursor Movement */ - if(i && (user_misc&ANSI)) { - bputs("\x1b[D"); /* move cursor left one */ - i--; - } - break; - case 0x7f: /* Ctrl-BkSpc (DEL) Delete current char */ - if(i==l) { /* Backspace if end of line */ - if(i) { - i--; - l--; - bputs("\b \b"); - } - break; - } - l--; - z=i; - while(z<l) { /* move the characters in the line */ - outchar(str1[z]=str1[z+1]); - z++; - } - outchar(SP); /* write over the last char */ - bprintf("\x1b[%dD",(l-i)+1); - break; - case ESC: - if(!(user_misc&ANSI)) - break; - if((ch=getkey(0x8000))!='[') { - ungetkey(ch); - break; - } - if((ch=getkey(0x8000))=='C') { - if(i<l) { - bputs("\x1b[C"); /* move cursor right one */ - i++; - } - } - else if(ch=='D') { - if(i) { - bputs("\x1b[D"); /* move cursor left one */ - i--; - } - } - else { - while(isdigit(ch) || ch==';' || isalpha(ch)) { - if(isalpha(ch)) { - ch=getkey(0); - break; - } - ch=getkey(0); - } - ungetkey(ch); - } - break; - default: - if(mode&K_WRAP && i==maxlen && ch>=SP && !ins) { - str1[i]=0; - if(ch==SP) { /* don't wrap a space as last char */ - strcpy(strout,str1); - if(stripattr(strout)) - redrwstr(strout,i,l,K_MSG); - CRLF; - return(i); - } - x=i-1; - z=1; - wordwrap[0]=ch; - while(str1[x]!=SP && x) - wordwrap[z++]=str1[x--]; - if(x<(maxlen/2)) { - wordwrap[1]=0; /* only wrap one character */ - strcpy(strout,str1); - if(stripattr(strout)) - redrwstr(strout,i,l,K_MSG); - CRLF; - return(i); - } - wordwrap[z]=0; - while(z--) { - i--; - bputs("\b \b"); - } - strrev(wordwrap); - str1[x]=0; - strcpy(strout,str1); - if(stripattr(strout)) - redrwstr(strout,i,x,mode); - CRLF; - return(x); - } - if(i<maxlen && ch>=SP) { - if(mode&K_UPRLWR) - if(!i || (i && (str1[i-1]==SP || str1[i-1]=='-' - || str1[i-1]=='.' || str1[i-1]=='_'))) - ch=toupper(ch); - else - ch=tolower(ch); - if(ins) { - if(l<maxlen) /* l<maxlen */ - l++; - for(x=l;x>i;x--) - str1[x]=str1[x-1]; - rprintf("%.*s",l-i,str1+i); - rprintf("\x1b[%dD",l-i); - if(i==maxlen-1) { - bputs(" \b\b"); - ins=0; - } - } - str1[i++]=ch; - outchar(ch); - } - } /* switch */ - if(i>l) - l=i; - if(mode&K_CHAT && !l) - return(0); - } - if(i>l) - l=i; - str1[l]=0; - if(!aborted) { - strcpy(strout,str1); - if(stripattr(strout) || ins) - redrwstr(strout,i,l,K_MSG); - } - else - l=0; - if(mode&K_LINE) attr(LIGHTGRAY); - if(!(mode&K_NOCRLF)) { - outchar(CR); - if(!(mode&K_MSG && aborted)) - outchar(LF); - } - return(l); -} - -/****************************************************************************/ -/* Redraws str using i as current cursor position and l as length */ -/****************************************************************************/ -void redrwstr(char *strin, int i, int l, long mode) -{ - char str[256],c; - - sprintf(str,"%-*.*s",l,l,strin); - c=i; - while(c--) - outchar(BS); - if(mode&K_MSG) - bputs(str); - else - rputs(str); - if(user_misc&ANSI) { - bputs("\x1b[K"); - if(i<l) - bprintf("\x1b[%dD",l-i); - } - else { - while(c<79) { /* clear to end of line */ - outchar(SP); - c++; - } - while(c>l) { /* back space to end of string */ - outchar(BS); - c--; - } - } -} - -/****************************************************************************/ -/* Strips invalid Ctrl-Ax sequences from str */ -/* Returns number of ^A's in line */ -/****************************************************************************/ -char stripattr(char *strin) -{ - uchar str[81]; - uchar a,c,d,e; - - e=strlen(strin); - for(a=c=d=0;c<e;c++) { - if(strin[c]==1) { - a++; - switch(toupper(strin[c+1])) { - case '-': /* clear */ - case '_': /* clear */ - case 'B': /* blue fg */ - case 'C': /* cyan fg */ - case 'G': /* green fg */ - case 'H': /* high fg */ - case 'I': /* blink */ - case 'K': /* black fg */ - case 'L': /* cls */ - case 'M': /* magenta fg */ - case 'N': /* normal */ - case 'P': /* pause */ - case 'Q': /* pause reset */ - case 'R': /* red fg */ - case 'W': /* white fg */ - case 'Y': /* yellow fg */ - case '0': /* black bg */ - case '1': /* red bg */ - case '2': /* green bg */ - case '3': /* brown bg */ - case '4': /* blue bg */ - case '5': /* magenta bg */ - case '6': /* cyan bg */ - case '7': /* white bg */ - break; - default: - c++; - continue; - } - } - str[d++]=strin[c]; - } - str[d]=0; - strcpy(strin,str); - return(a); -} - -/***************************************************************************/ -/* Changes local and remote text attributes accounting for monochrome */ -/***************************************************************************/ -void attr(int atr) -{ - - if(!(user_misc&ANSI) || aborted) - return; - if(!(user_misc&COLOR)) { /* eliminate colors if user doesn't have them */ - if(atr&LIGHTGRAY) /* if any bits set, set all */ - atr|=LIGHTGRAY; - if(atr&(LIGHTGRAY<<4)) - atr|=(LIGHTGRAY<<4); - if(atr&LIGHTGRAY && atr&(LIGHTGRAY<<4)) - atr&=~LIGHTGRAY; } /* if background is solid, forground is black */ - if(curatr==atr) /* attribute hasn't changed. don't send codes */ - return; - - if((!(atr&HIGH) && curatr&HIGH) || (!(atr&BLINK) && curatr&BLINK) - || atr==LIGHTGRAY) { - bprintf("\x1b[0m"); - curatr=LIGHTGRAY; } - - if(atr==LIGHTGRAY) { /* no attributes */ - curatr=atr; - return; } - - if(atr&BLINK) { /* special attributes */ - if(!(curatr&BLINK)) - bprintf("\x1b[5m"); } - if(atr&HIGH) { - if(!(curatr&HIGH)) - bprintf("\x1b[1m"); } - - if((atr&0x7)==BLACK) { /* foreground colors */ - if((curatr&0x7)!=BLACK) - bprintf("\x1b[30m"); } - else if((atr&0x7)==RED) { - if((curatr&0x7)!=RED) - bprintf("\x1b[31m"); } - else if((atr&0x7)==GREEN) { - if((curatr&0x7)!=GREEN) - bprintf("\x1b[32m"); } - else if((atr&0x7)==BROWN) { - if((curatr&0x7)!=BROWN) - bprintf("\x1b[33m"); } - else if((atr&0x7)==BLUE) { - if((curatr&0x7)!=BLUE) - bprintf("\x1b[34m"); } - else if((atr&0x7)==MAGENTA) { - if((curatr&0x7)!=MAGENTA) - bprintf("\x1b[35m"); } - else if((atr&0x7)==CYAN) { - if((curatr&0x7)!=CYAN) - bprintf("\x1b[36m"); } - else if((atr&0x7)==LIGHTGRAY) { - if((curatr&0x7)!=LIGHTGRAY) - bprintf("\x1b[37m"); } - - if((atr&0x70)==(BLACK<<4)) { /* background colors */ - if((curatr&0x70)!=(BLACK<<4)) - bprintf("\x1b[40m"); } - else if((atr&0x70)==(RED<<4)) { - if((curatr&0x70)!=(RED<<4)) - bprintf("\x1b[41m"); } - else if((atr&0x70)==(GREEN<<4)) { - if((curatr&0x70)!=(GREEN<<4)) - bprintf("\x1b[42m"); } - else if((atr&0x70)==(BROWN<<4)) { - if((curatr&0x70)!=(BROWN<<4)) - bprintf("\x1b[43m"); } - else if((atr&0x70)==(BLUE<<4)) { - if((curatr&0x70)!=(BLUE<<4)) - bprintf("\x1b[44m"); } - else if((atr&0x70)==(MAGENTA<<4)) { - if((curatr&0x70)!=(MAGENTA<<4)) - bprintf("\x1b[45m"); } - else if((atr&0x70)==(CYAN<<4)) { - if((curatr&0x70)!=(CYAN<<4)) - bprintf("\x1b[46m"); } - else if((atr&0x70)==(LIGHTGRAY<<4)) { - if((curatr&0x70)!=(LIGHTGRAY<<4)) - bprintf("\x1b[47m"); } - - curatr=atr; -} - -/****************************************************************************/ -/* Peform clear screen */ -/****************************************************************************/ -void cls(void) -{ - if(lncntr>1 && !tos) { - lncntr=0; - CRLF; - bpause(); - while(lncntr && !aborted) - bpause(); } - - if(user_misc&ANSI) - bputs("\x1b[2J\x1b[H"); /* clear screen, home cursor */ - else - outchar(FF); - tos=1; - lncntr=0; -} - -/****************************************************************************/ -/* performs the correct attribute modifications for the Ctrl-A code */ -/****************************************************************************/ -void ctrl_a(char x) -{ - char atr=curatr; - int i; - - if((uchar)x>=0x7f) { - if(user_misc&ANSI) - bprintf("\x1b[%uC",(uchar)x-0x7f); - else - for(i=0;i<(uchar)x-0x7f;i++) - outchar(SP); - return; } - - switch(toupper(x)) { - case '-': /* turn off all attributes if */ - if(atr&(HIGH|BLINK|(LIGHTGRAY<<4))) /* high intensity, blink or */ - attr(LIGHTGRAY); /* background bits are set */ - break; - case '_': /* turn off all attributes if */ - if(atr&(BLINK|(LIGHTGRAY<<4))) /* blink or background is set */ - attr(LIGHTGRAY); - break; - case ',': /* Delay 1/10 sec */ - mswait(100); - break; - case ';': /* Delay 1/2 sec */ - mswait(500); - break; - case '.': /* Delay 2 secs */ - mswait(2000); - break; - case 'P': /* Pause */ - bpause(); - break; - case 'Q': /* Pause reset */ - lncntr=0; - break; - case 'L': /* CLS (form feed) */ - cls(); - break; - case '>': /* CLREOL */ - if(user_misc&ANSI) - bputs("\x1b[K"); -#if 0 - else { - i=j=wherey(); - while(i++<80) - outchar(SP); - while(j++<80) - outchar(BS); } -#endif - break; - case '<': /* Non-destructive backspace */ - outchar(BS); - break; - case '[': /* Carriage return */ - outchar(CR); - break; - case ']': /* Line feed */ - outchar(LF); - break; - case 'A': /* Ctrl-A */ - outchar(1); - break; - case 'H': /* High intensity */ - atr|=HIGH; - attr(atr); - break; - case 'I': /* Blink */ - atr|=BLINK; - attr(atr); - break; - case 'N': /* Normal */ - attr(LIGHTGRAY); - break; - case 'R': - atr=(atr&0xf8)|RED; - attr(atr); - break; - case 'S': - nodesync(); - break; - case 'G': - atr=(atr&0xf8)|GREEN; - attr(atr); - break; - case 'B': - atr=(atr&0xf8)|BLUE; - attr(atr); - break; - case 'W': /* White */ - atr=(atr&0xf8)|LIGHTGRAY; - attr(atr); - break; - case 'C': - atr=(atr&0xf8)|CYAN; - attr(atr); - break; - case 'M': - atr=(atr&0xf8)|MAGENTA; - attr(atr); - break; - case 'Y': - atr=(atr&0xf8)|BROWN; - attr(atr); - break; - case 'K': /* Black */ - atr=(atr&0xf8)|BLACK; - attr(atr); - break; - case '0': /* Black Background */ - atr=(atr&0x8f)|(uchar)(BLACK<<4); - attr(atr); - break; - case '1': /* Red Background */ - atr=(atr&0x8f)|(uchar)(RED<<4); - attr(atr); - break; - case '2': /* Green Background */ - atr=(atr&0x8f)|(uchar)(GREEN<<4); - attr(atr); - break; - case '3': /* Yellow Background */ - atr=(atr&0x8f)|(uchar)(BROWN<<4); - attr(atr); - break; - case '4': /* Blue Background */ - atr=(atr&0x8f)|(uchar)(BLUE<<4); - attr(atr); - break; - case '5': /* Magenta Background */ - atr=(atr&0x8f)|(uchar)(MAGENTA<<4); - attr(atr); - break; - case '6': /* Cyan Background */ - atr=(atr&0x8f)|(uchar)(CYAN<<4); - attr(atr); - break; - case '7': /* White Background */ - atr=(atr&0x8f)|(uchar)(LIGHTGRAY<<4); - attr(atr); - break; } -} - -/****************************************************************************/ -/* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */ -/* number of times if the attempted file is already open or denying access */ -/* for some other reason. All files are opened in BINARY mode. */ -/****************************************************************************/ -int nopen(char *str, int access) -{ - char count=0; - int file,share; - - if(access&SH_DENYNO) share=SH_DENYNO; - else if(access==O_RDONLY) share=SH_DENYWR; - else share=SH_DENYRW; - while(((file=sopen(str,O_BINARY|access,share))==-1) - && errno==EACCES && count++<LOOP_NOPEN) - if(count>10) - mswait(50); - if(count>(LOOP_NOPEN/2) && count<=LOOP_NOPEN) - bprintf("\r\nNOPEN COLLISION - File: %s Count: %d\r\n" - ,str,count); - if(file==-1 && errno==EACCES) - bputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7"); - return(file); -} - -/****************************************************************************/ -/* Reads data from XTRN.DAT in the node directory and fills the appropriate */ -/* global variables. */ -/* Initializes starttime variable with current time. */ -/****************************************************************************/ -void initdata(void) -{ - char str[256],tmp[256]; - int i; - FILE *stream; - -#ifdef _WINSOCKAPI_ - WSAStartup(MAKEWORD(1,1), &WSAData); - client_socket=INVALID_SOCKET; -#endif - -#ifdef __WATCOMC__ - putenv("TZ=UCT0"); - setvbuf(stdout,NULL,_IONBF,0); - setvbuf(stderr,NULL,_IONBF,0); -#endif - -#ifdef __SC__ - setvbuf(stdout,NULL,_IONBF,0); - con_fp=stdout; -#else - con_fp=stderr; -#endif - -#ifdef __16BIT__ - -#if defined(__TURBOC__) || defined(__SC__) /* Borland or Symantec */ - ctrlbrk(cbreakh); -#endif - - if(setmode(fileno(con_fp),O_BINARY)==-1) { /* eliminate LF expansion */ - printf("Can't set console output to BINARY\n"); - exit(1); } -#endif - - sprintf(str,"%sXTRN.DAT",node_dir); - if((stream=fopen(str,"rt"))==NULL) { - printf("Can't open %s\r\n",str); - exit(1); } - fgets(str,81,stream); /* username */ - sprintf(user_name,"%.25s",str); - truncsp(user_name); - fgets(str,81,stream); /* system name */ - sprintf(sys_name,"%.40s",str); - truncsp(sys_name); - fgets(str,81,stream); /* system operator */ - sprintf(sys_op,"%.40s",str); - truncsp(sys_op); - fgets(str,81,stream); /* system guru */ - sprintf(sys_guru,"%.40s",str); - truncsp(sys_guru); - - fgets(str,81,stream); /* ctrl dir */ - str[50]=0; - if(str[0]=='.') - sprintf(ctrl_dir,"%s%s",node_dir,str); - else - strcpy(ctrl_dir,str); - truncsp(ctrl_dir); - if(_fullpath(str,ctrl_dir,50)) - strcpy(ctrl_dir,str); - backslash(ctrl_dir); - - fgets(str,81,stream); /* data dir */ - if(str[0]=='.') - sprintf(data_dir,"%s%s",node_dir,str); - else - sprintf(data_dir,"%.40s",str); - truncsp(data_dir); - if(_fullpath(str,data_dir,50)) - strcpy(data_dir,str); - backslash(data_dir); - - fgets(str,81,stream); /* total nodes */ - sys_nodes=atoi(str); - fgets(str,81,stream); /* current node */ - node_num=atoi(str); - fgets(str,81,stream); /* time left */ - timeleft=atoi(str); - fgets(str,81,stream); /* ANSI? (Yes, Mono, or No) */ - user_misc=0; - if(str[0]=='Y') - user_misc|=(ANSI|COLOR); - else if(str[0]=='M') - user_misc|=ANSI; - fgets(str,81,stream); /* screen lines */ - user_rows=atoi(str); - fgets(str,81,stream); /* credits */ - user_cdt=atol(str); - fgets(str,81,stream); /* level */ - user_level=atoi(str); - fgets(str,81,stream); /* was transfer level, left for compat. */ - fgets(str,81,stream); /* birthdate */ - truncsp(str); - sprintf(user_birth,"%.8s",str); - fgets(str,81,stream); /* sex */ - user_sex=str[0]; - fgets(str,81,stream); /* user number */ - user_number=atoi(str); - fgets(str,81,stream); /* user phone number */ - sprintf(user_phone,"%.12s",str); - truncsp(user_phone); - fgets(str,81,stream); /* com port (0 if local or no modem) */ - com_port=atoi(str); - fgets(str,81,stream); /* com (UART) irq */ - com_irq=atoi(str); - fgets(str,81,stream); /* com (UART) base address in hex */ - truncsp(str); - com_base=(uint)ahtoul(str); - fgets(str,81,stream); /* com rate */ - com_rate=(ulong)atol(str); - fgets(str,81,stream); /* hardware flow control (Y/N) */ - if(toupper(str[0])=='Y') - mdm_misc|=MDM_FLOWCTRL; - fgets(str,81,stream); /* locked DTE rate (Y/N) */ - if(toupper(str[0])=='Y') - mdm_misc|=MDM_STAYHIGH; - fgets(str,81,stream); /* modem initialization string */ - sprintf(mdm_init,"%.63s",str); - truncsp(mdm_init); - fgets(str,81,stream); /* modem special init string */ - sprintf(mdm_spec,"%.63s",str); - truncsp(mdm_spec); - fgets(str,81,stream); /* modem terminal mode string */ - sprintf(mdm_term,"%.63s",str); - truncsp(mdm_term); - fgets(str,81,stream); /* modem dial string */ - sprintf(mdm_dial,"%.63s",str); - truncsp(mdm_dial); - fgets(str,81,stream); /* modem off-hook string */ - sprintf(mdm_offh,"%.63s",str); - truncsp(mdm_offh); - fgets(str,81,stream); /* modem answer string */ - sprintf(mdm_answ,"%.63s",str); - truncsp(mdm_answ); - fgets(str,81,stream); /* memory address of modem status register */ - msr=(uint FAR16 *)atol(str); - if(!fgets(str,81,stream)) /* total number of external programs */ - total_xtrns=0; - else - total_xtrns=atoi(str); - if(total_xtrns && (xtrn=(char **)MALLOC(sizeof(char *)*total_xtrns))==NULL) { - printf("Allocation error 1: %u\r\n",sizeof(char *)*total_xtrns); - exit(1); } - for(i=0;i<(int)total_xtrns;i++) { - fgets(str,81,stream); - truncsp(str); - if((xtrn[i]=(char *)MALLOC(strlen(str)+1))==NULL) { - printf("Allocation error 2 (%u): %u\r\n",i,strlen(str)+1); - exit(1); } - strcpy(xtrn[i],str); } - fgets(str,81,stream); /* user's main flags */ - sprintf(user_flags1,"%.26s",str); - fgets(str,81,stream); /* user's xfer flags */ - sprintf(user_flags2,"%.26s",str); - fgets(str,81,stream); /* user's exemptions */ - sprintf(user_exempt,"%.26s",str); - fgets(str,81,stream); /* user's restrictions */ - sprintf(user_rest,"%.26s",str); - fgets(str,81,stream); /* user's expiration date */ - truncsp(str); - user_expire=ahtoul(str); - str[0]=0; - fgets(str,81,stream); /* user's address */ - sprintf(user_address,"%.30s",str); - truncsp(user_address); - fgets(str,81,stream); /* user's location (city, state) */ - sprintf(user_location,"%.30s",str); - truncsp(user_location); - fgets(str,81,stream); /* user's zip/postal code */ - sprintf(user_zipcode,"%.10s",str); - truncsp(user_zipcode); - str[0]=0; - fgets(str,81,stream); - sprintf(user_flags3,"%.26s",str); - fgets(str,81,stream); - sprintf(user_flags4,"%.26s",str); - if(fgets(str,81,stream)) /* Time-slice API type */ -#ifdef __16BIT__ - mswtyp=ahtoul(str); -#else - ; -#endif - str[0]=0; - fgets(str,81,stream); - truncsp(str); - sprintf(user_realname,"%.25s",str); - str[0]=0; - fgets(str,81,stream); - user_dce=atol(str); - - str[0]=0; - fgets(str,81,stream); /* exec dir */ - if(!str[0]) - sprintf(exec_dir,"%s../exec/",ctrl_dir); - else { - if(str[0]=='.') - sprintf(exec_dir,"%s%s",node_dir,str); - else - sprintf(exec_dir,"%.50s",str); } - truncsp(exec_dir); - if(_fullpath(str,exec_dir,50)) - strcpy(exec_dir,str); - backslash(exec_dir); - - str[0]=0; - fgets(str,81,stream); /* text dir */ - if(!str[0]) - sprintf(text_dir,"%s../text/",ctrl_dir); - else { - if(str[0]=='.') - sprintf(text_dir,"%s%s",node_dir,str); - else - sprintf(text_dir,"%.50s",str); } - truncsp(text_dir); - if(_fullpath(str,text_dir,50)) - strcpy(text_dir,str); - backslash(text_dir); - - str[0]=0; - fgets(str,81,stream); /* temp dir */ - if(!str[0]) - sprintf(temp_dir,"%stemp/",node_dir); - else { - if(str[0]!=BACKSLASH && str[1]!=':') - sprintf(temp_dir,"%s%s",node_dir,str); - else - sprintf(temp_dir,"%.50s",str); } - truncsp(temp_dir); - if(_fullpath(str,temp_dir,50)) - strcpy(temp_dir,str); - backslash(temp_dir); - - str[0]=0; - fgets(str,81,stream); - sprintf(sys_id,"%.8s",str); - - str[0]=0; - fgets(str,81,stream); - truncsp(str); - if(str[0]) - node_misc=(uint)ahtoul(str); - else - node_misc=NM_LOWPRIO; - -#ifndef __16BIT__ - str[0]=0; - fgets(str,81,stream); - client_socket=atoi(str); - - if(client_socket!=INVALID_SOCKET) { - -#ifdef _WIN32 - output_sem=CreateEvent( - NULL // pointer to security attributes - ,TRUE // flag for manual-reset event - ,FALSE // flag for initial state - ,NULL // pointer to event-object name - ); - if(output_sem==NULL) { - printf("\r\n\7Error %d creating output_event\r\n",GetLastError()); - exit(1); - } -#else - sem_init(&output_sem,0,0); -#endif - _beginthread(output_thread,0,NULL); - } -#endif - - fclose(stream); - - sprintf(str,"%sINTRSBBS.DAT",node_dir); /* Shrank to run! */ - if(fexist(str)) { - if((stream=fopen(str,"rt"))==NULL) { - printf("Can't open %s\n",str); - exit(1); - } - fgets(tmp,81,stream); /* so get MSR address from file */ - msr=(uint FAR16 *)atol(tmp); - fclose(stream); - remove(str); - } - - starttime=time(NULL); /* initialize start time stamp */ - wordwrap[0]=0; /* set wordwrap to null */ - mnehigh=LIGHTGRAY|HIGH; /* mnemonics highlight color */ - mnelow=GREEN; /* mnemonics normal text color */ - sec_warn=180; /* seconds till inactivity warning */ - sec_timeout=300; /* seconds till inactivity timeout */ - tos=lncntr=0; /* init topofscreen and linecounter to 0 */ - lastnodemsg=0; /* Last node to send message to */ - aborted=0; /* Ctrl-C hit flag */ - sysop_level=90; /* Minimum level to be considered sysop */ - timeleft_warn=0; /* Running out of time warning */ - - sprintf(str,"%s%s",ctrl_dir,"node.dab"); - if((nodefile=sopen(str,O_BINARY|O_RDWR,SH_DENYNO))==-1) { - printf("\r\n\7Error opening %s\r\n",str); - exit(1); - } - - sprintf(str,"%suser/name.dat",data_dir); - if((i=nopen(str,O_RDONLY))==-1) { - printf("\r\n\7Error opening %s\r\n",str); - exit(1); - } - memset(str,0,30); - read(i,str,26); - close(i); - if(str[25]==CR) /* Version 1b */ - name_len=25; - else /* Version 1a */ - name_len=30; - -#ifdef __unix__ - _termios_setup(); -#endif - - if(xsdk_mode&XSDK_MODE_NOCONSOLE) { - con_fp=NULL; -#ifdef _WIN32 - FreeConsole(); -#endif - } - - attr(LIGHTGRAY); /* initialize color and curatr to plain */ -} - -/****************************************************************************/ -/* Automatic RIP & WIP terminal detection function. Sets RIP and WIP bits */ -/* in user_misc variable. Must be called AFTER initdat(), not before. */ -/****************************************************************************/ -void get_term(void) -{ - char str[128],ch; - int i; - - bputs("\r\x1b[!_\x1b[0t_\r \r"); - mswait(500); - for(i=0;i<120;i++) { - ch=inkey(0); - if(!ch) - break; - mswait(1); - str[i]=ch; } - str[i]=0; - if(strstr(str,"RIPSCRIP")) - user_misc|=RIP; - if(strstr(str,"DC-TERM")) - user_misc|=WIP; -} - -/****************************************************************************/ -/* Truncates white-space chars off end of 'str' and terminates at first tab */ -/****************************************************************************/ -void truncsp(uchar *str) -{ - char c; - - str[strcspn(str,"\t")]=0; - c=strlen(str); - while(c && (uchar)str[c-1]<=SP) c--; - str[c]=0; -} - -/****************************************************************************/ -/* Puts a backslash on path strings */ -/****************************************************************************/ -void backslash(char *str) -{ - int i; - - i=strlen(str); - if(i && str[i-1]!='\\' && str[i-1]!='/') { - str[i]=BACKSLASH; - str[i+1]=0; - } -} - - -/****************************************************************************/ -/* Checks the amount of time inside the external program against the amount */ -/* of time the user had left online before running the external program and */ -/* prints a message and exits the program if time has run out. */ -/****************************************************************************/ -void checktimeleft(void) -{ - if(!SYSOP && !strchr(user_exempt,'T') && time(NULL)-starttime>timeleft) { - bputs("\1_\n\1r\1hTime's up.\n"); - exit(0); } -} - -/****************************************************************************/ -/* Prints a file remotely and locally, interpreting ^A sequences. */ -/* 'str' is the path of the file to print */ -/****************************************************************************/ -void printfile(char *str) -{ - char *buf; - int file; - ulong length; - - if(!tos) - CRLF; - if((file=nopen(str,O_RDONLY))==-1) { - bprintf("File not Found: %s\r\n",str); - return; } - length=filelength(file); - if((buf=MALLOC(length+1L))==NULL) { - close(file); - bprintf("\7\r\nPRINTFILE: Error allocating %lu bytes of memory for %s.\r\n" - ,length+1L,str); - return; } - buf[read(file,buf,length)]=0; - close(file); - bputs(buf); - aborted=0; - FREE(buf); -} - -/****************************************************************************/ -/* Returns a char pointer to the name of the user that corresponds to */ -/* usernumber. Takes value directly from database. */ -/****************************************************************************/ -char *username(uint usernumber) -{ - static char name[26]; - char str[128]; - int i,file; - - strcpy(name,"UNKNOWN USER"); - if(!data_dir[0]) - return(name); - if(!usernumber) { - bputs("\7username: called with zero usernumber\r\n"); - return(name); } - sprintf(str,"%suser/name.dat",data_dir); - if((file=nopen(str,O_RDONLY))==-1) { - bprintf("\7username: couldn't open %s\r\n",str); - return(name); } - if(filelength(file)<(long)(usernumber-1)*((long)name_len+2L)) { - close(file); - return(name); } - lseek(file,(long)(usernumber-1)*((long)name_len+2L),SEEK_SET); - read(file,name,25); - close(file); - for(i=0;i<25;i++) - if(name[i]==3) - break; - name[i]=0; - if(!name[0]) - strcpy(name,"DELETED USER"); - return(name); -} - -/****************************************************************************/ -/* Returns the number of the user 'username' from the NAME.DAT file. */ -/* If the username is not found, the function returns 0. */ -/****************************************************************************/ -uint usernumber(char *username) -{ - char str[128]; - int i,file; - FILE *stream; - - if(!data_dir[0]) - return(0); - sprintf(str,"%suser/name.dat",data_dir); - if((file=nopen(str,O_RDONLY))==-1 || (stream=fdopen(file,"rb"))==NULL) { - if(file!=-1) - close(file); - bprintf("\7usernumber: couldn't open %s\r\n",str); - return(0); } - for(i=1;!feof(stream);i++) { - if(!fread(str,27,1,stream)) - break; - str[25]=0; - truncsp(str); /* chop of trailing EOTs and spaces */ - if(!stricmp(str,username)) { - fclose(stream); - return(i); } } - fclose(stream); - return(0); -} - - -/****************************************************************************/ -/* Returns in 'string' a character representation of the number in l with */ -/* commas. Maximum value of l is 4 gigabytes. */ -/****************************************************************************/ -char *ultoac(ulong l, char *string) -{ - char str[81]; - char i,j,k; - - sprintf(str,"%lu",l); - i=strlen(str)-1; - j=i/3+1+i; - string[j--]=0; - for(k=1;i>-1;k++) { - string[j--]=str[i--]; - if(j>0 && !(k%3)) - string[j--]=','; } - return(string); -} - -/****************************************************************************/ -/* Converts an ASCII Hex string into a ulong */ -/****************************************************************************/ -ulong ahtoul(char *str) -{ - ulong l,val=0; - - while((l=(*str++)|0x20)!=0x20) - val=(l&0xf)+(l>>6&1)*9+val*16; - return(val); -} - -/****************************************************************************/ -/* Reads the data for node number 'number' into the structure 'node' */ -/* from NODE.DAB */ -/* if lockit is non-zero, locks this node's record. putnodedat() unlocks it */ -/****************************************************************************/ -void getnodedat(int number, node_t *node, char lockit) -{ - int count=0; - - if(nodefile<0) - return; - number--; /* make zero based */ - while(count<LOOP_NODEDAB) { - lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); - if(lockit - && lock(nodefile,(long)number*sizeof(node_t),sizeof(node_t))==-1) { - count++; - continue; } - if(read(nodefile,node,sizeof(node_t))==sizeof(node_t)) - break; - count++; } - if(count==LOOP_NODEDAB) - bprintf("\7Error unlocking and reading node.dab\r\n"); -} - -/****************************************************************************/ -/* Write the data from the structure 'node' into NODE.DAB */ -/* getnodedat(num,&node,1); must have been called before calling this func */ -/* NOTE: ------^ the indicates the node record has been locked */ -/****************************************************************************/ -void putnodedat(int number, node_t node) -{ - if(nodefile<0) - return; - number--; /* make zero based */ - lseek(nodefile,(long)number*sizeof(node_t),SEEK_SET); - if(write(nodefile,&node,sizeof(node_t))!=sizeof(node_t)) { - unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); - bprintf("\7Error writing node.dab for node %u\r\n",number+1); - return; } - unlock(nodefile,(long)number*sizeof(node_t),sizeof(node_t)); -} - -/****************************************************************************/ -/* Checks for messages waiting for this node or interruption. */ -/****************************************************************************/ -void nodesync(void) -{ - node_t node; - - if(!ctrl_dir[0]) - return; - getnodedat(node_num,&node,0); - - if(node.misc&NODE_MSGW) - getsmsg(user_number); /* getsmsg clears MSGW flag */ - - if(node.misc&NODE_NMSG) /* getnmsg clears NMSG flag */ - getnmsg(); - - if(node.misc&NODE_INTR) - exit(0); - -} - -/****************************************************************************/ -/* Displays the information for node number 'number' contained in 'node' */ -/****************************************************************************/ -void printnodedat(int number, node_t node) -{ - char hour,mer[3],tmp[256]; - int i; - - attr(LIGHTGRAY|HIGH); - bprintf("Node %2d: ",number); - attr(GREEN); - switch(node.status) { - case NODE_WFC: - bputs("Waiting for call"); - break; - case NODE_OFFLINE: - bputs("Offline"); - break; - case NODE_NETTING: - bputs("Networking"); - break; - case NODE_LOGON: - bputs("At logon prompt"); - break; - case NODE_EVENT_WAITING: - bputs("Waiting for all nodes to become inactive"); - break; - case NODE_EVENT_LIMBO: - bprintf("Waiting for node %d to finish external event",node.aux); - break; - case NODE_EVENT_RUNNING: - bputs("Running external event"); - break; - case NODE_NEWUSER: - attr(GREEN|HIGH); - bputs("New user"); - attr(GREEN); - bputs(" applying for access "); - if(!node.connection) - bputs("Locally"); - else if(node.connection==0xffff) - bprintf("via telnet"); - else - bprintf("at %ubps",node.connection); - break; - case NODE_QUIET: - if(!SYSOP) { - bputs("Waiting for call"); - break; } - case NODE_INUSE: - attr(GREEN|HIGH); - if(node.misc&NODE_ANON && !SYSOP) - bputs("UNKNOWN USER"); - else - bputs(username(node.useron)); - attr(GREEN); - bputs(" "); - switch(node.action) { - case NODE_MAIN: - bputs("at main menu"); - break; - case NODE_RMSG: - bputs("reading messages"); - break; - case NODE_RMAL: - bputs("reading mail"); - break; - case NODE_RSML: - bputs("reading sent mail"); - break; - case NODE_RTXT: - bputs("reading text files"); - break; - case NODE_PMSG: - bputs("posting message"); - break; - case NODE_SMAL: - bputs("sending mail"); - break; - case NODE_AMSG: - bputs("posting auto-message"); - break; - case NODE_XTRN: - if(!node.aux) - bputs("at external program menu"); - else { - bputs("running "); - i=node.aux-1; - if(i>=(int)total_xtrns || i<0 || !xtrn[i][0]) - bputs("external program"); - else - bputs(xtrn[i]); } - break; - case NODE_DFLT: - bputs("changing defaults"); - break; - case NODE_XFER: - bputs("at transfer menu"); - break; - case NODE_RFSD: - bprintf("retrieving from device #%d",node.aux); - break; - case NODE_DLNG: - bprintf("downloading"); - break; - case NODE_ULNG: - bputs("uploading"); - break; - case NODE_BXFR: - bputs("transferring bidirectional"); - break; - case NODE_LFIL: - bputs("listing files"); - break; - case NODE_LOGN: - bputs("logging on"); - break; - case NODE_LCHT: - bprintf("in local chat with %s",sys_op); - break; - case NODE_MCHT: - if(node.aux) { - bprintf("in multinode chat channel %d",node.aux&0xff); - if(node.aux&0x1f00) /* password */ - outchar('*'); } - else - bputs("in multinode global chat channel"); - break; - case NODE_PAGE: - bprintf("paging node %u for private chat",node.aux); - break; - case NODE_PCHT: - bprintf("in private chat with node %u",node.aux); - break; - case NODE_GCHT: - bprintf("chatting with %s",sys_guru); - break; - case NODE_CHAT: - bputs("in chat section"); - break; - case NODE_TQWK: - bputs("transferring QWK packet"); - break; - case NODE_SYSP: - bputs("performing sysop activities"); - break; - default: - bputs(ultoa(node.action,tmp,10)); - break; } - if(!node.connection) - bputs(" locally"); - else if(node.connection==0xffff) - bprintf(" via telnet"); - else - bprintf(" at %ubps",node.connection); - if(node.action==NODE_DLNG) { - if((node.aux/60)>12) { - hour=(node.aux/60)-12; - strcpy(mer,"pm"); } - else { - if((node.aux/60)==0) /* 12 midnite */ - hour=12; - else hour=node.aux/60; - strcpy(mer,"am"); } - bprintf(" ETA %02d:%02d %s" - ,hour,node.aux%60,mer); } - break; } - i=NODE_LOCK; - if(node.status==NODE_INUSE || SYSOP) - i|=NODE_POFF|NODE_AOFF|NODE_MSGW|NODE_NMSG; - if(node.misc&i) { - bputs(" ("); - if(node.misc&(i&NODE_AOFF)) - outchar('A'); - if(node.misc&NODE_LOCK) - outchar('L'); - if(node.misc&(i&(NODE_MSGW|NODE_NMSG))) - outchar('M'); - if(node.misc&(i&NODE_POFF)) - outchar('P'); - outchar(')'); } - if(SYSOP && ((node.misc - &(NODE_ANON|NODE_UDAT|NODE_INTR|NODE_RRUN|NODE_EVENT|NODE_DOWN)) - || node.status==NODE_QUIET)) { - bputs(" ["); - if(node.misc&NODE_ANON) - outchar('A'); - if(node.misc&NODE_INTR) - outchar('I'); - if(node.misc&NODE_RRUN) - outchar('R'); - if(node.misc&NODE_UDAT) - outchar('U'); - if(node.status==NODE_QUIET) - outchar('Q'); - if(node.misc&NODE_EVENT) - outchar('E'); - if(node.misc&NODE_DOWN) - outchar('D'); - outchar(']'); } - if(node.errors && SYSOP) { - attr(RED|HIGH|BLINK); - bprintf(" %d error%c",node.errors, node.errors>1 ? 's' : '\0' ); } - CRLF; -} - -/****************************************************************************/ -/* Prints short messages waiting for 'usernumber', if any... */ -/* then deletes them. */ -/****************************************************************************/ -void getsmsg(int usernumber) -{ - char str[256], *buf; - int file; - long length; - node_t node; - - if(!data_dir[0]) - return; - sprintf(str,"%smsgs/%4.4u.msg",data_dir,usernumber); - if(flength(str)<1L) { - return; } - if((file=nopen(str,O_RDWR))==-1) { - bprintf("\7Error opening %s for read/write access\r\n",str); - return; } - length=filelength(file); - if((buf=MALLOC(length+1))==NULL) { - close(file); - bprintf("\7Error allocating %u bytes of memory for %s\r\n",length+1,str); - return; } - if(read(file,buf,length)!=length) { - close(file); - FREE(buf); - bprintf("\7Error reading %u bytes from %s\r\n",length,str); - return; } - chsize(file,0L); - close(file); - buf[length]=0; - getnodedat(node_num,&node,0); - if(node.action==NODE_MAIN || node.action==NODE_XFER) { - CRLF; } - if(node.misc&NODE_MSGW) { - getnodedat(node_num,&node,1); - node.misc&=~NODE_MSGW; - putnodedat(node_num,node); } - bputs(buf); - FREE(buf); -} - -/****************************************************************************/ -/* Creates a short message for 'usernumber' than contains 'strin' */ -/****************************************************************************/ -void putsmsg(int usernumber, char *strin) -{ - char str[256]; - int file,i; - node_t node; - - if(!data_dir[0]) - return; - sprintf(str,"%smsgs/%4.4u.msg",data_dir,usernumber); - if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - bprintf("\7Error opening/creating %s for creat/append access\r\n",str); - return; } - i=strlen(strin); - if(write(file,strin,i)!=i) { - close(file); - bprintf("\7Error writing %u bytes to %s\r\n",i,str); - return; } - close(file); - for(i=1;i<=sys_nodes;i++) { /* flag node if user on that msg waiting */ - getnodedat(i,&node,0); - if(node.useron==(ushort)usernumber - && (node.status==NODE_INUSE || node.status==NODE_QUIET) - && !(node.misc&NODE_MSGW)) { - getnodedat(i,&node,1); - node.misc|=NODE_MSGW; - putnodedat(i,node); } } -} - -/****************************************************************************/ -/* Prints short messages waiting for this node, if any... */ -/****************************************************************************/ -void getnmsg(void) -{ - char str[256], *buf; - int file; - long length; - node_t thisnode; - - if(!data_dir[0]) - return; - getnodedat(node_num,&thisnode,1); - thisnode.misc&=~NODE_NMSG; /* clear the NMSG flag */ - putnodedat(node_num,thisnode); - - sprintf(str,"%smsgs/n%3.3u.msg",data_dir,node_num); - if(flength(str)<1L) { - return; } - if((file=nopen(str,O_RDWR))==-1) { - printf("Couldn't open %s for read/write\r\n",str); - return; } - length=filelength(file); - if((buf=MALLOC(length+1))==NULL) { - close(file); - printf("Couldn't allocate %lu bytes for %s\r\n",length+1,str); - return; } - if(read(file,buf,length)!=length) { - close(file); - FREE(buf); - printf("Couldn't read %lu bytes from %s\r\n",length,str); - return; } - chsize(file,0L); - close(file); - buf[length]=0; - - bputs(buf); - FREE(buf); -} - -/****************************************************************************/ -/* Creates a short message for node 'num' than contains 'strin' */ -/****************************************************************************/ -void putnmsg(int num, char *strin) -{ - char str[256]; - int file,i; - node_t node; - - if(!data_dir[0]) - return; - sprintf(str,"%smsgs/n%3.3u.msg",data_dir,num); - if((file=nopen(str,O_WRONLY|O_CREAT|O_APPEND))==-1) { - printf("Couldn't open %s for append\r\n",str); - return; } - i=strlen(strin); - if(write(file,strin,i)!=i) { - close(file); - printf("Error writing %u bytes to %s\r\n",i,str); - return; } - close(file); - getnodedat(num,&node,0); - if((node.status==NODE_INUSE || node.status==NODE_QUIET) - && !(node.misc&NODE_NMSG)) { - getnodedat(num,&node,1); - node.misc|=NODE_NMSG; - putnodedat(num,node); } -} - -/****************************************************************************/ -/* This function lists users that are online. */ -/* If listself is true, it will list the current node. */ -/* Returns number of active nodes (not including current node). */ -/****************************************************************************/ -int whos_online(char listself) -{ - int i,j; - node_t node; - - if(!ctrl_dir[0]) - return(0); - CRLF; - for(j=0,i=1;i<=sys_nodes;i++) { - getnodedat(i,&node,0); - if(i==node_num) { - if(listself) - printnodedat(i,node); - continue; } - if(node.status==NODE_INUSE || (SYSOP && node.status==NODE_QUIET)) { - printnodedat(i,node); - if(!lastnodemsg) - lastnodemsg=i; - j++; } } - if(!j) - bputs("\1nNo other active nodes.\r\n"); - return(j); -} - -/****************************************************************************/ -/* Sending single line messages between nodes */ -/****************************************************************************/ -void nodemsg(void) -{ - char line[256],buf[512]; - int i; - node_t thisnode; - node_t node; - - if(!ctrl_dir[0]) - return; - if(strchr(user_rest,'C')) { - bputs("You cannot send messages.\r\n"); - return; } - getnodedat(node_num,&thisnode,0); - wordwrap[0]=0; - if(lastnodemsg) { - getnodedat(lastnodemsg,&node,0); - if(node.status!=NODE_INUSE) - lastnodemsg=0; } - if(!whos_online(0)) - return; - bprintf("\r\n\1n\1gNumber of node to send message to, \1w\1hA\1n\1gll, " - "or \1w\1hQ\1n\1guit [%u]: \1w\1h",lastnodemsg); - i=getkeys("QA",sys_nodes); - if(i==-1) - return; - if(i&0x8000 || !i) { - if(!i) - i=lastnodemsg; - else { - i^=0x8000; - lastnodemsg=i; } - if(!i || i>sys_nodes) - return; - getnodedat(i,&node,0); - if(node.status!=NODE_INUSE && !SYSOP) - bprintf("\r\n\1_\1w\1hNode %d is not in use.\r\n",i); - else if(i==node_num) - bputs("\r\nThere's no need to send a message to yourself.\r\n"); - else if(node.misc&NODE_POFF && !SYSOP) - bprintf("\r\n\1r\1h\1iDon't bug %s.\1n\r\n" - ,node.misc&NODE_ANON ? "UNKNOWN USER" - : username(node.useron)); - else { - bputs("\1_\1y\1hMessage: "); - if(!getstr(line,70,K_LINE)) - return; - sprintf(buf - ,"\7\1_\1w\1hNode %2d: \1g%s\1n\1g sent you a message:\r\n" - "\1w\1h\0014%s\1n\r\n" - ,node_num - ,thisnode.misc&NODE_ANON ? "UNKNOWN USER" : user_name,line); - putnmsg(i,buf); } } - else if(i=='A') { - bputs("\1_\1y\1hMessage: "); - if(!getstr(line,70,K_LINE)) - return; - sprintf(buf - ,"\7\1_\1w\1hNode %2d: \1g%s\1n\1g sent all nodes a message:\r\n" - "\1w\1h\0014%s\1n\r\n" - ,node_num - ,thisnode.misc&NODE_ANON ? "UNKNOWN USER" : user_name,line); - for(i=1;i<=sys_nodes;i++) { - if(i==node_num) - continue; - getnodedat(i,&node,0); - if((node.status==NODE_INUSE || (SYSOP && node.status==NODE_QUIET)) - && (SYSOP || !(node.misc&NODE_POFF))) - putnmsg(i,buf); } } - -} - -/****************************************************************************/ -/* Puts a character into the input buffer */ -/****************************************************************************/ -void ungetkey(char ch) -{ - - keybuf[keybuftop++]=ch; - if(keybuftop==KEY_BUFSIZE) - keybuftop=0; -} - diff --git a/xtrn/sdk/xsdk.h b/xtrn/sdk/xsdk.h deleted file mode 100644 index dbdf440b96..0000000000 --- a/xtrn/sdk/xsdk.h +++ /dev/null @@ -1,278 +0,0 @@ -/* xsdk.h */ - -/* Synchronet XSDK function prototypes */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout xtrn * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - - -#ifndef _XSDK_H -#define _XSDK_H - -/*********************************************/ -/* Standard Borland/Turbo C/C++ Header Files */ -/*********************************************/ -#ifndef __unix__ - #include <io.h> - #include <dos.h> - #include <share.h> - #include <conio.h> -#endif -#ifdef _WIN32 - #include <windows.h> -#endif -#include <time.h> -#include <ctype.h> -#include <stdio.h> -#include <errno.h> -#include <fcntl.h> -#include <string.h> -#include <stdlib.h> -#include <stdarg.h> -#ifndef __FreeBSD__ /* FreeBSD uses stdlib.h for malloc() */ - #include <malloc.h> -#endif -#include <sys/stat.h> -#include <sys/types.h> - -#define GLOBAL extern /* turns XSDKVARS.C into a header file */ -#include "xsdkinet.h" -#include "xsdkwrap.h" -#include "xsdkvars.c" - -#ifdef __cplusplus - extern "C" { -#endif - -extern char *xsdk_ver; /* XSDK version number */ -extern ulong xsdk_mode; /* XSDK mode bits */ -extern int mswtyp; /* MSwait type */ - -/***********************/ -/* Function Prototypes */ -/***********************/ - -/* Initialize Data - - Reads XTRN.DAT and initializes variables */ -void initdata(void); - -/* Get Terminal Type - - Detects RIP and WIP terminal compatibility */ -void get_term(void); - -/* BBS Print String - - Displays a string locally and remotely (with Ctrl-A codes) */ -void bputs(char *str); - -/* Raw Print String - - Oututs a string locally and remotely (verbatim) */ -void rputs(char *str); - -/* BBS Print Formatted - - Displays a formatted string locally and remotely (with Ctrl-A codes) - - printf() equivalent */ -int bprintf(char *fmt, ...); - -/* Raw Print Formated - - Displays a formatted string locally and remotely (verbatim) - - printf() equivalent */ -int rprintf(char *fmt, ...); - -/* BBS String Length - - Returns length of string, excluding Ctrl-A codes */ -int bstrlen(uchar *str); - -/* Output character - - Displays a single character */ -void outchar(char ch); - -/* Mnemonics - - Display a string expanding ~letter combinations to command keys - - Automatically colorizes mnemonic letters or places them in parenthesis - for non-ANSI users */ -void mnemonics(char *str); - -/* Pause prompt - - Displays [Hit a key] and waits for the user to hit a key */ -void bpause(void); - -/* Yes/no Question - - Displays a string with (Y/n) ? appended and waits for the user to hit - 'Y', 'N' or enter - - Returns 1 if the user hit 'Y' or enter - - Automatic colorization */ -char yesno(char *str); - -/* No/yes Question - - Displays a string with (y/N) ? appended and waits for the user to hit - 'Y', 'N' or enter - - Returns 1 if the user hit 'N' or enter */ -char noyes(char *str); - -/* Inbound Keystroke - - If the local or remote user has struck a key, this function returns the - key, otherwise it returns 0 - - Does not wait for a keystroke */ -char inkey(long mode); - -/* Get a Key - - Waits for the local or remote user to hit a valid key - - See K_* constants in XSDKDEFS.H for possible values of mode */ -char getkey(long mode); - -/* Get One of these Keys or a Number - - Waits for the user to hit a valid key or if max is non-zero, then enter - a number not greater than max - - Hot-keyed input, automatically displays the struck key (in upper case) - followed by CRLF - - If the user entered a number, the number is ORed with 0x8000 and returned - you must XOR (or not) this bit to get the correct number */ -int getkeys(char *str, int max); - -/* Get a Number - - Waits for the user to enter a number from 0 to max, 'Q' or ENTER - - Returns -1 if the user hit 'Q' or Ctrl-C - - Returns 0 if the user just hit ENTER */ -int getnum(int max); - -/* Change Attribute - - Sends ANSI escape sequences (if user supports ANSI) to change color - - Valid color bits are defined in INCLUDE\CONIO.H */ -void attr(int atr); - -/* Clear Screen - - Clears local and remote screen (using ANSI if appropriate) - - Automatically pauses before clearing if lncntr is >1 */ -void cls(void); - -/* Process Ctrl-A Code - - Changes color or performs special Ctrl-A function */ -void ctrl_a(char x); - -/* Network Open - - Opens a file in DENYNONE or DENYWRITE mode, automatically retrying */ -int nopen(char *str, int access); - -/* Truncate Space - - Removes white space characters from the end of a string */ -void truncsp(uchar *str); - -/* Adds Backslash - - Adds backslash to end of string if it doesn't exist */ -void backslash(char *str); - -/* Check Time Left - - Checks the amount of time the user has left and sets the timeleft - variable - - Automatically exits if user runs out of time */ -void checktimeleft(void); - -/* Print File - - Displays contents of file (expanding Ctrl-A characters if appropriate) */ -void printfile(char *str); - -/* Get String - - Waits for the user to enter a string - - maxlen is the maximum length of the string - - See K_* constants in XSDKDEFS.H for possible values of mode */ -int getstr(char *str, size_t maxlen, long mode); - -/* Redraw String - - Redisplays a string, mainly called by getstr() */ -void redrwstr(char *strin, int i, int l, long mode); - -/* Strip Invalid Ctrl-A codes */ -char stripattr(char *strin); - -/* Returns the name of the user number passed */ -char *username(uint usernumber); - -/* Returns the number of the user name passed */ -uint usernumber(char *username); - -/* Convert unsigned long to an ASCII string with commas */ -char *ultoac(ulong l, char *string); - -/* Convert an ASCII string of hex digits into an unsigned long */ -ulong ahtoul(char *str); - -/* Display status of node */ -void printnodedat(int number, node_t node); - -/* Checks to see if this node has been interrupted or any messages waiting */ -void nodesync(void); - -/* Writes the node information to disk */ -void putnodedat(int number, node_t node); - -/* Reads the node information from disk */ -void getnodedat(int number, node_t *node, char lockit); - -/* Writes a short message (telegram) for specified user number */ -void putsmsg(int usernumber, char *strin); - -/* Reads and displays short message for specified user number */ -void getsmsg(int usernumber); - -/* Writes a node message for specified node */ -void putnmsg(int num, char *strin); - -/* Reads and displays node message for current node */ -void getnmsg(void); - -/* Displays users online */ -int whos_online(char listself); - -/* Send a node-message (ctrl-P) */ -void nodemsg(void); - -/* Put a key into the keyboard buffer */ -void ungetkey(char ch); - -/* Check to see if the user has hung-up */ -void checkline(void); - -/* Display a line (with ctrl-A codes) centered on the screen */ -void center(char *str); - -#ifdef _MSC_VER -int lock(int file, long offset, int size); -int unlock(int file, long offset, int size); -#endif - -#ifdef __cplusplus - } -#endif - - -#endif /* Don't add anything after this #endif */ diff --git a/xtrn/sdk/xsdk.txt b/xtrn/sdk/xsdk.txt deleted file mode 100644 index 9e1183e4db..0000000000 --- a/xtrn/sdk/xsdk.txt +++ /dev/null @@ -1,127 +0,0 @@ - Synchronet External Program Software Developer's Kit (XSDK) - Version 3.11 - March 2001 - Rob Swindell - - -What is it? -=========== - -The Synchronet XSDK is a software development kit for C/C++ programmers that -are interested in writing external online programs (aka "doors") for -Synchronet BBS Software (www.synchro.net). The XSDK consists of C source and -header files that contain functions and variables that make writing an external -program for Synchronet much easier than "from scratch". - -The Synchronet XSDK can be used to create 16-bit DOS programs supported by -all versions of Synchronet and native 32-bit programs supported by Synchronet -Version 3.0 for Win32 and Linux. - -Programs written using the XSDK will automatically inherit the following -features: - -o Reads Synchronet's XTRN.DAT drop file from the current node directory - without any required command line parameters (easy configuration) - initializing many user and system variables for the programmer to use - -o Automatically supports remote user I/O with dropped connection detection - -o Synchronet internode messaging (Ctrl-P), activity alerts, and node listings - -o Automatic terminal type detection - -o Intelligent Ctrl-A code expansion for Color/ANSI users - -o Automatic screen pausing based on screen length (optional) - -o 32-bit programs will default to no local console I/O (new in v3.11) - - -Supported Compilers -=================== - -o All Borland 16-bit and 32-bit C/C++ compilers for DOS and Windows - e.g. Turbo C/C++, Borland C/C++, and Borland C++ Builder - See xtrn/sbl/sbl.bpr and xtrn/sbj/sbj.bpr for example BCB 5 XSDK projects - -o Microsoft Visual C++ Version 5 and 6 - (earlier 32-bit versions should work too) - See xtrn/sbl/sbl.dsp and xtrn/sbj/sbj.dsp for example MSVC 6 XSDK projects - -o GNU Compiler Collection - (including Cygwin/MinGW for Win32) - See xtrn/sbl/Makefile.gnu and xtrn/sbj/Makefile.gnu for example XSDK projects - -o Watcom C/C++ - -o Symantec C/C++ - -o Other C/C++ compilers may be supported with slight modifications to the code - (please share your modifications with me: sysop@vert.synchro.net) - - -How do I use it? -================ - -1. Copy the following files into the source directory for your project (or - copy them to and build them from your Synchronet XTRN\SDK directory): - - xsdk.c - xsdk.h - xsdkvars.c - xsdkwrap.c -> New in XSDK v3.10 - xsdkwrap.h -> New in XSDK v3.10 - xsdkinet.h -> New in XSDK v3.10 - xsdkdefs.h - mswaits.obj (16-bit compilers only) - mswaitl.obj (16-bit copmilers only) - -2. Add the following line towards the top of your main .c file: - - #include "xsdk.h" - -3. Compile your main .c file to verify that you do not have any - incompatibilities with the contents of xsdk.h. If you receive any - compilation errors, you'll need to resolve these errors (possibly by - editing xsdk*.c or xsdk*.h) before you can continue. - -4. Add a call to the XSDK "initdata" function to your program's entry point - (typically main()). The XSDK "initdata" function will read in the BBS drop - file (XTRN.DAT) and initialize the appropriate variables. See xsdk.h for a - complete list of functions available to you and their descriptions. - -5. Somewhere after the call to initdata(), add the following line to your - code: - - bprintf("XSDK v%s",xsdk_ver); - - Note: You may also want to use the COMPILER_DESC and PLATFORM_DESC macros - (new in v3.11) to describe the compiler used and the target platform. - -6. Include xsdk.c, xsdkwrap.c and xsdkvars.c in your project or "make" file. - -7. If you are using a 16-bit compiler, you will need to include mswaits.obj - (for small memory models) or mswaitl.obj (for large memory models) in your - project's linked library/object list. This is the millisecond wait/ - time-slice surrender library used by the 16-bit DOS version of Synchronet. - -8. Compile and link your project. - - -Configuring Synchronet To Run Your Program -========================================== - -Make sure you have the program configured (in SCFG) to create the XTRN.DAT -drop file in the Node Directory. - -16-bit Programs ---------------- -16-bit XSDK programs must have "Intercept I/O Interrupts" set to "Yes". - -32-bit Programs ---------------- -32-bit XSDK programs are only supported by Synchronet version 3. To configure -a 32-bit program with Synchronet v3.0b, add the program's base filename to the -OS/2 program list in SCFG (this will be replaced with a toggle option in the -extenral program configuration menu in the future). - - -/* End of XSDK.TXT */ diff --git a/xtrn/sdk/xsdkdefs.h b/xtrn/sdk/xsdkdefs.h deleted file mode 100644 index fe1f1d3cc5..0000000000 --- a/xtrn/sdk/xsdkdefs.h +++ /dev/null @@ -1,348 +0,0 @@ -/* xsdkdefs.h */ - -/* Synchronet XSDK constants, macros, and type definitions */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout xtrn * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XSDKDEFS_H -#define _XSDKDEFS_H - -/**********/ -/* Macros */ -/**********/ - - /* Control characters */ -#define STX 0x02 /* Start of text ^B */ -#define ETX 0x03 /* End of text ^C */ -#define BS 0x08 /* Back space ^H */ -#define TAB 0x09 /* Horizontal tabulation ^I */ -#define LF 0x0a /* Line feed ^J */ -#define FF 0x0c /* Form feed ^L */ -#define CR 0x0d /* Carriage return ^M */ -#define ESC 0x1b /* Escape ^[ */ -#define SP 0x20 /* Space */ - - -#define DCD 0x8000 /* Data carrier detect bit in msr */ - -#define TABSIZE 4 /* Tabs will expand to 4 chars upon input */ - -#define SAVE_LINES 4 /* Maximum number of lines to save */ -#define LINE_BUFSIZE 512 /* Size of line output buffer */ - -#define HIGH 8 /* High intensity attribute bit */ - - /* user_misc bits */ -#define ANSI (1<<0) /* user has ANSI capability */ -#define COLOR (1<<1) /* user has monochrome ANSI display */ -#define RIP (1<<2) /* RIP compatible terminal detected */ -#define WIP (1<<3) /* WIP compatible terminal detected */ - -#ifndef MAX_PATH - #ifdef MAXPATHLEN - #define MAX_PATH MAXPATHLEN /* clib.h */ - #elif defined PATH_MAX - #define MAX_PATH PATH_MAX - #elif defined _MAX_PATH - #define MAX_PATH _MAX_PATH - #else - #define MAX_PATH 260 - #endif -#endif - -#ifndef uchar /* Short-hand for unsigned data types */ -#define uchar unsigned char -#endif -#ifndef uint -#define uint unsigned int -#endif -#ifndef ushort -#define ushort unsigned short -#endif -#ifndef ulong -#define ulong unsigned long -#endif - - /* Valid bits for xsdk_mode */ -#define XSDK_MODE_NOCONSOLE (1<<0) /* No Local Console */ - - /* Bits in 'mode' for getkey and getstr */ -#define K_UPPER (1<<0) /* Converts all letters to upper case */ -#define K_UPRLWR (1<<1) /* Upper/Lower case automatically */ -#define K_NUMBER (1<<2) /* Allow numbers only */ -#define K_WRAP (1<<3) /* Allows word wrap */ -#define K_MSG (1<<4) /* Allows ANSI, ^N ^A ^G */ -#define K_SPIN (1<<5) /* Spinning cursor (same as SPIN) */ -#define K_LINE (1<<6) /* Input line (inverse color) */ -#define K_EDIT (1<<7) /* Edit string passed */ -#define K_CHAT (1<<8) /* In chat multi-chat */ -#define K_NOCRLF (1<<9) /* Don't print CRLF after string input */ -#define K_ALPHA (1<<10) /* Only allow alphabetic characters */ -#define K_AUTODEL (1<<11) /* Auto-delete text (used with K_EDIT) */ -#define K_LOWPRIO (1<<12) /* Low priority getstr() operation */ -#define K_GETSTR (1<<13) /* getkey() called from getstr() */ - - /* Miscellaneous Modem Settings (mdm_misc) */ -#define MDM_FLOWCTRL (1<<0) /* Use flow control with modem */ -#define MDM_STAYHIGH (1<<1) /* Stay at highest DTE rate */ - -#define LOOP_NOPEN 50 /* Retries before file access denied */ -#define LOOP_NODEDAB 100 /* Retries on NODE.DAB locking/unlocking */ - -#define MAX_NODES 250 /* Maximum number of nodes */ - -enum { /* Node Status */ - NODE_WFC /* Waiting for Call */ - ,NODE_LOGON /* at logon prompt */ - ,NODE_NEWUSER /* New user applying */ - ,NODE_INUSE /* In Use */ - ,NODE_QUIET /* In Use - quiet mode */ - ,NODE_OFFLINE /* Offline */ - ,NODE_NETTING /* Networking */ - ,NODE_EVENT_WAITING /* Waiting for all nodes to be inactive */ - ,NODE_EVENT_RUNNING /* Running an external event */ - ,NODE_EVENT_LIMBO /* Allowing another node to run an event */ - }; - - /* Bit values for node.misc */ -#define NODE_ANON (1<<0) /* Anonymous User */ -#define NODE_LOCK (1<<1) /* Locked for sysops only */ -#define NODE_INTR (1<<2) /* Interrupted - hang up */ -#define NODE_MSGW (1<<3) /* Message is waiting */ -#define NODE_POFF (1<<4) /* Page disabled */ -#define NODE_AOFF (1<<5) /* Activity Alert disabled */ -#define NODE_UDAT (1<<6) /* User data has been updated */ -#define NODE_RRUN (1<<7) /* Re-run this node when log off */ -#define NODE_EVENT (1<<8) /* Must run node event after log off */ -#define NODE_DOWN (1<<9) /* Down this node after logoff */ -#define NODE_RPCHT (1<<10) /* Reset private chat */ -#define NODE_NMSG (1<<11) /* Node message waiting (new way) */ - - -enum { /* Node Action */ - NODE_MAIN /* Main Prompt */ - ,NODE_RMSG /* Reading Messages */ - ,NODE_RMAL /* Reading Mail */ - ,NODE_SMAL /* Sending Mail */ - ,NODE_RTXT /* Reading G-Files */ - ,NODE_RSML /* Reading Sent Mail */ - ,NODE_PMSG /* Posting Message */ - ,NODE_AMSG /* Auto-message */ - ,NODE_XTRN /* Running External Program */ - ,NODE_DFLT /* Main Defaults Section */ - ,NODE_XFER /* Transfer Prompt */ - ,NODE_DLNG /* Downloading File */ - ,NODE_ULNG /* Uploading File */ - ,NODE_BXFR /* Bidirectional Transfer */ - ,NODE_LFIL /* Listing Files */ - ,NODE_LOGN /* Logging on */ - ,NODE_LCHT /* In Local Chat with Sysop */ - ,NODE_MCHT /* In Multi-Chat with Other Nodes */ - ,NODE_GCHT /* In Local Chat with Guru */ - ,NODE_CHAT /* In Chat Section */ - ,NODE_SYSP /* Sysop Activity */ - ,NODE_TQWK /* Transferring QWK packet */ - ,NODE_PCHT /* Private node-to-node chat */ - ,NODE_PAGE /* Paging node for Private Chat */ - ,NODE_RFSD /* Retrieving file from sequential dev */ - }; - - /* Different bits in node_misc */ -#define NM_ANSALARM (1<<0) /* Alarm locally on answer */ -#define NM_WFCSCRN (1<<1) /* Wait for call screen */ -#define NM_WFCMSGS (1<<2) /* Include total messages/files on WFC */ -#define NM_LCL_EDIT (1<<3) /* Use local editor to create messages */ -#define NM_EMSOVL (1<<4) /* Use expanded memory of overlays */ -#define NM_WINOS2 (1<<5) /* Use Windows/OS2 time slice API call */ -#define NM_INT28 (1<<6) /* Make int 28 DOS idle calls */ -#define NM_NODV (1<<7) /* Don't detect and use DESQview API */ -#define NM_NO_NUM (1<<8) /* Don't allow logons by user number */ -#define NM_LOGON_R (1<<9) /* Allow logons by user real name */ -#define NM_LOGON_P (1<<10) /* Secure logons (always ask for password) */ -#define NM_NO_LKBRD (1<<11) /* No local keyboard (at all) */ -#define NM_SYSPW (1<<12) /* Protect WFC keys and Alt keys with SY: */ -#define NM_NO_INACT (1<<13) /* No local inactivity alert/logoff */ -#define NM_NOBEEP (1<<14) /* Don't beep locally */ -#define NM_LOWPRIO (1<<15) /* Always use low priority input */ -#define NM_7BITONLY (1L<<16) /* Except 7-bit input only (E71 terminals) */ - -#if !defined(__COLORS) -#define __COLORS - - enum COLORS { - BLACK, /* dark colors */ - BLUE, - GREEN, - CYAN, - RED, - MAGENTA, - BROWN, - LIGHTGRAY, - DARKGRAY, /* light colors */ - LIGHTBLUE, - LIGHTGREEN, - LIGHTCYAN, - LIGHTRED, - LIGHTMAGENTA, - YELLOW, - WHITE - }; -#endif - -#ifndef BLINK -#define BLINK 128 /* blink bit */ -#endif - -#ifdef __WATCOMC__ - - - #define ffblk find_t - #define findfirst(x,y,z) _dos_findfirst(x,z,y) - #define findnext(x) _dos_findnext(x) - #pragma aux mswait "_*" -#endif - -/* Windows Types */ -#ifndef BYTE -#define BYTE uchar -#endif -#ifndef WORD -#define WORD ushort -#endif -#ifndef DWORD -#define DWORD ulong -#endif -#ifndef BOOL -#define BOOL int -#endif -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif -#ifndef HANDLE -#define HANDLE void* -#endif - -/****************************************************************************/ -/* MALLOC/FREE Macros for various compilers and environments */ -/* MALLOC is used for allocations of 64k or less */ -/* FREE is used to free buffers allocated with MALLOC */ -/* LMALLOC is used for allocations of possibly larger than 64k */ -/* LFREE is used to free buffers allocated with LMALLOC */ -/* REALLOC is used to re-size a previously MALLOCed or LMALLOCed buffer */ -/* FAR16 is used to create a far (32-bit) pointer in 16-bit compilers */ -/* HUGE16 is used to create a huge (32-bit) pointer in 16-bit compilers */ -/****************************************************************************/ -#if defined(__COMPACT__) || defined(__LARGE__) || defined(__HUGE__) - #define __16BIT__ - #define HUGE16 huge - #define FAR16 far - #if defined(__TURBOC__) - #define REALLOC(x,y) farrealloc(x,y) - #define LMALLOC(x) farmalloc(x) - #define MALLOC(x) farmalloc(x) - #define LFREE(x) farfree(x) - #define FREE(x) farfree(x) - #elif defined(__WATCOMC__) - #define REALLOC realloc - #define LMALLOC(x) halloc(x,1) /* far heap, but slow */ - #define MALLOC malloc /* far heap, but 64k max */ - #define LFREE hfree - #define FREE free - #else /* Other 16-bit Compiler */ - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free - #endif -#else /* 32-bit Compiler or Small Memory Model */ - #define HUGE16 - #define FAR16 - #define REALLOC realloc - #define LMALLOC malloc - #define MALLOC malloc - #define LFREE free - #define FREE free -#endif - -#define KEY_BUFSIZE 256 - -#define CRLF { outchar(CR); outchar(LF); } - -#define SYSOP (user_level>=sysop_level) /* Is current user sysop t/f macro */ - -#define bgotoxy(x,y) printf("\x1b[%d;%dH",y,x) /* place the cursor at */ - /* location x,y via ANSI */ - -#define SAVELINE { slatr[slcnt]=latr; \ - sprintf(slbuf[slcnt<SAVE_LINES ? slcnt++ : slcnt] \ - ,"%.*s",lbuflen,lbuf); \ - lbuflen=0; } -#define RESTORELINE { lbuflen=0; attr(slatr[--slcnt]); \ - bputs(slbuf[slcnt]); } - -#define pause bpause /* backwards compatibility with pre-3.1 XSDK */ - -/************/ -/* Typedefs */ -/************/ - -#ifdef _WIN32 /* necessary for compatibility with SBBS v2 */ -#pragma pack(push) -#pragma pack(1) -#endif - -#ifdef __GNUC__ - #define _PACK __attribute__ ((packed)) -#else - #define _PACK -#endif - -typedef struct _PACK { /* Node information kept in NODE.DAB */ - uchar status, /* Current Status of Node */ - errors, /* Number of Critical Errors */ - action; /* Action User is doing on Node */ - ushort useron, /* User on Node */ - connection, /* Connection rate of Node */ - misc, /* Miscellaneous bits for node */ - aux; /* Auxillary word for node */ - ulong extaux; /* Extended aux dword for node */ - } node_t; - -#ifdef _WIN32 -#pragma pack(pop) /* original packing */ -#endif - -#endif /* Don't add anything after this endif */ diff --git a/xtrn/sdk/xsdkinet.h b/xtrn/sdk/xsdkinet.h deleted file mode 100644 index b89bb28be6..0000000000 --- a/xtrn/sdk/xsdkinet.h +++ /dev/null @@ -1,107 +0,0 @@ -/* xsdkinet.h */ - -/* Synchronet platform-specific Internet stuff */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout xtrn * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XSDKINET_H -#define _XSDKINET_H - -/***************/ -/* OS-specific */ -/***************/ -#if defined _WIN32 || defined __OS2__ /* Use WinSock */ - -#include <winsock.h> /* socket/bind/etc. */ - -/* Let's agree on a standard WinSock symbol here, people */ -#ifndef _WINSOCKAPI_ -#define _WINSOCKAPI_ -#endif - -#elif defined __unix__ /* Unix-variant */ - -#include <netdb.h> /* gethostbyname */ -#include <netinet/in.h> /* IPPROTO_IP */ -#include <sys/socket.h> /* socket/bind/etc. */ -#include <sys/ioctl.h> /* FIONBIO */ -#include <sys/time.h> /* struct timeval */ -#include <arpa/inet.h> /* inet_ntoa */ -#include <unistd.h> /* close */ -#include <errno.h> /* errno */ - -#endif - -/**********************************/ -/* Socket Implementation-specific */ -/**********************************/ -#ifdef _WINSOCKAPI_ - -#undef EINTR -#define EINTR WSAEINTR -#undef ENOTSOCK -#define ENOTSOCK WSAENOTSOCK -#undef EWOULDBLOCK -#define EWOULDBLOCK WSAEWOULDBLOCK -#undef ECONNRESET -#define ECONNRESET WSAECONNRESET -#undef ECONNABORTED -#define ECONNABORTED WSAECONNABORTED - -#define s_addr S_un.S_addr - -#define socklen_t int - -#define ERROR_VALUE WSAGetLastError() - -#else /* BSD sockets */ - -/* WinSock-isms */ -#define HOSTENT struct hostent -#define SOCKADDR_IN struct sockaddr_in -#define LINGER struct linger -#define SOCKET int -#define SOCKET_ERROR -1 -#define INVALID_SOCKET (SOCKET)(~0) -#define closesocket close -#define ioctlsocket ioctl -#define ERROR_VALUE errno - -#endif /* __unix__ */ - -#ifndef SHUT_RDWR -#define SHUT_RDWR 2 /* for shutdown() */ -#endif - -#endif /* Don't add anything after this line */ diff --git a/xtrn/sdk/xsdkvars.c b/xtrn/sdk/xsdkvars.c deleted file mode 100644 index 9ffcccfadb..0000000000 --- a/xtrn/sdk/xsdkvars.c +++ /dev/null @@ -1,144 +0,0 @@ -/* xsdkvars.c */ - -/* Synchronet XSDK global variables */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout xtrn * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#include <time.h> -#include <stdio.h> -#include "xsdkinet.h" /* SOCKET */ -#include "xsdkdefs.h" - -#ifndef GLOBAL -#define GLOBAL -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -/*******************************/ -/* Global Variable Definitions */ -/*******************************/ -GLOBAL char lncntr; /* Line counter */ -GLOBAL char tos; /* Top of screen */ -GLOBAL uchar curatr; /* Current attribute */ -GLOBAL char mnehigh, /* Colors for mnemonics */ - mnelow; -GLOBAL uchar sys_nodes, /* Number of nodes on system */ - node_num; /* Current node number */ -GLOBAL ulong node_misc; /* Misc. node toggles */ -GLOBAL char sys_name[41], /* System name */ - sys_id[9], /* System QWK ID */ - sys_op[41], /* System operator name */ - sys_guru[41]; /* System guru name */ -GLOBAL ushort timeleft; /* Time left in seconds */ -GLOBAL char ctrl_dir[128], /* SBBS dirs */ - data_dir[128], - node_dir[128], - exec_dir[128], - text_dir[128], - temp_dir[128]; -GLOBAL uint user_number; /* User's number */ -GLOBAL char user_name[45], /* User's name/alias */ - user_misc, /* User's misc settings */ - user_rows, /* User's rows per screen */ - user_level, /* User's main level */ - user_flags1[27], /* User's flag set #1 */ - user_flags2[27], /* User's flag set #2 */ - user_flags3[27], /* User's flag set #3 */ - user_flags4[27], /* User's flag set #4 */ - user_exempt[27], /* User's exemptions */ - user_rest[27], /* User's restrictions */ - user_sex, /* User's sex */ - user_birth[9], /* User's birthday */ - user_phone[13], /* User's phone number */ - user_address[31], /* User's address */ - user_location[31], /* User's location */ - user_zipcode[11], /* User's zip/postal code */ - user_realname[26]; /* User's real name or company name */ -GLOBAL ulong user_cdt, /* User's credits */ - user_dce; /* User's DCE rate */ -GLOBAL time_t user_expire; /* User's expiration date */ - - /* COM port registers: */ -GLOBAL uint com_base, /* COM base address */ - com_irq; /* irq line number */ -GLOBAL ulong com_rate; /* DTE rate in bps */ -GLOBAL char com_port; /* Number of COM port */ - - /* Modem command strings */ -GLOBAL char mdm_init[64], /* Initialization */ - mdm_spec[64], /* Special Initialization */ - mdm_term[64], /* Terminal Initialization String */ - mdm_dial[64], /* Dial */ - mdm_offh[64], /* Off hook */ - mdm_answ[64], /* Answer */ - mdm_misc; /* Misc bits used for flags */ - -GLOBAL time_t starttime; /* Start time-stamp */ -GLOBAL char wordwrap[81]; /* Wordwrap buffer */ -GLOBAL uint sec_warn, /* Seconds till inactivity warning */ - sec_timeout; /* Seconds till disconnect */ -GLOBAL char timeleft_warn; /* Minutes left warning */ - -GLOBAL int nodefile; /* File descriptor for NODE.DAB */ - -GLOBAL char slbuf[SAVE_LINES][LINE_BUFSIZE+1]; /* Saved for redisplay */ -GLOBAL char slatr[SAVE_LINES]; /* Starting attribute of each line */ -GLOBAL char slcnt; /* Number of lines currently saved */ -GLOBAL char lbuf[LINE_BUFSIZE];/* Temp storage for each line output */ -GLOBAL int lbuflen; /* Number of characters in line buffer */ -GLOBAL char latr; /* Starting attribute of line buffer */ -GLOBAL uint inDV; /* DESQview version if running under DV */ -GLOBAL int keybuftop,keybufbot; /* Keyboard input buffer pointers */ -GLOBAL char keybuf[KEY_BUFSIZE]; /* Keyboard input buffer */ -GLOBAL uint FAR16 *msr; /* Last modem status register contents */ -GLOBAL char **xtrn; /* List of external program names */ -GLOBAL uint total_xtrns; /* Total number of external programs */ -GLOBAL uchar lastnodemsg; /* Last node to send a message to */ -GLOBAL uchar name_len; /* Length of name field in NAME.DAT */ -GLOBAL char aborted; /* Aborted flag - if ctrl-c hit */ -GLOBAL char sysop_level; /* Sysop Level */ -GLOBAL FILE *con_fp; /* Console file pointer (stdout/stderr) */ - -#ifndef __16BIT__ /* Sockets */ - -GLOBAL SOCKET client_socket; - -#endif - -#ifdef __cplusplus - } -#endif diff --git a/xtrn/sdk/xsdkwrap.c b/xtrn/sdk/xsdkwrap.c deleted file mode 100644 index c929aa5a67..0000000000 --- a/xtrn/sdk/xsdkwrap.c +++ /dev/null @@ -1,483 +0,0 @@ -/* xsdkwrap.c */ - -/* Synchronet XSDK system-call wrappers (compiler & platform portability) */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout xtrn * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -/* OS-specific */ -#if defined(_WIN32) - - #include <windows.h> /* DWORD */ - -#elif defined(__unix__) - - #include <glob.h> /* glob() wildcard matching */ - #include <string.h> /* strlen() */ - #include <unistd.h> /* getpid() */ - #include <fcntl.h> /* fcntl() file/record locking */ - #include <stdlib.h> - #include <unistd.h> - #include <termios.h> - #ifdef __FreeBSD__ - #include <sys/kbio.h> - #else - #include <sys/kd.h> - #endif - #include <sys/time.h> - #include <sys/types.h> - #include <signal.h> - -#endif - -/* ANSI */ -#include <sys/types.h> /* _dev_t */ -#include <sys/stat.h> /* struct stat */ - -/* XSDK-specific */ -#include "xsdkdefs.h" /* MAX_PATH */ -#include "xsdkwrap.h" /* Verify prototypes */ - -#ifdef _WIN32 -#define stat(f,s) _stat(f,s) -#define STAT struct _stat -#else -#define STAT struct stat -#endif - -#ifdef __unix__ - -/****************************************************************************/ -/* Wrapper for Win32 create/begin thread function */ -/* Uses POSIX threads */ -/****************************************************************************/ -#ifdef _POSIX_THREADS -ulong _beginthread(void( *start_address )( void * ) - ,unsigned stack_size, void *arglist) -{ - pthread_t thread; - pthread_attr_t attr; - - pthread_attr_init(&attr); /* initialize attribute structure */ - - /* set thread attributes to PTHREAD_CREATE_DETACHED which will ensure - that thread resources are freed on exit() */ - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - - if(pthread_create(&thread - ,&attr /* default attributes */ - /* POSIX defines this arg as "void *(*start_address)" */ - ,(void *) start_address - ,arglist)==0) - return((int) thread /* thread handle */); - - return(-1); /* error */ -} -#else - -#error "Need _beginthread implementation for non-POSIX thread library." - -#endif - -/****************************************************************************/ -/* Convert ASCIIZ string to upper case */ -/****************************************************************************/ -char* strupr(char* str) -{ - char* p=str; - - while(*p) { - *p=toupper(*p); - p++; - } - return(str); -} -/****************************************************************************/ -/* Convert ASCIIZ string to lower case */ -/****************************************************************************/ -char* strlwr(char* str) -{ - char* p=str; - - while(*p) { - *p=tolower(*p); - p++; - } - return(str); -} - -/****************************************************************************/ -/* Reverse chars in string */ -/****************************************************************************/ -char* strrev(char* str) -{ - char t, *i=str, *j=str+strlen(str); - - while (i<j) { - t=*i; *(i++)=*(--j); *j=t; - } - return str; -} - -/* This is a bit of a hack, but it works */ -char* _fullpath(char* absPath, const char* relPath, size_t maxLength) -{ - char *curdir = (char *) malloc(MAX_PATH+1); - - if(curdir == NULL) { - strcpy(absPath,relPath); - return(absPath); - } - - getcwd(curdir, MAX_PATH); - if(chdir(relPath)!=0) /* error, invalid dir */ - strcpy(absPath,relPath); - else { - getcwd(absPath, maxLength); - chdir(curdir); - } - free(curdir); - - return absPath; -} - -/***************************************/ -/* Console I/O Stuff (by Casey Martin) */ -/***************************************/ - -static struct termios current; // our current term settings -static struct termios original; // old termios settings -static struct timeval timeout = {0, 0}; // passed in select() call -static fd_set inp; // ditto -static int beensetup = 0; // has _termios_setup() been called? - - -/* Resets the termios to its previous state */ -void _termios_reset(void) -{ - tcsetattr(0, TCSANOW, &original); -} - -/************************************************ - This pair of functions handles Ctrl-Z presses -************************************************/ - -void _sighandler_stop(int sig) -{ - // clean up the terminal - _termios_reset(); - - // ... and stop - kill(getpid(), SIGSTOP); -} - -void _sighandler_cont(int sig) -{ - // restore terminal - tcsetattr(0, TCSANOW, ¤t); -} - - -/* Prepares termios for non-blocking action */ -void _termios_setup(void) -{ - beensetup = 1; - - tcgetattr(0, &original); - - memcpy(¤t, &original, sizeof(struct termios)); - current.c_cc[VMIN] = 1; // read() will return with one char - current.c_cc[VTIME] = 0; // read() blocks forever - current.c_lflag &= ~ICANON; // character mode - current.c_lflag &= ~ECHO; // turn off echoing - tcsetattr(0, TCSANOW, ¤t); - - // Let's install an exit function, also. This way, we can reset - // the termios silently - atexit(_termios_reset); - - // install the Ctrl-Z handler - signal(SIGSTOP, _sighandler_stop); - signal(SIGCONT, _sighandler_cont); -} - - -int kbhit(void) -{ - if(!isatty(0)) - return(0); - - // set up select() args - FD_ZERO(&inp); - FD_SET(0, &inp); - - return select(1, &inp, NULL, NULL, &timeout); -} - -int getch(void) -{ - char c; - - if (!beensetup) - // I hate to test for this every time, but this shouldn't be - // called that often anyway... - _termios_setup(); - - // get a char out of stdin - read(0, &c, 1); - - return c; -} - -#endif // __unix__ - -/**************/ -/* File Stuff */ -/**************/ - -/****************************************************************************/ -/* Returns the length of the file in 'filename' */ -/****************************************************************************/ -long flength(char *filename) -{ - STAT st; - - if(stat(filename, &st)!=0) - return(-1L); - - return(st.st_size); -} - -/****************************************************************************/ -/* Checks the file system for the existence of one or more files. */ -/* Returns TRUE if it exists, FALSE if it doesn't. */ -/* 'filespec' may contain wildcards! */ -/****************************************************************************/ -BOOL fexist(char *filespec) -{ -#ifdef _WIN32 - - long handle; - struct _finddata_t f; - - if((handle=_findfirst(filespec,&f))==-1) - return(FALSE); - - _findclose(handle); - - if(f.attrib&_A_SUBDIR) - return(FALSE); - - return(TRUE); - -#elif defined(__unix__) /* portion by cmartin */ - - glob_t g; - int c; - int l; - - // start the search - glob(filespec, GLOB_MARK | GLOB_NOSORT, NULL, &g); - - if (!g.gl_pathc) { - // no results - globfree(&g); - return FALSE; - } - - // make sure it's not a directory - c = g.gl_pathc; - while (c--) { - l = strlen(g.gl_pathv[c]); - if (l && g.gl_pathv[c][l-1] != '/') { - globfree(&g); - return TRUE; - } - } - - globfree(&g); - return FALSE; - -#else - -#warning "fexist() port needs to support wildcards!" - - return(FALSE); - -#endif -} - -#if defined(__unix__) - -/****************************************************************************/ -/* Returns the length of the file in 'fd' */ -/****************************************************************************/ -long filelength(int fd) -{ - STAT st; - - if(fstat(fd, &st)!=0) - return(-1L); - - return(st.st_size); -} - -/* Sets a lock on a portion of a file */ -int lock(int fd, long pos, int len) -{ - int flags; - struct flock alock; - - if((flags=fcntl(fd,F_GETFL))<0) - return -1; - - if(flags==O_RDONLY) - alock.l_type = F_RDLCK; // set read lock to prevent writes - else - alock.l_type = F_WRLCK; // set write lock to prevent all access - alock.l_whence = L_SET; // SEEK_SET - alock.l_start = pos; - alock.l_len = len; - - return fcntl(fd, F_SETLK, &alock); -} - -/* Removes a lock from a file record */ -int unlock(int fd, long pos, int len) -{ - struct flock alock; - - alock.l_type = F_UNLCK; // remove the lock - alock.l_whence = L_SET; - alock.l_start = pos; - alock.l_len = len; - return fcntl(fd, F_SETLK, &alock); -} - -/* Opens a file in specified sharing (file-locking) mode */ -int sopen(char *fn, int access, int share) -{ - int fd; - struct flock alock; - - if ((fd = open(fn, access, S_IREAD|S_IWRITE)) < 0) - return -1; - - if (share == SH_DENYNO) - // no lock needed - return fd; - - alock.l_type = share; - alock.l_whence = L_SET; - alock.l_start = 0; - alock.l_len = 0; // lock to EOF - -#if 0 - /* The l_pid field is only used with F_GETLK to return the process - ID of the process holding a blocking lock. */ - alock.l_pid = getpid(); -#endif - - if (fcntl(fd, F_SETLK, &alock) < 0) { - close(fd); - return -1; - } - - return fd; -} - -#elif defined _MSC_VER || defined __MINGW32__ - -#include <io.h> /* tell */ -#include <stdio.h> /* SEEK_SET */ -#include <sys/locking.h> /* _locking */ - -/* Fix MinGW locking.h typo */ -#if defined LK_UNLOCK && !defined LK_UNLCK - #define LK_UNLCK LK_UNLOCK -#endif - -int lock(int file, long offset, int size) -{ - int i; - long pos; - - pos=tell(file); - if(offset!=pos) - lseek(file, offset, SEEK_SET); - i=_locking(file,LK_NBLCK,size); - if(offset!=pos) - lseek(file, pos, SEEK_SET); - return(i); -} - -int unlock(int file, long offset, int size) -{ - int i; - long pos; - - pos=tell(file); - if(offset!=pos) - lseek(file, offset, SEEK_SET); - i=_locking(file,LK_UNLCK,size); - if(offset!=pos) - lseek(file, pos, SEEK_SET); - return(i); -} - -#endif /* !Unix && (MSVC || MinGW) */ - -/****************************************************************************/ -/* Return ASCII string representation of ulong */ -/* There may be a native GNU C Library function to this... */ -/****************************************************************************/ -#if !defined _MSC_VER && !defined __BORLANDC__ -char* ultoa(unsigned long val, char* str, int radix) -{ - switch(radix) { - case 8: - sprintf(str,"%lo",val); - break; - case 10: - sprintf(str,"%lu",val); - break; - case 16: - sprintf(str,"%lx",val); - break; - default: - sprintf(str,"bad radix: %d",radix); - break; - } - return(str); -} -#endif diff --git a/xtrn/sdk/xsdkwrap.h b/xtrn/sdk/xsdkwrap.h deleted file mode 100644 index af811ab268..0000000000 --- a/xtrn/sdk/xsdkwrap.h +++ /dev/null @@ -1,250 +0,0 @@ -/* xsdkwrap.h */ - -/* Synchronet XSDK system-call wrappers */ - -/* $Id$ */ - -/**************************************************************************** - * @format.tab-size 4 (Plain Text/Source Code File Header) * - * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * - * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public License * - * as published by the Free Software Foundation; either version 2 * - * of the License, or (at your option) any later version. * - * See the GNU Lesser General Public License for more details: lgpl.txt or * - * http://www.fsf.org/copyleft/lesser.html * - * * - * Anonymous FTP access to the most recent released source is available at * - * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net * - * * - * Anonymous CVS access to the development source and modification history * - * is available at cvs.synchro.net:/cvsroot/sbbs, example: * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs login * - * (just hit return, no password is necessary) * - * cvs -d :pserver:anonymous@cvs.synchro.net:/cvsroot/sbbs checkout xtrn * - * * - * For Synchronet coding style and modification guidelines, see * - * http://www.synchro.net/source.html * - * * - * You are encouraged to submit any modifications (preferably in Unix diff * - * format) via e-mail to mods@synchro.net * - * * - * Note: If this box doesn't appear square, then you need to fix your tabs. * - ****************************************************************************/ - -#ifndef _XSDKWRAP_H -#define _XSDKWRAP_H - -/*********************/ -/* Compiler-specific */ -/*********************/ - -/* Compiler Description */ -#if defined(__BORLANDC__) - - #define COMPILER_DESC(str) sprintf(str,"BCC %X.%02X" \ - ,__BORLANDC__>>8,__BORLANDC__&0xff); - -#elif defined(_MSC_VER) - - #define COMPILER_DESC(str) sprintf(str,"MSC %u", _MSC_VER); - -/*** -#elif defined(__GNUC__) && defined(__GLIBC__) - - #define COMPILER_DESC(str) sprintf(str,"GCC %u.%02u (GLIBC %u.%u)" \ - ,__GNUC__,__GNUC_MINOR__,__GLIBC__,__GLIBC_MINOR__); -***/ - -#elif defined(__GNUC__) - - #define COMPILER_DESC(str) sprintf(str,"GCC %u.%02u" \ - ,__GNUC__,__GNUC_MINOR__); - -#else /* Unknown compiler */ - - #define COMPILER_DESC(str) strcpy(str,"UNKNOWN COMPILER"); - -#endif - -#if defined(__unix__) - #define BACKSLASH '/' -#else /* MS-DOS based OS */ - #define BACKSLASH '\\' -#endif - -/* Target Platform Description */ -#if defined(_WIN32) - #define PLATFORM_DESC "Win32" -#elif defined(__OS2__) - #define PLATFORM_DESC "OS/2" -#elif defined(__MSDOS__) - #define PLATFORM_DESC "DOS" -#elif defined(__linux__) - #define PLATFORM_DESC "Linux" -#elif defined(__FreeBSD__) - #define PLATFORM_DESC "FreeBSD" -#elif defined(BSD) - #define PLATFORM_DESC "BSD" -#elif defined(__unix__) - #define PLATFORM_DESC "Unix" -#else - #warning "Need to describe target platform" - #define PLATFORM_DESC "UNKNOWN" -#endif - -#if defined(__unix__) - - int kbhit(void); - int getch(void); - #define ungetch(x) /* !need a wrapper for this */ - -#else /* DOS-Based */ - - #include <conio.h> - -#endif - -#if defined(_WIN32) - - #include <io.h> /* _sopen */ - #include <sys/stat.h> /* S_IREAD */ - #include <fcntl.h> /* O_BINARY */ - #include <windows.h> /* OF_SHARE_ */ - - #define sopen(f,o,s) _sopen(f,o,s,S_IREAD|S_IWRITE) - #define close(f) _close(f) - - #ifndef SH_DENYNO - #define SH_DENYNO OF_SHARE_DENY_NONE - #define SH_DENYWR OF_SHARE_DENY_WRITE - #define SH_DENYRW OF_SHARE_EXCLUSIVE - #endif - #ifndef O_DENYNONE - #define O_DENYNONE SH_DENYNO - #endif - -#elif defined(__unix__) - - #include <fcntl.h> - - #define O_BINARY 0 /* all files in binary mode on Unix */ - #define O_DENYNONE (1<<31) /* req'd for Baja/nopen compatibility */ - - #define SH_DENYNO 2 // no locks - #define SH_DENYRW F_WRLCK // exclusive lock - #define SH_DENYWR F_RDLCK // shareable lock - - #define stricmp(x,y) strcasecmp(x,y) - #define strnicmp(x,y,z) strncasecmp(x,y,z) - #define chsize(fd,size) ftruncate(fd,size) - -#endif - -#ifdef __unix__ - - #include <pthread.h> /* POSIX threads and mutexes */ - #include <semaphore.h> /* POSIX semaphores */ - unsigned long _beginthread(void( *start_address )( void * ) - ,unsigned stack_size, void *arglist); - -#elif defined(_WIN32) - - #include <process.h> /* _beginthread() */ - - /* POSIX semaphores */ - typedef HANDLE sem_t; - #define sem_init(psem,ps,v) ResetEvent(*(psem)) - #define sem_wait(psem) WaitForSingleObject(*(psem),INFINITE) - #define sem_post(psem) SetEvent(*(psem)) - #define sem_destroy(psem) CloseHandle(*(psem)) - - /* POIX mutexes */ - typedef HANDLE pthread_mutex_t; - #define pthread_mutex_init(pmtx,v) *(pmtx)=CreateMutex(NULL,FALSE,NULL) - #define pthread_mutex_lock(pmtx) WaitForSingleObject(*(pmtx),INFINITE) - #define pthread_mutex_unlock(pmtx) ReleaseMutex(*(pmtx)) - #define pthread_mutex_destroy(pmtx) CloseHandle(*(pmtx)) - - -#elif defined(__MSDOS__) - - /* No semaphores */ - -#else - - #warning "Need semaphore wrappers." - -#endif - - -#if defined(_WIN32) - - #define mswait(x) Sleep(x) - -#elif defined(__OS2__) - - #define mswait(x) DosSleep(x) - -#elif defined(__unix__) - - #define mswait(x) usleep(x*1000) - #define _mkdir(dir) mkdir(dir,0777) - #define _rmdir(dir) rmdir(dir) - #define tell(fd) lseek(fd,0,SEEK_CUR) - - int sopen(char *fn, int access, int share); - long filelength(int fd); - char* strupr(char* str); - char* strlwr(char* str); - - char* strrev(char* str); - char* _fullpath(char* absPath, const char* relPath - ,size_t maxLength); - -#elif defined(__MSDOS__) - - void mswait(int ms); /* Wait a specific number of milliseconds */ - -#else /* Unsupported OS */ - - #warning "Unsupported Target: Need some macros of function prototypes here." - -#endif - -#ifndef BOOL - #define BOOL int -#endif -#ifndef TRUE - #define TRUE 1 - #define FALSE 0 -#endif - -/**************/ -/* Prototypes */ -/**************/ - -#ifdef __cplusplus -extern "C" { -#endif - -#if !defined(__BORLANDC__) - int lock(int fd, long pos, int len); - int unlock(int fd, long pos, int len); -#endif - -#if !defined(_MSC_VER) && !defined(__BORLANDC__) - char* ultoa(unsigned long val, char* str, int radix); -#endif - -BOOL fexist(char *filespec); -long flength(char *filename); - -#ifdef __cplusplus -} -#endif - -#endif /* Don't add anything after this line */ diff --git a/xtrn/smm/adult.que b/xtrn/smm/adult.que deleted file mode 100644 index dd10f2f4c8..0000000000 --- a/xtrn/smm/adult.que +++ /dev/null @@ -1,93 +0,0 @@ -20 -How old were you when you lost your virginity? -9 -1 -I still have it -Younger than 12 -Between 12 and 14 -Between 15 and 16 -Between 17 and 18 -Between 19 and 20 -Between 21 and 25 -Between 25 and 30 -Older than 30 -How many sexual partners have you had? -8 -1 -None -Between 1 and 5 -Between 6 and 10 -Between 11 and 20 -Between 21 and 30 -Between 31 and 50 -Between 51 and 100 -More than 100 -When engaged in a relationship, how often do you prefer to have sex? -8 -1 -Never -At least once a day -Between 4 and 6 times a week -Between 1 and 3 times a week -Between 1 and 3 times a month -Between 6 and 11 times a year -Between 1 and 5 times a year -Less than once a year -What form of sexually transmitted disease protection do you prefer? -5 -1 -I don't know -Abstinence -No protection -Male condoms -Female condoms -Do you enjoy oral sex? -5 -1 -I don't know -No -Yes, giving -Yes, receiving -Yes, both giving and receiving -Do you enjoy anal sex? -5 -1 -I don't know -No -Yes, giving -Yes, receiving -Yes, both giving and receiving -How often do you masturbate? -8 -1 -At least once a day -Between 4 and 6 times a week -Between 1 and 3 times a week -Between 1 and 3 times a month -Between 6 and 11 times a year -Between 1 and 5 times a year -Less than once a year -Never -Do you reach orgasm (alone or with a partner)? -5 -1 -I don't know -Yes, always -Yes, occasionally -Yes, rarely -No -Have you had sexual partners of your same gender? -6 -1 -I don't know -Yes, always -Yes, occasionally -Yes, rarely -No, but I'm curious -No, never -Do you shave your pubic area? -3 -1 -Yes, all of it -Yes, some of it -No diff --git a/xtrn/smm/appear.que b/xtrn/smm/appear.que deleted file mode 100644 index b7b1b7ea02..0000000000 --- a/xtrn/smm/appear.que +++ /dev/null @@ -1,119 +0,0 @@ -8 -Do you wear any of the following? -16 -16 -Eye glasses -Partial beard (goatee, five o'clock shadow, etc.) -Full beard -Mustache -Side burns -Earring(s) -Make-up -Body piercing (nose, tongue, naval, eyebrow, etc.) -Visible tatoos -Covered tatoos -Unnaturally colored/bleached hair (blue, purple, pink, etc.) -Brades or dreds -Pony tail -Long fingernails -Painted fingernails -None of the above -Larger than average or smaller than average attributes? -16 -8 -Small eyes -Large eyes -Small ears -Large ears -Small nose -Large nose -Small breasts -Large breasts -Large arms -Large legs -Large hips/buttocks -Thin-lips -Thick-lips -Thin eyebrows -Thick eyebrows -None of the above -Do you have a sun-tan? -5 -1 -No, I'm naturally dark -No, but I will this summer -No, I don't try to tan -No, I always burn -Yes -Your (natural) complexion? -9 -3 -Very dark -Medium dark (olive) -Light dark -White -Whiter than white (alabaster) -Sparse freckles -Dense freckles -Mild acne -Cystic acne -Your hair (on your head)? -16 -5 -Gone (bald) -Thin (balding) -Thinner than average -Average thickness -Thicker than average -Feathered -All one length -Curly -Wavy -Straight -Partially shaved -Completely shaved -Short length -Medium length -Long length -Very long length -Your teeth? -11 -4 -Very white -Average whiteness -Slightly stained (smoke, coffee, etc.) -Very stained (smoke, coffee, etc.) -Very straight -Average straightness -Slightly crooked -Very crooked -Visible missing teeth -Visible caps (gold or silver) -Visible braces -Your build? -6 -1 -Thin, wirey -Thin, but toned -Average -Chunky -Stocky -Muscle-bound -Physical disabilities/deformities? -14 -5 -Missing fingers -Gimpy or missing limbs -Scarred face -Scarred arms or hands -Mongloidian eyes -Lazy/cross/cock-eyed -Cleft pallette -Paraplegic -Quadriplegic -Blind -Deaf -Mute -Other -None - diff --git a/xtrn/smm/basic.que b/xtrn/smm/basic.que deleted file mode 100644 index aaf3634eb0..0000000000 --- a/xtrn/smm/basic.que +++ /dev/null @@ -1,179 +0,0 @@ -17 -What is your religious belief? -9 -1 -Christian -Jewish -Catholic -Buddihst -Muslim -Mormon -Jehovah's Witness -Other -None -Do you participate in organized religion? -3 -1 -Yes -No -Sometimes -Do you smoke tobacco? -5 -1 -Yes, daily -Yes, occasionally -Yes, I'm trying to quit -No, I quit -No, I never smoked tobacco regularly -Do you use forms of nicotine other than tobacco (dip, snuff, etc)? -5 -1 -Yes, daily -Yes, occasionally -Yes, I'm trying to quit -No, I quit -No, never -Do you drink alcohol? -6 -1 -Yes, daily -Yes, occasionally -Yes, but never enough to get drunk -Yes, I'm trying to quit -No, I quit -No, I never drank -Do you dance? -7 -1 -Yes, professionally (exotic) -Yes, professionally (tame) -Yes, regularly -Yes, occasionally -Yes, rarely -No, not recently -No, not ever -Favorite types of music? -16 -16 -Easy Listening -New Age -Classical -Classic Rock -Heavy Metal -Punk Rock -Alternative -Industrial -Techno -Pop -Rap -Disco -Rhthym and Blues -Jazz -Folk -Country and Western -Completed education? -7 -6 -Grade school -High school -Trade school -College (Associate's) -College (Bachelor's) -College (Master's) -None -Are you currently enrolled in school? -8 -1 -Yes, grade school -Yes, high school -Yes, trade school -Yes, city college -Yes, state college -No, but I plan to return -No, but I plan to start -No, and I have no plans to -Are you currently employed? -4 -1 -Yes, full-time -Yes, part-time -No, but I'm seeking employment -No, I don't need/want to work right now -Are you financially independant? -5 -1 -Yes -No, I depend on my parent(s) -No, I depend on other relative(s) -No, I depend on my spouse -No, I depend on a significant other -Do you play sports? -5 -1 -Yes, professionally -Yes, frequently -Yes, occasionally -Yes, rarely -No -Do you do any recreational reading? -4 -1 -Yes, frequently -Yes, occasionally -Yes, rarely -No -Favorite out-door activities? -16 -16 -Water (swimming, skiing, surfing, etc.) -Snow (skiing, boarding, ice skating, etc.) -Hiking/camping/climbing -Roller skating/blading -Bicycling -Running/jogging/walking -Team sports (baseball, basketball, football, soccer, etc.) -Racket sports (tennis, racquetball, badminton, etc.) -Golf -Shooting (firearms, archery, etc.) -Off-road (motorcycles, ATVs, etc.) -Sky diving/bungee jumping -Gardening -Fishing/hunting -Horseback riding -None of the above -Favorite in-home activities? -16 -16 -Painting/drawing/sculpting/etc. -Sewing/weaving/etc. -Cooking -Writing -Reading -Playing a musical instrument/singing -Playing video/computer games -Playing card/board games -Cleaning -Computer programming/exploring -BBS/E-mail/Internet communications -CB/HAM/shortwave radio communications -Electronics/chemistry/physics experiments -Talking on the telephone -Watching television -Listening to music (CDs, records, tapes, radio, etc.) -Do you have any children? -6 -1 -Yes, three or more -Yes, two -Yes, one -No, but definitely someday -No, but possibly someday -No, I don't ever want children -What kind of relationship are you seeking? -5 -5 -Platonic friendship (no intimacy) -Dating (no commitment) -Long term relationship (boyfriend/girlfriend/lover) -Marriage -None of the above diff --git a/xtrn/smm/file_id.diz b/xtrn/smm/file_id.diz deleted file mode 100644 index 5b423d7a3f..0000000000 --- a/xtrn/smm/file_id.diz +++ /dev/null @@ -1,7 +0,0 @@ -Synchronet Match Maker (BBS door) v2.10 -supports any DOOR.SYS or Synchronet BBS. -Internationally networked profiles, -telegrams, wall, photographs, and more! -Developed by Digital Dynamics, makers of -Synchronet BBS Software. Perhaps the most -comprehensive match maker available. diff --git a/xtrn/smm/list_hdr.asc b/xtrn/smm/list_hdr.asc deleted file mode 100644 index 182a1298dd..0000000000 --- a/xtrn/smm/list_hdr.asc +++ /dev/null @@ -1,5 +0,0 @@ -nh���Marital Status or Orientation (Single, Married, Divorced, Widowed, etc) -�ng��Race (White, Black, Hispanic, Indian, Middle Eastern, Asian, or Other) -hw�ng�hc�Sex m �Eyes y�Weight -w�ng�hc�bAge gHairm� rHeighty� ng�Location cPhoto�hw�Name/Alias mMatch� -w�ng�hc� b� g� m� r� y�ng � c�hw�m � diff --git a/xtrn/smm/material.que b/xtrn/smm/material.que deleted file mode 100644 index 2de521f015..0000000000 --- a/xtrn/smm/material.que +++ /dev/null @@ -1,91 +0,0 @@ -16 -Do you own a passenger vehicle? -5 -1 -Yes, more than one -Yes -No, but I will soon -No, and I don't know when/if I will -No, I don't have a driver's license -Do you own a recreational vehicle? -2 -1 -Yes -No -Do you own a home (mortage counts)? -4 -1 -Yes, more than one -Yes -No, I'm renting -No -Do you own furniture? -3 -1 -Yes -No, I'm renting -No -Do you own a computer? -4 -1 -Yes, more than one -Yes -No, I'm renting -No -Do you have a savings account? -2 -1 -Yes -No -Do you have a checking account? -2 -1 -Yes -No -Do you have a credit card? -3 -1 -Yes, more than one -Yes -No -Do you have health insurance? -2 -1 -Yes -No -Do you have life insurance? -2 -1 -Yes -No -Do you have car insurance? -2 -1 -Yes -No -Do you have an accountant? -2 -1 -Yes -No -Do you have a maid? -2 -1 -Yes -No -Do you own a swimming pool (i.e. in your backyard)? -2 -1 -Yes -No -Do you own an acre or more of land? -2 -1 -Yes -No -Do you own any stocks or bonds? -2 -1 -Yes -No - diff --git a/xtrn/smm/mb-e.asc b/xtrn/smm/mb-e.asc deleted file mode 100644 index 2b612f78b2..0000000000 --- a/xtrn/smm/mb-e.asc +++ /dev/null @@ -1,7 +0,0 @@ -An Extrovert is energized by people. A strong extrovert feels very much alone -without lots of people around. E's tend to talk first & think later, know a -lot of people, don't mind having a conversation while the TV is on, are -approachable, don't consider the telephone to be an interruption, tend to -think out loud and use people as a sounding board for their ideas, need -affirmation from friends about who I am & how do I look. -About 75% of the population are type E. diff --git a/xtrn/smm/mb-enfj.asc b/xtrn/smm/mb-enfj.asc deleted file mode 100644 index 7dadc77fe7..0000000000 --- a/xtrn/smm/mb-enfj.asc +++ /dev/null @@ -1,134 +0,0 @@ -ENFJs in short: - -Responsive and responsible. Generally feel real concern for what -others think or want, and try to handle things with due regard for -other person's feelings. Can present a proposal or lead a group -discussion with ease and tact. Sociable, popular, sympathetic. -Responsive to praise and criticism. - -About 5% of the population. - -Details about ENFJs: - -ENFJs are outstanding leaders of groups, both task groups and -growth groups. They have the charming characteristic of seeming to -take for granted that they will be followed, never doubting that -people will want to do what they suggest. And, more often than -not, people do, because this type of has unusual charisma. ENFJs -place a high value on cooperation from others and are most willing -to cooperate themselves. - -Found in only about 5 percent of the general population, ENFJs -place people as being of highest importance and priority. As a -result, ENFJs may find themselves feeling responsible for the -feelings of others to an extent which places a burden on the -relationship. - -An ENFJ communicates caring, concern, and a willingness to be -involved. Thus people turn to ENFJs for nurture and support, which -an ENFJ is usually able to deliver. At times, however, these kinds -of demands can overwhelm ENFJs, who find at this point that they -lack the skills to dissociate. ENFJs do not seem able to turn away -from these demands even when they become unreasonable. Or, if -forced to let go of the burden through sheer unavailability of time -or energy, ENFJs experience a guilt all out of proportion to the -realities of the commitment to the relationship. - -ENFJs are vulnerable to idealize interpersonal relationships, -raising these relationships to a plane which seldom can sustain the -realities of human nature. Because of this tendency to raise -interpersonal relations to the ideal, ENFJs may unwittingly -overpower their friends, who believe that they cannot possibly live -up to an ENFJ's perception of them. The fact is, ENFJs are -extraordinarily tolerant of others, seldom critical, and always -trustworthy. - -ENFJs take communication for granted and believe that they are -understood and that their communications are accepted. Just as -they themselves are accepting, so do they assume that others are -the same. When ENFJs find that their position or beliefs were not -comprehended or accepted, they are surprised, puzzled, and -sometimes hurt. Fortunately, this does not happen with high -frequency, as ENFJs have a remarkable fluency with language, -especially in speech; they are particularly adept when -communicating face-to-face as opposed to communicating in writing. - -They are influential, therefore, in groups, having no hesitation -about speaking out, no matter how large or small the group may be. - -ENFJs have an unusual ability to relate to others with empathy, -taking into themselves the characteristics, emotions, and beliefs -of others. This can pose a danger for ENFJs, they can -unconsciously over-identify with others and pick up their burdens -as if they were their own. In the process, ENFJs may risk their -own sense of identity. - -They have a natural ability to mimic because of this highly -developed ability to empathize by interjection. They are likely to -be very concerned about the problems of those close to them, but -they also may get as deeply involved in the problems of those not -so close and may find themselves overextended emotionally. - -ENFJs would do well to follow their hunches, for their intuition -tends to be well developed. Decisions made purely on the basis of -logic may not be so sound, and checking with a person who has a -strong T preference might be at times advisable for the ENFJ. In -the framework of values, however, the ENFJ is on certain ground. -Generally, they know what they prefer and can read other people -with outstanding accuracy. Seldom is an ENFJ wrong about the -motivations or intents of another, hidden or not. - -ENFJs are socially adept and make excellent companions and mates. -They also are deeply devoted to their children, yet tend not to be -domineering to either the children or a mate. In fact, the ENFJ is -so even-tempered that he or she can be victimized by a mate who -might have become more than demanding. - -ENFJ mates always try to please and feel personally responsible -when home life does not go smoothly. They are tireless in their -efforts to see that it does, providing generously from available -income, time and energy. This dedication often exists, however, -side by side with an ENFJ's dream of the perfect relationship - a -characteristic of all NFs, but one which is particularly strong in -an ENFJ. Thus an ENFJ has that longing for the ideal which results -in a vague dissatisfaction with whatever is in the way of -relationships, mating as well as friendship. - -This longing for the perfect carries over into the careers of -ENFJs, who experience some degree of restlessness whatever their -jobs. And, as with ENFPs, ENFJs have a wide range of occupations -which offer success. - -Being verbally adept, ENFJs contribute to an unusual level when -dealing with people, particularly face-to-face: the media, the -ministry, and the stage and screen are populated with successful -ENFJs. They make superior therapists, charismatic teachers, -excellent executives, and personalized executives. Areas that -would not permit utilization of the interaction talents of the -ENFJs, for example, accounting, should be avoided; otherwise, -almost any people-to-people occupation where personal, sustained -contact is involved capitalizes on the personality of an ENFJ. - -ENFJs like to have things organized and settled. They prefer to -plan both work and social engagements ahead and tend to be -absolutely reliable in honoring these commitments. ENFJs are very -much at home in complex situations which require the juggling of -much data. At the same time they can handle people with charm and -concern. - -ENFJs are usually popular wherever they are. Their ability to be -comfortable either leading or following makes them easy to have -around, whatever the situation. A well-developed ENFJ group leader -can provide, almost endlessly, activities for groups to play. In -some, this can amount to genius which other types find hard to -emulate. In this ability to organize without planning there is a -certain, similarity to the ESFJ, but the latter acts more as a -master of ceremonies than as a leader of groups. The ESFJ is more -of a recreational leader, who insures that each member has fun at a -party and that the right things are expressed at social occasions, -especially institutional social occasions such as weddings, -funerals, parties, and the like. - -ENFJs, just like ESFJs, value harmonious human relations above all -else; but ENFJs are not so easily crushed by indifference as are -ESFJs and are more independent of others' valuations. diff --git a/xtrn/smm/mb-enfp.asc b/xtrn/smm/mb-enfp.asc deleted file mode 100644 index b8bcfdb153..0000000000 --- a/xtrn/smm/mb-enfp.asc +++ /dev/null @@ -1,157 +0,0 @@ -ENFPs in short: - -Warmly enthusiastic, high-spirited, ingenious, imaginative. Able -to do almost anything that interests them. Quick with a solution -for any difficulty and ready to help anyone with a problem. Often -rely on their ability to improvise instead of preparing in advance. -Can usually find compelling reasons for whatever they want. - -About 5% of the population. - -Details on ENFPs: - -For ENFPs nothing occurs which does not have some significance, and -they have an uncanny sense of the motivations of others. This -gives them a talent for seeing life as an exciting drama, pregnant -with possibilities for both good and evil. This type is found in -only about 5 percent of the general population, but they have great -influence because of their extraordinary impact on others. - -ENFPs strive toward the authentic, even when acting spontaneously, -and this intent is usually communicated nonverbally to others, who -find this characteristic attractive. ENFPs, however, find their -own efforts of authenticity and spontaneity always lacking, and -tend to heap coals of fire on themselves, always berating -themselves for being so conscious of self. - -ENFPs consider intense emotional experiences vital; when they have -these, however, they are made uneasy by a sense of being there but -with a part of themselves cut off. They strive for congruency, but -always see themselves in some danger of losing touch with their -real feelings, which ENFPs possess in a wide range and variety. - -ENFPs exercise a continuous scanning of the external environment -and nothing out of the ordinary is likely to escape their -attention. They are keen and penetrating observers and are capable -of intense concentration on another individual while aware of what -is going on about them. Their attention is never passive or -casual, never wandering, but always directed. - -At times, ENFPs find themselves interpreting events in terms of -another's "hidden motive," giving special meaning to words or -actions. This interpretation tends to be negative and, more often -than not, inaccurately negative. In the process, an ENFP may find -that he or she has introduced an unnecessary, toxic element into -the relationship. - -While ENFPs are brilliantly perceptive, they can make serious -mistakes in judgement, which works to their discomfort. These -mistakes derive from their tendency to focus on data which confirm -their own biases. They may be absolutely correct in their -perceptions but wrong in their conclusions. - -Because they tend to be hypersensitive and hyperalert, they may -suffer from muscle tension. They live in readiness for -emergencies; because they have this facility, they assume this is -true for others. They can become bored rather quickly with both -situations and people, and resist repeating experiences. - -They enjoy the process of creating something - an idea or a project -- but are not as interested in the follow-through. They are -typically enthusiastic, and this is contagious. People get caught -up and entranced by an ENFP. Yet this type is marked with a fierce -independence, repudiating any kind of subordination, either in -themselves or in others in relation to them. - -They do tend to attribute more power to authority figures than is -there and give over to these figures an ability to "see through" -them - which also is not apt to be there. - -While ENFPs resist the notion of others becoming dependent or -having power over them, their charisma draws followers who wish to -be shown the way. ENFPs constantly find themselves surrounded by -others who look toward the ENFP for wisdom, inspiration, courage, -leadership, and so on - an expectancy which, at times, weighs -rather heavily on an ENFP. - -ENFPs are characteristically optimistic and are surprised when -people and events do not turn out as anticipated. Often their -confidence in the innate goodness of fate and human nature is a -self-fulfilling prophecy. - -ENFPs have a remarkable latitude in career choices and succeed in -many fields. As workers, they are warmly enthusiastic, high -spirited, ingenious, imaginative, and can do almost anything that -interests them. They can solve most problems, particularly those -dealing with people. They are charming and at ease with -colleagues; others enjoy their presence. - -ENFPs are outstanding in getting people together, and are good at -initiating meetings and conferences, although not as talented at -providing for the operational details of these events. They enjoy -inventing new ways of doing things, and their projects tend to -become a cause, quickly becoming personalized. - -They are imaginative themselves, but can have difficulty picking up -on ideas and projects initiated by others. They must make these -ideas and projects their own if ENFPs are to lend energy and -interest. Once people or projects become routine, ENFPs are likely -to lose interest; what 'might be' is always more fascinating than -'what is.' - -ENFPs make extensive use of their intuitive powers. They usually -have a wide range of personal and telephone contacts, expending -energy in maintaining both career and personal relationships. - -ENFPs make excellent salespeople, advertising people, politicians, -screen or play writers, and in general are attracted to the -interpretive arts, particularly, character acting. -People-to-people work is essential for ENFPs, who need the feedback -of interaction with others. - -ENFPs may find it difficult to work within the constraints of an -institution, especially in following rules, regulations, and -standard operating procedures. More frequently, institutional -procedures and policies are targets to be challenged and bent by -the will of an ENFP. Colleagues and superiors sometimes find -themselves in the position of having to accommodate and salvage. - -At times, ENFPs demonstrate impatience with others; they may get -into difficulty in an organization by siding with its detractors, -who find in an ENFP a sympathetic ear and a natural rescuer. In -occupational choice, ENFPs quickly become restless if the choice -involves painstaking detail and follow-through over a period of -time. Variety in day-to-day operations and interactions best suits -the talents of ENFPs, who need quite a bit of latitude in which to -exercise their adaptive ingenuity. - -As mates, ENFPs tend to be charming, gentle, sympathetic, and -nonconformist. They are not likely to be interested in the -less-inspired routines of daily maintenance and ever will be -seeking new outlets for their inspirations. - -As parents, ENFPs are devoted to their children, shifting from a -role of "friend in need rescuer" to stern authority figure. They -may not always be willing to enforce their impulsive -pronouncements, but leave it to their mates to follow through. - -A mate of an ENFP can expect charming surprises: extravagant -generosity punctuated by periods of frugality. Independent actions -regarding money on the part of an ENFP's mate are not ordinarily -welcomed, and the mate may find him or herself in an embarrassing -situation of having to return purchases. - -ENFPs generally are the ones in charge of the home, and a -conflict-free home is desired, almost demanded. When he or she is -in charge of economic resources, the ENFPs may contain extravagant -luxuries, while necessities may be missing. They are not always -interested in saving for the future and may be casual in giving -consideration to such things as life insurance, savings accounts, -and even a ready cash supply for mate and children. - -ENFPs are characteristic in their pursuit of the novel, their -strong sense of the possible, and outstanding intuitive powers. At -the same time, they have warmth and fun with people and generally -are unusually skilled in handling people. Their extroverted role -tends to be well developed, as is their capacity for the novel and -the dramatic. diff --git a/xtrn/smm/mb-entj.asc b/xtrn/smm/mb-entj.asc deleted file mode 100644 index a37af1d7e6..0000000000 --- a/xtrn/smm/mb-entj.asc +++ /dev/null @@ -1,105 +0,0 @@ -ENTJs in short: - -Hearty, frank, decisive, leaders in activities. Usually good in -anything that requires reasoning and intelligent talk, such as -public speaking. Are usually well-informed and enjoy adding to -their fund of knowledge. May sometimes be more positive and -confident than their experience in an area warrants. - -About 5% of the population. - -Details about ENTJs: - -If one word were used to capture ENTJ's style, it would be -commandant. The basic driving force and need of ENTJs is to lead, -and from an early age they can be observed taking over groups. This -type is found in approximately 5 percent of the total population. - -ENTJs have a strong urge to give structure wherever they are - to -harness people to distant goals. Their empirical, objective, and -extroverted thinking may be highly developed; if this is the case, -they use classification, generalization, summarization, adduction -of evidence, and demonstration with ease. - -They resemble ESTJs in their tendency to establish plans for a -task, enterprise, or organization, but ENTJs search more for policy -and goals than for regulations and procedures. - -An ENTJ's introverted thinking (analysis and conservation) may be -less well developed than the extroverted thinking processes, and -the ENTJ leader may turn to an ENTP or INTP to provide this kind of -input. ENTJs are similar to INTJs except that the former places -greater trust in empirical thought than in intuition; it is the -ENTJs own intuitive sense of coherence, however, that augments and -supports their empirical thinking. - -Although ENTJs are tolerant of established procedures, they can -abandon any procedure when it can be shown to be indifferent to the -goal it seemingly serves. Inefficiency is especially rejected by -ENTJs, and repetition of error causes them to become impatient. For -the ENTJ, there must always be a reason for doing anything, and -people's feelings usually are not sufficient reason. - -When in charge of an organization, ENTJs more than any other type -desire (and generally have the ability) to visualize where the -organization is going and seem able to communicate that vision to -others. They are the natural organization builders, and they -cannot not lead. They find themselves in command and sometimes are -mystified as to how this happened. - -As administrators, ENTJs organize their units into a smooth -functioning system, planning in advance, keeping both short-term -and long-range objectives well in mind. They seek and can see -efficiency and effectiveness in personnel. They prefer decisions -to be based on impersonal data, want to work from well-thought-out -plans, and like to use engineered operations - and they prefer that -others follow suit. ENTJs will support the policy of the -organization and will expect others to do so. - -ENTJs will usually rise to positions of responsibility and enjoy -being executives. They are tireless in their devotion to their -jobs and can easily block out other areas of life for the sake of -work. They will be able to reduce inefficiency, ineffectiveness, -and aimless confusion, being willing to dismiss employees who -perpetuate such behaviors. - -ENTJs tend to work in organizational structures of some sort, tend -to be in charge administratively, and rise to top levels of -responsibility, whether in the military, business, education, or -government. - -ENTJs take charge of the home. When the ENTJ is present, there -will be little doubt as to who is in command. Because their work -is so important to them, however, they can become increasingly -absent, especially if male. - -Male or female, ENTJs expect a great deal of their mates, who need -to possess a strong personality of their own, a well-developed -autonomy, many and varied interests, and a healthy self-esteem. A -career wife, however, may not be appealing to an ENTJ male, who is -apt to view his home and family as a part of his professional -background, a resource, and adjunct to his own career development. - -As a parent, an ENTJ will be thoroughly in charge, and the children -will know what is expected of them - and will be expected to obey. -When this does not occur, an ENTJ parent is not apt to make a -scene; rather, there is likely to be a low-key, firm issuance of -reprimand and a taking-for-granted of immediate obedience. - -While both mating and parenting are roles of importance to the -ENTJ, they are to some degree preempted by the ENTJ's strong career -interest. The romantic dream and the quest for the ideal mate is -usually not a characteristic of this type. - -ENTJs generally do, however, expect a home to be attractive, -well-ordered, with meals served punctually and maintenance -accomplished on schedule - all these in the service of the larger -goal of creating a family system where children can be reared to be -productive and healthy and establishing a devoted, harmonious -relationship between man and woman. - -An ENTJ male might expect his mate to be active in civic and -community affairs, to be socially sophisticated, and to be as -well-educated as he. The ENTJ female may find it difficult to -select a mate who is not overwhelmed by her strong personality and -will. diff --git a/xtrn/smm/mb-entp.asc b/xtrn/smm/mb-entp.asc deleted file mode 100644 index 4817854f1d..0000000000 --- a/xtrn/smm/mb-entp.asc +++ /dev/null @@ -1,145 +0,0 @@ -ENTPs in short: - -Quick, ingenious, good at many things. Stimulating company, alert -and outspoken. May argue for fun on either side of a question. -Resourceful in solving new and challenging problems, but may -neglect routine assignments. Apt to turn to one new interest after -another. Skillful in finding logical reasons for what they want. - -About 5% of the population. - -Details about ENTPs: - -ENTPs wish to exercise their ingenuity in the world of people and -things. Found in about five out of every hundred people, ENTPs -extrovert intuition; thus they deal imaginatively with social -relationships as well as physical and mechanical relations. They -are very alert to what is apt to occur next, and always sensitive -to possibilities. - -ENTPs are good at analysis, especially functional analysis, and -have both a tolerance for and enjoyment of the complex. Usually -enthusiastic, ENTPs are apt to express interest in everything, and -thus are a source of inspiration to others, who find themselves -caught up by the ENTP's enthusiasm. This type is delighted over -many things and so is easy to please, often showing the -effervescence of their NF counterpart, the ENFP. - -The ENTP is the most reluctant of all the types to do things in a -particular manner just because that is the way things have always -been done. They characteristically have an eye for a better way, -always on the lookout for new projects, new activities, new -procedures. - -ENTPs are confident in the value of their pursuits and display a -charming capacity to ignore the standard, the traditional, and the -authoritative. As a result of this open attitude, they often bring -a fresh, new approach to their work and their lives. The ENTP is a -keen judge of the pragmatics of both the social and the mechanical, -and may become expert at directing relationships between means and -ends. - -Where the introverted NTP sees design as an end in itself, the -extroverted NTP sees design as a 'means'; the end is the invention -that works, the prototype that is replicatable. Ideas are valuable -when and only when they make possible actions and objects. "It -can't be done" is a challenge to an ENFP and elicits a reaction of -"I can do it." - -They are not, however, the movers of mountains as are the INTJs. -Rather, the faith of the ENTPs is in their ability to improvise -something, and they display an unusual talent for rising to the -expectancy of a situation. - -Superficially, ENTPs resemble ESTPs in their derring-do. But the -focus of the ENTP is on competency and the sense of power this -gives, rather than on the feeling of freedom of action experienced -by the ESTP. - -ENTPs can be fascinating conversationalists, able as they are to -follow the complex verbalizations of others. They may deliberately -employ debate tactics to the disadvantage of their opponents, even -when the "opponents" are close associates and valued friends. - -ENTPs are the most able of all types to maintain a one-up position -with others. They value adaptability and innovation and thus -respond quickly and adeptly to another's shifting position. They -may even be several jumps ahead. - -The ENTP, talkative and motivating, is often the life of an -enterprise. The ENTP can be an entrepreneur and cleverly makes do -with whatever or whoever is at hand, counting on ingenuity to solve -problems as they arise, rather than carefully generating a detailed -blueprint in advance. A rough draft is all an ENTP needs to feel -confident and ready to proceed into action, counting on the ability -to improvise as a situation develops. - -Because of this tendency to depend on ingenuity and improvisation, -they may neglect very necessary preparation at times. After -repeated failures in situations where improvising has met with -defeat, the ENTP may develop ways of avoiding such situations as a -substitute to thorough preparation. - -ENTPs can succeed in a variety of occupations, as long as the job -does not involve too much humdrum routine. At this point, they -become restless. If a project in which they are engaged is no -longer challenging, they tend to lose interest in that project and -fail to follow through - often to the discomfort of colleagues. - -Seldom are ENTPs conformists. ENTPs enjoy outwitting the system -and use rules and regulations within the system to win the game - -whatever it may be. They understand well the politics of -institutions and deal with these realities very well, always aiming -to understand the people within the system rather than to judge -them. - -ENTPs are good at innovative projects and can administer them well -if dull routine is not involved. They usually are outstanding -teachers, continuously devising new participative ways to make -learning exciting for the students. - -As an employee, an ENTP may work against the system just for the -joy of being one-up. For ENTPs, to be taken-in, to be manipulated -by another, is humiliating; this offends their joy in being masters -of the art of one-upmanship. - -ENTPs are the natural engineers of human relationships and human -systems. Their good humor and optimistic outlook tend to be -contagious, and people seek out their company. - -As mates, ENTPs tend to create a lively living environment. They -are gregarious, laugh easily and often, and are typically in good -humor. - -Orderliness in the routines of daily living is not apt to inspire -them; they usually solve this problem by mobilizing those around -them. Tom Sawyer illustrated this talent when he solved the -problem of getting his Aunt Polly's fence whitewashed. Life with -ENTPs is likely to be a daring adventure; they can lead families -into physical and economic dangers. ENTPs improvise to remain -unaware that they do not have the necessary knowledge of the -situation to ward off such dangers. - -If the mate of an ENTP is not competitive, he or she is likely to -find the one-up/one-down transactions somewhat wearing. If the -mate is competitive, the result might be conflict. - -Although usually good providers of economic necessities, ENTPs at -times engage in brinkmanship with their careers, placing them in -jeopardy and behaving as if unaware of the consequences; they may -thus offer unnecessary challenges to those who have power over -their professional success. When challenges elicit negative -responses from superiors, ENTPs are apt to react with delight at -having an opportunity to improvise a solution to the crisis - and, -more often than not, they succeed in doing so. - -ENTPs are likely to have all sorts of hobbies and to be experts in -unexpected areas, but they are not apt to share these hobbies with -their mates or children in the sense of teaching them. In fact, -ENTPs may be very inconsistent in the attention given to offspring. - -Usually, it is feast or famine. ENTPs have a lively circle of -friends and are interested in their ideas and activities. They are -usually easygoing, seldom critical or nagging. At their worst, -they can show undependable, fickle characteristics and may be -easily discouraged. diff --git a/xtrn/smm/mb-esfj.asc b/xtrn/smm/mb-esfj.asc deleted file mode 100644 index c3801a37f6..0000000000 --- a/xtrn/smm/mb-esfj.asc +++ /dev/null @@ -1,118 +0,0 @@ -ESFJs in short: - -Warmhearted, talkative, popular, conscientious, born cooperators, -active committee members. Need harmony and may be good at creating -it. Always doing something nice for someone. Work best with -encouragement and praise. Little interest in abstract thinking or -technical subjects. Main interest is in things that directly and -visibly affect people's lives. - -About 13% of the population. - -Details about ESFJs: - -ESFJs, the most sociable of all the types, are energized by -interactions with people, tending to idealize whatever or whoever -they admire. 'Harmony' is a key to this type, which is represented -in about 13 percent of the general population. - -ESFJs are the great nurturers of established institutions such as -the home, the school, the church, and civic groups. Wherever they -go, they promote harmony and harmonious relationships. They are -outstanding hosts or hostesses, able to call people by name, -usually after one introduction. At a social gathering they can be -observed attending to the needs of others, trying to insure that -all are comfortable and involved. - -Social ties matter to the ESFJs, and their conversations often -drift to the nostalgic recounting of past memories. Traditions are -developed, supported, and carefully observed by the ESFJ. - -ESFJs are hurt by indifference and need to be appreciated both for -themselves and for the abundance, typically in the form of -services, they give to others. They are conscious of appearances -and take the opinions of others regarding social standards very -seriously. Values in an ESFJ may take the form of 'shoulds' and -'should nots' and may be freely expressed. Conscientious and -orderly, ESFJs may become restless when isolated from people. - -Career selection by ESFJs may lean toward service occupations. -They have such outgoing personalities that they are outstanding at -selling, being an invariable winner in sales contests. They are -apt to have seniority in any sales group within an organization. -Observation of ESFJs at work in a sales transaction will -demonstrate how this type personalizes the sale: The customer is -not buying the product; he or she is buying personally from the -ESFJ. - -This same characteristic causes ESFJs to be good in teaching, -preaching, supervision, administration, coaching, and, in general, -people-to-people jobs. They seldom become a source of irritation -to their superiors, for they respect and obey the rules and -regulations, are duty and service oriented. They are loyal to -their bosses. - -ESFJs are likely to be aware of and enjoy discussing events and -problems in the lives of their colleagues; but when conversations -turn to abstractions of philosophy or science, the ESFJ may become -restive. Analysis of the complex - for example, an attempt to find -an explanation of events through an analysis of principles - does -not excite their interest, as it does the NTs. - -ESFJ mates have a set of values which contain clear 'shoulds' and -'should-nots', and they expect their family to abide by these. -They are conscientious about home responsibilities, are orderly -about the home, and prefer that other occupants be the same. They -enjoy socializing and entertaining. - -ESFJs want family decisions settled efficiently and quickly and -want family living routinized, scheduled, and correctly executed. -They do not rebel against routine operations, and are devoted to -the traditional values of home and hearth, respect their marriage -vows, and are the most sympathetic of all types. - -They tend to be dependent on their mates and may marry to insure -that they have a proper place in the social strata. They enjoy the -rituals in connected with serving of good food and beverages, -thrive on festive occasions, respect and accumulate a goodly store -of material possessions. They take their role in the community -seriously and are sensitive to the acknowledged, official -decision-makers and identify with them. They are aware of status, -and often depend on higher authority as the source of opinions and -attitudes. - -ESFJs wear their hearts on their sleeves and are outgoing in their -emotional reactions. They need to be needed, loved, and -appreciated and may spend much energy reassuring themselves that -this is the case. They can become melancholy and depressed and -even suicidal if they take the blame for whatever might be wrong in -their institution or their personal relationships - as they are -prone to do. - -ESFJs usually respect and revere their parents, and as children -were responsive and obedient pupils. They seem able to express the -right feeling for a given situation. - -They are softhearted, sentimental, and usually observe with gusto -and a flourish birthdays, anniversaries, and the like, making of -the event a delightful, important occasion. At the same time, -however, ESFJs can cause others undue tension by expressing -anticipations of gloom and doom, exhibiting a bent toward the -pessimistic that can be contagious. They need to control their -fears that the worst is sure to happen and suppress their tendency -toward crepe-hanging and anticipating disasters. - -The children of an ESFJ are seen as an extension of the family, and -all they do reflects on the ESFJ. If things do not go well, the -SFJ may be critical, even carping toward his or her mate and -children. - -This type may marry alcoholics or others who are particularly -needy. If a female ESFJ is married to a mate who is not a good -provider, she can become nagging and brood over a comparison of her -possessions and status with that of others. - -ESFJs, male or female, live in terms of people and things rather -than in terms of ideas and principles. They enjoy the process of -decision-making, particularly when focus is on the 'usefulness' of -things and people. diff --git a/xtrn/smm/mb-esfp.asc b/xtrn/smm/mb-esfp.asc deleted file mode 100644 index 633ade2c9b..0000000000 --- a/xtrn/smm/mb-esfp.asc +++ /dev/null @@ -1,89 +0,0 @@ -ESFPs in short: - -Outgoing, easygoing, accepting, friendly, enjoy everything and make -things more fun others by their enjoyment. Like sports and making -things. Know what's going and join in eagerly. Find remembering -facts easier than mastering theories. Are best in situations that -need sound common sense and practical ability with people as well -as with things. - -About 13% of the population. - -Details about ESFPs: - -ESFPs radiate attractive warmth and optimism. Smooth, witty, -charming, clever, voluble, and open to the environment - this -describes ESFPs who, like ESTPs, represent about 13 percent of the -general population. They are great fun to be with and are the most -generous of all the types. 'Performer' would be the word which -best describes an ESFP. - -ESFPs will avoid being alone and seek the company of others -whenever possible. ESFPs easily find company, for others are -usually highly entertained by the presence of an ESFP. ESFPs love -excitement and create it wherever they are. Their joy of living is -contagious and generally they wear happy faces. Often outstanding -conversationalists, their flowing banter is amusing in its wit. - -ESFPs have an air of sophistication and are likely to be dressed in -the latest fashion, displaying an enjoyment of all the good things -of life: dress, food, physical comfort, and happy times. ESFPs -create a mood of "eat, drink, and be merry" wherever they go, and -around them life can have a continual party-like atmosphere of -gaiety. - -ESFPs make exciting, if somewhat unpredictable mates, which may -give quieter type mates some anxiety and tension from living on the -edge of adventure. The home of an ESFP is likely to be filled with -people all having a good time. Problems will not be allowed to -make their appearance. The ESFP accomplishes this by taking an -attitude of "walking by the graveyard whistling," refusing to -recognize doom and gloom. - -ESFPs can be generous to a fault. What is theirs is yours, and -what is yours is yours still. They give assistance to one and all -without expectation of a return, just as they love freely without -expecting something in return. ESFPs seem to view life as an -eternal cornucopia from which flows an endless supply of pleasures -that require no effort on their part to insure. - -ESFPs' talent for enjoying life can make them more subject to -temptations than are other types. They are inclined to be -impulsive, and thus both male and female ESFPs are vulnerable to -psychological seduction, if not physical seduction, with an ESFP -giving in easily and agreeably to the demands of others. As a -parent, the ESFP will be entertaining, a friend, and a source of -fun and excitement. When there is sickness, or trouble, however, -ESFPs may become impatient and may want to absent themselves. - -ESFPs' tolerance for anxiety is the lowest of all types. Anxiety -is avoided by ignoring the dark side of a situation as long as -possible. They are inclined to be somewhat self-indulgent, but, -rather than make an outward show of resistance or make waves, ESFPs -will give apparent compliance - and then go their own way to what -they enjoy. - -ESFPs prefer active jobs and should not be given lonely, solitary -assignments. Outstanding in public relations, they love working -with people. Decisions are made with personal warmth, based on -personal reference or reference to significant others. This type -relies on their personal experiences and generally show good common -sense. - -The gregarious sociability and adaptability of ESFPs make them a -source of warmth to others. They do not mind telephone or personal -interruptions and are verbally facile in both situations. They can -be counted on to have accurate data about the people around them, -gaining these data through effortless and continuous observations. - -ESFPs are not deeply interested in scholastic pursuits, wanting -knowledge only for immediate utility. They avoid science and -engineering, gravitate toward business, and are adept at selling, -particularly selling tangibles. - -They can be effective in education, especially elementary school -teaching, and can enjoy nursing for its drama. They are good at -working with people in crisis, a facility, which often leads ESFPs -into social work. They also enjoy entertaining people and are thus -drawn to the performing arts, thriving on the excitement of being -in the limelight. diff --git a/xtrn/smm/mb-estj.asc b/xtrn/smm/mb-estj.asc deleted file mode 100644 index a58f235e23..0000000000 --- a/xtrn/smm/mb-estj.asc +++ /dev/null @@ -1,70 +0,0 @@ -ESTJs in short: - -Practical, realistic, matter-of-fact, with a natural head for -business or mechanics. Not interested in subjects they see no use -for, but can apply themselves when necessary. Like to organize and -run activities. May make good administrators, especially if they -remember to consider others' feelings and points of view. - -About 13% of the population. - -Details about ESTJs: - -ESTJs are very much in touch with the external environment. They -know their community and usually are pillars of strength. The best -adjective to describe ESTJs would be 'responsible.' They represent -about 13 percent of the general population. - -ESTJs are outstanding at organizing procedures and in detailing -rules and regulations. They like to see things done correctly. -They tend to be impatient with those who do not carry out -procedures with sufficient attention to those details, prescribed -by those with the most experience, that will get the job done -right. - -ESTJs are comfortable in evaluating others and tend to judge how a -person is doing in terms of standard operating procedures. They -may, at times, be abrupt with those who do not follow the rules -correctly. ESTJs are realistic, matter-of-fact, and more curious -about new devices and processes than about new principles and -theories. - -ESTJs generally are loyal to their institutions, work, and -community and make excellent, faithful mates and parents. They see -where their duty lies and are not likely to shirk the doing of that -duty, even when this requires considerable sacrifice on their part. - -They frequently rise to positions of responsibility in their jobs, -in the community, and in their religious affiliations. They very -often belong to several civic clubs and support them both through -steady attendance and through their spoken attitudes. ESTJs -themselves are punctual and expect others to be also. - -ESTJs may not always be responsive to points of view and emotions -of others and may have a tendency to jump to conclusions too -quickly at times. They may not always be willing to listen -patiently to opposing views; they are especially vulnerable to this -tendency when in positions of authority. They may need to make -special effort to remain open to input from others who are -dependent on them - their children, spouses, and employees. - -ESTJs are so in tune with the established, time-honored -institutions and ways of behaving within those institutions that -they cannot understand those who might wish to abandon or radically -change those institutions. They follow routines well at home and -at work, tending to have a place for everything and wanting -everything in its place. They are usually neat and orderly at work -and at play. - -They approach human relations through traditions and rituals, -promoting harmony and contentment in their relationships through -creating well-worked-out routines and procedures. Family -traditions have meaning for ESTJs, and they willingly participate -in observing these. They enjoy opportunities to see friends, -former colleagues, and relatives at functions such as retirement -dinners, annual picnics, Thanksgiving gatherings, and weddings. - -ESTJs are relatively easy to get to know; they do not tend to -confuse people by sending double messages. They are dependable and -consistent, and what they seem to be is what they are. - diff --git a/xtrn/smm/mb-estp.asc b/xtrn/smm/mb-estp.asc deleted file mode 100644 index e8c8c956fe..0000000000 --- a/xtrn/smm/mb-estp.asc +++ /dev/null @@ -1,119 +0,0 @@ -ESTPs in short: - -Matter-of-fact, do not worry or hurry, enjoy whatever comes along. -Tend to like mechanical things and sports, with friends on the -side. May be a bit blunt or insensitive. Adaptable, tolerant, -generally conservative in values. Dislike long explanations. Are -best with real things that can be worked, handled, taken apart or -put together. - -About 13% of the population. - -Details about ESTPs: - -ESTPs are men and women of action. When someone of this -personality is present, things begin to happen. The lights come -on, the music plays, the game begins. And a game it is for the -ESTP, The outstanding entrepreneur, the international diplomat, the -conciliator, and the negotiator 'par excellence.' - -Approximately 13 percent of the general population are of this -extroverted, sensing, thinking, perceiving type, and if only one -adjective could be used to describe ESTPs 'resourceful' would be an -apt choice. - -Life is never dull around ESTPs. Their attractive, friendly style -has a theatrical flourish which makes even the most routine, -mundane event seem exciting. ESTPs usually know the location of -the best restaurants, and headwaiters are likely to call them by -name. ESTPs are socially sophisticated, suave, and urbane and are -master manipulators of the external environment. - -ESTPs are uncanny at observing people's motivations, somehow -hypersensitive to minimal nonverbal cues which other types might -miss. And they are masters at using these observations to "sell" -the "client." The eye of the ESTP is ever on the eye of the -beholder, and all actions are directed toward this audience. - -Witty, clever, and fun, ESTPs seem to possess an unusual amount of -empathy, when in fact this is not the case; rather, they are so -acutely aware of minimal signals from others that they are usually -several jumps ahead in anticipation of another's position. And -ESTPs can use information gained to the ends they have in mind - -apparently with nerves of steel, engaging in what seems to others -to be suicidal brinkmanship. Other types may find this exhausting, -but ESTPs are exhilarated by working close to the edge of disaster. - -ESTPs are ruthless pragmatists and often offer the ends as -justification for whatever means they see as necessary - -regrettable, perhaps, but necessary. Usually, however, ESTPs do -not care to justify actions, but prefer instead to get on to the -next action. - -ESTPs are outstanding as initiators of enterprises that bring -people together to negotiate. They make invaluable itinerant -administrators who can pull troubled companies or institutions out -of the red very quickly, and with style! - -They can sell an idea or project in a way no other type can, but -won't follow through on the tedious administrative details of a -project. This characteristic often causes ESTPs to be -unappreciated for the extraordinary talents they have, for people -lose sight of the idea contributed and focus on the details left -undone, becoming critical of ESTPs' weaknesses rather than -appreciating their strength. - -Few enterprises which are institutionally based use ESTPs as they -should be used. When they strike out on their own, however, they -do not always succeed, for their unwillingness to bother with -follow-up details may cause an otherwise excellent project to fail. -ESTPs need to be sure they have someone who will take care of -follow-up if at all possible. - -If the promotional, entrepreneurial capabilities of ESTPs are used -to constructive ends, an institution is fortunate for their -presence. - -If their desire for excitement is not met constructively, however, -these energies may be channeled into destructive, antisocial -activities such as those of the confidence rackets - -counterfeiting, bad-check artistry, safe-cracking, and swindling. A -movie of the early 1970's which caught this use of the ESTP's -talent was The Sting. - -ESTPs live in the immediate moment and as mates lend excitement - -and unpredictability - to the relationship. The ESTP mate is -usually extremely attentive in public and smooth in social rituals. -They carry on amusing repartee, and laughter surrounds them as they -recount from their endless supply of clever jokes and stories. - -Charm radiates from ESTPs. Nothing is too good for their friends, -although family responsibilities may, at times, be given second -priority. The ESTP's mate may in time come to feel like an object -- the female a chattel and the male a negotiable commodity. Deep -commitments do not always occur in the lives of ESTPs, although -they are always popular and know many, many people by name. - -Relationships usually are conditional, and the condition is the -consideration of what the ESTP has to gain from the relationship. -Anything gained, however, is shared freely and generously with the -mate. The unexpected gift, the impulsive trip to Paris, the -extravagant surprise at Christmas - all these an ESTP brings to a -mate. Fun, excitement, laughter, and that element of -unpredictability are characteristic of their relationship. - -The ESTPs have a low tolerance for anxiety and are apt to avoid or -leave situations that are consistently filled with interpersonal -tensions. ESTPs are usually somewhat of a mystery to their mates -and to others. Few people comprehend this unique personality. - -ESTPs themselves understand well the maxim, "He who travels -fastest, travels alone." Still, ESTPs are not likely to be lonely -for long. - -ESTPs meet life with a hearty appetite for the good things of the -world, searching out excitement, perhaps as a warrior, an athlete, -an adventurer, or as a professional gambler, but always seeking the -thrill of courting Lady Luck in one fashion or another. A theme of -seeking excitement through taking of risks runs through the lives -of ESTPs. diff --git a/xtrn/smm/mb-f.asc b/xtrn/smm/mb-f.asc deleted file mode 100644 index 49cec2c046..0000000000 --- a/xtrn/smm/mb-f.asc +++ /dev/null @@ -1,7 +0,0 @@ -The Feeler tends toward subjective & social values, personal feelings, -harmony, intimacy, sympathy and devotion. The F overextends himself to meet -others needs, enjoys serving people, tends to retract statements that offend -others, asks himself 'how will this affect the people involved'. -The feeler feels the thinker has ice in his veins. -The population is equally divided between Ts and Fs, although more men tend -to be Thinkers & more women tend to be Feelers. diff --git a/xtrn/smm/mb-fp.asc b/xtrn/smm/mb-fp.asc deleted file mode 100644 index cdc07cb81e..0000000000 --- a/xtrn/smm/mb-fp.asc +++ /dev/null @@ -1 +0,0 @@ -You should never have a party without an FP. diff --git a/xtrn/smm/mb-i.asc b/xtrn/smm/mb-i.asc deleted file mode 100644 index 8ff52b2d3e..0000000000 --- a/xtrn/smm/mb-i.asc +++ /dev/null @@ -1,9 +0,0 @@ -An Introvert gets his energy from inside himself and needs his own space for -recharging his batteries. An Introvert is drained by being around people. -I is perceived as a good listener, tends to be shy, likes to share occasions -with a few close friends, doesn't like interruptions, is suspicious if people -are too complimentary, gets irritated if people repeat what has already been -said. 'I' tends to consider - then speak, An 'I' is reluctant to reveal himself -and may resist taking this test for fear of being exposed, but can complete -the test in a short time without carefully considering & weighing each -question. About 25% of the population are type I. diff --git a/xtrn/smm/mb-infj.asc b/xtrn/smm/mb-infj.asc deleted file mode 100644 index 73e1893f97..0000000000 --- a/xtrn/smm/mb-infj.asc +++ /dev/null @@ -1,144 +0,0 @@ -INFJs in short: - -Succeed by perseverance, originality and desire to do whatever is -needed or wanted. Put their best efforts into their work. Quietly -forceful, conscientious, concerned for others. Respected for their -firm principles. Likely to be honored and followed for their clear -convictions as to how best to serve the common good. - -About 1% of the population. - -Details about INFJs: - -INFJs focus on possibilities, think in terms of values, and come -easily to decisions. The small number of this type (1 percent) is -regrettable, since INFJs have an unusually strong drive to -contribute to the welfare of others and genuinely enjoy helping -their fellow men. This type has great depth of personality; they -are themselves complicated, and can understand and deal with -complex issues and people. - -It is an INFJ who is likely to have visions of human events past, -present, or future. If a person demonstrates an ability to -understand psychic phenomenon better than most others, this person -is likely to be an INFJ. - -Characteristically, INFJs have strong empathetic abilities and can -be aware of another's emotions or intents even before that person -is conscious of these. This can take the form of feeling the -distress or illnesses of others to an extent which is difficult for -other types. INFJs can intuit good and evil in others, although -they seldom can tell how they came to know. Subsequent events tend -to bear them out, however. - -INFJs are usually good students, achievers who exhibit an -unostentatious creativity. They take their work seriously and -enjoy academic activity. They can exhibit qualities of -over-perfectionism and put more into a task than perhaps is -justified by the nature of the task. They generally will not be -visible leaders, but will quietly exert influence behind the -scenes. - -INFJs are hard to get to know. They have an unusually rich inner -life, but they are reserved and tend not to share their reactions -with those they trust. Because of their vulnerability through a -strong facility to interject, INFJs can be hurt rather easily by -others, which, perhaps, is at least one reason they tend to be -private people. People who have known an INFJ for years may find -sides emerging which come as a surprise. Not that INFJs are -inconsistent; they are very consistent and value integrity. But -they have convoluted, complex personalities which sometimes puzzle -even them. - -INFJs like to please others and tend to contribute their best -efforts in all situations. They prefer and enjoy agreeing with -others, and find conflict disagreeable and destructive. What is -known as ESP is likely found in an INFJ. - -INFJs have vivid imaginations exercised both as memory and -intuition, and this can amount to genius, resulting at times in an -INFJs being seen as mystical. This unfettered imagination often -will enable this person to compose complex and often aesthetic -works of arts such as music, mathematical systems, poems, plays, -and novels. In a sense the INFJ is the most poetic of all the -types. INFJs can have uncanny communications with certain -individuals at a distance. - -INFJs often select liberal arts as a college major and opt for -occupations which involve interacting with people, but on a -one-to-one basis. For example, the general practitioner in -medicine might be an INFJ, or the psychiatrist or psychologist. As -with all NFs, the ministry holds attraction, although the INFJ must -develop an extroverted role here which requires a great deal of -energy. - -INFJs may be attracted to writing as a profession, and often they -use language which contains an unusual degree of imagery. They are -masters of the metaphor, and both their verbal and written -communications tend to be elegant and complex. Their great talent -for language usually is directed toward people, describing people -and writing to communicate with people in a personalized way. INFJs -who write comment often that they write with a particular person in -mind; writing to a faceless abstract audience leaves them -uninspired. - -INFJs make outstanding individual therapists who have the ability -to get in touch with the archetypes of their patients in a way some -other types do not. The INFJs are also the most vulnerable of all -types to the eruptions of their own archetypal material. As -therapists, INFJs may choose counseling, clinical psychology, or -psychiatry, or may choose to teach in these fields. Writing about -these professions often intrigues an INFJ. - -Whatever their choice, they generally are successful in these -fields because of their great personal warmth, their enthusiasm, -their insight, their depth of concentration, their originality, and -their organizational skills can all be brought into play. - -At work as well as socially, INFJs are highly sensitive in their -handling of others and tend to work well in an organizational -structure. They have a capacity for working at jobs which require -solitude and concentration, but also do well when in contact with -people, providing the human interaction is not superficial. - -INFJs enjoy problem-solving and can understand and use human -systems creatively and humanistically. As employees and employers, -INFJs are concerned with people's feelings and are able to provide -in themselves a barometer of the feelings of individuals and groups -within the organization. INFJs listen well and are willing and -able to consult and cooperate with others. Once a decision is -made, they work to implement it. - -INFJs are usually good at public relations and themselves have good -interpersonal relations. They value staff harmony and want an -organization to run smoothly and pleasantly, themselves making -every effort to contribute to that end. - -They are crushed by too much criticism and can have their feelings -hurt rather easily. They respond to praise and use approval as a -means of motivating others, just as they, the INFJs, are motivated -by approval. If they are subject to a hostile, unfriendly working -condition or to constant criticism, they tend to lose confidence, -become unhappy and immobilized, and finally become physically ill. - -As mates INFJs are devoted to their spouses, but may not always be -open to physical approaches. They tend to be physically -demonstrative at times, but wish to choose when, which is when they -are in the mood. This may be quite confusing to an extroverted -mate. - -Often an INFJs expressions of affection will be subtle, taking a -humorous, unexpected turn. INFJs need and want harmony in their -home and find constant conflict, overt or covert, extremely -destructive to their psyches. Their friendship circle is likely to -be small, deep, and longstanding. - -As parents, INFJs usually are fiercely devoted. A female INFJ, -particularly, is linked to her children in a way different from the -other types: with almost a psychic symbiosis. This deep bond can -create an overdependency that can be unhealthy for both mother and -child. At the same time, INFJs tend to be good friends with their -children, while firm in discipline. They usually are concerned -about the comfort of a home and most especially the comfort, -physical health, and emotional well-being of both mates and -children. diff --git a/xtrn/smm/mb-infp.asc b/xtrn/smm/mb-infp.asc deleted file mode 100644 index f99ff2b82f..0000000000 --- a/xtrn/smm/mb-infp.asc +++ /dev/null @@ -1,118 +0,0 @@ -INFPs in short: - -Full of enthusiasms and loyalties, but seldom talk of these until -they know you well. Care about learning, ideas, language, and -independent projects of their own. Tend to undertake too much, -then somehow get it done. Friendly, but often too absorbed in what -they are doing to be sociable. Little concerned with possessions -or physical surroundings. - -About 1% of the population. - -Details about INFPs: - -INFPs present a calm, pleasant face to the world and are seen as -reticent and even shy. Although they demonstrate a cool reserve -toward others, inside they are anything but distant. They have a -capacity for caring which is not always found in other types. They -care deeply - indeed passionately - about a few special persons or -cause. One word that captures this type is 'idealistic'. At -times, this characteristic leaves them feeling isolated, especially -since INFPs are found in only 1 percent of the general population. - -INFPs have a profound sense of honor derived from internal values. -The INFP is the Prince or Princess of mythology, the King's -champion, Defender of the Faith, and guardian of the castle. Sir -Galahad and Joan of Arc are male and female prototypes of an INFP. -To understand INFPs their cause must be understood, for they are -willing to make unusual sacrifices for someone or something -believed in. - -INFPs seek unity in their lives, unity of body and mind, emotions -and intellect. They often have a subtle tragic motif running -through their lives, but others seldom detect this inner minor key. -The deep commitment of INFPs to the positive and the good causes -them to be alert to the negative and the evil, which can take the -form of a fascination with the profane. Thus INFPs may live a -paradox, drawn toward purity and unity but looking over the -shoulder toward the sullied and desecrated. When INFPs believe -that they have yielded to an impure temptation, they may be given -to acts of self-sacrifice in atonement. The atonement, however, is -within the INFP, who does not feel compelled to make public the -issue. - -INFPs prefer the valuing process over the purely logical. They -respond to the beautiful versus the ugly, the good versus the bad, -and the moral versus the immoral. Impressions are gained in a -fluid, global, diffused way. Metaphors and similes come naturally -but may be strained. - -INFPs have a gift of interpreting symbols, as well as creating -them, and thus often write in lyric fashion. They may demonstrate -a tendency to take deliberate liberties with logic. Unlike the NT, -they see logic as something optional. - -INFPs also may, at times, assume an unwarranted familiarity with a -domain, because their global, impressionistic way of dealing with -reality may have failed to register a sufficient number of details -for mastery. INFPs may have difficulty thinking in terms of a -conditional framework; they see things as either real or fancied, -and are impatient with the hypothetical. - -At work, INFPs are adaptable, welcome new ideas and new -information, are well aware of people and their feelings, and -relate well to most, albeit with some psychological distance. -INFPs dislike telephone interruptions and work well alone, as well -as with others. They are patient with complicated situations, but -impatient with routine details. They can make errors of fact, but -seldom of values. Their career choices may be toward the ministry, -missionary work, college teaching, psychiatry, architecture, -psychology - and away from business. - -They seem willing and usually are able to apply themselves -scholastically to gain the necessary training for professional -work, often doing better in college than in high school. They have -a natural interest in scholarly activities and demonstrate, as do -other NFs, a remarkable facility for languages. Often they hear a -calling to go forth into the world to help others; they seem -willing to make the necessary personal sacrifices involved in -responding to that call, even if it means asking others to do -likewise. - -INFPs can make outstanding novelists and character actors, for they -able to efface their own personalities in their portrayal of a -character in a way other types cannot. - -As mates, INFPs have a deep commitment to their pledges. They like -to live in harmony and may go to great lengths to avoid constant -conflict. They are sensitive to the feelings of others and enjoy -pleasing those they care for. They may find it difficult to -reconcile a romantic, idealized concept of conjugal life with the -realities of everyday living with another person. - -At times, INFPs may seem fearful of exuberant attainment, afraid -that current advances may have to be paid for with later -sacrifices. The devil is sure to get his due if the INFP -experiences too freely of success, or beauty, or health, or wealth, -or knowledge. And thus, INFPs guard against giving way to relaxing -in the happiness of mating. They may have difficulty in expressing -affection directly, but communicate interest and affection -indirectly. - -For INFPs, their home is their castle. As parents, they are fierce -in protection of their home and family and are devoted to the -welfare of family members. They have a strong capacity for -devotion, sympathy, and adaptability in their relationships, and -thus are easy to live with. They are loyal to their family and, -although they may dream of greener pastures, they soon locate the -nettles. The almost preconscious conviction that pleasure must be -paid for with pain can cause a sense of uneasiness in the family -system of an INFP, who may transmit an air of being ever-vigilant -against invasion. - -In the routine rituals of daily living, INFPs tend to be compliant -and may even prefer having decisions made on their behalf - until -their value system is violated! Then INFPs dig in their heels and -will not budge from ideals. Life with an INFP will go gently along -for long periods, until an ideal is struck and violated. Then an -INFP will resist and insist. diff --git a/xtrn/smm/mb-intj.asc b/xtrn/smm/mb-intj.asc deleted file mode 100644 index 18d1d03349..0000000000 --- a/xtrn/smm/mb-intj.asc +++ /dev/null @@ -1,169 +0,0 @@ -INTJs in short: - -Usually have original minds and great drive for their own ideas and -purposes. In fields that appeal to them, they have a fine power to -organize a job and carry it through with or without help. -Skeptical, critical, independent, determined, often stubborn. Must -learn to yield less important points in order to win the most -important. - -About 1% of the population. - -Details about INTJs: - -INTJs are the most self-confident of all the types, having -"self-power" awareness. Found in about 1 percent of the general -population, the INTJs live in an introspective reality, focusing -on possibilities, using thinking in the form of empirical logic, -and preferring that events and people serve some positive use. -Decisions come naturally to the INTJs; once a decision is made, -INTJs are at rest. INTJs look to the future rather than the past, -and a word which captures the essence of INTJs is 'builder' - a -builder of systems and the applier of theoretical models. - -To INTJs, authority based on position, rank, title, or publication -has absolutely no force. This type is not likely to succumb to the -magic of slogans, watchwords, or shibboleths. If an idea or -position makes sense to an INTJ, it will be adopted; if it doesn't, -it won't, regardless of who took the position or generated the -idea. As with the INTP, authority per se does not impress the -INTJ. - -INTJs do, however, tend to conform to rules if they are useful, not -because they believe in them, or because they make sense, but -because of their unique view of reality. They are the supreme -pragmatists, who see reality as something which is quite arbitrary -and made up. Thus it can be used as a tool - or ignored. - -Reality is quite malleable and can be changed, conquered, or -brought to a heel. Reality is a crucible for the refining of -ideas, and in this sense, INTJs are the most theoretical of all the -types. An INTJ sees reality as the pawn of ideas: No idea is too -farfetched to be entertained. INTJs are natural brainstormers, -always open to new concepts, and, in fact, aggressively seeking -them. - -INTJs manipulate the world of theory as if on a gigantic chess -board, always seeking strategies and tactics that have high payoff. -In their penchant for logic, the INTJs resemble the INTPs. The -logic of an INTJ, however, is not confined to the expressibly -logical. Unlike INTPs, INTJs need only to have a vague, intuitive -impression of the unexpressed logic of a system to continue surely -on their way. Things need only 'seem' logical; this is entirely -sufficient. - -Moreover, they always have a keen eye for the consequences of the -application of new ideas or positions. They can be quite ruthless -in the implementation of systems, seldom counting personal cost in -terms of time and energy. Theories which cannot be made to work -are quickly discarded by the INTJs. - -To understand INTJs, their way of dealing with reality rather than -their way of dealing with ideas should be observed closely. Their -conscious thought is extroverted and empirical. Hence, they are -better at generalizing, classifying, summarizing, adducing -evidence, proving and demonstrating than are the INTPs. - -The INTJs are somewhat less at home with pure reason, that is, -systemic logic, where principles are explicit. In this respect -they resemble the ENTJs. The INTJs, rather than using deductive -logic, use their intuition to grasp coherence. - -INTJs have a drive to completion, always with an eye to long-term -consequences. Ideas seem to carry their own force for INTJs, -although they subject every idea to the test of usefulness. - -Difficulties are highly stimulating to INTJs, who love responding -to a challenge that requires creativity. Those personality traits -lead INTJs to occupations where theoretical models can be -translated into actuality. They build data and human systems -wherever they work if given even a slight opportunity. They can be -outstanding in scientific research and also outstanding as -executives who generate a plethora of implementations of ideas. - -Teamed with an INTP who is the architect of systems, the INTJ -provides a dimension to an organization which insures that the work -of the INTP does not gather dust on library shelves. - -INTJs can be very single-minded at times; this can be either a -weakness or a strength in their careers, for they can ignore the -points of view and wishes of others. INTJs usually rise to -positions of responsibility, for they work long and hard and steady -in their pursuit of goals, sparing neither time nor effort on their -part or that of their colleagues and employees. - -INTJs live to see systems translated into substance; an INTP, by -way of contrast, is content to design the system. In both, these -types, however, coherence is the master. Both internal and -external consistency are important, and if an INTJ finds that he or -she is in a working situation where overlapping functions, -duplication of effort, inefficient paper flow, and waste of human -and material resources abound, the INTJ cannot rest until an effort -is made to correct the situation. Cost-effectiveness is a concept -which has a strong imperative for INTJs, who frequently select -occupations in engineering, particularly human engineering. - -They also can be found in the physical sciences, in roles which -require development, such as curriculum building, and, in general, -any job which requires the creation and application of technology -to complex areas. - -Fellow workers of INTJs often feel as if the INTJ can see right -through them, and often believe that the INTJ finds them wanting. -This tendency of people to feel transparent in the presence of the -INTJ often results in relationships which have psychological -distance. Thus colleagues find the INTJ apparently unemotional -and, at times, cold and dispassionate. Because of their tendency -to drive others as hard as themselves, INTJs often seem demanding -and difficult to satisfy. - -INTJs are high achievers in school and on the job. On the job, -they take the goals of the institution seriously and continually -strive to respond to these goals. They make dedicated, loyal -employees whose loyalties are directed toward the system, rather -than toward individuals within the system. So as the people of an -institution come and go, the INTJs have little difficulty - unlike -the NFs, who have their loyalties involved more with persons than -offices. - -INTJs ordinarily tend to verbalize the positive and eschew comments -of a negative nature; they are more interested in moving an -institution forward than commiserating about mistakes of the past. - -As mates, INTJs want harmony and order in the home and in -relationships. They are the most independent of all the types. -They will trust their intuitions about others when making choices -of friends and mates, even in the face of contradictory evidence -and pressures applied by others. - -The emotions of an INTJ are hard to read, and neither male nor -female INTJ is apt to express emotional reactions. At times, both -will seem cold, reserved, and unresponsive, while in fact INTJs are -almost hypersensitive to signals of rejection from those for whom -they care. - -In social situations, INTJs may also be unresponsive and may -neglect to observe small rituals designed to put others at their -ease. For example, INTJs may communicate that time is wasted if -used for idle dialogue, and thus people receive a sense of hurry -from an INTJ which is not always intended. In their interpersonal -relationships, INTJs are usually better in a working situation than -in recreational situations. They do not enjoy physical contact -except with a chosen few. - -As parents, INTJs are dedicated and single-minded in their -devotion: Their children are a major focus in life. They are -supportive of their children and tend to allow them to develop in -directions of their own choosing. INTJs usually are firm and -consistent in their discipline and rarely care to repeat directions -given to children - or others. - -Being the most independent of all the types, they have a strong -need for autonomy; indifference or criticism from people in general -does not particularly bother INTJs, if they believe that they are -right. They also have a strong need for privacy. - -The most important preference of an INTJ is 'intuition', but this -is seldom seen. Rather, the function of 'thinking' is used to deal -with the world and with people. INTJs are vulnerable in the -emotional area and may make serious mistakes here. diff --git a/xtrn/smm/mb-intp.asc b/xtrn/smm/mb-intp.asc deleted file mode 100644 index 97594584b5..0000000000 --- a/xtrn/smm/mb-intp.asc +++ /dev/null @@ -1,118 +0,0 @@ -INTPs in short: - -Quiet, reserved, impersonal. Enjoy especially theoretical or -scientific subjects. Logical to the point of hairsplitting. -Usually interested mainly in ideas, with little liking for parties -or small talk. Tend to have sharply defined interests. Need -careers where some strong interest can be used and useful. - -About 1% of the population. - -Details on INTPs: - -INTPs exhibit the greatest precision in thought and language of all -the types; they tend to see the distinctions and inconsistencies in -thought and language instantaneously. The one word which captures -the unique style of INTPs is 'architect' - the architect of ideas -and systems as well as the architect of edifices. This type is -found in only 1 percent of the population and therefore is not -encountered as frequently as some of the other types. - -INTPs detect contradictions in statements no matter how distant in -space or time the contradictory statements were produced. The -intellectual scanning of INTPs has a principled quality; that is, -INTPs search for whatever is relevant and pertinent to the issue at -hand. Consequently, INTPs can concentrate better than any other -type. - -Authority derived from office, position, or wide acceptance does -not impress INTPs. External authority per se is irrelevant. INTPs -abhor redundancy and incoherence. - -Possessing a desire to understand the universe, an INTP is -constantly looking for natural law. Curiosity concerning these -keys to the universe is a driving force in this type. - -INTPs prize intelligence in themselves and in others, but can -become intellectual dilettantes as a result of their need to amass -ideas, principles, or understanding of behavior. And once they -know something, it is remembered. - -INTPs can become obsessed with analysis. Once caught up in a -thought process that thought process seems to have a will of its -own for INTPs, and they persevere until the issue is comprehended -in all its complexity. They can be intellectual snobs and may show -impatience at times with others less endowed intellectually. This -quality, INTPs find, generates hostility and defensive behaviors on -the part of others, who may describe an INTP as arrogant. - -For INTPs, the world exists primarily to be understood. Reality is -trivial, a mere arena for proving ideas. It is essential that the -universe is understood and that whatever is stated about the -universe is stated correctly, with coherence and without -redundancy. This is the INTP's final purpose. It matters not -whether others understand or accept his or her truths. - -The INTP is the logician, the mathematician, the philosopher, the -scientist; any pursuit requiring architecture of ideas intrigues -this type. - -INTPs should not, however, be asked to work out the implementation -of application of their models to the real world. The INTP is the -architect of a system and leaves it to others to be the builder and -the applicator. Very often, therefore, the INTP's work is not -credited to him or her. The builder and the applier gains fame and -fortune, while the INTP's name remains obscure. Appreciation of an -INTP's theoretical work frequently comes posthumously - or the work -may never be removed from library shelves at all and thus lost. - -INTPs tend not to be writers or to go into sales work. They are, -however, often excellent teachers, particularly for advanced -students, although INTPs do not always enjoy much popularity, for -they can be hard taskmasters. - -They are not good at clerical tasks and are impatient with routine -details. They prefer to work quietly, without interruption, and -often alone. If an organization is to use the talents of an INTP -appropriately, the INTP must be given an efficient support staff -who can capture ideas as they emerge and before the INTP loses -interest and turns to another idea. - -INTPs take their mating relationship seriously and usually are -faithful and devoted - albeit preoccupied at times. They are not -likely to welcome constant social activity or disorganization in -the home. - -In all probability, the mate of an INTP will initiate and manage -the social life. If left to his or her own devices, the INTP mate -will retreat into the world of books and emerge only when physical -needs become imperative. - -INTPs are, however, willing, compliant, and easy to live with, -although somewhat forgetful of appointments, anniversaries, and the -rituals of daily living - unless reminded. They may have -difficulty expressing their emotions verbally, and the mate of an -INTP may believe that he/she is somewhat taken for granted. - -As a parent, the INTP is devoted; they enjoy children and are -serious about their upbringing. The home of an INTP parent is -usually calm, low-key in discipline, but well run and ordered. - -INTPs deal with the environment primarily through intuition, and -their strongest quality, the thinking function, remains relatively -hidden except in close associations. Therefore, INTPs are often -misunderstood, seen as difficult to know, and seldom perceived at -their true level of competency. - -They are inclined to be shy except with close friends, and their -reserve is difficult to penetrate. They are very adaptable until -one of their principles is violated. Then INTPs are not adaptable -at all! - -They may have difficulty in being understood by others because they -tend to think in a complicated fashion and want to be precise, -never redundant in their communications. - -Because their feeling qualities may be underdeveloped, they may be -insensitive to the wants and wishes of others, often quiet unaware -of the existence of these wants and wishes. diff --git a/xtrn/smm/mb-intro.asc b/xtrn/smm/mb-intro.asc deleted file mode 100644 index bdd60da67d..0000000000 --- a/xtrn/smm/mb-intro.asc +++ /dev/null @@ -1,18 +0,0 @@ -nyhThe Myers-Briggs Personality Test nc - -The test you are about to take is titled, "hThe Keirsey Temperament Sorternc". - -There are no "right" or "wrong" answers to the questions in this inventory. -Your answers will help show how you like to look at things and how you like to -go about deciding things. Knowing your own preferences and learning about -other people's can help you understand where your special strengths are, what -kind of work you might enjoy and be successful doing, and how people with -different preferences can relate to each other and be valuable to society. - -Read each question carefully and indicate your answer by typing 'A', 'B' or -'C' for cannot decide. - -Do not think too long about any question. - -The test consists of 70 questions. - diff --git a/xtrn/smm/mb-isfj.asc b/xtrn/smm/mb-isfj.asc deleted file mode 100644 index c59d1d4a19..0000000000 --- a/xtrn/smm/mb-isfj.asc +++ /dev/null @@ -1,116 +0,0 @@ -ISFJs in short: - -Quiet, friendly, responsible and conscientious. Work devotedly to -meet their obligations. Lend stability to any project or group. -Thorough, painstaking, accurate. May need time to master technical -subjects, as their interests are usually not technical. Patient -with detail and routine. Loyal, considerate, concerned with how -other people feel. - -About 6% of the population. - -Details about ISFJs: - -Six out of every hundred people are ISFJs. Here the primary is to -be of service and to minister to individual needs. ISFJs carry a -sense of history, a sense of continuity with past events and -relationships. Traditions and the conservation of resources are -highly valued. - -The least hedonistic of all types, ISFJs believe work is good, play -must be earned. ISFJs are willing to work long, long hours. When -they undertake a task, it will be completed if at all humanly -possible. - -Adhering to an established way of doing things and doing them well -is valued and respected. The efficiency and effectiveness of an -established procedure is not often questioned. Procedures dictated -by handbooks are law. If others violate or ignore these standard -operating procedures, ISFJs are annoyed and irritated, although -they may not always display this reaction. Usually, such -irritation is turned inward and may be experienced as fatigue and -muscle tension. - -ISFJs are super-dependable and seldom are happy working in -situations where rules are constantly changing. Their major need -to be of service to others leads them into occupations such as -nursing, teaching, secretarial work, medical practice (especially -general practice), librarian work, and middle-management -administrative jobs. - -They relate well to people who need them, for example, the sick, -the ignorant, students, and the "boss." Much satisfaction comes to -them when they are taking care of the needs of another and they -render the service gently and helpfully. When the recipient is no -longer in need, the relationship may change its character, the ISFJ -becoming disinterested. - -They enjoy assisting the downtrodden and can handle better than -other types servility of others. If a situation calls for such -behavior on their part, they will show "due respect." - -ISFJs have an extraordinary sense of responsibility and an -outstanding talent for executing routines which call for repeated, -sequential procedures; for example, ISFJs make extraordinary -secretaries, highly efficient nurses, and dedicated teachers. -Speculation and theory do not intrigue ISFJs, who would rather -leave the less practical matters to others while remaining -themselves practical and down-to-earth. - -ISFJs tend to be devoted and loyal to a boss and tend to identify -personally rather than institutionally. They expect others, -including the boss, to follow procedures and are distressed and -embarrassed when people do not behave as they are supposed to -behave. - -ISFJs often seem to feel personally responsible for seeing to it -that people in an institution or business carry out established -rules and routines. They often are aware of status given by -titles, environment, offices, and the like and can use this to -advantage. - -They are aware of the value of material resources and abhor the -squandering or misuse of these resources. To save, to put -something aside against an unpredictable future, to prepare for -emergencies - these are important actions. - -ISFJs may experience some discomfort when placed in positions of -authority over others and may tend to try to do everything -themselves rather than insist that others do their jobs. As a -result, ISFJs are frequently overworked. - -ISFJs are devoted to mate and family and usually are excellent -homemakers. The home of an ISFJ is likely to be well kept inside -and out. Interior and exterior are meticulously maintained and -appointed in the traditional manner. - -As a parent, the ISFJ expects children to conform to the rules of -society and has a feeling of personal responsibility to see to it -that these rules are honored. - -An ISFJ is apt to find the putting on of airs as offensive and -tends to prefer modest, quiet friends rather than more boisterous -ones. For the ISFJ, people should behave according to their -position in life, and the ISFJ may be annoyed by others who act -either above or below their social or economic station. - -The ISFJ female often displays a flair for making the interior of -the home attractive in a time-honored style, provides attractive, -nourishing meals, and maintains the environment in a neat and -orderly state. To the ISFJ male and female, the home territory is -important to own and to preserve. - -While ISFJs are super-dependable, they may be fascinated by and -attracted to the irresponsible, the lush, the glutton. Many ISFJs -marry alcoholics and then proceed to conduct a rescue-rejection -game without end, with the rescuing phase taking the guise of an -attempt to reform. Occasionally an ISFJ mother may reveal a -tendency to find humor in the "waywardness" of a son, while raising -her daughters to respect traditions and to do the Right Thing at -the Right Time - always. - -ISFJs are frequently misunderstood and undervalued. Their -contributions often are taken for granted, and the ISFJ as well is -often taken for granted. This can cause an ISFJ to harbor feelings -of resentment, and this bottled up emotion can gnaw inwardly, -causing the ISFJ much undeserved suffering. diff --git a/xtrn/smm/mb-isfp.asc b/xtrn/smm/mb-isfp.asc deleted file mode 100644 index 4b9b4d322b..0000000000 --- a/xtrn/smm/mb-isfp.asc +++ /dev/null @@ -1,166 +0,0 @@ -ISFPs in short: - -Retiring, quietly friendly, sensitive, kind, modest about their -abilities. Shun disagreements, do not force their opinions or -values on others. Usually do not care to lead but are often loyal -followers. Often relaxed about getting things done, because they -enjoy the present moment and do not want to spoil it by undue haste -or exertion. - -About 5% of the population. - -Details about ISFPs: - -Although all SPs (Sensuous Performers) are artisans in their -nature, they usually do not pursue their artistry with the same -devotion and adornment as the ISFP. For whatever reason, the ISFP -seems more inclined to the "fine arts" than the other SPs; so when -an especially gifted composer, painter, or dancer shows up, he or -she, more frequently than not, possesses the character of an ISFP. -Beethoven, Toscanini, Rembrandt, and Nijinski, as shown by -typohistorical research, were clear-cut ISFPs. - -But the ISFP temperament is very difficult to observe, even in the -great artists, and so ISFP is probably the most misunderstood of -all the types. - -A major source of misunderstanding is the tendency of ISFPs not to -express themselves directly, but through action. If they find a -medium of expression, some art form, then the character is -expressed in some degree in the medium. If not, it simply doesn't -come out, and no one knows them, this social reticence making the -character all but invisible. - -Of course, in those rare cases where remarkable skill is achieved, -such as in the virtuoso, ISFPs become celebrities, but their nature -is still far from visible. Harpo Marx, a brilliant comedic actor, -may well be seen as a prototype, in his simultaneous celebrity and -mute invisibility. - -On close observation, these relatively infrequent SPs (5 percent of -the population is ISFP, as compared to 15 percent ESFP) are just as -hedonistic and impulsive as the other SPs. Here is no NF search -for significance, nor for that matter any fascination with science -(NT) or commerce (SJ). - -ISFPs live Epicurean lives in the here and now, and as gracefully -as possible. They do not plan and prepare. Submergence in their -artistry is not preparation for something later; rather they -experience intensely, now. ISFPs do not wait, for to wait is to -see their impulse wither and die; they want and value their -impulses and see them as the center of their lives. - -Nor are ISFPs devoted or committed to artful play; rather they are -caught, as by a magnet or a whirlwind. So then the long hours of -"practice" the virtuoso "gives" to artistry is not practice at all -and it is not given; it is doing and it is taken from the (willing) -ISFP by the performance itself. The act is ISFP's master, not the -reverse, so we must abandon any notion of ISFPs as careful and -devoted planners and of dutiful preparation and rehearsal. They -paint, or sing, or toot, or dance, or run, or skate, or pot, or -whatever, simply because must: the mountain is climbed 'because it -is there'. - -Because the ISFP is always caught up, so to speak, in whatever -actions are underway, rather than practicing toward some distant -goal, there is no question of the ISFP noticing fatigue, pain, or -danger. They are usually quite oblivious to the accompaniments of -many of their favorite activities. It is not that ISFPs are inured -to them as much as it is that, wholly engaged by an action, they -simply do not notice them. In this ISFP is similar to other SPs -and different from all other types. - -ISFP, like other SPs, has a special kind of intelligence. Please -recall that intelligence is defined in this book as doing things -well under varying circumstances. This particular category of -intelligence might be called "artisan concretized." Such talent -differs from that possessed by NFs, NTs, and SJs (granting of -course, that they too have their own unique and inherent -abilities). This artisan concretization somehow keeps the ISFP -more closely in touch with the very real. - -While the ISTP is attuned to the tool, so to speak, the ISFP is -attuned to color, line, texture, shading - touch, motion, seeing, -and hearing in harmony. The senses of the ISFP seem more keenly -tuned than those of others. Rembrandt could almost taste colors so -great was his discrimination. Toscanini could hear a single false -note in the most complex operatic-orchestral score, and Hemingway's -words tasted and smelled and felt the waves. This extreme -concreteness and specificity seems to come naturally to the ISFP -and is embedded "in the warp and woof of the man's make." - -The social side of the ISFP character must not be eclipsed by the -more spectacular performances some of this group are capable of. -The ISFP has to be the kindest of all the types with no near -competitors. This kindness is unconditional. Here is sympathy, of -which we are all capable, carried to its most extreme form. The -ISFP is especially sensitive to the pain and suffering of others -and, like St. Francis of Assisi, with sympathetic impulsivity -gives freely to the sufferer. - -ISFP is usually not interested in developing facility in speaking, -writing, or conversation. Speech, after all, is abstract, not -concrete, ISFPs preferring to have their fingers on the pulse of -life. That pulse must be felt - by touch, in the muscles, in the -eyes, in the ears. - -This insistence on the senses being so closely attuned to reality -can, in some ISFPs, occasion a breach with language, and language -becomes a barrier to smooth interpersonal relations. So ISFPs are -sometimes seen by others as reserved and private, tending to give -up rather easily in their attempts to express themselves verbally. - -But this reluctant speech is not so much a lack of ability as it is -disinterest. Hemingway broke that barrier, a splendid instance of -an ISFP entering the world of words and making apparent -inarticulateness into art, changing the face of 20th Century -literature. - -The number of great artisans who, upon investigation, were found -clearly to have been ISFPs, is truly awesome. The other SPs seem -to have contributed far fewer masters to the fine arts. Gaugin and -Puccini, both ESTPs, were in this sense exceptional. Music and the -dance seems almost the province of ISFP, and surely investigation -will show many of the great athletes come from this group. - -Of course, all ISFPs have not been and need not be artisans in the -narrow sense of the word. Art, broadly conceived, is any action -the next move of which is a free variable, and it is art thus -conceived that is the forte of SPs in general and the ISFP in -particular. - -Thus ISFPs have a lot of leeway in choice of occupation, especially -if they do not drop out of school early (most SPs do, since the -school offers little that is of interest to them or that challenges -their special brand of intelligence). It is a sad day indeed when -the ISFP chooses work wherein the operations are fixed by rule or -necessity and not free. To be happy and productive the ISFP must -choose variable actions and be rewarded for doing them. - -Finally, in many ISFPs may be found an instinctive longing for the -natural, the pastoral, the bucolic. They are quite at home in the -wilds, and nature seems to welcome them. Some have a remarkable -way with animals, even wild animals, almost as if there were a bond -of mutual sympathy and trust. In some instances a similar bond may -be seen between the ISFP and young children, instant and unstudied. - -Perhaps the most important thing to understand about ISFPs is that -they are SPs, with much in common with ESFPs especially, often -resembling ISTPs, and even sharing some traits with the seemingly -very different ESTP. - -To summarize this commonality with other SPs, ISFPs may be seen as -optimistic and cheerful; egalitarian, fraternal, and insubordinate; -tending to ward off obligation, duty, confinement, and fetters; a -lover of freedom, easily bored, wanting excitement, risk, chance, -and tests of luck; uncomplicated in motivation, trusting, -receptive, generous, and in every sense of the word a spender -rather than a saver. - -ISFPs are misunderstood not only because they are retiring, -reserved, and even self-effacing, but because the Jungians have -cast them as "introverted feeling types," and therefore very much -like the INFPs. Watch a few thoroughgoing ISFPs and you'll find -they have very little in common with INFPs. Other types are -reminded to guard against the natural tendency to project their own -traits of character onto the silent ISFP. diff --git a/xtrn/smm/mb-istj.asc b/xtrn/smm/mb-istj.asc deleted file mode 100644 index 399af67a1b..0000000000 --- a/xtrn/smm/mb-istj.asc +++ /dev/null @@ -1,121 +0,0 @@ -ISTJs in short: - -Serious, quiet, earn success by concentration and thoroughness. -Practical, orderly, matter-of-fact, logical, realistic, and -dependable. See to it that everything is well organized. Take -responsibility. Make up their own minds as to what should be -accomplished and work toward it steadily, regardless of protests or -distractions. - -About 6% of the population. - -Details about ISTJs: - -ISTJs are characterized by decisiveness in practical affairs, are -the guardians of time-honored institutions, and, if only one -adjective could be selected, 'dependable' would best describe this -type which represents about 6 percent of the general population. -The word of ISTJs is their bond, and they experience great -uneasiness by thoughts of a bankrupt nation, state, institution, or -family. - -Whether at home or at work, this type is rather quiet and serious. -ISTJs are extraordinary persevering and dependable. The thought of -dishonoring a contract would appall a person of this type. When -they give their word, they give their honor. - -ISTJs can be counted on to conserve the resources of the -institution they serve and bring to their work a practical point of -view. They perform their duties without flourish or fanfare; -therefore, the dedication they bring to their work can go unnoticed -and unappreciated. - -ISTJ's interest in thoroughness, details, justice, practical -procedures, and smooth flow of personnel and material leads this -type to occupations where these preferences are useful. - -For example, ISTJs make excellent bank examiners, auditors, -accountants, or tax examiners. Investments in securities are -likely to interest this type, particularly investments in blue chip -securities, ISTJs are not likely to take chances with their own or -others' money. - -ISTJs can handle difficult, detailed figures and make sense of -them. They communicate a message of reliability and stability, -which often makes them excellent supervisors of, for example, a -ward of a hospital, a library, or a business operation. - -They would be capable of handling the duties of a mortician, a -legal secretary, or a law researcher. High school teachers of -business, home economics, physical education, and the physical -sciences, are ISTJs, as are top-ranking officers of the Women's -Army Corps. Often this type seem to have ice in their veins, for -people fail to see an ISTJ's vulnerability to criticism. - -ISTJs are patient with their work and with procedures within an -institution, although not always patient with the individual goals -of people in that institution. ISTJs will see to it that resources -are delivered when and where they are supposed to be; materiel will -be in the right place at the right time. And ISTJs would prefer -that this be the case with people, too. - -As a husband or wife, the ISTJ is a pillar of strength. Just as -this type honors business contracts, so do they honor the marriage -contract. Loyal and faithful mates, they take responsibilities to -children and mate seriously, giving lifelong commitment to these. -'Duty' is a word the ISTJ understands. - -The male ISTJ sees himself as the breadwinner of a family, although -he can accept a working wife - as long as responsibilities to -children are not shirked. The male ISTJ's concept of masculinity -is patriarchal, and both female and male ISTJs make steady, -dependable partners. The female ISTJ may abandon the frivolous for -the sensible and may not always deepen her sensuality. - -As parents, ISTJs are consistent in handling children, and the -rules of family are made clear. A rebellious, nonconformist child -may have a difficult time, however, with an ISTJ parent - and vice -versa. As a child, the ISTJ is apt to be obedient and a source of -pleasure to parents and teachers. - -Although ISTJs are outstandingly practical and sensible, they can -marry people who are thoroughly irresponsible, with the marriage -developing into a relationship more parent-to-child than -adult-to-adult. - -The ISTJ fluctuates from being rescuer to reformer of the wayward -mate. The marriage then becomes a lifelong game: On one side, -there is Irresponsibility, Promise of Reform, Brief Period of -Reform, and Irresponsibility again; on the ISTJ's part, the cycle -is Disapproval, Rescue, Scolding, Forgiveness, Acceptance of -Promise To Do Better, and on and on. - -This pattern often is seen when an ISTJ marries an alcoholic and -enters a life of care taking punctuated by periods of anger and -rejection. Somehow, although ISTJs can accept periodic fickleness -and selfishness in significant others, they do not see this kind of -behavior as acceptable in themselves. - -ISTJs have a distaste for and distrust of fanciness in speech, -dress, or home. The ostentatious is abhorred, and a neat, orderly, -and functional home and work environment is preferred. Durability -of furnishings are of primary concern, esthetics given slim -consideration. The clothes of an ISTJ tend to be practical and -durable rather than in the latest style or luxurious. "No -nonsense" in both food and clothes seem characteristic of this type -who tend not to be attracted by exotic foods, beverages, or places. - -The male ISTJ may enjoy stag, men-only parties and use a different -sort of language when only men are present. The yearly hunting or -fishing trip as a male ritual is often a part of recreation for an -ISTJ. More than the female, the ISTJ male is apt to be involved in -community service organizations that transmit traditional values to -the young, such as Boy Scouting. They understand and appreciate -the contributions these groups make in preserving the national -heritage. - -Along with the SJs, the ISTJ takes particular delight in festive -occasions held in the context of rituals, for example, weddings, -holiday feasts, and birthdays. At work, the ISTJ is apt to see the -holiday office party as a necessary nuisance and would be likely to -participate and enjoy these events. diff --git a/xtrn/smm/mb-istp.asc b/xtrn/smm/mb-istp.asc deleted file mode 100644 index 6341a59e44..0000000000 --- a/xtrn/smm/mb-istp.asc +++ /dev/null @@ -1,191 +0,0 @@ -ISTPs in short: - -Cool-onlookers - quiet, reserved, observing and analyzing life with -detached curiosity and unexpected flashes of original humor. -Usually interested in impersonal principles, cause and effect, how -and why mechanical things work. Exert themselves no more than they -think necessary, because any waste of energy would be inefficient. - -About 13% of the population. - -Details about ISTPs: - -Just as impulsive as other SPs, the ISTP's life is artful action - -and action is end in itself. Action for the ISTP is more -gratifying if it is born of impulse rather than purpose. If the -action is in the service of an end or aim, let the aim look out for -itself; it cannot be allowed to influence execution. The act is -self-directed, self-leading, containing its own imperatives which -cannot be suborned to mere rules, regulations, or laws. - -ISTPs are egalitarian and can be fiercely loyal to "brothers." They -can also be fiercely insubordinate seeing hierarchy and authority -as unnecessary and even superfluous. It is not so much a matter of -going against regulations as it is simply ignoring them. - -The ISTP must do his or her own thing, free to vary each next move. -And ISTPs are, or want to be, proud of their ability to make the -next move skillfully. - -ISTPs are often fearless, risking themselves more than other types, -despite (even frequent) injury. Of all the types, ISTPs are most -likely to pit themselves, or their technique, against chance, odds, -or fate. They thrive on excitement; they crave some excitement -each day, in the form of fast motion - racing, sky diving, or -surfing, for instance. This hunger for action makes them much more -subject to boredom than any other type, their urge driving them to -a faster pace. Strangely, however, they are not bored while doing -their thing, even though there may be long stretches when nothing -happens, as during travel, surfing, hunting, or fishing. - -The ISTP nature is most easily seen in their mastery of tools, -tools of any kind, from microscopic drill to supersonic jet. From -an early age, they are drawn to tools as to a magnet; they must -manipulate them, and tools fall into their hands demanding use. -Many pilots knew by the age of five that they were going to be -pilots. - -ISTPs tend to take up activities that allow them to use tools; -driving, steering, operating. And if given a tool, whether scalpel -or earth mover, is operated with a precision that defies belief, -that operator is likely an ISTP. Others use tools, of course, but -not with the virtuosity of the ISTP. - -Indeed, we must call ISTP's the tool artisans, for they above all -others command the tool and bend it to their impulse. But again, -ISTPs - personified in Michaelangelo and Leonardo - work (or -better, play) with their tools on personal impulse and not on -schedule. If an externally imposed schedule coincides with -impulse, fine; if not, so much the worse for the schedule. - -One tool especially attractive to the ISTP is the weapon. Should -ISTPs turn against society (for whatever reason), they wield their -weapons with lethal genius to support their rejection. The hit man -of today, the gunslinger of the American West, and the duelist of -18th Century Europe, may be seen as virtuosos of precision -homicide. - -Hit man, gunslinger, and duelist alike took pride in their prowess. -Fortunately, they face their own kind in battle, the good warriors -of the land: soldier, marshal, police, intelligence agent. This is -not to say that all warriors, good or bad, are ISTPs, or that ISTPs -are all weapons experts; rather that the weapon virtuoso is more -frequently ISTP than not. - -ISTPs also play on impulse, taking off at any time just because -they "feel like it." (We are advised not to try to stop the ISTP -who "feels like" doing something.) The neurosurgeon does crop -dusting on the side and rides a motorcycle to the airport, and the -financier goes on a hunting trip in the middle of an audit (i.e., -SJ scrutiny). There can be no end to the ways ISTPs seek thrills -in play. - -Although they may have the appearance of loners in their work, they -nonetheless hang around their own kind in play. The climbers, -racers, flyers, hunters, and in general, movers flock together. The -companionship is mediated through the tool, and conversation is -sparse and terse. - -Like the ISFPs, ISTPs communicate through action, and show little -interest in developing verbal skills. Indeed, this lack of -interest in communication may be mistaken for what well meaning but -misguided medics and educators call "learning disability" or -"dyslexia," both preposterous notions when meant as explanations. -Let ISFPs get near a tool of any complexity and power and see how -fast they pass up everybody in 'learning' to use it and how precise -their 'lexicon' in talking of its features. - -Despite their egalitarianism, insubordination, and love of freedom, -they can be leaders, even great ones. But they must be "up front," -sword in hand, leading the charge. That is to say, ISTPs can be -very successful as battle leaders, for instance, no matter how -large or small the force under their command. Their supreme -realism, timing, and sense of expediency allows them to seize the -moment and fully exploit whatever resources can be gotten (theirs -or others) and capitalize on deficits and mistakes of their -opponent. - -Theirs is an expediency or exploitative leadership, based on a -special kind of intelligence which may be called artistic -concreteness. Yes, for the ISTP battle leader, combat is an art, -an intellectual game, not in the sense of strategy (that is for -NTs), but rather using whatever is at hand to defeat the other with -the least injury. - -Battle leaders are duellists. Patton was such a leader, and we -must credit Marshall (an NTJ strategist) for seeing beneath that -flamboyant, impulsive, insubordinate, and reckless exterior a -peerless warrior. The same credit goes to Grant (another NTJ) for -selecting Sheridan (STP), and to Hitler (ENFJ) for selecting Rommel -(ISTP). Patton, Sheridan, and Rommel were cut from the same cloth -and showed the same artistic espionage and rapier-like tactics. - -Glory is a pre-20th Century concept better understood by the ISTP -than by others. Or at least the ISTP is more interested in it than -most others. In battle there is glory, for it is in battle that -one can exercise one's lethal skills with positive sanction. - -The Seven Samurai were glorified and so have been duellists down -through the ages. Foss, Boyington, Fonck, and von Richtoffen, all -virtuosos of the winged machine gun, are still glorified heroes. -But there are hundreds of warriors just like them in nature. One -can test one's mettle in lethal duel, there's glory in it, as the -film The Great Waldo Pepper showed most poetically. - -The education and intelligence of the ISTP is worth special -comment. Possessed of artisan intelligence, ISTP is not in the -least interested in the clerical, interpretive, and "science" -curricula that abound in the 20th Century school. The other SPs, -equally bored by the school, will at least act as if they're trying -to learn, but not ISTP. ISTP will stare coldly into the eyes of -the teacher and not even say no. No amount of cajoling, bribing, -rewarding, punishing, or threat will get them to do their school -work. - -School work, quite apart from being irrelevant to the talents of -SPs, is, after all, mere preparation for something the ISTPs figure -they're never going to do anyway. SPs do not wish to prepare - for -anything - and ISTPs are careful to make this clear to their -would-be instructors. - -What is there to 'do', 'now', that is 'worthwhile'? ISTP will not -sit still (literally) for the trivial fare dished out -(sanctimoniously, in the eyes of the ISTP). Most seem to agree -that ISTPs "should" do their school work. But why? The arguments -are piddling and incoherent, warranting the scorn they get from the -unshakable ISTP. - -ISTPs are not "minimally brain damaged," or "hyperactive," or -"dyslexic"; they are active, and they are stubbornly insistent upon -getting to do, in school, some things that allow them to test their -intelligence and their mettle. Name-calling and pill-pushing won't -change them, other than destroying their self confidence and -perhaps creating a stimulant addict now and then. Give them a -tool-centered curriculum and watch their speed. - -Behaviorally the ISTP is more like the ESTP than any other type, -and the older they get, the greater the resemblance. When young, -ISTPs may look very much like ISFPs, but as their confidence and -pride increase this resemblance recedes. Jungians think ISTPs are -just like INTPs with only minor differences, but this is based on -the definition of ISTPs as "introverted thinking types." - -INTPs are logicians, philologists, and architects in the way they -think, but ISTPs are completely disinterested in these pursuits. -Even a cursory observation of a few clear-cut ISTPs will show how -striking the contrast, and how trivial the resemblance. - -Still, the most important thing about the ISTPs is their -commonality with other SPs. We might think that there would be -some resemblance to the ISTJ, having as they do, "IST" in common. -but no, their behavior is antithetical in almost every dimension of -comparison. One is pessimistic while the other optimistic; one is -parental, the other, fraternal; one saves, the other spends; one -believes in rules, the other is instinctual insubordinate and -recalcitrant to rules; and so on. - -ISTPs have infinitely more in common with the very different ESFP -than they do with any NT or SJ; besides the above, their mood is -one of good cheer, they are loyal to their equals, they want no -obligations, duties, or confining promises, are uncomplicated in -their desires, and are trusting, receptive, and generous. diff --git a/xtrn/smm/mb-j.asc b/xtrn/smm/mb-j.asc deleted file mode 100644 index 92c1cb6cbf..0000000000 --- a/xtrn/smm/mb-j.asc +++ /dev/null @@ -1,11 +0,0 @@ -The Judgement type tends toward planning, goal setting, deciding, and -getting-things-done. Once the J makes a decision he tends to be fixed and -inflexible. The J finds himself always waiting for others - who are always -late; thinks that if everyone would do what they are supposed to, the world -would be a better place, has a personal schedule for the day, and gets -frustrated when the schedule is interrupted, doesn't like surprises, keeps -lists, thrives on order, likes to finish-the-job. -J creates an environment that is structured, scheduled, ordered, planned, -and controlled; is decisive, deliberate. -J's plan their work and work their plan. -The population is equally divided between Js and Ps. diff --git a/xtrn/smm/mb-n.asc b/xtrn/smm/mb-n.asc deleted file mode 100644 index 3347e8fb90..0000000000 --- a/xtrn/smm/mb-n.asc +++ /dev/null @@ -1,7 +0,0 @@ -The iNtuitive type gets his information from within himself, tends to favor -hunches, bases his decisions on possibilities, is innovative, imaginative. -An N tends to think about several things at once, finds future possibilities -more intriguing than frightening, thinks 'boring details' is a redundancy, -believes time is relative, likes to figure out how things work, is prone to -puns & word games, thinks in terms of general directions rather than specific -steps. About 25% of the population are type N. diff --git a/xtrn/smm/mb-nf.asc b/xtrn/smm/mb-nf.asc deleted file mode 100644 index 988b822688..0000000000 --- a/xtrn/smm/mb-nf.asc +++ /dev/null @@ -1,22 +0,0 @@ -The purpose of life for an NF is to find his purpose in life. NF is self in -search of self & has difficulty understanding what seem to be the false goals -of others. Search for identity, meaning, & actualization. Believes his real -self is somewhat less than what it should be. Desires to be genuine, -transparent; without masks or game-playing. Life is a drama; each encounter -is pregnant with becoming. Very sensitive to non-verbal communication. -Relationships can fall into a pattern of generous investment of energy followed -by disappointment in what-could-have-been. Tend to be writers, poets, musicians -teachers, counselors, actors; excellent communicators; gift of helping people -grow; strong empathy. Good at appearing to be what the beholder wants to see. -Seeks greater intensity in relationships, seeks elusive intimacy. At once both -the audience and the actor. Often has difficulty putting limits on time & -energy spent at work. Seeks perfection; and is often disappointed. Tends to -romanticize experience. Hunger for relationships. -NF strengths are a capacity for working with people & drawing out their best, -being articulate & persuasive, a strong desire to help others, and the ability -to affirm others freely & easily. -As a manager, NF has difficulty being firm, tends to give workers too much -leeway. As mate, NF has a deep need to give & receive affection and avoid -conflict. As a teacher, NF makes each student feel important & cared about. -Desire to please & comfortable with theory makes NF an excellent student. -About 12% of the population. diff --git a/xtrn/smm/mb-nt.asc b/xtrn/smm/mb-nt.asc deleted file mode 100644 index 0b6ebfbf44..0000000000 --- a/xtrn/smm/mb-nt.asc +++ /dev/null @@ -1,32 +0,0 @@ -NT often feel like aliens in a world of SPs and SJs. The NT has a hunger for -understanding, control & power; not over people as much as over things. -Basic drives are for competence, abilities, skills, ingenuity. Loves doing -things well. Addicted to storing up wisdom & acquiring intelligence. Has -more interest in figuring things out than actually doing them. Self critical -and self doubt to the point of paralysis. Perfectionist, tense, compulsive, -fear-of-failure. Doesn't accept the conventional wisdom. Tries to lift others -to his own exaggerated levels of competence and can be arrogant with those -who choose not to see the complexity of his chosen area. His arrogance causes -others to withhold their reactions for fear of being labeled 'stupid' and -isolates him from the people around him. His speech tends to be terse, -compact, logical, precise. Wastes few words. Doesn't like to state the obvious. -Passion for knowing. Tends to seek complicated & exacting profession; engineer, -mathematics, philosophy. Enjoys building systems, developing models, exploring -ideas. Tends to be straightforward in dealing with others; others find him -cold, remote, detached & enigmatic. Vulnerable to all-work-and-no-play. -Enjoys playing with words, paradox, bad puns. Tends to focus on the future; -the past is dead & gone. Is humiliated when others witness his errors. -Not sensitive to emotions of others, capable of biting sarcasm. -NT strengths are the ability to see the big picture, a talent for systems -planning, insight into the internal logic & principles of systems, and the -ability to speak & write clearly. -As managers, NT is the strategic planner; as mate NT is more interested in -intellectualizing feeling & emotions than in experiencing them; As parent -NT provides a role model that is impossible to live up to; as teacher, NT -clarity & precision can be both exciting & intimidating to students, but -they can bore their students by working a point to death; in finances, NT -probably has a plan, but at the same time is comfortable with high risk -ventures. -NT chooses clothes for comfort & utility, doesn't pay much attention to -fashion. -About 12% of the population. diff --git a/xtrn/smm/mb-p.asc b/xtrn/smm/mb-p.asc deleted file mode 100644 index 2cccc090a0..0000000000 --- a/xtrn/smm/mb-p.asc +++ /dev/null @@ -1,9 +0,0 @@ -The Perceptive type tends toward plan-as-you-go, flexibility, open-ended -tentative agreements, and letting-life-unfold. P is easily distracted, loves -to explore the unknown, doesn't plan tasks, depends on last-minute-spurts to -meet deadlines, doesn't believe neatness counts, enjoys creativity, trys to turn -work into play, doesn't like to be pinned down, tends toward non-judgemental -statements. 'P' must generate alternatives for everything. -Likes to keep his options open, but not always - it all depends. - -The population is equally divided between Js and Ps. diff --git a/xtrn/smm/mb-s.asc b/xtrn/smm/mb-s.asc deleted file mode 100644 index ef399f5634..0000000000 --- a/xtrn/smm/mb-s.asc +++ /dev/null @@ -1,11 +0,0 @@ -The Sensor gets his information from external events; tends to be practical, -base his decisions on experience, is down to earth, and notices details. -An S prefers specific answers to specific questions, would rather DO something -rather than think about it, likes to concentrate on the task at hand, likes -tasks with tangible results, prefers facts to theories, thinks 'fantasy' is -a dirty word, prefers clear/complete plans to vague guidelines, are very -literal in use of words, very much a 'show me' person. An S may resist -taking this test & quickly get bored with it because it is not practical -and doesn't have an immediate application. S will take a long time to take -this test, reading every question carefully. -About 75% of the population are type S. diff --git a/xtrn/smm/mb-sj.asc b/xtrn/smm/mb-sj.asc deleted file mode 100644 index 78fc255339..0000000000 --- a/xtrn/smm/mb-sj.asc +++ /dev/null @@ -1,16 +0,0 @@ -The SJ exists to belong and be useful to his social group. A giver, provider, -caretaker, parent; feels uncomfortable in a dependent role. Duty oriented, -desires to serve, very aware of what-should-be-done. Is comfortable with -obligations. Has a strong work ethic & desire for hierarchy & rule & order. -Pessimistic, spends much energy in preparing for the future. Tradition & -heritage are important. Has a keen sense for detecting ingratitude & lack of -appreciation. Drawn to institutions; banking, teaching, government, service. -Strong desire to conserve & store-up-for-the-future. Obligation to serve -often overrides the fact that he is already overburdened. Backbone of society. -SJ strengths are administration, dependability, ability to take charge. -Home & hearth are cornerstones of SJ marriages, ritual & tradition is -important. SJ makes very clear who is the parent & what is expected of -children. As teacher SJ places high importance on neatness & punctuality. -SJ's are the money - and moneyed - people of the world. Prefers classic, -durable clothes. 60% of public school teachers are SJ. -About 38% of the population. diff --git a/xtrn/smm/mb-sp.asc b/xtrn/smm/mb-sp.asc deleted file mode 100644 index 76882d4822..0000000000 --- a/xtrn/smm/mb-sp.asc +++ /dev/null @@ -1,20 +0,0 @@ -The SP must be free & will not be tied down with responsibility. Eat, drink & -be merry, for tomorrow we die. In Aesop's fable of the ant & the grasshopper, -the SP is the grasshopper. SP has the urge for impulsive action-for-right-now -rather than practicing for some future event. Waiting is the same as death. -Likes diversity & trying new things. Easy come easy go. Not goal oriented. -Yet the SP shows long endurance; He wouldn't climb a mountain to get to the -top, but for the thrill of every moment. Gravitates toward jobs where action -is involved. Tends to be fraternal & loyal to his equals. Master of the grand -gesture, but not of the small important acts or words. Capable of abruptly -abandoning his path & striking out in a completely different direction. -Optimistic, libertarian, social equality. Compulsion to perform. -SP strengths are practicality, adept problem solving skills, resourcefulness. -As manager, SP is excellent in a crisis - and is not above creating a crisis -to give him a sense of purpose. As mate, enjoys intensity & a thrill a minute. -As teachers, are best at practical-vocational, tend to shy away from -theoretical or abstract. Not good at lesson plans. Dealing with money, SP is -the original high roller. Not good at academics, poor spellers, least likely -of all the types to receive a college degree. -Chooses clothes for IMPACT. -About 38% of the population. diff --git a/xtrn/smm/mb-t.asc b/xtrn/smm/mb-t.asc deleted file mode 100644 index b6d430d8b1..0000000000 --- a/xtrn/smm/mb-t.asc +++ /dev/null @@ -1,7 +0,0 @@ -The Thinker tends toward logic, reason, laws, policy, principals, justice, -and impersonal decisions. The T tends to favor critical analysis, stay calm -& objective when others panic, enjoy proving their point, would rather be -right than liked, remember facts better than faces. -The thinker thinks the feeler is fuzzybrained. -The population is equally divided between Ts and Fs, although more men tend -to be Thinkers & more women tend to be Feelers. diff --git a/xtrn/smm/mb-tj.asc b/xtrn/smm/mb-tj.asc deleted file mode 100644 index a5c3dbeca2..0000000000 --- a/xtrn/smm/mb-tj.asc +++ /dev/null @@ -1 +0,0 @@ -60 % of the world's managers are TJ. diff --git a/xtrn/smm/mb-type.asc b/xtrn/smm/mb-type.asc deleted file mode 100644 index efd263b45f..0000000000 --- a/xtrn/smm/mb-type.asc +++ /dev/null @@ -1,20 +0,0 @@ -yhMyers-Briggs Personality Types:nc - -The first letter of the personality type indicates how you are energized -(hEncxtroversion or hIncntroversion). - -The second letter of the personality type indicates how you obtain information -for your decisions (hSncensation or ihNnctuition). - -The third letter of the personality type measures your preference to operate -from your head to your heart (hTnchinking or hFnceeling). - -The fourth letter of the personality type indicates how you like to order your -life (hJncudging or hPncerception). - -An asterisk (h*nc) in any of your letter positions indicates you are equally -divided between the two personality tendancies. - -From here you can read definitions of letter combinations (types): -hEnc, hInc, hSnc, hNnc, hTnc, hFnc, hJnc, hPnc, hTJnc, hSPnc, hSJnc, hNTnc, hNFnc, hENFPnc, hENFJnc, hENTPnc, hENTJnc, hESFPnc, hESFJnc, -hESTPnc, hESTJnc, hINFPnc, hINFJnc, hINTPnc, hINTJnc, hISFPnc, hISFJnc, hISTPnc, and hISTJnc. diff --git a/xtrn/smm/mb-type.que b/xtrn/smm/mb-type.que deleted file mode 100644 index 987d79d569596870372afd7bab47c819ab32259e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10430 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 Mp&8v+2Co1v0H13GkN^Mx diff --git a/xtrn/smm/purity-1.asc b/xtrn/smm/purity-1.asc deleted file mode 100644 index 773f53d0a2..0000000000 --- a/xtrn/smm/purity-1.asc +++ /dev/null @@ -1,16 +0,0 @@ -Section 1: Platonic Relations. 19 Questions. - -For this section, if you are mostly a: - - - heterosexual, then your partner in deed, often referred to - by the word "someone" or "partner", is to be someone - of the OPPOSITE gender. - - - homosexual, then your partner in deed, often referred to by the - word "someone" or "partner", is to be someone of - YOUR OWN gender. - - - 50-50 confirmed bisexual, then your partner in deed, often - referred to by the word "someone" or "partner", is to - be someone of the OPPOSITE gender. - diff --git a/xtrn/smm/purity-2.asc b/xtrn/smm/purity-2.asc deleted file mode 100644 index b69f67e1b6..0000000000 --- a/xtrn/smm/purity-2.asc +++ /dev/null @@ -1,7 +0,0 @@ -Section 2: Auto-erotica and Mono-sexualism. 51 Questions. - - Although this section is termed Auto-erotica and mono-sexualism, the - events herein still count even if you are with someone else at the time. - It was so named because these activities, like the harp, (and the - porcelain goddess) are predominantly solo events. - diff --git a/xtrn/smm/purity-3.asc b/xtrn/smm/purity-3.asc deleted file mode 100644 index 5c33111569..0000000000 --- a/xtrn/smm/purity-3.asc +++ /dev/null @@ -1,2 +0,0 @@ -Section 3: Legislative Misfits and Other Ethical Matters. 61 Questions. - diff --git a/xtrn/smm/purity-4.asc b/xtrn/smm/purity-4.asc deleted file mode 100644 index 37289ae749..0000000000 --- a/xtrn/smm/purity-4.asc +++ /dev/null @@ -1,2 +0,0 @@ -Section 4: Drugs. 43 Questions. - diff --git a/xtrn/smm/purity-5.asc b/xtrn/smm/purity-5.asc deleted file mode 100644 index 14d44dda2c..0000000000 --- a/xtrn/smm/purity-5.asc +++ /dev/null @@ -1,16 +0,0 @@ -Section 5: Non Platonic Relations. 63 Questions. - -For this section, it you are mostly a: - - - heterosexual, then your partner in deed, often referred to by - the word "someone" or "partner", is someone of the - OPPOSITE gender. - - - homosexual, then your partner in deed, often referred to by the - word "someone" or "partner", is to be someone of - your OWN gender. - - - 50-50 confirmed bisexual, then your partner in deed, often referred - to by the word "someone" or "partner", is to be - someone of the OPPOSITE gender. - diff --git a/xtrn/smm/purity-6.asc b/xtrn/smm/purity-6.asc deleted file mode 100644 index 3531a8ef77..0000000000 --- a/xtrn/smm/purity-6.asc +++ /dev/null @@ -1,18 +0,0 @@ -Section 6: Non Primary Choice Relations. 39 questions. - - This section of the test deals with whether you have done things with - people whom you may not be altogether comfortable, therefore in this - section of the test, if you are mostly a: - - - heterosexual, then your partner in deed, often referred to by the - word "someone" or "partner", is to be someone of your - OWN gender. - - - homosexual, then your partner in deed, often referred to by the - word "someone" or "partner", is someone of the - OPPOSITE gender. - - - 50-50 confirmed bisexual, then your partner in deed, often - referred to by the word "someone" or "partner", is to - be someone of your OWN gender. - diff --git a/xtrn/smm/purity-7.asc b/xtrn/smm/purity-7.asc deleted file mode 100644 index 4cf23745bc..0000000000 --- a/xtrn/smm/purity-7.asc +++ /dev/null @@ -1,8 +0,0 @@ -Section 7: Alternate Choices. 26 questions. - - For any of the questions in this section, a yes answer is in order if it - is something that you do as an alternative to other sexual gratifications - or as an aid and/or in conjunction with other means of sexual - gratification. In other words, have you done it in a serious basis? - Trying it a few times to see what it's like does not count. - diff --git a/xtrn/smm/purity-8.asc b/xtrn/smm/purity-8.asc deleted file mode 100644 index bad4ef2b31..0000000000 --- a/xtrn/smm/purity-8.asc +++ /dev/null @@ -1,7 +0,0 @@ -Section 8: Group Sexual Relations. 27 questions. - - This section relates to what you have or have not done. Accordingly, the - group of people of which we are speaking are of both genders. In - questions where groups of people are concerned, there must be at least - one person in the group who is of the opposite gender. - diff --git a/xtrn/smm/purity-9.asc b/xtrn/smm/purity-9.asc deleted file mode 100644 index 85a257e743..0000000000 --- a/xtrn/smm/purity-9.asc +++ /dev/null @@ -1,6 +0,0 @@ -Section 9: Non sentient objects. 62 questions. - - This section measures your kinkiness. Therefore, the questions apply to - actions and events which occurred while you were alone, as well as those - which occurred while you were with someone else. - diff --git a/xtrn/smm/purity-a.asc b/xtrn/smm/purity-a.asc deleted file mode 100644 index 3218f28900..0000000000 --- a/xtrn/smm/purity-a.asc +++ /dev/null @@ -1,5 +0,0 @@ -Section 10: Locality. 33 questions. - -This section tries to figure out how many places you have done it. It -applies only to those situations in which you were with someone else. - diff --git a/xtrn/smm/purity-b.asc b/xtrn/smm/purity-b.asc deleted file mode 100644 index ad61bbf6c6..0000000000 --- a/xtrn/smm/purity-b.asc +++ /dev/null @@ -1,2 +0,0 @@ -Section 11: Style. 76 questions. - diff --git a/xtrn/smm/purity.100 b/xtrn/smm/purity.100 deleted file mode 100644 index c97b56bea1..0000000000 --- a/xtrn/smm/purity.100 +++ /dev/null @@ -1,100 +0,0 @@ -Had a date -Been out on a date past 4 am -Had a blind date -Kissed a MOS -Been french kissed -Kissed a MOS in the horizontal position -French kissed three or more MOS's in 24 hours -Kissed a MOS in the last three months -Necked for more than 2 hours consecutively -Slow danced cheek-to-cheek -Had an alcoholic drink -Been drunk -Driven while under the influence of alcohol or drugs -Had a lapse of memory due to drinking or drugs -Used alcohol or drugs to lower a MOS's resistance -Smoked tobacco -Smoked pot or hashish -Used a stronger drug -Taken 4 or more "recreational" drugs within 24 hours -Read a pornographic book or magazine -Seen a pornographic movie -Seen a stripper -Been arrested -Been convicted of a crime -Had an erection/clitoral erection -Had an orgasm -Had an orgasm in a dream -Fondled a MOS's ass -Caressed a MOS's thigh -Fondled a breast or had your breast fondled -Wrestled with a MOS -Showered, bathed, jacuzzied, or saunaed with a MOS -Gone coed skinny-dipping -Gone through the motions of intercourse while fully clothed -Spent the night in a MOS's room -Slept in the same bed with a MOS -Seen a naked post-pubescent MOS -Been seen naked by a MOS after puberty -Undressed or been undressed by a MOS -Kissed a MOS on the breast or been kissed on the breast -Fondled a MOS's genitals or had your genitals fondled by a MOS -Had an orgasm due to manipulation by a MOS -Kissed a MOS on the thigh -Engaged in cunnilingus -Engaged in fellatio -Had sexual intercourse at a parents house while they were home -Engaged in definitely sexual activity on the first date -Masturbated -Masturbated to a picture -Masturbated with another person in the room -Watched another person masturbate -Been caught masturbating -Simulated intercourse with an inanimate object -Committed an act of voyeurism -Committed an act of exhibitionism -Massaged or been massaged by a MOS -Unintentionally interrupted a couple in a significant state of undress -Participated in a tickle orgy, gross out, truth or dare, etc. -Experimented sexually before puberty -Purchased contraceptives in a drug store -Had sexual intercourse -Had sexual intercourse more than 10 times -Had sexual intercourse continuously for 1/2 hour -Had sexual intercourse within the last 3 months -Had sexual intercourse 3 or more times in 1 night -Had sexual intercourse in 3 or more positions -Had sexual intercourse in a car -Had sexual intercourse using a condom -Done sixty-nine -Had sexual intercourse outdoors -Had sexual intercourse with 3 different people -Had sexual intercourse with a virgin -Had sexual intercourse during menstruation -Had sexual intercourse without using birth control -Had sexual intercourse with 2 MOSs in 24 hours -Had sexual intercourse in a public place -Described a sexual experience to a separate party -Committed statutory rape -Been the object of travel or traveled 100 miles or more for sexual activity -Impregnated a woman or been pregnant -Arranged or had an abortion -Displaced a roommate by staying with a MOS for 1 or more nights -Shacked up with a MOS for a month or more -Tasted semen -Been propositioned by a prostitute or pimp -Accepted -Had anal intercourse -Been tested for V.D. due to reasonable suspicion -Had V.D. -Picked up a strange MOS for sexual purposes -Engaged in group sex -Engaged in sadism or masochism for sexual enjoyment -Been propositioned by a member of the same sex -Accepted a proposition by a member of the same sex -Been masturbated by a member of the same sex -Been orally stimulated by a member of the same sex -Committed incest -Fondled a pre-pubescent MOS -Engaged in transvestitism for sexual enjoyment -Committed bestiality diff --git a/xtrn/smm/purity.500 b/xtrn/smm/purity.500 deleted file mode 100644 index 5f389c7ea8..0000000000 --- a/xtrn/smm/purity.500 +++ /dev/null @@ -1,511 +0,0 @@ -*PURITY-1.ASC -Kissed a friend or stranger as a friendly gesture -Held hands with someone -Had a date -Had a date past 1 a.m. -Dated someone on a regular basis -Picked someone up -Been picked up -Gone steady -Slow danced -Had the symptoms of Russian fingers (rushin' fingers) -Had the symptoms of Roman hands (roamin' hands) -Shared a bed with someone without anything steamy happening -Given a back or neck rub or massage with no ulterior motive -Used tickling as a pick-up get-to-know-you-better routine -Directly asked someone if they were a virgin -Used physical strength as a get-to-know-you-better routine -Secretly lusted after someone without that person knowing -Dropped subtle hints to someone hoping they would pick up on it -Written anonymous 'love letters' to someone -*PURITY-2.ASC -Had an arousing dream (Wet dreams and the like.) -Been sexually aroused -Uttered/muttered/yelled/screamed obscenities -Fantasized about your instructor or teacher -Fantasized about your lawyer, doctor, nurse, psychiatrist -Fantasized about someone you know personally but not closely -Fantasized about anyone and masturbated at the same time -Read or bought pornographic periodicals -Ever had a subscription to pornographic periodicals -Read sexually explicit literature -Gone skinny dipping alone -Made obscene phone calls -Phoned up any recorded phone sex numbers -Phoned up any live phone sex numbers -Stuffed your bra or stuffed your pants -Shaved your genital pubic hair -Shaved your genital pubic hair on a fairly regular basis -Colored or bleached your genital pubic hair -Shaved or shaped your genital pubic hair in a particular design -Masturbated -Masturbated at least five times in one twenty-four hour period -Masturbated on a fairly regular basis of no less than once a week -Masturbated where you could have been discovered -Masturbated out in the wilds or in nature -Masturbated to orgasm -Masturbated while reading sexually explicit materials -Masturbated while driving a *moving* land vehicle -Masturbated while on the phone -Masturbated while in a bathroom of the opposite sex -Masturbated while watching an R or X-rated show -Seen any burlesque show (Rocky Horror counts) -Been to a peep show -Been to a private showing of a pornographic movie -Seen a pornographic movie in a theater -Walked around in your room/apartment/house/habitation in nude -Walked around in a public or semi-public area bottomless -Bought blatant sexual objects -Owned any erotic art pieces -Written your own fantasies for masturbatory purposes -Sculpted erotic/obscene artworks in food -Eaten any erotic food items (Chocolate tits, banana dicks) -Sculpted erotic/obscene artworks in soap, wood, etc -Made an X- or R-rated snowman or snowwoman -Tasted your own orgasmic liquids -Inserted your finger into your rectum -Used ben-wa balls or anal beads -Performed oral sex on yourself -Willingly urinated on your garments while wearing them -Willingly urinated on any part of your body -Willingly defecated on your garments while wearing them -Willingly defecated on yourself -*PURITY-3.ASC -Administered a whole Purity Test or in the process -Taken Purity Tests of any versions more than 5 times -Lied on any previous Purity Tests -Exaggerated about any sexual experiences -Gone to (or escorted someone to) a Planned Parenthood Clinic -Broken your word, promise, or vow -Lied to someone at someone else's request -Lied about your sexual preference in order to avoid a date -Written graffitti -Plagiarized -Shoplifted -Stolen -Made out a check that bounced -Used someone else's credit card without their knowledge -Committed breaking and entering -Seen a snuff film -Read someone else's diary without their knowledge or consent -Searched someone's room without their knowledge or consent -Told someone that you loved them when you did not -Told someone that you loved them just for sex -Fantasized about someone else while having sex -Intentionally listened in on other people having sex -Used alcohol to lower someone else's inhibitions for sex -Used drugs to lower someone else's inhibitions for sex -Drugged someone without their knowledge and/or consent -Forced someone into having intimate physical relations with you -Had dates with more than one person in the same night -Gone steady with two or more people at the same time(secret) -Gone steady with two or more people at the same time(known) -Urinated on someone else intentionally (Piss fights!) -Urinated in object that was not designed for such purpose -Urinated anywhere other than commonly accepted piss hole -Urinated from higher than the fifth floor or off a bridge -Defecated anywhere other accepted shit hole -Stored any excretia in a refrigerator/oven -Stored evacuated excretia in your room/apartment -Entered a bathroom of the opposite sex- unaccompanied -Mooned or flashed someone from the front -Farted (audibly) in mixed company -Streaked/flashed or exposed yourself in public -Streaked/flashed or exposed yourself at a formal gathering -Been arrested (Picture taken and all) -Received money to have sex or mutual masturbation with someone -Given money to have sex mutual masturbation with someone -Thought you might be or might have caused someoneto be pregnant -Bought a home pregnancy test -Bought condoms -Borrowed/stolen/taken birth control devices from someone else -Had or given someone an unwanted pregnancy -Lied about being pregnant or about having made someone pregnant -Had sex while either you or your partner were under age -Thought you had VD -Had VD of any sort (VD/STD's/the clap/crabs/herpes/etc.) -Had an AIDS test due to reasonable suspicion or imagination -Given a sympathy fuck -Initiated sex with someone for the sake of sex only -Willingly committed incest -Committed adultery -Bought lingerie/undergarments of the opposite sex -Stolen the underwear of someone you knew not for joke -Intentionally taken a stranger's underwear -*PURITY-4.ASC -Had an alcoholic drink -Been intoxicated -Thrown up from having drunk too much alcohol -Passed out due to having drunk too much alcohol -Forgotten events that occurred while you were drunk -Smoked tobacco (cigarette/pipe/cigar/hookah) -Chewed tobacco (snuff) -Bought controlled/illicit drugs in violation of the law -Sold or re-sold controlled/illicit substances -Taken stimulants -Taken depressants excluding alcohol -Inhaled nitrous oxide while not visiting a dentist -Inhaled anything containing butyl nitrate -Used a commercial aphrodisiac -Taken valium -Smoked marijuana/sensemilia -Smoked marijuana/sensemilia more than four times -Eaten marijuana/sensemilia -Eaten marijuana or sensemilia more than four times -Taken opiate in any form -Taken opiate in any form more than twice -Used cocaine -Used cocaine more than four times -Injected any drugs into your body other than medical -Injected any illegal drug into your body more than twice -Taken Ecstasy/X -Taken PCP -Taken PCP more than twice -Taken LSD-25, peyote or psilocybin -Taken LSD/peyote or psilocybin more than twice -Taken LSD more than six times -Deliberately injured yourself so as to obtain medication -Played any games in which drugs were the prize -Gone to class or work while under the influence of drugs -Mixed drugs (alcohol counts) -Sold possessions in order to obtain drugs -Had sex while under the influence of nitrous -Had an orgasm while under the influence of nitrous -Had sex while under the influence of cocaine -Had sex while under the influence of marijuana/sensemilia -Had sex while under the influence of Ecstasy/X -Had sex while under the influence of LSD/peyote or psilocybin -Had sex while under the influence with a unknowing partner -*PURITY-5.ASC -Propositioned someone for necking or petting -Propositioned someone for sex/oral sex or mutual masturbation -Pinched or patted someone else's buttocks -French kissed -Been kissed below the neck but not including arms or hands -Kissed someone else below the neck not including arms or hands -Necked -Petted above the waist -Petted below the waist -Kissed on the first date -Necked on the first date -Petted above the waist on the first date -Petted below the waist on the first date -Given a hickey -Received a hickey -Worn specific clothes for the purpose of hiding hickeys -Fondled or stroked someone else's clothed legs -Fondled or stroked someone else's bare legs -Fondled or stroked someone else's frontal chest/torso region -Had your frontal chest/torso region fondled or stroked -Been involved with pelvic thrusting while fully clothed -Had your fingers licked or sucked -Had your ear or ear region licked/sucked, or nibbled -Licked, breathed onto, sucked, or nibbled an ear or ear region -Licked or sucked someone else's finger(s) -Fondled someone who was asleep -Given a back massage with ulterior motives -Given a back massage that led to something steamier -Seen someone completely nude when under good light conditions -Been seen nude by someone else under good lighting conditions -Been in someone's company while both were completely nude -Bathed or showered with someone -Let someone else wash you when you were capable of doing it -Gone skinny dipping in mixed company -Been involved with the fondling of a woman's clothed breast -Been involved with the fondling of a woman's bare breast -Licked, sucked, or nibbled on someone else's nipple -Had your nipple licked, sucked, or nibbled upon -Petted/fondled or otherwise handled someone's covered genitals -Had your covered genitals petted/fondled or handled -Petted/fondled or otherwise handled someone's bare genitals -Had your bare genitals petted/fondled or otherwise handled -Had an orgasm while petting -Given your partner an orgasm while petting -Given finger scratch marks -Received finger scratch marks -Drawn blood by scratching during sex -Drawn blood by biting during sex -Given or received *scars* from scratches or bites during sex -Performed oral sex -Received oral sex -Swallowed semen, or licked female liquids off of fingers -Done sixty-nine -Performed mutual masturbation -Had sex (No need for orgasm; penetration counts.) -Had sex on the first date -Had sex without the use of birth control devices -Had sex with a virgin (Not yourself.) -Had sex with someone whose name you did not know -Had sex with someone whose face you never saw -Had sex with someone with a 20 year age difference -Had sex with someone not of your own race -Had sex with a religious officiary -*PURITY-6.ASC -Held hands or otherwise displayed public affection -Kissed someone on the lips -French kissed someone -Necked -Petted -Received manual sex -Given manual sex -Received oral sex -Given oral sex -Had sex -Had sex with a virgin (not yourself.) -Had sex with someone with age difference of more than 20 years -Had anal sex -Been involved in fist-fucking -Done 69 (simultaneous oral sex.) -Propositioned someone for sex, oral sex, or mutual masturbation -Yielded willingly to a proposition from someone for sex/oral sex -Had sex with someone whose name you didn't know -Had sex with someone whose face you never saw -Been a participant in a who's-physically-better-equipped contest -Been a judge in a contest such as above -Gave money or favors for sex, oral sex, or mutual masturbation -Received money or favors for sex/oral sex or mutual masturbation -Fondled someone who was asleep -Attempted to seduce someone -Allowed yourself to be seduced -Had an orgasm while petting -Gave your partner an orgasm while petting -Had an orgasm at all -Had sex/oral sex or mutual masturbation with more than 10 people -Stroked or fondled the clothed legs of someone -Stroked or fondled the bare legs of someone -Stroked or fondled the clothed chest/torso region of someone -Stroked or fondled the bare chest/torso region of someone -Fondled or handled the clothed genitals of someone else -Stroked/fondled or handled the bare genitals of someone else -Had sex/mutual masturbation with someone not of your own race -Been in a menage-a-trois of people of the same sex -Been involved in group sex/with all participants of the same sex -*PURITY-7.ASC -Been decidedly heterosexual -Been decidedly homosexual -Been decidedly bisexual -Practiced bestiality (avec les animaux) -Practiced transvesticism -Practiced sadism -Practiced masochism -Practiced bondage -Practiced domination -Practiced submission -Practiced sodomy (anal intercourse) -Practiced cocrophilia (a marked interest in excrement) -Practiced frotteurism -Practiced infantilism(a dependency on diapers) -Practiced klismaphilia (a dependency on being given an enema) -Practiced necrophilia (copulation with a corpse) -Practiced mysophilia (a dependency on something soiled) -Practiced scoptophilia ( as in voyeurism) -Practiced urophilia (being responsive to urine ) -Practiced role-playing -Owned an underwear collection of underwear not belonging to you -Been a foot fetishist to any degree -Been a leather fetishist to any degree -Been a rubber/latex fetishist to any degree -Been a voyeur -Been an exhibitionist -Listened to dirty jokes in mixed company -*PURITY-8.ASC -Told dirty jokes in mixed company -Discussed masturbation -Watched a porn movie in mixed company -Watched a porn movie with your own or someone else's parents -Played a game which may require you or others to disrobe -Played a game which may require you to perform action on others -Been in contact with more than one person while all were nude -Had oral sex with more than 10 people (not nec. at one time) -Had sex with more than 10 people (not necessarily at one time) -Had sex with more than 1 person in a 24 hour period -Had sex with both genders in a 24 hour period -Been in a menage-a-trois (MFM OR FMF) -Walked in on others having sex (oops) and then joined in -Had sex or oral sex with a person and his/her parent -Had sex/mutual masturbation, with a person and his/her sibling -Been involved in a two (or more) in one -Been involved in a gang bang -Been in a circle of fuck -Been in a 69 circle -Been to a (cooking, baby, Wesson) oil party -Played naked Twister [tm] (with or without oil) -Participated in a hetro orgy or been involved in group sex -Participated in a bisexual orgy or group sex -Propositioned a person or group of people for group sex -Been propositioned for group sex -Participated in a fuck-a-thon -*PURITY-9.ASC -Used a foreign object or something for masturbation -Masturbated using the aid of food -Eaten the food used in masturbation after masturbation -Eaten a lab dissection -Inserted food into your or someone else's anus -Eaten food after it was extracted from your or someone's anus -Received an enema for a purpose other than medical -Received an enema consisting on a non-normal enema solution -Actually measured your own or someone else's penis -Used a mechanical device in aiding or replacing masturbation -Used a feather or other device for the purpose of tickling -Used tickling as a form of *arousal* -Used ice for sexual purposes -Used ice for something frozen as a dildo -Used a strap-on dildo or male extension sheath -Used whipped cream for sexual purposes -Used hot/melted wax for sexual purposes -Had sex in front of or under a mirror -Put food on your partner's body, and then eaten it -Used household syrup/etc or any like substance for sex purposes -Used ropes, cuffs or any other such device for bondage purposes -Used a whip, cat-o-nine-tails, or something similar for pain -Worn edible underwear/lingerie -Eaten edible underwear/lingerie off of someone -Worn a leather or rubber suit -Worn diapers for a sexual or masturbatory purpose -Been diapered by someone else for a sex or masturbatory purpose -Used a ball gag or other manufactured gag -Worn a collar and/or leash -Been completely tied down (spreadeagled, hogtied, etc.) -Tied someone down completely -Had sex while you or your partner was tied up -Used nipple clips (clothespins count) -Pierced a part of your body other than your ears or nose -Found a prepubescent child sexually attractive/arousing -Had sexual contact of any kind with a prepubescent child -Used an inflatable doll -Humped an inanimate object like a pillow, banana, etc -Had sex or oral sex with a dead person -Inserted a small animal or creature into your rectum -Had sex or oral sex with your (dead) dinner animal -Watched animals having sex -Been aroused by the sight of animals having sex -Attempted to have sex with a live animal, but failed -Had sex/oral sex or (mutual) masturbation with smallish animal -Had sex/oral sex or masturbation with domesticated farm animal -Mutilated or killed any living animal for your pleasures -Had sex with a live animal (Any size.) -Received oral sex from a live animal (Any size.) -Gave oral sex to a live animal (Any size.) -Had sex or (mutual) masturbation with a animal more than once -Had sex or masturbation with an animal in presence of others -Cross dressed in the *undergarments* of the opposite sex -Cross dressed in presence of others -Stuffed your pants or bra while you were cross-dressed -Had your head inserted into a urinal or toilet bowl willingly -Worn groinal underwear on your head (Panties/jock-strap/etc.) -Inserted a piece of groinal underwear into your mouth -Deliberately sniffed or smelled a piece of groinal underwear -Been gagged with someone's underwear (not your own) -Played in or with shit -Worn or used a used condom or feminine hygiene contraption -*PURITY-A.ASC -Necked or petted in a place of religion -Had sex or been involved in a place of religion -Necked or petted in a place of the dead (mortuary) -Had sex or been involved in oral sex in a place of the dead -Necked or petted in a contraption of the dead (hearse/etc) -Had sex in a contraption of the dead -Had sex in/on a construction site (house, office, etc.) -Necked or petted in a vehicle of LESS THAN 30,000 pounds net -Had sex in a vehicle of LESS THAN 30,000 pounds net -Necked or petted in a vehicle of MORE THAN 30,000 pounds net -Had sex in a vehicle of MORE THAN 30,000 pounds net -Had sex in a land-based, non road dependant vehicle -Necked in a water, manual powered vehicular transport medium -Petted in a water/wind or prop driven transport medium -Had sex in a water/wind driven transport MORE THAN 80 feet -Had sex or oral sex in an aircraft -Had sex in a household room other than a bedroom -Had sex on the floor (but not the roof) -Had sex on any furniture that is indoors but not a bed or table -Had sex telephone booth, voting booth/etc -Had sex in an elevator, people-mover, escalator, dumbwaiter -Had sex up a tree but not in a tree house or similar structure -Had sex in a suspension device of some kind (hammock) -Had sex on the roof of a building in excess of 5 floors -Had sex within the confines of a hedge, bush/etc -Had sex, oral sex, or mutual masturbation in the snow -Had sex in a place with the ambient temperature below freezing -Had sex in a place where you could have been discovered -Had sex in a water-filled bathtub, hot tub/etc -Had sex, oral sex, or mutual masturbation in a body of water -Had sex on the beach -Had sex or mutual masturbation in a bathroom of the opposite sex -Gone to a motel for the sole purpose of having sex -*PURITY-B.ASC -Watched while someone else masturbated -Been watched while masturbating -Orgasmed on somebody -Orgasmed in somebody (male) or in you (female) -Had more than one person orgasm on you at once -Used a penis as a leash or bludgeoning device -Been involved in oxygen deprivation for sexual enhancement -Willingly made video tapes or pictures taken while having sex -Physically watched others having sex -Watched your partner of choice having sex with someone else -Taken pictures of your partner having sex with someone else -Willingly made audio recordings while having sex -Talked dirty while having sex, oral sex, or mutual masturbation -Intentionally made more noise than necessary while having sex -Intentionally made 'animal' noises during sex -Had a pet walk over you or your partner while during sex -Had a general emergency arise while you were steeped in sex -Had your sexual technique/style/skill openly praised by someone -Taken nude pictures of someone else -Had nude pictures of you taken -Placed a personal ad -Answered a personal ad -Been involved in breast fucking (The Hawaiian Muscle Fuck) -Participated in fist-fucking (see 'Caligula') -Shaved someone's pubic hair (or had yours) as part of sex -Had sex for more than three hours in a single session of sex -Been bruised during sex, oral sex, or mutual masturbation -Bruised someone else during sex, oral sex, or mutual masturbation -Been injured during sex, oral sex, or mutual masturbation -Orgasmed more than three times in one session of sex -Had sex so many times or for so long that one involved runs dry -Disturbed other people by making excessive noise during sex -Had sex or received oral sex while you were driving -Had sex doggie fashion -Had sex in the female superior position -Had sex sitting up -Had sex standing up -Had sex upside-down -Gone through several sexual positions without need for re-entry -Fallen asleep during sex -Woken up to someone having sex with you -Had sex while one person was passed out or unconscious -Given or received a hickey on your upper inner thigh -Been on the receiving of anal sex -Been on the ramming end of anal sex (a dildo counts) -Had sex more than 10 times with 1 person -Had sex more than 5 times in a 24 hour period -Had sex more than 10 times in a 24 hour period -Had sex while someone other than your partner was watching -Had sex while one or both were playing a musical instrument -Performed oral sex after intercourse without washing or douching -Kissed your partner on the lips after oral sex without rinsing -Inflicted pain during sex -Been involved in cunnilingus during the woman's period -Had sex during the woman's period -Foot masturbated someone -Been foot masturbated -Tongue bathed someone -Been tongue bathed -Licked or sucked on someone else's feet and/or toes -Had your feet and/or toes licked or sucked by someone else -Licked someone's anus -Licked someone's anus while they were defecating -Performed oral sex while the person was urinating -Drank your own urine -Tasted or drank someone else's urine -Drank/drained an entire bladder-full of someone else's urine -Drank human blood -Tasted someone else's nasal mucous -Been involved in a golden shower -Swallowed your partner's orgasmic secretions -Used the Purity Test as a checklist of things you could do -Ever done something for purpose of lowering your Purity score -Bought/read books to enhance sexual technique -Participated in Purity Testing with an ulterior motive -Become interested in person after hearing their Purity score diff --git a/xtrn/smm/purity.asc b/xtrn/smm/purity.asc deleted file mode 100644 index 3aae420c00..0000000000 --- a/xtrn/smm/purity.asc +++ /dev/null @@ -1,31 +0,0 @@ -nch THE UNISEX, OMNISEXUAL - -y P U R I T Y T E S T -nc_______________________________________________________________________________ - - rhiWARNINGnrh: THIS TEST MAY EASILY OFFEND YOU - -chInstructions for Use: -nc -This is a fairly long test consisting of hone hundred questionsnc. It starts out -tame and gets progressively worse (or better, depending on your viewpoint). - -hDefinitions -nc -Any references to hMOSnc are references to a hMncember of the hOncpposite hSncex. - -All questions in this test pertain to events that have happened to you -subsequent to your weaning and babyhood/infancy. Anything that may have -happened before that time is considered not standing and void. - -The term mutual masturbation refers to someone masturbating you AND/OR you -masturbating someone else, not exclusively both at the same time. - -We would also like to define having sex in the homosexual case; homosexual sex -has occurred when both partners are of the same sex and one of the partners has -an orgasm while there is some contact between the genitals of both partners. - -We would now like to bring to your attention that there is no passing nor -failing score. Therefore, one really shouldn't worry too much about getting a -high score... even if you do get giggled at for the rest of your life. - diff --git a/xtrn/smm/purity.que b/xtrn/smm/purity.que deleted file mode 100644 index c97b56bea1..0000000000 --- a/xtrn/smm/purity.que +++ /dev/null @@ -1,100 +0,0 @@ -Had a date -Been out on a date past 4 am -Had a blind date -Kissed a MOS -Been french kissed -Kissed a MOS in the horizontal position -French kissed three or more MOS's in 24 hours -Kissed a MOS in the last three months -Necked for more than 2 hours consecutively -Slow danced cheek-to-cheek -Had an alcoholic drink -Been drunk -Driven while under the influence of alcohol or drugs -Had a lapse of memory due to drinking or drugs -Used alcohol or drugs to lower a MOS's resistance -Smoked tobacco -Smoked pot or hashish -Used a stronger drug -Taken 4 or more "recreational" drugs within 24 hours -Read a pornographic book or magazine -Seen a pornographic movie -Seen a stripper -Been arrested -Been convicted of a crime -Had an erection/clitoral erection -Had an orgasm -Had an orgasm in a dream -Fondled a MOS's ass -Caressed a MOS's thigh -Fondled a breast or had your breast fondled -Wrestled with a MOS -Showered, bathed, jacuzzied, or saunaed with a MOS -Gone coed skinny-dipping -Gone through the motions of intercourse while fully clothed -Spent the night in a MOS's room -Slept in the same bed with a MOS -Seen a naked post-pubescent MOS -Been seen naked by a MOS after puberty -Undressed or been undressed by a MOS -Kissed a MOS on the breast or been kissed on the breast -Fondled a MOS's genitals or had your genitals fondled by a MOS -Had an orgasm due to manipulation by a MOS -Kissed a MOS on the thigh -Engaged in cunnilingus -Engaged in fellatio -Had sexual intercourse at a parents house while they were home -Engaged in definitely sexual activity on the first date -Masturbated -Masturbated to a picture -Masturbated with another person in the room -Watched another person masturbate -Been caught masturbating -Simulated intercourse with an inanimate object -Committed an act of voyeurism -Committed an act of exhibitionism -Massaged or been massaged by a MOS -Unintentionally interrupted a couple in a significant state of undress -Participated in a tickle orgy, gross out, truth or dare, etc. -Experimented sexually before puberty -Purchased contraceptives in a drug store -Had sexual intercourse -Had sexual intercourse more than 10 times -Had sexual intercourse continuously for 1/2 hour -Had sexual intercourse within the last 3 months -Had sexual intercourse 3 or more times in 1 night -Had sexual intercourse in 3 or more positions -Had sexual intercourse in a car -Had sexual intercourse using a condom -Done sixty-nine -Had sexual intercourse outdoors -Had sexual intercourse with 3 different people -Had sexual intercourse with a virgin -Had sexual intercourse during menstruation -Had sexual intercourse without using birth control -Had sexual intercourse with 2 MOSs in 24 hours -Had sexual intercourse in a public place -Described a sexual experience to a separate party -Committed statutory rape -Been the object of travel or traveled 100 miles or more for sexual activity -Impregnated a woman or been pregnant -Arranged or had an abortion -Displaced a roommate by staying with a MOS for 1 or more nights -Shacked up with a MOS for a month or more -Tasted semen -Been propositioned by a prostitute or pimp -Accepted -Had anal intercourse -Been tested for V.D. due to reasonable suspicion -Had V.D. -Picked up a strange MOS for sexual purposes -Engaged in group sex -Engaged in sadism or masochism for sexual enjoyment -Been propositioned by a member of the same sex -Accepted a proposition by a member of the same sex -Been masturbated by a member of the same sex -Been orally stimulated by a member of the same sex -Committed incest -Fondled a pre-pubescent MOS -Engaged in transvestitism for sexual enjoyment -Committed bestiality diff --git a/xtrn/smm/que.lst b/xtrn/smm/que.lst deleted file mode 100644 index 95018ef15d..0000000000 --- a/xtrn/smm/que.lst +++ /dev/null @@ -1,12 +0,0 @@ -BASIC -Basic Personality -0 -APPEAR -Appearance -0 -MATERIAL -Material -0 -ADULT -Adult Sexuality -18 diff --git a/xtrn/smm/smm.can b/xtrn/smm/smm.can deleted file mode 100644 index 503ab7da42..0000000000 --- a/xtrn/smm/smm.can +++ /dev/null @@ -1,4 +0,0 @@ -l -p -digital man -fuck diff --git a/xtrn/smm/smm.cfg b/xtrn/smm/smm.cfg deleted file mode 100644 index 334011d05e..0000000000 --- a/xtrn/smm/smm.cfg +++ /dev/null @@ -1,22 +0,0 @@ -18 -15 -0 - - - - -0 -0 -30 -1 - -0 -0 -0 -0 -0 -%!dsz portx %u,%i sz %f -0 - - -90 diff --git a/xtrn/smm/smm.doc b/xtrn/smm/smm.doc deleted file mode 100644 index 37939ac625..0000000000 --- a/xtrn/smm/smm.doc +++ /dev/null @@ -1,594 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - Synchronet Match Maker Version 2.10 Copyright 1996 Digital Dynamics - -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - "Perhaps the most comprehensive Match Maker ever." - - -Synchronet Installation (if you are using Synchronet BBS Software) -================================================================== - -Synchronet Match Maker (SMM) comes pre-installed in Synchronet BBS v2.1 and -later. If match maker has been pre-installed in your system, see the file -UPGRADE.DOC for details on installing a newer version over an older version -(upgrading). - -Create the following sub-directory off of your main Synchronet directory -(e.g. C:\SBBS): - -XTRN\SMM (The XTRN directory should already exist) - -(example: C:\SBBS\XTRN\SMM) - -Copy the files included in the archive or on the floppy disk into this -directory. The DEMO and registered versions of this program are identical. -The registration number must be obtained from Digital Dynamics and entered -into the Match Maker configuration program (SMMCFG) to convert the DEMO into -a registered copy. - -Licenses for registered use of Synchronet Match Maker are sold separately from -Synchronet BBS Software. Once a registration number has been issued, no refunds -or returns of Synchronet Match Maker will be accepted. - -Run SCFG (Synchronet Configuration Program) and add the Match Maker to one -of your External Program Sections and configure as follows: - - ����������������������������������������������������������ͻ - � Synchronet Match Maker � - ���������������������������������������������������������� - � �Name Synchronet Match Maker � - � �Internal Code SMM � - � �Start-up Directory ..\XTRN\SMM � - � �Command Line smm � - � �Clean-up Command Line � - � �Multiple Concurrent Users Yes � - � �Intercept I/O Interrupts No <-- Important � - � �Swap BBS out of Memory Yes � - � �Modify User Data Yes � - � �Execute on Event No � - � �BBS Drop File Type Synchronet XTRN.DAT � - � �Place Drop File In Node Directory � - ����������������������������������������������������������ͼ - -If you wish to have old profile entries and wall writings automatically deleted -from your match maker, you will need to run the SMMUTIL program periodically to -remove profiles that haven't been updated in a certain number of days -(specified on the SMMUTIL command line). To set up a timed event in SCFG-> -External Programs->Timed Events for SMMUTIL: - - ��������������������������������������������������������������������ͻ - � SMMUTIL Timed Event � - �������������������������������������������������������������������� - � �Internal Code SMMUTIL � - � �Start-up Directory ..\XTRN\SMM � - � �Command Line smmutil 90 7 > SMMSTATS.TXT � - � �Execution Node 1 � - � �Execution Days Sun Mon Tue Wed Thu Fri Sat � - � �Execution Time 00:00 � - � �Requires Exclusive Execution Yes � - � �Force Users Off-line For Event No � - ��������������������������������������������������������������������ͼ - -This would have SMMUTIL remove all profiles that haven't been updated in the -past 90 days and all wall writings older than 7 days. - -It will also create the file SMMSTATS.TXT in your XTRN\SMM directory with -detailed statistics on the demographics of the current SMM profile database. -You may want to make this file available for download or as a viewable bulletin -on your BBS. - -If you are currently on DOVE-Net or FidoNet and you carry the "Synchronet Data" -(SYNCDATA) message area and wish to link your match maker database with other -BBSs through this message area, set up the following two Timed Events in SCFG: - - ��������������������������������������������������������������������ͻ - � SMB2SMM Timed Event � - �������������������������������������������������������������������� - � �Internal Code SMB2SMM � - � �Start-up Directory ..\XTRN\SMM � - � �Command Line smb2smm %jsubs\syncdata smm.dab � - � �Execution Node 1 � - � �Execution Days Sun Mon Tue Wed Thu Fri Sat � - � �Execution Time 00:00 � - � �Requires Exclusive Execution No � - � �Force Users Off-line For Event No � - ��������������������������������������������������������������������ͼ - - ��������������������������������������������������������������������ͻ - � SMM2SMB Timed Event � - �������������������������������������������������������������������� - � �Internal Code SMM2SMB � - � �Start-up Directory ..\XTRN\SMM � - � �Command Line smm2smb smm.dab %jsubs\syncdata � - � �Execution Node 1 � - � �Execution Days Sun Mon Tue Wed Thu Fri Sat � - � �Execution Time 00:00 � - � �Requires Exclusive Execution No � - � �Force Users Off-line For Event No � - ��������������������������������������������������������������������ͼ - -Change "syncdata" in the above examples to the internal code you have used -for the "Synchronet Data" echo. Also, if you are not running v2.1+ of -Synchronet, you must specify the full path to the DATA directory instead of -using the %j. If your "Synchronet Data" echo is stored on a different -drive or in a different directory than SBBS, then you must specify that drive -and path on the above command lines. - -To get your match maker database active immediately, you may want to reset -your message pointers for the "Synchronet Data" echo on your hub BBS. If -using QWKnet, you would accomplish this by posting the message in the -"Synchronet Data" echo on your BBS to "SBBS" with a title of "RESET". The -message body does not matter. - -Swapping --------- -If you get memory allocation errors during the execution of any of the above -event command lines, add that program name to your Global Swap List in SCFG. - -DOOR.SYS BBS Installation (if you are using BBS software OTHER than Synchronet) -=============================================================================== - -Your BBS software must be able to create the industry standard DOOR.SYS drop -file (35 lines or more). If you wish to charge credits for specific match maker -functions (adding profile, sending telegrams, etc) your BBS software must be -able to READ BACK in the modified DOOR.SYS drop file (e.g. GAP BBS software). -Credits are read from line 31 of the DOOR.SYS file (in K) and credits used -while in SMM are written to line 30 of the DOOR.SYS (in K) and total credits -after adjustment (in K) are written back to line 31 of the DOOR.SYS. Since the -DOOR.SYS format only supports one set of flags (line 23), flag set 1 will be -the only valid flag set to use for the security options in SMMCFG (i.e. flag -sets 2-4 will not be used). - -Create a directory for Synchronet Match Maker (SMM) and copy all the files -into it (example: C:\BBS\DOORS\SMM). - -Copy the files included in the archive or on the floppy disk into this -directory. The DEMO and registered versions of this program are identical. -The registration number must be obtained from Digital Dynamics and entered -into the Match Maker configuration program (SMMCFG) to convert the DEMO into -a registered copy. - -Once a registration number has been issued, no refunds or returns of Synchronet -Match Maker will be accepted. - -If you are running a multinode BBS, you will need to have the DOOR.SYS created -in a separate directory for each node (i.e. NOT the directory where SMM has -been installed). This will prevent drop file collisions if two users enter SMM -at the same time. The complete path to the DOOR.SYS must be specified on the -command line, so each node must have a different path specified. Example: - -Node 1 Command Line: SMM C:\BBS\NODE1\DOOR.SYS -Node 2 Command Line: SMM C:\BBS\NODE2\DOOR.SYS - -SHARE must be loaded in your CONFIG.SYS or AUTOEXEC.BAT for SMM to function -(in single node or multinode environments). - -If non-standard IRQs or I/O addresses are used, they must be specified on the -SMM command line using the Command Line Options. IRQs 2-15 are fully supported. -Shared IRQs are not supported in UART mode. - -16550 FIFO buffered UARTs are detected and enabled. - -DTE rates up to 115200 baud are supported (higher with proprietary hardware). - -Command Line Options: -==================== - -Command line options override the values (if present) in the DOOR.SYS file. -No command line options are required when used with Synchronet BBS software. - - /P# Set the COM port (0=local only) (normally not necessary) - - Example: /P1 to specify COM1 - /P0 to specify no COM port (local use) - - /C# Set the COM port type or I/O (D:DigiBoard, F:FOSSIL, E:EBIOS) - - Example: /CF to specify FOSSIL - /C3e8 to specify I/O address 3e8 (hexadecimal) - - /I# Set the COM port IRQ or channel (only required if non-standard) - - Example: /I5 to specify IRQ 5 - /I0 to specify FOSSIL/Digi Channel 0 - - /R# Set the COM port DTE rate (normally not necessary) - - Example: /R57600 to specify a DTE rate of 57600 baud - - /T# Set time-slice APIs supported (default: DESQview if detected) - - Example: /T1 to use INT28 time-slice API - /T2 to use Win/OS2 time-slice API - /T4 to disable DESQview detection and time-slice API - -If a user name is specified on the command line, that user's profile will be -automatically looked up and displayed. - - Example (Synchronet): SMM JOHN DOE - - Example (non-Synchronet): SMM C:\BBS\NODE1\DOOR.SYS JOHN DOE - -The current directory MUST be the directory where SMM has been installed -(e.g. C:\BBS\DOORS\SMM) when SMM is executed. Some non-Synchronet BBS packages -may require a batch file to change drive and/or directory before running SMM -and may require the same batch file re-load the BBS software. Example: - - @ECHO OFF - CD \BBS\DOORS\SMM - SMM \BBS\NODE1\DOOR.SYS - REM The following may not be necessary with some BBS packages - CD \BBS\NODE1 - BBS - -Configuration -============= - -SMMCFG ------- -SMMCFG.EXE is used to modify your SMM.CFG (Configuration) file. Hitting the F1 -key will display a help page on the currently selected menu or option. - - ����������������������������������������������������������ͻ - � Synchronet Match Maker Configuration � - ���������������������������������������������������������� - � �System Name MY BBS � - � �Wall Security... � - � �Profile Database Security... � - � �Credit Cost for Adding Profile 0k � - � �Credit Cost for Sending Telegram 0k � - � �Credit Cost for Writing on the Wall 0k � - � �Credit Cost for Reading Questionnaire 0k � - � �Minimum Level to Send Telegrams 0 � - � �Minimum Level to Read Questionnaires 0 � - � �Sysop Level 90 � - � �Minor Segregation (Protection) Age Disabled � - � �Auto-Update Profiles 30 � - � �Notify User of Activity 1 � - � �Use Metric System No � - � �Zmodem Send Command %!dsz portx %u,� - � �Local Photo Viewer dvpeg %f � - � �Registration Number UNREGISTERED � - ����������������������������������������������������������ͼ - -System Name ------------ -The most important option in this program is your System Name (BBS Name). If -you are running Synchronet BBS Software, this option does not have to be set -here (it is automatically passed to SMM in the XTRN.DAT drop file from -Synchronet). If it is set, it will override the name specified in SCFG->System -->BBS Name. - -If you have registered SMM for non-Synchronet BBS Software, this option must be -set to the exact BBS name you registered SMM for (not case sensitive). - -Once you have setup SMM and your BBS users have entered their profiles, it is -important that you DO NOT change your BBS name, or you will lose those -profiles (and likely upset your users). If you are networking your match maker -database with other BBSs, it is important that you do not have the same System -Name as another BBS in the network. Only the first 25 characters of the BBS -name are used and every BBS in an SMM network must have a unique BBS name. Your -System Name (configured in SMMCFG) does not have to match your actual BBS name -(as configured in your BBS software). This allows you to change your System -Name for match maker networks where your real BBS name is already in use. - -Profile Database Security -------------------------- - �����������������������������������������������ͻ - � Profile Database Security � - ����������������������������������������������� - � �Minimum User Age to Add Profile 15 � - � �Minimum User Age to Take Purity Test 18 � - � �Minimum Security Level to Add Profile 30 � - � �Required Flags (Set 1) to Add Profile � - � �Required Flags (Set 2) to Add Profile � - � �Required Flags (Set 3) to Add Profile � - � �Required Flags (Set 4) to Add Profile � - �����������������������������������������������ͼ - -The Profile Database Security sub-menu allows you to define who can add -profiles by security level, age, and flags as well as the minimum age for -the purity test. Flag sets 2-4 are used only with Synchronet BBS software. - -Minimum Levels --------------- -From the SMMCFG main menu you can change the minimum levels required to -send telegrams, write on the wall, read questionnaires, and perform sysop -functions. - -Minor Segregation (Protection) Age ----------------------------------- -This option separates all users into Minors (those users below the specified -age) and Adults (those users at or above the specified age). When this option -is used, adults cannot see minors' profiles or send them telegrams (and vice -versa). This feature does not keep adult users on other non-segregated -networked BBSs from sending telegrams to minors on your BBS (or minors on other -BBSs from sending telegrams to adults on your BBS) - this can lead to confusion -among users receiving telegrams from users that don't appear to be in the -database (due to segregation on your system). This option is disabled by -default. - -Auto-Update Profiles --------------------- -This option allows you to change the number of days between automatic -profile updates across a match maker network. Normally a user's profile will -not be sent out across the network unless the user makes a change to their -profile. This option allows you to have their profile automatically sent -every so many days as long as the user is active in the match maker (enters -the match maker and uses it). This is useful for keeping profile databases -up-to-date across the network as new systems come online. Setting this option -to 0 disables this feature. The default value (30) should be fine for most -configurations. - -Notify User of Activity ------------------------ -This is the number of the user who will be notified of match maker activity -(profiles added, telegrams sent, wall writings, etc). Normally this option will -be set to 1 (for user #1, the sysop). Setting this option to 0 disables this -feature. - -Use Metric System ------------------ -If you want all heights and weights to be displayed in centimeters and -kilograms instead of inches and pounds, set this option to "Yes". Since all -measurements are internally stored in inches and pounds, those (English) -measurements are the most accurate. Some measurements may change slightly -when converting from metric to English and back. - -Zmodem Send Command -------------------- -This is the command line to execute to send a file via Zmodem to the remote -user. The default command line (%!dsz portx %u,%i sz %f) should work for most -system configurations (assuming DSZ is in your Synchronet EXEC directory or -DOS search path and using UART serial ports on all nodes). The percent codes -in the command line are called "Command Line Specifiers" and are explained -later in this document. - -Local Photo Viewer ------------------- -This is the command line to execute to view photos when running SMM locally. -The percent codes in the command line are called "Command Line Specifiers" and -are explained later in this document. - -Command Line Specifiers ------------------------ -%A User name -%B Baud (DTE) Rate -%C Connect (DCE) Rate -%F File path -%G Temp directory (blank if non-SBBS) -%I UART IRQ Line -%J DATA directory (blank if non-SBBS) -%K CTRL directory (blank if non-SBBS) -%N Node Directory (blank if non-SBBS) -%O Sysop's name -%P COM Port -%Q System QWK ID (blank if non-SBBS) -%R Users Screen Rows -%S File Spec -%T Time left in seconds -%U UART I/O Address (in hex) -%W Time-slice API type -%Z TEXT Directory (blank if non-SBBS) -%! EXEC Directory (blank if non-SBBS) -%# Node number -%* Node number (zero padded to three digits) -%$ Credits -%% %% for percent sign -%1 User number -%2 User number (zero padded to two digits) -%3 User number (zero padded to three digits) -%4 etc.. - -SMM.CAN -------- - -The trash can file (SMM.CAN) can be used to specify a list of words or word -combinations (one word or word combination per line) that will not be allowed -in user information and wall entries. - -QUE.LST -------- - -The questionnaire list file (QUE.LST) can be edited with any ASCII text editor. -The following is the stock QUE.LST containing the four stock questionnaires. - -BASIC -Basic Personality -0 -APPEAR -Appearance -0 -MATERIAL -Material -0 -ADULT -Adult Sexuality -18 - -For each questionnaire, a code (up to eight valid DOS filename chars), -a description (up to 25 chars), and minimum age are specified. A maximum -of five questionnaires can be configured. If you are linked to the Synchronet -Data echo, it is suggested you leave the four stock questionnaires intact -(unmodified). If you change any of these questionnaires, you MUST change the -code to something other than "BASIC, APPEAR, MATERIAL, or ADULT" as these codes -are reserved specifically for the stock questionnaires. If you are not linked -to the Synchronet Data echo, you can modify and remove any questionnaires you -wish and use whatever code you wish except "PURITY" and "MB-TYPE" as these -questionnaire names are specifically reserved by the Match Maker. - -The questionnaires are stored in files with the code for the name and .QUE -as the file extension (e.g. BASIC.QUE, APPEAR.QUE, MATERIAL.QUE, etc). - -*.QUE Format ------------- - -A: First line is total number of questions (max: 20). - All lines following are question and answers groups. - -B: Each group starts with the actual question (max: 79 characters). - -C: The next line in the group consists of the total number of answers - (max: 16). - -D: The next line consists of the maximum number of answers this user can select - for this question. - -E: A single line for each answer (total answers from line C). - -F: Repeat lines B-E for each question (total questions from line A). - -Special Questionnaire Files ---------------------------- - -Two questionnaire files (MB-TYPE.QUE and PURITY.QUE) are unique in that they -don't follow the above format at all and should need no modification. - -The MB-TYPE.QUE is used for the Myers-Briggs personality test and is a pretty -standard questionnaire. The files MB-*.ASC are descriptions of the various -personality types. The file MB-INTRO.ASC is displayed before the test and -MB-TYPE.ASC is displayed when seeking descriptions of the various types. - -The PURITY.QUE is used for the purity test and the format is simply one -"Have you ever" question per line. The default PURITY.QUE is a 100 question -test of an adult nature. An optional 500 question purity test is also included -as PURITY.500. To use this test in place of the 100 question version, copy -PURITY.500 to PURITY.QUE. The 100 question version is also included as -PURITY.100 as a back-up, in case you want to return to the 100 question -version. The PURITY*.ASC files are displayed before and during the testing -procedure. - -Sysop Commands -============== - -From the Match Maker main menu, the sysop (any user with sysop security level) -can use the (D)elete command to remove any profile from the database. Profiles -can be undeleted with the '*' command (available only to sysops). - -When viewing profiles, sysops are shown the user name, number, and system -name at the top of the profile. Normal users are not shown this information -to maintain the anonymity of the users in the database. - -Hitting '!' will display a list of all networked BBSs that have contributed to -the current profile database. If you see your BBS name in the list, either -someone else is using the same BBS name as you (which is bad), or something has -gone wrong in your network and you should contact Digital Dynamics to remedy -the situation immediately. If someone else is using the exact same BBS name -(not considering upper/lower case differences), one of you must change your BBS -name by at least one character or you will definitely have problems with your -users' Match Maker profiles and telegrams. - -Hitting '\' will rebuild the database index. If your database is corrupted, -you should down all your nodes and use SMMUTIL instead of this command. If -your SMM.IXB file disappears or becomes out-of-sync with your SMM.DAB file -(which is unlikely to occur), you can use this command to quickly recreate -it. - -Photographs -=========== - -You may use the included ADDPHOTO.EXE utility to import photographs into your -local match maker database. The current directory must be the directory where -SMM is installed when ADDPHOTO is run. The usage is: - -ADDPHOTO filename.ext user_number system_name - -where filename.ext is the path, filename, and extension of the photograph file -to import (preferably, but not necessarily, a JPEG file with a .JPG extension). -User_number is the user's number and system_name is the name of the system the -user created their profile on. - -ADDPHOTO will create a directory called PHOTO off of the directory where SMM -is installed (e.g. C:\SBBS\XTRN\SMM\PHOTO or C:\BBS\DOORS\SMM\PHOTO) and move -the photograph file into this directory (changing the name, but leaving the -extension (e.g. JPG, GIF, TIF, etc) intact. - -Example: - - ADDPHOTO JAMIEFAR.JPG 1 M.A.S.H BBS - -The DELPHOTO.EXE utility is used to remove photographs from your local match -maker database. The usage is: - -DELPHOTO user_number system_name - -Example: - DELPHOTO 1 M.A.S.H BBS - -The LSTPHOTO.EXE utility may be used to create a list of all users with photos -in your local match maker database. - -Example: - LSTPHOTO > PHOTO.LST - -PHOTO.ZIP ---------- -You can optionally, zip (using PKZIP) all the files in the PHOTO directory -into a file called PHOTO.ZIP (in the SMM directory) and delete them from the -PHOTO directory (to save disk space). When the photo is viewed or downloaded -from SMM, it will be automatically extracted from the PHOTO.ZIP into the PHOTO -directory (PKUNZIP.EXE must be in your DOS search path or your Synchronet -EXEC directory). The ADDPHOTO utility will not automatically add new images to -the PHOTO.ZIP (if you wish to use that storage method). Also, the files will -not be automatically deleted from the PHOTO directory after download/viewing -in SMM. This is so that popular image files will not have to be extracted each -time. You may wish to periodically re-zip and delete the PHOTO directory -(perhaps with an event) to preserve disk space. - -SYNCDATA Echo -------------- -If your match maker is linked (via DOVE-Net or FidoNet) to the SYNCDATA echo, -you do not need a scanner or the ADDPHOTO utility to get your users' photos -into the database. Simply have your users send their photos along with your -full and correct BBS name, their user number, and a xerox-copy of a current -formal photo-ID (to verify identity only, IDs will not be scanned and all -ID information will remain completely confidential) to Digital Dynamics. - -The photos must have a 2 inch square drawn around the area to be scanned. The -photos will be scanned and distributed in JPEG format (with monthly -redistribution) on the SYNCDATA echo by Digital Dynamics. This service is -available to all users of SMM free of charge (this free offer _may_ expire -on Feb 14th, 1996). - -Digital Dynamics reserves the right to refuse to scan and distribute any -photos for any reason. Nudity or vulgarities will not be allowed. - -Photos and IDs included with a self-addressed _stamped_ enveloped will be -returned. - -DEMO Version -============ - -The unregistered "DEMO" version of Synchronet Match Maker will not allow -users to send Telegrams to other users in the database (through the -message network), write on the Match Maker wall, or read other users' -questionnaires. - -To register your copy of Synchronet Match Maker, complete the ORDER.TXT form -included in this archive/directory and send it to Digital Dynamics, or call -714-529-6328 (voice) or 714-529-9525 (BBS) to order with a credit card for -faster processing. - -/* End of SMM.DOC */ diff --git a/xtrn/smm/smm_help.asc b/xtrn/smm/smm_help.asc deleted file mode 100644 index c969ab434c..0000000000 --- a/xtrn/smm/smm_help.asc +++ /dev/null @@ -1,27 +0,0 @@ -yhOverall Match (General Explanation):nc - -The overal match is a highly refined algorithm used to compute a percentage of -preference match between a user and a prospective mate. The user's preferences -are weighed more heavily than those of the prospective mate. More specific -preferences will result in a higher match percentage potential and a wider -range of match percentages. More vague preferences will result in a rather -narrow range of match percentages, so it is best to keep your "hideal matenc" -in mind when completing the preferred mate sections of your profile and -questionnaires. - -yhGlobal Database:nc - -If your sysop has taken the steps to link this profile database with the -international hSyncDatanc network, your profile will be automatically included -in this global database for users on other BBSs around the world to view. The -profiles you see in this database may very well be users in other counties, -states, or countries and you can view their information here and communicate -with them via hTelegramnc using this program. - -yhCredits:nc - -hPurity Test ncOriginal version from MIT's Baker House. - -hMyers-Briggs Type Indicator ncAdapted from the book "Please Understand Me" - by David Keirsey and Marilyn Bates - diff --git a/xtrn/smm/smm_logo.asc b/xtrn/smm/smm_logo.asc deleted file mode 100644 index c60c944dfc..0000000000 --- a/xtrn/smm/smm_logo.asc +++ /dev/null @@ -1,3 +0,0 @@ - nhrn h7������������������������������������������������n hr - n k7nk7 nk7Find your mate or just a date, electronically! n hr - nhrn hk7������������������������������������������������n hrn diff --git a/xtrn/smm/smm_main.asc b/xtrn/smm/smm_main.asc deleted file mode 100644 index b453ada7f3..0000000000 --- a/xtrn/smm/smm_main.asc +++ /dev/null @@ -1,9 +0,0 @@ -� nk7������������������������������������������������������������������0 -� 7 b[hRnb7] Read Profiles [hHnb7] Help/Info hk�0 -� 7 nb7[hLnb7] List Profiles [hMnb7] Myers-Briggs Types hk�0 -� 7 nb7[hUnb7] Update Your Profile [hPnb7] Toggle Screen Pause hk�0 -� 7 nb7[hDnb7] Delete Your Profile [hTnb7] Read Telegrams hk�0 -� 7 nb7[hNnb7] Scan for New Profiles [hSnb7] Send Telegrams hk�0 -� 7 nb7[hGnb7] Go to a Specific Profile [hVnb7] Visit the Wall hk�0 -� 7 nb7[hFnb7] Find Text in Profiles [hOnb7] Log-off (Hang-up) hk�0 -� nk7�h������������������������������������������������������������������n diff --git a/xtrn/smm/upgrade.doc b/xtrn/smm/upgrade.doc deleted file mode 100644 index be87c35f62..0000000000 --- a/xtrn/smm/upgrade.doc +++ /dev/null @@ -1,241 +0,0 @@ -Upgrading from Synchronet Match Maker -------------------------------------- - -If you are a registered owner of SMM and upgrading from v1.10 or earlier, -you'll need to optain your registration number from Digital Dynamics by calling -voice at 714-529-6328. You will need to have your Synchronet registration -number and control code on hand when you call. - -The most important change (in upgrading to v2.0) is to change "Intercept -I/O Interrupts" in SCFG from "Yes" to "No". Example: - - ����������������������������������������������������������ͻ - � Synchronet Match Maker � - ���������������������������������������������������������� - � �Name Synchronet Match Maker � - � �Internal Code SMM � - � �Start-up Directory ..\XTRN\SMM � - � �Command Line smm � - � �Clean-up Command Line � - � �Multiple Concurrent Users Yes � - � �Intercept I/O Interrupts No <-- Important � - � �Swap BBS out of Memory Yes � - � �Modify User Data Yes � - � �Execute on Event No � - � �BBS Drop File Type Synchronet XTRN.DAT � - � �Place Drop File In Node Directory � - ����������������������������������������������������������ͼ - -The only files you need to update when converting from v2.01/2.02 to v2.10 are: - -SMM.DOC Sysop Documentation (v2.10) -SMM.EXE Match Maker Program (v2.10) -SMMCFG.EXE Match Maker Configuration Program (v2.10) -SMMUTIL.EXE Repair/Maintenance Program (v2.01) - -The only files you need to update when converting from v2.00 to v2.10 are: - -SMM.DOC Sysop Documentation (v2.10) -SMMCFG.EXE Match Maker Configuration Program (v2.10) -SMMUTIL.EXE Repair/Maintenance Program (v2.01) -SMB2SMM.EXE Import Program (v2.01) -SMM2SMB.EXE Export Program (v2.01) -ADDPHOTO.EXE Import Photographs locally (v1.01) -DELPHOTO.EXE Delete Photographs locally (v1.00) -LSTPHOTO.EXE List Profiles with Photographs (v1.00) - -The only files you need to update when converting from v1.x to v2.0 are: - -*.EXE Executables -*.DOC Documentation -LIST_HDR.ASC Condensed Listing Header - -If upgrading from v1.00 or v1.10, you will also need to update the following -files: - -SMM_MAIN.ASC Main Menu -SMM_HELP.ASC Help Screen (if upgrading from v1.00) -PURITY.ASC Purity Explanation (if upgrading from v1.00) - -New in version 2.10 -~~~~~~~~~~~~~~~~~~~ -o Minor segregation (protection) now supported. This option separates all users - into Adults and Minors (configurable separation age), disallowing adults to - see minors' profiles or send them telegrams (and vice versa) -o Minimum Age to access the wall now configurable in SMMCFG -o XSDK v2.42 feature: Ctrl-T now displays current time, time used, and time - left (similar to SBBS) -o XSDK v2.42 feature: User is now warned on each of their last 5 minutes left - -New in version 2.02a -~~~~~~~~~~~~~~~~~~~~ -o Fixed bug in SMM.EXE when using DOOR.SYS (non-Synchronet BBSs) - -New in version 2.02 -~~~~~~~~~~~~~~~~~~~ -o Low priority input now correctly supported (for giving up multitasker time - slices even while accepting string input from the user) - this was an - indirect bug fix in XSDK v2.41 most notably effecting OS/2 systems -o "Searching..." text now displayed before possibly long searches to indicate - to the user the system is not crashed -o Sysop text searches now search user real names, system names and user numbers - in addition to the normal user-viewable text fields - -New in version 2.01 -~~~~~~~~~~~~~~~~~~~ -o New DELPHOTO.EXE utility to delete photos from the database -o New LSTPHOTO.EXE utility to create a list of all profiles with attached - photos -o SMB2SMM/SMM2SMB updated to detect and not import/export corrupted profiles -o ADDPHOTO 1.01 now copies (instead of renames/moves) photo image files -o SMB2SMM no longer deletes existing photo if CRC error detected on new photo -o Wall security level (configured in SMMCFG) now correctly keeps users below - that level from writing on the wall -o FOSSIL channel number automatically determined by subtracting 1 from the - COM port number (e.g. COM 1 is FOSSIL/Digi channel 0) - /I command line switch may be used to set non-standard channel -o New SMM, SMMCFG, and SMMUTIL fix 25 character BBS name limit -o SMMUTIL (v2.00) now removes old photos (tallys photos and networked profiles) - -New in version 2.00 -~~~~~~~~~~~~~~~~~~~ -o Optionally reads from and writes to DOOR.SYS drop file - (for compatibility with other [non-Synchronet] BBS programs) -o MSG, UTI, and possibly JAM message base import/export utilities will be - available soon (for match maker networking with non-SMB compatible BBSs) -o Optional command line switches for com port configuration and time-slice APIs - (for non-standard COM ports with other BBS programs) -o Photographs (in any size or format) can be added to the database locally - (with Zmodem download and local viewing) -o Photographs are automatically imported from the SYNCDATA echo with SMB2SMM - (other match maker networks will need to use their own distribution methods) -o System name separately configurable in SMMCFG (to work around duplicate BBS - names in a match maker network) -o Metric measurements (centimeters and kilograms) can be enabled in SMMCFG -o Sysop level defined in SMMCFG (no longer hard-coded at level 90) -o Low priority input supported (based on SCFG Node toggle option if Synchronet, - automatically enabled with other BBS programs) -o Trailing spaces from user names are automatically removed - -New in version 1.31 -~~~~~~~~~~~~~~~~~~~ -o Ability to specify a user to search for on the command line - displays extended profile on the user and then exits (just "SMM user name") -o Messages can now be sent from Digital Dynamics to you (sysops, users, or - both) inside SMM (not telegrams, but similar) to inform sysops and users of - Match Maker progressions/news. All messages have pre-determined expiration - dates and will automatically disappear when the date is reached. Sysop-only - messages can be deleted immediately after they are read if the sysop wishes. - Special ONE-time messages are displayed to users only once, while others - may be displayed each time they enter SMM. (SMB2SMM v1.30 required) -o New SMMUTIL (v1.15) fixes 4095 user limitation. - -New in version 1.30 -~~~~~~~~~~~~~~~~~~~ -o Ability to send telegrams directly from condensed user listings -o Wall new-scans now correctly scan by date/time imported instead of the - date/time written (must use SMB2SMM 1.22, SMM2SMB 1.12, and SMMUTIL 1.14) -o Condensed Wall listings now clear the screen between each screen-full - (faster screen draws) with a prompt allowing the user to read a profile, - send a telegram, move backwards through the wall writings, or quit at the - bottom of each screen-full (more intuitive and convenient) -o Extended Wall listings now display wall writing in magenta if the author - is female, green if the author is male (instant gender recognition) - wall writings who can't be found in the database -o Extended Wall listings allow sending telegrams directly (without reading - profile first) and moving backwards through the wall writings -o Extended Wall listings stay on current wall writing after reading profile - or sending telegram -o XSDK v2.33 fixes problem with flashing screen loops when a user hangs up - with keys in the modem buffer -o XSDK v2.33 fixes problem with sending double carriage returns at the end - of each line (making captures difficult) -o Fixed problem with selecting races above E -o If the sysop hits '!' from the main menu, all systems connected to the - database are listed -o When reading a user's questionnaire, (P)revious and (Q)uit commands are now - available on the pause prompt -o Updated sysop documentation - -New in version 1.22 -~~~~~~~~~~~~~~~~~~~ -o New option for those seeking "any-sex non-romantic friendly matches" allows - matches with both romantic/intimate mates and non-romantic mates (friends) -o When displaying long user information, preference ranges (age, weight, etc) - and specifics (hair color, marital status, etc) are high intensity (bright - colors) if the preferencees are considered requirements by the user -o The Wall was revamped to allow new-scans for new writings since a specific - date only and optional display of extended user information allowing reading - of questionnaires and sending of telegrams -o Wall writings will now disallow any text in SMM.CAN (same as user aliases - profiles, etc.) - -New in version 1.21 -~~~~~~~~~~~~~~~~~~~ -o Credits can be charged or given for reading questionnaires -o New WALL inside Match Maker for public discussion -o Credits can be charged or given for writing on the wall -o Minimum level can be specified to allow writing on the wall -o SMM2SMB v1.11 now creates unique profile messages that won't be deleted by - duplicate message checking -o SMM2SMB v1.11 and SMB2SMM v1.21 read/write wall writings from message base -o SMMUTIL v1.11 now allows command line specification of maximum wall writing - age before auto-deletion -o Telegrams and Profile Personal Text no longer word wrap on last line (bugfix) -o Telegrams now ask to Save (Y/n) when completed to allow last minute abort - -New in version 1.20 -~~~~~~~~~~~~~~~~~~~ -o DEMO and registered versions use the same executable files, unlocked with - registration number obtained from Digital Dynamics (entered in SMMCFG) -o Minimum level can be specified to allow the sending of telegrams -o Minimum level can be specified to allow the reading of questionnaires -o Sysops deleting their own profile, will not have to exit and re-enter - before SMM will report their profile does not exist -o Match Maker telegrams are stored in SMM and users are notified via BBS - telegram of newly received SMM telegrams -o Users can read awaiting telegrams and send telegrams from the SMM main menu -o New customizable main menu (SMM_MAIN.ASC) -o (W)rite Profile command changed to (U)pdate Profile, although 'W' can still - be used -o When sending telegrams, the destination user's detail is displayed to prevent - users from sending telegrams to a wrong user (with the same name) -o Automatically corrects user sex when not set to (M)ale or (F)emale -o Questionnaire answers are aligned so they can be visually compared easily -o SMMUTIL v1.10 generates statistics, run "SMMUTIL > stats.txt" to create file - for display on your BBS - -New in version 1.10 -~~~~~~~~~~~~~~~~~~~ -o New configuration program (SMMCFG) instead of editing SMM.CFG with an - ASCII editor. -o Optional trash can file for keeping users from using profanity in profiles - and users names. -o SMB2SMM will not import profiles if the user age is less than you have - specified in SMMCFG for minimum user age. -o SMB2SMM will not import profiles that contains words found in your TRASH.CAN - file (if it exists). -o When listing profiles in SMM, you can go backwards to previous screens and - read profiles directly from the listing. The (R)ead profile key automatically - puts the user with the highest percentage on the current screen in the - user name field. -o User's can enter "Non-disclosed" for their yearly income, by hitting ENTER - when asked. -o User's can specify if they REQUIRE their matches to fall within certain - ranges or REQUIRE specific features. -o Profile screens were condensed to get all information on one page whenever - possible. -o SMMUTIL will scan for duplicate profiles or if specified, delete profiles - that haven't been updated in a certain number of days. SMMUTIL also - automatically condenses the data file, removing any deleted profiles and - rebuilds the index file. -o Users can be charged credits or given credits for adding profiles and - sending telegrams. If a user adds a profile and then deletes it, the credit - charges are reversed. -o Auto-update feature will automatically re-hatch a users entry into the - Global Database after a certain number of days, if the user is active in - the match maker but hasn't made any profile changes. -o Sysop can be notified automatically of added profiles and sent telegrams - from the match maker - -/* End of UPGRADE.DOC */ -- GitLab