~NEWSRDR_SRC.BCK?NEWSRDR_SRC.BCKUBACKUP/INTERCHANGE/GROUP=0/NOCRC ADDRESS_CONVERSION.C,NEWSRDR.C,PARSING.C,PROFILE.C,GROUPS.C,ARTICLE.C,PAGER.C,CMD_MISC.C,CMD_READ.C,CMD_SETSHO.C,CMD_PRINT.C,CMD_DIRECTORY.C,CMD_POST.C,MAIL.C,MISC.C,NEWSRC.C,FILEIO.C,NEWSRDR_CLD.CLD,MEM.C,CMD_TABLE.CLD,NEWS_MSG.MSG,NEWSRDR.H,PARSE_TABLES.MAR,NEWSRDR_HELP.RNH,NEWGROUPS.C,PARSE822.C,PARSE822_TABLES.MAR,ARCH_DEFS.MAR,NEWS_MSG.H,NEWSRDR_DOC.SDML,DESCRIP.MMS,GLOBALS.H,TPADEF.H,NEWSRDR.OPT,SERVER_NETLIB.C,KANJI_CONVERSION.C,NAME_CONVERSION.C,SERVER_SOCKET.C,NEWSRDR_INST.SDML,MAKE_ZIP.C,MAKE_ZIP.CLD,MAKE_ZIP.OPT,NETLIB_SRC.BCK NEWSRDR_SRC.BCK/SAVE MADISON  @&@`xؖT6.0 _HQ::  _HQ$DKA500: V6.0 ~*[NEWSRDR]ADDRESS_CONVERSION.C;5+,P./ @ 4Q-P0123KPWO56 73R8FT99G @HJ/*!++!#! MODULE: ADDRESS_CONVERSION!(! FACILITY: NEWSRDR (sample source)!@! ABSTRACT: Example of site-installable address conversion.!! MODULE DESCRIPTION:!C! This module contains routines for use by NEWSRDR for converting?! RFC822-type addresses into a format acceptable to the local! network mail handler.!B! This module simply takes the address passed in, encloses it in=! quotation marks, and tacks SMTP% on the front. A routine?! called "reverse_domain" is also included, which can be usedA! by sites whose mail handlers use backwards ordering of domain ! parts.!J! To use this module: MODIFY IT AS NEEDED FOR YOUR SITE, then compile it"! and link it with the commands:!! $ cc address_conversion;! $ link/share/notrace address_conversion,sys$input:/opt ! sys$share:vaxcrtl/share'! universal=init,convert,cleanup! !F! Then copy it to SYS$SHARE and make it available with the commands:!F! $ copy address_conversion.exe sys$common:[syslib]/protection=w:reD! $ install create sys$share:address_conversion/share/open/headerQ! $ define/system/exec newsrdr_address_conversion sys$share:address_conversion!8! (You need a suitably privileged account to do this.)!! AUTHOR: M. MadisonA! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.3! COPYRIGHT 1992, MATTHEW D. MADISON.!I! THIS SOFTWARE IS PROVIDED "AS IS". NEITHER THE AUTHOR NOR RENSSELAERI! MAKE ANY GUARANTEES REGARDING THE SUITABILITY, RELIABILITY, SECURITY,I! USEFULNESS, OR PERFORMANCE OF THIS SOFTWARE. >>USE AT YOUR OWN RISK.!! CREATION DATE: 12-FEB-1991!! MODIFICATION HISTORY:!0! 12-FEB-1991 V1.0 Madison Initial coding.!--*/#include descrip#include string#include stdio#include ssdef#include str$routines#include lib$routinesstruct context {$ struct dsc$descriptor localnode; }; /*!++!! ROUTINE NAME: INIT!! FUNCTIONAL DESCRIPTION:!B! Allocates and initializes context block for subsequent address! conversions.!A! Note that we don't actually use a context block here, so this! just returns normal status.!B! RETURNS: cond_value, longword (unsigned), write only, by value! ! PROTOTYPE:!! INIT ctxptr!>! ctxptr: pointer, longword (unsigned), modify, by reference!! IMPLICIT INPUTS: None.!! IMPLICIT OUTPUTS: None.!! COMPLETION CODES:!2! SS$_NORMAL: normal successful completion.!! SIDE EFFECTS:! ! None.!--*/ unsigned intinit(struct context **ctx) { return SS$_NORMAL; } /* init *//*!++!! ROUTINE NAME: CONVERT!! FUNCTIONAL DESCRIPTION:!E! Converts RFC822 address into something VMS Mail (and the "foreign8! protocol" handler for network mail) will understand.!E! NB: You MUST use STR$ routines to copy result to OUTSTR parameter&! to ensure proper operation!!!!!H! You _may_ safely assume that INSTR is compatible with a DTYPE_T,7! CLASS_S (standard fixed-length) string descriptor.!B! RETURNS: cond_value, longword (unsigned), write only, by value! ! PROTOTYPE:!"! CONVERT ctxptr, instr, outstr!>! ctxptr: pointer, longword (unsigned), modify, by referenceK! instr: char_string, character string, read only, by descriptor (fixed)D! outstr: char_string, character string, write only, by descriptor!! IMPLICIT INPUTS: None.!! IMPLICIT OUTPUTS: None.!! COMPLETION CODES:!2! SS$_NORMAL: normal successful completion.!! SIDE EFFECTS:! ! None.!--*/ unsigned int;convert(struct context **ctx, struct dsc$descriptor *instr,) struct dsc$descriptor *outstr) {/*!++(! Use the following with reverse_domain!I! void reverse_domain(struct dsc$descriptor *, struct dsc$descriptor *);! struct dsc$descriptor tmp;! int status;!--*/H $DESCRIPTOR(prefix, "SMTP%\""); /* alter as needed for your site */ $DESCRIPTOR(suffix, "\"");/*!++N! The following is what NEWSRDR normally does with the NEWSRDR_MAIL_PROTOCOL=! logical name, and is provided here only for illustration.!----*/7 return str$concat(outstr, &prefix, instr, &suffix);/*!++0! Use the following when using reverse_domain:!$! tmp.dsc$b_dtype = DSC$K_DTYPE_T;$! tmp.dsc$b_class = DSC$K_CLASS_D;! tmp.dsc$w_length = 0;! tmp.dsc$a_pointer = NULL; ! reverse_domain(instr, &tmp);8! status = str$concat(outstr, &prefix, &tmp, &suffix);! str$free1_dx(&tmp);! return status;!!--*/} /* convert *//*!++!! ROUTINE NAME: CLEANUP!! FUNCTIONAL DESCRIPTION:!8! Deallocates context block allocated by init routine.!I! Note that we don't actually use a context block, so this just returns! normal status.!B! RETURNS: cond_value, longword (unsigned), write only, by value! ! PROTOTYPE:!! CLEANUP ctxptr!>! ctxptr: pointer, longword (unsigned), modify, by reference!! IMPLICIT INPUTS: None.!! IMPLICIT OUTPUTS: None.!! COMPLETION CODES:!2! SS$_NORMAL: normal successful completion.!! SIDE EFFECTS:! ! None.!--*/ unsigned intcleanup(struct context **ctx) { return SS$_NORMAL;} /* cleanup *//*!++!"! ROUTINE NAME: REVERSE_DOMAIN!! FUNCTIONAL DESCRIPTION:!(! Reverses the parts of a domain name.!;! Examples: user@host.domain.edu -> user@edu.domain.host?! user@host.domain.ac.uk -> user@uk.ac.domain.host!B! RETURNS: cond_value, longword (unsigned), write only, by value! ! PROTOTYPE:!! CLEANUP in, out!=! in: char_string, character string, read only, by descriptor?! out: char_string, character string, write only, by descriptor!! IMPLICIT INPUTS: None.!! IMPLICIT OUTPUTS: None.!! COMPLETION CODES:!2! SS$_NORMAL: normal successful completion.!! SIDE EFFECTS:! ! None.!--*/voidGreverse_domain(struct dsc$descriptor *in, struct dsc$descriptor *out) { char *cp, *placeholder;$ struct dsc$descriptor tmp, tmp2; $DESCRIPTOR(dot, ".");$ tmp.dsc$b_dtype = DSC$K_DTYPE_T;$ tmp.dsc$b_class = DSC$K_CLASS_D; tmp.dsc$w_length = 0; tmp.dsc$a_pointer = NULL;% tmp2.dsc$b_dtype = DSC$K_DTYPE_T;% tmp2.dsc$b_class = DSC$K_CLASS_S;7 placeholder = in->dsc$a_pointer + in->dsc$w_length;< for (cp = placeholder-1; cp > in->dsc$a_pointer; cp--) { switch (*cp) { case '.' :/ tmp2.dsc$w_length = placeholder-cp-1;& if (tmp2.dsc$w_length > 0) {( tmp2.dsc$a_pointer = cp+1;& str$append(&tmp, &tmp2);% str$append(&tmp, &dot); } placeholder = cp; break; case '@' :/ tmp2.dsc$w_length = placeholder-cp-1;& if (tmp2.dsc$w_length > 0) {( tmp2.dsc$a_pointer = cp+1;& str$append(&tmp, &tmp2); }7 tmp2.dsc$w_length = cp-(in->dsc$a_pointer)+1;1 tmp2.dsc$a_pointer = in->dsc$a_pointer;' str$concat(out, &tmp2, &tmp); str$free1_dx(&tmp); return; } }% /* ?? this shouldn't happen ?? */ str$free1_dx(&tmp); str$copy_dx(out,in); } /* reverse_domain */Z~NEWSRDR_SRC.BCKLP[NEWSRDR]NEWSRDR.C;90X2*[NEWSRDR]NEWSRDR.C;90+,L.2/ @ 4X2/-P0123KPWO356D>]qז7DV]qז8D+tE9G @HJ^/***++** FACILITY: NEWSRDR**"** ABSTRACT: NEWSRDR main module.**** MODULE DESCRIPTION:**** Main routine for NEWSRDR.**** AUTHOR: M. MadisonN** COPYRIGHT 1992, 1993 MATTHEW D. MADISON. ALL RIGHTS RESERVED.**** CREATION DATE: 01-SEP-1992**** MODIFICATION HISTORY:**I** 01-SEP-1992 X4.0 Madison Initial coding (conversion from BLISS).3** 17-SEP-1992 V4.0 Madison Make it official.=** 22-SEP-1992 V4.0-1 Madison Fix Display_Announce logic.I** 22-SEP-1992 V4.0-2 Madison Workaround for strange $FAO happenings.4** 22-SEP-1992 V4.0-3 Madison Fix STORE problem.G** 28-SEP-1992 V4.0-4 Madison Fix EXTRACT problem, profile problem.>** 29-SEP-1992 V4.0-5 Madison Fix mail long-lines problem.6** 30-SEP-1992 V4.0-6 Madison Fix yesterday's fix.I** 07-OCT-1992 V4.0-7 Madison Fix REPLY/TO problem, SET SEEN problem.G** 08-OCT-1992 V4.0-8 Madison SHOW VERSION, Parse_List_Reply stuff.9** 13-OCT-1992 V4.0-9 Madison Fix Set_Initial_Groups.H** 16-OCT-1992 V4.0-10 Madison Fix line count in sig file processing.F** 21-OCT-1992 V4.0-11 Madison Fix looping problem in READ/SUBJECT.I** 07-DEC-1992 V4.0-12 Madison Move exit handler decl to after update.Q** 23-DEC-1992 V4.0-13 Madison Posting errors were not being handled properly.M** 10-FEB-1993 V4.0-14 Madison Fix PAGER routines to work from batch jobs.<** 15-FEB-1993 V4.0-15 Madison Remove all !AZ references.?** 15-FEB-1993 V4.1 Madison Add SET SEEN/CROSS, /SUBJECT.I** 17-FEB-1993 V4.1-1 Madison Fix up LIB$STOPs in SERVER_xxx modules.?** 24-FEB-1993 V4.1-2 Madison Fix DIRECTORY output problem.A** 01-MAR-1993 V4.1-3 Madison Expand name_conversion support.8** 17-MAR-1993 V4.1-4 Madison Fix REPLY/FOLLOWUP_TO.6** 23-MAR-1993 V4.1-5 Madison Fix FORWARD problem.H** 05-APR-1993 V4.1-6 Madison Fix DST adjustment in date generation.C** 08-APR-1993 V4.1-7 Madison Cmd locasing fix; REPLY/DIST fix.H** 12-APR-1993 A4.2 Madison Add remaining lines to paged displays.C** 16-APR-1993 B4.2 Madison Add support for faking NEWGROUPS.5** 17-APR-1993 C4.2 Madison Add auto-reconnect.?** 23-APR-1993 D4.2 Madison Add DISALLOW_POSTING logical.E** 14-MAY-1993 V4.2-1 Madison Fix wildcard group name processing.?** 17-MAY-1993 V4.2-2 Madison Fix directory paged displays.6** 19-MAY-1993 V4.2-3 Madison Fix Parse_Range bug.D** 22-MAY-1993 V4.2-4 Madison Work around MAIL$ bug in VMS T6.0.L** 23-MAY-1993 V4.2-5 Madison Allow SET SEEN/THREAD with article ranges.G** 24-MAY-1993 V4.2-6 Madison Fix weekday computation in Make_Date.=** 25-MAY-1993 V4.2-7 Madison Fix partial update problem.C** 31-MAY-1993 V4.2-8 Madison Fix looping bug in cont_readsubj.K** 03-JUN-1993 V4.2-9 Madison Got time check backwards in server check.**--*/#define NR_VERSION "V4.2-9"X#define NR_COPYRIGHT "Copyright 1992, 1993 Matthew D. Madison. All Rights Reserved." #ifdef __DECC!#pragma module NEWSRDR NR_VERSION#else#ifndef __GNUC__#module NEWSRDR NR_VERSION#endif#endif#include "newsrdr.h"#ifdef __GNUC__#include #include #else#include #include #include #endif+ char $$$Copyright[] = NR_COPYRIGHT;) GLOBAL char *$$$Version = NR_VERSION;/*** Forward declarations*/ unsigned int main();+ static unsigned int cli_error_filter();* static unsigned int Read_Config(void);' static unsigned int exit_handler();' static void Display_Announce(void);) static void Set_Initial_Groups(void);S GLOBAL unsigned int (*default_action)(); /* Fired when user just hits RETURN */S GLOBAL unsigned int (*cleanup_action)(); /* Cleanup for non-default action */P GLOBAL struct PROF news_prof; /* The user profile */P GLOBAL struct CFG news_cfg; /* Configuration information */S GLOBAL unsigned int image_privs[2]; /* Our image privilege mask */S static int pager_set_up = 0; /* PAGER module initialization flag */S static unsigned int final_status; /* Final status for exit handler */S static struct { /* Exit handler block */ unsigned int flink; unsigned int (*exh)(); unsigned int argcnt; unsigned int *statusp;3 } exhblk = {0, exit_handler, 1, &final_status};/*** External references*/S EXTERN int User_Interrupt; /* User pressed CTRL/C */#ifdef __GNUC__*#define RMS$_EOF ((unsigned int) rms$_eof)4#define CLI$_FACILITY ((unsigned int) cli$_facility)4 extern unsigned int rms$_eof(), cli$_facility();#else#pragma nostandard5 globalvalue unsigned int RMS$_EOF, CLI$_FACILITY;#pragma standard#endif+ extern unsigned int cli$dispatch(void);3 extern unsigned int newsrdr_cld(), cmd_table();# extern void Read_Profile(void);Q extern unsigned int Set_Initial_Group(struct GRP *, struct dsc$descriptor *);* extern struct GRP *Find_Group(char *);? extern struct GRP *Find_Group_Wild(char *, unsigned int *);0 extern void Traverse_Finish(unsigned int *);% extern void cmd_initialize(void);' extern unsigned int cmd_exit(void);) extern unsigned int cmd_update(void);. extern unsigned int cmd_readnextnew(void);, extern unsigned int Do_Full_Update(int);1 extern void Make_Return_Address(char *, int);& extern void Clear_ArtInProg(void);" extern void Article_ExH(void);$ extern void Write_Profile(void);! extern void print_clup(void);' extern void Check_New_Groups(void); /***++** ROUTINE: main**** FUNCTIONAL DESCRIPTION:**D** Main program. Initializes things. Parses the NEWSRDR command,K** Contacts the NNTP server. Identifies new groups and does a new article(** check. Goes into main command loop.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:** ** main**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: normal successful completion.**** SIDE EFFECTS: Many.****--*/unsigned int main() {H unsigned int jpi_imagpriv=JPI$_IMAGPRIV, jpi_procpriv=JPI$_PROCPRIV; unsigned int procprivs[2];) $DESCRIPTOR(newsrdr_cmd, "NEWSRDR "); struct dsc$descriptor str;1 unsigned int status, reply_code, update_type; int finish_up; char tmp[STRING_SIZE];/*C** Turn off all image privileges, except NETMBX. We shouldn't needB** any privileges to do anything, unless the foreign mail protocol'** we send messages through needs them.*/1 lib$getjpi(&jpi_imagpriv, 0, 0, image_privs);/ lib$getjpi(&jpi_procpriv, 0, 0, procprivs);$ image_privs[0] &= ~procprivs[0];$ image_privs[1] &= ~procprivs[1];$ image_privs[0] &= ~PRV$M_NETMBX;% sys$setprv(0, image_privs, 0, 0);/*F** Our all-purpose condition handler is below. It filters any signalsC** coming from CLI$ routines. Other errors it prints out using our** output routines.*/$ lib$establish(cli_error_filter);/*** Parse the command.*/ INIT_DYNDESC(str); lib$get_foreign(&str);# str$prefix(&str, &newsrdr_cmd);P status = cli$dcl_parse(&str, newsrdr_cld, lib$get_foreign, lib$get_foreign);7 if (!OK(status)) lib$stop(NEWS__CMDERR, 0, status);/*J** Determine the update type. FULL means use NNTP LIST (default); PARTIALG** means use NNTP GROUP commands for each subscribed group. BOTH meansE** do full followed by partial update (the GROUP command returns more.** accurate information about each newsgroup).*/ update_type = 2;# status = cli_present("UPDATE");! if (status == CLI$_PRESENT) {8 status = cli_get_value("UPDATE", tmp, sizeof(tmp)); if (OK(status)) {4 static char *both={"BOTH"}, *full={"FULL"}; upcase(tmp);8 if (strstr(both, tmp) == both) update_type = 3;= else if (strstr(full, tmp) != full) update_type = 1; }7 } else if (status == CLI$_NEGATED) update_type = 0;/*** Initialize stuff*/ Read_Config();! pager_set_up = Pager_Init(0); Display_Announce(); Read_Profile();/*/** Connect to server, and check for new groups.*/A lib$signal(NEWS__CONNECTING, 2, strlen(news_cfg.server_name),$ news_cfg.server_name);) server_connect(news_cfg.server_name);/*I** If posting isn't disallowed by logical name NEWSRDR_DISALLOW_POSTING,,** check to see if it's OK with the server.*/6 server_get_reply(SRV__ECHO, &reply_code, 0, 0, 0);? if (news_cfg.postingok && reply_code != NNTP__HELOPOSTOK) { news_cfg.postingok = 0; }/ if (news_prof.profread) Check_New_Groups();/*F** Command processing initialization - inits the default_action stuff.*/ cmd_initialize();/*** Our let's-go-home flag*/ finish_up = 0;/*F** Do the newsgroup update. For first-time users (no profile exists),D** do a full update and set up the initial groups. For other users,D** the update is controlled by what they put on the NEWSRDR command.*/3 if (news_prof.profread && (update_type != 0)) {# lib$signal(NEWS__UPDATING, 0); switch (update_type) {% case 1: cmd_update(); break;* case 2: Do_Full_Update(0); break;8 case 3: Do_Full_Update(1); cmd_update(); break; }% } else if (!news_prof.profread) { Do_Full_Update(1); Set_Initial_Groups();# lib$signal(NEWS__UPDATING, 0); cmd_update(); }/*A** Set up exit handler (below) to write our profile back out when** we're through.*/ sys$dclexh(&exhblk);/*** Main command loop.*/ while (!finish_up) { char *cp; put_output(""); User_Interrupt = 0;6 status = get_cmd(tmp+6, sizeof(tmp)-6, "News> ");/*C** The only non-OK status we expect here is RMS$_EOF -- i.e., EXIT.*/ if (!OK(status)) {K if (cleanup_action != (unsigned int (*)()) 0) (*cleanup_action)(); cmd_exit(); break; }/*** Trim blanks from the command*/F for (cp = tmp+strlen(tmp); cp > tmp+6 && isspace(*(cp-1)); cp--); *cp = '\0';1 for (cp = tmp+6; *cp && isspace(*cp); cp++);/*H** If it's a null command, perform the default_action routine. If there+** is no default action, use READ/NEXT/NEW.**F** Otherwise, if it's all digits then assume it's an article number toE** be read; if it's just a group name, then assume they want to go to** that group.*/ if (*cp == '\0') {8 if (default_action == (unsigned int (*)()) 0) {9 finish_up = cmd_readnextnew() == NEWS__ALLDONE; } else {; finish_up = (*default_action)() == NEWS__ALLDONE; } } else {& struct dsc$descriptor tmpdsc;' $DESCRIPTOR(Prompt, "News> ");6 if (strspn(cp, "0123456789") == strlen(cp)) { cp -= 5;! memcpy(cp, "READ ", 5);. } else if (strchr(cp, ' ') == NULL) { locase(cp);$ if (Find_Group(cp) == 0) { unsigned int ctx; struct GRP *g;A if (strchr(cp, '*') != 0 || strchr(cp, '%') != 0) { ctx = 0;= while ((g = Find_Group_Wild(cp, &ctx)) != 0) {' if (g->subscribed) {* Traverse_Finish(&ctx); break; } } if (g != 0) {) strcpy(tmp, "GROUP ");* strcat(tmp, g->grpnam); cp = tmp; } } } else { cp -= 6;& memcpy(cp, "GROUP ", 6); } }/*G** Parse the command and perform the specified action. If the parse isC** successful or we need to exit due to an end-of-file, perform the!** cleanup action first (if any).*/, INIT_SDESC(tmpdsc, strlen(cp), cp);K status = cli$dcl_parse(&tmpdsc, cmd_table, get_cmd_dx, get_cmd_dx, &Prompt);" if (status == RMS$_EOF) {L if (cleanup_action != (unsigned int (*)()) 0) (*cleanup_action)(); cmd_exit(); break; } else {? if (!OK(status)) lib$signal(NEWS__CMDERR, 0, status); else {; if (cleanup_action != (unsigned int (*)()) 0)# (*cleanup_action)();: finish_up = cli$dispatch() == NEWS__ALLDONE; } } } }/* ** Say good-night to the server.*/ server_send("QUIT");6 server_get_reply(SRV__ECHO, &reply_code, 0, 0, 0); server_disconnect(); return SS$_NORMAL; } /* main */ /***++** ROUTINE: cli_error_filter**** FUNCTIONAL DESCRIPTION:**?** Condition handler for NEWSRDR. Filters any signals comingB** from CLI$ routines; uses our own output routines for all other6** signals (if our output routines have been set up).**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**J** cli_error_filter(signal_array, mechanism_array) **!** IMPLICIT INPUTS: pager_set_up**** IMPLICIT OUTPUTS: None.**/** COMPLETION CODES: SS$_NORMAL, SS$_RESIGNAL.**** SIDE EFFECTS: None.****--*/Ostatic unsigned int cli_error_filter(unsigned int sig[], unsigned int mech[]) {, unsigned int return_status = SS$_NORMAL;0 if (sig[1] == SS$_UNWIND) return SS$_NORMAL;6 if ($VMS_STATUS_FAC_NO(sig[1]) != CLI$_FACILITY) {8 if ($VMS_STATUS_SEVERITY(sig[1]) == STS$K_SEVERE) {2 if (pager_set_up) Finish_Paged_Output(1);& return_status = SS$_RESIGNAL; } else if (!pager_set_up) {& return_status = SS$_RESIGNAL; } else { sig[0] -= 2;+ sys$putmsg(sig, put_errmsg, 0, 0); sig[0] += 2; } } return return_status;} /* cli_error_filter */ /***++** ROUTINE: Read_Config**** FUNCTIONAL DESCRIPTION:**<** Sets up the news_cfg structure, which consists of items@** of information that aren't directly settable by the user (at!** least, not within NEWSRDR). **B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** Read_Config()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: normal successful completion.**&** SIDE EFFECTS: Changes news_cfg.****--*/#static unsigned int Read_Config() { ITMLST jpilst[3]; char tmp[STRING_SIZE];# unsigned int prcprv[2], status; unsigned short tlen; int ok;- memset(&news_cfg, 0, sizeof(struct CFG));A news_cfg.bangpath = news_cfg.newgroups = news_cfg.dopath = 1;K news_cfg.postingok = !OK(get_logical("NEWSRDR_DISALLOW_POSTING", tmp));C ITMLST_INIT(jpilst[0], JPI$_USERNAME, sizeof(tmp), tmp, &tlen);E ITMLST_INIT(jpilst[1], JPI$_PROCPRIV, sizeof(prcprv), prcprv, 0);' ITMLST_INIT(jpilst[2], 0, 0, 0, 0);3 status = sys$getjpiw(0, 0, 0, jpilst, 0, 0, 0);# if (!OK(status)) return status;: while (isspace(tmp[tlen-1])) tlen--; tmp[tlen] = '\0';# strcpy(news_cfg.username, tmp);H status = get_system_logical("NEWSRDR_SERVER", news_cfg.server_name);N if (!OK(status) || (prcprv[0]&PRV$M_SETPRV) || (prcprv[0]&PRV$M_SYSNAM)) {B status = get_logical("NEWSRDR_SERVER", news_cfg.server_name); }# if (!OK(status)) return status;I status = get_system_logical("NEWSRDR_NODE_NAME", news_cfg.node_name); if (!OK(status)) {K status = get_hostname(news_cfg.node_name, sizeof(news_cfg.node_name)); }# if (!OK(status)) return status;J if (!OK(get_system_logical("NEWSRDR_MAIL_NODE", news_cfg.mailnode))) {3 strcpy(news_cfg.mailnode, news_cfg.node_name); }; get_logical("NEWSRDR_ORGANIZATION", news_cfg.org_name); > get_logical("NEWSRDR_MAIL_PROTOCOL", news_cfg.mail_proto);9 get_logical("NEWSRDR_PATH_STRING", news_cfg.pathstr);. ok = 1;RG if (OK(get_system_logical("NEWSRDR_DISABLE_USER_REPLY_TO", tmp))) {S* ok = strchr("TtYy1", tmp[0]) == NULL; }1H if (ok) ok = OK(get_logical("NEWSRDR_REPLY_TO", news_cfg.reply_to));O if (!ok) Make_Return_Address(news_cfg.reply_to, sizeof(news_cfg.reply_to));n4 if (OK(get_logical("NEWSRDR_BANG_PATH", tmp))) {9 news_cfg.bangpath = strchr("TtYy1", tmp[0]) != NULL;s }k7 if (OK(get_logical("NEWSRDR_BANG_ADDRESS", tmp))) {.9 news_cfg.bangaddr = strchr("TtYy1", tmp[0]) != NULL;M } 8 if (OK(get_logical("NEWSRDR_DO_MESSAGE-ID", tmp))) {9 news_cfg.genmsgid = strchr("TtYy1", tmp[0]) != NULL;9 }-2 if (OK(get_logical("NEWSRDR_DO_DATE", tmp))) {8 news_cfg.gendate = strchr("TtYy1", tmp[0]) != NULL; }-7 if (OK(get_logical("NEWSRDR_DO_NEWGROUPS", tmp))) {s: news_cfg.newgroups = strchr("TtYy1", tmp[0]) != NULL; }P if (!news_cfg.newgroups && OK(get_logical("NEWSRDR_FAKE_NEWGROUPS", tmp))) {B news_cfg.newgroups = strchr("TtYy1", tmp[0]) == NULL ? 0 : 2; }-2 if (OK(get_logical("NEWSRDR_DO_PATH", tmp))) {7 news_cfg.dopath = strchr("TtYy1", tmp[0]) != NULL;s }o< if (OK(get_logical("NEWSRDR_HEADER_CACHE_SIZE", tmp))) {C if (!OK(lib$cvt_dtb(strlen(tmp), tmp, &news_cfg.cachesize))) {M" news_cfg.cachesize = 128; }$ } else news_cfg.cachesize = 128;5 if (OK(get_logical("NEWSRDR_GMT_OFFSET", tmp))) {  char *cp;" struct dsc$descriptor tmpdsc; if (!isdigit(tmp[0])) {, news_cfg.neggmtoff = tmp[0] == '-'; cp = &tmp[1]; } else cp = tmp; ( INIT_SDESC(tmpdsc, strlen(cp), cp);. sys$bintim(&tmpdsc, &news_cfg.gmtoffset); } else {$ $DESCRIPTOR(est, "0 05:00:00");+ sys$bintim(&est, &news_cfg.gmtoffset);  news_cfg.neggmtoff = 1; news_cfg.dst = 1; }x6 if (OK(get_logical("NEWSRDR_US_DST_ZONE", tmp))) {4 news_cfg.dst = strchr("TtYy1", tmp[0]) != NULL; }p? if (OK(get_logical("NEWSRDR_CHARACTER_CONVERSION", tmp))) {u? status = find_image_symbol("NEWSRDR_CHARACTER_CONVERSION",S5 "LOCAL_TO_NETWORK", &news_cfg.chrlton);i if (OK(status)) {C status = find_image_symbol("NEWSRDR_CHARACTER_CONVERSION",s5 "NETWORK_TO_LOCAL", &news_cfg.chrntol);u }" news_cfg.chrcnv = OK(status); }AA if (OK(get_system_logical("NEWSRDR_NAME_CONVERSION", tmp))) {N unsigned int (*init)();: status = find_image_symbol("NEWSRDR_NAME_CONVERSION", "INIT", &init);- if (OK(status)) {> status = find_image_symbol("NEWSRDR_NAME_CONVERSION",+ "CONVERT", &news_cfg.namcvt);- } if (OK(status)) {< (void) find_image_symbol("NEWSRDR_NAME_CONVERSION",0 "FULL_CONVERT", &news_cfg.fnmcvt); } if (OK(status)) {> status = find_image_symbol("NEWSRDR_NAME_CONVERSION",, "CLEANUP", &news_cfg.namclup); }8 if (OK(status)) status = (*init)(&news_cfg.namctx);" news_cfg.namcnv = OK(status); }fD if (OK(get_system_logical("NEWSRDR_ADDRESS_CONVERSION", tmp))) { unsigned int (*init)();= status = find_image_symbol("NEWSRDR_ADDRESS_CONVERSION",B "INIT", &init);N if (OK(status)) {A status = find_image_symbol("NEWSRDR_ADDRESS_CONVERSION",l+ "CONVERT", &news_cfg.adrcvt);e } if (OK(status)) {A status = find_image_symbol("NEWSRDR_ADDRESS_CONVERSION",, "CLEANUP", &news_cfg.adrclup); }7 if (OK(status)) status = (init)(&news_cfg.adrctx); " news_cfg.adrcnv = OK(status); }n return SS$_NORMAL;} /* Read_Config */  i/***++** ROUTINE: exit_handler_**** FUNCTIONAL DESCRIPTION: **@** Exit handler for NEWSRDR. Calls cleanup routines to deleteF** temporary files and such, and writes out the NEWSRDR_PROFILE file.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**-** exit_handler(unsigned int *final_status)c**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.e**** COMPLETION CODES: ****** SIDE EFFECTS: None.****--*/>static unsigned int exit_handler(unsigned int *final_status) { Clear_ArtInProg(); Article_ExH(); Write_Profile(); print_clup();e? if (news_cfg.namcnv) (*news_cfg.namclup)(&news_cfg.namctx);? if (news_cfg.adrcnv) (*news_cfg.adrclup)(&news_cfg.namctx);C return SS$_NORMAL;} /* exit_handler */ M/***++** ROUTINE: Display_Announce **** FUNCTIONAL DESCRIPTION:$**?** Displays the announcement message, if one has been set up.s**** RETURNS: void**** PROTOTYPE:**** Display_Announce()I**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.p**** COMPLETION CODES: None. **** SIDE EFFECTS: None.****--*/ static void Display_Announce() { unsigned int status, unit;4 char annfile[FSPEC_SIZE], tmp[STRING_SIZE], *cp; int tlen;_6 status = get_logical("NEWSRDR_ANNOUNCE", annfile);0 if (!OK(status) || *annfile == '\0') return; put_output(""); if (*annfile == '@') {. for (cp = annfile+1; isspace(*cp); cp++);, status = file_open(cp, &unit, 0, 0, 0); if (!OK(status)) return;_= while (OK(file_read(unit, tmp, sizeof(tmp)-1, &tlen))) {; tmp[tlen] = '\0'; put_output(tmp);  } file_close(unit); } else { put_output(annfile); }e} /* Display_Announce */ /***++** ROUTINE: Set_Initial_Groupsn**** FUNCTIONAL DESCRIPTION:**;** Subscribes a new user to an initial set of newsgroups.B** The logical name NEWSRDR_INITIAL_GROUPS is translated from theD** process, job, group, and system logical name tables; the user isK** subscribed to all newsgroups resulting from each of those translations._**** RETURNS: voide**** PROTOTYPE:**** Set_Initial_Groups()***** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.S**** COMPLETION CODES: None.S**,** SIDE EFFECTS: Changes the group tree.****--*/"static void Set_Initial_Groups() { ITMLST lnmlst[3]; char lnmbuf[256];a' struct dsc$descriptor tabnam, sdsc;O2 $DESCRIPTOR(lognam, "NEWSRDR_INITIAL_GROUPS");N static char *table[] = {"LNM$PROCESS","LNM$JOB","LNM$GROUP","LNM$SYSTEM"}; int i, maxidx; short len; unsigned int status;# ITMLST_INIT(lnmlst[2],0,0,0,0); 8 for (i = 0; i < sizeof(table)/sizeof(char *); i++) {D ITMLST_INIT(lnmlst[0],LNM$_MAX_INDEX,sizeof(maxidx),&maxidx,0);$ ITMLST_INIT(lnmlst[1],0,0,0,0);2 INIT_SDESC(tabnam,strlen(table[i]),table[i]);9 status = sys$trnlnm(0, &tabnam, &lognam, 0, lnmlst);  if (OK(status)) { int j;g( for (j = 0; j <= maxidx; j++) {; ITMLST_INIT(lnmlst[0],LNM$_INDEX,sizeof(j),&j,0);)J ITMLST_INIT(lnmlst[1],LNM$_STRING,sizeof(lnmbuf)-1,lnmbuf,&len);> status = sys$trnlnm(0, &tabnam, &lognam, 0, lnmlst); if (OK(status)) {s# *(lnmbuf+len) = '\0';i locase(lnmbuf);a, INIT_SDESC(sdsc, len, lnmbuf);D lib$traverse_tree(&news_prof.gtree, Set_Initial_Group, &sdsc); }e } } } } /* Set_Initial_Groups */__CMDERR, 0, status);/*J** Determine the upd~NEWSRDR_SRC.BCKeP[NEWSRDR]PARSING.C;27V# **[NEWSRDR]PARSING.C;27+,e.#/ @ 4V#"-P0123KPWO$56Q˖73m˖83Bߦ99G @HJD/***++** FACILITY: NEWSRDR**** ABSTRACT: Parsing routines.**** MODULE DESCRIPTION:**0** Various routines that parse various things.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON. "** ALL RIGHTS RESERVED.**** CREATION DATE: 06-SEP-1992**** MODIFICATION HISTORY:**1** 06-SEP-1992 V1.0 Madison Initial coding.E** 12-SEP-1992 V1.0-1 Madison Add support for '.' in parse_range.D** 08-OCT-1992 V1.0-2 Madison Check for tab a.w.a. space in PLR.D** 12-APR-1993 V1.1 Madison Line count added to parse_headers.6** 19-MAY-1993 V1.1-1 Madison Fix Parse_Range bug.**--*/#include "newsrdr.h"#include "globals.h"#include "tpadef.h"#define TAB '\011'# extern unsigned int parse822(); struct PGRBLK { struct tpadef tpa0; int *acnt; int *first; int *last; };& extern int pgr_state(), pgr_key(); struct PRBLK { struct tpadef tpa0; int *first; int *last; int current; };6 extern int parse_range_state(), parse_range_key(); struct PXBLK { struct tpadef tpa0; struct QUE *hdrq; char *grpp; char *grp; char *nump; char *num; };/*** Forward declarations*/8 unsigned int Parse_List_Reply(char *, struct GRP *);@ unsigned int parse_group_reply(char *, int *, int *, int *);, unsigned int pgr_store(struct PGRBLK *);8 unsigned int Parse_Range(char *, int *, int *, int);3 unsigned int parse_range_store(struct PRBLK *);9 unsigned int Parse_ToList(char *, struct QUE *, int);B unsigned int Parse_Headers(struct QUE *, struct QUE *, int *);2 unsigned int Parse_Xref(char *, struct QUE *);* unsigned int px_store(struct PXBLK *);1 unsigned int csl_parse(char *, struct QUE *);$ extern int px_state(), px_key(); /***++** ROUTINE: Parse_List_Reply**** FUNCTIONAL DESCRIPTION:**B** Parses group information from a LIST command reply, and fillsF** in the appropriate parts of a GRP structure from that information.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**1** Parse_List_Reply(char *str, struct GRP *grp)**1** str: ASCIZ_string, read only, by reference/** grp: GRP structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/;unsigned int Parse_List_Reply(char *str, struct GRP *grp) { char *anchor, *cp, *cp2; int remlen, len, copylen; anchor = str; remlen = strlen(str); cp = strchr(anchor, ' ');& if (!cp) cp = strchr(anchor, TAB);! if (!cp) lib$stop(SS$_ABORT); len = cp - anchor;J copylen = (len > sizeof(grp->grpnam)-1 ? sizeof(grp->grpnam)-1 : len);* strncpy(grp->grpnam, anchor, copylen);" *(grp->grpnam+copylen) = '\0'; remlen -= len + 1; anchor += len + 1; cp = strchr(anchor, ' ');& if (!cp) cp = strchr(anchor, TAB);! if (!cp) lib$stop(SS$_ABORT); len = cp - anchor;+ for (cp2 = anchor; *cp2 == '0'; cp2++); if (!*cp2) { grp->lastavl = 0; } else {- lib$cvt_dtb(cp-cp2, cp2, &grp->lastavl); } remlen -= len + 1; anchor += len + 1; cp = strchr(anchor, ' ');& if (!cp) cp = strchr(anchor, TAB);! if (!cp) lib$stop(SS$_ABORT); len = cp - anchor;2 lib$cvt_dtb(cp-anchor, anchor, &grp->frstavl); remlen -= len + 1; anchor += len + 1;( if (remlen < 1) lib$stop(SS$_ABORT);E if (*anchor == '=' || *anchor == 'X' || *anchor == 'x') return 0;7 grp->directpost = *anchor != 'Y' && *anchor != 'y'; return SS$_NORMAL;} /* Parse_List_Reply */ /***++** ROUTINE: parse_group_reply**** FUNCTIONAL DESCRIPTION:**<** Uses LIB$T{ABLE_}PARSE to parse the response of a GROUP ** command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**C** parse_group_reply(char *str, int *acnt, int *first, int *last)**1** str: ASCIZ_string, read only, by reference-** acnt: integer, write only, by reference-** first: integer, write only, by reference-** last: integer, write only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/Munsigned int parse_group_reply(char *str, int *acnt, int *first, int *last) { struct PGRBLK tpablk;' memset(&tpablk, 0, sizeof(tpablk));/ tpablk.tpa0.tpa$l_count = TPA$K_COUNT0 + 3;. tpablk.tpa0.tpa$l_stringcnt = strlen(str);& tpablk.tpa0.tpa$l_stringptr = str; tpablk.acnt = acnt; tpablk.first = first; tpablk.last = last;F return table_parse(&tpablk, (void *) pgr_state, (void *) pgr_key);} /* parse_group_reply */ /***++** ROUTINE: pgr_store**** FUNCTIONAL DESCRIPTION:**E** LIB$T{ABLE_}PARSE action routine for use with parse_group_reply.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** pgr_store(...)**B** For TABLE_PARSE, the elements of the PGRBLK structure are the** arguments.**@** For LIB$TABLE_PARSE, the address of the PGRBLK structure is!** passed as the only argument.**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/,unsigned int pgr_store(struct PGRBLK *tpa) {$ switch (tpa->tpa0.tpa$l_param) { case 1:) *tpa->acnt = tpa->tpa0.tpa$l_number; break; case 2:* *tpa->first = tpa->tpa0.tpa$l_number; break; case 3:) *tpa->last = tpa->tpa0.tpa$l_number; break; } return SS$_NORMAL;} /* pgr_store */ /***++** ROUTINE: Parse_Range**** FUNCTIONAL DESCRIPTION:**+** Parses an article range specification.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**?** Parse_Range(char *str, int *first, int *last, int current)**2** str: ASCIZ_string, read only, by reference.** first: integer, write only, by reference.** last: integer, write only, by reference)** current: integer, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/Iunsigned int Parse_Range(char *str, int *first, int *last, int current) { struct PRBLK tpablk;' memset(&tpablk, 0, sizeof(tpablk));- tpablk.tpa0.tpa$l_count = TPA$K_COUNT0+3;. tpablk.tpa0.tpa$l_stringcnt = strlen(str);& tpablk.tpa0.tpa$l_stringptr = str; tpablk.first = first; tpablk.last = last; tpablk.current = current;V return table_parse(&tpablk, (void *) parse_range_state, (void *) parse_range_key);} /* Parse_Range */ /***++** ROUTINE: parse_range_store**** FUNCTIONAL DESCRIPTION:**:** LIB$T{}PARSE action routine for use with Parse_Range.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** parse_range_store(...)**A** For TABLE_PARSE, the elements of the PRBLK structure are the** arguments.**?** For LIB$TABLE_PARSE, the address of the PRBLK structure is!** passed as the only argument.**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/3unsigned int parse_range_store(struct PRBLK *tpa) {$ switch (tpa->tpa0.tpa$l_param) { case 1:7 *tpa->first = *tpa->last = tpa->tpa0.tpa$l_number; break; case 2:) *tpa->last = tpa->tpa0.tpa$l_number; break; case 3:2 if (tpa->current == 0) return LIB$_SYNTAXERR;- *tpa->first = *tpa->last = tpa->current; break; case 4:2 if (tpa->current == 0) return LIB$_SYNTAXERR; *tpa->last = tpa->current; break; default: break; } return SS$_NORMAL;} /* parse_range_store */ /***++** ROUTINE: Parse_ToList**** FUNCTIONAL DESCRIPTION:**=** Parses a list of addresses. Actually, calls parse822 to?** do that. Strips all the extraneous stuff off each address,?** inserts it in a queue. If keep_name is set, the extraneous** stuff is kept.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**=** Parse_ToList(char *str, struct QUE *hdrq, int keep_name)**2** str: ASCIZ_string, read only, by reference0** hdrq: QUE structure, modify, by reference+** keep_name: boolena, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/Gunsigned int Parse_ToList(char *str, struct QUE *hdrq, int keep_name) { unsigned int ctx, status; char *address, *fulladdress; ctx = 0;K while (OK((status = parse822(str, &ctx, &fulladdress, &address, 0)))) {G insert_header((keep_name ? fulladdress : address), hdrq->tail, 0); }; return (status == SS$_ENDOFFILE) ? SS$_NORMAL : status;} /* Parse_ToList */ /***++** ROUTINE: Parse_Headers**** FUNCTIONAL DESCRIPTION:**G** Parses a queue of headers that are in plain text form into a queue** of TLV representations.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**<** Parse_Headers(struct QUE *inq, struct QUE *outq, int *)**2** inq: QUE structure, read only, by reference/** outq: QUE structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/Lunsigned int Parse_Headers(struct QUE *inq, struct QUE *outq, int *xlines) { struct HDR *hdr, *hdr2; int i, len, lines; char *cp;? static char *Tag[] = {"From","Date","Newsgroups","Subject",; "Message-ID","Path","Reply-To","Sender","Followup-To",5 "Expires","References","Control","Distribution",< "Organization","Keywords","Summary","Approved","Lines", "Xref"};O static int Code[] = {NEWS_K_HDR_FROM,NEWS_K_HDR_DATE,NEWS_K_HDR_NEWSGROUPS,> NEWS_K_HDR_SUBJECT,NEWS_K_HDR_MESSAGE_ID,NEWS_K_HDR_PATH,B NEWS_K_HDR_REPLY_TO,NEWS_K_HDR_SENDER,NEWS_K_HDR_FOLLOWUP_TO,A NEWS_K_HDR_EXPIRES,NEWS_K_HDR_REFERENCES,NEWS_K_HDR_CONTROL,I NEWS_K_HDR_DISTRIBUTION,NEWS_K_HDR_ORGANIZATION,NEWS_K_HDR_KEYWORDS,= NEWS_K_HDR_SUMMARY,NEWS_K_HDR_APPROVED,NEWS_K_HDR_LINES, NEWS_K_HDR_XREF}; lines = 0;H for (hdr = inq->head; hdr != (struct HDR *) inq; hdr = hdr->flink) { cp = strchr(hdr->str, ':'); len = cp-hdr->str;7 for (i = 0; i < sizeof(Tag)/sizeof(char *); i++) {% if (len == strlen(Tag[i]) &&: strneql_case_blind(hdr->str, Tag[i], len)) {# while (isspace(*(++cp)));* hdr2 = mem_gethdr(strlen(cp)+1); hdr2->code = Code[i]; strcpy(hdr2->str, cp);) queue_insert(hdr2, outq->tail); lines++; break; } } } if (xlines) *xlines = lines; return SS$_NORMAL;} /* parse_headers */ /***++** ROUTINE: Parse_Xref**** FUNCTIONAL DESCRIPTION:**A** Uses LIB$T{}PARSE to parse an Xref: header, building a queue ** of group/article references.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**,** Parse_Xref(char *str, struct QUE *hdrq)**1** str: ASCIZ_string, read only, by reference/** hdrq: QUE structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/6unsigned int Parse_Xref(char *str, struct QUE *hdrq) { struct PXBLK tpablk; char grp[STRING_SIZE]; char num[STRING_SIZE];' memset(&tpablk, 0, sizeof(tpablk));- tpablk.tpa0.tpa$l_count = TPA$K_COUNT0+4;- tpablk.tpa0.tpa$l_options = TPA$M_BLANKS;. tpablk.tpa0.tpa$l_stringcnt = strlen(str);& tpablk.tpa0.tpa$l_stringptr = str; tpablk.hdrq = hdrq;# tpablk.grp = tpablk.grpp = grp;# tpablk.num = tpablk.nump = num;D return table_parse(&tpablk, (void *) px_state, (void *) px_key);} /* Parse_Xref */ /***++** ROUTINE: px_store**** FUNCTIONAL DESCRIPTION:**0** LIB$T{}PARSE action routine for Parse_Xref.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** px_store(...)**A** For TABLE_PARSE, the elements of the PXBLK structure are the** arguments.**?** For LIB$TABLE_PARSE, the address of the PXBLK structure is!** passed as the only argument.**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/*unsigned int px_store(struct PXBLK *tpa) { int copylen; struct HDR *h;$ switch (tpa->tpa0.tpa$l_param) { case 1:K strncpy(tpa->grp, tpa->tpa0.tpa$l_tokenptr, tpa->tpa0.tpa$l_tokencnt);5 tpa->grpp = tpa->grp + tpa->tpa0.tpa$l_tokencnt; *tpa->grpp = '\0'; break; case 2:( copylen = tpa->tpa0.tpa$l_tokencnt;6 if (copylen > STRING_SIZE-(tpa->grpp-tpa->grp)-1)7 copylen = STRING_SIZE-(tpa->grpp-tpa->grp)-1; if (copylen > 0) {? strncpy(tpa->grpp, tpa->tpa0.tpa$l_tokenptr, copylen); tpa->grpp += copylen; *tpa->grpp = '\0'; } break; case 3: tpa->nump = tpa->num; break; case 4:( copylen = tpa->tpa0.tpa$l_tokencnt;6 if (copylen > STRING_SIZE-(tpa->nump-tpa->num)-1)7 copylen = STRING_SIZE-(tpa->nump-tpa->num)-1; if (copylen > 0) {? strncpy(tpa->nump, tpa->tpa0.tpa$l_tokenptr, copylen); tpa->nump += copylen; *tpa->nump = '\0'; } break; case 5:: if (tpa->grpp != tpa->grp && tpa->nump != tpa->num) { int num;7 lib$cvt_dtb(strlen(tpa->num), tpa->num, &num);7 insert_header(tpa->grp, tpa->hdrq->tail, num); } default: break; } return SS$_NORMAL;} /* px_store */ /***++** ROUTINE: csl_parse**** FUNCTIONAL DESCRIPTION:**B** Parses a comma-separated list of strings, taking into accountH** quoting and comment delimiters (exclamation points). Builds a queue** of the individual items.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:***** csl_parse(char *str, struct QUE *que)**1** str: ASCIZ_string, read only, by reference/** que: QUE structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/4unsigned int csl_parse(char *str, struct QUE *que) {+ char tmp[STRING_SIZE], *icp, *ocp, *cp; struct HDR *hdr; int inq; icp = str; while (isspace(*icp)) icp++; inq = 0; ocp = tmp; while (*icp) { if (inq) {" if (*icp == '"') inq = 0; *ocp++ = *icp++; } else { if (*icp == '!') { break;" } else if (*icp == ',') {7 while (ocp > tmp && isspace(*(ocp-1))) ocp--; *ocp = '\0';: if (strneql_case_blind(tmp, news_cfg.mail_proto,2 strlen(news_cfg.mail_proto))) {5 cp = tmp + strlen(news_cfg.mail_proto);2 if (*cp == '"' && *(ocp-1) == '"') { cp++; *(--ocp) = '\0';N }o } else cp = tmp;# hdr = mem_gethdr(ocp-cp);a strcpy(hdr->str, cp); ' queue_insert(hdr, que->tail);  ocp = tmp; icp++;& while (isspace(*icp)) icp++; } else {*# if (*icp == '"') inq = 1;n *ocp++ = *icp++; } } }u1 while (ocp > tmp && isspace(*(ocp-1))) ocp--;- if (ocp > tmp) { *ocp = '\0'; 5 if (strneql_case_blind(tmp, news_cfg.mail_proto,d. strlen(news_cfg.mail_proto))) {0 cp = tmp + strlen(news_cfg.mail_proto);- if (*cp == '"' && *(ocp-1) == '"') {f cp++;A *(--ocp) = '\0'; } } else cp = tmp;P hdr = mem_gethdr(ocp-cp); strcpy(hdr->str, cp);" queue_insert(hdr, que->tail); }x return SS$_NORMAL;} /* csl_parse */PLK { struct tpadef tpa0; 7~NEWSRDR_SRC.BCKDP[NEWSRDR]PROFILE.C;34W26*[NEWSRDR]PROFILE.C;34+,D.2/ @ 4W21-P0123KPWO356<ͣЖ7:꣍Ж8:Ր>9G @HJb/***++** FACILITY: NEWSRDR**5** ABSTRACT: Routines dealing with NEWSRDR profiles.**** MODULE DESCRIPTION:**:** This module contains the routines that read and write** NEWSRDR profiles.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 09-SEP-1992**** MODIFICATION HISTORY:**1** 09-SEP-1992 V1.0 Madison Initial coding.7** 11-SEP-1992 V1.1 Madison Added NEWSRC support.J** 28-SEP-1992 V1.1-1 Madison Header settings weren't stored properly.G** 29-SEP-1992 V1.1-2 Madison Default headers weren't set properly.G** 12-APR-1993 V1.2 Madison Added autoreadnew, usemailpnam flags.>** 16-APR-1993 V1.2-1 Madison Support for faked NEWGROUPS.H** 23-APR-1993 V1.2-2 Madison Add support for force_proto, ngaction.A** 25-MAY-1993 V1.2-3 Madison Make sure directpost flag is 1.**--*/#include "newsrdr.h"#include "globals.h"#ifdef __GNUC__#include #include #include #include #else#include #include #include #include #endif#ifndef UAI$M_RESTRICTED&#define UAI$M_RESTRICTED UAI$M_CAPTIVE#endif$ unsigned int Read_Profile(void);% unsigned int Write_Profile(void);C static unsigned int write_grp_info(struct GRP *, struct RAB *);" extern void Read_NewsRC(void);# extern void Write_NewsRC(void);/*D** Basically, profile information is kept in a private tagged-recordJ** format, so it's easy to add more profile items in a backward-compatibleD** way. The tags are binary (and so is the information, in a lot of/** cases), so users keep their noses out of it.*/ #define PFILE__LASTGRPCHK 201#define PFILE__GROUP 315 #define PFILE__GROUP_NOSUB 316 #define PFILE__RANGELIST 739 #define PFILE__KILLLIST 822#define PFILE__HEADER 421 #define PFILE__NEWHEADER 351 #define PFILE__PERSONALNAME 167 #define PFILE__EDITORNAME 293 #define PFILE__SIGFILENAME 386#define PFILE__FLAGS 550 #define PFILE__GLOBALKILL 679#define PFILE__ARCHIVE 484#define PFILE__NEWSRC 796#define PFILE__QUEUE 809 #define PFILE__FORM 46 #define PFILE__DIRWIDTH 98 #define PFILE__NGACTION 145 struct PFREC { int code; union { TIME lgc; struct { short textlen; short hdrcode; char text[256]; } txt; struct { int rcount; int range[1]; } rng; struct { int fromwid; int subjwid; } wid; unsigned int flags; } u; };7#define PFREC_S_FRONT (sizeof(int)+sizeof(short)*2)#define PFREC_M_EDIT 1#define PFREC_M_AUTOSIG 2#define PFREC_M_SPAWNEDIT 4#define PFREC_M_NEWFLAGS 8#define PFREC_M_AUTOSIGP 16#define PFREC_M_AUTOSIGM 32#define PFREC_M_REPLYP 64#define PFREC_M_REPLYM 128#define PFREC_M_NOAUTORN 256#define PFREC_M_USEMAILPN 512 #define PFREC_M_FORCEPROTO 1024+#define MAXRCT ((sizeof(struct PFREC)-8)/8)+#define MAXHCT ((sizeof(struct PFREC)-8)/4)D static int default_header[] = {NEWS_K_HDR_FROM, NEWS_K_HDR_DATE,8 NEWS_K_HDR_NEWSGROUPS, NEWS_K_HDR_SUBJECT,= NEWS_K_HDR_MESSAGE_ID, NEWS_K_HDR_DISTRIBUTION,9 NEWS_K_HDR_ORGANIZATION, NEWS_K_HDR_LINES};! static char *hdrname[] = {"",; "FROM", "DATE", "NEWSGROUPS", "SUBJECT", "MESSAGE-ID",< "PATH", "REPLY-TO", "SENDER", "FOLLOWUP-TO", "EXPIRES",= "REFERENCES", "CONTROL", "DISTRIBUTION", "ORGANIZATION",9 "KEYWORDS", "SUMMARY", "APPROVED", "LINES", "XREF"};+ extern void Insert_Group(struct GRP *);Q extern unsigned int mail$user_begin(), mail$user_get_info(), mail$user_end(); /***++** ROUTINE: Read_Profile**** FUNCTIONAL DESCRIPTION:**;** Reads in a profile, filling in the appropriate bits ofC** the in-memory profile structure (news_prof) and the group tree.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** Read_Profile()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int Read_Profile() {8 ITMLST uailst[2], mailst[2], mailst3[5], mailnul[1]; struct FAB fab; struct RAB rab; struct PFREC pfr; struct GRP *g; struct RNG *rng; struct HDR *h, *h2; unsigned int uaflags; char tmp[STRING_SIZE]; struct dsc$descriptor sdsc; short tlen; int vms_v52, i;! unsigned int mailctx, status; vms_v52 = 0;- memset(&news_prof, 0, sizeof(news_prof));/*C** For some reason the captive flag is part of news_prof instead of*** news_cfg. That should probably change.*/B ITMLST_INIT(uailst[0], SYI$_VERSION, sizeof(tmp), tmp, &tlen);' ITMLST_INIT(uailst[1], 0, 0, 0, 0);3 status = sys$getsyiw(0, 0, 0, uailst, 0, 0, 0);! if (OK(status) && tlen > 4) {@ vms_v52 = tmp[1] > '5' || (tmp[1] == '5' && tmp[3] >= '2'); }E ITMLST_INIT(uailst[0], UAI$_FLAGS, sizeof(uaflags), &uaflags, 0);C INIT_SDESC(sdsc, strlen(news_cfg.username), news_cfg.username);6 status = sys$getuai(0, 0, &sdsc, uailst, 0, 0, 0);A news_prof.captive = (uaflags & UAI$M_RESTRICTED) && !vms_v52;/*A** Initialize news_prof the way we want it to be, even if there's** no profile.*/I news_prof.hdrlist.head = news_prof.hdrlist.tail = &news_prof.hdrlist;C news_prof.killq.head = news_prof.killq.tail = &news_prof.killq;& sys$gettim(&news_prof.lastgrpchk);/ strcpy(news_prof.print_queue, "SYS$PRINT");7 news_prof.dir_fromwid = news_prof.dir_subjwid = -1; news_prof.usemailpnam = 1;# news_prof.ngaction = NG_K_NONE;/**** Open it up and read in the information.*/ fab = cc$rms_fab; fab.fab$b_fac = FAB$M_GET;& fab.fab$l_fna = "NEWSRDR_PROFILE"; fab.fab$b_fns = 15;& fab.fab$l_dna = "SYS$LOGIN:.NRPF"; fab.fab$b_dns = 15;" status = sys$open(&fab, 0, 0); if (!OK(status)) {; lib$signal(NEWS__NOOPNPROF, 0, status, fab.fab$l_stv); } else { rab = cc$rms_rab; rab.rab$l_fab = &fab;# rab.rab$l_ubf = (char *) 𝔭! rab.rab$w_usz = sizeof(pfr); sys$connect(&rab,0,0);/*C** g is used to keep track of the group we're currently working on,D** since groups use more than one profile record -- the one with the*** name, the seen list, and the kill list.*/ g = NULL;$ while (OK(sys$get(&rab,0,0))) { switch (pfr.code) { case PFILE__LASTGRPCHK: if (g != NULL) { Insert_Group(g); g = NULL; }+ news_prof.lastgrpchk = pfr.u.lgc; break; case PFILE__FLAGS: if (g != NULL) { Insert_Group(g); g = NULL; }6 news_prof.edit = pfr.u.flags & PFREC_M_EDIT;@ news_prof.spawnedit = pfr.u.flags & PFREC_M_SPAWNEDIT;/ if (pfr.u.flags & PFREC_M_NEWFLAGS) {E news_prof.autosigpost = pfr.u.flags & PFREC_M_AUTOSIGP;E news_prof.autosigmail = pfr.u.flags & PFREC_M_AUTOSIGM;C news_prof.replypost = pfr.u.flags & PFREC_M_REPLYP;C news_prof.replymail = pfr.u.flags & PFREC_M_REPLYM; } else {= news_prof.autosigpost = news_prof.autosigmail =1 pfr.u.flags & PFREC_M_AUTOSIG; }D news_prof.autoreadnew = !(pfr.u.flags & PFREC_M_NOAUTORN);B news_prof.usemailpnam = pfr.u.flags & PFREC_M_USEMAILPN;C news_prof.force_proto = pfr.u.flags & PFREC_M_FORCEPROTO; break; case PFILE__NGACTION:) if (g != NULL) Insert_Group(g);+ news_prof.ngaction = pfr.u.flags; break; case PFILE__GROUP:! case PFILE__GROUP_NOSUB:) if (g != NULL) Insert_Group(g); g = mem_getgrp();4 g->seenq.head = g->seenq.tail = &g->seenq;4 g->killq.head = g->killq.tail = &g->killq;5 g->subscribed = (pfr.code == PFILE__GROUP);+ g->inprofile = g->directpost = 1;@ strncpy(g->grpnam, pfr.u.txt.text, pfr.u.txt.textlen);0 *(g->grpnam+pfr.u.txt.textlen) = '\0'; break; case PFILE__RANGELIST: if (g != NULL) {6 for (i = 0; i < pfr.u.rng.rcount; i++) {" rng = mem_getrng();1 rng->first = pfr.u.rng.range[i*2];3 rng->last = pfr.u.rng.range[i*2+1];0 queue_insert(rng, g->seenq.tail); } } break; case PFILE__KILLLIST: if (g != NULL) {2 h = mem_gethdr(pfr.u.txt.textlen+1);* h->code = pfr.u.txt.hdrcode;A strncpy(h->str, pfr.u.txt.text, pfr.u.txt.textlen);1 *(h->str+pfr.u.txt.textlen) = '\0';- queue_insert(h, g->killq.tail); } break; case PFILE__GLOBALKILL: if (g != NULL) { Insert_Group(g); g = NULL; }. h = mem_gethdr(pfr.u.txt.textlen+1);& h->code = pfr.u.txt.hdrcode;= strncpy(h->str, pfr.u.txt.text, pfr.u.txt.textlen);. *(h->str+pfr.u.txt.textlen) = '\0';0 queue_insert(h, news_prof.killq.tail); break;/*G** Very old versions of NEWSRDR stored the headers in plain-text formatD** that had to be parsed each time. This remains for compatibility.*/ case PFILE__HEADER: if (g != NULL) { Insert_Group(g); g = NULL; } h = mem_gethdr(0);@ for (i = 1; i < sizeof(hdrname)/sizeof(char *); i++) {< if (strlen(hdrname[i]) == pfr.u.txt.textlen &&6 strncmp(hdrname[i], pfr.u.txt.text,. pfr.u.txt.textlen)) { h->code = i;  break; } }+ for (h2 = news_prof.hdrlist.head;7 h2 != (struct HDR *) &news_prof.hdrlist;! h2 = h2->flink) {, if (h2->code > h->code) break; }8 if (h2 == (struct HDR *) &news_prof.hdrlist) {6 queue_insert(h, news_prof.hdrlist.tail); } else {) queue_insert(h, h2->blink); } break;/*O** Later versions of NEWSRDR use this binary format for storing the SET HEADERS** information.*/ case PFILE__NEWHEADER: if (g != NULL) { Insert_Group(g); g = NULL; }2 for (i = 0; i < pfr.u.rng.rcount; i++) {8 if (pfr.u.rng.range[i] >= NEWS_K_HDR_LO &&9 pfr.u.rng.range[i] <= NEWS_K_HDR_HI) {! h = mem_gethdr(0);, h->code = pfr.u.rng.range[i];0 for (h2 = news_prof.hdrlist.head;< h2 != (struct HDR *) &news_prof.hdrlist;% h2 = h2->flink) {1 if (h2->code > h->code) break; }= if (h2 == (struct HDR *) &news_prof.hdrlist) {; queue_insert(h, news_prof.hdrlist.tail); } else {. queue_insert(h, h2->blink); } } } break;" case PFILE__PERSONALNAME: if (g != NULL) { Insert_Group(g); g = NULL; }9 strncpy(news_prof.personalname, pfr.u.txt.text,& pfr.u.txt.textlen);= *(news_prof.personalname+pfr.u.txt.textlen) = '\0'; break; case PFILE__EDITORNAME: if (g != NULL) { Insert_Group(g); g = NULL; }7 strncpy(news_prof.editorname, pfr.u.txt.text,& pfr.u.txt.textlen);; *(news_prof.editorname+pfr.u.txt.textlen) = '\0'; break;! case PFILE__SIGFILENAME: if (g != NULL) { Insert_Group(g); g = NULL; }4 strncpy(news_prof.sigfile, pfr.u.txt.text,& pfr.u.txt.textlen);8 *(news_prof.sigfile+pfr.u.txt.textlen) = '\0'; break; case PFILE__ARCHIVE: if (g != NULL) { Insert_Group(g); g = NULL; }4 strncpy(news_prof.archive, pfr.u.txt.text,& pfr.u.txt.textlen);8 *(news_prof.archive+pfr.u.txt.textlen) = '\0'; break; case PFILE__NEWSRC: if (g != NULL) { Insert_Group(g); g = NULL; }7 news_prof.newsrc_subonly = pfr.u.txt.hdrcode;3 strncpy(news_prof.newsrc, pfr.u.txt.text,& pfr.u.txt.textlen);7 *(news_prof.newsrc+pfr.u.txt.textlen) = '\0'; break; case PFILE__QUEUE: if (g != NULL) { Insert_Group(g); g = NULL; }8 strncpy(news_prof.print_queue, pfr.u.txt.text,& pfr.u.txt.textlen);< *(news_prof.print_queue+pfr.u.txt.textlen) = '\0'; break; case PFILE__FORM: if (g != NULL) { Insert_Group(g); g = NULL; }7 strncpy(news_prof.print_form, pfr.u.txt.text,& pfr.u.txt.textlen);; *(news_prof.print_form+pfr.u.txt.textlen) = '\0'; break; case PFILE__DIRWIDTH: if (g != NULL) { Insert_Group(g); g = NULL; }4 news_prof.dir_fromwid = pfr.u.wid.fromwid;4 news_prof.dir_subjwid = pfr.u.wid.subjwid; break; default: if (g != NULL) { Insert_Group(g); g = NULL; } } } sys$close(&fab,0,0); if (g != NULL) { Insert_Group(g); g = NULL; } news_prof.profread = 1; }/*C** If the user has set a newsrc file, read that in now, letting the>** information in it supersede the information in the profile.*/) if (*news_prof.newsrc) Read_NewsRC();/*)** Now fetch our mail-related information*/ mailctx = 0;4 ITMLST_INIT(mailst[0], MAIL$_NOSIGNAL, 0, 0, 0);' ITMLST_INIT(mailst[1], 0, 0, 0, 0);( ITMLST_INIT(mailnul[0], 0, 0, 0, 0);8 status = mail$user_begin(&mailctx, mailst, mailnul); if (OK(status)) { unsigned short pnlen;4 ITMLST_INIT(mailst3[0],MAIL$_USER_COPY_FORWARD,: sizeof(news_prof.csfwd),&news_prof.csfwd,0);2 ITMLST_INIT(mailst3[1],MAIL$_USER_COPY_REPLY,> sizeof(news_prof.csreply),&news_prof.csreply,0);1 ITMLST_INIT(mailst3[2],MAIL$_USER_COPY_SEND,< sizeof(news_prof.csmail),&news_prof.csmail,0);! if (news_prof.usemailpnam) {9 ITMLST_INIT(mailst3[3],MAIL$_USER_PERSONAL_NAME,7 (sizeof(news_prof.personalname)-1 < 255 ?7 sizeof(news_prof.personalname)-1 : 255),1 &news_prof.personalname[0],&pnlen); } else {, ITMLST_INIT(mailst[3], 0, 0, 0, 0); }) ITMLST_INIT(mailst3[4], 0, 0, 0, 0);< status = mail$user_get_info(&mailctx, mailst, mailst3);/ if (OK(status) && news_prof.usemailpnam) {. news_prof.personalname[pnlen] = '\0'; }7 status = mail$user_end(&mailctx, mailst, mailnul); }M if (!news_prof.replymail || news_prof.replypost) news_prof.replypost = 1;D if (!*news_prof.editorname) strcpy(news_prof.editorname, "TPU");7 if (news_prof.hdrlist.head == &news_prof.hdrlist) {? for (i = 0; i < sizeof(default_header)/sizeof(int); i++) { h = mem_gethdr(0);E% h->code = default_header[i];i1 queue_insert(h, news_prof.hdrlist.tail);I } }T return SS$_NORMAL;} /* Read_Profile */ /***++** ROUTINE: Write_Profile**** FUNCTIONAL DESCRIPTION: **+** Writes out the user's NEWSRDR profile. **B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** Write_Profile()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: None.M**** COMPLETION CODES:t/** SS$_NORMAL: Normal successful completion.i**** SIDE EFFECTS: None.****--*/unsigned int Write_Profile() { struct FAB fab; struct RAB rab;. struct PFREC pfr;o struct HDR *hdr; unsigned int status; fab = cc$rms_fab;o6 fab.fab$b_fac = FAB$M_GET | FAB$M_PUT | FAB$M_TRN; fab.fab$l_fop = FAB$M_CIF;& fab.fab$l_fna = "NEWSRDR_PROFILE"; fab.fab$b_fns = 15; & fab.fab$l_dna = "SYS$LOGIN:.NRPF"; fab.fab$b_dns = 15;d" status = sys$create(&fab,0,0); if (!OK(status)) {; lib$signal(NEWS__NOOPNPROF, 0, status, fab.fab$l_stv); return NEWS__NOOPNPROF; } rab = cc$rms_rab; rab.rab$l_fab = &fab;f" rab.rab$l_rbf = (char *) 𝔭" rab.rab$l_ubf = (char *) 𝔭 rab.rab$w_usz = sizeof(pfr); sys$connect(&rab,0,0); if (OK(sys$get(&rab,0,0))) { sys$truncate(&rab,0,0); }R sys$rewind(&rab,0,0);  pfr.code = PFILE__FLAGS;# pfr.u.flags = PFREC_M_NEWFLAGS;4 if (news_prof.edit) pfr.u.flags |= PFREC_M_EDIT;> if (news_prof.spawnedit) pfr.u.flags |= PFREC_M_SPAWNEDIT;? if (news_prof.autosigmail) pfr.u.flags |= PFREC_M_AUTOSIGM;n? if (news_prof.autosigpost) pfr.u.flags |= PFREC_M_AUTOSIGP;eW if (news_prof.autosigmail || news_prof.autosigpost) pfr.u.flags |= PFREC_M_AUTOSIG;1; if (news_prof.replymail) pfr.u.flags |= PFREC_M_REPLYM;T; if (news_prof.replypost) pfr.u.flags |= PFREC_M_REPLYP;A@ if (!news_prof.autoreadnew) pfr.u.flags |= PFREC_M_NOAUTORN;@ if (news_prof.usemailpnam) pfr.u.flags |= PFREC_M_USEMAILPN;A if (news_prof.force_proto) pfr.u.flags |= PFREC_M_FORCEPROTO;O" rab.rab$w_rsz = PFREC_S_FRONT; sys$put(&rab,0,0); pfr.code = PFILE__NGACTION;_% pfr.u.flags = news_prof.ngaction; " rab.rab$w_rsz = PFREC_S_FRONT; sys$put(&rab,0,0);< if (!news_prof.usemailpnam && *news_prof.personalname) {$ pfr.code = PFILE__PERSONALNAME;4 strcpy(pfr.u.txt.text, news_prof.personalname);8 pfr.u.txt.textlen = strlen(news_prof.personalname);7 rab.rab$w_rsz = pfr.u.txt.textlen + PFREC_S_FRONT;g sys$put(&rab,0,0); } if (*news_prof.editorname) {" pfr.code = PFILE__EDITORNAME;2 strcpy(pfr.u.txt.text, news_prof.editorname);6 pfr.u.txt.textlen = strlen(news_prof.editorname);7 rab.rab$w_rsz = pfr.u.txt.textlen + PFREC_S_FRONT;U sys$put(&rab,0,0);E }W if (*news_prof.sigfile) {F# pfr.code = PFILE__SIGFILENAME; / strcpy(pfr.u.txt.text, news_prof.sigfile);E3 pfr.u.txt.textlen = strlen(news_prof.sigfile);d7 rab.rab$w_rsz = pfr.u.txt.textlen + PFREC_S_FRONT;  sys$put(&rab,0,0);O }O if (*news_prof.archive) {o pfr.code = PFILE__ARCHIVE;A/ strcpy(pfr.u.txt.text, news_prof.archive);i3 pfr.u.txt.textlen = strlen(news_prof.archive);T7 rab.rab$w_rsz = pfr.u.txt.textlen + PFREC_S_FRONT;C sys$put(&rab,0,0);H }A if (*news_prof.newsrc) { pfr.code = PFILE__NEWSRC;. strcpy(pfr.u.txt.text, news_prof.newsrc);2 pfr.u.txt.textlen = strlen(news_prof.newsrc);2 pfr.u.txt.hdrcode = news_prof.newsrc_subonly;7 rab.rab$w_rsz = pfr.u.txt.textlen + PFREC_S_FRONT;, sys$put(&rab,0,0);" }N! if (*news_prof.print_queue) {R pfr.code = PFILE__QUEUE;}3 strcpy(pfr.u.txt.text, news_prof.print_queue); 7 pfr.u.txt.textlen = strlen(news_prof.print_queue);f7 rab.rab$w_rsz = pfr.u.txt.textlen + PFREC_S_FRONT;r sys$put(&rab,0,0);L }P if (*news_prof.print_form) { pfr.code = PFILE__FORM;2 strcpy(pfr.u.txt.text, news_prof.print_form);6 pfr.u.txt.textlen = strlen(news_prof.print_form);7 rab.rab$w_rsz = pfr.u.txt.textlen + PFREC_S_FRONT;T sys$put(&rab,0,0);l }*C if (news_prof.dir_fromwid >= 0 || news_prof.dir_subjwid >= 0) {* pfr.code = PFILE__DIRWIDTH;/ pfr.u.wid.fromwid = news_prof.dir_fromwid;E/ pfr.u.wid.subjwid = news_prof.dir_subjwid;a1 rab.rab$w_rsz = sizeof(int) + PFREC_S_FRONT;m sys$put(&rab,0,0);  }t! pfr.code = PFILE__GLOBALKILL; 6 while (queue_remove(news_prof.killq.head, &hdr)) {& strcpy(pfr.u.txt.text, hdr->str);# pfr.u.txt.hdrcode = hdr->code;R* pfr.u.txt.textlen = strlen(hdr->str);7 rab.rab$w_rsz = pfr.u.txt.textlen + PFREC_S_FRONT;t sys$put(&rab,0,0);  mem_freehdr(hdr); }p pfr.code = PFILE__NEWHEADER; pfr.u.rng.rcount = 0;p8 while (queue_remove(news_prof.hdrlist.head, &hdr)) {& if (pfr.u.rng.rcount == MAXHCT) {< rab.rab$w_rsz = PFREC_S_FRONT + pfr.u.rng.rcount*4; sys$put(&rab,0,0);  pfr.u.rng.rcount = 0; }5 pfr.u.rng.range[pfr.u.rng.rcount++] = hdr->code;4 mem_freehdr(hdr); }5 if (pfr.u.rng.rcount != 0) {8 rab.rab$w_rsz = PFREC_S_FRONT + pfr.u.rng.rcount*4; sys$put(&rab,0,0); }N! pfr.code = PFILE__LASTGRPCHK;m% pfr.u.lgc = news_prof.lastgrpchk;s rab.rab$w_rsz = 12;i sys$put(&rab,0,0);> lib$traverse_tree(&news_prof.gtree, write_grp_info, &rab); sys$disconnect(&rab,0,0);e sys$close(&fab,0,0);/*C** If the user has set a newsrc file, then also write out the groupt** & article information there.e*/ if (*news_prof.newsrc) { Write_NewsRC(); }  return SS$_NORMAL;} /* Write_Profile */w r/***++** ROUTINE: write_grp_infos**** FUNCTIONAL DESCRIPTION:_**D** Tree traversal action routine that writes out group information** to the profile.O**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**3** write_grp_info(struct GRP *g, struct RAB *rab)a**.** g: GRP structure, modify, by reference&** rab: RAB, modify, by reference.**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.(**** COMPLETION CODES: "** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/Dstatic unsigned int write_grp_info(struct GRP *g, struct RAB *rab) { struct PFREC *pfr; , struct RNG *rng; struct HDR *hdr; int k;% if (!g->avail) return SS$_NORMAL; * pfr = (struct PFREC *) rab->rab$l_rbf;E if (news_cfg.newgroups != 2 && !g->subscribed) return SS$_NORMAL;B pfr->code = g->subscribed ? PFILE__GROUP : PFILE__GROUP_NOSUB;' strcpy(pfr->u.txt.text, g->grpnam); + pfr->u.txt.textlen = strlen(g->grpnam);p8 rab->rab$w_rsz = pfr->u.txt.textlen + PFREC_S_FRONT; sys$put(rab,0,0);r* if (!g->subscribed) return SS$_NORMAL; k = 0;! pfr->code = PFILE__RANGELIST; @ for (rng = g->seenq.head; rng != (struct RNG *) &(g->seenq);" rng = rng->flink) {# if (rng->last >= g->frstavl) {.L pfr->u.rng.range[k*2] = (rng->first < g->frstavl ? 1 : rng->first);. pfr->u.rng. range[k*2+1] = rng->last; if (k == MAXRCT-1) {U pfr->u.rng.rcount = k;/ rab->rab$w_rsz = PFREC_S_FRONT + k*8;  sys$put(rab,0,0);s k = 0; } else { k += 1;p } } }g if (k != 0) { pfr->u.rng.rcount = k; * rab->rab$w_rsz = PFREC_S_FRONT + k*8; sys$put(rab,0,0); }p pfr->code = PFILE__KILLLIST;/ while (queue_remove(g->killq.head, &hdr)) {.+ pfr->u.txt.textlen = strlen(hdr->str);p$ pfr->u.txt.hdrcode = hdr->code;: if (pfr->u.txt.textlen > sizeof(pfr->u.txt.text)-1) {8 pfr->u.txt.textlen = sizeof(pfr->u.txt.text)-1;@ strncpy(pfr->u.txt.text, hdr->str, pfr->u.txt.textlen); } else {.+ strcpy(pfr->u.txt.text, hdr->str); }9 rab->rab$w_rsz = PFREC_S_FRONT + pfr->u.txt.textlen;  sys$put(rab,0,0); mem_freehdr(hdr); }  return SS$_NORMAL;} /* write_grp_info */l = &g->seenq;4 g->killq.head = g->killq.tail = &g->killq;5 g->subscribed = (pfr.code == PFILE__GROUP);+ g->inprofile = g->directpost = 1;@ strncpy(g->grpnam, pfr.u.txt.text, pfr.u.txt.textlen);0 *(g->grpnam+pfr.u.txt.textlen) = '\0'; ~NEWSRDR_SRC.BCKP[NEWSRDR]GROUPS.C;14P *[NEWSRDR]GROUPS.C;14+,./ @ 4P-P0123KPWO56 _%ǖ7 hbǖ8cVc99G @HJ&/***++** FACILITY: NEWSRDR**"** ABSTRACT: Group tree routines.**** MODULE DESCRIPTION:**;** This module contains routines that manipulate the treeA** of newsgroups. The VMS RTL LIB$xxx_TREE routines are used toK** create the tree, we also have our own one-node-at-a-time tree traversal@** routine, because LIB$TRAVERSE_TREE isn't very handy for some** applications.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 09-SEP-1992**** MODIFICATION HISTORY:**1** 09-SEP-1992 V1.0 Madison Initial coding.D** 15-FEB-1993 V1.0-1 Madison Make compatible with pre-VMS V5.2.**--*/#include "newsrdr.h"#include "globals.h" struct TCTX { struct GRP **stackp; struct GRP *curnode; struct GRP *savenode; struct GRP *stack[4096]; };/*** Forward declarations*/% struct GRP *Find_Group(char *);9 struct GRP *Find_Group_Wild(char *, struct TCTX **);- void Insert_Group(struct GRP *);K unsigned int Set_Initial_Group(struct GRP *, struct dsc$descriptor *);: static int node_compare(char *, struct GRP *, int);H static unsigned int node_alloc(char *, struct GRP **, struct GRP *);1 struct GRP *Traverse_Tree(struct TCTX **);2 unsigned int Traverse_Finish(struct TCTX **);4 struct GRP *Current_TreeNode(struct TCTX **); /***++** ROUTINE: Find_Group**** FUNCTIONAL DESCRIPTION:**@** Uses LIB$LOOKUP_TREE to locate a group in the tree by name.**** RETURNS: struct GRP ***** PROTOTYPE:**** Find_Group(char *str)**=** str: character string, read only, by reference (ASCIZ)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** non-0: group was found** 0: no group was found**** SIDE EFFECTS: None.****--*/#struct GRP *Find_Group(char *str) { struct GRP *grp;J if (!OK(lib$lookup_tree(&news_prof.gtree, str, node_compare, &grp))) { grp = NULL; } return grp;} /* Find_Group */ /***++** ROUTINE: Find_Group_Wild**** FUNCTIONAL DESCRIPTION:**@** Uses LIB$LOOKUP_TREE to locate a group in the tree by name.**** RETURNS: struct GRP ***** PROTOTYPE:**** Find_Group_Wild(char *str)**=** str: character string, read only, by reference (ASCIZ)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** non-0: group was found** 0: no group was found**** SIDE EFFECTS: None.****--*/<struct GRP *Find_Group_Wild(char *str, struct TCTX **xctx) { struct GRP *grp; struct TCTX *ctx;% struct dsc$descriptor dsc1, dsc2;" ctx = (xctx == 0) ? 0 : *xctx;' INIT_SDESC(dsc1, strlen(str), str);J for (grp = Traverse_Tree(&ctx); grp != 0; grp = Traverse_Tree(&ctx)) {8 INIT_SDESC(dsc2, strlen(grp->grpnam), grp->grpnam);, if (OK(str$match_wild(&dsc2, &dsc1))) {. if (xctx == 0) Traverse_Finish(&ctx); break; } } if (xctx != 0) *xctx = ctx; return grp;} /* Find_Group_Wild */ /***++** ROUTINE: Insert_Group**** FUNCTIONAL DESCRIPTION:**B** Uses LIB$INSERT_TREE to insert a GRP structure into the tree.**** RETURNS: void**** PROTOTYPE:**"** Insert_Group(struct GRP *grp)**/** grp: GRP structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/$void Insert_Group(struct GRP *grp) { static int one = 1; struct GRP *tree_node;F lib$insert_tree(&news_prof.gtree, grp->grpnam, &one, node_compare,, node_alloc, &tree_node, grp);} /* Insert_Group */ /***++** ROUTINE: Set_Initial_Group**** FUNCTIONAL DESCRIPTION:**?** Tree-traversal action routine called by Set_Initial_GroupsB** in module NEWSRDR to subscribe a new user to an initial set of** newsgroups.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**E** Set_Initial_Group(struct GRP *g, struct dsc$descriptor *pattern)**/** g: GRP structure, modify, by reference7** pattern: character string, read only, by descriptor**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/Munsigned int Set_Initial_Group(struct GRP *grp, struct dsc$descriptor *pat) { struct dsc$descriptor sdsc;7 INIT_SDESC(sdsc, strlen(grp->grpnam), grp->grpnam);) if (OK(str$match_wild(&sdsc, pat))) { grp->subscribed = 1;E lib$signal(NEWS__SUBSCRIBED, 2, sdsc.dsc$w_length, grp->grpnam); } return SS$_NORMAL;} /* Set_Initial_Group */ /***++** ROUTINE: node_compare**** FUNCTIONAL DESCRIPTION:**;** Comparison routine used by LIB$INSERT_TREE. Just does'** a string compare on the group name.**** RETURNS: int**** PROTOTYPE:**6** node_compare(char *s, struct GRP *grp, int dummy)**<** s: character string, read only, by reference (ASCIZ)2** grp: GRP structure, read only, by reference** dummy: not used**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:*** >0: s is greater than grp->grpnam*** 0: s equals grp->grpnam*** <0: s is less than grp->grpnam**** SIDE EFFECTS: None.****--*/:static int node_compare(char *s, struct GRP *grp, int d) {" return strcmp(s, grp->grpnam);} /* node_compare */ /***++** ROUTINE: node_alloc**** FUNCTIONAL DESCRIPTION:**A** Tree node allocation routine used by LIB$INSERT_TREE. SinceJ** the GRP structure we're adding was already allocated by Insert_Group'sH** caller, we just copy the pointer over so LIB$INSERT_TREE can use it.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**?** node_alloc(char *str, struct GRP **gnode, struct GRP *grp)**** str: not used?** gnode: pointer to GRP structure, write only, by reference3** grp: GRP structure, read only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/Pstatic unsigned int node_alloc(char *str, struct GRP **gnode, struct GRP *grp) { *gnode = grp; return SS$_NORMAL;} /* node_alloc */ /***++** ROUTINE: Traverse_Tree**** FUNCTIONAL DESCRIPTION:**>** Our own node-at-a-time AVL tree traversal. Does in-orderA** traversal of the tree. The first call to this routine shouldC** pass a context variable reference that was set to zero; it will9** be updated by this routine as we go through the tree.**** RETURNS: struct GRP ***** PROTOTYPE:**'** Traverse_Tree(struct TCTX **tctxp)**I** tctxp: pointer to internally-defined structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:"** non-0: next group in the tree&** 0: no more groups in the tree**** SIDE EFFECTS: None.****--*/0struct GRP *Traverse_Tree(struct TCTX **tctxp) { struct TCTX *tctx = *tctxp; struct GRP *g; if (tctx == NULL) {( tctx = malloc(sizeof(struct TCTX));* memset(tctx, 0, sizeof(struct TCTX)); tctx->stackp = tctx->stack;% tctx->curnode = news_prof.gtree; *tctxp = tctx; }# while (tctx->curnode != NULL) {% *tctx->stackp++ = tctx->curnode;) tctx->curnode = tctx->curnode->left; }& if (tctx->stackp == tctx->stack) { free(tctx); *tctxp = NULL; return NULL; }+ g = tctx->savenode = *(--tctx->stackp); tctx->curnode = g->right; return g;} /* Traverse_Tree */ /***++** ROUTINE: Traverse_Finish**** FUNCTIONAL DESCRIPTION:**?** Prematurely stops a Traverse_Tree sequence. Just frees up** the context block we used.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**)** Traverse_Finish(struct TCTX **tctxp)**I** tctxp: pointer to internally-defined structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/3unsigned int Traverse_Finish(struct TCTX **tctxp) {% if (*tctxp != NULL) free(*tctxp); *tctxp = NULL; return SS$_NORMAL;} /* Traverse_Finish */ /***++** ROUTINE: Current_TreeNode**** FUNCTIONAL DESCRIPTION:**=** Returns our current position in the group tree traversal#** we're doing with Traverse_Tree.**** RETURNS: GRP ***** PROTOTYPE:***** Current_TreeNode(struct TCTX **tctxp)**=** tctxp: pointer to GRP structure, read only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** non-0: current GRP$** 0: No traversal in progress**** SIDE EFFECTS: None.****--*/3struct GRP *Current_TreeNode(struct TCTX **tctxp) {* if (*tctxp) return (*tctxp)->savenode; return NULL;} /* Current_TreeNode */ U~NEWSRDR_SRC.BCKPP[NEWSRDR]ARTICLE.C;47YUЅ*[NEWSRDR]ARTICLE.C;47+,P.U/ @ 4YUS-P0123KPWOT56`o7覢o8c99G @HJz/***++** FACILITY: NEWSRDR**'** ABSTRACT: Article-related routines.**** MODULE DESCRIPTION:**B** This module contains routines that deal directly with article ** handling.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 06-SEP-1992**** MODIFICATION HISTORY:**1** 06-SEP-1992 V1.0 Madison Initial coding.G** 13-SEP-1992 V1.0-1 Madison Slight cache management improvements.?** 13-OCT-1992 V1.0-2 Madison Work around $FAO !AZ problem.@** 16-OCT-1992 V1.0-3 Madison Fix signature file line count.<** 15-FEB-1993 V1.0-4 Madison Fix LIB$SIGNAL references.H** 15-FEB-1993 V1.1 Madison Replace Mark_Xref_Seen with Mark_Xref.3** 12-APR-1993 V1.2 Madison Add Edit_Article.**--*/#include "newsrdr.h"#include "globals.h" struct ART { struct QUE *hdrqptr; unsigned int bodyunit; int lines; int hlines; int remlines; int status; #define ART_K_STATUS_RETRIEVED 0!#define ART_K_STATUS_IN_HEADERS 1#define ART_K_STATUS_IN_BODY 2#define ART_K_STATUS_DONE 3 struct HDR *hlnptr; int artnum; struct GRP *grpptr; char bodyfspec[FSPEC_SIZE]; }; struct CHDR { struct CHDR *flink, *blink; struct QUE hdrq; int artnum; int hlines; };/*** Forward declarations*/F unsigned int Retrieve_Article(int, struct ART **, char *, char *);2 unsigned int Show_Article_Page(struct ART **);/ void Rewind_Article(struct ART **);. void Close_Article(struct ART **);- static void wipe_article(struct ART **);6 int Mark_Article_Seen(struct GRP *, int);8 int Mark_Article_Unseen(struct GRP *, int);( void Mark_Xref(char *, int);= int Next_Unseen_Article(int, int, struct GRP *);, int Count_Unseen(struct GRP *);9 unsigned int Post_Article(struct QUE *, char *, int);P unsigned int Get_Article_Hdrs(struct GRP *, int, struct QUE **, int, int *);> unsigned int Get_Article_Body(int, char *, char *, int *);3 int Ignore_Article(struct GRP *, int);- unsigned int Edit_Article(struct ART **);# unsigned int Article_ExH(void); EXTERN struct GRP *curgroup;" EXTERN int rotate_text;' EXTERN int Read_Full_Headers; static struct ART *artsave;8 static struct QUE hdrcache = {&hdrcache, &hdrcache};& static struct GRP *hcgroup = NULL; static int hccount = 0;1 extern void Parse_Xref(char *, struct QUE *);* extern struct GRP *Find_Group(char *);1 extern void Make_Return_Address(char *, int);I extern unsigned int Parse_Headers(struct QUE *, struct QUE *, int *);# extern void mem_initcache(int);+ extern struct CHDR *mem_getcache(void);- extern void mem_freecache(struct CHDR *);# extern void mem_delcache(void); /***++** ROUTINE: Retrieve_Article**** FUNCTIONAL DESCRIPTION:**8** Retrieves an entire article, both headers and body.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**M** Retrieve_Article(int artnum, struct ART **ctxp, char *tsubj, char *xref)**,** artnum: article number, integer, by valueH** ctxp: pointer to internally-defined structure, modify, by reference=** tsubj: character string, write only, by reference (ASCIZ)=** xref: character string, write only, by reference (ASCIZ)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/Wunsigned int Retrieve_Article(int artnum, struct ART **ctxp, char *tsubj, char *xref) { struct ART *ctx = *ctxp; char tmp[STRING_SIZE], *cp; struct HDR *hdr; int reply_code; unsigned int status;/*C** We cache one entire article, making CURRENT and EXTRACT a littleJ** faster. A larger cache may be appropriate for some time in the future.*/ ctx = NULL; if (artsave != NULL) {D if (artnum == artsave->artnum && artsave->grpptr == curgroup) { ctx = artsave; artsave = NULL; } else { wipe_article(&artsave); } }/* ** Establish new article context*/ if (ctx == NULL) {& ctx = malloc(sizeof(struct ART));( memset(ctx, 0, sizeof(struct ART)); ctx->artnum = artnum; ctx->grpptr = curgroup; }/*** Fetch the article headers*/ *ctxp = ctx;P status = Get_Article_Hdrs(curgroup, artnum, &ctx->hdrqptr, 0, &ctx->hlines); if (!OK(status)) { wipe_article(ctxp); return status; }/*&** Find the Subject: and Xref: headers*/ *tsubj = *xref = '\0';F for (hdr = ctx->hdrqptr->head; hdr != (struct HDR *) ctx->hdrqptr;! hdr = hdr->flink) {+ if (hdr->code == NEWS_K_HDR_SUBJECT) { strcpy(tmp, hdr->str); upcase(tmp);+ if (strncmp(tmp, "RE:", 3) == 0) { cp = tmp+3; } else { cp = tmp; }# while (isspace(*cp)) cp++; strcpy(tsubj, cp);N for (cp = tsubj+strlen(tsubj); cp > tsubj && isspace(*(cp-1)); cp--);/ } else if (hdr->code == NEWS_K_HDR_XREF) { strcpy(xref, hdr->str); } }/*** Fetch the article body*/$ if (ctx->bodyfspec[0] == '\0') {' make_temp_fspec(tmp, sizeof(tmp));I status = Get_Article_Body(artnum, tmp, ctx->bodyfspec, &ctx->lines); if (!OK(status)) { wipe_article(ctxp); return status; } }/*&** Set things up for Show_Article_Page*/ ctx->bodyunit = 0;) ctx->status = ART_K_STATUS_RETRIEVED;% ctx->hlnptr = ctx->hdrqptr->head;1 ctx->remlines = ctx->hlines + ctx->lines + 1; return SS$_NORMAL;} /* Retrieve_Article */ /***++** ROUTINE: Show_Article_Page**** FUNCTIONAL DESCRIPTION:**1** Displays the next screen page of an article.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**)** Show_Article_Page(struct ART **ctxp)**F** ctxp: pointer to internally-defined structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:3** SS$_NORMAL: Normal successful completion.M** NEWS__EOARTICLE: Normal completion; article has been fully displayed.**** SIDE EFFECTS: None.****--*/3unsigned int Show_Article_Page(struct ART **ctxp) { struct ART *ctx = *ctxp;& struct GRP *grp = (*ctxp)->grpptr; struct HDR *hdr; struct dsc$descriptor sdsc; char tmp[STRING_SIZE]; short tlen; int len; unsigned int status;Y static $DESCRIPTOR(alphabet, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");Y static $DESCRIPTOR(rotabet, "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm");/*B** This is done first - just after the article has been retrieved.*/0 if (ctx->status == ART_K_STATUS_RETRIEVED) {P static $DESCRIPTOR(ctrstr, "!32AD article !UL of [!UL,!UL] (!UL unseen)");( INIT_SDESC(sdsc, sizeof(tmp), tmp);E sys$fao(&ctrstr, &tlen, &sdsc, strlen(grp->grpnam), grp->grpnam,E ctx->artnum, grp->frstavl, grp->lastavl, Count_Unseen(grp)); *(tmp+tlen) = '\0'; Begin_Paged_Output(tmp);+ ctx->status = ART_K_STATUS_IN_HEADERS; }/*** Header display*/1 if (ctx->status == ART_K_STATUS_IN_HEADERS) {9 while (ctx->hlnptr != (struct HDR *) ctx->hdrqptr) { ctx->remlines--;! if (Read_Full_Headers) {: Format_Header(ctx->hlnptr, tmp, sizeof(tmp), 0);@ if (!Put_Paged(tmp, ctx->remlines)) return SS$_NORMAL; } else {, for (hdr = news_prof.hdrlist.head;8 hdr != (struct HDR *) &news_prof.hdrlist;" hdr = hdr->flink) {3 if (hdr->code == ctx->hlnptr->code) {? Format_Header(ctx->hlnptr, tmp, sizeof(tmp), 0);E if (!Put_Paged(tmp, ctx->remlines)) return SS$_NORMAL; break; } } }* ctx->hlnptr = ctx->hlnptr->flink; }/*$** Setup for display of article body*/A status = file_open(ctx->bodyfspec, &ctx->bodyunit, 0, 0, 0); if (!OK(status)) {= lib$signal(NEWS__BODYERR, 2, strlen(ctx->bodyfspec),+ ctx->bodyfspec, status); ctx->bodyunit = 0;) ctx->status = ART_K_STATUS_DONE; } else {, ctx->status = ART_K_STATUS_IN_BODY; ctx->remlines--;> if (!Put_Paged("", ctx->remlines)) return SS$_NORMAL; } }/*** Display of article body*/. if (ctx->status == ART_K_STATUS_IN_BODY) {E while (OK(file_read(ctx->bodyunit, tmp, sizeof(tmp)-1, &len))) { ctx->remlines--; *(tmp+len) = '\0'; if (rotate_text) {% struct dsc$descriptor tdsc;! char tmp2[STRING_SIZE];% INIT_SDESC(sdsc, len, tmp);& INIT_SDESC(tdsc, len, tmp2); *(tmp2+len) = '\0';; str$translate(&tdsc, &sdsc, &alphabet, &rotabet); A if (!Put_Paged(tmp2, ctx->remlines)) return SS$_NORMAL;F } else if (!Put_Paged(tmp, ctx->remlines)) return SS$_NORMAL; }% ctx->status = ART_K_STATUS_DONE; }/* ** Completion*/ if (Paged_Output_Done()) {7 if (ctx->bodyunit != 0) file_close(ctx->bodyunit); ctx->bodyunit = 0; artsave = ctx; return NEWS__EOARTICLE; } return SS$_NORMAL;} /* Show_Article_Page */ /***++** ROUTINE: Rewind_Article**** FUNCTIONAL DESCRIPTION:**9** Sets up an article for redisplay from the beginning.**** RETURNS: void**** PROTOTYPE:**&** Rewind_Article(struct ART **ctxp)**F** ctxp: pointer to internally-defined structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/(void Rewind_Article(struct ART **ctxp) { struct ART *ctx = *ctxp; Discard_Paged_Output();" file_setpos(ctx->bodyunit, 0);% ctx->hlnptr = ctx->hdrqptr->head;* ctx->status = ART_K_STATUS_IN_HEADERS;} /* Rewind_Article */ /***++** ROUTINE: Close_Article**** FUNCTIONAL DESCRIPTION:**8** Closes an article, but saves the context in case we** need it again right away.**** RETURNS: void**** PROTOTYPE:**%** Close_Article(struct ART **ctxp)**F** ctxp: pointer to internally-defined structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/'void Close_Article(struct ART **ctxp) { struct ART *ctx = *ctxp; Discard_Paged_Output();6 if (ctx->bodyunit != 0) file_close(ctx->bodyunit); ctx->bodyunit = 0; artsave = ctx; *ctxp = NULL;} /* Close_Article */ /***++** ROUTINE: wipe_article**** FUNCTIONAL DESCRIPTION:**(** Deletes an article and its context.**** RETURNS: void**** PROTOTYPE:**$** wipe_article(struct ART **ctxp)**F** ctxp: pointer to internally-defined structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/-static void wipe_article(struct ART **ctxp) { struct ART *ctx = *ctxp; if (ctx->bodyfspec[0]) {! file_delete(ctx->bodyfspec); } free(ctx); *ctxp = NULL;} /* wipe_article */ /***++** ROUTINE: Mark_Article_Seen**** FUNCTIONAL DESCRIPTION:**,** Adds an article to a group's seen list.**** RETURNS: boolean**** PROTOTYPE:**3** Mark_Article_Seen(struct GRP *grp, int artnum)**/** grp: GRP structure, modify, by reference/** artnum: article number, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:'** 1: Success. Article marked seen.$** 0: Article was already marked.**** SIDE EFFECTS: None.****--*/4int Mark_Article_Seen(struct GRP *grp, int artnum) { struct RNG *r, *r2;/*H** The seen list is represented as a linked list of cells, each of whichN** contains a starting and ending article number for a range of seen articles.H** The list is kept in order and cells are merged together into one when** they overlap.**;** Start by finding the right cell for this article number.*/N for (r = grp->seenq.head; r != (struct RNG *) &grp->seenq; r = r->flink) {" if (artnum <= r->last) break; }/*I** If we found none, artnum must be higher than all articles seen so far.+** So we tack it onto the tail of the list.*/* if (r == (struct RNG *) &grp->seenq) { r = grp->seenq.tail;+ if (r != (struct RNG *) &grp->seenq) {J if (artnum == r->last+1) { /* no new cell if just 1 higher */F r->last += 1;  } else { r2 = mem_getrng();( r2->first = r2->last = artnum; queue_insert(r2, r); }6 } else { /* list was empty */ r = mem_getrng();% r->first = r->last = artnum;& queue_insert(r, &grp->seenq); }/*H** We found a cell with article numbers higher than the current article.I** Now we check to see if we need a new cell for this article, or whetherG** we can just update the existing cell or its predecessor in the list.*/ } else {; if (artnum >= r->first) return 0; /* already marked */ r2 = r->blink;? if (artnum == r->first-1) { /* Just update this cell */ r->first -= 1;M if (r2 != (struct RNG *) &grp->seenq) { /* See if we now overlap */J if (r2->last >= r->first-1) { /* with predecessor; if */J r->first = r2->first; /* so, coalesce the two */J queue_remove(r2, &r2); /* cells into one. */ mem_freerng(r2); } } } else {0 if (r2 != (struct RNG *) &grp->seenq) {C if (artnum == r2->last+1) { /* tack onto end of */@ r2->last += 1; /* predecessor cell */ } else {B r2 = mem_getrng(); /* New cell required */, r2->first = r2->last = artnum;) queue_insert(r2, r->blink); } } else {C r2 = mem_getrng(); /* no previous; get new */H r2->first = r2->last = artnum; /* and stick at listhead */( queue_insert(r2, &grp->seenq); } } } return 1;} /* Mark_Article_Seen */ /***++ ** ROUTINE: Mark_Article_Unseen**** FUNCTIONAL DESCRIPTION:**?** Removes an article from the seen-article list for a group.**** RETURNS: boolean**** PROTOTYPE:**5** Mark_Article_Unseen(struct GRP *grp, int artnum)**/** grp: GRP structure, modify, by reference/** artnum: article number, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** 1: success(** 0: Article was not on seen list**** SIDE EFFECTS: None.****--*/6int Mark_Article_Unseen(struct GRP *grp, int artnum) { struct RNG *r, *r2;/*8** Locate the cell that this article number is a part of*/N for (r = grp->seenq.head; r != (struct RNG *) &grp->seenq; r = r->flink) {" if (artnum <= r->last) break; }D if (r == (struct RNG *) &grp->seenq) return 0; /* none found */E if (artnum < r->first) return 0; /* between two cells *//*H** If number is the boundary of the cell, just update the cell boundary,/** and check to see if the cell should go away.*/2 if (artnum == r->first || artnum == r->last) {( if (artnum == r->first) r->first++; else r->last--; if (r->first > r->last) { queue_remove(r, &r);r mem_freerng(r); } return 1; }M/**** Must break the cell up into two pieces.*/ r2 = mem_getrng(); r2->first = artnum+1;. r2->last = r->last;  r->last = artnum-1;I queue_insert(r2, r); return 1;.} /* Mark_Article_Unseen */ /***++** ROUTINE: Mark_Xref**** FUNCTIONAL DESCRIPTION:**E** Parse an Xref header and marks the referenced articles [un]seen.-**** RETURNS: voidn**** PROTOTYPE:**%** Mark_Xref(char *xref, int unsee)s**:** xref: character string, read only, by reference (ASCIZ)&** unsee: boolean, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.l**** SIDE EFFECTS: None.****--*/'void Mark_Xref(char *xref, int unsee) { struct QUE grpq; struct HDR *h; struct GRP *g;" grpq.head = grpq.tail = &grpq; Parse_Xref(xref, &grpq);) while (queue_remove(grpq.head, &h)) {2 g = Find_Group(h->str); if (g != NULL) {h if (unsee) {;* Mark_Article_Unseen(g, h->code); } else { ( Mark_Article_Seen(g, h->code); } } mem_freehdr(h); }i} /* Mark_Xref */h e/***++ ** ROUTINE: Next_Unseen_Article**** FUNCTIONAL DESCRIPTION:i**H** Finds the next unseen article in a group (or in the current group).**** RETURNS: article numberR**** PROTOTYPE:**B** Next_Unseen_Article(int artnum, int nocheck, struct GRP *grp)**/** artnum: article number, read only, by valueM(** nocheck: boolean, read only, by value2** grp: GRP structure, read only, by reference** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.N**** COMPLETION CODES:,** non-0: next unseen article $** 0: no unseen articles left**** SIDE EFFECTS: None.****--*/Cint Next_Unseen_Article(int artnum, int nocheck, struct GRP *grp) {  struct RNG *r; int a;$ if (grp == NULL) grp = curgroup;> a = (grp->frstavl > artnum + 1) ? grp->frstavl : artnum+1;( if (artnum > grp->lastavl) return 0; while (1) {t/*(** Check to see if it's on the seen list*/O for (r = grp->seenq.tail; r != (struct RNG *) &grp->seenq; r = r->blink) {s" if (a >= r->first) break; }+ if (r != (struct RNG *) &grp->seenq) {c if (a <= r->last) { a = r->last+1;! if (a > grp->lastavl) {v a = 0; break; } } } if (a > grp->lastavl) { a = 0;* break;e }/*D** Normally, we STAT the article to see if it actually exists on the ** server.*/ if (!nocheck) {0 static $DESCRIPTOR(ctrstr, "STAT !UL");$ struct dsc$descriptor sdsc; char tmp[STRING_SIZE];* short tlen; int reply_code;. INIT_SDESC(sdsc, sizeof(tmp)-1, tmp);+ sys$fao(&ctrstr, &tlen, &sdsc, a);  *(tmp+tlen) = '\0'; server_send(tmp);= server_get_reply(SRV__NOECHO, &reply_code, 0, 0, 0); 5 if (reply_code == NNTP__TEXTSEPARATE) break;t- else Mark_Article_Seen(curgroup, a);: } else break; a += 1; }e return a;r} /* Next_Unseen_Article */n w/***++** ROUTINE: Count_Unseenx**** FUNCTIONAL DESCRIPTION:l**5** Counts the number of unseen articles in a group.*** ** RETURNS: int (article count)**** PROTOTYPE:** ** Count_Unseen(struct GRP *g)**,** g: GRP structure, read only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.c**** COMPLETION CODES:f'** -1: something is very wrong here! 1** not -1: that's the number of unseen articles**** SIDE EFFECTS: None.****--*/!int Count_Unseen(struct GRP *g) {c struct RNG *r, *r2;A int s, a, b, count;  s = g->frstavl-1;r' if (s > g->lastavl) s = g->lastavl;5 if (g->lastavl == 0 && g->frstavl == 0) return 0;a r = g->seenq.head;( if (r == (struct RNG *) &g->seenq) {2 return (g->lastavl-s > 0) ? g->lastavl-s : 0; } count = 0; while (1) { r2 = r->flink;# a = r->last > s ? r->last : s;( if (a > g->lastavl) a = g->lastavl;* if (r2 == (struct RNG *) &g->seenq) {# return count+g->lastavl-a;= }' b = r2->first > s ? r2->first : s;( if (b > g->lastavl) b = g->lastavl;+ count = count + (b-a > 1 ? b-a-1 : 0);u r = r2; }>- return -1; /* should never reach here */{} /* Count_Unseen */ /***++** ROUTINE: Post_Article***** FUNCTIONAL DESCRIPTION:e**5** Sends an article to the NNTP server for posting.d**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**C** Post_Article(struct QUE *hdrq, char *fspec, int use_signature)**/** hdrq: QUE structure, modify, by reference:F** fspec: file specification, read only, by reference (ASCIZ string).** use_signature: boolean, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.j**** COMPLETION CODES:&2** SS$_NORMAL: Article was successfully posted.(** NEWS__POSTERR: Some error occurred.**** SIDE EFFECTS: None.****--*/Munsigned int Post_Article(struct QUE *hdrq, char *fspec, int use_signature) {f char tmp[STRING_SIZE]; struct dsc$descriptor sdsc;, struct HDR *hdr; TIME tod; unsigned int unit, status; int reply_code, len; short tlen;t/*/** Open the article body file (if there is one)r*/ if (fspec) {/ status = file_open(fspec, &unit, 0, 0, 0);R if (!OK(status)) {t. lib$signal(NEWS__POSTERR, 0, status); return NEWS__POSTERR; } }N/*'** Prepare the server for the onslaught+*/ server_send("POST");8 server_get_reply(SRV__NOECHO, &reply_code, 0, 0, 0);+ if (reply_code != NNTP__SENDPARTICLE) {E$ lib$signal(NEWS__NOPOSTING, 0); return NEWS__NOPOSTING; }T/*B** Get current date and time for the couple of headers we generate*/ sys$gettim(&tod);c/*A** Format the headers and send them. Note that this destroys theC** header queue passed to us!P*/, while (queue_remove(hdrq->head, &hdr)) {- Format_Header(hdr, tmp, sizeof(tmp), 0);r server_send(tmp); mem_freehdr(hdr); }/*G** Add the standard headers. The news system usually sorts the headers I** into some standard arrangement, so we really don't have to worry aboutp** how pretty this order looks.*/ strcpy(tmp, "From: ");. Make_Return_Address(tmp+6, sizeof(tmp)-6); server_send(tmp);n strcpy(tmp, "Reply-To: ");# strcat(tmp, news_cfg.reply_to);T server_send(tmp);r) INIT_SDESC(sdsc, sizeof(tmp)-1, tmp);  if (news_cfg.dopath) {' if (news_cfg.pathstr[0] == '\0') {*! if (news_cfg.bangpath) {e7 static $DESCRIPTOR(ctrstr, "Path: !AD!!!AD");A( sys$fao(&ctrstr, &tlen, &sdsc,= strlen(news_cfg.node_name), news_cfg.node_name,;< strlen(news_cfg.username), news_cfg.username); *(tmp+tlen) = '\0';r } else {6 static $DESCRIPTOR(ctrstr, "Path: !AD@!AD");D sys$fao(&ctrstr, &tlen, &sdsc, strlen (news_cfg.username),< news_cfg.username, strlen(news_cfg.node_name)," news_cfg.node_name); *(tmp+tlen) = '\0';H } } else {- strcpy(tmp, "Path: ");r' strcat(tmp, news_cfg.pathstr); ( strcat(tmp, news_cfg.username); } server_send(tmp); }t if (news_cfg.gendate) {g strcpy(tmp, "Date: ");n+ Make_Date(&tod, tmp+6, sizeof(tmp)-6);o server_send(tmp); }; if (news_cfg.genmsgid) {= static $DESCRIPTOR(ctrstr, "Message-ID: ");{9 sys$fao(&ctrstr, &tlen, &sdsc, tod.long2, tod.long1, > strlen(news_cfg.node_name), news_cfg.node_name); *(tmp+tlen) = '\0'; server_send(tmp); }S' if (news_cfg.org_name[0] != '\0') { # strcpy(tmp, "Organization: ");$ strcat(tmp, news_cfg.org_name); server_send(tmp); }r/*** End of headers**/  server_send("");/*&** Now send the body, if there is one.*/ if (fspec) { char *cp; tmp[0] = '.';> while (OK(file_read(unit, tmp+1, sizeof(tmp)-2, &len))) { *(tmp+1+len) = '\0';n. cp = (*(tmp+1) == '.') ? tmp : tmp+1; if (news_cfg.chrcnv) {x# char tmp2[STRING_SIZE*2]; 6 (*news_cfg.chrlton)(cp, tmp2, sizeof(tmp2)); server_send(tmp2); } else {* server_send(cp); } } file_close(unit); unit = 0; }l/**** Attach signature, if we're supposed to.*/8 if (use_signature && news_prof.sigfile[0] != '\0') {; status = file_open(news_prof.sigfile, &unit, 0, 0, 0);d if (!OK(status)) {[@ lib$signal(NEWS__SIGFERR, 2, strlen(news_prof.sigfile),. news_prof.sigfile, status); } else {  int i;l" for (i = 0; i < 8; i++) {D if (!OK(file_read(unit, tmp, sizeof(tmp)-1, &len))) break; *(tmp+len) = '\0'; if (news_cfg.chrcnv) {' char tmp2[STRING_SIZE*2];x; (*news_cfg.chrlton)(tmp, tmp2, sizeof(tmp2));! server_send(tmp2);) } else { server_send(tmp);u }c } file_close(unit); unit = 0; } } /*7** End of the article. Echo the reply from the server.*/ server_send(".");n6 server_get_reply(SRV__ECHO, &reply_code, 0, 0, 0);, if (reply_code != NNTP__ARTICLEPOSTED) {" lib$signal(NEWS__POSTERR, 0); return NEWS__POSTERR; }i return SS$_NORMAL;} /* Post_Article */ n/***++** ROUTINE: Get_Article_Hdrsn**** FUNCTIONAL DESCRIPTION:.**:** Retrieves an article's headers, either from the local$** header cache or from the server.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**F** Get_Article_Hdrs(struct GRP *grp, int artnum, struct QUE **hdrqp,1** int nosignal, int *lines)_3** grp: GRP structure, read only, by reference0** artnum: article number, read only, by value?** hdrqp: pointer to QUE structure, write only, by referencex)** nosignal: boolean, read only, by value.** lines: integer, write only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None. **** COMPLETION CODES:e/** SS$_NORMAL: Normal successful completion.N**** SIDE EFFECTS: None.****--*/Nunsigned int Get_Article_Hdrs(struct GRP *grp, int artnum, struct QUE **hdrqp,3 int nosignal, int *lines) {* struct QUE tmpq; struct CHDR *ch, *ch2; struct HDR *hdr, *hdr2;o- char tmp[STRING_SIZE], tmp2[STRING_SIZE]; char *cp; int reply_code, len; unsigned int status;/*E** If the requested group is the group we're caching, then search the ** cache for the headers. */ if (hcgroup == grp) {& if (hdrcache.head != &hdrcache &&= artnum > ((struct CHDR *) hdrcache.tail)->artnum) {nI ch = (struct CHDR *) &hdrcache; /* short cut for common case */ } else {ST for (ch = hdrcache.head; ch != (struct CHDR *) &hdrcache; ch = ch->flink) {* if (artnum <= ch->artnum) break; } }C if (ch != (struct CHDR *) &hdrcache && artnum == ch->artnum) {c, if (ch->hdrq.head == &(ch->hdrq)) { if (!nosignal) {? lib$signal(NEWS__ARTRERR, 3, strlen(grp->grpnam), - grp->grpnam, artnum);c }' return NEWS__ARTRERR;o } *hdrqp = &(ch->hdrq);( if (lines) *lines = ch->hlines; return SS$_NORMAL;m }/*/** New group, so wipe the cache and start anew.b*/ } else { mem_delcache();( mem_initcache(sizeof(struct CHDR));/ hdrcache.head = hdrcache.tail = &hdrcache;m hcgroup = grp; $ ch = (struct CHDR *) &hdrcache; hccount = 0;n }/*>** If the request is for a group other than the current group,** coordinate with the server.*/ if (grp != curgroup) { strcpy(tmp, "GROUP ");f strcat(tmp, grp->grpnam); server_send(tmp);H server_get_reply(SRV__NOECHO, &reply_code, tmp, sizeof(tmp), &len);+ if (reply_code != NNTP__GRPSELECTED) {a if (!nosignal) { ; lib$signal(NEWS__ARTRERR, 3, strlen(grp->grpnam),p5 grp->grpnam, artnum, NEWS__UNEXPRSP, 3,l$ reply_code, len, tmp); } return NEWS__ARTRERR; } }r/*"** Get the headers from the server*/$ sprintf(tmp, "HEAD %d", artnum); server_send(tmp);RI server_get_reply(SRV__NOECHO, &reply_code, tmp, sizeof(tmp)-1, &len);  tmp[len] = '\0';* if (reply_code != NNTP__HEADFOLLOWS) { if (!nosignal) {e: lib$signal(NEWS__ARTRERR, 3, strlen(grp->grpnam),. grp->grpnam, artnum, NEWS__UNEXPRSP,# 3, reply_code, len, tmp);s } if (grp != curgroup) {u strcpy(tmp, "GROUP "); ' strcat(tmp, curgroup->grpnam);  server_send(tmp);= server_get_reply(SRV__NOECHO, &reply_code, 0, 0, 0);e } return NEWS__ARTRERR; } /*E** This loop reads the lines coming from the server and converts them I** into headers. Servers don't usually wrap lines, but this code handles ** that case. */" tmpq.head = tmpq.tail = &tmpq; cp = tmp2; tmp2[0] = '\0';tG while (server_get_line(tmp, sizeof(tmp)-1, &len) != NEWS__EOLIST) {  struct HDR *hln;s *(tmp+len) = '\0';t if (isspace(*tmp)) {iH if (len > sizeof(tmp2)-(cp-tmp2)) len = sizeof(tmp2)-(cp-tmp2);+ if (len > 0) memcpy(cp, tmp, len);- cp += len;  *cp = '\0'; } else {  if (tmp2[0]) { + hln = mem_gethdr(strlen(tmp2)+1); ! strcpy(hln->str, tmp2); ' queue_insert(hln, tmpq.tail); }8 if (len > sizeof(tmp2)-1) len = sizeof(tmp2)-1; memcpy(tmp2, tmp, len); cp = tmp2+len;r *cp = '\0'; } }t if (tmp2[0]) { struct HDR *hln; & hln = mem_gethdr(strlen(tmp2)+1); strcpy(hln->str, tmp2);" queue_insert(hln, tmpq.tail);~NEWSRDR_SRC.BCKPP[NEWSRDR]ARTICLE.C;47YUM,> }u/*H** We will be adding these headers to the cache. We don't have a reallyK** good cache replacement strategy - lowest numbered article gets the shoven ** first. */( if (hccount >= news_cfg.cachesize) {' queue_remove(hdrcache.head, &ch2);tA while (queue_remove(ch2->hdrq.head, &hdr)) mem_freehdr(hdr); } else { ch2 = mem_getcache(); hccount += 1; }* if (ch == (struct CHDR *) &hdrcache) {& queue_insert(ch2, hdrcache.tail); } else {" queue_insert(ch2, ch->blink); }a1 ch2->hdrq.head = ch2->hdrq.tail = &ch2->hdrq;P ch2->artnum = artnum;n/*A** Parse the headers, sticking the result in the cache, then wipe,H** the original text version. Set hdrqp to point to the cached headers.*/7 Parse_Headers(&tmpq, &(ch2->hdrq), &(ch2->hlines));; while (queue_remove(tmpq.head, &hdr)) mem_freehdr(hdr);i *hdrqp = &(ch2->hdrq);$ if (lines) *lines = ch2->hlines;/*?** If we had changed the group on the server, change back againu*/ if (grp != curgroup) { strcpy(tmp, "GROUP ");n# strcat(tmp, curgroup->grpnam);g server_send(tmp);9 server_get_reply(SRV__NOECHO, &reply_code, 0, 0, 0);= }t return SS$_NORMAL;} /* Get_Article_Hdrs */ n/***++** ROUTINE: Get_Article_Bodyr**** FUNCTIONAL DESCRIPTION: **;** Fetches an article body from the server (or out of our ** single article cache).**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**I** Get_Article_Body(int artnum, char *fspec, char *xrspec, int *xlines) **/** artnum: article number, read only, by valueqF** fspec: file specification, read only, by reference (ASCIZ string)G** rspec: file specification, write only, by reference (ASCIZ string)m-** lines: integer, write only, by reference>**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.r**** COMPLETION CODES:*/** SS$_NORMAL: Normal successful completion.N**** SIDE EFFECTS: None.****--*/Sunsigned int Get_Article_Body(int artnum, char *fspec, char *xrspec, int *xlines) { / char tmp[STRING_SIZE], tmp2[STRING_SIZE*2];r int reply_code, tlen, lines; unsigned int status, unit;/*G** We keep one article body around locally; check to see if that's whatCG** they want. If so, copy it over and return. Otherwise, clear thingsD** out for our new article.C*/ if (artsave != NULL) {D if (curgroup == artsave->grpptr && artnum == artsave->artnum) {B status = Copy_File(artsave->bodyfspec, fspec, xrspec, 0);+ if (OK(status)) return SS$_NORMAL;e% else wipe_article(&artsave);F } }r/*C** Create the file using the name they gave us, then fetch the bodyU** over from the server.*/2 status = file_create(fspec, &unit, 0, xrspec); if (!OK(status)) {; lib$signal(NEWS__ARTRERR, 3, strlen(curgroup->grpnam),1 curgroup->grpnam, artnum, status);L return NEWS__ARTRERR; }n$ sprintf(tmp, "BODY %d", artnum); server_send(tmp);*H server_get_reply(SRV__NOECHO, &reply_code, tmp, sizeof(tmp), &tlen);* if (reply_code != NNTP__BODYFOLLOWS) { file_dclose(unit); ; lib$signal(NEWS__ARTRERR, 3, strlen(curgroup->grpnam), M curgroup->grpnam, artnum, NEWS__UNEXPRSP, 3, reply_code, tlen, tmp);T return NEWS__ARTRERR; }  lines = 0;H while (server_get_line(tmp, sizeof(tmp)-1, &tlen) != NEWS__EOLIST) { lines++; if (news_cfg.chrcnv) {. *(tmp+tlen) = '\0';6 (*news_cfg.chrntol)(tmp, tmp2, sizeof(tmp2));7 status = file_write(unit, tmp2, strlen(tmp2));g } else {. status = file_write(unit, tmp, tlen); } if (!OK(status)) {gJ while (server_get_line(tmp, sizeof(tmp), &tlen) != NEWS__EOLIST);? lib$signal(NEWS__ARTRERR, 3, strlen(curgroup->grpnam),N0 curgroup->grpnam, artnum, status); file_dclose(unit); return NEWS__ARTRERR; } } if (xlines) *xlines = lines; file_close(unit);  return SS$_NORMAL;} /* Get_Article_Body */ /***++** ROUTINE: Ignore_Article}**** FUNCTIONAL DESCRIPTION:v**>** Checks to see if the specified article should be ignored.**** RETURNS: boolean**** PROTOTYPE:**0** Ignore_Article(struct GRP *grp, int artnum)**2** grp: GRP structure, read only, by reference/** artnum: article number, read only, by valueI**** IMPLICIT INPUTS: news_prof. **** IMPLICIT OUTPUTS: None.I**** COMPLETION CODES:-&** 1: Article should be ignored.'** 0: Do not ignore this article.0**** SIDE EFFECTS: None.****--*/1int Ignore_Article(struct GRP *grp, int artnum) { struct QUE *hdrqptr, *kq[2]; struct HDR *hdr;E char subj[STRING_SIZE], tmp[STRING_SIZE+2], fromstr[STRING_SIZE];+ char ngstr[STRING_SIZE];( struct dsc$descriptor cand, pattern; int ignore, i;/*D** Check degenerate case - no local and no global kill lists. Saves)** us fetching the headers unnecessarily.U*/) if (grp->killq.head == &grp->killq &&*< news_prof.killq.head == &news_prof.killq) return 0;/*D** Fetch the headers over. If there's a problem, assume it's a dead)** article and tell the caller to ignore.**/+ subj[0] = fromstr[0] = ngstr[0] = '\0';-= if (!OK(Get_Article_Hdrs(grp, artnum, &hdrqptr, 1, 0))) { $ Mark_Article_Seen(grp, artnum); return 1; }/*>** Get the headers we're interested in out of the header list.*/P for (hdr = hdrqptr->head; hdr != (struct HDR *) hdrqptr; hdr = hdr->flink) {( if (hdr->code == NEWS_K_HDR_FROM) {# strcpy(fromstr, hdr->str);n upcase(fromstr);v2 } else if (hdr->code == NEWS_K_HDR_SUBJECT) { strcpy(subj, hdr->str); upcase(subj);5 } else if (hdr->code == NEWS_K_HDR_NEWSGROUPS) {>! strcpy(ngstr, hdr->str);G upcase(ngstr);  } }-/*B** If the headers we want aren't there, then don't go any further.&** (That should never happen, though.)*/7 if (!subj[0] && !fromstr[0] && !ngstr[0]) return 0;/*C** Now check the local and global kill lists to see if this article** meets the criteria.*/ ignore = 0;  kq[0] = &grp->killq; kq[1] = &news_prof.killq;e for (i = 0; i < 2; i++) {M for (hdr = kq[i]->head; hdr != (struct HDR *) kq[i]; hdr = hdr->flink) {T@ if (!strchr(hdr->str, '*') && !strchr(hdr->str, '%')) { tmp[0] = '*';r$ strcpy(&tmp[1], hdr->str); strcat(tmp, "*");i0 INIT_SDESC(pattern, strlen(tmp), tmp); } else {l: INIT_SDESC(pattern, strlen(hdr->str), hdr->str); }8 if (hdr->code == NEWS_K_HDR_SUBJECT && *subj) {/ INIT_SDESC(cand, strlen(subj), subj);W4 if (OK(str$match_wild(&cand, &pattern))) { ignore = 1;n break; }*? } else if (hdr->code == NEWS_K_HDR_FROM && *fromstr) {I5 INIT_SDESC(cand, strlen(fromstr), fromstr);*4 if (OK(str$match_wild(&cand, &pattern))) { ignore = 1;  break; }rC } else if (hdr->code == NEWS_K_HDR_NEWSGROUPS && *ngstr) { 1 INIT_SDESC(cand, strlen(ngstr), ngstr);s4 if (OK(str$match_wild(&cand, &pattern))) { ignore = 1;_ break; }P } } if (ignore) break;  }s/*C** If we are supposed to ignore this article, mark it seen as well. *// if (ignore) Mark_Article_Seen(grp, artnum);a return ignore;} /* Ignore_Article */ ;/***++** ROUTINE: Article_ExH**** FUNCTIONAL DESCRIPTION:s**:** Routine to be called by the NEWSRDR exit handler that)** cleans up our one-article body cache.y**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** Article_ExH()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.r**** COMPLETION CODES:e"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/unsigned int Article_ExH() {0 if (artsave != NULL) wipe_article(&artsave); return SS$_NORMAL;} /* Article_ExH */e t/***++** ROUTINE: Edit_Article **** FUNCTIONAL DESCRIPTION:t**:** Puts an article into a file for viewing by an editor.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**$** Edit_Article(struct ART **ctxp)**F** ctxp: pointer to internally-defined structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None. **** COMPLETION CODES:e3** SS$_NORMAL: Normal successful completion.wM** NEWS__EOARTICLE: Normal completion; article has been fully displayed.}**** SIDE EFFECTS: None.****--*/.unsigned int Edit_Article(struct ART **ctxp) { struct ART *ctx = *ctxp;& struct GRP *grp = (*ctxp)->grpptr; struct HDR *hdr; struct dsc$descriptor sdsc;n- char tmp[STRING_SIZE], rspec[FSPEC_SIZE];  short tlen;s int len, is_temp;m unsigned int status, unit;Y static $DESCRIPTOR(alphabet, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");dY static $DESCRIPTOR(rotabet, "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm");e& make_temp_fspec(tmp, sizeof(tmp));/ status = file_create(tmp, &unit, 0, rspec);# if (!OK(status)) return status;a/*** Header display{*/8 while (ctx->hlnptr != (struct HDR *) ctx->hdrqptr) { int len;t8 Format_Header(ctx->hlnptr, tmp, sizeof(tmp), &len); file_write(unit, tmp, len);& ctx->hlnptr = ctx->hlnptr->flink; }\ file_write(unit, "", 0);@ status = file_open(ctx->bodyfspec, &ctx->bodyunit, 0, 0, 0); if (!OK(status)) {9 lib$signal(NEWS__BODYERR, 2, strlen(ctx->bodyfspec),s+ ctx->bodyfspec, status);s file_dclose(unit);  return status;  }(/*** Display of article body*/D while (OK(file_read(ctx->bodyunit, tmp, sizeof(tmp)-1, &len))) { if (rotate_text) { $ struct dsc$descriptor tdsc; char tmp2[STRING_SIZE];$ INIT_SDESC(sdsc, len, tmp);% INIT_SDESC(tdsc, len, tmp2);p: str$translate(&tdsc, &sdsc, &alphabet, &rotabet);% file_write(unit, tmp2, len);' } else file_write(unit, tmp, len);  }r file_close(unit); file_close(ctx->bodyunit); ctx->bodyunit = 0; artsave = ctx;6 status = Compose_Message(rspec, tmp, 1, &is_temp);0 if (OK(status) && is_temp) file_delete(tmp); file_delete(rspec);g return status;} /* Edit_Article */atus); } else {  int i;l" for (i = 0; i < 8; i++) {D if (!OK(file_read(unit, tmp, sizeof(tmp)-1, &len))) break; *(tmp+len) = '\0'; if (news_cfg.chrcnv) {' char tmp2[STRING_SIZE*2];x; (*news_cfg.chrlton)(tmp, tmp2, sizeof(tmp2));! server_send(tmp2);) } elseP~NEWSRDR_SRC.BCKPP[NEWSRDR]PAGER.C;30O-*[NEWSRDR]PAGER.C;30+,P.-/ @ 4O-+-P0123KPWO,56.w7nƷ8d99G @HJV/***++** FACILITY: NEWSRDR**$** ABSTRACT: Paged-output routines.**** MODULE DESCRIPTION:**B** Output routines for NEWSRDR, mainly supporting page-at-a-time ** display.**** AUTHOR: M. MadisonO** COPYRIGHT 1992, 1993 MATTHEW D. MADISON. ALL RIGHTS RESERVED.**** CREATION DATE: 08-SEP-1992**** MODIFICATION HISTORY:**1** 08-SEP-1992 V1.0 Madison Initial coding.E** 13-OCT-1992 V1.0-1 Madison Trim trailing blanks on error msgs.G** 10-FEB-1993 V1.1 Madison Allow for non-terminal output device.F** 12-APR-1993 V1.2 Madison Put remaining lines in Press... msg.7** 17-APR-1993 V1.3 Madison Add connection check.**--*/#define MODULE_PAGER#include "newsrdr.h"#include #ifdef __GNUC__#include #include #include #include #else#include #include #include #include #include #endif/*** Forward declarations*/! unsigned int Pager_Init(int);, unsigned int Begin_Paged_Output(char *);( int Put_Paged(char *, int);) int Paged_Output_Done(void);* static int Flush_Paged_Output(void);, void Discard_Paged_Output(void);* void Finish_Paged_Output(int);$ unsigned int put_output(char *);1 unsigned int put_output_counted(char *, int);) unsigned int put_output_nocc(char *);8 unsigned int put_output_dx(struct dsc$descriptor *);5 unsigned int put_errmsg(struct dsc$descriptor *);. unsigned int get_cmd(char *, int, char *);M unsigned int get_cmd_dx(struct dsc$descriptor *, struct dsc$descriptor *, short *);0 unsigned int put_paged_help(char *, char *);) unsigned int Define_Key(char *, int);- static unsigned int ctrl_c_handler(void);. static char ctrlchrs[] = {1,2,3,4,5,6,7,8,B 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,D 28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,@ 138,139,140,141,142,143,144,145,146,147,148,149,150,9 151,152,153,154,155,156,157,158,159,160,255};/ static struct dsc$descriptor ctrls, spaces; GLOBAL int pb_rows, pb_cols;" GLOBAL int User_Interrupt = 0;/ static unsigned int pbid, vdid, kbid, ktid;$ static char hdrstr[STRING_SIZE];# static int cur_row, erase_page; static short ttchn; static struct QUE waitq; static int is_terminal = 0;* extern unsigned int lbr$output_help(); /***++** ROUTINE: Pager_Init**** FUNCTIONAL DESCRIPTION:**+** Initializes stuff used by this module.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** Pager_Routine(int semi)**(** semi: boolean, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/#unsigned int Pager_Init(int semi) { struct { unsigned char class, type; unsigned short width; unsigned int ch : 24; unsigned char page; } smbuf;5 unsigned int status, pbflags=SMG$M_KEEP_CONTENTS;; unsigned int kpflags=SMG$M_KEYPAD_APPLICATION, eight=8;' $DESCRIPTOR(sysout, "SYS$OUTPUT:");, $DESCRIPTOR(keydefs, "NEWSRDR_KEYDEFS");5 $DESCRIPTOR(keydefs_default, "SYS$LOGIN:.NRKEY");/*D** semi is set if we only need to "semi-"initialize, such as after a** SPAWN returns*/ if (!semi) {0 status = sys$assign(&sysout, &ttchn, 0, 0);' if (!OK(status)) lib$stop(status);8 status = sys$qiow(0, ttchn, IO$_SENSEMODE, 0, 0, 0,, &smbuf, sizeof(smbuf), 0, 0, 0, 0); if (OK(status)) {/ is_terminal = smbuf.class == DC$_TERM;) if (OK(status) && is_terminal) {( if (!(smbuf.ch & TT$M_WRAP)) {$ smbuf.ch |= TT$M_WRAP;6 sys$qiow(0, ttchn, IO$_SETMODE, 0, 0, 0,2 &smbuf, sizeof(smbuf), 0, 0, 0, 0); } } } if (is_terminal) {E status = smg$create_pasteboard(&pbid, 0, &pb_rows, &pb_cols, &pbflags);+ if (!OK(status)) lib$stop(status);& if (pb_rows < 6) pb_rows = 6; } else { sys$dassgn(ttchn); ttchn = 0; pb_cols = 132; }! smg$create_key_table(&ktid);: smg$load_key_defs(&ktid, &keydefs, &keydefs_default);( smg$create_virtual_keyboard(&kbid);3 INIT_SDESC(ctrls, sizeof(ctrlchrs), ctrlchrs);- INIT_SDESC(spaces, sizeof(ctrlchrs), 0);5 spaces.dsc$a_pointer = malloc(sizeof(ctrlchrs));< memset(spaces.dsc$a_pointer, ' ', spaces.dsc$w_length); }) smg$set_keypad_mode(&kbid, &kpflags); if (is_terminal) {= smg$set_out_of_band_asts(&pbid, &eight, ctrl_c_handler); } erase_page = 1;% waitq.head = waitq.tail = &waitq; hdrstr[0] = '\0'; return SS$_NORMAL;} /* Pager_Init */  /***++** ROUTINE: Begin_Paged_Output**** FUNCTIONAL DESCRIPTION:**;** Sets up the header string for an upcoming paged output ** sequence.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**"** Begin_Paged_Output(char *hdr)**1** hdr: ASCIZ_string, read only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/,unsigned int Begin_Paged_Output(char *hdr) { strcpy(hdrstr, hdr);# if (strlen(hdrstr) > pb_cols) { *(hdrstr+pb_cols) = '\0'; } erase_page = 1; return SS$_NORMAL;} /* Begin_Paged_Output */ /***++** ROUTINE: Put_Paged**** FUNCTIONAL DESCRIPTION:**E** Puts out a string that should be considered for the paged outputG** sequence. The lines that the string takes up are counted and saved2** if it cannot be displayed on the current page.**** RETURNS: boolean**** PROTOTYPE:**** Put_Paged(char *str, int)**1** str: ASCIZ_string, read only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:(** 0: string would not fit on page** 1: string fit on page**** SIDE EFFECTS: None.****--*/&int Put_Paged(char *str, int xlines) {2 char tmp[STRING_SIZE], tmp2[STRING_SIZE], *cp; struct HDR *w;1 int lines, maxlines, remaining, l, x, i, len;' unsigned int status, return_status; if (!is_terminal) { put_output(str); return; } if (erase_page) {! smg$erase_pasteboard(&pbid); cur_row = 1; if (*hdrstr) {! put_output_nocc(hdrstr); put_output(""); } erase_page = 0; }( if (!Flush_Paged_Output()) return 0; x = 0;I for (cp = str+strlen(str); cp > str && isspace(*(cp-1)); cp--) x = 1; if (x) { strncpy(tmp, str, cp-str); *(tmp+(cp-str)) = '\0'; cp = tmp; } else { cp = str; } len = strlen(cp); if (*cp == '\014') { put_output(""); if (xlines >= 0) {G sprintf(tmp, "[%d lines remaining, press RETURN for more...]", xlines + 1); put_output(tmp); } else {2 put_output("[Press RETURN for more...]"); } erase_page = 1; if (len > 1) { *cp = ' ';* insert_header(cp, waitq.tail, 0); } return 0; } lines = len / pb_cols + 1;@ if (len % pb_cols == 0) lines = (lines-1 > 1 ? lines-1 : 1);! maxlines = pb_rows-cur_row-4; if (lines <= maxlines) { put_output(cp); return_status = 1; } else { remaining = len;" for (i = 0; i < lines; i++) {7 l = pb_cols < remaining ? pb_cols : remaining; remaining -= l; if (i < maxlines) {* memcpy(tmp2, cp+(i*pb_cols), l); *(tmp2+l) = '\0'; put_output(tmp2); } else { w = mem_gethdr(l+1);, memcpy(w->str, cp+(i*pb_cols), l); *(w->str+l) = '\0';& queue_insert(w, waitq.tail); } } put_output(""); if (xlines >= 0) {G sprintf(tmp, "[%d lines remaining, press RETURN for more...]", xlines + 1); put_output(tmp); } else {2 put_output("[Press RETURN for more...]"); } erase_page = 1; return_status = 0; } return return_status;} /* Put_Paged */ /***++** ROUTINE: Paged_Output_Done**** FUNCTIONAL DESCRIPTION:**>** Checks to see if we've finished any pending paged output,/** going to the next screen page if necessary.**** RETURNS: boolean**** PROTOTYPE:**** Paged_Output_Done()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** 0: not done** 1: done**** SIDE EFFECTS: None.****--*/int Paged_Output_Done() { if (!is_terminal) return 1; if (erase_page) { erase_page = 0;! smg$erase_pasteboard(&pbid); cur_row = 1; if (*hdrstr) {! put_output_nocc(hdrstr); put_output(""); } } return Flush_Paged_Output();} /* Paged_Output_Done */ /***++** ROUTINE: Flush_Paged_Output**** FUNCTIONAL DESCRIPTION:**;** Flushes any waiting pageable output, if it will fit on** the current page.**** RETURNS: boolean**** PROTOTYPE:**** Flush_Paged_Output()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** 0: did not fit on page** 1: fit ok on page**** SIDE EFFECTS: None.****--*/!static int Flush_Paged_Output() { struct HDR *w;* while (queue_remove(waitq.head, &w)) { if (cur_row >= pb_cols-4) {! queue_insert(w, &waitq); put_output("");2 put_output("[Press RETURN for more...]"); erase_page = 1; return 0; } put_output(w->str); mem_freehdr(w); } return 1;} /* Flush_Paged_Output */ /***++!** ROUTINE: Discard_Paged_Output**** FUNCTIONAL DESCRIPTION:**2** Just throws away any pending pageable output.**** RETURNS: void**** PROTOTYPE:**** Discard_Paged_Output()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/void Discard_Paged_Output() { struct HDR *w;8 while (queue_remove(waitq.head, &w)) mem_freehdr(w);} /* Discard_Paged_Output */ /***++ ** ROUTINE: Finish_Paged_Output**** FUNCTIONAL DESCRIPTION:**%** Cleanup routine for this module.**** RETURNS: void**** PROTOTYPE:**%** Finish_Paged_Output(int alldone)**)** alldone: boolean, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/'void Finish_Paged_Output(int alldone) { unsigned int zero = 0; Discard_Paged_Output(); if (alldone) {@ if (is_terminal) smg$set_out_of_band_asts(&pbid, &zero, 0); if (alldone == 1) {- smg$delete_pasteboard(&pbid, &zero);, smg$delete_virtual_keyboard(&kbid);& if (ttchn) sys$dassgn(ttchn); } }} /* Finish_Paged_Output */ /***++** ROUTINE: put_output**** FUNCTIONAL DESCRIPTION:**5** Puts out an ASCIZ string. Updates our record ofD** cursor position, in case we were called as part of paged output.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** put_output(char *str)**1** str: ASCIZ_string, read only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/$unsigned int put_output(char *str) { char tmp[STRING_SIZE];% struct dsc$descriptor tdsc, sdsc; int len, lines;  len = strlen(str);- if (len > STRING_SIZE) len = STRING_SIZE; INIT_SDESC(tdsc, len, tmp); INIT_SDESC(sdsc, len, str);1 str$translate(&tdsc, &sdsc, &spaces, &ctrls);3 if (!is_terminal) return lib$put_output(&tdsc); lines = len / pb_cols + 1;@ if (len % pb_cols == 0) lines = (lines-1 > 1 ? lines-1 : 1);@ cur_row = cur_row+lines > pb_rows ? pb_rows : cur_row+lines;5 return sys$qiow(0, ttchn, IO$_WRITEVBLK, 0, 0, 0,$ tmp, len, 0, 0x8d010000, 0, 0);} /* put_output */ /***++** ROUTINE: put_output_counted**** FUNCTIONAL DESCRIPTION:**C** Just like put_output, but takes the address of the string plus ** a count.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**+** put_output_counted(char *str, int len)**5** str: character string, read only, by reference(** len: integer, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/5unsigned int put_output_counted(char *str, int len) { char tmp[STRING_SIZE];% struct dsc$descriptor tdsc, sdsc; int lines; - if (len > STRING_SIZE) len = STRING_SIZE; INIT_SDESC(tdsc, len, tmp); INIT_SDESC(sdsc, len, str);1 str$translate(&tdsc, &sdsc, &spaces, &ctrls);3 if (!is_terminal) return lib$put_output(&tdsc); lines = len / pb_cols + 1;@ if (len % pb_cols == 0) lines = (lines-1 > 1 ? lines-1 : 1);@ cur_row = cur_row+lines > pb_rows ? pb_rows : cur_row+lines;5 return sys$qiow(0, ttchn, IO$_WRITEVBLK, 0, 0, 0,$ tmp, len, 0, 0x8d010000, 0, 0);} /* put_output_counted */ /***++** ROUTINE: put_output_nocc**** FUNCTIONAL DESCRIPTION:**@** Just like put_output, but disables carriage control for the** displayed line.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** put_output_nocc(char *str)**2** str: ASCIZ_string, read only, by reference)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/)unsigned int put_output_nocc(char *str) { char tmp[STRING_SIZE];% struct dsc$descriptor tdsc, sdsc; int len, lines;  len = strlen(str);- if (len > STRING_SIZE) len = STRING_SIZE; INIT_SDESC(tdsc, len, tmp); INIT_SDESC(sdsc, len, str);1 str$translate(&tdsc, &sdsc, &spaces, &ctrls);, if (!is_terminal) lib$put_output(&tdsc); lines = len / pb_cols + 1;@ if (len % pb_cols == 0) lines = (lines-1 > 1 ? lines-1 : 1);@ cur_row = cur_row+lines > pb_rows ? pb_rows : cur_row+lines;5 return sys$qiow(0, ttchn, IO$_WRITEVBLK, 0, 0, 0,$ tmp, len, 0, 0x8d000000, 0, 0);} /* put_output_nocc */ /***++** ROUTINE: put_output_dx**** FUNCTIONAL DESCRIPTION:**<** Just like put_output, but for a character string passed** in by descriptor.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**,** put_output_dx(struct dsc$descriptor *s)**,** s: char_string, read only, by descriptor**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/6unsigned int put_output_dx(struct dsc$descriptor *s) { char *cp; short len;/ if (!is_terminal) return lib$put_output(s);$ lib$analyze_sdesc(s, &len, &cp);' return put_output_counted(cp, len);} /* put_output_dx */ /***++** ROUTINE: put_errmsg**** FUNCTIONAL DESCRIPTION:**@** Just like put_output_dx, but returns a zero as status value@** for routine. Used in conjunction with $PUTMSG to do our own** error message output.***B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**)** put_errmsg(struct dsc$descriptor *s)o**,** s: char_string, read only, by descriptor**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.P**** COMPLETION CODES:N!** 0: Always returned..**** SIDE EFFECTS: None.****--*/3unsigned int put_errmsg(struct dsc$descriptor *s) {s char *cp;9 short len;$ lib$analyze_sdesc(s, &len, &cp);2 while (len > 0 && isspace(*(cp+len-1))) len--; put_output_counted(cp, len); return 0;M} /* put_errmsg */ e/***++** ROUTINE: get_cmd**** FUNCTIONAL DESCRIPTION:u**3** Gets a string from the command (input) stream.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**2** get_cmd(char *buf, int bufsize, char *prompt)**3** buf: ASCIZ_string, write only, by reference)** bufsize: integer, read only, by valuei2** prompt: ASCIZ_string, read only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None. **** COMPLETION CODES:v/** SS$_NORMAL: Normal successful completion.;5** Others from SMG$READ_COMPOSED_LINE are possible.d**** SIDE EFFECTS: None.****--*/<unsigned int get_cmd(char *buf, int bufsize, char *prompt) {% struct dsc$descriptor bdsc, pdsc;t unsigned int status; short len;% INIT_SDESC(bdsc, bufsize-1, buf);n if (prompt) {s. INIT_SDESC(pdsc, strlen(prompt), prompt); } else { INIT_SDESC(pdsc, 0, buf); }dF status = smg$read_composed_line(&kbid, &ktid, &bdsc, &pdsc, &len); if (OK(status)) {i *(buf+len) = '\0';h }h Check_Connection();f return status;} /* get_cmd */e n/***++** ROUTINE: get_cmd_dxt**** FUNCTIONAL DESCRIPTION:,**(** Like get_cmd, but uses descriptors.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**J** get_cmd_dx(struct dsc$descriptor *buf, struct dsc$descriptor *prompt,** short *len)**7** buf: character string, write only, by descriptorr6** prompt: character string, read only, by descriptor*** len: word, write only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.N**** COMPLETION CODES:r/** SS$_NORMAL: Normal successful completion. **** SIDE EFFECTS: None.****--*/3unsigned int get_cmd_dx(struct dsc$descriptor *buf,l; struct dsc$descriptor *prompt, short *lenp) {N% struct dsc$descriptor bdsc, pdsc;u unsigned int status; short len; int count; va_count(count);E status = smg$read_composed_line(&kbid, &ktid, buf, prompt, &len);* if (OK(status)) {r0 if (count > 2 && lenp != NULL) *lenp = len; }* Check_Connection(); return status;} /* get_cmd_dx */ o/***++** ROUTINE: put_paged_helpI**** FUNCTIONAL DESCRIPTION:/**=** Uses our output routines with LBR$OUTPUT_HELP to displaye>** help. At one time, we actually paged this output, but not ** any more. **B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**+** put_paged_help(char *topic, char *lib)O**1** topic: ASCIZ_string, read only, by reference1** lib: ASCIZ_string, read only, by referenceD**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.s**** COMPLETION CODES:m/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/5unsigned int put_paged_help(char *topic, char *lib) {p% struct dsc$descriptor tdsc, ldsc;h+ INIT_SDESC(tdsc, strlen(topic), topic);s' INIT_SDESC(ldsc, strlen(lib), lib);tJ return lbr$output_help(put_output_dx, 0, &tdsc, &ldsc, 0, get_cmd_dx);} /* put_paged_help */ /***++** ROUTINE: Define_Key)**** FUNCTIONAL DESCRIPTION:M**2** Uses SMG$DEFINE_KEY to define a function key.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:***** Define_Key(char *defkcmd, int cmdlen)**6** defkcmd: character string, read only, by reference)** cmdlen: integer, read only, by value **** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.}**** COMPLETION CODES:g/** SS$_NORMAL: Normal successful completion.s**** SIDE EFFECTS: None.****--*/4unsigned int Define_Key(char *defkcmd, int cmdlen) { struct dsc$descriptor dsc;% INIT_SDESC(dsc, cmdlen, defkcmd);S' return smg$define_key(&ktid, &dsc); } /* Define_Key */ e/***++** ROUTINE: ctrl_c_handlero**** FUNCTIONAL DESCRIPTION:**<** AST routine invoked when the user types a ctrl/C. Sets>** the user_interrupt flag and displays the [Cancel] message.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** ctrl_c_handler().**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.n**** COMPLETION CODES:I"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/&static unsigned int ctrl_c_handler() {6 static char canmsg[] = "\015\012[Cancel]\015\012"; User_Interrupt = 1;l if (is_terminal) {H sys$qiow(0, ttchn, IO$_WRITEVBLK, 0, 0, 0, canmsg, 12, 0, 0, 0, 0); } return SS$_NORMAL;} /* ctrl_c_handler */**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL:% ~NEWSRDR_SRC.BCK5OP[NEWSRDR]CMD_MISC.C;28`7|*[NEWSRDR]CMD_MISC.C;28+,5O.7/ @ 4`746-P0123KPWO856AڍЖ7^ڍЖ83 >9G @HJh/***++** FACILITY: NEWSRDR**%** ABSTRACT: Miscellaneous commands.**** MODULE DESCRIPTION:**C** This module contains a bunch of different commands that didn't+** fit into one of the other CMD_ modules.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 09-SEP-1992**** MODIFICATION HISTORY:**1** 09-SEP-1992 V1.0 Madison Initial coding.E** 11-SEP-1992 V1.0-1 Madison Added logging to cmd_{un}subscribe.<** 12-SEP-1992 V1.0-2 Madison Added /GOTO on subscribes.E** 19-SEP-1992 V1.0-3 Madison Fixed NOSUCHGRP problem in cmd_sub.I** 22-SEP-1992 V1.0-4 Madison Add hack to work around $FAO weirdness.I** 15-FEB-1993 V1.0-5 Madison Real fix to work around $FAO weirdness.C** 17-APR-1993 V1.1 Madison Add connection check after spawn.K** 25-MAY-1993 V1.1-1 Madison Partial update must set group avail flag.**--*/#include "newsrdr.h"#include "globals.h"#ifdef __GNUC__#include #include #else#include #include #endif GLOBAL struct GRP *curgroup;# static $DESCRIPTOR(nulstr, "");W static $DESCRIPTOR(newgroup_ctrstr, " !5UL new !8 in newsgroup !AD");/*E** We need this structure because LIB$TRAVERSE tree gives us only oneH** additional argument to the traversal action routines. This structure=** is a catchall that handles both SUBSCRIBE and UNSUBSCRIBE.*/ struct SUBINFO { int didone, really_didone; int confirm, wildcard, log; struct GRP *g; char *name; };/*** Forward declarations*/ void cmd_initialize(void);5 unsigned int cmd_exit(void), cmd_subscribe(void);B static unsigned int sub_group(struct GRP *, struct SUBINFO *);' unsigned int cmd_unsubscribe(void);D static unsigned int unsub_group(struct GRP *, struct SUBINFO *);" unsigned int cmd_update(void);7 static unsigned int upd_group(struct GRP *, int *);' unsigned int cmd_update_full(void);% unsigned int Do_Full_Update(int);C static unsigned int print_response(struct GRP *, struct QUE *);C unsigned int cmd_help(void), cmd_spawn(void), cmd_attach(void);" unsigned int cmd_defkey(void);* extern unsigned int cmd_readnew(void);G extern unsigned int parse_group_reply(char *, int *, int *, int *);? extern unsigned int Parse_List_Reply(char *, struct GRP *);+ extern void Insert_Group(struct GRP *);* extern int Count_Unseen(struct GRP *);* extern struct GRP *Find_Group(char *);8 extern unsigned int Set_Current_Group(struct GRP *); /***++** ROUTINE: cmd_initialize**** FUNCTIONAL DESCRIPTION:**D** Initializes the command processing environment -- specifically,J** the default_action and cleanup_action pointers, and the current group.**** RETURNS: void**** PROTOTYPE:**** cmd_initialize()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/void cmd_initialize() { curgroup = NULL;! default_action = cmd_readnew; cleanup_action = NULL;} /* cmd_initialize */ /***++** ROUTINE: cmd_exit**** FUNCTIONAL DESCRIPTION:**7** EXIT command. Just returns the appropriate status@** back to the main routine so it leaves the main command loop.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_exit()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:$** NEWS__ALLDONE: Always returned.**** SIDE EFFECTS: None.****--*/unsigned int cmd_exit() { Finish_Paged_Output(1); return NEWS__ALLDONE;} /* cmd_exit */ /***++** ROUTINE: cmd_subscribe**** FUNCTIONAL DESCRIPTION:**** SUBSCRIBE command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_subscribe()**** IMPLICIT INPUTS: news_prof.** ** IMPLICIT OUTPUTS: news_prof.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_subscribe() { char tmp[STRING_SIZE]; struct SUBINFO info;" int reply_code, changed_group; struct GRP *g;: info.confirm = cli_present("CONFIRM") == CLI$_PRESENT;1 info.log = cli_present("LOG") != CLI$_ABSENT; info.g = NULL; changed_group = 0;/*$** User can specify a list of groups*/? while (OK(cli_get_value("GRPNAM", tmp+6, sizeof(tmp)-6))) { locase(tmp+6); info.didone = 0; info.name = tmp+6;/*;** Find the group that matches, if it's in the tree already*/; lib$traverse_tree(&news_prof.gtree, sub_group, &info);/*E** We used tmp+6 above so we would have room to prefix the group nameI** with the GROUP command to send to the server, just in case we have to.*/ if (!info.didone) { char tmp2[STRING_SIZE];" memcpy(tmp, "GROUP ", 6); server_send(tmp);K server_get_reply(SRV__NOECHO, &reply_code, tmp2, sizeof(tmp2), 0);/*F** If the group is available from the server, but was not in the tree,** we add it in.*// if (reply_code == NNTP__GRPSELECTED) { int junk; g = mem_getgrp();# strcpy(g->grpnam, tmp+6);6 g->seenq.head = g->seenq.tail = &(g->seenq);6 g->killq.head = g->killq.tail = &(g->killq); g->avail = 1; g->subscribed = 1;G parse_group_reply(tmp2, &junk, &(g->frstavl), &(g->lastavl)); Insert_Group(g); info.didone = 1; info.g = g; changed_group = 1; } }/*;** Group did not exist either in the tree or on the server.*/L if (!info.didone) lib$signal(NEWS__NOSUCHGRP, 2, strlen(tmp+6), tmp+6); }8 if (cli_present("GOTO") == CLI$_PRESENT && info.g) { unsigned int status;( status = Set_Current_Group(info.g); if (OK(status)) {> lib$signal(NEWS__GRPSET, 5, strlen(curgroup->grpnam),3 curgroup->grpnam, curgroup->frstavl,: curgroup->lastavl, Count_Unseen(curgroup));& default_action = cmd_readnew; }+ } else if (changed_group && curgroup) {F strcpy(tmp, "GROUP "); /* must keep curgroup & server */J strcat(tmp, curgroup->grpnam); /* in sync, group-wise */ server_send(tmp);9 server_get_reply(SRV__NOECHO, &reply_code, 0, 0, 0); } return SS$_NORMAL;} /* cmd_subscribe */ /***++** ROUTINE: sub_group**** FUNCTIONAL DESCRIPTION:**:** Routine called through LIB$TRAVERSE_TREE to compare a>** newsgroup name to the pattern specified by the user on the>** SUBSCRIBE command. Also prompts for confirmation and logs-** the subscription, if desired by the user.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**3** sub_group(struct GRP *g, struct SUBINFO *info)**-** g: GRP structure, modify, by reference3** info: SUBINFO structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/Dstatic unsigned int sub_group(struct GRP *g, struct SUBINFO *info) {( struct dsc$descriptor cand, pattern;3 INIT_SDESC(cand, strlen(g->grpnam), g->grpnam);8 INIT_SDESC(pattern, strlen(info->name), info->name);. if (OK(str$match_wild(&cand, &pattern))) { info->didone = 1; info->g = g; if (g->subscribed) {E lib$signal(NEWS__ALRDYSUB, 2, strlen(g->grpnam), g->grpnam); } else { if (info->confirm) { char tmp[STRING_SIZE];1 strcpy(tmp, "Subscribe to newsgroup ");! strcat(tmp, g->grpnam); strcat(tmp, "?");- g->subscribed = Yes_Answer(tmp, 1);" } else g->subscribed = 1;* if (info->log && g->subscribed) {D lib$signal(NEWS__DIDSUB, 2, strlen(g->grpnam), g->grpnam); } } } return SS$_NORMAL;} /* sub_group */ /***++** ROUTINE: cmd_unsubscribe**** FUNCTIONAL DESCRIPTION:**** UNSUBSCRIBE comand.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_unsubscribe()**** IMPLICIT INPUTS: news_prof.** ** IMPLICIT OUTPUTS: news_prof.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/ unsigned int cmd_unsubscribe() { char tmp[STRING_SIZE]; struct SUBINFO info;: info.confirm = cli_present("CONFIRM") == CLI$_PRESENT;1 info.log = cli_present("LOG") != CLI$_ABSENT;/ if (cli_present("GRPNAM") == CLI$_ABSENT) { if (curgroup == NULL) {) lib$signal(NEWS__NOCURGROUP, 0); } else { if (info.confirm) {! char tmp2[STRING_SIZE];6 strcpy(tmp2, "Unsubscribe from newsgroup ");) strcat(tmp2, curgroup->grpnam); strcat(tmp2, "?");6 curgroup->subscribed = !Yes_Answer(tmp2, 0); } else {# curgroup->subscribed = 0; } curgroup = NULL; } return SS$_NORMAL; } ; while (OK(cli_get_value("GRPNAM", tmp, sizeof(tmp)))) { locase(tmp);* info.didone = info.really_didone = 0; info.name = tmp;J info.wildcard = strchr(tmp, '*') != NULL || strchr(tmp, '%') != NULL;= lib$traverse_tree(&news_prof.gtree, unsub_group, &info); if (!OK(info.didone)) {: lib$signal(NEWS__NOSUCHGRP, 2, strlen(tmp), tmp);7 } else if (info.wildcard && !info.really_didone) {: lib$signal(NEWS__NOTSUBSCR, 2, strlen(tmp), tmp); } } return SS$_NORMAL;} /* cmd_unsubscribe */ /***++** ROUTINE: unsub_group**** FUNCTIONAL DESCRIPTION:**6** Tree-traversal action routine that unsubscribes a** matching group.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**5** unsub_group(struct GRP *g, struct SUBINFO *info)**-** g: GRP structure, modify, by reference3** info: SUBINFO structure, modify, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/Fstatic unsigned int unsub_group(struct GRP *g, struct SUBINFO *info) {( struct dsc$descriptor cand, pattern;3 INIT_SDESC(cand, strlen(g->grpnam), g->grpnam);8 INIT_SDESC(pattern, strlen(info->name), info->name);. if (OK(str$match_wild(&cand, &pattern))) { info->didone = 1; if (g->subscribed) {! info->really_didone = 1; if (info->confirm) { char tmp[STRING_SIZE];5 strcpy(tmp, "Unsubscribe from newsgroup ");! strcat(tmp, g->grpnam); strcat(tmp, "?");. g->subscribed = !Yes_Answer(tmp, 0);" } else g->subscribed = 0;+ if (info->log && !g->subscribed) {F lib$signal(NEWS__DIDUNSUB, 2, strlen(g->grpnam), g->grpnam); }" } else if (!info->wildcard) {F lib$signal(NEWS__NOTSUBSCR, 2, strlen(g->grpnam), g->grpnam); } } return SS$_NORMAL;} /* unsub_group */ /***++** ROUTINE: cmd_update**** FUNCTIONAL DESCRIPTION:**A** UPDATE/PARTIAL command. Goes through each subscribed group,G** does a GROUP command to the server on it, gets the info on articlesE** back. If it's not the first time we've done a partial update, weI** disconnect and reconnect to the server, since GROUP info doesn't seem9** to get updated on the fly while a connection is open.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_update()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_update() { static int first_time = 1; struct GRP *g; int didone, reply_code; char tmp[STRING_SIZE]; if (!first_time) { server_send("QUIT");7 server_get_reply(SRV__ECHO, &reply_code, 0, 0, 0); server_disconnect();D lib$signal(NEWS__RECONNECTING, 2, strlen(news_cfg.server_name),$ news_cfg.server_name);* server_connect(news_cfg.server_name);7 server_get_reply(SRV__ECHO, &reply_code, 0, 0, 0);; news_cfg.postingok = (reply_code == NNTP__HELOPOSTOK); } first_time = didone = 0; if (news_prof.glist) { struct GRP *g;8 for (g = news_prof.glist; g != NULL; g = g->next) { upd_group(g, &didone); } } else {= lib$traverse_tree(&news_prof.gtree, upd_group, &didone); } if (curgroup != NULL) { strcmp(tmp, "GROUP ");# strcat(tmp, curgroup->grpnam); server_send(tmp);9 server_get_reply(SRV__NOECHO, &reply_code, 0, 0, 0); }( if (didone) lib$put_output(&nulstr); return SS$_NORMAL;} /* cmd_update */ /***++** ROUTINE: upd_group**** FUNCTIONAL DESCRIPTION:**:** Tree traversal action routine that performs the group"** update needed by cmd_update().**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:***** upd_group(struct GRP *g, int *didone)**-** g: GRP structure, modify, by reference-** didone: boolean, write only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/;static unsigned int upd_group(struct GRP *g, int *didone) { char tmp[STRING_SIZE]; int reply_code, artcnt, len; if (g->subscribed) { strcpy(tmp, "GROUP "); strcat(tmp, g->grpnam); server_send(tmp);J server_get_reply(SRV__NOECHO, &reply_code, tmp, sizeof(tmp)-1, &len);+ if (reply_code != NNTP__GRPSELECTED) {B lib$signal(NEWS__UPDERR, 2, strlen(g->grpnam), g->grpnam,3 NEWS__UNEXPRSP, 3, reply_code, len, tmp); } else { int f; tmp[len] = '\0';< parse_group_reply(tmp, &artcnt, &f, &(g->lastavl));8 g->frstavl = (f > g->frstavl ? f : g->frstavl); g->avail = 1; } artcnt = Count_Unseen(g); if (artcnt > 0) {$ struct dsc$descriptor tdsc; short tlen; unsigned int status;/ if (!*didone) lib$put_output(&nulstr);. INIT_SDESC(tdsc, sizeof(tmp)-1, tmp);` status = sys$fao(&newgroup_ctrstr, &tlen, &tdsc, artcnt, strlen(g->grpnam), g->grpnam);" tdsc.dsc$w_length = tlen; lib$put_output(&tdsc); *didone = 1; } } return SS$_NORMAL;} /* upd_group */ /***++** ROUTINE: cmd_update_full**** FUNCTIONAL DESCRIPTION:**5** UPDATE/FULL command. Just calls Do_Full_Update.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_update_full()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** see Do_Full_Update.**** SIDE EFFECTS: None.****--*/ unsigned int cmd_update_full() { return Do_Full_Update(0);} /* cmd_update_full */ /***++** ROUTINE: Do_Full_Update**** FUNCTIONAL DESCRIPTION:**<** Performs a full update by sending a LIST command to theC** server and getting back the list of all active newsgroups, then1** updating the group tree with the information.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** Do_Full_Update(int silent)**(** silent: boolean, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/)unsigned int Do_Full_Update(int silent) {O char tmp[STRING_SIZE]; struct dsc$descriptor tdsc;f struct HDR *h; struct QUE rspq; int reply_code, len;" rspq.head = rspq.tail = &rspq; server_send("LIST");G server_get_reply(SRV__NOECHO, &reply_code, tmp, sizeof(tmp), &len);+ if (reply_code != NNTP__GLISTFOLLOWS) { 9 lib$signal(NEWS__UNEXPRSP, 3, reply_code, len, tmp);n return SS$_NORMAL;1 }9) INIT_SDESC(tdsc, sizeof(tmp)-1, tmp);sA while(server_get_line(tmp, sizeof(tmp), 0) != NEWS__EOLIST) {i struct GRP *grp, *g2; grp = mem_getgrp();7 grp->seenq.head = grp->seenq.tail = &(grp->seenq); 7 grp->killq.head = grp->killq.tail = &(grp->killq);. grp->avail = 1;* if (OK(Parse_List_Reply(tmp, grp))) {& g2 = Find_Group(grp->grpnam); if (g2 != NULL) { g2->avail = 1;D g2->frstavl = (grp->frstavl > g2->frstavl ? grp->frstavl :! g2->frstavl);_% g2->lastavl = grp->lastavl;c+ g2->directpost = grp->directpost;f if (g2->subscribed) {f int artcnt;c( artcnt = Count_Unseen(g2);/*@** If we weren't told to be quiet, build a message to notify the** user of the new articles.*/* if (artcnt > 0 && !silent) { short tlen;# unsigned int status; ? status = sys$fao(&newgroup_ctrstr, &tlen, &tdsc,o; artcnt, strlen(g2->grpnam), g2->grpnam); " *(tmp+tlen) = '\0';& h = mem_gethdr(tlen+1);" h->code = (int) g2; h->len = tlen;# strcpy(h->str, tmp); * queue_insert(h, rspq.tail); }t }n mem_freegrp(grp);u } else {  Insert_Group(grp); if (news_prof.glist) {* news_prof.glast->next = grp;$ news_prof.glast = grp; }g } } else {P mem_freegrp(grp); } }u/*D** Traverse the group tree or group list. If there's a new-articlesH** note on the rspq list that matches the group, spit it out. This way,B** the user gets the notices in the same order she would visit the** newsgroups.*/ if (rspq.head != &rspq) {d lib$put_output(&nulstr);s if (news_prof.glist) {i struct GRP *g;n< for (g = news_prof.glist; g != NULL; g = g->next) {# print_response(g, &rspq); } } else {eD lib$traverse_tree(&news_prof.gtree, print_response, &rspq); }* while (queue_remove(rspq.head, &h)) {* INIT_SDESC(tdsc, h->len, h->str); lib$put_output(&tdsc);* mem_freehdr(h); } lib$put_output(&nulstr);a }* return SS$_NORMAL;} /* Do_Full_Update */ h/***++** ROUTINE: print_response**** FUNCTIONAL DESCRIPTION:d**=** Tree-traversal action routine that prints a new-articlesT+** response matching one of the newgroups.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**4** print_response(struct GRP *g, struct QUE *rspq)**0** g: GRP structure, read only, by reference/** rspq: QUE structure, modify, by referenceI**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:i"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/Estatic unsigned int print_response(struct GRP *g, struct QUE *rspq) { struct HDR *h; struct dsc$descriptor sdsc;S* if (!g->subscribed) return SS$_NORMAL;B for (h = rspq->head; h != (struct HDR *) rspq; h = h->flink) {. if ((struct GRP *) (h->code) == g) break; }O4 if (h == (struct HDR *) rspq) return SS$_NORMAL; queue_remove(h, &h);% INIT_SDESC(sdsc, h->len, h->str);L lib$put_output(&sdsc); mem_freehdr(h); return SS$_NORMAL;}w /***++** ROUTINE: cmd_help**** FUNCTIONAL DESCRIPTION:s**** HELP command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_help()m**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.***** COMPLETION CODES:b/** SS$_NORMAL: Normal successful completion.u**** SIDE EFFECTS: None.****--*/unsigned int cmd_help() { char tmp[STRING_SIZE];/ if (cli_present("TOPIC") == CLI$_PRESENT) {p. cli_get_value("TOPIC", tmp, sizeof(tmp)); } else { tmp[0] = '\0';* }a( put_paged_help(tmp, "NEWSRDR_HELP"); return SS$_NORMAL;} /* cmd_help */ /***++** ROUTINE: cmd_spawn**** FUNCTIONAL DESCRIPTION:t**E** SPAWN command. Works like the one in VMS Mail. On pre-VMS V5.2H** systems, we check to see if the CAPTIVE flag is set for the process.H** If so, we disallow the SPAWN. On V5.2 and later, CAPTIVE is handled ** automatically by the system.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_spawn()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.e**** COMPLETION CODES:e/** SS$_NORMAL: Normal successful completion. **** SIDE EFFECTS: None.****--*/unsigned int cmd_spawn() {+ struct dsc$descriptor cmddsc, *cmddscp;E+ struct dsc$descriptor inpdsc, *inpdscp; + struct dsc$descriptor outdsc, *outdscp; + struct dsc$descriptor pnmdsc, *pnmdscp;tG char cmdstr[STRING_SIZE], inpstr[STRING_SIZE], outstr[STRING_SIZE];; char prcnam[STRING_SIZE]; 4 unsigned int flags, pid, status, image_privs[2]; int nowait;> if (news_prof.captive) {" lib$signal(NEWS__CAPTIVE, 0); return SS$_NORMAL;  }=/*I** Just to make sure, we turn off image privileges again before spawning.i;** Spawned subprocesses inherit the current privilege mask.d*/" sys$setprv(0, 0, image_privs); flags = 0;1 cmddscp = inpdscp = outdscp = pnmdscp = NULL;_; if (OK(cli_get_value("CMD", cmdstr, sizeof(cmdstr)))) { 0 INIT_SDESC(cmddsc, strlen(cmdstr), cmdstr); cmddscp = &cmddsc;S }T= if (OK(cli_get_value("INPUT", inpstr, sizeof(inpstr)))) {,0 INIT_SDESC(inpdsc, strlen(inpstr), inpstr); inpdscp = &inpdsc;u } > if (OK(cli_get_value("OUTPUT", outstr, sizeof(outstr)))) {0 INIT_SDESC(outdsc, strlen(outstr), outstr); outdscp = &outdsc;e }o? if (OK(cli_get_value("PROCESS", prcnam, sizeof(prcnam)))) {n0 INIT_SDESC(pnmdsc, strlen(prcnam), prcnam); pnmdscp = &pnmdsc;_ }, nowait = 0; . if (cli_present("WAIT") == CLI$_NEGATED) { nowait = 1; flags |= CLI$M_NOWAIT;b }H if (cli_present("SYMBOLS") == CLI$_NEGATED) flags |= CLI$M_NOCLISYM;M if (cli_present("LOGICAL_NAME") == CLI$_NEGATED) flags |= CLI$M_NOLOGNAM; ( if (!nowait) Finish_Paged_Output(2);I status = lib$spawn(cmddscp, inpdscp, outdscp, &flags, pnmdscp, &pid); if (!OK(status)) { if (!nowait) {e Pager_Init(1); Check_Connection(); }+ lib$signal(NEWS__SPAWNERR, 0, status);* } else { if (nowait) {- unsigned int jpi_prcnam=JPI$_PRCNAM;f short pnmlen;4 INIT_SDESC(pnmdsc, sizeof(prcnam), prcnam);? lib$getjpi(&jpi_prcnam, &pid, 0, 0, &pnmdsc, &pnmlen);n; lib$signal(NEWS__SPAWNED, 3, pnmlen, prcnam, pid);, } else {  Pager_Init(1);c Check_Connection(); } }c return SS$_NORMAL;} /* cmd_spawn */S C/***++** ROUTINE: cmd_attach>**** FUNCTIONAL DESCRIPTION:(**B** ATTACH command. Attaches to another process in the job tree.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_attach() **** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None. **** COMPLETION CODES:t/** SS$_NORMAL: Normal successful completion.)**** SIDE EFFECTS: None.****--*/unsigned int cmd_attach() {  char tmp[STRING_SIZE]; unsigned int pid, status;l? static unsigned int jpi_pid=JPI$_PID, jpi_owner=JPI$_OWNER;l struct dsc$descriptor sdsc;  if (news_prof.captive) {" lib$signal(NEWS__CAPTIVE, 0); return SS$_NORMAL;N }u0 if (cli_present("PRCNAM") == CLI$_PRESENT) {/ cli_get_value("PRCNAM", tmp, sizeof(tmp));u( INIT_SDESC(sdsc, strlen(tmp), tmp);3 status = lib$getjpi(&jpi_pid, 0, &sdsc, &pid);* if (!OK(status)) {w- lib$signal(NEWS__ATTERR, 0, status); return SS$_NORMAL;* } } else {1 status = lib$getjpi(&jpi_owner, 0, 0, &pid);- if (!OK(status)) {s- lib$signal(NEWS__ATTERR, 0, status);  return SS$_NORMAL;n } if (pid == 0) {' lib$signal(NEWS__NOPARENT, 0);i return SS$_NORMAL;T } }_ Finish_Paged_Output(1);T status = lib$attach(&pid); if (!OK(status)) {) lib$signal(NEWS__ATTERR, 0, status);  }  Pager_Init(0); Check_Connection();Z return SS$_NORMAL;} /* cmd_attach */ w/***++** ROUTINE: cmd_defkeyc**** FUNCTIONAL DESCRIPTION:c**** DEFINE/KEY command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_defkey() **** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None. **** COMPLETION CODES:O/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_defkey() {a char tmp[STRING_SIZE]; unsigned int status; strcpy(tmp, "DEFINE/KEY "); 3 cli_get_value("DKCMD", tmp+11, sizeof(tmp)-11);i* status = Define_Key(tmp, strlen(tmp)); if (!OK(status)) {, lib$signal(NEWS__KEYDEFERR, 0, status); }w return SS$_NORMAL;} /* cmd_defkey */ignal(NEWS__NOTSUBSCR, 2, strlen(tmp), tmp); } } return SS$_NORMAL;} /* cmd_unsubscribe */ /***++** ROUTINE: unsub_group**** FUNCTIONAL DESCRIPTION:**6**  ~NEWSRDR_SRC.BCK/P[NEWSRDR]CMD_READ.C;69Xi*[NEWSRDR]CMD_READ.C;69+,/.i/ @ 4Xif0-P0123KPWOj56v&Ֆ7&Ֆ8I)C9G @HJz/***++** FACILITY: NEWSRDR** ** ABSTRACT:**+** Commands relating to reading articles.**** MODULE DESCRIPTION:**>** This module contains all the READ commands and some other** related commands.**C** All of these routines make extensive use of the module statics** and global variables.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 03-SEP-1992**** MODIFICATION HISTORY:**1** 03-SEP-1992 V1.0 Madison Initial coding.H** 12-SEP-1992 V1.0-1 Madison Support user-specified group ordering.K** 16-SEP-1992 V1.0-2 Madison READ/THREAD wasn't marking articles seen.=** 23-SEP-1992 V1.0-3 Madison Fix EXTRACT's append logic.F** 21-OCT-1992 V1.0-4 Madison Fix looping problem in cmd_readsubj.E** 15-FEB-1993 V1.0-5 Madison Make compatibile with pre-VMS V5.2.J** 15-FEB-1993 V1.1 Madison Add SET [NO]SEE/SUBJ, /CROSS, NOSEE/THR.I** 12-APR-1993 V1.2 Madison Get_Article_* has changed; autoreadnew.D** 14-MAY-1993 V1.2-1 Madison Find_Group_Wild now takes context.C** 31-MAY-1993 V1.2-2 Madison Fix looping bug in cont_readsubj.**--*/#include "newsrdr.h"#include "globals.h"/*** Forward declarations*/G unsigned int cmd_read(void), cmd_readcont(void), cmd_readnew(void);O unsigned int cmd_readnext(void), cmd_readprev(void), cmd_readnextnew(void);B unsigned int cmd_readnextnewgroup(void), cmd_readthread(void);L unsigned int cmd_readsubj(void), cont_readsubj(void), cmd_current(void);K unsigned int cmd_skipthread(void), cmd_skipsubj(void), cmd_group(void);; static unsigned int Find_And_Set_Current_Group(char *);1 unsigned int Set_Current_Group(struct GRP *);# unsigned int cmd_extract(void);' unsigned int Clear_ArtInProg(void);4 static unsigned int Find_Next_Unseen(int, int*);I GLOBAL int cur_artnum = 0; /* Current article number */M GLOBAL int rotate_text = 0; /* ROT13 flag, used in ARTICLE module */N GLOBAL int Read_Full_Headers = 0; /* Header-settings override flag */M EXTERN struct GRP *curgroup; /* Current group */P EXTERN int User_Interrupt; /* User pressed CTRL/C *//*,** Statics for tracking info for READ/THREAD*/ static int thread_base = 0;, static char thread_subject[STRING_SIZE];/ static struct QUE subjq = {&subjq, &subjq};/*D** Context about our current state, for those multiple-action reads.C** We use saved_default_action to track the routine that we started?** with, so when someone uses READ/NEXT/NEW to read an article,D** just pressing return will continue to use READ/NEXT NEW; likewiseD** for READ/NEXT. We need this because routine cmd_readcont is usedA** by all of these commands to handle continuation of the current ** article.*/K static unsigned int (*saved_default_action)() = (unsigned int (*)()) 0;' static unsigned int cur_artctx = 0;' static int Article_In_Progress = 0;" static unsigned int rgctx = 0;/*3** External references, mostly from module ARTICLE.*/F extern unsigned int Retrieve_Article(int, void *, char *, char *);4 extern int Mark_Article_Seen(struct GRP *, int);6 extern int Mark_Article_Unseen(struct GRP *, int);' extern void Mark_Xref(char *, int);2 extern unsigned int Show_Article_Page(void *);1 extern int Ignore_Article(struct GRP *, int);P extern unsigned int Get_Article_Hdrs(struct GRP *, int, void *, int, int *);E extern unsigned int Get_Article_Body(int, char *, char *, int *);/ extern void Rewind_Article(unsigned int *);. extern void Close_Article(unsigned int *);* extern struct GRP *Find_Group(char *);? extern struct GRP *Find_Group_Wild(char *, unsigned int *);G extern unsigned int parse_group_reply(char *, int *, int *, int *);? extern unsigned int Parse_Range(char *, int *, int *, int);5 extern struct GRP *Traverse_Tree(unsigned int *);0 extern void Traverse_Finish(unsigned int *);8 extern struct GRP *Current_TreeNode(unsigned int *);; extern int Next_Unseen_Article(int, int, struct GRP *);* extern int Count_Unseen(struct GRP *);- extern unsigned int Edit_Article(void *); /***++** ROUTINE: cmd_read**** FUNCTIONAL DESCRIPTION:**7** The READ command. Reads an article by its number.;** Also handles READ/FIRST, READ/LAST, and the synonyms for ** those commands (FIRST, LAST).**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_read()**** IMPLICIT INPUTS: Several.**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.****--*/unsigned int cmd_read() { unsigned int status;; char xref_hdr[STRING_SIZE], tmp[STRING_SIZE], verb[32]; int artnum;/*+** READ/SUBJECT is handled by cmd_readsubj.*/F if (cli_present("SUBJECT") == CLI$_PRESENT) return cmd_readsubj(); Clear_ArtInProg();/ if (cli_present("GROUP") == CLI$_PRESENT) {. cli_get_value("GROUP", tmp, sizeof(tmp));. status = Find_And_Set_Current_Group(tmp);( if (!OK(status)) return SS$_NORMAL; } if (curgroup == NULL) {% lib$signal(NEWS__NOCURGROUP, 0); return SS$_NORMAL; }/ cli_get_value("$VERB", verb, sizeof(verb));0 if (cli_present("ARTNUM") == CLI$_PRESENT) {/ cli_get_value("ARTNUM", tmp, sizeof(tmp));+ if (tmp[0] == '.' && tmp[1] == '\0') { if (cur_artnum == 0) {( lib$signal(NEWS__NOCURART, 0); return SS$_NORMAL; } else { artnum = cur_artnum; } } else {9 status = lib$cvt_dtb(strlen(tmp), tmp, &artnum); if (!OK(status)) {. lib$signal(NEWS__CMDERR, 0, status); return SS$_NORMAL; } }& if (artnum < curgroup->frstavl ||' artnum > curgroup->lastavl) {? lib$signal(NEWS__OUTRNG, 3, artnum, curgroup->frstavl,& curgroup->lastavl); return SS$_NORMAL; }H } else if (verb[0] == 'F' || cli_present("FIRST") == CLI$_PRESENT) { artnum = curgroup->frstavl;G } else if (verb[0] == 'L' || cli_present("LAST") == CLI$_PRESENT) { artnum = curgroup->lastavl; } else {$ lib$signal(NEWS__NOARTSPEC, 0); return SS$_NORMAL; } cur_artnum = artnum;" default_action = cmd_readcont;% cleanup_action = Clear_ArtInProg; xref_hdr[0] = '\0';M status = Retrieve_Article(artnum, &cur_artctx, thread_subject, xref_hdr);, Mark_Article_Seen(curgroup, cur_artnum); if (OK(status)) { thread_base = cur_artnum;5 if (xref_hdr[0] != '\0') Mark_Xref(xref_hdr, 0);) saved_default_action = cmd_readnext; Article_In_Progress = 1;- status = Show_Article_Page(&cur_artctx);% if (status == NEWS__EOARTICLE) {' default_action = cmd_readnext;* cleanup_action = Clear_ArtInProg; } } else { Clear_ArtInProg(); } return SS$_NORMAL;} /* cmd_read */ /***++** ROUTINE: cmd_readcont**** FUNCTIONAL DESCRIPTION:**2** Continues paging through the current article.9** At the end of the article, the default action becomes1** the one we saved when we started the article.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_readcont()**** IMPLICIT INPUTS: Several.**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.****--*/unsigned int cmd_readcont() { unsigned int status; if (Article_In_Progress) {- status = Show_Article_Page(&cur_artctx);% if (status == NEWS__EOARTICLE) {/ default_action = saved_default_action;* cleanup_action = Clear_ArtInProg; } } else {# lib$signal(NEWS__NOCURART, 0); } return SS$_NORMAL;} /* cmd_readcont */ /***++** ROUTINE: cmd_readnew**** FUNCTIONAL DESCRIPTION:**4** READ/NEW command. Reads the first new article.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_readnew()**** IMPLICIT INPUTS: Several.**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.****--*/unsigned int cmd_readnew() { unsigned int status; char xref_hdr[STRING_SIZE]; struct GRP *g; Clear_ArtInProg(); if (thread_base != 0) { cur_artnum = thread_base; thread_base = 0; } g = curgroup; while (1) {1 if (!OK(Find_Next_Unseen(0, &cur_artnum))) {$ lib$signal(NEWS__NONEW, 0);B default_action = cleanup_action = (unsigned int (*)()) 0; return SS$_NORMAL; }6 if (!Ignore_Article(curgroup, cur_artnum)) break; } if (g != curgroup) {: lib$signal(NEWS__GRPSET, 5, strlen(curgroup->grpnam),. curgroup->grpnam, curgroup->frstavl,5 curgroup->lastavl, Count_Unseen(curgroup));" if (!news_prof.autoreadnew) {& default_action = cmd_readnew; cleanup_action = 0; cur_artnum = 0; return SS$_NORMAL; } }" default_action = cmd_readcont;% cleanup_action = Clear_ArtInProg; xref_hdr[0] = '\0';Q status = Retrieve_Article(cur_artnum, &cur_artctx, thread_subject, xref_hdr);, Mark_Article_Seen(curgroup, cur_artnum); if (OK(status)) { thread_base = cur_artnum;5 if (xref_hdr[0] != '\0') Mark_Xref(xref_hdr, 0); Article_In_Progress = 1;, saved_default_action = cmd_readnextnew;- status = Show_Article_Page(&cur_artctx);% if (status == NEWS__EOARTICLE) {* default_action = cmd_readnextnew;* cleanup_action = Clear_ArtInProg; } } return SS$_NORMAL;} /* cmd_readnew */ /***++** ROUTINE: cmd_readnext**** FUNCTIONAL DESCRIPTION:**** The READ/NEXT command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_readnext()**** IMPLICIT INPUTS: Several.**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.****--*/unsigned int cmd_readnext() { char xref_hdr[STRING_SIZE]; unsigned int status; Clear_ArtInProg(); if (curgroup == NULL) {% lib$signal(NEWS__NOCURGROUP, 0); return SS$_NORMAL; } if (thread_base != 0) { cur_artnum = thread_base; thread_base = 0; } while (1) {+ if (cur_artnum >= curgroup->lastavl) {% lib$signal(NEWS__NOMORE, 0); return SS$_NORMAL; }* if (cur_artnum < curgroup->frstavl) {( cur_artnum = curgroup->frstavl; } else { cur_artnum += 1; }6 if (!Ignore_Article(curgroup, cur_artnum)) break; }" default_action = cmd_readcont;% cleanup_action = Clear_ArtInProg; xref_hdr[0] = '\0';Q status = Retrieve_Article(cur_artnum, &cur_artctx, thread_subject, xref_hdr);, Mark_Article_Seen(curgroup, cur_artnum); if (OK(status)) { thread_base = cur_artnum;5 if (xref_hdr[0] != '\0') Mark_Xref(xref_hdr, 0); Article_In_Progress = 1;) saved_default_action = cmd_readnext;- status = Show_Article_Page(&cur_artctx);% if (status == NEWS__EOARTICLE) {' default_action = cmd_readnext;* cleanup_action = Clear_ArtInProg; } } return SS$_NORMAL;} /* cmd_readnext */ /***++** ROUTINE: cmd_readprev**** FUNCTIONAL DESCRIPTION:**** The READ/PREVIOUS command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_readprev()**** IMPLICIT INPUTS: Several.**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.****--*/unsigned int cmd_readprev() { char xref_hdr[STRING_SIZE]; unsigned int status; Clear_ArtInProg(); if (curgroup == NULL) {% lib$signal(NEWS__NOCURGROUP, 0); return SS$_NORMAL; } if (thread_base != 0) { cur_artnum = thread_base; thread_base = 0; } while (1) {+ if (cur_artnum <= curgroup->frstavl) {% lib$signal(NEWS__NOMORE, 0); return SS$_NORMAL; }* if (cur_artnum > curgroup->lastavl) {( cur_artnum = curgroup->lastavl; } else { cur_artnum -= 1; }6 if (!Ignore_Article(curgroup, cur_artnum)) break; }" default_action = cmd_readcont;% cleanup_action = Clear_ArtInProg; xref_hdr[0] = '\0';Q status = Retrieve_Article(cur_artnum, &cur_artctx, thread_subject, xref_hdr);, Mark_Article_Seen(curgroup, cur_artnum); if (OK(status)) { thread_base = cur_artnum;5 if (xref_hdr[0] != '\0') Mark_Xref(xref_hdr, 0); Article_In_Progress = 1;) saved_default_action = cmd_readprev;- status = Show_Article_Page(&cur_artctx);% if (status == NEWS__EOARTICLE) {' default_action = cmd_readprev;* cleanup_action = Clear_ArtInProg; } } return SS$_NORMAL;} /* cmd_readprev */ /***++** ROUTINE: cmd_readnextnew**** FUNCTIONAL DESCRIPTION:**** The READ/NEXT/NEW command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_readnextnew()**** IMPLICIT INPUTS: Several.**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.****--*/ unsigned int cmd_readnextnew() { struct GRP *g, *cyclepoint; char xref_hdr[STRING_SIZE]; unsigned int status; Clear_ArtInProg(); if (thread_base != 0) { cur_artnum = thread_base; thread_base = 0; } g = curgroup; while (1) {: if (!OK(Find_Next_Unseen(cur_artnum, &cur_artnum))) {$ lib$signal(NEWS__NONEW, 0); return SS$_NORMAL; }9 if (!Ignore_Article(curgroup, cur_artnum)) break;  }0 if ((g != curgroup) && (curgroup != NULL)) { if (g != NULL) {C lib$signal(NEWS__EOGROUP, 2, strlen(g->grpnam), g->grpnam,4 NEWS__GRPSET, 5, strlen(curgroup->grpnam),. curgroup->grpnam, curgroup->frstavl,5 curgroup->lastavl, Count_Unseen(curgroup)); } else {? lib$signal(NEWS__GRPSET, 5, strlen(curgroup->grpnam),. curgroup->grpnam, curgroup->frstavl,5 curgroup->lastavl, Count_Unseen(curgroup)); }" if (!news_prof.autoreadnew) {* default_action = cmd_readnextnew; cleanup_action = 0; cur_artnum = 0; return SS$_NORMAL; } }" default_action = cmd_readcont;% cleanup_action = Clear_ArtInProg; xref_hdr[0] = '\0';Q status = Retrieve_Article(cur_artnum, &cur_artctx, thread_subject, xref_hdr);, Mark_Article_Seen(curgroup, cur_artnum); if (OK(status)) { thread_base = cur_artnum;5 if (xref_hdr[0] != '\0') Mark_Xref(xref_hdr, 0); Article_In_Progress = 1;, saved_default_action = cmd_readnextnew;- status = Show_Article_Page(&cur_artctx);% if (status == NEWS__EOARTICLE) {* default_action = cmd_readnextnew;* cleanup_action = Clear_ArtInProg; } } return SS$_NORMAL;} /* cmd_readnextnew */ /***++!** ROUTINE: cmd_readnextnewgroup**** FUNCTIONAL DESCRIPTION:**:** The READ/NEXT/NEW/GROUP command. Skips to next group$** before looking for new articles.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_readnextnewgroup()D**** IMPLICIT INPUTS: Several.m**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:N.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several. ****--*/%unsigned int cmd_readnextnewgroup() {s struct GRP *g, *cyclepoint;  char xref_hdr[STRING_SIZE];U unsigned int status;3 if (curgroup == NULL) return cmd_readnextnew(); Clear_ArtInProg(); if (thread_base != 0) {D cur_artnum = thread_base; thread_base = 0; }- g = curgroup;s# cur_artnum = curgroup->lastavl;2 while (1) { : if (!OK(Find_Next_Unseen(cur_artnum, &cur_artnum))) {$ lib$signal(NEWS__NONEW, 0); return SS$_NORMAL;E } if (curgroup == g) {'$ lib$signal(NEWS__NONEW, 0); return SS$_NORMAL;b }9 if (!Ignore_Article(curgroup, cur_artnum)) break; i }t0 if ((g != curgroup) && (curgroup != NULL)) { if (g != NULL) { C lib$signal(NEWS__EOGROUP, 2, strlen(g->grpnam), g->grpnam,a4 NEWS__GRPSET, 5, strlen(curgroup->grpnam),. curgroup->grpnam, curgroup->frstavl,5 curgroup->lastavl, Count_Unseen(curgroup));d } else {/> lib$signal(NEWS__GRPSET, 5, strlen(curgroup->grpnam),. curgroup->grpnam, curgroup->frstavl,5 curgroup->lastavl, Count_Unseen(curgroup));n }" if (!news_prof.autoreadnew) {- default_action = cmd_readnextnew;d cleanup_action = 0; cur_artnum = 0; return SS$_NORMAL;c } }i" default_action = cmd_readcont;% cleanup_action = Clear_ArtInProg;o xref_hdr[0] = '\0'; Q status = Retrieve_Article(cur_artnum, &cur_artctx, thread_subject, xref_hdr);r, Mark_Article_Seen(curgroup, cur_artnum); if (OK(status)) {  thread_base = cur_artnum;5 if (xref_hdr[0] != '\0') Mark_Xref(xref_hdr, 0);* Article_In_Progress = 1; , saved_default_action = cmd_readnextnew;- status = Show_Article_Page(&cur_artctx);1% if (status == NEWS__EOARTICLE) { * default_action = cmd_readnextnew;* cleanup_action = Clear_ArtInProg; } }r return SS$_NORMAL;} /* cmd_readnextnewgroup */ N/***++** ROUTINE: cmd_readthreadr**** FUNCTIONAL DESCRIPTION:**5** The READ/THREAD command. Finds the next articletB** with subject "matching" the thread base's subject. The threadB** base is established by reading an article with a command other** than READ/THREAD.s**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_readthread()s**** IMPLICIT INPUTS: Several.o**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:e.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.o****--*/unsigned int cmd_readthread() {l struct GRP *g;9 char tmp[STRING_SIZE], xref_hdr[STRING_SIZE], *tsubj;_ struct HDR *hdr; struct QUE *hdrqptr; unsigned int status; int thread_newonly;i Clear_ArtInProg(); if (curgroup == NULL) {g% lib$signal(NEWS__NOCURGROUP, 0);  return SS$_NORMAL;E } if (thread_base == 0) {e# lib$signal(NEWS__NOTHREAD, 0);* return SS$_NORMAL;r }e$ if (thread_subject[0] == '\0') {$ lib$signal(NEWS__NOSUBJECT, 0); return SS$_NORMAL;X }r8 thread_newonly = cli_present("NEW") == CLI$_PRESENT; while (1) {IL if (thread_newonly) cur_artnum = Next_Unseen_Article(cur_artnum, 0, 0);> if (cur_artnum == 0 || cur_artnum >= curgroup->lastavl) {% lib$signal(NEWS__NOMORE, 0);n" cur_artnum = thread_base; thread_base = 0;x* default_action = cmd_readnextnew;1 cleanup_action = (unsigned int (*)()) 0;n return SS$_NORMAL;c }* if (cur_artnum < curgroup->frstavl) {( cur_artnum = curgroup->frstavl; } else {u. if (!thread_newonly) cur_artnum += 1; }6 if (!Ignore_Article(curgroup, cur_artnum)) break; }i while (1) {n if (User_Interrupt) break;RF if (OK(Get_Article_Hdrs(curgroup, cur_artnum, &hdrqptr, 1, 0))) { hdr = hdrqptr->head; 0 while (hdr != (struct HDR *) hdrqptr) {0 if (hdr->code == NEWS_K_HDR_SUBJECT) {$ strcpy(tmp, hdr->str); upcase(tmp);. if (strstr(tmp, "RE:") == tmp) {= for (tsubj = tmp+3; isspace(*tsubj); tsubj++);  } else { tsubj = tmp;N }n break; }l hdr = hdr->flink;* }N if (strstr(tsubj, thread_subject) || strstr(thread_subject, tsubj)) { xref_hdr[0] = '\0';$L status = Retrieve_Article(cur_artnum, &cur_artctx, tmp, xref_hdr);2 Mark_Article_Seen(curgroup, cur_artnum); if (OK(status)) {_, default_action = cmd_readcont;/ cleanup_action = Clear_ArtInProg;l> if (xref_hdr[0] != '\0') Mark_Xref(xref_hdr, 0);& Article_In_Progress = 1;4 saved_default_action = cmd_readthread;6 status = Show_Article_Page(&cur_artctx);. if (status == NEWS__EOARTICLE) {/ default_action = cmd_readthread;;0 cleanup_action = Clear_ArtInProg; }U break; }L } } while (1) { if (thread_newonly) {= cur_artnum = Next_Unseen_Article(cur_artnum, 0, 0);R } else {t cur_artnum += 1; }F if (cur_artnum == 0 || cur_artnum > curgroup->lastavl) break;: if (!Ignore_Article(curgroup, cur_artnum)) break; }B if (cur_artnum == 0 || cur_artnum > curgroup->lastavl) break; } < if (cur_artnum == 0 || cur_artnum > curgroup->lastavl) {! lib$signal(NEWS__NOMORE, 0);C cur_artnum = thread_base; thread_base = 0; & default_action = cmd_readnextnew;- cleanup_action = (unsigned int (*)()) 0;a } return SS$_NORMAL;} /* cmd_readthread */ f/***++** ROUTINE: cmd_readsubj-**** FUNCTIONAL DESCRIPTION:O**** The READ/SUBJECT command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_readsubj() **** IMPLICIT INPUTS: Several.E**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:b.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.a****--*/unsigned int cmd_readsubj() {  struct GRP *g;9 char xref_hdr[STRING_SIZE], tmp[STRING_SIZE], *tsubj;i struct HDR *hdr, *shdr;t struct QUE *hdrqptr;% struct dsc$descriptor tdsc, sdsc;u unsigned int status; int doit;t Clear_ArtInProg();= if (OK(cli_get_value("SUBJECT", tmp+1, sizeof(tmp)-1))) {d= while (queue_remove(subjq.head, &hdr)) mem_freehdr(hdr); do {u upcase(tmp+1);r: if (!strchr(tmp+1, '*') && !strchr(tmp+1, '%')) { tmp[0] = '*';d" tsubj = tmp+strlen(tmp); *tsubj++ = '*';  *tsubj = '\0'; tsubj = tmp; } else { tsubj = tmp+1; }T- insert_header(tsubj, subjq.tail, 0);IC } while (OK(cli_get_value("SUBJECT", tmp+1, sizeof(tmp)-1)));t }o if (subjq.head == &subjq) {e% lib$signal(NEWS__NOSUBJSPEC, 0);a return SS$_NORMAL;* }N/ if (cli_present("GROUP") == CLI$_PRESENT) {v. cli_get_value("GROUP", tmp, sizeof(tmp));. status = Find_And_Set_Current_Group(tmp); if (!OK(status)) {.A while (queue_remove(subjq.head, &hdr)) mem_freehdr(hdr);o return SS$_NORMAL;S } l cur_artnum = 0; }t if (curgroup == NULL) {n% lib$signal(NEWS__NOCURGROUP, 0);o= while (queue_remove(subjq.head, &hdr)) mem_freehdr(hdr);i return SS$_NORMAL;C }  xref_hdr[0] = '\0';a do {* if (cur_artnum < curgroup->frstavl) {( cur_artnum = curgroup->frstavl; } else {O cur_artnum += 1;  }6 if (!Ignore_Article(curgroup, cur_artnum)) break;. } while (cur_artnum <= curgroup->lastavl);- while (cur_artnum <= curgroup->lastavl) { F if (OK(Get_Article_Hdrs(curgroup, cur_artnum, &hdrqptr, 1, 0))) {A for (hdr = hdrqptr->head; hdr != (struct HDR *) hdrqptr;M& hdr = hdr->flink) {0 if (hdr->code == NEWS_K_HDR_SUBJECT) {$ strcpy(tmp, hdr->str); upcase(tmp);. if (strstr(tmp, "RE:") == tmp) {= for (tsubj = tmp+3; isspace(*tsubj); tsubj++);I } else { tsubj = tmp;( }d break; }h } doit = 0;0 INIT_SDESC(tdsc, strlen(tsubj), tsubj);V for (shdr = subjq.head; shdr != (struct HDR * ) &subjq; shdr = shdr->flink) {9 INIT_SDESC(sdsc, strlen(shdr->str), shdr->str);(1 if (OK(str$match_wild(&tdsc, &sdsc))) {  doit = 1;r break; } } if (doit) {L status = Retrieve_Article(cur_artnum, &cur_artctx, tmp, xref_hdr);2 Mark_Article_Seen(curgroup, cur_artnum); if (OK(status)) {i, default_action = cmd_readcont;/ cleanup_action = Clear_ArtInProg; > if (xref_hdr[0] != '\0') Mark_Xref(xref_hdr, 0);& Article_In_Progress = 1;3 saved_default_action = cont_readsubj; 6 status = Show_Article_Page(&cur_artctx);. if (status == NEWS__EOARTICLE) {. default_action = cont_readsubj;0 cleanup_action = Clear_ArtInProg; }e break; }r } } while (1) { cur_artnum++;3 if (cur_artnum > curgroup->lastavl) break;(: if (!Ignore_Article(curgroup, cur_artnum)) break; } }o) if (cur_artnum > curgroup->lastavl) { & lib$signal(NEWS__NOMOREMATCH, 0);= while (queue_remove(subjq.head, &hdr)) mem_freehdr(hdr);  cur_artnum = thread_base; thread_base = 0;& default_action = cmd_readnextnew;- cleanup_action = (unsigned int (*)()) 0;r }y return SS$_NORMAL;} /* cmd_readsubj */ (/***++** ROUTINE: cont_readsubj**** FUNCTIONAL DESCRIPTION:a**>** The continuation of a subject-based read (when invoked as** a default_action).**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cont_readsubj()**** IMPLICIT INPUTS: Several.(**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:O.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.r****--*/unsigned int cont_readsubj() { struct GRP *g;9 char xref_hdr[STRING_SIZE], tmp[STRING_SIZE], *tsubj;  struct HDR *hdr, *shdr;) struct QUE *hdrqptr;% struct dsc$descriptor tdsc, sdsc;  unsigned int status; int doit;  Clear_ArtInProg(); if (subjq.head == &subjq) {% lib$signal(NEWS__NOSUBJSPEC, 0);r return SS$_NORMAL; } if (curgroup == NULL) {c% lib$signal(NEWS__NOCURGROUP, 0);r= while (queue_remove(subjq.head, &hdr)) mem_freehdr(hdr);u return SS$_NORMAL;r }  xref_hdr[0] = '\0';A while (1) {o+ if (cur_artnum >= curgroup->lastavl) { * lib$signal(NEWS__NOMOREMATCH, 0);A while (queue_remove(subjq.head, &hdr)) mem_freehdr(hdr);1" cur_artnum = thread_base; thread_base = 0;h* default_action = cmd_readnextnew;1 cleanup_action = (unsigned int (*)()) 0;  return SS$_NORMAL;e }* if (cur_artnum < curgroup->frstavl) {( cur_artnum = curgroup->frstavl; } else { cur_artnum += 1; }6 if (!Ignore_Article(curgroup, cur_artnum)) break; }- while (cur_artnum <= curgroup->lastavl) { F if (OK(Get_Article_Hdrs(curgroup, cur_artnum, &hdrqptr, 1, 0))) {A for (hdr = hdrqptr->head; hdr != (struct HDR *) hdrqptr;& hdr = hdr->flink) {0 if (hdr->code == NEWS_K_HDR_SUBJECT) {$ strcpy(tmp, hdr->str); upcase(tmp);. if (strstr(tmp, "RE:") == tmp) {= for (tsubj = tmp+3; isspace(*tsubj); tsubj++);U } else { tsubj = tmp;r } break; }0 } doit = 0;V for (shdr = subjq.head; shdr != (struct HDR * ) &subjq; shdr = shdr->flink) {1 INIT_SDESC(tdsc, strlen(tsubj), tsubj);9 INIT_SDESC(sdsc, strlen(shdr->str), shdr->str);u1 if (OK(str$match_wild(&tdsc, &sdsc))) {g doit = 1;s break; } } if (doit) {L status = Retrieve_Article(cur_artnum, &cur_artctx, tmp, xref_hdr);2 Mark_Article_Seen(curgroup, cur_artnum); if (OK(status)) {v, default_action = cmd_readcont;/ cleanup_action = Clear_ArtInProg; > if (xref_hdr[0] != '\0') Mark_Xref(xref_hdr, 0);& Article_In_Progress = 1;3 saved_default_action = cont_readsubj;6 status = Show_Article_Page(&cur_artctx);. if (status == NEWS__EOARTICLE) {. default_action = cont_readsubj;0 cleanup_action = Clear_ArtInProg; }  break; }A } } while (1) { cur_artnum++;3 if (cur_artnum > curgroup->lastavl) break;e: if (!Ignore_Article(curgroup, cur_artnum)) break; } }r) if (cur_artnum > curgroup->lastavl) {*& lib$signal(NEWS__NOMOREMATCH, 0);= while (queue_remove(subjq.head, &hdr)) mem_freehdr(hdr);O cur_artnum = thread_base; thread_base = 0;o& default_action = cmd_readnextnew;- cleanup_action = (unsigned int (*)()) 0;w } return SS$_NORMAL;} /* cont_readsubj */[ I/***++** ROUTINE: cmd_current**** FUNCTIONAL DESCRIPTION:f**2** The CURRENT command. Re-displays the current ** article.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_current()**** IMPLICIT INPUTS: Several.0**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:c.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.!****--*/unsigned int cmd_current() {  ~NEWSRDR_SRC.BCK/P[NEWSRDR]CMD_READ.C;69XiG]R>unsigned int status; char tmp[STRING_SIZE]; if (curgroup == NULL) {,% lib$signal(NEWS__NOCURGROUP, 0);u! } else if (cur_artnum == 0) {# lib$signal(NEWS__NOCURART, 0);s } else {E Read_Full_Headers = cli_present("FULL_HEADERS") == CLI$_PRESENT;u9 rotate_text = cli_present("ROTATE") == CLI$_PRESENT;, if (cur_artctx == 0) {,K status = Retrieve_Article(cur_artnum, &cur_artctx, thread_subject,  tmp); } else { % Rewind_Article(&cur_artctx);a status = SS$_NORMAL;_ } if (OK(status)) {" thread_base = cur_artnum;! Article_In_Progress = 1; 3 if (cli_present("EDIT") == CLI$_PRESENT) {(- status = Edit_Article(&cur_artctx);d0 default_action = saved_default_action; } else {)2 status = Show_Article_Page(&cur_artctx);8 default_action = (status == NEWS__EOARTICLE) ?2 saved_default_action : cmd_readcont; }* cleanup_action = Clear_ArtInProg; } else {u Clear_ArtInProg();  } }t return SS$_NORMAL;} /* cmd_current */  a/***++** ROUTINE: cmd_skipthreadu**** FUNCTIONAL DESCRIPTION:x**!** The SET SEEN/THREAD command.d**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_skipthread()***** IMPLICIT INPUTS: Several.**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:y.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.T****--*/unsigned int cmd_skipthread() {. struct GRP *g;" char tmp[STRING_SIZE], *tsubj; struct HDR *hdr, *xhdr;I struct QUE *hdrqptr; unsigned int status;( int count, artnum, unsee, mark_xref; Clear_ArtInProg(); if (curgroup == NULL) {% lib$signal(NEWS__NOCURGROUP, 0);g return SS$_NORMAL;r }n if (thread_base == 0) {(# lib$signal(NEWS__NOTHREAD, 0);  return SS$_NORMAL;; }t$ if (thread_subject[0] == '\0') {$ lib$signal(NEWS__NOSUBJECT, 0); return SS$_NORMAL;  }i4 unsee = (cli_present("SEEN") == CLI$_NEGATED) ||1 (cli_present("UNSEEN") == CLI$_PRESENT); B mark_xref = (cli_present("CROSS_REFERENCES") == CLI$_PRESENT); count = 0;T for (artnum = (cur_artnum < curgroup->frstavl ? curgroup->frstavl : cur_artnum);1 artnum <= curgroup->lastavl; artnum++) {g if (User_Interrupt) break;U- if (!Ignore_Article(curgroup, artnum)) {tF if (OK(Get_Article_Hdrs(curgroup, artnum, &hdrqptr, 1, 0))) { xhdr = NULL; tsubj = NULL;> hdr = hdrqptr->head;1 while (hdr != (struct HDR *) hdrqptr) { 4 if (hdr->code == NEWS_K_HDR_SUBJECT) {% strcpy(tmp, hdr->str);g upcase(tmp);gE if (tmp[0] == 'R' && tmp[1] == 'E' && tmp[2] == ':') {uA for (tsubj = tmp+3; isspace(*tsubj); tsubj++);  } else {  tsubj = tmp;r }' if (xhdr != NULL) break;c } else { xhdr = hdr;( if (tsubj != NULL) break; }u hdr = hdr->flink;j })& if (tsubj == NULL) continue;. if (strstr(tsubj, thread_subject) ||8 strstr(thread_subject, tsubj)) {G count += (unsee ? Mark_Article_Unseen(curgroup, artnum) :m9 Mark_Article_Seen(curgroup, artnum));)A if (mark_xref && xhdr) Mark_Xref(xhdr->str, unsee); }t } } }o* lib$signal(NEWS__MARKCOUNT, 1, count); return SS$_NORMAL;} /* cmd_skipthread */ */***++** ROUTINE: cmd_skipsubj**** FUNCTIONAL DESCRIPTION:**"** The SET SEEN/SUBJECT command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_skipsubj()a**** IMPLICIT INPUTS: Several.r**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES: .** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.*****--*/unsigned int cmd_skipsubj() {L struct GRP *g; char tmp[STRING_SIZE], *cp; % struct HDR *hdr, *subjhdr, *xhdr;i struct QUE tmpq, *hdrqptr;% struct dsc$descriptor tdsc, sdsc;r unsigned int status;( int count, artnum, unsee, mark_xref; int rstart, rend;u Clear_ArtInProg(); if (curgroup == NULL) { % lib$signal(NEWS__NOCURGROUP, 0);n return SS$_NORMAL;I };" tmpq.head = tmpq.tail = &tmpq;= if (OK(cli_get_value("SUBJECT", tmp+1, sizeof(tmp)-1))) { do {h upcase(tmp+1);l: if (!strchr(tmp+1, '*') && !strchr(tmp+1, '%')) { tmp[0] = '*';e! cp = tmp + strlen(tmp);E *cp++ = '\0';r cp = tmp;  } else {n cp = tmp+1;E }) insert_header(cp, tmpq.tail, 0);aB } while (OK(cli_get_value("SUBJECT", tmp+1, sizeof(tmp)-1))); }r if (tmpq.head == &tmp) {% lib$signal(NEWS__NOSUBJSPEC, 0);( return SS$_NORMAL;  }a4 unsee = (cli_present("SEEN") == CLI$_NEGATED) ||1 (cli_present("UNSEEN") == CLI$_PRESENT);nB mark_xref = (cli_present("CROSS_REFERENCES") == CLI$_PRESENT); count = 0;/*M** Must be able to handle just SET SEEN/SUBJ (implies current->last article)s(** and specification of article ranges.*/ while (1) {1 if (cli_present("ARTRNG") == CLI$_PRESENT) {;C if (!OK(cli_get_value("ARTRNG", tmp, sizeof(tmp)))) break; A if (!OK(Parse_Range(tmp, &rstart, &rend, cur_artnum))) {{; lib$signal(NEWS__INVARTRNG, 2, strlen(tmp), tmp);u } else {{ int i; if (rstart > rend) { i = rstart;  rstart = rend; rend = i;f } }@ if (rend > curgroup->lastavl) rend = curgroup->lastavl; } else {  rstart = cur_artnum;j" rend = curgroup->lastavl; }M for (artnum = (rstart < curgroup->frstavl ? curgroup->frstavl : rstart);(9 artnum <= rend; artnum++) {# if (User_Interrupt) break; 1 if (!Ignore_Article(curgroup, artnum)) {tG if (OK(Get_Article_Hdrs(curgroup, artnum, &hdrqptr, 1, 0))) { " hdr = hdrqptr->head; xhdr = NULL; subjhdr = NULL;_5 while (hdr != (struct HDR *) hdrqptr) {05 if (hdr->code == NEWS_K_HDR_SUBJECT) {l! subjhdr = hdr;a+ if (xhdr != NULL) break; 9 } else if (hdr->code == NEWS_K_HDR_XREF) {  xhdr = hdr;. if (subjhdr != NULL) break; } hdr = hdr->flink; }U, if (subjhdr == NULL) continue;C INIT_SDESC(tdsc, strlen(subjhdr->str), subjhdr->str); T for (hdr = tmpq.head; hdr != (struct HDR *) &tmpq; hdr = hdr->flink) {< INIT_SDESC(sdsc, strlen(hdr->str), hdr->str);6 if (OK(str$match_wild(&tdsc, &sdsc))) {L count += (unsee ? Mark_Article_Unseen(curgroup, artnum) := Mark_Article_Seen(curgroup, artnum));_F if (xhdr && mark_xref) Mark_Xref(xhdr->str, unsee); break;u } }= }f } }6 if (cli_present("ARTRNG") != CLI$_PRESENT) break; }; while (queue_remove(tmpq.head, &hdr)) mem_freehdr(hdr);+* lib$signal(NEWS__MARKCOUNT, 1, count); return SS$_NORMAL;} /* cmd_skipsubj */ ./***++** ROUTINE: cmd_group**** FUNCTIONAL DESCRIPTION:v**** The GROUP command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_group()**** IMPLICIT INPUTS: Several.c**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:-.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.G****--*/unsigned int cmd_group() { char tmp[STRING_SIZE]; unsigned int status;. cli_get_value("GRPNAM", tmp, sizeof(tmp));- status = Find_And_Set_Current_Group(tmp);(1 if (OK(status)) default_action = cmd_readnew;z return status;} /* cmd_group */s q/***++'** ROUTINE: Find_And_Set_Current_Group **** FUNCTIONAL DESCRIPTION:!**<** Actually does the real work of a GROUP command... well,** at least the lookup part.l**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**-** Find_And_Set_Current_Group(char *grpnam) **<** grpnam: character string, read only, by reference (ASCIZ)**** IMPLICIT INPUTS: Several.1**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:e.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.f****--*/>static unsigned int Find_And_Set_Current_Group(char *grpnam) { struct GRP *g; char tmp[STRING_SIZE]; unsigned int status, ctx;) locase(grpnam);u g = Find_Group(grpnam);  if (g == NULL) { strcpy(tmp, grpnam);J if (strchr(tmp, '*') == 0 && strchr(tmp, '%') == 0) strcat(tmp, "*"); ctx = 0;E4 while ((g = Find_Group_Wild(tmp, &ctx)) != 0) { if (g->subscribed) { Traverse_Finish(&ctx); break; } } }  if (g == NULL) {G lib$signal((status = NEWS__NOSUCHGRP), 2, strlen(grpnam), grpnam); } else if (!g->subscribed) {G lib$signal((status = NEWS__NOTSUBSCR), 2, strlen(grpnam), grpnam);a } else {# status = Set_Current_Group(g);u# if (news_prof.glist == NULL) {O- if (g != Current_TreeNode(&rgctx)) {t struct GRP *gtmp;d" Traverse_Finish(&rgctx);6 while ((gtmp = Traverse_Tree(&rgctx)) != g); } }: lib$signal(NEWS__GRPSET, 5, strlen(curgroup->grpnam),. curgroup->grpnam, curgroup->frstavl,5 curgroup->lastavl, Count_Unseen(curgroup));( }  return SS$_NORMAL;"} /* Find_And_Set_Current_Group */ /***++** ROUTINE: Set_Current_Group**** FUNCTIONAL DESCRIPTION:**'** Makes a group the "current" group.I**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**'** Set_Current_Group(struct GRP *grp)N**+** grp: GRP structure, modify, by reference **** IMPLICIT INPUTS: Several.,**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES: .** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.u****--*/1unsigned int Set_Current_Group(struct GRP *grp) {e char tmp[STRING_SIZE];' int artcnt, reply_code, first, len;e cur_artnum = 0;c+ if (curgroup == grp) return SS$_NORMAL;t curgroup = grp;  strcpy(tmp, "GROUP "); strcat(tmp, grp->grpnam);  server_send(tmp); I server_get_reply(SRV__NOECHO, &reply_code, tmp, sizeof(tmp)-1, &len);t* if (reply_code != NNTP__GRPSELECTED) {9 lib$signal(NEWS__UNEXPRSP, 3, reply_code, len, tmp);d return NEWS__UNEXPRSP;; }  tmp[len] = '\0';; parse_group_reply(tmp, &artcnt, &first, &grp->lastavl); A grp->frstavl = (first > grp->frstavl) ? first : grp->frstavl;t return SS$_NORMAL;} /* Set_Current_Group */e (/***++** ROUTINE: cmd_extract**** FUNCTIONAL DESCRIPTION:**** The EXTRACT command.>**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_extract()**** IMPLICIT INPUTS: Several.d**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:e.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.R****--*/unsigned int cmd_extract() {C char fspec[FSPEC_SIZE], rspec[FSPEC_SIZE], tmpfile[FSPEC_SIZE];T- char tmp[STRING_SIZE], tmp2[STRING_SIZE];n% struct dsc$descriptor dsc1, dsc2;* struct QUE rangeq, *hdrq;  struct RNG *rng; struct HDR *hdr;C int rstart, rend, did_one, do_headers, rotate, append, i, tlen;(% unsigned int unit, unit2, status;*7 $DESCRIPTOR(underscores, "______________________");s9 $DESCRIPTOR(specials, "!\"#%&'()*+,/@[\\]^{|}~.");-R $DESCRIPTOR(alphabet, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");R $DESCRIPTOR(rot13bet, "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"); if (curgroup == NULL) {o% lib$signal(NEWS__NOCURGROUP, 0);; return SS$_NORMAL;l }I/ if (cli_present("FSPEC") == CLI$_PRESENT) { 2 cli_get_value("FSPEC", fspec, sizeof(fspec));4 append = cli_present("APPEND") == CLI$_PRESENT; } else {7 INIT_SDESC(dsc1, strlen(curgroup->grpnam), fspec);,B INIT_SDESC(dsc2, strlen(curgroup->grpnam), curgroup->grpnam);: str$translate(&dsc1, &dsc2, &underscores, &specials);4 strcpy(fspec+strlen(curgroup->grpnam), ".TXT");4 append = cli_present("APPEND") != CLI$_NEGATED; })( rangeq.head = rangeq.tail = &rangeq;8 do_headers = cli_present("HEADERS") != CLI$_NEGATED;3 rotate = cli_present("ROTATE") == CLI$_PRESENT; 0 if (cli_present("ARTRNG") == CLI$_PRESENT) {< while (OK(cli_get_value("ARTRNG", tmp, sizeof(tmp)))) {A if (!OK(Parse_Range(tmp, &rstart, &rend, cur_artnum))) {a> lib$signal(NEWS__INVARTRNG, 1, 2, strlen(tmp), tmp);C while (queue_remove(rangeq.head, &rng)) mem_freerng(rng);  return SS$_NORMAL; } if (rstart > rend) { int i = rstart;- rstart = rend; rend = i; }D if (rend > curgroup->lastavl || rend < curgroup->frstavl) {> lib$signal(NEWS__OUTRNG, 3, rend, curgroup->frstavl,& curgroup->lastavl);C while (queue_remove(rangeq.head, &rng)) mem_freerng(rng);) return SS$_NORMAL; }H if (rstart > curgroup->lastavl || rstart < curgroup->frstavl) {@ lib$signal(NEWS__OUTRNG, 3, rstart, curgroup->frstavl,& curgroup->lastavl);C while (queue_remove(rangeq.head, &rng)) mem_freerng(rng);  return SS$_NORMAL; } rng = mem_getrng(); rng->first = rstart;g rng->last = rend;( queue_insert(rng, rangeq.tail); } } else { if (cur_artnum == 0) {i' lib$signal(NEWS__NOCURART, 0);  return SS$_NORMAL;t } rng = mem_getrng();) rng->first = rng->last = cur_artnum; $ queue_insert(rng, rangeq.tail); }  if (append) {r4 status = file_exists(fspec, news_prof.archive);! if (!OK(status)) append = 0;  }l did_one = append;  if (append) {_E status = file_append(fspec, &unit, news_prof.archive, rspec, 0);_ } else {B status = file_create(fspec, &unit, news_prof.archive, rspec); }  if (!OK(status)) {@ lib$signal(NEWS__OPENERR, 2, strlen(fspec), fspec, status);> while (queue_remove(rangeq.head, &rng)) mem_freerng(rng); return SS$_NORMAL;+ } - while (queue_remove(rangeq.head, &rng)) {0 for (i = rng->first; i <= rng->last; i++) { if (do_headers) {> status = Get_Article_Hdrs(curgroup, i, &hdrq, 1, 0); if (!OK(status)) {6 lib$signal(NEWS__EXTRERR, 1, i, status); }u }) if (!do_headers || OK(status)) {a, make_temp_fspec(tmp, sizeof(tmp));8 status = Get_Article_Body(i, tmp, tmpfile, 0); if (!OK(status)) {6 lib$signal(NEWS__EXTRERR, 1, i, status); file_delete(tmp);R } else { if (did_one) { if (do_headers) {# file_write(unit,lX"================================================================================", 80); }! } else did_one = 1;S if (do_headers) {eB for (hdr = hdrq->head; hdr != (struct HDR *) hdrq;6 hdr = hdr->flink) { int len;> Format_Header(hdr, tmp, sizeof(tmp), &len);. file_write(unit, tmp, len); }' file_write(unit, "", 0);u }p2 file_open(tmpfile, &unit2, 0, 0, 0);G while (OK(file_read(unit2, tmp, sizeof(tmp)-1, &tlen))) {0 tmp[tlen] = '\0'; if (rotate) {7 INIT_SDESC(dsc1, strlen(tmp), tmp2); 6 INIT_SDESC(dsc2, strlen(tmp), tmp);E str$translate(&dsc1, &dsc2, &alphabet, &rot13bet);a. *(tmp2+strlen(tmp)) = '\0';= file_write(unit, tmp2, dsc1.dsc$w_length); 9 } else file_write(unit, tmp, strlen(tmp));l }d file_close(unit2);# file_delete(tmpfile);e }; } } }= file_close(unit);L0 if (!did_one && !append) file_delete(rspec); return SS$_NORMAL;} /* cmd_extract */a r/***++** ROUTINE: Clear_ArtInProg**** FUNCTIONAL DESCRIPTION:**3** Clears the article read currently in progress.***B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** Clear_ArtInProg()**** IMPLICIT INPUTS: Several.)**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:r.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.****--*/ unsigned int Clear_ArtInProg() { if (Article_In_Progress) { if (cur_artctx != 0) {$ Close_Article(&cur_artctx); } Article_In_Progress = 0;p) rotate_text = Read_Full_Headers = 0;, Finish_Paged_Output(0);> default_action = cleanup_action = (unsigned int (*)()) 0; }; return SS$_NORMAL;} /* Clear_ArtInProg */  /***++** ROUTINE: Find_Next_Unseen **** FUNCTIONAL DESCRIPTION: **@** Finds the next unseen article, following the group tree (or ** list).**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**2** Find_Next_Unseen(int startpoint, int *newart)**2** startpoint: article number, read only, by value7** newart: article number, write only, by referencee**** IMPLICIT INPUTS: Several.E**** IMPLICIT OUTPUTS: Several.**** COMPLETION CODES:o.** SS$_NORMAL: normal successful completion**** SIDE EFFECTS: Several.l****--*/Cstatic unsigned int Find_Next_Unseen(int startpoint, int *newart) {, struct GRP *g, *hold;( int a, pass2;r unsigned int status; if (curgroup == NULL) {; if (news_prof.glist) {  g = news_prof.glist; } else {h! Traverse_Finish(&rgctx); # g = Traverse_Tree(&rgctx);D } while (g != NULL) { if (g->subscribed) { + a = Next_Unseen_Article(0, 1, g);= if (a > 0) {, status = Set_Current_Group(g); if (OK(status)) {b0 a = Next_Unseen_Article(0, 0, 0); if (a > 0) {  *newart = a;N% return SS$_NORMAL;  } } }j }? g = news_prof.glist ? g->next : Traverse_Tree(&rgctx);  } } else { g = hold = curgroup; a = startpoint; pass2 = 0;e do {  if (g->subscribed) {a1 if (Next_Unseen_Article(a, 1, g) > 0) { , status = Set_Current_Group(g); if (OK(status)) {e0 a = Next_Unseen_Article(a, 0, 0); if (a > 0) {r *newart = a; % return SS$_NORMAL;W } }u }; }? g = news_prof.glist ? g->next : Traverse_Tree(&rgctx); # if (g == NULL && !pass2) {eH g = news_prof.glist ? news_prof.glist : Traverse_Tree(&rgctx); pass2 = 1; } a = 0;* } while (g != NULL);  if (hold->subscribed) {* status = Set_Current_Group(hold); if (OK(status)) {+ a = Next_Unseen_Article(0, 0, 0);I if (a > 0) { *newart = a; return SS$_NORMAL; }h } } } return NEWS__NONEW;d} /* Find_Next_Unseen */q, *hdrqptr;% struct dsc$descriptor tdsc, sdsc;r unsigned int status;( int count, artnum, unsee, mark_xref; int rstart, rend;u Clear_ArtInProg(); if (curgroup == NULL) { % * ~NEWSRDR_SRC.BCK1P[NEWSRDR]CMD_SETSHO.C;47SF(*[NEWSRDR]CMD_SETSHO.C;47+,1.F/ @ 4SFF-P0123KPWOG56Y4Ζ7LRΖ8L'<9G @HJz/***++** FACILITY: NEWSRDR**$** ABSTRACT: SET and SHOW commands.**** MODULE DESCRIPTION:**@** This module contains most, if not all, of the SET commands,** and the SHOW command.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 09-SEP-1992**** MODIFICATION HISTORY:**1** 09-SEP-1992 V1.0 Madison Initial coding.3** 11-SEP-1992 V1.0-1 Madison Added SET NEWSRC.C** 12-SEP-1992 V1.0-2 Madison Added SET DIR, SET QUE, SET FORM.>** 17-SEP-1992 V1.0-3 Madison Fixed problem in SET IGNORE.H** 28-SEP-1992 V1.0-4 Madison Fixed big SET HEADER-related problems.D** 07-OCT-1992 V1.0-5 Madison Fix SET SEEN/UNSEEN range problem.5** 08-OCT-1992 V1.0-6 Madison Added SHOW VERSION.D** 15-FEB-1993 V1.0-7 Madison Make compatible with pre-VMS V5.2.7** 15-FEB-1993 V1.1 Madison Added SET SEEN/CROSS.G** 12-APR-1993 V1.2 Madison Get_Article_* changes, SET AUTO_READ.B** 23-APR-1993 V1.2-1 Madison Add FORCE_MAIL_PROTOCOL support.@** 23-MAY-1993 V1.2-2 Madison Allow SET SEEN/THREAD w/range.**--*/#include "newsrdr.h"#include "globals.h"#ifdef __GNUC__#include #include #else#include #include #endif EXTERN struct GRP *curgroup;! EXTERN int cur_artnum; EXTERN int pb_cols;$ EXTERN int User_Interrupt;" EXTERN char *$$$Version;! static char *hdrname[] = {"",; "FROM", "DATE", "NEWSGROUPS", "SUBJECT", "MESSAGE_ID",< "PATH", "REPLY_TO", "SENDER", "FOLLOWUP_TO", "EXPIRES",= "REFERENCES", "CONTROL", "DISTRIBUTION", "ORGANIZATION",9 "KEYWORDS", "SUMMARY", "APPROVED", "LINES", "XREF"};4 extern int Mark_Article_Seen(struct GRP *, int);6 extern int Mark_Article_Unseen(struct GRP *, int);1 extern int Ignore_Article(struct GRP *, int);? extern unsigned int Parse_Range(char *, int *, int *, int);* extern struct GRP *Find_Group(char *);* extern int Count_Unseen(struct GRP *);+ extern unsigned int cmd_skipsubj(void);- extern unsigned int cmd_skipthread(void);' extern void Mark_Xref(char *, int);; extern unsigned int Get_Article_Hdrs(struct GRP *, int,. struct QUE **, int, int *);4 extern void Get_Mail_Personal_Name(char *, int); /***++** ROUTINE: cmd_set_headers**** FUNCTIONAL DESCRIPTION:**** SET HEADERS command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_headers()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_prof**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/ unsigned int cmd_set_headers() { char tmp[STRING_SIZE], *cp; struct HDR *h, *h2; int remove, hdrcode;; while (OK(cli_get_value("HDRNAM", tmp, sizeof(tmp)))) { cp = tmp;) remove = strncmp(tmp, "NO", 2) == 0; if (remove) cp += 2;M for (hdrcode = 1; hdrcode < sizeof(hdrname)/sizeof(char *); hdrcode++) {E if (strstr(hdrname[hdrcode], cp) == hdrname[hdrcode]) break; }% for (h = news_prof.hdrlist.head;E h != (struct HDR *) &news_prof.hdrlist; h = h->flink) {' if (h->code >= hdrcode) break; }H if (h == (struct HDR *) &news_prof.hdrlist || h->code != hdrcode) { if (remove) {; lib$signal(NEWS__HDRNOTFOUND, 2, strlen(cp), cp); } else { h2 = mem_gethdr(0); h2->code = hdrcode;D queue_insert(h2, (h == (struct HDR *) &news_prof.hdrlist ?< news_prof.hdrlist.tail : h->blink)); } } else { if (remove) { queue_remove(h, &h2); mem_freehdr(h2); } else {8 lib$signal(NEWS__HDRALRDY, 2, strlen(cp), cp); } } } return SS$_NORMAL;} /* cmd_set_headers */ /***++** ROUTINE: cmd_set_reply**** FUNCTIONAL DESCRIPTION:**** SET REPLY command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_reply()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_prof**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_reply() { char tmp[STRING_SIZE]; int i; static struct { int *flag; char *tag;L } pm[2] = {{&news_prof.replypost,"POST"},{&news_prof.replymail,"MAIL"}};2 news_prof.replypost = news_prof.replymail = 0;> while (OK(cli_get_value("REPLYTYPE", tmp, sizeof(tmp)))) { for (i = 0; i < 2; i++) {D if (strstr(pm[i].tag, tmp) == pm[i].tag) *(pm[i].flag) = 1; } } return SS$_NORMAL;} /* cmd_set_reply */ /***++** ROUTINE: cmd_set_persnam**** FUNCTIONAL DESCRIPTION:**** SET PERSONAL_NAME command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_persnam()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_prof**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/ unsigned int cmd_set_persnam() { unsigned int status;* status = cli_present("PERSONAL_NAME");! if (status == CLI$_NEGATED) {$ *news_prof.personalname = '\0'; news_prof.usemailpnam = 0; } else {2 if (cli_present("PERSNAM") == CLI$_PRESENT) {9 cli_get_value("PERSNAM", news_prof.personalname,. sizeof(news_prof.personalname));# news_prof.usemailpnam = 0;6 } else if (cli_present("MAIL") == CLI$_PRESENT) {# news_prof.usemailpnam = 1;7 Get_Mail_Personal_Name(news_prof.personalname,8 sizeof(news_prof.personalname)); } else { char tmp[STRING_SIZE]; *tmp = '\0';- get_cmd(tmp, sizeof(tmp), "Name: "); if (*tmp) {. strcpy(news_prof.personalname, tmp);$ news_prof.usemailpnam = 0; } } } return SS$_NORMAL;} /* cmd_set_persnam */ /***++** ROUTINE: cmd_set_edit**** FUNCTIONAL DESCRIPTION:**** SET EDIT command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_edit()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_prof**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_edit() {. char tmp[STRING_SIZE], edkwd[STRING_SIZE];+ char *edtype[2] = {"CALLABLE","SPAWN"}; unsigned int status;9 news_prof.edit = cli_present("EDIT") != CLI$_NEGATED;0 if (cli_present("EDITOR") == CLI$_PRESENT) {8 status = cli_get_value("EDITOR", tmp, sizeof(tmp)); if (status == CLI$_COMMA) {7 cli_get_value("EDITOR", edkwd, sizeof(edkwd)); } else {# strcpy(edkwd, "CALLABLE"); }0 if (strstr(edtype[0],edkwd) == edtype[0]) { strcat(tmp, "SHR");5 status = file_exists(tmp, "SYS$SHARE:.EXE");% *(tmp+strlen(tmp)-3) = '\0'; if (!OK(status)) {< lib$signal(NEWS__EDNOTFOUND, 2, strlen(tmp), tmp); } else {" news_prof.spawnedit = 0;, strcpy(news_prof.editorname, tmp); }7 } else if (strstr(edtype[1],edkwd) == edtype[1]) {+ strcpy(news_prof.editorname, tmp);! news_prof.spawnedit = 1; } else {O lib$signal(NEWS__CMDERR, 0, NEWS__KWDSYNTAX, 2, strlen(edkwd), edkwd); } } return SS$_NORMAL;} /* cmd_set_edit */ /***++** ROUTINE: cmd_set_seen**** FUNCTIONAL DESCRIPTION:**** SET SEEN/UNSEEN commands.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_seen()**)** IMPLICIT INPUTS: curgroup, cur_artnum**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**%** SIDE EFFECTS: curgroup->seenq.****--*/unsigned int cmd_set_seen() { char tmp[STRING_SIZE], *cp;" char thread_subj[STRING_SIZE]; struct RNG *r; struct QUE *hdrqptr; struct HDR *hdr, *xhdr;' int unsee, rstart, rend, mark_xref; int count, mark_thread;/*0** SET SEEN/SUBJECT is handled by cmd_skipsubj.*/1 if (cli_present("SUBJECT") == CLI$_PRESENT) { return cmd_skipsubj(); } if (curgroup == NULL) {% lib$signal(NEWS__NOCURGROUP, 0); return SS$_NORMAL; }4 unsee = (cli_present("SEEN") == CLI$_NEGATED) ||1 (cli_present("UNSEEN") == CLI$_PRESENT);B mark_xref = (cli_present("CROSS_REFERENCES") == CLI$_PRESENT);: mark_thread = (cli_present("THREAD") == CLI$_PRESENT); count = 0;- if (cli_present("ALL") == CLI$_PRESENT) {5 while (queue_remove(curgroup->seenq.head, &r)) { mem_freerng(r); } if (!unsee) { r = mem_getrng(); r->first = 1;% r->last = curgroup->lastavl;- queue_insert(r, &(curgroup->seenq)); } return SS$_NORMAL; }/ if (cli_present("ARTRNG") == CLI$_ABSENT) {. if (mark_thread) return cmd_skipthread();: if (unsee) Mark_Article_Unseen(curgroup, cur_artnum); if (mark_xref) {J if (OK(Get_Article_Hdrs(curgroup, cur_artnum, &hdrqptr, 1, 0))) {B for (hdr = hdrqptr->head; hdr != (struct HDR *) hdrqptr;6 hdr = hdr->flink) {1 if (hdr->code == NEWS_K_HDR_XREF) {* Mark_Xref(hdr->str, unsee); break; } } } } return SS$_NORMAL; }; while (OK(cli_get_value("ARTRNG", tmp, sizeof(tmp)))) {= if (!OK(Parse_Range(tmp, &rstart, &rend, cur_artnum))) {: lib$signal(NEWS__INVARTRNG, 2, strlen(tmp), tmp); } else { int i, j; if (rstart > rend) { i = rstart; rstart = rend; rend = i; }@ if (rend > curgroup->lastavl) rend = curgroup->lastavl;+ for (i = rstart; i <= rend; i++) {$ if (User_Interrupt) break; if (unsee) {8 count += Mark_Article_Unseen(curgroup, i); } else {6 count += Mark_Article_Seen(curgroup, i); }) if (mark_xref || mark_thread) { xhdr = 0;$ thread_subj[0] = '\0';F if (OK(Get_Article_Hdrs(curgroup, i, &hdrqptr, 1, 0))) {G for (hdr = hdrqptr->head; hdr != (struct HDR *) hdrqptr;: hdr = hdr->flink) {C if (mark_xref && hdr->code == NEWS_K_HDR_XREF) { xhdr = hdr;F if (!mark_thread || thread_subj[0] != '\0') break; }H if (mark_thread && hdr->code == NEWS_K_HDR_SUBJECT) {* strcpy(tmp, hdr->str); upcase(tmp);9 if (tmp[0] == 'R' && tmp[1] == 'E' &&) tmp[2] == ':') {= for (cp = tmp+3; isspace(*cp); cp++);$ } else cp = tmp;- strcpy(thread_subj, tmp);7 if (!mark_xref || xhdr != 0) break; } }G if (mark_xref && xhdr != 0) Mark_Xref(xhdr->str, unsee);; if (mark_thread && thread_subj[0] != '\0') {= for (j = i; j <= curgroup->lastavl; j++) {7 if (!Ignore_Article(curgroup, j)) {< if (OK(Get_Article_Hdrs(curgroup, j,1 &hdrqptr, 1, 0))) {" xhdr = 0; cp = 0;2 for (hdr = hdrqptr->head;< hdr != (struct HDR *) hdrqptr;1 hdr = hdr->flink) {C if (hdr->code == NEWS_K_HDR_SUBJECT) {4 strcpy(tmp, hdr->str);* upcase(tmp);2 if (tmp[0] == 'R' &&3 tmp[1] == 'E' &&3 tmp[2] == ':') {> for (cp = tmp; isspace(*cp);- cp++);. } else cp = tmp;A if (!mark_xref || xhdr != 0) break;G } else if (hdr->code == NEWS_K_HDR_XREF) {) xhdr = hdr;1 if (cp != 0) break; } }4 if (strstr(cp, thread_subj); || strstr(thread_subj, cp)) {. count += (unsee ?> Mark_Article_Unseen(curgroup, j)@ : Mark_Article_Seen(curgroup, j));: if (mark_xref && xhdr != 0) {: Mark_Xref(xhdr->str, unsee); } } } } } } } } } } }* lib$signal(NEWS__MARKCOUNT, 1, count); return SS$_NORMAL;} /* cmd_set_seen */ /***++** ROUTINE: cmd_set_sig**** FUNCTIONAL DESCRIPTION: ** ** SET SIGNATURE command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_sig()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_prof**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_sig() { char tmp[STRING_SIZE]; unsigned int status;8 if (cli_present("SIGNATURE_FILE") == CLI$_NEGATED) { *news_prof.sigfile = '\0';7 news_prof.autosigmail = news_prof.autosigpost = 0; return SS$_NORMAL; }0 if (cli_present("SIGFILE") == CLI$_ABSENT) { *tmp = '\0';; get_cmd(tmp, sizeof(tmp), "Name of signature file: ");" if (!*tmp) return SS$_NORMAL;$ strcpy(news_prof.sigfile, tmp); } else {L cli_get_value("SIGFILE", news_prof.sigfile, sizeof(news_prof.sigfile)); }& status = cli_present("AUTOMATIC");! if (status == CLI$_NEGATED) {7 news_prof.autosigpost = news_prof.autosigmail = 0;( } else if (status == CLI$_PRESENT) { unsigned int statm, statp;+ statm = cli_present("AUTOMATIC.MAIL");+ statp = cli_present("AUTOMATIC.POST");7 news_prof.autosigmail = (statm == CLI$_PRESENT) ||8 (statm == CLI$_ABSENT && statp == CLI$_ABSENT);7 news_prof.autosigpost = (statp == CLI$_PRESENT) ||8 (statm == CLI$_ABSENT && statp == CLI$_ABSENT); } return SS$_NORMAL;} /* cmd_set_sig */ /***++** ROUTINE: cmd_set_archive**** FUNCTIONAL DESCRIPTION:**** SET ARCHIVE command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_archive()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_prof**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/ unsigned int cmd_set_archive() { char tmp[STRING_SIZE]; unsigned int flds;) static struct fscndef fscn = {0,0,0}; struct dsc$descriptor sdsc; unsigned int status;; if (cli_present("ARCHIVE_DIRECTORY") == CLI$_NEGATED) { *news_prof.archive = '\0'; return SS$_NORMAL; }0 if (cli_present("ARCHIVE") == CLI$_ABSENT) { *tmp = '\0';A> get_cmd(tmp, sizeof(tmp), "Name of archive directory: ");" if (!*tmp) return SS$_NORMAL; } else {0 cli_get_value("ARCHIVE", tmp, sizeof(tmp)); }  while (1) {( INIT_SDESC(sdsc, strlen(tmp), tmp);0 status = sys$filescan(&sdsc, &fscn, &flds); if (!OK(status)) {S1 lib$signal(NEWS__SETARCHERR, 0, status);* return SS$_NORMAL; } if (flds == FSCN$M_NAME) {  strcat(tmp, ":"); } else {  break; } }9; if (!((flds & FSCN$M_NODE) || (flds & FSCN$M_DEVICE) ||1= (flds & FSCN$M_ROOT) || (flds & FSCN$M_DIRECTORY) ||28 (flds & FSCN$M_NAME) || (flds & FSCN$M_TYPE) ||$ (flds & FSCN$M_VERSION))) {/ lib$signal(NEWS__SETARCHERR, 0, RMS$_DIR);- return SS$_NORMAL;  }H# strcpy(news_prof.archive, tmp);M return SS$_NORMAL;} /* cmd_set_archive */E 9/***++** ROUTINE: cmd_set_newsrcS**** FUNCTIONAL DESCRIPTION:s**** SET NEWSRC command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_newsrcl**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_profl**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_newsrc() {c0 if (cli_present("NEWSRC") == CLI$_NEGATED) { *news_prof.newsrc = '\0'; return SS$_NORMAL;e }r4 if (cli_present("NEWSRC_FILE") == CLI$_ABSENT) {5 strcpy(news_prof.newsrc, "SYS$LOGIN:XX.NEWSRC");S } else {N cli_get_value("NEWSRC_FILE", news_prof.newsrc, sizeof(news_prof.newsrc)); }EN news_prof.newsrc_subonly = cli_present("SUBSCRIBED_ONLY") == CLI$_PRESENT; return SS$_NORMAL;} /* cmd_set_newsrc */ r/***++** ROUTINE: cmd_set_queue**** FUNCTIONAL DESCRIPTION:c**** SET QUEUE command.t**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_queue()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_prof**** COMPLETION CODES:_/** SS$_NORMAL: Normal successful completion.p**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_queue() {S cli_get_value("QUENAME", news_prof.print_queue, sizeof(news_prof.print_queue));; return SS$_NORMAL;} /* cmd_set_queue */t /***++** ROUTINE: cmd_set_forma**** FUNCTIONAL DESCRIPTION:I**** SET FORM command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_form()t**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_prof **** COMPLETION CODES:I/** SS$_NORMAL: Normal successful completion.o**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_form() {t char tmp[STRING_SIZE];. if (cli_present("FORM") == CLI$_NEGATED) {" *news_prof.print_form = '\0'; return SS$_NORMAL;  }z1 if (cli_present("FORMNAME") == CLI$_ABSENT) {( *tmp = '\0';. get_cmd(tmp, sizeof(tmp), "Form name: ");" if (!*tmp) return SS$_NORMAL;' strcpy(news_prof.print_form, tmp);r } else {S cli_get_value("FORMNAME", news_prof.print_form, sizeof(news_prof.print_form));d }  return SS$_NORMAL;} /* cmd_set_form */ /***++** ROUTINE: cmd_set_dir**** FUNCTIONAL DESCRIPTION:i**** SET DIRECTORY command..**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_dir()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_profe**** COMPLETION CODES:u/** SS$_NORMAL: Normal successful completion.i**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_dir() { char tmp[STRING_SIZE];. if (cli_present("FROM") == CLI$_PRESENT) {- cli_get_value("FROM", tmp, sizeof(tmp)); ; lib$cvt_dtb(strlen(tmp), tmp, &news_prof.dir_fromwid); } else { news_prof.dir_fromwid = -1; }c1 if (cli_present("SUBJECT") == CLI$_PRESENT) {s0 cli_get_value("SUBJECT", tmp, sizeof(tmp));; lib$cvt_dtb(strlen(tmp), tmp, &news_prof.dir_subjwid); } else { news_prof.dir_subjwid = -1; }* return SS$_NORMAL;} /* cmd_set_dir */n _/***++** ROUTINE: cmd_set_ignoreo**** FUNCTIONAL DESCRIPTION:***** SET IGNORE command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_ignore()I**4** IMPLICIT INPUTS: news_prof, curgroup, cur_artnum**** IMPLICIT OUTPUTS: news_profw**** COMPLETION CODES:n/** SS$_NORMAL: Normal successful completion.l**7** SIDE EFFECTS: curgroup->killq could be modified.u****--*/unsigned int cmd_set_ignore() {( char tmp[STRING_SIZE]; struct QUE *q; struct HDR *h; struct GRP *grp; short testcode;  int remove;;3 remove = cli_present("IGNORE") == CLI$_NEGATED;c0 if (cli_present("GLOBAL") == CLI$_PRESENT) { q = &news_prof.killq; } else {1 if (cli_present("GRPNAM") == CLI$_PRESENT) { 3 cli_get_value("GRPNAM", tmp, sizeof(tmp));p locase(tmp);C grp = Find_Group(tmp);L if (grp == NULL) {; lib$signal(NEWS__NOSUCHGRP, 2, strlen(tmp), tmp);o return SS$_NORMAL; } q = &(grp->killq);c } else {) if (curgroup == NULL) {* lib$signal(NEWS__NOCURGROUP, 0); return SS$_NORMAL; } q = &(curgroup->killq); } }e *tmp = '\0';1 if (cli_present("SUBJECT") == CLI$_PRESENT) {R# testcode = NEWS_K_HDR_SUBJECT;S0 cli_get_value("SUBJECT", tmp, sizeof(tmp));; } else if (cli_present("NEWSGROUPS") == CLI$_PRESENT) {=& testcode = NEWS_K_HDR_NEWSGROUPS;3 cli_get_value("NEWSGROUPS", tmp, sizeof(tmp));=5 } else if (cli_present("FROM") == CLI$_PRESENT) {l testcode = NEWS_K_HDR_FROM;- cli_get_value("FROM", tmp, sizeof(tmp)); } else if (remove) {6 while (queue_remove(q->head, &h)) mem_freehdr(h); return SS$_NORMAL; } else {% lib$signal(NEWS__NOIGHDSPEC, 0);a return SS$_NORMAL;e }. upcase(tmp);< for (h = q->head; h != (struct HDR *) q; h = h->flink) {@ if (h->code == testcode && strcmp(h->str, tmp) == 0) break; }C if (h == (struct HDR *) q) { if (remove) {8 lib$signal(NEWS__NOMATCH, 2, strlen(tmp), tmp); } else {*/ insert_header(tmp, q->tail, testcode);M } } else { if (remove) { queue_remove(h, &h);O mem_freehdr(h); } else {l* lib$signal(NEWS__ALRDYIGNORE, 0); } }* return SS$_NORMAL;} /* cmd_set_ignore */ t/***++** ROUTINE: cmd_set_arn**** FUNCTIONAL DESCRIPTION:E**** SET EDIT command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_arn()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_prof **** COMPLETION CODES: /** SS$_NORMAL: Normal successful completion.d**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_arn() {I news_prof.autoreadnew = cli_present("AUTO_READ_NEW") != CLI$_NEGATED;  return SS$_NORMAL;} /* cmd_set_arn */ /***++** ROUTINE: cmd_set_fmp**** FUNCTIONAL DESCRIPTION: **** SET EDIT command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_fmp()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_proft**** COMPLETION CODES:(/** SS$_NORMAL: Normal successful completion.s**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_fmp() {O news_prof.force_proto = cli_present("FORCE_MAIL_PROTOCOL") != CLI$_NEGATED;  return SS$_NORMAL;} /* cmd_set_fmp */d t/***++** ROUTINE: cmd_set_nga**** FUNCTIONAL DESCRIPTION:m**** SET EDIT command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_nga()**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_profO**** COMPLETION CODES:N/** SS$_NORMAL: Normal successful completion.I**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_nga() {< static char *nganam[] = {"NONE", "PROMPT", "SUBSCRIBE"};F static int ngaction[] = {NG_K_NONE, NG_K_PROMPT, NG_K_SUBSCRIBE}; char tmp[STRING_SIZE]; int i;I if (!OK(cli_get_value("NGAKW", tmp, sizeof(tmp)))) return SS$_NORMAL; 9 for (i = 0; i < sizeof(nganam)/sizeof(char *); i++) {=/ if (strstr(nganam[i], tmp) == nganam[i]) {* news_prof.ngaction = ngaction[i]; return SS$_NORMAL;  } }r! /* should never reach here */  return SS$_NORMAL;} /* cmd_set_nga */  l/***++** ROUTINE: cmd_showN**** FUNCTIONAL DESCRIPTION:e**** SHOW command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:** ** cmd_shows**?** IMPLICIT INPUTS: news_prof, news_cfg, curgroup, and others.s**** IMPLICIT OUTPUTS: None.f**** COMPLETION CODES: /** SS$_NORMAL: Normal successful completion.r**** SIDE EFFECTS: None.****--*/unsigned int cmd_show() {rL static char *shokwd[] = {"HEADERS", "PERSONAL_NAME", "EDITOR", "SERVER",; "CURRENT_GROUP", "ALL", "SIGNATURE_FILE", "IGNORE",dI "ARCHIVE_DIRECTORY", "GROUP", "REPLY", "NEWSRC", "QUEUE", "FORM",uJ "DIRECTORY_WIDTH", "VERSION", "AUTO_READ_NEW", "FORCE_MAIL_PROTOCOL", "NEWGROUP_ACTION"};- char tmp[STRING_SIZE], tmp2[STRING_SIZE];d struct dsc$descriptor tdsc;  short tlen;  int kwnum;) INIT_SDESC(tdsc, sizeof(tmp)-1, tmp);  put_output("");; while (OK(cli_get_value("SHOWKW", tmp, sizeof(tmp)))) {bF for (kwnum = 0; kwnum < sizeof(shokwd)/sizeof(char *); kwnum++) {@ if (strstr(shokwd[kwnum], tmp) == shokwd[kwnum]) break; }% if (kwnum == 15 || kwnum == 5) {p) strcpy(tmp, "This is NEWSRDR "); ! strcat(tmp, $$$Version);l put_output(tmp);  }$ if (kwnum == 0 || kwnum == 5) {< if (news_prof.hdrlist.head == &news_prof.hdrlist) {- put_output("No headers selected.");n } else {v char *cp;a struct HDR *h; int max;# strcpy(tmp, "Headers: ");r cp = tmp+9;e1 max = (pb_cols < 20 ? 10 : pb_cols-20);r* for (h = news_prof.hdrlist.head;F h != (struct HDR *) &news_prof.hdrlist; h = h->flink) {! if (cp-tmp > max) {  *cp++ = ',';  *cp = '\0'; put_output(tmp);H( strcpy(tmp, " "); cp = tmp+9; }s+ if (cp != tmp+9) *cp++ = ','; + strcpy(cp, hdrname[h->code]); - cp += strlen(hdrname[h->code]);_ } if (cp != tmp+9) { *cp = '\0';( put_output(tmp); }; } }$ if (kwnum == 1 || kwnum == 5) {' if (*news_prof.personalname) { ) strcpy(tmp, "Personal name: "); . strcat(tmp, news_prof.personalname);F if (news_prof.usemailpnam) strcat(tmp, " (from VMS MAIL)"); put_output(tmp); } else { . put_output("No personal name set."); } }$ if (kwnum == 2 || kwnum == 5) {! strcpy(tmp, "Editor: ");r+ strcat(tmp, news_prof.editorname); # if (news_prof.spawnedit) { & strcat(tmp, " (spawned), "); } else {' strcat(tmp, " (callable), ");s } if (news_prof.edit) {B strcat(tmp, "used by default when composing messages."); } else {p. strcat(tmp, "not used by default."); } put_output(tmp);  }% if (kwnum == 10 || kwnum == 5) { 0 strcpy(tmp, "REPLY command default: ");6 if (news_prof.replypost) strcat(tmp, "POST");# if (news_prof.replymail) {=8 if (news_prof.replypost) strcat(tmp, " and "); strcat(tmp, "MAIL"); } put_output(tmp);K }$ if (kwnum == 3 || kwnum == 5) {& strcpy(tmp, "News server: ");+ strcat(tmp, news_cfg.server_name);  put_output(tmp);R }% if (kwnum == 11 || kwnum == 5) {=! if (*news_prof.newsrc) { ' strcpy(tmp, "Newsrc file: "); ( strcat(tmp, news_prof.newsrc);) if (news_prof.newsrc_subonly) { C strcat(tmp, " (only subscribed newsgroups entered)"); }  put_output(tmp); } else { , put_output("No newsrc file set."); } }% if (kwnum == 12 || kwnum == 5) {h& if (*news_prof.print_queue) {' strcpy(tmp, "Print queue: "); - strcat(tmp, news_prof.print_queue);  put_output(tmp); } else { / put_output("Print queue: SYS$PRINT");) } }% if (kwnum == 13 || kwnum == 5) { % if (*news_prof.print_form) {e& strcpy(tmp, "Print form: ");, strcat(tmp, news_prof.print_form); put_output(tmp); } else {!2 put_output("No form set for printing."); } }% if (kwnum == 14 || kwnum == 5) { 6 strcpy(tmp, "Directory field widths: FROM=");* if (news_prof.dir_fromwid >= 0) {5 sprintf(tmp2, "%d", news_prof.dir_fromwid);} strcat(tmp, tmp2); } else {u! strcat(tmp, "default"); }# strcat(tmp, ", SUBJECT=");d* if (news_prof.dir_subjwid >= 0) {5 sprintf(tmp2, "%d", news_prof.dir_subjwid);m strcat(tmp, tmp2); } else {s! strcat(tmp, "default");* } put_output(tmp);* }2 if (kwnum == 4 || kwnum == 5 || kwnum == 9) { if (curgroup == NULL) {. put_output("No current group set."); } else {E$ static $DESCRIPTOR(ctrstr,? "Articles available: !UL-!UL, !UL unseen.");d. strcpy(tmp, "Current group: ");( strcat(tmp, curgroup->grpnam); put_output(tmp);; sys$fao(&ctrstr, &tlen, &tdsc, curgroup->frstavl,S9 curgroup->lastavl, Count_Unseen(curgroup));$( put_output_counted(tmp, tlen); } }$ if (kwnum == 6 || kwnum == 5) {" if (*news_prof.si ~NEWSRDR_SRC.BCK1P[NEWSRDR]CMD_SETSHO.C;47SF>gfile) {* strcpy(tmp, "Signature file: ");) strcat(tmp, news_prof.sigfile);f put_output(tmp);B if (!(news_prof.autosigmail || news_prof.autosigpost)) {: put_output(" Not automatically appended."); } else {: strcpy(tmp, " Automatically appended to ");* if (news_prof.autosigmail) {+ if (news_prof.autosigpost) {"4 strcat(tmp, "mail and postings"); } else { , strcat(tmp, "mail only"); }2 } else strcat(tmp, "postings only"); put_output(tmp); }_ } else {/ put_output("No signature file set."); } }$ if (kwnum == 8 || kwnum == 5) {" if (*news_prof.archive) {- strcpy(tmp, "Archive directory: ");r) strcat(tmp, news_prof.archive);  put_output(tmp); } else { 2 put_output("No archive directory set."); } }% if (kwnum == 16 || kwnum == 5) {o% if (news_prof.autoreadnew) {IJ put_output("Automatically READ/NEW when visiting a new group."); } else {EE put_output("Pause for command when visiting a new group."); } }% if (kwnum == 17 || kwnum == 5) {% if (news_prof.force_proto) {)P put_output("Forced use of mail protocol prefix, even on local mail."); } else {lG put_output("Use mail protocol prefix only on network mail.");t } }% if (kwnum == 18 || kwnum == 5) {t& switch (news_prof.ngaction) { case NG_K_SUBSCRIBE:,H put_output("Will automatically subscribe to new newsgroups."); break; case NG_K_PROMPT:H put_output("Will prompt for subscription to new newsgroups."); break; default:SL put_output("Will not automatically subscribe to new newsgroups."); break; } }$ if (kwnum == 7 || kwnum == 5) { struct HDR *h;D int doglobal, dolocal;$ if (kwnum == 5) {! doglobal = dolocal = 1;_ } else {C; doglobal = cli_present("GLOBAL") == CLI$_PRESENT;sH dolocal = !doglobal || (cli_present("LOCAL") == CLI$_PRESENT); } if (doglobal) {9 if (news_prof.killq.head == &news_prof.killq) {9 put_output("Global ignore strings: none.");D } else {3 put_output("Global ignore strings:");l, for (h = news_prof.killq.head;9 h != (struct HDR *) &news_prof.killq;I# h = h->flink) {T# strcpy(tmp, " ");C- strcat(tmp, hdrname[h->code]);p" strcat(tmp, "=\"");# strcat(tmp, h->str);s! strcat(tmp, "\"");n put_output(tmp);  }s } } if (dolocal) {f! if (curgroup == NULL) {$. lib$signal(NEWS__NOCURGROUP, 0); } else {+ if (doglobal) put_output("");"7 strcpy(tmp, "Ignore strings for group ");, strcat(tmp, curgroup->grpnam); strcat(tmp, ": ");= if (curgroup->killq.head == &curgroup->killq) {+$ strcat(tmp, "none."); put_output(tmp);  } else { put_output(tmp);r- for (h = curgroup->killq.head;T9 h != (struct HDR *) &curgroup->killq;n# h = h->flink) {e' strcpy(tmp, " "); 1 strcat(tmp, hdrname[h->code]);*& strcat(tmp, "=\"");' strcat(tmp, h->str);_% strcat(tmp, "\"");e# put_output(tmp); } }d }t } } } /* while */r put_output("");D return SS$_NORMAL;} /* cmd_show */ N cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_set_form()t**** IMPLICIT INPUTS: news_prof**** IMPLICIT OUTPUTS: news_prof **** COMPLETION CODES:I/** SS$_NORMAL: Normal successful completion.o**** SIDE EFFECTS: None.****--*/unsigned int cmd_set_form() {t char tmp[STRING_SIZE];. if (cli_present("FORM") == CLI$_NEGATED) {" *news_prof.print_form = '\0'; return SS$_NORMAL;  }z1 if (cli_presenj~NEWSRDR_SRC.BCKP[NEWSRDR]CMD_PRINT.C;18Y#*[NEWSRDR]CMD_PRINT.C;18+,.#/ @ 4Y#!-P0123KPWO$56Kǖ7,ǖ8~e99G @HJB/***++** FACILITY: NEWSRDR**** ABSTRACT: PRINT commands**** MODULE DESCRIPTION:**?** This module contains the routines that implement the PRINT** commands for NEWSRDR.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 10-SEP-1992**** MODIFICATION HISTORY:**1** 10-SEP-1992 V1.0 Madison Initial coding.E** 15-FEB-1993 V1.0-1 Madison Fix for pre-VMS V5.2 compatibility.:** 23-MAR-1993 V1.0-2 Madison Fix file_read reference.A** 12-APR-1993 V1.1 Madison Get_Article_* routines changed.H** 14-MAY-1993 V1.2 Madison Wasn't taking queue name from profile!**--*/#include "newsrdr.h"#include "globals.h"#ifdef __GNUC__#include #include #else#include #include #endif struct PRT { TIME after; struct FAB fab; struct RAB rab; struct NAM nam;9 int burst, copies, feed, flag, hold, notify, space; int trailer, active;7 char form[33], name[40], queue[33], param[8][256]; };/*** Forward declarations*/! unsigned int cmd_print(void);% unsigned int cmd_print_now(void);( unsigned int cmd_print_cancel(void);" unsigned int print_clup(void);A static int characteristics_match(struct PRT *, struct PRT *);& static struct PRT *old_prt = NULL;Y static $DESCRIPTOR(alphabet, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");Y static $DESCRIPTOR(rotabet, "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm"); EXTERN struct GRP *curgroup;! EXTERN int cur_artnum;? extern unsigned int Parse_Range(char *, int *, int *, int);P extern unsigned int Get_Article_Hdrs(struct GRP *, int, void *, int, int *);E extern unsigned int Get_Article_Body(int, char *, char *, int *); /***++** ROUTINE: cmd_print**** FUNCTIONAL DESCRIPTION:**** PRINT command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_print()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_print() {0 char tmp[STRING_SIZE], bodyspec[FSPEC_SIZE]; struct QUE rangeq, *hdrq; struct RNG *rng; struct HDR *hdr; struct PRT *prt; struct dsc$descriptor tdsc;2 int rstart, rend, did_one, do_headers, rotate; int append, len; unsigned int unit, status; if (curgroup == NULL) {% lib$signal(NEWS__NOCURGROUP, 0); return SS$_NORMAL; }/*@** First, get all the parameters and stuff we need to set up the** PRT context block.*/8 do_headers = cli_present("HEADERS") != CLI$_NEGATED;3 rotate = cli_present("ROTATE") == CLI$_PRESENT;( rangeq.head = rangeq.tail = &rangeq;0 if (cli_present("ARTRNG") == CLI$_PRESENT) {< while (OK(cli_get_value("ARTRNG", tmp, sizeof(tmp)))) {A if (!OK(Parse_Range(tmp, &rstart, &rend, cur_artnum))) {; lib$signal(NEWS__INVARTRNG, 2, strlen(tmp), tmp);C while (queue_remove(rangeq.head, &rng)) mem_freerng(rng); return SS$_NORMAL; } if (rstart > rend) { int i;. i = rstart; rstart = rend; rend = i; }@ if (rend > curgroup->lastavl) rend = curgroup->lastavl;@ if (rend < curgroup->frstavl) rend = curgroup->frstavl;D if (rstart > curgroup->lastavl) rstart = curgroup->lastavl;D if (rstart < curgroup->frstavl) rstart = curgroup->frstavl; rng = mem_getrng(); rng->first = rstart; rng->last = rend;( queue_insert(rng, rangeq.tail); } } else { if (cur_artnum == 0) {' lib$signal(NEWS__NOCURART, 0); return SS$_NORMAL; } rng = mem_getrng();) rng->first = rng->last = cur_artnum;$ queue_insert(rng, rangeq.tail); }% prt = malloc(sizeof(struct PRT));' memset(prt, 0, sizeof(struct PRT));/ if (cli_present("AFTER") == CLI$_PRESENT) {. cli_get_value("AFTER", tmp, sizeof(tmp));( INIT_SDESC(tdsc, strlen(tmp), tmp);< status = lib$convert_date_string(&tdsc, &(prt->after)); if (!OK(status)) {- lib$signal(NEWS__CMDERR, 0, status); free(prt);B while (queue_remove(rangeq.head, &rng)) mem_freerng(rng); return SS$_NORMAL; } }" status = cli_present("BURST");! if (status == CLI$_PRESENT) { static char *all = "ALL";8 if (OK(cli_get_value("BURST", tmp, sizeof(tmp)))) {C prt->burst = (strstr(all, tmp) == all) ? SJC$_FILE_BURST :' SJC$_FILE_BURST_ONE; } else {& prt->burst = SJC$_FILE_BURST; }( } else if (status == CLI$_NEGATED) {% prt->burst = SJC$_NO_FILE_BURST; }0 if (cli_present("COPIES") == CLI$_PRESENT) {/ cli_get_value("COPIES", tmp, sizeof(tmp));3 lib$cvt_dtb(strlen(tmp), tmp, &(prt->copies));. if (prt->copies > 255) prt->copies = 255;* if (prt->copies < 1) prt->copies = 1; } else { prt->copies = 1; }! status = cli_present("FEED");! if (status == CLI$_PRESENT) { prt->feed = SJC$_PAGINATE;( } else if (status == CLI$_NEGATED) {" prt->feed = SJC$_NO_PAGINATE; }! status = cli_present("FLAG");! if (status == CLI$_PRESENT) { static char *all = "ALL";7 if (OK(cli_get_value("FLAG", tmp, sizeof(tmp)))) {A prt->flag = (strstr(all, tmp) == all) ? SJC$_FILE_FLAG :& SJC$_FILE_FLAG_ONE; } else {$ prt->flag = SJC$_FILE_FLAG; }( } else if (status == CLI$_NEGATED) {# prt->flag = SJC$_NO_FILE_FLAG; }. if (cli_present("FORM") == CLI$_PRESENT) {9 cli_get_value("FORM", prt->form, sizeof(prt->form)); } else {- strcpy(prt->form, news_prof.print_form); }! status = cli_present("HOLD");! if (status == CLI$_PRESENT) { prt->hold = SJC$_HOLD;( } else if (status == CLI$_NEGATED) { prt->hold = SJC$_NO_HOLD; }. if (cli_present("NAME") == CLI$_PRESENT) {9 cli_get_value("NAME", prt->name, sizeof(prt->name)); }# status = cli_present("NOTIFY");! if (status == CLI$_PRESENT) { prt->notify = SJC$_NOTIFY;( } else if (status == CLI$_NEGATED) {" prt->notify = SJC$_NO_NOTIFY; }4 if (cli_present("PARAMETERS") == CLI$_PRESENT) { int i; for (i = 0; i < 8; i++) {; if (!OK(cli_get_value("PARAMETERS", prt->param[i],7 sizeof(prt->param[i])))) break; } }/ if (cli_present("QUEUE") == CLI$_PRESENT) {< cli_get_value("QUEUE", prt->queue, sizeof(prt->queue)); } else {/ strcpy(prt->queue, news_prof.print_queue); }" status = cli_present("SPACE");! if (status == CLI$_PRESENT) {$ prt->space = SJC$_DOUBLE_SPACE;( } else if (status == CLI$_NEGATED) {' prt->space = SJC$_NO_DOUBLE_SPACE; }$ status = cli_present("TRAILER");! if (status == CLI$_PRESENT) { static char *all = "ALL";: if (OK(cli_get_value("TRAILER", tmp, sizeof(tmp)))) {D prt->flag = (strstr(all, tmp) == all) ? SJC$_FILE_TRAILER :) SJC$_FILE_TRAILER_ONE; } else {' prt->flag = SJC$_FILE_TRAILER; }( } else if (status == CLI$_NEGATED) {& prt->flag = SJC$_NO_FILE_TRAILER; }/*B** Now that we've built the PRT block for this request, compare itF** against the old one (if there is one). If it's a match, then fine.:** Otherwise, clean up the old and start with the new one.*/ did_one = 0;. if (characteristics_match(prt, old_prt)) { free(prt); did_one = 1; } else { print_clup();' make_temp_fspec(tmp, sizeof(tmp)); prt->fab = cc$rms_fab; prt->fab.fab$l_fna = tmp;& prt->fab.fab$b_fns = strlen(tmp);$ prt->fab.fab$b_fac = FAB$M_PUT;# prt->fab.fab$b_rat = FAB$M_CR;& prt->fab.fab$l_nam = &(prt->nam); prt->rab = cc$rms_rab;& prt->rab.rab$l_fab = &(prt->fab); prt->nam = cc$rms_nam;* status = sys$create(&(prt->fab),0,0); if (!OK(status)) {C lib$signal(NEWS__PRINTERR, 0, status, prt->fab.fab$l_stv); free(prt);A while(queue_remove(rangeq.head, &rng)) mem_freerng(rng); return SS$_NORMAL; }" sys$connect(&(prt->rab),0,0); old_prt = prt; } prt = old_prt;/*/** Now we add the article(s) to the print file.*/- while (queue_remove(rangeq.head, &rng)) { int i;0 for (i = rng->first; i <= rng->last; i++) { if (do_headers) {> status = Get_Article_Hdrs(curgroup, i, &hdrq, 1, 0);G if (!OK(status)) lib$signal(NEWS__PRINTERR, 1, i, status, 0); }9 if ((do_headers && OK(status)) || !do_headers) {$ char bodyspec[FSPEC_SIZE];, make_temp_fspec(tmp, sizeof(tmp));9 status = Get_Article_Body(i, tmp, bodyspec, 0); if (!OK(status)) {: lib$signal(NEWS__PRINTERR, 1, i, status, 0); } else { if (did_one) {+ prt->rab.rab$l_rbf = "\014";& prt->rab.rab$w_rsz = 1;( sys$put(&(prt->rab),0,0); } did_one = 1;' prt->rab.rab$l_rbf = tmp; if (do_headers) {A for (hdr = hdrq->head; hdr != (struct HDR *) hdrq;, hdr = hdr->flink) { int hlen;? Format_Header(hdr, tmp, sizeof(tmp), &hlen);- prt->rab.rab$w_rsz = hlen;, sys$put(&(prt->rab),0,0); }& prt->rab.rab$w_rsz = 0;( sys$put(&(prt->rab),0,0); }2 file_open(bodyspec, &unit, 0, 0, 0);E while (OK(file_read(unit, tmp, sizeof(tmp)-1, &len))) {( prt->rab.rab$w_rsz = len; if (rotate) {. struct dsc$descriptor sdsc;* char tmp2[STRING_SIZE];/ INIT_SDESC(sdsc, len, tmp2);. INIT_SDESC(tdsc, len, tmp);D str$translate(&sdsc, &tdsc, &alphabet, &rotabet);- prt->rab.rab$l_rbf = tmp2;, sys$put(&(prt->rab),0,0);, prt->rab.rab$l_rbf = tmp; } else {, sys$put(&(prt->rab),0,0); } } file_close(unit);$ file_delete(bodyspec); } } } mem_freerng(rng); } return SS$_NORMAL;} /* cmd_print */ /***++** ROUTINE: cmd_print_now**** FUNCTIONAL DESCRIPTION:**B** PRINT/NOW command. Sends the pending print job to the queue.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_print_now()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_print_now() { unsigned int status; if (old_prt == NULL) {" lib$signal(NEWS__NOPRINT, 0); } else {$ status = cli_present("NOTIFY");? if (status == CLI$_PRESENT) old_prt->notify = SJC$_NOTIFY;G else if (status == CLI$_NEGATED) old_prt->notify = SJC$_NO_NOTIFY; print_clup(); } return SS$_NORMAL;} /* cmd_print_now */ /***++** ROUTINE: cmd_print_cancel**** FUNCTIONAL DESCRIPTION:**;** PRINT/CANCEL command. Destroys the current print job.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_print_cancel()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/!unsigned int cmd_print_cancel() { if (old_prt == NULL) {" lib$signal(NEWS__NOPRINT, 0); } else {) sys$disconnect(&(old_prt->rab),0,0);) old_prt->fab.fab$l_fop |= FAB$M_DLT;$ sys$close(&(old_prt->fab),0,0); free(old_prt); old_prt = NULL; } return SS$_NORMAL;} /* cmd_print_cancel */ /***++** ROUTINE: print_clup**** FUNCTIONAL DESCRIPTION:**8** Submits the current pending print job to the queue.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** print_clup()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int print_clup() {? static int sjcpar[8] = {SJC$_PARAMETER_1, SJC$_PARAMETER_2,7 SJC$_PARAMETER_3, SJC$_PARAMETER_4,7 SJC$_PARAMETER_5, SJC$_PARAMETER_6,8 SJC$_PARAMETER_7, SJC$_PARAMETER_8};! static TIME zerotime = {0,0};L#define ADD_ITEM(code) {if (code) {ITMLST_INIT(jbclst[j],code,0,0,0); j++;}} struct PRT *prt = old_prt; ITMLST jbclst[25];$ unsigned short iosb[4], statlen; char statmsg[256]; int i, j; unsigned int status;' if (prt == NULL) return SS$_NORMAL;$ sys$disconnect(&(prt->rab),0,0); sys$close(&(prt->fab),0,0); j = 0;< if (memcmp(&prt->after, &zerotime, sizeof(TIME)) != 0) {@ ITMLST_INIT(jbclst[j], SJC$_AFTER_TIME, sizeof(prt->after),* &(prt->after), 0); j++; } if (prt->copies) {B ITMLST_INIT(jbclst[j], SJC$_FILE_COPIES, sizeof(prt->copies),+ &(prt->copies), 0); j++; } ADD_ITEM(prt->burst) ADD_ITEM(prt->feed) ADD_ITEM(prt->flag) ADD_ITEM(prt->hold) ADD_ITEM(prt->notify) ADD_ITEM(prt->space) ADD_ITEM(prt->trailer) if (*(prt->form)) {M ITMLST_INIT(jbclst[j], SJC$_FORM_NAME, strlen(prt->form), prt->form, 0); j++; } for (i = 0; i < 8; i++) { if (*(prt->param[i])) {A ITMLST_INIT(jbclst[j], sjcpar[i], strlen(prt->param[i]),& prt->param[i], 0); j++; } } if (*(prt->queue)) {K ITMLST_INIT(jbclst[j], SJC$_QUEUE, strlen(prt->queue), prt->queue, 0);( } else if (*news_prof.print_queue) {G ITMLST_INIT(jbclst[j], SJC$_QUEUE, strlen(news_prof.print_queue),\< news_prof.print_queue, 0); } else {; ITMLST_INIT(jbclst[j], SJC$_QUEUE, 9, "SYS$PRINT", 0); } j++; if (*(prt->name)) {L ITMLST_INIT(jbclst[j], SJC$_JOB_NAME, strlen(prt->name), prt->name, 0); } else {9 ITMLST_INIT(jbclst[j], SJC$_JOB_NAME, 4, "NEWS", 0); } j++;8 ITMLST_INIT(jbclst[j], SJC$_FILE_IDENTIFICATION, 28,) &(prt->nam.nam$t_dvi), 0); j++;6 ITMLST_INIT(jbclst[j], SJC$_DELETE_FILE, 0, 0, 0); j++; statlen = 0;E ITMLST_INIT(jbclst[j], SJC$_JOB_STATUS_OUTPUT, sizeof(statmsg)-1," statmsg, &statlen); j++;' ITMLST_INIT(jbclst[j], 0, 0, 0, 0);D status = sys$sndjbcw(0, SJC$_ENTER_FILE, 0, jbclst, iosb, 0, 0);% if (OK(status)) status = iosb[0];; if (!OK(status)) lib$signal(NEWS__PRINTERR, 0, status);: if (statlen > 0) put_output_counted(statmsg, statlen); free(prt); old_prt = NULL; return SS$_NORMAL;} /* print_clup */ /***++"** ROUTINE: characteristics_match**** FUNCTIONAL DESCRIPTION:**E** Checks to see if one PRT block's characterstics match another's.D** For compatibility with VMS Mail, all we check are the queue name** and the PARAMETERs values.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** tbs**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: ****** SIDE EFFECTS: None.****--*/Bstatic int characteristics_match(struct PRT *p1, struct PRT *p2) { int i;+ if (p1 == NULL || p2 == NULL) return 0;4 if (strcmp(p1->queue, p2->queue) != 0) return 0; for (i = 0; i < 8; i++) {D; if (strcmp(p1->param[i], p2->param[i]) != 0) return 0;D }0 return 1;*} /* characteristics_match */ 0-SEP-1992 V1.0 Madison Initial coding.E** 15-FEB-1993 V1.0-1 Madison Fix for pre-VMS V5.2 com9~NEWSRDR_SRC.BCK PEWSRDR]CMD_DIRECTORY.C;25O-ײ*[NEWSRDR]CMD_DIRECTORY.C;25+, .-/ @ 4O-)$-P0123KPWO.56LbVʖ7Vʖ8ؾe99G @HJR/***++** FACILITY: NEWSRDR**!** ABSTRACT: Directory commands.**** MODULE DESCRIPTION:**9** This module contains the DIRECTORY command routines.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 09-SEP-1992**** MODIFICATION HISTORY:**1** 09-SEP-1992 V1.0 Madison Initial coding.5** 15-SEP-1992 V1.0-1 Madison Add DIR/GROUP/SORT.D** 15-FEB-1993 V1.0-2 Madison Make compatible with pre-VMS V5.2.K** 24-FEB-1993 V1.0-3 Madison DIR output was incorrect when field width1** exceeded string length.8** 12-APR-1993 V1.1 Madison Get_Article_* changed.D** 17-MAY-1993 V1.1-1 Madison Put_Paged wasn't being used right.**--*/#include "newsrdr.h"#include "globals.h"/*** Forward declarations*/+ unsigned int cmd_dirgroup(void);- static unsigned int cmd_dirgrpclup(void);& unsigned int cmd_dir(void);* static unsigned int cmd_dirclup(void); EXTERN struct GRP *curgroup;& EXTERN int User_Interrupt;" EXTERN int cur_artnum; EXTERN int pb_cols;8 static struct QUE kwque, authq, subjq, excfq, excsq;# static int dir_in_progress = 0;2 static int fromwid, subjwid, doseen, dounseen; static struct GRP *curdgrp;E static int dgctx, doall, print_one, current, next_unseen, dosort;$ static char curstr[STRING_SIZE];( static struct dsc$descriptor curdsc;- extern struct GRP *Traverse_Tree(void *);0 extern unsigned int Traverse_Finish(void *);* extern int Count_Unseen(struct GRP *);2 extern int Next_Unseen_Article(int, int, int);1 extern int Ignore_Article(struct GRP *, int);; extern unsigned int Get_Article_Hdrs(struct GRP *, int,. struct QUE **, int, int *); /***++** ROUTINE: cmd_dirgroup**** FUNCTIONAL DESCRIPTION:**=** DIRECTORY/GROUP command. Also set up to be invoked as aC** default_action, for paging through the group directory listing.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_dirgroup()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_dirgroup() { char tmp[STRING_SIZE], *s; struct dsc$descriptor sdsc; short tlen;/*F** dir_in_progress is set if we're in the middle of a listing. If so,D** we just continue on. Otherwise, we parse the command options and** begin the new listing.*/ if (dir_in_progress) {, default_action = cleanup_action = NULL; if (dir_in_progress == 1) {A curdgrp = (!dosort && news_prof.glist) ? curdgrp->next :) Traverse_Tree(&dgctx); } dir_in_progress = 0; } else {2 dosort = cli_present("SORT") == CLI$_PRESENT;0 doall = cli_present("ALL") == CLI$_PRESENT;1 if (cli_present("GRPNAM") == CLI$_PRESENT) {9 cli_get_value("GRPNAM", curstr, sizeof(curstr)); } else { strcpy(curstr, "*"); }0 INIT_SDESC(curdsc, strlen(curstr), curstr); print_one = dgctx = 0;? curdgrp = (!dosort && news_prof.glist) ? news_prof.glist :% Traverse_Tree(&dgctx); }/*D** curdgrp is set either by traversing the AVL tree of groups, or byG** going through the linked list headed by news_prof.glist. The linkedE** list is created only if the user had a NEWSRC file read in when weG** started. If they specify /SORT, then they'll get the tree traversal ** anyway.*/ while (curdgrp != NULL) { char gup[STRING_SIZE];" strcpy(gup, curdgrp->grpnam); upcase(gup);( INIT_SDESC(sdsc, strlen(gup), gup);/*K** Unless they specify /ALL, they'll only see groups they're subscribed to.*/* if ((curdgrp->subscribed || doall) &&3 OK(str$match_wild(&sdsc, &curdsc))) {G static $DESCRIPTOR(grpfao, "!40AD !11UL !11UL !1AD !7UL");. INIT_SDESC(sdsc, sizeof(tmp)-1, tmp); if (!print_one) {G static $DESCRIPTOR(ctrstr, "!40AD !11AD !11AD !1AD !AD");: sys$fao(&ctrstr, &tlen, &sdsc, 10, "Group name",I 11, "First avail", 10, "Last avail", 1, "S", 7, "#unseen"); *(tmp+tlen) = '\0';" Begin_Paged_Output(tmp); print_one = 1; }- s = curdgrp->subscribed ? "x" : " ";@ sys$fao(&grpfao, &tlen, &sdsc, strlen(curdgrp->grpnam),> curdgrp->grpnam, curdgrp->frstavl, curdgrp->lastavl,' 1, s, Count_Unseen(curdgrp)); *(tmp+tlen) = '\0';# if (!Put_Paged(tmp, -1)) {( default_action = cmd_dirgroup;* cleanup_action = cmd_dirgrpclup; dir_in_progress = 1; return SS$_NORMAL; } }= curdgrp = (!dosort && news_prof.glist) ? curdgrp->next :% Traverse_Tree(&dgctx); }/*J** We get here when we run out of groups. It's just a matter of finishingH** off any paged output that had to be held because we got to the bottomJ** of a screen page, then exiting. We also let the user know if there was ** no match.*/ if (!print_one) {< lib$signal(NEWS__NOGRMATCH, 2, strlen(curstr), curstr); } else { if (!Paged_Output_Done()) {' default_action = cmd_dirgroup;) cleanup_action = cmd_dirgrpclup; dir_in_progress = 2; return SS$_NORMAL; } Finish_Paged_Output(0); } return SS$_NORMAL;} /* cmd_dirgroup */ /***++** ROUTINE: cmd_dirgrpclup**** FUNCTIONAL DESCRIPTION:**:** Cleans up the context from a pending DIRECTORY/GROUP.%** Used as a cleanup_action routine.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** dir_grpclup()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: Many.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/&static unsigned int cmd_dirgrpclup() { if (dir_in_progress) { dir_in_progress = 0; curdgrp = 0;( if (dgctx) Traverse_Finish(&dgctx); Finish_Paged_Output(0);, default_action = cleanup_action = NULL; } return SS$_NORMAL;} /* cmd_dirgrpclup */ /***++** ROUTINE: cmd_dir**** FUNCTIONAL DESCRIPTION:**>** DIRECTORY command. Also set up to handle continuation ofA** an existing directory listing, invoked via the default_action** mechanism.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_dir()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: Many.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_dir() { struct HDR *hdr; struct QUE *hdrqptr;D char tmp[STRING_SIZE], upfrom[STRING_SIZE], upsubj[STRING_SIZE];% char upkw[STRING_SIZE], lines[6];. struct dsc$descriptor sdsc, cand, pattern; char *fromstr, *subj, *cp; short tlen;- int doit, reply_code, junk1, junk2, seen;/*H** Just like DIR/GROUP, dir_in_progress indicates we're in the middle ofK** a listing. If we're not, there's just a lot more options to get through** on the command.*/ if (dir_in_progress) {, default_action = cleanup_action = NULL;) if (dir_in_progress == 1) current++; dir_in_progress = 0; } else { if (curgroup == NULL) {) lib$signal(NEWS__NOCURGROUP, 0); return SS$_NORMAL; }& kwque.head = kwque.tail = &kwque;& authq.head = authq.tail = &authq;& subjq.head = subjq.tail = &subjq;& excsq.head = excsq.tail = &excsq;& excfq.head = excfq.tail = &excfq;2 doseen = cli_present("SEEN") == CLI$_PRESENT;6 dounseen = cli_present("UNSEEN") == CLI$_PRESENT;6 if (!(doseen || dounseen)) doseen = dounseen = 1;/*A** The WIDTH stuff lets the user decide how to format the output.D** It can come from the command itself, from the SET DIRECTORY_WIDTHD** settings, or from the default (an even split). Things are set upE** so that if just one width is specified, the other width (there areI** only two they can pick) is defaulted to be the remaining screen width.*/0 if (cli_present("WIDTH") == CLI$_PRESENT) {9 if (cli_present("WIDTH.FROM") == CLI$_PRESENT) { int i;8 cli_get_value("WIDTH.FROM", tmp, sizeof(tmp));, lib$cvt_dtb(strlen(tmp), tmp, &i);" if (i >= 0) fromwid = i; } else { fromwid = -1; }< if (cli_present("WIDTH.SUBJECT") == CLI$_PRESENT) { int i;; cli_get_value("WIDTH.SUBJECT", tmp, sizeof(tmp));, lib$cvt_dtb(strlen(tmp), tmp, &i);" if (i >= 0) subjwid = i; } else { if (fromwid >= 0) {+ subjwid = pb_cols-20-fromwid;+ if (subjwid < 0) subjwid = 0; } else { subjwid = -1; } } } else {) fromwid = news_prof.dir_fromwid;) subjwid = news_prof.dir_subjwid; } if (fromwid < 0) { if (subjwid < 0) {< fromwid = (pb_cols-20)/2 < 1 ? 1 : (pb_cols-20)/2; } else {' fromwid = pb_cols-20-subjwid;' if (fromwid < 0) fromwid = 0; } } if (subjwid < 0) {& subjwid = pb_cols-20-fromwid;& if (subjwid < 0) subjwid = 0; }/*J** Make sure they didn't stupidly specify some width that was greater than** our fixed string length.*/, if (fromwid+subjwid > STRING_SIZE-30) {@ if (fromwid > STRING_SIZE-30) fromwid = STRING_SIZE-30;* subjwid = STRING_SIZE-30-fromwid; } tmp[0] = '*';2 if (cli_present("EXCLUDE") == CLI$_PRESENT) {; if (cli_present("EXCLUDE.FROM") == CLI$_PRESENT) {J while(OK(cli_get_value("EXCLUDE.FROM", tmp+1, sizeof(tmp)-2))) { upcase(tmp+1);/ if (strchr(tmp+1, '*') == NULL &&0 strchr(tmp+1, '%') == NULL) {" strcat(tmp+1, "*"); cp = tmp; } else { cp = tmp+1; }/ insert_header(cp, excfq.tail, 0); } }> if (cli_present("EXCLUDE.SUBJECT") == CLI$_PRESENT) {M while(OK(cli_get_value("EXCLUDE.SUBJECT", tmp+1, sizeof(tmp)-2))) { upcase(tmp+1);/ if (strchr(tmp+1, '*') == NULL &&0 strchr(tmp+1, '%') == NULL) {" strcat(tmp+1, "*"); cp = tmp; } else { cp = tmp+1; }/ insert_header(cp, excsq.tail, 0); } } }2 if (cli_present("KEYWORD") == CLI$_PRESENT) {D while(OK(cli_get_value("KEYWORD", tmp+1, sizeof(tmp)-2))) { upcase(tmp+1);I if (strchr(tmp+1, '*') == NULL && strchr(tmp+1, '%') == NULL) {! strcat(tmp+1, "*"); cp = tmp; } else { cp = tmp+1; }+ insert_header(cp, kwque.tail, 0); } }/ if (cli_present("FROM") == CLI$_PRESENT) {A while(OK(cli_get_value("FROM", tmp+1, sizeof(tmp)-2))) { upcase(tmp+1);I if (strchr(tmp+1, '*') == NULL && strchr(tmp+1, '%') == NULL) {! strcat(tmp+1, "*"); cp = tmp; } else { cp = tmp+1; }+ insert_header(cp, authq.tail, 0); } }2 if (cli_present("SUBJECT") == CLI$_PRESENT) {D while(OK(cli_get_value("SUBJECT", tmp+1, sizeof(tmp)-2))) { upcase(tmp+1);I if (strchr(tmp+1, '*') == NULL && strchr(tmp+1, '%') == NULL) {! strcat(tmp+1, "*"); cp = tmp; } else { cp = tmp+1; }+ insert_header(cp, subjq.tail, 0); } }1 if (cli_present("ARTNUM") == CLI$_PRESENT) {3 cli_get_value("ARTNUM", tmp, sizeof(tmp));1 lib$cvt_dtb(strlen(tmp), tmp, ¤t); } else { current = cur_artnum; }B if (current < curgroup->frstavl) current = curgroup->frstavl;B if (current > curgroup->lastavl) current = curgroup->lastavl;8 next_unseen = Next_Unseen_Article(current-1, 1, 0); print_one = 0; }/*E** Just loop through all the articles in the group (starting with the$** specified one, if there was one).*/* while (current <= curgroup->lastavl) {/*D** They can use ctrl/c to break out of this, since fetching over all/** those article headers can be time-consuming.*/ if (User_Interrupt) break;/*A** Figure out whether we've seen this article or not by using the)** existing next-unseen ARTICLE routines.*/ if (next_unseen) {' seen = current != next_unseen;& if (current >= next_unseen) {? next_unseen = Next_Unseen_Article(next_unseen, 1, 0); } } else seen = 1;4 doit = (doseen && seen) || (dounseen && !seen);/*O** Check to see if we're ignoring this article. If so, skip it. (New for V4.0)*/9 if (doit) doit = !Ignore_Article(curgroup, current);/*=** Fetch the headers we're interested in from the header list*/ if (doit) { int i; strcpy(lines, " ");G if (OK(Get_Article_Hdrs(curgroup, current, &hdrqptr, 1, 0))) {B for (hdr = hdrqptr->head; hdr != (struct HDR *) hdrqptr;' hdr = hdr->flink) {! switch(hdr->code) {# case NEWS_K_HDR_FROM:" fromstr = hdr->str;' strcpy(upfrom, fromstr); upcase(upfrom); break;& case NEWS_K_HDR_SUBJECT: subj = hdr->str;$ strcpy(upsubj, subj); upcase(upsubj); break;' case NEWS_K_HDR_KEYWORDS:& strcpy(upkw, hdr->str); upcase(upkw); break;$ case NEWS_K_HDR_LINES:$ i = strlen(hdr->str); if (i > 5) {* strcpy(lines, "*****"); } else {3 strncpy(lines+5-i, hdr->str, i); } break; default: break; } }/*5** Check the /KEYWORDS list to see if we have a match*/& doit = kwque.head == &kwque;> for (hdr = kwque.head; hdr != (struct HDR *) &kwque;' hdr = hdr->flink) {+ if (strstr(upkw, hdr->str)) { doit = 1; break; } }/*2** Check thge /FROM list to see if we have a match*/ if (doit) {* doit = authq.head == &authq;7 INIT_SDESC(cand, strlen(upfrom), upfrom);B for (hdr = authq.head; hdr != (struct HDR *) &authq;' hdr = hdr->flink) {? INIT_SDESC(pattern, strlen(hdr->str), hdr->str);9 if (OK(str$match_wild(&cand, &pattern))) { doit = 1; break; } } }/*8** Check the /EXCLUDE=FROM list to see if we should skip*/ if (doit) {7 INIT_SDESC(cand, strlen(upfrom), upfrom);B for (hdr = excfq.head; hdr != (struct HDR *) &excfq;' hdr = hdr->flink) {? INIT_SDESC(pattern, strlen(hdr->str), hdr->str);9 if (OK(str$match_wild(&cand, &pattern))) { doit = 0; break; } } }/*4** Check the /SUBJECT list to see if we have a match*/ if (doit) {* doit = subjq.head == &subjq;7 INIT_SDESC(cand, strlen(upsubj), upsubj);EB for (hdr = subjq.head; hdr != (struct HDR *) &subjq;' hdr = hdr->flink) {o? INIT_SDESC(pattern, strlen(hdr->str), hdr->str);*9 if (OK(str$match_wild(&cand, &pattern))) {9 doit = 1; break;E } }i }-/*;** Check the /EXCLUDE=SUBJECT list to see if we should skip.*/ if (doit) {l7 INIT_SDESC(cand, strlen(upsubj), upsubj);IB for (hdr = excsq.head; hdr != (struct HDR *) &excsq;' hdr = hdr->flink) {3? INIT_SDESC(pattern, strlen(hdr->str), hdr->str); 9 if (OK(str$match_wild(&cand, &pattern))) {c doit = 0; break;d } } }g/*D** Ok, we really should display this. Took long enough to get here./** Set up the formatting string and display it. */ if (doit) {XE static $DESCRIPTOR(ctrstr, "!1AD !6UL !5AD !#AD !#AD");  if (!print_one) {  print_one = 1;/ strcpy(tmp, " Article Lines ");q cp = tmp+16;i0 if (fromwid < 6 && fromwid > 0) {4 strncpy(cp, "From ", fromwid+2);# cp += fromwid+2;e( } else if (fromwid > 0) { int i;;A for (i = fromwid/2-2; i > 0; i--) *cp++ = ' '; & strcpy(cp, "From"); cp += 4;dK for (i = fromwid-(fromwid/2-2)-2; i>0; i--) *cp++ = ' ';A }0 if (subjwid < 9 && subjwid > 0) {7 strncpy(cp, "Subject ", subjwid+2);R# cp += subjwid+2; ( } else if (subjwid > 0) { int i;*A for (i = subjwid/2-3; i > 0; i--) *cp++ = ' '; ) strcpy(cp, "Subject");i cp += 4;oK for (i = subjwid-(subjwid/2-2)-5; i>0; i--) *cp++ = ' ';t } *cp = '\0';' Begin_Paged_Output(tmp);: }M3 INIT_SDESC(sdsc, sizeof(tmp)-1, tmp);*C sys$fao(&ctrstr, &tlen, &sdsc, 1, (seen ? "*" : " "), G current, strlen(lines), lines, fromwid, strlen(fromstr),R5 fromstr, subjwid, strlen(subj), subj);h! *(tmp+tlen) = '\0';s( if (!Put_Paged(tmp, -1)) {( default_action = cmd_dir;, cleanup_action = cmd_dirclup;# dir_in_progress = 1;_! return SS$_NORMAL;  }= }i } } current += 1; }s/*F** We get here when we run out of articles. Flush any pending output.*/ if (print_one) {3 if (!Paged_Output_Done() && !User_Interrupt) {r" default_action = cmd_dir;& cleanup_action = cmd_dirclup; dir_in_progress = 2;N return SS$_NORMAL; } else {l Finish_Paged_Output(0); } }s cmd_dirclup(); return SS$_NORMAL;} /* cmd_dir */c t/***++** ROUTINE: cmd_dirclup**** FUNCTIONAL DESCRIPTION:(**A** Cleans up the static context of a pending directory listing.s1** Invoked through the cleanup_action mechanism.i**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_dirclup()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.d**** COMPLETION CODES:I"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/#static unsigned int cmd_dirclup() {u struct HDR *hdr; if (dir_in_progress > 0) { dir_in_progress = 0;D current = 0;p Finish_Paged_Output(0);= while (queue_remove(kwque.head, &hdr)) mem_freehdr(hdr);/= while (queue_remove(authq.head, &hdr)) mem_freehdr(hdr);s= while (queue_remove(subjq.head, &hdr)) mem_freehdr(hdr);(= while (queue_remove(excfq.head, &hdr)) mem_freehdr(hdr);S= while (queue_remove(excsq.head, &hdr)) mem_freehdr(hdr); , default_action = cleanup_action = NULL; }! return SS$_NORMAL;} /* cmd_dirclup */sc, 10, "Group name",I 11, "First avail", 10, "Last avail", 1, "S", 7, "#unseen"); *(tmp+tlen) = '\0';" Begin_Paged_Output(tmp); print_one = 1; }- s =)~NEWSRDR_SRC.BCKPP[NEWSRDR]CMD_POST.C;43QAc*[NEWSRDR]CMD_POST.C;43+,P.A/ @ 4QA>~-P0123KPWO?567^8rf99G @HJz/***++** FACILITY: NEWSRDR**3** ABSTRACT: Commands related to posting articles.**** MODULE DESCRIPTION:**?** This module contains the routines that implement the POST,** MAIL, and REPLY commands.**** AUTHOR: M. Madison:** COPYRIGHT 1992, 1993 MATTHEW D. MADISON. "** ALL RIGHTS RESERVED.**** CREATION DATE: 04-SEP-1992**** MODIFICATION HISTORY:**1** 04-SEP-1992 V1.0 Madison Initial coding.?** 17-SEP-1992 V1.0-1 Madison Fix follwup-to: poster check.3** 22-SEP-1992 V1.0-2 Madison Fix STORE mix-up.H** 30-SEP-1992 V1.0-3 Madison Missing header separator in FWD/STORE.G** 01-OCT-1992 V1.0-4 Madison Must lower-case group names on REPLY.?** 07-OCT-1992 V1.0-5 Madison cli_get_value("OK"...)? Duh.E** 23-DEC-1992 V1.0-6 Madison Fix Post_Article return-code check.:** 23-MAR-1993 V1.0-7 Madison Fix file_read reference.9** 08-APR-1993 V1.0-8 Madison Fix REPLY/DISTRIBUTION.8** 12-APR-1993 V1.1 Madison Get_Article_* changes.**--*/#include "newsrdr.h"#include "globals.h" EXTERN struct GRP *curgroup;! EXTERN int cur_artnum;#ifdef __GNUC__*#define RMS$_EOF ((unsigned int) rms$_eof)# extern unsigned int rms$_eof();#else#pragma nostandard& globalvalue unsigned int RMS$_EOF;#pragma standard#endif* extern struct GRP *Find_Group(char *);7 extern int Post_Article(struct QUE *, char *, int);8 extern unsigned int csl_parse(char *, struct QUE *);I extern int Mail_Message(struct QUE *, char *, char *, int, int, int);P extern unsigned int Get_Article_Hdrs(struct GRP *, int, void *, int, int *);E extern unsigned int Get_Article_Body(int, char *, char *, int *);@ extern unsigned int Parse_ToList(char *, struct QUE *, int);1 extern void Make_Return_Address(char *, int);  /***++** ROUTINE: cmd_post**** FUNCTIONAL DESCRIPTION:**** POST command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_post()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_post() {B char tmp[STRING_SIZE], ngstr[STRING_SIZE], inspec[FSPEC_SIZE];D char outspec[FSPEC_SIZE], dist[STRING_SIZE], fupto[STRING_SIZE]; char *ngp, *dcp, *fcp; struct HDR *h; struct QUE hdrq;2 int is_temp, edit_flag, go_ahead, use_sigfile; unsigned int status;" hdrq.head = hdrq.tail = &hdrq; ngstr[0] = '\0'; ngp = ngstr;/*E** The server told us whether we could post or not when we connected.*/ if (!news_cfg.postingok) {$ lib$signal(NEWS__NOPOSTING, 0); return SS$_NORMAL; }/*C** Get the group(s) we're posting to. Assume current group if none ** given.*/; while (OK(cli_get_value("GRPNAM", tmp, sizeof(tmp)))) { struct GRP *g; locase(tmp); g = Find_Group(tmp); if (g == NULL) {: lib$signal(NEWS__NOSUCHGRP, 2, strlen(tmp), tmp); return SS$_NORMAL; }$ if (ngp != ngstr) *ngp++ = ','; strcpy(ngp, g->grpnam); ngp+= strlen(g->grpnam); } *ngp = '\0'; if (ngp == ngstr) { if (curgroup == NULL) {) lib$signal(NEWS__NOCURGROUP, 0); return SS$_NORMAL; } else {) strcpy(ngstr, curgroup->grpnam);E lib$signal(NEWS__USINGCURGROUP, 2, strlen(curgroup->grpnam),! curgroup->grpnam); } }; insert_header(ngstr, hdrq.tail, NEWS_K_HDR_NEWSGROUPS);/*** Get the article subject*/ tmp[0] = '\0';$ status = cli_present("SUBJECT");! if (status == CLI$_PRESENT) {9 status = cli_get_value("SUBJECT", tmp, sizeof(tmp));( } else if (status != CLI$_NEGATED) {5 status = get_cmd(tmp, sizeof(tmp), "Subject: "); }B if (tmp[0]) insert_header(tmp, hdrq.tail, NEWS_K_HDR_SUBJECT);/* ** Do we use the signature file?*/& status = cli_present("SIGNATURE");F use_sigfile = (news_prof.autosigpost && status != CLI$_NEGATED) ||8 (!news_prof.autosigpost && status == CLI$_PRESENT);/*** Set the distribution header*/) status = cli_present("DISTRIBUTION");! if (status == CLI$_PRESENT) {) char dist[STRING_SIZE], *dcp = dist;B while (OK(cli_get_value("DISTRIBUTION", tmp, sizeof(tmp)))) {' if (dcp != dist) *dcp++ = ','; locase(tmp); strcpy(dcp, tmp); dcp += strlen(tmp); } *dcp = '\0';= insert_header(dist, hdrq.tail, NEWS_K_HDR_DISTRIBUTION); }/*** Set the Followup-to header.*/( status = cli_present("FOLLOWUP_TO");! if (status == CLI$_PRESENT) {+ char fupto[STRING_SIZE], *fcp = fupto;A while (OK(cli_get_value("FOLLOWUP_TO", tmp, sizeof(tmp)))) {( if (fcp != fupto) *fcp++ = ','; locase(tmp); strcpy(fcp, tmp); fcp += strlen(tmp); } *fcp = '\0';= insert_header(fupto, hdrq.tail, NEWS_K_HDR_FOLLOWUP_TO); }/*-** Get the input file name, if one was given.*/" inspec[0] = outspec[0] = '\0';0 if (cli_present("INPFIL") == CLI$_PRESENT) {5 cli_get_value("INPFIL", inspec, sizeof(inspec));5 } else if (cli_present("FILE") == CLI$_PRESENT) {3 cli_get_value("FILE", inspec, sizeof(inspec)); }/*>** Compose_Message prompts the user for message text, or fires** up the text editor.*/! status = cli_present("EDIT");= edit_flag = (news_prof.edit && status != CLI$_NEGATED) ||# (status == CLI$_PRESENT);C status = Compose_Message(inspec, outspec, edit_flag, &is_temp);/*C** If all went ok, give the user a chance to back out. If she says** it's OK, then post away.*/ if (!OK(status)) {, lib$signal(NEWS__COMPOSERR, 0, status); } else if (!outspec[0]) {$ lib$signal(NEWS__CANCELLED, 0); } else {' strcpy(tmp, "Ready to post to: "); strcat(tmp, ngstr); put_output(tmp);2 go_ahead = Yes_Answer("Okay to proceed?", 1);L if (go_ahead) go_ahead = OK(Post_Article(&hdrq, outspec, use_sigfile)); if (!go_ahead && is_temp) {D go_ahead = !Yes_Answer("Keep file containing message?", 0); }3 if (go_ahead && is_temp) file_delete(outspec); else if (is_temp) {( strcpy(tmp, "Did not delete "); strcat(tmp, outspec); put_output(tmp); } }/* ** Clean up*/7 while (queue_remove(hdrq.head, &h)) mem_freehdr(h); return SS$_NORMAL;} /* cmd_post */ /***++** ROUTINE: cmd_mail**** FUNCTIONAL DESCRIPTION:**** MAIL command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_mail()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_mail() {D char tmp[STRING_SIZE], subjstr[STRING_SIZE], tostr[STRING_SIZE];2 char infspec[FSPEC_SIZE], outspec[FSPEC_SIZE]; char *cp; struct HDR *h; struct QUE hdrq, destq;7 int edit_flag, is_temp, go_ahead, use_sigfile, len; unsigned int status;" hdrq.head = hdrq.tail = &hdrq;% destq.head = destq.tail = &destq;/*A** Build the to list, if it was given on the command. Otherwise,!** prompt the user for addresses.*/7 while (OK(cli_get_value("TO", tmp, sizeof(tmp)))) {' insert_header(tmp, destq.tail, 0); } if (destq.head == &destq) {0 status = get_cmd(tmp, sizeof(tmp), "To: "); len = strlen(tmp);2 while (len > 0 && isspace(tmp[len-1])) len--; if (len == 0) { status = RMS$_EOF; } else { tmp[len] = '\0';9 for (cp = tmp; *cp && isspace(*cp); cp++) len--;* if (len == 0) status == RMS$_EOF;- else status = csl_parse(cp, &destq); } if (!OK(status)) {< while(queue_remove(destq.head, &h)) mem_freehdr(h);" if (status != RMS$_EOF) {; lib$signal(NEWS__MAILERR, 0, NEWS__ADDRSYNTX, 0); } return SS$_NORMAL; } }/*(** Build the To: header for the message.*/  cp = tostr;D for (h = destq.head; h != (struct HDR *) &destq; h = h->flink) {" if (cp != tostr) *cp++ = ','; strcpy(cp, h->str); cp += strlen(h->str); } *cp = '\0';/*** Set up the Subject: header*/$ status = cli_present("SUBJECT");! if (status == CLI$_PRESENT) {A status = cli_get_value("SUBJECT", subjstr, sizeof(subjstr));( } else if (status != CLI$_NEGATED) {= status = get_cmd(subjstr, sizeof(subjstr), "Subject: ");( if (!OK(status)) return SS$_NORMAL; }/*"** Should we use a signature file?*/& status = cli_present("SIGNATURE");F use_sigfile = (news_prof.autosigmail && status != CLI$_NEGATED) ||? (!news_prof.autosigmail && status == CLI$_PRESENT);/*:** If the user specified a file to be mailed, then use it.*/ infspec[0] = '\0';5 cli_get_value("FSPEC", infspec, sizeof(infspec));! status = cli_present("EDIT");= edit_flag = (news_prof.edit && status != CLI$_NEGATED) ||# (status == CLI$_PRESENT);/*D** Use Compose_Message to enter the message or edit it, or whatever.*/ outspec[0] = '\0';D status = Compose_Message(infspec, outspec, edit_flag, &is_temp);/*E** If the compose went ok, give the user one more chance to back out.** If ok by her, then mail it.*/ if (!OK(status)) {, lib$signal(NEWS__COMPOSERR, 0, status); } else if (!outspec[0]) {$ lib$signal(NEWS__CANCELLED, 0); } else {' strcpy(tmp, "Ready to mail to: "); strcat(tmp, tostr); put_output(tmp);2 go_ahead = Yes_Answer("Okay to proceed?", 1); if (go_ahead) { int copy_self;& status = cli_present("SELF");0 copy_self = (status == CLI$_PRESENT) ||7 (news_prof.csmail && status != CLI$_NEGATED);G go_ahead = Mail_Message(&destq, subjstr, outspec, use_sigfile,! copy_self, 0); }/*D** If the user decided not to mail the message, ask her if she wantsD** to keep the message contents. Otherwise, blow it away (if it was** a file we created.*/ if (!go_ahead && is_temp) {D go_ahead = !Yes_Answer("Keep file containing message?", 0); }3 if (go_ahead && is_temp) file_delete(outspec); else if (is_temp) {( strcpy(tmp, "Did not delete "); strcat(tmp, outspec); put_output(tmp); } }/* ** Clean up*/8 while (queue_remove(destq.head, &h)) mem_freehdr(h); return SS$_NORMAL;} /* cmd_mail */ /***++** ROUTINE: cmd_reply**** FUNCTIONAL DESCRIPTION:**** REPLY command.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_reply()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_reply() {# struct QUE *hdrq, newhq, destq;5 char diststr[STRING_SIZE], groupstr[STRING_SIZE];L char subjstr[STRING_SIZE], msgidstr[STRING_SIZE], fuptostr[STRING_SIZE];F char newfupto[STRING_SIZE], refstr[STRING_SIZE], tmp[STRING_SIZE];2 char infspec[FSPEC_SIZE], outspec[FSPEC_SIZE]; struct HDR *hdr; char *cp, *fromstr;F int edit_flag, extract, post_reply, mail_reply, go_ahead, is_temp; int use_sigp, use_sigm; unsigned int status; if (curgroup == NULL) {% lib$signal(NEWS__NOCURGROUP, 0); return SS$_NORMAL; } if (cur_artnum == 0) {# lib$signal(NEWS__NOCURART, 0); return SS$_NORMAL; }/*F** Replies are a little bit complicated, since they can be both posted?** and mailed. Let's find out what we're supposed to be doing.*/5 post_reply = cli_present("POST") == CLI$_PRESENT;5 mail_reply = cli_present("MAIL") == CLI$_PRESENT;& if (!(post_reply || mail_reply)) {& post_reply = news_prof.replypost;& mail_reply = news_prof.replymail; }/*F** Check to make sure postings are OK (from the banner message when we** first conneted.*/, if (post_reply && !news_cfg.postingok) {$ lib$signal(NEWS__NOPOSTING, 0); return SS$_NORMAL; }/*C** We need information from the current article's headers. Some of#** it is also settable by the user.*/C *groupstr = *subjstr = *fuptostr = *infspec = *outspec = *tmp =/ *diststr = *refstr = *newfupto = '\0';% destq.head = destq.tail = &destq; if (post_reply) { cp = groupstr;< while (OK(cli_get_value("GRPNAM", tmp, sizeof(tmp)))) { struct GRP *g; locase(tmp); g = Find_Group(tmp); if (g == NULL) {; lib$signal(NEWS__NOSUCHGRP, 2, strlen(tmp), tmp); return SS$_NORMAL; }) if (cp != groupstr) *cp++ = ','; strcpy(cp, tmp); cp += strlen(tmp); } *cp = '\0'; }. if (*groupstr) strcpy(fuptostr, groupstr); if (mail_reply) {- if (cli_present("TO") == CLI$_PRESENT) {< while (OK(cli_get_value("TO", tmp, sizeof(tmp)))) {, insert_header(tmp, destq.tail, 0); } } }A status = Get_Article_Hdrs(curgroup, cur_artnum, &hdrq, 0, 0); if (!OK(status)) {+ lib$signal(NEWS__REPLYERR, 0, status); return SS$_NORMAL; }J for (hdr = hdrq->head; hdr != (struct HDR *) hdrq; hdr = hdr->flink) { switch (hdr->code) { case NEWS_K_HDR_FROM: fromstr = hdr->str; break; case NEWS_K_HDR_REPLY_TO:3 if (mail_reply && destq.head == &destq) {0 Parse_ToList(hdr->str, &destq, 0); } break; case NEWS_K_HDR_NEWSGROUPS:5 if (!*groupstr) strcpy(groupstr, hdr->str); break; case NEWS_K_HDR_SUBJECT:$ strcpy(subjstr, hdr->str); break;! case NEWS_K_HDR_FOLLOWUP_TO:5 if (!*fuptostr) strcpy(fuptostr, hdr->str); break;" case NEWS_K_HDR_DISTRIBUTION:$ strcpy(diststr, hdr->str); break; case NEWS_K_HDR_REFERENCES:# strcpy(refstr, hdr->str); break; case NEWS_K_HDR_MESSAGE_ID:% strcpy(msgidstr, hdr->str); break; } }/*G** If the article has a Followup-To: poster header, then we're supposed** to mail the reply only.*/ if (post_reply) {1 if (streql_case_blind(fuptostr, "poster")) { post_reply = 0; mail_reply = 1;' lib$signal(NEWS__MUSTMAIL, 0); } }/*+** Build the list of recipients if mailing.*/- if (mail_reply && destq.head == &destq) {& Parse_ToList(fromstr, &destq, 0); if (destq.head == &destq) {= lib$signal(NEWS__REPLYERR, 0, NEWS__NOREPLYADDR, 0); return SS$_NORMAL; } }/*!** Subject header for new article*/$ status = cli_present("SUBJECT");! if (status == CLI$_NEGATED) { *subjstr = '\0';( } else if (status == CLI$_PRESENT) {8 cli_get_value("SUBJECT", subjstr, sizeof(subjstr)); } else {0 if (streql_case_blind(subjstr, "(none)")) { *subjstr = '\0';9 } else if (!strneql_case_blind(subjstr, "Re:", 3)) {8 memmove(subjstr+4, subjstr, strlen(subjstr)+1);$ memcpy(subjstr, "Re: ", 4); } }/*** Signature file?*/& status = cli_present("SIGNATURE");C use_sigp = (news_prof.autosigpost && status != CLI$_NEGATED) ||% (status == CLI$_PRESENT);C use_sigm = (news_prof.autosigmail && status != CLI$_NEGATED) ||% (status == CLI$_PRESENT);/*"** Distribution header for article*/) status = cli_present("DISTRIBUTION");+! if (status == CLI$_PRESENT) {B cp = diststr;B while (OK(cli_get_value("DISTRIBUTION", tmp, sizeof(tmp)))) {( if (cp != diststr) *cp++ = ','; locase(tmp);A strcpy(cp, tmp);* cp += strlen(tmp); } *cp = '\0'; } /*&** Followup-to header for new article.*/( status = cli_present("FOLLOWUP_TO");! if (status == CLI$_PRESENT) {O cp = newfupto;-A while (OK(cli_get_value("FOLLOWUP_TO", tmp, sizeof(tmp)))) {d) if (cp != newfupto) *cp++ = ',';2 locase(tmp);s strcpy(cp, tmp);  cp += strlen(tmp);  } *cp = '\0'; }T/*C** Let's see if this is a REPLY/EXTRACT. If so, we get the currentYA** article's contents, stick a '>' on the front of each line, and2** use that as the input file for Compose_Message.*/! status = cli_present("EDIT");V+ edit_flag = (status == CLI$_PRESENT) || 9 (news_prof.edit && status != CLI$_NEGATED); 5 extract = cli_present("EXTRACT") != CLI$_NEGATED;* edit_flag |= extract;" if (extract) {/ char temp0[FSPEC_SIZE], temp1[FSPEC_SIZE];i unsigned int runit, wunit;_ int len;n+ make_temp_fspec(temp0, sizeof(temp0));n/ make_temp_fspec(infspec, sizeof(infspec));n< status = Get_Article_Body(cur_artnum, temp0, temp1, 0); if (!OK(status)) {r/ lib$signal(NEWS__REPLYERR, 0, status);_ return SS$_NORMAL;  }0 status = file_open(temp1, &runit, 0, 0, 0); if (!OK(status)) {i file_delete(temp1);/ lib$signal(NEWS__REPLYERR, 0, status);n return SS$_NORMAL;  }7 status = file_create(infspec, &wunit, 0, infspec);_ if (!OK(status)) {  file_close(runit);  file_delete(temp1); return SS$_NORMAL;i } strcpy(tmp, "In article "); strcat(tmp, msgidstr);c strcat(tmp, ", ");N% if (mail_reply && !post_reply) {.# strcat(tmp, "you write:");r } else {r strcat(tmp, fromstr);! strcat(tmp, " writes:");* }) file_write(wunit, tmp, strlen(tmp));  *tmp = '>';? while (OK(file_read(runit, tmp+1, sizeof(tmp)-2, &len))) {' file_write(wunit, tmp, len+1);- } file_close(wunit); file_close(runit);E file_delete(temp1); }_/*;** Now use Compose_Message for entry/editing of reply text.N*/ *outspec = '\0';D status = Compose_Message(infspec, outspec, edit_flag, &is_temp);# if (!OK(status) || !*outspec) {  if (!OK(status)) {0 lib$signal(NEWS__COMPOSERR, 0, status); } else { % lib$signal(NEWS__CANCELLED);h }( if (*outspec) file_delete(outspec);' if (extract) file_delete(infspec);b return SS$_NORMAL;0 } /*H** Now actually build the headers for the new article/mail message, then"** get confirmation from the user.*/% newhq.head = newhq.tail = &newhq;  if (post_reply) { 0 if (!*fuptostr) strcpy(fuptostr, groupstr);@ insert_header(fuptostr, newhq.tail, NEWS_K_HDR_NEWSGROUPS);J if (*subjstr) insert_header(subjstr, newhq.tail, NEWS_K_HDR_SUBJECT);O if (*diststr) insert_header(diststr, newhq.tail, NEWS_K_HDR_DISTRIBUTION);rP if (*newfupto) insert_header(newfupto, newhq.tail, NEWS_K_HDR_FOLLOWUP_TO); if (*refstr) {5 if (strlen(refstr) < 255+strlen(msgidstr)) {t strcat(refstr, ",");# strcat(refstr, msgidstr);p }B insert_header(refstr, newhq.tail, NEWS_K_HDR_REFERENCES); } else {cD insert_header(msgidstr, newhq.tail, NEWS_K_HDR_REFERENCES); }' strcpy(tmp, "Ready to post to: ");t strcat(tmp, fuptostr);= put_output(tmp);i }" if (mail_reply) {s struct HDR *h;' strcpy(tmp, "Ready to mail to: ");p cp = tmp+18; E for (h = destq.head; h != (struct HDR *) &destq; h = h->flink) {o6 if (cp != tmp+18) {*cp++ = ','; *cp++ = ' ';} strcpy(cp, h->str); cp += strlen(h->str); } put_output(tmp);  }=/ go_ahead = Yes_Answer("Ok to proceed?", 1);_/*(** If the user says it's OK, then do it.*/ if (go_ahead) {oL if (post_reply) go_ahead = OK(Post_Article(&newhq, outspec, use_sigp));" if (mail_reply && go_ahead) { int copy_self;$& status = cli_present("SELF");0 copy_self = (status == CLI$_PRESENT) ||8 (news_prof.csreply && status != CLI$_NEGATED);D go_ahead = Mail_Message(&destq, subjstr, outspec, use_sigm, copy_self, 0); } }c/*9** Find out if we should keep or delete the message file.T*/& if (extract) file_delete(infspec); if (!go_ahead && is_temp) {e@ go_ahead = !Yes_Answer("Keep file containing message?", 0); }T2 if (go_ahead && is_temp) file_delete(outspec); else if (is_temp) {s$ strcpy(tmp, "Did not delete "); strcat(tmp, outspec); put_output(tmp);  }p/* ** Clean up */< while (queue_remove(newhq.head, &hdr)) mem_freehdr(hdr);< while (queue_remove(destq.head, &hdr)) mem_freehdr(hdr); return SS$_NORMAL;} /* cmd_reply */ //***++** ROUTINE: cmd_forward**** FUNCTIONAL DESCRIPTION:=** ** FORWARD and STORE commands.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_forward()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: None.o**** COMPLETION CODES:e/** SS$_NORMAL: Normal successful completion.t**** SIDE EFFECTS: None.****--*/unsigned int cmd_forward() { struct QUE *hdrq, destq;H char subjstr[STRING_SIZE], infspec[FSPEC_SIZE], outspec[FSPEC_SIZE];D char tmp[STRING_SIZE], tostr[STRING_SIZE], bodyfile[FSPEC_SIZE]; struct HDR *h, *hdr; char *cp;pE int edit_flag, is_temp, go_ahead, use_sigfile, artnum, store_cmd;,& unsigned int runit, wunit, status; if (curgroup == NULL) {C% lib$signal(NEWS__NOCURGROUP, 0);m return SS$_NORMAL; }s/*?** Initialize and check to see if we are FORWARDing or STORing."*/: *subjstr = *infspec = *outspec = *tmp = *tostr = '\0';- cli_get_value("$VERB", tmp, sizeof(tmp));!- store_cmd = strncmp(tmp, "STOR", 4) == 0;s% destq.head = destq.tail = &destq;0/*** Which article?h*/0 if (cli_present("ARTNUM") == CLI$_PRESENT) {/ cli_get_value("ARTNUM", tmp, sizeof(tmp));", lib$cvt_dtb(strlen(tmp), tmp, &artnum);! } else if (cur_artnum == 0) {' lib$signal(NEWS__NOCURART, 0);m return SS$_NORMAL;d } else { artnum = cur_artnum;c } /*E** If this is a STORE, then we send to ourselves. Otherwise, we send*#** to whoever the user tells us to.:*/ if (!store_cmd) {g8 while (OK(cli_get_value("TO", tmp, sizeof(tmp)))) {+ insert_header(tmp, destq.tail, 0);* } if (destq.head == &destq) {+ get_cmd(tmp, sizeof(tmp), "To: ");c) status = csl_parse(tmp, &destq);  if (!OK(status)) {nB while (queue_remove(destq.head, &hdr)) mem_freehdr(hdr);: lib$signal(NEWS__FWDERR, 0, NEWS__ADDRSYNTX, 0); return SS$_NORMAL; } }% status = cli_present("SUBJECT");n" if (status == CLI$_PRESENT) {E status = cli_get_value("SUBJECT", subjstr, sizeof(subjstr)); ) } else if (status != CLI$_NEGATED) {qA status = get_cmd(subjstr, sizeof(subjstr), "Subject: ");h, if (!OK(status)) return SS$_NORMAL; } }O/*B** We need the headers early so we can get the Subject header out.*/= status = Get_Article_Hdrs(curgroup, artnum, &hdrq, 0, 0);  if (!OK(status)) {) lib$signal(NEWS__FWDERR, 0, status);  return SS$_NORMAL;e }n if (store_cmd) {K for (hdr = hdrq->head; hdr != (struct HDR *) hdrq; hdr = hdr->flink) { / if (hdr->code == NEWS_K_HDR_SUBJECT) {*$ strcpy(subjstr, hdr->str); break; } } }s/*** Build the message to be sent */. make_temp_fspec(infspec, sizeof(infspec));6 status = file_create(infspec, &wunit, 0, infspec); if (!OK(status)) {) lib$signal(NEWS__FWDERR, 0, status);  return SS$_NORMAL;  } J for (hdr = hdrq->head; hdr != (struct HDR *) hdrq; hdr = hdr->flink) { int len;=0 Format_Header(hdr, tmp, sizeof(tmp), &len);! file_write(wunit, tmp, len);i }= file_write(wunit, "", 0);p file_close(wunit);& make_temp_fspec(tmp, sizeof(tmp));8 status = Get_Article_Body(artnum, tmp, bodyfile, 0); if (!OK(status)) { file_delete(infspec);= while (queue_remove(destq.head, &hdr)) mem_freehdr(hdr);f) lib$signal(NEWS__FWDERR, 0, status);_ return SS$_NORMAL;  }(/**** Append the article body to the message.*/0 status = Copy_File(bodyfile, infspec, 0, 1); file_delete(bodyfile); if (!OK(status)) { file_delete(infspec);= while (queue_remove(destq.head, &hdr)) mem_freehdr(hdr);) lib$signal(NEWS__FWDERR, 0, status);u return SS$_NORMAL;* } /* ** Signature?f*/ if (store_cmd) { use_sigfile = 0;] } else {' status = cli_present("SIGNATURE");f. use_sigfile = (status == CLI$_PRESENT) ||B (news_prof.autosigmail && status != CLI$_NEGATED); }a cp = tostr;D for (h = destq.head; h != (struct HDR *) &destq; h = h->flink) {1 if (cp != tostr) {*cp++ = ','; *cp++ = ' ';}m strcpy(cp, h->str); cp += strlen(h->str); }* *cp = '\0';e/*** FORWARDs can be editedn*/ if (store_cmd) { edit_flag = 0;. } else {" status = cli_present("EDIT");, edit_flag = (status == CLI$_PRESENT) ||9 (news_prof.edit && status != CLI$_NEGATED);e } D status = Compose_Message(infspec, outspec, edit_flag, &is_temp);/*D** If there was a problem or the forward was cancelled, clean up and** get out of here. */* if (!OK(status) || *outspec == '\0') { if (!OK(status)) {e0 lib$signal(NEWS__COMPOSERR, 0, status); } else {s( lib$signal(NEWS__CANCELLED, 0); }3 if (is_temp && *outspec) file_delete(outspec);  file_delete(infspec);= while (queue_remove(destq.head, &hdr)) mem_freehdr(hdr);e return SS$_NORMAL;* }p/*6** STOREs are automatic. Otherwise, get confirmation.*/ if (store_cmd) { go_ahead = 1; } else {' strcpy(tmp, "Ready to mail to: ");e strcat(tmp, tostr); put_output(tmp);h2 go_ahead = Yes_Answer("Okay to proceed?", 1); }m/*%** If the user says OK, then mail it.;*/ if (go_ahead) {t int copy_self;o if (store_cmd) { copy_self = 0; } else { & status = cli_present("SELF");0 copy_self = (status == CLI$_PRESENT) ||: (news_prof.csfwd && status != CLI$_NEGATED); }C Mail_Message(&destq, subjstr, outspec, use_sigfile, copy_self,r store_cmd); }/* ** Clean up*/ file_delete(infspec);C& if (is_temp) file_delete(outspec);< while (queue_remove(destq.head, &hdr)) mem_freehdr(hdr); return SS$_NORMAL;} /* cmd_forward */  n/***++** ROUTINE: cmd_cancelr**** FUNCTIONAL DESCRIPTION: **A** CANCEL command. Builds a "cancel" control message to cancelJ** an article. It first checks to make sure that the current user posted)** the article that should be cancelled.R**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** cmd_cancel()p**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: None. **** COMPLETION CODES: /** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/unsigned int cmd_cancel() {r char tmp[STRING_SIZE]; struct QUE *hdrqptr, hdrq; struct HDR *hdr, *msgid; int chkdfrom, artnum; unsigned int status; if (curgroup == NULL) {n% lib$signal(NEWS__NOCURGROUP, 0);e return SS$_NORMAL;e }p/*** Which article?*/0 if (cli_present("ARTNUM") == CLI$_PRESENT) {/ cli_get_value("ARTNUM", tmp, sizeof(tmp));E, lib$cvt_dtb(strlen(tmp), tmp, &artnum);D if (artnum > curgroup->lastavl || artnum < curgroup->frstavl) {< lib$signal(NEWS__OUTRNG, artnum, curgroup->frstavl,! curgroup->lastavl); } return SS$_NORMAL;o! } else if (cur_artnum == 0) {# lib$signal(NEWS__NOCURART, 0); return SS$_NORMAL; } else { artnum = cur_artnum;o }u/*E** Verify that this user posted the article. Anyone can do a cancel, ** you know.*/ chkdfrom = 0;= msgid = NULL;c@ status = Get_Article_Hdrs(curgroup, artnum, &hdrqptr, 1, 0); if (OK(status)) {iQ for (hdr = hdrqptr->head; hdr != (struct HDR *) hdrqptr; hdr = hdr->flink) {t, if (hdr->code == NEWS_K_HDR_FROM) { struct QUE adrq;' struct HDR *myfrom, *itsfrom;m int do_it;( adrq.head = adrq.tail = &adrq;0 Make_Return_Address(tmp, sizeof(tmp));& Parse_ToList(tmp, &adrq, 0);+ queue_remove(adrq.head, &myfrom); I while (queue_remove(adrq.head, &itsfrom)) mem_freehdr(itsfrom); + Parse_ToList(hdr->str, &adrq, 0); do_it = 0;5 while (queue_remove(adrq.head, &itsfrom)) { D if (strcmp(myfrom->str, itsfrom->str) == 0) do_it = 1;# mem_freehdr(itsfrom); }} if (!do_it) {GF lib$signal(NEWS__NOCANCEL, 1, artnum, NEWS__NOTYOURS, 4,0 strlen(myfrom->str), myfrom->str,+ strlen(hdr->str), hdr->str); " mem_freehdr(myfrom); return SS$_NORMAL; }r mem_freehdr(myfrom); chkdfrom = 1;t# if (msgid != NULL) break; }2 if (hdr->code == NEWS_K_HDR_MESSAGE_ID) { msgid = hdr; if (chkdfrom) break; } }/*9** Everything's ok: build the cancel message and post it. */) if (hdr != (struct HDR *) hdrqptr) {' hdrq.head = hdrq.tail = &hdrq;SK insert_header(curgroup->grpnam, hdrq.tail, NEWS_K_HDR_NEWSGROUPS);E strcpy(tmp, "cancel ");! strcat(tmp, msgid->str);r; insert_header(tmp, hdrq.tail, NEWS_K_HDR_CONTROL);:; insert_header(tmp, hdrq.tail, NEWS_K_HDR_SUBJECT); , status = Post_Article(&hdrq, 0, 0);@ while (queue_remove(hdrq.head, &hdr)) mem_freehdr(hdr); }~NEWSRDR_SRC.BCKPP[NEWSRDR]CMD_POST.C;43QAr> else { / lib$signal(NEWS__NOCANCEL, 1, artnum); } } return SS$_NORMAL;} /* cmd_cancel */ er, then we're supposed** to mail the reply only.*/ if (post_reply) {1 if (streql_case_blind(fuptostr, "poster")) { post_reply = 0; mail_reply = 1;' lib$signal(NEWS__MUSTMAIL, 0); } }/*+** Build the list of recipients if mailing.*/- if (mail_reply && destq.head == &destq) {& Parse_ToList(fromstr, &destq, 0z~NEWSRDR_SRC.BCK3P[NEWSRDR]MAIL.C;24M#*[NEWSRDR]MAIL.C;24+,3./ @ 4M-P0123KPWO56ָAΖ7aΖ86I<9G @HJ2/***++** FACILITY: NEWSRDR**** ABSTRACT: Mail routines.**** MODULE DESCRIPTION:**<** This module contains mail-related routines for NEWSRDR.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 09-SEP-1992**** MODIFICATION HISTORY:**1** 09-SEP-1992 V1.0 Madison Initial coding.C** 29-SEP-1992 V1.0-1 Madison For mail, wrap lines > 255 chars.G** 30-SEP-1992 V1.0-2 Madison Fix 0-length line bug in ystdy's fix.G** 03-OCT-1992 V1.0-3 Madison Misplaced break crept in from -1, -2.?** 13-OCT-1992 V1.0-4 Madison Work around $FAO !AZ problem.@** 16-OCT-1992 V1.0-5 Madison Fix signature file line count.D** 15-FEB-1993 V1.0-6 Madison Make compatible with pre-VMS V5.2.;** 01-MAR-1993 V1.1 Madison Add full_convert support.@** 17-MAR-1993 V1.1-1 Madison Make more record-length-proof.=** 12-APR-1993 V1.2 Madison Add Get_Mail_Personal_Name.B** 23-APR-1993 V1.2-1 Madison Add force_proto option for mail.>** 22-MAY-1993 V1.2-2 Madison Use temp file for mail msgs.**--*/#include "newsrdr.h"#include "globals.h"#ifdef __GNUC__#include #include #else#include #include #endifE extern unsigned int mail$send_begin(), mail$send_add_attribute();J extern unsigned int mail$send_add_bodypart(), mail$send_add_address();= extern unsigned int mail$send_message(), mail$send_end();@ extern unsigned int mail$user_begin(), mail$user_get_info();( extern unsigned int mail$user_end(); /***++ ** ROUTINE: Make_Return_Address**** FUNCTIONAL DESCRIPTION:**@** Builds the current user's return address for mail purposes.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**0** Make_Return_Address(char *buf, int bufsize)**:** buf: character string, write only, by reference (ASCIZ)(** bufsize: integer, read only, by value**)** IMPLICIT INPUTS: news_cfg, news_prof.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** SS$_NORMAL: Normal successful completion.**** SIDE EFFECTS: None.****--*/:unsigned int Make_Return_Address(char *buf, int bufsize) { char tmp[STRING_SIZE]; struct dsc$descriptor bdsc; short blen; unsigned int status;% INIT_SDESC(bdsc, bufsize-1, buf); if (news_cfg.namcnv) {" struct dsc$descriptor u, str; int two = 2, len;A INIT_SDESC(u, strlen(news_cfg.username), news_cfg.username); INIT_DYNDESC(str);/*;** Check for full name conversion (username->full address)*/ if (news_cfg.fnmcvt) {G status = (*news_cfg.fnmcvt)(&news_cfg.namctx, &two, &u, &str); if (OK(status)) {) if (!*news_prof.personalname) {1 blen = str.dsc$w_length < bufsize ?1 str.dsc$w_length : bufsize-1;3 memcpy(buf, str.dsc$a_pointer, blen); } else {6 static $DESCRIPTOR(ctrstr, "!AS (!AD)");2 sys$fao(&ctrstr, &blen, &bdsc, &str,G strlen(news_prof.personalname), news_prof.personalname); } buf[blen] = '\0'; str$free1_dx(&str); return SS$_NORMAL; } } : (*news_cfg.namcvt)(&news_cfg.namctx, &two, &u, &str);= len = str.dsc$w_length > STRING_SIZE-1 ? STRING_SIZE-1 : str.dsc$w_length;* strncpy(tmp, str.dsc$a_pointer, len); *(tmp+len) = '\0'; str$free1_dx(&str); } else {$ strcpy(tmp, news_cfg.username); locase(tmp); } if (news_cfg.bangaddr) {$ if (!*news_prof.personalname) {0 static $DESCRIPTOR(ctrstr, "!AD!!!AD");B sys$fao(&ctrstr, &blen, &bdsc, strlen(news_cfg.mailnode),3 news_cfg.mailnode, strlen(tmp), tmp); } else {6 static $DESCRIPTOR(ctrstr, "!AD!!!AD (!AD)");B sys$fao(&ctrstr, &blen, &bdsc, strlen(news_cfg.mailnode),2 news_cfg.mailnode, strlen(tmp), tmp,F strlen(news_prof.personalname), news_prof.personalname); } } else {$ if (!*news_prof.personalname) {/ static $DESCRIPTOR(ctrstr, "!AD@!AD");9 sys$fao(&ctrstr, &blen, &bdsc, strlen(tmp), tmp,< strlen(news_cfg.mailnode), news_cfg.mailnode); } else {5 static $DESCRIPTOR(ctrstr, "!AD@!AD (!AD)");9 sys$fao(&ctrstr, &blen, &bdsc, strlen(tmp), tmp,7 strlen(news_cfg.mailnode), news_cfg.mailnode,B strlen(news_prof.personalname), news_prof.personalname); } } *(buf+blen) = '\0'; return SS$_NORMAL;} /* Make_Return_Address */ /***++** ROUTINE: Mail_Message**** FUNCTIONAL DESCRIPTION:**(** Sends out a message using VMS Mail.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**@** Mail_Message(struct QUE *destq, char *subjstr, char *fspec,:** int use_signature, int copy_self, int just_self)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/Hunsigned int Mail_Message(struct QUE *destq, char *subjstr, char *fspec,@ int use_signature, int copy_self, int just_self) {7 char tmp[STRING_SIZE], *inbuf, tmpfile[FSPEC_SIZE]; struct dsc$descriptor sdsc; ITMLST mailst[4], outlst[1]; struct HDR *hdr;. unsigned int status, mailctx, unit, unit2;8 static short mail_to = MAIL$_TO, mail_cc = MAIL$_CC; int tlen, bufsize;5 status = file_open(fspec, &unit, 0, 0, &bufsize); if (!OK(status)) {* lib$signal(NEWS__MAILERR, 0, status); return NEWS__MAILERR; } inbuf = malloc(bufsize+1); if (!inbuf) {/ lib$signal(NEWS__MAILERR, 0, SS$_INSFMEM); return NEWS__MAILERR; } mailctx = 0;4 ITMLST_INIT(mailst[0], MAIL$_NOSIGNAL, 0, 0, 0);' ITMLST_INIT(mailst[1], 0, 0, 0, 0);' ITMLST_INIT(mailst[2], 0, 0, 0, 0);' ITMLST_INIT(mailst[3], 0, 0, 0, 0);' ITMLST_INIT(outlst[0], 0, 0, 0, 0);7 status = mail$send_begin(&mailctx, mailst, outlst); if (!OK(status)) {* lib$signal(NEWS__MAILERR, 0, status); file_close(unit); return NEWS__MAILERR; } if (*subjstr) {M ITMLST_INIT(mailst[1], MAIL$_SEND_SUBJECT, strlen(subjstr), subjstr, 0);@ status = mail$send_add_attribute(&mailctx, mailst, outlst);; if (!OK(status)) lib$signal(NEWS__MAILERR, 0, status); }0 make_temp_fspec(tmpfile, sizeof(tmpfile)-1);0 status = file_create(tmpfile, &unit2, 0, 0); if (!OK(status)) {% mail$send_end(&outlst, &outlst);* lib$signal(NEWS__MAILERR, 0, status); return NEWS__MAILERR; }8 while (OK(file_read(unit, inbuf, bufsize, &tlen))) { char *tp; int len; tp = inbuf; while (tlen >= 0) {) len = (tlen > 255 ? 255 : tlen);- status = file_write(unit2, tp, len); #ifdef notdef? ITMLST_INIT(mailst[1], MAIL$_SEND_RECORD, len, tp, 0);C status = mail$send_add_bodypart(&mailctx, mailst, outlst);#endif /* notdef */ if (!OK(status)) {/ lib$signal(NEWS__MAILERR, 0, status); break; } tlen -= len; tp += len; if (tlen == 0) break; } if (!OK(status)) break; } file_close(unit); free(inbuf);. if (use_signature && *news_prof.sigfile) {; status = file_open(news_prof.sigfile, &unit, 0, 0, 0); if (!OK(status)) {@ lib$signal(NEWS__SIGFERR, 2, strlen(news_prof.sigfile),* news_prof.sigfile, status); } else { int i;" for (i = 0; i < 8; i++) {E if (!OK(file_read(unit, tmp, sizeof(tmp)-1, &tlen))) break;E status = file_write(unit2, tmp, (tlen > 255 ? 255 : tlen)); #ifdef notdefB ITMLST_INIT(mailst[1], MAIL$_SEND_RECORD, tlen, tmp, 0);D status = mail$send_add_bodypart(&mailctx, mailst, outlst);#endif /* notdef */ if (!OK(status)) {E lib$signal(NEWS__SIGFERR, 2, strlen(news_prof.sigfile),/ news_prof.sigfile, status); break; } } file_close(unit); } } file_close(unit2);M ITMLST_INIT(mailst[1], MAIL$_SEND_FILENAME, strlen(tmpfile), tmpfile, 0);> status = mail$send_add_bodypart(&mailctx, mailst, outlst);: if (!OK(status)) lib$signal(NEWS__MAILERR, 0, status); if (just_self) {K ITMLST_INIT(mailst[1], MAIL$_SEND_USERNAME, strlen(news_cfg.username),% news_cfg.username, 0);F ITMLST_INIT(mailst[2], MAIL$_SEND_USERNAME_TYPE, sizeof(mail_to), &mail_to, 0);> status = mail$send_add_address(&mailctx, mailst, outlst);; if (!OK(status)) lib$signal(NEWS__MAILERR, 0, status); } else {. while (queue_remove(destq->head, &hdr)) { if (news_cfg.adrcnv) {* struct dsc$descriptor str, sdsc; int len; INIT_DYNDESC(str);7 INIT_SDESC(sdsc, strlen(hdr->str), hdr->str);< (*news_cfg.adrcvt)(&news_cfg.adrctx, &sdsc, &str);B len = str.dsc$w_length > STRING_SIZE-1 ? STRING_SIZE-1 : str.dsc$w_length;/ strncpy(tmp, str.dsc$a_pointer, len); *(tmp+len) = '\0'; } else {I if (!news_prof.force_proto && (strchr(hdr->str, '@') == NULL &&0 strchr(hdr->str, '!') == NULL)) {$ strcpy(tmp, hdr->str); } else {* char *cp, tmp2[STRING_SIZE];% strcpy(tmp2, hdr->str);* for (cp = tmp2; *cp; cp++) {* if (*cp == '"') *cp = '\''; }/ strcpy(tmp, news_cfg.mail_proto); strcat(tmp, "\""); strcat(tmp, tmp2); strcat(tmp, "\""); } }J ITMLST_INIT(mailst[1], MAIL$_SEND_USERNAME, strlen(tmp), tmp, 0);J ITMLST_INIT(mailst[2], MAIL$_SEND_USERNAME_TYPE, sizeof(mail_to), &mail_to, 0);B status = mail$send_add_address(&mailctx, mailst, outlst);? if (!OK(status)) lib$signal(NEWS__MAILERR, 0, status); mem_freehdr(hdr); } }" if (!just_self && copy_self) {K ITMLST_INIT(mailst[1], MAIL$_SEND_USERNAME, strlen(news_cfg.username),% news_cfg.username, 0);F ITMLST_INIT(mailst[2], MAIL$_SEND_USERNAME_TYPE, sizeof(mail_cc), &mail_cc, 0);> status = mail$send_add_address(&mailctx, mailst, outlst);; if (!OK(status)) lib$signal(NEWS__MAILERR, 0, status); }9 status = mail$send_message(&mailctx, outlst, outlst);: if (!OK(status)) lib$signal(NEWS__MAILERR, 0, status);5 status = mail$send_end(&mailctx, outlst, outlst);: if (!OK(status)) lib$signal(NEWS__MAILERR, 0, status); file_delete(tmpfile);* if (!OK(status)) return NEWS__MAILERR; return SS$_NORMAL;} /* Mail_Message */ /***++#** ROUTINE: Get_Mail_Personal_Name**** FUNCTIONAL DESCRIPTION:**1** Retrieves the user's VMS MAIL personal name.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**/** Get_Mail_Personal_Name(char *nam, int siz)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/4void Get_Mail_Personal_Name(char *buf, int bufsiz) { ITMLST inlst[2], outlst[2]; unsigned short len; unsigned int status, ctx; *buf = '\0'; ctx = 0;3 ITMLST_INIT(inlst[0], MAIL$_NOSIGNAL, 0, 0, 0);& ITMLST_INIT(inlst[1], 0, 0, 0, 0);4 ITMLST_INIT(outlst[0], MAIL$_USER_PERSONAL_NAME,3 (bufsiz-1 < 255 ? bufsiz-1 : 255), buf, &len);' ITMLST_INIT(outlst[1], 0, 0, 0, 0);6 status = mail$user_begin(&ctx, inlst, &outlst[1]); if (!OK(status)) return;5 status = mail$user_get_info(&ctx, inlst, outlst);+ mail$user_end(&ctx, inlst, &outlst[1]);$ if (OK(status)) buf[len] = '\0';} /* Get_Mail_Personal_Name */I~NEWSRDR_SRC.BCKP[NEWSRDR]MISC.C;41N7Eu*[NEWSRDR]MISC.C;41+,.7/ @ 4N76-P0123KPWO856Fϖ7&_ϖ8&_=9G @HJl/***++** FACILITY: NEWSRDR**$** ABSTRACT: Miscellaneous routines**** MODULE DESCRIPTION:**=** Various utility routines needed by various other NEWSRDR ** modules.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 05-SEP-1992**** MODIFICATION HISTORY:**1** 05-SEP-1992 V1.0 Madison Initial coding.D** 15-FEB-1993 V1.0-1 Madison Make compatible with pre-VMS V5.2.;** 05-APR-1993 V1.0-2 Madison Got DST adjustment wrong!7** 17-APR-1993 V1.1 Madison Add Check_Connection.6** 23-APR-1993 V1.1-1 Madison get_logical changes.J** 22-MAY-1993 V1.1-2 Madison Fix loss of keydefs after msg prompting.G** 24-MAY-1992 V1.1-3 Madison Fix weekday computation in Make_Date.**--*/#define MODULE_MISC#include "newsrdr.h"#include "globals.h"#ifdef __GNUC__#include #include #include #else#include #include #include #include #endif/*** Forward declarations*/& void make_temp_fspec(char *, int);1 void make_nntp_dtstring(TIME *, char *, int);= unsigned int Compose_Message(char *, char *, int, int *); void upcase(char *); void locase(char *);9 void Format_Header(struct HDR *, char *, int, int *);( void Make_Date(TIME *, char *, int); int Yes_Answer(char *, int);4 unsigned int cli_get_value(char *, char *, int);% unsigned int cli_present(char *);- unsigned int get_logical(char *, char *);4 unsigned int get_system_logical(char *, char *);* int streql_case_blind(char *, char *);0 int strneql_case_blind(char *, char *, int);#ifdef __GNUC__2 void queue_insert(struct QUE *, struct QUE *);- int queue_remove(struct QUE *, void **);#endif; unsigned int find_image_symbol(char *, char *, void *);D static unsigned int x_find_image_symbol(struct dsc$descriptor *,4 struct dsc$descriptor *, void *);2 void insert_header(char *, struct HDR *, int);5 unsigned int table_parse(void *, void *, void *); void Check_Connection(void);/*** External references*/8 extern unsigned int Set_Current_Group(struct GRP *); EXTERN struct GRP *curgroup; /***++** ROUTINE: make_temp_fspec**** FUNCTIONAL DESCRIPTION:**=** Builds a file-spec for a temporary file from the current** PID and date/time.**** RETURNS: void**** PROTOTYPE:**1** make_temp_fspec(char *fspec, int fspec_size)**H** fspec: file specification, write only, by reference (ASCIZ string),** fspec_size: integer, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/3void make_temp_fspec(char *fspec, int fspec_size) { struct dsc$descriptor tdsc; TIME time;' unsigned int pid, jpi_pid=JPI$_PID; unsigned short len;< $DESCRIPTOR(ctrstr, "SYS$SCRATCH:NEWS_!XL-!XL-!XL.TMP");% lib$getjpi(&jpi_pid, 0, 0, &pid); sys$gettim(&time);( INIT_SDESC(tdsc, fspec_size, fspec);? sys$fao(&ctrstr, &len, &tdsc, pid, time.long2, time.long1); *(fspec+len) = '\0';} /* make_temp_fspec */ /***++** ROUTINE: make_nntp_dtstring**** FUNCTIONAL DESCRIPTION:**F** Makes a date/time string suitable for the NEWGROUPS NNTP command.**** RETURNS: void**** PROTOTYPE:**@** make_nntp_dtstring(TIME *dt_stamp, char *str, int str_size)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/Bvoid make_nntp_dtstring(TIME *dt_stamp, char *str, int str_size) { short dtnum[7], len; struct dsc$descriptor sdsc; unsigned int status;5 $DESCRIPTOR(ctrstr, "!2ZW!2ZW!2ZW !2ZW!2ZW!2ZW"); sys$numtim(dtnum, dt_stamp); dtnum[0] %= 100;$ INIT_SDESC(sdsc, str_size, str);? sys$fao(&ctrstr, &len, &sdsc, dtnum[0], dtnum[1], dtnum[2],' dtnum[3], dtnum[4], dtnum[5]); *(str+len) = '\0';} /* make_nntp_dtstring */ /***++** ROUTINE: Compose_Message**** FUNCTIONAL DESCRIPTION:**<** Message composition. Prompts user for message or fires** up a text editor.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**B** Compose_Message(char *infspec, char *outspec, int use_editor,!** int *is_temp)**>** infspec: file_spec, read only, by reference (ASCIZ string)?** outspec: file_spec, write only, by reference (ASCIZ string),** use_editor: boolean, read only, by value.** is_temp: boolean, write only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/Junsigned int Compose_Message(char *infspec, char *outspec, int use_editor,' int *is_temp) {& struct dsc$descriptor sdsc, sdsc2; unsigned int status;" if (*infspec && !use_editor) { strcpy(outspec, infspec); *is_temp = 0; return SS$_NORMAL; }) make_temp_fspec(outspec, FSPEC_SIZE); *is_temp = 1;/*B** If we're not using an editor, then just prompt the user for the** message text.*/ if (!use_editor) { char tmp[STRING_SIZE]; struct dsc$descriptor tdsc; short len; unsigned int unit, kbid; $DESCRIPTOR(prompt, "> ");0 status = file_create(outspec, &unit, 0, 0); if (!OK(status)) {I lib$signal(NEWS__CREATERR, 2, strlen(outspec), outspec, status); return status; } put_output("");> put_output("Enter message text; type CTRL/Z when done."); put_output("");( INIT_SDESC(tdsc, sizeof(tmp), tmp); Finish_Paged_Output(2);( smg$create_virtual_keyboard(&kbid);I while (OK(smg$read_composed_line(&kbid, 0, &tdsc, &prompt, &len))) {$ file_write(unit, tmp, len); } file_close(unit);( smg$delete_virtual_keyboard(&kbid); Pager_Init(1); status = SS$_NORMAL; } else {/*+** We're supposed to fire up a text editor.*/6 char edfspec[STRING_SIZE], edsymbol[STRING_SIZE]; unsigned int (*editrtn)(); put_output("");& put_output("Starting editor...");/* ** Spawned?*/ if (news_prof.spawnedit) {! if (news_prof.captive) {: lib$signal(NEWS__SPAWNERR, 0, NEWS__CAPTIVE, 0); return NEWS__SPAWNERR; }@ sprintf(edsymbol, "%s \"%s\" %s", news_prof.editorname, infspec, outspec); Finish_Paged_Output(2);6 INIT_SDESC(sdsc, strlen(edsymbol), edsymbol);# status = lib$spawn(&sdsc); Pager_Init(1); if (!OK(status)) {0 lib$signal(NEWS__SPAWNERR, 0, status); } } else {/* ** Callable*// strcpy(edfspec, news_prof.editorname); strcat(edfspec, "SHR");0 strcpy(edsymbol, news_prof.editorname);# strcat(edsymbol, "$EDIT");4 INIT_SDESC(sdsc, strlen(edfspec), edfspec);7 INIT_SDESC(sdsc2, strlen(edsymbol), edsymbol);A status = lib$find_image_symbol(&sdsc, &sdsc2, &editrtn); if (!OK(status)) {D lib$signal(NEWS__EDITERR, 4, sdsc2.dsc$w_length, edsymbol,8 sdsc.dsc$w_length, edfspec, status); return status; } Finish_Paged_Output(2);4 INIT_SDESC(sdsc, strlen(infspec), infspec);5 INIT_SDESC(sdsc2, strlen(outspec), outspec);< if (strncmp(news_prof.editorname, "EDT", 3) == 0) {/ $DESCRIPTOR(scratch, "SYS$SCRATCH:");: status = (*editrtn)(&sdsc, &sdsc2, 0, &scratch); } else {- status = (*editrtn)(&sdsc, &sdsc2); } Pager_Init(1); } }/*?** If we were successful, then look for the actual existence of** the output file.*/ if (OK(status)) {" unsigned int ffctx=0, status; struct dsc$descriptor str;0 INIT_SDESC(sdsc, strlen(outspec), outspec); INIT_DYNDESC(str);1 status = lib$find_file(&sdsc, &str, &ffctx); if (OK(status)) {# lib$find_file_end(&ffctx);? strncpy(outspec, str.dsc$a_pointer, str.dsc$w_length);, *(outspec+str.dsc$w_length) = '\0'; } else { *outspec = '\0'; } str$free1_dx(&str); } Check_Connection(); return status;} /* Compose_Message */ /***++** ROUTINE: upcase**** FUNCTIONAL DESCRIPTION:**%** Converts a string to upper case.**** RETURNS: void**** PROTOTYPE:**** upcase(char *str)**:** str: character string, modify, by reference (ASCIZ)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/void upcase(char *s) { register char *cp;A for (cp = s; *cp; cp++) if (islower(*cp)) *cp = toupper(*cp);} /* upcase */ /***++** ROUTINE: locase**** FUNCTIONAL DESCRIPTION:**%** Converts a string to lower case.**** RETURNS: void**** PROTOTYPE:**** locase(char *str)**A** str: character string, modify, by reference (ASCIZ string)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/void locase(char *s) { register char *cp;A for (cp = s; *cp; cp++) if (isupper(*cp)) *cp = tolower(*cp);} /* locase */ /***++** ROUTINE: Format_Header**** FUNCTIONAL DESCRIPTION:**>** Takes a header that is in TLV format and formats it as anF** ordinary string (bascially converting the tag into the appropriate** message header).**** RETURNS: void**** PROTOTYPE:**I** Format_Header(struct HDR *hdr, char *str, int str_size, int *retlen)**2** hdr: HDR structure, read only, by reference>** str: character string, write only, by reference (ASCIZ)*** str_size: integer, read only, by value-** retlen: integer, write only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/Kvoid Format_Header(struct HDR *hdr, char *str, int str_size, int *retlen) { static char *hdrtxt[] = {E "From: ", "Date: ", "Newsgroups: ", "Subject: ", "Message-ID: ",F "Path: ", "Reply-To: ", "Sender: ", "Followup-To: ", "Expires: ",E "References: ", "Control: ", "Distribution: ", "Organization: ",C "Keywords: ", "Summary: ", "Approved: ", "Lines: ", "Xref: "}; int len, hlen, copylen; len = strlen(hdr->str);( if (hdr->code == NEWS_K_HDR_OTHER) {3 copylen = len < str_size-1 ? len : str_size-1;$ strncpy(str, hdr->str, copylen); *(str+copylen) = '\0'; } else {( hlen = strlen(hdrtxt[hdr->code-1]);2 hlen = hlen < str_size-1 ? hlen : str_size-1;- strncpy(str, hdrtxt[hdr->code-1], hlen); str_size -= hlen;3 copylen = len < str_size-1 ? len : str_size-1;* strncpy(str+hlen, hdr->str, copylen); *(str+hlen+copylen) = '\0';* if (retlen) *retlen = hlen + copylen; }} /* Format_Header */ /***++** ROUTINE: Make_Date**** FUNCTIONAL DESCRIPTION:**F** Makes an RFC822-type date/time string from a VMS date/time stamp.**** RETURNS: void**** PROTOTYPE:**9** Make_Date(TIME *timadr, char *fmt_date, int fd_size)**/** timadr: date_time, read only, by reference@** fmt_date: character string, write only, by reference (ASCIZ))** fd_size: integer, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/;void Make_Date(TIME *timadr, char *fmt_date, int fd_size) {2 enum {YEAR, MONTH, DAY, HOUR, MINUTE, SECOND}; TIME xtime, time2; struct dsc$descriptor fddsc; short timbuf[7], len; unsigned int status; int dst, dow;@ $DESCRIPTOR(ctrstr, "!AD, !2ZW !AD !ZW !2ZW:!2ZW:!2ZW GMT");2 char *dowstr = "Sun Mon Tue Wed Thu Fri Sat ";J char *monstr = " Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec "; if (timadr == NULL) { sys$gettim(&xtime); } else { xtime = *timadr; }( status = sys$numtim(timbuf, &xtime); if (!OK(status)) { lib$signal(status); return; }+ status = lib$day_of_week(&xtime, &dow); if (!OK(status)) { lib$signal(status); return; } dow %= 7; if (news_cfg.dst) { dst = 0; switch (timbuf[MONTH]) { case 4:# if (timbuf[DAY]-dow > 0) {2 if (dow == 0) dst = (timbuf[HOUR] >= 3); else dst = 1; } else dst = 0; break; case 10:$ if (timbuf[DAY]-dow > 24) {2 if (dow == 0) dst = (timbuf[HOUR] == 0); else dst = 0; } else dst = 1; break; case 5: case 6: case 7: case 8: case 9: dst = 1; break; default: dst = 0; break; } } if (news_cfg.neggmtoff) {8 lib$add_times(&xtime, &news_cfg.gmtoffset, &time2); } else {8 lib$sub_times(&xtime, &news_cfg.gmtoffset, &time2); } if (news_cfg.dst && dst) {) static $DESCRIPTOR(s, "0 01:00:00"); static TIME onehr; static int did1hr = 0; TIME time3;5 if (!did1hr) {sys$bintim(&s, &onehr); did1hr=1;}+ lib$sub_times(&time2, &onehr, &time3); time2 = time3; } sys$numtim(timbuf, &time2);" lib$day_of_week(&time2, &dow); dow %= 7;) INIT_SDESC(fddsc, fd_size, fmt_date); len = 0;> status = sys$fao(&ctrstr, &len, &fddsc, 3, dowstr+(dow*4),3 timbuf[DAY], 3, monstr+(timbuf[MONTH]*4),F timbuf[YEAR], timbuf[HOUR], timbuf[MINUTE], timbuf[SECOND]);( if (!OK(status)) lib$signal(status); *(fmt_date+len) = '\0'; return;} /* Make_Date */ /***++** ROUTINE: Yes_Answer**** FUNCTIONAL DESCRIPTION:**(** Asks the user a yes-or-no question.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**)** Yes_Answer(char *prompt, int defans)**=** prompt: character_string, read only, by reference (ASCIZ)(** defans: boolean, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:/** 1: Answer was (or defaulted to) "yes"..** 0: Answer was (or defaulted to) "no".**** SIDE EFFECTS: None.****--*/*int Yes_Answer(char *prompt, int defans) {$ char *ansstr[2] = {"no", "yes"};1 char tmp[STRING_SIZE], ans[STRING_SIZE], *cp;% struct dsc$descriptor adsc, pdsc; int answer; short len; if (defans >= 0) {@ sprintf(tmp, "%s [%s]: ", prompt, (defans ? "yes" : "no")); } else { strcpy(tmp, prompt); strcat(tmp, " "); }' INIT_SDESC(pdsc, strlen(tmp), tmp);' INIT_SDESC(adsc, sizeof(ans), ans); while (1) {' lib$get_input(&adsc, &pdsc, &len);2 while (len > 0 && isspace(ans[len-1])) len--;! if (len == 0) return defans; ans[len] = '\0'; locase(ans);( for (cp = ans; isspace(*cp); cp++);- for (answer = 0; answer < 2; answer++) {I if (strstr(ansstr[answer], cp) == ansstr[answer]) return answer; }, put_output("Please answer YES or NO."); }' return 0; /* should not get here */} /* Yes_Answer */ /***++** ROUTINE: cli_get_value**** FUNCTIONAL DESCRIPTION:**"** C Interface to CLI$GET_VALUE.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**0** cli_get_value (char *argname, DESCRIP *arg)**1** argname: ASCIZ_string, read only, by reference<** arg: char_string, write only, by descriptor (dynamic)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None. **** COMPLETION CODES:**2** All those from CLI$PRESENT and CLI$GET_VALUE.**** SIDE EFFECTS: None.****--*/Cunsigned int cli_get_value(char *argname, char *arg, int argsize) {2( struct dsc$descriptor argnamd, argd; unsigned short arglen; int status; 2 INIT_SDESC(argnamd, strlen(argname), argname);% INIT_SDESC(argd, argsize-1, arg);o# status = cli$present(&argnamd);s& if ($VMS_STATUS_SUCCESS(status)) {6 status = cli$get_value(&argnamd, &argd, &arglen);* if (OK(status)) *(arg+arglen) = '\0'; }o return status;}- 3/***++** ROUTINE: cli_present**** FUNCTIONAL DESCRIPTION:s!** r ** C Interface to CLI$PRESENT.**A** RETURNS: cond_value, intword (unsigned), write only, by valueU**** PROTOTYPE:** ** cli_present (char *argname)**1** argname: ASCIZ_string, read only, by referencen**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:u** ** All those from CLI$PRESENT.**** SIDE EFFECTS: None.****--*/)unsigned int cli_present(char *argname) {" struct dsc$descriptor argnamd;2 INIT_SDESC(argnamd, strlen(argname), argname);! return cli$present(&argnamd);c}( r/***++** ROUTINE: get_logical**** FUNCTIONAL DESCRIPTION:c**D** Translates a logical name using a standard LNM$FILE_DEV search.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**&** get_logical(char *lnm, char *str)**@** lnm: logical_name, read only, by reference (ASCIZ string)E** str: character string, write only, by reference (ASCIZ string)q**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.e**** COMPLETION CODES:u/** SS$_NORMAL: Normal successful completion.o**** SIDE EFFECTS: None.****--*/0unsigned int get_logical(char *lnm, char *str) { ITMLST lnmlst[2];m! struct dsc$descriptor lnmdsc;  short slen;c unsigned int status;. static unsigned int attr=LNM$M_CASE_BLIND;/ static $DESCRIPTOR(tabnam, "LNM$FILE_DEV"); C ITMLST_INIT(lnmlst[0], LNM$_STRING, STRING_SIZE-1, str, &slen);n' ITMLST_INIT(lnmlst[1], 0, 0, 0, 0);r) INIT_SDESC(lnmdsc, strlen(lnm), lnm); H status = sys$trnlnm(&attr, &tabnam, &lnmdsc, 0, (str ? lnmlst : 0));' if (OK(status)) *(str+slen) = '\0';e return status;} /* get_logical */ */***++** ROUTINE: get_system_logical**** FUNCTIONAL DESCRIPTION:k**A** Translates an executive-mode logical name out of LNM$SYSTEM.f**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**-** get_system_logical(char *lnm, char *str)T**@** lnm: logical_name, read only, by reference (ASCIZ string)>** str: character string, write only, by reference (ASCIZ)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.m**** COMPLETION CODES:p/** SS$_NORMAL: Normal successful completion.D**** SIDE EFFECTS: None.****--*/7unsigned int get_system_logical(char *lnm, char *str) {y ITMLST lnmlst[2];T! struct dsc$descriptor lnmdsc;  short slen;, unsigned int status;A static unsigned int attr=LNM$M_CASE_BLIND, acmode=PSL$C_EXEC;c- static $DESCRIPTOR(tabnam, "LNM$SYSTEM");rC ITMLST_INIT(lnmlst[0], LNM$_STRING, STRING_SIZE-1, str, &slen);n' ITMLST_INIT(lnmlst[1], 0, 0, 0, 0);.) INIT_SDESC(lnmdsc, strlen(lnm), lnm);:N status = sys$trnlnm(&attr, &tabnam, &lnmdsc, &acmode, (str ? lnmlst : 0));' if (OK(status)) *(str+slen) = '\0';O return status;} /* get_system_logical */ /***++** ROUTINE: streql_case_blind**** FUNCTIONAL DESCRIPTION:s**=** Compares two ASCIZ strings for equality, in a case-blindt ** fashion.**** RETURNS: boolean** ** PROTOTYPE:**.** streql_case_blind(char *str1, char *str2)**=** str1: character string, read only, by reference (ASCIZ)s=** str2: character string, read only, by reference (ASCIZ)u**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.=**** COMPLETION CODES:s,** 0: strings are not equal (case-blind)*** non-0: strings are equal (case-blind)**** SIDE EFFECTS: None.****--*/+int streql_case_blind(char *s1, char *s2) {" register unsigned char c1, c2; while (1) { 1 c1 = islower(*s1) ? toupper(*s1) : (*s1);a1 c2 = islower(*s2) ? toupper(*s2) : (*s2);* if (c1 != c2) break;! if (c1 == '\0') return 1;d s1++; s2++;A }r return 0;:}l p/***++** ROUTINE: strneql_case_blind**** FUNCTIONAL DESCRIPTION:n**1** Counted case-blind string equality function.r**** RETURNS: boolean**** PROTOTYPE:**8** strneql_case_blind(char *str1, char *str2, int len)**;** str1: character string, read only, by reference (ASCIZ)s;** str2: character string, read only, by reference (ASCIZ) &** len: integer, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None. **** COMPLETION CODES:)I** 0: strings are not equal up to the specified length (case-blind)ME** non-0: strings are equal up to the specified length (case-blind)p**** SIDE EFFECTS: None.****--*/5int strneql_case_blind(char *s1, char *s2, int len) {/" register unsigned char c1, c2; while (len > 0) {r1 c1 = islower(*s1) ? toupper(*s1) : (*s1);s1 c2 = islower(*s2) ? toupper(*s2) : (*s2);  if (c1 != c2) return 0;(! if (c1 == '\0') return 1;K s1++; s2++; len--;E }A return 1;u}e /***++** ROUTINE: queue_insertt**** FUNCTIONAL DESCRIPTION:"**<** Inserts an entry into a queue. The QUE structure isn'tA** required, as long as the first two longwords of the structure !** being used is a queue header.g**H** USED ONLY WITH GNU C. VAX C and DEC C use the appropriate builtins.5** See NEWSRDR.H for more information.t**** RETURNS: void **** PROTOTYPE:**** queue_insert(item, pred)&**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.l**** COMPLETION CODES: None.f**** SIDE EFFECTS: None.****--*/#ifdef __GNUC__y7void queue_insert(struct QUE *item, struct QUE *pred) {  item->head = pred->head; item->tail = pred; (pred->head)->tail = item; pred->head = item;}#endif i/***++** ROUTINE: queue_removei**** FUNCTIONAL DESCRIPTION:_**4** Removes an entry from a queue, if there is one.**H** USED ONLY WITH GNU C. VAX C and DEC C use the appropriate builtins.5** See NEWSRDR.H for more information. **** RETURNS: int**** PROTOTYPE:**2** queue_remove(struct QUE *entry, void **addr);**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.i**** COMPLETION CODES:t** 1: Remove successful.** 0: No entry to remove. **** SIDE EFFECTS: None.****--*/#ifdef __GNUC__(2int queue_remove(struct QUE *entry, void **addr) {' if (entry->head == entry) return 0;$& (entry->tail)->head = entry->head;& (entry->head)->tail = entry->tail; *addr = entry; return 1;o}#endif s/***++** ROUTINE: find_image_symbol**** FUNCTIONAL DESCRIPTION:s***** C interface to LIB$FIND_IMAGE_SYMBOL.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**?** find_image_symbol(char *image, char *symbol, void *symval);**=** image: file_spec, read only, by reference (ASCIZ string)I=** symbol: character string, read only, by reference (ASCIZ)p1** symval: unspecified, write only, by reference **** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.r**** COMPLETION CODES:t/** SS$_NORMAL: Normal successful completion.i**** SIDE EFFECTS: None.****--*/Iunsigned int find_image_symbol(char *image, char *symbol, void *symval) { % struct dsc$descriptor idsc, sdsc;u" lib$establish(lib$sig_to_ret);+ INIT_SDESC(idsc, strlen(image), image);c- INIT_SDESC(sdsc, strlen(symbol), symbol);t5 return x_find_image_symbol(&idsc, &sdsc, symval); } /* find_image_symbol */,Fstatic unsigned int x_find_image_symbol(struct dsc$descriptor *imgnam,= struct dsc$descriptor *symnam, void *symval) {n9 return lib$find_image_symbol(imgnam, symnam, symval);e} /***++** ROUTINE: insert_header**** FUNCTIONAL DESCRIPTION: **>** Makes a HDR structure from a character string and inserts** it in a queue.**** RETURNS: void***** PROTOTYPE:**9** insert_header(char *str, struct HDR *pred, int code) **=** str: character string, read only, by reference (ASCIZ)/** pred: HDR structure, modify, by referencee(** code: integer, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/;void insert_header(char *str, struct HDR *pred, int code) {c struct HDR *h; int len; len = strlen(str)+1; h = mem_gethdr(len); memcpy(h->str, str, len);  h->code = code;  queue_insert(h, pred);} /* insert_header */P /***++** ROUTINE: table_parse**** FUNCTIONAL DESCRIPTION: **@** Glue to LIB$TABLE_PARSE/LIB$TPARSE, automatically using the** former if present.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**5** table_parse(void *tpablk, void *tbl, void *key);***** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None./**** COMPLETION CODES::****** SIDE EFFECTS: None.****--*/>unsigned int table_parse(void *tpablk, void *tbl, void *key) {/ static unsigned int (*parse_routine)() = 0;a unsigned int status; if (parse_routine == 0) {NM status = find_image_symbol("LIBRTL", "LIB$TABLE_PARSE", &parse_routine);, if (!OK(status)) {nL status = find_image_symbol("LIBRTL", "LIB$TPARSE", &parse_routine); }$ if (!OK(status)) return status; }_. return (*parse_routine)(tpablk, tbl, key);} /* table_parse */e e/***++** ROUTINE: Check_Connection**** FUNCTIONAL DESCRIPTION:**A** Verifies that the server connection is still there. If not,9** attempts to reconnect and restore our server context.s**** RETURNS: void**** PROTOTYPE:**** Check_Connection()a**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None. **** COMPLETION CODES: None.l**** SIDE EFFECTS: None.****--*/void Check_Connection() {: unsigned int status; int reply_code;r status = server_check(); if (OK(status)) return;, server_disconnect();) server_connect(news_cfg.server_name);_8 server_get_reply(SRV__NOECHO, &reply_code, 0, 0, 0);. if (curgroup) Set_Current_Group(curgroup); return;c}n= '\0'; } else {( hlen = strlen(hdrtxt[hdr->code-1]);2 hlen = hlen < str_size-1 ? hlen~NEWSRDR_SRC.BCKPP[NEWSRDR]NEWSRC.C;14T*[NEWSRDR]NEWSRC.C;14+,P./ @ 4T -P0123KPWO 56hAI7LI8f99G @HJ/***++** FACILITY: NEWSRDR**+** ABSTRACT: Read and write .newsrc files.**** MODULE DESCRIPTION:**B** This module contains the routines that read and write .newsrc ** files.**** AUTHOR: M. Madison9** COPYRIGHT 1992, 1993 MATTHEW D. MADISON."** ALL RIGHTS RESERVED.**** CREATION DATE: 11-SEP-1992**** MODIFICATION HISTORY:**1** 11-SEP-1992 V1.0 Madison Initial coding.D** 15-FEB-1993 V1.0-1 Madison Make compatible with pre-VMS V5.2.**--*/#include "newsrdr.h"#include "globals.h"#ifdef __GNUC__# extern unsigned int rms$_eof();*#define RMS$_EOF ((unsigned int) rms$_eof)#else#pragma nostandard& globalvalue unsigned int RMS$_EOF;#pragma standard#endif void Read_NewsRC(); void Write_NewsRC();F static unsigned int write_newsrc_info(struct GRP *, unsigned int);* extern struct GRP *Find_Group(char *);+ extern void Insert_Group(struct GRP *);? extern unsigned int Parse_Range(char *, int *, int *, int); /***++** ROUTINE: Read_NewsRC**** FUNCTIONAL DESCRIPTION:**** Reads in a .newsrc file.**** RETURNS: void**** PROTOTYPE:**** Read_NewsRC()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/void Read_NewsRC() {- char tmp[STRING_SIZE], name[STRING_SIZE]; char *anchor, *cp; struct RNG *rng; struct GRP *g; int tlen, f, l; unsigned int status, unit;9 status = file_open(news_prof.newsrc, &unit, 0, 0, 0); if (!OK(status)) {; lib$signal(NEWS__RCRDERR, 2, strlen(news_prof.newsrc),) news_prof.newsrc, status); return; }G while (OK((status = file_read(unit, tmp, sizeof(tmp)-1, &tlen)))) { tmp[tlen] = '\0'; cp = strchr(tmp, ':');$ if (!cp) cp = strchr(tmp, '!'); if (!cp) continue; strncpy(name, tmp, cp-tmp); *(name+(cp-tmp)) = '\0'; g = Find_Group(name); if (g == NULL) { g = mem_getgrp();! strcpy(g->grpnam, name);5 g->seenq.head = g->seenq.tail = &(g->seenq);5 g->killq.head = g->killq.tail = &(g->killq); g->inprofile = 1; Insert_Group(g); }" g->subscribed = (*cp == ':'); if (news_prof.glast) {# news_prof.glast->next = g; } else { news_prof.glist = g; } news_prof.glast = g;@ while (queue_remove(g->seenq.head, &rng)) mem_freerng(rng);/ for (anchor = ++cp; anchor; anchor = cp) {" cp = strchr(anchor, ','); if (cp) *cp++ = '\0';2 if (OK(Parse_Range(anchor, &f, &l, 0))) { rng = mem_getrng(); rng->first = f; rng->last = l;+ queue_insert(rng, g->seenq.tail); } } } if (status != RMS$_EOF) {; lib$signal(NEWS__RCRDERR, 2, strlen(news_prof.newsrc),) news_prof.newsrc, status); } file_close(unit); return;} /* Read_NewsRC */ /***++** ROUTINE: Write_NewsRC**** FUNCTIONAL DESCRIPTION:**** Writes a .newsrc file.**** RETURNS: void**** PROTOTYPE:**** Write_NewsRC()**** IMPLICIT INPUTS: Many.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/void Write_NewsRC() { unsigned int status, unit;8 status = file_create(news_prof.newsrc, &unit, 0, 0); if (!OK(status)) {< lib$signal(NEWS__RCWRTERR, 2, strlen(news_prof.newsrc),) news_prof.newsrc, status); return; } if (news_prof.glist) { struct GRP *g;8 for (g = news_prof.glist; g != NULL; g = g->next) {$ write_newsrc_info(g, unit); } } else {B lib$traverse_tree(&news_prof.gtree, write_newsrc_info, unit); } file_close(unit);} /* Write_NewsRC */ /***++** ROUTINE: write_newsrc_info**** FUNCTIONAL DESCRIPTION:**@** Tree traversal action routine that writes group information** to the newsrc file.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**8** write_newsrc_info(struct GRP *g, unsigned int unit)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:"** SS$_NORMAL: Always returned.**** SIDE EFFECTS: None.****--*/Istatic unsigned int write_newsrc_info(struct GRP *g, unsigned int unit) { char tmp2[STRING_SIZE]; char *cp, *tmp; struct RNG *rng; int tmpsize;% if (!g->avail) return SS$_NORMAL;F if (news_prof.newsrc_subonly && !g->subscribed) return SS$_NORMAL; tmp = malloc(STRING_SIZE); tmpsize = STRING_SIZE;A sprintf(tmp, "%s%c", g->grpnam, (g->subscribed ? ':' : '!')); cp = tmp+strlen(tmp);T for (rng = g->seenq.head; rng != (struct RNG *) &(g->seenq); rng = rng->flink) { if (cp-tmp > tmpsize-40) { tmpsize += STRING_SIZE;% tmp = realloc(tmp, tmpsize); }# if (rng->last >= g->frstavl) { sprintf(tmp2, "%d-%d,",A (rng->first < g->frstavl ? 1 : rng->first), rng->last); strcat(tmp, tmp2); cp += strlen(tmp2); } }' if (*(cp-1) == ',') *(--cp) = '\0';" file_write(unit, tmp, cp-tmp); free(tmp); return SS$_NORMAL;} /* write_newsrc_info */e~NEWSRDR_SRC.BCKPP[NEWSRDR]FILEIO.C;33N(A~*[NEWSRDR]FILEIO.C;33+,P.(/ @ 4N(%-P0123KPWO&56Wm7m8V9f99G @HJJ/***++** FACILITY: NEWSRDR**** ABSTRACT: File I/O routines**** MODULE DESCRIPTION:**A** This module contains RMS interface routines used by NEWSRDR.**** AUTHOR: M. MadisonI** COPYRIGHT 1992, MATTHEW D. MADISON. ALL RIGHTS RESERVED.**** CREATION DATE: 08-SEP-1992**** MODIFICATION HISTORY:**1** 08-SEP-1992 V1.0 Madison Initial coding.F** 22-SEP-1992 V1.0-1 Madison Fix Copy_File buffer length problem.@** 23-MAR-1993 V1.0-2 Madison Fix file_read buf len problem.**--*/#define MODULE_FILEIO#include "newsrdr.h"#include #ifdef __DECC#include #endif/*3** Context structure used by most of these routines*/ struct UNIT { struct FAB fab; struct RAB rab; struct NAM nam; struct XABFHC xabfhc;! char espec[256], rspec[256]; };/*** Forward declarations*/E unsigned int file_create(char *, struct UNIT **, char *, char *);J unsigned int file_open(char *, struct UNIT **, char *, char *, int *);L unsigned int file_append(char *, struct UNIT **, char *, char *, int *);; unsigned int file_find(char *, char *, char *, char *);6 unsigned int file_fidopen(char *, struct UNIT **);- unsigned int file_exists(char *, char *);+ unsigned int file_close(struct UNIT *);, unsigned int file_dclose(struct UNIT *);> unsigned int file_read(struct UNIT *, char *, int, int *);8 unsigned int file_write(struct UNIT *, char *, int);6 unsigned int file_getpos(struct UNIT *, short[3]);6 unsigned int file_setpos(struct UNIT *, short[3]);. unsigned int file_get_rdt(char *, TIME *);% unsigned int file_delete(char *); /***++** ROUTINE: file_create**** FUNCTIONAL DESCRIPTION:***** Creates a new file, open for writing.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** file_create (fspec, unit)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/Gunsigned int file_create(char *fspec, struct UNIT **upp, char *defspec,' char *rspec) { struct UNIT *u; unsigned int status;$ u = malloc(sizeof(struct UNIT)); if (!u) return SS$_INSFMEM; u->fab = cc$rms_fab; u->rab = cc$rms_rab; u->nam = cc$rms_nam; u->fab.fab$l_fna = fspec;% u->fab.fab$b_fns = strlen(fspec); if (defspec) { u->fab.fab$l_dna = defspec;( u->fab.fab$b_dns = strlen(defspec); }- u->fab.fab$l_fop = FAB$M_SQO | FAB$M_DFW;! u->fab.fab$b_fac = FAB$M_PUT; u->fab.fab$b_rat = FAB$M_CR;! u->fab.fab$b_rfm = FAB$C_VAR; u->fab.fab$w_mrs = 0; u->nam.nam$l_esa = u->espec;* u->nam.nam$b_ess = sizeof(u->espec)-1; u->nam.nam$l_rsa = u->rspec;* u->nam.nam$b_rss = sizeof(u->rspec)-1;! u->fab.fab$l_nam = &(u->nam);! u->rab.rab$l_fab = &(u->fab);" u->rab.rab$l_rop |= RAB$M_WBH;' status = sys$create(&(u->fab),0,0);& if ($VMS_STATUS_SUCCESS(status)) {' u->rspec[u->nam.nam$b_rsl] = '\0';) status = sys$connect(&(u->rab),0,0);' if ($VMS_STATUS_SUCCESS(status)) { *upp = u;, if (rspec) strcpy(rspec, u->rspec); return status; }# u->fab.fab$l_fop |= FAB$M_DLT; sys$close(&(u->fab),0,0); } free(u); return status;} /* file_create */ /***++** ROUTINE: file_open**** FUNCTIONAL DESCRIPTION:**(** Opens an existing file for reading.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**1** file_open(fspec, unit, [defspec], [resspec])**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/6unsigned int file_open(char *fspec, struct UNIT **upp,? char *defspec, char *rspec, int *maxline) { struct UNIT *u; unsigned int status;$ u = malloc(sizeof(struct UNIT)); if (!u) return SS$_INSFMEM; u->fab = cc$rms_fab; u->rab = cc$rms_rab; u->nam = cc$rms_nam; u->xabfhc = cc$rms_xabfhc; u->fab.fab$l_fna = fspec;% u->fab.fab$b_fns = strlen(fspec); if (defspec) { u->fab.fab$l_dna = defspec;( u->fab.fab$b_dns = strlen(defspec); }! u->fab.fab$b_fac = FAB$M_GET;- u->fab.fab$l_xab = (char *) &(u->xabfhc); u->nam.nam$l_esa = u->espec;* u->nam.nam$b_ess = sizeof(u->espec)-1; u->nam.nam$l_rsa = u->rspec;* u->nam.nam$b_rss = sizeof(u->rspec)-1;! u->fab.fab$l_nam = &(u->nam);! u->rab.rab$l_fab = &(u->fab);" u->rab.rab$l_rop |= RAB$M_RAH;% status = sys$open(&(u->fab),0,0);& if ($VMS_STATUS_SUCCESS(status)) {) status = sys$connect(&(u->rab),0,0);' if ($VMS_STATUS_SUCCESS(status)) {8 if (maxline) *maxline = u->fab.fab$w_mrs == 0 ?H (u->xabfhc.xab$w_lrl == 0 ? 32767 : u->xabfhc.xab$w_lrl) : u->fab.fab$w_mrs; if (rspec) {2 memcpy(rspec,u->rspec,u->nam.nam$b_rsl);( *(rspec+u->nam.nam$b_rsl) = 0; } *upp = u; return status; } sys$close(&(u->fab),0,0); } free(u); return status;} /* file_open */ /***++** ROUTINE: file_append**** FUNCTIONAL DESCRIPTION:**(** Opens an existing file for reading.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**3** file_append(fspec, unit, [defspec], [resspec])**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/8unsigned int file_append(char *fspec, struct UNIT **upp,? char *defspec, char *rspec, int *maxline) { struct UNIT *u; unsigned int status;$ u = malloc(sizeof(struct UNIT)); if (!u) return SS$_INSFMEM; u->fab = cc$rms_fab; u->rab = cc$rms_rab; u->nam = cc$rms_nam; u->xabfhc = cc$rms_xabfhc; u->fab.fab$l_fna = fspec;% u->fab.fab$b_fns = strlen(fspec); if (defspec) { u->fab.fab$l_dna = defspec;( u->fab.fab$b_dns = strlen(defspec); }! u->fab.fab$b_fac = FAB$M_PUT;- u->fab.fab$l_xab = (char *) &(u->xabfhc); u->nam.nam$l_esa = u->espec;* u->nam.nam$b_ess = sizeof(u->espec)-1; u->nam.nam$l_rsa = u->rspec;* u->nam.nam$b_rss = sizeof(u->rspec)-1;! u->fab.fab$l_nam = &(u->nam);! u->rab.rab$l_fab = &(u->fab);. u->rab.rab$l_rop |= RAB$M_RAH | RAB$M_EOF;% status = sys$open(&(u->fab),0,0);& if ($VMS_STATUS_SUCCESS(status)) {) status = sys$connect(&(u->rab),0,0);' if ($VMS_STATUS_SUCCESS(status)) {8 if (maxline) *maxline = u->fab.fab$w_mrs == 0 ?H (u->xabfhc.xab$w_lrl == 0 ? 32767 : u->xabfhc.xab$w_lrl) : u->fab.fab$w_mrs; if (rspec) {2 memcpy(rspec,u->rspec,u->nam.nam$b_rsl);( *(rspec+u->nam.nam$b_rsl) = 0; } *upp = u; return status; } sys$close(&(u->fab),0,0); } free(u); return status;} /* file_append */ /***++** ROUTINE: file_find**** FUNCTIONAL DESCRIPTION:**"** Locates a file, gets its FID.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**1** file_open(fspec, unit, [defspec], [resspec])**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/Munsigned int file_find(char *fspec, char *defspec, char *xrspec, char *fid) { struct FAB fab; struct NAM nam; char espec[256], rspec[256]; unsigned int status; fab = cc$rms_fab; nam = cc$rms_nam; fab.fab$l_fna = fspec;" fab.fab$b_fns = strlen(fspec); if (defspec) { fab.fab$l_dna = defspec;% fab.fab$b_dns = strlen(defspec); } fab.fab$b_fac = FAB$M_GET; nam.nam$l_esa = espec;$ nam.nam$b_ess = sizeof(espec)-1; nam.nam$l_rsa = rspec;$ nam.nam$b_rss = sizeof(rspec)-1; fab.fab$l_nam = &nam;# status = sys$parse(&fab, 0, 0);& if ($VMS_STATUS_SUCCESS(status)) {% status = sys$search(&fab, 0, 0);' if ($VMS_STATUS_SUCCESS(status)) { if (xrspec) {# rspec[nam.nam$b_rsl] = 0; strcpy(xrspec, rspec); }) memcpy(fid, &nam.nam$t_dvi, 28); } } return status;} /* file_find */ /***++** ROUTINE: file_fidopen**** FUNCTIONAL DESCRIPTION:**2** Opens an existing file by fileid for reading.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**G** file_fidopen (fileid, unit, actual_filename, actual_filename_size)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/<unsigned int file_fidopen(char *fileid, struct UNIT **upp) { struct UNIT *u; unsigned int status;$ u = malloc(sizeof(struct UNIT)); if (!u) return SS$_INSFMEM; u->fab = cc$rms_fab; u->rab = cc$rms_rab; u->nam = cc$rms_nam; u->xabfhc = cc$rms_xabfhc;! u->fab.fab$b_fac = FAB$M_GET;- u->fab.fab$l_xab = (char *) &(u->xabfhc);, memcpy(&(u->nam.nam$t_dvi), fileid, 28);" u->fab.fab$l_fop |= FAB$M_NAM;! u->fab.fab$l_nam = &(u->nam);! u->rab.rab$l_fab = &(u->fab);" u->rab.rab$l_rop |= RAB$M_RAH;% status = sys$open(&(u->fab),0,0);& if ($VMS_STATUS_SUCCESS(status)) {) status = sys$connect(&(u->rab),0,0);' if ($VMS_STATUS_SUCCESS(status)) { *upp = u; return status; }; sys$close(&(u->fab),0,0); } free(u); return status;} /* file_fidopen */ /***++** ROUTINE: file_exists**** FUNCTIONAL DESCRIPTION:**(** Opens an existing file for reading.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**"** file_exists(fspec, [defspec])**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/6unsigned int file_exists(char *fspec, char *defspec) { struct FAB fab; struct NAM nam; char espec[256], rspec[256]; unsigned int status; fab = cc$rms_fab; nam = cc$rms_nam; fab.fab$l_fna = fspec;" fab.fab$b_fns = strlen(fspec); if (defspec) { fab.fab$l_dna = defspec;% fab.fab$b_dns = strlen(defspec); } nam.nam$l_esa = espec;$ nam.nam$b_ess = sizeof(espec)-1; nam.nam$l_rsa = rspec;$ nam.nam$b_rss = sizeof(rspec)-1; fab.fab$l_nam = &nam;! status = sys$parse(&fab,0,0);& if ($VMS_STATUS_SUCCESS(status)) {; if ((nam.nam$l_fnb) & NAM$M_WILDCARD) return RMS$_FNM;# status = sys$search(&fab,0,0); } return status;} /* file_exists */ /***++** ROUTINE: file_close**** FUNCTIONAL DESCRIPTION:**6** Closes a file opened by file_open or file_create.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** tbs**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/)unsigned int file_close(struct UNIT *u) { unsigned int status;" sys$disconnect(&(u->rab),0,0);& status = sys$close(&(u->fab),0,0); free(u); return status;} /***++** ROUTINE: file_dclose**** FUNCTIONAL DESCRIPTION:**8** Closes & deletes a file currently open for writing.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** tbs**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/*unsigned int file_dclose(struct UNIT *u) { unsigned int status;= if (!(u->fab.fab$b_fac & FAB$M_PUT)) return SS$_BADPARAM;" sys$disconnect(&(u->rab),0,0);" u->fab.fab$l_fop |= FAB$M_DLT;& status = sys$close(&(u->fab),0,0); free(u); return status;} /***++** ROUTINE: file_read**** FUNCTIONAL DESCRIPTION:** ** Reads a record from a file.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** tbs**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/Nunsigned int file_read(struct UNIT *u, char *buf, int buf_size, int *retlen) { unsigned int status;/*G** N.B.: buf_size is assumed to be the size of the read buffer minus 1*** extra byte for the null terminator.*/ u->rab.rab$l_ubf = buf; u->rab.rab$w_usz = buf_size;$ status = sys$get(&(u->rab),0,0);! u->rab.rab$b_rac = RAB$C_SEQ;& if ($VMS_STATUS_SUCCESS(status)) { *retlen = u->rab.rab$w_rsz; *(buf+(*retlen)) = 0; } return status;} /***++** ROUTINE: file_write**** FUNCTIONAL DESCRIPTION:**** Writes a record to a file.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** tbs**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/Bunsigned int file_write(struct UNIT *u, char *buf, int buf_size) { u->rab.rab$l_rbf = buf; u->rab.rab$w_rsz = buf_size;" return sys$put(&(u->rab),0,0);} /***++** ROUTINE: file_getpos**** FUNCTIONAL DESCRIPTION:**>** Returns the RFA of the next available record in the file.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** tbs**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/8unsigned int file_getpos(struct UNIT *u, short rfa[3]) { unsigned int status;% status = sys$find(&(u->rab),0,0);$ if ($VMS_STATUS_SUCCESS(status))) memcpy(rfa, &(u->rab.rab$w_rfa), 6);! u->rab.rab$b_rac = RAB$C_RFA; return status;} /* file_getpos */ /***++** ROUTINE: file_setpos**** FUNCTIONAL DESCRIPTION:**)** Moves the file to the specified RFA.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** tbs**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/8unsigned int file_setpos(struct UNIT *u, short rfa[3]) { unsigned int status;= if (rfa == (short *) 0) return sys$rewind(&(u->rab),0,0);2 if (rfa[0] == 0 && rfa[1] == 0 && rfa[2] == 0)& return sys$rewind(&(u->rab),0,0);! u->rab.rab$b_rac = RAB$C_RFA;( memcpy(&(u->rab.rab$w_rfa), rfa, 6);% status = sys$find(&(u->rab),0,0); return status;} /* file_setpos */ /***++** ROUTINE: file_get_rdt**** FUNCTIONAL DESCRIPTION:** ** Fetches the RDT for a file.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** file_get_rdt(fspec, rdt)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/3unsigned int file_get_rdt(char *fspec, TIME *rdt) { struct FAB fab; struct XABRDT xabrdt; unsigned int status; fab = cc$rms_fab; xabrdt = cc$rms_xabrdt; fab.fab$l_fna = fspec;" fab.fab$b_fns = strlen(fspec); fab.fab$b_fac = FAB$M_GET;% fab.fab$l_xab = (char *) &xabrdt; status = sys$open(&fab,0,0);& if ($VMS_STATUS_SUCCESS(status)) {' memcpy(rdt, &xabrdt.xab$q_rdt, 8); sys$close(&fab,0,0); } return status;} /* file_get_rdt */ /***++** ROUTINE: Copy_File**** FUNCTIONAL DESCRIPTION:**** tbs**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** tbs**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:n****** SIDE EFFECTS: None.****--*/Nunsigned int Copy_File(char *infile, char *outfile, char *rspec, int append) { struct UNIT *inu, *outu; unsigned int status; int inmax, len;I char *buf;3 status = file_open(infile, &inu, 0, 0, &inmax);*# if (!OK(status)) return status;o if (append) {t7 status = file_append(outfile, &outu, 0, rspec, 0);a } else {4 status = file_create(outfile, &outu, 0, rspec); } if (!OK(status)) { file_close(inu);r return status; }e buf = malloc(inmax+1); if (!buf) { if (append) { file_close(outu); } else {a file_dclose(outu);  } file_close(inu);a return SS$_INSFMEM; };= while (OK((status = file_read(inu, buf, inmax, &len)))) {r) status = file_write(outu, buf, len);) if (!OK(status)) break; }, free(buf); if (status != RMS$_EOF) {n if (append) { file_close(outu); } else {i file_dclose(outu);_ } file_close(inu);a return status;i }_ file_close(inu); file_close(outu);d return SS$_NORMAL;} /* Copy_File */n i/***++** ROUTINE: file_delete**** FUNCTIONAL DESCRIPTION:N**** Deletes a file.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**1** file_open(fspec, unit, [defspec], [resspec]) **** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.;**** COMPLETION CODES:_****** SIDE EFFECTS: None.****--*/'unsigned int file_delete(char *fspec) {f struct FAB fab;C struct NAM nam; char espec[255], rspec[255]; unsigned int status; fab = cc$rms_fab;  nam = cc$rms_nam;  fab.fab$l_fna = fspec;" fab.fab$b_fns = strlen(fspec); fab.fab$b_fac = FAB$M_GET; fab.fab$l_nam = &nam;  nam.nam$l_esa = espec;$ nam.nam$b_ess = sizeof(espec)-1; nam.nam$l_rsa = rspec;$ nam.nam$b_rss = sizeof(rspec)-1;# status = sys$parse(&fab, 0, 0); & if ($VMS_STATUS_SUCCESS(status)) {% status = sys$search(&fab, 0, 0);;' if ($VMS_STATUS_SUCCESS(status)) {$ fab.fab$l_fop |= FAB$M_NAM;( status = sys$erase(&fab, 0, 0); } }m return status;} /* file_delete */c% u->fab.fab$b_fns = strlen(fspec); if (defspec) { u->fab.fab$l_1~NEWSRDR_SRC.BCK$QP[NEWSRDR]NEWSRDR_CLD.CLD;5E8*[NEWSRDR]NEWSRDR_CLD.CLD;5+,$Q./ @ 4Ez-P0123KPWO567>8) g99G @HJMODULE NEWSRDR_CLDIDENT "V1.0-004"!++!! DESCRIPTION:!A! This is the command table used by the NEWSRDR utility for the! NEWSRDR command.!! AUTHOR: M. MadisonE! COPYRIGHT 1989, 1991 RENSSELAER POLYTECHNIC INSITUTE.3! COPYRIGHT 1992, MATTHEW D. MADISON."! ALL RIGHTS RESERVED.!! CREATION DATE: 15-MAR-1989!! MODIFICATION HISTORY:!4! 15-MAR-1989 V1.0-001 Madison Initial coding.=! 18-APR-1989 V1.0-002 Madison Changed name to NEWSRDR.?! 19-JUL-1989 V1.0-003 Madison Removed unused qualifiers.5! 21-NOV-1991 V1.0-004 Madison Add /UPDATE=BOTH!--DEFINE VERB NEWSRDR NOPARAMETERS3 QUALIFIER UPDATE, NEGATABLE, VALUE (TYPE=UPDKW)DEFINE TYPE UPDKW KEYWORD FULL, NONNEGATABLE! KEYWORD PARTIAL, NONNEGATABLE KEYWORD BOTH, NONNEGATABLEw~NEWSRDR_SRC.BCKP[NEWSRDR]MEM.C;11N*[NEWSRDR]MEM.C;11+,./ @ 4NL-P0123KPWO56eƖ7t|Ɩ8\6g99G @HJ./***++** FACILITY: NEWSRDR**(** ABSTRACT: Memory management routines**** MODULE DESCRIPTION:**<** These memory management routines are used to handle theB** frequently used blocks of memory needed by NEWSRDR. We createA** VM zones specifically tailored to each type of block's needs.**** AUTHOR: M. MadisonH** COPYRIGHT 1992, MATTHEW D. MADISON ALL RIGHTS RESERVED.**** CREATION DATE: 05-SEP-1992**** MODIFICATION HISTORY:**1** 05-SEP-1992 V1.0 Madison Initial coding.**--*/#ifdef __GNUC__#include #else#include #endif#define MODULE_MEM#include "newsrdr.h" struct HDR *mem_gethdr(int);) void mem_freehdr(struct HDR *);! struct GRP *mem_getgrp(void);) void mem_freegrp(struct GRP *); #ifdef notdef! struct SEL *mem_getsel(void);) void mem_freesel(struct SEL *);#endif /* notdef */! struct RNG *mem_getrng(void);) void mem_freerng(struct RNG *);" void mem_initcache(int);# void *mem_getcache(void);% void mem_freecache(void *);" void mem_delcache(void);N static unsigned int hdrzone=0, grpzone=0, rngzone=0, cachezn=0, selzone=0;! static int cache_unit_size=0; /***++** ROUTINE: mem_gethdr**** FUNCTIONAL DESCRIPTION:**>** The header VM pool is set up as a FREQUENT-SIZES VM zone,@** where the frequent sizes are 20, 40, 80, and 160 bytes (plusH** the header overhead of 8 bytes). When a request comes in for a sizeG** that's not exactly one of those, the next larger size is allocated.B** For headers longer than 160 bytes, none of the lookaside lists ** are used.**** RETURNS: struct HDR ***** PROTOTYPE:**** mem_gethdr(int size)**&** size: integer, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** All errors are signalled.**** SIDE EFFECTS: None.****--*/"struct HDR *mem_gethdr(int size) { int allosize; struct { int size1; int size2; char rest[1]; } *blk; unsigned int status; if (hdrzone == 0) {, unsigned int alg = LIB$K_VM_FREQ_SIZES; unsigned int param = 4;D unsigned int flags = LIB$M_VM_GET_FILL0 | LIB$M_VM_EXTEND_AREA;A status = lib$create_vm_zone(&hdrzone, &alg, ¶m, &flags);' if (!OK(status)) lib$stop(status); }) allosize = size + sizeof(struct HDR);% if (allosize < 20) allosize = 20;+ else if (allosize <= 40) allosize = 40;+ else if (allosize <= 80) allosize = 80;- else if (allosize <= 160) allosize = 160; allosize += sizeof(int) * 2;3 status = lib$get_vm(&allosize, &blk, &hdrzone);& if (!OK(status)) lib$stop(status);' blk->size1 = blk->size2 = allosize;' return (struct HDR *) &(blk->rest);} /* mem_gethdr */ /***++** ROUTINE: mem_freehdr**** FUNCTIONAL DESCRIPTION:**6** Frees a header. Note that the actual size of the;** allocated block is hidden "behind" the HDR structure we** passed back in mem_gethdr.**** RETURNS: void**** PROTOTYPE:**!** mem_freehdr(struct HDR *hdr)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/#void mem_freehdr(struct HDR *hdr) { struct BLK { int size1; int size2; char rest[1]; } *blk; int size;: blk = (struct BLK *) (((char *) hdr) - sizeof(int)*2);9 if (blk->size1 != blk->size2) lib$stop(SS$_BADPARAM); size = blk->size1;' lib$free_vm(&size, &blk, &hdrzone);} /* mem_freehdr */ /***++** ROUTINE: mem_getgrp**** FUNCTIONAL DESCRIPTION:**0** Allocates a GRP structure from the GRPZONE.**** RETURNS: struct GRP ***** PROTOTYPE:**** mem_getgrp()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** All errors are signalled.**** SIDE EFFECTS: None.****--*/struct GRP *mem_getgrp() { struct GRP *grp; unsigned int status;' static int size=sizeof(struct GRP); if (grpzone == 0) {' unsigned int alg = LIB$K_VM_FIXED;D unsigned int flags = LIB$M_VM_GET_FILL0 | LIB$M_VM_EXTEND_AREA;@ status = lib$create_vm_zone(&grpzone, &alg, &size, &flags);' if (!OK(status)) lib$stop(status); }/ status = lib$get_vm(&size, &grp, &grpzone);& if (!OK(status)) lib$stop(status); return grp;} /* mem_getgrp */ /***++** ROUTINE: mem_freegrp**** FUNCTIONAL DESCRIPTION:**** Frees a GRP block.**** RETURNS: void**** PROTOTYPE:**!** mem_freegrp(struct GRP *grp)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/#void mem_freegrp(struct GRP *grp) {) static int size = sizeof(struct GRP);' lib$free_vm(&size, &grp, &grpzone);} /* mem_freegrp */ /***++** ROUTINE: mem_getsel**** FUNCTIONAL DESCRIPTION:**0** Allocates a SEL structure from the SELZONE.**** RETURNS: struct SEL ***** PROTOTYPE:**** mem_getsel()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** All errors are signalled.**** SIDE EFFECTS: None.****--*/ #ifdef notdefstruct SEL *mem_getsel() { struct SEL *sel; unsigned int status;' static int size=sizeof(struct SEL); if (selzone == 0) {' unsigned int alg = LIB$K_VM_FIXED;D unsigned int flags = LIB$M_VM_GET_FILL0 | LIB$M_VM_EXTEND_AREA;@ status = lib$create_vm_zone(&selzone, &alg, &size, &flags);' if (!OK(status)) lib$stop(status); }/ status = lib$get_vm(&size, &sel, &selzone);& if (!OK(status)) lib$stop(status);7 sel->rngque.head = sel->rngque.tail = &sel->rngque;: sel->subjque.head = sel->subjque.tail = &sel->subjque;7 sel->kwdque.head = sel->kwdque.tail = &sel->kwdque;: sel->fromque.head = sel->fromque.tail = &sel->fromque;= sel->xsubjque.head = sel->xsubjque.tail = &sel->xsubjque;= sel->xfromque.head = sel->xfromque.tail = &sel->xfromque; return sel;} /* mem_getsel */ /***++** ROUTINE: mem_freesel**** FUNCTIONAL DESCRIPTION:**** Frees a SEL block.**** RETURNS: void**** PROTOTYPE:**!** mem_freesel(struct SEL *sel)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/#void mem_freesel(struct SEL *sel) {) static int size = sizeof(struct SEL); struct RNG *rng; struct HDR *hdr;B while (queue_remove(sel->rngque.head, &rng)) mem_freerng(rng);B while (queue_remove(sel->subjque.head &hdr)) mem_freehdr(hdr);A while (queue_remove(sel->kwdque.head &hdr)) mem_freehdr(hdr);B while (queue_remove(sel->fromque.head &hdr)) mem_freehdr(hdr);C while (queue_remove(sel->xsubjque.head &hdr)) mem_freehdr(hdr);C while (queue_remove(sel->xfromque.head &hdr)) mem_freehdr(hdr);' lib$free_vm(&size, &sel, &selzone);} /* mem_freesel */#endif /* notdef */ /***++** ROUTINE: mem_getrng**** FUNCTIONAL DESCRIPTION:**,** Allocates a RNG block from the RNGZONE.**** RETURNS: struct RNG ***** PROTOTYPE:**** mem_getrng()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** All errors are signalled.**** SIDE EFFECTS: None.****--*/struct RNG *mem_getrng() { struct RNG *rng; unsigned int status;' static int size=sizeof(struct RNG); if (rngzone == 0) {' unsigned int alg = LIB$K_VM_FIXED;D unsigned int flags = LIB$M_VM_GET_FILL0 | LIB$M_VM_EXTEND_AREA;@ status = lib$create_vm_zone(&rngzone, &alg, &size, &flags);' if (!OK(status)) lib$stop(status); }/ status = lib$get_vm(&size, &rng, &rngzone);& if (!OK(status)) lib$stop(status); return rng;} /* mem_getrng */ /***++** ROUTINE: mem_freerng**** FUNCTIONAL DESCRIPTION:**** Frees a RNG structure.**** RETURNS: void**** PROTOTYPE:**!** mem_freerng(struct RNG *rng)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES: None.**** SIDE EFFECTS: None.****--*/#void mem_freerng(struct RNG *rng) {) static int size = sizeof(struct RNG);' lib$free_vm(&size, &rng, &rngzone);} /* mem_freerng */ /***++** ROUTINE: mem_initcache**** FUNCTIONAL DESCRIPTION:**;** Initializes a cache of fixed-size blocks. Used by the3** ARTICLE module for its private CHDR structures.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** mem_initcache(int size)**(** size: integer, read only, by value**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** All errors are signalled.**** SIDE EFFECTS: None.****--*/void mem_initcache(int size) { unsigned int status; if (cachezn == 0) {' unsigned int alg = LIB$K_VM_FIXED;D unsigned int flags = LIB$M_VM_GET_FILL0 | LIB$M_VM_EXTEND_AREA;@ status = lib$create_vm_zone(&cachezn, &alg, &size, &flags);' if (!OK(status)) lib$stop(status); } cache_unit_size = size; return;} /* mem_initcache */ /***++** ROUTINE: mem_getcache**** FUNCTIONAL DESCRIPTION:**?** Allocates a block from the cache created by mem_initcache.**** RETURNS: void ***** PROTOTYPE:**** mem_getcache()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:** All errors are signalled.**** SIDE EFFECTS: None.****--*/void *mem_getcache() { void *cache; unsigned int status;- if (cachezn == 0) lib$stop(SS$_BADPARAM);< status = lib$get_vm(&cache_unit_size, &cache, &cachezn);& if (!OK(status)) lib$stop(status); return cache;} /* mem_getcache */ /***++** ROUTINE: mem_freecache**** FUNCTIONAL DESCRIPTION:**-** Frees a block allocated by mem_getcache.**** RETURNS: void**** PROTOTYPE:**%** mem_freecache(void *cache_block)**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/!void mem_freecache(void *cache) {4 lib$free_vm(&cache_unit_size, &cache, &cachezn);} /* mem_freecache */ /***++** ROUTINE: mem_delcache**** FUNCTIONAL DESCRIPTION:**E** Deletes the VM zone created by mem_initcache, in one fell swoop.**** RETURNS: void**** PROTOTYPE:**** mem_delcache()**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/void mem_delcache() { if (cachezn) {" lib$delete_vm_zone(&cachezn);# cachezn = cache_unit_size = 0; }} /* mem_delcache */M~NEWSRDR_SRC.BCKP[NEWSRDR]CMD_TABLE.CLD;116Q#*[NEWSRDR]CMD_TABLE.CLD;116+,.#/ @ 4Q#"-P0123KPWO$56Ζ7V4Ζ8V Ϗ<9G @HJDMODULE CMD_TABLEIDENT "V4.2-2"!++!! DESCRIPTION:!C! This is the command table used by the NEWS utility for internal! NEWS commands.!! AUTHOR: M. Madison9! COPYRIGHT 1992, 1993 MATTHEW D. MADISON."! ALL RIGHTS RESERVED.!! CREATION DATE: 15-MAR-1989!! MODIFICATION HISTORY:!3! 15-MAR-1989 V1.0-1 Madison Initial coding.D! 02-JUN-1989 V1.1-2 Madison Change DIRECTORY command to take?! starting article number, not groupname.=! Ditched stupid /ALL qualifier on DIR.:! 05-JUN-1989 V1.1-3 Madison Allow REPLY/POST/MAIL.F! 05-JUN-1989 V1.1-4 Madison Add /LAST, /FIRST to READ command.>! 15-FEB-1990 V1.2-5 Madison Add /FOLLOW to POST, REPLY.4! 16-FEB-1990 V2.0 Madison DIR/SUBJ/KEYW/AUTH.D! 21-FEB-1990 V2.0-1 Madison Provide fspec default on EXTRACT.I! 01-MAR-1990 V2.1-2 Madison Add /[NO]SELF to MAIL, REPLY commands.5! 23-MAY-1990 V2.2-3 Madison Add READ/PREVIOUS.:! 28-JUN-1990 V2.3-4 Madison Modify SET EDIT/EDITOR.K! 08-JAN-1991 V2.4 Madison SET SIG/AUTO change. SET REPLY. READ/SUBJ.8! REPLY/TO. DIR/WIDTH.:! 08-FEB-1991 V2.5 Madison SET NOSEEN. REPLY/GROUP.B! 11-OCT-1991 V3.0 Madison Change default on UPDATE command.N! 14-NOV-1991 V3.0-1 Madison Add PREVIOUS, BACK as synonymos for READ/P.D! 22-NOV-1991 V3.0-2 Madison Allow input file on POST command.M! 04-JUN-1992 V3.1 Madison SET IGNORE/NEWSGROUPS. READ/NEXT/GROUP/NEW.E! 11-SEP-1992 X4.0 Madison Added SUB/LOG, UNSUB/LOG, SET NEWSRCF! 12-SEP-1992 X4.0-1 Madison Added SET DIR, SET FORM, SET QUEUE.2! 12-SEP-1992 X4.0-2 Madison Added SUB/GOTO.8! 15-SEP-1992 X4.0-3 Madison Added DIR/GROUP/SORT.6! 08-OCT-1992 V4.0-4 Madison Added SHOW VERSION.@! 15-FEB-1993 V4.1 Madison Added SET SEEN/SUBJECT, /CROSS.A! 12-APR-1993 V4.2 Madison Added CUR/ED, SET AUTO_READ_NEW.Q! 23-APR-1993 V4.2-1 Madison Added SET FORCE_MAIL_PROTOCOL, NEWGROUP_ACTION4! 23-MAY-1993 V4.2-2 Madison Changed SET SEEN.!--DEFINE VERB EXIT ROUTINE CMD_EXIT SYNONYM E SYNONYM EXDEFINE VERB PREVIOUS SYNONYM BACK ROUTINE CMD_READPREV NOPARAMETERSDEFINE VERB READ1 QUALIFIER NEXT, NONNEGATABLE, SYNTAX=READNEXT/ QUALIFIER NEW, NONNEGATABLE, SYNTAX=READNEW5 QUALIFIER PREVIOUS, NONNEGATABLE, SYNTAX=READPREV5 QUALIFIER THREAD, NONNEGATABLE, SYNTAX=READTHREAD ROUTINE CMD_READ7 PARAMETER P1, LABEL=ARTNUM, PROMPT="Article number"1 QUALIFIER SUBJECT, NONNEGATABLE, VALUE (LIST)3 QUALIFIER GROUP, NONNEGATABLE, VALUE (REQUIRED)! QUALIFIER FIRST, NONNEGATABLE QUALIFIER LAST, NONNEGATABLE0 DISALLOW ANY2 (FIRST, LAST, SUBJECT, ARTNUM)DEFINE VERB FIRST ROUTINE CMD_READ NOPARAMETERS3 QUALIFIER GROUP, NONNEGATABLE, VALUE (REQUIRED)DEFINE VERB LAST ROUTINE CMD_READ NOPARAMETERS3 QUALIFIER GROUP, NONNEGATABLE, VALUE (REQUIRED)DEFINE SYNTAX READNEW ROUTINE CMD_READNEW NOQUALIFIERS NOPARAMETERSDEFINE SYNTAX READNEXT3 QUALIFIER NEW, NONNEGATABLE, SYNTAX=READNEXTNEW NOPARAMETERS ROUTINE CMD_READNEXTDEFINE SYNTAX READPREV NOPARAMETERS ROUTINE CMD_READPREVDEFINE SYNTAX READTHREAD ROUTINE CMD_READTHREAD NOPARAMETERS QUALIFIER NEW, NONNEGATABLEDEFINE SYNTAX READNEXTNEW: QUALIFIER GROUP, NONNEGATABLE, SYNTAX=READNEXTNEWGROUP ROUTINE CMD_READNEXTNEW NOPARAMETERSDEFINE VERB NEXT: QUALIFIER GROUP, NONNEGATABLE, SYNTAX=READNEXTNEWGROUP ROUTINE CMD_READNEXTNEW NOPARAMETERSDEFINE SYNTAX READNEXTNEWGROUP ROUTINE CMD_READNEXTNEWGROUP NOPARAMETERS NOQUALIFIERSDEFINE SYNTAX DIRGROUP ROUTINE CMD_DIRGROUP PARAMETER P1, LABEL=GRPNAM QUALIFIER SORT, NEGATABLE QUALIFIER ALL, NONNEGATABLEDEFINE VERB DIRECTORY2 QUALIFIER GROUP, NONNEGATABLE, SYNTAX=DIRGROUP ROUTINE CMD_DIR4 PARAMETER P1, LABEL=ARTNUM, VALUE (TYPE=$NUMBER)8 QUALIFIER FROM, NONNEGATABLE, VALUE (REQUIRED, LIST); QUALIFIER SUBJECT, NONNEGATABLE, VALUE (REQUIRED, LIST); QUALIFIER KEYWORD, NONNEGATABLE, VALUE (REQUIRED, LIST)I QUALIFIER WIDTH, NONNEGATABLE, VALUE (REQUIRED, LIST, TYPE=DIRWIDTHS) QUALIFIER SEEN, NONNEGATABLE" QUALIFIER UNSEEN, NONNEGATABLEJ QUALIFIER EXCLUDE, NONNEGATABLE, VALUE (REQUIRED, LIST, TYPE=EXCLUDES)DEFINE TYPE DIRWIDTHS> KEYWORD FROM, NONNEGATABLE, VALUE (REQUIRED, TYPE=$NUMBER)A KEYWORD SUBJECT, NONNEGATABLE, VALUE (REQUIRED, TYPE=$NUMBER)DEFINE TYPE EXCLUDES6 KEYWORD FROM, NONNEGATABLE, VALUE (REQUIRED, LIST)9 KEYWORD SUBJECT, NONNEGATABLE, VALUE (REQUIRED, LIST)DEFINE VERB GROUP ROUTINE CMD_GROUPE PARAMETER P1, LABEL=GRPNAM, PROMPT="Group name", VALUE (REQUIRED) NOQUALIFIERSDEFINE VERB CURRENT ROUTINE CMD_CURRENT NOPARAMETERS QUALIFIER ROTATE QUALIFIER EDIT QUALIFIER FULL_HEADERSDEFINE VERB REPLY ROUTINE CMD_REPLY SYNONYM FOLLOWUP SYNONYM RE SYNONYM RA PARAMETER P1, LABEL=GRPNAM, PROMPT="Group name", VALUE (LIST) QUALIFIER MAIL, NONNEGATABLE QUALIFIER POST, NONNEGATABLE QUALIFIER EDIT, NEGATABLE QUALIFIER EXTRACT, NEGATABLE4 QUALIFIER SUBJECT, NEGATABLE, VALUE (DEFAULT="")" QUALIFIER SIGNATURE, NEGATABLE@ QUALIFIER DISTRIBUTION, NONNEGATABLE, VALUE (REQUIRED, LIST)? QUALIFIER FOLLOWUP_TO, NONNEGATABLE, VALUE (REQUIRED, LIST) QUALIFIER SELF, NEGATABLE6 QUALIFIER TO, NONNEGATABLE, VALUE (REQUIRED, LIST)DEFINE VERB POST ROUTINE CMD_POSTA PARAMETER P1, LABEL=GRPNAM, PROMPT="Group name", VALUE (LIST)2 PARAMETER P2, LABEL=INPFIL, VALUE (TYPE=$FILE) QUALIFIER EDIT, NEGATABLE4 QUALIFIER SUBJECT, NEGATABLE, VALUE (DEFAULT="")" QUALIFIER SIGNATURE, NEGATABLE@ QUALIFIER DISTRIBUTION, NONNEGATABLE, VALUE (REQUIRED, LIST)? QUALIFIER FOLLOWUP_TO, NONNEGATABLE, VALUE (REQUIRED, LIST)> QUALIFIER FILE, NONNEGATABLE, VALUE (REQUIRED, TYPE=$FILE)DEFINE VERB MAIL ROUTINE CMD_MAIL SYNONYM SEND1 PARAMETER P1, LABEL=FSPEC, VALUE (TYPE=$FILE) QUALIFIER EDIT, NEGATABLE4 QUALIFIER SUBJECT, NEGATABLE, VALUE (DEFAULT="")" QUALIFIER SIGNATURE, NEGATABLE6 QUALIFIER TO, NONNEGATABLE, VALUE (REQUIRED, LIST) QUALIFIER SELF, NEGATABLEDEFINE VERB FORWARD ROUTINE CMD_FORWARD4 PARAMETER P1, LABEL=ARTNUM, VALUE (TYPE=$NUMBER) QUALIFIER EDIT, NEGATABLE4 QUALIFIER SUBJECT, NEGATABLE, VALUE (DEFAULT="")" QUALIFIER SIGNATURE, NEGATABLE6 QUALIFIER TO, NONNEGATABLE, VALUE (REQUIRED, LIST) QUALIFIER SELF, NEGATABLEDEFINE VERB STORE ROUTINE CMD_FORWARD4 PARAMETER P1, LABEL=ARTNUM, VALUE (TYPE=$NUMBER) NOQUALIFIERSDEFINE VERB SUBSCRIBE ROUTINE CMD_SUBSCRIBEK PARAMETER P1, LABEL=GRPNAM, PROMPT="Group name", VALUE (REQUIRED, LIST) QUALIFIER CONFIRM, NEGATABLE QUALIFIER LOG, NEGATABLE QUALIFIER GOTO, NONNEGATABLEDEFINE VERB UNSUBSCRIBE ROUTINE CMD_UNSUBSCRIBEA PARAMETER P1, LABEL=GRPNAM, PROMPT="Group name", VALUE (LIST) QUALIFIER CONFIRM, NEGATABLE QUALIFIER LOG, NEGATABLEDEFINE TYPE SHOW_KWDS! KEYWORD HEADERS, NONNEGATABLE' KEYWORD PERSONAL_NAME, NONNEGATABLE KEYWORD EDIT, NONNEGATABLE KEYWORD SERVER, NONNEGATABLE' KEYWORD CURRENT_GROUP, NONNEGATABLE KEYWORD GROUP, NONNEGATABLE( KEYWORD SIGNATURE_FILE, NONNEGATABLE+ KEYWORD ARCHIVE_DIRECTORY, NONNEGATABLE KEYWORD REPLY, NONNEGATABLE4 KEYWORD IGNORE, NONNEGATABLE, SYNTAX=SHOW_IGNORE KEYWORD NEWSRC, NONNEGATABLE) KEYWORD DIRECTORY_WIDTH, NONNEGATABLE KEYWORD QUEUE, NONNEGATABLE KEYWORD FORM, NONNEGATABLE! KEYWORD VERSION, NONNEGATABLE' KEYWORD AUTO_READ_NEW, NONNEGATABLE- KEYWORD FORCE_MAIL_PROTOCOL, NONNEGATABLE) KEYWORD NEWGROUP_ACTION, NONNEGATABLE KEYWORD ALL, NONNEGATABLEDEFINE VERB SHOW ROUTINE CMD_SHOW4 PARAMETER P1, LABEL=SHOWKW, PROMPT="Show what?",+ VALUE (REQUIRED, TYPE=SHOW_KWDS, LIST) NOQUALIFIERSDEFINE SYNTAX SHOW_IGNORE4 PARAMETER P1, LABEL=SHOWKW, PROMPT="Show what?",+ VALUE (REQUIRED, TYPE=SHOW_KWDS, LIST)" QUALIFIER GLOBAL, NONNEGATABLE! QUALIFIER LOCAL, NONNEGATABLEDEFINE VERB SETO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS) NOQUALIFIERSDEFINE TYPE SET_KWDS2 KEYWORD HEADERS, SYNTAX=SET_HEADERS, NEGATABLE5 KEYWORD PERSONAL_NAME, SYNTAX=SET_PERS, NEGATABLE* KEYWORD EDIT, SYNTAX=SET_ED, NEGATABLE1 KEYWORD REPLY, SYNTAX=SET_REPLY, NONNEGATABLE/ KEYWORD SEEN, SYNTAX=SET_SEEN, NONNEGATABLE3 KEYWORD UNSEEN, SYNTAX=SET_UNSEEN, NONNEGATABLE5 KEYWORD SIGNATURE_FILE, SYNTAX=SET_SIG, NEGATABLE< KEYWORD ARCHIVE_DIRECTORY, SYNTAX=SET_ARCHIVE, NEGATABLE0 KEYWORD IGNORE, SYNTAX=SET_IGNORE, NEGATABLE0 KEYWORD NEWSRC, SYNTAX=SET_NEWSRC, NEGATABLE1 KEYWORD QUEUE, SYNTAX=SET_QUEUE, NONNEGATABLE, KEYWORD FORM, SYNTAX=SET_FORM, NEGATABLE9 KEYWORD DIRECTORY_WIDTH, SYNTAX=SET_DIR, NONNEGATABLE4 KEYWORD AUTO_READ_NEW, SYNTAX=SET_ARN, NEGATABLE: KEYWORD FORCE_MAIL_PROTOCOL, SYNTAX=SET_FMP, NEGATABLE8 KEYWORD NEWGROUP_ACTION SYNTAX=SET_NGA, NONNEGATABLEDEFINE SYNTAX SET_HEADERS ROUTINE CMD_SET_HEADERSO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)O PARAMETER P2, LABEL=HDRNAM, PROMPT="Header", VALUE (TYPE=HEADER_KWDS, LIST) NOQUALIFIERSDEFINE TYPE HEADER_KWDS KEYWORD FROM, NEGATABLE KEYWORD DATE, NEGATABLE! KEYWORD NEWSGROUPS, NEGATABLE KEYWORD SUBJECT, NEGATABLE! KEYWORD MESSAGE_ID, NEGATABLE KEYWORD PATH, NEGATABLE KEYWORD REPLY_TO, NEGATABLE KEYWORD SENDER, NEGATABLE" KEYWORD FOLLOWUP_TO, NEGATABLE KEYWORD EXPIRES, NEGATABLE! KEYWORD REFERENCES, NEGATABLE# KEYWORD DISTRIBUTION, NEGATABLE# KEYWORD ORGANIZATION, NEGATABLE KEYWORD KEYWORDS, NEGATABLE KEYWORD SUMMARY, NEGATABLE KEYWORD APPROVED, NEGATABLE KEYWORD LINES, NEGATABLE KEYWORD XREF, NEGATABLEDEFINE SYNTAX SET_PERS ROUTINE CMD_SET_PERSNAMO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS). PARAMETER P2, LABEL=PERSNAM, PROMPT="Name" QUALIFIER MAIL, NONNEGATABLEDEFINE SYNTAX SET_REPLY ROUTINE CMD_SET_REPLYO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)7 PARAMETER P2, LABEL=REPLYTYPE, PROMPT="Reply type",, VALUE (REQUIRED, LIST, TYPE=REPLY_KWDS)DEFINE TYPE REPLY_KWDS KEYWORD MAIL KEYWORD POSTDEFINE SYNTAX SET_ED ROUTINE CMD_SET_EDITO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)9 QUALIFIER EDITOR, NONNEGATABLE, VALUE (REQUIRED,LIST)DEFINE SYNTAX SET_SEEN ROUTINE CMD_SET_SEEN0 QUALIFIER ALL, NONNEGATABLE, SYNTAX=MARK_ALL; QUALIFIER SUBJECT, NONNEGATABLE, VALUE (REQUIRED, LIST) QUALIFIER CROSS_REFERENCES QUALIFIER THREADO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)8 PARAMETER P2, LABEL=ARTRNG, PROMPT="Article number", VALUE (LIST)! DISALLOW (THREAD AND SUBJECT)DEFINE SYNTAX SET_UNSEEN ROUTINE CMD_SET_SEEN0 QUALIFIER ALL, NONNEGATABLE, SYNTAX=MARK_ALL; QUALIFIER SUBJECT, NONNEGATABLE, VALUE (REQUIRED, LIST) QUALIFIER CROSS_REFERENCES QUALIFIER THREADO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)8 PARAMETER P2, LABEL=ARTRNG, PROMPT="Article number", VALUE (LIST)! DISALLOW (THREAD AND SUBJECT)DEFINE SYNTAX SET_SIG ROUTINE CMD_SET_SIGO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)3 PARAMETER P2, LABEL=SIGFILE, VALUE (TYPE=$FILE)@ QUALIFIER AUTOMATIC, NEGATABLE, VALUE (LIST, TYPE=AUTO_KWDS)DEFINE TYPE AUTO_KWDS KEYWORD MAIL, NEGATABLE KEYWORD POST, NEGATABLEDEFINE SYNTAX SET_ARCHIVE ROUTINE CMD_SET_ARCHIVEO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)3 PARAMETER P2, LABEL=ARCHIVE, VALUE (TYPE=$FILE) NOQUALIFIERSDEFINE SYNTAX SET_IGNORE ROUTINE CMD_SET_IGNOREO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS) PARAMETER P2, LABEL=GRPNAM2 QUALIFIER FROM, NONNEGATABLE, VALUE (REQUIRED)5 QUALIFIER SUBJECT, NONNEGATABLE, VALUE (REQUIRED)8 QUALIFIER NEWSGROUPS, NONNEGATABLE, VALUE (REQUIRED)" QUALIFIER GLOBAL, NONNEGATABLE- DISALLOW ANY2 (FROM, SUBJECT, NEWSGROUPS)DEFINE SYNTAX MARK_ALLO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)DEFINE SYNTAX SET_NEWSRC ROUTINE CMD_SET_NEWSRCO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)7 PARAMETER P2, LABEL=NEWSRC_FILE, VALUE (TYPE=$FILE)( QUALIFIER SUBSCRIBED_ONLY, NEGATABLEDEFINE SYNTAX SET_QUEUE ROUTINE CMD_SET_QUEUEO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)F PARAMETER P2, LABEL=QUENAME, PROMPT="Queue name", VALUE (REQUIRED) NOQUALIFIERSDEFINE SYNTAX SET_FORM ROUTINE CMD_SET_FORMO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS) PARAMETER P2, LABEL=FORMNAME NOQUALIFIERSDEFINE SYNTAX SET_DIR ROUTINE CMD_SET_DIRO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)1 QUALIFIER FROM, VALUE(REQUIRED, TYPE=$NUMBER)4 QUALIFIER SUBJECT, VALUE(REQUIRED, TYPE=$NUMBER)DEFINE SYNTAX SET_ARN ROUTINE CMD_SET_ARNO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS) NOQUALIFIERSDEFINE SYNTAX SET_FMP ROUTINE CMD_SET_FMPO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS) NOQUALIFIERSDEFINE TYPE NGA_KWDS KEYWORD NONE, NONNEGATABLE KEYWORD PROMPT, NONNEGATABLE# KEYWORD SUBSCRIBE, NONNEGATABLEDEFINE SYNTAX SET_NGA ROUTINE CMD_SET_NGAO PARAMETER P1, LABEL=SETKW, PROMPT="Option", VALUE (REQUIRED, TYPE=SET_KWDS)O PARAMETER P2, LABEL=NGAKW, PROMPT="Action", VALUE (REQUIRED, TYPE=NGA_KWDS) NOQUALIFIERSDEFINE VERB UPDATE ROUTINE CMD_UPDATE_FULL( QUALIFIER PARTIAL, SYNTAX=UPDPARTIAL QUALIFIER FULL, NONNEGATABLE NOPARAMETERSDEFINE SYNTAX UPDPARTIAL ROUTINE CMD_UPDATE NOQUALIFIERS NOPARAMETERSDEFINE VERB HELP ROUTINE CMD_HELP9 PARAMETER P1, LABEL=TOPIC, VALUE (TYPE=$REST_OF_LINE) NOQUALIFIERSDEFINE VERB SPAWN ROUTINE CMD_SPAWN7 PARAMETER P1, LABEL=CMD, VALUE (TYPE=$REST_OF_LINE)? QUALIFIER INPUT, NONNEGATABLE, VALUE (REQUIRED, TYPE=$FILE)& QUALIFIER LOGICAL_NAMES, NEGATABLE@ QUALIFIER OUTPUT, NONNEGATABLE, VALUE (REQUIRED, TYPE=$FILE)7 QUALIFIER PROCESS, NONNEGATABLE, VALUE (DEFAULT="") QUALIFIER SYMBOLS, NEGATABLE QUALIFIER WAIT, NEGATABLEDEFINE VERB ATTACH ROUTINE CMD_ATTACH PARAMETER P1, LABEL=PRCNAM" QUALIFIER PARENT, NONNEGATABLEDEFINE VERB EXTRACT ROUTINE CMD_EXTRACT SYNONYM SAVED PARAMETER P1, LABEL=FSPEC, PROMPT="Filename", VALUE (TYPE=$FILE), PARAMETER P2, LABEL=ARTRNG, VALUE (LIST) QUALIFIER APPEND, NEGATABLE QUALIFIER HEADERS, NEGATABLE QUALIFIER ROTATEDEFINE VERB CANCEL ROUTINE CMD_CANCEL4 PARAMETER P1, LABEL=ARTNUM, VALUE (TYPE=$NUMBER)DEFINE VERB DEFINE QUALIFIER KEY, SYNTAX=DEFKEYDEFINE SYNTAX DEFKEY ROUTINE CMD_DEFKEY9 PARAMETER P1, LABEL=DKCMD, VALUE (TYPE=$REST_OF_LINE)DEFINE VERB PRINT ROUTINE CMD_PRINT) QUALIFIER CANCEL, SYNTAX=PRINT_CANCEL% QUALIFIER PRINT, SYNTAX=PRINT_NOW# QUALIFIER NOW, SYNTAX=PRINT_NOW, PARAMETER P1, LABEL=ARTRNG, VALUE (LIST) QUALIFIER HEADERS, NEGATABLE QUALIFIER ROTATE9 QUALIFIER AFTER, NONNEGATABLE, VALUE (TYPE=$DATETIME)( QUALIFIER BURST, VALUE (TYPE=ALLONE)8 QUALIFIER COPIES, NONNEGATABLE, VALUE (TYPE=$NUMBER) QUALIFIER FEED' QUALIFIER FLAG, VALUE (TYPE=ALLONE)E2 QUALIFIER FORM, NONNEGATABLE, VALUE (REQUIRED) QUALIFIER HOLD2 QUALIFIER NAME, NONNEGATABLE, VALUE (REQUIRED) QUALIFIER NOTIFY> QUALIFIER PARAMETERS, NONNEGATABLE, VALUE (REQUIRED, LIST)3 QUALIFIER QUEUE, NONNEGATABLE, VALUE (REQUIRED)i QUALIFIER SPACE * QUALIFIER TRAILER, VALUE (TYPE=ALLONE)DEFINE TYPE ALLONE KEYWORD ALLi KEYWORD ONE,DEFINE SYNTAX PRINT_CANCEL ROUTINE CMD_PRINT_CANCEL NOPARAMETERS NOQUALIFIERSDEFINE SYNTAX PRINT_NOW  ROUTINE CMD_PRINT_NOWN NOPARAMETERS QUALIFIER NOTIFYT to READ command.>! 15-FEB-1990 V1.2-5 Madison Add /FOLLOW to POST, REPLY.4! 16-FEB-1990 V2.0 Madison DIR/SUBJ/KEYW/AUTH.D! 21-FEB-1990 V2.0-1 Madison Provide fspec default on EXTRACT.I! 01-MAR-1990 V2.1-2 Madison Add /[NO]SELF to MAIL, REPLY commands.5! 23-MAY-1990 7~NEWSRDR_SRC.BCKPP[NEWSRDR]NEWS_MSG.MSG;59O*[NEWSRDR]NEWS_MSG.MSG;59+,P./ @ 4O d-P0123KPWO 56/97PZ98cg99G @HJ.TITLE NEWS_MSG!.FACILITY NEWS,1044/PREFIX=NEWS__.IDENT "V4.0-2"!++!! DESCRIPTION:!9! These are the message codes used by the NEWS utility.!! AUTHOR: M. Madison9! COPYRIGHT 1992, 1993 MATTHEW D. MADISON."! ALL RIGHTS RESERVED.!! CREATION DATE: 09-MAR-1989!! MODIFICATION HISTORY:!4! 17-MAR-1989 V1.0-001 Madison Initial coding.?! 02-JUN-1989 V1.0-002 Madison Added news__usingcurgroup.;! 05-JUN-1989 V1.0-003 Madison Added news__noartspec.B! 14-FEB-1990 V1.0-004 Madison news__newgroup changed a bit.=! 16-FEB-1990 V2.0 Madison Added msgs for read/thread.4! 21-FEB-1990 V2.0-1 Madison Added SETARCHERR=! 23-FEB-1990 V2.1-2 Madison Added MARKCOUNT, NEWCOUNT<! 24-FEB-1990 V2.1-3 Madison Fix MARKCOUNT, NEWCOUNT.E! 01-MAR-1990 V2.2-4 Madison Add FWDERR, ADDRSYNTX, CANCELLED.>! 23-MAY-1990 V2.2-5 Madison Get rid of !/ in UNEXPRSP.@! 28-JUN-1990 V2.3-6 Madison Add KWDSYNTAX, RECONNECTING./! 13-NOV-1990 V2.4 Madison Add NOPARENT.>! 09-JAN-1991 V2.5 Madison Add NOMOREMATCH, NOSUBJSPEC.1! 11-OCT-1991 V3.0 Madison Add SUBSCRIBED.0! 04-NOV-1991 V3.0-1 Madison Add BODYERR.2! 04-JUN-1992 V3.1 Madison Add NOREPLYADDR.>! 11-SEP-1992 X4.0 Madison Add GRPSET, DIDSUB, DIDUNSUB3! 17-SEP-1992 X4.0-1 Madison Add NOIGHDSPEC.>! 15-FEB-1993 V4.0-2 Madison Remove all !AZ references.!--.SEVERITY FATAL9NOCONNECT /FAO=2.SEVERITY ERROR:CFGERR @UNEXPRSP /FAO=3,PROTOERR 'NONETADR +SENDERR .RCVERR &BUFALLOCERR .PAGERR 8COMPOSERR *KWDSYNTAX /FAO=2(CMDERR 9CAPTIVE (ATTERR 'PRINTERR /NOPOSTING 2POSTERR 0MAILERR %REPLYERR (SPAWNERR 'NOPRINT CNOTYOURS /FAO=48BODYERR /FAO=2?NOREPLYADDR 2RCRDERR /FAO=22RCWRTERR /FAO=2.SEVERITY WARNING"NONEW 6NOMORE #NOMORENEW *NOCURART -NOSUCHGRP /FAO=28NOTSUBSCR /FAO=2,NOCURGROUP 9NOGRMATCH /FAO=22EDNOTFOUND /FAO=2=HDRNOTFOUND
/FAO=2>INVARTRNG /FAO=2OOUTRNG
/FAO=34CREATERR /FAO=2KEDITERR /FAO=44SUBPERR ,OPENERR /FAO=21EXTRERR /FAO=18SIGFERR /FAO=2<UPDERR /FAO=25ARTRERR /FAO=3>NOARTSPEC DNOTHREAD :NOSUBJECT
-NOMATCH /FAO=2&KEYDEFERR .SETARCHERR 1FWDERR +ADDRSYNTX 6NOPARENT .NOMOREMATCH /NOSUBJSPEC 0NOCANCEL /FAO=18NOIGHDSPEC /FAO=0.SEVERITY INFORMATION(NEWGROUP /FAO=2EOARTICLE EOLIST *NOTIMPL *NOOPNPROF <ALRDYSUB /FAO=27HDRALRDY
/FAO=25EOGROUP /FAO=2HMUSTMAIL 2CONNECTING /FAO=26RECONNECTING /FAO=27UPDATING ;USINGCURGROUP /FAO=20ALRDYIGNORE ,MARKCOUNT /FAO=1;NEWCOUNT /FAO=3 CANCELLED 8SUBSCRIBED /FAO=2MGRPSET /FAO=5.SEVERITY SUCCESS#ALLDONE 2SPAWNED /FAO=3DDIDSUB /FAO=2GDIDUNSUB /FAO=2.ENDc~NEWSRDR_SRC.BCKPP[NEWSRDR]NEWSRDR.H;43U'*[NEWSRDR]NEWSRDR.H;43+,P./ @ 4U-P0123KPWO568WŁ7Ł8f0%99G @HJ*#ifndef __NEWSRDR_H#define __NEWSRDR_H 1#include #include #include #include #ifdef __GNUC__#include #include #include  extern int cli$_absent();0#define CLI$_ABSENT ((unsigned int) cli$_absent) extern int cli$_present();2#define CLI$_PRESENT ((unsigned int) cli$_present) extern int cli$_negated();2#define CLI$_NEGATED ((unsigned int) cli$_negated) extern int cli$_comma();.#define CLI$_COMMA ((unsigned int) cli$_comma) extern int lib$_syntaxerr();6#define LIB$_SYNTAXERR ((unsigned int) lib$_syntaxerr)#else#include #include #include #include #include #include #pragma nostandardQ globalvalue unsigned int CLI$_ABSENT, CLI$_PRESENT, CLI$_NEGATED, CLI$_COMMA;, globalvalue unsigned int LIB$_SYNTAXERR;#pragma standard #ifdef __DECC#include #else#pragma builtins#endif#endif#define EXTERN extern#define GLOBAL /* */#pragma nostandard#include "news_msg.h"#pragma standard #ifdef NULL #undef NULL#endif#define NULL ((void *) 0)H extern unsigned int cli$present(), cli$get_value(), cli$dcl_parse();#define SRV__ECHO 1#define SRV__NOECHO 2#define NNTP__HELPFOLLOWS 100#define NNTP__DEBUGOUTPUT 199#define NNTP__HELOPOSTOK 200#define NNTP__HELONOPOST 201#define NNTP__SLAVESTATOK 202#define NNTP__CLOSING 205#define NNTP__GRPSELECTED 211#define NNTP__GLISTFOLLOWS 215#define NNTP__ARTCLFOLLOWS 220#define NNTP__HEADFOLLOWS 221#define NNTP__BODYFOLLOWS 222#define NNTP__TEXTSEPARATE 223#define NNTP__ALISTFOLLOWS 230#define NNTP__NGLSTFOLLOWS 231#define NNTP__ARTICLEXFERED 235#define NNTP__ARTICLEPOSTED 240#define NNTP__SENDXARTICLE 335#define NNTP__SENDPARTICLE 340#define NNTP__SVCDISCONT 400#define NNTP__NOSUCHGROUP 411#define NNTP__NOCURGROUP 412#define NNTP__NOCURARTICLE 420#define NNTP__NONEXTARTICLE 421#define NNTP__NOPREVARTICLE 422#define NNTP__NOSUCHARTNUM 423#define NNTP__NOSUCHARTICLE 430#define NNTP__NOWANTARTICLE 435#define NNTP__XFERFAILED 436#define NNTP__ARTICLEREJECT 437#define NNTP__NOPOSTING 440#define NNTP__POSTFAILED 441#define NNTP__CMDUNRECOGNZD 500#define NNTP__CMDSYNTAXERR 501#define NNTP__ACCESSDENIED 502#define NNTP__PROGRAMERROR 503#define NEWS_K_HDR_LO 1#define NEWS_K_HDR_FROM 1#define NEWS_K_HDR_DATE 2%#define NEWS_K_HDR_NEWSGROUPS 3 #define NEWS_K_HDR_SUBJECT 4%#define NEWS_K_HDR_MESSAGE_ID 5#define NEWS_K_HDR_PATH 6!#define NEWS_K_HDR_REPLY_TO 7#define NEWS_K_HDR_SENDER 8%#define NEWS_K_HDR_FOLLOWUP_TO 9!#define NEWS_K_HDR_EXPIRES 10&#define NEWS_K_HDR_REFERENCES 11!#define NEWS_K_HDR_CONTROL 12&#define NEWS_K_HDR_DISTRIBUTION 13&#define NEWS_K_HDR_ORGANIZATION 14"#define NEWS_K_HDR_KEYWORDS 15!#define NEWS_K_HDR_SUMMARY 16"#define NEWS_K_HDR_APPROVED 17#define NEWS_K_HDR_LINES 18#define NEWS_K_HDR_XREF 19#define NEWS_K_HDR_OTHER 20#define NEWS_K_HDR_HI 20typedef unsigned short WORD;typedef unsigned char BYTE;typedef void *POINTER;3typedef struct { unsigned int long1, long2; } TIME;&typedef struct dsc$descriptor DESCRIP;Gtypedef struct { WORD bufsiz, itmcod; POINTER bufadr, retlen; } ITMLST;#define FSPEC_SIZE 255#define STRING_SIZE 1024 struct QUE { void *head; void *tail; }; struct HDR { struct HDR *flink, *blink; int code; unsigned short len; char str[1]; };#define GRP_S_GRPNAM 128 struct GRP { struct GRP *left, *right;" unsigned int reserved_unused; struct GRP *next; struct QUE seenq; struct QUE killq; int frstavl, lastavl; int avail; int subscribed; int inprofile; int directpost;! char grpnam[GRP_S_GRPNAM+1]; }; struct RNG { struct RNG *flink, *blink; int first, last; };#define NG_K_NONE 0#define NG_K_SUBSCRIBE 1#define NG_K_PROMPT 2 struct PROF { TIME lastgrpchk; struct GRP *gtree; struct GRP *glist; struct GRP *glast; struct QUE hdrlist; struct QUE killq;; int profread, edit, captive, autosigpost, autosigmail;A int csmail, csreply, csfwd, spawnedit, replymail, replypost;? int dir_fromwid, dir_subjwid, newsrc_subonly, autoreadnew;, int usemailpnam, force_proto, ngaction;$ char personalname[STRING_SIZE];# char editorname[FSPEC_SIZE+1]; char sigfile[FSPEC_SIZE+1]; char archive[FSPEC_SIZE+1]; char newsrc[FSPEC_SIZE+1];$ char print_queue[FSPEC_SIZE+1];# char print_form[FSPEC_SIZE+1]; }; struct CFG { int cachesize; unsigned int (*namcvt)(); unsigned int (*fnmcvt)(); unsigned int (*namclup)(); unsigned int namctx; unsigned int (*adrcvt)(); unsigned int (*adrclup)(); unsigned int adrctx; unsigned int (*chrlton)(); unsigned int (*chrntol)();@ int postingok, bangpath, chrcnv, namcnv, adrcnv, neggmtoff;= int dst, bangaddr, genmsgid, gendate, newgroups, dopath;# char server_name[STRING_SIZE]; char org_name[STRING_SIZE];! char node_name[STRING_SIZE]; char username[STRING_SIZE];! char mail_proto[FSPEC_SIZE]; char reply_to[STRING_SIZE]; char mailnode[STRING_SIZE];! char gmtoffset[STRING_SIZE]; char pathstr[STRING_SIZE]; };U#define INIT_DYNDSCPTR(str) {str->dsc$w_length = 0; str->dsc$a_pointer = (void *) 0;\M str->dsc$b_class = DSC$K_CLASS_D; str->dsc$b_dtype = DSC$K_DTYPE_T;}Q#define INIT_DYNDESC(str) {str.dsc$w_length = 0; str.dsc$a_pointer = (void *) 0;\K str.dsc$b_class = DSC$K_CLASS_D; str.dsc$b_dtype = DSC$K_DTYPE_T;}Q#define INIT_SDESC(str,len,ptr) {str.dsc$w_length=(len);str.dsc$a_pointer=(ptr);\G str.dsc$b_class=DSC$K_CLASS_S; str.dsc$b_dtype=DSC$K_DTYPE_T;}B#define ITMLST_INIT(itm,c,s,a,r) {itm.bufsiz=(s); itm.itmcod=(c);\; itm.bufadr=(POINTER)(a); itm.retlen=(POINTER)(r);}$#define OK(x) $VMS_STATUS_SUCCESS(x)(#define min(a,b) ((a) < (b) ? (a) : (b))#ifdef __ALPHAL#define queue_insert(item,pred) __PAL_INSQUEL((void *)(pred),(void *)(item))M#define queue_remove(entry,addr) (((struct QUE *)entry)->head == entry ? 0 :\E (__PAL_REMQUEL((void *)(entry),(void *)(addr)),1))#else#ifndef __GNUC__2#define queue_insert(item,pred) _INSQUE(item,pred)M#define queue_remove(entry,addr) (((struct QUE *)entry)->head == entry ? 0 :\+ (_REMQUE(entry,addr),1))#endif#endif#endif/*** Routines from module MISC*/#ifndef MODULE_MISC- extern void make_temp_fspec(char *, int);8 extern void make_nntp_dtstring(TIME *, char *, int);D extern unsigned int Compose_Message(char *, char *, int, int *); extern void upcase(char *); extern void locase(char *);@ extern void Format_Header(struct HDR *, char *, int, int *);/ extern void Make_Date(TIME *, char *, int);' extern int Yes_Answer(char *, int);; extern unsigned int cli_get_value(char *, char *, int);, extern unsigned int cli_present(char *);4 extern unsigned int get_logical(char *, char *);; extern unsigned int get_system_logical(char *, char *);1 extern int streql_case_blind(char *, char *);7 extern int strneql_case_blind(char *, char *, int);B extern unsigned int find_image_symbol(char *, char *, void *);9 extern void insert_header(char *, struct HDR *, int);< extern unsigned int table_parse(void *, void *, void *);' extern void Check_Connection(void);#endif/*** Routines from module MEM*/#ifndef MODULE_MEM' extern struct HDR *mem_gethdr(int);/ extern void mem_freehdr(struct HDR *);( extern struct GRP *mem_getgrp(void);/ extern void mem_freegrp(struct GRP *);( extern struct RNG *mem_getrng(void);/ extern void mem_freerng(struct RNG *);#endif/*** Server_xxxx routines*/2 extern unsigned int get_hostname(char *, int);/ extern unsigned int server_connect(char *);0 extern unsigned int server_disconnect(void);, extern unsigned int server_send(char *);* extern unsigned int server_get_line();+ extern unsigned int server_get_reply();+ extern unsigned int server_check(void);/*** Routines from module PAGER*/#ifndef MODULE_PAGER( extern unsigned int Pager_Init(int);3 extern unsigned int Begin_Paged_Output(char *);/ extern int Put_Paged(char *, int);0 extern int Paged_Output_Done(void);3 extern void Discard_Paged_Output(void);1 extern void Finish_Paged_Output(int);+ extern unsigned int put_output(char *);8 extern unsigned int put_output_counted(char *, int);0 extern unsigned int put_output_nocc(char *);? extern unsigned int put_output_dx(struct dsc$descriptor *);< extern unsigned int put_errmsg(struct dsc$descriptor *);5 extern unsigned int get_cmd(char *, int, char *);T extern unsigned int get_cmd_dx(struct dsc$descriptor *, struct dsc$descriptor *, short *);7 extern unsigned int put_paged_help(char *, char *);0 extern unsigned int Define_Key(char *, int);#endif/*** Routines from module FILEIO*/#ifndef MODULE_FILEIOL extern unsigned int file_create(char *, unsigned int *, char *, char *);Q extern unsigned int file_open(char *, unsigned int *, char *, char *, int *);S extern unsigned int file_append(char *, unsigned int *, char *, char *, int *);B extern unsigned int file_find(char *, char *, char *, char *);= extern unsigned int file_fidopen(char *, unsigned int *);4 extern unsigned int file_exists(char *, char *);1 extern unsigned int file_close(unsigned int);2 extern unsigned int file_dclose(unsigned int);D extern unsigned int file_read(unsigned int, char *, int, int *);> extern unsigned int file_write(unsigned int, char *, int);< extern unsigned int file_getpos(unsigned int, short[3]);< extern unsigned int file_setpos(unsigned int, short[3]);5 extern unsigned int file_get_rdt(char *, TIME *);, extern unsigned int file_delete(char *);? extern unsigned int Copy_File(char *, char *, char *, int);#endifQ~NEWSRDR_SRC.BCK7QP[NEWSRDR]PARSE_TABLES.MAR;16E u*[NEWSRDR]PARSE_TABLES.MAR;16+,7Q. / @ 4E -P0123KPWO56N7)78@,99G @HJ0 .TITLE PARSE_TABLES - TPARSE tables for NEWSRDR .IDENT 'V1.1';C; COPYRIGHT 1992, 1993 MATTHEW D. MADISON. ALL RIGHTS RESERVED.; .DSABL GLOBAL .EXTRN PGR_STORE .EXTRN PARSE_RANGE_STORE .EXTRN PX_STORE;1; MACRO can't handle some characters as literals.;LEFTANGLE = 60RIGHTANGLE = 62APOSTROPHE = 39 COMMA = 44LEFTBRACE = 123VERTBAR = 124RIGHTBRACE = 125 TILDE = 126SEMICOLON = 597; Macro to define the internal character store routinesE; Call via LIB$TABLE_PARSE is detected by argument count equalling 1.! .MACRO STORE_RTN, INTRTN, EXTRTN& .PSECT PARSING_CODE,NOWRT,SHR,PIC,EXEINTRTN: .IF DF,EVAX& .CALL_ENTRY HOME_ARGS=TRUE,MAX_ARGS=1 CALLG (AP),G^EXTRTN .IFF .WORD 0 CMPB (AP),#1 BEQL 1$ PUSHL AP CALLS #1,G^EXTRTN RET1$: CALLG (AP),G^EXTRTN .ENDC RET .ENDM;-; Literals (must match values from NEWSRDR.H);NEWS_K_HDR_LO = 1NEWS_K_HDR_FROM = 1NEWS_K_HDR_DATE = 2NEWS_K_HDR_NEWSGROUPS = 3NEWS_K_HDR_SUBJECT = 4NEWS_K_HDR_MESSAGE_ID = 5NEWS_K_HDR_PATH = 6NEWS_K_HDR_REPLY_TO = 7NEWS_K_HDR_SENDER = 8NEWS_K_HDR_FOLLOWUP_TO = 9NEWS_K_HDR_EXPIRES = 10NEWS_K_HDR_REFERENCES = 11NEWS_K_HDR_CONTROL = 12NEWS_K_HDR_DISTRIBUTION = 13NEWS_K_HDR_ORGANIZATION = 14NEWS_K_HDR_KEYWORDS = 15NEWS_K_HDR_SUMMARY = 16NEWS_K_HDR_APPROVED = 17NEWS_K_HDR_LINES = 18NEWS_K_HDR_XREF = 19NEWS_K_HDR_OTHER = 20NEWS_K_HDR_HI = 20STORE_HDR = 21 + .SBTTL 'State table for PARSE_GROUP_REPLY' $INIT_STATE PGR_STATE, PGR_KEY $STATE ACOUNT+ $TRAN TPA$_DECIMAL,, PGR_STORE_INT,,,1! $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE+ $TRAN TPA$_DECIMAL,, PGR_STORE_INT,,,2! $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE5 $TRAN TPA$_DECIMAL, TPA$_EXIT, PGR_STORE_INT,,,3! $TRAN TPA$_LAMBDA, TPA$_FAIL % .SBTTL 'State table for PARSE_RANGE'/ $INIT_STATE PARSE_RANGE_STATE, PARSE_RANGE_KEY $STATE START% $TRAN '.',EOSORHYP, PR_STORE_INT,,,33 $TRAN TPA$_DECIMAL, EOSORHYP, PR_STORE_INT,,,1 $TRAN TPA$_ANY, TPA$_FAIL $STATE EOSORHYP $TRAN TPA$_EOS, TPA$_EXIT $TRAN '-', EXPEOR $TRAN TPA$_ANY, TPA$_FAIL $STATE EXPEOR$ $TRAN '.', EXPEOS, PR_STORE_INT,,,41 $TRAN TPA$_DECIMAL, EXPEOS, PR_STORE_INT,,,2 $TRAN TPA$_ANY, TPA$_FAIL $STATE EXPEOS $TRAN TPA$_EOS, TPA$_EXIT $TRAN TPA$_ANY, TPA$_FAIL $ .SBTTL 'State table for PARSE_XREF' $INIT_STATE PX_STATE, PX_KEY $STATE PXSTART $TRAN TPA$_BLANK, PXSKIP $TRAN TPA$_EOS, TPA$_EXIT $TRAN TPA$_ANY, PXSTART $STATE PXSKIP $TRAN TPA$_BLANK, PXSKIP $TRAN TPA$_EOS, TPA$_EXIT/ $TRAN TPA$_ANY, PXGROUP, PX_STORE_INT,,, 1 $STATE PXGROUP+ $TRAN ':', PXARTNUM, PX_STORE_INT,,, 3 $TRAN TPA$_EOS, TPA$_EXIT $TRAN TPA$_BLANK, PXSKIP/ $TRAN TPA$_ANY, PXGROUP, PX_STORE_INT,,, 2 $STATE PXARTNUM0 $TRAN TPA$_BLANK, PXSKIP, PX_STORE_INT,,, 51 $TRAN TPA$_EOS, TPA$_EXIT, PX_STORE_INT,,, 52 $TRAN TPA$_DIGIT, PXARTNUM, PX_STORE_INT,,, 4 $TRAN TPA$_ANY, PXSTART $END_STATE# STORE_RTN PGR_STORE_INT, PGR_STORE* STORE_RTN PR_STORE_INT, PARSE_RANGE_STORE! STORE_RTN PX_STORE_INT, PX_STORE .ENDm~NEWSRDR_SRC.BCK3P[NEWSRDR]NEWSRDR_HELP.RNH;38]Z;*[NEWSRDR]NEWSRDR_HELP.RNH;38+,3.Z/ @ 4]ZZ-P0123KPWO[56Lǖ77ǖ8jh99G @HJz.!++.!.! NAME: NEWSRDR_HELP.RNH.!.! ABSTRACT: NEWSRDR help file..!.! FACILITY: NEWSRDR.!.! DESCRIPTION:.!@.! This is the RUNOFF source for the help library for NEWSRDR.<.! To create the help library, use the following commands:.!.! $ RUNOFF NEWSRDR_HELP.RNH1.! $ LIB/CREATE/HELP NEWSRDR_HELP NEWSRDR_HELP.!.! AUTHOR: M. Madison:.! COPYRIGHT 1992, 1993 MATTHEW D. MADISON.#.! ALL RIGHTS RESERVED..!.!.! MODIFICATION HISTORY:.!..! some date V1.0 Madison Initial coding.>.! 23-MAY-1990 V2.3 Madison Add READ/PREV, fix READ/NEXT.8.! 28-JUN-1990 V2.4 Madison Modify SET EDIT/EDITOR.7.! 13-NOV-1990 V2.6 Madison Document SET SEEN/ALL.9.! 09-JAN-1991 V2.7 Madison Several command changes.E.! 08-FEB-1991 V2.8 Madison Add SET UNSEEN, REPLY w/group names.G.! 14-OCT-1991 V3.0 Madison DIR, SUB, UNSUB, PRINT, CANCEL, STORE.-.! 22-NOV-1991 V3.0-1 Madison POST/FILE.C.! 04-JUN-1992 V3.1 Madison NEXT/GROUP. SET IGNORE/NEWSGROUP.<.! 11-SEP-1992 X4.0 Madison SUB/LOG,UNSUB/LOG. NEWSRC.B.! 12-SEP-1992 X4.0-1 Madison Add SET DIR, SET QUE, SET FORM.>.! 12-SEP-1992 X4.0-2 Madison Add SUB/GOTO, '.' notation.6.! 15-SEP-1992 X4.0-3 Madison Add DIR/GROUP/SORT.I.! 12-OCT-1992 V4.0-4 Madison SET NEWSRC/SUBSCRIBED (prev. omitted).B.! 15-FEB-1993 V4.1 Madison SET SEEN/CROSS, SET SEEN/SUBJECT.L.! 12-APR-1993 A4.2 Madison SET AUTO, CUR/ED, SET PERS/MAIL, RE/TH/NEW.J.! 23-APR-1993 V4.2 Madison SET FORCE_MAIL_PROTOCOL, NEWGROUP_ACTION..!--.P0.AP.LM1.RM70.I-11 ATTACHE Permits you to switch control of your terminal from your current'process to another process in your job.E The ATTACH command allows you to move quickly between processes thatDyou have created with the SPAWN command. For example, while you areDediting a file, you can SPAWN a subprocess (MAIL) to read a new mail>message. Enter the ATTACH command to get back to back to theDediting session. If you want to read another new mail message, youCcan use the ATTACH command to get back to the MAIL subprocess youalready created..NJ Format:%.I+10;ATTACH [/PARENT] [process-name].J .I-1 2 Parameter process-nameE Indicates the name of the subprocess to which the connection is toGbe made. Only the /PARENT qualifier or a process-name may be specified.,If neither is specified, /PARENT is assumed..I-1 2 Qualifier.I-1/PARENT7 Allows you to attach to your process's parent process.:If there is no parent process an error message is printed..I-11 BACK1 The BACK command is a synonym for READ/PREVIOUS..I-11 CANCELB The CANCEL command cancels an article by posting a cancel messageto the NNTP server..NJ Format:.I+10;CANCEL [artnum].JI If an article number is not specified, the current article is cancelled..I-1 1 CURRENTA The CURRENT command redisplays the current article from the top..NJ Format: .I+10;CURRENT.J.I-1 2 Qualifiers.I-1/EDIT /EDITE Edits the article rather than using the normal page-by-page display..I-1/FULL__HEADERS /FULL__HEADERSF Causes the article to be displayed with all headers, rather than just)those you have selected with SET HEADERS..I-1/ROTATE /ROTATEB Displays the article text in ROT13 cipher. Any article posted inROT13 is deciphered..I-11 DEFINE, Defines a key to execute a NEWSRDR command..NJ Format: .i+10;DEFINE/KEY key-name string.JJ Keypad key definitions are not saved between NEWSRDR sessions. To retainJyour key definitions, create a file containing DEFINE/KEY commands in yourISYS$LOGIN directory and call it NEWSRDR__KEYDEFS.NRKEY. If you wish, youMcan call the file something else and define the logical name NEWSRDR__KEYDEFSto point to that file..I-1 2 Parameters key-nameD Specifies the name of the key you are defining. This can be one ofBPF1 through PF4; KP0 through KP9 (for numeric keypad 0 through 9);>COMMA, PERIOD, MINUS, or ENTER (also on numeric keypad); FIND,6INSERT_HERE, REMOVE, SELECT, PREV_SCREEN, NEXT_SCREEN,3HELP, DO, or F17 through F20 (for LK201 keyboards). stringF Specifies the string you want entered when you press the defined key..I-1 3 Qualifiers.I-1/ECHO /[NO]ECHOH Specifies whether the command line is echoed when you press the definedDkey. You cannot specify both /NOECHO and /NOTERMINATE. The default is /ECHO..I-1 /IF_STATE /IF_STATE=state-list> Specifies one or more states, any one of which must be set in:order to enable the specified key definition. If you omitDthis qualifier, the current state is used. To specify more than oneFstate, separate the state names with commas and surround the list with parentheses..I-1 /LOCK_STATE /[NO]LOCK_STATE= Causes the state specified by the /SET_STATE qualifier to be5permanently retained when the defined key is pressed.DThe state is retained until changed by using another key that sets aHstate. If omitted or negated, the specified state is retained only untilyou press another key..i-1 /SET_STATE /[NO]SET_STATE=state8 Establishes a state that is set when the defined key isApressed. A state name can be any alphanumeric string. The stateElasts for one further keypress only, unless /LOCK_STATE is specified.AIf you omit or negate this qualifier, the state remains unchangedDwhen the defined key is pressed. You cannot specify both /SET_STATEand /TERMINATE..I-1 /TERMINATE /[NO]TERMINATE< Determines whether the specified command string is executedCwhen the defined key is pressed. If not terminated, you must pressDRETURN for the command to be executed. The default is /NOTERMINATE..I-1 1 DIRECTORYK The DIRECTORY command is used to display a list of articles in the current3newsgroup or infomation about available newsgroups..NJ Format: .I+10;DIRECTORY [article-number]).I+10;DIRECTORY/GROUP [groupname-pattern].JF Where "article-number" is the number of the first article you wish toBhave displayed in the listing. The directory listing contains theKarticle number, the poster's name, and the subject of each article (as muchas will fit on one line)..I-1 2 Qualifiers.I-1/ALLL Can only be used with DIRECTORY/GROUP. When specified, all groups availableGfrom the server are listed, not just those to which you are subscribed..I-1/EXCLUDE+ /EXCLUDE=(keyword=(pattern [,...]) [,...])J Excludes those articles matching the specified exclusion patterns. Validkeywords are FROM and SUBJECT..I-1/FROM /FROM=(pattern [,...])G Lists only those articles whose From line matches one of the specifiedJpatterns. Patterns may contain wildcards. Not used with DIRECTORY/GROUP..I-1/GROUPM The /GROUP qualifier indicates that information about newsgroups is desired.KThe newsgroup information includes the name of the group, the number of theNfirst and last article available from the server, a flag indicating whether orKnot you subscribe to the newsgroup, and the number of articles in the groupthat you have not read.J The "groupname-pattern" you specify can contain wildcards; information isEdisplayed about all groups whose names match the pattern you specify..i-1/KEYWORD /KEYWORD=(keyword [,...])D Lists only those articles with Keywords lines containing one of theFspecified keywords. Keywords may NOT contain wilcards. Not used withDIRECTORY/GROUP..I-1/SEEN /SEENH Causes only those those articles marked "seen" to be listed. (Not usedMwith DIRECTORY/GROUP.) The default is to list both seen and unseen articles..I-1/SORTK Used with DIRECTORY/GROUP. Causes the groups to be listed in alphabeticalKorder. If omitted, the groups will be listed as they appear in your newsrcMfile (if you have one set). If you don't have a newsrc file set, the listing is sorted alphabetically anyway..I-1/SUBJECT /SUBJECT=(pattern [,...])J Lists only those articles whose Subject line matches one of the specifiedJpatterns. Patterns may contain wildcards. Not used with DIRECTORY/GROUP..I-1/UNSEEN /UNSEENL Causes only those those articles not marked "seen" to be listed. (Not usedMwith DIRECTORY/GROUP.) The default is to list both seen and unseen articles..I-1/WIDTH /WIDTH=(keyword [,...])D Formats the width of parts of the directory display. Not used withEDIRECTORY/GROUP. You may omit the parentheses if only one keyword is-specified. Possible keywords are as follows:0 FROM=n Specifies the width of the From column.5 SUBJECT=n Specifies the width of the Subject column.G The default width for each column is roughly one-half of the availableFscreen width after the other columns in the display are accounted for.FNote that it is possible to specify the widths such that the resulting'display is wider than the screen width..I-11 EXIT4 The EXIT command is used to leave the NEWS utility..NJ Format: .i+10;EXIT.J.I-1 1 EXTRACTG The EXTRACT command copies ("extracts") one or more news articles into a text file..NJ Format:,.I+10;EXTRACT [file-spec] [article-range...].J.I-1 2 Parameters file-specH Name of the file into which the article(s) will be copied. If omitted,Dthe name defaults to newsgroup.TXT, where "newsgroup" is the currentDnewsgroup name with all special characters translated to underscores("__"). article-range...G A list of one or more article numbers or ranges (specified by startingDand ending article numbers separated by a hyphen). If omitted, onlyDthe current article will be extracted. You must specify a file-specDto be able to specify an article-range. You may use "." to refer tothe current article..I-1 2 Qualifiers.I-1 /[NO]APPENDF If specified, the articles will be appended to the file. The defaultHfor this qualifier is /NOAPPEND when a file-spec is given on the command-line, and /APPEND when no file-spec is given..I-1/ROTATEJ If specified, the text of each article will be deciphered using the ROT13cipher..I-11 FIRST" This is a synonym for READ/FIRST..I-1 1 FOLLOWUP This is a synonym for REPLY..I-1 1 FORWARDC The FORWARD command is used to forward a copy of a news article bymail to another user..NJ Format:.I+10;FORWARD [article-number].JKWhere "article-number" is the number of an article in the current newsgroupFthat you would like to send. If omitted, the current article is sent..I-1 2 Qualifiers.I-1/EDIT /EDIT /NOEDITL The /EDIT qualifier indicates that a text editor (set with SET EDIT/EDITOR)Ishould be invoked to modify the message. If omitted, the article is sentwithout changes..I-1/SELF /SELF /NOSELFL The /[NO]SELF qualifier is used to override your VMS MAIL copy-self settingMfor FORWARD. When /SELF is specified, or copy-self is turned on for FORWARD,Ga copy of the message is sent to yourself as well as to the destinationuser(s) you specify..I-1 /SIGNATURE /SIGNATURE /NOSIGNATUREF The /SIGNATURE qualifier indicates that your "signature" file, if youDhave set one with SET SIGNATURE__FILE, should be included at the endEof the message. Specifying /NOSIGNATURE indicates that the signatureFshould not be included. If omitted, signature inclusion is determinedAby the /AUTOMATIC setting used when the signature file was set upwith SET SIGNATURE__FILE..I-1/SUBJECT /SUBJECT="subject" /NOSUBJECTJ The /SUBJECT qualifier is used to specify (or, with /NOSUBJECT, omit) theIsubject of the message. If not specified, you are prompted for a subjectline..I-1/TO /TO=("address"[,...])M The /TO qualifier can be used to specify the recipients of the mail message.IIf specified, surround each address with quotation marks. If you want toMspecify a list of reicpients, separate the addresses with commas and surroundthe list with parentheses..I-11 GROUPE The GROUP command selects a newsgroup to be the "current" newsgroup..NJ Format:.i+10;GROUP groupname.J.I-11 HELPD The HELP command is used to obtain information about NEWS commands..NJ Format: .I+10;HELP [topic] [subtopic...].J.I-11 LAST! This is a synonym for READ/LAST..I-11 MAIL1 The MAIL command is used to send a mail message..NJ Format:.I+10;MAIL [filespec].JJWhere "filespec" is the name of a file you would like to send by mail. IfIomitted, you are prompted for the text of the mail message. This commandHbehaves much like the VMS MAIL "SEND" command, except that you are givenJthe chance to back out of the mailing of the message after you compose themessage..I-1 2 Qualifiers.I-1/EDIT /EDIT /NOEDITL The /EDIT qualifier indicates that a text editor (set with SET EDIT/EDITOR)Kshould be invoked to compose the message. If omitted, you are prompted forNthe message text in the same way VMS MAIL does, unless you are mailing a file..I-1/SELF /SELF /NOSELFL The /[NO]SELF qualifier is used to override your VMS MAIL copy-self settingGfor SEND. When /SELF is specified, or copy-self is turned on for SEND,Ga copy of the message is sent to yourself as well as to the destinationuser(s) you specify..I-1 /SIGNATURE /SIGNATURE /NOSIGNATUREF The /SIGNATURE qualifier indicates that your "signature" file, if youDhave set one with SET SIGNATURE__FILE, should be included at the endEof the message. Specifying /NOSIGNATURE indicates that the signatureFshould not be included. If omitted, signature inclusion is determinedAby the /AUTOMATIC setting used when the signature file was set upwith SET SIGNATURE__FILE..I-1/SUBJECT /SUBJECT="subject" /NOSUBJECTJ The /SUBJECT qualifier is used to specify (or, with /NOSUBJECT, omit) theIsubject of the message. If not specified, you are prompted for a subjectline..I-1/TO /TO=("address"[,...])M The /TO qualifier can be used to specify the recipients of the mail message.IIf specified, surround each address with quotation marks. If you want toMspecify a list of reicpients, separate the addresses with commas and surroundthe list with parentheses..I-11 NEXT+ This is an abbreviation for READ/NEXT/NEW..I-1 2 Qualifier.I-1/GROUP /GROUPH When specified, instructs NEWSRDR to skip any remaining new articles inMthe current group and begin searching for new articles in the next subscribedFgroup. If no new articles are found in any other newsgroup, the NONEWLmessage is displayed and any remaining new articles in the current group are left unseen..I-11 POST1 The POST command is used to post a news article..NJ Format:(.I+10;POST [newsgroup[,...]] [file-spec].J.I-1 2 Parameters newsgroup[,...]C If specified, the article is posted to the specified group or listBof groups. Otherwise, the article is posted to the current group. file-specE If specified, the contents of the specified file will be used as theFarticle text. If omitted, and no /FILE qualifier is used, you will beprompted for the article text..I-1 2 Qualifiers.I-1 /DISTRIBUTION /DISTRIBUTION=(dist[,...])K This qualifier allows you to alter the distribution of a followup article.AIf omitted, the distribution will be assigned by the news server..I-1/EDITK The /EDIT qualifier indicates that you wish to use a text editor (set with4the SET EDIT/EDITOR command) to compose the article..I-1/FILE /FILE=file-specG This qualifier allows you to specify the name of a file whose contentsJwill be used as the article text. This is an alternative to the file-specHparameter. If omitted and the file-spec parameter is not specified, you&will be prompted for the article text..i-1 /FOLLOWUP_TO /FOLLOWUP_TO=(group [,...])J Specifies that followups to the article should be posted to the specifiedJgroups. By default, followups are posted to the same groups as the postedarticle..I-1 /SIGNATURE /SIGNATURE /NOSIGNATUREF The /SIGNATURE qualifier indicates that your "signature" file, if youDhave set one with SET SIGNATURE__FILE, should be included at the endEof the message. Specifying /NOSIGNATURE indicates that the signatureFshould not be included. If omitted, signature inclusion is determinedAby the /AUTOMATIC setting used when the signature file was set uptwith SET SIGNATURE__FILE.l.I-1/SUBJECT /SUBJECT=subjecta /NOSUBJECTiJ The /SUBJECT qualifier can be used to alter or eliminate the subject lineMfrom the reply. If omitted, the subject of the reply will be "Re: " followeds'by the subject of the original article. .I-11 READE The READ command is used to display specific news articles or unseenI articles..NJo Format:.i+10;READ [artnum]c.JK Where "artnum" is the number of the article you wish to see. You may omitN>the READ command when specifying an article number to be read..I-1 2 Qualifiers.I-1/FIRST /FIRST!L The /FIRST qualifier selects for reading the first article in the newsgroupavailable from the news server.Y.I-1/GROUP /GROUP4D The /GROUP qualifier selects the newsgroup from which the specifiedCarticle is to be retrieved. If omitted, the current group is used.dK When used with the READ/NEXT/NEW command, /GROUP instructs NEWSRDR to skip Kany remaining new articles in the current group and begin searching for new Karticles in the next subscribed group. If no new articles are found in anytNother newsgroup, the NONEW message is displayed and any remaining new articles%in the current group are left unseen.(.I-1/LAST) /LASTJ The /LAST qualifier selects for reading the last article in the newsgroupavailable from the news server.R.I-1/NEW /NEW F The /NEW qualifier causes READ to look for any unseen articles. WhenHused with the /NEXT qualifier, the next unseen article after the currentDarticle is displayed, or if there are none, the first unseen article4in the next newsgroup (alphabetically) is displayed..I-1/NEXT  /NEXT< The /NEXT qualifier causes READ to display the next article<in the newsgroup currently being viewed. If there are none,a NOMORE message is displayed..i-1 /PREVIOUSs /PREVIOUSG The /PREVIOUS qualifier causes READ to display the next lower numbered 1article in the current newsgroup to be displayed. .i-1/SUBJECT /SUBJECT[=(pattern[,...])]sE When one or more patterns are specified, displays the next availableNEarticle whose subject matches one of the specified patterns. When nosIpatterns are specified, displays the next available article whose subject Fmatches one of the patterns on the most recent READ/SUBJECT command onwhich patterns were specified.F If no matching articles are found, a NOMOREMATCH message is displayed'and the current pattern set is cleared.rH Only the /GROUP qualifier may be specified with the /SUBJECT qualifier.!All other qualifiers are ignored.I.i-1/THREADT /THREADD The /THREAD qualifier causes READ to look for the next article withEa subject line matching the current article's subject line. This canmIbe used repeatedly within a newsgroup to follow a thread of conversation.GWhen no further matching articles are found, a message is displayed andIthe current article is reset to the first article you read in the thread.EF You may use the /NEW qualifier with READ/THREAD to follow a thread ofarticles you have not yet seen.R.I-11 PRINT F Adds the specified article(s) to the pending print job. The articlesEare not released to the print queue until you exit NEWSRDR or use the PRINT/NOW command1.NJh Format:.I+10;PRINT [article-range...].J.I-1 2 Parameters article-range...cG A list of one or more article numbers or ranges (specified by startinggDand ending article numbers separated by a hyphen). If omitted, onlyEthe current article will be printed. You may use "." to refer to theocurrent article..I-1 2 Qualifiers.I-1/AFTER /AFTER=timeD Requests that the job not be printed until the specified date/time..I-1/BURST /BURST=keywordF /NOBURSTtH Controls whether a burst page is printed at the start of the print job.GValid keyword values are ALL and ONE; if omitted, ALL is assumed. NoteKIthat either value has the same effect, since NEWSRDR combines all printedo,articles into a single file before printing..I-1/CANCELC' Cancels the current pending print job.u.I-1/COPIES0 /COPIES=n9 Indicates the number of copies of the job to be printed. .I-1/FEED  /FEED /NOFEEDE Controls whether form feeds are automatically inserted at the end ofda page.e.I-1/FLAGu /FLAG=keyword /NOFLAGG Controls whether a flag page is printed at the start of the print job.GValid keyword values are ALL and ONE; if omitted, ALL is assumed. Note,Ithat either value has the same effect, since NEWSRDR combines all printedi,articles into a single file before printing..I-1/FORM. /FORM=form-name@ Specifies the name of the form that you want for the print job..I-1/HEADERS /HEADERS. /NOHEADERS_H Controls whether the article headers are printed along with the text of&the article. The default is /HEADERS..I-1/HOLD  /HOLD /NOHOLDA Controls whether the job is held in the queue prior to printing.a.I-1/NAMEm /NAME=job-name - Specifies a name string to identify the job. .I-1/NOTIFYe /NOTIFYJ Indicates that you should be notified by a broadcast message when the jobHhas been printed. May be specified on the PRINT and PRINT/NOW commands..I-1/NOWK Closes the pending print job and submits it for printing. You may specifyu&the /NOTIFY qualifier on this command..I-1 /PARAMETERS /PARAMETERS=(parameter [,...]).J Specifies up to eight optional parameters to be passed to the print queue with the job..I-1/PRINT Synonym for /NOW..I-1/QUEUE /QUEUE=queue-nameL Specifies the name of the print queue to which the job should be submitted..I-1/ROTATEeJ If specified, the text of each article will be deciphered using the ROT13cipher. .I-1/SPACE /SPACEo /NOSPACEi3 Specifies that the output should be double-spaced.l.I-1/TRAILER /TRAILER=keywordI /NOTRAILER H Controls whether a trailer page is printed at the end of the print job.GValid keyword values are ALL and ONE; if omitted, ALL is assumed. NotelIthat either value has the same effect, since NEWSRDR combines all printedh,articles into a single file before printing..I-11 REPLYsN The REPLY command is used to post a followup to the article you are currently>viewing or reply by mail to the author of the current article..nje Format:.i+10;REPLY [newsgroup[,...]]r.J.I-1 2 ParameterE newsgroup[,...]E If specified, the reply (if posted) is posted to the specified group Kor list of groups. If omitted, the reply is posted to the groups specifiedFCin the Followup-To header of the current article, or the Newsgroups @header of the current article if there is no Followup-To header.A If the reply is not posted (i.e., /POST is not specified and theRJcurrent SET REPLY setting is /NOPOST), the newsgroup parameter is ignored..I-1 2 Qualifiers.I-1 /DISTRIBUTIONf /DISTRIBUTION=(dist[,...])K This qualifier allows you to alter the distribution of a followup article. KIf omitted, the distribution of the article will match that of the originaluarticle..I-1/EDITeK The /EDIT qualifier indicates that you wish to use a text editor (set with 2the SET EDIT/EDITOR command) to compose the reply..I-1/EXTRACT /EXTRACT1 /NOEXTRACT/N The /EXTRACT qualifier indicates that the current article should be extractedJinto a file when composing the followup article (or mailing). This is theJdefault action. Use /NOEXTRACT to prevent the original article from being#extracted when composing the reply. I Note that /EXTRACT is only meaningful when you edit the reply, either bysHspecifying /EDIT on the REPLY command or by a previous SET EDIT command..i-1 /FOLLOWUP_TO /FOLLOWUP_TO=(group [,...])J Specifies that followups to the article should be posted to the specifiedJgroups. By default, followups are posted to the same groups as the postedarticle..I-1/MAILE The /MAIL qualifier indicates that the reply should be mailed to thewForiginator of the article. The /MAIL and /POST qualifiers may be usedHtogether to send a reply by mail as well as posting it to the newsgroup.J When both this qualifier and /POST are omitted, mailing and/or posting of9the reply is determined by the current SET REPLY setting.e.I-1/POST C The /POST qualifier indicates that the reply should be posted as ahDfollowup article. This is the default if neither /MAIL nor /POST isBspecified. The /MAIL and /POST qualifiers may be used together to<send a reply by mail as well as posting it to the newsgroup.J When both this qualifier and /MAIL are omitted, mailing and/or posting of9the reply is determined by the current SET REPLY setting. .I-1/SELF /SELF /NOSELFL The /[NO]SELF qualifier is used to override your VMS MAIL copy-self settingIfor REPLY. When /SELF is specified, or copy-self is turned on for REPLY, Ga copy of the message is sent to yourself as well as to the destination Buser(s) you specify. This qualifier may only be used if the /MAILqualifier is also specified..I-1 /SIGNATURE /SIGNATUREi /NOSIGNATURElF The /SIGNATURE qualifier indicates that your "signature" file, if youDhave set one with SET SIGNATURE__FILE, should be included at the endEof the message. Specifying /NOSIGNATURE indicates that the signature Fshould not be included. If omitted, signature inclusion is determinedAby the /AUTOMATIC setting used when the signature file was set uplwith SET SIGNATURE__FILE.n.I-1/SUBJECT /SUBJECT=subjectt /NOSUBJECTiJ The /SUBJECT qualifier can be used to alter or eliminate the subject lineMfrom the reply. If omitted, the subject of the reply will be "Re: " followedn'by the subject of the original article. .I-1/TOr /TO=(address[,...])J When mailing the reply, this qualifier directs the reply to the specifiedIaddress or addresses. By default, replies are sent to the address in thecJReply-To header (or From header if there is no Reply-To) in the article towhich you are replying.e.I-11 SETfM The SET command is used to set various attributes in your NEWS profile, withiLthe exception of SET SEEN and SET UNSEEN, which mark news articles as "seen" or "unseen"..NJ Format:..i+10;SET [NO]ARCHIVE__DIRECTORY [archive-dir].i+10;SET [NO]AUTO__READ__NEWr.i+10;SET [NO]EDIT#.I+10;SET [NO]FORCE__MAIL__PROTOCOL.I+10;SET [NO]FORM form-name-.i+10;SET [NO]HEADERS [[NO]header-name[,...]]!.i+10;SET [NO]IGNORE [group-name]i6.I+10;SET NEWGROUP__ACTION [NONE | PROMPT | SUBSCRIBE]4.I+10;SET [NO]NEWSRC [file-spec] [/SUBSCRIBED__ONLY]#.i+10;SET [NO]PERSONAL__NAME [name] .i+10;SET REPLY reply-type[,...][.i+10;SET SEEN [/CROSS__REFERENCES] [/ALL | /THREAD | [/SUBJECT=(pat...)] article-range...]/#.i+10;SET [NO]SIGNATURE [file-spec]i].i+10;SET UNSEEN [/CROSS__REFERENCES] [/ALL | /THREAD | [/SUBJECT=(pat...)] article-range...]o.J.I-12 ARCHIVE__DIRECTORYB The SET ARCHIVE__DIRECTORY command is used to establish a defaultLdevice and directory where articles saved with the EXTRACT command should beIstored. Use SET NOARCHIVE__DIRECTORY to remove the archive specification.u.I-12 AUTO__READ__NEWID The SET AUTO__READ__NEW command controls how NEWSRDR behaves when aKREAD/NEW, READ/NEXT/NEW, or READ/NEXT/NEW/GROUP command visits a new group.mLWhen enabled (the default), the first new article in the newly visited groupHis displayed automatically. When disabled, the new group is set but theOnew article is not displayed, giving you the opportunity to enter some commands(/before examining any articles in the new group.s.I-12 DIRECTORY__WIDTHI Specifies the number of columns that should be allocated to the From andKSubject fields in subsequent DIRECTORY commands. By default, the availableKspace is split evenly between the two fields. Specify SET DIRECTORY__WIDTH6with no qualifiers to revert to the default behaviour.J You can fix the number of columns for one or both of the fields with thisFcommand; if one is fixed, the other will occupy the remaining avaiablespace..NJ; Formatu.I+10;SET DIRECTORY__WIDTH.J.I-1 3 Qualifiers.I-1/FROMo /FROM=nL Specifies the number of columns for the From field, which can range from 0 Lto 994. If omitted, the width will default to the available remaining space+after the Subject field width is allocated.r.I-1/SUBJECT /SUBJECT=nO Specifies the number of columns for the Subject field, which can range from 0 Lto 994. If omitted, the width will default to the available remaining space(after the From field width is allocated..I-12 EDITN The SET EDIT command is used for two reasons. First, SET EDIT and SET NOEDITAturn on and off, respectively, the automatic invocation of a textO7editor when composing messages with the MAIL, POST, andsHREPLY commands. Second, the /EDITOR qualifier can be used to select anycallable editor..NJ  Format:.I+10;SET EDIT.I+10;SET NOEDIT.J.I-1 3 Qualifiere.I-1/EDITOR. /EDITOR=(editor,type)H The /EDITOR qualifier is used to select an editor for subsequent use in?message composition. The editor type may be CALLABLE or SPAWN. F For CALLABLE, any available callable editor can be used with NEWSRDR;-the default is "TPU" (which uses VAXTPU/EVE).I7"EDT" is the other callable editor that comes with VMS;TIif you have the VAX Language-Sensitive Editor installed, you can also uset="LSE". Any other compliant callable editor may also be used.sD For type SPAWN, you specify the command to be spawned. The command<should execute a command procedure which in turn invokes theCspawned editor. Refer to the user's guide for further information..I-12 FORCE__MAIL__PROTOCOL1J The SET FORCE__MAIL__PROTOCOL command forces NEWSRDR to prefix all e-mailDaddresses with the VMS MAIL foreign mail protocol prefix (taken fromJlogical name NEWSRDR__MAIL__PROTOCOL), even on messages addressed to localLusers. By default, NEWSRDR prefixes addresses only when they are identifiedas network addresses..I-12 FORME Specifies the printer form to be used by default on subsequent PRINT commands.c.NJs Format:.I+10;SET FORM form-name.I+10;SET NOFORM.J.I-1 2 HEADERSeE The SET HEADERS command is used to select or remove header fields in subsequent article displays.K Header field names recognized by this command are: FROM, DATE, NEWSGROUPS,nKSUBJECT, MESSAGE__ID (note underscore in place of hyphen), PATH, REPLY__TO,ePSENDER, FOLLOWUP__TO, EXPIRES, REFERENCES, DISTRIBUTION, ORGANIZATION, KEYWORDS,OSUMMARY, APPROVED, LINES, and XREF. Use "NO" in front of the header field namee5to remove the field from subsequent article displays.e.I-12 IGNORED The SET [NO]IGNOR~NEWSRDR_SRC.BCK3P[NEWSRDR]NEWSRDR_HELP.RNH;38]ZX:>E command is used to establish or remove an ignore2criterion for one newsgroup or for all newsgroups..NJe Format:!.I+10;SET [NO]IGNORE [group-name]f.J.I-1 3 Parametere group-nameoH The newsgroup for which the ignore criterion is to be added or removed.FIf omitted, defaults to the current newsgroup. Not used with /GLOBAL..I-1 3 Qualifiers.I-1/FROMw /FROM=patternG Bases the criterion on an article's From line. Any From line matchingIDthe specified pattern, which can contain wildcards, will be ignored..I-1/GLOBALwB Adds or removes the ignore criterion from the global ignore list,affecting all newsgroups..I-1 /NEWSGROUPSr /NEWSGROUPS=patternJ Bases the criterion on an article's Newsgroups line. Any Newsgroups lineMmatching the specified pattern, which can contain wildcards, will be ignored.c.I-1/SUBJECT /SUBJECT=patterntM Bases the criterion on an article's Subject line. Any Subject line matchingDthe specified pattern, which can contain wildcards, will be ignored..I-12 NEWGROUP__ACTIONL Sets the action that NEWSRDR should taken when it discovers a new newsgroupon the news server.e.NJc Format:.I+10;SET NEWGROUP__ACTION NONEs!.I+10;SET NEWGROUP__ACTION PROMPT $.I+10;SET NEWGROUP__ACTION SUBSCRIBE.JG The default action, NONE, has NEWSRDR announce the availability of theeJnew newsgroup, but does not subscribe you to the group. The PROMPT actionOhas NEWSRDR prompt you interactively as to whether or not you wish to subscribeEJto the new group. The SUBSCRIBE action causes NEWSRDR to subscribe you to!all new newsgroups automatically./.I-12 NEWSRCI Establishes the name of a "newsrc" file, which is a plain text file that1Hcontains information about groups you are subscribed to and the articlesGyou have seen in those groups. This kind of file is used by other newsereaders..NJo Format:.I+10;SET NEWSRC [file-spec].I+10;SET NONEWSRC.JF By using a newsrc file, you can switch between NEWSRDR and most otherFnews readers without losing subscription and seen-article information.>If you omit the file-spec, it defaults to SYS$LOGIN:XX.NEWSRC..I-1 3 Qualifiers.I-1/SUBSCRIBED__ONLYw /SUBSCRIBED__ONLYH Causes NEWSRDR to write out information only on newsgroups to which youFare subscribed, rather than the entire list. This can save disk spaceJand is useful if you intend to use the newsrc file only for specifying the!order of the newsgroups you read.iJ Other news readers may expect to see all newsgroups listed in your newsrcGfile, so you should be careful with this option if you are sharing yourEnewsrc with other news readers. .I-12 PERSONAL__NAMEO The SET [NO]PERSONAL__NAME command is used to establish (or remove) a personal @name which is added to your network address in article postings..NJi Format:$.I+10;SET PERSONAL__NAME "your name".I+10;SET NOPERSONAL__NAME.JG If you want to preserve upper and lower case in your name, or the namerHcontains blanks or other special characters, you should surround it withLquotation marks or omit it from the command line and enter it when prompted..I-1 3 Qualifieru.I-1/MAILn /MAILF Causes NEWSRDR to extract your personal name string from VMS MAIL and use that in subsequent postings..I-12 QUEUE H Specifies the print queue to be used by default on PRINT commands. Thedefault is SYS$PRINT. .NJe Format:.I+10;SET QUEUE queue-name.J.I-12 REPLYtE The SET REPLY command is used to set the default reply mechanism forVIREPLY commands. Possible reply types are MAIL and POST. You may specifye/more than one reply type on the command, as in:y.I+10;SET REPLY MAIL, POSTE You can override these settings by specifying the /POST and/or /MAILa qualifiers on the REPLY command..I-12 SEENM The SET SEEN command is used to mark one or more articles as "seen", so thatsCthey will not show up in subsequent READ/NEW or READ/NEXT commands.n.NJt Format:!.I+10;SET SEEN [article-range...] #.I+10;SET NOSEEN [article-range...]h.JK If SET NOSEEN is specified, the selected articles are marked as not havingr been seen..I-1 3 ParameterG article-range...bG A list of one or more article numbers or ranges (specified by startingdDand ending article numbers separated by a hyphen). If omitted, onlyBthe current article will be set seen. You may use "." to refer tothe current article..i-1 3 Qualifiers.I-1/ALL /ALL G Causes all articles in the current group to be marked. /ALL cannot bea$specified with any other qualifiers..I-1/CROSS__REFERENCES /CROSS__REFERENCESiK Causes all articles cross-referenced by marked articles to also be marked.A.I-1/SUBJECT /SUBJECT=(pattern[,...])uI Causes all articles with subject headers matching the specified patterns Mto be marked. If no article ranges are specified with /SUBJECT, all articles Efrom the current article to the last available article in the currentRnewsgroup are examined.J.i-1/THREADe /THREADK Causes all subsequent articles in the current newsgroup with subject linesy9matching the current article's subject line to be marked.n.I-12 SIGNATURE__FILE M The SET SIGNATURE__FILE command is used to identify a file to be appended toiDarticles you post and mail messages you send. This file can containE"signature" information -- your name, company, address, etc. -- whichU.you would like to send out with every message.F Signature files may not contain more than 8 lines of information, and-the lines may not exceed 80 columns in width.N.I-1 3 Qualifiera.I-1 /AUTOMATIC /AUTOMATIC=(send-type[,...])l /NOAUTOMATICiG Use the /AUTOMATIC qualifier to specify when the signature file shouldrAbe included automatically in outgoing mail or postings. PossibleeHsend-types are MAIL and POST. Use /NOAUTOMATIC to prevent the automatic:inclusion of your signature file on all outgoing messages.L You can override this setting by specifying the /[NO]SIGNATURE qualifier on#the MAIL, POST, and REPLY commands.t.i-12 UNSEENE The SET UNSEEN command marks articles as "unseen" or "new". This isdEuseful when a long article is being displayed that you do not wish to 4read at the moment, but would like to look at later..NJ Format:#.I+10;SET UNSEEN [article-range...]n.J.I-1 3 Parameteru article-range... G A list of one or more article numbers or ranges (specified by startingiDand ending article numbers separated by a hyphen). If omitted, onlyBthe current article will be set seen. You may use "." to refer tothe current article..I-1 3 Qualifiern.I-1/ALL /ALLmK Causes all articles in the current group to be marked unseen. /ALL cannotT'be specified with any other qualifiers.d.I-1/CROSS__REFERENCES /CROSS__REFERENCESbK Causes all articles cross-referenced by marked articles to also be marked.I.I-1/SUBJECT /SUBJECT=(pattern[,...]) I Causes all articles with subject headers matching the specified patternsoMto be marked. If no article ranges are specified with /SUBJECT, all articleseEfrom the current article to the last available article in the currentnewsgroup are examined.f.i-1/THREAD /THREADK Causes all subsequent articles in the current newsgroup with subject linesu9matching the current article's subject line to be marked.f.I-11 SHOWI The SHOW command is used to display any or all of your profile settings,P8the node name of the news server, and the current group..NJ1 Format:.I+10;SHOW ALL.I+10;SHOW ARCHIVE__DIRECTORYt.I+10;SHOW AUTO__READ__NEW.I+10;SHOW CURRENT__GROUPo.I+10;SHOW DIRECTORY__WIDTHA.I+10;SHOW EDIT .I+10;SHOW FORCE__MAIL__PROTOCOL.I+10;SHOW FORM .I+10;SHOW GROUP.I+10;SHOW HEADERS.I+10;SHOW IGNOREi.I+10;SHOW NEWGROUP__ACTIONe.I+10;SHOW NEWSRC .I+10;SHOW PERSONAL__NAMEi.I+10;SHOW QUEUE.I+10;SHOW REPLY.I+10;SHOW SERVERt.I+10;SHOW SIGNATURE__FILE.J.I-12 ALL # Displays all SHOWable information..I-12 ARCHIVE__DIRECTORY0 Displays the current archive directory setting..I-12 AUTO__READ__NEW(1 Displays the current automatic READ/NEW setting.s.I-12 CURRENT__GROUPP Displays the current group, if any, as set by the GROUP command (among others).OAlso displayed are the article numbers of the first and last articles availableF#from the news server in that group.n.I-12 EDIT/ Displays the current edit and editor settings.E.I-12 GROUP/P Displays the current group, if any, as set by the GROUP command (among others).OAlso displayed are the article numbers of the first and last articles availableiHfrom the news server in that group, and the number of unseen articles in.the group. (Synonym for SHOW CURRENT__GROUP.).I-1 2 HEADERS/M Lists which header fields you have selected for display when displaying news articles. .I-12 IGNORE< Displays the global and/or newsgroup-local ignore settings..I-1 3 Qualifiers.I-1/GLOBALt3 Causes the global ignore settings to be displayed.h.I-1/LOCAL< Causes the local ignore settings to be displayed (default)..I-12 NEWSRC< Displays the name of your newsrc file, if you have one set..I-12 PERSONAL__NAMEE Displays the personal name you have set for use in the "From:" fieldswhen posting articles..I-12 REPLY ) Displays the current SET REPLY settings.F.I-12 SERVERF Displays the node name of the news server to which you are connected..I-12 SIGNATURE__FILEi, Displays the name of your "signature" file..I-11 SPAWNuE Creates a subprocess of the current process. The context of thesDsubprocess is copied from the current process. You can use theDSPAWN command to leave MAIL temporarily, perform other functionsD(such as displaying a directory listing or printing a file), andthen return to MAIL..NJm Format:.I+10;SPAWN [command] .J.I-1 2 Parameterr commandE Specifies the DCL command string that executes in the context of thelDcreated subprocess. When the command completes, the subprocessDterminates and control is returned to the parent process. If notDspecified, a subprocess is created transferring control to the DCLcommand level..I-1 2 Qualifiers.I-1/INPUT /INPUT=file-speciF Specifies an input file containing one or more DCL command strings toDbe executed by the spawned subprocess. If you specify a commandDstring along with an input file, the command string is processedDbefore the commands in the input file. Once processing is complete,the subprocess is terminated.w.I-1/LOGICAL__NAMESo /[NO]LOGICAL__NAMESF Specifies that the logical names of the parent process be copied toDthe subprocess. When you do not want the subprocess to use theElogical names of the parent process, enter the /NOLOGICAL__NAMESw+qualifier. The default is /LOGICAL__NAMES.t.I-1/OUTPUTe /OUTPUT=file-specF Identifies the output file to which the results of the SPAWNDoperation are written. You should specify an output other than@SYS$OUTPUT whenever you specify the /NOWAIT qualifier to preventEoutput from being displayed while you are specifying new commands.uDIf you omit the /OUTPUT qualifier, output is written to the currentSYS$OUTPUT device..I-1/PROCESS /PROCESS=subprocess-nameoF Specifies the name of the subprocess to be created. The default name!of the subprocess is USERNAME__n.t.I-1/SYMBOLS /[NO]SYMBOLS E Determines whether the system passes DCL global and local symbols too(the subprocess. The default is /SYMBOLS..I-1/WAITf /WAITF Controls whether the system waits until the subprocess is completedDbefore allowing more commands to be specified. The /NOWAITDqualifier allows you to specify new commands while the specifiedDsubprocess is running. If you specify /NOWAIT, you should also useD/OUTPUT to direct the output to a file rather than displaying it onDthe screen to prevent your terminal from being used by more than oneprocess simultaneously.E.I-11 SAVEA SAVE is a synonym for EXTRACT. Refer to the help on EXTRACT forGmore information.|.I-11 STORERF The STORE command is used to send yourself (using VMS Mail) a copy ofa news article.[.nj  Format:.i+10;STORE [article-number].JI If an article number is not specified, the current article is sent. ThegDVMS Mail subject line of the message will match that of the article.J This command can be used to store articles of interest in VMS Mail, which$you can then file into mail folders..I-1 1 SUBSCRIBEoH The SUBSCRIBE command is used to begin a "subscription" to a particularJnewsgroup. Only those newsgroups to which you subscribe are kept track ofMbetween NEWS sessions, and you must subscribe to a newsgroup to view articlesTor post articles in that group. .njD Format: .I+10;SUBSCRIBE group-name[,...].JL A group name specification may include wildcard characters. All newsgroupsGmatching the specified pattern will be added to your subscription list. .I-1 2 Qualifiers.I-1/CONFIRM /CONFIRMeJ Prompts for confirmation before adding a group to your subscription list..I-1/GOTOa /GOTOI Sets the subscribed group as the current group. On wildcard subscribes,m!the last subscribed group is set.a.I-1/LOG /LOG (default) /NOLOGuF Displays a message for each successful addition. Enabled by default;disable with /NOLOG..I-1 1 UNSUBSCRIBETI The UNSUBSCRIBE command is used to cancel a subscription to a newsgroup.HIf you do not specify a newsgroup on the command line, the current group is cancelled.n.NJf Format:$.I+10;UNSUBSCRIBE [group-name[,...]].JL A group name specification may include wildcard characters. All newsgroupsKmatching the specified pattern will be removed from your subscription list.h.I-1 2 Qualifiers.I-1/CONFIRM /CONFIRMdN Prompts for confirmation before removing a group from your subscription list..I-1/LOG /LOG (default) /NOLOG=E Displays a message for each successful removal. Enabled by default;adisable with /NOLOG..I-11 UPDATEM The UPDATE command is used to retrieve newsgroup information from the serverhJto update the local list of newsgroups, thereby identifying those articlesyou have not yet seen.N This is done by default when NEWS is started up, unless you specify /NOUPDATEon the NEWS command.L There are two types of updates: partial and full. A partial update fetchesNinformation about only those newsgroups to which you subscribe. ,A full updateJ(the default) fetches information about every newsgroup available from the NNTP server..NJq Format:.I+10;UPDATE [/PARTIAL]f.J.I-1 2 Qualifiere.I-1/PARTIAL) Causes a partial update to be performed.NF For CALLABLE, any available calB~NEWSRDR_SRC.BCK@MP[NEWSRDR]NEWGROUPS.C;7O i[*[NEWSRDR]NEWGROUPS.C;7+,@M. / @ 4O \-P0123KPWO 56-RƖ7@SƖ8vh99G @HJ/***++** FACILITY: NEWSRDR**+** ABSTRACT: Handles newgroups processing.**** MODULE DESCRIPTION:**** tbs**** AUTHOR: M. MadisonI** COPYRIGHT 1993, MATTHEW D. MADISON. ALL RIGHTS RESERVED.**** CREATION DATE: 16-APR-1993**** MODIFICATION HISTORY:**1** 16-APR-1993 V1.0 Madison Initial coding.>** 23-APR-1993 V1.0-1 Madison Support for NEWGROUP_ACTION.**--*/#include "newsrdr.h"#include "globals.h"/*** Forward declarations*/ void Check_New_Groups(void);/*** External references*/+ extern void Insert_Group(struct GRP *);* extern struct GRP *Find_Group(char *);G extern unsigned int parse_group_reply(char *, int *, int *, int *);? extern unsigned int Parse_List_Reply(char *, struct GRP *);  /***++** ROUTINE: Check_New_Groups**** FUNCTIONAL DESCRIPTION:**** tbs**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**** tbs**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:****** SIDE EFFECTS: None.****--*/void Check_New_Groups() { struct QUE newgq; struct GRP *g, *g2; char tmp[STRING_SIZE]; int tlen, reply_code;( if (news_cfg.newgroups == 0) return;% newgq.head = newgq.tail = &newgq;/*?** If we've never done a newgroups check, let's not do one now.*/I if (news_prof.lastgrpchk.long1==0 && news_prof.lastgrpchk.long2==0) {+ sys$gettim(&news_prof.lastgrpchk); return; }" if (news_cfg.newgroups == 1) { strcpy(tmp, "NEWGROUPS ");G make_nntp_dtstring(&news_prof.lastgrpchk, tmp+10, sizeof(tmp)-10); } else { strcpy(tmp, "LIST"); } server_send(tmp);8 server_get_reply(SRV__NOECHO, &reply_code, 0, 0, 0);O if (reply_code == NNTP__NGLSTFOLLOWS || reply_code == NNTP__GLISTFOLLOWS) {' sys$gettim(&news_prof.lastgrpchk);I while (server_get_line(tmp, sizeof(tmp)-1, &tlen) != NEWS__EOLIST) { char *sppos; g = mem_getgrp();5 g->seenq.head = g->seenq.tail = &(g->seenq);5 g->killq.head = g->killq.tail = &(g->killq); g->avail = 1;' if (news_cfg.newgroups == 1) { tmp[tlen] = '\0';# sppos = strchr(tmp, ' '); if (sppos == NULL) {@ if (tlen > GRP_S_GRPNAM) tmp[GRP_S_GRPNAM] = '\0';% strcpy(g->grpnam, tmp); } else {" int len = sppos-tmp;9 if (len > GRP_S_GRPNAM) len = GRP_S_GRPNAM;+ strncpy(g->grpnam, tmp, len);$ g->grpnam[len] = '\0'; } } else {. if (!OK(Parse_List_Reply(tmp, g))) { mem_freegrp(g); continue; } }$ g2 = Find_Group(g->grpnam); if (g2 == NULL) {& queue_insert(g, newgq.tail); } else { mem_freegrp(g); } } }* while (queue_remove(newgq.head, &g)) {) sprintf(tmp, "GROUP %s", g->grpnam); server_send(tmp);E server_get_reply(SRV__NOECHO, &reply_code, tmp, sizeof(tmp), 0);+ if (reply_code == NNTP__GRPSELECTED) { int article_count;3 g->seenq.head = g->seenq.tail = &g->seenq;3 g->killq.head = g->killq.tail = &g->killq; g->avail = 1;J parse_group_reply(tmp, &article_count, &g->frstavl, &g->lastavl); Insert_Group(g);E lib$signal(NEWS__NEWGROUP, 2, strlen(g->grpnam), g->grpnam); if (news_prof.glist) {$ news_prof.glast->next = g; news_prof.glast = g; }& switch (news_prof.ngaction) { case NG_K_SUBSCRIBE: g->subscribed = 1; break; case NG_K_PROMPT:6 sprintf(tmp, "Subscribe to %s?", g->grpnam);- g->subscribed = Yes_Answer(tmp, 0); break; default: break; } } else { mem_freegrp(g); } } return;} /* Check_New_Groups */i~NEWSRDR_SRC.BCKPP[NEWSRDR]PARSE822.C;37SE*[NEWSRDR]PARSE822.C;37+,P./ @ 4S-P0123KPWO56bۏ78fel99G @HJ"/***++** FACILITY: NEWSRDR**.** ABSTRACT: RFC822 address handling routines**** MODULE DESCRIPTION:**+** This module contains routine PARSE822.****** AUTHOR: M. MadisonI** COPYRIGHT 1992, MATTHEW D. MADISON. ALL RIGHTS RESERVED.**** CREATION DATE: 25-JUN-1992**** MODIFICATION HISTORY:**1** 25-JUN-1992 V1.0 Madison Initial coding.3** 07-AUG-1992 V1.1 Madison Update for Alpha.=** 04-SEP-1992 V1.2 Madison Add full-address parameter.H** 10-DEC-1992 V1.2-1 Madison LIB$TABLE_PARSE now in lib$routines.h.**--*/#include "newsrdr.h"#include "tpadef.h"0 extern int parse822_state(), parse822_key();'#define TPA_C_LENGTH (TPA$C_LENGTH0+20)%#define TPA_K_COUNT (TPA$K_COUNT0+5) struct TPABLK { struct tpadef tpa0; int *tpa_l_adrlen; char *tpa_l_adrbuf; int *tpa_l_namlen; char *tpa_l_nambuf; int *tpa_l_nomore; };/*;** The following are codes used in both PARSE822_TABLES.MAR:** and in routine parse822_store below. They must match!!*/#define P8_K_STORE_MBOX 231422#define P8_K_APPND_MBOX 861324#define P8_K_STORE_NAME 318417#define P8_K_NO_MORE 627409 /***++** ROUTINE: parse822**** FUNCTIONAL DESCRIPTION:**D** Takes a string containing a comma-separated list of RFC822-typeE** addresses and extracts the address part and the "personal name".**6** --N.B.-- RFC822 Group lists are _NOT_ handled!!!**** --N.B.-- NOT Reentrant!!**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**M** parse822(char *instr, void *contxt, char **full, char **adr, char **nam)**J** instr: char_string, character string (ASCIZ), read only, by reference@** contxt: arbitrary, longword (unsigned), modify, by referenceB** full: pointer, longword (unsigned), write only, by referenceB** adr: pointer, longword (unsigned), write only, by referenceB** nam: pointer, longword (unsigned), write only, by reference**J** >> Set contxt to 0 before first call; routine will iterate over entire1** >> string, updating contxt during processing.**+** IMPLICIT INPUTS: tmpbuf (static buffer)**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:**/** SS$_NORMAL: normal successful completion.>** SS$_ENDOFFFILE: no more addresses were found in the list.?** Other values from LIB$TPARSE/LIB$TABLE_PARSE are possible.**** SIDE EFFECTS: None.****--*/Dint parse822(char *instr, char **contxt, char **fulladr, char **adr,5 char **nam) {  struct TPABLK tpablk;6 int status, adrlen, namlen, nomore, inq, ina, inc; char *cp, *fcp;= static char adrbuf[STRING_SIZE+1], nambuf[STRING_SIZE+1];& static char fulbuf[STRING_SIZE+1];7 if (*contxt == ((char *) -1)) return SS$_ENDOFFILE;) if (*contxt == NULL) *contxt = instr;/*G** Locate the next address in the comma-separated list, trimming blanks ** and such.*/ fcp = fulbuf;+ for (cp = *contxt; isspace(*cp); cp++); inq = ina = inc = 0; while (*cp) { if (inq) {! if (*cp == '"') inq = 0;) if (*cp == '\\') *fcp++ = *cp++; *fcp++ = *cp++; } else if (inc) {! if (*cp == ')') inc = 0;! if (*cp == '"') inq = 1;) if (*cp == '\\') *fcp++ = *cp++; *fcp++ = *cp++; } else if (ina) {! if (*cp == '>') ina = 0;! if (*cp == '"') inq = 1;) if (*cp == '\\') *fcp++ = *cp++; *fcp++ = *cp++; } else { if (*cp == ',') break;! if (*cp == '"') inq = 1;! if (*cp == '<') ina = 1;! if (*cp == '(') inc = 1;) if (*cp == '\\') *fcp++ = *cp++; *fcp++ = *cp++; } }/*** Update context for next call*/ if (*cp) { *contxt = cp + 1; } else { *contxt = (char *) -1; }6 while ((fcp > fulbuf) && isspace(*(fcp-1))) fcp--; *fcp = '\0';# if (fulladr) *fulladr = fulbuf;/*$** Prepare for initial parse attempt*/% memset(&tpablk, 0, TPA_C_LENGTH);* tpablk.tpa0.tpa$l_count = TPA_K_COUNT;- tpablk.tpa0.tpa$l_options = TPA$M_BLANKS;- tpablk.tpa0.tpa$l_stringcnt = fcp-fulbuf;) tpablk.tpa0.tpa$l_stringptr = fulbuf;" tpablk.tpa_l_adrlen = &adrlen;! tpablk.tpa_l_adrbuf = adrbuf;" tpablk.tpa_l_namlen = &namlen;! tpablk.tpa_l_nambuf = nambuf;" tpablk.tpa_l_nomore = &nomore;! adrlen = namlen = nomore = 0;R status = table_parse(&tpablk, (void *) parse822_state, (void *) parse822_key);/*D** Handle the case where the parse failed because the leading phraseA** on the address was syntactically invalid. This is done fairly@** frequently by UNIX systems. (Surprise, surprise.) Just look8** for the opening angle bracket and take it from there.*/# if (status == LIB$_SYNTAXERR) {C if ((cp = strchr(fulbuf, '<')) == NULL) return LIB$_SYNTAXERR;& memset(&tpablk, 0, TPA_C_LENGTH);+ tpablk.tpa0.tpa$l_count = TPA_K_COUNT;. tpablk.tpa0.tpa$l_options = TPA$M_BLANKS;* tpablk.tpa0.tpa$l_stringcnt = fcp-cp;& tpablk.tpa0.tpa$l_stringptr = cp;# tpablk.tpa_l_adrlen = &adrlen;" tpablk.tpa_l_adrbuf = adrbuf;# tpablk.tpa_l_namlen = &namlen;" tpablk.tpa_l_nambuf = nambuf;# tpablk.tpa_l_nomore = &nomore;" adrlen = namlen = nomore = 0;S status = table_parse(&tpablk, (void *) parse822_state, (void *) parse822_key); }4 if (!$VMS_STATUS_SUCCESS(status)) return status;/*K** If the address in the original string had angle brackets, strip them off!** (unless it's a route-address).*/ cp = adrbuf; if (*cp == '<') { if (*(cp+1) != '@') { adrlen -= 2; cp++; } } *(cp+adrlen) = '\0'; if (adr) *adr = cp;/*7** Trim trailing blanks from the "personal name" string*/ if (namlen > 0)B while (*(nambuf+namlen-1) == ' ') if ((--namlen) == 0) break; *(nambuf+namlen) = '\0'; if (nam) *nam = nambuf; return SS$_NORMAL;} /* parse822 */ /***++** ROUTINE: PARSE822_STORE**** FUNCTIONAL DESCRIPTION:**5** Character store routine for use with LIB$TPARSE.**B** RETURNS: cond_value, longword (unsigned), write only, by value**** PROTOTYPE:**B** PARSE822_STORE flag, inplen, inp, toklen, tok, char, number,=** usrarg, adrlen, adrbuf, namlen, nambuf, nomore**H** The first eight arguments are the LIB$TPARSE standard argument block.**H** adrlen: longword_unsigned, longword (unsigned), modify, by reference?** adrbuf: char_string, character string, modify, by referenceH** namlen: longword_unsigned, longword (unsigned), modify, by reference?** nambuf: char_string, character string, modify, by referenceL** nomore: longword_unsigned, longword (unsigned), write only, by reference**** IMPLICIT INPUTS: None.**** IMPLICIT OUTPUTS: None.**** COMPLETION CODES:**** **** SIDE EFFECTS: None.****--*/(int parse822_store(struct TPABLK *tpa) { int len;$ switch (tpa->tpa0.tpa$l_param) { case P8_K_STORE_MBOX :8 len = min(tpa->tpa0.tpa$l_tokencnt, STRING_SIZE-1);> memcpy(tpa->tpa_l_adrbuf, tpa->tpa0.tpa$l_tokenptr, len); *tpa->tpa_l_adrlen = len;% *(tpa->tpa_l_adrbuf+len) = '\0'; break; case P8_K_APPND_MBOX :K len = min(tpa->tpa0.tpa$l_tokencnt, STRING_SIZE-1-*tpa->tpa_l_adrlen);S memcpy(tpa->tpa_l_adrbuf+(*tpa->tpa_l_adrlen), tpa->tpa0.tpa$l_tokenptr, len); *tpa->tpa_l_adrlen += len;6 *(tpa->tpa_l_adrbuf+(*tpa->tpa_l_adrlen)) = '\0'; break; case P8_K_STORE_NAME :8 len = min(tpa->tpa0.tpa$l_tokencnt,STRING_SIZE-1); 4 if (tpa->tpa_l_namlen) *tpa->tpa_l_namlen = len; if (tpa->tpa_l_nambuf) {B memcpy(tpa->tpa_l_nambuf, tpa->tpa0.tpa$l_tokenptr, len);) *(tpa->tpa_l_nambuf+len) = '\0'; } break; case P8_K_NO_MORE : *tpa->tpa_l_nomore = 1; break; default : return SS$_BADPARAM; } return SS$_NORMAL;} /* parse822_store */Y ~NEWSRDR_SRC.BCK4QP[NEWSRDR]PARSE822_TABLES.MAR;20EG*[NEWSRDR]PARSE822_TABLES.MAR;20+,4Q./ @ 4E -P0123KPWO 56L}7^e}86h99G @HJ4 .TITLE PARSE822_TABLES - TPARSE tables for PARSE822 .IDENT 'V1.1';C; COPYRIGHT 1992, 1993 MATTHEW D. MADISON. ALL RIGHTS RESERVED.; .EXTRN PARSE822_STORE .DSABL GLOBALP8_K_STORE_MBOX = 231422P8_K_APPND_MBOX = 861324P8_K_STORE_NAME = 318417P8_K_NO_MORE = 627409;1; MACRO can't handle some characters as literals.;LEFTANGLE = 60RIGHTANGLE = 62APOSTROPHE = 39 COMMA = 44LEFTBRACE = 123VERTBAR = 124RIGHTBRACE = 125 TILDE = 1267; Macro to define the internal character store routinesE; Call via LIB$TABLE_PARSE is detected by argument count equalling 1.! .MACRO STORE_RTN, INTRTN, EXTRTN! .PSECT P8_CODE,NOWRT,SHR,PIC,EXEINTRTN: .IF DF,EVAX& .CALL_ENTRY HOME_ARGS=TRUE,MAX_ARGS=1 CALLG (AP),G^EXTRTN .IFF .WORD 0 CMPB (AP),#1 BEQL 1$ PUSHL AP CALLS #1,G^EXTRTN RET1$: CALLG (AP),G^EXTRTN .ENDC RET .ENDM) $INIT_STATE PARSE822_STATE, PARSE822_KEY $STATE SKIPWS $TRAN TPA$_BLANK, SKIPWS $TRAN TPA$_LAMBDA, GETADR1 $STATE GETADR13 $TRAN !COMMENT, SKIPWS, P8_STORE,,,P8_K_STORE_NAME $TRAN !MAILBOX, CHKCOM2 $TRAN !PHRASE, SKIPWS, P8_STORE,,,P8_K_STORE_NAME $STATE MAILBOX $TRAN !COMMENT $TRAN !ROUTEADR, TPA$_EXIT $TRAN !ADDRSPEC, TPA$_EXIT $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE CHKCOM $TRAN TPA$_BLANK, CHKCOM $TRAN TPA$_EOS, TPA$_EXIT3 $TRAN !COMMENT, CHKCOM, P8_STORE,,,P8_K_STORE_NAME $STATE COMMENT $TRAN '(', COM1 $STATE COM1 $TRAN !COMMENT, COM1 $TRAN TPA$_BLANK, COM1 $TRAN '\', COMLIT $TRAN ')', TPA$_EXIT $TRAN TPA$_EOS, TPA$_FAIL $TRAN TPA$_ANY, COM1 $STATE COMLIT $TRAN TPA$_ANY, COM1 $STATE ROUTEADR4 $TRAN LEFTANGLE, RTADR1, P8_STORE,,,P8_K_STORE_MBOX $TRAN TPA$_BLANK, ROUTEADR $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE RTADR1/ $TRAN '@', RTADR2, P8_STORE,,, P8_K_APPND_MBOX $TRAN !ADDRSPEC, RTADR5 $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE RTADR23 $TRAN !DOMAIN, RTADR3, P8_STORE,,, P8_K_APPND_MBOX $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE RTADR31 $TRAN COMMA, RTADR1, P8_STORE,,, P8_K_APPND_MBOX/ $TRAN ':', RTADR4, P8_STORE,,, P8_K_APPND_MBOX $TRAN TPA$_BLANK, RTADR3 $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE RTADR4 $TRAN !ADDRSPEC, RTADR5 $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE RTADR5 $TRAN TPA$_BLANK, RTADR59 $TRAN RIGHTANGLE, TPA$_EXIT, P8_STORE,,, P8_K_APPND_MBOX $STATE ADDRSPEC $TRAN TPA$_BLANK, ADDRSPEC $TRAN !COMMENT, ADDRSPEC3 $TRAN !LCLPART, ADRS1, P8_STORE,,, P8_K_APPND_MBOX $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE ADRS1. $TRAN '@', ADRS2, P8_STORE,,, P8_K_APPND_MBOX $TRAN TPA$_BLANK, ADRS13 $TRAN !COMMENT, ADRS1, P8_STORE,,, P8_K_STORE_NAME $TRAN TPA$_EOS, TPA$_EXIT $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE ADRS2 $TRAN TPA$_BLANK, ADRS2 $TRAN !COMMENT, ADRS26 $TRAN !DOMAIN, TPA$_EXIT, P8_STORE,,, P8_K_APPND_MBOX $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE LCLPART $TRAN !_WORD, LCLP1 $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE LCLP1 $TRAN '.', LCLP2 $TRAN TPA$_LAMBDA, TPA$_EXIT $STATE LCLP2 $TRAN !_WORD, LCLP1 $TRAN TPA$_LAMBDA, TPA$_EXIT $STATE PHRASE $TRAN !_WORD, PHR1 $TRAN !COMMENT, PHR1 $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE PHR1 $TRAN TPA$_BLANK, PHR2 $TRAN TPA$_LAMBDA, TPA$_EXIT $STATE PHR2 $TRAN TPA$_BLANK, PHR2 $TRAN !_WORD, PHR1 $TRAN !COMMENT, PHR1 $TRAN TPA$_LAMBDA, TPA$_EXIT $STATE _WORD $TRAN '"', WORDQ $TRAN !COMMENT, _WORD $TRAN TPA$_ALPHA, WORD1 $TRAN TPA$_DIGIT, WORD1 $TRAN '`', WORD1 $TRAN TILDE, WORD1 $TRAN '!', WORD1 $TRAN '#', WORD1, $TRAN '$', WORD1 $TRAN '%', WORD1 $TRAN '^', WORD1 $TRAN '&', WORD1 $TRAN '*', WORD1 $TRAN '-', WORD1 $TRAN '_', WORD1 $TRAN '=', WORD1 $TRAN '+', WORD1 $TRAN LEFTBRACE, WORD1 $TRAN RIGHTBRACE, WORD1 $TRAN APOSTROPHE, WORD1 $TRAN VERTBAR, WORD1 $TRAN '/', WORD1 $TRAN '?', WORD1 $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE WORDQ $TRAN '\', WORDQ1 $TRAN '"', WORD1 $TRAN TPA$_ANY, WORDQ $STATE WORDQ1 $TRAN TPA$_ANY, WORDQ $STATE WORD1 $TRAN '"', WORDQ $TRAN !COMMENT, WORD1 $TRAN TPA$_ALPHA, WORD1 $TRAN TPA$_DIGIT, WORD1 $TRAN '`', WORD1 $TRAN TILDE, WORD1 $TRAN '!', WORD1 $TRAN '#', WORD1 $TRAN '$', WORD1 $TRAN '%', WORD1 $TRAN '^', WORD1 $TRAN '&', WORD1 $TRAN '*', WORD1 $TRAN '-', WORD1 $TRAN '_', WORD1 $TRAN '=', WORD1 $TRAN '+', WORD1 $TRAN LEFTBRACE, WORD1 $TRAN RIGHTBRACE, WORD1 $TRAN APOSTROPHE, WORD1 $TRAN VERTBAR, WORD1 $TRAN '/', WORD1 $TRAN '?', WORD1 $TRAN TPA$_LAMBDA, TPA$_EXIT $STATE DOMAIN $TRAN !SUBDOMAIN, DOM1 $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE DOM1 $TRAN '.', DOM2 $TRAN TPA$_LAMBDA, TPA$_EXIT $STATE DOM2 $TRAN !SUBDOMAIN, DOM1 $TRAN TPA$_LAMBDA, TPA$_EXIT $STATE SUBDOMAIN $TRAN '[', SUBDLIT $TRAN '`', SUBD1 $TRAN TILDE, SUBD1 $TRAN '!', SUBD1 $TRAN '#', SUBD1 $TRAN '$', SUBD1 $TRAN '%', SUBD1 $TRAN '^', SUBD1 $TRAN '&', SUBD1 $TRAN '*', SUBD1 $TRAN '-', SUBD1 $TRAN '_', SUBD1 $TRAN '=', SUBD1 $TRAN '+', SUBD1 $TRAN LEFTBRACE, SUBD1 $TRAN RIGHTBRACE, SUBD1 $TRAN APOSTROPHE, SUBD1 $TRAN VERTBAR, SUBD1 $TRAN '/', SUBD1 $TRAN '?', SUBD1 $TRAN TPA$_ALPHA, SUBD1 $TRAN TPA$_DIGIT, SUBD1 $TRAN TPA$_LAMBDA, TPA$_FAIL $STATE SUBDLIT $TRAN '\', SUBDLQ $TRAN ']', TPA$_EXIT $TRAN TPA$_ANY, SUBDLIT $STATE SUBDLQ $TRAN TPA$_ANY, SUBDLIT $STATE SUBD1 $TRAN '`', SUBD1 $TRAN TILDE, SUBD1 $TRAN '!', SUBD1 $TRAN '#', SUBD1 $TRAN '$', SUBD1 $TRAN '%', SUBD1 $TRAN '^', SUBD1 $TRAN '&', SUBD1 $TRAN '*', SUBD1 $TRAN '-', SUBD1 $TRAN '_', SUBD1 $TRAN '=', SUBD1 $TRAN '+', SUBD1 $TRAN LEFTBRACE, SUBD1 $TRAN RIGHTBRACE, SUBD1 $TRAN APOSTROPHE, SUBD1 $TRAN VERTBAR, SUBD1 $TRAN '/', SUBD1 $TRAN '?', SUBD1 $TRAN TPA$_ALPHA, SUBD1 $TRAN TPA$_DIGIT, SUBD1 $TRAN TPA$_LAMBDA, TPA$_EXIT $END_STATE$ STORE_RTN P8_STORE,PARSE822_STORE .ENDc!~NEWSRDR_SRC.BCKPP[NEWSRDR]ARCH_DEFS.MAR;1;*[NEWSRDR]ARCH_DEFS.MAR;1+,P./ @ 4;-P0123KPWO56VM%7\{86Jh99G @HJ;;; This is the EVAX version of ARCH_DEFS.MAR, which contains9; architectural definitions for compiling VMS sources for; EVAX systems.;EVAX = 1 BIGPAGE = 1ADDRESSBITS = 32y"~NEWSRDR_SRC.BCKPP[NEWSRDR]NEWS_MSG.H;493*[NEWSRDR]NEWS_MSG.H;4+,P./ @ 4-P0123KPWO56ӹ@78-A8?%99G @HJ4/* * Generated automatically from news_msg.msg */ #ifndef __DECC #define NEWS__NOCONNECT ((int) news__noconnect) extern int news__noconnect(); #else /* __DECC */ globalvalue NEWS__NOCONNECT; #endif /* __DECC */ #ifndef __DECC #define NEWS__CFGERR ((int) news__cfgerr) extern int news__cfgerr(); #else /* __DECC */ globalvalue NEWS__CFGERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__UNEXPRSP ((int) news__unexprsp) extern int news__unexprsp(); #else /* __DECC */ globalvalue NEWS__UNEXPRSP; #endif /* __DECC */ #ifndef __DECC #define NEWS__PROTOERR ((int) news__protoerr) extern int news__protoerr(); #else /* __DECC */ globalvalue NEWS__PROTOERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__NONETADR ((int) news__nonetadr) extern int news__nonetadr(); #else /* __DECC */ globalvalue NEWS__NONETADR; #endif /* __DECC */ #ifndef __DECC #define NEWS__SENDERR ((int) news__senderr) extern int news__senderr(); #else /* __DECC */ globalvalue NEWS__SENDERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__RCVERR ((int) news__rcverr) extern int news__rcverr(); #else /* __DECC */ globalvalue NEWS__RCVERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__BUFALLOCERR ((int) news__bufallocerr) extern int news__bufallocerr(); #else /* __DECC */ globalvalue NEWS__BUFALLOCERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__PAGERR ((int) news__pagerr) extern int news__pagerr(); #else /* __DECC */ globalvalue NEWS__PAGERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__COMPOSERR ((int) news__composerr) extern int news__composerr(); #else /* __DECC */ globalvalue NEWS__COMPOSERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__KWDSYNTAX ((int) news__kwdsyntax) extern int news__kwdsyntax(); #else /* __DECC */ globalvalue NEWS__KWDSYNTAX; #endif /* __DECC */ #ifndef __DECC #define NEWS__CMDERR ((int) news__cmderr) extern int news__cmderr(); #else /* __DECC */ globalvalue NEWS__CMDERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__CAPTIVE ((int) news__captive) extern int news__captive(); #else /* __DECC */ globalvalue NEWS__CAPTIVE; #endif /* __DECC */ #ifndef __DECC #define NEWS__ATTERR ((int) news__atterr) extern int news__atterr(); #else /* __DECC */ globalvalue NEWS__ATTERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__PRINTERR ((int) news__printerr) extern int news__printerr(); #else /* __DECC */ globalvalue NEWS__PRINTERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOPOSTING ((int) news__noposting) extern int news__noposting(); #else /* __DECC */ globalvalue NEWS__NOPOSTING; #endif /* __DECC */ #ifndef __DECC #define NEWS__POSTERR ((int) news__posterr) extern int news__posterr(); #else /* __DECC */ globalvalue NEWS__POSTERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__MAILERR ((int) news__mailerr) extern int news__mailerr(); #else /* __DECC */ globalvalue NEWS__MAILERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__REPLYERR ((int) news__replyerr) extern int news__replyerr(); #else /* __DECC */ globalvalue NEWS__REPLYERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__SPAWNERR ((int) news__spawnerr) extern int news__spawnerr(); #else /* __DECC */ globalvalue NEWS__SPAWNERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOPRINT ((int) news__noprint) extern int news__noprint(); #else /* __DECC */ globalvalue NEWS__NOPRINT; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOTYOURS ((int) news__notyours) extern int news__notyours(); #else /* __DECC */ globalvalue NEWS__NOTYOURS; #endif /* __DECC */ #ifndef __DECC #define NEWS__BODYERR ((int) news__bodyerr) extern int news__bodyerr(); #else /* __DECC */ globalvalue NEWS__BODYERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOREPLYADDR ((int) news__noreplyaddr) extern int news__noreplyaddr(); #else /* __DECC */ globalvalue NEWS__NOREPLYADDR; #endif /* __DECC */ #ifndef __DECC #define NEWS__RCRDERR ((int) news__rcrderr) extern int news__rcrderr(); #else /* __DECC */ globalvalue NEWS__RCRDERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__RCWRTERR ((int) news__rcwrterr) extern int news__rcwrterr(); #else /* __DECC */ globalvalue NEWS__RCWRTERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__NONEW ((int) news__nonew) extern int news__nonew(); #else /* __DECC */ globalvalue NEWS__NONEW; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOMORE ((int) news__nomore) extern int news__nomore(); #else /* __DECC */ globalvalue NEWS__NOMORE; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOMORENEW ((int) news__nomorenew) extern int news__nomorenew(); #else /* __DECC */ globalvalue NEWS__NOMORENEW; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOCURART ((int) news__nocurart) extern int news__nocurart(); #else /* __DECC */ globalvalue NEWS__NOCURART; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOSUCHGRP ((int) news__nosuchgrp) extern int news__nosuchgrp(); #else /* __DECC */ globalvalue NEWS__NOSUCHGRP; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOTSUBSCR ((int) news__notsubscr) extern int news__notsubscr(); #else /* __DECC */ globalvalue NEWS__NOTSUBSCR; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOCURGROUP ((int) news__nocurgroup) extern int news__nocurgroup(); #else /* __DECC */ globalvalue NEWS__NOCURGROUP; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOGRMATCH ((int) news__nogrmatch) extern int news__nogrmatch(); #else /* __DECC */ globalvalue NEWS__NOGRMATCH; #endif /* __DECC */ #ifndef __DECC #define NEWS__EDNOTFOUND ((int) news__ednotfound) extern int news__ednotfound(); #else /* __DECC */ globalvalue NEWS__EDNOTFOUND; #endif /* __DECC */ #ifndef __DECC #define NEWS__HDRNOTFOUND ((int) news__hdrnotfound) extern int news__hdrnotfound(); #else /* __DECC */ globalvalue NEWS__HDRNOTFOUND; #endif /* __DECC */ #ifndef __DECC #define NEWS__INVARTRNG ((int) news__invartrng) extern int news__invartrng(); #else /* __DECC */ globalvalue NEWS__INVARTRNG; #endif /* __DECC */ #ifndef __DECC #define NEWS__OUTRNG ((int) news__outrng) extern int news__outrng(); #else /* __DECC */ globalvalue NEWS__OUTRNG; #endif /* __DECC */ #ifndef __DECC #define NEWS__CREATERR ((int) news__createrr) extern int news__createrr(); #else /* __DECC */ globalvalue NEWS__CREATERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__EDITERR ((int) news__editerr) extern int news__editerr(); #else /* __DECC */ globalvalue NEWS__EDITERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__SUBPERR ((int) news__subperr) extern int news__subperr(); #else /* __DECC */ globalvalue NEWS__SUBPERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__OPENERR ((int) news__openerr) extern int news__openerr(); #else /* __DECC */ globalvalue NEWS__OPENERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__EXTRERR ((int) news__extrerr) extern int news__extrerr(); #else /* __DECC */ globalvalue NEWS__EXTRERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__SIGFERR ((int) news__sigferr) extern int news__sigferr(); #else /* __DECC */ globalvalue NEWS__SIGFERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__UPDERR ((int) news__upderr) extern int news__upderr(); #else /* __DECC */ globalvalue NEWS__UPDERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__ARTRERR ((int) news__artrerr) extern int news__artrerr(); #else /* __DECC */ globalvalue NEWS__ARTRERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOARTSPEC ((int) news__noartspec) extern int news__noartspec(); #else /* __DECC */ globalvalue NEWS__NOARTSPEC; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOTHREAD ((int) news__nothread) extern int news__nothread(); #else /* __DECC */ globalvalue NEWS__NOTHREAD; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOSUBJECT ((int) news__nosubject) extern int news__nosubject(); #else /* __DECC */ globalvalue NEWS__NOSUBJECT; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOMATCH ((int) news__nomatch) extern int news__nomatch(); #else /* __DECC */ globalvalue NEWS__NOMATCH; #endif /* __DECC */ #ifndef __DECC #define NEWS__KEYDEFERR ((int) news__keydeferr) extern int news__keydeferr(); #else /* __DECC */ globalvalue NEWS__KEYDEFERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__SETARCHERR ((int) news__setarcherr) extern int news__setarcherr(); #else /* __DECC */ globalvalue NEWS__SETARCHERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__FWDERR ((int) news__fwderr) extern int news__fwderr(); #else /* __DECC */ globalvalue NEWS__FWDERR; #endif /* __DECC */ #ifndef __DECC #define NEWS__ADDRSYNTX ((int) news__addrsyntx) extern int news__addrsyntx(); #else /* __DECC */ globalvalue NEWS__ADDRSYNTX; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOPARENT ((int) news__noparent) extern int news__noparent(); #else /* __DECC */ globalvalue NEWS__NOPARENT; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOMOREMATCH ((int) news__nomorematch) extern int news__nomorematch(); #else /* __DECC */ globalvalue NEWS__NOMOREMATCH; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOSUBJSPEC ((int) news__nosubjspec) extern int news__nosubjspec(); #else /* __DECC */ globalvalue NEWS__NOSUBJSPEC; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOCANCEL ((int) news__nocancel) extern int news__nocancel(); #else /* __DECC */ globalvalue NEWS__NOCANCEL; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOIGHDSPEC ((int) news__noighdspec) extern int news__noighdspec(); #else /* __DECC */ globalvalue NEWS__NOIGHDSPEC; #endif /* __DECC */ #ifndef __DECC #define NEWS__NEWGROUP ((int) news__newgroup) extern int news__newgroup(); #else /* __DECC */ globalvalue NEWS__NEWGROUP; #endif /* __DECC */ #ifndef __DECC #define NEWS__EOARTICLE ((int) news__eoarticle) extern int news__eoarticle(); #else /* __DECC */ globalvalue NEWS__EOARTICLE; #endif /* __DECC */ #ifndef __DECC #define NEWS__EOLIST ((int) news__eolist) extern int news__eolist(); #else /* __DECC */ globalvalue NEWS__EOLIST; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOTIMPL ((int) news__notimpl) extern int news__notimpl(); #else /* __DECC */ globalvalue NEWS__NOTIMPL; #endif /* __DECC */ #ifndef __DECC #define NEWS__NOOPNPROF ((int) news__noopnprof) extern int news__noopnprof(); #else /* __DECC */ globalvalue NEWS__NOOPNPROF; #endif /* __DECC */ #ifndef __DECC #define NEWS__ALRDYSUB ((int) news__alrdysub) extern int news__alrdysub(); #else /* __DECC */ globalvalue NEWS__ALRDYSUB; #endif /* __DECC */ #ifndef __DECC #define NEWS__HDRALRDY ((int) news__hdralrdy) extern int news__hdralrdy(); #else /* __DECC */ globalvalue NEWS__HDRALRDY; #endif /* __DECC */ #ifndef __DECC #define NEWS__EOGROUP ((int) news__eogroup) extern int news__eogroup(); #else /* __DECC */ globalvalue NEWS__EOGROUP; #endif /* __DECC */ #ifndef __DECC #define NEWS__MUSTMAIL ((int) news__mustmail) extern int news__mustmail(); #else /* __DECC */ globalvalue NEWS__MUSTMAIL; #endif /* __DECC */ #ifndef __DECC #define NEWS__CONNECTING ((int) news__connecting) extern int news__connecting(); #else /* __DECC */ globalvalue NEWS__CONNECTING; #endif /* __DECC */ #ifndef __DECC #define NEWS__RECONNECTING ((int) news__reconnecting) extern int news__reconnecting(); #else /* __DECC */ globalvalue NEWS__RECONNECTING; #endif /* __DECC */ #ifndef __DECC #define NEWS__UPDATING ((int) news__updating) extern int news__updating(); #else /* __DECC */ globalvalue NEWS__UPDATING; #endif /* __DECC */ #ifndef __DECC #define NEWS__USINGCURGROUP ((int) news__usingcurgroup) extern int news__usingcurgroup(); #else /* __DECC */ globalvalue NEWS__USINGCURGROUP; #endif /* __DECC */ #ifndef __DECC #define NEWS__ALRDYIGNORE ((int) news__alrdyignore) extern int news__alrdyignore(); #else /* __DECC */ globalvalue NEWS__ALRDYIGNORE; #endif /* __DECC */ #ifndef __DECC #define NEWS__MARKCOUNT ((int) news__markcount) extern int news__markcount(); #else /* __DECC */ globalvalue NEWS__MARKCOUNT; #endif /* __DECC */ #ifndef __DECC #define NEWS__NEWCOUNT ((int) news__newcount) extern int news__newcount(); #else /* __DECC */ globalvalue NEWS__NEWCOUNT; #endif /* __DECC */ #ifndef __DECC #define NEWS__CANCELLED ((int) news__cancelled) extern int news__cancelled(); #else /* __DECC */ globalvalue NEWS__CANCELLED; #endif /* __DECC */ #ifndef __DECC #define NEWS__SUBSCRIBED ((int) news__subscribed) extern int news__subscribed(); #else /* __DECC */ globalvalue NEWS__SUBSCRIBED; #endif /* __DECC */ #ifndef __DECC #define NEWS__GRPSET ((int) news__grpset) extern int news__grpset(); #else /* __DECC */ globalvalue NEWS__GRPSET; #endif /* __DECC */ #ifndef __DECC #define NEWS__ALLDONE ((int) news__alldone) extern int news__alldone(); #else /* __DECC */ globalvalue NEWS__ALLDONE; #endif /* __DECC */ #ifndef __DECC #define NEWS__SPAWNED ((int) news__spawned) extern int news__spawned(); #else /* __DECC */ globalvalue NEWS__SPAWNED; #endif /* __DECC */ #ifndef __DECC #define NEWS__DIDSUB ((int) news__didsub) extern int news__didsub(); #else /* __DECC */ globalvalue NEWS__DIDSUB; #endif /* __DECC */ #ifndef __DECC #define NEWS__DIDUNSUB ((int) news__didunsub) extern int news__didunsub(); #else /* __DECC */ globalvalue NEWS__DIDUNSUB; #endif /* __DECC */ G#~NEWSRDR_SRC.BCK)QP[NEWSRDR]NEWSRDR_DOC.SDML;80TQ*[NEWSRDR]NEWSRDR_DOC.SDML;80+,)Q./ @ 4T-P0123KPWO56t7878=Kj99G @HJz (NEWSRDR_DOC_1) (NEWSRDR User's Guide)��<ABSTRACT>(April, 1993)�L�<P>This manual describes NEWSRDR, an NNTP-based news reader for VMS systems. �<ENDABSTRACT>�*�<REVISION_INFO>(This is a revised manual.)D�<REVISION_INFO>(Operating System and Version:\VAX/VMS V5.0 or later; �OpenVMS Alpha AXP V1.0 or later)/�<REVISION_INFO>(Software Version:\NEWSRDR V4.2)�K�<ENDTITLE_PAGE>(Matthew Madison<LINE>TGV, Inc.<line>Santa Cruz, California)����<COPYRIGHT_PAGE>�<PRINT_DATE>(23 April 1993)�C�<p>Permission is granted to copy and redistribute this document for��no commercial gain.�H�<P>The information in this document is subject to change without notice :�and should not be construed as a commitment by the author.9�The author assumes no responsibility for any errors that ��may appear in this document.0�<p><emphasis>(DISCLAIMER:\bold) The author and8� TGV, Inc. make no representations or warranties withA� respect to the contents hereof and specifically disclaim any�Q� implied warranties of merchantability or fitness for any particular purpose.�A�<P>The following are trademarks of Digital Equipment Corporation:��<TABLE>�!�<TABLE_ATTRIBUTES>(SINGLE_SPACED)��<TABLE_SETUP>(3\20\20)�<TABLE_ROW>(AXP\DEC\OpenVMS)�<TABLE_ROW>(VAX\VMS\)� �<ENDTABLE>2�<p>MultiNet is a registered trademark of TGV, Inc.F�<COPYRIGHT_DATE>(1992, 1993\Matthew D. Madison. All Rights Reserved.)�<ENDCOPYRIGHT_PAGE>��<CONTENTS_FILE>��<PREFACE>(7\NEWSRDR_DOC_2)6�<P>USENET news is now pervasive even among VMS users. I�There are several news-related utilities available for VMS, some of which�O�provide full local storage of news and UUCP protocol support, and some of which�M�provide emulation of various network news readers available for UNIX systems.�K�<p>With the advent of NNTP, it becomes easier to gain access to USENET news�N�by using one local system to store news and using <quote>(remote) news readers�on other systems.�O�<p>The NEWSRDR utility provides an interface to USENET news that should be more�I�familiar to VMS users. NEWSRDR attempts to follow the conventions of the�M�VMS MAIL utility in its presentation and command structure whenever possible.�(�<head1>(Intended Audience\NEWSRDR_DOC_3)J�<p>This manual is intended for all users of the NEWSRDR utility and system;�managers responsible for installing and setting up NEWSRDR.�)�<head1>(Document Structure\NEWSRDR_DOC_4)�H�<p>This document consists of two parts. The first briefly describes howD�to use NEWSRDR. The second describes all of the NEWSRDR commands in�detail.�(�<head1>(Related Documents\NEWSRDR_DOC_5)H�<p>The reader is assumed to know something about USENET news, and shouldG�probably have as a reference Internet RFC 1036, <emphasis>(Standard for�=�Interchange of USENET Messages), which explains the structure�F�of USENET news articles. The system manager should also have RFC 977,N�<emphasis>(Network News Transfer Protocol), which describes NNTP news service.9�<PREFACE_SECTION>(New and Changed Features\NEWSRDR_DOC_6)�M�<p>NEWSRDR V4.2 includes the following new features and changes over previous� �versions:��<list>(unnumbered)I�<le>Added CURRENT/EDIT, to allow viewing of the current article using the�J�text editor. Also added CURRENT/FULL_HEADERS, to display the article with�all available headers included.�H�<le>Added SET [NO]AUTO_READ_NEW. By default the READ/NEW commands, whenJ�they run out of new articles in a newsgroup, visit the next newsgroup thatI�has new articles and immediately show you the first unseen article. When�E�NOAUTO_READ_NEW is set, the READ/NEW commands return you to the News>�'�prompt when they visit a new newsgroup.�E�<le>Added remaining lines information to the <quote>(Press RETURN for�.�more) message at the bottom of paged displays.G�<le>Added new system logical NEWSRDR_DISABLE_USER_REPLY_TO to allow the�I�system manager to prevent users from setting their own Reply-To addresses�'�with the NEWSRDR_REPLY_TO logical name.�E�<le>Added /NEW qualifier to READ/THREAD, to allow reading only unseen��articles within a thread.�E�<le>Added some smarts to address-parsing routines so if a user enters�J�an address prefixed with the MAIL protocol string (like SMTP%"user@host"),+�NEWSRDR extracts the address out correctly.�K�<le>Added /MAIL qualifier to SET PERSONAL_NAME to allow users to have their�L�personal name for NEWSRDR be the same as their VMS MAIL personal name. This1�is now the default setting for new NEWSRDR users.�G�<le>Added support for locating new newsgroups in the absence of support�I�for NEWGROUPS on the NNTP server. Also added SET NEWGROUP_ACTION command�J�to allow users to get subscribed to new newsgroups automatically, or to be�prompted to subscribe.5�<le>Added automatic, transparent server reconnection.�H�<le>Added a new logical name to allow system managers to set up accounts0�that have read-only access to news (no posting).M�<le>Added the SET FORCE_MAIL_PROTOCOL command to force all mail to go through�P�the VMS MAIL foreign protocol handler, even when an address appears to be local. �<endlist>�+�<head1>(Changes Made in V4.1\pref_v41_info)�J�<p>NEWSRDR V4.1 included the following new features and changes over V4.0:�<list>(unnumbered)H�<le>The program has been retro-fitted to be compatible with VMS V5.0 and�V5.1.�F�<le>The /THREAD qualifier can now be used with the SET UNSEEN command.L�<le>A new qualifier, /SUBJECT, has been added to the SET SEEN and SET UNSEENI�commands. This qualifier can be used to mark articles with subject lines�J�containing specific text. VMS wildcard patterns can be used for matching.J�<le>A new qualifier, /CROSS_REFERENCES, has been added to the SET SEEN andJ�SET UNSEEN commands. This qualifier causes the Xref header in each markedJ�article to be looked up and all articles listed therein to be marked also. �<endlist>��<MARK>;�<p>Revision bars, like the one in the margin, highlight the�*�new features and changes in this document. �<ENDMARK>�+�<head1>(Changes Made in V4.0\pref_v40_info)�H�<p>NEWSRDR V4.0 incorporated the following new features and changes from�previous releases:�<list>(unnumbered)H�<le>The entire program has been rewritten in C, and runs on both VAX/VMS�and OpenVMS Alpha AXP systems.G�<le>The SET NEWSRC command has been added, for users who use other news�L�readers in addition to NEWSRDR. NEWSRDR will use the contents of the newsrcD�file to maintain subscription status and article-seen status for allE�newsgroups, and to control the order in which newsgroups are visited.�H�<le>The SET QUEUE and SET FORM commands have been added, which allow theJ�user to specify the default print queue and form to use on PRINT commands.H�<le>The SET DIRECTORY_WIDTH command has been added, to allow the user toB�control the widths of the From and Subject fields displayed by theE�DIRECTORY command. In addition, zero field widths are now supported.�I�<le>The DIRECTORY command display now includes the number of lines in the�@�article (if available), and no longer displays ignored articles.F�<le>READ/NEXT/NEW now behaves correctly after manually changing groups�with the GROUP command.�G�<le>A message displaying the group name, available articles, and unseen�E�article count is now produced when the group is changed with GROUP or��by READ/NEXT/NEW.�G�<le>A user with SETPRV or SYSNAM privilege can override the system-wide�O�NEWSRDR_SERVER setting for herself by defining that logical name in the process��logical name table.�K�<le>You can now use a dot to refer to the current article in those commands��which take article ranges.L�<le>The /GOTO qualifier has been added to the SUBSCRIBE command, which makes!�the subscribed newsgroup current.�H�<le>The /SORT qualifier has been added to the DIRECTORY/GROUP command toJ�cause the group listing to be displayed in alphabetical order (only needed$�with user-specified group ordering).'�<le>Other minor improvements and fixes.� �<endlist>�I�<note>Due to the rewrite, the character-conversion interface has changed.�P�Please refer to the KANJI_CONVERSION module included in the NEWSRDR distribution�kit as an example. �<endnote>� �<ENDPREFACE>�<ENDFRONT_MATTER>�&�<chapter>(Using NEWSRDR\NEWSRDR_DOC_7)P�<p>NEWSRDR is designed to be executed as a VMS <quote>(foreign) command. To setM�up the command symbol, you need to know where the NEWSRDR executable image is��located for the command: �<interactive>�*�<s>($ )<U>(NEWSRDR :== $disk:[dir]NEWSRDR)�<endinteractive>F�<p>Once the symbol is set up, you can invoke NEWSRDR with the command: �<interactive>��<s>($ )<U>(NEWSRDR)��<endinteractive>K�<p>The NEWSRDR command can take one qualifier: /[NO]UPDATE. The default is�F�/UPDATE=FULL, which causes NEWSRDR to obtain information from the NNTP&�server about all available newsgroups.:�You can specify /UPDATE=PARTIAL, which has the same effectM�as the UPDATE/PARTIAL command, or /NOUPDATE, to have no updates occur at all.��<p>�G�You can also specify /UPDATE=BOTH, which causes a full update to occur,�I�immediate followed by a partial update. This may be needed at some sites�H�where the news server's <quote>(active) file is not kept up-to-date withG�the low-bound article number for its newsgroups. If you get extraneous�I�<quote>(new articles) messages with the default NEWSRDR update behaviour,�>�using /UPDATE=BOTH should eliminate those extraneous messages.��7�<head1>(Using NEWSRDR for the First Time\NEWSRDR_DOC_8)�I�<p>If you have never used NEWSRDR before, NEWSRDR will inform you that it�H�cannot find a NEWSRDR profile and that it will create one for you. YourM�NEWSRDR profile contains information about which editor you use for composing�F�messages, which article headers you wish to see when reading articles,L�and which newsgroups you are subscribed to. It is by default placed in your3�login directory and is called NEWSRDR_PROFILE.NRPF.�M�<p>To start reading news, the first thing you will need to do is to subscribe�C�to one or more newsgroups. If you already know what newsgroups are�L�available and which ones you want to subscribe to, you can use the SUBSCRIBE/�command right away to subcribe to those groups:� �<interactive>�3�<s>(News> )<U>(SUBSCRIBE newsgroup [,newsgroup...])��<endinteractive>M�<cp>You can use wildcards in the newsgroup names to subscribe to a collection�$�of newsgroups with a single command.L�<p>If you want to look at the list of available newsgroups, use the command: �<interactive>�#�<s>(News> )<U>(DIRECTORY/GROUP/ALL)��<endinteractive>H�<p>Once you have subscribed to the newsgroups you are interested in, youL�should next use the EXIT command to leave NEWSRDR and save your subscriptionJ�information in your profile. When you next start NEWSRDR, you'll be ready�to begin reading news.0�<head2>(Cancelling a Subscription\NEWSRDR_DOC_9)G�<p>The UNSUBSCRIBE command (format the same as for SUBSCRIBE, above) is�-�used to cancel a subscription to a newsgroup.�(�<head1>(Reading New News\NEWSRDR_DOC_10)G�<p>Once you have subscribed to some newsgroups, information about which�M�articles you have seen in those newsgroups is stored in your NEWSRDR profile.� �The command� �<interactive>��<s>(News> )<U>(READ/NEW)�<endinteractive>G�<cp>is used to start reading news articles you have not yet seen. This�F�command is executed by default if you simply press RETURN at the first+�NEWSRDR command prompt, much like VMS MAIL.�L�<p>News articles are presented in a page-by-page format, also like VMS MAIL.�At the bottom of each page,��<MARK>4�the number of remaining lines in the article and the �<ENDMARK>�.�message <quote>(Press RETURN for more...) willH�appear. Simply pressing the RETURN key will cause the next page of the I�article to be displayed. If you wish to skip to the next unseen article,�I�you can use the READ/NEXT/NEW (or just NEXT) command. At the end of each�C�article, just pressing RETURN will have the same effect as entering��READ/NEXT/NEW./�<head2>(Redisplaying an Article\NEWSRDR_DOC_11)�+�<p>The CURRENT command is used to redisplay�I�the article you are currently viewing from the beginning. If the article�H�is encoded with the ROT13 cipher (sometimes done for articles containingF�potentially sensitive or offensive material), you can read the encoded%�text with the command CURRENT/ROTATE.�*�<head2>(Following a Thread\NEWSRDR_DOC_12)=�<p>You can use the READ command to follow a discussion thread�4�within a newsgroup. While reading an article, enter �<interactive>��<s>(News> )<u>(READ/THREAD)��<endinteractive>E�<p>to cause NEWSRDR to scan forward through the newsgroup, displaying�M�those articles that contain the same subject as the article you are currently�A�reading. Once started, just press RETURN to continue reading the�E�thread. When there are no more articles with matching subject lines,�F�the current article is set back to the first article in the thread, so,�you can continue reading where you left off.*�<head2>(Reading by Subject\NEWSRDR_DOC_13)E�<p>If you wish to read articles on a group of topics, you can use the�F�READ/SUBJECT command to specify one or more wildcard patterns to match*�subject headers. For example the command, �<interactive>�*�<s>(News> )<u>(READ/SUBJECT=(*DEC*,*VAX*))�<endinteractive>H�<p>would cause NEWSRDR to scan forward through the newsgroup, displayingJ�those articles whose subject headers contain <quote>(DEC) or <quote>(VAX).I�<p>Once the first matching article is displayed, just pressing the RETURN�I�key will page through the article and continue the subject scan using the�K�same patterns. If you don't want to see an entire article, use the command� �<interactive>��<s>(News> )<u>(READ/SUBJECT)�<endinteractive>J�<p>to move ahead to the next matching article. Once all matching articlesD�have been found, the patterns are cleared and the current article is?�set back to where you were before doing the first READ/SUBJECT.�)�<head1>(Skipping Articles\NEWSRDR_DOC_14)�H�<p>If you have just subscribed to a particularly busy newsgroup, you mayF�wish to skip over all the articles already posted to the newsgroup and9�read only those that are posted from now on. The command� �<interactive>�2�<s>(News> )<U>(SET SEEN [/ALL] [article-range...])�<endinteractive>I�<cp>can be used to mark articles in a newsgroup as <quote>(seen), so they�I�will not show up when you use READ/NEW. You can specify /ALL to mark all�K�available articles as seen, or you can specify the articles to be marked by�6�number (or use a dot to refer to the current article).<�A range of articles can be specified by giving the number ofF�the first and last article in the range separated by a hyphen (such asK�<quote>(23-45). Multiple numbers or ranges can be given by separating them� �with commas.B�<p>You can also use SET SEEN to skip over a collection of articles;�related to one topic. When reading an article, the command� �<interactive>��<s>(News> )<u>(SET SEEN/THREAD)��<endinteractive>I�<p>can be used to skip all further articles in the newsgroup with subject�G�text that contains the subject of the article you're currently reading.�<�<head1>(Marking Articles for Later Reference\NEWSRDR_DOC_15)C�<p>If you have read an article or a group of articles that you want�I�to come back to later, you can mark the articles <quote>(unseen) with the��SET UNSEEN command:� �<interactive>�4�<s>(News> )<U>(SET UNSEEN [/ALL] [article-range...])�<endinteractive>H�<p>If you don't specify /ALL or any article numbers, the current article�is marked <quote>(unseen).>�<head1>(Permanently Ignoring Topics or Authors\NEWSRDR_DOC_16)K�<p>If you wish to follow a newsgroup but are not interested in a particular�B�topic being discussed in the newsgroup, you can use the SET IGNORED�command to permanently ignore articles with subject lines containing�particular text: �<interactive>�7�<s>(News> )<u>(SET IGNORE [/GLOBAL] /SUBJECT="pattern")��<endinteractive>O�<p>The <emphasis>(pattern) you specify can contain VMS wildcards. Any articles�I�in the newsgroup with subjects matching the pattern will automatically be�A�skipped and marked <quote>(seen). If you wish to ignore matching�5�articles in any newsgroup, use the /GLOBAL qualifier.�G�<p>If you wish to ignore articles posted by a particular person, rather�G�than about a particular subject, use the /FROM qualifier on SET IGNORE:� �<interactive>�4�<s>(News> )<u>(SET IGNORE [/GLOBAL] /FROM="pattern")�<endinteractive>F�<p>Any article with a From line matching the specified pattern will be�ignored.G�<p>You can also ignore articles that are cross-posted to newsgroups youNF�aren't interested in by using the /NEWSGROUPS qualifier on SET IGNORE.0�<head2>(Removing Ignore Settings\NEWSRDR_DOC_17)H�<p>Ignore settings are kept in your NEWSRDR profile. After a particularJ�thread or author has died down, you may wish to remove the ignore settings.�for a newsgroup with the SET NOIGNORE command: �<interactive>tE�<s>(News> )<u>(SET NOIGNORE [/GLOBAL] [/FROM="pat"] [/SUBJECT="pat"])P�<endinteractive>J�<p>You can find out what the ignore settings are for the current newsgroup�with the SHOW IGNORE command.t1�<head1>(Reading Specific Articles\NEWSRDR_DOC_18)eL�<p>To read a particular article in a particular newsgroup, you first have to,�select the newsgroup with the GROUP command: �<interactive>a!�<s>(News> )<U>([GROUP] groupname)t�<endinteractive>+�<p> (Note that the word GROUP is optional.)iG�You can then use the READ command, specifying the number of the articlel�you wish to read:k �<interactive>u$�<s>(News> )<U>([READ] articlenumber)�<endinteractive>*�<P> (Note that the word READ is optional.)D�If you are not sure of the article number, you can use the DIRECTORYN�command to obtain a listing of articles, including the article number, address2�of the article poster, and subject of the article: �<interactive>E<�<s>(News> )<U>(DIRECTORY [/SEEN] [/UNSEEN] [article-number])�<endinteractive>L�<cp>If you specify an article number on the DIRECTORY command, the directoryE�listing begins with the specified article. Otherwise, the directory E�listing begins with the article you are currently reading, or, if youa>�haven't read any articles, the first article in the newsgroup.N�<p>Directory listings are presented in a paged format just like news articles.'�<head1>(Saving Articles\NEWSRDR_DOC_19)oC�<p>You can save the text of any article or range of articles into aT"�VMS file with the EXTRACT command: �<interactive> D�<s>(News> )<U>(EXTRACT [/[NO]APPEND] [file-spec] [article-range...])�<endinteractive>C�<p>If you omit the file-spec, the file name defaults to the current\C�newsgroup name (with special characters translated to underscores),D$�and /APPEND is turned on by default.�You can specify a singleH�article by number or an entire range or articles (see the description ofK�SET SEEN, above, for a description of article ranges). Multiple numbers orRH�ranges can be specified, separated by commas. If you do not specify anyA�article number at all, the current article is copied to the file.sE�You must specify a file-spec if you want to specify an article range.t)�<head1>(Printing Articles\NEWSRDR_DOC_20)nF�<p>You can send any article or range of articles to a print queue with�the PRINT command: �<interactive>s(�<s>(News> )<U>(PRINT [article-range...])�<endinteractive>�<p>You can specify a singlePH�article by number or an entire range or articles (see the description ofK�SET SEEN, above, for a description of article ranges). Multiple numbers oruH�ranges can be specified, separated by commas. If you do not specify anyE�article number at all, the current article is added to the print job.FE�<p>A single print job is maintained by NEWSRDR for all articles to bedH�printed. The print job is released when you exit NEWSRDR or you use theL�PRINT/NOW command. You can cancel a pending print job with the PRINT/CANCEL�command.G�<p>The PRINT command has several options for controlling the print job;O=�see the complete command description for further information.�1�<head2>(Specifying PRINT Defaults\print_defaults)eC�<p>You can define a default print queue with the SET QUEUE command: �<interactive>b$�<s>(News> )<u>(SET QUEUE queue-name)�<endinteractive>I�<cp>This will direct subsequent print jobs to the specified queue, rather �than to SYS$PRINT.F�<p>You can also define the default form to be used for print jobs with �SET FORM:a �<interactive>T"�<s>(News> )<u>(SET FORM form-name)�<endinteractive>?�<cp>Use SET NOFORM to revert to using the queue's form default.iO�<p>Both of these settings can be overridden by using the appropriate qualifierssF�on the PRINT command. The settings are saved in your NEWSRDR profile.(�<head1>(Posting Articles\NEWSRDR_DOC_21)I�<p>The POST command is used to post an article to one or more newsgroups:I �<interactive>.D�<s>(News> )<U>(POST [/EDIT] [/[NO]SUBJECT="subject"] [groupname...])�<endinteractive>D�<cp>If you omit the <quote>(groupname), the article is posted to theG�current newsgroup. The /EDIT qualifier is used to invoke a text editor G�to compose the article (see the description of the SET command, below).bH�The /SUBJECT qualifier can be used to specify or omit a subject line forL�the article. If you do not use the /SUBJECT qualifier, you will be prompted�for a subject line.pP�<p>Once you have been prompted for the text of your news article, or if editing,G�you have saved the article text with the text editor, you will be askedrL�if you really want to post the article. If you answer <quote>(yes), or justM�press the RETURN key, the article will be posted. If you answer <quote>(no),u�the article will not be posted.eI�<p>If you decide not to post an article, or the article posting fails for J�some reason, you will be given the opportunity to keep the file containing�the article text you entered.e��)�<head2>(Followup Articles\NEWSRDR_DOC_22)lG�<p>A followup article is a reply to a specific article which can eitheriG�be posted or mailed to the author of the original article. You must befJ�reading an article to send a reply. REPLY (or FOLLOWUP) command is used to�compose and send replies: �<interactive> P�<s>(News> )<U>(REPLY [/MAIL] [/POST] [/EDIT] [/NOEXTRACT] [/[NO]SUBJECT="text"])�<endinteractive>J�<p>By using the /POST and /MAIL qualifiers, you can post your reply to theK�newsgroup, send it by mail, or both. If you do not specify /MAIL or /POST, �the reply is posted.H�The /EDIT and /SUBJECT qualifiers mean the same as for the POST command.K�If you use an editor to compose the reply, the text of the original articletN�is automatically placed in the reply (prefixed with greater-than signs) beforeK�the editor is invoked. The /NOEXTRACT qualifier can be used to prevent thist�from occurring.N-�<head2>(Cancelling an Article\NEWSRDR_DOC_23)eL�<p>If you post an article that you wish you hadn't, you can have the article9�removed from the news system by using the CANCEL command:� �<interactive>U�<s>(News> )<u>(CANCEL [artnum]) �<endinteractive>G�<p>You must either specify the article number or be reading the articlem8�you wish to cancel in order to issue the CANCEL command.��-�<head1>(Sending Mail Messages\NEWSRDR_DOC_24) J�<p>You can use the MAIL (or SEND) command to send messages to other users,?�which has much the same format as the SEND command in VMS MAIL:i �<interactive>dI�<s>(News> )<U>(MAIL [/EDIT] [/TO=(address...)] [/SUBJECT="subj"] [fspec])a�<endinteractive>L�<p>The only difference between this command and the VMS MAIL SEND command isO�the use of the /TO qualifier to specify the destination(s) of the mail message.eJ�If you omit the /TO qualifier, you will be prompted for the address(es) of�the recipient(s)./L�<p><emphasis>(Note\bold) that mail addresses within NEWSRDR are NOT the sameE�as for VMS MAIL, but are addresses used by your Internet mailer. ForeI�example, if you use PMDF's <quote>(IN%) prefix to direct mail to InternettE�addresses from VMS MAIL, you would <emphasis>(not) use that prefix inlQ�NEWSRDR; NEWSRDR will tack the prefix onto the address for you automatically whensL�sending your message through VMS MAIL. You also need to use quotation marksL�around addresses only if you specify them with the /TO qualifier on the MAIL�command.(�<head1>(Profile Settings\NEWSRDR_DOC_25)Q�<p>NEWSRDR has several settings which you can change with the SET command. TheseiT�settings are saved in your NEWSRDR profile, preserved between NEWSRDR sessions. YouK�can display the current settings with the SHOW ALL command, which will alsoeO�display the node name of the news server and the name of the current newsgroup.N%�<head2>(Personal Name\NEWSRDR_DOC_26)VJ�<p>Just as VMS MAIL allows you to set up a <quote>(personal name) which isJ�included with your address on your outgoing mail, NEWSRDR allows you to do�on news articles you post: �<interactive>E-�<s>(News> )<U>(SET PERSONAL_NAME "your name") �<endinteractive>8�<cp>You may use any name you like as your personal name.'�<head2>(Article Headers\NEWSRDR_DOC_27)RK�<p>News articles are generally accompanied by large numbers of header linesLE�which identify various aspects of the articles, some of which you mayt"�not be interested in. The command �<interactive>=-�<s>(News> )<U>(SET HEADERS [NO]headername...)T�<endinteractive>I�<cp>is used to turn on or off the display of particular header lines whenyD�you read subsequent articles. The header names you can specify are:D�FROM, DATE, NEWSGROUPS, SUBJECT, MESSAGE_ID, PATH, REPLY_TO, SENDER,G�FOLLOWUP_TO, EXPIRES, REFERENCES, DISTRIBUTION, ORGANIZATION, KEYWORDS,oI�APPROVED, LINES, and XREF. Specifying NO in front of a header name turns '�off its display in subsequent messages.D6�<head2>(Automatic Editing, Editor Name\NEWSRDR_DOC_28)K�<p>If you would like to use a text editor every time you compose an articleRE�or mail message, you can use the SET EDIT command to enable automaticr�editing: �<interactive>n8�<s>(News> )<U>(SET [NO]EDIT [/EDITOR=(editorname,CALL)])�<endinteractive>F�<cp>If you use SET EDIT, the text editor will automatically be invokedN�for every POST, REPLY, and MAIL command, unless you use the /NOEDIT qualifier.?�You can turn off automatic editing with the SET NOEDIT command.�J�<p>In either case, you can specify which text editor you would like to useK�with the /EDITOR qualifier. Any callable editor may used; TPU (a.k.a. EVE)gG�is the default. VMS comes with one other callable editor: EDT. The DECsO�Language-Sensitive Editor (LSE), if installed on your system, can also be used.i@�There may also be other callable editors available at your site.A�<p>If the editor you wish to use is not callable, you can insteaddC�set up a command procedure to be spawned as a subprocess which will �invoke the editor: �<interactive>aC�<s>(News> )<U>(SET [NO]EDIT [/EDITOR=("@command-procedure",SPAWN)])t�<endinteractive>M�<p>The command procedure must be of the form shown in <reference>(spawnproc).o!�<head2>(Signature\NEWSRDR_DOC_29)iL�<p>Some people like to have a standard <quote>(signature) be included at theL�end of each article they post. This signature usually contains the person'sG�name, E-mail address, company name, and a disclaimer of some kind. TheOI�SET SIGNATURE command allows you to specify the name of a file to be usedi@�as a signature for articles you post and mail messages you send: �<interactive>R+�<s>(News> )<U>(SET [NO]SIGNATURE file-spec)m�<endinteractive>G�<cp>The specified file should contain no more than eight lines of text,dJ�each line containing no more than 80 characters. The contents of the fileG�will automatically be appended to every article you post and every mailhM�message you send through NEWSRDR. Use the SET NOSIGNATURE command to disableT"�the inclusion of a signature file.$�<head1>(Subprocesses\NEWSRDR_DOC_30)K�<p>NEWSRDR provides SPAWN and ATTACH commands for creating and moving amongtG�subprocesses. These commands are patterned after their counterparts ina �VMS MAIL.D#�<head1>(Keypad Keys\NEWSRDR_DOC_31)fE�<p>NEWSRDR provides a DEFINE/KEY command for defining keys to performeG�NEWSRDR commands. This command is also patterned after its counterpartnH�in VMS MAIL. In addition, you can create a file containing a collectionB�of DEFINE/KEY commands to be loaded each time NEWSRDR is executed.C�The file should be placed in your SYS$LOGIN directory and should beiO�called NEWSRDR_KEYDEFS.NRKEY. Alternatively, you can place the key definitionsoD�in another file and assign the name of that file to the logical name�NEWSRDR_KEYDEFS.5�<head1>(Setting Your Reply-To Address\NEWSRDR_DOC_32)aI�<p>Typically, when you post an article, the <quote>(From) address that ishL�entered in the article is used to address E-mail for replies that are mailedJ�directly to you. If you prefer to have replies sent to a different E-mailG�address, you can define a logical name containing your preferred E-mailH�address: �<interactive>�7�<s>($ )<u>(DEFINE NEWSRDR_REPLY_TO "username@hostname"),�<endinteractive>G�<p>No syntax checking is performed on this address, so you must specify�K�your address carefully. Also, please note that some systems do not use the #�Reply-To header to address replies. �<mark>�<note><�Your system manager can prevent you from using this feature. �<endnote>e �<endmark> &�<head1>(Header Caching\NEWSRDR_DOC_33)I�<p>Some NEWSRDR commands, such as READ/THREAD, require access to articleeJ�headers for their operation. To cut down on network and news server load,N�and generally improve performance over multiple uses of these header-intensiveG�commands, article headers are cached in memory by NEWSRDR when they aretA�retrieved from the server. By default, up to 128 sets of headers F�may be cached at once. However, you can control the header cache sizeH�by defining the logical name NEWSRDR_HEADER_CACHE_SIZE to be the maximum?�number of sets of headers you wish to have cached. For example:t �<interactive> 0�<s>($ )<u>(DEFINE NEWSRDR_HEADER_CACHE_SIZE 256)�<endinteractive>E�<p>This will cause NEWSRDR to hold up to 256 sets of article headers.dK�<p>Please note that the header cache works on a per-group basis only. ThisnJ�means that it works best when you do all your work in one group at a time,A�rather than jumping around to different newsgroups, reading a fewT�articles at a time.A3�<head1>(Moving Your NEWSRDR Profile\moving_profile)b8�<p>By default, NEWSRDR expects your profile to be called?�NEWSRDR_PROFILE.NRPF and to be located in your login directory.o?�You can alter this by defining the logical name NEWSRDR_PROFILEe;�to be the full file specification for your NEWSRDR profile:n �<interactive>>,�<s>($ )<u>(DEFINE NEWSRDR_PROFILE file-spec)�<endinteractive>B�<p>Add the logical name definition to your login command procedure,�to have it take effect each time you log in..�<head1>(Using a NEWSRC File\using_newsrc_file)H�<p>By default, all information about newsgroups you subscribe to and theG�articles you have seen in those groups is kept in your NEWSRDR profile. F�You may additionally have that information stored in a <quote>(newsrc):�file. There are two main reasons for using a newsrc file:�<list>(numbered)G�<le>You use another news reader besides NEWSRDR an������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$�����������������������������~�����NEWSRDR_SRC.BCK����������������)Q��P��[NEWSRDR]NEWSRDR_DOC.SDML;80���������������������������������������������������������������������������������������������������T�������������������������������|�����>�������d you want to be able H�to use either and maintain the same subscription/article information for<�both. Most other news readers use a newsrc file by default.J�<le>You want to be able to control the order in which you visit newsgroups�during your NEWSRDR session. �<endlist>gD�<p>You specify the use of a newsrc file with the SET NEWSRC command: �<interactive> 9�<s>(News> )<u>(SET NEWSRC [file-spec] [/SUBSCRIBED_ONLY])a�<endinteractive>N�<cp>If you omit the file-spec, it defaults to SYS$LOGIN:XX.NEWSRC. SpecifyingL�the /SUBSCRIBED_ONLY qualifier causes NEWSRDR to include only the newsgroupsJ�you subscribe to in the newsrc file; by default, all newsgroups are listedM�(for compatibility with other news readers). Use the SET NONEWSRC to disableR�the use of a newsrc file. L�<p>NEWSRDR reads in your newsrc file after reading your NEWSRDR profile, andN�updates the subscription and article information. On exiting, NEWSRDR updatesK�the newsrc file after updating your NEWSRDR profile. It will not overwrite(?�an existing newsrc file, but will instead create a new version.t+�<head2>(Specifying Newsgroup Order\specngo)cF�<p>The newsrc file is a plain text file which can be modified with anyN�VMS text editor. You can specify the order in which NEWSRDR visits newsgroupsJ�by rearranging the lines in the newsrc file. Be careful not to change theM�contents of the lines as you rearrange them; only news reader programs shouldr�make such changes.�<part> �<part_page>u%�<title>(Part II\Command Descriptions)��<endpart_page>(RENUMBER)+�<COMMAND_SECTION>(Command Descriptions\CMD)e2�<SET_TEMPLATE_COMMAND>(COMMAND\DOUBLERUNNINGHEADS)��!�<COMMAND>(ATTACH\\NEWSRDR_DOC_34)g�� �<OVERVIEW>+�Switches control of your terminal from youre3�current process to another process in the same job.h �<ENDOVERVIEW>u���<FORMAT>�<FCMD>(ATTACH)�<FPARMS>([process-name]) �<ENDFORMAT>C �<QUAL_LIST>r�<QPAIR>(/PARENT\) �<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(process-name)h �<PARAMDEF>G�Name of the process to which the connection is to be made. The processe0�must be in the same job as your current process.�<ENDPARAMDEFLIST>/�� �<DESCRIPTION>aG�This command is a parallel to the DCL ATTACH command. It allows you tonM�transfer your terminal to another subprocess in your job by name, or directlya5�to the process which created your current subprocess.e�<ENDDESCRIPTION>�� �<QUALDEFLIST>u�<QUALITEM>(/PARENT)r �<QUALDEF>�K�Specifies that your terminal should be attached to the process that created[I�the subprocess to which your terminal is currently attached. This is theo(�default if no process name is specified.�<ENDQUALDEFLIST>���<COMMAND>(BACK\\back_cmd)h �<OVERVIEW>�Synonym for READ/PREVIOUS. �<ENDOVERVIEW>l���<FORMAT> �<FCMD>(BACK) �<FPARMS>() �<ENDFORMAT> �� �<DESCRIPTION>)F�Please see the description of the READ command (<reference>(read_cmd))�for further information.�<ENDDESCRIPTION>��!�<COMMAND>(CANCEL\\NEWSRDR_DOC_35)f �<OVERVIEW>E�Cancels an article by sending a cancel control message to the server.R �<ENDOVERVIEW>[���<FORMAT>�<FCMD>(CANCEL)�<FPARMS>([artnum]) �<ENDFORMAT>i���<PARAMDEFLIST>�<PARAMITEM>(artnum)o �<PARAMDEF>E�Article number of the article to be cancelled. If not specified, theiH�current article is cancelled. You should only cancel those articles for�which you are the author.t�<ENDPARAMDEFLIST>t�� �<DESCRIPTION>rG�This command constructs and posts a Usenet control message that cancelss�the specified article.�<ENDDESCRIPTION>��"�<COMMAND>(CURRENT\\NEWSRDR_DOC_36)�� �<OVERVIEW>2�Redisplays the current article from the beginning. �<ENDOVERVIEW>i���<FORMAT>�<FCMD>(CURRENT)E �<FPARMS>() �<ENDFORMAT>e �<QUAL_LIST>l�<MARK>�<QPAIR>(/EDIT\)t�<QPAIR>(/FULL_HEADERS\)f �<ENDMARK>h�<QPAIR>(/ROTATE\)s�<ENDQUAL_LIST> �<DESCRIPTION>eF�While reading an article, if you are paged part or all the way throughI�the article, the CURRENT command will rewind the article to the beginningi�and redisplay the first page.e�<ENDDESCRIPTION> �<QUALDEFLIST>r�<QUALITEM>(/EDIT)r�<MARK> �<QUALDEF>tE�Displays the article using a text editor (the one set with SET EDIT). ���<QUALITEM>(/FULL_HEADERS)u �<QUALDEF>,N�Includes all available headers in the article display, not just those selected�with SET HEADERS.n �<ENDMARK>n���<QUALITEM>(/ROTATE)A �<QUALDEF>SK�Applies the ROT13 cipher to the article text before display. Some articlesu?�are enciphered with ROT13 because they may contain sensitive or[D�offensive material, leaving it up to the reader to determine whether-�the article warrants deciphering and reading.(�<ENDQUALDEFLIST>��%�<COMMAND>(DEFINE/KEY\\NEWSRDR_DOC_37)o �<OVERVIEW>+�Defines a key to execute a NEWSRDR command.p �<endoverview>t�<FORMAT>�<FCMD>(DEFINE/KEY)�<FPARMS>(key-name string)a �<ENDFORMAT>r �<QUAL_LIST>i�<QPAIR>(/[NO]ECHO\/ECHO)�<QPAIR>(/IF_STATE=state-list\)&�<QPAIR>(/[NO]LOCK_STATE\/NOLOCK_STATE)*�<QPAIR>(/[NO]SET_STATE=state\/NOSET_STATE)$�<QPAIR>(/[NO]TERMINATE\/NOTERMINATE)�<ENDQUAL_LIST>���<PARAMDEFLIST>�<PARAMITEM>(key-name) �<paramdef>B�Specifies the name of the key you are defining. Use the following�key names when defining keys:e�<table>d�<table_setup>(3\20\15)+�<table_heads>(Key name\VT100 key\LK201 key)u�<table_row>(PF1\PF1\PF1)�<table_row>(PF2\PF2\PF2)�<table_row>(PF3\PF3\PF3)�<table_row>(PF4\PF4\PF4)/�<table_row>(KP0, KP1-KP9\keypad 0-9\keypad 0-9)e/�<table_row>(PERIOD\keypad period\keypad period)o,�<table_row>(COMMA\keypad comma\keypad comma),�<table_row>(MINUS\keypad minus\keypad minus)&�<table_row>(ENTER\ENTER key\Enter key)�<table_row>(E1, FIND\n/a\Find),�<table_row>(E2, INSERT_HERE\n/a\Insert Here)"�<table_row>(E3, REMOVE\n/a\Remove)"�<table_row>(E4, SELECT\n/a\Select),�<table_row>(E5, PREV_SCREEN\n/a\Prev Screen),�<table_row>(E6, NEXT_SCREEN\n/a\Next Screen)�<table_row>(HELP\n/a\Help)�<table_row>(DO\n/a\Do) �<table_row>(F17-F20\n/a\F17-F20) �<endtable>�<paramitem>(string)s �<paramdef>E�Specifies the string you want entered when you press the defined key.>�<endparamdeflist>]�� �<description>]@�This command is implemented by passing the entire command to theF�VMS Screen Management (SMG) routines for processing by SMG$DEFINE_KEY.*�NEWSRDR does no processing on the command.?�<p>Key definitions are not remembered between NEWSRDR sessions.oD�To have keys defined automatically each time you run NEWSRDR, createK�a file containing DEFINE/KEY commands called NEWSRDR_KEYDEFS.NRKEY, located F�in SYS$LOGIN. Alternatively, you can call the file something else and>�define the logical name NEWSRDR_KEYDEFS to point to that file.�<enddescription>�� �<qualdeflist> �<qualitem>(/[NO]ECHO)r �<qualdef>tG�Specifies whether the command line is echoed when you press the definedND�key. You cannot specify both /NOECHO and /NOTERMINATE. The default �is /ECHO.n �<qualitem>(/IF_STATE=state-list)F�<qualdef>Specifies one or more states, any one of which must be set in:�order to enable the specified key definition. If you omitD�this qualifier, the current state is used. To specify more than oneF�state, separate the state names with commas and surround the list with �parentheses.�<qualitem>(/[NO]LOCK_STATE)oE�<qualdef>Causes the state specified by the /SET_STATE qualifier to ber5�permanently retained when the defined key is pressed.nD�The state is retained until changed by using another key that sets aH�state. If omitted or negated, the specified state is retained only until�you press another key. �<qualitem>(/[NO]SET_STATE=state)@�<qualdef>Establishes a state that is set when the defined key isA�pressed. A state name can be any alphanumeric string. The stateaE�lasts for one further keypress only, unless /LOCK_STATE is specified. A�If you omit or negate this qualifier, the state remains unchangedlD�when the defined key is pressed. You cannot specify both /SET_STATE�and /TERMINATE..�<qualitem>(/[NO]TERMINATE)D�<qualdef>Determines whether the specified command string is executedC�when the defined key is pressed. If not terminated, you must pressaD�RETURN for the command to be executed. The default is /NOTERMINATE.�<endqualdeflist>��$�<COMMAND>(DIRECTORY\\NEWSRDR_DOC_38)�� �<OVERVIEW>:�Lists information about articles in the current newsgroup. �<ENDOVERVIEW>n���<FORMAT>�<FCMD>(DIRECTORY)c�<FPARMS>([article-number]) �<ENDFORMAT>� �<QUAL_LIST>d�<QPAIR>(/GROUP\),�<QPAIR>(/EXCLUDE=(keyword=(pattern...)...)\)�<QPAIR>(/FROM=(pattern...)\)�<QPAIR>(/KEYWORD=(keyword...)\)t�<QPAIR>(/SUBJECT=(pattern...)\)d�<QPAIR>(/SEEN\)i�<QPAIR>(/UNSEEN\)e�<QPAIR>(/WIDTH=(keyword...)\)r�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(article-number)e �<PARAMDEF>E�Number of the article which should be first in the directory listing.tF�If omitted, the directory listing begins with the current article, or,C�if there is no current article, the first article in the newsgroup. �<ENDPARAMDEFLIST>)�� �<DESCRIPTION>('�The DIRECTORY command lists the articleSI�number, originator, and subject of articles in the current newsgroup, onenG�article per line. Articles you have seen are marked with an <quote>(x)t�in the listing.tO�<p>Specifying any of /EXCLUDE, /FROM, /KEYWORD, or /SUBJECT can narrow down the;N�directory listing to include or omit articles matching the specified criteria.F�When specified in combination, only those articles matching all of the�specified criteria are listed.�<ENDDESCRIPTION>�� �<QUALDEFLIST>o�<QUALITEM>(/GROUP) �<QUALDEF>r4�See the description for the DIRECTORY/GROUP command.��.�<QUALITEM>(/EXCLUDE=(keyword=(pattern...)...)) �<qualdef>�G�Causes articles matching the specified exclusion criteria to be omittedsD�from the listing. Valid values for <emphasis>(keyword) are FROM and�SUBJECT.�<qualitem>(/FROM=(pattern...)) �<qualdef> C�Specifies one or more patterns to be matched against each article's\H�From header. Only those articles matching one of the specified patterns �are listed.c!�<qualitem>(/KEYWORD=(keyword...)) �<QUALDEF>nJ�Specifies one or more keywords. Only those articles with Keywords headers/�containing the specified keyword(s) are listed.�!�<qualitem>(/SUBJECT=(pattern...))n �<qualdef>lC�Specifies one or more patterns to be matched against each article's�K�Subject header. Only those articles matching one of the specified patterns� �are listed.y�<QUALITEM>(/SEEN) �<QUALDEF>sC�Specifies that seen articles should be included in the listing. IfcA�neither /SEEN nor /UNSEEN is specified, all articles are listed. t�<QUALITEM>(/UNSEEN)t �<QUALDEF>fE�Specifies that unseen articles should be included in the listing. IfiA�neither /SEEN nor /UNSEEN is specified, all articles are listed. S�<QUALITEM>(/WIDTH=(keyword...))Y �<QUALDEF>,@�Alters the format of the DIRECTORY display. Possible values for�<keyword>(keyword) are:,�<table>.�<table_setup>(2\10)o>�<table_row>(FROM=n\Sets the width of the From-address column.)<�<table_row>(SUBJECT=n\Sets the width of the Subject column.) �<endtable>G�<p>By default, DIRECTORY uses approximately 20 columns for other fields E�and spacing and divides the rest of the terminal width evenly between:'�the From column and the Subject column.EI�Note that it is possible to exceed the terminal width by specifying large,?�values for this qualifier; this may produce unexpected results.E�<ENDQUALDEFLIST>��*�<COMMAND>(DIRECTORY/GROUP\\NEWSRDR_DOC_39)�� �<OVERVIEW>=�Lists information about newsgroups available from the server.c �<ENDOVERVIEW>e���<FORMAT>�<FCMD>(DIRECTORY/GROUP) �<FPARMS>([group-pat])R �<ENDFORMAT>A �<QUAL_LIST>d�<QPAIR>(/ALL\)�<QPAIR>(/[NO]SORT\/NOSORT)�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(group-pat) �<PARAMDEF>H�A group name or a pattern containing wildcards. All groups matching theE�specified pattern are included in the directory listing. If omitted,p�all groups are listed.�<ENDPARAMDEFLIST>b�� �<DESCRIPTION>aI�DIRECTORY/GROUP lists the names of the newsgroups to which are subscribednF�along with the number of the first and last article available from the>�server in each newsgroup. Also indicated is whether or not youF�subscribe to the group (more useful with DIR/GROUP/ALL) and the number4�of articles in the group that you have not yet read.)�DIR/GROUP/ALL lists information about alle!�groups available from the server.pD�<p><emphasis>(Note:\bold) DIR/GROUP/ALL will not display any useful�information unless you haveaC�done an full information update with the UPDATE/FULL command first. N�DIR/GROUP will not flag unmoderated groups unless you have done an UPDATE/FULL�first.�<ENDDESCRIPTION>�� �<QUALDEFLIST> �<qualitem>(/ALL) �<qualdef>pC�Lists information about all available newsgroups that match, rather ,�than just the groups to which you subscribe.���<qualitem>(/[NO]SORT)t �<QUALDEF>oJ�Causes the groups to be listed alphabetically. By default, the listing isJ�displayed in the order in which they appear in your NEWSRDR profile (whichF�is alphabetical also) or in your newsrc file (if you have set one with�the SET NEWSRC command).�<ENDQUALDEFLIST>���<COMMAND>(EXIT\\NEWSRDR_DOC_40)i�� �<OVERVIEW>�Ends an NEWSRDR session. �<ENDOVERVIEW> ���<FORMAT> �<FCMD>(EXIT) �<FPARMS>() �<ENDFORMAT>��� �<DESCRIPTION>y?�Ends the current NEWSRDR session, updates your NEWSRDR profile,d�and returns control to DCL.S�<ENDDESCRIPTION>��"�<COMMAND>(EXTRACT\\NEWSRDR_DOC_41)�� �<OVERVIEW>!�Copies news articles into a file.c �<ENDOVERVIEW>n���<FORMAT>�<FCMD>(EXTRACT)N)�<FPARMS>([file-spec] [article-range ...])D �<ENDFORMAT>. �<QUAL_LIST>o�<QPAIR>(/[NO]APPEND\See text.)�<QPAIR>(/[NO]HEADERS\/HEADERS)�<QPAIR>(/ROTATE\)K�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(file-spec) �<PARAMDEF>G�Name of the file into which the selected article(s) will be copied. If.G�omitted, the name of the file is taken from the current newsgroup name.hM�For example, an article extracted from newsgroup <quote>(comp.sys.belch-fire)c4�would be placed in the file COMP_SYS_BELCH-FIRE.TXT.�<paramitem>(article-range) �<paramdef>I�A single article number or a starting and ending article number separatedaE�by a hyphen. All articles in the specified range are copied into the<6�file. If omitted, only the current article is copied.E�<p>The SET ARCHIVE_DIRECTORY command can be used to specify a defaultmE�device and directory for extracted articles. If no archive directoryeK�is specified, and no device/directory is specified in <emphasis>(file-spec)r7�the file is placed in the current directory by default.��<ENDPARAMDEFLIST>k�� �<DESCRIPTION>rK�This command can be used to save articles into a file for future reference.uH�One or more articles can be extracted into a file, but all articles mustK�be in the current newsgroup. Using /APPEND causes the articles to appendedsH�to the specified file (which must already exist). Otherwise, a new file&�is created for the extracted articles.�<ENDDESCRIPTION>�� �<QUALDEFLIST>2�<QUALITEM>(/[NO]APPEND)e �<QUALDEF>o>�Causes the articles to appended to the file. The default whenB�<emphasis>(file-spec) is present on the command is /NOAPPEND; when9�<emphasis>(file-spec) is omitted, the default is /APPEND.t�<QUALITEM>(/[NO]HEADERS) �<QUALDEF>EO�Causes the article header lines to be included in the extraction (the default).d7�Use /NOHEADERS to cause the header lines to be omitted. �<qualitem>(/ROTATE)s �<QUALDEF>rF�Causes the article body to be deciphered, using the ROT13 cipher, when�written to the file.�<ENDQUALDEFLIST>��#�<COMMAND>(FOLLOWUP\\NEWSRDR_DOC_42) �� �<OVERVIEW>F�This is a synonym for REPLY. See the description of the REPLY command�for further information. �<ENDOVERVIEW> ���<FORMAT>�<FCMD>(FOLLOWUP)�<FPARMS>([group-name,...]) �<ENDFORMAT>g �<QUAL_LIST>o"�<QPAIR>(/DISTRIBUTION=(dist ...)\)�<QPAIR>(/[NO]EDIT)�<QPAIR>(/[NO]EXTRACT)u"�<qpair>(/FOLLOWUP_TO=(group ...)\)�<QPAIR>(/MAIL\)t�<QPAIR>(/POST\) �<qpair>(/[NO]SIGNATURE\)%�<QPAIR>(/[NO]SUBJECT="subject-text"\)t�<QPAIR>(/TO=(user-spec ...)\)o�<ENDQUAL_LIST>��"�<COMMAND>(FORWARD\\NEWSRDR_DOC_43)�� �<OVERVIEW>?�Forwards a copy of a news article to a user by electronic mail.l �<ENDOVERVIEW>i���<FORMAT>�<FCMD>(FORWARD)r�<FPARMS>([article-number]) �<ENDFORMAT> �<QUAL_LIST>i�<QPAIR>(/[NO]EDIT\)R�<QPAIR>(/[NO]SELF\)d'�<QPAIR>(/[NO]SUBJECT[="subject-text"]\)n�<QPAIR>(/[NO]SIGNATURE\)�<QPAIR>(/TO=(user-spec...)\)�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(article-number) �<PARAMDEF>K�Number of the article to be sent. If omitted, the current article is sent. �<ENDPARAMDEFLIST>e�� �<DESCRIPTION>�C�This command sends the specified article by E-mail to the specified G�user or users. The complete article, including all headers, is treatedgE�as the text of the message. You can edit the text before it is sent,f �if desired.S�<ENDDESCRIPTION>�� �<QUALDEFLIST>��<QUALITEM>(/[NO]EDIT)R �<QUALDEF>cK�Specifying /EDIT causes a text editor to be invoked so the message text caneF�be edited before being sent. The default action for this qualifier isK�determined by the current SET EDIT setting (see the SET command descriptions�for more information).�<QUALITEM>(/[NO]SELF)� �<QUALDEF>iI�Specifying /SELF causes a copy of the message to be sent to your username D�in addition to the intended recipients. Specifying /NOSELF preventsF�the extra copy from being sent. If omitted, the default is taken from&�the SET COPY_SELF setting in VMS MAIL.)�<QUALITEM>(/[NO]SUBJECT[="subject-text"])f �<QUALDEF>lI�The /SUBJECT qualifier can be used to specify the subject for the messagerG�on the command line. Use /NOSUBJECT to omit a subject from the messageiC�altogether. If not specified, you are prompted for a subject line. �<qualitem>(/[NO]SIGNATURE) �<qualdef>RM�The /SIGNATURE qualifier can be used to indicate that your <quote>(signature)nM�file should or should not be included automatically at the end of the message L�when it is sent. The default action for this qualifier is determined by the�current SET SIGNATURE setting. �<qualitem>(/TO=("user-spec"...)) �<qualdef>cF�The /TO qualifier can be used to specify the destination users for the&�message. If the <emphasis>(user-spec)C�includes an at-sign (<quote>(@)), the message will be sent via your F�Internet mail system; otherwise, it will be sent via regular VMS MAIL.P�Specify multiple addresses by separating them with commas and enclosing the listI�in parentheses. If omitted, you are prompted for the destination addressa�list.h�<ENDQUALDEFLIST>�� �<COMMAND>(GROUP\\NEWSRDR_DOC_44)�� �<OVERVIEW>:�Selects a newsgroup to be your <quote>(current) newsgroup. �<ENDOVERVIEW>P���<FORMAT> �<FCMD>(GROUP)a�<FPARMS>(groupname)A �<ENDFORMAT>I���<paramdeflist>�<paramitem>(groupname)/�<paramdef>Name of the group to be made current.c�<endparamdeflist>s �<description>yG�You can use this command to explicitly select the current newsgroup, to/D�be able to extract articles from the newsgroup, etc. Note that someP�NEWSRDR commands (DIRECTORY, READ) implicitly set the current newsgroup for you.�<enddescription>���<COMMAND>(HELP\\NEWSRDR_DOC_45) �� �<OVERVIEW>�Displays help information. �<ENDOVERVIEW>h���<FORMAT> �<FCMD>(HELP)�<FPARMS>([topic...]) �<ENDFORMAT>F�<PARAMDEFLIST>�<PARAMITEM>(topic) �<PARAMDEF>F�The name of a topic in the help library. If omitted, a list of topics �is displayed.)�<ENDPARAMDEFLIST>m�� �<DESCRIPTION>I9�This command should be relatively straightforward to use.a�<ENDDESCRIPTION>���<COMMAND>(MAIL\\NEWSRDR_DOC_46)t�� �<OVERVIEW>!�Sends an electronic mail message.> �<ENDOVERVIEW>M���<FORMAT> �<FCMD>(MAIL)�<FPARMS>([file-spec])R �<ENDFORMAT>m �<QUAL_LIST>>�<QPAIR>(/[NO]EDIT\)h�<QPAIR>(/[NO]SELF\)l'�<QPAIR>(/[NO]SUBJECT[="subject-text"]\)i�<QPAIR>(/[NO]SIGNATURE\)�<QPAIR>(/TO=(user-spec...)\)�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(file-spec) �<PARAMDEF>H�Name of the file to be sent by E-mail. If omitted, you are prompted for�the text of the message.�<ENDPARAMDEFLIST>��� �<DESCRIPTION>NI�This command is similar to the SEND command in the VMS MAIL utility, withe�three small differences:�<list>(numbered)F�<le>You can specify the destination users on the command line with the�/TO qualifier.H�<le>The destination usernames are assumed to be Internet-style names andA�are automatically sent through the system's Internet mail system.yJ�<le>After composing or editing the text of your message, you are asked for(�confirmation before the message is sent. �<endlist>T�<ENDDESCRIPTION>�� �<QUALDEFLIST>D�<QUALITEM>(/[NO]EDIT)t �<QUALDEF>tK�Specifying /EDIT causes a text editor to be invoked so the message text canUF�be edited before being sent. The default action for this qualifier isK�determined by the current SET EDIT setting (see the SET command description>�for more information).�<QUALITEM>(/[NO]SELF)r �<QUALDEF>iI�Specifying /SELF causes a copy of the message to be sent to your username D�in addition to the intended recipients. Specifying /NOSELF preventsF�the extra copy from being sent. If omitted, the default is taken from&�the SET COPY_SELF setting in VMS MAIL.)�<QUALITEM>(/[NO]SUBJECT[="subject-text"])i �<QUALDEF>oI�The /SUBJECT qualifier can be used to specify the subject for the message�G�on the command line. Use /NOSUBJECT to omit a subject from the message\C�altogether. If not specified, you are prompted for a subject line.C�<qualitem>(/[NO]SIGNATURE) �<qualdef>/M�The /SIGNATURE qualifier can be used to indicate that your <quote>(signature)LM�file should or should not be included automatically at the end of the message L�when it is sent. The default action for this qualifier is determined by the�current SET SIGNATURE setting. �<qualitem>(/TO=("user-spec"...)) �<qualdef>FF�The /TO qualifier can be used to specify the destination users for the&�message. If the <emphasis>(user-spec)C�includes an at-sign (<quote>(@)), the message will be sent via youreF�Internet mail system; otherwise, it will be sent via regular VMS MAIL.P�Specify multiple addresses by separating them with commas and enclosing the listI�in parentheses. If omitted, you are prompted for the destination address(�list.O�<ENDQUALDEFLIST>�<COMMAND>(NEXT\\NEWSRDR_DOC_47)��� �<OVERVIEW>�A synonym for READ/NEXT/NEW. �<ENDOVERVIEW>6���<FORMAT> �<FCMD>(NEXT) �<FPARMS>( )r �<ENDFORMAT>H �<QUAL_LIST>r�<QPAIR>(/GROUP\)�<ENDQUAL_LIST>�� �<DESCRIPTION>eI�This command, a synonym for READ/NEXT/NEW, causes the next unseen articlen�to be displayed.�<ENDDESCRIPTION>�� �<QUALDEFLIST>i�<QUALITEM>(/GROUP) �<QUALDEF>mN�Instructs NEWSRDR to move on to the next subscribed newsgroup before searchingH�for new articles, skipping any unread articles in the current newsgroup.L�If no new article are found in any other newsgroup, the NEWS-W-NONEW messageK�will be displayed, even if there are new articles in the current newsgroup.��<ENDQUALDEFLIST>���<COMMAND>(POST\\NEWSRDR_DOC_48)K�� �<OVERVIEW>�Posts a news article. �<ENDOVERVIEW> ���<FORMAT> �<FCMD>(POST)&�<FPARMS>([group-name,...] [file-spec]) �<ENDFORMAT>F �<QUAL_LIST> '�<QPAIR>(/DISTRIBUTION=(dist-name ...)\)i�<QPAIR>(/[NO]EDIT\)]�<QPAIR>(/FILE=file-spec\)e"�<QPAIR>(/FOLLOWUP_TO=(group ...)\)�<QPAIR>(/[NO]SIGNATURE\)"�<QPAIR>(/[NO]SUBJECT[="subject"]\)�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(group-name)e �<PARAMDEF>L�Name of the newsgroup to which the article is to be posted. If omitted, the+�article is posted to the current newsgroup.i�<PARAMITEM>(file-spec) �<PARAMDEF>J�File whose contents should be posted as the text of the article. You mustJ�specify <keyword>(group-name) if you wish to specify <keyword>(file-spec).I�If omitted, and no /FILE qualifier is specified, you will be prompted foru�the article text.m�<ENDPARAMDEFLIST>e�� �<DESCRIPTION> F�This command is used to compose and post news articles. If you do notD�specify a file either with the <keyword>(file-spec) parameter or the&�/FILE qualifier, and you are not usingK�a text editor to compose the article, you are prompted for the article texteG�one line at a time. Once you have entered the text of the article, younK�are asked to confirm the posting. If you do so, the article is transmittede6�to the NNTP server to be entered into the news system.�<ENDDESCRIPTION>�� �<QUALDEFLIST>n�<QUALITEM>(/[NO]EDIT) �<QUALDEF>iK�Specifying /EDIT causes a text editor to be invoked so the article text cantF�be edited before being sent. The default action for this qualifier isK�determined by the current SET EDIT setting (see the SET command descriptiond�for more information).�<qualitem>(/FILE=file-spec)u �<qualdef>�L�Specifies a file whose contents should be posted as the text of the article.H�This qualifier can be used instead of the <keyword>(file-spec) parameterI�to specify the article text file, if you do not wish to enter the name ofGI�the newsgroup to which the article should be posted. If omitted, you aren�prompted for the article text.)�<QUALITEM>(/[NO]SUBJECT[="subject-text"])� �<QUALDEF>EI�The /SUBJECT qualifier can be used to specify the subject for the articlePG�on the command line. Use /NOSUBJECT to omit a subject from the articleiC�altogether. If not specified, you are prompted for a subject line. �<qualitem>(/[NO]SIGNATURE) �<qualdef>nM�The /SIGNATURE qualifier can be used to indicate that your <quote>(signature)oM�file should or should not be included automatically at the end of the articleiJ�when it is posted. The default action for this qualifier is determined by"�the current SET SIGNATURE setting.)�<QUALITEM>(/DISTRIBUTION=(dist-name ...))� �<QUALDEF>iI�This qualifier can be used to restrict the distribution of the article towG�a particular area. If not specified, no restrictions are placed on theeO�article's distribution. Typical distribution names are "usa", "na", "ny", etc. $�<QUALITEM>(/FOLLOWUP_TO=(group ...)) �<qualdef>IG�This qualifier can be used to redirect any followups to this article totC�be posted to the specified newsgroup(s). By default, followups are(6�posted to the same newsgroup(s) as the posted article.�<ENDQUALDEFLIST>���� �<COMMAND>(PRINT\\NEWSRDR_DOC_49)�� �<OVERVIEW>E�Adds one or more articles to the current print job. The print job isRK�not released to the print queue until you exit NEWSRDR or use the PRINT/NOWa�command. �<ENDOVERVIEW>m���<FORMAT> �<FCMD>(PRINT)e�<FPARMS>([article-range] ...) �<ENDFORMAT> �<QUAL_LIST>a�<QPAIR>(/AFTER=time\no delay)�0�<QPAIR>(/[NO]BURST[=keyword]\default from queue)�<QPAIR>(/CANCEL\) �<QPAIR>(/COPIES=n\1 copy)g%�<QPAIR>(/[NO]FEED\default from queue)�/�<QPAIR>(/[NO]FLAG[=keyword]\default from queue)p+�<QPAIR>(/FORM=form-name\default from queue)a�<QPAIR>(/[NO]HEADERS\/HEADERS)�<QPAIR>(/[NO]HOLD\no hold)"�<QPAIR>(/NAME=job-name\/NAME=NEWS)�<QPAIR>(/NOTIFY\)Q�<QPAIR>(/NOW\)$�<QPAIR>(/PARAMETERS=(parameter...)\)�<QPAIR>(/PRINT\)+�<QPAIR>(/QUEUE=queue-name\/QUEUE=SYS$PRINT) �<QPAIR>(/[NO]ROTATE\/NOROTATE)�<QPAIR>(/[NO]SPACE\)2�<QPAIR>(/[NO]TRAILER[=keyword]\default from queue)�<ENDQUAL_LIST>���<PARAMDEFLIST>�<PARAMITEM>(article-range) �<PARAMDEF>I�A single article number or a starting and ending article number separatedYE�by a hyphen. All articles in the specified range are copied into theu;�print job. If omitted, only the current article is copied.0�<ENDPARAMDEFLIST>M�� �<DESCRIPTION> L�This command adds the specified article(s) to the current pending print job.I�If no print job is pending, a new job is created. Using /NOW (or /PRINT)lF�causes the current pending print job to be closed and submitted to theF�print queue; using /CANCEL discards the print job without printing it.I�If you specify attributes on the PRINT command that are incompatible withsI�the current pending print job (such as a different value for /QUEUE), the>F�current print job is closed and printed and a new job is opened before�the articles are copied.�<ENDDESCRIPTION>�� �<QUALDEFLIST>R���<QUALITEM>(/AFTER=time)D �<QUALDEF>OC�Requests that the job not be printed until the specified date/time.L�� �<qualitem>(/[NO]BURST[=keyword]) �<qualdef>�H� Controls whether a burst page is printed at the start of the print job.G�Valid keyword values are ALL and ONE; if omitted, ALL is assumed. Note I�that either value has the same effect, since NEWSRDR combines all printedE,�articles into a single file before printing.�<qualitem>(/CANCEL) �<qualdef>g'� Cancels the current pending print job.h�<qualitem>(/COPIES=n)t �<qualdef>r9� Indicates the number of copies of the job to be printed.d�<qualitem>(/[NO]FEED)t �<qualdef>rE� Controls whether form feeds are automatically inserted at the end oft�a page.t�<QUALitem>(/[NO]FLAG[=keyword])a �<qualdef>UG� Controls whether a flag page is printed at the start of the print job.pG�Valid keyword values are ALL and ONE; if omitted, ALL is assumed. NotemI�that either value has the same effect, since NEWSRDR combines all printedL,�articles into a single file before printing.�<qualitem>(/FORM=form-name)e �<qualdef>D@� Specifies the name of the form that you want for the print job.�<qualitem>(/[NO]HEADERS) �<qualdef>bG� Controls whether the article headers are included with the text in the �print job.�<qualitem>(/[NO]HOLD)/ �<qualdef>�A� Controls whether the job is held in the queue prior to printing.u�<qualitem>(/NAME=job-name) �<qualdef>d-� Specifies a name string to identify the job. �<qualitem>(/NOTIFY)a �<qualdef>iJ� Indicates that you should be notified by a broadcast message when the jobH�has been printed. May be specified on the PRINT and PRINT/NOW commands.�<qualitem>(/NOW) �<qualdef> K� Closes the pending print job and submits it for printing. You may specifyt&�the /NOTIFY qualifier on this command.'�<qualitem>(/PARAMETERS=(parameter ...))o �<qualdef>DJ� Specifies up to eight optional parameters to be passed to the print queue �with the job. �<qualitem>(/PRINT) �<qualdef>R� Synonym for /NOW.�<qualitem>(/QUEUE=queue-name)l �<qualdef>]L� Specifies the name of the print queue to which the job should be submitted.�<qualitem>(/ROTATE)A �<qualdef>\J� If specified, the text of each article will be deciphered using the ROT13�cipher.i�<qualitem>(/[NO]SPACE) �<qualdef>s3� Specifies that the output should be double-spaced. "�<qualitem>(/[NO]TRAILER[=keyword]) �<qualdef> H� Controls whether a trailer page is printed at the end of the print job.G�Valid keyword values are ALL and ONE; if omitted, ALL is assumed. NotelI�that either value has the same effect, since NEWSRDR combines all printedc,�articles into a single file before printing.�<endqualdeflist>���<COMMAND>(READ\\read_cmd)��� �<OVERVIEW>�Displays a news article. �<ENDOVERVIEW>����<FORMAT>�<FCMD>([READ])�<FPARMS>([article-number]) �<ENDFORMAT>m �<QUAL_LIST>d�<QPAIR>(/NEXT\)a�<QPAIR>(/PREVIOUS\) �<QPAIR>(/NEW\)�<QPAIR>(/FIRST\)�<QPAIR>(/LAST\)e�<QPAIR>(/GROUP[=group-name]\)>"�<QPAIR>(/SUBJECT[=(pattern ...)]\)�<QPAIR>(/THREAD)�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(article-number)c �<PARAMDEF>J�The number of the article to be read. Should be omitted when using any of�the qualifiers except /GROUP.l�<ENDPARAMDEFLIST> �� �<DESCRIPTION>uD�This command displays a news article. You can select the article to?�be read by number, or by using one of the selection qualifiers.iB�<P>The READ command name may be omitted only if reading a specific#�article that you specify by number.��<ENDDESCRIPTION>�� �<QUALDEFLIST>a�<QUALITEM>(/NEXT). �<QUALDEF>lJ�When used without /NEW, causes the next available article in the newsgroupK�to be displayed, even if you have seen it. When used with /NEW, causes theE3�next article you have not yet seen to be displayed.o�<QUALITEM>(/PREVIOUS)r �<QUALDEF> I�Causes the next-lowest-numbered article in the newsgroup to be displayed.i�<QUALITEM>(/NEW) �<QUALDEF>aK�When used without /NEXT, causes the first article in the���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%�����������������������������~�����NEWSRDR_SRC.BCK����������������)Q��P��[NEWSRDR]NEWSRDR_DOC.SDML;80���������������������������������������������������������������������������������������������������T�������������������������������|�����|������� newsgroup you have K�not yet seen to be displayed. When used with /NEXT, causes the next unseenEM�article after the article you are currently reading (if any) to be displayed.��<QUALITEM>(/FIRST) �<QUALDEF>VD�Causes the first available article in the newsgroup to be displayed.�<qualitem>(/LAST)I �<QUALDEF>RC�Causes the last available article in the newsgroup to be displayed.T�<qualitem>(/GROUP=group-name) �<qualdef>AJ�Makes the specified group the current group and selects articles from thatA�group. If omitted, articles are selected from the current group.>H�<P>When used with the READ/NEXT/NEW command, no group name is specified.K�In this case, the /GROUP qualifier instructs NEWSRDR to move on to the nextMK�subscribed newsgroup before searching for new articles, skipping any unread(L�articles in the current newsgroup. If no new article are found in any otherL�newsgroup, the NEWS-W-NONEW message will be displayed, even if there are new"�articles in the current newsgroup.+�<QUALITEM>(/SUBJECT=(pattern ...)\/SUBJECT)e �<qualdef>tC�Causes NEWSRDR to scan forward through the newsgroup until it findsNB�an article matching one of the specified wildcard patterns. If noB�patterns are specified, the search is continued using the patterns@�last specified. If there are no more matching articles, NEWSRDRA�displays a message and clears the patterns, resetting the current�+�article back to the first matching article.g�<QUALITEM>(/THREAD)e �<QUALDEF> C�Causes NEWSRDR to scan forward through the newsgroup until it findseD�another article with the same subject. Continued use of READ/THREADE�can be used to view all articles on one subject, following the threadA/�of conversation. If there are no more articlescA�in the thread, NEWSRDR displays a message and the current articleo:�is reset back to the first article you read in the thread.�<MARK>F�<p>The /NEW qualifier can be used with READ/THREAD to view only unseen�articles in the thread.M �<ENDMARK>I�<ENDQUALDEFLIST>�� �<COMMAND>(REPLY\\NEWSRDR_DOC_51)�� �<OVERVIEW>D�Posts a follow-up article and/or sends a reply message to the author�of the current article.t �<ENDOVERVIEW>t���<FORMAT> �<FCMD>(REPLY)h�<FPARMS>([group-name,...]) �<ENDFORMAT>o �<QUAL_LIST>i"�<QPAIR>(/DISTRIBUTION=(dist ...)\)�<QPAIR>(/[NO]EDIT)�<QPAIR>(/[NO]EXTRACT)s"�<QPAIR>(/FOLLOWUP_TO=(group ...)\)�<QPAIR>(/MAIL\)o�<QPAIR>(/POST\) �<qpair>(/[NO]SELF\)a�<qpair>(/[NO]SIGNATURE\)%�<QPAIR>(/[NO]SUBJECT="subject-text"\)i�<QPAIR>(/TO=(user-spec ...)\)i�<ENDQUAL_LIST>���<PARAMDEFLIST>�<PARAMITEM>(group-name)( �<PARAMDEF>O�The name of the newsgroup to which the follow-up article should be posted. ThefC�groups you specify override the groups listed in the Followup-To or<;�Newsgroups header of the message to which you are replying. L�<p>If you are not posting your follow-up article, this parameter is ignored.�<endparamdeflist>g�� �<Description> H�This command is used to compose and post and/or mail a follow-up articleM�to the article currently being read. Just as for the MAIL and POST commands,DH�you can use a text editor to compose the message, or be prompted for theL�message text. Once you have finished entering the message, you are asked toK�confirm the sending of the reply. Once confirmed, the follow-up message isuL�sent to the NNTP server to be entered into the newsgroup and/or sent through"�the Internet mailer to the author.K�<p>For posted replies, if you do not specify one or more group names on thee?�REPLY command, the <quote>(Followup-to:) header in the original �article determines@�the newsgroups to which the follow-up is posted. If there is noD�<quote>(Followup-to:) header, the follow-up article is automatically;�entered into the same newsgroup(s) as the original article.�G�If the <quote>(Followup-to:) header specifies the word <quote>(poster,) I�then the reply will not be posted and will instead be treated as a mailedP�reply.L�<p>For mailed replies, the <quote>(Reply-to:) header in the original aritcle@�determines the destination of the reply message. If there is noK�<quote>(Reply-to:) header, the address in the <quote>(From:) header is useds�instead.�<EndDescription>�� �<QUALDEFLIST>[)�<QUALITEM>(/DISTRIBUTION=(dist-name ...))[ �<QUALDEF>=I�This qualifier can be used to restrict the distribution of the article to�G�a particular area. If not specified, no restrictions are placed on theoO�article's distribution. Typical distribution names are "usa", "na", "ny", etc.h�<QUALITEM>(/[NO]EDIT)F �<QUALDEF>DK�Specifying /EDIT causes a text editor to be invoked so the article text canlF�be edited before being sent. The default action for this qualifier isK�determined by the current SET EDIT setting (see the SET command descriptionh�for more information).�<qualitem>(/[NO]EXTRACT) �<qualdef>sN�If a text editor is used to compose the follow-up message, the current articleJ�text is automatically extracted with greater-than signs placed in front ofO�each line of text, to be used as part of the reply. You can use the /NOEXTRACTDL�qualifier to prevent this extraction from occurring. Note that /EXTRACT hasF�no effect if you do not use a text editor for composing the follow-up.$�<QUALITEM>(/FOLLOWUP_TO=(group ...)) �<qualdef>bG�This qualifier can be used to redirect any followups to this article toeC�be posted to the specified newsgroup(s). By default, followups arec6�posted to the same newsgroup(s) as the posted article.�<qualitem>(/MAIL)e �<qualdef>eO�Specifies that the reply is to be mailed to the author of the original message.eJ�If neither /MAIL nor /POST is specified, /POST is assumed. A reply may be�both mailed and posted.c�<qualitem>(/POST)F �<qualdef>B@�Specifies that the reply is to be posted as a follow-up article.J�If neither /MAIL nor /POST is specified, /POST is assumed. A reply may be�both mailed and posted.f�<QUALITEM>(/[NO]SELF)o �<QUALDEF> L�For mailed replies, specifying /SELF causes a copy of the message to be sentL�to your username in addition to the intended recipients. Specifying /NOSELFJ�prevents the extra copy from being sent. If omitted, the default is taken+�from the SET COPY_SELF setting in VMS MAIL. �<qualitem>(/[NO]SIGNATURE) �<qualdef>�M�The /SIGNATURE qualifier can be used to indicate that your <quote>(signature)sM�file should or should not be included automatically at the end of the articlenL�when it is sent. The default action for this qualifier is determined by the�current SET SIGNATURE setting.)�<QUALITEM>(/[NO]SUBJECT[="subject-text"])p �<QUALDEF>sI�The /SUBJECT qualifier can be used to specify the subject for the message G�on the command line. Use /NOSUBJECT to omit a subject from the messageEG�altogether. If not specified, the subject of the message is determinedD �as follows:E�<list>(unnumbered)L�<le>If there is no subject line in the original message, or the subject line@�is the text <quote>((none)), no subject is added to the message.H�<le>If the subject line in the original message begins with <quote>(Re:)O�(upper or lower case), it is copied verbatim to the new message's subject line.vE�<le>Otherwise, the new subject line is the original subject line withs$�<quote>(Re:) added at the beginning. �<endlist>s �<qualitem>(/TO=("user-spec"...)) �<qualdef>hF�The /TO qualifier can be used to specify the destination users for theF�message, when the reply is to be mailed. If the <emphasis>(user-spec)C�includes an at-sign (<quote>(@)), the message will be sent via yourDF�Internet mail system; otherwise, it will be sent via regular VMS MAIL.P�Specify multiple addresses by separating them with commas and enclosing the listE�in parentheses. If omitted, the destination address is obtained from C�the Reply-To header in the article (or the From header, if there is��no Reply-To header).�<endqualdeflist>��0�<COMMAND>(SET ARCHIVE_DIRECTORY\\NEWSRDR_DOC_52)�� �<OVERVIEW>>�Establishes a place where extracted articles should be stored. �<ENDOVERVIEW>g���<FORMAT>!�<FCMD>(SET [NO]ARCHIVE_DIRECTORY)e�<FPARMS>([devdir]) �<ENDFORMAT>a���<PARAMDEFLIST>�<PARAMITEM>(devdir)pF�<PARAMDEF>A device and/or directory specification. This value will beE�used as the default device/directory for subsequent EXTRACT commands. �<ENDPARAMDEFLIST>e�� �<DESCRIPTION>FB�This command is used to specify where extracted articles should be?�stored if no device/directory is specified on EXTRACT commands.wC�If no archive directory is set, or you remove the archive directoryiG�setting with SET NOARCHIVE_DIRECTORY, EXTRACT defaults to placing filese�in the current directory. �<ENDDESCRIPTION>����-�<COMMAND>(SET AUTO_READ_NEW\\NEWSRDR_DOC_52A)n�<MARK> �<OVERVIEW>K�Controls how NEWSRDR behaves when a READ/NEW command causes a group change.t �<ENDOVERVIEW>e���<FORMAT>�<FCMD>(SET [NO]AUTO_READ_NEW)A �<FPARMS>( )D �<ENDFORMAT>F�� �<DESCRIPTION>DE�This command controls how the READ/NEW series of commands behave wheneK�they run out of articles in a newsgroup and jump to the next newsgroup that D�has unseen articles. The default is AUTO_READ_NEW, which causes theD�first unseen article in the new group to be displayed automatically.I�If you set NOAUTO_READ_NEW, when the group change occurs you are returneda�to the News> command prompt.�<ENDDESCRIPTION> �<ENDMARK>m��0�<COMMAND>(SET DIRECTORY_WIDTH\\cmd_set_dirwidth) �<OVERVIEW>=�Specifies the default width for fields in DIRECTORY listings.p �<ENDOVERVIEW>t���<FORMAT>�<FCMD>(SET DIRECTORY_WIDTH)x �<FPARMS>() �<QUAL_LIST>C�<QPAIR>(/FROM=columns\)A�<QPAIR>(/SUBJECT=columns\)�<ENDQUAL_LIST> �<ENDFORMAT> �� �<DESCRIPTION>rJ�This command sets the default field widths for the From and Subject fieldsF�in DIRECTORY listings. By default, the two fields split the availableG�screen width evenly. You can set a specific width (including zero) forbC�one or both fields. If you set a specific width for one field, thel7�remaining available screen width is used for the other.iM�<P>Specifying no qualifiers resets the widths back to the even-split default.h�<ENDDESCRIPTION>�� �<QUALDEFLIST>Q���<QUALITEM>(/FROM=columns)n �<QUALDEF>�3�Specifies the number of columns for the From field.e���<QUALITEM>(/SUBJECT=columns) �<QUALDEF>l6�Specifies the number of columns for the Subject field.�<ENDQUALDEFLIST>��#�<COMMAND>(SET EDIT\\NEWSRDR_DOC_53)e�� �<OVERVIEW>.�Changes the auto-edit setting and text editor. �<ENDOVERVIEW>f���<FORMAT>�<FCMD>(SET [NO]EDIT) �<FPARMS>() �<ENDFORMAT> �<QUAL_LIST>t"�<QPAIR>(/EDITOR=(editor [,type])\)�<ENDQUAL_LIST>�� �<DESCRIPTION>rI�This command is used to turn on or off the automatic use of a text editor>J�for message composition. The setting can be overridden on the POST, MAIL,0�and REPLY commands with the /[NO]EDIT qualifier.�<ENDDESCRIPTION>�� �<QUALDEFLIST>i$�<QUALITEM>(/EDITOR=(editor [,type])) �<QUALDEF>.I�This qualifier can be used to specify the editor to be used, which can be +�either callable or spawned as a subprocess.t>�If <keyword>(type) is CALLABLE, then <keyword>(editor) must beF�the name of a callable editor. NEWSRDR can use any callable editor for�message composition that%�meets the following calling standard:p�<list>(unnumbered)J�<le>The callable editor's shareable library name must be xxxSHR.EXE, whereI�<quote>(xxx) is the name by which the editor will be called. The library(F�must reside in SYS$SHARE or must have an exec-mode logical pointing to�the library elsewhere.B�<le>The shareable library must contain an entry point which calledH�xxx$EDIT, which must take the input file-spec and output file-spec, bothG�character strings passed by descriptor, as the first two arguments. IfeJ�there are optional arguments, the xxx$EDIT routine must not rely on having �more than two arguments present. �<endlist>hM�<p>The Digital-supplied editors TPU, EDT, and TECO, and the (layered product)IE�DEC Language-Sensitive Editor (LSE) all follow this calling standard.hJ�<p>NEWSRDR uses LIB$FIND_IMAGE_SYMBOL to map the editor into the process's!�virtual address space at runtime.s��@�<p>If <keyword>(type) is SPAWN, then <keyword>(editor) must be aC�command string for invoking a command procedure that follows of the��form in <reference>(spawnproc).P4�<figure>(Spawned editor command procedure\spawnproc) �<line_art>4�$! Command procedure to invoke an editor for NEWSRDR�$!9�$! To use, put your edit command below and in NEWSRDR usee�$! the command:s�$!=�$! News> SET EDIT/EDITOR=("@device:[dir]filename.COM",SPAWN)E�$! �$! Inputs:�$!�$! P1: input file name�$! P2: output file namei�$!�$! P1 may be a null string.N�$!;�$! The example below is for using TPU (for which you should &�$! really use the callable interface).�$!$�$ DEFINE/USER SYS$INPUT SYS$COMMAND:�$ EDIT/TPU/OUTPUT='P2' 'P1' �$ EXIT �<endline_art> �<endfigure>c�<ENDQUALDEFLIST>��3�<COMMAND>(SET FORCE_MAIL_PROTOCOL\\NEWSRDR_DOC_52B)e�<MARK> �<OVERVIEW>J�Forces NEWSRDR to use the VMS MAIL foreign mail protocol handler for local �addresses. �<ENDOVERVIEW>����<FORMAT>#�<FCMD>(SET [NO]FORCE_MAIL_PROTOCOL)p �<FPARMS>( )a �<ENDFORMAT>E�� �<DESCRIPTION>�M�By default, NEWSRDR sends messages directly via VMS MAIL when the destinationtD�address does not appear to be a network-type mail address. With SETF�FORCE_MAIL_PROTOCOL, you can force all addresses to be handled by yourI�network mail handler (called a <quote>(foreign mail protocol) in VMS MAIL �terminology).,I�<p>This feature may be useful if your network mailer includes support foriI�per-user aliases and other features in which a network mail address mighte(�appear to NEWSRDR to be a local address.�<ENDDESCRIPTION> �<ENDMARK>d��!�<COMMAND>(SET FORM\\cmd_set_form)e �<OVERVIEW>4�Specifies the form to use by default for print jobs. �<ENDOVERVIEW>a���<FORMAT>�<FCMD>(SET [NO]FORM)�<FPARMS>(form-name)p �<ENDFORMAT>i���<PARAMDEFLIST>�<PARAMITEM>(form-name) �<PARAMDEF>�The name of the form to use.�<ENDPARAMDEFLIST>>�� �<DESCRIPTION>dG�This command sets the default form to be used by default for print jobstF�created with the PRINT command. When no form is set, the default form�is taken from the print queue.�<ENDDESCRIPTION>��&�<COMMAND>(SET HEADERS\\NEWSRDR_DOC_54)�� �<OVERVIEW>7�Selects the header lines to appear in article displays.i �<ENDOVERVIEW>S���<FORMAT>�<FCMD>(SET HEADERS)S�<FPARMS>([NO]header-name...) �<ENDFORMAT> �<PARAMDEFLIST>�<PARAMITEM>(header-name) �<PARAMDEF>H�The name of a header line to be included or, if preceded by <quote>(NO),I�excluded from subsequent article displays. You may specify more than onedJ�header name by separating them with commas. <reference>(setheadtab) lists*�the valid header names and their meanings. �<table>(Header names\setheadtab)�<table_setup>(2\10)e"�<table_heads>(Header name\Meaning)O�<table_row>(FROM\the <quote>(From:) line, which indicates who sent the message) N�<table_row>(DATE\the <quote>(Date:) line, which indicates when the message was!�originally posted to the network)mJ�<table_row>(NEWSGROUPS\the <quote>(Newsgroups:) line, which identifies the(�newsgroups to which the message belongs)N�<table_row>(SUBJECT\the <quote>(Subject:) line, usually a brief description of�what the message is about)M�<table_row>(MESSAGE_ID\the <quote>(Message-ID:) line, a unique identifier form �the message)J�<table_row>(PATH\the <quote>(Path:) line, which shows the path the message!�took to reach the current system)rG�<table_row>(REPLY_TO\the <quote>(Reply-to:) line, which indicates whereU�mailed replies should be sent)I�<table_row>(SENDER\the <quote>(Sender:) line, which identifies the entityS6�responsible for submitting the message to the network)G�<table_row>(FOLLOWUP_TO\the <quote>(Followup-to:) line, which indicates ;�the newsgroup(s) where follow-up articles should be posted)eK�<table_row>(EXPIRES\the <quote>(Expires:) line, which indicates a suggestedy)�expiration date and time for the article)iF�<table_row>(REFERENCES\the <quote>(References:) line, which identifies<�the message(s) that prompted the submission of the messages)I�<table_row>(DISTRIBUTION\the <quote>(Distribution:) line, which indicatesv&�the distribution scope of the message)J�<table_row>(ORGANIZATION\the <quote>(Organization:) line, which identifies-�the organization to which the sender belongs)eH�<table_row>(KEYWORDS\the <quote>(Keywords:) line, which may include some/�keywords related to the content of the message)iO�<table_row>(SUMMARY\the <quote>(Summary:) line, a brief summary of the message)XJ�<table_row>(APPROVED\the <quote>(Approved:) line, indicating the moderator�that approved the message)K�<table_row>(LINES\the <quote>(Lines:) line, which indicates the size of the �message)J�<table_row>(XREF\the <quote>(Xref:) line, which identifies cross-postings) �<endtable>�<ENDPARAMDEFLIST>d�� �<DESCRIPTION>i;�This command can be used to omit uninteresting header linesuB�from article displays, to provide more room for article text. TheL�setting has no effect on articles saved into files with the EXTRACT command.G�Note that not all articles have all the header lines you can specify onqB�this command; the header line types are provided for completeness.�<ENDDESCRIPTION>��%�<COMMAND>(SET IGNORE\\NEWSRDR_DOC_55)( �<OVERVIEW>E�Establishes or removes a criterion for permanently ignoring articles.s �<endoverview>-���<format>�<fcmd>(SET [NO]IGNORE)�<FPARMS>(group-name) �<ENDFORMAT>h �<QUAL_LIST>s�<QPAIR>(/GLOBAL\)/�<QPAIR>(/FROM=pattern\)B�<QPAIR>(/NEWSGROUPS=pattern\)R�<QPAIR>(/SUBJECT=pattern\)�<ENDQUAL_LIST>���<PARAMDEFLIST>�<PARAMITEM>(group-name)e �<PARAMDEF>H�The name of the newsgroup to which the ignore criterion should be added.E�Not specified when /GLOBAL is used. If omitted, the current group isc�used.W�<ENDPARAMDEFLIST>s�� �<DESCRIPTION>h9�This command is used to add or remove an ignore criterions4�(sometimes called a <quote>(kill file)) for a single �newsgroup or for all newsgroups.�The criterion can be based@�on the author of the article (/FROM), the subject of the articleB�(/SUBJECT), or the Newsgroups header of the article (/NEWSGROUPS).(�Any articles matching the criterion willG�automatically be marked as seen and will not be displayed when READ/NEWh�is used.C�<p>Use SET NOIGNORE to remove an erroneous ignore criterion or when�@�the subject or author you wish to ignore is at a more reasonable�activity level.iF�<p>Ignore criteria are stored in your NEWSRDR profile and are retained�between NEWSRDR sessions.>:�<p>This command should be used sparingly and with caution.�<ENDDESCRIPTION>�� �<QUALDEFLIST>t�<QUALITEM>(/GLOBAL)FA�<QUALDEF>Makes the ignore criterion effective for all newsgroups.Q�<QUALITEM>(/FROM=pattern)BE�<QUALDEF>Bases the criterion on the author (From line) of an article.(2�The <emphasis>(pattern) may contain VMS wildcards.H�Any From line matching the wildcard pattern, or containing the specifiedI�text if no wildcards are used, will be ignored. You may specify only one��ignore criterion per command.u�<QUALITEM>(/NEWSGROUPS=pattern) D�<QUALDEF>Bases the criterion on the Newsgroups header of an article.G�The <emphasis>(pattern) may contain VMS wildcards. Any Newsgroups linesE�matching the wildcard pattern, or containing the specified text if no >�wildcards are used, will be ignored. You may specify only one�ignore criterion per command.i�<QUALITEM>(/SUBJECT=pattern):�<QUALDEF>Bases the criterion on the subject of an article.D�The <emphasis>(pattern) may contain VMS wildcards. Any subject lineE�matching the wildcard pattern, or containing the specified text if noe@�wildcards are used, will be ignored. You may specify only one�ignore criterion per command.n�<ENDQUALDEFLIST>��+�<COMMAND>(SET NEWGROUP_ACTION\\cmd_set_nga)t�<MARK> �<OVERVIEW>E�Sets the action NEWSRDR should taken on discovery of a new newsgroup. �<ENDOVERVIEW>����<FORMAT>�<FCMD>(SET NEWGROUP_ACTION)i�<FPARMS>(action) �<ENDFORMAT>h���<PARAMDEFLIST>�<PARAMITEM>(action)-B�The action to be taken on discovery of a new newsgroups. This canF�be one of NONE, PROMPT, or SUBSCRIBE. See the description section for�details.�<ENDPARAMDEFLIST>s�� �<DESCRIPTION>n%�The default action, NONE, has NEWSRDR M�announce the presence of each new newsgroup, with no further action. SettingtL�the PROMPT action has NEWSRDR prompt you interactively for whether you wouldJ�like to subscribe to each new newsgroup. The SUBSCRIBE action has NEWSRDRA�subscribe you to new newsgroups automatically, with no prompting.g�<ENDDESCRIPTION> �<ENDMARK>e����%�<COMMAND>(SET NEWSRC\\cmd_set_newsrc)( �<OVERVIEW>*�Enables/disables the use of a newsrc file. �<ENDOVERVIEW>Q���<FORMAT>�<FCMD>(SET [NO]NEWSRC)�<FPARMS>([file-spec])q �<QUAL_LIST>b0�<QPAIR>(/[NO]SUBSCRIBED_ONLY\/NOSUBSCRIBED_ONLY)�<ENDQUAL_LIST> �<ENDFORMAT>n���<PARAMDEFLIST>�<PARAMITEM>([file-spec])I�Name of the newsrc file. If omitted, it defaults to SYS$LOGIN:XX.NEWSRC."�<ENDPARAMDEFLIST>E�� �<DESCRIPTION>QH�This command enables or disables the use of a newsrc file. Newsrc filesE�are described in <reference>(using_newsrc_file). They are plain text M�files, typically used by other news readers, that describe the newsgroups youeM�subscribe to and which articles you have seen. Using a newsrc file increasestI�NEWSRDR's compatibility with other news readers and allows you to controleD�the order in which newsgroups are visited during NEWSRDR sessions by9�ordering the newsgroups in the newsrc file as you desire.u�<ENDDESCRIPTION>�� �<QUALDEFLIST> �<QUALITEM>(/[NO]SUBCRIBED_ONLY)c �<QUALDEF>oH�By default, the newsrc file will list all available newsgroups. This isJ�to maintain compatibility with most other news readers. However, the full@�list can take up a substantial amount of disk space. SpecifyingM�/SUBSCRIBED_ONLY causes NEWSRDR to save information only about the newsgroupstN�you are subscribed to. This may reduce compatibility with other news readers,H�but saves on disk space and still provides the opportunity to modify the.�newsgroup visiting order for NEWSRDR sessions.�<ENDQUALDEFLIST>����,�<COMMAND>(SET PERSONAL_NAME\\NEWSRDR_DOC_56)�� �<OVERVIEW>F�Establishes a <quote>(personal name) to accompany your return address. �<ENDOVERVIEW>r���<FORMAT>�<FCMD>(SET [NO]PERSONAL_NAME)u�<FPARMS>(["name"]) �<ENDFORMAT> �<QUAL_LIST>��<MARK>�<QPAIR>(/MAIL) �<ENDMARK>��<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(name)o �<PARAMDEF>G�Any readable text string, not including quotation marks or backslashes,p!�to be used as your personal name.a�<ENDPARAMDEFLIST>n �<DESCRIPTION> F�This command is used to set up or remove your personal name. The nameK�is added to your return address for articles you post and mail messages youn�send.t�<ENDDESCRIPTION>�� �<QUALDEFLIST>s���<MARK>�<QUALITEM>(/MAIL)e �<QUALDEF>a:�Causes NEWSRDR to use your VMS MAIL personal name setting. �<ENDMARK>r�<ENDQUALDEFLIST>��#�<COMMAND>(SET QUEUE\\cmd_set_queue)R �<OVERVIEW>5�Specifies the queue to use by default for print jobs.� �<ENDOVERVIEW>a���<FORMAT>�<FCMD>(SET QUEUE)h�<FPARMS>(queue-name) �<ENDFORMAT>c���<PARAMDEFLIST>�<PARAMITEM>(queue-name)e �<PARAMDEF>�The name of the queue to use. �<ENDPARAMDEFLIST>t�� �<DESCRIPTION>sH�This command sets the default queue to be used by default for print jobs:�created with the PRINT command. The default is SYS$PRINT.�<ENDDESCRIPTION>��$�<COMMAND>(SET REPLY\\NEWSRDR_DOC_57)�� �<OVERVIEW>6�Sets the default sending mechanism for REPLY commands. �<ENDOVERVIEW>o���<FORMAT>�<FCMD>(SET REPLY)m�<FPARMS>(reply-type ...) �<ENDFORMAT>l���<PARAMDEFLIST>�<PARAMITEM>(reply-type)i �<PARAMDEF>B�Either POST or MAIL, depending on whether you want your replies toD�be posted to the newsgroup or mailed to the article poster. You can@�specify more than one reply type by separating them with commas.�<ENDPARAMDEFLIST> �<DESCRIPTION>sE�This setting is used to determine whether replies are posted, mailed,t?�or both, when you do not specify either the /POST or /MAIL on ar�REPLY command.�<ENDDESCRIPTION>��#�<COMMAND>(SET SEEN\\NEWSRDR_DOC_58)a�� �<OVERVIEW>7�Marks an article or group of articles as <quote>(seen).a �<ENDOVERVIEW>n���<FORMAT>�<FCMD>(SET [NO]SEEN)�<FPARMS>([article-range...]) �<ENDFORMAT>� �<QUAL_LIST> �<QPAIR>(/ALL\)�<QPAIR>(/SUBJECT=(pattern...)\)V�<QPAIR>(/THREAD\)R�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(article-range) �<PARAMDEF>I�A single article number or a starting and ending article number separatedYK�by a hyphen. All articles in the specified range are marked <quote>(seen).��<ENDPARAMDEFLIST>a�� �<DESCRIPTION>pF�This command is used to mark articles as having been seen, even if youM�haven't read them. This prevents them from being displayed with the READ/NEWm�command.F�SET NOSEEN has the reverse effect; it may be used as an alternative to �SET UNSEEN.e�<ENDDESCRIPTION>�� �<QUALDEFLIST> �<QUALITEM>(/ALL) �<QUALDEF>y7�Causes all articles in the current newsgroup to marked.I*�No other qualifiers may be used with /ALL.��!�<QUALITEM>(/SUBJECT=(pattern...))D �<QUALDEF>>J�Causes an article to be marked if its subject matches one of the specifiedG�patterns. If no article range is specified, it defaults to the currentt�article onward.����<QUALITEM>(/THREAD)[ �<QUALDEF>DF�Causes each article in the current newsgroup, from the current article>�onward, to be marked if the subject of the article matches the�subject of the current article. �<ENDQUALDEFLIST>��(�<COMMAND>(SET SIGNATURE\\NEWSRDR_DOC_59)�� �<OVERVIEW>&�Establishes a <quote>(signature) file. �<ENDOVERVIEW> ���<FORMAT>�<FCMD>(SET [NO]SIGNATURE).�<FPARMS>([file-spec])D �<ENDFORMAT>e �<QUAL_LIST> >�<QPAIR>(/[NO]AUTOMATIC=(send-type ...)\/AUTOMATIC=(POST,MAIL))�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(file-spec) �<PARAMDEF>9�Name of the file in which you have stored your signature. �<ENDPARAMDEFLIST>p�� �<DESCRIPTION>�E�This command can be used to establish a <quote>(signature) file. TheAE�contents of the signature file (up to 8 lines of text) is appended toOI�messages you send and articles you post, and can contain information sucheC�as your name, company, E-mail address, etc. Use SET NOSIGNATURE to �clear the signature setting.�<ENDDESCRIPTION>�� �<QUALDEFLIST>p2�<QUALITEM>(/AUTOMATIC=(send-type...)\/NOAUTOMATIC) �<QUALDEF> F�Specifies when the signature file should be automatically appended: onA�mail messages, on article postings, or both. Possible values forwE�<keyword>(send-type) are MAIL and POST. The default is for automaticTL�signature inclusion on both mail and article postings. Specify /NOAUTOMATIC5�to prevent automatic inclusion of the signature file.QG�<p>This setting can be overridden by using the /[NO]SIGNATURE qualifierL/�on the FORWARD, MAIL, POST, and REPLY commands.��<ENDQUALDEFLIST>��%�<COMMAND>(SET UNSEEN\\NEWSRDR_DOC_60).�� �<OVERVIEW>9�Marks an article or group of articles as <quote>(unseen).T �<ENDOVERVIEW>t���<FORMAT>�<FCMD>(SET UNSEEN)�<FPARMS>([article-range...]) �<ENDFORMAT>s �<QUAL_LIST>s�<QPAIR>(/ALL\)�<QPAIR>(/SUBJECT=(pattern...)\)e�<QPAIR>(/THREAD)�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(article-range) �<PARAMDEF>I�A single article number or a starting and ending article number separatedTM�by a hyphen. All articles in the specified range are marked <quote>(unseen).d1�If omitted, the current article is marked unseen.i�<ENDPARAMDEFLIST>a�� �<DESCRIPTION>eH�This command is used to mark articles as having been unseen, so they canF�be recalled the next time you use READ/NEW or READ/NEXT/NEW. This canC�be useful for long articles you want to skip in the current NEWSRDRu-�session but would like to come back to later. �<ENDDESCRIPTION>�� �<QUALDEFLIST>e�<QUALITEM>(/ALL) �<QUALDEF>b7�Causes all articles in the current newsgroup to marked.s/�No other qualifiers may be specified with /ALL.l��!�<QUALITEM>(/SUBJECT=(pattern...))� �<QUALDEF>rJ�Causes an article to be marked if its subject matches one of the specifiedG�patterns. If no article range is specified, it defaults to the currenta�article onward.r�<QUALITEM>(/THREAD)g �<QUALDEF>eF�Causes each article in the current newsgroup, from the current article>�onward, to be marked if the subject of the article matches the�subject of the current article. �<ENDQUALDEFLIST>���<COMMAND>(SHOW\\NEWSRDR_DOC_61)i�� �<OVERVIEW>/�Displays profile settings and other informationu�about the NEWSRDR environment. �<ENDOVERVIEW>o���<FORMAT> �<FCMD>(SHOW)�<FPARMS>(<list>(stacked\braces) �<LE>ARCHIVE_DIRECTORYN�<le>CURRENT_GROUPi�<le>DIRECTORY_WIDTHn�<LE>EDIT�<le>FORM �<LE>GROUP �<LE>HEADERSt�<LE>IGNORE [/GLOBAL] [/LOCAL]r �<LE>NEWSRC�<LE>PERSONAL_NAMEa �<le>QUEUE �<LE>SERVER�<LE>SIGNATURE_FILE�<LE>ALL� �<endlist>) �<ENDFORMAT>n�<PARAMDEFLIST>�<PARAMITEM>(ARCHIVE_DIRECTORY)9�<PARAMDEF>Displays the current archive directory setting.s�<PARAMITEM>(CURRENT_GROUP) �<PARAMDEF>H�Displays the name of the current newsgroup, along with the number of the.�first and last available article in the group.�<paramitem>(DIRECTORY_WIDTH) �<paramdef>.�Displays the current directory width settings.�<paramitem>(EDIT)i �<paramdef>P�Displays the current SET EDIT setting and the name of your selected text editor.�<paramitem>(FORM)i(�Displays the default print form, if any.�<PARAMITEM>(GROUP) �<PARAMDEF>H�Displays the name of the current newsgroup, along with the number of theM�first and last available article in the group. (Same as SHOW CURRENT_GROUP.)T�<paramitem>(HEADERS) �<paramdef>)�Displays the current SET HEADERS setting.d�<paramitem>(IGNORE) �<paramdef>F�Displays the ignore criteria for the current group (/LOCAL) and/or the9�global ignore criteria (/GLOBAL). The default is /LOCAL.,�<paramitem>(NEWSRC)d �<paramdef>!�Displays the newsrc file setting.l�<paramitem>(PERSONAL_NAME) �<paramdef>/�Displays the current SET PERSONAL_NAME setting. �<paramitem>(QUEUE) �<paramdef>)�Displays the default print queue setting.s�<paramitem>(SERVER)n �<paramdef>@�Displays the Internet host name of the NNTP news server machine.�<paramitem>(SIGNATURE_FILE)d �<paramdef>+�Displays the current SET SIGNATURE setting.f�<paramitem>(ALL) �<paramdef>&�Displays all of the above information.�<ENDPARAMDEFLIST>O�� �<DESCRIPTION>fH�This command can be used to look at any of your profile settings as wellK�as some information about your NEWSRDR environment. See the description ofs<�the SET command for more information about profile settings.�<ENDDESCRIPTION>�� �<COMMAND>(SPAWN\\NEWSRDR_DOC_62)�� �<OVERVIEW>@�Creates a subprocess of the current process. The context of theM�subprocess is copied from the current process. You can use the SPAWN command F�to leave NEWSRDR temporarily, perform other functions, and then return �to NEWSRDR.M �<ENDOVERVIEW>a���<FORMAT> �<FCMD>(SPAWN)M�<FPARMS>([command])( �<ENDFORMAT>� �<QUAL_LIST>h)�<QPAIR>(/INPUT=filespec\/INPUT=SYS$INPUT)i*�<QPAIR>(/[NO]LOGICAL_NAMES\/LOGICAL_NAMES),�<QPAIR>(/OUTPUT=filespec\/OUTPUT=SYS$OUTPUT)"�<QPAIR>(/PROCESS=subprocess-name\)�<QPAIR>(/[NO]SYMBOLS\/SYMBOLS)�<QPAIR>(/[NO]WAIT\/WAIT)�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(command) �<PARAMDEF>L�Specifies the DCL command string that executes in the context of the createdN�subprocess. When the command completes, the subprocess terminates and controlI�is returned to the parent process. If this parameter is not specified, anB�subprocess is created that transfers control to DCL command level.�<ENDPARAMDEFLIST>c���� �<QUALDEFLIST>e�<QUALITEM>(/INPUT=filespec) �<QUALDEF>tH�Specifies an input file containing one or more DCL command strings to beO�executed by the spawned subprocess. If you specify a command string along withiO�an input file, the command string is processed before the commands in the inputiA�file. Once processing is complete, the subprocess���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������&�����������������������������~�����NEWSRDR_SRC.BCK����������������)Q��P��[NEWSRDR]NEWSRDR_DOC.SDML;80���������������������������������������������������������������������������������������������������T������������������������������������������� is terminated.t�<QUALITEM>(/[NO]LOGICAL_NAMES) �<QUALDEF>yN�Specifies that the logical names of the parent process are to be copied to theL�subprocess. When you do not want the subprocess to use the logical names ofI�the parent process, enter the qualifier /NOLOGICAL_NAMES. The default ise�/LOGICAL_NAMES.i�<qualitem>(/OUTPUT=filespec) �<qualdef>eJ�Identifies the output file to which the results of the SPAWN operation areJ�written. Whenever you use the /NOWAIT qualifier, you should also use theI�/OUTPUT qualifier to specify a new output destination. Doing so preventsnO�output from being displayed while you are specifying new commands. If you omit(M�the /OUTPUT qualifier, output is written by default to the current SYS$OUTPUTn�device. $�<qualitem>(/PROCESS=subprocess-name) �<qualdef>>L�Specifies the name of the subprocess to be created. The default name of the.�subprocess is <quote>(USERNAME_<emphasis>(n)).�<qualitem>(/[NO]SYMBOLS) �<qualdef>eH�Determines whether the system passes DCL global and local symbols to the%�subprocess. The default is /SYMBOLS.f�<qualitem>(/[NO]WAIT)r �<qualdef>DJ�Controls whether the system waits until the subprocess is completed beforeL�allowing more commands to be specified. The /NOWAIT qualifier allows you toO�specify new commands while the specified subprocess is running. If you specifysN�/NOWAIT, you should also use the /OUTPUT qualifier to direct the output streamN�to a file, rather than displaying it on your terminal. Doing so prevents yourA�terminal from being used by more than one process simultaneously.a�<ENDQUALDEFLIST>��!�<COMMAND>(STORE\\NEWSRDR_DOC_62A) �� �<OVERVIEW>:�Forwards a copy of a news article to yourself by VMS Mail. �<ENDOVERVIEW> ���<FORMAT> �<FCMD>(STORE)l�<FPARMS>([article-number]) �<ENDFORMAT>E�<PARAMDEFLIST>�<PARAMITEM>(article-number)l �<PARAMDEF>K�Number of the article to be sent. If omitted, the current article is sent.a�<ENDPARAMDEFLIST>I�� �<DESCRIPTION>gF�This command sends the specified article by VMS Mail to yourself. The3�message subject is automatically set to the subject(�of the article being forwarded.>J�<p>This command could be used to store articles of interest into VMS Mail,0�where you could organize them into mail folders.�<ENDDESCRIPTION>��$�<COMMAND>(SUBSCRIBE\\NEWSRDR_DOC_63)�� �<OVERVIEW>6�Adds one or more newsgroups to your subscription list. �<ENDOVERVIEW>d���<FORMAT>�<FCMD>(SUBSCRIBE)t�<FPARMS>(newsgroup...) �<ENDFORMAT>i �<QUAL_LIST> �<QPAIR>(/CONFIRM\)�<QPAIR>(/GOTO\)o�<QPAIR>(/[NO]LOG\/LOG)�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(newsgroup) �<PARAMDEF>I�Name of a newsgroup you wish to subscribe to, or a wildcard pattern. All�J�available newsgroups matching the specified patterns will be added to your�subscription list.�<ENDPARAMDEFLIST>��� �<DESCRIPTION>SD�This command is used to begin following one or more newsgroups. TheB�newsgroup name and information about articles you have seen in the)�group are stored in your NEWSRDR profile.u�<ENDDESCRIPTION>�� �<QUALDEFLIST>����<QUALITEM>(/CONFIRM) �<QUALDEF> G�When specified, NEWSRDR asks for confirmation before adding a newsgroupQ�to the subscription list.L�<QUALITEM>(/GOTO)k �<QUALDEF>rL�Causes the subscribed newsgroup to be set as the current group. On wildcard:�subscribes, the last subscribed newsgroup becomes current.�<QUALITEM>(/[NO]LOG) �<QUALDEF> N�By default, NEWSRDR issues a message for each successful addition. Use /NOLOG�to suppress the messages.o�<ENDQUALDEFLIST>��&�<COMMAND>(UNSUBSCRIBE\\NEWSRDR_DOC_64)�� �<OVERVIEW>;�Removes one or more newsgroups from your subscription list.A �<ENDOVERVIEW>c���<FORMAT>�<FCMD>(UNSUBSCRIBE) �<FPARMS>(newsgroup...) �<ENDFORMAT>n �<QUAL_LIST> �<QPAIR>(/CONFIRM\)�<QPAIR>(/[NO]LOG\/LOG)�<ENDQUAL_LIST>�<PARAMDEFLIST>�<PARAMITEM>(newsgroup) �<PARAMDEF>N�Name of a newsgroup you no longer wish to subscribe to, or a wildcard pattern.O�All newsgroups matching the pattern will be removed from the subscription list.u�<ENDPARAMDEFLIST>.�� �<DESCRIPTION>pI�This command is used to end your participation in a newsgroup. The group M�is removed from your NEWSRDR profile, and you will no longer see any articlesg�in that newsgroup.�<ENDDESCRIPTION>�� �<QUALDEFLIST>r�<QUALITEM>(/CONFIRM) �<QUALDEF>CG�When specified, NEWSRDR asks for confirmation before adding a newsgroupa�to the subscription list.o�<QUALITEM>(/[NO]LOG) �<QUALDEF>�N�By default, NEWSRDR issues a message for each successful addition. Use /NOLOG�to suppress the messages.��<ENDQUALDEFLIST>����!�<COMMAND>(UPDATE\\NEWSRDR_DOC_65) �� �<OVERVIEW>=�Updates NEWSRDR's newsgroup information from the NNTP server.e �<ENDOVERVIEW>c���<FORMAT>�<FCMD>(UPDATE) �<FPARMS>( )� �<ENDFORMAT>n �<QUAL_LIST> �<QPAIR>(/PARTIAL\)�<ENDQUAL_LIST>�� �<DESCRIPTION>eF�This command can be used to discover further available unread articlesG�since the last update. This is done automatically for you at the startrH�of a NEWSRDR session, but if you have spent a long time in NEWSRDR, thisL�command should be used. A message is displayed for each newsgroup in which�unseen articles are found.>�<p>Information about all active newsgroups is provided, unless#�you specify the /PARTIAL qualifier.R�<ENDDESCRIPTION>�� �<QUALDEFLIST>M�<QUALITEM>(/PARTIAL) �<QUALDEF>QJ�Only information about newsgroups to which you are subscribed is obtained.I�This qualifier should generally not be used, since the information from aoG�full update is needed for some other NEWSRDR commands to work properly.R�<ENDQUALDEFLIST>�<ENDCOMMAND_SECTION> the use of a newsrc file. Newsrc filesE�are described f��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'�����������������������������~�����NEWSRDR_SRC.BCK����������������Pu��P��[NEWSRDR]DESCRIP.MMS;168�������������������������������������������������������������������������������������������������������_������������������������������5���������������*�[NEWSRDR]DESCRIP.MMS;168�+��,�Pu���.�����/� �@� �4�_������ ��������������������-�P���0���1����2���3������K��P���W���O�����5���6�>Pnrז��7�dnrז��8�9uE��9����������G� �@��H��J������������������������!++� �! DESCRIP.MMS��!�C�! MMS description file for building NEWSRDR and associated files.��!�E�! COPYRIGHT 1992, 1993 MATTHEW D. MADISON. ALL RIGHTS RESERVED.��!��! 12-SEP-1992��!--����.IFDEF __MATTS_MMS__�.ELSE� �OBJ = .OBJ �OLB = .OLB �OPT = .OPT �EXE = .EXE�.ENDIF���.IFDEF __ALPHA__ �.MAR$(OBJ) :1� $(MACRO)$(MFLAGS) ARCH_DEFS.MAR+$(MMS$SOURCE)��.ENDIF�� �.ifdef LIS�MLIST = $(LIS)�.else��MLIST = /LIST=NL:/SHOW=EXPAN�.endif�� �.ifdef DBG�OPTIM = /NOOPTIMIZE��.endif�� �.ifdef DEFINE��DEF = /DEFINE=$(DEFINE)��.endif��<�CFLAGS = /OBJ=$(MMS$TARGET)/NOLIST$(LIS)$(DBG)$(OPTIM)$(DEF)8�LINKFLAGS = /EXE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP)$(DBG)#�MFLAGS = /OBJ=$(MMS$TARGET)$(MLIST)���E�MODULES = NEWSRDR,CMD_READ,CMD_POST,ARTICLE,PARSING,MISC,MEM,FILEIO,-�H� CMD_PRINT,CMD_SETSHO,PAGER,GROUPS,CMD_DIRECTORY,CMD_MISC,MAIL,-I� PARSE822,PARSE822_TABLES,PROFILE,NEWSRC,NEWGROUPS,PARSE_TABLES,-�'� CMD_TABLE,NEWSRDR_CLD,NEWS_MSG���K�NEWSRDR$(EXE) : NEWSRDR$(OLB)($(MODULES)),SERVER_SOCKET$(OBJ),NEWSRDR$(OPT)�_� $(LINK)$(LINKFLAGS) NEWSRDR$(OLB)/INCLUDE=NEWSRDR/LIB,SERVER_SOCKET$(OBJ),NEWSRDR$(OPT)/OPT���O�NEWSRDR-N$(EXE) : NEWSRDR$(OLB)($(MODULES)),SERVER_NETLIB$(OBJ),NEWSRDR-N$(OPT)�O� $(LINK)$(LINKFLAGS) NEWSRDR$(OLB)/INCLUDE=NEWSRDR/LIB,SERVER_NETLIB$(OBJ),-�� NEWSRDR-N$(OPT)/OPT��M�ALL : NEWSRDR$(EXE),NEWSRDR-N$(EXE),NEWSRDR_HELP.HLB(HELP=NEWSRDR_HELP.HLP),-�7� DOCS,KANJI_CONVERSION$(OBJ),NAME_CONVERSION$(OBJ)�� @ !����.�KIT : MAKE_ZIP.EXE,NEWSRDR.ZIP,NEWSRDR_SRC.ZIP� @ !��7�CMD_READ$(OBJ),CMD_POST$(OBJ),ARTICLE$(OBJ),MISC$(OBJ)-�B� CMD_PRINT$(OBJ),CMD_SETSHO$(OBJ)GROUPS$(OBJ),NEWGROUPS$(OBJ),-3� CMD_DIRECTORY$(OBJ),CMD_MISC$(OBJ),MAIL$(OBJ),-�?� PROFILE$(OBJ),NEWSRC$(OBJ),MISC$(OBJ) : NEWSRDR.H,GLOBALS.H���1�PARSING$(OBJ),PARSE822$(OBJ) : NEWSRDR.H,TPADEF.H���P�FILEIO$(OBJ),MEM$(OBJ),NEWSRDR$(OBJ),PAGER$(OBJ),SERVER_NETLIB$(OBJ) : NEWSRDR.H���NEWSRDR.H : NEWS_MSG.H#� SET FILE/TRUNCATE $(MMS$TARGET)����NEWS_MSG.H : NEWS_MSG.MSG�A� GENMSG := $DISK$MULTINET:[MULTINET_PLUS.MULTINET.TOOLS]GENMSG�&� GENMSG $(MMS$SOURCE) $(MMS$TARGET)��+�KANJI_CONVERSION$(OBJ) : KANJI_CONVERSION.C�%�SERVER_SOCKET$(OBJ) : SERVER_SOCKET.C�.�!SERVER_SOCKET_TCPWARE$(OBJ) : SERVER_SOCKET.C>�! DEFINE TCPWARE_INCLUDE MULTINET_ROOT:[MULTINET.INCLUDE],-,�! MULTINET_ROOT:[MULTINET.INCLUDE.SYS],-.�! MULTINET_ROOT:[MULTINET.INCLUDE.NETINET]:�! CC/OBJ=$(MMS$TARGET)/DEFINE=TCPWARE_V30 $(MMS$SOURCE)��=�DOCS : NEWSRDR_DOC.DECW$BOOK,NEWSRDR_DOC.PS,NEWSRDR_DOC.TXT,-�<� NEWSRDR_INST.DECW$BOOK,NEWSRDR_INST.PS,NEWSRDR_INST.TXT� @ !���!�NEWSRDR_DOC.PS : NEWSRDR_DOC.SDML�N� DOC/CONT/NOPRINT/DEVICE=BLANK_PAGES NEWSRDR_DOC.SDML SOFTWARE.REFERENCE PS"�NEWSRDR_DOC.TXT : NEWSRDR_DOC.SDML=� DOC/CONT/NOPRINT NEWSRDR_DOC.SDML SOFTWARE.REFERENCE MAIL�(�NEWSRDR_DOC.DECW$BOOK : NEWSRDR_DOC.SDMLJ� DOC/CONT/NOPRINT/OUT=$(MMS$TARGET) $(MMS$SOURCE) SOFTWARE.ONLINE BOOKR��#�NEWSRDR_INST.PS : NEWSRDR_INST.SDML�<� DOC/CONT/NOPRINT NEWSRDR_INST.SDML SOFTWARE.REFERENCE PS$�NEWSRDR_INST.TXT : NEWSRDR_INST.SDML>� DOC/CONT/NOPRINT NEWSRDR_INST.SDML SOFTWARE.REFERENCE MAIL*�NEWSRDR_INST.DECW$BOOK : NEWSRDR_INST.SDMLJ� DOC/CONT/NOPRINT/OUT=$(MMS$TARGET) $(MMS$SOURCE) SOFTWARE.ONLINE BOOKR��3�MAKE_ZIP.EXE : MAKE_ZIP.OBJ,FILEIO.OBJ,MAKE_ZIP.OPT�.� $(LINK)$(LINKFLAGS) $(MMS$SOURCE_LIST)/OPT��J�NEWSRDR.ZIP : AAAREADME.DOC,AAAREADME.TOO,NEWSRDR_DOC.PS,NEWSRDR_DOC.TXT,-J� NEWSRDR_DOC.DECW$BOOK,NEWSRDR_INST.DECW$BOOK,NEWSRDR.DECW$BOOKSHELF,-2� LIBRARY.DECW$BOOKSHELF,BOOKREADER_SETUP.TXT,-A� NEWSRDR_INST.PS,NEWSRDR_INST.TXT,NEWSRDR_HELP.HLB,LINK.COM,-�3� LINK-ALPHA.COM,NEWSRDR.OLB,NEWSRDR.ALPHA_OLB,-�B� NEWSRDR_STARTUP.COM,NEWSRDR_LOGIN.COM,KANJI_CONVERSION.C,-+� ADDRESS_CONVERSION.C,SERVER_SOCKET.C,-�B� SERVER_SOCKET.OBJ,SERVER_SOCKET.ALPHA_OBJ,SERVER_NETLIB.OBJ,-9� SERVER_NETLIB.ALPHA_OBJ,KANJI_CONVERSION.ALPHA_OBJ,-�-� KANJI_CONVERSION.OBJ,NAME_CONVERSION.C,-�0� [-.NETLIB]NETLIB015.A,[-.NETLIB]NETLIB015.B7� $(LIBR)/COMPRESS/OUTPUT=NEWSRDR$(OLB) NEWSRDR$(OLB)�� PURGE $(MMS$SOURCE_LIST)E� IF F$SEARCH("$(MMS$TARGET)") .NES. "" THEN DELETE $(MMS$TARGET);*�� SET COMMAND MAKE_ZIP.CLD*� MKZIP $(MMS$SOURCE_LIST) $(MMS$TARGET)��O�NEWSRDR_SRC.ZIP : ADDRESS_CONVERSION.C,NEWSRDR.C,PARSING.C,PROFILE.C,GROUPS.C,-�G� ARTICLE.C,PAGER.C,CMD_MISC.C,CMD_READ.C,CMD_SETSHO.C,CMD_PRINT.C,-�Q� CMD_DIRECTORY.C,CMD_POST.C,MAIL.C,MISC.C,NEWSRC.C,FILEIO.C,NEWSRDR_CLD.CLD,-�S� MEM.C,CMD_TABLE.CLD,NEWS_MSG.MSG,NEWSRDR.H,PARSE_TABLES.MAR,NEWSRDR_HELP.RNH,-�J� NEWGROUPS.C,PARSE822.C,PARSE822_TABLES.MAR,ARCH_DEFS.MAR,NEWS_MSG.H,-R� NEWSRDR_DOC.SDML,DESCRIP.MMS,GLOBALS.H,TPADEF.H,NEWSRDR.OPT,SERVER_NETLIB.C,-M� KANJI_CONVERSION.C,NAME_CONVERSION.C,SERVER_SOCKET.C,NEWSRDR_INST.SDML,-�B� MAKE_ZIP.C,MAKE_ZIP.CLD,MAKE_ZIP.OPT,[-.NETLIB]NETLIB_SRC.BCK� PURGE $(MMS$SOURCE_LIST)E� IF F$SEARCH("$(MMS$TARGET)") .NES. "" THEN DELETE $(MMS$TARGET);*�� SET COMMAND MAKE_ZIP.CLD*� MKZIP $(MMS$SOURCE_LIST) $(MMS$TARGET)�� �CONTRIB :�D� DEFINE C DISK$CONTRL:[CONTRIBUTED-SOFTWARE.APPLICATIONS.NEWSRDR]7� IF F$SEARCH("C:*.*;*") .NES. "" THEN DELETE C:*.*;*�� COPY AAAREADME.DOC,.TOO C:G� BACKUP AAAREADME.DOC,AAAREADME.TOO,NEWSRDR_DOC.PS,NEWSRDR_DOC.TXT,-�J� NEWSRDR_DOC.DECW$BOOK,NEWSRDR_INST.DECW$BOOK,NEWSRDR.DECW$BOOKSHELF,-2� LIBRARY.DECW$BOOKSHELF,BOOKREADER_SETUP.TXT,-A� NEWSRDR_INST.PS,NEWSRDR_INST.TXT,NEWSRDR_HELP.HLB,LINK.COM,-�3� LINK-ALPHA.COM,NEWSRDR.OLB,NEWSRDR.ALPHA_OLB,-�B� NEWSRDR_STARTUP.COM,NEWSRDR_LOGIN.COM,KANJI_CONVERSION.C,-+� ADDRESS_CONVERSION.C,SERVER_SOCKET.C,-�B� SERVER_SOCKET.OBJ,SERVER_SOCKET.ALPHA_OBJ,SERVER_NETLIB.OBJ,-H� KANJI_CONVERSION.OBJ,KANJI_CONVERSION.ALPHA_OBJ,NAME_CONVERSION.C,-G� [NETLIB]NETLIB015.A,[NETLIB]NETLIB015.B C:NEWSRDR.BCK/SAVE/INTERCH�H� BACKUP ADDRESS_CONVERSION.C,NEWSRDR.C,PARSING.C,PROFILE.C,GROUPS.C,-G� ARTICLE.C,PAGER.C,CMD_MISC.C,CMD_READ.C,CMD_SETSHO.C,CMD_PRINT.C,-�Q� CMD_DIRECTORY.C,CMD_POST.C,MAIL.C,MISC.C,NEWSRC.C,FILEIO.C,NEWSRDR_CLD.CLD,-�S� MEM.C,CMD_TABLE.CLD,NEWS_MSG.MSG,NEWSRDR.H,PARSE_TABLES.MAR,NEWSRDR_HELP.RNH,-�J� NEWGROUPS.C,PARSE822.C,PARSE822_TABLES.MAR,ARCH_DEFS.MAR,NEWS_MSG.H,-R� NEWSRDR_DOC.SDML,DESCRIP.MMS,GLOBALS.H,TPADEF.H,NEWSRDR.OPT,SERVER_NETLIB.C,-M� KANJI_CONVERSION.C,NAME_CONVERSION.C,SERVER_SOCKET.C,NEWSRDR_INST.SDML,-�B� MAKE_ZIP.C,MAKE_ZIP.CLD,MAKE_ZIP.OPT,[NETLIB]NETLIB_SRC.BCK -#� C:NEWSRDR_SRC.BCK/SAVE/INTERCH�� SET PROTECTION=W:RE C:*.*�������������������a������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(�����������������������������~�����NEWSRDR_SRC.BCK����������������P��P��[NEWSRDR]GLOBALS.H;243���������������������������������������������������������������������������������������������������������,������������������������������>���������������*�[NEWSRDR]GLOBALS.H;2�+��,�P���.�����/� �@� �4�,���������������������������-�P����0���1����2���3������K��P���W���O�����5���6� ��7� ��8�&X&9��9����������G� �@��H��J����������������������������/*�** NEWSRDR globals�*/,� EXTERN unsigned int (*default_action)();,� EXTERN unsigned int (*cleanup_action)();!� EXTERN struct PROF news_prof;� � EXTERN struct CFG news_cfg;'� EXTERN unsigned int image_privs[2];���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������y������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������)�����������������������������~�����NEWSRDR_SRC.BCK����������������MQ��P��[NEWSRDR]TPADEF.H;8������������������������������������������������������������������������������������������������������������S������������������������������t���������������*�[NEWSRDR]TPADEF.H;8�+��,�MQ���.�����/� �@� �4�S�������N��������������������-�P���0���1����2���3������K��P���W���O�����5���6���7�TaX��8�ɽs9��9����������G� �@��H��J�����������������������������#ifndef __TPADEF_LOADED��#define __TPADEF_LOADED 1����/*** MODULE $tpadef ***/N�/* */S�/* TPARSE CONTROL BLOCK. THIS BLOCK IS ONE OF THE ARGUMENTS USED TO CALL TPARSE, */�N�/* AND BECOMES THE ARGUMENT LIST TO ACTION ROUTINES. */N�/* */N�#define TPA$K_COUNT0 8 /* ZERO LEVEL VALUE IS 8 */�#define TPA$M_BLANKS 1�#define TPA$V_BLANKS 0�#define TPA$M_ABBREV 2�#define TPA$V_ABBREV 1�#define TPA$M_ABBRFM 4�#define TPA$V_ABBRFM 2�#define TPA$M_AMBIG 65536��#define TPA$V_AMBIG 16�S�#define TPA$K_LENGTH0 36 /* LENGTH OF ZERO LEVEL PARAMETER BLOCK */�S�#define TPA$C_LENGTH0 36 /* LENGTH OF ZERO LEVEL PARAMETER BLOCK */����struct tpadef {�O� unsigned int tpa$l_count; /* ARGUMENT COUNT (NUMBER OF LONGWORDS) */�F� unsigned int tpa$l_options; /* OPTIONS LONGWORD */L� unsigned int tpa$l_stringcnt; /* BYTE COUNT OF STRING BEING PARSED */K� char *tpa$l_stringptr; /* ADDRESS OF STRING BEING PARSED */�O� unsigned int tpa$l_tokencnt; /* BYTE COUNT OF CURRENT MATCHING TOKEN */�K� char *tpa$l_tokenptr; /* ADDRESS OF MATCHING TOKEN */�� char tpa$b_char;�� char tpadef$$_fill_3[3];J� unsigned int tpa$l_number; /* NUMERIC VALUE OF NUMERIC TOKEN */N� unsigned int tpa$l_param; /* PARAMETER LONGWORD FROM STATE TABLE */� } ;�� � �#endif /* __TPADEF_LOADED */��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������s������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������*�����������������������������~�����NEWSRDR_SRC.BCK����������������P��P��[NEWSRDR]NEWSRDR.OPT;1������������������������������������������������������������������������������������������������������������������������������������������������������*�[NEWSRDR]NEWSRDR.OPT;1�+��,�P���.�����/� �@� �4��������>��������������������-�P����0���1����2���3������K��P���W���O�����5���6�J{2��7�-O-N��8�f*)9��9����������G� �@��H��J��������������������������SYS$SHARE:VAXCRTL.EXE/SHARE��MULTINET_SOCKET_LIBRARY/SHARE�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������y������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������+�����������������������������~�����NEWSRDR_SRC.BCK����������������B_�P��EWSRDR]SERVER_NETLIB.C;18����������������������������������������������������������������������������������������������������R������������������������������+���������������*�[NEWSRDR]SERVER_NETLIB.C;18�+��,�B_��.�����/� �@� �4�R�������X�������������������-�P����0���1����2���3������K��P���W���O�����5���6�dݘ@qז��7�@qז��8�rtE��9����������G� �@��H��J��������(�������������/*�**++�** FACILITY: NEWSRDR��**@�** ABSTRACT: Server communication routines for use with NETLIB.�**�** MODULE DESCRIPTION:��**B�** This module contains the server_xxx routines used by NEWSRDR,?�** written for use with the NETLIB library of access routines.��**�** AUTHOR: M. Madison�9�** COPYRIGHT 1992, 1993 MATTHEW D. MADISON.�"�** ALL RIGHTS RESERVED.�**�** CREATION DATE: 12-SEP-1992��**�** MODIFICATION HISTORY:��**1�** 12-SEP-1992 V1.0 Madison Initial coding.�A�** 17-FEB-1993 V1.0-1 Madison Update for new message formats.�;�** 23-APR-1993 V1.1 Madison New server_check routine.�;�** 03-JUN-1993 V1.1-1 Madison Got time check backwards!��**--�*/�#include "newsrdr.h"��"� static unsigned int ipctx = 0;6� static unsigned int last_check[2], check_intvl[2];2� static $DESCRIPTOR(intvldsc, "0 00:03:00.00");� static TIME tmo;� static int nosignal = 0;���#define NET_K_TCP 1��#define NET_K_UDP 2��#define NET_M_PUSH 1�#define NET_M_NOTRM 2���@� extern unsigned int net_assign(), net_bind(), tcp_connect();E� extern unsigned int tcp_disconnect(), tcp_send(), tcp_get_line();�;� extern unsigned int net_deassign(), net_get_hostname();�� ��/*�**++�** ROUTINE: server_connect��**�** FUNCTIONAL DESCRIPTION:��**�** Connect to the server.��**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**#�** server_connect(char *nodename)��**3�** nodename: ASCIZ_string, read only, by reference��**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/-�unsigned int server_connect(char *nodename) {���� struct dsc$descriptor ndsc;�� unsigned int status;5� static $DESCRIPTOR(longtime, "9999 23:59:59.99");��� � status = net_assign(&ipctx);M� if (!OK(status)) lib$stop(NEWS__NOCONNECT, 2, strlen(nodename), nodename,�� status);)� status = net_bind(&ipctx, NET_K_TCP);�� if (!OK(status)) {� net_deassign(&ipctx);F� lib$stop(NEWS__NOCONNECT, 2, strlen(nodename), nodename, status);� }�1� INIT_SDESC(ndsc, strlen(nodename), nodename);�-� status = tcp_connect(&ipctx, &ndsc, 119);�� if (!OK(status)) {� net_deassign(&ipctx);F� lib$stop(NEWS__NOCONNECT, 2, strlen(nodename), nodename, status);� }� � sys$bintim(&longtime, &tmo);��� sys$gettim(last_check);���� return SS$_NORMAL;���} /* server_connect */� ��/*�**++�** ROUTINE: server_disconnect�**�** FUNCTIONAL DESCRIPTION:��** �** Disconnect from the server.�**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**�** server_disconnect()�**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/"�unsigned int server_disconnect() {��� if (ipctx) {� tcp_disconnect(&ipctx);� net_deassign(&ipctx);� ipctx = 0;�� }���� return SS$_NORMAL;���} /* server_disconnect */�� ��/*�**++�** ROUTINE: server_send�**�** FUNCTIONAL DESCRIPTION:��**�** Send a line to the server.��**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**�** server_send(char *str)��**1�** str: ASCIZ_string, read only, by reference��**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/%�unsigned int server_send(char *str) {���� struct dsc$descriptor sdsc;�� unsigned int status;��'� INIT_SDESC(sdsc, strlen(str), str);�1� status = tcp_send(&ipctx, &sdsc, NET_M_PUSH);�� if (!OK(status)) {(� if (nosignal) return NEWS__SENDERR;� server_disconnect();�(� lib$stop(NEWS__SENDERR, 0, status);� }���� return SS$_NORMAL;���} /* server_send */�� ��/*�**++�** ROUTINE: server_get_line�**�** FUNCTIONAL DESCRIPTION:��**=�** Gets a "line"... that is, a string terminated by <CRLF>,�H�** from the server (stripping off the CRLF before returning to caller).K�** If outlen is specified, no null terminator is added to out. Otherwise,��** a null byte is added.��**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**;�** server_get_line(char *out, int outsize, [int *outlen])��**F�** out: ASCIZ or just plain char_string, write only, by reference)�** outsize: integer, read only, by value�8�** outlen: integer, write only, by refrence (optional)�**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/C�unsigned int server_get_line(char *out, int outsize, int *outlen) {���� struct dsc$descriptor dsc;� unsigned int status; � int len;��� INIT_DYNDESC(dsc);7� status = tcp_get_line(&ipctx, &dsc, 0, 0, 0, &tmo);�� if (!OK(status)) {'� if (nosignal) return NEWS__RCVERR;�� server_disconnect();�'� lib$stop(NEWS__RCVERR, 0, status);�� }�=� if (dsc.dsc$w_length == 1 && *dsc.dsc$a_pointer == '.') {�� str$free1_dx(&dsc);� *out = '\0';�� if (outlen) *outlen = 0;�� return NEWS__EOLIST;�� } ��H� len = (dsc.dsc$w_length < outsize-1) ? dsc.dsc$w_length : outsize-1;(� memcpy(out, dsc.dsc$a_pointer, len);� str$free1_dx(&dsc);�� if (outlen) {�� *outlen = len;� � } else {� *(out+len) = '\0';�� }���� return SS$_NORMAL;���} /* server_get_line */�� ��/*�**++�** ROUTINE: server_get_reply��**�** FUNCTIONAL DESCRIPTION:��**D�** Gets a numeric status code-type reply from the server, possibly%�** along with the accompanying text.��**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**F�** server_get_reply(int echo, int *code, [char *out], [int outsize],"�** [int *outlen])�**)�** echo: boolean, read only, by value�K�** out: ASCIZ (or regular) string, write only, by reference (optional)�4�** outsize: integer, read only, by value (optional)9�** outlen: integer, write only, by reference (optional)��**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/J�unsigned int server_get_reply(int echo, int *code, char *out, int outsize,'� int *outlen) {�� struct dsc$descriptor dsc;� unsigned int status; � int len;��� INIT_DYNDESC(dsc);� while (1) {�8� status = tcp_get_line(&ipctx, &dsc, 0, 0, 0, &tmo);G� if (dsc.dsc$w_length <= 3 || *(dsc.dsc$a_pointer+3) != '-') break;�� }�/� if (echo == SRV__ECHO) put_output_dx(&dsc);�.� if (!OK(status) || dsc.dsc$w_length < 3) {� server_disconnect();�)� lib$stop(NEWS__PROTOERR, 0, status);�� }�5� status = lib$cvt_dtb(3, dsc.dsc$a_pointer, code);�� if (!OK(status)) {� server_disconnect();�)� lib$stop(NEWS__PROTOERR, 0, status);�� }�� if (out) {K� len = dsc.dsc$w_length-5 < outsize-1 ? dsc.dsc$w_length-5 : outsize-1;�� if (len < 0) len = 0;8� if (len > 0) memcpy(out, dsc.dsc$a_pointer+4, len);� str$free1_dx(&dsc);� if (outlen) {� *outlen = len;� � } else {�� *(out+len) = '\0';�� }� }����/*B�** Update last check time since we know the connection's still OK�*/� sys$gettim(last_check);���� return SS$_NORMAL;���} /* server_get_reply */� ��/*�**++�** ROUTINE: get_hostname��**�** FUNCTIONAL DESCRIPTION:��**$�** Returns the local IP host name.�**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**4�** get_hostname(char *hostname, int hostname_size)�**8�** hostname: ASCIZ_string, write only, by reference0�** hostname_size: integer, read only, by value�**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:��**�**�** SIDE EFFECTS: None.�**�**--�*/>�unsigned int get_hostname(char *hostname, int hostname_size) {��� struct dsc$descriptor dsc;� unsigned int status; � int len;��� INIT_DYNDESC(dsc);$� status = net_get_hostname(&dsc);� if (OK(status)) {�/� len = dsc.dsc$w_length < hostname_size-1 ?�2� dsc.dsc$w_length : hostname_size-1;.� memcpy(hostname, dsc.dsc$a_pointer, len);� *(hostname+len) = '\0';� str$free1_dx(&dsc);� }���� return status;���} /* get_hostname */� ��/*�**++�** ROUTINE: server_check��**�** FUNCTIONAL DESCRIPTION:��**5�** Checks that we're still connected to the server.��**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**�** tbs�**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:��**�**�** SIDE EFFECTS: None.�**�**--�*/�unsigned int server_check() {���*� unsigned int now[2], then[2], junk[2];� char tmp[1024];�� unsigned int status;� int reply_code, len;��� sys$gettim(now);1� lib$add_times(last_check, check_intvl, then);�D� if ($VMS_STATUS_SUCCESS(lib$sub_times(then, now, junk))) return;��� nosignal = 1;�!� status = server_send("HELP");�'� if (!$VMS_STATUS_SUCCESS(status)) {�� nosignal = 0;� return status;�� }�R� status = server_get_reply(SRV__NOECHO, &reply_code, tmp, sizeof(tmp)-1, &len);&� if ($VMS_STATUS_SUCCESS(status)) {� while (1) {<� status = server_get_line(tmp, sizeof(tmp)-1, &len);&� if (status == NEWS__EOLIST) {� nosignal = 0;�� return SS$_NORMAL; � }1� if (!$VMS_STATUS_SUCCESS(status)) break;�� }� }�� nosignal = 0;�� return status;���} /* server_check */����������������������������������������������������������������������������������������������������������������������������������������������������������������������S����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,�����������������������������~�����NEWSRDR_SRC.BCK����������������P��P��[NEWSRDR]KANJI_CONVERSION.C;20�������������������������������������������������������������������������������������������������K����� ����������������������������������������*�[NEWSRDR]KANJI_CONVERSION.C;20�+��,�P���.� ����/� �@� �4�K��� ����*�������������������-�P����0���1����2���3������K��P���W���O� ����5���6�&c = ��7�{-= ��8�ST9��9����������G� �@��H��J������������������/*�!++��!�!�! MODULE: KANJI_CONVERSION��!��! FACILITY: NEWSRDR�!�=�! ABSTRACT: JIS/DEC Kanji character conversion routines.��!��! MODULE DESCRIPTION:��!�A�! This module contains routines for use by NEWSRDR that convert�E�! character strings between DEC Kanji and JIS Kanji character sets.�D�! To use these routines with NEWSRDR, compile this module and link�! it with the commands:��!�9�! $ link/share/notrace kanji_conversion,sys$input:/opt�4�! universal=network_to_local,local_to_network�! <ctrl/Z>��!�H�! Then copy it to SYS$LIBRARY and make it available with the commands:�!�D�! $ copy kanji_conversion.exe sys$common:[syslib]/protection=w:reB�! $ install create sys$share:kanji_conversion/share/open/header8�! $ define/system/exec newsrdr_character_conversion -&�! sys$library:kanji_conversion�!�8�! (You need a suitably privileged account to do this.)�!��! AUTHOR: M. Madison�A�! COPYRIGHT 1990, RENSSELAER POLYTECHNIC INSTITUTE.�3�! COPYRIGHT 1992, MATTHEW D. MADISON.��!��! CREATION DATE: 12-NOV-1990��!��! MODIFICATION HISTORY:��!�0�! 12-NOV-1990 V1.0 Madison Initial coding.E�! 07-MAR-1991 V1.0-1 Togawa Fix handling of control characters.�8�! 12-SEP-1992 V2.0 Madison Update for NEWSRDR 4.0.�!--��*/���#include descrip�#include str$routines����#define STATE_ASCII 0��#define STATE_AK 1��#define STATE_AKK 2��#define STATE_KANJI 3��#define STATE_KK 4��#define STATE_KA 6��#define STATE_KAA 7��#define STATE_STOP 9���>�#define append(c) {if (outc-out < outsize-2) *outc++ = (c);}���void5�network_to_local (char *in, char *out, int outsize) {���� char *inc, *outc;�� int state;��� state = STATE_ASCII; � inc = in;�� outc = out;���!� for (inc = in; *inc; inc++) {�� switch (state) {�� case STATE_ASCII:+� if (*inc == 27) state = STATE_AK;�� else append(*inc);� break;� case STATE_AK:�,� if (*inc == 36) state = STATE_AKK;?� else {append(27); append(*inc); state = STATE_ASCII;}�� break;� case STATE_AKK:<� if (*inc == 66 || *inc == 64) state = STATE_KANJI;K� else {state = STATE_ASCII; append(27); append(36); append(*inc);}�� break;� case STATE_KANJI:+� if (*inc == 27) state = STATE_KA;�F� else if (*inc <= 32) {append(*inc);} /* added by H.Togawa */7� else {state = STATE_KK; append(*inc | 0x80);}�� break;� case STATE_KK:�� append (*inc | 0x80);�� state = STATE_KANJI;� break;� case STATE_KA:�,� if (*inc == 40) state = STATE_KAA;?� else {state = STATE_KANJI; append(27); append(*inc);}�� break;� case STATE_KAA:J� if (*inc == 72 || *inc == 66 || *inc == 74) state = STATE_ASCII;K� else {append(27); append(40); append(*inc); state = STATE_KANJI;}�� break;� }� }���� *outc = '\0';����} /* network_to_local */���void5�local_to_network (char *in, char *out, int outsize) {���� char *inc, *outc;�� int state;��� state = STATE_ASCII; � inc = in;�� outc = out;���!� for (inc = in; *inc; inc++) {�.� if (state == STATE_ASCII && *inc > 128) {� state = STATE_KANJI;�,� append(27); append(36); append(64);5� } else if (state == STATE_KANJI && *inc < 128) {�� state = STATE_ASCII;�,� append(27); append(40); append(74);� }� append(*inc & 0x7f);�� }���=� if (state == STATE_KANJI) { /* added by H.Togawa */�:� state = STATE_ASCII; /* The mode should be ASCII */C� append(27); append(40); append(74); /* when terminates. */�� } /* */��� *outc = '\0';����} /* local_to_network */��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������k����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-�����������������������������~�����NEWSRDR_SRC.BCK����������������Q��P��[NEWSRDR]NAME_CONVERSION.C;18��������������������������������������������������������������������������������������������������L���������������������������������������������*�[NEWSRDR]NAME_CONVERSION.C;18�+��,�Q���.�����/� �@� �4�L�������x�������������������-�P���0���1����2���3������K��P���W���O�����5���6�Z5ҍ��7�:5ҍ��8�x.V9��9����������G� �@��H��J������(�������������/*�!++��!� �! MODULE: NAME_CONVERSION�!�(�! FACILITY: NEWSRDR (sample source)�!�A�! ABSTRACT: Example of site-installable nickname conversion.��!��! MODULE DESCRIPTION:��!�D�! This module contains routines for use by NEWSRDR for translating;�! between actual VMS usernames and site-specific aliases.��!�E�! This module contains a fairly primitive lookup table to implement��! the translation.�!�J�! To use this module: MODIFY IT AS NEEDED FOR YOUR SITE, then compile it"�! and link it with the commands:�!��! $ cc name_conversion8�! $ link/share/notrace name_conversion,sys$input:/opt �! sys$share:vaxcrtl/share4�! universal=init,convert,full_convert,cleanup�! <ctrl/Z>��!�F�! Then copy it to SYS$SHARE and make it available with the commands:�!�C�! $ copy name_conversion.exe sys$common:[syslib]/protection=w:re�A�! $ install create sys$share:name_conversion/share/open/header�K�! $ define/system/exec newsrdr_name_conversion sys$share:name_conversion��!�8�! (You need a suitably privileged account to do this.)�!��! AUTHOR: M. Madison�3�! COPYRIGHT 1993 MATTHEW D. MADISON.��!�G�! THIS SOFTWARE IS PROVIDE "AS IS". NEITHER THE AUTHOR NOR TGV, INC.�I�! MAKE ANY GUARANTEES REGARDING THE SUITABILITY, RELIABILITY, SECURITY,�I�! USEFULNESS, OR PERFORMANCE OF THIS SOFTWARE. >>USE AT YOUR OWN RISK.��!��! CREATION DATE: 03-DEC-1990��!��! MODIFICATION HISTORY:��!�0�! 03-DEC-1990 V1.0 Madison Initial coding.4�! 11-MAR-1992 V1.1 Madison Update for MX V3.1.J�! 15-MAY-1992 V1.2 Madison Correct "restat" typo. Add full_convert.�!--��*/���#include descrip�#include string��#include stdio�#include ssdef�#include str$routines��#include lib$routines����#define NICK_TO_ADDRESS 1��#define USERNAME_TO_NICK 2����#define NAME_COUNT 2��,�static char *user [] = {"SMYTHE", "SYSTEM"};6�static char *nick [] = {"J.Smythe", "System.Manager"};���#define FULL_COUNT 2��3�static char *full_user[] = {"MADISON", "SHANDY_P"};�.�static char *full_nick[] = {"madison@tgv.com",G� "Peter_Shandy@portulaca-purple-passion.balaclava.edu"};����struct context {$� struct dsc$descriptor localnode;� };� ���/*�!++��!��! ROUTINE NAME: INIT�!��! FUNCTIONAL DESCRIPTION:��!�L�! Allocates and initializes context block for subsequent name conversions.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! INIT ctxptr�!�>�! ctxptr: pointer, longword (unsigned), modify, by reference�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--��*/ �unsigned int�init (struct context **ctx) {���� int ctxsize;-� $DESCRIPTOR(mx_node_name,"MX_NODE_NAME");���%� ctxsize = sizeof(struct context);�� lib$get_vm (&ctxsize, ctx);�2� (*ctx)->localnode.dsc$b_dtype = DSC$K_DTYPE_T;2� (*ctx)->localnode.dsc$b_class = DSC$K_CLASS_D;'� (*ctx)->localnode.dsc$w_length = 0;�+� (*ctx)->localnode.dsc$a_pointer = NULL;�:� lib$sys_trnlog (&mx_node_name, 0, &(*ctx)->localnode);� return SS$_NORMAL; �} /* init */����/*�!++��!��! ROUTINE NAME: CONVERT��!��! FUNCTIONAL DESCRIPTION:��!�@�! Converts username -> nickname or nickname -> RFC821-address.�!�E�! NB: You MUST use STR$ routines to copy result to OUTSTR parameter�&�! to ensure proper operation!!!!�!�H�! You _may_ safely assume that INSTR is compatible with a DTYPE_T,7�! CLASS_S (standard fixed-length) string descriptor.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�(�! CONVERT ctxptr, code, instr, outstr�!�>�! ctxptr: pointer, longword (unsigned), modify, by referenceK�! code: longword_unsigned, longword (unsigned), read only, by reference�K�! instr: char_string, character string, read only, by descriptor (fixed)�D�! outstr: char_string, character string, write only, by descriptor�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--��*/ �unsigned intG�convert (struct context **ctx, int *code, struct dsc$descriptor *instr,�)� struct dsc$descriptor *outstr) {���$� struct dsc$descriptor tmp, tmp2;� size_t count;�� int i, j, retstat;� $DESCRIPTOR(lbrack, "<");�� $DESCRIPTOR(rbrack, ">");�� $DESCRIPTOR(atsign, "@");���"� count = instr -> dsc$w_length;$� tmp.dsc$b_dtype = DSC$K_DTYPE_T;$� tmp.dsc$b_class = DSC$K_CLASS_D;� tmp.dsc$w_length = 0;�� tmp.dsc$a_pointer = NULL;���%� tmp2.dsc$b_dtype = DSC$K_DTYPE_T;�%� tmp2.dsc$b_class = DSC$K_CLASS_S;���� switch (*code) {�/*�!++��! Local alias -> address��!�H�! This code should return a status of SS$_NORMAL if an alias is found,�! 0 otherwise.�!�H�! If an alias is found, the resulting string MUST BE IN RFC821 format:�!��! <user@host>��!�D�! >>>>>> EVEN IF THE ADDRESS IS FOR THE LOCAL HOST (so you have toB�! look up MX_NODE_NAME and tack it on after the translated name,6�! if you're just doing a local-host user directory).�!--��*/� case NICK_TO_ADDRESS:� retstat = 0;�"� str$copy_dx(&tmp, instr);+� for (i = 0; i < NAME_COUNT; i++) {�.� tmp2.dsc$w_length = strlen(nick[i]);'� tmp2.dsc$a_pointer = nick[i];�:� if (str$case_blind_compare(instr, &tmp2) == 0) {"� j = strlen(user[i]);,� str$copy_r(&tmp, &j, user[i]);8� str$concat(outstr, &lbrack, &tmp, &atsign,,� &(*ctx)->localnode, &rbrack);#� retstat = SS$_NORMAL;�� break; � }� � }� break;����/*�!++��! Username -> Alias��!�@�! Return sucess status ONLY if you are actually converting theG�! username to an alias! Otherwise, return a non-success status code.��!�A�! For compatibility with the name_conversion interface prior to�B�! MX V3.1, you should copy the input string to the output string)�! when you return a non-success status.��!��!--��*/� case USERNAME_TO_NICK:�� retstat = 0;�G� str$copy_dx(outstr, instr); /* for pre-V3.1 compatibility */�+� for (i = 0; i < NAME_COUNT; i++) {�.� tmp2.dsc$w_length = strlen(user[i]);'� tmp2.dsc$a_pointer = user[i];�:� if (str$case_blind_compare(instr, &tmp2) == 0) {"� j = strlen(nick[i]);.� str$copy_r(outstr, &j, nick[i]);#� retstat = SS$_NORMAL;�� break; � }� � }� break;�� }���� return retstat;����} /* convert */���/*�!++��!� �! ROUTINE NAME: FULL_CONVERT�!��! FUNCTIONAL DESCRIPTION:��!�B�! Converts username -> alias address (full address substitution)�!�@�! Unlike the CONVERT routine, FULL_CONVERT converts a usernameD�! to a complete RFC822-type address. You must be running MX V3.1C!�! or later to use this feature.��!�E�! NB: You MUST use STR$ routines to copy result to OUTSTR parameter�&�! to ensure proper operation!!!!�!�H�! You _may_ safely assume that INSTR is compatible with a DTYPE_T,7�! CLASS_S (standard fixed-length) string descriptor.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�-�! FULL_CONVERT ctxptr, code, instr, outstr��!�>�! ctxptr: pointer, longword (unsigned), modify, by referenceK�! code: longword_unsigned, longword (unsigned), read only, by reference�K�! instr: char_string, character string, read only, by descriptor (fixed)�D�! outstr: char_string, character string, write only, by descriptor�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--��*/ �unsigned intL�full_convert (struct context **ctx, int *code, struct dsc$descriptor *instr,)� struct dsc$descriptor *outstr) {���$� struct dsc$descriptor tmp, tmp2;� size_t count;�� int i, j, retstat;� $DESCRIPTOR(lbrack, "<");�� $DESCRIPTOR(rbrack, ">");�� $DESCRIPTOR(atsign, "@");���"� count = instr -> dsc$w_length;$� tmp.dsc$b_dtype = DSC$K_DTYPE_T;$� tmp.dsc$b_class = DSC$K_CLASS_D;� tmp.dsc$w_length = 0;�� tmp.dsc$a_pointer = NULL;���%� tmp2.dsc$b_dtype = DSC$K_DTYPE_T;�%� tmp2.dsc$b_class = DSC$K_CLASS_S;���,� if (*code != USERNAME_TO_NICK) return 0;���/*�!++�/�! Username -> alias (full address conversion)��!�@�! Return sucess status ONLY if you are actually converting theG�! username to an alias! Otherwise, return a non-success status code.��!��!--��*/� retstat = 0;&� for (i = 0; i < FULL_COUNT; i++) {.� tmp2.dsc$w_length = strlen(full_user[i]);'� tmp2.dsc$a_pointer = full_user[i];�5� if (str$case_blind_compare(instr, &tmp2) == 0) {�"� j = strlen(full_nick[i]);.� str$copy_r(outstr, &j, full_nick[i]);� retstat = SS$_NORMAL;� break;� � }� }��� return retstat;����} /* full_convert */����/*�!++��!��! ROUTINE NAME: CLEANUP��!��! FUNCTIONAL DESCRIPTION:��!�8�! Deallocates context block allocated by init routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! CLEANUP ctxptr��!�>�! ctxptr: pointer, longword (unsigned), modify, by reference�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--��*/ �unsigned int �cleanup (struct context **ctx) {��� int ctxsize;��%� str$free1_dx(&(*ctx)->localnode);�%� ctxsize = sizeof(struct context);� � lib$free_vm (&ctxsize, ctx);� *ctx = NULL;� return SS$_NORMAL;�} /* cleanup */��������������������������������������������������������������������������������������������������������������������������������������S����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.�����������������������������~�����NEWSRDR_SRC.BCK����������������K��P��EWSRDR]SERVER_SOCKET.C;41����������������������������������������������������������������������������������������������������R���������������������������������������������*�[NEWSRDR]SERVER_SOCKET.C;41�+��,�K���.�����/� �@� �4�R�������|�������������������-�P����0���1����2���3������K��P���W���O�����5���6�TչKqז��7�2Kqז��8�2}tE��9����������G� �@��H��J��������0�������������/*�!++�!�! MODULE: SERVER_SOCKET��!��! FACILITY: NEWSRDR�!�.�! ABSTRACT: Socket-based SERVER routines.�!��! MODULE DESCRIPTION:��!�F�! This module is a drop-in replacement for the standard NETLIB-basedF�! SERVER module. It uses Berkeley socket routines instead of NETLIBC�! routines and should be compatible with any TCP/IP that supports� �! sockets.�!��! AUTHOR: M. Madison�9�! COPYRIGHT 1992, 1993 MATTHEW D. MADISON.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 25-FEB-1991��!��! MODIFICATION HISTORY:��!�0�! 25-FEB-1991 V1.0 Madison Initial coding.B�! 15-MAY-1991 V1.1 Madison Include mods for Process TCPware.A�! (Martin Egger, Univ. of Bern)�@�! 26-AUG-1991 V1.1-1 Madison Fix zero-length send problem.8�! 25-AUG-1992 V1.1-2 Madison Increasing buffering.9�! 08-SEP-1992 V2.0 Madison Update for NewsRdr V4.0.�J�! 15-DEC-1992 V2.0-1 Madison Update for TCPware V3.0 (new logicals).B�! 17-FEB-1993 V2.0-2 Madison Update for new message formats.:�! 23-APR-1993 V2.1 Madison New server_check routine.<�! 03-JUN-1993 V2.1-1 Madison Got time check backwards!�!--��*/���#include <descrip.h>���#ifdef MULTINET�6�#include "multinet_root:[multinet.include.sys]types.h"7�#include "multinet_root:[multinet.include.sys]socket.h"�7�#include "multinet_root:[multinet.include.netinet]in.h"�2�#include "multinet_root:[multinet.include]netdb.h"�#else��#ifdef TCPWARE �#include "tcpip_include:types.h"!�#include "tcpip_include:socket.h"��#include "tcpip_include:in.h"� �#include "tcpip_include:netdb.h"�#define send socket_send�#define recv socket_recv�#else��#ifdef TCPWARE_V30"�#include "tcpware_include:types.h"#�#include "tcpware_include:socket.h"��#include "tcpware_include:in.h"�"�#include "tcpware_include:netdb.h"�#define send socket_send�#define recv socket_recv�#else��#include <types.h>�#include <socket.h>��#include <in.h>��#include <netdb.h>�#endif�#endif�#endif�#include <lib$routines.h>��#include <str$routines.h>��#include <starlet.h>�#include <ssdef.h>�#include <stsdef.h>��#include <stdlib.h>��#include <string.h>����#pragma nostandard?�int globalvalue NEWS__PROTOERR, NEWS__NOCONNECT, NEWS__SENDERR,�%� NEWS__RCVERR, NEWS__EOLIST;��#pragma standard��� extern short htons(short);#� extern void put_output(char *);�4� extern unsigned int get_logical(char *, char *);���#define SRV__ECHO 1��#define SRV__NOECHO 0���� static int s;�� static int do_echo = 0;�� static int nosignal = 0;6� static unsigned int last_check[2], check_intvl[2];2� static $DESCRIPTOR(intvldsc, "0 00:03:00.00");� ��/*�**++�** ROUTINE: get_hostname��**�** FUNCTIONAL DESCRIPTION:��**$�** Returns the local IP host name.�**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**+�** get_hostname(char *name, int namesize)��**3�** name: ASCIZ_string, write only, by reference�*�** namesize: integer, read only, by value�**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/��,�int get_hostname(char *name, int namesize) {��<� if (gethostname(name, namesize) == 0) return SS$_NORMAL; � return 0;����} /* get_hostname */� ��/*�**++�** ROUTINE: server_connect��**�** FUNCTIONAL DESCRIPTION:��**�** Connects to the server.�**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**#�** server_connect(char *nodename)��**3�** nodename: ASCIZ_string, read only, by reference��**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/$�int server_connect(char *nodename) {��� struct hostent *h;� struct sockaddr_in sin;�� char tmp[1024];�� size_t len;� int bufsize = 32768;�� � h = gethostbyname(nodename);L� if (h == NULL) lib$stop(NEWS__NOCONNECT, 2, strlen(nodename), nodename);��'� sys$bintim(&intvldsc, check_intvl);�(� s = socket(AF_INET, SOCK_STREAM, 0);H� if (s < 0) lib$stop(NEWS__NOCONNECT, 2, strlen(nodename), nodename);*� memset((char *) &sin, 0, sizeof(sin));#� sin.sin_family = h->h_addrtype;�2� memcpy(&sin.sin_addr, h->h_addr, h->h_length);� sin.sin_port = htons(119);��@� if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) {>� lib$stop(NEWS__NOCONNECT, 2, strlen(nodename), nodename);� }���O�/* setsockopt(s, SOL_SOCKET, SO_SNDBUF, (char *) &bufsize, sizeof(bufsize));*/�M� setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char *) &bufsize, sizeof(bufsize));���H� do_echo = $VMS_STATUS_SUCCESS(get_logical("NEWSRDR_SHOW_NNTP",tmp));��� sys$gettim(last_check);���� return SS$_NORMAL;���} /* server_connect */� ��/*�**++�** ROUTINE: server_disconnect�**�** FUNCTIONAL DESCRIPTION:��**!�** Disconnects from the server.��**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**�** server_disconnect()�**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/�int server_disconnect() {���K� return SS$_NORMAL; /* won't actually disconnect until image rundown */����} /* server_disconnect */�� ��/*�**++�** ROUTINE: server_send�**�** FUNCTIONAL DESCRIPTION:��**4�** Sends a line to the server (with CRLF attached)�**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**�** server_send(char *buf)��**1�** buf: ASCIZ_string, read only, by reference��**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/�int server_send(char *buf) {��� static char obuf[16384]; � int len;��!� if (do_echo) put_output(buf);�� len = strlen(buf);� if (len > 16382) {$� if (send(s, buf, len, 0) < 0) {,� if (nosignal) return NEWS__SENDERR;$� lib$stop(NEWS__SENDERR, 0);� })� if (send(s, "\015\012", 2, 0) < 0) {�,� if (nosignal) return NEWS__SENDERR;$� lib$stop(NEWS__SENDERR, 0);� } � } else {)� if (len > 0) memcpy(obuf, buf, len);�%� memcpy(obuf+len, "\015\012", 2);�'� if (send(s, obuf, len+2, 0) < 0) {�,� if (nosignal) return NEWS__SENDERR;$� lib$stop(NEWS__SENDERR, 0);� }� }�� return SS$_NORMAL;���} /* server_send */�� ��/*�**++�** ROUTINE: server_get_line�**�** FUNCTIONAL DESCRIPTION:��**;�** Gets a "line" (a string terminated with CRLF) from the�F�** server (stripping the CRLF before returning the string to caller).�**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**9�** server_get_line(char *out, int outsize, int *outlen)��**@�** out: ASCIZ (or regular) string, write only, by reference)�** outsize: integer, read only, by value�.�** outlen: integer, write only, by reference�**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/:�int server_get_line(char *out, int outsize, int *outlen) {��� static char buf[16384];�� static char *bufp;� static int buflen = 0;� char *eostr;� char *outp=out;�� int status, copylen;��� while (1) {�� if (buflen == 0) {�1� buflen = recv(s, buf, sizeof(buf)-1, 0);�� if (buflen == -1) {,� if (nosignal) return NEWS__RCVERR;$� lib$stop(NEWS__RCVERR, 0); � }� buf[buflen] = '\0';� bufp = buf;1� if (*bufp == '\012') {bufp++; buflen--;}�� }��"� eostr = strchr(bufp, '\015');5� if (eostr == NULL) eostr = strchr(bufp, '\012');�� if (eostr != NULL) {�?� copylen = eostr-bufp > outsize ? outsize : eostr-bufp;�%� memcpy(outp, bufp, copylen);�� outp += copylen;�� outsize -= copylen;$� buflen -= (eostr-bufp) + 1;� bufp = eostr + 1;7� if ((*eostr == '\015') && (*bufp == '\012')) {�� bufp++;�� buflen--;� � }� break;� � } else {�7� copylen = buflen > outsize ? outsize : buflen;�%� memcpy(outp, bufp, copylen);�� outp += copylen;�� outsize -= copylen;� buflen = 0;� }� }���� status = SS$_NORMAL;'� if (outp-out == 1 && *out == '.') {�� *out = '\0';�� return NEWS__EOLIST;�� }�� if (outlen) {�� *outlen = outp-out; � } else {� *outp = '\0';� }���� return SS$_NORMAL;���} /* server_get_line */� ��/*�**++�** ROUTINE: server_get_reply��**�** FUNCTIONAL DESCRIPTION:��**>�** Gets a numeric reply code from the server, possibly along �** with some accompanying text.�**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**F�** server_get_reply(int echo, int *code, [char *out], [int outsize],"�** [int *outlen])�**)�** echo: boolean, read only, by value�.�** code: integer, write only, by referenceJ�** out: ASCIZ (or regular) string, write only by reference (optional)4�** outsize: integer, read only, by value (optional)9�** outlen: integer, write only, by reference (optional)��**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:�/�** SS$_NORMAL: Normal successful completion.��**�** SIDE EFFECTS: None.�**�**--�*/P�int server_get_reply(int echo, int *code, char *out, int outsize, int *outlen) {��� char tmp[1024], *cp;� int status, tmplen;���� while (1) {�;� status = server_get_line(tmp, sizeof(tmp)-1, &tmplen);�5� if (!$VMS_STATUS_SUCCESS(status)) return status;�-� if (tmplen <= 3 || tmp[3] != '-') break;�� }�� *(tmp+tmplen) = '\0';�6� if (do_echo || echo == SRV__ECHO) put_output(tmp);0� if (tmplen < 3) lib$stop(NEWS__PROTOERR, 0);'� status = lib$cvt_dtb(3, tmp, code);�B� if (!$VMS_STATUS_SUCCESS(status)) lib$stop(NEWS__PROTOERR, 0);� if (out != NULL) { �'� if ((tmplen -= 4) < 0) tmplen = 0;�,� if (tmplen > outsize) tmplen = outsize;0� if (tmplen > 0) memcpy(out, tmp+4, tmplen);� if (outlen) {� *outlen = tmplen; � } else {�� *(out+tmplen) = '\0';� }� }����/*B�** Update last check time since we know the connection's still OK�*/� sys$gettim(last_check);���� return SS$_NORMAL;���} /* server_get_reply */� ��/*�**++�** ROUTINE: server_check��**�** FUNCTIONAL DESCRIPTION:��**5�** Checks that we're still connected to the server.��**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**�** tbs�**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:��**�**�** SIDE EFFECTS: None.�**�**--�*/�int server_check() {��*� unsigned int now[2], then[2], junk[2];� char tmp[1024];�� unsigned int status;� int reply_code, len;��� sys$gettim(now);1� lib$add_times(last_check, check_intvl, then);�D� if ($VMS_STATUS_SUCCESS(lib$sub_times(then, now, junk))) return;��� nosignal = 1;�!� status = server_send("HELP");�'� if (!$VMS_STATUS_SUCCESS(status)) {�� nosignal = 0;� return status;�� }�R� status = server_get_reply(SRV__NOECHO, &reply_code, tmp, sizeof(tmp)-1, &len);&� if ($VMS_STATUS_SUCCESS(status)) {� while (1) {<� status = server_get_line(tmp, sizeof(tmp)-1, &len);&� if (status == NEWS__EOLIST) {� nosignal = 0;�� return SS$_NORMAL; � }1� if (!$VMS_STATUS_SUCCESS(status)) break;�� }� }�� nosignal = 0;�� return status;���} /* server_check */����������������������������������������������������������������������������������������������������������������������������������K��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/�����������������������������~�����NEWSRDR_SRC.BCK����������������P��P��[NEWSRDR]NEWSRDR_INST.SDML;24��������������������������������������������������������������������������������������������������U�����-�������������������������'���������������*�[NEWSRDR]NEWSRDR_INST.SDML;24�+��,�P���.�-����/� �@� �4�U���-���)�~�������������������-�P����0���1����2���3������K��P���W���O�*����5���6�}��7�H}��8�vk9��9����������G� �@��H��J������R������������ �<REVISION>2�<define_book_name>(userguide\NEWSRDR User's Guide)�<FRONT_MATTER>(NEWSRDR_INST_1)�� �<TITLE_PAGE>#�<TITLE>(NEWSRDR Installation Guide)��<ABSTRACT>(April, 1993)�H�<P>This manual describes the installation of NEWSRDR, an NNTP-based news�reader for VMS systems.� �<ENDABSTRACT>�*�<REVISION_INFO>(This is a revised manual.)E�<REVISION_INFO>(Operating System and Version:\VAX/VMS V5.2 or later; � �OpenVMS Alpha AXP V1.0 or later)/�<REVISION_INFO>(Software Version:\NEWSRDR V4.2)�K�<ENDTITLE_PAGE>(Matthew Madison<LINE>TGV, Inc.<LINE>Santa Cruz, California)����<COPYRIGHT_PAGE>�<PRINT_DATE>(23 April 1993)�C�<p>Permission is granted to copy and redistribute this document for��no commercial gain.�H�<P>The information in this document is subject to change without notice :�and should not be construed as a commitment by the author.9�The author assumes no responsibility for any errors that ��may appear in this document.0�<p><emphasis>(DISCLAIMER:\bold) The author and8� TGV, Inc. make no representations or warranties withA� respect to the contents hereof and specifically disclaim any�Q� implied warranties of merchantability or fitness for any particular purpose.�A�<P>The following are trademarks of Digital Equipment Corporation:��<TABLE>�!�<TABLE_ATTRIBUTES>(SINGLE_SPACED)��<TABLE_SETUP>(3\20\20)�<TABLE_ROW>(AXP\DEC\OpenVMS)�<TABLE_ROW>(VAX\VMS\)� �<ENDTABLE>2�<p>MultiNet is a registered trademark of TGV, Inc.F�<COPYRIGHT_DATE>(1992, 1993\Matthew D. Madison. All Rights Reserved.)�<ENDCOPYRIGHT_PAGE>��<CONTENTS_FILE>��<PREFACE>(\NEWSRDR_INST_2)L�<p>The NEWSRDR utility provides an interface to USENET news that may be moreI�familiar to VMS users. NEWSRDR attempts to follow the conventions of the�M�VMS MAIL utility in its presentation and command structure whenever possible.�)�<head1>(Intended Audience\NEWSRDR_INST_3)�I�<p>This manual is intended for system managers responsible for installing��and setting up NEWSRDR.�*�<head1>(Document Structure\NEWSRDR_INST_4)C�<p>This document consists of two chapters. Chapter 1 describes the�F�installation of NETLIB, the network interface library used by NEWSRDR.B�Chapter 2 describes the installation and configuration of NEWSRDR.)�<head1>(Related Documents\NEWSRDR_INST_5)�B�<p>The <reference>(userguide) describes how to use NEWSRDR and all�NEWSRDR commands.�-�<p>Internet RFC 1036, <emphasis>(Standard for�6�Interchange of USENET Messages) explains the structure"�of USENET news articles. RFC 977,H�<emphasis>(Network News Transfer Protocol), describes NNTP news service.D�The Internet RFC's are available via anonymous FTP from NIC.DDN.MIL.�� �<ENDPREFACE>�<ENDFRONT_MATTER>�+�<CHAPTER>(Installing NETLIB\NEWSRDR_INST_6)��<note>@�NEWSRDR can use either a Berkeley socket library or the providedB�NETLIB library for communicating with the NNTP server over TCP/IP.C�If your TCP/IP package supports a Berkeley socket interface, you do�E�not need to install NETLIB for use with NEWSRDR, and should skip this��chapter. �<endnote>�<�<p>NEWSRDR can use the NETLIB library for communicating on a<�TCP/IP network. NETLIB is a layered library that is used by;�several of the network utilities available from Rensselaer.�<�It provides basic TCP and UDP services layered on top of one?�of several vendors' TCP/IP packages. As of this writing, NETLIB�=�supports CMU-Tek TCP/IP, DEC TCP/IP Services for VMS, Process�#�Software TCPware, and TGV MultiNet.���?�<head1>(Determining Whether NETLIB is Installed\NEWSRDR_INST_7)�A�<p>You only need to install the NETLIB libraries if they have not�B�already been installed on your system. You can check for NETLIB's�existence with the commands� �<interactive>�#�<s>($ )<u>(SHOW LOGICAL NETLIB_DIR)�&�<s>($ )<u>(SHOW LOGICAL NETLIB_SHRXFR)#�<s>($ )<u>(SHOW LOGICAL NETLIB_SHR)��<endinteractive>E�<p>If these commands succeed, and the files that they point to exist,�>�then NETLIB is installed and you can skip to the next chapter.5�<head1>(Installing NETLIB System-wide\NEWSRDR_INST_8)�E�<p>NETLIB is provided in a distribution kit suitable for installation�H�with VMSINSTAL. The release notes in the A save set of the distributionD�kit describe installation requirements for NETLIB. You can retrieve2�the release notes by using OPTIONS N on VMSINSTAL: �<interactive>�C�<s>($ )<u>(@SYS$UPDATE:VMSINSTAL NETLIB disk:[directory] OPTIONS N)��<endinteractive>C�<p>Once NETLIB has been installed, it should be started by invoking��its startup command procedure: �<interactive>�'�<s>($ )<u>(@SYS$STARTUP:NETLIB_STARTUP)��<endinteractive>A�<p>This should be done from a suitably privileged account, before��you try to install NEWSRDR.�4�<head1>(Personal NETLIB Installation\NEWSRDR_INST_9)E�<P>If you are not a system manager but still want to use NEWSRDR, you�D�can install a copy of NETLIB for your own personal use. To do this,;�create a temporary working directory and SET DEFAULT to it:� �<interactive>�$�<s>($ )<u>(CREATE/DIRECTORY [.TEMP])�<s>($ )<u>(SET DEFAULT [.TEMP])��<endinteractive>U�<p>Next, unload the contents of the NETLIB<emphasis>(vvu).B save set into the working�E�directory and execute NETLIB_USER_INSTALL.COM (substitute appropriate�>�values for <emphasis>(vvu); for example, 012 for NETLIB V1.2): �<interactive>�0�<s>($ )<U>(BACKUP disk:[dir]NETLIBvvn.B/SAVE []) �<S>($ )<U>(@NETLIB_USER_INSTALL)�<endinteractive>C�<p>Answer the questions from the installation script and the NETLIB�D�files will be created. Once the installation procedure is complete,3�you can delete the files and the working directory:� �<interactive>��<s>($ )<u>(SET DEFAULT [-])��<s>($ )<u>(DELETE [.TEMP]*.*;*)�*�<s>($ )<U>(SET PROTECTION=O:RWED TEMP.DIR)�<S>($ )<U>(DELETE TEMP.DIR;)�<ENDINTERACTIVE>��4�<head2>(Personal NETLIB Restriction\NEWSRDR_INST_10)G�<p>You cannot use a personal NETLIB with NETLIB-based applications that��are installed with privileges.��-�<chapter>(Installing NEWSRDR\NEWSRDR_INST_11)�B�<p>NEWSRDR consists of a main executable image (with some possibleI�additions, as described later in this chapter) and requires the following�)�logical names for configuration purposes:�1�<table>(NEWSRDR system logical names\lognamtable)��<table_attributes>(WIDE)�<table_setup>(2\25)�#�<table_heads>(Logical Name\Meaning)�I�<table_row>(NEWSRDR_ANNOUNCE\a message (or a pointer to a file containing�4�a message) that is displayed whe NEWSRDR starts up.)C�<table_row>(NEWSRDR_BANG_ADDRESS\controls whether NEWSRDR generates�G�UUCP bang-format addresses for From and Reply-To headers (as opposed to�&�user@host format). Default is FALSE.)@�<table_row>(NEWSRDR_BANG_PATH\controls whether NEWSRDR generatesG�UUCP bang-format addresses for the Path header (as opposed to user@host�A�format). Default is TRUE. Ignored if NEWSRDR_DO_PATH is FALSE.)��<MARK>K�<table_row>(NEWSRDR_DISABLE_USER_REPLY_TO\when TRUE, users cannot set their�)�own Reply-To headers. Default is FALSE.)�M�<table_row>(NEWSRDR_DISALLOW_POSTING\when defined, the user is prevented from��posting any articles.) �<ENDMARK>�F�<table_row>(NEWSRDR_DO_DATE\controls whether NEWSRDR generates its own �Date headers. Default is FALSE.)H�<table_row>(NEWSRDR_DO_MESSAGE-ID\controls whether NEWSRDR generates its*�own Message-ID headers. Default is FALSE.)K�<table_row>(NEWSRDR_DO_NEWGROUPS\controls whether NEWSRDR sends a NEWGROUPS�G�command to the server at startup. Default is TRUE. Should only be set�J�to FALSE if your NNTP server aborts when it receives a NEWGROUPS command.)L�<table_row>(NEWSRDR_DO_PATH\controls whether NEWSRDR includes a Path: headerL�in articles it posts. Default is TRUE. Should be set to FALSE if requested$�by the manager of your NNTP server.)�<MARK>F�<table_row>(NEWSRDR_FAKE_NEWGROUPS\when TRUE, NEWSRDR does its own newJ�newsgroup discovery. Default is FALSE. Can be set to TRUE if your serverL�does not support NEWGROUPS and you want automatic newsgroup discovery. UseH�of this feature causes all NEWSRDR profiles to list all newgroups on theH�news server, which consumes much more disk space per user than when this�option is disabled.) �<ENDMARK>�K�<table_row>(NEWSRDR_INITIAL_GROUPS\a list of newsgroups that new users will�A�get subscribed to automatically the first time they use NEWSRDR.)�R�<table_row>(NEWSRDR_MAIL_NODE\the node name of the system for mail purposes. ThisM�is used in constructing return addresses in mail messages and news articles.)�L�<table_row>(NEWSRDR_MAIL_PROTOCOL\the VMS MAIL foreign protocol prefix to beL�attached to outgoing mail addresses. The prefix should include the trailing%�percent-sign (e.g., "MX%", "INET%")).�R�<table_row>(NEWSRDR_NODE_NAME\the node name of the system for news purposes. ThisG�is generally the same as the Internet node name or the mail node name.)�O�<table_row>(NEWSRDR_ORGANIZATION\The name of the organization to be used in the�;�<quote>(Organization:) header in news articles. Optional.)�L�<table_row>(NEWSRDR_SERVER\The Internet node name of the NNTP news server to�be used for NEWS sessions.)�E�<table_row>(NEWSRDR_GMT_OFFSET\A VMS delta time string specifying the�E�time differential between local time and Universal Coordinated Time.)�J�<table_row>(NEWSRDR_US_DST_ZONE\Either TRUE or FALSE, depending on whether<�your locality observes U.S. standard daylight savings time.) �<endtable>M�<p>The file NEWSRDR_STARTUP.COM, supplied with the distribution kit, contains�J�sample commands needed for defining these logical names and performing theG�other tasks needed to make NEWSRDR available on the system. You should�F�edit that file as needed for your system and include it in your system�startup sequence.�3�<head1>(Creating the NEWSRDR Image\NEWSRDR_INST_12)�D�<p>The NEWSRDR package comes with the object code required to createB�the NEWSRDR image. A command procedure called LINK.COM is provided�for creating the image:� �<interactive>��<s>($ )<u>(@LINK)��<endinteractive>I�<p>If you wish to link NEWSRDR with your TCP/IP's Berkeley socket library�A�(if it supports one), you must edit LINK.COM first to include the�A�necessary library references appropriate for your TCP/IP package.���%�<head1>(Help Library\NEWSRDR_INST_13)�L�<p>The help library for NEWSRDR may be placed in SYS$HELP, or, if you defineK�logical name NEWSRDR_HELP to be the full file specification of the library,�*�anywhere else on the system. For example: �<interactive>�L�<s>($ )<u>(DEFINE/SYSTEM NEWSRDR_HELP LOCAL_STUFF:[NEWSRDR]NEWSRDR_HELP.HLB)�<endinteractive>��,�<head1>(Privileges Required\NEWSRDR_INST_14)L�<p>NEWSRDR requires TCP/IP network access to the news server to operate. OnL�systems which use the access controls available with the CMU TCP/IP package,;�this may require the granting of a rights identifier to the�$�accounts that will be using NEWSRDR.��M�<p>NEWSRDR uses callable MAIL and the MAIL foreign protocol interface to send�J�mail messages. Therefore, NEWSRDR will need to be INSTALLed with the same3�privileges as VMS MAIL's executable image, MAIL.EXE�"�(if any). NEWSRDR never uses these5�privileges itself, and turns off all image privileges�*�<EMPHASIS>(except) <emphasis>(NETMBX\BOLD)�at the start of execution.J�If you do not wish to use NEWSRDR to send mail, you do not need to install�NEWSRDR with privileges.��0�<head1>(Other User Requirements\NEWSRDR_INST_15)0�<p>NEWSRDR has no extensive disk quota or memoryL�requirements for most operations. The NEWSRDR_PROFILE.NRPF file created forP�each user contains information about only those groups to which users subscribe,A�and should not require more than a few disk blocks for each user.�O�<p>When NEWSRDR retrieves news articles from a news server, it copies them into�J�temporary files created in the user's SYS$SCRATCH directory. Extracts forJ�reply postings, mailings, and print jobs are also created in SYS$SCRATCH. L�Since news articles generally do not exceed a few hundred lines, this should �not be a problem for most users.��+�<head1>(Full-Screen Output\NEWSRDR_INST_16)�D�<p>NEWSRDR displays news articles on a page-by-page basis, much likeB�VMS MAIL. The Screen Management Facility (SMG$) is used to obtainH�the terminal size and perform the screen clears for each page of output.��)�<head1>(Callable Editors\NEWSRDR_INST_17)�M�<p>NEWSRDR can use any callable editor for message composition that meets the��following calling standard:��<list>(unnumbered)J�<le>The callable editor's shareable library name must be xxxSHR.EXE, whereI�<quote>(xxx) is the name by which the editor will be called. The library�F�must reside in SYS$SHARE or must have an exec-mode logical pointing to�the library elsewhere.B�<le>The shareable library must contain an entry point which calledH�xxx$EDIT, which must take the input file-spec and output file-spec, bothG�character strings passed by descriptor, as the first two arguments. If�J�there are optional arguments, the xxx$EDIT routine must not rely on having �more than two arguments present. �<endlist>�M�<p>The Digital-supplied editors TPU, EDT, and TECO, and the (layered product)�E�DEC Language-Sensitive Editor (LSE) all follow this calling standard.�H�Editors that do not qualify as callable can be set up as spawned editorsF�(where the editor is spawned in a subprocess). See the description ofK�the SET EDIT command in the <reference>(userguide) for further information.���+�<head1>(VMS MAIL Interface\NEWSRDR_INST_18)�B�<p>NEWSRDR uses the callable MAIL interface to send mail messages.9�NEWSRDR also assumes that since there is TCP/IP available�H�on the system, there is some form of Internet mailer also available that4�will handle Internet-format (user@domain) addresses.H�<p>A further assumption is that the Internet mailer package used at yourJ�site includes a VMS MAIL <quote>(foreign mail protocol) interface library.N�The logical name NEWSRDR_MAIL_PROTOCOL should specify the protocol prefix usedG�on your system, including the terminating percent-sign. This prefix is�L�automatically prepended to any address specified when a user mails a message�using NEWSRDR.��5�<head1>(Character Conversion Support\NEWSRDR_INST_19)�H�<p>If your news network uses a character representation for its articlesC�that requires conversion from the DEC character set, as do Japanese�G�sites (due to differing Kanji representations), you can accommodate the�I�network character representation by installing a shareable library on the�G�system containing routines that perform the character code conversions.�E�<p>An example of a module containing such routines is provided in the�D�file KANJI_CONVERSION.C as part of the distribution kit. To installG�the KANJI_CONVERSION library as your character code conversion library,� �you must:��<list>(numbered)E�<le>Compile the C module (object code is provided for those without C� �compilers):� �<interactive>��<s>($ )<u>(CC KANJI_CONVERSION)��<endinteractive>'�<le>Create the shareable library image:� �<interactive>�>�<s>($ )<u>(LINK/SHARE/NOTRACE KANJI_CONVERSION,SYS$INPUT:/OPT)6�<S>( )<U>(UNIVERSAL=NETWORK_TO_LOCAL,LOCAL_TO_NETWORK)�<S>( )<U>(<key>(ctrl/Z))�<endinteractive>B�<le>Place the image in SYS$LIBRARY, define the appropriate NEWSRDR#�logical name and INSTALL the image:� �<interactive>�C�<s>($ )<u>(COPY KANJI_CONVERSION.EXE SYS$COMMON:[SYSLIB]/PROT=W:RE)�=�<s>($ )<u>(DEFINE/SYSTEM/EXEC NEWSRDR_CHARACTER_CONVERSION -)�/�<S>(_$ )<U>( SYS$SHARE:KANJI_CONVERSION.EXE)�I�<S>($ )<U>(INSTALL CREATE NEWSRDR_CHARACTER_CONVERSION/OPEN/SHARE/HEADER)��<ENDINTERACTIVE> �<endlist>�E�<p>Note that you must do this from a suitably privileged account, and�H�you must have at least one global section and three global pages free onG�the system to INSTALL the image. The commands for installing the image�I�are provided in the sample NEWSRDR_STARTUP.COM command procedure provided��with the NEWSRDR kit.�?�<p>You only need to INSTALL the character conversion library if�%�NEWSRDR is installed with privileges.���4�<head1>(Establishing Your Time Zone\NEWSRDR_INST_20)<�<p>This is only required if NEWSRDR_DO_DATE is defined TRUE.F�<p>Two logical names control the way date/time stamps are generated byH�NEWSRDR for articles posted by NEWSRDR users. NEWSRDR_GMT_OFFSET shouldK�be defined as a VMS delta time specification preceded by either a plus sign�E�or a minus sign. This value represents the time differential between�L�local time and Universal Coordinated Time (also called Greenwich Mean Time).7�For the U.S. Eastern time zone, you would define it as:I �<interactive>E:�<s>($ )<u>(DEFINE/SYSTEM NEWSRDR_GMT_OFFSET "-0 05:00:00")�<endinteractive>D�<p>The minus sign indicates that Eastern time is 5 hours behind GMT.D�<p>The logical name NEWSRDR_US_DST_ZONE should be defined as TRUE ifG�your locality observes U.S. standard daylight savings time (DST). ThisoI�will cause NEWSRDR to automatically adjust the GMT offset during daylightiD�savings time. If you do not observe U.S. standard DST, you may needD�alter the GMT offset value manually at the beginning and end of your �DST period.r��0�<head1>(Name Conversion Support\NEWSRDR_INST_21)H�<p>If your site does not use VMS usernames for addressing local users inF�network mail, you can install a shareable library containing a routineE�that NEWSRDR will call on to perform username-to-mailname conversionsr.�for addresses that it puts in article headers.H�<p>An example of a module containing the routines needed to support suchD�conversions is provided in the file NAME_CONVERSION.C as part of theB�distribution kit. To install a name conversion library, you must:�<list>(numbered)H�<le>Edit and compile the C module, or develop your own module in another*�language that provides the same interface.'�<le>Create the shareable library image:� �<interactive>\9�<s>($ )<u>(LINK/SHARE/NOTRACE library.OBJ,SYS$INPUT:/OPT)e)�<s>( )<u>(UNIVERSAL=INIT,CONVERT,CLEANUP)C�<s>( )<u>(<KEY>(ctrl/Z))�<endinteractive>D�<le>Place the resulting image in SYS$LIBRARY, define the appropriate,�NEWSRDR logical name, and INSTALL the image: �<interactive>t:�<s>($ )<u>(COPY library.EXE SYS$COMMON:[SYSLIB]/PROT=W:RE)L�<s>($ )<u>(DEFINE/SYSTEM/EXEC NEWSRDR_NAME_CONVERSION SYS$SHARE:library.EXE)D�<S>($ )<U>(INSTALL CREATE NEWSRDR_NAME_CONVERSION/OPEN/SHARE/HEADER)�<ENDINTERACTIVE> �<endlist>�J�<p>The interface used by NEWSRDR is identical to that used by Rensselaer'sB�Message Exchange E-mail software. If you already have installed aD�name conversion library for use with Message Exchange, you need only;�define a logical name to use the same library with NEWSRDR:d �<interactive>hN�<s>($ )<u>(DEFINE/SYSTEM/EXEC NEWSRDR_NAME_CONVERSION MX_SITE_NAME_CONVERSION)�<endinteractive>C�<p>Refer to the sample code provided for further information on theR�name conversion interface.3�<head1>(Address Conversion Support\NEWSRDR_INST_22)eG�<p>When NEWSRDR sends mail, it uses callable Mail routines, forming theeC�addresses by translating the logical name NEWSRDR_MAIL_PROTOCOL andNF�prefixing that to the quoted RFC822 destination address. If your siteG�requires a more sophisticated translation (such as domain name reversalNG�or better handling of special characters in addresses), you can installl=�your own address conversion routine to perform this function.hH�<p>An example of a module containing the routines needed to support suchG�conversions is provided in the file ADDRESS_CONVERSION.C as part of theaF�distribution kit. To install an address conversion library, you must:�<list>(numbered)H�<le>Edit and compile the C module, or develop your own module in another*�language that provides the same interface.'�<le>Create the shareable library image:C �<interactive>c9�<s>($ )<u>(LINK/SHARE/NOTRACE library.OBJ,SYS$INPUT:/OPT)e)�<s>( )<u>(UNIVERSAL=INIT,CONVERT,CLEANUP)U�<s>( )<u>(<KEY>(ctrl/Z))�<endinteractive>D�<le>Place the resulting image in SYS$LIBRARY, define the appropriate,�NEWSRDR logical name, and INSTALL the image: �<interactive>t:�<s>($ )<u>(COPY library.EXE SYS$COMMON:[SYSLIB]/PROT=W:RE)O�<s>($ )<u>(DEFINE/SYSTEM/EXEC NEWSRDR_ADDRESS_CONVERSION SYS$SHARE:library.EXE)aG�<S>($ )<U>(INSTALL CREATE NEWSRDR_ADDRESS_CONVERSION/OPEN/SHARE/HEADER)O�<ENDINTERACTIVE> �<endlist>(C�<p>Refer to the sample code provided for further information on then�address conversion interface.t<�<head1>(Installing NEWSRDR for Personal Use\NEWSRDR_INST_23)O�<p>If you are not the system manager, you can install NEWSRDR for your own use,pH�with the restriction that you may not be able to send mail using NEWSRDR+�(depending on your site's E-mail software).sM�<P>To install NEWSRDR for your own use, create the NEWSRDR image as described G�above, place the image and the help library in directories you own, andc@�edit NEWSRDR_STARTUP.COM to reflect the location of those files.H�You should also edit NEWSRDR_STARTUP.COM to remove the /SYSTEM qualifier#�from the definition of NEWSRDR_DEF. mmand procedure: �<interactive>�'�<s>($ )<u>(@SYS$STARTUP:NETLIB_STARTUP)��<endinteractive>A�<p>This should be done from a suit)����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0�����������������������������~�����NEWSRDR_SRC.BCK����������������Q��P��[NEWSRDR]MAKE_ZIP.C;1159�������������������������������������������������������������������������������������������������������Q������������������������������'���������������*�[NEWSRDR]MAKE_ZIP.C;11�+��,�Q���.�����/� �@� �4�Q��������������������������-�P���0���1����2���3������K��P���W���O�����5���6�cQ ��7�f3Q ��8�Fsk9��9����������G� �@��H��J������������� �������������/*�**++�** FACILITY: NEWSRDR��**8�** ABSTRACT: Build a ZIP command to make a NEWSRDR kit.�**�** MODULE DESCRIPTION:��**�** tbs�**�** AUTHOR: M. Madison�I�** COPYRIGHT 1992, MATTHEW D. MADISON. ALL RIGHTS RESERVED.��**�** CREATION DATE: 13-SEP-1992��**�** MODIFICATION HISTORY:��**1�** 13-SEP-1992 V1.0 Madison Initial coding.��**--�*/�#include <stdio.h>�#include <descrip.h>�#include <string.h>��#include <stsdef.h>��#include <stdlib.h>�Q�#define INIT_DYNDESC(str) {str.dsc$w_length = 0; str.dsc$a_pointer = (void *) 0;\�K� str.dsc$b_class = DSC$K_CLASS_D; str.dsc$b_dtype = DSC$K_DTYPE_T;}�Q�#define INIT_SDESC(str,len,ptr) {str.dsc$w_length=(len);str.dsc$a_pointer=(ptr);\�G� str.dsc$b_class=DSC$K_CLASS_S; str.dsc$b_dtype=DSC$K_DTYPE_T;}�� ��/*�**++�** ROUTINE: make_zip��**�** FUNCTIONAL DESCRIPTION:��**�** tbs�**B�** RETURNS: cond_value, longword (unsigned), write only, by value�**�** PROTOTYPE:�**�** tbs�**�** IMPLICIT INPUTS: None.�**�** IMPLICIT OUTPUTS: None.��**�** COMPLETION CODES:��**�**�** SIDE EFFECTS: None.�**�**--�*/�unsigned int make_zip() {���$� struct dsc$descriptor str, sdsc;/� char *cp, *base, rspec[256], tmp[1024], *s;�� unsigned int status, unit;��� INIT_DYNDESC(str);#� status = lib$get_foreign(&str);�4� if (!$VMS_STATUS_SUCCESS(status)) return status;#� s = malloc(str.dsc$w_length+1);�3� memcpy(s, str.dsc$a_pointer, str.dsc$w_length);�!� *(s+str.dsc$w_length) = '\0';�I� status = file_create("SYS$SCRATCH:ZIP-NEWSRDR.COM", &unit, 0, rspec);�4� if (!$VMS_STATUS_SUCCESS(status)) return status;8� status = file_write(unit, "$ v = 'f$verify(0)", 18);2� status = file_write(unit, "$ set verify", 12);� cp = s+strlen(s);�� while (*cp != ' ') cp--;/� sprintf(tmp, "$ pkzip -@ \"-V\" %s", cp+1);�0� status = file_write(unit, tmp, strlen(tmp));� *cp = '\0';��� � base = s;�� while (1) {�� cp = strchr(base, ',');%� if (!cp) cp = base+strlen(base);�%� file_write(unit, base, cp-base);�� if (!*cp) break;�� base = cp+1;�� }�8� status = file_write(unit, "$ v = 'f$verify(0)", 18);'� sprintf(tmp, "$ delete %s", rspec);�'� file_write(unit, tmp, strlen(tmp));�� file_close(unit);�� sprintf(tmp, "@%s", rspec);�'� INIT_SDESC(sdsc, strlen(tmp), tmp);�!� return lib$do_command(&sdsc);����} /* make_zip */��������������������������������������������������������������������������������������������������������q����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1�����������������������������~�����NEWSRDR_SRC.BCK����������������Q��P��[NEWSRDR]MAKE_ZIP.CLD;2��������������������������������������������������������������������������������������������������������3������������������������������/���������������*�[NEWSRDR]MAKE_ZIP.CLD;2�+��,�Q���.�����/� �@� �4�3���������������������������-�P���0���1����2���3������K��P���W���O�����5���6�f;I��7�`��8�1=9��9����������G� �@��H��J�������������������������DEFINE VERB MKZIP�!� IMAGE SYS$DISK:[]MAKE_ZIP.EXE�3� PARAMETER P1,LABEL=STUFF,VALUE(TYPE=$FILE,LIST)�-� PARAMETER P2,LABEL=FILE,VALUE(TYPE=$FILE)�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������y������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������2�����������������������������~�����NEWSRDR_SRC.BCK����������������P��P��[NEWSRDR]MAKE_ZIP.OPT;1AR;16���������������������������������������������������������������������������������������������������������������������������������Q���������������*�[NEWSRDR]MAKE_ZIP.OPT;1�+��,�P���.�����/� �@� �4����������������������������-�P����0���1����2���3������K��P���W���O�����5���6�敍��7�Ր��8�k9��9����������G� �@��H��J�������������������������SYS$SHARE:VAXCRTL/SHARE�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������y������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������3�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1;38��������������������������������������������������������������������������������������������������������H���������������������������������������*�[NEWSRDR]NETLIB_SRC.BCK;1�+��,���.�H���/� �@� �4�����H��I��������������������-�P����0���1����2���3������K��P���W���O�I���5���6�& ^xؖ��7�&kn^xؖ��8�&kC{F��9����������G� �@��H��J���������� ��������������������������������������������������NETLIB_SRC.BCK��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCKA�BACKUP CMU064_ERRORS.OPT,CMU_DEFS.R32,CMU_ERRORS.OPT,DEBUG.R32,DESCRIP.MMS,FIELDS.R32,KITINSTAL.COM,NETLIB.OPT,NETLIB.R32,NETLIB015.SDML,NETLIBDEF.R32,NETLIB_CMU.VERSION,NETLIB_CMU064.VERSION,NETLIB_CMU064_NET.B32,NETLIB_CMU_MXLOOK.B32,NETLIB_CMU064_UDP.B32,NETLIB_CMU_NET.B32,NETLIB_CMU_TCP.B32,NETLIB_CMU_UDP.B32,NETLIB_MULTINET_NET.B32,NETLIB_MULTINET_TCP.B32,NETLIB_MULTINET_UDP.B32,NETLIB_UCX_NET.B32,NETLIB_UCX_TCP.B32,NETLIB_UCX_UDP.B32,NETLIB_MXLOOK.B32,NETLIB_INSTALL.COM,NETLIB_INSTALL.OPT,NETLIB_MULTINET.VERSION,NETLIB_UCX.VERSION,NETLIB_NULL_MXLOOK.B32,NETLIB_SHRXFR.B32,NETLIB_SHRXFR.VERSION,NETLIB_UCX012.VERSION,NETLIB_USER_INSTALL.COM,NETLIB_VECTOR.MAR,UCX_DEFS.R32,MULTINET_TCPWARE_DEFS.R32,NETLIB_TCPWARE.VERSION,DUMMY.B32,NETLIB.ALPHA_OPT,NETLIB_INSTALL.ALPHA_OPT NETLIB_SRC.BCK/SAVE/INTER/BLOCK=4096/NOCRC/GROU=0 ��MADISON �� �@���呶������T6.0� �_CIA::� �� � �_$1$STA0:� �V6.0� ������������������������������������*�[NETLIB]CMU064_ERRORS.OPT;2�+��,����.� ����/� �@� �4�L��� ����0��������������������-�����0���1����2���3������K��P���W���O� ����5�)��6�E! 7��7���8�[ah��9����������G� �@��H��J�������� ������������ �UNIVERSAL =-(� NET$_IR,- ! INSUFFICIENT RESOURCES.(� NET$_IFC,- ! INVALID FUNCTION CODE.&� NET$_UCT,- ! UNABLE TO CREATE TCB(� NET$_IFS,- ! INVALID FOREIGN SOCKET$� NET$_ILP,- ! INVALID LOCAL PORT(� NET$_NUC,- ! NON-UNIQUE CONNECTION.3� NET$_CSE,- ! CONNECTION TABLE SPACE EXHAUSTED.�<� NET$_NOPRV,- ! INSUFFICIENT PRIVILEGES TO USE LOCAL PORT5� NET$_CIP,- ! CONNECTION ILLEGAL FOR THIS PROCESS�*� NET$_CC,- ! ERROR: CONNECTION CLOSING,� NET$_CDE,- ! CONNECTION DOES NOT EXIST.(� NET$_CR,- ! ERROR: CONNECTION RESET-� NET$_FSU,- ! Foreign-Socket unspecified.�'� NET$_UNN,- ! Unknown Network Node.�&� NET$_VTF,- ! Valid-TCB Table Full%� NET$_CTO,- ! Connection TimeOut.�$� NET$_TWT,- ! Time-Wait TimeOut.E� NET$_FTO,- ! User function timeout. Network event didn't happen.�L� NET$_CRef,- ! Connection REFUSED, RESET in SYN-Recv state. Active open.9� NET$_CCAN,- ! Connection cancelled by process abort.� � NET$_TE,- ! TCP is Exiting.*� NET$_FIP,- ! IO F� ������������unction in Progress.5� NET$_BTS,- ! User specified buffer is Too small.�*� NET$_ihi,- ! invalid known host index"� NET$_bdi,- ! Bad device index.� NET$_epd,- ! error processing device dump)� NET$_URC,- ! Destination Unreachable�(� NET$_IGF,- ! Invalid GTHST function#� NET$_UNA,- ! Unknown host name�%� NET$_UNU,- ! Unknown host number�3� NET$_NYI,- ! User function not yet implemented�1� NET$_NOINA,- ! Access to internet not allowed�0� NET$_NOANA,- ! Access to ARPANET not allowed3� NET$_NOPN,- ! UDP wildcard connection not open�0� NET$_NOADR,- ! Host address not yet resolved*� NET$_GTHFUL,- ! GTHST queue full error*� NET$_DAE,- ! NET$DUMP: Argument error(� NET$_NMLTO,- ! Name-lookup timed-out*� NET$_NSEXIT,- ! Name server is exiting*� NET$_NONS,- ! Name server not running.� NET$_NSQFULL,- ! Name server queue is full1� NET$_DSDOWN,- ! Domain service is unavailable�?� NET$_DSNODS,- ! Domain service: no domain servers contacted�6� NET$_DSINCOMP,- ! Domain service: incomplete reply8� NET$_DSNOADDR,- ! Domain service: no addresses found3� NET$_DSNONAME,- ! Domain service: no name found�;� NET$_DSFMTERR,- ! Domain service: format error in query�2� NET$_DSSRVERR,- ! Domain service: server error0� NET$_DSNAMERR,- ! Domain service: name error;� NET$_DSNOTIMP,- ! Domain service: query not implemented�3� NET$_DSREFUSD,- ! Domain service: query refused�=� NET$_DSNONSRV,- ! Domain service: no usable servers fo������������������������������������������������������NETLIB_SRC.BCK���������������������ETLIB]CMU064_ERRORS.OPT;2����������������������������������������������������������������������������������������������������L����� ��������������������������������������und�:� NET$_DSUNKERR,- ! Domain service: unknown server error@� NET$_DSREFEXC,- ! Domain service: maximum referrals exceeded1� NET$_GREENERR,- ! Unknown name lookup failure�3� NET$_GP_INVREQ,- ! Name lookup: invalid request�:� NET$_GP_INVINF,- ! Name lookup: invalid host info item<� NET$_GP_INVNAM,- ! Name lookup: invalid host name syntax?� NET$_GP_INVADR,- ! Name lookup: invalid host address syntax�:� NET$_GP_INVMBX,- ! Name lookup: invalid mailbox syntax8� NET$_GP_INVCLS,- ! Name lookup: invalid domain class5� NET$_GP_RSBUSY,- ! Name lookup: resolver too busy�<� NET$_GP_NONMSR,- ! Name lookup: no name server availableC� NET$_GP_NOHINF,- ! Name lookup: specified host info unavailable�2� NET$_GP_NOTFND,-������ ������� ! Name lookup: name not found5� NET$_GP_UNKMBX,- ! Name lookup: mailbox not found�<� NET$_GP_NOTIMP,- ! Name lookup: function not implemented9� NET$_GP_TOOBIG,- ! Name lookup: reply too big for UDP�=� NET$_GP_NSDOWN,- ! Name lookup: all name servers are down�-� NET$_NRT ! No route to specified address���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK���������������������[NETLIB]CMU_DEFS.R32;4���������������������������������������������������������������������������������������������������������<����� �������������������������'���������������*�[NETLIB]CMU_DEFS.R32;4�+��,����.� ����/� �@� �4�<��� ����J��������������������-�����0���1����2���3������K��P���W���O� ����5���6�`3Y8��7�`}8��8�Ʒah��9����������G� �@��H��J��������������������������!++��!��! CMU_DEFS.R32�!�<�! Definitions specific to the CMU implementation of NETLIB.�!�0�! 29-JAN-1991 V1.0 Madison Initial coding.�!--�� LIBRARY 'FIELDS';���� _DEF (CTX)� CTX_L_FLINK = _LONG,� CTX_L_BLINK = _LONG,� CTX_Q_BUFQ = _QUAD,� CTX_Q_EXPTIME = _QUAD,�� CTX_Q_CURSTR = _QUAD,� CTX_Q_IOSB = _QUAD,� CTX_L_LSNPORT = _LONG,�� CTX_W_CHAN = _WORD,� CTX_W_FLAGS = _WORD,� _OVERLAY (CTX_W_FLAGS)� � CTX_V_IGNORELF = _BIT,� CTX_V_ACTIVE = _BIT�� _ENDOVERLAY� _ENDDEF (CTX);���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK���������������������[NETLIB]CMU_ERRORS.OPT;1�������������������������������������������������������������������������������������������������������L����� ����������������������������������������*�[NETLIB]CMU_ERRORS.OPT;1�+��,����.� ����/� �@� �4�L��� ������������������������-�����0���1����2���3������K��P���W���O� ����5�)��6� ' 7��7�q��8�bh��9����������G� �@��H��J����������� ������������ �UNIVERSAL = -�(� NET$_IR,- ! INSUFFICIENT RESOURCES.(� NET$_IFC,- ! INVALID FUNCTION CODE.(� NET$_IPC,- ! INVALID PROTOCOL CODE.&� NET$_UCT,- ! UNABLE TO CREATE TCB(� NET$_IFS,- ! INVALID FOREIGN SOCKET$� NET$_ILP,- ! INVALID LOCAL PORT(� NET$_NUC,- ! NON-UNIQUE CONNECTION.3� NET$_CSE,- ! CONNECTION TABLE SPACE EXHAUSTED.�<� NET$_NOPRV,- ! INSUFFICIENT PRIVILEGES TO USE LOCAL PORT5� NET$_CIP,- ! CONNECTION ILLEGAL FOR THIS PROCESS�*� NET$_CC,- ! ERROR: CONNECTION CLOSING,� NET$_CDE,- ! CONNECTION DOES NOT EXIST.(� NET$_CR,- ! ERROR: CONNECTION RESET-� NET$_FSU,- ! Foreign-Socket unspecified.�'� NET$_UNN,- ! Unknown Network Node.�&� NET$_VTF,- ! Valid-TCB Table Full%� NET$_CTO,- ! Connection TimeOut.�$� NET$_TWT,- ! Time-Wait TimeOut.E� NET$_FTO,- ! User function timeout. Network event didn't happen.�L� NET$_CRef,- ! Connection REFUSED, RESET in SYN-Recv state. Active open.9� NET$_CCAN,- ! Connection cancelled by process abort.� � NET$_TE,- ! TCP is Exiting.*� NET$_FIP,- ! IO Function in Progress.5� NET$_BTS,- ! User specified buffer is Too small.�*� NET$_ihi,- ! invalid known host index"� NET$_bdi,- ! Bad device index.� NET$_epd,- ! error processing device dump)� NET$_URC,- ! Destination Unreachable�(� NET$_IGF,- ! Invalid GTHST function#� NET$_UNA,- ! Unknown host name�%� NET$_UNU,- ! Unknown host number�3� NET$_NYI,- ! User function not yet implemented�1� NET$_NOINA,- ! Access to internet not allowed�0� NET$_NOANA,- ! Access to ARPANET not allowed3� NET$_NOPN,- ! UDP wildcard connection not open�0� NET$_NOADR,- ! Host address not yet resolved*� NET$_GTHFUL,- ! GTHST queue full error*� NET$_DAE,- ! NET$DUMP: Argument error(� NET$_NMLTO,- ! Name-lookup timed-out*� NET$_NSEXIT,- ! Name server is exiting*� NET$_NONS,- ! Name server not running.� NET$_NSQFULL,- ! Name server queue is full1� NET$_DSDOWN,- ! Domain service is unavailable�?� NET$_DSNODS,- ! Domain service: no domain servers contacted�6� NET$_DSINCOMP,- ! Domain service: incomplete reply8� NET$_DSNOADDR,- ! Domain service: no addresses found3� NET$_DSNONAME,- ! Domain service: no name found�;� NET$_DSFMTERR,- ! Domain service: format error in query�2� NET$_DSSRVERR,- ! Domain service: server error0� NET$_DSNAMERR,- ! Domain service: name error;� NET$_DSNOTIMP,- ! Domain service: query not implemented�3� NET$_DSREFUSD,- ! Domain service: query refused��>������������=� NET$_DSNONSRV,- ! Domain service: no usable servers found�:� NET$_DSUNKERR,- ! Domain service: unknown server error@� NET$_DSREFEXC,- ! Domain service: maximum referrals exceeded1� NET$_GREENERR,- ! Unknown name lookup failure�3� NET$_GP_INVREQ,- ! Name lookup: invalid request�:� NET$_GP_INVINF,- ! Name lookup: invalid host info item<� NET$_GP_INVNAM,- ! Name lookup: invalid host name syntax?� NET$_GP_INVADR,- ! Name lookup: invalid host address syntax�:� NET$_GP_INVMBX,- ! Name lookup: invali����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK���������������������[NETLIB]CMU_ERRORS.OPT;1�������������������������������������������������������������������������������������������������������L����� �������������������������a�������������d mailbox syntax8� NET$_GP_INVCLS,- ! Name lookup: invalid domain class5� NET$_GP_RSBUSY,- ! Name lookup: resolver too busy�<� NET$_GP_NONMSR,- ! Name lookup: no name server availableC� NET$_GP_NOHINF,- ! Name lookup: specified host info unavailable�2� NET$_GP_NOTFND,- ! Name lookup: name not found5� NET$_GP_UNKMBX,- ! Name lookup: mailbox not found�<� NET$_GP_NOTIMP,- ! Name lookup: function not implemented9� NET$_GP_TOOBIG,- ! Name lookup: reply too big for UDP�=� NET$_GP_NSDOWN,- ! Name lookup: all name servers are down�/� NET$_NRT,- ! No route to specified address�4� NET$_KILL ! This connection has been terminated�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK����������������� ����[NETLIB]DEBUG.R32;8������������������������������������������������������������������������������������������������������������C����� ����������������������������������������*�[NETLIB]DEBUG.R32;8�+��,� ���.� ����/� �@� �4�C��� ����T�������������������-�����0���1����2���3������K��P���W���O� ����5���6�ra7��7�pa7��8�%bh��9����������G� �@��H��J����������������������������"� LIBRARY 'SYS$LIBRARY:STARLET';�� � MACRO�� DBGPRT (CTRSTR) [] =� � BEGIN� IF NOT .DBGTST THEN� BEGIN� DBGTST = 1;�8� DBGSWI = $TRNLNM (TABNAM=%ASCID'LNM$FILE_DEV',0� LOGNAM=%ASCID'NETLIB_DEBUG'); � END;�� IF .DBGSWI THEN� BEGIN� EXTERNAL� TRACE_ROUTINE;� EXTERNAL ROUTINE6� LIB$SYS_FAO : ADDRESSING_MODE (GENERAL),7� STR$FREE1_DX : ADDRESSING_MODE (GENERAL);�3� LOCAL _DBGFAO : BLOCK [DSC$K_S_BLN,BYTE];�"� $INIT_DYNDESC (_DBGFAO);C� LIB$SYS_FAO (%ASCID %STRING ('!%D ', CTRSTR), 0, _DBGFAO,�C� 0 %IF NOT %NULL (%REMAINING) %THEN , %REMAINING %FI);�%� (.TRACE_ROUTINE) (_DBGFAO);� � STR$FREE1_DX (_DBGFAO) � END;� � END %;��������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK���������������������[NETLIB]DESCRIP.MMS;88���������������������������������������������������������������������������������������������������������X������������������������������Y���������������*�[NETLIB]DESCRIP.MMS;88�+��,����.�����/� �@� �4�X��������������������������-�����0���1����2���3������K��P���W���O�����5���6�h` ё��7�6ё��8����������9����������G� �@��H��J������������� �������������.IFDEF __ALPHA__�VEC = DUMMY$(OBJ)��MCH = /NOMACHINE�MXLOPTIM = /NOOPT��.ELSE��.FIRSTX� DEFINE/NOLOG CMUTEK_SRC DISK$ALTUSERS:[USERS.MADISON.RPISRC.CMU065.]/TRANSL=CONCM� DEFINE/NOLOG SYS$LIBRARY RPI$SRC:[CMU064.SYSLIB],SYS$SYSROOT:[SYSLIB]��VEC = NETLIB_VECTOR$(OBJ)��MCH = /MACHINE=NOOBJ �MXLOPTIM = ��.ENDIF�� �.IFDEF DBG�OPTIM = /OPTIM=LEVEL:0�.ENDIF��<�BFLAGS = /OBJ=$(MMS$TARGET)$(MCH)/NOLIST$(LIS)$(DBG)$(OPTIM)!�MFLAGS = /OBJ=$(MMS$TARGET)$(DBG)���G�NETLIB_UCX = NETLIB_UCX_NET,NETLIB_UCX_TCP,NETLIB_UCX_UDP,NETLIB_MXLOOK�M�NETLIB_CMU = NETLIB_CMU_NET,NETLIB_CMU_TCP,NETLIB_CMU_UDP,NETLIB_CMU_MXLOOK,-�$� NETWORK=CMU_NETERROR$(OBJ)D�NETLIB_CMU064 = NETLIB_CMU064_NET,NETLIB_CMU_TCP,NETLIB_CMU064_UDP,-5� NETLIB_MXLOOK,NETWORK=CMU064_NETERROR$(OBJ)�O�NETLIB_UCX012 = NETLIB_UCX_NET,NETLIB_UCX_TCP,NETLIB_UCX_UDP,NETLIB_NULL_MXLOOK�O�NETLIB_MULTINET = NETLIB_MULTINET_NET,NETLIB_MULTINET_TCP,NETLIB_MULTINET_UDP,-�� NETLIB_MXLOOK�?�NETLIB_TCPWARE = NETLIB_MULTINET_NET=NETLIB_TCPWARE_NET$(OBJ),-�9� NETLIB_MULTINET_TCP=NETLIB_TCPWARE_TCP$(OBJ),-�9� NETLIB_MULTINET_UDP=NETLIB_TCPWARE_UDP$(OBJ),-�� NETLIB_MXLOOK����.IFDEF __ALPHA__J�ALL : NETLIB_SHRXFR$(EXE),NETLIB_UCX_SHR$(EXE),NETLIB_MULTINET_SHR$(EXE),-� NETLIB_TCPWARE_SHR$(EXE)�� @ !��.ELSE�J�ALL : NETLIB_SHRXFR$(EXE),NETLIB_UCX_SHR$(EXE),NETLIB_MULTINET_SHR$(EXE),-K� NETLIB_CMU064_SHR$(EXE),NETLIB_UCX012_SHR$(EXE),NETLIB_CMU_SHR$(EXE),-�� NETLIB_TCPWARE_SHR$(EXE)�� @ !��.ENDIF��"�TCPWARE : NETLIB_TCPWARE_SHR$(EXE)� @ !����KIT : NETLIB015.ZIP�� @ !���8�NETLIB015.ZIP : NETLIB015.A, NETLIB015.B, NETLIB_SRC.BCK?� PKZIP "-V" NETLIB015 NETLIB015.A NETLIB015.B NETLIB_SRC.BCK���?�NETLIB_SHRXFR$(EXE) : $(VEC),NETLIB_SHRXFR$(OBJ),NETLIB$(OPT),-�� NETLIB_SHRXFR.VERSION5� $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -�C� NETLIB_SHRXFR$(OBJ),NETLIB$(OPT)/OPT,NETLIB_SHRXFR.VERSION/OPT���E�NETLIB_UCX_SHR$(EXE) : NETLIB_UCX$(OLB)($(NETLIB_UCX)),NETLIB$(OPT),-�� $(VEC),NETLIB_UCX.VERSION5� $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -�=� NETLIB$(OPT)/OPT,NETLIB_UCX.VERSION/OPT,NETLIB_UCX$(OLB)/LIB���N�NETLIB_UCX012_SHR$(EXE) : NETLIB_UCX012$(OLB)($(NETLIB_UCX012)),NETLIB$(OPT),-� $(VEC),NETLIB_UCX.VERSION5� $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -�C� NETLIB$(OPT)/OPT,NETLIB_UCX012.VERSION/OPT,NETLIB_UCX012$(OLB)/LIB���E�NETLIB_CMU_SHR$(EXE) : NETLIB_CMU$(OLB)($(NETLIB_CMU)),NETLIB$(OPT),-�+� $(VEC),NETLIB_CMU.VERSION,CMU_ERRORS$(OPT)�5� $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -�?� NETLIB$(OPT)/OPT,NETLIB_CMU.VERSION/OPT,NETLIB_CMU$(OLB)/LIB,-�� CMU_ERRORS$(OPT)/OPT���N�NETLIB_CMU064_SHR$(EXE) : NETLIB_CMU064$(OLB)($(NETLIB_CMU064)),NETLIB$(OPT),-.� $(VEC),NETLIB_CMU.VERSION,CMU064_ERRORS$(OPT)5� $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -�B� NETLIB$(OPT)/OPT,NETLIB_CMU.VERSION/OPT,NETLIB_CMU064$(OLB)/LIB,-� CMU064_ERRORS$(OPT)/OPT��T�NETLIB_MULTINET_SHR$(EXE) : NETLIB_MULTINET$(OLB)($(NETLIB_MULTINET)),����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK���������������������[NETLIB]DESCRIP.MMS;88���������������������������������������������������������������������������������������������������������X������������������������������h2�������������NETLIB$(OPT),-� $(VEC),NETLIB_MULTINET.VERSION�5� $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -�G� NETLIB$(OPT)/OPT,NETLIB_MULTINET$(OLB)/LIB,NETLIB_MULTINET.VERSION/OPT���Q�NETLIB_TCPWARE_SHR$(EXE) : NETLIB_TCPWARE$(OLB)($(NETLIB_TCPWARE)),NETLIB$(OPT),-�� $(VEC),NETLIB_TCPWARE.VERSION5� $(LINK)/SHARE=$(MMS$TARGET)/NOTRACE/NOMAP$(MAP) -�E� NETLIB$(OPT)/OPT,NETLIB_TCPWARE$(OLB)/LIB,NETLIB_TCPWARE.VERSION/OPT���B�NETLIB_UCX_NET$(OBJ),NETLIB_UCX_TCP$(OBJ),NETLIB_UCX_UDP$(OBJ) : -.� NETLIB$(L32), NETLIBDEF$(L32), UCX_DEFS$(L32)@�NETLIB_CMU_NET$(OBJ),NETLIB_CMU_TCP$(OBJ),NETLIB_CMU_UDP$(OBJ),-7� NETLIB_CMU064_NET$(OBJ),NETLIB_CMU064_UDP$(OBJ) : -�.� NETLIB$(L32), NETLIBDEF$(L32), CMU_DEFS$(L32)Q�NETLIB_MULTINET_NET$(OBJ),NETLIB_MULTINET_TCP$(OBJ),NETLIB_MULTINET_UDP$(OBJ) : -�;� NETLIB$(L32), NETLIBDEF$(L32), MULTINET_TCPWARE_DEFS$(L32)�Q�NETLIB_TCPWARE_NET$(OBJ) : NETLIB_MULTINET_NET.B32,NETLIB$(L32),NETLIBDEF$(L32),-� � MULTINET_TCPWARE_DEFS$(L32)-� $(BLISS)$(BFLAGS)/VARIANT=2 $(MMS$SOURCE)�Q�NETLIB_TCPWARE_TCP$(OBJ) : NETLIB_MULTINET_TCP.B32,NETLIB$(L32),NETLIBDEF$(L32),-� � MULTINET_TCPWARE_DEFS$(L32)#� $(BLISS)$(BFLAGS) $(MMS$SOURCE)�Q�NETLIB_TCPWARE_UDP$(OBJ) : NETLIB_MULTINET_UDP.B32,NETLIB$(L32),NETLIBDEF$(L32),-� � MULTINET_TCPWARE_DEFS$(L32)#� $(BLISS)$(BFLAGS) $(MMS$SOURCE)���N�NETLIB_MXLOOK$(OBJ) : NETLIB$(L32), DEBUG$(L32), NETLIBDEF$(L32), FIELDS$(L32).� $(BLISS)$(BFLAGS)$(MXLOPTIM) $(MMS$SOURCE)&�NETLIB_CMU_MXLOOK$(OBJ) : NETLIB$(L32)��6�!CMU064_NETERROR$(OBJ) : [CMU064.SYSLIB]NETERROR$(OBJ)%�! COPY $(MMS$SOURCE) $(MMS$TARGET)�8�!CMU_NETERROR$(OBJ) : CMUTEK_SRC:[CENTRAL]NETERROR$(OBJ)%�! COPY $(MMS$SOURCE) $(MMS$TARGET)���'�NETLIB$(L32) : NETLIB.R32, FIELDS$(L32)�+�UCX_DEFS$(L32) : UCX_DEFS.R32, FIELDS$(L32)�+�CMU_DEFS$(L32) : CMU_DEFS.R32, FIELDS$(L32)�E�MULTINET_TCPWARE_DEFS$(L32) : MULTINET_TCPWARE_DEFS.R32, FIELDS$(L32)��NETLIBDEF$(L32) : NETLIBDEF.R32��DEBUG$(L32) : DEBUG.R32���(�NETLIB015.RELEASE_NOTES : NETLIB015.SDML/� DOCUMENT $(MMS$SOURCE) SOFTWARE.REFERENCE -�/� MAIL/OUTPUT=$(MMS$TARGET)/NOPRINT/CONTENTS���3�NETLIB015.A : KITINSTAL.COM,NETLIB015.RELEASE_NOTES�"� PURGE/NOLOG $(MMS$SOURCE_LIST)R� BACKUP $(MMS$SOURCE_LIST) NETLIB015.A/SAVE/INTERCHANGE/BLOCK=4096/NOCRC/GR��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������4�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1;38��������������������������������������������������������������������������������������������������������H������������������������v�|�����>�������OU=0��M�NETLIB015.B : NETLIB_INSTALL.COM,NETLIB_USER_INSTALL.COM,NETLIB_INSTALL.OPT,-�$� NETLIBDEF.R32,NETLIBDEF$(L32),-(� NETLIB_VECTOR.OBJ,DUMMY.ALPHA_OBJ,-6� NETLIB_CMU.OLB,NETLIB_UCX.OLB,NETLIB_CMU064.OLB,-B� NETLIB_UCX012.OLB,NETLIB_SHRXFR.OBJ,NETLIB_SHRXFR.ALPHA_OBJ,-� NETLIB_SHRXFR.VERSION,-B� NETLIB_CMU.VERSION,NETLIB_UCX.VERSION,NETLIB_CMU064.VERSION,-F� NETLIB_UCX012.VERSION,NETLIB_TCPWARE.OLB,NETLIB_TCPWARE.VERSION,-L� NETLIB_MULTINET.OLB,NETLIB_MULTINET.ALPHA_OLB,NETLIB_MULTINET.VERSION,-M� NETLIB_UCX.ALPHA_OLB,NETLIB_INSTALL.ALPHA_OPT,NETLIB_TCPWARE.ALPHA_OLB,-�%� CMU_ERRORS.OPT,CMU064_ERRORS.OPT�� LIB/COMPRESS NETLIB_CMU.OLB�� LIB/COMPRESS NETLIB_UCX.OLB�"� LIB/COMPRESS NETLIB_CMU064.OLB"� LIB/COMPRESS NETLIB_UCX012.OLB$� LIB/COMPRESS NETLIB_MULTINET.OLB#� LIB/COMPRESS NETLIB_TCPWARE.OLB�,� @ set command alpha$system:librarian.cldQ� LIB/ALPHA/COMPRESS/OUTPUT=NETLIB_MULTINET.ALPHA_OLB NETLIB_MULTINET.ALPHA_OLB�O� LIB/ALPHA/COMPRESS/OUTPUT=NETLIB_TCPWARE.ALPHA_OLB NETLIB_TCPWARE.ALPHA_OLB�G� LIB/ALPHA/COMPRESS/OUTPUT=NETLIB_UCX.ALPHA_OLB NETLIB_UCX.ALPHA_OLB�"� PURGE/NOLOG $(MMS$SOURCE_LIST)R� BACKUP $(MMS$SOURCE_LIST) NETLIB015.B/SAVE/INTERCHANGE/BLOCK=4096/NOCRC/GROU=0��J�NETLIB_SRC.B��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]DESCRIP.MMS;88���������������������������������������������������������������������������������������������������������X�������������������������������������������CK : CMU064_ERRORS.OPT,CMU_DEFS.R32,CMU_ERRORS.OPT,DEBUG.R32,-6� DESCRIP.MMS,FIELDS.R32,KITINSTAL.COM,NETLIB.OPT,-A� NETLIB.R32,NETLIB015.SDML,NETLIBDEF.R32,NETLIB_CMU.VERSION,-�H� NETLIB_CMU064.VERSION,NETLIB_CMU064_NET.B32,NETLIB_CMU_MXLOOK.B32,-B� NETLIB_CMU064_UDP.B32,NETLIB_CMU_NET.B32,NETLIB_CMU_TCP.B32,-I� NETLIB_CMU_UDP.B32,NETLIB_MULTINET_NET.B32,NETLIB_MULTINET_TCP.B32,-�D� NETLIB_MULTINET_UDP.B32,NETLIB_UCX_NET.B32,NETLIB_UCX_TCP.B32,->� NETLIB_UCX_UDP.B32,NETLIB_MXLOOK.B32,NETLIB_INSTALL.COM,-D� NETLIB_INSTALL.OPT,NETLIB_MULTINET.VERSION,NETLIB_UCX.VERSION,-E� NETLIB_NULL_MXLOOK.B32,NETLIB_SHRXFR.B32,NETLIB_SHRXFR.VERSION,-�F� NETLIB_UCX012.VERSION,NETLIB_USER_INSTALL.COM,NETLIB_VECTOR.MAR,-D� UCX_DEFS.R32,MULTINET_TCPWARE_DEFS.R32,NETLIB_TCPWARE.VERSION,-8� DUMMY.B32,NETLIB.ALPHA_OPT,NETLIB_INSTALL.ALPHA_OPT"� PURGE/NOLOG $(MMS$SOURCE_LIST)N� BACKUP $(MMS$SOURCE_LIST) $(MMS$TARGET)/SAVE/INTER/BLOCK=4096/NOCRC/GROU=0�������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]FIELDS.R32;11����������������������������������������������������������������������������������������������������������G����� ����������������������������������������*�[NETLIB]FIELDS.R32;11�+��,����.� ����/� �@� �4�G��� ����f�������������������-�����0���1����2���3������K��P���W���O� ����5���6�J3I��7�>Ȧ��8�_^bh��9����������G� �@��H��J�������������� ������������ �COMPILETIME�� _FLD_CUR_BYT = 0,� _FLD_CUR_BIT = 0,� _FLD_SAV_BYT = 0,� _FLD_SAV_BIT = 0,� _FLD_WRK_SIZE = 0,� _FLD_WRK_BITS = 0,� _FLD_FLD_COUNT = 0;���MACRO�� _DEF (NAM) =� %ASSIGN (_FLD_CUR_BYT, 0)� %ASSIGN (_FLD_CUR_BIT, 0) � %ASSIGN (_FLD_FLD_COUNT, 0) � FIELD*� %QUOTENAME (NAM, '_FIELDS') = SET� %,��� _ENDDEF (NAM) =� � TES;�!� %IF _FLD_CUR_BIT GTR 0 %THEN�1� %ASSIGN (_FLD_CUR_BYT, _FLD_CUR_BYT + 1)�� %FI;� LITERAL %NAME (NAM, '_S_', NAM, 'DEF') = _FLD_CUR_BYT;�� MACRO %NAME (NAM, 'DEF') =�5� BLOCK [%NAME (NAM, '_S_', NAM, 'DEF'), BYTE]�0� FIELD (%NAME (NAM, '_FIELDS')) %QUOTE %� %,��� _FIELD (SIZ) =/� %ASSIGN (_FLD_FLD_COUNT, _FLD_FLD_COUNT+1)�B� %ASSIGN (_FLD_WRK_BITS, %IF SIZ GTR 32 %THEN 0 %ELSE SIZ %FI)��0� [_FLD_CUR_BYT,_FLD_CUR_BIT,_FLD_WRK_BITS,0]��C� %ASSIGN (_FLD_WRK_BITS, _FLD_CUR_BYT * 8 + _FLD_CUR_BIT + SIZ)�.� %ASSIGN (_FLD_CUR_BYT, _FLD_WRK_BITS / 8)0� %ASSIGN (_FLD_CUR_BIT, _FLD_WRK_BITS MOD 8)� %,�� � _BYTE = � _ALIGN (BYTE)� _FIELD (8)�� %,��� _BYTES (COUNT) =� _ALIGN (BYTE)� _FIELD (COUNT * 8)�� %,�� � _WORD =�� _ALIGN (BYTE)� _FIELD (16)� %,�� � _LONG =�� _ALIGN (BYTE)� _FIELD (32)� %,�� � _QUAD =�� _ALIGN (BYTE)� _FIELD (64)� %,�� � _BIT =� _FIELD (1)�� %,��� _BITS (N) =�� _FIELD (N)�� %,��� _OVERLAY (NAM) =)� %ASSIGN (_FLD_SAV_BYT, _FLD_CUR_BYT)�)� %ASSIGN (_FLD_SAV_BIT, _FLD_CUR_BIT)�2� %ASSIGN (_FLD_CUR_BYT, %FIELDEXPAND (NAM, 0))2� %ASSIGN (_FLD_CUR_BIT, %FIELDEXPAND (NAM, 1))� %,��� _ENDOVERLAY =�)� %ASSIGN (_FLD_CUR_BYT, _FLD_SAV_BYT)�)� %ASSIGN (_FLD_CUR_BIT, _FLD_SAV_BIT)�� %,��� _ALIGN (ATYPE) =� %ASSIGN (_FLD_WRK_BITS, 0)�� %ASSIGN (_FLD_WRK_SIZE,-� %IF %IDENTICAL (ATYPE, BYTE) %THEN 1�3� %ELSE %IF %IDENTICAL (ATYPE, WORD) %THEN 2�3� %ELSE %IF %IDENTICAL (ATYPE, LONG) %THEN 4�3� %ELSE %IF %IDENTICAL (ATYPE, QUAD) %THEN 8�%� %ELSE ATYPE %FI %FI %FI %FI)���!� %IF _FLD_CUR_BIT NEQ 0 %THEN�2� %ASSIGN (_FLD_WRK_BITS, 8 - _FLD_CUR_BIT)9� %IF _FLD_CUR_BYT+1 MOD _FLD_WRK_SIZE NEQ 0 %THEN�1� %ASSIGN (_FLD_WRK_BITS, _FLD_WRK_BITS +�G� (_FLD_WRK_SIZE - (_FLD_CUR_BYT+1) MOD _FLD_WRK_SIZE) * 8)� � %FI � %ELSE7� %IF _FLD_CUR_BYT MOD _FLD_WRK_SIZE NEQ 0 %THEN�!� %ASSIGN (_FLD_WRK_BITS,�C� (_FLD_WRK_SIZE - _FLD_CUR_BYT MOD _FLD_WRK_SIZE) * 8)� � %FI� %FI"� %IF _FLD_WRK_BITS GTR 0 %THEN � %ASSIGN (_FLD_WRK_BITS,:� _FLD_CUR_BYT * 8 + _FLD_CUR_BIT + _FLD_WRK_BITS)2� %ASSIGN (_FLD_CUR_BYT, _FLD_WRK_BITS / 8)"� %ASSIGN (_FLD_CUR_BIT, 0)� %FI� %;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]KITINSTAL.COM;118������������������������������������������������������������������������������������������������������M����� �������������������������~���������������*�[NETLIB]KITINSTAL.COM;118�+��,����.� ����/� �@� �4�M��� ����N��������������������-�����0���1����2���3������K��P���W���O� ����5���6�Ҫ؅��7�R|oم��8�&ibh��9����������G� �@��H��J���������� �������������$! [NETLIB]KITINSTAL.COM�$!.�$! KITINSTAL procedure for installing NETLIB.�$!0�$! 31-JAN-1991 V1.0 Madison Initial coding.M�$! 05-FEB-1991 V1.0-1 Madison Two parts for integration into other kits.��$!)�$ ON CONTROL_Y THEN GOTO NETLIB_CONTROL_Y�"�$ ON WARNING THEN GOTO NETLIB_FAIL�$!5�$ IF P1 .EQS. "VMI$_INSTALL" THEN GOTO NETLIB_INSTALL��$ EXIT VMI$_UNSUPPORTED��$!�$NETLIB_CONTROL_Y:�$ VMI$CALLBACK CONTROL_Y�$! �$NETLIB_FAIL:��$ NETLIB_STATUS == $STATUS=�$ IF F$TRNLNM ("NETLIB_STUP") .NES. "" THEN CLOSE NETLIB_STUP��$ EXIT 'NETLIB_STATUS��$!�$NETLIB_INSTALL:�$!�$ IF P2 THEN SET VERIFY��$! �$ NETLIB_SAY := WRITE SYS$OUTPUT�$!#�$ IF F$GETSYI("HW_MODEL") .LT. 1024��$ THEN�$ NETLIB_VAX = 1�$ NETLIB_AXP = 0�$ NETLIB_REQD_VMSVER = "V5.0"�"�$ NETLIB_REQD_VMSVER_OLD = "050"K�$ VMI$CALLBACK CHECK_VMS_VERSION NETLIB_VMSVEROK 'NETLIB_REQD_VMSVER_OLD'��$ IF .NOT. NETLIB_VMSVEROK�$ THEN$�$ VMI$CALLBACK MESSAGE E VMSVER -F� "This product requires VMS version ''NETLIB_REQD_VMSVER' to run.'�$ EXIT VMI$_FAILURE �$ ENDIF��$ ELSE�$ NETLIB_VAX = 0�$ NETLIB_AXP = 1�$ ENDIF��$!�$!C�$ VMI$CALLBACK CHECK_NET_UTILIZATION NETLIB_ENOUGHDISK 3000 30 3000�3�$ IF .NOT. NETLIB_ENOUGHDISK THEN EXIT VMI$_FAILURE��$!*�$ VMI$CALLBACK SET SAFETY CONDITIONAL 5000�$!�$!�$ TYPE SYS$INPUT:���5� NETLIB Installation Procedure���G� Copyright 1992, 1993 Matthew D. Madison. All Rights Reserved.�@� Redistribution for no commercial gain is permitted.���$!�$!�$ VMI$CALLBACK SET PURGE ASK �$ VMI$CALLBACK RESTORE_SAVESET B9�$ @VMI$KWD:NETLIB_INSTALL 'P1 'P2 'P3 'P4 'P5 'P6 'P7 'P8��$ NETLIB_STATUS == $STATUS+�$ IF NETLIB_STATUS .EQ. VMI$_SUCCESS THEN -�� TYPE SYS$INPUT��E� All NETLIB images have been linked. Remember to edit your system�<� startup command procedure to add the following commmand:��%� $ @SYS$STARTUP:NETLIB_STARTUP���B� The file SYS$STARTUP:NETLIB_STARTUP.COM can be edited to alterE� the selection of the default NETLIB transport library, as needed.����$!�$ EXIT 'NETLIB_STATUS��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB.OPT;10����������������������������������������������������������������������������������������������������������+����� �������������������������m ���������������*�[NETLIB]NETLIB.OPT;10�+��,����.� ����/� �@� �4�+��� ������������������������-�����0���1����2���3������K��P���W���O� ����5���6�-)��7��-)��8�/bh��9����������G� �@��H��J���������������������������GSMATCH=LEQUAL,1,4+�CLUSTER=$$NETLIB_VECTOR,,,NETLIB_VECTOR.OBJ��CLUSTER=CLUSTER1���PSECT_ATTR=$CODE$,PIC,SHR��PSECT_ATTR=$PLIT$,PIC,SHR�&�COLLECT = CLUSTER1,$CODE$,$CODE,$PLIT$���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB.R32;7�����������������������������������������������������������������������������������������������������������N����� ������������������������� ���������������*�[NETLIB]NETLIB.R32;7�+��,����.� ����/� �@� �4�N��� �����������������������-�����0���1����2���3������K��P���W���O� ����5���6� 2��7�FK+2��8�qbh��9����������G� �@��H��J��������������� �������������!++� �! NETLIB.R32�!�4�! Common definitions for all NETLIB implementations.�!�0�! 29-JAN-1991 V1.0 Madison Initial coding.�!��!--���� LIBRARY 'FIELDS';�"� LIBRARY 'SYS$LIBRARY:STARLET';�� � BUILTIN�� INSQUE, REMQUE;�� � LITERAL�B� STR_MAX = 32765; ! maximum length of string for TCP_GET_LINE��� _DEF (QUE)� QUE_L_HEAD = _LONG,�� QUE_L_TAIL = _LONG� _ENDDEF (QUE);��� _DEF (SND)� SND_Q_SNDBUF = _QUAD,� SND_L_CTX = _LONG,� SND_L_ASTADR = _LONG,� SND_L_ASTPRM = _LONG�� _ENDDEF (SND);�� � LITERAL�� RCV_S_BUF = 1024;��� _DEF (RCV)� RCV_L_FLINK = _LONG,� RCV_L_BLINK = _LONG,� RCV_Q_IOSB = _QUAD,� RCV_Q_TMO = _QUAD,� RCV_L_STRPTR = _LONG,� RCV_L_CTX = _LONG,� RCV_L_USRIOSB = _LONG,�� RCV_L_ASTADR = _LONG,� RCV_L_ASTPRM = _LONG,� RCV_L_TRIGGERED = _LONG,�� RCV_L_BUFPTR = _LONG,%� RCV_T_BUF = _BYTES (RCV_S_BUF)�� _ENDDEF (RCV);��� _DEF (IOSB)�� IOSB_W_STATUS = _WORD,�� IOSB_W_USTAT = _WORD,� _OVERLAY (IOSB_W_USTAT)� IOSB_W_COUNT = _WORD,� _ENDOVERLAY� IOSB_L_ADDRESS = _LONG�� _ENDDEF (IOSB);��� � MACRO�� INIT_DYNDESC (STR) [] =� BEGIN� __INIT_DYNDESC1 (STR@� %IF NOT %NULL (%REMAINING) %THEN , %REMAINING %FI)� END%,� __INIT_DYNDESC1 (STR) [] =�;� BLOCK [STR, DSC$W_LENGTH; DSC$K_S_BLN,BYTE] = 0;�G� BLOCK [STR, DSC$B_CLASS; DSC$K_S_BLN,BYTE] = DSC$K_CLASS_D;�G� BLOCK [STR, DSC$B_DTYPE; DSC$K_S_BLN,BYTE] = DSC$K_DTYPE_T;�;� BLOCK [STR, DSC$A_POINTER; DSC$K_S_BLN,BYTE] = 0;�N� %IF NOT %NULL (%REMAINING) %THEN ; __INIT_DYNDESC1 (%REMAINING) %FI%,��� FREE_STRINGS (STR) [] =� BEGINJ� EXTERNAL ROUTINE STR$FREE1_DX : BLISS ADDRESSING_MODE (GENERAL);� __FREE_STRING1 (STR�@� %IF NOT %NULL (%REMAINING) %THEN , %REMAINING %FI)� END%,� __FREE_STRING1 (STR) [] =� STR$FREE1_DX (STR);M� %IF NOT %NULL (%REMAINING) %THEN ; __FREE_STRING1 (%REMAINING) %FI%,���� G_HAT (RTN) [] =�.� RTN : BLISS ADDRESSING_MODE (GENERAL)D� %IF NOT %NULL (%REMAINING) %THEN , G_HAT (%REMAINING) %FI%,��� INIT_QUEUE (X) [] =� BEGIN� BIND Q = X : QUEDEF;;� Q [QUE_L_TAIL] = Q [QUE_L_HEAD] = Q [QUE_L_HEAD];� � ENDG� %IF NOT %NULL (%REMAINING) %THEN ; INIT_QUEUE (%REMAINING) %FI�� %;���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������T����[NETLIB]NETLIB015.SDML;9�������������������������������������������������������������������������������������������������������Q������������������������������'���������������*�[NETLIB]NETLIB015.SDML;9�+��,�T���.�����/� �@� �4�Q�������~��������������������-�����0���1����2���3������K��P���W���O�����5���6�x`��7�Ot��8����������9����������G� �@��H��J����������� �������������<DEFINE_SYMBOL>(ver\V1.5D)�<FRONT_MATTER>�� �<TITLE_PAGE>�<TITLE>(NETLIB Release Notes)��<ABSTRACT>(April, 1993)�G�<P>This file contains the release notes for the NETLIB TCP/IP interface��library.O�It describes any last-minute features, restrictions, changes, or additions made� �to NETLIB. �<ENDABSTRACT>�*�<REVISION_INFO>(This is a revised manual.)D�<REVISION_INFO>(Operating System and Version:\VAX/VMS V5.0 or later;$� OpenVMS AXP V1.0 or later):�<REVISION_INFO>(Software Version:\NETLIB <REFERENCE>(VER))N�<ENDTITLE_PAGE>(Matthew D. Madison<line>TGV, Inc.<line>Santa Cruz, California)���<COPYRIGHT_PAGE>�<PRINT_DATE>(22 April 1993)�0�<p><emphasis>(DISCLAIMER:\bold) The author and8� TGV, Inc. make no representations or warranties withA� respect to the contents hereof and specifically disclaim any�Q� implied warranties of merchantability or fitness for any particular purpose.�)�<COPYRIGHT_DATE>(1993\Matthew D. Madison)�A�<P>The following are trademarks of Digital Equipment Corporation:��<TABLE>�!�<TABLE_ATTRIBUTES>(SINGLE_SPACED)��<TABLE_SETUP>(3\20\20)�<TABLE_ROW>(DEC\ULTRIX\VAX)�&�<TABLE_ROW>(VAXcluster\VAXstation\VMS) �<ENDTABLE>/�<p>MultiNet is a registered trademark TGV, Inc.�:�<p>TCPware is a trademark of Process Software Corporation.�<ENDCOPYRIGHT_PAGE>��<CONTENTS_FILE>��<ENDFRONT_MATTER>��<chapter>(Installing NETLIB)4�<p>NETLIB is installed with the VMSINSTAL procedure: �<interactive>�0�<s>($)<u>(@SYS$UPDATE:VMSINSTAL NETLIB015 ddcu:)�<endinteractive>H�<p>You will be asked which TCP/IP packages for which you wish to install@�NETLIB support and where the NETLIB libraries should be located.�<chapter>(NETLIB Requirements)@�<p>NETLIB libraries are INSTALLed as shared shareable libraries.G�The NETLIB_SHRXFR transport-independent library requires 3 global pages�A�and 2 global sections. Each selected transport-dependent library�/�requires 13 global pages and 2 global sections.�E�<p>The amount of disk space required for each library varies based on� �transport:�<table>��<table_setup>(2\20)� �<table_row>(CMU V6.4\270 blocks))�<table_row>(CMU V6.5 and later\30 blocks)��<table_row>(UCX V1.2\15 blocks)�B�<table_row>(UCX V1.3 and later\260 blocks (VAX), 350 blocks (AXP))G�<table_row>(MultiNet V2.2 and later\260 blocks (VAX), 360 blocks (AXP))�;�<table_row>(PSC TCPware\260 blocks (VAX), 360 blocks (AXP))� �<endtable>?�<p>The SHRXFR transport-independent library takes up 10 blocks.�J�<p>The libraries can be placed in SYS$LIBRARY or in any desired directory.���<chapter>(New Features)�G�<P>NETLIB <reference>(ver) is a maintenance release and contains no new�L�features over V1.5, except for adding TCPware to the list of TCP/IP packages!�supported on OpenVMS AXP systems.���5�<p>NETLIB V1.5 added the following feature over V1.4:��<list>(unnumbered)C�<le>Support for TCPware from Process Software Corporation, courtesy��of Bernie Volz.� �<endlist>���:�<p>NETLIB V1.4 added the following new features over V1.3:�<list>(unnumbered)�<le>the ability�G�to specify a timeout value on UDP receives. ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������T����[NETLIB]NETLIB015.SDML;9�������������������������������������������������������������������������������������������������������Q������������������������������������������� A parameter has been added�E�to the UDP_RECEIVE routine to accommodate this change. (This was not�B�correctly implemented in V1.4, but does work in <reference>(ver)).D�<le>the ability to redirect NETLIB debugging output. A new routine,F�NET_SET_TRACE_ROUTINE, has been added. By passing the address of yourD�output routine (which should mimic LIB$PUT_OUTPUT), you can redirect?�debug output (currently only used in the DNS_MXLOOK routine for�=�TCP/IP implementations other than CMU-Tek V6.5 and UCX V1.2).�*�<le>some minor improvements in DNS_MXLOOK. �<endlist>���;�<p>NETLIB V1.3 added one new feature over V1.2: the ability�G�to create an active TCP/IP connection while at the same time fixing the�E�port number on the local host. This is done with the addition of the�)�NOT_PASSIVE flag on the NET_BIND routine.���7�<p>NETLIB V1.2 added one new feature over V1.1: the TCP�H�receive routines now allow the caller to specify a timeout value for the<�receive. Previously, all receives timed out after 5 minutes.��:�<p>NETLIB V1.1 added the following new features over V1.0,N�all of which have to do with the NETLIB_MXLOOK routine. These features affect�NETLIB operationE�with UCX (V1.3 or later), MultiNet (V2.2 or later), and CMU-Tek V6.4.�6�Operation with CMU-Tek V6.5 and later is not affected.��*�<head1>(Domain Server List Initialization)G�<p>The NETLIB_MXLOOK routine, for UCX V1.3, TCPware, and MultiNet, will�J�use the transport-specific name server list logical names for initializingC�its internal name server list. For UCX, the logical names used are�B�UCX$BIND_SERVERnnn, where "nnn" is a 3-digit sequence number. ForE�Multinet, the logical name is MULTINET_NAMESERVERS. For TCPware, the�"�logical name is TCPIP_NAMESERVERS.D�<p>For CMU-Tek V6.4, the NETLIB installation procedure automaticallyJ�includes a definition for NETLIB_CMU064_NAMESERVERS, since the name serverF�list used by CMU-Tek is not readily available. You should modify that2�logical name definition as needed for your system.H�<p>You can override the default name server list by defining the logicalD�name NETLIB_NAMESERVERS as a search list containing the names of the6�domain servers you would like NETLIB initially to use.#�<head1>(NETLIB_DOMAIN Logical Name)� �For CMU V6.4, UCX V1.3, TCPware,9�and MultiNet, you can define a logical name NETLIB_DOMAIN�B�(which may be a search list) to specify the domains to be used forF�partial name completion in the MXLOOK routine. This is not needed forH�CMU V6.5 (which uses the built-in name resolver) or UCX V1.2 (which does�not support name resolvers).K�<p>If undefined, the MXLOOK routine uses full host name as the domain name,�F�trimming one segment from the left part (and doing so repeatedly until&�there is no more domain name to trim).F�<p>For example, if your host name is VAX.DEPT.COMPANY.COM, the defaultO�behaviour for doing name completeion would be to first append DEPT.COMPANY.COM,�D�then COMPANY.COM, then COM to any address. By defining the logical: �<interactive>�O�<s>($)<U>(DEFINE/SYSTEM NETLIB_DOMAIN "dept.company.com","dept2.company.com",-)�)�<s>(_$)<u>( "company.com")��<endinteractive>F�<cp>you will cause the MXLOOK routine to append just those domains you%�specify for name completion purposes.��<head1>(Debugging Code)�H�<p>The MXLOOK routine contains debugging code that prints out a trace ofJ�its activity. To activate this code, define the logical name NETLIB_DEBUG �system-wide: �<interactive>�*�<s>($)<u>(DEFINE/SYSTEM NETLIB_DEBUG TRUE)�<endinteractive>L�<p>Debugging code may be added to ot�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������T����[NETLIB]NETLIB015.SDML;9�������������������������������������������������������������������������������������������������������Q������������������������������g�������������her NETLIB routines in a future release.�<chapter>(Bug Fixes)G�<p>NETLIB <reference>(ver) includes the following bug fixes over V1.4A:��<list>(unnumbered)J�<le>NET_GET_ADDRESS would return success status with a zero-length addressL�list when used with CMU-Tek TCP/IP. It now correctly returns SS$_ENDOFFILE.F�<le>The CMU-Tek error status NET$_CREF was not getting translated. It'�now correctly translates to SS$_REJECT.�F�<le>Some arguments were not passed correctly in QIO's for the MultiNet �interface.K�<le>The DNS_MXLOOK routine was not properly checking the success or failure�I�of the translation of the NETLIB_DOMAIN logical name, causing unnecessary�D�additional lookups to occur if that logical were defined. (Does not+�apply to the CMU-Tek V6.5+ implementation.)�H�<le>The DNS_MXLOOK routine now checks to see if the name to be looked upL�contains a dot, and if so, first checks the name by itself before attemptingJ�to do name completion. This should generally reduce the number of lookupsI�made, since in most cases, names with dots in them are full domain names.�5�(Does not apply to the CMU-Tek V6.5+ implementation.)� �<endlist>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������5�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1�����������������������������������������������������������������������������������������������������������H�������������������������|�����|�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������.����[NETLIB]NETLIBDEF.R32;1��������������������������������������������������������������������������������������������������������6����� �������������������������x���������������*�[NETLIB]NETLIBDEF.R32;1�+��,�.���.� ����/� �@� �4�6��� �����������������������-�����0���1����2���3������K��P���W���O� ����5�A��6�`=6��7�&9y��8�ƞ dh��9����������G� �@��H��J�������������������������!++��!��! NETLIBDEF.R32��!�6�! Definitions for use by callers of NETLIB routines.�!��!--����LITERAL����! Protocol values for NET_BIND��� NET_K_TCP = 1,� NET_K_UDP = 2,��)�! Mask values for TCP_SEND FLAGS argument���� NET_M_PUSH = 1,�� NET_M_NOTRM = 2;��(�! Bit values for TCP_SEND FLAGS argument���MACRO�� NET_V_PUSH = 0,0,1,0%,� NET_V_NOTRM = 0,1,1,0%;������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������0����[NETLIB]NETLIB_CMU.VERSION;7�������������������������������������������������������������������������������������������������������� �������������������������)l���������������*�[NETLIB]NETLIB_CMU.VERSION;7�+��,�0���.� ����/� �@� �4���� ������������������������-�����0���1����2���3������K��P���W���O� ����5���6�� c\��7�=��8�dh��9����������G� �@��H��J��������������������IDENT="V1.4-1"�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������2����[NETLIB]NETLIB_CMU064.VERSION;7����������������������������������������������������������������������������������������������������� ����������������������������������������*�[NETLIB]NETLIB_CMU064.VERSION;7�+��,�2���.� ����/� �@� �4���� ������������������������-�����0���1����2���3������K��P���W���O� ����5���6�"\��7�f��8�&,dh��9����������G� �@��H��J�����������������IDENT="V1.4-1"�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������3���� [NETLIB]NETLIB_CMU064_NET.B32;19�����������������������������������������������������������������������������������������������P�������������������������������������������� �*�[NETLIB]NETLIB_CMU064_NET.B32;19�+��,�3���.�����/� �@� �4�P���������������������������-�����0���1����2���3������K��P���W���O�����5���6�Z\��7�/\��8�?dh��9����������G� �@��H��J��� �������������%TITLE 'NETLIB_CMU064_NET')�MODULE NETLIB_CMU064_NET (IDENT='V1.1-3',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�I�! ABSTRACT: Common network library routines for CMU-Tek TCP/IP V6.4.��!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 28-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 29-JAN-1991 V1.0 Madison Initial coding.I�! 12-FEB-1991 V1.0-1 Madison If INET$DEVICE isn't defined, use IP0.�B�! 05-SEP-1991 V1.1 Madison Add NOT_PASSIVE flag to NET_BIND.D�! 03-DEC-1991 V1.1-1 Madison Make DSREFEXC same as ENDOFFFILE.9�! 04-DEC-1991 V1.1-2 Madison Improve debug support.�G�! 07-FEB-1992 V1.1-3 Madison CREF->REJECT; EOF on no-addr lookup.��!--���"� LIBRARY 'SYS$LIBRARY:STARLET';*� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETWORK';,� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETCOMMON';#� LIBRARY 'SYS$LIBRARY:NETERROR';�� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';� LIBRARY 'CMU_DEFS';���� FORWARD ROUTINE�� NET_ASSIGN,� NET_DEASSIGN,� NET_BIND,� NET_GET_ADDRESS,�� NET_ADDR_TO_NAME,� NET_GET_INFO,� NET_GET_HOSTNAME,� NET_CVT_STATUS,� NET_SET_TRACE_ROUTINE;���� EXTERNAL ROUTINE>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,<� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE, STR$COPY_R,� LIB$PUT_OUTPUT);��� � GLOBAL.� TRACE_ROUTINE : INITIAL (LIB$PUT_OUTPUT);� ��%SBTTL 'NET_ASSIGN'�%�GLOBAL ROUTINE NET_ASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�E�! This routine assigns a network channel for subsequent operations.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_ASSIGN nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��3� STATUS = LIB$GET_VM (%REF (CTX_S_CTXDEF), CTX);�,� CH$FILL (%CHAR (0), CTX_S_CTXDEF, .CTX);'� IF NOT .STATUS THEN RETURN .STATUS;� � BEGIN�+� BIND BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;�2� BUFQ [QUE_L_TAIL] = BUFQ [QUE_L_HEAD] = BUFQ;E� $BINTIM (TIMBUF=%ASCID'0 00:05:00', TIMADR=CTX [CTX_Q_EXPTIME]);�� END;��I� STATUS = $ASSIGN (DEVNAM=%ASCID'INET$DEVICE', CHAN=CTX [CTX_W_CHAN]);�A� IF .STATUS EQL SS$_IVDEVNAM OR .STATUS EQL SS$_NOSUCHDEV THEN�C� STATUS = $ASSIGN (DEVNAM=%ASCID'IP0:', CHAN=CTX [CTX_W_CHAN]);�?� IF NOT .STATUS THEN LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);��� � .STATUS����END; ! NET_ASSIGN�� ��%SBTTL 'NET_BIND'�J�GLOBAL ROUTINE NET_BIND (CTX_A_A, PROTOCOL, PORT, XTHREADS, NOT_PASSIVE) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routi����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������3���� [NETLIB]NETLIB_CMU064_NET.B32;19�����������������������������������������������������������������������������������������������P������������������������������e�������������ne creates and binds a local socket for the specified� �! protocol.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_BIND nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;��� BUILTIN ACTUALCOUNT;�� � LOCAL�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��=� IF ACTUALCOUNT () GTR 2 THEN CTX [CTX_L_LSNPORT] = .PORT;���#� IF .PROTOCOL EQL NET_K_UDP THEN� � BEGIN�B� STATUS = NET$OPEN (OPENMODE=UDPADDR, PROTOCOL=U$UDP_PROTOCOL,F� IO$SB=IOSB, IOCHAN=.CTX [CTX_W_CHAN], FHNAM=0, FOREIGN_PRT=0,@� LOCAL_PRT=(IF ACTUALCOUNT () GTR 2 THEN .PORT ELSE 0));G� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN�H� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);� END�� ELSE STATUS = SS$_NORMAL;��� � .STATUS����END; ! NET_BIND�� ��%SBTTL 'NET_GET_ADDRESS'M�GLOBAL ROUTINE NET_GET_ADDRESS (CTX_A_A, HOST_A, ALSIZE, ALIST_A, ALCNT_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Given a host name, returns an array of valid Internet addresses.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�5�! NET_GET_ADDRESS ctx, host, arrsiz, array, retcnt��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,+� NODENAME = .HOST_A : BLOCK [,BYTE],�+� ALIST = .ALIST_A : VECTOR [,LONG],�� ALCNT = .ALCNT_A;�� � LOCAL�'� GHBLK : GTHST_NMLOOK_RET_ARGS,�#� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��K� IF STR$FIND_FIRST_NOT_IN_SET (NODENAME, %ASCID'0123456789.') NEQ 0 THEN� � BEGIN�*� LOCAL STR : BLOCK [DSC$K_S_BLN,BYTE];� $INIT_DYNDESC (STR);�<� STR$CONCAT (STR, NODENAME, %ASCID %STRING (%CHAR (0)));D� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),F� GTHFUNCT=GTH_NAMADR, GTHP1=.STR [DSC$A_POINTER], IOCHAN=.CHN,� IO$SB=IOSB);�� IF NOT .STATUS THEN � BEGIN� STR$FREE1_DX (STR);� RETURN .STATUS; � END;�"� IF NOT .IOSB [NSB$STATUS] ANDI� CH$RCHAR (.NODENAME [DSC$A_POINTER]+.NODENAME [DSC$W_LENGTH]-1)�� NEQ %C'.'� � THEN� � BEGINE� STR$CONCAT (STR, NODENAME, %ASCID %STRING ('.', %CHAR (0)));�H� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),G� GTHFUNCT=GTH_NAMADR, GTHP1=.STR [DSC$A_POINTER], IOCHAN=.CHN,�� IO$SB=IOSB); � END;�� STR$FREE1_DX (STR);(� IF NOT .STATUS THEN RETURN .STATUS;*� IF NOT .IOSB [NSB$STATUS] THEN RETURN2� (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN-� NET_CVT_STATUS (.IOSB [NSB$XERROR])�#� ELSE .IOSB [NSB$STATUS]);�0� ALCNT = MIN (.GHBLK [GHN$ADRCNT], .ALSIZE);� IF .ALCNT GTR 0 THEN� � BEGIN:� BIND GHLST = GHBLK [GHN$ADRLST] : VECTOR [,LONG];?� INCR I FROM 0 TO .ALCNT-1 DO ALIST [.I] = .GHLST [.I];�� END!� ELSE STATUS = SS$_ENDOFFILE;�� END�� ELSE BEGIN � LOCAL� ADRL,$� ADRB : REF VECTOR [4,BYTE],� CHP, DOTP,�� LEN, XLEN, VAL;��� ADRB = ADRL;�%� CHP = .NODENAME [DSC$A_POIN�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������3���� [NETLIB]NETLIB_CMU064_NET.B32;19�����������������������������������������������������������������������������������������������P�������������������������������������������TER];�$� LEN = .NODENAME [DSC$W_LENGTH];� INCR I FROM 0 TO 3 DO � BEGIN%� IF .LEN LSS 1 THEN EXITLOOP;�/� DOTP = CH$FIND_CH (.LEN, .CHP, %C'.');�,� IF CH$FAIL (.DOTP) THEN XLEN = .LEN+� ELSE XLEN = CH$DIFF (.DOTP, .CHP);�(� LIB$CVT_DTB (.XLEN, .CHP, VAL);!� ADRB [.I] = .VAL<0,8,0>;� � LEN = .LEN - .XLEN - 1;"� CHP = CH$PLUS (.DOTP, 1); � END;�� IF .ALSIZE GTR 0 THEN � BEGIN� ALCNT = 1;�� ALIST [0] = .ADRL;� � END;�� STATUS = SS$_NORMAL;�� END;�� � .STATUS����END; ! NET_GET_ADDRESS� ��%SBTTL 'NET_ADDR_TO_NAME'�8�GLOBAL ROUTINE NET_ADDR_TO_NAME (CTX_A_A, ADR, NAME_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�L�! Given an IP address, returns the corresponding host name (if available).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_ADDR_TO_NAME host, adr, name��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,(� NAME = .NAME_A : BLOCK [,BYTE];�� � LOCAL�#� GHBLK : GTHST_ADLOOK_RET_ARGS,�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��C� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),�2� GTHFUNCT=GTH_ADRNAM, GTHP1=.ADR, IOCHAN=.CHN,� IO$SB=IOSB);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENF� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);� IF .STATUS THEN�?� STR$COPY_R (NAME, GHBLK [GHA$NAMLEN], GHBLK [GHA$NAMSTR]);��� � .STATUS����END; ! NET_ADDR_TO_NAME�� ��%SBTTL 'NET_DEASSIGN'�'�GLOBAL ROUTINE NET_DEASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! This routine deassigns a network channel.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_DEASSIGN ctx��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��%� $DASSGN (CHAN=.CTX [CTX_W_CHAN]);�+� LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);� � CTX = 0;��� SS$_NORMAL���END; ! NET_DEASSIGN�� ��%SBTTL 'NET_GET_INFO'�P�GLOBAL ROUTINE NET_GET_INFO (CTX_A_A, REMADR_A, REMPRT_A, LCLADR_A, LCLPRT_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�A�! Gets address and port information about a network connection.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�:�! NET_GET_INFO ctx, remadr [,remprt] [,lcladr] [,lclprt]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;�� BIND/� CTX = .CTX_A_A : REF CTXDEF;��� � LOCAL�)� INFO : CONNECTION_INFO_RETURN_BLOCK,�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��>� STATUS = NET$INFO (IOCHAN=.CTX [CTX_W_CHAN], BUFADRS=INFO,-� BUFSIZE=%ALLOCATION (INFO), IO$SB=IOSB);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENF� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);'� IF NOT .STATUS THEN RETURN .STATUS;���C� IF ACT�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������3���� [NETLIB]NETLIB_CMU064_NET.B32;19�����������������������������������������������������������������������������������������������P������������������������������%�������������UALCOUNT () GTR 4 THEN .LCLPRT_A = .INFO [CI$LOCAL_PORT];�L� IF ACTUALCOUNT () GTR 3 THEN .LCLADR_A = .INFO [CI$LOCAL_INTERNET_ADRS];E� IF ACTUALCOUNT () GTR 2 THEN .REMPRT_A = .INFO [CI$FOREIGN_PORT];�M� IF ACTUALCOUNT () GTR 1 THEN .REMADR_A = .INFO [CI$REMOTE_INTERNET_ADRS];���� SS$_NORMAL���END; ! NET_GET_INFO�� ��%SBTTL 'NET_GET_HOSTNAME'�1�GLOBAL ROUTINE NET_GET_HOSTNAME (HST_A, LEN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�+�! Returns this host's Internet host name.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_GET_HOSTNAME hostname [,len]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BUILTIN ACTUALCOUNT;�� � LOCAL�%� LNMLST : $ITMLST_DECL (ITEMS=1),�!� HSTBUF : VECTOR [1024,BYTE],�� HSTLEN : WORD,� � STATUS;�� � $ITMLST_INIT (ITMLST=LNMLST,6� (ITMCOD=LNM$_STRING, BUFSIZ=%ALLOCATION (HSTBUF),(� BUFADR=HSTBUF, RETLEN=HSTLEN));��0� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',7� LOGNAM=%ASCID'INTERNET_HOST_NAME', ITMLST=LNMLST);�� IF .STATUS THEN� � BEGIN�)� STR$COPY_R (.HST_A, HSTLEN, HSTBUF);�3� IF ACTUALCOUNT () GTR 1 THEN .LEN_A = .HSTLEN;�� END;�� � .STATUS����END; ! NET_GET_HOSTNAME�� ��%SBTTL 'NET_CVT_STATUS'�%�GLOBAL ROUTINE NET_CVT_STATUS (RC) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Converts a CMU-Tek return code to an SS$_ equivalent (from UCX).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_CVT_STATUS rc�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� SELECTONE .RC OF� SET�7� [NET$_IR,NET$_UCT,NET$_CSE,NET$_VTF] : SS$_INSFMEM;�;� [NET$_IFC,NET$_IFS,NET$_ILP,NET$_NUC,NET$_CIP,NET$_CDE,�� NET$_FSU] : SS$_BADPARAM;� [NET$_NOPRV] : SS$_NOPRIV;1� [NET$_CR,NET$_CCAN,NET$_CC] : SS$_LINKDISCON;�0� [NET$_UNN, NET$_UNA, NET$_UNU] : SS$_IVADDR;� [NET$_BTS] : SS$_IVBUFLEN;*� [NET$_URC,NET$_NRT] : SS$_UNREACHABLE;:� [NET$_CTO,NET$_TWT,NET$_FTO,NET$_NMLTO] : SS$_TIMEOUT;%� [NET$_TE,NET$_NSEXIT] : SS$_SHUT;�*� [NET$_NOINA, NET$_NOANA] : SS$_NOPRIV;N� [NET$_DSNOADDR,NET$_DSNONAME,NET$_DSNAMERR,NET$_DSREFEXC] : SS$_ENDOFFILE;� [NET$_CREF] : SS$_REJECT;�� [OTHERWISE] : .RC;� TES����END; ! NET_CVT_STATUS�� ��%SBTTL 'NET_SET_TRACE_ROUTINE'/�GLOBAL ROUTINE NET_SET_TRACE_ROUTINE (RTN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! Sets the trace routine to be used instead of LIB$PUT_OUTPUT.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_SET_TRACE_ROUTINE��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���8� IF .RTN_A EQLA 0 THEN TRACE_ROUTINE = LIB$PUT_OUTPUT � ELSE TRACE_ROUTINE = .RTN_A;� SS$_NORMAL���END;���END��ELUDOM�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������8����[NETLIB]NETLIB_CMU_MXLOOK.B32;1������������������������������������������������������������������������������������������������L������������������������������-���������������*�[NETLIB]NETLIB_CMU_MXLOOK.B32;1�+��,�8���.�����/� �@� �4�L������ �8��������������������-�����0���1����2���3������K��P���W���O�����5���6�.7��7�ݹC��8�cdh��9����������G� �@��H��J������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������6�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1�����������������������������������������������������������������������������������������������������������H������������������������|�|������������� �������������%TITLE 'NETLIB_CMU_MXLOOK')�MODULE NETLIB_CMU_MXLOOK (IDENT = 'V1.0',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!� �! ABSTRACT:��!�@�! MXLOOKUP contains a routine that looks up mail exchange (MX)>�! records for a particular host name. For CMU-Tek TCP V6.5.�!��! MODULE DESCRIPTION:��!��!��! AUTHOR: M. Madison�@�! COPYRIGHT 1991 RENSSELAER POLYTECHNIC INSTITUTE."�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 30-JAN-1991��!��! MODIFICATION HISTORY:��!�:�! 30-JAN-1991 V1.0 Madison Initial coding (from MX).�!--���"� LIBRARY 'SYS$LIBRARY:STARLET';*� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETWORK';,� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETCOMMON';� LIBRARY 'NETLIB';���� FORWARD ROUTINE�� DNS_MXLOOK,� NAME_UNPACK : NOVALUE;���� EXTERNAL ROUTINE7� G_HAT (LIB$ANALYZE_SDESC, LIB$FREE_VM, LIB$GET_VM,�=� STR$COPY_DX, STR$APPEND, STR$FREE1_DX, STR$POS_EXTR,�;� STR$POSITION, STR$COMPARE, STR$CONCAT, STR$COPY_R,�3� STR$UPCASE, LIB$ADD_TIMES, LIB$SUB_TIMES);��� � LITERAL�� IPNS_TYPE_MX = 15;�� � MACRO�� MXN_L_PREF = 0,0,32,0%,�� MXN_L_LEN = 1,0,32,0%,�� MXN_T_HOST = 2,0,0,0%,� RR_W_LEN = 0,0,16,0%,�� RR_W_PREF = 2,0,16,0%,�� RR_T_NAME = 4,0,16,0%;�� ��%SBTTL 'DNS_MXLOOK'�G�GLOBAL ROUTINE DNS_MXLOOK (QHDESC_A, MXMAX_A, MXCOUNT_A, MXNSTRUC_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! The MXNAMES structure is an array of records like (in PL/I):�! DECLARE 1 MXNAMES (n),�4�! 2 PREFERENCE_VALUE FIXED BINARY (31),4�! 2 HOST_NAME_LENGTH FIXED BINARY (31),+�! 2 HOST_NAME CHARACTER (128);��!�;�! i.e, two longwords and a 128-byte string. No more than�2�! MXMAX names are ever returned by this routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�0�! DNS_MXLOOK qhname, mxmax, mxcount, mxnstruc�!�C�! qhname: char_string, character string, read only, by descriptor�K�! mxmax: unsigned_longword, longword (unsigned), read only, by reference�L�! mxcount: unsigned_longword, longword (unsigned), write only, by referenceG�! mxnstruc: mxname_struc, longword (unsigned), write only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.$�! Other codes possible.�!��! SIDE EFFECTS: None.��!��!--���� BIND3� QHOST = .QHDESC_A : BLOCK [DSC$K_S_BLN, BYTE],�� MXMAX = .MXMAX_A,� MXCOUNT = .MXCOUNT_A,7� MXNSTRUC = .MXNSTRUC_A : BLOCKVECTOR [, 34, LONG];��� � LOCAL� � STATUS,/� RRBUF : BLOCK [GTHST_RRLOOK_SIZE+512],�'� PHOST : $BBLOCK [DSC$K_S_BLN],�&� NAME : $BBLOCK [DSC$K_S_BLN],$� IOSB : NETIO_STATUS_BLOCK,� IPCHAN : WORD,�� NAMELEN : WORD, � IDX;�� BIND7� RRLOOK = RRBUF : GTHST_RRLOOK_B����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������8����[NETLIB]NETLIB_CMU_MXLOOK.B32;1������������������������������������������������������������������������������������������������L������������������������������9�������������LOCK,�8� RRDATA = RRLOOK [GH$RL_RDATA] : BLOCK [,BYTE];��� INIT_DYNDESC (PHOST);���� MXCOUNT = 0;��<� IF .QHOST [DSC$W_LENGTH] EQL 0 THEN RETURN SS$_BADPARAM;��� STR$UPCASE (PHOST, QHOST);K� IF CH$RCHAR (CH$PLUS (.PHOST [DSC$A_POINTER], .PHOST [DSC$W_LENGTH]-1))�2� NEQ %C'.' THEN STR$APPEND (PHOST, %ASCID'.');3� STR$APPEND (PHOST, %ASCID %STRING (%CHAR (0)));���H� IF NOT (STATUS = $ASSIGN (DEVNAM = %ASCID'IP:', CHAN = IPCHAN)) THEN � BEGIN�� FREE_STRINGS (PHOST);� RETURN .STATUS;� END;��C� STATUS = NET$GTHST (BUFADRS=RRBUF, BUFSIZE=%ALLOCATION (RRBUF),�;� GTHFUNCT=GTH_RRLOOK, GTHP1=.PHOST [DSC$A_POINTER],�9� GTHP2=IPNS_TYPE_MX, IOCHAN=.IPCHAN, IO$SB=IOSB);�� $DASSGN (CHAN=.IPCHAN);���0� IF .STATUS THEN STATUS = .IOSB [NSB$STATUS];� IF NOT .STATUS THEN� � BEGIN�� FREE_STRINGS (PHOST);� RETURN .STATUS;� END;��'� NAME [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� NAME [DSC$B_CLASS] = DSC$K_CLASS_S;�� NAME [DSC$W_LENGTH] = 128;�� � IDX = 1;+� WHILE .IDX LSS .RRLOOK [GH$RL_RDLEN] DO� � BEGIN�3� BIND RR = RRDATA [.IDX,0,0,0] : BLOCK [,BYTE];�6� MXNSTRUC [.MXCOUNT,MXN_L_PREF] = .RR [RR_W_PREF];;� NAME [DSC$A_POINTER] = MXNSTRUC [.MXCOUNT,MXN_T_HOST];�C� NAME_UNPACK (RR [RR_T_NAME], .RR [RR_W_LEN]-2, NAME, NAMELEN);�.� MXNSTRUC [.MXCOUNT,MXN_L_LEN] = .NAMELEN;� MXCOUNT = .MXCOUNT + 1;%� IDX = .IDX + .RR [RR_W_LEN] + 2;�� END;��� FREE_STRINGS (PHOST);���� SS$_NORMAL���END; ! DNS_MXLOOK�� ��%SBTTL 'NAME_UNPACK'@�ROUTINE NAME_UNPACK (BUF_A, LEN, NAME_A, NAMELEN_A) : NOVALUE = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�B�! This routine unpacks a name from the response buffer, handlingC�! the relative-offset name segment references used for compaction� �! purposes.��!��! RETURNS: nothing�!� �! PROTOTYPE:�!�#�! NAME_UNPACK name, buffer, index��!�D�! name: char_string, character string, write only, by descriptor3�! buffer: block of bytes, read only, by reference�H�! index: unsigned_longword, longword (unsigned), modify, by reference�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES: None.��!��! SIDE EFFECTS: None.��!��!--���� BIND'� NAME = .NAME_A : BLOCK [,BYTE],�(� BUF = .BUF_A : VECTOR [,BYTE],!� NAMELEN = .NAMELEN_A : WORD;��� � LOCAL�%� SEG : BLOCK [DSC$K_S_BLN,BYTE],�&� XNAME : BLOCK [DSC$K_S_BLN,BYTE],� SEGLEN : WORD,� � IDX;���� INIT_DYNDESC (XNAME);�&� SEG [DSC$B_DTYPE] = DSC$K_DTYPE_T;&� SEG [DSC$B_CLASS] = DSC$K_CLASS_S; � IDX = 0;� SEGLEN = .BUF [.IDX];�6� WHILE .SEGLEN GTR 0 AND .IDX + .SEGLEN LSS .LEN DO � BEGIN�"� SEG [DSC$W_LENGTH] = .SEGLEN;(� SEG [DSC$A_POINTER] = BUF [.IDX+1];� STR$APPEND (XNAME, SEG);�� IDX = .IDX + .SEGLEN + 1;� SEGLEN = .BUF [.IDX];9� IF .SEGLEN GTR 0 THEN STR$APPEND (XNAME, %ASCID'.');�� END;��� STR$COPY_DX (NAME, XNAME);$� NAMELEN = .XNAME [DSC$W_LENGTH];��� FREE_STRINGS (XNAME);����END; ! NAME_UNPACK���END��ELUDOM�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������6���� [NETLIB]NETLIB_CMU064_UDP.B32;11�����������������������������������������������������������������������������������������������O������������������������������7�������������� �*�[NETLIB]NETLIB_CMU064_UDP.B32;11�+��,�6���.�����/� �@� �4�O������ ���������������������-�����0���1����2���3������K��P���W���O�����5���6� i+)��7��+)��8�&VQdh��9����������G� �@��H��J��� �������������%TITLE 'NETLIB_CMU064_UDP''�MODULE NETLIB_CMU064_UDP (IDENT='V1.2',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�2�! ABSTRACT: UDP NETLIB routines for CMU V6.4.�!��! MODULE DESCRIPTION:��!�3�! Contains UDP send and receive routines for CMU.��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 29-JAN-1991��!��! MODIFICATION HISTORY:��!�?�! 29-JAN-1991 V1.0 Madison Initial coding (from NSQUERY).�G�! 08-FEB-1991 V1.1 Madison Add source info return to UDP_RECEIVE.�;�! 22-NOV-1991 V1.2 Madison Add rcvtmo to UDP_RECEIVE.��!--�"� LIBRARY 'SYS$LIBRARY:STARLET';"� LIBRARY 'SYS$LIBRARY:NETWORK';� LIBRARY 'CMU_DEFS';�� LIBRARY 'NETLIB';���� FORWARD ROUTINE�� UDP_SEND,� UDP_RECEIVE,�� TIMER_AST;���� EXTERNAL ROUTINE� NET_CVT_STATUS,%� G_HAT (LIB$GET_VM, LIB$FREE_VM);�� ��%SBTTL 'UDP_SEND'�L�GLOBAL ROUTINE UDP_SEND (CTX_A_A, ADR, PORT : WORD, BUFPTR, BUFLEN : WORD) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Sends out a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! UDP_SEND chan, address, port, bufptr, buflen��!�9�! chan: channel, word (unsigned), read only, by value�G�! address: longword_unsigned, longword (unsigned), read only, by value�?�! port: word_unsigned, word (unsigned), read only, by value�E�! bufptr: varying_arg, longword (unsigned), read only, by reference�?�! buflen: word_unsigned, word (unsigned), read only, by value��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHAN = CTX [CTX_W_CHAN] : WORD;��� � LOCAL�� IOSB : NETWORK_IOSB,�"� BUF : REF UDP$ADDRESS_BLOCK, � STATUS;��?� STATUS = LIB$GET_VM (%REF (UDP$ADDRESS_BLEN+.BUFLEN), BUF);�'� IF NOT .STATUS THEN RETURN .STATUS;�� BUF [UDA$SOURCE_ADDR] = 0;� BUF [UDA$DEST_ADDR] = .ADR;�� BUF [UDA$SOURCE_PORT] = 0; � BUF [UDA$DEST_PORT] = .PORT;6� CH$MOVE (.BUFLEN, .BUFPTR, .BUF+UDP$ADDRESS_BLEN);7� STATUS = NET$SEND (IOCHAN=.CHAN, IO$SB=IOSB, EOL=1,�5� BUFADRS=.BUF, BUFSIZE=.BUFLEN+UDP$ADDRESS_BLEN);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENH� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);7� LIB$FREE_VM (%REF (UDP$ADDRESS_BLEN+.BUFLEN), BUF);� � .STATUS����END; ! UDP_SEND�� ��%SBTTL 'UDP_RECEIVE'E�GLOBAL ROUTINE UDP_RECEIVE (CTX_A_A, BUFPTR, BUFSIZ : WORD, BUFLEN_A,�3� SRCADR_A, SRCPRT_A, RCVTMO_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Reads a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�K�! UDP_RECEIVE chan, buf����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������6���� [NETLIB]NETLIB_CMU064_UDP.B32;11�����������������������������������������������������������������������������������������������O������������������������������r�������������ptr, bufsiz, buflen [,srcadr] [,srcprt] [,rcvtmo]��!�@�! ctx: context, longword (unsigned), read only, by referenceF�! bufptr: varying_arg, longword (unsigned), write only, by reference?�! bufsiz: word_unsigned, word (unsigned), read only, by value�@�! buflen: word_unsigned, word (unsigned), write only, by valueL�! srcadr: longword_unsigned, longword (unsigned), write only, by referenceL�! srcprt: longword_unsigned, longword (unsigned), write only, by referenceA�! rcvtmo: date_time, quadword (signed), read only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHAN = CTX [CTX_W_CHAN] : WORD,�$� BUFLEN = .BUFLEN_A : WORD;�� � BUILTIN�� ACTUALCOUNT;��� � LOCAL�� RCVTMO : VECTOR [2,LONG],� INFO : VECTOR [3,LONG],� IOSB : NETWORK_IOSB,�"� BUF : REF UDP$ADDRESS_BLOCK, � STATUS;��?� STATUS = LIB$GET_VM (%REF (UDP$ADDRESS_BLEN+.BUFSIZ), BUF);�'� IF NOT .STATUS THEN RETURN .STATUS;�� BUF [UDA$SOURCE_ADDR] = 0;� BUF [UDA$DEST_ADDR] = 0;� BUF [UDA$SOURCE_PORT] = 0;� BUF [UDA$DEST_PORT] = 0;��"� STATUS = ACTUALCOUNT () GTR 6;.� IF .STATUS THEN STATUS = .RCVTMO_A NEQA 0;2� IF .STATUS THEN CH$MOVE (8, .RCVTMO_A, RCVTMO)<� ELSE $BINTIM (TIMBUF=%ASCID'0 00:00:10', TIMADR=RCVTMO);��� INFO [0] = .CHAN;�� INFO [1] = IOSB;� INFO [2] = SS$_NORMAL;;� $SETIMR (DAYTIM=RCVTMO, ASTADR=TIMER_AST, REQIDT=INFO);�A� STATUS = NET$RECEIVE (IOCHAN=.CHAN, IO$SB=IOSB, BUFADRS=.BUF,�'� BUFSIZE=.BUFSIZ+UDP$ADDRESS_BLEN);�� $CANTIM (REQIDT=INFO);,� IF NOT .INFO [2] THEN STATUS = .INFO [2]K� ELSE IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN�G� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);�� IF .STATUS THEN� � BEGIN�8� BUFLEN = .IOSB [NSB$BYTE_COUNT] - UDP$ADDRESS_BLEN;7� CH$MOVE (.BUFLEN, .BUF+UDP$ADDRESS_BLEN, .BUFPTR);�!� IF ACTUALCOUNT () GTR 4 THEN�E� IF .SRCADR_A NEQA 0 THEN .SRCADR_A = .BUF [UDA$SOURCE_ADDR];�!� IF ACTUALCOUNT () GTR 5 THEN�E� IF .SRCPRT_A NEQA 0 THEN .SRCPRT_A = .BUF [UDA$SOURCE_PORT];�� END�� ELSE BUFLEN = 0;��7� LIB$FREE_VM (%REF (.BUFSIZ+UDP$ADDRESS_BLEN), BUF);��� � .STATUS����END; ! UDP_RECEIVE� ��%SBTTL 'TIMER_AST'�ROUTINE TIMER_AST (INFO_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This AST routine is triggered when the net receive timer goes off.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TIMER_AST info��!�O�! info: vector_longword_unsigned, longword (unsigned), modify, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND&� INFO = .INFO_A : VECTOR [3,LONG], � IOSB = .INFO [1] : IOSBDEF;��2� INFO [2] = IOSB [IOSB_W_STATUS] = SS$_TIMEOUT;� $CANCEL (CHAN=.INFO [0]);���� SS$_NORMAL���END; ! TIMER_AST���END��ELUDOM�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������:����[NETLIB]NETLIB_CMU_NET.B32;22��������������������������������������������������������������������������������������������������P���������������������������������������������*�[NETLIB]NETLIB_CMU_NET.B32;22�+��,�:���.�����/� �@� �4�P���������������������������-�����0���1����2���3������K��P���W���O�����5���6� \��7�\��8�&udh��9����������G� �@��H��J������ �������������%TITLE 'NETLIB_CMU_NET'�&�MODULE NETLIB_CMU_NET (IDENT='V1.1-3',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�D�! ABSTRACT: Common network library routines for CMU-Tek TCP/IP.�!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 28-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 29-JAN-1991 V1.0 Madison Initial coding.B�! 05-SEP-1991 V1.1 Madison Add NOT_PASSIVE flag to NET_BIND.O�! 03-DEC-1991 V1.1-1 Madison Make DSREFEXC same as ENDOFFILE; IP0 bypass.�:�! 04-DEC-1991 V1.1-2 Madison Improved debug support.J�! 07-FEB-1992 V1.1-3 Madison CREF->REJECT; EOF on no-address lookup.�!--���"� LIBRARY 'SYS$LIBRARY:STARLET';*� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETWORK';,� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETCOMMON';+� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETERROR';�� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';� LIBRARY 'CMU_DEFS';���� FORWARD ROUTINE�� NET_ASSIGN,� NET_DEASSIGN,� NET_BIND,� NET_GET_ADDRESS,�� NET_ADDR_TO_NAME,� NET_GET_INFO,� NET_GET_HOSTNAME,� NET_CVT_STATUS,� NET_SET_TRACE_ROUTINE;���� EXTERNAL ROUTINE>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,<� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE, STR$COPY_R,� LIB$PUT_OUTPUT);��� � GLOBAL.� TRACE_ROUTINE : INITIAL (LIB$PUT_OUTPUT);� ��%SBTTL 'NET_ASSIGN'�%�GLOBAL ROUTINE NET_ASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�E�! This routine assigns a network channel for subsequent operations.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_ASSIGN nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��3� STATUS = LIB$GET_VM (%REF (CTX_S_CTXDEF), CTX);�,� CH$FILL (%CHAR (0), CTX_S_CTXDEF, .CTX);'� IF NOT .STATUS THEN RETURN .STATUS;� � BEGIN�+� BIND BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;�2� BUFQ [QUE_L_TAIL] = BUFQ [QUE_L_HEAD] = BUFQ;E� $BINTIM (TIMBUF=%ASCID'0 00:10:00', TIMADR=CTX [CTX_Q_EXPTIME]);�� END;��I� STATUS = $ASSIGN (DEVNAM=%ASCID'INET$DEVICE', CHAN=CTX [CTX_W_CHAN]);�A� IF .STATUS EQL SS$_IVDEVNAM OR .STATUS EQL SS$_NOSUCHDEV THEN�C� STATUS = $ASSIGN (DEVNAM=%ASCID'IP0:', CHAN=CTX [CTX_W_CHAN]);�?� IF NOT .STATUS THEN LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);��� � .STATUS����END; ! NET_ASSIGN�� ��%SBTTL 'NET_BIND'�J�GLOBAL ROUTINE NET_BIND (CTX_A_A, PROTOCOL, PORT, XTHREADS, NOT_PASSIVE) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine creates and binds a local socket for the specified� �! protoc����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������:����[NETLIB]NETLIB_CMU_NET.B32;22��������������������������������������������������������������������������������������������������P������������������������������:�������������ol.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_BIND nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;��� BUILTIN ACTUALCOUNT;�� � LOCAL�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��=� IF ACTUALCOUNT () GTR 2 THEN CTX [CTX_L_LSNPORT] = .PORT;�#� IF .PROTOCOL EQL NET_K_UDP THEN� � BEGIN�B� STATUS = NET$OPEN (OPENMODE=UDPDATA, PROTOCOL=U$UDP_PROTOCOL,F� IO$SB=IOSB, IOCHAN=.CTX [CTX_W_CHAN], FHNAM=0, FOREIGN_PRT=0,@� LOCAL_PRT=(IF ACTUALCOUNT () GTR 2 THEN .PORT ELSE 0));G� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN�F� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);� END�� ELSE STATUS = SS$_NORMAL;��� � .STATUS����END; ! NET_BIND�� ��%SBTTL 'NET_GET_ADDRESS'M�GLOBAL ROUTINE NET_GET_ADDRESS (CTX_A_A, HOST_A, ALSIZE, ALIST_A, ALCNT_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Given a host name, returns an array of valid Internet addresses.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�5�! NET_GET_ADDRESS ctx, host, arrsiz, array, retcnt��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,+� NODENAME = .HOST_A : BLOCK [,BYTE],�+� ALIST = .ALIST_A : VECTOR [,LONG],�� ALCNT = .ALCNT_A;�� � LOCAL�'� GHBLK : GTHST_NMLOOK_RET_ARGS,�#� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��K� IF STR$FIND_FIRST_NOT_IN_SET (NODENAME, %ASCID'0123456789.') NEQ 0 THEN� � BEGIN�*� LOCAL STR : BLOCK [DSC$K_S_BLN,BYTE];� $INIT_DYNDESC (STR);�<� STR$CONCAT (STR, NODENAME, %ASCID %STRING (%CHAR (0)));D� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),F� GTHFUNCT=GTH_NAMADR, GTHP1=.STR [DSC$A_POINTER], IOCHAN=.CHN,� IO$SB=IOSB);�� IF NOT .STATUS THEN � BEGIN� STR$FREE1_DX (STR);� RETURN .STATUS; � END;�"� IF NOT .IOSB [NSB$STATUS] ANDI� CH$RCHAR (.NODENAME [DSC$A_POINTER]+.NODENAME [DSC$W_LENGTH]-1)�� NEQ %C'.'� � THEN� � BEGINE� STR$CONCAT (STR, NODENAME, %ASCID %STRING ('.', %CHAR (0)));�H� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),G� GTHFUNCT=GTH_NAMADR, GTHP1=.STR [DSC$A_POINTER], IOCHAN=.CHN,�� IO$SB=IOSB); � END;�� STR$FREE1_DX (STR);(� IF NOT .STATUS THEN RETURN .STATUS;*� IF NOT .IOSB [NSB$STATUS] THEN RETURN2� (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN-� NET_CVT_STATUS (.IOSB [NSB$XERROR])�#� ELSE .IOSB [NSB$STATUS]);�0� ALCNT = MIN (.GHBLK [GHN$ADRCNT], .ALSIZE);� IF .ALCNT GTR 0 THEN� � BEGIN:� BIND GHLST = GHBLK [GHN$ADRLST] : VECTOR [,LONG];?� INCR I FROM 0 TO .ALCNT-1 DO ALIST [.I] = .GHLST [.I];�� END!� ELSE STATUS = SS$_ENDOFFILE;�� END�� ELSE BEGIN � LOCAL� ADRL,$� ADRB : REF VECTOR [4,BYTE],� CHP, DOTP,�� LEN, XLEN, VAL;��� ADRB = ADRL;�%� CHP = .NODENAME [DSC$A_POINTER];�$� LEN = .NODENAME [DSC$W_LENGTH];� INCR I FROM 0 TO 3 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������:����[NETLIB]NETLIB_CMU_NET.B32;22��������������������������������������������������������������������������������������������������P�������������������������������������������DO � BEGIN%� IF .LEN LSS 1 THEN EXITLOOP;�/� DOTP = CH$FIND_CH (.LEN, .CHP, %C'.');�,� IF CH$FAIL (.DOTP) THEN XLEN = .LEN+� ELSE XLEN = CH$DIFF (.DOTP, .CHP);�(� LIB$CVT_DTB (.XLEN, .CHP, VAL);!� ADRB [.I] = .VAL<0,8,0>;� � LEN = .LEN - .XLEN - 1;"� CHP = CH$PLUS (.DOTP, 1); � END;�� IF .ALSIZE GTR 0 THEN � BEGIN� ALCNT = 1;�� ALIST [0] = .ADRL;� � END;�� STATUS = SS$_NORMAL;�� END;�� � .STATUS����END; ! NET_GET_ADDRESS� ��%SBTTL 'NET_ADDR_TO_NAME'�8�GLOBAL ROUTINE NET_ADDR_TO_NAME (CTX_A_A, ADR, NAME_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�L�! Given an IP address, returns the corresponding host name (if available).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_ADDR_TO_NAME host, adr, name��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,(� NAME = .NAME_A : BLOCK [,BYTE];�� � LOCAL�#� GHBLK : GTHST_ADLOOK_RET_ARGS,�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��C� STATUS = NET$GTHST (BUFADRS=GHBLK, BUFSIZE=%ALLOCATION (GHBLK),�2� GTHFUNCT=GTH_ADRNAM, GTHP1=.ADR, IOCHAN=.CHN,� IO$SB=IOSB);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENF� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);� IF .STATUS THEN�?� STR$COPY_R (NAME, GHBLK [GHA$NAMLEN], GHBLK [GHA$NAMSTR]);��� � .STATUS����END; ! NET_ADDR_TO_NAME�� ��%SBTTL 'NET_DEASSIGN'�'�GLOBAL ROUTINE NET_DEASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! This routine deassigns a network channel.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_DEASSIGN ctx��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��%� $DASSGN (CHAN=.CTX [CTX_W_CHAN]);�+� LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);� � CTX = 0;��� SS$_NORMAL���END; ! NET_DEASSIGN�� ��%SBTTL 'NET_GET_INFO'�P�GLOBAL ROUTINE NET_GET_INFO (CTX_A_A, REMADR_A, REMPRT_A, LCLADR_A, LCLPRT_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�A�! Gets address and port information about a network connection.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�:�! NET_GET_INFO ctx, remadr [,remprt] [,lcladr] [,lclprt]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;�� BIND/� CTX = .CTX_A_A : REF CTXDEF;��� � LOCAL�)� INFO : CONNECTION_INFO_RETURN_BLOCK,�� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��>� STATUS = NET$INFO (IOCHAN=.CTX [CTX_W_CHAN], BUFADRS=INFO,-� BUFSIZE=%ALLOCATION (INFO), IO$SB=IOSB);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENF� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);'� IF NOT .STATUS THEN RETURN .STATUS;���C� IF ACTUALCOUNT () GTR 4 THEN .LCLPRT_A = .INFO [CI$LOCAL_PORT];�L� IF ACT�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������NETLIB_SRC.BCK�����������������:����[NETLIB]NETLIB_CMU_NET.B32;22��������������������������������������������������������������������������������������������������P������������������������������i�������������UALCOUNT () GTR 3 THEN .LCLADR_A = .INFO [CI$LOCAL_INTERNET_ADRS];E� IF ACTUALCOUNT () GTR 2 THEN .REMPRT_A = .INFO [CI$FOREIGN_PORT];�M� IF ACTUALCOUNT () GTR 1 THEN .REMADR_A = .INFO [CI$REMOTE_INTERNET_ADRS];���� SS$_NORMAL���END; ! NET_GET_INFO�� ��%SBTTL 'NET_GET_HOSTNAME'�1�GLOBAL ROUTINE NET_GET_HOSTNAME (HST_A, LEN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�+�! Returns this host's Internet host name.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_GET_HOSTNAME hostname [,len]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BUILTIN ACTUALCOUNT;�� � LOCAL�%� LNMLST : $ITMLST_DECL (ITEMS=1),�!� HSTBUF : VECTOR [1024,BYTE],�� HSTLEN : WORD,� � STATUS;�� � $ITMLST_INIT (ITMLST=LNMLST,6� (ITMCOD=LNM$_STRING, BUFSIZ=%ALLOCATION (HSTBUF),(� BUFADR=HSTBUF, RETLEN=HSTLEN));��0� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',7� LOGNAM=%ASCID'INTERNET_HOST_NAME', ITMLST=LNMLST);�� IF .STATUS THEN� � BEGIN�)� STR$COPY_R (.HST_A, HSTLEN, HSTBUF);�3� IF ACTUALCOUNT () GTR 1 THEN .LEN_A = .HSTLEN;�� END;�� � .STATUS����END; ! NET_GET_HOSTNAME�� ��%SBTTL 'NET_CVT_STATUS'�%�GLOBAL ROUTINE NET_CVT_STATUS (RC) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Converts a CMU-Tek return code to an SS$_ equivalent (from UCX).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_CVT_STATUS rc�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� SELECTONE .RC OF� SET�7� [NET$_IR,NET$_UCT,NET$_CSE,NET$_VTF] : SS$_INSFMEM;�D� [NET$_IFC,NET$_IPC,NET$_IFS,NET$_ILP,NET$_NUC,NET$_CIP,NET$_CDE,"� NET$_FSU] : SS$_BADPARAM;� [NET$_NOPRV] : SS$_NOPRIV;;� [NET$_CR,NET$_CCAN,NET$_CC,NET$_KILL] : SS$_LINKDISCON;�0� [NET$_UNN, NET$_UNA, NET$_UNU] : SS$_IVADDR;� [NET$_BTS] : SS$_IVBUFLEN;*� [NET$_URC,NET$_NRT] : SS$_UNREACHABLE;:� [NET$_CTO,NET$_TWT,NET$_FTO,NET$_NMLTO] : SS$_TIMEOUT;%� [NET$_TE,NET$_NSEXIT] : SS$_SHUT;�*� [NET$_NOINA, NET$_NOANA] : SS$_NOPRIV;N� [NET$_DSNOADDR,NET$_DSNONAME,NET$_DSNAMERR,NET$_DSREFEXC] : SS$_ENDOFFILE;� [NET$_CREF] : SS$_REJECT;�� [OTHERWISE] : .RC;� TES����END; ! NET_CVT_STATUS�� ��%SBTTL 'NET_SET_TRACE_ROUTINE'/�GLOBAL ROUTINE NET_SET_TRACE_ROUTINE (RTN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! Sets the trace routine to be used instead of LIB$PUT_OUTPUT.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_SET_TRACE_ROUTINE��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���8� IF .RTN_A EQLA 0 THEN TRACE_ROUTINE = LIB$PUT_OUTPUT � ELSE TRACE_ROUTINE = .RTN_A;� SS$_NORMAL���END;���END��ELUDOM�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1MAR;20�����������������������������������������������������������������������������������������������������H�������������������������|����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������NETLIB_SRC.BCK�����������������=����[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2�������������������������j���������������*�[NETLIB]NETLIB_CMU_TCP.B32;20�+��,�=���.�2����/� �@� �4�_���2���.��������������������-�����0���1����2���3������K��P���W���O�3����5���6�1 ��7�Pd ��8�dh��9����������G� �@��H��J������ �������������%TITLE 'NETLIB_CMU_TCP'�&�MODULE NETLIB_CMU_TCP (IDENT='V1.2-1',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�=�! ABSTRACT: TCP communication routines for use with CMU.��!��! MODULE DESCRIPTION:��!��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 29-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 29-JAN-1991 V1.0 Madison Initial coding.7�! 24-APR-1991 V1.0-1 Madison Cancel those timers!�E�! 20-JUN-1991 V1.1 Madison User-specified timeouts on receives.�J�! 05-SEP-1991 V1.2 Madison Add support for local port specification.D�! 13-OCT-1992 V1.2-1 Madison Fix TCP_ACCEPT, TCP_RECEIVE bugs.�!--���"� LIBRARY 'SYS$LIBRARY:STARLET';*� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETWORK';,� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETCOMMON';� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';� LIBRARY 'CMU_DEFS';���� FORWARD ROUTINE�� TCP_CONNECT,�� TCP_CONNECT_ADDR,� TCP_ACCEPT,� TCP_DISCONNECT,� TCP_SEND,� TCP_SND_AST,�� TCP_RECEIVE,�� TCP_RAW_RCV_AST,�� TCP_GET_LINE,� TCP_RCV_AST,�� TCP_TMO_AST;���� EXTERNAL ROUTINE� NET_GET_ADDRESS,�� NET_CVT_STATUS,>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,%� STR$TRANSLATE, LIB$CVT_DTB);���� OWN� � FREEQ : QUEDEF PRESET ($� [QUE_L_HEAD] = FREEQ,%� [QUE_L_TAIL] = FREEQ);�� ��%SBTTL 'TCP_CONNECT'8�GLOBAL ROUTINE TCP_CONNECT (CTX_A_A, NODENAME_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine establishes a connection to the specified host and� �! port.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_CONNECT nodename�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND<� NODENAME = .NODENAME_A : BLOCK [DSC$K_S_BLN,BYTE],*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL�"� ALIST : VECTOR [32,LONG], � ADRCNT,#� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��@� STATUS = NET_GET_ADDRESS (CTX, NODENAME, 32, ALIST, ADRCNT);'� IF NOT .STATUS THEN RETURN .STATUS;�!� INCR I FROM 0 TO .ADRCNT-1 DO� � BEGIN�8� STATUS = TCP_CONNECT_ADDR (CTX, ALIST [.I], .PORT);� IF .STATUS THEN EXITLOOP;� END;�� � .STATUS����END; ! TCP_CONNECT� ��%SBTTL 'TCP_CONNECT_ADDR'�<�GLOBAL ROUTINE TCP_CONNECT_ADDR (CTX_A_A, ADDRESS_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine establishes a connection to the specified host and� �! port.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! TCP_CONNECT_ADDR ctx, addr, port��!��! IMPLICIT INPUTS: No������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������!����������������������������������NETLIB_SRC.BCK�����������������=����[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2��������������������������������������ne.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND� ADDRESS = .ADDRESS_A,*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL�#� IOSB : NETIO_STATUS_BLOCK,� � STATUS;��1� STATUS = NET$OPEN (FHNAM=ADDRESS, ADDRFLAG=1,�<� FOREIGN_PRT=.PORT, PROTOCOL=U$TCP_PROTOCOL, IO$SB=IOSB,I� IOCHAN=.CTX [CTX_W_CHAN], TIMOUT=0, LOCAL_PRT=.CTX [CTX_L_LSNPORT]);���� IF .STATUS THEN�[� STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN NET_CVT_STATUS (.IOSB [NSB$XERROR])�'� ELSE .IOSB [NSB$STATUS]);��� � .STATUS����END; ! TCP_CONNECT_ADDR�� ��%SBTTL 'TCP_ACCEPT'�G�GLOBAL ROUTINE TCP_ACCEPT (LSNR_A_A, CTX_A_A, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�=�! This routine accepts an incoming connection. It will not�:�! complete until a connection comes in for it to accept.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�(�! TCP_ACCEPT ctx, iosb, astadr, astprm�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND$� LSNR = .LSNR_A_A : REF CTXDEF,$� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;�� � IF ACTUALCOUNT () GTR 2 THEN8� STATUS = NET$OPEN (LOCAL_PRT=.LSNR [CTX_L_LSNPORT],C� OPENMODE=PASSIVE, IOCHAN=.CTX [CTX_W_CHAN], IO$SB=.IOSB_A,�C� TIMOUT=0, AST$ADR=.ASTADR, AST$PRM=.ASTPRM, IOMODE=ASYNCH)�� ELSE � BEGIN�7� BIND IOSB = CTX [CTX_Q_IOSB] : NETIO_STATUS_BLOCK;�8� STATUS = NET$OPEN (LOCAL_PRT=.LSNR [CTX_L_LSNPORT],4� OPENMODE=PASSIVE, IOCHAN=.CTX [CTX_W_CHAN],� IO$SB=IOSB, TIMOUT=0);�� IF .STATUS THEN_� STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN NET_CVT_STATUS (.IOSB [NSB$XERROR])�(� ELSE .IOSB [NSB$STATUS]);� END;�� � .STATUS����END; ! TCP_ACCEPT�� ��%SBTTL 'TCP_DISCONNECT'�)�GLOBAL ROUTINE TCP_DISCONNECT (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Closes a connection.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_DISCONNECT�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,'� BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;��� � LOCAL�� RCV : REF RCVDEF,�� IOSB : NETIO_STATUS_BLOCK;���4� NET$CLOSE (IOCHAN=.CTX [CTX_W_CHAN], IO$SB=IOSB)���END; ! TCP_DISCONNECT�� ��%SBTTL 'TCP_SEND'�M�GLOBAL ROUTINE TCP_SEND (CTX_A_A, SNDSTR_A, XFLAGS, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! This routine sends a string to the remote system. The string isH�! automatically terminated with a cr/lf sequence, and the EOL ("push");�! bit is set based on the value of the PUSH bit of FLAGS.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�8�! TCP_SEND ctx, cmdstr [,push] [,iosb, astadr, astprm]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND#� CTX ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������"����������������������������������NETLIB_SRC.BCK�����������������=����[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2��������������������������������������= .CTX_A_A : REF CTXDEF,�3� SNDSTR = .SNDSTR_A : BLOCK [DSC$K_S_BLN,BYTE];��� � LOCAL�� FLAGS : BLOCK [4,BYTE],� IOSB : NETIO_STATUS_BLOCK,�� SND : REF SNDDEF,�%� STR : BLOCK [DSC$K_S_BLN,BYTE],� � STATUS;��;� IF ACTUALCOUNT () GTR 2 THEN FLAGS [0,0,32,0] = .XFLAGS�� ELSE FLAGS [0,0,32,0] = 0;�� � IF ACTUALCOUNT () LSS 4 THEN � BEGIN�%� IF NOT .FLAGS [NET_V_NOTRM] THEN� � BEGIN� $INIT_DYNDESC (STR);�K� STR$CONCAT (STR, SNDSTR, %ASCID %STRING (%CHAR (13), %CHAR (10)));� � END;�=� STATUS = NET$SEND (IOCHAN=.CTX [CTX_W_CHAN], IO$SB=IOSB,�F� BUFADRS=(IF .FLAGS [NET_V_NOTRM] THEN .SNDSTR [DSC$A_POINTER]%� ELSE .STR [DSC$A_POINTER]),�E� BUFSIZE=(IF .FLAGS [NET_V_NOTRM] THEN .SNDSTR [DSC$W_LENGTH]�$� ELSE .STR [DSC$W_LENGTH]),"� EOL=.FLAGS [NET_V_PUSH]);9� IF NOT .FLAGS [NET_V_NOTRM] THEN STR$FREE1_DX (STR);�� IF .STATUS THEN_� STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN NET_CVT_STATUS (.IOSB [NSB$XERROR])�(� ELSE .IOSB [NSB$STATUS]);� END�� ELSE � BEGIN�+� LIB$GET_VM (%REF (SND_S_SNDDEF), SND);�� SND [SND_L_CTX] = .CTX;"� SND [SND_L_ASTADR] = .ASTADR;"� SND [SND_L_ASTPRM] = .ASTPRM; � BEGIN7� BIND STR = SND [SND_Q_SNDBUF] : BLOCK [,BYTE];�� $INIT_DYNDESC (STR);�?� IF .FLAGS [NET_V_NOTRM] THEN STR$COPY_DX (STR, SNDSTR)�&� ELSE STR$CONCAT (STR, SNDSTR,3� %ASCID %STRING (%CHAR (13), %CHAR (10)));�D� STATUS = NET$SEND (IOCHAN=.CTX [CTX_W_CHAN], IO$SB=.IOSB_A,D� BUFADRS=.STR [DSC$A_POINTER], BUFSIZE=.STR [DSC$W_LENGTH],1� EOL=.FLAGS [NET_V_PUSH], IOMODE=ASYNCH,�-� AST$ADR=TCP_SND_AST, AST$PRM=.SND);� � END;�� IF NOT .STATUS THEN0� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND);� END;�� � .STATUS����END; ! TCP_SEND�� ��%SBTTL 'TCP_SND_AST'�ROUTINE TCP_SND_AST (SND_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! AST routine triggered on send completion.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_SND_AST snd�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND� SND = .SND_A : SNDDEF;��� � LOCAL�� ASTADR, ASTPRM;��&� STR$FREE1_DX (SND [SND_Q_SNDBUF]);!� ASTADR = .SND [SND_L_ASTADR];�!� ASTPRM = .SND [SND_L_ASTPRM];�+� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND);�.� IF .ASTADR NEQA 0 THEN (.ASTADR) (.ASTPRM)� ELSE SS$_NORMAL����END; ! TCP_SND_AST� ��%SBTTL 'TCP_RECEIVE'O�GLOBAL ROUTINE TCP_RECEIVE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Raw TCP receive routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_RECEIVE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�� RCV : REF RCVDEF,� � STATUS;��-� IF REMQUE (.FREEQ [QUE_L_HEAD], RCV) THEN�+� LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV);�� RC���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������#����������������������������������NETLIB_SRC.BCK�����������������=����[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2�������������������������.�������������V [RCV_L_CTX] = .CTX;� � IF ACTUALCOUNT () GTR 2 THEN#� RCV [RCV_L_USRIOSB] = .IOSB_A;� � IF ACTUALCOUNT () GTR 3 THEN � BEGIN�"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� END�� ELSEG� RCV [RCV_L_USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;���6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RCV_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);>� STATUS = NET$RECEIVE (IOCHAN=.CHN, IO$SB=RCV [RCV_Q_IOSB],:� AST$ADR=TCP_RAW_RCV_AST, AST$PRM=.RCV, IOMODE=ASYNCH,F� BUFADRS=.RCVSTR [DSC$A_POINTER], BUFSIZE=.RCVSTR [DSC$W_LENGTH]);� IF NOT .STATUS THEN� � BEGIN�� $CANTIM (REQIDT=.RCV);�(� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END�� ELSE!� IF ACTUALCOUNT () LSS 4 THEN� � BEGIN;� BIND IOSB = RCV [RCV_Q_IOSB] : NETIO_STATUS_BLOCK;�1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);�F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORTL� THEN NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);@� IF ACTUALCOUNT () GTR 2 THEN CH$MOVE (8, IOSB, .IOSB_A)K� ELSE IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT�L� THEN NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]); � END;��� � .STATUS����END; ! TCP_RECEIVE� ��%SBTTL 'TCP_RAW_RCV_AST',�ROUTINE TCP_RAW_RCV_AST (RCV : REF RCVDEF) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�>�! This AST routine is invoked when a network read completes.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_RAW_RCV_AST buf��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND(� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,�/� UIOSB = RCV [RCV_L_USRIOSB] : REF IOSBDEF;���� $CANTIM (REQIDT=.RCV);B� IF .UIOSB NEQA 0 THEN CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);'� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);���&� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN0� (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM])� ELSE� SS$_NORMAL����END; ! TCP_RAW_RCV_AST� ��%SBTTL 'TCP_GET_LINE'�P�GLOBAL ROUTINE TCP_GET_LINE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�E�! This routine forms one NNTP "line" out of the input received over�K�! the net from the server. A "line" is a string of characters terminated�G�! with a cr/lf sequence. The routine will wait until enough input is��! received to form a "line".�!�I�! Note that I cheat a bit and assume that CR ends a record. This makes�K�! life a little easier since I don't have to wait around for another data�L�! block to show up if the CR occurs as the last character of a data block,F�! just to verify that there is an LF at the front of the next block.I�! IGNORE_LF_FRONT gets set instead, so on the next call I can strip the�I�! first character of the front of the next block (assuming it's an LF).��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_GET_LINE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$����������������������������������NETLIB_SRC.BCK�����������������=����[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2�������������������������������������� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�'� INQ = CTX [CTX_Q_BUFQ] : QUEDEF,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�%� SDSC : BLOCK [DSC$K_S_BLN,BYTE],�� RCV : REF RCVDEF,� � LEN,� � EOPTR,� � LFPOS,� � STATUS,� FOUND_CRLF;��#� STR$COPY_DX (RCVSTR, %ASCID'');���'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;���� FOUND_CRLF = 0;�0� WHILE NOT REMQUE (.INQ [QUE_L_HEAD], RCV) DO � BEGIN� � BIND�6� IOSB = RCV [RCV_Q_IOSB] : NETIO_STATUS_BLOCK,-� RCNT = IOSB [NSB$BYTE_COUNT] : WORD;�A� EOPTR = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (13));�A� LFPOS = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (10));���,� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOS&� ELSE IF NOT CH$FAIL (.LFPOS) THEN3� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;���� IF CH$FAIL (.EOPTR) THEN� � BEGIN4� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];L� SDSC [DSC$W_LENGTH] = MINU (.RCNT, STR_MAX-.RCVSTR [DSC$W_LENGTH]);#� STR$APPEND (RCVSTR, SDSC);�,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END � ELSE� � BEGIN4� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];5� LEN = CH$DIFF (.EOPTR, .RCV [RCV_L_BUFPTR]);�K� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.RCVSTR [DSC$W_LENGTH]);�#� STR$APPEND (RCVSTR, SDSC);�1� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THEN�� BEGIN2� IF .SDSC [DSC$W_LENGTH] GEQ .RCNT-2 THEN� BEGIN�6� IF .SDSC [DSC$W_LENGTH] EQL .RCNT-1 THEN(� CTX [CTX_V_IGNORELF] = 1;1� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� � END�� ELSE� BEGIN�� LOCAL DELTA;<� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10)#� THEN 2 ELSE 1);�<� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, .DELTA);;� RCNT = .RCNT - .SDSC [DSC$W_LENGTH] - .DELTA;�!� INSQUE (.RCV, INQ);�� END; � END � ELSE�� BEGIN2� IF .SDSC [DSC$W_LENGTH] GEQ .RCNT-1 THEN0� INSQUE (.RCV, .FREEQ [QUE_L_TAIL])� ELSE� BEGIN�7� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, 1);�6� RCNT = .RCNT - .SDSC [DSC$W_LENGTH] - 1;!� INSQUE (.RCV, INQ);�� END; � END;�� FOUND_CRLF = 1;� EXITLOOP; � END;O� END; ! WHILE NOT REMQUE��� IF .FOUND_CRLF THENE � BEGINL!� IF ACTUALCOUNT () GTR 2 THENI � BEGIN� IF .IOSB_A NEQA 0 THEN�� BEGIN3� BIND IOSB = .IOSB_A : NETIO_STATUS_BLOCK;�9� IOSB [NSB$BYTE_COUNT] = .RCVSTR [DSC$W_LENGTH];i)� IOSB [NSB$STATUS] = SS$_NORMAL;E � END;C� IF .ASTADR NEQA 0 THENI:� RETURN $DCLAST (ASTADR=.ASTADR, ASTPRM=.ASTPRM); � END;N� RETURN SS$_NORMAL;N� END;� n-� IF REMQUE (.FREEQ [QUE_L_HEAD], RCV) THENd+� LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV);9)� RCV [RCV_L_BUFPTR] = RCV [RCV_T_BUF];o� RCV [RCV_L_CTX] = .CTX; � RCV [RCV_L_STRPTR] = RCVSTR;�� � IF ACTUALCOUNT () GTR 2 THEN � BEGIN1#� RCV [RCV_L_USRIOSB] = .IOSB_A;I"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� ENDN� ELSEG� RCV [RCV_L_USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;���6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RC���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������%����������������������������������NETLIB_SRC.BCK�����������������=����[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2�������������������������e������#�������V_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);>� STATUS = NET$RECEIVE (IOCHAN=.CHN, IO$SB=RCV [RCV_Q_IOSB],;� AST$ADR=TCP_RCV_AST, AST$PRM=.RCV, IOMODE=ASYNCH,T6� BUFADRS=RCV [RCV_T_BUF], BUFSIZE=RCV_S_BUF);��� IF NOT .STATUS THEN � BEGINN� $CANTIM (REQIDT=.RCV);T(� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END�� ELSE'� IF .RCV [RCV_L_ASTADR] EQLA 0 THEN 1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);U�� � .STATUSE���END; ! TCP_GET_LINEO� C�%SBTTL 'TCP_RCV_AST'(�ROUTINE TCP_RCV_AST (RCV : REF RCVDEF) =�BEGIN+�!++ �! FUNCTIONAL DESCRIPTION:��! >�! This AST routine is invoked when a network read completes.@�! It queues up the buffer block for processing by the mainline@�! thread, which will also handle I/O errors. Then a new block<�! is allocated and, barring any errors, a read is reQIO'd.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!c �! PROTOTYPE:�! �! TCP_RCV_AST buf �!o�! IMPLICIT INPUTS: None. �!D�! IMPLICIT OUTPUTS: None.B�!K�! COMPLETION CODES:��! 2�! SS$_NORMAL: normal successful completion.�! �! SIDE EFFECTS:C�! �! None.��!--A��� BIND3� IOSB = RCV [RCV_Q_IOSB] : NETIO_STATUS_BLOCK, 0� STR = .RCV [RCV_L_STRPTR] : BLOCK [,BYTE],.� BUF = RCV [RCV_T_BUF] : BLOCK [,BYTE],4� BUFPTR = RCV [RCV_L_BUFPTR]: REF BLOCK [,BYTE],+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,I%� CHN = CTX [CTX_W_CHAN] : WORD,O:� UIOSB = RCV [RCV_L_USRIOSB] : REF NETIO_STATUS_BLOCK;�� � LOCALC � LEN,L � STATUS, � EOPTR,D � LFPOS,D%� SDSC : BLOCK [DSC$K_S_BLN,BYTE];I��� $CANTIM (REQIDT=.RCV);"� IF NOT .IOSB [NSB$STATUS] THEN � BEGINi� IF .UIOSB NEQA 0 THEN � BEGIN1� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);y6� UIOSB [NSB$BYTE_COUNT] = .STR [DSC$W_LENGTH]; � END;�(� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);'� IF .RCV [RCV_L_ASTADR] NEQA 0 THENC;� RETURN (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM]). � ELSEE� RETURN SS$_NORMAL;-� END;��!� IF .CTX [CTX_V_IGNORELF] THEN� � BEGIN � CTX [CTX_V_IGNORELF] = 0;.� IF CH$RCHAR (.BUFPTR) EQL %CHAR (10) THEN � BEGIN'� BUFPTR = CH$PLUS (.BUFPTR, 1);E<� IOSB [NSB$BYTE_COUNT] = .IOSB [NSB$BYTE_COUNT] - 1; � END;I� END;��'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;P'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;TE� EOPTR = CH$FIND_CH (.IOSB [NSB$BYTE_COUNT], .BUFPTR, %CHAR (13));VE� LFPOS = CH$FIND_CH (.IOSB [NSB$BYTE_COUNT], .BUFPTR, %CHAR (10));���+� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOS�%� ELSE IF NOT CH$FAIL (.LFPOS) THENT/� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;P��� IF CH$FAIL (.EOPTR) THEN � BEGINI8� SDSC [DSC$W_LENGTH] = MINU (.IOSB [NSB$BYTE_COUNT],6� STR_MAX-.STR [DSC$W_LENGTH]);$� SDSC [DSC$A_POINTER] = .BUFPTR;� STR$APPEND (STR, SDSC);� BUFPTR = RCV [RCV_T_BUF];G� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);P?� STATUS = NET$RECEIVE (IOCHAN=.CHN, IO$SB=RCV [RCV_Q_IOSB],D;� AST$ADR=TCP_RCV_AST, AST$PRM=.RCV, IOMODE=ASYNCH,�6� BUFADRS=RCV [RCV_T_BUF], BUFSIZE=RCV_S_BUF);� IF NOT .STATUS THEN � BEGIN� $CANTIM (REQIDT=.RCV);�� IF .UIOSB NEQA 0 THEN� BEGIN2� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);7� UIOSB [NSB$BYTE_COUNT] = .STR ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������&����������������������������������NETLIB_SRC.BCK�����������������=����[NETLIB]NETLIB_CMU_TCP.B32;20��������������������������������������������������������������������������������������������������_�����2�������������������������� �����*�������[DSC$W_LENGTH];,'� UIOSB [NSB$STATUS] = .STATUS;[ � END;$,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);+� IF .RCV [RCV_L_ASTADR] NEQA 0 THENE<� RETURN (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM]) � ELSES� RETURN SS$_NORMAL; � END;L� RETURN SS$_NORMAL� END;��$� LEN = CH$DIFF (.EOPTR, .BUFPTR);C� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.STR [DSC$W_LENGTH]);I#� SDSC [DSC$A_POINTER] = .BUFPTR;E� STR$APPEND (STR, SDSC);O,� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THEN � BEGIN�>� IF .SDSC [DSC$W_LENGTH] GEQ .IOSB [NSB$BYTE_COUNT]-2 THEN � BEGINB� IF .SDSC [DSC$W_LENGTH] EQL .IOSB [NSB$BYTE_COUNT]-1 THEN#� CTX [CTX_V_IGNORELF] = 1;.,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END � ELSEv � BEGIN� LOCAL DELTA;_G� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10) THEN 2 ELSE 1);�+� BUFPTR = CH$PLUS (.EOPTR, .DELTA);L9� IOSB [NSB$BYTE_COUNT] = .IOSB [NSB$BYTE_COUNT] -�,� .SDSC [DSC$W_LENGTH] - .DELTA;)� INSQUE (.RCV, CTX [CTX_Q_BUFQ]); � END;]� ENDF� ELSE � BEGIN >� IF .SDSC [DSC$W_LENGTH] GEQ .IOSB [NSB$BYTE_COUNT]-1 THEN+� INSQUE (.RCV, .FREEQ [QUE_L_TAIL])) � ELSET � BEGIN&� BUFPTR = CH$PLUS (.EOPTR, 1);9� IOSB [NSB$BYTE_COUNT] = .IOSB [NSB$BYTE_COUNT] -P&� .SDSC [DSC$W_LENGTH] - 1;)� INSQUE (.RCV, CTX [CTX_Q_BUFQ]);n � END;m� END;��� IF .UIOSB NEQA 0 THENi � BEGINn%� UIOSB [NSB$STATUS] = SS$_NORMAL; 2� UIOSB [NSB$BYTE_COUNT] = .STR [DSC$W_LENGTH];� END;&� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN0� (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM])� ELSE� SS$_NORMALc���END; ! TCP_RCV_AST� ,�%SBTTL 'TCP_TMO_AST')�ROUTINE TCP_TMO_AST (RCV : REF RCVDEF) = O�BEGIN �!++��! FUNCTIONAL DESCRIPTION:��!�7�! Delivered when a receive takes longer than EXPTIME. @�! Just cancels the I/O, to trigger the I/O completion AST with�! status SS$_CANCEL.�! B�! RETURNS: cond_value, longword (unsigned), write only, by value�!N �! PROTOTYPE:�!O�! TCP_TMO_AST rcv�![�! IMPLICIT INPUTS: None._�!T�! IMPLICIT OUTPUTS: None. �!D�! COMPLETION CODES:C�!D2�! SS$_NORMAL: normal successful completion.�!(�! SIDE EFFECTS:S�!, �! None.X�!--�� BIND%� CTX = .RCV [RCV_L_CTX] : CTXDEF;C��$� $CANCEL (CHAN=.CTX [CTX_W_CHAN])���END; ! TCP_TMO_AST���END��ELUDOMIN� $INIT_DYNDESC (STR);�K� STR$CONCAT (STR, SNDSTR, %ASCID %ST������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������'����������������������������������NETLIB_SRC.BCK�����������������?����[NETLIB]NETLIB_CMU_UDP.B32;8���������������������������������������������������������������������������������������������������O������������������������������E*���������������*�[NETLIB]NETLIB_CMU_UDP.B32;8�+��,�?���.�����/� �@� �4�O������ � �������������������-�����0���1����2���3������K��P���W���O�����5���6� ,)��7�<,)��8�dh��9����������G� �@��H��J������� �������������%TITLE 'NETLIB_CMU_UDP'�$�MODULE NETLIB_CMU_UDP (IDENT='V1.2',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�-�! ABSTRACT: UDP NETLIB routines for CMU.��!��! MODULE DESCRIPTION:��!�3�! Contains UDP send and receive routines for CMU.��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 29-JAN-1991��!��! MODIFICATION HISTORY:��!�?�! 29-JAN-1991 V1.0 Madison Initial coding (from NSQUERY).�G�! 08-FEB-1991 V1.1 Madison Add source info return to UDP_RECEIVE.�;�! 22-NOV-1991 V1.2 Madison Add rcvtmo to UDP_RECEIVE.��!--�"� LIBRARY 'SYS$LIBRARY:STARLET';*� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETWORK';,� LIBRARY 'CMUTEK_SRC:[CENTRAL]NETCOMMON';� LIBRARY 'CMU_DEFS';�� LIBRARY 'NETLIB';���� FORWARD ROUTINE�� UDP_SEND,� UDP_RECEIVE,�� TIMER_AST;���� EXTERNAL ROUTINE� NET_CVT_STATUS;� ��%SBTTL 'UDP_SEND'�L�GLOBAL ROUTINE UDP_SEND (CTX_A_A, ADR, PORT : WORD, BUFPTR, BUFLEN : WORD) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Sends out a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! UDP_SEND chan, address, port, bufptr, buflen��!�9�! chan: channel, word (unsigned), read only, by value�G�! address: longword_unsigned, longword (unsigned), read only, by value�?�! port: word_unsigned, word (unsigned), read only, by value�E�! bufptr: varying_arg, longword (unsigned), read only, by reference�?�! buflen: word_unsigned, word (unsigned), read only, by value��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHAN = CTX [CTX_W_CHAN] : WORD;��� � LOCAL�� IOSB : NETIO_STATUS_BLOCK���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������8�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1�����������������������������������������������������������������������������������������������������������H������������������������e�|�����6������,�!� IPADR : IPADR$ADDRESS_BLOCK,� � STATUS;��� IPADR [IPADR$SRC_HOST] = 0;�"� IPADR [IPADR$DST_HOST] = .ADR;� IPADR [IPADR$SRC_PORT] = 0;�#� IPADR [IPADR$DST_PORT] = .PORT;�7� STATUS = NET$SEND (IOCHAN=.CHAN, IO$SB=IOSB, EOL=1,�8� BUFADRS=.BUFPTR, BUFSIZE=.BUFLEN, ADDR_SPEC=IPADR);F� IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THENF� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]); � .STATUS����END; ! UDP_SEND�� ��%SBTTL 'UDP_RECEIVE'E�GLOBAL ROUTINE UDP_RECEIVE (CTX_A_A, BUFPTR, BUFSIZ : WORD, BUFLEN_A,�.� SRCADR_A, SRCPRT_A, RCVTMO_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Reads a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�J�! UDP_RECEIVE ctx, bufptr, bufsiz, buflen [,srcadr] [,srcprt] [,rcvtmo]�!�@�! ctx: context, longword (unsigned), read only, by referenceF�! bufptr: varying_arg, longword (unsigned), write only, by reference?�! bufsiz: word������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������(����������������������������������NETLIB_SRC.BCK�����������������?����[NETLIB]NETLIB_CMU_UDP.B32;8���������������������������������������������������������������������������������������������������O������������������������������t� ������������_unsigned, word (unsigned), read only, by value�D�! buflen: word_unsigned, word (unsigned), write only, by referenceL�! srcadr: longword_unsigned, longword (unsigned), write only, by referenceL�! srcprt: longword_unsigned, longword (unsigned), write only, by referenceA�! rcvtmo: date_time, quadword (signed), read only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHAN = CTX [CTX_W_CHAN] : WORD,�$� BUFLEN = .BUFLEN_A : WORD;�� � BUILTIN�� ACTUALCOUNT;��� � LOCAL�� RCVTMO : VECTOR [2,LONG],� INFO : VECTOR [3,LONG],� IOSB : NETIO_STATUS_BLOCK,�!� IPADR : IPADR$ADDRESS_BLOCK,� � STATUS;��� IPADR [IPADR$SRC_HOST] = 0;�� IPADR [IPADR$DST_HOST] = 0;�� IPADR [IPADR$SRC_PORT] = 0;�� IPADR [IPADR$DST_PORT] = 0;���"� STATUS = ACTUALCOUNT () GTR 6;.� IF .STATUS THEN STATUS = .RCVTMO_A NEQA 0;2� IF .STATUS THEN CH$MOVE (8, .RCVTMO_A, RCVTMO)<� ELSE $BINTIM (TIMBUF=%ASCID'0 00:00:10', TIMADR=RCVTMO);��� INFO [0] = .CHAN;�� INFO [1] = IOSB;� INFO [2] = SS$_NORMAL;;� $SETIMR (DAYTIM=RCVTMO, ASTADR=TIMER_AST, REQIDT=INFO);�D� STATUS = NET$RECEIVE (IOCHAN=.CHAN, IO$SB=IOSB, BUFADRS=.BUFPTR,'� BUFSIZE=.BUFSIZ, ADDR_SPEC=IPADR);�� $CANTIM (REQIDT=INFO);,� IF NOT .INFO [2] THEN STATUS = .INFO [2]K� ELSE IF .STATUS THEN STATUS = (IF .IOSB [NSB$STATUS] EQL SS$_ABORT THEN�G� NET_CVT_STATUS (.IOSB [NSB$XERROR]) ELSE .IOSB [NSB$STATUS]);�=� BUFLEN = (IF .STATUS THEN .IOSB [NSB$BYTE_COUNT] ELSE 0);�� IF .STATUS THEN� � BEGIN�!� IF ACTUALCOUNT () GTR 4 THEN�F� IF .SRCADR_A NEQA 0 THEN .SRCADR_A = .IPADR [IPADR$SRC_HOST];!� IF ACTUALCOUNT () GTR 5 THEN�F� IF .SRCPRT_A NEQA 0 THEN .SRCPRT_A = .IPADR [IPADR$SRC_PORT];� END;�� � .STATUS����END; ! UDP_RECEIVE� ��%SBTTL 'TIMER_AST'�ROUTINE TIMER_AST (INFO_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This AST routine is triggered when the net receive timer goes off.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TIMER_AST info��!�O�! info: vector_longword_unsigned, longword (unsigned), modify, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND&� INFO = .INFO_A : VECTOR [3,LONG], � IOSB = .INFO [1] : IOSBDEF;��2� INFO [2] = IOSB [IOSB_W_STATUS] = SS$_TIMEOUT;� $CANCEL (CHAN=.INFO [0]);���� SS$_NORMAL���END; ! TIMER_AST���END��ELUDOM��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������)����������������������������������NETLIB_SRC.BCK�����������������H����"[NETLIB]NETLIB_MULTINET_NET.B32;34���������������������������������������������������������������������������������������������P�����(�������������������������ſ��������������"�*�[NETLIB]NETLIB_MULTINET_NET.B32;34�+��,�H���.�(����/� �@� �4�P���(���(�:��������������������-�����0���1����2���3������K��P���W���O�)����5���6�`F��7�1F��8�dh��9����������G� �@��H��J����������������� �������������%TITLE 'NETLIB_MULTINET_NET')�MODULE NETLIB_MULTINET_NET (IDENT='V1.4',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�A�! ABSTRACT: Common network library routines for TGV MultiNet�-�! and Process Software's TCPware.��!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�F�! COPYRIGHT 1991, 1992 RENSSELAER POLYTECHNIC INSTITUTE."�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 04-FEB-1991��!��! MODIFICATION HISTORY:��!�0�! 04-FEB-1991 V1.0 Madison Initial coding.=�! 19-MAR-1991 V1.1 Madison Memory handling refinements.�B�! 05-SEP-1991 V1.2 Madison Add NOT_PASSIVE flag on NET_BIND.?�! 20-NOV-1991 V1.2-1 Madison Add REUSEADDR socket option.�9�! 04-DEC-1991 V1.2-2 Madison Improve debug support.�K�! 11-FEB-1992 V1.2-3 Madison GETSOCKNAME returned length is longword.�H�! 11-FEB-1992 V1.3 Madison Merge in Bernie Volz's TCPware support.;�! 07-JAN-1993 V1.3-1 Madison Update for TCPware V3.0.�G�! 22-MAR-1993 V1.4 Madison Bring in socket libraries at run-time.�:�! 26-MAR-1993 V1.4-1 Madison LIB$SIG_TO_RET unwinds!�!--���� COMPILETIME�*� FOR_TCPWARE = (%VARIANT AND 2) NEQ 0;��"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';$� LIBRARY 'MULTINET_TCPWARE_DEFS';��� FORWARD ROUTINE�� NET_ASSIGN,� NET_DEASSIGN,� NET_BIND,� NET_GET_ADDRESS,�� NET_ADDR_TO_NAME,� NET_GET_INFO,� NET_GET_HOSTNAME,� NET_CVT_STATUS,� NET_SET_TRACE_ROUTINE,�� GETHOSTBYNAME,�� GETHOSTBYADDR,�� FIND_IMAGE_SYMBOL;���� EXTERNAL ROUTINE>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,<� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE, STR$COPY_R,<� LIB$CREATE_VM_ZONE, LIB$PUT_OUTPUT, LIB$SIG_TO_RET, � LIB$FIND_IMAGE_SYMBOL);�� � GLOBAL.� TRACE_ROUTINE : INITIAL (LIB$PUT_OUTPUT);��� OWN� � CTXZONE : INITIAL (0);� ��%SBTTL 'NET_ASSIGN'�%�GLOBAL ROUTINE NET_ASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�E�! This routine assigns a network channel for subsequent operations.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_ASSIGN nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � ASTSTAT,� � STATUS;��!� ASTSTAT = $SETAST (ENBFLG=0);�� IF .CTXZONE EQLA 0 THEN� � BEGIN�A� STATUS = LIB$CREATE_VM_ZONE (CTXZONE, %REF (LIB$K_VM_FIXED),�� %REF (CTX_S_CTXDEF),�;� %REF (LIB$M_VM_GET_FILL0 OR LIB$M_VM_EXTEND_AREA),�� %REF (4), %REF (4),<� %REF (8), %REF (8), 0, 0, %ASCID'NETLIB_CTX��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������*����������������������������������NETLIB_SRC.BCK�����������������H����"[NETLIB]NETLIB_MULTINET_NET.B32;34���������������������������������������������������������������������������������������������P�����(�������������������������aU�������������_ZONE');8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);(� IF NOT .STATUS THEN RETURN .STATUS;� END�� ELSE8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);��<� STATUS = LIB$GET_VM (%REF (CTX_S_CTXDEF), CTX, CTXZONE);'� IF NOT .STATUS THEN RETURN .STATUS;� � BEGIN�+� BIND BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;�2� BUFQ [QUE_L_TAIL] = BUFQ [QUE_L_HEAD] = BUFQ;E� $BINTIM (TIMBUF=%ASCID'0 00:05:00', TIMADR=CTX [CTX_Q_EXPTIME]);�� END;��D� STATUS = $ASSIGN (DEVNAM=%ASCID'INET0:', CHAN=CTX [CTX_W_CHAN]);H� IF NOT .STATUS THEN LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX, CTXZONE);�� � .STATUS����END; ! NET_ASSIGN�� ��%SBTTL 'NET_BIND'�J�GLOBAL ROUTINE NET_BIND (CTX_A_A, PROTOCOL, PORT, XTHREADS, NOT_PASSIVE) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine creates and binds a local socket for the specified� �! protocol.��!�A�! If the port number is specified, the connection is assumed to�F�! be passive and a listener channel is established, with the maximumE�! number of simultaneous incoming connections specified by XTHREADS�F�! (defaults to 4 if not specified). If the NOT_PASSIVE flag is set,D�! the connection is opened as an active channel with the specifiedJ�! port as the source, and XTHREADS is ignored. If no PORT is specified,H�! the connection is assumed to be active and a source port is assigned�! at random.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�<�! NET_BIND ctx, protocol [,port] [,threads] [,not_passive]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;��� BUILTIN ACTUALCOUNT;�� � LOCAL�� IOSB : IOSBDEF,,� LCLSIN : BLOCK [SIN$C_LENGTH,BYTE], � THREADS,� � ACTIVE, � STATUS;��<� ACTIVE = (IF ACTUALCOUNT () GTR 4 THEN .NOT_PASSIVE ELSE=� IF ACTUALCOUNT () GTR 2 THEN (.PORT EQL 0) ELSE 1);���� SELECTONE .PROTOCOL OF� SET�� [NET_K_TCP] :�L� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SOCKET, IOSB=IOSB,.� P1=INET$C_AF_INET, P2=UCX$C_STREAM);� [NET_K_UDP] :�L� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SOCKET, IOSB=IOSB,-� P1=INET$C_AF_INET, P2=UCX$C_DGRAM);�� TES;��*� LCLSIN [SIN$W_FAMILY] = UCX$C_AF_INET; � IF ACTUALCOUNT () GTR 2 THEN � BEGIN�)� BIND NPORT = PORT : VECTOR [4,BYTE];�7� LCLSIN [SIN$W_PORT] = .NPORT [0] ^ 8 + .NPORT [1];�� IF .ACTIVE THEN � � BEGIN� THREADS = 0;�E� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SETSOCKOPT,�F� IOSB=IOSB, P1=%X'FFFF', P2=SOCKOPT$M_REUSEADDR, P3=%REF (1),� P4=4);I� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�,� IF NOT .STATUS THEN RETURN .STATUS;� ENDD� ELSE THREADS = (IF ACTUALCOUNT () GTR 3 THEN .XTHREADS ELSE 4);� END�� ELSE � BEGIN�� LCLSIN [SIN$W_PORT] = 0;�� THREADS = 0;�A� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SETSOCKOPT,�L� IOSB=IOSB, P1=%X'FFFF', P2=SOCKOPT$M_REUSEADDR, P3=%REF (1), P4=4);E� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�(� IF NOT .STATUS THEN RETURN .STATUS;� END;,� LCLSIN [SIN$L_ADDR] = INET$C_INADDR_ANY;9� CH$FILL (%CHAR (0), SIN$S_ZERO, LCLSIN [SIN$T_ZERO]);�E� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=I���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������+����������������������������������NETLIB_SRC.BCK�����������������H����"[NETLIB]NETLIB_MULTINET_NET.B32;34���������������������������������������������������������������������������������������������P�����(��������������������������������������O$_BIND, IOSB=IOSB,�!� P1=LCLSIN, P2=SIN$C_LENGTH);�D� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);��#� IF .STATUS AND NOT .ACTIVE THEN� � BEGIN�=� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_LISTEN,�!� IOSB=IOSB, P1=.THREADS);�E� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� END;�� � .STATUS����END; ! NET_BIND�� ��%SBTTL 'NET_GET_ADDRESS'M�GLOBAL ROUTINE NET_GET_ADDRESS (CTX_A_A, HOST_A, ALSIZE, ALIST_A, ALCNT_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Given a host name, returns an array of valid Internet addresses.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�5�! NET_GET_ADDRESS ctx, host, arrsiz, array, retcnt��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,+� NODENAME = .HOST_A : BLOCK [,BYTE],�+� ALIST = .ALIST_A : VECTOR [,LONG],�� ALCNT = .ALCNT_A;�� � LOCAL�/� HENT : REF BLOCK [HOST$S_HOSTENTDEF,BYTE],� � STATUS;��K� IF STR$FIND_FIRST_NOT_IN_SET (NODENAME, %ASCID'0123456789.') NEQ 0 THEN� � BEGIN�*� LOCAL STR : BLOCK [DSC$K_S_BLN,BYTE];� ALCNT = 0;�� INIT_DYNDESC (STR);<� STR$CONCAT (STR, NODENAME, %ASCID %STRING (%CHAR (0)));1� HENT = GETHOSTBYNAME (.STR [DSC$A_POINTER]);�� FREE_STRINGS (STR);0� IF .HENT EQLA 0 THEN STATUS = SS$_ENDOFFILE � ELSE� � BEGINC� BIND PTRLST = .HENT [HOST$L_H_ADDR_LIST] : VECTOR [,LONG];�� INCR I FROM 0 DO�� BEGIN/� IF .PTRLST [.I] EQLA 0 THEN EXITLOOP;�.� IF .ALCNT GEQ .ALSIZE THEN EXITLOOP;)� ALIST [.ALCNT] = ..PTRLST [.I];�� ALCNT = .ALCNT + 1;� � END;�� STATUS = SS$_NORMAL;� � END;�� END�� ELSE BEGIN � LOCAL� ADRL : VOLATILE,�$� ADRB : REF VECTOR [4,BYTE],� CHP, DOTP,�� LEN, XLEN, VAL;��� ADRB = ADRL;�%� CHP = .NODENAME [DSC$A_POINTER];�$� LEN = .NODENAME [DSC$W_LENGTH];� INCR I FROM 0 TO 3 DO � BEGIN%� IF .LEN LSS 1 THEN EXITLOOP;�/� DOTP = CH$FIND_CH (.LEN, .CHP, %C'.');�,� IF CH$FAIL (.DOTP) THEN XLEN = .LEN+� ELSE XLEN = CH$DIFF (.DOTP, .CHP);�(� LIB$CVT_DTB (.XLEN, .CHP, VAL);!� ADRB [.I] = .VAL<0,8,0>;� � LEN = .LEN - .XLEN - 1;"� CHP = CH$PLUS (.DOTP, 1); � END;�� IF .ALSIZE GTR 0 THEN � BEGIN� ALCNT = 1;�� ALIST [0] = .ADRL;� � END;�� STATUS = SS$_NORMAL;�� END;�� � .STATUS����END; ! NET_GET_ADDRESS� ��%SBTTL 'NET_ADDR_TO_NAME'�8�GLOBAL ROUTINE NET_ADDR_TO_NAME (CTX_A_A, ADR, NAME_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�L�! Given an IP address, returns the corresponding host name (if available).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_ADDR_TO_NAME host, adr, name��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� NAME = .NAME_A : BLOCK [,BYTE];�� � LOCAL�/� HENT : REF BLOCK [HOST$S_HOSTENTDEF,BYTE],�� CP, � STATUS;��2� HENT = GETHOSTBYADDR (ADR, 4, INET$C_AF_INET);���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������,����������������������������������NETLIB_SRC.BCK�����������������H����"[NETLIB]NETLIB_MULTINET_NET.B32;34���������������������������������������������������������������������������������������������P�����(�������������������������*�������������/� IF .HENT EQLA 0 THEN STATUS = SS$_ENDOFFILE�� ELSE � BEGIN�/� CP = (INCR P FROM .HENT [HOST$L_H_NAME] DO�;� IF CH$RCHAR (.P) EQL %CHAR (0) THEN EXITLOOP .P);�C� STR$COPY_R (NAME, %REF (CH$DIFF (.CP, .HENT [HOST$L_H_NAME])),� � .HENT [HOST$L_H_NAME]);� STATUS = SS$_NORMAL;�� END;�� � .STATUS����END; ! NET_ADDR_TO_NAME�� ��%SBTTL 'NET_DEASSIGN'�'�GLOBAL ROUTINE NET_DEASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! This routine deassigns a network channel.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_DEASSIGN ctx��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��%� $DASSGN (CHAN=.CTX [CTX_W_CHAN]);�4� LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX, CTXZONE); � CTX = 0;��� SS$_NORMAL���END; ! NET_DEASSIGN�� ��%SBTTL 'NET_GET_INFO'�P�GLOBAL ROUTINE NET_GET_INFO (CTX_A_A, REMADR_A, REMPRT_A, LCLADR_A, LCLPRT_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�A�! Gets address and port information about a network connection.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�:�! NET_GET_INFO ctx, remadr [,remprt] [,lcladr] [,lclprt]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;�� BIND/� CTX = .CTX_A_A : REF CTXDEF,�8� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [,BYTE];�� � IF ACTUALCOUNT () GTR 3 THEN � BEGIN� � LOCAL-� LCLSIN : BLOCK [SIN$C_LENGTH,BYTE],�� IOSB : IOSBDEF,�� RETLEN,� STATUS;��� RETLEN = SIN$C_LENGTH;�B� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_GETSOCKNAME,*� IOSB=IOSB, P1=LCLSIN, P2=RETLEN);E� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� IF .STATUS THEN � BEGING� IF ACTUALCOUNT () GTR 4 THEN .LCLPRT_A = .LCLSIN [SIN$W_PORT];�G� IF ACTUALCOUNT () GTR 3 THEN .LCLADR_A = .LCLSIN [SIN$L_ADDR];�� END� ELSE RETURN .STATUS;�� END;��B� IF ACTUALCOUNT () GTR 2 THEN .REMPRT_A = .REMSIN [SIN$W_PORT];B� IF ACTUALCOUNT () GTR 1 THEN .REMADR_A = .REMSIN [SIN$L_ADDR];��� SS$_NORMAL���END; ! NET_GET_INFO�� ��%SBTTL 'NET_GET_HOSTNAME'�1�GLOBAL ROUTINE NET_GET_HOSTNAME (HST_A, LEN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�+�! Returns this host's Internet host name.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_GET_HOSTNAME hostname [,len]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BUILTIN ACTUALCOUNT;�� � LOCAL�%� LNMLST : $ITMLST_DECL (ITEMS=1),�*� HSTBUF : VOLATILE VECTOR [1024,BYTE],� HSTLEN : VOLATILE WORD, � STATUS;�� � $ITMLST_INIT (ITMLST=LNMLST,6� (ITMCOD=LNM$_STRING, BUFSIZ=%ALLOCATION (HSTBUF),(� BUFADR=HSTBUF, RETLEN=HSTLEN));��0� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',<� LOGNAM=%IF FOR_TCPWARE %THEN %ASCID'TCPWARE_DOMAINNAME'/� %ELSE %ASCID'MULTINET_HOST_NAME' %FI,�� ITMLST=LNMLST���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������-����������������������������������NETLIB_SRC.BCK�����������������H����"[NETLIB]NETLIB_MULTINET_NET.B32;34���������������������������������������������������������������������������������������������P�����(�������������������������Y�������������);�%IF FOR_TCPWARE %THEN�� IF NOT .STATUS THEN�1� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',�5� LOGNAM=%ASCID'TCPIP_DOMAINNAME', ITMLST=LNMLST);��%FI�� IF .STATUS THEN� � BEGIN�)� STR$COPY_R (.HST_A, HSTLEN, HSTBUF);�3� IF ACTUALCOUNT () GTR 1 THEN .LEN_A = .HSTLEN;�� END;�� � .STATUS����END; ! NET_GET_HOSTNAME�� ��%SBTTL 'NET_CVT_STATUS'�%�GLOBAL ROUTINE NET_CVT_STATUS (RC) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�M�! Converts a MultiNet/TCPware return code to an SS$_ equivalent (from UCX).��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_CVT_STATUS rc�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� SELECTONE .RC OF� SET�>� [INET__ENOMEM,INET__EMSGSIZE,INET__ENOBUFS] : SS$_INSFMEM;8� [INET__ENOTSOCK,INET__EOPNOTSUPP] : SS$_ILLCNTRFUNC;>� [INET__EPROTOTYPE,INET__ENOPROTOOPT,INET__EPROTONOSUPPORT,.� INET__ESOCKTNOSUPPORT,INET__EPFNOSUPPORT,(� INET__EAFNOSUPPORT] : SS$_PROTOCOL;F� [INET__EDESTADDRREQ,INET__ENOTCONN,INET__ESHUTDOWN] : SS$_NOLINKS;5� [INET__EADDRINUSE,INET__EISCONN] : SS$_FILALRACC;� � [INET__EACCES] : SS$_NOPRIV;'� [INET__EADDRNOTAVAIL] : SS$_IVADDR;� � [INET__ENETDOWN] : SS$_SHUT;M� [INET__ENETUNREACH,INET__EHOSTDOWN,INET__EHOSTUNREACH] : SS$_UNREACHABLE;�K� [INET__ENETRESET,INET__ECONNABORTED,INET__ECONNRESET] : SS$_LINKDISCON;�$� [INET__ETIMEDOUT] : SS$_TIMEOUT;&� [INET__ECONNREFUSED] : SS$_REJECT;� [OTHERWISE] : .RC;� TES����END; ! NET_CVT_STATUS�� ��%SBTTL 'NET_SET_TRACE_ROUTINE'/�GLOBAL ROUTINE NET_SET_TRACE_ROUTINE (RTN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! Sets the trace routine to be used instead of LIB$PUT_OUTPUT.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_SET_TRACE_ROUTINE��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���8� IF .RTN_A EQLA 0 THEN TRACE_ROUTINE = LIB$PUT_OUTPUT � ELSE TRACE_ROUTINE = .RTN_A;� SS$_NORMAL���END;� ��%SBTTL 'GETHOSTBYNAME'!�ROUTINE GETHOSTBYNAME (NAME_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�L�! Dynamically maps in appropriate run-time code to perform a gethostbyname �! function.��!��! RETURNS: pointer�!� �! PROTOTYPE:�!M�! GETHOSTBYNAME name�!U1�! name: ASCIZ string, read only, by referenceX�!N�! IMPLICIT INPUTS: None.L�!N�! IMPLICIT OUTPUTS: None.��! �! COMPLETION CODES:��!��! NULL: error occurred.w�! �! SIDE EFFECTS:f�!T �! None.��!-- � OWN � RTNPTR : INITIAL (0),�%IF FOR_TCPWARE %THENRC� IMGNAM : VECTOR [2,LONG] INITIAL (%ASCID'TCPWARE_SOCKLIB_SHR', 3� %ASCID'TCPIP_SOCKLIB'), E� RTNNAM : VECTOR [2,LONG] INITIAL (%ASCID'TCPWARE_GETHOSTBYNAME', 3� %ASCID'GETHOSTBYNAME');s � LITERALl� IMG_COUNT = 2,9� RTN_COUNT = 2;r�%ELSEiH� IMGNAM : VECTOR [1,LONG] INITIAL (%ASCID'MULTINET_SOCKET_LIBRARY'),?� RTNNAM : VECTOR [1,LONG] INITIAL (%ASCID'GETHOSTBYNAME');e�� � LITERAL � IMG_COUNT = 1,s� RTN_COUNT = 1;p�%FI� � LOCALB � STATUS;��� RTNPTR = 0;A#� INCR I FROM 0 TO IMG_COUNT-1 DO � BEGIN $� INCR J FROM 0 TO RTN_COUNT-1 DO � BEGINI� STATUS ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������.����������������������������������NETLIB_SRC.BCK�����������������H����"[NETLIB]NETLIB_MULTINET_NET.B32;34���������������������������������������������������������������������������������������������P�����(�������������������������� �����#�������= FIND_IMAGE_SYMBOL (.IMGNAM [.I], .RTNNAM [.J], RTNPTR);25� IF .STATUS AND .RTNPTR NEQA 0 THEN EXITLOOP; � END;�1� IF .STATUS AND .RTNPTR NEQA 0 THEN EXITLOOP;n� END;��$� IF .RTNPTR EQLA 0 THEN RETURN 0;��� (.RTNPTR)(.NAME_A)���END; ! GETHOSTBYNAME� Y�%SBTTL 'GETHOSTBYADDR'.�ROUTINE GETHOSTBYADDR (ADDR_A, ASIZE, AFAM) = �BEGIN �!++R�! FUNCTIONAL DESCRIPTION: �!LL�! Dynamically maps in appropriate run-time code to perform a gethostbyaddr �! function.B�!,�! RETURNS: pointer�!� �! PROTOTYPE:�!N%�! GETHOSTBYADDR addr, asize, afamH�!N"�! addr: longword, by reference�! asize: longword, by value�! afam: longword, by value�! �! IMPLICIT INPUTS: None. �!X�! IMPLICIT OUTPUTS: None.(�!$�! COMPLETION CODES:S�!C�! NULL: error occurred. �!R�! SIDE EFFECTS:_�! �! None.R�!--T� OWN�� RTNPTR : INITIAL (0),�%IF FOR_TCPWARE %THENRC� IMGNAM : VECTOR [2,LONG] INITIAL (%ASCID'TCPWARE_SOCKLIB_SHR',,3� %ASCID'TCPIP_SOCKLIB'), E� RTNNAM : VECTOR [2,LONG] INITIAL (%ASCID'TCPWARE_GETHOSTBYADDR', 3� %ASCID'GETHOSTBYADDR');U � LITERALG� IMG_COUNT = 2,�� RTN_COUNT = 2;R�%ELSE�H� IMGNAM : VECTOR [1,LONG] INITIAL (%ASCID'MULTINET_SOCKET_LIBRARY'),?� RTNNAM : VECTOR [1,LONG] INITIAL (%ASCID'GETHOSTBYADDR'); �� � LITERAL � IMG_COUNT = 1,_� RTN_COUNT = 1; �%FIC�� � LOCALo � STATUS;��� RTNPTR = 0;e#� INCR I FROM 0 TO IMG_COUNT-1 DO � BEGIN $� INCR J FROM 0 TO RTN_COUNT-1 DO � BEGINI� STATUS = FIND_IMAGE_SYMBOL (.IMGNAM [.I], .RTNNAM [.J], RTNPTR);F5� IF .STATUS AND .RTNPTR NEQA 0 THEN EXITLOOP;� � END; 1� IF .STATUS AND .RTNPTR NEQA 0 THEN EXITLOOP;�� END;��$� IF .RTNPTR EQLA 0 THEN RETURN 0;��%� (.RTNPTR)(.ADDR_A, .ASIZE, .AFAM)%���END; ! GETHOSTBYADDR� �%SBTTL 'FIND_IMAGE_SYMBOL';�ROUTINE FIND_IMAGE_SYMBOL (IMGNAM_A, SYMNAM_A, SYMVAL_A) = �BEGINE�!++,�! FUNCTIONAL DESCRIPTION:L�!CC�! Wrapper routine for LIB$FIND_IMAGE_SYMBOL. Errors are returned��! rather than signaled.T�! B�! RETURNS: cond_value, longword (unsigned), write only, by value�!A �! PROTOTYPE:�!�-�! FIND_IMAGE_SYMBOL imgnam, symnam, symvalT�!C�! IMPLICIT INPUTS: None.S�!E�! IMPLICIT OUTPUTS: None.I�!��! COMPLETION CODES:[�!_2�! SS$_NORMAL: normal successful completion.�!L�! SIDE EFFECTS: �!$ �! None.B�!--S � ENABLE� LIB$SIG_TO_RET;��;� LIB$FIND_IMAGE_SYMBOL (.IMGNAM_A, .SYMNAM_A, .SYMVAL_A)N���END; ! FIND_IMAGE_SYMBOL���END �ELUDOMATUS THEN LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX, CTXZONE);�� � .STATUS����END; ! NET_ASSIGN�� ��%SBTTL 'NET_BIND'�J�GLOBAL ROUTINE NET_BIND (CTX_A_A, PROTOCOL, PORT, XTHREADS, NOT_PASSIVE) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine creates and binds a local socket for the specified� �! protocol.��!�A�! If the port number is specified, the connection is assumed to�F�! be passive and a listener channel is establish����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������/����������������������������������NETLIB_SRC.BCK�����������������M����"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������5��������������"�*�[NETLIB]NETLIB_MULTINET_TCP.B32;27�+��,�M���.�<����/� �@� �4�Q���<���4�v��������������������-�����0���1����2���3������K��P���W���O�=����5���6�F؀2��7�&@2��8�eh��9����������G� �@��H��J����������������� �������������%TITLE 'NETLIB_MULTINET_TCP'+�MODULE NETLIB_MULTINET_TCP (IDENT='V1.3-1',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�>�! ABSTRACT: TCP NETLIB routines for MultiNet and TCPware.�!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�2�! COPYRIGHT 1992 MATTHEW D. MADISON."�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 05-FEB-1991��!��! MODIFICATION HISTORY:��!�0�! 05-FEB-1991 V1.0 Madison Initial coding.=�! 19-MAR-1991 V1.1 Madison Memory handling refinements.�7�! 24-APR-1991 V1.1-1 Madison Cancel those timers!�E�! 20-APR-1991 V1.2 Madison User-specified timeouts on receives.�?�! 10-FEB-1992 V1.2-1 Madison ACCEPT structure is special.�:�! 11-FEB-1992 V1.3 Madison Merge in TCPware support.C�! 05-NOV-1992 V1.3-1 Madison Fix potential timer AST problem.��!--���"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1�����������������������������������������������������������������������������������������������������������H������������������������9�|�����t������:UCX$INETDEF';� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';$� LIBRARY 'MULTINET_TCPWARE_DEFS';��� FORWARD ROUTINE�� TCP_CONNECT,�� TCP_CONNECT_ADDR,� TCP_ACCEPT,� TCP_DISCONNECT,� TCP_SEND,� TCP_SND_AST,�� TCP_RECEIVE,�� TCP_RAW_RCV_AST,�� TCP_FREE_RCV : NOVALUE,� TCP_GET_LINE,� TCP_RCV_AST,�� TCP_TMO_AST;���� EXTERNAL ROUTINE� NET_GET_ADDRESS,�� NET_CVT_STATUS,>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,E� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE, LIB$CREATE_VM_ZONE);���� OWN�� RCVZONE : INITIAL (0),�� SNDZONE : INITIAL (0);�� ��%SBTTL 'TCP_CONNECT'8�GLOBAL ROUTINE TCP_CONNECT (CTX_A_A, NODENAME_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine establishes a connection to the specified host and�B�! port. The net context must already be assigned and bound to a�! TCP socket.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�#�! TCP_CONNECT ctx, nodename, port��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF,<� NODENAME = .NODENAME_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�#� ADRLST : VECTOR [32,LONG],� � ADRCNT, � STATUS;��A� STATUS = NET_GET_ADDRESS (CTX, NODENAME, 32, ADRLST, ADRCNT);�'� IF NOT .STATUS THEN RETURN .STATUS;�/� IF .ADRCNT EQL 0 THEN RETURN SS$_ENDOFFILE;�!� INCR I FROM 0 TO .ADRCNT-1 DO� � BEGIN�9� STATUS = TCP_CONNECT_ADDR (CTX, ADRLST [.I], .PORT);�� IF .STATUS THEN EXITLOOP;� END;�� � .STATUS����END; ! TCP_CONNECT� ��%SBTTL 'TCP_CONNECT_ADDR'�<�GLOBAL ROUTINE TCP_CONNECT_ADDR (CTX_A_A, ADDRESS_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This routine establishes a connection to the specified add��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0����������������������������������NETLIB_SRC.BCK�����������������M����"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<��������������������������������������ress andB�! port. The net context must already be assigned and bound to a�! TCP socket.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�'�! TCP_CONNECT_ADDR ctx, address, port��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF,A� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [SIN$C_LENGTH,BYTE],�� ADDRESS = .ADDRESS_A,.� NPORT = PORT : VECTOR [4,BYTE];�� � LOCAL�� IOSB : IOSBDEF, � STATUS;��*� REMSIN [SIN$W_FAMILY] = UCX$C_AF_INET;6� REMSIN [SIN$W_PORT] = .NPORT [0] ^ 8 + .NPORT [1];#� REMSIN [SIN$L_ADDR] = .ADDRESS;�9� CH$FILL (%CHAR (0), SIN$S_ZERO, REMSIN [SIN$T_ZERO]);�=� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_CONNECT,�1� IOSB=IOSB, P1=REMSIN, P2=SIN$C_LENGTH);�D� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� � .STATUS����END; ! TCP_CONNECT_ADDR�� ��%SBTTL 'TCP_ACCEPT'�G�GLOBAL ROUTINE TCP_ACCEPT (LSNR_A_A, CTX_A_A, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�=�! This routine accepts an incoming connection. It will not�:�! complete until a connection comes in for it to accept.=�! This routine should only be used by servers with a socket��! bound to a particular port.��!�D�! NOTE: This call will be ASYNCHRONOUS if IOSB, ASTADR, and ASTPRM�! are specified!�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! TCP_ACCEPT lsnr, ctx [,iosb ,astadr ,astprm]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND)� LSNR = .LSNR_A_A : REF CTXDEF,�)� CTX = .CTX_A_A : REF CTXDEF,�=� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [SIN$C_LENGTH,BYTE];��� � LOCAL� � STATUS;��)� CTX [CTX_L_REMSINLEN] = SIN$C_LENGTH;�,� REMSIN [SIN$W_FAMILY] = UCX$C_AF_UNSPEC;� REMSIN [SIN$W_PORT] = 0;,� REMSIN [SIN$L_ADDR] = INET$C_INADDR_ANY;�� � IF ACTUALCOUNT () GTR 2 THEN<� STATUS = $QIO (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_ACCEPT,6� IOSB=.IOSB_A, ASTADR=.ASTADR, ASTPRM=.ASTPRM,I� P1=CTX [CTX_X_ASTRUC], P2=SIN$C_LENGTH+4, P3=.LSNR [CTX_W_CHAN])�� ELSE � BEGIN�,� BIND IOSB = CTX [CTX_Q_IOSB] : IOSBDEF;=� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_ACCEPT,�6� IOSB=CTX [CTX_Q_IOSB], P1=CTX [CTX_X_ASTRUC],3� P2=SIN$C_LENGTH+4, P3=.LSNR [CTX_W_CHAN]);�E� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� END;�� � .STATUS����END; ! TCP_ACCEPT�� ��%SBTTL 'TCP_DISCONNECT'�)�GLOBAL ROUTINE TCP_DISCONNECT (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Closes a connection.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_DISCONNECT�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL�� IOSB : IOSBDEF, � STATUS;��J� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SHUTDOWN, IOSB=IOSB);D� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IO���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������1����������������������������������NETLIB_SRC.BCK�����������������M����"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������fu�������������SB_W_STATUS]);�� � .STATUS����END; ! TCP_DISCONNECT�� ��%SBTTL 'TCP_SEND'�M�GLOBAL ROUTINE TCP_SEND (CTX_A_A, SNDSTR_A, XFLAGS, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! This routine sends a string to the remote system. The string isH�! automatically terminated with a cr/lf sequence, and the EOL ("push");�! bit is set based on the value of the PUSH bit of FLAGS.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�9�! TCP_SEND ctx, cmdstr [,flags] [,iosb, astadr, astprm]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND#� CTX = .CTX_A_A : REF CTXDEF,�3� SNDSTR = .SNDSTR_A : BLOCK [DSC$K_S_BLN,BYTE];��� � LOCAL�� FLAGS : BLOCK [4,BYTE],� IOSB : IOSBDEF,� SND : REF SNDDEF,�%� STR : BLOCK [DSC$K_S_BLN,BYTE],� � ASTSTAT,� � STATUS;��!� ASTSTAT = $SETAST (ENBFLG=0);�� IF .SNDZONE EQLA 0 THEN� � BEGIN�A� STATUS = LIB$CREATE_VM_ZONE (SNDZONE, %REF (LIB$K_VM_FIXED),�:� %REF (SND_S_SNDDEF), %REF (LIB$M_VM_EXTEND_AREA),&� %REF (4), %REF (4), %REF (8),2� %REF (8), 0, 0, %ASCID'NETLIB_SND_ZONE');8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);(� IF NOT .STATUS THEN RETURN .STATUS;� END�� ELSE8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);��;� IF ACTUALCOUNT () GTR 2 THEN FLAGS [0,0,32,0] = .XFLAGS�� ELSE FLAGS [0,0,32,0] = 0;�� � IF ACTUALCOUNT () LSS 4 THEN � BEGIN�%� IF NOT .FLAGS [NET_V_NOTRM] THEN� � BEGIN� $INIT_DYNDESC (STR);�K� STR$CONCAT (STR, SNDSTR, %ASCID %STRING (%CHAR (13), %CHAR (10)));� � END;�F� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SEND, IOSB=IOSB,B� P1=(IF NOT .FLAGS [NET_V_NOTRM] THEN .STR [DSC$A_POINTER],� ELSE .SNDSTR [DSC$A_POINTER]),A� P2=(IF NOT .FLAGS [NET_V_NOTRM] THEN .STR [DSC$W_LENGTH]�,� ELSE .SNDSTR [DSC$W_LENGTH]));9� IF NOT .FLAGS [NET_V_NOTRM] THEN STR$FREE1_DX (STR);�E� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� END�� ELSE � BEGIN�4� LIB$GET_VM (%REF (SND_S_SNDDEF), SND, SNDZONE);� SND [SND_L_CTX] = .CTX;"� SND [SND_L_ASTADR] = .ASTADR;"� SND [SND_L_ASTPRM] = .ASTPRM; � BEGIN7� BIND STR = SND [SND_Q_SNDBUF] : BLOCK [,BYTE];�� $INIT_DYNDESC (STR);�?� IF .FLAGS [NET_V_NOTRM] THEN STR$COPY_DX (STR, SNDSTR)�&� ELSE STR$CONCAT (STR, SNDSTR,3� %ASCID %STRING (%CHAR (13), %CHAR (10)));�>� STATUS = $QIO (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SEND,7� IOSB=.IOSB_A, ASTADR=TCP_SND_AST, ASTPRM=.SND,�:� P1=.STR [DSC$A_POINTER], P2=.STR [DSC$W_LENGTH]); � END;�� IF NOT .STATUS THEN9� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND, SNDZONE);�� END;�� � .STATUS����END; ! TCP_SEND�� ��%SBTTL 'TCP_SND_AST'�ROUTINE TCP_SND_AST (SND_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! AST routine triggered on send completion.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_SND_AST snd�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND� SND = .SND_A : SNDDEF;��� � LOCAL�� A���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������2����������������������������������NETLIB_SRC.BCK�����������������M����"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������Ÿ�������������STADR, ASTPRM;��&� STR$FREE1_DX (SND [SND_Q_SNDBUF]);!� ASTADR = .SND [SND_L_ASTADR];�!� ASTPRM = .SND [SND_L_ASTPRM];�4� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND, SNDZONE);.� IF .ASTADR NEQA 0 THEN (.ASTADR) (.ASTPRM)� ELSE SS$_NORMAL����END; ! TCP_SND_AST� ��%SBTTL 'TCP_RECEIVE'O�GLOBAL ROUTINE TCP_RECEIVE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Raw TCP receive routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_RECEIVE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�� RCV : REF RCVDEF,� � ASTSTAT,� � STATUS;��!� ASTSTAT = $SETAST (ENBFLG=0);�� IF .RCVZONE EQLA 0 THEN� � BEGIN�A� STATUS = LIB$CREATE_VM_ZONE (RCVZONE, %REF (LIB$K_VM_FIXED),�:� %REF (RCV_S_RCVDEF), %REF (LIB$M_VM_EXTEND_AREA),'� %REF (16), %REF (4), %REF (8),�2� %REF (8), 0, 0, %ASCID'NETLIB_RCV_ZONE');8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);(� IF NOT .STATUS THEN RETURN .STATUS;� END�� ELSE8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);��<� STATUS = LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);'� IF NOT .STATUS THEN RETURN .STATUS;�� RCV [RCV_L_CTX] = .CTX;� � IF ACTUALCOUNT () GTR 2 THEN#� RCV [RCV_L_USRIOSB] = .IOSB_A;� � IF ACTUALCOUNT () GTR 3 THEN � BEGIN�"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� END�� ELSEG� RCV [RCV_L_USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;���6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RCV_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);F� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_RECEIVE, IOSB=RCV [RCV_Q_IOSB],E� ASTADR=TCP_RAW_RCV_AST, ASTPRM=.RCV, P1=.RCVSTR [DSC$A_POINTER],� � P2=.RCVSTR [DSC$W_LENGTH]);� IF NOT .STATUS THEN� � BEGIN�� $CANTIM (REQIDT=.RCV);�5� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);�� END�� ELSE!� IF ACTUALCOUNT () LSS 4 THEN� � BEGIN0� BIND IOSB = RCV [RCV_Q_IOSB] : IOSBDEF;1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);�@� IF ACTUALCOUNT () GTR 2 THEN CH$MOVE (8, IOSB, .IOSB_A)N� ELSE IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);9� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);� � END;��� � .STATUS����END; ! TCP_RECEIVE� ��%SBTTL 'TCP_RAW_RCV_AST',�ROUTINE TCP_RAW_RCV_AST (RCV : REF RCVDEF) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�>�! This AST routine is invoked when a network read completes.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_RAW_RCV_AST buf��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND(� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,�/� UIOSB = RCV [RCV_L_USRIOSB] : REF IOSBDEF;��� � LOCAL����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������3����������������������������������NETLIB_SRC.BCK�����������������M����"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������_�������������� ASTADR, ASTPRM;��� RCV [RCV_L_TRIGGERED] = 1;� $CANTIM (REQIDT=.RCV);Q� IF NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]) AND .IOSB [IOSB_W_COUNT] EQL 0 THEN�+� IOSB [IOSB_W_STATUS] = SS$_LINKDISCON;�B� IF .UIOSB NEQA 0 THEN CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);!� ASTADR = .RCV [RCV_L_ASTADR];�!� ASTPRM = .RCV [RCV_L_ASTPRM];�/� $DCLAST (ASTADR=TCP_FREE_RCV, ASTPRM=.RCV);���.� IF .ASTADR NEQA 0 THEN (.ASTADR) (.ASTPRM)� ELSE SS$_NORMAL����END; ! TCP_RAW_RCV_AST� ��%SBTTL 'TCP_FREE_RCV'�0�GLOBAL ROUTINE TCP_FREE_RCV (RCV_A) : NOVALUE = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Frees a RCV buffer. �!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! x��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���6� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV_A, RCVZONE);���END;� ��%SBTTL 'TCP_GET_LINE'�P�GLOBAL ROUTINE TCP_GET_LINE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! This routine forms one "line" out of the input received overK�! the net from the server. A "line" is a string of characters terminated�G�! with a cr/lf sequence. The routine will wait until enough input is��! received to form a "line".�!�I�! Note that I cheat a bit and assume that CR ends a record. This makes�K�! life a little easier since I don't have to wait around for another data�L�! block to show up if the CR occurs as the last character of a data block,F�! just to verify that there is an LF at the front of the next block.I�! IGNORE_LF_FRONT gets set instead, so on the next call I can strip the�I�! first character of the front of the next block (assuming it's an LF).��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_GET_LINE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�'� INQ = CTX [CTX_Q_BUFQ] : QUEDEF,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�%� SDSC : BLOCK [DSC$K_S_BLN,BYTE],�� RCV : REF RCVDEF,� � LEN,� � EOPTR,� � LFPOS,L � STATUS, � ASTSTAT,I� FOUND_CRLF;��#� STR$COPY_DX (RCVSTR, %ASCID'');X��'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;I'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;T��� FOUND_CRLF = 0; 0� WHILE NOT REMQUE (.INQ [QUE_L_HEAD], RCV) DO � BEGINE � BINDN+� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF, +� RCNT = IOSB [IOSB_W_COUNT] : WORD; A� EOPTR = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (13));9A� LFPOS = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (10)); ��,� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOS&� ELSE IF NOT CH$FAIL (.LFPOS) THEN3� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;���� IF CH$FAIL (.EOPTR) THENU � BEGIN5� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];nL� SDSC [DSC$W_LENGTH] = MINU (.RCNT, STR_MAX-.RCVSTR [DSC$W_LENGTH]);#� STR$APPEND (RCVSTR, SDSC);39� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE); � END � ELSEY � BEGIN4� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];5����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������4����������������������������������NETLIB_SRC.BCK�����������������M����"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<������������������������� ������#������� LEN = CH$DIFF (.EOPTR, .RCV [RCV_L_BUFPTR]);EK� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.RCVSTR [DSC$W_LENGTH]);T#� STR$APPEND (RCVSTR, SDSC);S1� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THENT� BEGIN"� IF .LEN GEQ .RCNT-2 THEN� BEGIN @� IF .LEN EQL .RCNT-1 THEN CTX [CTX_V_IGNORELF] = 1;>� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE); � ENDE� ELSE� BEGINR� LOCAL DELTA;<� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10)#� THEN 2 ELSE 1);C<� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, .DELTA);+� RCNT = .RCNT - .LEN - .DELTA;O!� INSQUE (.RCV, INQ);(� END; � END � ELSE � BEGIN"� IF .LEN GEQ .RCNT-1 THEN=� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE)n� ELSE� BEGINe7� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, 1);_&� RCNT = .RCNT - .LEN - 1;!� INSQUE (.RCV, INQ); � END; � END;�� FOUND_CRLF = 1;� EXITLOOP; � END; � END; ! WHILE NOT REMQUE��� IF .FOUND_CRLF THEN � BEGINc!� IF ACTUALCOUNT () GTR 2 THENC � BEGIN� IF .IOSB_A NEQA 0 THENC� BEGIN(� BIND IOSB = .IOSB_A : IOSBDEF;7� IOSB [IOSB_W_COUNT] = .RCVSTR [DSC$W_LENGTH]; ,� IOSB [IOSB_W_STATUS] = SS$_NORMAL; � END;;� IF .ASTADR NEQA 0 THEN(:� RETURN $DCLAST (ASTADR=.ASTADR, ASTPRM=.ASTPRM); � END;T� RETURN SS$_NORMAL;L� END;� $!� ASTSTAT = $SETAST (ENBFLG=0);.� IF .RCVZONE EQLA 0 THEN � BEGINCA� STATUS = LIB$CREATE_VM_ZONE (RCVZONE, %REF (LIB$K_VM_FIXED),I:� %REF (RCV_S_RCVDEF), %REF (LIB$M_VM_EXTEND_AREA),'� %REF (16), %REF (4), %REF (8),E2� %REF (8), 0, 0, %ASCID'NETLIB_RCV_ZONE');8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);(� IF NOT .STATUS THEN RETURN .STATUS;� ENDa� ELSE8� IF .ASTSTAT EQL SS$_WASSET THEN $SETAST (ENBFLG=1);��<� STATUS = LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);'� IF NOT .STATUS THEN RETURN .STATUS;T� RCV [RCV_L_TRIGGERED] = 0;)� RCV [RCV_L_BUFPTR] = RCV [RCV_T_BUF]; � RCV [RCV_L_CTX] = .CTX;S � RCV [RCV_L_STRPTR] = RCVSTR; � IF ACTUALCOUNT () GTR 2 THEN � BEGINc#� RCV [RCV_L_USRIOSB] = .IOSB_A;�"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� ENDM� ELSEG� RCV [RCV_L_USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;R��6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RCV_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);F� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_RECEIVE, IOSB=RCV [RCV_Q_IOSB],H� ASTADR=TCP_RCV_AST, ASTPRM=.RCV, P1=RCV [RCV_T_BUF], P2=RCV_S_BUF);� IF NOT .STATUS THENN � BEGINL� $CANTIM (REQIDT=.RCV); 5� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE); � END�� ELSE'� IF .RCV [RCV_L_ASTADR] EQLA 0 THEN�1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);B�� � .STATUSP���END; ! TCP_GET_LINE � C�%SBTTL 'TCP_RCV_AST'(�ROUTINE TCP_RCV_AST (RCV : REF RCVDEF) =�BEGINo�!++t�! FUNCTIONAL DESCRIPTION:t�!a>�! This AST routine is invoked when a network read completes.@�! It queues up the buffer block for processing by the mainline@�! thread, which will also handle I/O errors. Then a new block���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������5����������������������������������NETLIB_SRC.BCK�����������������M����"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������������*�������<�! is allocated and, barring any errors, a read is reQIO'd.�!aB�! RETURNS: cond_value, longword (unsigned), write only, by value�! �! PROTOTYPE:�!r�! TCP_RCV_AST buf,�!p�! IMPLICIT INPUTS: None.:�!o�! IMPLICIT OUTPUTS: None.S�!o�! COMPLETION CODES:N�!D2�! SS$_NORMAL: normal successful completion.�!t�! SIDE EFFECTS:E�!C �! None. �!--e��� BIND(� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,0� STR = .RCV [RCV_L_STRPTR] : BLOCK [,BYTE],.� BUF = RCV [RCV_T_BUF] : BLOCK [,BYTE],4� BUFPTR = RCV [RCV_L_BUFPTR]: REF BLOCK [,BYTE],+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,L%� CHN = CTX [CTX_W_CHAN] : WORD,N/� UIOSB = RCV [RCV_L_USRIOSB] : REF IOSBDEF;I�� � LOCAL; � LEN,N � STATUS, � EOPTR,D � LFPOS, � ASTADR, ASTPRM,%� SDSC : BLOCK [DSC$K_S_BLN,BYTE];C��� RCV [RCV_L_TRIGGERED] = 1;� $CANTIM (REQIDT=.RCV);!� ASTADR = .RCV [RCV_L_ASTADR];=!� ASTPRM = .RCV [RCV_L_ASTPRM];+Q� IF NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]) AND .IOSB [IOSB_W_COUNT] EQL 0 THEN +� IOSB [IOSB_W_STATUS] = SS$_LINKDISCON;T6� IF NOT NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]) THEN � BEGINX� IF .UIOSB NEQA 0 THEN � BEGIN1� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);N4� UIOSB [IOSB_W_COUNT] = .STR [DSC$W_LENGTH]; � END; 5� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);N� IF .ASTADR NEQA 0 THENS#� RETURN (.ASTADR) (.ASTPRM) � ELSED� RETURN SS$_NORMAL;a� END;��!� IF .CTX [CTX_V_IGNORELF] THENw � BEGINe� CTX [CTX_V_IGNORELF] = 0;.� IF CH$RCHAR (.BUFPTR) EQL %CHAR (10) THEN � BEGIN'� BUFPTR = CH$PLUS (.BUFPTR, 1);�8� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - 1; � END;m� END;��'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;FC� EOPTR = CH$FIND_CH (.IOSB [IOSB_W_COUNT], .BUFPTR, %CHAR (13));TC� LFPOS = CH$FIND_CH (.IOSB [IOSB_W_COUNT], .BUFPTR, %CHAR (10)); ��+� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOSB%� ELSE IF NOT CH$FAIL (.LFPOS) THENN/� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;B��� IF CH$FAIL (.EOPTR) THEN � BEGINA6� SDSC [DSC$W_LENGTH] = MINU (.IOSB [IOSB_W_COUNT],5� STR_MAX-.STR [DSC$W_LENGTH]);o$� SDSC [DSC$A_POINTER] = .BUFPTR;� STR$APPEND (STR, SDSC);� BUFPTR = RCV [RCV_T_BUF];� RCV [RCV_L_TRIGGERED] = 0; G� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);rG� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_RECEIVE, IOSB=RCV [RCV_Q_IOSB],x5� ASTADR=TCP_RCV_AST, ASTPRM=.RCV, P1=.BUFPTR,C� P2=RCV_S_BUF); � IF NOT .STATUS THEN � BEGIN� $CANTIM (REQIDT=.RCV); � IF .UIOSB NEQA 0 THEN� BEGIN2� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);5� UIOSB [IOSB_W_COUNT] = .STR [DSC$W_LENGTH];T*� UIOSB [IOSB_W_STATUS] = .STATUS; � END;�9� LIB$FREE_VM (%REF (RCV_S_RCVDEF), RCV, RCVZONE);O� IF .ASTADR NEQA 0 THEN�$� RETURN (.ASTADR) (.ASTPRM) � ELSE�� RETURN SS$_NORMAL; � END;E� RETURN SS$_NORMAL� END;��$� LEN = CH$DIFF (.EOPTR, .BUFPTR);C� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.STR [DSC$W_LENGTH]);S#� SDSC [DSC$A_POINTER] = .BUFPTR;�� STR$APPEND (STR, SDSC);%,� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THEN � BEGIN',� IF .LEN GEQ .IOSB [IOSB_W_COUNT]-2 THEN � BEGIN0� IF .LEN EQL .IOSB [IOSB_W_COUNT]-1 THEN#� CTX [CTX_V_IGNORELF] = 1;S4� $DCLAST (ASTADR=TCP_FREE_���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������6����������������������������������NETLIB_SRC.BCK�����������������M����"[NETLIB]NETLIB_MULTINET_TCP.B32;27���������������������������������������������������������������������������������������������Q�����<�������������������������y������1�������RCV, ASTPRM=.RCV);� END � ELSES � BEGIN� LOCAL DELTA;AG� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10) THEN 2 ELSE 1);I+� BUFPTR = CH$PLUS (.EOPTR, .DELTA);�D� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - .LEN - .DELTA;)� INSQUE (.RCV, CTX [CTX_Q_BUFQ]); � END; � END � ELSE � BEGIN_,� IF .LEN GEQ .IOSB [IOSB_W_COUNT]-1 THEN3� $DCLAST (ASTADR=TCP_FREE_RCV, ASTPRM=.RCV)E � ELSE � BEGIN&� BUFPTR = CH$PLUS (.EOPTR, 1);?� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - .LEN - 1; )� INSQUE (.RCV, CTX [CTX_Q_BUFQ]);O � END;E� END;��� IF .UIOSB NEQA 0 THEN � BEGINU(� UIOSB [IOSB_W_STATUS] = SS$_NORMAL;0� UIOSB [IOSB_W_COUNT] = .STR [DSC$W_LENGTH];� END;� IF .ASTADR NEQA 0 THEN� (.ASTADR) (.ASTPRM)� ELSE� SS$_NORMAL[���END; ! TCP_RCV_AST� ��%SBTTL 'TCP_TMO_AST')�ROUTINE TCP_TMO_AST (RCV : REF RCVDEF) = �BEGINS�!++S�! FUNCTIONAL DESCRIPTION: �! 7�! Delivered when a receive takes longer than EXPTIME.]@�! Just cancels the I/O, to trigger the I/O completion AST with�! status SS$_CANCEL.�!TB�! RETURNS: cond_value, longword (unsigned), write only, by value�!X �! PROTOTYPE:�!$�! TCP_TMO_AST rcv�!S�! IMPLICIT INPUTS: None.T�!=�! IMPLICIT OUTPUTS: None.S�!_�! COMPLETION CODES:C�!L2�! SS$_NORMAL: normal successful completion.�! �! SIDE EFFECTS:F�!N �! None.,�!-- � BIND%� CTX = .RCV [RCV_L_CTX] : CTXDEF;P��G� IF NOT .RCV [RCV_L_TRIGGERED] THEN $CANCEL (CHAN=.CTX [CTX_W_CHAN])+� ELSE SS$_NORMALR���END; ! TCP_TMO_AST���END �ELUDOMon send completion.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_SND_AST snd�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND� SND = .SND_A : SNDDEF;��� � LOCAL�� A��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������7����������������������������������NETLIB_SRC.BCK�����������������P����"[NETLIB]NETLIB_MULTINET_UDP.B32;13���������������������������������������������������������������������������������������������O������������������������������_��������������"�*�[NETLIB]NETLIB_MULTINET_UDP.B32;13�+��,�P���.�����/� �@� �4�O������ �(�������������������-�����0���1����2���3������K��P���W���O�����5���6�xr^��7�}7^��8�&eh��9����������G� �@��H��J����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������:�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1;80��������������������������������������������������������������������������������������������������������H�������������������������|��������������������������� �������������%TITLE 'NETLIB_MULTINET_UDP')�MODULE NETLIB_MULTINET_UDP (IDENT='V1.3',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�>�! ABSTRACT: UDP NETLIB routines for MultiNet and TCPware.�!��! MODULE DESCRIPTION:��!�D�! Contains UDP send and receive routines for MultiNet and TCPware.�!��! AUTHOR: M. Madison�F�! COPYRIGHT 1991, 1992 RENSSELAER POLYTECHNIC INSTITUTE."�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 05-FEB-1991��!��! MODIFICATION HISTORY:��!�0�! 05-FEB-1991 V1.0 Madison Initial coding.G�! 08-FEB-1991 V1.1 Madison Add source info return on UDP_RECEIVE.�;�! 22-NOV-1991 V1.2 Madison Add rcvtmo to UDP_RECEIVE.��!--�"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';$� LIBRARY 'MULTINET_TCPWARE_DEFS';� LIBRARY 'NETLIB';���� EXTERNAL ROUTINE� NET_CVT_STATUS;��� FORWARD ROUTINE�� UDP_SEND,� UDP_RECEIVE,�� TIMER_AST;�� ��%SBTTL 'UDP_SEND'�L�GLOBAL ROUTINE UDP_SEND (CTX_A_A, ADR, PORT : WORD, BUFPTR, BUFLEN : WORD) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Sends out a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! UDP_SEND chan, address, port, bufptr, buflen��!�9�! chan: channel, word (unsigned), read only, by value�G�! address: longword_unsigned, longword (unsigned), read only, by value�?�! port: word_unsigned, word (unsigned), read only, by value�E�! bufptr: varying_arg, longword (unsigned), read only, by reference�?�! buflen: word_unsigned, word (unsigned), read only, by value��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND#� CTX = .CTX_A_A : REF CTXDEF,�$� CHAN = CTX [CTX_W_CHAN] : WORD,(� PORT2 = PORT : VECTOR [2,BYTE];�� � LOCAL�)� REMSIN : BLOCK [SIN$C_LENGTH, BYTE],�� IOSB : IOSBDEF, � STATUS;��*� REMSIN [SIN$W_FAMILY] = UCX$C_AF_INET;8� REMSIN [SIN$W_PORT] = .PORT2 [0] * 256 + .PORT2 [1];� REMSIN [SIN$L_ADDR] = .ADR;�9� CH$FILL (%CHAR (0), SIN$S_ZERO, REMSIN [SIN$T_ZERO]);�9� STATUS = $QIOW (CHAN=.CHAN, FUNC=IO$_SEND, IOSB=IOSB,�9� P1=.BUFPTR, P2=.BUFLEN, P4=REMSIN, P5=SIN$C_LENGTH);�D� IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�� � .STATUS����END; ! UDP_SEND�� ��%SBTTL 'UDP_RECEIVE'E�GLOBAL ROUTINE UDP_RECEIVE (CTX_A_A, BUFPTR, BUFSIZ : WORD, BUFLEN_A,�.� SRCADR_A, SRCPRT_A, RCVTMO_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Reads a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�K�! UDP_RECEIVE chan, bufptr, bufsiz, buflen [,srcadr] [,srcprt] [,rcvtmo]��!�9�! chan: channel, word (unsigned), read only, by value�F�! bufptr: varying_arg, longword (unsigned), write only, by reference?�! bufsiz: ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������8����������������������������������NETLIB_SRC.BCK�����������������P����"[NETLIB]NETLIB_MULTINET_UDP.B32;13���������������������������������������������������������������������������������������������O������������������������������2� ������������ word_unsigned, word (unsigned), read only, by value�D�! buflen: word_unsigned, word (unsigned), write only, by referenceL�! srcadr: longword_unsigned, longword (unsigned), write only, by referenceL�! srcprt: longword_unsigned, longword (unsigned), write only, by referenceA�! rcvtmo: date_time, quadword (signed), read only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND$� CTX = .CTX_A_A : REF CTXDEF,$� CHAN = CTX [CTX_W_CHAN] : WORD, � BUFLEN = .BUFLEN_A : WORD;�� � BUILTIN�� ACTUALCOUNT;��� � LOCAL�� RCVTMO : VECTOR [2,LONG],� INFO : VECTOR [3,LONG],,� FRMSTRC : BLOCK [SIN$C_LENGTH+2, BYTE],� IOSB : IOSBDEF,� DSC : VECTOR [3,LONG], � RETLEN, � STATUS;��"� STATUS = ACTUALCOUNT () GTR 6;.� IF .STATUS THEN STATUS = .RCVTMO_A NEQA 0;2� IF .STATUS THEN CH$MOVE (8, .RCVTMO_A, RCVTMO)<� ELSE $BINTIM (TIMBUF=%ASCID'0 00:00:10', TIMADR=RCVTMO);��� INFO [0] = .CHAN;�� INFO [1] = IOSB;� INFO [2] = SS$_NORMAL;;� $SETIMR (DAYTIM=RCVTMO, ASTADR=TIMER_AST, REQIDT=INFO);�=� STATUS = $QIOW (CHAN=.CHAN, FUNC=IO$_READVBLK, IOSB=IOSB,�H� P1=.BUFPTR, P2=.BUFSIZ, P4=FRMSTRC, P5=%ALLOCATION (FRMSTRC));� $CANTIM (REQIDT=INFO);,� IF NOT .INFO [2] THEN STATUS = .INFO [2]I� ELSE IF .STATUS THEN STATUS = NET_CVT_STATUS (.IOSB [IOSB_W_STATUS]);�;� BUFLEN = (IF .STATUS THEN .IOSB [IOSB_W_COUNT] ELSE 0);�� IF .STATUS THEN� � BEGIN�.� LOCAL REMSIN : BLOCK [SIN$C_LENGTH,BYTE];7� CH$MOVE (SIN$C_LENGTH, FRMSTRC [2,0,0,0], REMSIN);�!� IF ACTUALCOUNT () GTR 4 THEN�C� IF .SRCADR_A NEQA 0 THEN .SRCADR_A = .REMSIN [SIN$L_ADDR];�!� IF ACTUALCOUNT () GTR 5 THEN�!� IF .SRCPRT_A NEQA 0 THEN�=� .SRCPRT_A = (.REMSIN [SIN$W_PORT] MOD 256) * 256 + �0� (.REMSIN [SIN$W_PORT] / 256);� END;�� � .STATUS����END; ! UDP_RECEIVE� ��%SBTTL 'TIMER_AST'�ROUTINE TIMER_AST (INFO_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This AST routine is triggered when the net receive timer goes off.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TIMER_AST info��!�O�! info: vector_longword_unsigned, longword (unsigned), modify, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND&� INFO = .INFO_A : VECTOR [3,LONG], � IOSB = .INFO [1] : IOSBDEF;��2� INFO [2] = IOSB [IOSB_W_STATUS] = SS$_TIMEOUT;� $CANCEL (CHAN=.INFO [0]);���� SS$_NORMAL���END; ! TIMER_AST���END��ELUDOM��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������9����������������������������������NETLIB_SRC.BCK�����������������q����[NETLIB]NETLIB_UCX_NET.B32;18��������������������������������������������������������������������������������������������������P������������������������������e���������������*�[NETLIB]NETLIB_UCX_NET.B32;18�+��,�q���.�����/� �@� �4�P�������2��������������������-�����0���1����2���3������K��P���W���O�����5���6�į{Y!��7�\{Y!��8�LDfh��9����������G� �@��H��J������ �������������%TITLE 'NETLIB_UCX_NET'�&�MODULE NETLIB_UCX_NET (IDENT='V1.1-2',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�9�! ABSTRACT: Common network library routines for UCX.��!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 28-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 28-JAN-1991 V1.0 Madison Initial coding.B�! 05-SEP-1991 V1.1 Madison Add NOT_PASSIVE flag on NET_BIND.=�! 04-DEC-1991 V1.1-1 Madison Improve debugging support.�N�! 28-MAY-1992 V1.1-2 Madison Add REUSEADDR option on active connections.�!--���"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';� LIBRARY 'UCX_DEFS';���� FORWARD ROUTINE�� NET_ASSIGN,� NET_DEASSIGN,� NET_BIND,� NET_GET_ADDRESS,�� NET_ADDR_TO_NAME,� NET_GET_INFO,� NET_GET_HOSTNAME,� NET_SET_TRACE_ROUTINE;���� EXTERNAL ROUTINE>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,<� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE, STR$COPY_R,� LIB$PUT_OUTPUT);��� � GLOBAL.� TRACE_ROUTINE : INITIAL (LIB$PUT_OUTPUT);� ��%SBTTL 'NET_ASSIGN'�%�GLOBAL ROUTINE NET_ASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�E�! This routine assigns a network channel for subsequent operations.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_ASSIGN nodename��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��3� STATUS = LIB$GET_VM (%REF (CTX_S_CTXDEF), CTX);�,� CH$FILL (%CHAR (0), CTX_S_CTXDEF, .CTX);'� IF NOT .STATUS THEN RETURN .STATUS;� � BEGIN�+� BIND BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;�2� BUFQ [QUE_L_TAIL] = BUFQ [QUE_L_HEAD] = BUFQ;E� $BINTIM (TIMBUF=%ASCID'0 00:05:00', TIMADR=CTX [CTX_Q_EXPTIME]);�� END;��H� STATUS = $ASSIGN (DEVNAM=%ASCID'UCX$DEVICE', CHAN=CTX [CTX_W_CHAN]);?� IF NOT .STATUS THEN LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);��� � .STATUS����END; ! NET_ASSIGN�� ��%SBTTL 'NET_BIND'�J�GLOBAL ROUTINE NET_BIND (CTX_A_A, PROTOCOL, PORT, XTHREADS, NOT_PASSIVE) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine creates and binds a local socket for the specified� �! protocol.��!�A�! If the port number is specified, the connection is assumed to�F�! be passive and a listener channel is established, with the maximumE�! number of simultaneous incoming connections specified by XTHREADS�F�! (defaults to 4 if not specified). If the NOT_PASSIVE flag is set,D�! the connection is opened as an active channe������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������:����������������������������������NETLIB_SRC.BCK�����������������q����[NETLIB]NETLIB_UCX_NET.B32;18��������������������������������������������������������������������������������������������������P�������������������������������������������l with the specifiedJ�! port as the source, and XTHREADS is ignored. If no PORT is specified,H�! the connection is assumed to be active and a source port is assigned�! at random.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�<�! NET_BIND ctx, protocol [,port] [,threads] [,not_passive]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;��� BUILTIN ACTUALCOUNT;�� � LOCAL�� IOSB : IOSBDEF,� SCHAR : SCHARDEF,5� LCLSIN : VOLATILE BLOCK [SIN$C_LENGTH,BYTE],� � DSC : VECTOR [2,LONG], � THREADS,� � ACTIVE, � STATUS;��<� ACTIVE = (IF ACTUALCOUNT () GTR 4 THEN .NOT_PASSIVE ELSE=� IF ACTUALCOUNT () GTR 2 THEN (.PORT EQL 0) ELSE 1);���� SELECTONE .PROTOCOL OF� SET�� [NET_K_TCP] :� � BEGIN.� SCHAR [SCHAR_W_PROTOCOL] = UCX$C_TCP;0� SCHAR [SCHAR_B_PROTYPE] = UCX$C_STREAM; � END;�� [NET_K_UDP] :� � BEGIN.� SCHAR [SCHAR_W_PROTOCOL] = UCX$C_UDP;/� SCHAR [SCHAR_B_PROTYPE] = UCX$C_DGRAM;� � END;�� TES;��� SCHAR [SCHAR_B_DOMAIN] = 0;�*� LCLSIN [SIN$W_FAMILY] = UCX$C_AF_INET; � IF ACTUALCOUNT () GTR 2 THEN � BEGIN�)� BIND NPORT = PORT : VECTOR [4,BYTE];�7� LCLSIN [SIN$W_PORT] = .NPORT [0] ^ 8 + .NPORT [1];� � IF .ACTIVE THEN THREADS = 0D� ELSE THREADS = (IF ACTUALCOUNT () GTR 3 THEN .XTHREADS ELSE 4);� END�� ELSE � BEGIN�� LCLSIN [SIN$W_PORT] = 0;�� THREADS = 0;�� END;,� LCLSIN [SIN$L_ADDR] = INET$C_INADDR_ANY;� DSC [0] = SIN$C_LENGTH;�� DSC [1] = LCLSIN;�9� CH$FILL (%CHAR (0), SIN$S_ZERO, LCLSIN [SIN$T_ZERO]);�H� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SETMODE, IOSB=IOSB,M� P1=SCHAR, P2=(IF .ACTIVE THEN (UCX$M_REUSEADDR OR %X'FF000000') ELSE 0),�� P3=DSC, P4=.THREADS);3� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];��� � .STATUS����END; ! NET_BIND�� ��%SBTTL 'NET_GET_ADDRESS'M�GLOBAL ROUTINE NET_GET_ADDRESS (CTX_A_A, HOST_A, ALSIZE, ALIST_A, ALCNT_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�D�! Given a host name, returns an array of valid Internet addresses.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�5�! NET_GET_ADDRESS ctx, host, arrsiz, array, retcnt��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� CHN = CTX [CTX_W_CHAN] : WORD,+� NODENAME = .HOST_A : BLOCK [,BYTE],�+� ALIST = .ALIST_A : VECTOR [,LONG],�� ALCNT = .ALCNT_A;�� � LOCAL�� SUBF : SUBFDEF,� IOSB : IOSBDEF,� OUTLEN : WORD,�� DSC1 : VECTOR [2,LONG],� DSC2 : VECTOR [2,LONG],� UCXADR : VOLATILE,� � STATUS;��K� IF STR$FIND_FIRST_NOT_IN_SET (NODENAME, %ASCID'0123456789.') NEQ 0 THEN� � BEGIN�*� LOCAL STR : BLOCK [DSC$K_S_BLN,BYTE];� INIT_DYNDESC (STR); � STR$UPCASE (STR, NODENAME);7� SUBF [SUBF_B_TYPE] = INETACP_FUNC$C_GETHOSTBYNAME;�*� SUBF [SUBF_B_CODE] = INETACP$C_TRANS;� SUBF [SUBF_W_UNUSED] = 0;� DSC1 [0] = SUBF_S_SUBFDEF;�� DSC1 [1] = SUBF;�%� DSC2 [0] = %ALLOCATION (UCXADR);�� DSC2 [1] = UCXADR;�?� STATUS = $QIOW (CHAN=.CHN, ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;����������������������������������NETLIB_SRC.BCK�����������������q����[NETLIB]NETLIB_UCX_NET.B32;18��������������������������������������������������������������������������������������������������P������������������������������\�������������FUNC=IO$_ACPCONTROL, IOSB=IOSB,�.� P1=DSC1, P2=STR, P3=OUTLEN, P4=DSC2);� FREE_STRINGS (STR);(� IF NOT .STATUS THEN RETURN .STATUS;&� IF NOT .IOSB [IOSB_W_STATUS] THEN � BEGINJ� STR$TRANSLATE (STR, NODENAME, %ASCID'abcdefghijklmnopqrstuvwxyz',2� %ASCID'ABCDEFGHIJKLMNOPQRSTUVWXYZ');C� STATUS = $QIOW (CHAN=.CHN, FUNC=IO$_ACPCONTROL, IOSB=IOSB,�/� P1=DSC1, P2=STR, P3=OUTLEN, P4=DSC2);�� FREE_STRINGS (STR);,� IF NOT .STATUS THEN RETURN .STATUS;H� IF NOT .IOSB [IOSB_W_STATUS] THEN RETURN .IOSB [IOSB_W_STATUS]; � END;�� IF .ALSIZE GTR 0 THEN � BEGIN� ALCNT = 1;�� ALIST [0] = .UCXADR;� � END;�� END�� ELSE BEGIN � LOCAL� ADRL : VOLATILE,�$� ADRB : REF VECTOR [4,BYTE],� CHP, DOTP,�� LEN, XLEN, VAL;��� ADRB = ADRL;�%� CHP = .NODENAME [DSC$A_POINTER];�$� LEN = .NODENAME [DSC$W_LENGTH];� INCR I FROM 0 TO 3 DO � BEGIN%� IF .LEN LSS 1 THEN EXITLOOP;�/� DOTP = CH$FIND_CH (.LEN, .CHP, %C'.');�,� IF CH$FAIL (.DOTP) THEN XLEN = .LEN+� ELSE XLEN = CH$DIFF (.DOTP, .CHP);�(� LIB$CVT_DTB (.XLEN, .CHP, VAL);!� ADRB [.I] = .VAL<0,8,0>;� � LEN = .LEN - .XLEN - 1;"� CHP = CH$PLUS (.DOTP, 1); � END;�� IF .ALSIZE GTR 0 THEN � BEGIN� ALCNT = 1;�� ALIST [0] = .ADRL;� � END;�� STATUS = SS$_NORMAL;�� END;�� � .STATUS����END; ! NET_GET_ADDRESS� ��%SBTTL 'NET_ADDR_TO_NAME'�8�GLOBAL ROUTINE NET_ADDR_TO_NAME (CTX_A_A, ADR, NAME_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�L�! Given an IP address, returns the corresponding host name (if available).�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_ADDR_TO_NAME host, adr, name��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND&� CTX = .CTX_A_A : REF CTXDEF,(� NAME = .NAME_A : BLOCK [,BYTE];�� � LOCAL�� SUBF : VOLATILE SUBFDEF,�� IOSB : IOSBDEF,� UCXADR : VOLATILE,�� DSC1 : VECTOR [2,LONG],� DSC2 : VECTOR [2,LONG],� ADRBUF : BLOCK [512,BYTE],�� ADRLEN : WORD,�-� SDSC : BLOCK [DSC$K_S_BLN,BYTE] PRESET (�,� [DSC$B_DTYPE] = DSC$K_DTYPE_T,,� [DSC$B_CLASS] = DSC$K_CLASS_S,4� [DSC$W_LENGTH] = %ALLOCATION (ADRBUF),(� [DSC$A_POINTER] = ADRBUF), � STATUS;��� UCXADR = .ADR;6� SUBF [SUBF_B_TYPE] = INETACP_FUNC$C_GETHOSTBYADDR;)� SUBF [SUBF_B_CODE] = INETACP$C_TRANS;�� SUBF [SUBF_W_UNUSED] = 0;�� DSC1 [0] = SUBF_S_SUBFDEF;� DSC1 [1] = SUBF;$� DSC2 [0] = %ALLOCATION (UCXADR);� DSC2 [1] = UCXADR;K� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_ACPCONTROL, IOSB=IOSB,�/� P1=DSC1, P2=DSC2, P3=ADRLEN, P4=SDSC);�3� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];�� IF .STATUS THEN�'� STR$COPY_R (NAME, ADRLEN, ADRBUF);��� � .STATUS����END; ! NET_ADDR_TO_NAME�� ��%SBTTL 'NET_DEASSIGN'�'�GLOBAL ROUTINE NET_DEASSIGN (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! This routine deassigns a network channel.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_DEASSIGN ctx��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: n���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<����������������������������������NETLIB_SRC.BCK�����������������q����[NETLIB]NETLIB_UCX_NET.B32;18��������������������������������������������������������������������������������������������������P�������������������������������������������ormal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;��%� $DASSGN (CHAN=.CTX [CTX_W_CHAN]);�+� LIB$FREE_VM (%REF (CTX_S_CTXDEF), CTX);� � CTX = 0;��� SS$_NORMAL���END; ! NET_DEASSIGN�� ��%SBTTL 'NET_GET_INFO'�P�GLOBAL ROUTINE NET_GET_INFO (CTX_A_A, REMADR_A, REMPRT_A, LCLADR_A, LCLPRT_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�A�! Gets address and port information about a network connection.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�:�! NET_GET_INFO ctx, remadr [,remprt] [,lcladr] [,lclprt]�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;�� BIND/� CTX = .CTX_A_A : REF CTXDEF,�8� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [,BYTE];�� � IF ACTUALCOUNT () GTR 3 THEN � BEGIN� � LOCAL6� LCLSIN : VOLATILE BLOCK [SIN$C_LENGTH,BYTE],#� DSC : VECTOR [3,LONG],�!� RETLEN : VOLATILE WORD,�� IOSB : IOSBDEF,�� STATUS;��� DSC [0] = SIN$C_LENGTH;� DSC [1] = LCLSIN;� DSC [2] = RETLEN;@� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_SENSEMODE,� IOSB=IOSB, P3=DSC);4� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];� IF .STATUS THEN � BEGING� IF ACTUALCOUNT () GTR 4 THEN .LCLPRT_A = .LCLSIN [SIN$W_PORT];�G� IF ACTUALCOUNT () GTR 3 THEN .LCLADR_A = .LCLSIN [SIN$L_ADDR];�� END� ELSE RETURN .STATUS;�� END;��B� IF ACTUALCOUNT () GTR 2 THEN .REMPRT_A = .REMSIN [SIN$W_PORT];B� IF ACTUALCOUNT () GTR 1 THEN .REMADR_A = .REMSIN [SIN$L_ADDR];��� SS$_NORMAL���END; ! NET_GET_INFO�� ��%SBTTL 'NET_GET_HOSTNAME'�1�GLOBAL ROUTINE NET_GET_HOSTNAME (HST_A, LEN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�+�! Returns this host's Internet host name.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�%�! NET_GET_HOSTNAME hostname [,len]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BUILTIN ACTUALCOUNT;�� � LOCAL�%� LNMLST : $ITMLST_DECL (ITEMS=1),�*� HSTBUF : VOLATILE VECTOR [1024,BYTE],� HSTLEN : VOLATILE WORD, � STATUS;�� � $ITMLST_INIT (ITMLST=LNMLST,6� (ITMCOD=LNM$_STRING, BUFSIZ=%ALLOCATION (HSTBUF),(� BUFADR=HSTBUF, RETLEN=HSTLEN));��0� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',2� LOGNAM=%ASCID'UCX$INET_HOST', ITMLST=LNMLST);� IF .STATUS THEN� � BEGIN�)� STR$COPY_R (.HST_A, HSTLEN, HSTBUF);�3� IF ACTUALCOUNT () GTR 1 THEN .LEN_A = .HSTLEN;�� END;�� � .STATUS����END; ! NET_GET_HOSTNAME�� ��%SBTTL 'NET_SET_TRACE_ROUTINE'/�GLOBAL ROUTINE NET_SET_TRACE_ROUTINE (RTN_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! Sets the trace routine to be used instead of LIB$PUT_OUTPUT.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! NET_SET_TRACE_ROUTINE��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���8� IF .RTN_A EQLA 0 THEN TRACE_ROUTINE = LIB$PUT_OUTPUT � ELSE TRACE_ROUTINE���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������=����������������������������������NETLIB_SRC.BCK�����������������q����[NETLIB]NETLIB_UCX_NET.B32;18��������������������������������������������������������������������������������������������������P������������������������������������������� = .RTN_A;� SS$_NORMAL���END;���END��ELUDOM���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>����������������������������������NETLIB_SRC.BCK�����������������v����[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2������������������������� {���������������*�[NETLIB]NETLIB_UCX_TCP.B32;17�+��,�v���.�2����/� �@� �4�P���2���.�<�������������������-�����0���1����2���3������K��P���W���O�3����5���6���7� )ɦ��8�_fh��9����������G� �@��H��J������ �������������%TITLE 'NETLIB_UCX_TCP'�$�MODULE NETLIB_UCX_TCP (IDENT='V1.1',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�-�! ABSTRACT: TCP NETLIB routines for UCX.��!��! MODULE DESCRIPTION:��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 28-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 28-JAN-1991 V1.0 Madison Initial coding.7�! 24-APR-1991 V1.0-1 Madison Cancel those timers!�E�! 20-JUN-1991 V1.1 Madison User-specified timeouts on receives.��!--���"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';� LIBRARY 'NETLIB';�� LIBRARY 'NETLIBDEF';� LIBRARY 'UCX_DEFS';���� FORWARD ROUTINE�� TCP_CONNECT,�� TCP_CONNECT_ADDR,� TCP_ACCEPT,� TCP_DISCONNECT,� TCP_SEND,� TCP_SND_AST,�� TCP_RECEIVE,�� TCP_RAW_RCV_AST,�� TCP_GET_LINE,� TCP_RCV_AST,�� TCP_TMO_AST;���� EXTERNAL ROUTINE� NET_GET_ADDRESS,�>� G_HAT (LIB$GET_VM, LIB$FREE_VM, STR$CONCAT, STR$FREE1_DX,<� STR$APPEND, STR$COPY_DX, STR$FIND_FIRST_NOT_IN_SET,1� STR$TRANSLATE, LIB$CVT_DTB, STR$UPCASE);���� OWN�� FREEQ : QUEDEF PRESET (#� [QUE_L_HEAD] = FREEQ,�$� [QUE_L_TAIL] = FREEQ);� ��%SBTTL 'TCP_CONNECT'8�GLOBAL ROUTINE TCP_CONNECT (CTX_A_A, NODENAME_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�C�! This routine establishes a connection to the specified host and�B�! port. The net context must already be assigned and bound to a�! TCP socket.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�#�! TCP_CONNECT ctx, nodename, port��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF,<� NODENAME = .NODENAME_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�#� ADRLST : VECTOR [32,LONG],� � ADRCNT, � STATUS;��A� STATUS = NET_GET_ADDRESS (CTX, NODENAME, 32, ADRLST, ADRCNT);�'� IF NOT .STATUS THEN RETURN .STATUS;�/� IF .ADRCNT EQL 0 THEN RETURN SS$_ENDOFFILE;�!� INCR I FROM 0 TO .ADRCNT-1 DO� � BEGIN�9� STATUS = TCP_CONNECT_ADDR (CTX, ADRLST [.I], .PORT);�� IF .STATUS THEN EXITLOOP;� END;�� � .STATUS����END; ! TCP_CONNECT� ��%SBTTL 'TCP_CONNECT_ADDR'�<�GLOBAL ROUTINE TCP_CONNECT_ADDR (CTX_A_A, ADDRESS_A, PORT) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This routine establishes a connection to the specified address andB�! port. The net context must already be assigned and bound to a�! TCP socket.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�'�! TCP_CONNECT_ADDR ctx, address, port��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������;�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1;80��������������������������������������������������������������������������������������������������������H������������������������K�|������������!��! COMPLETI������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?����������������������������������NETLIB_SRC.BCK�����������������v����[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2��������������������������������������ON CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND*� CTX = .CTX_A_A : REF CTXDEF,A� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [SIN$C_LENGTH,BYTE],�� ADDRESS = .ADDRESS_A,.� NPORT = PORT : VECTOR [4,BYTE];�� � LOCAL�� IOSB : IOSBDEF, � DSC : VECTOR [2,LONG], � STATUS;��*� REMSIN [SIN$W_FAMILY] = UCX$C_AF_INET;6� REMSIN [SIN$W_PORT] = .NPORT [0] ^ 8 + .NPORT [1];#� REMSIN [SIN$L_ADDR] = .ADDRESS;�� DSC [0] = SIN$C_LENGTH;�� DSC [1] = REMSIN;�9� CH$FILL (%CHAR (0), SIN$S_ZERO, REMSIN [SIN$T_ZERO]);�<� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_ACCESS,� IOSB=IOSB, P3=DSC);�3� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];��� � .STATUS����END; ! TCP_CONNECT_ADDR�� ��%SBTTL 'TCP_ACCEPT'�G�GLOBAL ROUTINE TCP_ACCEPT (LSNR_A_A, CTX_A_A, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�=�! This routine accepts an incoming connection. It will not�:�! complete until a connection comes in for it to accept.=�! This routine should only be used by servers with a socket��! bound to a particular port.��!�D�! NOTE: This call will be ASYNCHRONOUS if IOSB, ASTADR, and ASTPRM�! are specified!�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! TCP_ACCEPT lsnr, ctx [,iosb ,astadr ,astprm]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND$� LSNR = .LSNR_A_A : REF CTXDEF,$� CTX = .CTX_A_A : REF CTXDEF;�� � LOCAL� � STATUS;�� � BEGIN� � BIND�9� REMSIN = CTX [CTX_X_REMSIN] : BLOCK [,BYTE];�-� REMSIN [SIN$W_FAMILY] = UCX$C_AF_UNSPEC;�� REMSIN [SIN$W_PORT] = 0;�-� REMSIN [SIN$L_ADDR] = INET$C_INADDR_ANY;�'� CTX [CTX_L_DSCLEN] = SIN$C_LENGTH;�!� CTX [CTX_L_DSCADR] = REMSIN;�.� CTX [CTX_L_RETLEN] = CTX [CTX_L_RETSTAT];� END;�� � IF ACTUALCOUNT () GTR 2 THEN � BEGIN�L� STATUS = $QIO (CHAN=.LSNR [CTX_W_CHAN], FUNC=IO$_ACCESS OR IO$M_ACCEPT,6� IOSB=.IOSB_A, ASTADR=.ASTADR, ASTPRM=.ASTPRM,2� P3=CTX [CTX_X_DSC], P4=CTX [CTX_W_CHAN]);� END�� ELSE � BEGIN�,� BIND IOSB = CTX [CTX_Q_IOSB] : IOSBDEF;M� STATUS = $QIOW (CHAN=.LSNR [CTX_W_CHAN], FUNC=IO$_ACCESS OR IO$M_ACCEPT,�I� IOSB=CTX [CTX_Q_IOSB], P3=CTX [CTX_X_DSC], P4=CTX [CTX_W_CHAN]);�4� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];� END;�� � .STATUS����END; ! TCP_ACCEPT�� ��%SBTTL 'TCP_DISCONNECT'�)�GLOBAL ROUTINE TCP_DISCONNECT (CTX_A_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Closes a connection.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_DISCONNECT�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND(� CTX = .CTX_A_A : REF CTXDEF,'� BUFQ = CTX [CTX_Q_BUFQ] : QUEDEF;��� � LOCAL�� RCV : REF RCVDEF,�� IOSB : IOSBDEF;��F� $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_DEACCESS OR IO$M_SHUTDOWN,%� IOSB=IOSB, P4=UCX$C_DSC_RCV)����END; ! TCP_DISCONNECT�� ��%SBTTL 'TCP_SEND'�M�GLOBAL ROUTINE TCP_SEND (CTX_A_A, SNDSTR_A, XFLAGS, IOSB_A, ASTADR, ASTPRM) =��BEGIN��!+���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@����������������������������������NETLIB_SRC.BCK�����������������v����[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2�������������������������ǯ�������������+��! FUNCTIONAL DESCRIPTION:��!�D�! This routine sends a string to the remote system. The string isH�! automatically terminated with a cr/lf sequence, and the EOL ("push");�! bit is set based on the value of the PUSH bit of FLAGS.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�9�! TCP_SEND ctx, cmdstr [,flags] [,iosb, astadr, astprm]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND#� CTX = .CTX_A_A : REF CTXDEF,�3� SNDSTR = .SNDSTR_A : BLOCK [DSC$K_S_BLN,BYTE];��� � LOCAL�� FLAGS : BLOCK [4,BYTE],� IOSB : IOSBDEF,� SND : REF SNDDEF,�%� STR : BLOCK [DSC$K_S_BLN,BYTE],� � STATUS;��;� IF ACTUALCOUNT () GTR 2 THEN FLAGS [0,0,32,0] = .XFLAGS�� ELSE FLAGS [0,0,32,0] = 0;�� � IF ACTUALCOUNT () LSS 4 THEN � BEGIN�%� IF NOT .FLAGS [NET_V_NOTRM] THEN� � BEGIN� $INIT_DYNDESC (STR);�K� STR$CONCAT (STR, SNDSTR, %ASCID %STRING (%CHAR (13), %CHAR (10)));� � END;�K� STATUS = $QIOW (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_WRITEVBLK, IOSB=IOSB,�B� P1=(IF NOT .FLAGS [NET_V_NOTRM] THEN .STR [DSC$A_POINTER],� ELSE .SNDSTR [DSC$A_POINTER]),A� P2=(IF NOT .FLAGS [NET_V_NOTRM] THEN .STR [DSC$W_LENGTH]�,� ELSE .SNDSTR [DSC$W_LENGTH]));9� IF NOT .FLAGS [NET_V_NOTRM] THEN STR$FREE1_DX (STR);�4� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];� END�� ELSE � BEGIN�+� LIB$GET_VM (%REF (SND_S_SNDDEF), SND);�� SND [SND_L_CTX] = .CTX;"� SND [SND_L_ASTADR] = .ASTADR;"� SND [SND_L_ASTPRM] = .ASTPRM; � BEGIN7� BIND STR = SND [SND_Q_SNDBUF] : BLOCK [,BYTE];�� $INIT_DYNDESC (STR);�?� IF .FLAGS [NET_V_NOTRM] THEN STR$COPY_DX (STR, SNDSTR)�&� ELSE STR$CONCAT (STR, SNDSTR,3� %ASCID %STRING (%CHAR (13), %CHAR (10)));�C� STATUS = $QIO (CHAN=.CTX [CTX_W_CHAN], FUNC=IO$_WRITEVBLK,�7� IOSB=.IOSB_A, ASTADR=TCP_SND_AST, ASTPRM=.SND,�:� P1=.STR [DSC$A_POINTER], P2=.STR [DSC$W_LENGTH]); � END;�� IF NOT .STATUS THEN0� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND);� END;�� � .STATUS����END; ! TCP_SEND�� ��%SBTTL 'TCP_SND_AST'�ROUTINE TCP_SND_AST (SND_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�-�! AST routine triggered on send completion.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_SND_AST snd�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND� SND = .SND_A : SNDDEF;��� � LOCAL�� ASTADR, ASTPRM;��&� STR$FREE1_DX (SND [SND_Q_SNDBUF]);!� ASTADR = .SND [SND_L_ASTADR];�!� ASTPRM = .SND [SND_L_ASTPRM];�+� LIB$FREE_VM (%REF (SND_S_SNDDEF), SND);�.� IF .ASTADR NEQA 0 THEN (.ASTADR) (.ASTPRM)� ELSE SS$_NORMAL����END; ! TCP_SND_AST� ��%SBTTL 'TCP_RECEIVE'O�GLOBAL ROUTINE TCP_RECEIVE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Raw TCP receive routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_RECEIVE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETI���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������A����������������������������������NETLIB_SRC.BCK�����������������v����[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2�������������������������Z6�������������ON CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�� RCV : REF RCVDEF,� � STATUS;��-� IF REMQUE (.FREEQ [QUE_L_HEAD], RCV) THEN�+� LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV);�� RCV [RCV_L_CTX] = .CTX;� � IF ACTUALCOUNT () GTR 2 THEN#� RCV [RCV_L_USRIOSB] = .IOSB_A;� � IF ACTUALCOUNT () GTR 3 THEN � BEGIN�"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� END�� ELSEG� RCV [RCV_L_USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;���6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RCV_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);G� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_READVBLK, IOSB=RCV [RCV_Q_IOSB],�E� ASTADR=TCP_RAW_RCV_AST, ASTPRM=.RCV, P1=.RCVSTR [DSC$A_POINTER],� � P2=.RCVSTR [DSC$W_LENGTH]);� IF NOT .STATUS THEN� � BEGIN�� $CANTIM (REQIDT=.RCV);�(� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END�� ELSE!� IF ACTUALCOUNT () LSS 4 THEN� � BEGIN0� BIND IOSB = RCV [RCV_Q_IOSB] : IOSBDEF;1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);�@� IF ACTUALCOUNT () GTR 2 THEN CH$MOVE (8, IOSB, .IOSB_A)=� ELSE IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];�,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]); � END;��� � .STATUS����END; ! TCP_RECEIVE� ��%SBTTL 'TCP_RAW_RCV_AST',�ROUTINE TCP_RAW_RCV_AST (RCV : REF RCVDEF) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�>�! This AST routine is invoked when a network read completes.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TCP_RAW_RCV_AST buf��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND(� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,�/� UIOSB = RCV [RCV_L_USRIOSB] : REF IOSBDEF;���� $CANTIM (REQIDT=.RCV);B� IF .UIOSB NEQA 0 THEN CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);'� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);���&� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN0� (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM])� ELSE� SS$_NORMAL����END; ! TCP_RAW_RCV_AST� ��%SBTTL 'TCP_GET_LINE'�P�GLOBAL ROUTINE TCP_GET_LINE (CTX_A_A, RCVSTR_A, IOSB_A, ASTADR, ASTPRM, TMO_A) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! This routine forms one "line" out of the input received overK�! the net from the server. A "line" is a string of characters terminated�G�! with a cr/lf sequence. The routine will wait until enough input is��! received to form a "line".�!�I�! Note that I cheat a bit and assume that CR ends a record. This makes�K�! life a little easier since I don't have to wait around for another data�L�! block to show up if the CR occurs as the last character of a data block,F�! just to verify that there is an LF at the front of the next block.I�! IGNORE_LF_FRONT gets set instead, so on the next call I can strip the�I�! first character of the front of the next block (assuming it's an LF).��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�?�! TCP_GET_���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������B����������������������������������NETLIB_SRC.BCK�����������������v����[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2��������������������������������������LINE ctx, strdsc [,iosb, astadr, astprm] [,timeout]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--� � BUILTIN�� ACTUALCOUNT;���� BIND(� CTX = .CTX_A_A : REF CTXDEF,%� CHN = CTX [CTX_W_CHAN] : WORD,�'� INQ = CTX [CTX_Q_BUFQ] : QUEDEF,�8� RCVSTR = .RCVSTR_A : BLOCK [DSC$K_S_BLN,BYTE];�� � LOCAL�%� SDSC : BLOCK [DSC$K_S_BLN,BYTE],�� RCV : REF RCVDEF,� � LEN,� � EOPTR,� � LFPOS,� � STATUS,� FOUND_CRLF;��#� STR$COPY_DX (RCVSTR, %ASCID'');���'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;���� FOUND_CRLF = 0;�0� WHILE NOT REMQUE (.INQ [QUE_L_HEAD], RCV) DO � BEGIN� � BIND�+� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,�+� RCNT = IOSB [IOSB_W_COUNT] : WORD;�A� EOPTR = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (13));�A� LFPOS = CH$FIND_CH (.RCNT, .RCV [RCV_L_BUFPTR], %CHAR (10));���,� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOS&� ELSE IF NOT CH$FAIL (.LFPOS) THEN3� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;���� IF CH$FAIL (.EOPTR) THEN� � BEGIN5� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];�L� SDSC [DSC$W_LENGTH] = MINU (.RCNT, STR_MAX-.RCVSTR [DSC$W_LENGTH]);#� STR$APPEND (RCVSTR, SDSC);�,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END � ELSE� � BEGIN4� SDSC [DSC$A_POINTER] = .RCV [RCV_L_BUFPTR];5� LEN = CH$DIFF (.EOPTR, .RCV [RCV_L_BUFPTR]);�K� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.RCVSTR [DSC$W_LENGTH]);�#� STR$APPEND (RCVSTR, SDSC);�1� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THEN�� BEGIN"� IF .LEN GEQ .RCNT-2 THEN� BEGIN�@� IF .LEN EQL .RCNT-1 THEN CTX [CTX_V_IGNORELF] = 1;1� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� � END�� ELSE� BEGIN�� LOCAL DELTA;<� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10)#� THEN 2 ELSE 1);�<� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, .DELTA);+� RCNT = .RCNT - .LEN - .DELTA;�!� INSQUE (.RCV, INQ);�� END; � END � ELSE�� BEGIN"� IF .LEN GEQ .RCNT-1 THEN0� INSQUE (.RCV, .FREEQ [QUE_L_TAIL])� ELSE� BEGIN�7� RCV [RCV_L_BUFPTR] = CH$PLUS (.EOPTR, 1);�&� RCNT = .RCNT - .LEN - 1;!� INSQUE (.RCV, INQ);'� END; � END;X� FOUND_CRLF = 1;� EXITLOOP; � END;�� END; ! WHILE NOT REMQUE��� IF .FOUND_CRLF THENP � BEGINt!� IF ACTUALCOUNT () GTR 2 THENP � BEGIN� IF .IOSB_A NEQA 0 THEN � BEGIN(� BIND IOSB = .IOSB_A : IOSBDEF;7� IOSB [IOSB_W_COUNT] = .RCVSTR [DSC$W_LENGTH];D,� IOSB [IOSB_W_STATUS] = SS$_NORMAL; � END;8� IF .ASTADR NEQA 0 THENl:� RETURN $DCLAST (ASTADR=.ASTADR, ASTPRM=.ASTPRM); � END; � RETURN SS$_NORMAL; � END;� -� IF REMQUE (.FREEQ [QUE_L_HEAD], RCV) THENS+� LIB$GET_VM (%REF (RCV_S_RCVDEF), RCV);U)� RCV [RCV_L_BUFPTR] = RCV [RCV_T_BUF];I� RCV [RCV_L_CTX] = .CTX;R � RCV [RCV_L_STRPTR] = RCVSTR; � IF ACTUALCOUNT () GTR 2 THEN � BEGIND#� RCV [RCV_L_USRIOSB] = .IOSB_A;N"� RCV [RCV_L_ASTADR] = .ASTADR;"� RCV [RCV_L_ASTPRM] = .ASTPRM;� ENDT� ELSEG� RCV [RCV_L_���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������C����������������������������������NETLIB_SRC.BCK�����������������v����[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2�������������������������cE������#�������USRIOSB] = RCV [RCV_L_ASTADR] = RCV [RCV_L_ASTPRM] = 0;I��6� CH$MOVE (8, CTX [CTX_Q_EXPTIME], RCV [RCV_Q_TMO]); � IF ACTUALCOUNT () GTR 5 THEN@� IF .TMO_A NEQA 0 THEN CH$MOVE (8, .TMO_A, RCV [RCV_Q_TMO]);��F� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);G� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_READVBLK, IOSB=RCV [RCV_Q_IOSB],LH� ASTADR=TCP_RCV_AST, ASTPRM=.RCV, P1=RCV [RCV_T_BUF], P2=RCV_S_BUF);� IF NOT .STATUS THEN= � BEGIN+� $CANTIM (REQIDT=.RCV);�(� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� ENDt� ELSE'� IF .RCV [RCV_L_ASTADR] EQLA 0 THENm1� STATUS = $SYNCH (IOSB=RCV [RCV_Q_IOSB]);k�� � .STATUSU���END; ! TCP_GET_LINEw� �%SBTTL 'TCP_RCV_AST'(�ROUTINE TCP_RCV_AST (RCV : REF RCVDEF) =�BEGIN �!++n�! FUNCTIONAL DESCRIPTION:C�!I>�! This AST routine is invoked when a network read completes.@�! It queues up the buffer block for processing by the mainline@�! thread, which will also handle I/O errors. Then a new block<�! is allocated and, barring any errors, a read is reQIO'd.�! B�! RETURNS: cond_value, longword (unsigned), write only, by value�!2 �! PROTOTYPE:�!R�! TCP_RCV_AST buf��! �! IMPLICIT INPUTS: None.T�!N�! IMPLICIT OUTPUTS: None.)�!��! COMPLETION CODES:E�!E2�! SS$_NORMAL: normal successful completion.�!D�! SIDE EFFECTS:R�!F �! None.D�!--1��� BIND(� IOSB = RCV [RCV_Q_IOSB] : IOSBDEF,0� STR = .RCV [RCV_L_STRPTR] : BLOCK [,BYTE],.� BUF = RCV [RCV_T_BUF] : BLOCK [,BYTE],4� BUFPTR = RCV [RCV_L_BUFPTR]: REF BLOCK [,BYTE],+� CTX = RCV [RCV_L_CTX] : REF CTXDEF,�%� CHN = CTX [CTX_W_CHAN] : WORD,�/� UIOSB = RCV [RCV_L_USRIOSB] : REF IOSBDEF;o�� � LOCALd � LEN,d � STATUS, � EOPTR,t � LFPOS, %� SDSC : BLOCK [DSC$K_S_BLN,BYTE];k��� $CANTIM (REQIDT=.RCV);%� IF NOT .IOSB [IOSB_W_STATUS] THENy � BEGIN�� IF .UIOSB NEQA 0 THEN � BEGIN1� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);�4� UIOSB [IOSB_W_COUNT] = .STR [DSC$W_LENGTH]; � END; (� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);'� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN�;� RETURN (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM]), � ELSEI� RETURN SS$_NORMAL;B� END;��!� IF .CTX [CTX_V_IGNORELF] THEN. � BEGIN�� CTX [CTX_V_IGNORELF] = 0;.� IF CH$RCHAR (.BUFPTR) EQL %CHAR (10) THEN � BEGIN'� BUFPTR = CH$PLUS (.BUFPTR, 1);;8� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - 1; � END;T� END;��'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;D'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;GC� EOPTR = CH$FIND_CH (.IOSB [IOSB_W_COUNT], .BUFPTR, %CHAR (13));SC� LFPOS = CH$FIND_CH (.IOSB [IOSB_W_COUNT], .BUFPTR, %CHAR (10));I��+� IF CH$FAIL (.EOPTR) THEN EOPTR = .LFPOS %� ELSE IF NOT CH$FAIL (.LFPOS) THENS/� IF .LFPOS LSSA .EOPTR THEN EOPTR = .LFPOS;D��� IF CH$FAIL (.EOPTR) THEN � BEGINE6� SDSC [DSC$W_LENGTH] = MINU (.IOSB [IOSB_W_COUNT],5� STR_MAX-.STR [DSC$W_LENGTH]);h$� SDSC [DSC$A_POINTER] = .BUFPTR;� STR$APPEND (STR, SDSC);� BUFPTR = RCV [RCV_T_BUF];G� $SETIMR (DAYTIM=RCV [RCV_Q_TMO], ASTADR=TCP_TMO_AST, REQIDT=.RCV);sH� STATUS = $QIO (CHAN=.CHN, FUNC=IO$_READVBLK, IOSB=RCV [RCV_Q_IOSB],5� ASTADR=TCP_RCV_AST, ASTPRM=.RCV, P1=.BUFPTR, � P2=RCV_S_BUF);:� IF NOT .STATUS THEN � BEGIN� $CANTIM (REQIDT=.RCV);P� IF .UIOSB NEQA 0 THEN� BEGIN2� CH$MOVE (8, IOSB, .RCV [RCV_L_USRIOSB]);5� UIOSB [IOSB_W_COUNT]���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������D����������������������������������NETLIB_SRC.BCK�����������������v����[NETLIB]NETLIB_UCX_TCP.B32;17��������������������������������������������������������������������������������������������������P�����2�������������������������I� �����*������� = .STR [DSC$W_LENGTH]; *� UIOSB [IOSB_W_STATUS] = .STATUS; � END;E,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);+� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN <� RETURN (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM]) � ELSE�� RETURN SS$_NORMAL; � END; � RETURN SS$_NORMAL� END;��$� LEN = CH$DIFF (.EOPTR, .BUFPTR);C� SDSC [DSC$W_LENGTH] = MINU (.LEN, STR_MAX-.STR [DSC$W_LENGTH]);R#� SDSC [DSC$A_POINTER] = .BUFPTR;Y� STR$APPEND (STR, SDSC); ,� IF CH$RCHAR (.EOPTR) EQL %CHAR (13) THEN � BEGINC,� IF .LEN GEQ .IOSB [IOSB_W_COUNT]-2 THEN � BEGIN0� IF .LEN EQL .IOSB [IOSB_W_COUNT]-1 THEN#� CTX [CTX_V_IGNORELF] = 1;F,� INSQUE (.RCV, .FREEQ [QUE_L_TAIL]);� END � ELSED � BEGIN� LOCAL DELTA; G� DELTA = (IF CH$RCHAR (.EOPTR+1) EQL %CHAR (10) THEN 2 ELSE 1);B+� BUFPTR = CH$PLUS (.EOPTR, .DELTA);SD� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - .LEN - .DELTA;)� INSQUE (.RCV, CTX [CTX_Q_BUFQ]);[ � END; � ENDT� ELSE � BEGIN ,� IF .LEN GEQ .IOSB [IOSB_W_COUNT]-1 THEN+� INSQUE (.RCV, .FREEQ [QUE_L_TAIL])� � ELSEL � BEGIN&� BUFPTR = CH$PLUS (.EOPTR, 1);?� IOSB [IOSB_W_COUNT] = .IOSB [IOSB_W_COUNT] - .LEN - 1;s)� INSQUE (.RCV, CTX [CTX_Q_BUFQ]);u � END; � END;��� IF .UIOSB NEQA 0 THEN � BEGIN�(� UIOSB [IOSB_W_STATUS] = SS$_NORMAL;0� UIOSB [IOSB_W_COUNT] = .STR [DSC$W_LENGTH];� END;&� IF .RCV [RCV_L_ASTADR] NEQA 0 THEN0� (.RCV [RCV_L_ASTADR]) (.RCV [RCV_L_ASTPRM])� ELSE� SS$_NORMALI���END; ! TCP_RCV_AST� �%SBTTL 'TCP_TMO_AST')�ROUTINE TCP_TMO_AST (RCV : REF RCVDEF) = �BEGIN��!++ �! FUNCTIONAL DESCRIPTION:I�! 7�! Delivered when a receive takes longer than EXPTIME._@�! Just cancels the I/O, to trigger the I/O completion AST with�! status SS$_CANCEL.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!A �! PROTOTYPE:�!R�! TCP_TMO_AST rcv�!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.s�!n�! COMPLETION CODES:m�!T2�! SS$_NORMAL: normal successful completion.�! �! SIDE EFFECTS: �! �! None. �!-- � BIND%� CTX = .RCV [RCV_L_CTX] : CTXDEF;S��$� $CANCEL (CHAN=.CTX [CTX_W_CHAN])���END; ! TCP_TMO_AST���ENDv�ELUDOM! PROTOTYPE:�!�9�! TCP_SEND ctx, cmdstr [,flags] [,iosb, astadr, astprm]��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: n������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������E����������������������������������NETLIB_SRC.BCK�����������������y����[NETLIB]NETLIB_UCX_UDP.B32;11��������������������������������������������������������������������������������������������������O���������������������������������������������*�[NETLIB]NETLIB_UCX_UDP.B32;11�+��,�y���.�����/� �@� �4�O������ ��������������������-�����0���1����2���3������K��P���W���O�����5���6�=,)��7� ,)��8� ufh��9����������G� �@��H��J������ �������������%TITLE 'NETLIB_UCX_UDP'�$�MODULE NETLIB_UCX_UDP (IDENT='V1.2',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�-�! ABSTRACT: UDP NETLIB routines for UCX.��!��! MODULE DESCRIPTION:��!�3�! Contains UDP send and receive routines for UCX.��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 29-JAN-1991��!��! MODIFICATION HISTORY:��!�?�! 29-JAN-1991 V1.0 Madison Initial coding (from NSQUERY).�G�! 08-FEB-1991 V1.1 Madison Add source info return to UDP_RECEIVE.�;�! 22-NOV-1991 V1.2 Madison Add rcvtmo to UDP_RECEIVE.��!--�"� LIBRARY 'SYS$LIBRARY:STARLET';&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';� LIBRARY 'UCX_DEFS';�� LIBRARY 'NETLIB';���� FORWARD ROUTINE�� UDP_SEND,� UDP_RECEIVE,�� TIMER_AST;�� ��%SBTTL 'UDP_SEND'�L�GLOBAL ROUTINE UDP_SEND (CTX_A_A, ADR, PORT : WORD, BUFPTR, BUFLEN : WORD) =�BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Sends out a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�1�! UDP_SEND chan, address, port, bufptr, buflen��!�@�! ctx: context, longword (unsigned), read only, by referenceG�! address: longword_unsigned, longword (unsigned), read only, by value�?�! port: word_unsigned, word (unsigned), read only, by value�E�! bufptr: varying_arg, longword (unsigned), read only, by reference�?�! buflen: word_unsigned, word (unsigned), read only, by value��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND#� CTX = .CTX_A_A : REF CTXDEF,�$� CHAN = CTX [CTX_W_CHAN] : WORD,(� PORT2 = PORT : VECTOR [2,BYTE];�� � LOCAL�)� REMSIN : BLOCK [SIN$C_LENGTH, BYTE],�� IOSB : IOSBDEF,� DSC : VECTOR [3,LONG], � RETLEN, � STATUS;��*� REMSIN [SIN$W_FAMILY] = UCX$C_AF_INET;8� REMSIN [SIN$W_PORT] = .PORT2 [0] * 256 + .PORT2 [1];� REMSIN [SIN$L_ADDR] = .ADR;�9� CH$FILL (%CHAR (0), SIN$S_ZERO, REMSIN [SIN$T_ZERO]);�� DSC [0] = SIN$C_LENGTH;�� DSC [1] = REMSIN;�� DSC [2] = RETLEN;�>� STATUS = $QIOW (CHAN=.CHAN, FUNC=IO$_WRITEVBLK, IOSB=IOSB,%� P1=.BUFPTR, P2=.BUFLEN, P3=DSC);�3� IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];��� � .STATUS����END; ! UDP_SEND�� ��%SBTTL 'UDP_RECEIVE'E�GLOBAL ROUTINE UDP_RECEIVE (CTX_A_A, BUFPTR, BUFSIZ : WORD, BUFLEN_A,�.� SRCADR_A, SRCPRT_A, RCVTMO_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!��! Reads a UDP datagram.��!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�K�! UDP_RECEIVE chan, bufptr, bufsiz, buflen [,srcadr] [,srcprt] [,rcvtmo]��!�@�! ctx: context, longword (unsigned), read only, by referenceF�! bufptr: varying_arg, longword (unsigned), write only, by referen������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������F����������������������������������NETLIB_SRC.BCK�����������������y����[NETLIB]NETLIB_UCX_UDP.B32;11��������������������������������������������������������������������������������������������������O������������������������������B� ������������ce?�! bufsiz: word_unsigned, word (unsigned), read only, by value�D�! buflen: word_unsigned, word (unsigned), write only, by referenceL�! srcadr: longword_unsigned, longword (unsigned), write only, by referenceL�! srcprt: longword_unsigned, longword (unsigned), write only, by referenceA�! rcvtmo: date_time, quadword (signed), read only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--�� BIND$� CTX = .CTX_A_A : REF CTXDEF,$� CHAN = CTX [CTX_W_CHAN] : WORD, � BUFLEN = .BUFLEN_A : WORD;�� � BUILTIN�� ACTUALCOUNT;��� � LOCAL�� RCVTMO : VECTOR [2,LONG],� INFO : VECTOR [3,LONG],2� REMSIN : VOLATILE BLOCK [SIN$C_LENGTH, BYTE],� IOSB : VOLATILE IOSBDEF,�� DSC : VECTOR [3,LONG],� RETLEN : VOLATILE,� � STATUS;��*� REMSIN [SIN$W_FAMILY] = UCX$C_AF_INET;#� REMSIN [SIN$W_PORT] = 53 * 256;�+� REMSIN [SIN$L_ADDR] = UCX$C_INADDR_ANY;�� DSC [0] = SIN$C_LENGTH;�� DSC [1] = REMSIN;�� DSC [2] = RETLEN;���"� STATUS = ACTUALCOUNT () GTR 6;.� IF .STATUS THEN STATUS = .RCVTMO_A NEQA 0;2� IF .STATUS THEN CH$MOVE (8, .RCVTMO_A, RCVTMO)<� ELSE $BINTIM (TIMBUF=%ASCID'0 00:00:10', TIMADR=RCVTMO);��� INFO [0] = .CHAN;�� INFO [1] = IOSB;� INFO [2] = SS$_NORMAL;;� $SETIMR (DAYTIM=RCVTMO, ASTADR=TIMER_AST, REQIDT=INFO);�=� STATUS = $QIOW (CHAN=.CHAN, FUNC=IO$_READVBLK, IOSB=IOSB,�*� P1=.BUFPTR, P2=.BUFSIZ, P3=DSC);� $CANTIM (REQIDT=INFO);,� IF NOT .INFO [2] THEN STATUS = .INFO [2]8� ELSE IF .STATUS THEN STATUS = .IOSB [IOSB_W_STATUS];;� BUFLEN = (IF .STATUS THEN .IOSB [IOSB_W_COUNT] ELSE 0);�� IF .STATUS THEN� � BEGIN�!� IF ACTUALCOUNT () GTR 4 THEN�C� IF .SRCADR_A NEQA 0 THEN .SRCADR_A = .REMSIN [SIN$L_ADDR];�!� IF ACTUALCOUNT () GTR 5 THEN�!� IF .SRCPRT_A NEQA 0 THEN�=� .SRCPRT_A = (.REMSIN [SIN$W_PORT] MOD 256) * 256 + �0� (.REMSIN [SIN$W_PORT] / 256);� END;�� � .STATUS����END; ! UDP_RECEIVE� ��%SBTTL 'TIMER_AST'�ROUTINE TIMER_AST (INFO_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�F�! This AST routine is ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������<�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1;80��������������������������������������������������������������������������������������������������������H������������������������SG�|�����.������triggered when the net receive timer goes off.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!��! TIMER_AST info��!�O�! info: vector_longword_unsigned, longword (unsigned), modify, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:��!� �! None.��!--���� BIND&� INFO = .INFO_A : VECTOR [3,LONG], � IOSB = .INFO [1] : IOSBDEF;��2� INFO [2] = IOSB [IOSB_W_STATUS] = SS$_TIMEOUT;� $CANCEL (CHAN=.INFO [0]);���� SS$_NORMAL���END; ! TIMER_AST���END��ELUDOM��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������G����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������ܹ���������������*�[NETLIB]NETLIB_MXLOOK.B32;27�+��,����.�P����/� �@� �4�P���P���P�Z�������������������-�����0���1����2���3������K��P���W���O�Q����5���6�V��7�1(V��8����������9����������G� �@��H��J������� �������������%TITLE 'NETLIB_MXLOOK'%�MODULE NETLIB_MXLOOK (IDENT='V1.5-2',�J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!� �! ABSTRACT:��!�<�! Mail Exchange resource record lookup routine for NETLIB.<�! This module is layered on other NETLIB routines and thusB�! can be used with any TCP/IP supporting the Domain Name System.�!��! MODULE DESCRIPTION:��!��!��! AUTHOR: M. Madison�3�! COPYRIGHT 1993, MATTHEW D. MADISON.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 30-JAN-1991��!��! MODIFICATION HISTORY:��!�:�! 30-JAN-1991 V1.0 Madison Initial coding (from MX).C�! 05-FEB-1991 V1.1 Madison Handle automatic domain expansion.�C�! 25-MAR-1991 V1.2 Madison Allow site-defined domain name(s).�G�! 26-APR-1991 V1.3 Madison If NETLIB_NAMESERVERS not defined, use�;�! MultiNet or UCX ones.�C�! 22-NOV-1991 V1.3-1 Madison Use UDP_RECEIVE timeout feature.�F�! 04-DEC-1991 V1.4 Madison Improve no-MX case handling; recurse.G�! 01-FEB-1992 V1.4-1 Volz If NETLIB_NAMESERVERS not defined, also�*�! use TCPware one.>�! 13-FEB-1992 V1.4-2 Madison Fix NETLIB_DOMAIN loop bug.J�! 13-FEB-1992 V1.5 Madison If name contains dot, try it plain first.2�! ??-???-1993 V1.5-1 Madison Update for AXP.<�! 22-APR-1993 V1.5-2 Madison Fix one BIND declaration.�!--���"� LIBRARY 'SYS$LIBRARY:STARLET';� LIBRARY 'NETLIBDEF';� LIBRARY 'NETLIB';�� LIBRARY 'FIELDS';�� LIBRARY 'DEBUG';��� OWN�� DBGSWI : INITIAL (0),� DBGTST : INITIAL (0);��� FORWARD ROUTINE�� DNS_MXLOOK,� DNS_MXLOOK_TRY,� NAME_UNPACK : NOVALUE,�� ADD_CNAME : NOVALUE,�� ADD_MX : NOVALUE,� ADD_NULL : NOVALUE,�� GET_NAMESERVERS;���� EXTERNAL ROUTINE5� NET_ASSIGN, NET_BIND, NET_GET_ADDRESS, UDP_SEND,�5� UDP_RECEIVE, NET_DEASSIGN, NET_GET_HOSTNAME,�7� G_HAT (LIB$ANALYZE_SDESC, LIB$FREE_VM, LIB$GET_VM,�=� STR$COPY_DX, STR$APPEND, STR$FREE1_DX, STR$POS_EXTR,�;� STR$POSITION, STR$COMPARE, STR$CONCAT, STR$COPY_R,�@� STR$UPCASE, LIB$ADD_TIMES, LIB$SUB_TIMES, LIB$SYS_FAO);�� � LITERAL� � IPNS_CLASS_IN = %X'0100', � IPNS_TYPE_CNAME = %X'0500', � IPNS_TYPE_NS = %X'0200', � IPNS_TYPE_MX = %X'0F00',� IPNS_RC_SUCCESS = 0,�� IPNS_RC_NAMERR = 3,�� MAX_REQUESTS = 32,�� NSHO_S_HOST = 128,� CNAM_S_NAME = 128,� NUL_S_NAME = 128,� CNAM_S_CNAME = 128,� MX_S_NAME = 128,� MX_K_MAXMX = 4,� MX_S_MXNAME = 128;��� _DEF (NSMSG)!� NSMSG_L_LONGWORD = _LONG,� � _OVERLAY (NSMSG_L_LONGWORD)&� NSMSG_W_ID = _WORD,*� NSMSG_V_RECURSION_DESIRED = _BIT,(� NSMSG_V_TRUNCATION = _BIT,)� NSMSG_V_AUTHORITATIVE = _BIT,�+� NSMSG_V_OPCODE = _BITS (4),�&� NSMSG_V_RESPONSE = _BIT,+� NSMSG_V_RCODE = _BITS������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������H����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������9������������� (4),�+� NSMSG_V_UNUSED = _BITS (3),�(� NSMSG_V_RECURSION_AVAIL = _BIT� _ENDOVERLAY� _ENDDEF (NSMSG);��� _DEF (NSHO)�� NSHO_L_FLINK = _LONG,� NSHO_L_BLINK = _LONG,� NSHO_W_HOST = _WORD,(� NSHO_T_HOST = _BYTES (NSHO_S_HOST)� _ENDDEF (NSHO);���� _DEF (CNAM)�� CNAM_Q_EXPDT = _QUAD,� CNAM_L_FLAGS = _LONG,� _OVERLAY (CNAM_L_FLAGS) � CNAM_V_INUSE = _BIT,� _ENDOVERLAY� CNAM_L_NAME = _LONG,� CNAM_L_CNAME = _LONG,�+� CNAM_T_NAME = _BYTES (CNAM_S_NAME),�,� CNAM_T_CNAME = _BYTES (CNAM_S_CNAME)� _ENDDEF (CNAM);��� � _DEF (MX)�� MX_Q_EXPDT = _QUAD,*� MX_AL_MXPREF = _BYTES (4*MX_K_MAXMX),*� MX_AL_MXNAME = _BYTES (4*MX_K_MAXMX),� MX_L_COUNT = _LONG,� MX_L_FLAGS = _LONG,� _OVERLAY (MX_L_FLAGS)� MX_V_INUSE = _BIT,�� _ENDOVERLAY� MX_L_NAME = _LONG,'� MX_T_NAME = _BYTES (MX_S_NAME),�3� MX_AT_MXNAME = _BYTES (MX_K_MAXMX*MX_S_MXNAME)�� _ENDDEF (MX);���� _DEF (NUL)� NUL_Q_EXPDT = _QUAD,�� NUL_L_FLAGS = _LONG,�� _OVERLAY (NUL_L_FLAGS)�� NUL_V_INUSE = _BIT,�� _ENDOVERLAY� NUL_L_NAME = _LONG,�(� NUL_T_NAME = _BYTES (NUL_S_NAME)� _ENDDEF (NUL);�� � MACRO�� TABLE (TABNAM, ITEM1) [] =�/� %IF %LENGTH EQL 1 %THEN %EXITMACRO %FI�8� LITERAL %NAME (TABNAM, '_COUNT') = %LENGTH - 1;� PSECT OWN = $PLIT$;F� OWN TABNAM : VECTOR [%NAME (TABNAM, '_COUNT'),LONG] INITIAL (� %ASCID ITEM1E� %IF NOT %NULL (%REMAINING) %THEN FILLTAB (%REMAINING) %FI);�� PSECT OWN = $OWN$;�� %,�� FILLTAB (X) [] =�M� , %ASCID X %IF NOT %NULL (%REMAINING) %THEN FILLTAB (%REMAINING) %FI�� %;��� � LITERAL�� CNAMTAB_SIZE = 128,� MXTAB_SIZE = 128,� NULLTAB_SIZE = 128,�� MXN_S_HOST = 128;��� OWN�A� CNAMTAB : BLOCKVECTOR [CNAMTAB_SIZE,CNAM_S_CNAMDEF,BYTE]�'� FIELD (CNAM_FIE������ �������LDS),�9� MXTAB : BLOCKVECTOR [MXTAB_SIZE,MX_S_MXDEF,BYTE]�%� FIELD (MX_FIELDS),�?� NULLTAB : BLOCKVECTOR [NULLTAB_SIZE,NUL_S_NULDEF,BYTE]�&� FIELD (NUL_FIELDS),!� NSHPRM : QUEDEF PRESET (�� [QUE_L_TAIL] = NSHPRM,� � [QUE_L_HEAD] = NSHPRM);�� � MACRO�� MXN_L_PREF = 0,0,32,0%,� MXN_L_LEN = 1,0,32,0%,� MXN_T_HOST = 2,0,0,0%;��� � MACRO�$� LONG_PACK (X, NSBUF, NSINDEX) = � BEGIN%� NSBUF [.NSINDEX,0,32,0] = X;� � NSINDEX = .NSINDEX + 4; � END%,&� LONG_UNPACK (X, NSBUF, NSINDEX) = � BEGIN%� X =.NSBUF [.NSINDEX,0,32,0];� � NSINDEX = .NSINDEX + 4; � END%,.� LONG_REVERSE_UNPACK (X, NSBUF, NSINDEX) = � BEGIN-� X<24,8,0> = .NSBUF [.NSINDEX,0,8,0];�/� X<16,8,0> = .NSBUF [.NSINDEX+1,0,8,0];�/� X<8,8,0> = .NSBUF [.NSINDEX+2,0,8,0];�/� X<0,8,0> = .NSBUF [.NSINDEX+3,0,8,0];� � NSINDEX = .NSINDEX + 4; � END%,)� BYTE_SWAP_PACK (X, NSBUF, NSINDEX) =� � BEGIN+� NSBUF [.NSINDEX,0,8,0] = X<8,8,0>;�-� NSBUF [.NSINDEX+1,0,8,0] = X<0,8,0>;� � NSINDEX = .NSINDEX + 2; � END%,+� BYTE_SWAP_UNPACK (X, NSBUF, NSINDEX) =� � BEGIN,� X<8,8,0> = .NSBUF [.NSINDEX,0,8,0];.� X<0,8,0> = .NSBUF [.NSINDEX+1,0,8,0]; � NSINDEX = .NSINDEX + 2; � END%,$� WORD_PACK (X, NSBUF, NSINDEX) = � BEGIN%� NSBUF [.NSINDEX,0,16,0] = X;� � NSINDEX = .NSINDEX + 2; � �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������I����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������p������������� END%,&� WORD_UNPACK (X, NSBUF, NSINDEX) = � BEGIN&� X = .NSBUF [.NSINDEX,0,16,0]; � NSINDEX = .NSINDEX + 2; � END%,$� BYTE_PACK (X, NSBUF, NSINDEX) = � BEGIN$� NSBUF [.NSINDEX,0,8,0] = X; � NSINDEX = .NSINDEX + 1; � END%,&� BYTE_UNPACK (X, NSBUF, NSINDEX) = � BEGIN%� X = .NSBUF [.NSINDEX,0,8,0];� � NSINDEX = .NSINDEX + 1; � END%,'� ASCIC_PACK (STR, NSBUF, NSINDEX) =� � BEGIN6� NSBUF [.NSINDEX,0,8,0] = .STR [DSC$W_LENGTH];<� CH$MOVE (.STR [DSC$W_LENGTH], .STR [DSC$A_POINTER],7� NSBUF [.NSINDEX+1,0,8,0]);�6� NSINDEX = .NSINDEX + 1 + .STR [DSC$W_LENGTH]; � END%,)� ASCIC_UNPACK (STR, NSBUF, NSINDEX) =�$� BEGIN 9� STR$COPY_R (STR, %REF (.NSBUF [.NSINDEX,0,8,0]),�$� NSBUF [.NSINDEX+1,0,8,0]);:� NSINDEX = .NSINDEX + 1 + .NSBUF [.NSINDEX,0,8,0]; � END%,(� TIME_UNPACK (TIM, NSBUF, NSINDEX) = � BEGIN� BUILTIN EMUL;� LOCAL XTIME;�5� LONG_REVERSE_UNPACK (XTIME, NSBUF, NSINDEX);�9� EMUL (XTIME, UPLIT (-10000000), UPLIT (0), TIM);� � END%;��� OWN�0� ONEHR : VECTOR [2,LONG] INITIAL (0,0),!� USE_RECURSION : INITIAL (1);�� ��%SBTTL 'DNS_MXLOOK'�G�GLOBAL ROUTINE DNS_MXLOOK (QHDESC_A, MXMAX_A, MXCOUNT_A, MXNSTRUC_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�>�! Front-end for DNS_MXLOOK_TRY that handles domain suffixes.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�0�! DNS_MXLOOK qhname, mxmax, mxcount, mxnstruc�!�C�! qhname: char_string, character string, read only, by descriptor�K�! mxmax: unsigned_longword, longword (unsigned), read only, by reference�L�! mxcount: unsigned_longword, longword (unsigned), write only, by referenceG�! mxnstruc: mxname_struc, longword (unsigned), write only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.$�! Other codes possible.�!��! SIDE EFFECTS: None.��!��!--���� BIND2� QHOST = .QHDESC_A : BLOCK [DSC$K_S_BLN,BYTE],� MXMAX = .MXMAX_A,� MXCOUNT = .MXCOUNT_A,5� MXNSTRUC = .MXNSTRUC_A : BLOCKVECTOR [,34,LONG];��� � LOCAL�'� MYHOST : BLOCK [DSC$K_S_BLN,BYTE],�&� QHLCL : BLOCK [DSC$K_S_BLN,BYTE],%� SDSC : BLOCK [DSC$K_S_BLN,BYTE],�%� LNMLST : $ITMLST_DECL (ITEMS=2),�)� DOMNAM : VOLATILE VECTOR [255,BYTE],�� DOMLEN : VOLATILE WORD,� RCVTMO : VECTOR [2,LONG], � DNSSTAT,�� CP, � STATUS;��:� IF .QHOST [DSC$W_LENGTH] EQL 0 THEN RETURN SS$_IVADDR;��L� IF $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM', LOGNAM=%ASCID'NETLIB_MXLOOK_TMO')� THEN � BEGIN� � LOCAL*� TMOLST : $ITMLST_DECL (ITEMS=1),.� TMOBUF : VOLATILE VECTOR [255,BYTE],4� DSC : BLOCK [DSC$K_S_BLN,BYTE] PRESET (-� [DSC$B_DTYPE] = DSC$K_DTYPE_T,�-� [DSC$B_CLASS] = DSC$K_CLASS_S,�)� [DSC$A_POINTER] = TMOBUF);���!� $ITMLST_INIT (ITMLST=TMOLST,�I� (ITMCOD=LNM$_STRING, BUFADR=TMOBUF, BUFSIZ=%ALLOCATION (TMOBUF),�&� RETLEN=DSC [DSC$W_LENGTH]));@� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM', ITMLST=TMOLST,0� LOGNAM=%ASCID'NETLIB_MXLOOK_TMO');��L� STATUS = $BINTIM (TIMBUF=(IF .STATUS THEN DSC ELSE %ASCID'0 00:00:15'),� TIMADR=RCVTMO);�L� IF NOT .STATUS THEN $BINTIM (TIMBUF=%ASCID'0 00:00:15', TIMAD���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������J����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������J�������������R=RCVTMO);� END�<� ELSE $BINTIM (TIMBUF=%ASCID'0 00:00:15', TIMADR=RCVTMO);��K� IF CH$RCHAR (CH$PLUS (.QHOST [DSC$A_POINTER], .QHOST [DSC$W_LENGTH]-1))�� EQL %C'.' THEN�<� RETURN DNS_MXLOOK_TRY (.QHDESC_A, .MXMAX_A, .MXCOUNT_A,-� .MXNSTRUC_A, RCVTMO);���8� IF NOT CH$FAIL (CH$FIND_CH (.QHOST [DSC$W_LENGTH]-1,.� .QHOST [DSC$A_POINTER], %C'.')) THEN8� IF DNS_MXLOOK_TRY (.QHDESC_A, .MXMAX_A, .MXCOUNT_A,:� .MXNSTRUC_A, RCVTMO) THEN RETURN SS$_NORMAL;��!� INIT_DYNDESC (MYHOST, QHLCL);�'� SDSC [DSC$B_DTYPE] = DSC$K_DTYPE_T;�'� SDSC [DSC$B_CLASS] = DSC$K_CLASS_S;���M� IF $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM', LOGNAM=%ASCID'NETLIB_DOMAIN') THEN� � BEGIN�� DNSSTAT = SS$_ENDOFFILE;�� INCR I FROM 0 DO� � BEGIN%� $ITMLST_INIT (ITMLST=LNMLST,�2� (ITMCOD=LNM$_INDEX, BUFADR=I, BUFSIZ=4),J� (ITMCOD=LNM$_STRING, BUFADR=DOMNAM, BUFSIZ=%ALLOCATION (DOMNAM),� RETLEN=DOMLEN));D� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM', ITMLST=LNMLST,2� LOGNAM=%ASCID'NETLIB_DOMAIN');-� IF NOT .STATUS OR .DOMLEN EQL 0 THEN�� BEGIN� STATUS = .DNSSTAT;� EXITLOOP;� � END;�5� IF CH$RCHAR (DOMNAM+.DOMLEN-1) NEQ %C'.' AND�/� .DOMLEN LSS %ALLOCATION (DOMNAM) THEN�� BEGIN+� CH$WCHAR (%C'.', DOMNAM+.DOMLEN);�� DOMLEN = .DOMLEN + 1;� � END;�'� SDSC [DSC$A_POINTER] = DOMNAM;�'� SDSC [DSC$W_LENGTH] = .DOMLEN;�,� IF CH$RCHAR (DOMNAM) EQL %C'.' THEN)� STR$CONCAT (QHLCL, QHOST, SDSC)� � ELSE�5� STR$CONCAT (QHLCL, QHOST, %ASCID'.', SDSC);�>� STATUS = DNS_MXLOOK_TRY (QHLCL, .MXMAX_A, .MXCOUNT_A,$� .MXNSTRUC_A, RCVTMO);"� IF .STATUS THEN EXITLOOP; � END;�� END�� ELSE � BEGIN�� NET_GET_HOSTNAME (MYHOST);�$� STR$APPEND (MYHOST, %ASCID'.');?� SDSC [DSC$A_POINTER] = CH$FIND_CH (.MYHOST [DSC$W_LENGTH],�)� .MYHOST [DSC$A_POINTER], %C'.');�3� SDSC [DSC$W_LENGTH] = .MYHOST [DSC$W_LENGTH] -�B� CH$DIFF (.SDSC [DSC$A_POINTER], .MYHOST [DSC$A_POINTER]);� WHILE 1 DO� � BEGIN)� STR$CONCAT (QHLCL, QHOST, SDSC);�>� STATUS = DNS_MXLOOK_TRY (QHLCL, .MXMAX_A, .MXCOUNT_A,$� .MXNSTRUC_A, RCVTMO);"� IF .STATUS THEN EXITLOOP;5� IF .SDSC [DSC$W_LENGTH] LEQ 1 THEN EXITLOOP;�P� CP = CH$FIND_CH (.SDSC [DSC$W_LENGTH]-1,.SDSC [DSC$A_POINTER]+1,%C'.');(� IF CH$FAIL (.CP) THEN EXITLOOP;5� SDSC [DSC$W_LENGTH] = .SDSC [DSC$W_LENGTH] -�/� CH$DIFF (.CP, .SDSC [DSC$A_POINTER]);�$� SDSC [DSC$A_POINTER] = .CP; � END;�� END;��!� FREE_STRINGS (QHLCL, MYHOST);��� � .STATUS����END; ! DNS_MXLOOK�� ��%SBTTL 'DNS_MXLOOK_TRY'�N�ROUTINE DNS_MXLOOK_TRY (QHDESC_A, MXMAX_A, MXCOUNT_A, MXNSTRUC_A, RCVTMO_A) = �BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�B�! This routine asks name servers for MX records for a host name.E�! The initial list of name servers is obtained from the system-wide�G�! logical name NETLIB_NAMESERVERS, which should be set up as a search� �! list.��!�B�! For each name server in the list, the addresses for the serverC�! are looked up via GTHST, and for each address UDP connection is�B�! started, a request for MX records is constructed and sent off,<�! and we wait for the return message for about 10 seconds.D�! If no response comes back or some error occurs, the next addressF�! for that���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������K����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������I������������� server is tried; after all addresses have been tried, theF�! next server in the list is tried. If a response comes back, it isD�! parsed. If the AUTHORITATIVE bit is set in the header and thereA�! are no ANSWER RR's, then we know that there are no MX records�B�! and we stop asking. If there are ANSWER RR's of type MX, thenB�! we add them names and preferences to the MXNAMES structure andA�! increment MXCOUNT. If there is a CNAME RR, we save that name�?�! for future requests. If there are AUTHORITY RR's, we queue�B�! the name server names at the front of our name server list forB�! future requests. Before we make the next request we incrementB�! a request counter. We give up after MAX_REQUESTS requests. We2�! also stop if we collect any MX records at all.�!�@�! The MXNAMES structure is an array of records like (in PL/I):�! DECLARE 1 MXNAMES (n),�4�! 2 PREFERENCE_VALUE FIXED BINARY (31),4�! 2 HOST_NAME_LENGTH FIXED BINARY (31),+�! 2 HOST_NAME CHARACTER (128);��!�;�! i.e, two longwords and a 128-byte string. No more than�2�! MXMAX names are ever returned by this routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�0�! DNS_MXLOOK qhname, mxmax, mxcount, mxnstruc�!�C�! qhname: char_string, character string, read only, by descriptor�K�! mxmax: unsigned_longword, longword (unsigned), read only, by reference�L�! mxcount: unsigned_longword, longword (unsigned), write only, by referenceG�! mxnstruc: mxname_struc, longword (unsigned), write only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.$�! Other codes possible.�!��! SIDE EFFECTS: None.��!��!--���� BIND:� QHOST = .QHDESC_A : BLOCK [DSC$K_S_BLN,BYTE],� MXMAX = .MXMAX_A,� MXCOUNT = .MXCOUNT_A,:� MXNSTRUC = .MXNSTRUC_A : BLOCKVECTOR [,34,LONG],2� XRCVTMO = .RCVTMO_A : BLOCK [8,BYTE];�� � LOCAL� � STATUS,#� REQBUF : BLOCK [256,BYTE],� � REQIDX,� REQCOUNT,$� RCVBUF : BLOCK [512,BYTE], � RCVIDX,*� PHOST : BLOCK [DSC$K_S_BLN,BYTE],)� NAME : BLOCK [DSC$K_S_BLN,BYTE],�*� NAME2 : BLOCK [DSC$K_S_BLN,BYTE],*� PHSEG : BLOCK [DSC$K_S_BLN,BYTE], � TTL : VECTOR [2,LONG],"� RCVTMO : VECTOR [2,LONG], � NOW : VECTOR [2,LONG],� NSH : REF NSHODEF,"� QIDENT : VECTOR [4,WORD],� HDR : NSMSGDEF,D� NSHQUE : QUEDEF,S � CURMXR, � IPCTX;A��-� INIT_DYNDESC (PHOST, PHSEG, NAME, NAME2);���9� IF .NSHPRM [QUE_L_HEAD] EQLA NSHPRM [QUE_L_HEAD] THENa � BEGINe9� CH$FILL (%CHAR (0), %ALLOCATION (CNAMTAB), CNAMTAB);r5� CH$FILL (%CHAR (0), %ALLOCATION (MXTAB), MXTAB);i9� CH$FILL (%CHAR (0), %ALLOCATION (NULLTAB), NULLTAB);U<� USE_RECURSION = NOT $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',=� LOGNAM=%ASCID'NETLIB_RECURSION_DISABLE');L'� STATUS = GET_NAMESERVERS (NSHPRM); (� IF NOT .STATUS THEN RETURN .STATUS;� END;��� MXCOUNT = 0;� REQCOUNT = 0;c��<� IF .QHOST [DSC$W_LENGTH] EQL 0 THEN RETURN SS$_BADPARAM;��� IF .USE_RECURSION THEN-� LIB$ADD_TIMES (XRCVTMO, XRCVTMO, RCVTMO)o� ELSE"� CH$MOVE (8, XRCVTMO, RCVTMO);��� $GETTIM (TIMADR = NOW);f��� STR$UPCASE (PHOST, QHOST);K� IF CH$RCHAR (CH$PLUS (.PHOST [DSC$A_POINTER], .PHOST [DSC$W_LENGTH]-1))e2� NEQ %C'.' THEN STR$���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������L����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������������#�������APPEND (PHOST, %ASCID'.');��&� INCR I FROM 0 TO CNAMTAB_SIZE-1 DO&� IF .CNAMTAB [.I,CNAM_V_INUSE] THEN � BEGIN_0� BIND CNAM = CNAMTAB [.I,0,0,0,0] : CNAMDEF;!� LOCAL TMP : VECTOR [2,LONG];B��E� DBGPRT ('%NETLIB_MXLOOK, CNAME entry[!UL]: !AD expires !%D', .I,5G� .CNAM [CNAM_L_NAME], CNAM [CNAM_T_NAME], CNAM [CNAM_Q_EXPDT]);1��:� IF LIB$SUB_TIMES (CNAM [CNAM_Q_EXPDT], NOW, TMP) THEN � BEGIN<� IF CH$EQL (.CNAM [CNAM_L_NAME], CNAM [CNAM_T_NAME],A� .PHOST [DSC$W_LENGTH], .PHOST [DSC$A_POINTER]) THENF� BEGING� STR$COPY_R (PHOST, CNAM [CNAM_L_CNAME], CNAM [CNAM_T_CNAME]);TJ� DBGPRT ('%NETLIB_MXLOOK, found CNAMTAB[!UL] -> !AS', .I, PHOST); � END;:� END � ELSEC � BEGINJ� DBGPRT ('%NETLIB_MXLOOK, cleaned entry [!UL], !AD, from CNAMTAB',7� .I, .CNAM [CNAM_L_NAME], CNAM [CNAM_T_NAME]);T!� CNAM [CNAM_V_INUSE] = 0;� � END;P� END;��$� INCR I FROM 0 TO MXTAB_SIZE-1 DO"� IF .MXTAB [.I,MX_V_INUSE] THEN � BEGINM*� BIND MX = MXTAB [.I,0,0,0,0] : MXDEF;!� LOCAL TMP : VECTOR [2,LONG];R��B� DBGPRT ('%NETLIB_MXLOOK, MX entry[!UL]: !AD expires !%D', .I,;� .MX [MX_L_NAME], MX [MX_T_NAME], MX [MX_Q_EXPDT]);���6� IF LIB$SUB_TIMES (MX [MX_Q_EXPDT], NOW, TMP) THEN � BEGINK� IF CH$EQL (.MX [MX_L_NAME], MX [MX_T_NAME], .PHOST [DSC$W_LENGTH],C&� .PHOST [DSC$A_POINTER]) THEN� BEGIN� BIND;� PREF = MX [MX_AL_MXPREF] : VECTOR [,LONG],N;� LENGTH = MX [MX_AL_MXNAME] : VECTOR [,LONG],2L� NAME = MX [MX_AT_MXNAME] : BLOCKVECTOR [,MX_S_MXNAME,BYTE];I� DBGPRT ('%NETLIB_MXLOOK, We have a match, entry [!UL]...', .I);N3� MXCOUNT = MIN (.MX [MX_L_COUNT], .MXMAX);I(� INCR J FROM 0 TO .MXCOUNT-1 DO� BEGIN,8� DBGPRT ('%NETLIB_MXLOOK, !AD, pref=!UL',<� .LENGTH [.J], NAME [.J,0,0,0,0], .PREF [.J]);5� MXNSTRUC [.J, MXN_L_PREF] = .PREF [.J];�6� MXNSTRUC [.J, MXN_L_LEN] = .LENGTH [.J];7� CH$MOVE (.LENGTH [.J], NAME [.J,0,0,0,0],E*� MXNSTRUC [.J, MXN_T_HOST]);� END;� FREE_STRINGS (PHOST); � RETURN SS$_NORMAL; � END� END � ELSE) � BEGINI� DBGPRT ('%NETLIB_MXLOOK, cleaned entry [!UL], !AD, from MXTAB',L/� .I, .MX [MX_L_NAME], MX [MX_T_NAME]); � MX [MX_V_INUSE] = 0; � END;L� END;��&� INCR I FROM 0 TO NULLTAB_SIZE-1 DO%� IF .NULLTAB [.I,NUL_V_INUSE] THENT � BEGINN.� BIND NUL = NULLTAB [.I,0,0,0,0] : NULDEF;!� LOCAL TMP : VECTOR [2,LONG];D��D� DBGPRT ('%NETLIB_MXLOOK, NULL entry[!UL]: !AD expires !%D', .I,A� .NUL [NUL_L_NAME], NUL [NUL_T_NAME], NUL [NUL_Q_EXPDT]);N��8� IF LIB$SUB_TIMES (NUL [NUL_Q_EXPDT], NOW, TMP) THEN � BEGIN8� IF CH$EQL (.NUL [NUL_L_NAME], NUL [NUL_T_NAME],A� .PHOST [DSC$W_LENGTH], .PHOST [DSC$A_POINTER]) THENT� BEGINJ� DBGPRT ('%NETLIB_MXLOOK, found NULLTAB[!UL] -> !AS', .I, PHOST);� MXCOUNT = 0;� FREE_STRINGS (PHOST);V� RETURN SS$_NORMAL; � END; � END � ELSEE � BEGINJ� DBGPRT ('%NETLIB_MXLOOK, cleaned entry [!UL], !AD, from NULLTAB',3� .I, .NUL [NUL_L_NAME], NUL [NUL_T_NAME]); � NUL [NUL_V_INUSE] = 0;H � END;R� END;�� � STATUS = NET_ASSIGN (IPCTX);� IF NOT .STATUS THEN � BEGINN� FREE_STRINGS (PHOST);� RETURN .STATUS;� EN���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������M����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������F������*�������D;)� STATUS = NET_BIND (IPCTX, NET_K_UDP);E� IF NOT .STATUS THENL � BEGINN� NET_DEASSIGN (IPCTX);� FREE_STRINGS (PHOST);� RETURN .STATUS;� END;��D� NSHQUE [QUE_L_TAIL] = NSHQUE [QUE_L_HEAD] = NSHQUE [QUE_L_HEAD];��� NSH = .NSHPRM [QUE_L_HEAD]; *� WHILE .NSH NEQA NSHPRM [QUE_L_HEAD] DO � BEGIN � LOCAL NSH2 : REF NSHODEF;.� LIB$GET_VM (%REF (NSHO_S_NSHODEF), NSH2);+� CH$MOVE (NSHO_S_NSHODEF, .NSH, .NSH2);_*� INSQUE (.NSH2, .NSHQUE [QUE_L_TAIL]);� NSH = .NSH [NSHO_L_FLINK];O� END;��3� WHILE NOT REMQUE (.NSHQUE [QUE_L_HEAD], NSH) DO( � BEGIN���D� DBGPRT ('%NETLIB_MXLOOK, Asking nameserver !AF about name !AS',7� .NSH [NSHO_W_HOST], NSH [NSHO_T_HOST], PHOST);D��� $GETTIM (TIMADR = QIDENT); ��� REQIDX = 0;�� � HDR [NSMSG_L_LONGWORD] = 0;$� HDR [NSMSG_W_ID] = .QIDENT [0];6� HDR [NSMSG_V_RECURSION_DESIRED] = .USE_RECURSION;9� DBGPRT ('%NETLIB_MXLOOK, [recursion_desired=!AS]',GC� (IF .USE_RECURSION THEN %ASCID'TRUE' ELSE %ASCID'FALSE'));E��9� LONG_PACK (.HDR [NSMSG_L_LONGWORD], REQBUF, REQIDX); �� � BEGIN� LOCAL"� ONE : WORD INITIAL (1),"� ZERO : WORD INITIAL (0);>� BYTE_SWAP_PACK (.ONE, REQBUF, REQIDX); ! Query count?� BYTE_SWAP_PACK (.ZERO, REQBUF, REQIDX); ! Answer count B� BYTE_SWAP_PACK (.ZERO, REQBUF, REQIDX); ! Authority countC� BYTE_SWAP_PACK (.ZERO, REQBUF, REQIDX); ! Additional countX � END; �� � BEGIN� LOCAL CURPOS, I; ��� CURPOS = 1;4� WHILE .CURPOS LEQU .PHOST [DSC$W_LENGTH] DO� BEGIN6� I = STR$POSITION (PHOST, %ASCID'.', CURPOS);;� STR$POS_EXTR (PHSEG, PHOST, CURPOS, %REF (.I-1));X-� ASCIC_PACK (PHSEG, REQBUF, REQIDX);N� CURPOS = .I+1; � END;F6� IF STR$COMPARE (PHOST, %ASCID'.') NEQU 0 THEN(� BYTE_PACK (0, REQBUF, REQIDX); � END; �� � BEGIN� LOCAL/� TYPEMX : WORD INITIAL (IPNS_TYPE_MX),;0� CLSIN : WORD INITIAL (IPNS_CLASS_IN);?� WORD_PACK (.TYPEMX, REQBUF, REQIDX); ! MX request typeN?� WORD_PACK (.CLSIN, REQBUF, REQIDX); ! INternet classN � END; �� � BEGIN� LOCAL$� ADRLST : VECTOR [32,LONG],� ADRCNT,D� RCVLEN,K3� NSHST : BLOCK [DSC$K_S_BLN,BYTE] PRESET (U1� [DSC$B_DTYPE] = DSC$K_DTYPE_T, 1� [DSC$B_CLASS] = DSC$K_CLASS_S,X7� [DSC$W_LENGTH] = .NSH [NSHO_W_HOST],[8� [DSC$A_POINTER] = NSH [NSHO_T_HOST]);��� ADRCNT = 0;E� STATUS = NET_GET_ADDRESS (IPCTX, NSHST, 32, ADRLST, ADRCNT);=��*� IF .STATUS AND .ADRCNT GTR 0 THEN� BEGIN'� INCR I FROM 0 TO .ADRCNT-1 DON� BEGIN %� BIND ADR = ADRLST [.I];F��D� DBGPRT ('%NETLIB_MXLOOK, trying !UB.!UB.!UB.!UB...',E� .ADR<0,8,0>, .ADR<8,8,0>, .ADR<16,8,0>, .ADR<24,8,0>); ��C� STATUS = UDP_SEND (IPCTX, .ADR, 53, REQBUF, .REQIDX);;B� IF .STATUS THEN STATUS = UDP_RECEIVE (IPCTX, RCVBUF,@� %ALLOCATION (RCVBUF), RCVLEN, 0, 0, RCVTMO);'� IF .STATUS THEN EXITLOOP;R� END; � END� ELSE STATUS = 0;N � END;��.� LIB$FREE_VM (%REF (NSHO_S_NSHODEF), NSH);��� IF .STATUS THEN � BEGIN��� LOCAL � RCVHDR : NSMSGDEF,� RDLENGTH : WORD,N� TYPE : WORD,� QDCOUNT : WORD, � AN���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������N����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������������1�������COUNT : WORD,)� NSCOUNT : WORD,R � ARCOUNT : WORD;��� RCVIDX = 0;��.� LONG_UNPACK (RCVHDR, RCVBUF, RCVIDX);��;� IF .RCVHDR [NSMSG_V_RCODE] EQL IPNS_RC_SUCCESS ANDn=� .RCVHDR [NSMSG_W_ID] EQL .HDR [NSMSG_W_ID] THENd� BEGIN��5� BYTE_SWAP_UNPACK (QDCOUNT, RCVBUF, RCVIDX);a5� BYTE_SWAP_UNPACK (ANCOUNT, RCVBUF, RCVIDX);�5� BYTE_SWAP_UNPACK (NSCOUNT, RCVBUF, RCVIDX);S5� BYTE_SWAP_UNPACK (ARCOUNT, RCVBUF, RCVIDX); ��E� DBGPRT (%STRING ('%NETLIB_MXLOOK, got !UW answer!%S and ',�@� '!UW auth!%S with authoritative = !UL'), .ANCOUNT,9� .NSCOUNT, .RCVHDR [NSMSG_V_AUTHORITATIVE]);_��0� IF .RCVHDR [NSMSG_V_AUTHORITATIVE] AND$� (.ANCOUNT EQL 0) THEN� BEGINM� MXCOUNT = 0;"� STATUS = SS$_NORMAL;D� DBGPRT ('%NETLIB_MXLOOK, no MX RR''s for !AS', PHOST);$� ADD_NULL (PHOST, NOW);� EXITLOOP;�� END;��&� INCR I FROM 1 TO .QDCOUNT DO� BEGINT1� NAME_UNPACK (NAME, RCVBUF, RCVIDX);L#� RCVIDX = .RCVIDX + 4;�� END;��� CURMXR = -1;��!� IF .ANCO���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������=�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1;80��������������������������������������������������������������������������������������������������������H�������������������������|�����l������UNT GTRU 0 THEN�� BEGINI*� INCR I FROM 1 TO .ANCOUNT DO� BEGIN � LOCAL IDX_SAVE;2� NAME_UNPACK (NAME, RCVBUF, RCVIDX);2� WORD_UNPACK (TYPE, RCVBUF, RCVIDX);,� RCVIDX = .RCVIDX + 2; ! class1� TIME_UNPACK (TTL, RCVBUF, RCVIDX);�;� BYTE_SWAP_UNPACK (RDLENGTH, RCVBUF, RCVIDX);_"� IDX_SAVE = .RCVIDX;��0� IF .TYPE EQL IPNS_TYPE_CNAME THEN� BEGIN?� ADD_CNAME (PHOST, RCVBUF, RCVIDX, NOW, TTL);OE� DBGPRT ('%NETLIB_MXLOOK, CNAME -> !AS', PHOST);S� END2� ELSE IF .TYPE EQL IPNS_TYPE_MX THEN� BEGIN� LOCAL � PREF : WORD,� I;;� BYTE_SWAP_UNPACK (PREF, RCVBUF, RCVIDX);A7� NAME_UNPACK (NAME2, RCVBUF, RCVIDX);-.� IF .MXCOUNT LSS .MXMAX THEN� BEGIN<� MXNSTRUC [.MXCOUNT, MXN_L_PREF] = .PREF;4� MXNSTRUC [.MXCOUNT, MXN_L_LEN] =@� MIN (MXN_S_HOST, .NAME2 [DSC$W_LENGTH]);=� CH$MOVE (.MXNSTRUC [.MXCOUNT, MXN_L_LEN], /� .NAME2 [DSC$A_POINTER],�9� MXNSTRUC [.MXCOUNT, MXN_T_HOST]);=+� MXCOUNT = .MXCOUNT + 1;C� END;RF� DBGPRT ('%NETLIB_MXLOOK, MX Pref=!UW, name=!AS',"� .PREF, NAME2);B� ADD_MX (CURMXR, PHOST, .PREF, NAME2, NOW, TTL);� END; ��� END;$� IF .MXCOUNT GTR 0 THEN� BEGIN=#� STATUS = SS$_NORMAL;�� EXITLOOP;� END;� END;��!� IF .NSCOUNT GTRU 0 THEN � BEGINO� LOCALM� NQ : QUEDEF,!� NSH : REF NSHODEF;B��7� NQ [QUE_L_TAIL] = (NQ [QUE_L_HEAD] = NQ); *� INCR I FROM 1 TO .NSCOUNT DO� BEGINN� LOCAL IDX_SAVE;2� NAME_UNPACK (NAME, RCVBUF, RCVIDX);2� WORD_UNPACK (TYPE, RCVBUF, RCVIDX);1� RCVIDX = .RCVIDX + 6; ! class, ttlP;� BYTE_SWAP_UNPAC���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������O����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������;5������8�������K (RDLENGTH, RCVBUF, RCVIDX);�"� IDX_SAVE = .RCVIDX;��-� IF .TYPE EQL IPNS_TYPE_NS THENC� BEGIN7� NAME_UNPACK (NAME2, RCVBUF, RCVIDX); B� DBGPRT ('%NETLIB_MXLOOK, NS -> !AS', NAME2);;� LIB$GET_VM (%REF (NSHO_S_NSHODEF), NSH);O?� NSH [NSHO_W_HOST] = .NAME2 [DSC$W_LENGTH]-1;N4� CH$MOVE (.NAME2 [DSC$W_LENGTH]-1,?� .NAME2 [DSC$A_POINTER], NSH [NSHO_T_HOST]);�%� INSQUE (.NSH, NQ);)� END;L��.� RCVIDX = .IDX_SAVE + .RDLENGTH;��� END;9� WHILE NOT REMQUE (.NQ [QUE_L_HEAD], NSH) DON%� INSQUE (.NSH, NSHQUE);S� END; � END@� ELSE IF .RCVHDR [NSMSG_V_RCODE] EQL IPNS_RC_NAMERR THEN� BEGINH� DBGPRT ('%NETLIB_MXLOOK, Name error with authoritative = !UL',/� .RCVHDR [NSMSG_V_AUTHORITATIVE]);C1� IF .RCVHDR [NSMSG_V_AUTHORITATIVE] THEN � BEGINP� MXCOUNT = 0;"� STATUS = SS$_IVADDR;� EXITLOOP;F� END; � END;� � END;S��� REQCOUNT = .REQCOUNT + 1;'� IF .REQCOUNT GEQ MAX_REQUESTS THEN, � BEGIN� STATUS = SS$_EXQUOTA;� EXITLOOP; � END;Y��� END;��� NET_DEASSIGN (IPCTX);A��3� WHILE NOT REMQUE (.NSHQUE [QUE_L_HEAD], NSH) DO�.� LIB$FREE_VM (%REF (NSHO_S_NSHODEF), NSH);��-� FREE_STRINGS (PHOST, PHSEG, NAME, NAME2);.�� � .STATUSa���END; ! DNS_MXLOOK_TRY � a�%SBTTL 'NAME_UNPACK'7�ROUTINE NAME_UNPACK (NAME_A, BUF_A, IDX_A) : NOVALUE = e�BEGIN �!++s�! FUNCTIONAL DESCRIPTION: �! B�! This routine unpacks a name from the response buffer, handlingC�! the relative-offset name segment references used for compactionr �! purposes.f�!M�! RETURNS: nothing�!a �! PROTOTYPE:�! #�! NAME_UNPACK name, buffer, indexr�!oD�! name: char_string, character string, write only, by descriptor3�! buffer: block of bytes, read only, by referencelH�! index: unsigned_longword, longword (unsigned), modify, by reference�! �! IMPLICIT INPUTS: None.��! �! IMPLICIT OUTPUTS: None.V�!i�! COMPLETION CODES: None.t�!e�! SIDE EFFECTS: None.h�!w�!--w��� BIND/� NAME = .NAME_A : BLOCK [DSC$K_S_BLN,BYTE],h%� BUF = .BUF_A : BLOCK [, BYTE], � IDX = .IDX_A;n�� � LOCAL $� SEG : BLOCK [DSC$K_S_BLN,BYTE],� I,O� XOFFSET : WORD, � OFFSET, � NSI;���&� SEG [DSC$B_DTYPE] = DSC$K_DTYPE_T;&� SEG [DSC$B_CLASS] = DSC$K_CLASS_S;!� STR$COPY_DX (NAME, %ASCID'');e� I = .BUF [.IDX,0,8,0];� IF .I EQLU 0 THENa � BEGIN � IDX = .IDX + 1;#� STR$COPY_DX (NAME, %ASCID'.');e � RETURN;� END;� WHILE .I LSSU 64 DO � BEGIN � IF .I EQLU 0 THEN � BEGIN� IDX = .IDX + 1;� RETURN; � END; � SEG [DSC$W_LENGTH] = .I;�.� SEG [DSC$A_POINTER] = BUF [.IDX+1,0,8,0];� STR$APPEND (NAME, SEG);"� STR$APPEND (NAME, %ASCID'.');� IDX = .IDX + .I + 1;T� I = .BUF [.IDX,0,8,0];l� END;)� BYTE_SWAP_UNPACK (XOFFSET, BUF, IDX);X!� OFFSET = .XOFFSET - %X'C000'; � NSI = .IDX;E� IDX = .OFFSET;� $INIT_DYNDESC (SEG); � NAME_UNPACK (SEG, BUF, IDX);� IDX = .NSI;O� STR$APPEND (NAME, SEG);x� STR$FREE1_DX (SEG);h���END; ! NAME_UNPACK� n�%SBTTL 'ADD_CNAME'J�ROUTINE ADD_CNAME (PHOST_A, RCVBUF_A, RCVIDX_A, NOW_A, TTL_A) : NOVALUE = �BEGINc�!++ �! FUNCTIONAL DESCRIPTION:,�!n'�! Adds a CNAME RR to the CNAME���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������P����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������������?������� table.e�! B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!P �! ADD_CNAME��! �! IMPLICIT INPUTS: None.��! �! IMPLICIT OUTPUTS: None. �!_�! COMPLETION CODES:u�!s2�! SS$_NORMAL: normal successful completion.�!��! SIDE EFFECTS:S�! �! None.��!--�� BIND2� PHOST = .PHOST_A : BLOCK [DSC$K_S_BLN,BYTE],� RCVBUF = .RCVBUF_A,� RCVIDX = .RCVIDX_A,(� NOW = .NOW_A : VECTOR [2,LONG],(� TTL = .TTL_A : VECTOR [2,LONG];�� � LOCAL=%� STR : BLOCK [DSC$K_S_BLN,BYTE], %� STR2 : BLOCK [DSC$K_S_BLN,BYTE], � TMP : VECTOR [2,LONG],� I;R��,� I = (INCR CI FROM 0 TO CNAMTAB_SIZE-1 DO� BEGIN?� IF NOT .CNAMTAB [.CI,CNAM_V_INUSE] THEN EXITLOOP .CI;DE� IF NOT LIB$SUB_TIMES (CNAMTAB [.CI,CNAM_Q_EXPDT], NOW, TMP)S� THEN EXITLOOP .CI;� END);��� INIT_DYNDESC (STR, STR2);M&� NAME_UNPACK (STR, RCVBUF, RCVIDX);� STR$UPCASE (STR2, STR); � IF .I GEQ 0 THEN � BEGIN 0� BIND CNAM = CNAMTAB [.I,0,0,0,0] : CNAMDEF;F� DBGPRT ('%NETLIB_MXLOOK, -- added to CNAMTAB, index [!UL]', .I);� CNAM [CNAM_V_INUSE] = 1;�C� CNAM [CNAM_L_NAME] = MIN (CNAM_S_NAME, .PHOST [DSC$W_LENGTH]);E:� CH$MOVE (.CNAM [CNAM_L_NAME], .PHOST [DSC$A_POINTER],� CNAM [CNAM_T_NAME]);%3� LIB$ADD_TIMES (NOW, TTL, CNAM [CNAM_Q_EXPDT]);,D� CNAM [CNAM_L_CNAME] = MIN (CNAM_S_CNAME, .STR2 [DSC$W_LENGTH]);:� CH$MOVE (.CNAM [CNAM_L_CNAME], .STR2 [DSC$A_POINTER],� CNAM [CNAM_T_CNAME]);� ENDU� ELSE2� DBGPRT ('%NETLIB_MXLOOK, -- CNAMTAB full!');� STR$COPY_DX (PHOST, STR2);� FREE_STRINGS (STR, STR2);����END; ! ADD_CNAME� N�%SBTTL 'ADD_MX'EL�ROUTINE ADD_MX (CURMXR_A, PHOST_A, PREF, NAME2_A, NOW_A, TTL_A) : NOVALUE = �BEGINO�!++T�! FUNCTIONAL DESCRIPTION:E�!,�! Adds an MX RR to MXTAB.T�! B�! RETURNS: cond_value, longword (unsigned), write only, by value�!$ �! PROTOTYPE:�!$ �! ADD_MX�!O�! IMPLICIT INPUTS: None. �!Q�! IMPLICIT OUTPUTS: None.S�!%�! COMPLETION CODES:R�!F2�! SS$_NORMAL: normal successful completion.�!I�! SIDE EFFECTS:E�!_ �! None. �!--=� BIND� CURMXR = .CURMXR_A,3� PHOST = .PHOST_A : BLOCK [DSC$K_S_BLN,BYTE],T3� NAME2 = .NAME2_A : BLOCK [DSC$K_S_BLN,BYTE],�)� NOW = .NOW_A : VECTOR [2,LONG],N)� TTL = .TTL_A : VECTOR [2,LONG];$�� � LOCALA� TMP : VECTOR [2,LONG];����� IF .CURMXR GEQ 0 THENE>� IF CH$EQL (.PHOST [DSC$W_LENGTH], .PHOST [DSC$A_POINTER],H� .MXTAB [.CURMXR, MX_L_NAME], MXTAB [.CURMXR, MX_T_NAME], %C' ')� THEN � BEGINC7� IF .MXTAB [.CURMXR,MX_L_COUNT] LSS MX_K_MAXMX THENP � BEGIN � BINDC3� MX = MXTAB [.CURMXR,0,0,0,0] : MXDEF, ,� I = MXTAB [.CURMXR,MX_L_COUNT],7� PREFS = MX [MX_AL_MXPREF] : VECTOR [,LONG],,7� LENGTH = MX [MX_AL_MXNAME] : VECTOR [,LONG],TH� NAME = MX [MX_AT_MXNAME] : BLOCKVECTOR [,MX_S_MXNAME,BYTE];��I� DBGPRT ('%NETLIB_MXLOOK, -- appending to MXTAB[!UL]', .CURMXR); � PREFS [.I] = .PREF;@� LENGTH [.I] = MIN (MX_S_MXNAME, .NAME2 [DSC$W_LENGTH]);K� CH$MOVE (.LENGTH [.I], .NAME2 [DSC$A_POINTER], NAME [.I,0,0,0,0]);X� I = .I + 1; � END;� � RETURN;� END;��/� CURMXR = (INCR MI FROM 0 TO MXTAB_SIZE-1 DO � BEGIN;� IF NOT .MXTAB [.MI,MX_V_INUSE] THEN EXITLOOP .MI; F� IF NOT LIB$SUB_TIMES (MXTAB [.MI,MX_Q_EXPDT], NOW, TMP) THEN� EXITLOOP .MI;X� E���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Q����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������Zu������F�������ND);��� IF .CURMXR GEQ 0 THENH � BEGINA � BIND 2� MX = MXTAB [.CURMXR,0,0,0,0] : MXDEF,6� PREFS = MX [MX_AL_MXPREF] : VECTOR [,LONG],6� LENGTH = MX [MX_AL_MXNAME] : VECTOR [,LONG],G� NAME = MX [MX_AT_MXNAME] : BLOCKVECTOR [,MX_S_MXNAME,BYTE];N��J� DBGPRT ('%NETLIB_MXLOOK, -- new MXTAB entry, index [!UL]', .CURMXR);� MX [MX_V_INUSE] = 1;�� MX [MX_L_COUNT] = 1;,>� MX [MX_L_NAME] = MIN (MX_S_NAME, .PHOST [DSC$W_LENGTH]);G� CH$MOVE (.MX [MX_L_NAME], .PHOST [DSC$A_POINTER], MX [MX_T_NAME]);H/� LIB$ADD_TIMES (NOW, TTL, MX [MX_Q_EXPDT]); � PREFS [0] = .PREF; ;� LENGTH [0] = MIN (MX_S_MXNAME, .NAME2 [DSC$W_LENGTH]);RE� CH$MOVE (.LENGTH [0], .NAME2 [DSC$A_POINTER], NAME [0,0,0,0,0]);E� ENDE� ELSE0� DBGPRT ('%NETLIB_MXLOOK, -- MXTAB full!');�� �END; ! ADD_MX � o�%SBTTL 'ADD_NULL' .�ROUTINE ADD_NULL (PHOST_A, NOW_A) : NOVALUE = �BEGINM�!++N�! FUNCTIONAL DESCRIPTION: �!;%�! Adds a NULL RR to the NULL table. �!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!L �! PROTOTYPE:�!: �! ADD_NULL�!C�! IMPLICIT INPUTS: None.��! �! IMPLICIT OUTPUTS: None. �!L�! COMPLETION CODES:r�!!2�! SS$_NORMAL: normal successful completion.�! �! SIDE EFFECTS:)�!� �! None.I�!--_� BIND2� PHOST = .PHOST_A : BLOCK [DSC$K_S_BLN,BYTE],(� NOW = .NOW_A : VECTOR [2,LONG];�� � LOCAL � TMP : VECTOR [2,LONG],� I;D��,� I = (INCR CI FROM 0 TO NULLTAB_SIZE-1 DO� BEGIN>� IF NOT .NULLTAB [.CI,NUL_V_INUSE] THEN EXITLOOP .CI;D� IF NOT LIB$SUB_TIMES (NULLTAB [.CI,NUL_Q_EXPDT], NOW, TMP)� THEN EXITLOOP .CI;� END);��1� IF .ONEHR [0] EQL 0 AND .ONEHR [1] EQL 0 THENr:� $BINTIM (TIMBUF=%ASCID'0 01:00:00.00', TIMADR=ONEHR);��� IF .I GEQ 0 THEN � BEGINL.� BIND NUL = NULLTAB [.I,0,0,0,0] : NULDEF;F� DBGPRT ('%NETLIB_MXLOOK, -- added to NULLTAB, index [!UL]', .I);� NUL [NUL_V_INUSE] = 1; @� NUL [NUL_L_NAME] = MIN (NUL_S_NAME, .PHOST [DSC$W_LENGTH]);8� CH$MOVE (.NUL [NUL_L_NAME], .PHOST [DSC$A_POINTER],� NUL [NUL_T_NAME]);G3� LIB$ADD_TIMES (NOW, ONEHR, NUL [NUL_Q_EXPDT]);Q� END_� ELSE2� DBGPRT ('%NETLIB_MXLOOK, -- NULLTAB full!');���END; ! ADD_NULLA� �%SBTTL 'GET_NAMESERVERS'*�GLOBAL ROUTINE GET_NAMESERVERS (NSHQ_A) = �BEGINE�!++O�! FUNCTIONAL DESCRIPTION: �!H2�! Fetches the names of some domain name servers.�!HB�! RETURNS: cond_value, longword (unsigned), write only, by value�! �! PROTOTYPE:�!��! GET_NAMESERVERS �! �! IMPLICIT INPUTS: None.]�!S�! IMPLICIT OUTPUTS: None.D�!R�! COMPLETION CODES:s�!g2�! SS$_NORMAL: normal successful completion.�!_�! SIDE EFFECTS:T�!S �! None.D�!-- � BIND � NSHQUE = .NSHQ_A : QUEDEF;��@� TABLE (LNMTAB, 'NETLIB_NAMESERVERS', 'MULTINET_NAMESERVERS',9� 'TCPWARE_NAMESERVERS', 'TCPIP_NAMESERVERS',E=� 'NETLIB_CMU064_NAMESERVERS','UCX$BIND_SERVER');S�� � LOCAL &� LNMLST1 : $ITMLST_DECL (ITEMS=1),&� LNMLST2 : $ITMLST_DECL (ITEMS=2),� LNMCOUNT: VOLATILE,� NSHLEN : VOLATILE WORD,�+� NSHNAME : VOLATILE VECTOR [255, BYTE], � NSH : REF NSHODEF, � STATUS;��#� $ITMLST_INIT (ITMLST = LNMLST1,,?� (ITMCOD = LNM$_MAX_INDEX, BUFADR = LNMCOUNT, BUFSIZ = 4)); &� INCR I FROM 0 TO LNMTAB_COUNT-1 DO � BEGIN.3� STATUS = $TRNLNM (TABNAM = %ASCID'LNM$SYSTEM',T2� LOGNAM = .LNMTAB [.I], ITMLST = LNMLST1);6� IF .STATUS AND (.LNMCOUNT LSS 0) THEN���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������R����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB_MXLOOK.B32;27���������������������������������������������������������������������������������������������������P�����P�������������������������������M������� STATUS = 0;� IF .STATUS THEN � BEGING� IF .I EQL LNMTAB_COUNT-1 THEN ! UCX is different (of course) � BEGIN2� LOCAL LOGNAM : BLOCK [DSC$K_S_BLN,BYTE]; � INIT_DYNDESC (LOGNAM);!� INCR J FROM 0 TO 999 DOR� BEGIN�G� LIB$SYS_FAO (%ASCID'UCX$BIND_SERVER!3ZL', 0, LOGNAM, .J); +� $ITMLST_INIT (ITMLST=LNMLST2,0?� (ITMCOD=LNM$_INDEX, BUFADR=UPLIT (0), BUFSIZ=4), 3� (ITMCOD=LNM$_STRING, BUFADR=NSHNAME, A� BUFSIZ=%ALLOCATION (NSHNAME), RETLEN=NSHLEN));M:� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',.� LOGNAM=LOGNAM, ITMLST=LNMLST2);+� IF NOT .STATUS THEN EXITLOOP; 6� LIB$GET_VM (%REF (NSHO_S_NSHODEF), NSH);<� CH$MOVE (.NSHLEN, NSHNAME, NSH [NSHO_T_HOST]);*� NSH [NSHO_W_HOST] = .NSHLEN;2� INSQUE (.NSH, .NSHQUE [QUE_L_TAIL]);� END; � FREE_STRINGS (LOGNAM); � END � ELSE � BEGIN'� INCR J FROM 0 TO .LNMCOUNT DO � BEGIN�+� $ITMLST_INIT (ITMLST=LNMLST2,S7� (ITMCOD=LNM$_INDEX, BUFADR=J, BUFSIZ=4),N3� (ITMCOD=LNM$_STRING, BUFADR=NSHNAME, A� BUFSIZ=%ALLOCATION (NSHNAME), RETLEN=NSHLEN)); :� STATUS = $TRNLNM (TABNAM=%ASCID'LNM$SYSTEM',4� LOGNAM=.LNMTAB [.I], ITMLST=LNMLST2);� IF .STATUS THEN0� BEGIN 7� LIB$GET_VM (%REF (NSHO_S_NSHODEF), NSH); =� CH$MOVE (.NSHLEN, NSHNAME, NSH [NSHO_T_HOST]);,+� NSH [NSHO_W_HOST] = .NSHLEN;C3� INSQUE (.NSH, .NSHQUE [QUE_L_TAIL]);X� END;� END;� END;� RETURN SS$_NORMAL;� � END;E� END;��� 0N���END; ! GET_NAMESERVERS���END �ELUDOM BEGIN��� LOCAL � RCVHDR : NSMSGDEF,� RDLENGTH : WORD,N� TYPE : WORD,� QDCOUNT : WORD, � AN��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������S����������������������������������NETLIB_SRC.BCK�����������������B����[NETLIB]NETLIB_INSTALL.COM;32��������������������������������������������������������������������������������������������������U������������������������������~���������������*�[NETLIB]NETLIB_INSTALL.COM;32�+��,�B���.�����/� �@� �4�U���������������������������-�����0���1����2���3������K��P���W���O�����5���6�q*L��7�'+L��8�dh��9����������G� �@��H��J������ �������������$! [NETLIB]NETLIB_INSTALL.COM��$!.�$! KITINSTAL procedure for installing NETLIB.�$!0�$! 31-JAN-1991 V1.0 Madison Initial coding.M�$! 05-FEB-1991 V1.0-1 Madison Two parts for integration into other kits.�6�$! 26-APR-1991 V1.0-2 Madison Nameserver changes.I�$! 20-JUN-1991 V1.0-3 Madison Newer versions of some pkgs supported.�L�$! 03-DEC-1991 V1.0-4 Madison A bit of rearranging of the startup file.4�$! 01-FEB-1992 V1.1 Volz Added TCPware support.2�$! 17-FEB-1992 V1.1-1 Madison LINK/NOUSERLIB.+�$! 08-OCT-1992 V1.2 Madison Alpha AXP.�M�$! 19-FEB-1993 V1.2-1 Madison Accommodate TCPware V3.0 filename changes.�C�$! 22-MAR-1993 V1.2-2 Madison TCPware now runs on AXP systems.�L�$! 26-MAR-1993 V1.2-3 Madison Eliminate IP0/IPA0 confusion for CMU-Tek.�$!)�$ ON CONTROL_Y THEN GOTO NETLIB_CONTROL_Y�"�$ ON WARNING THEN GOTO NETLIB_FAIL�$!�$ GOTO NETLIB_INSTALL��$!�$NETLIB_CONTROL_Y:=�$ IF F$TRNLNM ("NETLIB_STUP") .NES. "" THEN CLOSE NETLIB_STUP��$ VMI$CALLBACK CONTROL_Y�$! �$NETLIB_FAIL:��$ NETLIB_STATUS == $STATUS=�$ IF F$TRNLNM ("NETLIB_STUP") .NES. "" THEN CLOSE NETLIB_STUP��$ EXIT 'NETLIB_STATUS��$!�$NETLIB_INSTALL:�$!�$ IF P2 THEN SET VERIFY��$! �$ NETLIB_SAY := WRITE SYS$OUTPUT�$ LINK := LINK/NOUSERLIBRARY�$!-�$ NETLIB_INSTALL_NODE = F$GETSYI ("NODENAME")��$!�$!%�$! Build the tables for menu choices.��$!�$ IF NETLIB_VAX��$ THEN�$ NETLIB_TCP_NAMES = "?" +-�� ":CMU-Tek TCP/IP V6.4"+-�&� ":CMU-Tek TCP/IP V6.5 or later"+-.� ":DEC VMS/ULTRIX Connection (UCX) V1.2"+-?� ":DEC UCX V1.3 or TCP/IP Services for VMS V2.0 or later"+-�$� ":TGV MultiNet V2.2 or later"+-� ":PSC TCPware"�I�$ NETLIB_TCPS = "?:NETLIB_CMU064:NETLIB_CMU:NETLIB_UCX012:NETLIB_UCX"+-�/� ":NETLIB_MULTINET:NETLIB_TCPWARE"��$ OLB = ".OLB"�$ OPT = ".OPT"�$ OBJ = ".OBJ"�$ ELSE�$ NETLIB_TCP_NAMES = "?" +-�%� ":DEC TCP/IP Services for VMS"+-�$� ":TGV MultiNet V3.2 or later"+-� ":PSC TCPware"�?�$ NETLIB_TCPS = "?:NETLIB_UCX:NETLIB_MULTINET:NETLIB_TCPWARE"��$ NETLIB_CMU064 = ""�$ NETLIB_CMU = ""��$ NETLIB_UCX012 = ""�$ OLB = ".ALPHA_OLB"�$ OPT = ".ALPHA_OPT"�$ OBJ = ".ALPHA_OBJ"�$ ENDIF��$ NETLIB_I = 0�$NETLIB_INIT_LOOP:�$ NETLIB_I = NETLIB_I + 1�3�$ NETLIB_TCP = F$ELEMENT (NETLIB_I,":",NETLIB_TCPS)�8�$ IF NETLIB_TCP .EQS. ":" THEN GOTO NETLIB_END_INIT_LOOP�$ 'NETLIB_TCP = " "��$ GOTO NETLIB_INIT_LOOP��$!@�$! Now we make some educated guesses about which TCP/IP's should�$! be pre-selected.��$!�$NETLIB_END_INIT_LOOP:�$!�$ IF F$GETDVI ("IP0","EXISTS")�$ THEN�$!-�$! Don't confuse with TCPware's IPA0: device��$!.�$ IF F$GETDVI ("IP0","DEVNAM") .EQS. "_IP0:"�$ THEN)�$ IF F$TRNLNM ("CMUTEK_ROOT") .NES. ""� �$ THEN��$ NETLIB_CMU = "*"� �$ ELSE��$ NETLIB_CMU064 = "*" �$ ENDIF �$ ENDIF��$ ENDIF�-�$ IF F$GETDVI ("UCX$DEVICE","EXISTS") .AND. -�5� F$SEARCH ("SYS$SYSTEM:UCX$INETACP.EXE") .NES. ""��$ THEN<�$ IF F$SEARCH ("SYS$SYSTEM:UCX$INET_ROUTING.EXE") .NES. ""������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������T����������������������������������NETLIB_SRC.BCK�����������������B����[NETLIB]NETLIB_INSTALL.COM;32��������������������������������������������������������������������������������������������������U������������������������������Wr��������������$ THEN�$ NETLIB_UCX = "*"��$ ELSE�$ NETLIB_UCX012 = "*" �$ ENDIF��$ ENDIF� �$ IF F$GETDVI ("INET0","EXISTS")�$ THEN!�$ IF F$GETDVI ("TCP0","EXISTS")��$ THEN�$ NETLIB_TCPWARE = "*"��$ ELSE�$ NETLIB_MULTINET = "*" �$ ENDIF��$ ENDIF��$!�$NETLIB_SELECT_MENU:�$!�$ TYPE SYS$INPUT:���/� TCP/IP Support Selection���A� Select the NETLIB TCP/IP support you wish to install from the�C� menu below. An asterisk appears next to the packages that have�B� already been selected. You can remove a package from the listA� by selecting it again. You may enter more than one selection�+� by separating your choices with commas.����$ NETLIB_M = 0�$NETLIB_SEL_LOOP:��$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)3�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_SELECT_ASK�1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)�I�$ NETLIB_SAY F$FAO (" !2UL. [!AS] !AS", NETLIB_M, 'NETLIB_T, NETLIB_N)��$ GOTO NETLIB_SEL_LOOP�$NETLIB_SELECT_ASK:��$ NETLIB_SAY ""�3�$ NETLIB_SAY F$FAO (" !2UL. Exit", NETLIB_M)��$ NETLIB_SAY ""��$ NETLIB_SAY ""��$!*�$ VMI$CALLBACK ASK NETLIB_CHOICE_INPUT -&� " Your choice" "''NETLIB_M'"�$ NETLIB_I = -1��$NETLIB_PARSE_LOOP:��$ NETLIB_I = NETLIB_I + 1�@�$ NETLIB_CHOICE = F$ELEMENT (NETLIB_I, ",", NETLIB_CHOICE_INPUT)9�$ IF NETLIB_CHOICE .EQS. "," THEN GOTO NETLIB_SELECT_MENU�+�$ NETLIB_CHOICE = F$INTEGER (NETLIB_CHOICE)�9�$ IF NETLIB_CHOICE .EQ. NETLIB_M THEN GOTO NETLIB_CONFIRM�:�$ IF NETLIB_CHOICE .LT. 1 .OR. NETLIB_CHOICE .GT. NETLIB_M�$ THEN&�$ VMI$CALLBACK MESSAGE E BADCHOICE -L� "Choice ''NETLIB_CHOICE' invalid; choices range from 1 to ''NETLIB_M'."�$ ELSE:�$ NETLIB_T = F$ELEMENT (NETLIB_CHOICE, ":", NETLIB_TCPS)�$ IF 'NETLIB_T .EQS. "*"�$ THEN�$ 'NETLIB_T = " "�$ ELSE�$ 'NETLIB_T = "*" �$ ENDIF��$ ENDIF��$ GOTO NETLIB_PARSE_LOOP�$!�$NETLIB_CONFIRM:�$ NETLIB_SAY ""�B�$ NETLIB_SAY " You have selected the following TCP/IP support:"�$ NETLIB_SAY ""��$ NETLIB_CNT = 0�$ NETLIB_M = 0�$NETLIB_CONF_LOOP:�$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)1�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_CONF_ASK�1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)��$ IF 'NETLIB_T .EQS. "*"�$ THEN�$ NETLIB_PRI = NETLIB_M�"�$ NETLIB_SAY " ",NETLIB_N�$ NETLIB_CNT = NETLIB_CNT + 1��$ ENDIF��$ GOTO NETLIB_CONF_LOOP��$!�$NETLIB_CONF_ASK:�7�$ IF NETLIB_CNT .EQ. 0 THEN NETLIB_SAY " (None)"��$ NETLIB_SAY ""��$ NETLIB_SAY ""�6�$ VMI$CALLBACK ASK NETLIB_OK "Is this correct" "YES" B1�$ IF .NOT. NETLIB_OK THEN GOTO NETLIB_SELECT_MENU��$!�$ IF NETLIB_CNT .EQ. 0�$ THEN>�$ VMI$CALLBACK MESSAGE I WONTINSTALL "No packages selected."�$ EXIT VMI$_SUCCESS��$ ENDIF��$!/�$ IF NETLIB_CNT .EQ. 1 THEN GOTO NETLIB_DIR_ASK��$!�$NETLIB_PRIMARY_MENU:��$!�$ TYPE SYS$INPUT:���?� You have selected support for more than one TCP/IP package.�=� You must now select which is to be used by default on the�� current system.����$ NETLIB_M = 0�$NETLIB_PRI_LOOP:��$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)4�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_PRIMARY_ASK1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)�2�$ IF 'NETLIB_T .EQS. " " THEN GOTO NETLIB_PRI_LOOP8�$ NETLIB_SAY F$FAO (" !2UL. !AS", NETLIB_M, NETLIB_N)�$ GOTO NETLIB_PRI_LOOP�$!�$NETLIB_PRIMARY_ASK:�$!�$ NETLIB_SAY ""��$ NETLIB_SAY ""�3�$ VMI$CALLBACK ASK NETLIB_TMP " Your choice"��$!%�$ NE���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������U����������������������������������NETLIB_SRC.BCK�����������������B����[NETLIB]NETLIB_INSTALL.COM;32��������������������������������������������������������������������������������������������������U�������������������������������������������TLIB_PRI = F$INTEGER (NETLIB_TMP)�4�$ IF NETLIB_PRI .LT. 1 .OR. NETLIB_PRI .GE. NETLIB_M�$ THENP�$ VMI$CALLBACK MESSAGE W SELRANGE "Selection out of range. Please try again."�$ GOTO NETLIB_PRIMARY_MENU�$ ENDIF�3�$ NETLIB_T = F$ELEMENT (NETLIB_PRI,":",NETLIB_TCPS)��$ IF 'NETLIB_T .NES. "*"�$ THENU�$ VMI$CALLBACK MESSAGE W UNAVAIL "That choice is not available. Please try again."��$ GOTO NETLIB_PRIMARY_MENU�$ ENDIF��$!�$NETLIB_DIR_ASK:�$!�$ NETLIB_SAY ""�8�$ NETLIB_SAY " Default TCP/IP transport will be: ", -0� F$ELEMENT (NETLIB_PRI,":",NETLIB_TCP_NAMES)�$!�$ TYPE SYS$INPUT:�����!� Choosing the NETLIB Directory���=� The NETLIB libraries may go in either SYS$COMMON:[SYSLIB]�(� or some other directory you specify.��&�$ NETLIB_DEFANS := SYS$COMMON:[SYSLIB],�$ IF F$TRNLNM ("NETLIB_DIR") .NES. "" THEN -+� NETLIB_DEFANS = F$TRNLNM ("NETLIB_DIR")��$ VMI$CALLBACK ASK NETLIB_DIR -�D� "Where should the NETLIB libraries be placed" "''NETLIB_DEFANS'"1�$ NETLIB_DIR = F$PARSE (NETLIB_DIR,,,"DEVICE") +-�'� F$PARSE (NETLIB_DIR,,,"DIRECTORY")�2�$ IF F$SEARCH ("''NETLIB_DIR'X.X") .EQS. "" THEN -4� VMI$CALLBACK CREATE_DIRECTORY USER 'NETLIB_DIR -2� "/OWNER=[1,4]/PROTECT=(S:RWE,O:RWE,G:RE,W:E)"�$!#�$ CREATE VMI$KWD:NETLIB_STARTUP.COM�4�$ OPEN/APPEND NETLIB_STUP VMI$KWD:NETLIB_STARTUP.COM �$ NETLIB_W = "WRITE NETLIB_STUP".�$ NETLIB_W "$! SYS$STARTUP:NETLIB_STARTUP.COM"F�$ NETLIB_W "$! Startup command procedure for NETLIB library routines."�$ NETLIB_W "$!"�@�$ NETLIB_W "$ DEFINE/SYSTEM/EXEC/NOLOG NETLIB_DIR ''NETLIB_DIR'"�$ IF NETLIB_CMU064 .EQS. "*"�$ THENE�$ NETLIB_W "$ DEFINE/SYSTEM/EXEC/NOLOG NETLIB_CMU064_NAMESERVERS -"�H�$ NETLIB_W " ""c.nyser.net"",""terp.umd.edu"",""ns.nasa.gov"",-"(�$ NETLIB_W " ""ns.nic.ddn.mil"""�$ ENDIF��$!�$ NETLIB_W "$!"�@�$ NETLIB_W "$ IF F$TRNLNM (""NETLIB_SHRXFR"") .NES. """" THEN -"I�$ NETLIB_W " IF F$FILE_ATTR (""NETLIB_SHRXFR:.EXE"",""KNOWN"") THEN -"�/�$ NETLIB_W " INSTALL REMOVE NETLIB_SHRXFR"�=�$ NETLIB_W "$ IF F$TRNLNM (""NETLIB_SHR"") .NES. """" THEN -"�F�$ NETLIB_W " IF F$FILE_ATTR (""NETLIB_SHR:.EXE"",""KNOWN"") THEN -",�$ NETLIB_W " INSTALL REMOVE NETLIB_SHR"�$ NETLIB_W "$!N�$ NETLIB_W "$ DEFINE/SYSTEM/EXEC/NOLOG NETLIB_SHRXFR NETLIB_DIR:NETLIB_SHRXFR"1�$ NETLIB_W "$ CALL DO_INSTALL NETLIB_SHRXFR:.EXE"��$!A�$ VMI$CALLBACK MESSAGE I LINKING "Linking image NETLIB_SHRXFR..."�H�$ LINK/SHARE=VMI$KWD:NETLIB_SHRXFR.EXE VMI$KWD:NETLIB_INSTALL'OPT'/OPT,-@� VMI$KWD:NETLIB_SHRXFR'OBJ',VMI$KWD:NETLIB_SHRXFR.VERSION/OPT/�$ SET PROTECTION=W:RE VMI$KWD:NETLIB_SHRXFR.EXE�H�$ VMI$CALLBACK PROVIDE_IMAGE NETLIB_IMGOK NETLIB_SHRXFR.EXE 'NETLIB_DIR'�$!@�$ NETLIB_W "$ DEFINE/SYSTEM/EXEC/NOLOG NETLIB_SHR NETLIB_DIR:",-3� F$ELEMENT (NETLIB_PRI,":",NETLIB_TCPS), "_SHR"��$!�$ NETLIB_I = 0�$NETLIB_INST_LOOP:�$ NETLIB_I = NETLIB_I + 1�1�$ NETLIB_T = F$ELEMENT (NETLIB_I,":",NETLIB_TCPS)�7�$ IF NETLIB_T .EQS. ":" THEN GOTO NETLIB_FINISH_INSTALL��$ IF 'NETLIB_T .EQS. "*"�$ THEN?� NETLIB_W "$ CALL DO_INSTALL NETLIB_DIR:''NETLIB_T'_SHR.EXE"�E�$ VMI$CALLBACK MESSAGE I LINKING "Linking image ''NETLIB_T'_SHR..."��$ NETLIB_L = ""��$ NETLIB_V = NETLIB_T�@�$ IF F$LOCATE ("CMU",NETLIB_T) .LT. F$LENGTH (NETLIB_T) THEN -;� NETLIB_L = ",''NETLIB_T'_ERRORS''OPT'/OPT" - "NETLIB_"�K�$ LINK/SHARE=VMI$KWD:'NETLIB_T'_SHR.EXE VMI$KWD:NETLIB_INSTALL'OPT'/OPT,-�I� VMI$KWD:'NETLIB_V'.VERSION/OPT,VMI$KWD:'NETLIB_T''OLB'/LIB'NETLIB_L'�2�$ SET PROTECTION=W:RE VMI$KWD:'NETLIB_T'_SHR.EXEK�$ VMI$CALLBACK PROVIDE_IMAGE���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������V����������������������������������NETLIB_SRC.BCK�����������������B����[NETLIB]NETLIB_INSTALL.COM;32��������������������������������������������������������������������������������������������������U������������������������������n������������� NETLIB_IMGOK 'NETLIB_T'_SHR.EXE 'NETLIB_DIR'��$ ENDIF��$ GOTO NETLIB_INST_LOOP��$!�$NETLIB_FINISH_INSTALL:��$!�$ NETLIB_W "$ EXIT"��$ NETLIB_W "$!"�$�$ NETLIB_W "$DO_INSTALL: SUBROUTINE"�$ NETLIB_W "$ CMD := CREATE"F�$ NETLIB_W "$ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������>�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1�����������������������������������������������������������������������������������������������������������H�������������������������|�����������IF F$FILE_ATTRIBUTES (P1,""KNOWN"") THEN CMD := REPLACE"2�$ NETLIB_W "$ INSTALL 'CMD'/OPEN/SHARE/HEADER 'P1"�$ NETLIB_W "$ ENDSUBROUTINE"�$ CLOSE NETLIB_STUP�U�$ VMI$CALLBACK PROVIDE_FILE NETLIB_STUPFILE NETLIB_STARTUP.COM VMI$ROOT:[SYS$STARTUP]�?�$ VMI$CALLBACK PROVIDE_FILE NETLIB_OK NETLIBDEF.R32 'NETLIB_DIR�?�$ VMI$CALLBACK PROVIDE_FILE NETLIB_OK NETLIBDEF.L32 'NETLIB_DIR��$!6�$ IF NETLIB_CMU064 .EQS. "*" .OR. NETLIB_CMU .EQS. "*"�$ THEN0�$ IF F$INTEGER (F$GETSYI ("MAXBUF")) .LT. 2300�$ THEN�$ TYPE SYS$INPUT:��� -- WARNING --���H� NETLIB support for CMU-Tek TCP/IP requires that the SYSGEN parameter#� MAXBUF be set to at least 2300.���G�$ NETLIB_SAY " MAXBUF is currently set to: ", F$GETSYI ("MAXBUF")��$ TYPE SYS$INPUT:��F� Please remember to change the value of MAXBUF before attempting to7� use a NETLIB-based application over CMU-Tek TCP/IP.��� �$ ENDIF��$ ENDIF��$!�$ NETLIB_STATUS == VMI$_SUCCESS��$!�$ EXIT 'NETLIB_STATUS�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������W����������������������������������NETLIB_SRC.BCK�����������������C����[NETLIB]NETLIB_INSTALL.OPT;2���������������������������������������������������������������������������������������������������3����� �������������������������F���������������*�[NETLIB]NETLIB_INSTALL.OPT;2�+��,�C���.� ����/� �@� �4�3��� ������������������������-�����0���1����2���3������K��P���W���O� ����5�A��6� :;��7�q��8�dh��9����������G� �@��H��J��������������������GSMATCH=LEQUAL,1,03�CLUSTER=$$NETLIB_VECTOR,,,VMI$KWD:NETLIB_VECTOR.OBJ��CLUSTER=CLUSTER1���PSECT_ATTR=$CODE$,PIC,SHR��PSECT_ATTR=$PLIT$,PIC,SHR�&�COLLECT = CLUSTER1,$CODE$,$CODE,$PLIT$�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������X����������������������������������NETLIB_SRC.BCK�����������������F����"[NETLIB]NETLIB_MULTINET.VERSION;11�������������������������������������������������������������������������������������������������� �������������������������!��������������"�*�[NETLIB]NETLIB_MULTINET.VERSION;11�+��,�F���.� ����/� �@� �4���� ������������������������-�����0���1����2���3������K��P���W���O� ����5���6�fRw$��7�f$��8�Kdh��9����������G� �@��H��J������������������������������IDENT="V1.5-1"�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Y����������������������������������NETLIB_SRC.BCK�����������������l����[NETLIB]NETLIB_UCX.VERSION;10������������������������������������������������������������������������������������������������������� �������������������������E���������������*�[NETLIB]NETLIB_UCX.VERSION;10�+��,�l���.� ����/� �@� �4���� ������������������������-�����0���1����2���3������K��P���W���O� ����5� ��6���7�e��8�&fh��9����������G� �@��H��J�������������������IDENT="V1.4-1"�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Z����������������������������������NETLIB_SRC.BCK�����������������V���� [NETLIB]NETLIB_NULL_MXLOOK.B32;1�����������������������������������������������������������������������������������������������L����� �������������������������Z%�������������� �*�[NETLIB]NETLIB_NULL_MXLOOK.B32;1�+��,�V���.� ����/� �@� �4�L��� ������������������������-�����0���1����2���3������K��P���W���O� ����5� ��6�ȿ7��7�ɦ��8�f/eh��9����������G� �@��H��J��� �������������%TITLE 'NETLIB_NULL_MXLOOK'�(�MODULE NETLIB_NULL_MXLOOK (IDENT='V1.0',J� ADDRESSING_MODE (EXTERNAL=LONG_RELATIVE,NONEXTERNAL=LONG_RELATIVE)) =�BEGIN��!++��! FACILITY: NETLIB��!�&�! ABSTRACT: Dummy MXLOOK routine.�!��!��! MODULE DESCRIPTION:��!�C�! This module contains a routine that looks up mail exchange (MX)�<�! records for a particular host name. For UCX V1.2 or any8�! TCP/IP that does not support the Domain Name System.�!��!��! AUTHOR: M. Madison�A�! COPYRIGHT 1990, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 03-APR-1990��!��! MODIFICATION HISTORY:��!�?�! 03-APR-1990 V1.0 Madison Initial coding (null routine).��!--���"� LIBRARY 'SYS$LIBRARY:STARLET';��� FORWARD ROUTINE�� DNS_MXLOOK;� ��%SBTTL 'DNS_MXLOOK'�G�GLOBAL ROUTINE DNS_MXLOOK (QHDESC_A, MXMAX_A, MXCOUNT_A, MXNSTRUC_A) = ��BEGIN��!++��! FUNCTIONAL DESCRIPTION:��!�@�! This routine does nothing but return a 0 count to caller and'�! return a status of SS$_UNSUPPORTED.��!�@�! The MXNAMES structure is an array of records like (in PL/I):�! DECLARE 1 MXNAMES (n),�4�! 2 PREFERENCE_VALUE FIXED BINARY (31),4�! 2 HOST_NAME_LENGTH FIXED BINARY (31),+�! 2 HOST_NAME CHARACTER (128);��!�;�! i.e, two longwords and a 128-byte string. No more than�2�! MXMAX names are ever returned by this routine.�!�B�! RETURNS: cond_value, longword (unsigned), write only, by value�!� �! PROTOTYPE:�!�0�! DNS_MXLOOK qhname, mxmax, mxcount, mxnstruc�!�C�! qhname: char_string, character string, read only, by descriptor�K�! mxmax: unsigned_longword, longword (unsigned), read only, by reference�L�! mxcount: unsigned_longword, longword (unsigned), write only, by referenceG�! mxnstruc: mxname_struc, longword (unsigned), write only, by reference��!��! IMPLICIT INPUTS: None.��!��! IMPLICIT OUTPUTS: None.��!��! COMPLETION CODES:��!�2�! SS$_NORMAL: normal successful completion.$�! Other codes possible.�!��! SIDE EFFECTS: None.��!��!--���� .MXCOUNT_A = 0;���� SS$_UNSUPPORTED����END; ! DNS_MXLOOK����END��ELUDOM����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������[����������������������������������NETLIB_SRC.BCK�����������������Z����ETLIB]NETLIB_SHRXFR.B32;7����������������������������������������������������������������������������������������������������F����� �������������������������{���������������*�[NETLIB]NETLIB_SHRXFR.B32;7�+��,�Z���.� ����/� �@� �4�F��� �����������������������-�����0���1����2���3������K��P���W���O� ����5���6�Ȗdg��7��eg��8�feh��9����������G� �@��H��J�������� �������������%TITLE 'NETLIB_SHRXFR'%�MODULE NETLIB_SHRXFR (IDENT='V1.1') =��BEGIN��!++��! FACILITY: NETLIB_SHRXFR�!�.�! ABSTRACT: Transfer routines for NETLIB.�!��! MODULE DESCRIPTION:��!�?�! NETLIB is an interface library to underlying TCP/IP network�F�! services. The interface library is provided as a shareable image.�!�A�! This additional layer of transfer routines is needed to allow�C�! the appropriate interface library to be substituted on the fly.�B�! Programs should be linked against NETLIB_SHRXFR. The routinesD�! in the SHRXFR library in turn map in the NETLIB_SHR routines for?�! your TCP/IP transport. This way, programs won't break when��! you change transports.�!��! AUTHOR: M. Madison�A�! COPYRIGHT 1991, RENSSELAER POLYTECHNIC INSTITUTE.�"�! ALL RIGHTS RESERVED.�!��! CREATION DATE: 29-JAN-1991��!��! MODIFICATION HISTORY:��!�0�! 29-JAN-1991 V1.0 Madison Initial coding.;�! 04-DEC-1991 V1.1 Madison Add NET_SET_TRACE_ROUTINE.��!--���"� LIBRARY 'SYS$LIBRARY:STARLET';��� EXTERNAL ROUTINE=� LIB$FIND_IMAGE_SYMBOL : BLISS ADDRESSING_MODE (GENERAL);���� EXTERNAL LITERAL� LIB$_FATERRLIB;�� � BUILTIN� � CALLG;��� � MACRO�� TRANSFER (RTN) =�� GLOBAL ROUTINE RTN =�� BEGIN/� BUILTIN ACTUALCOUNT, ACTUALPARAMETER;�#� OWN RTNADR : INITIAL (0);�2� LOCAL STATUS, ARGLST : VECTOR [16,LONG]; � IF .RTNADR EQLA 0 THEN� BEGIN�A� STATUS = LIB$FIND_IMAGE_SYMBOL (%ASCID'NETLIB_SHR',�-� %ASCID %STRING (RTN), RTNADR);�<� IF NOT .STATUS THEN SIGNAL (LIB$_FATERRLIB, 0,� .STATUS);� END;/� ARGLST [0] = MIN (ACTUALCOUNT(), 15);�)� INCR I FROM 1 TO .ARGLST [0] DO�� BEGIN�1� ARGLST [.I] = ACTUALPARAMETER (.I);�� END;!� CALLG (ARGLST, .RTNADR)�� END%;��� TRANSFER (NET_ASSIGN);� TRANSFER (NET_BIND);� TRANSFER (NET_DEASSIGN);� TRANSFER (NET_GET_ADDRESS);� � TRANSFER (NET_ADDR_TO_NAME);� TRANSFER (NET_GET_INFO); � TRANSFER (NET_GET_HOSTNAME);%� TRANSFER (NET_SET_TRACE_ROUTINE);�� TRANSFER (TCP_CONNECT);� � TRANSFER (TCP_CONNECT_ADDR);� TRANSFER (TCP_DISCONNECT);� TRANSFER (TCP_ACCEPT);� TRANSFER (TCP_SEND);� TRANSFER (TCP_RECEIVE);�� TRANSFER (TCP_GET_LINE);� TRANSFER (UDP_SEND);� TRANSFER (UDP_RECEIVE);�� TRANSFER (DNS_MXLOOK);���END��ELUDOM��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������\����������������������������������NETLIB_SRC.BCK�����������������]����[NETLIB]NETLIB_SHRXFR.VERSION;4����������������������������������������������������������������������������������������������������� �������������������������M���������������*�[NETLIB]NETLIB_SHRXFR.VERSION;4�+��,�]���.� ����/� �@� �4���� ����"��������������������-�����0���1����2���3������K��P���W���O� ����5�A��6�b6��7���8�eh��9����������G� �@��H��J�����������������NAME=NETLIB_SHRXFR �IDENT="V1.0"�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]����������������������������������NETLIB_SRC.BCK�����������������n����[NETLIB]NETLIB_UCX012.VERSION;3������������������������������������������������������������������������������������������������ ����� ������������������������� #���������������*�[NETLIB]NETLIB_UCX012.VERSION;3�+��,�n���.� ����/� �@� �4� ��� ������������������������-�����0���1����2���3������K��P���W���O� ����5���6�y��7�& ��8�fv0fh��9����������G� �@��H��J���������������� �IDENT="V1.3"���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1�����������������������������������������������������������������������������������������������������������H������������������������ri�|�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������^����������������������������������NETLIB_SRC.BCK�����������������{����"[NETLIB]NETLIB_USER_INSTALL.COM;17���������������������������������������������������������������������������������������������T������������������������������J��������������"�*�[NETLIB]NETLIB_USER_INSTALL.COM;17�+��,�{���.�����/� �@� �4�T���������������������������-�����0���1����2���3������K��P���W���O�����5���6�έM��7� M��8�ffh��9����������G� �@��H��J����������������� ������������"�$! [NETLIB]NETLIB_USER_INSTALL.COM�$!1�$! Procedure for private installation of NETLIB.� �$! To use:��$!0�$! $ CREATE/DIRECTORY [some working directory]&�$! $ SET DEFAULT [working directory]!�$! $ BACKUP NETLIBvvu.B/SAVE []��$! $ @NETLIB_USER_INSTALL��$!0�$! 08-FEB-1991 V1.0 Madison Initial coding.4�$! 01-FEB-1992 V1.1 Volz Added TCPware support.>�$! 19-FEB-1993 V1.2 Madison AXP support, TCPware updates.C�$! 22-MAR-1993 V1.2-1 Madison TCPware now runs on AXP systems.�L�$! 26-MAR-1993 V1.2-2 Madison Eliminate IP0/IPA0 confusion for CMU-Tek.�$!)�$ ON CONTROL_Y THEN GOTO NETLIB_CONTROL_Y�"�$ ON WARNING THEN GOTO NETLIB_FAIL�$! �$ NETLIB_SAY := WRITE SYS$OUTPUT�$ LINK := LINK/NOUSERLIBRARY#�$ IF F$GETSYI("HW_MODEL") .LT. 1024��$ THEN�$ NETLIB_VAX = 1�$ NETLIB_AXP = 0�$ ELSE�$ NETLIB_VAX = 0�$ NETLIB_AXP = 1�$ ENDIF��$ DEFINE VMI$KWD SYS$DISK:[]�$!�$ GOTO NETLIB_INSTALL��$!�$NETLIB_CONTROL_Y:=�$ IF F$TRNLNM ("NETLIB_STUP") .NES. "" THEN CLOSE NETLIB_STUP�0�$ NETLIB_SAY "Installation cancelled by CTRL/Y."�$ EXIT 1�$! �$NETLIB_FAIL:��$ NETLIB_STATUS == $STATUS=�$ IF F$TRNLNM ("NETLIB_STUP") .NES. "" THEN CLOSE NETLIB_STUP��$ EXIT 'NETLIB_STATUS��$!�$NETLIB_INSTALL:�$!-�$ NETLIB_INSTALL_NODE = F$GETSYI ("NODENAME")��$!%�$! Build the tables for menu choices.��$!�$ IF NETLIB_VAX��$ THEN�$ NETLIB_TCP_NAMES = "?" +-�� ":CMU-Tek TCP/IP V6.4"+-�&� ":CMU-Tek TCP/IP V6.5 or later"+-.� ":DEC VMS/ULTRIX Connection (UCX) V1.2"+-?� ":DEC UCX V1.3 or TCP/IP Services for VMS V2.0 or later"+-�$� ":TGV MultiNet V2.2 or later"+-� ":PSC TCPware"�I�$ NETLIB_TCPS = "?:NETLIB_CMU064:NETLIB_CMU:NETLIB_UCX012:NETLIB_UCX"+-�/� ":NETLIB_MULTINET:NETLIB_TCPWARE"��$ OLB = ".OLB"�$ OPT = ".OPT"�$ OBJ = ".OBJ"�$ ELSE�$ NETLIB_TCP_NAMES = "?" +-�%� ":DEC TCP/IP Services for VMS"+-�$� ":TGV MultiNet V3.2 or later"+-� ":PSC TCPware"�?�$ NETLIB_TCPS = "?:NETLIB_UCX:NETLIB_MULTINET:NETLIB_TCPWARE"��$ NETLIB_CMU064 = ""�$ NETLIB_CMU = ""��$ NETLIB_UCX012 = ""�$ OLB = ".ALPHA_OLB"�$ OPT = ".ALPHA_OPT"�$ OBJ = ".ALPHA_OBJ"�$ ENDIF��$ NETLIB_I = 0�$NETLIB_INIT_LOOP:�$ NETLIB_I = NETLIB_I + 1�3�$ NETLIB_TCP = F$ELEMENT (NETLIB_I,":",NETLIB_TCPS)�8�$ IF NETLIB_TCP .EQS. ":" THEN GOTO NETLIB_END_INIT_LOOP�$ 'NETLIB_TCP = " "��$ GOTO NETLIB_INIT_LOOP��$!@�$! Now we make some educated guesses about which TCP/IP's should�$! be pre-selected.��$!�$NETLIB_END_INIT_LOOP:�$!�$ IF F$GETDVI ("IP0","EXISTS")�$ THEN�$!-�$! Don't confuse with TCPware's IPA0: device��$!.�$ IF F$GETDVI ("IP0","DEVNAM") .EQS. "_IP0:"�$ THEN)�$ IF F$TRNLNM ("CMUTEK_ROOT") .NES. ""� �$ THEN��$ NETLIB_CMU = "*"� �$ ELSE��$ NETLIB_CMU064 = "*" �$ ENDIF �$ ENDIF��$ ENDIF�-�$ IF F$GETDVI ("UCX$DEVICE","EXISTS") .AND. -�5� F$SEARCH ("SYS$SYSTEM:UCX$INETACP.EXE") .NES. ""��$ THEN<�$ IF F$SEARCH ("SYS$SYSTEM:UCX$INET_ROUTING.EXE") .NES. ""�$ THEN�$ NETLIB_UCX = "*"��$ ELSE�$ ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������_����������������������������������NETLIB_SRC.BCK�����������������{����"[NETLIB]NETLIB_USER_INSTALL.COM;17���������������������������������������������������������������������������������������������T������������������������������G������������� NETLIB_UCX012 = "*" �$ ENDIF��$ ENDIF� �$ IF F$GETDVI ("INET0","EXISTS")�$ THEN!�$ IF F$GETDVI ("TCP0","EXISTS")��$ THEN�$ NETLIB_TCPWARE = "*"��$ ELSE�$ NETLIB_MULTINET = "*" �$ ENDIF��$ ENDIF��$!�$NETLIB_SELECT_MENU:�$!�$ TYPE SYS$INPUT:���/� TCP/IP Support Selection���A� Select the NETLIB TCP/IP support you wish to install from the�C� menu below. An asterisk appears next to the packages that have�B� already been selected. You can remove a package from the listA� by selecting it again. You may enter more than one selection�+� by separating your choices with commas.����$ NETLIB_M = 0�$NETLIB_SEL_LOOP:��$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)3�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_SELECT_ASK�1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)�I�$ NETLIB_SAY F$FAO (" !2UL. [!AS] !AS", NETLIB_M, 'NETLIB_T, NETLIB_N)��$ GOTO NETLIB_SEL_LOOP�$NETLIB_SELECT_ASK:��$ NETLIB_SAY ""�3�$ NETLIB_SAY F$FAO (" !2UL. Exit", NETLIB_M)��$ NETLIB_SAY ""��$ NETLIB_SAY ""��$!'�$ CALL NETLIB_ASK NETLIB_CHOICE_INPUT -�&� " Your choice" "''NETLIB_M'"�$ NETLIB_I = -1��$NETLIB_PARSE_LOOP:��$ NETLIB_I = NETLIB_I + 1�@�$ NETLIB_CHOICE = F$ELEMENT (NETLIB_I, ",", NETLIB_CHOICE_INPUT)9�$ IF NETLIB_CHOICE .EQS. "," THEN GOTO NETLIB_SELECT_MENU�+�$ NETLIB_CHOICE = F$INTEGER (NETLIB_CHOICE)�9�$ IF NETLIB_CHOICE .EQ. NETLIB_M THEN GOTO NETLIB_CONFIRM�:�$ IF NETLIB_CHOICE .LT. 1 .OR. NETLIB_CHOICE .GT. NETLIB_M�$ THEN'�$ NETLIB_SAY "%NETLIB-E-BADCHOICE, ",�L� "Choice ''NETLIB_CHOICE' invalid; choices range from 1 to ''NETLIB_M'."�$ ELSE:�$ NETLIB_T = F$ELEMENT (NETLIB_CHOICE, ":", NETLIB_TCPS)�$ IF 'NETLIB_T .EQS. "*"�$ THEN�$ 'NETLIB_T = " "�$ ELSE�$ 'NETLIB_T = "*" �$ ENDIF��$ ENDIF��$ GOTO NETLIB_PARSE_LOOP�$!�$NETLIB_CONFIRM:�$ NETLIB_SAY ""�B�$ NETLIB_SAY " You have selected the following TCP/IP support:"�$ NETLIB_SAY ""��$ NETLIB_CNT = 0�$ NETLIB_M = 0�$NETLIB_CONF_LOOP:�$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)1�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_CONF_ASK�1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)��$ IF 'NETLIB_T .EQS. "*"�$ THEN�$ NETLIB_PRI = NETLIB_M�"�$ NETLIB_SAY " ",NETLIB_N�$ NETLIB_CNT = NETLIB_CNT + 1��$ ENDIF��$ GOTO NETLIB_CONF_LOOP��$!�$NETLIB_CONF_ASK:�7�$ IF NETLIB_CNT .EQ. 0 THEN NETLIB_SAY " (None)"��$ NETLIB_SAY ""��$ NETLIB_SAY ""�5�$ CALL NETLIB_ASK NETLIB_OK "Is this correct" "YES" B�1�$ IF .NOT. NETLIB_OK THEN GOTO NETLIB_SELECT_MENU��$!�$ IF NETLIB_CNT .EQ. 0�$ THEN=�$ NETLIB_SAY "%NETLIB-I-WONTINSTALL, No packages selected."� �$ EXIT 1�$ ENDIF��$!/�$ IF NETLIB_CNT .EQ. 1 THEN GOTO NETLIB_DIR_ASK��$!�$NETLIB_PRIMARY_MENU:��$!�$ TYPE SYS$INPUT:���?� You have selected support for more than one TCP/IP package.�=� You must now select which is to be used by default on the�� current system.����$ NETLIB_M = 0�$NETLIB_PRI_LOOP:��$ NETLIB_M = NETLIB_M + 1�6�$ NETLIB_N = F$ELEMENT (NETLIB_M,":",NETLIB_TCP_NAMES)4�$ IF NETLIB_N .EQS. ":" THEN GOTO NETLIB_PRIMARY_ASK1�$ NETLIB_T = F$ELEMENT (NETLIB_M,":",NETLIB_TCPS)�2�$ IF 'NETLIB_T .EQS. " " THEN GOTO NETLIB_PRI_LOOP8�$ NETLIB_SAY F$FAO (" !2UL. !AS", NETLIB_M, NETLIB_N)�$ GOTO NETLIB_PRI_LOOP�$!�$NETLIB_PRIMARY_ASK:�$!�$ NETLIB_SAY ""��$ NETLIB_SAY ""�2�$ CALL NETLIB_ASK NETLIB_TMP " Your choice"�$!%�$ NETLIB_PRI = F$INTEGER (NETLIB_TMP)�4�$ IF NETLIB_PRI .LT. 1 .OR���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������`����������������������������������NETLIB_SRC.BCK�����������������{����"[NETLIB]NETLIB_USER_INSTALL.COM;17���������������������������������������������������������������������������������������������T������������������������������-�������������. NETLIB_PRI .GE. NETLIB_M�$ THENO�$ NETLIB_SAY "%NETLIB-W-SELRANGE, Selection out of range. Please try again."��$ GOTO NETLIB_PRIMARY_MENU�$ ENDIF�3�$ NETLIB_T = F$ELEMENT (NETLIB_PRI,":",NETLIB_TCPS)��$ IF 'NETLIB_T .NES. "*"�$ THENT�$ NETLIB_SAY "%NETLIB-W-UNAVAIL, That choice is not available. Please try again."�$ GOTO NETLIB_PRIMARY_MENU�$ ENDIF��$!�$NETLIB_DIR_ASK:�$!�$ NETLIB_SAY ""�8�$ NETLIB_SAY " Default TCP/IP transport will be: ", -0� F$ELEMENT (NETLIB_PRI,":",NETLIB_TCP_NAMES)�$!�$ TYPE SYS$INPUT:�����!� Choosing the NETLIB Directory���>� The NETLIB libraries may go in either your login directory(� or some other directory you specify.���$ NETLIB_DEFANS := SYS$LOGIN:�:�$ IF F$TRNLNM ("NETLIB_DIR","LNM$PROCESS") .NES. "" THEN -9� NETLIB_DEFANS = F$TRNLNM ("NETLIB_DIR","LNM$PROCESS")��$ CALL NETLIB_ASK NETLIB_DIR -D� "Where should the NETLIB libraries be placed" "''NETLIB_DEFANS'"1�$ NETLIB_DIR = F$PARSE (NETLIB_DIR,,,"DEVICE") +-�'� F$PARSE (NETLIB_DIR,,,"DIRECTORY")�2�$ IF F$SEARCH ("''NETLIB_DIR'X.X") .EQS. "" THEN - � CREATE/DIRECTORY 'NETLIB_DIR�$!#�$ CREATE SYS$LOGIN:NETLIB_LOGIN.COM�4�$ OPEN/APPEND NETLIB_STUP SYS$LOGIN:NETLIB_LOGIN.COM �$ NETLIB_W = "WRITE NETLIB_STUP" �$ NETLIB_W "$! NETLIB_LOGIN.COM"D�$ NETLIB_W "$! Login command procedure for NETLIB library routines."C�$ NETLIB_W "$! Copyright 1991, Rensselaer Polytechnic Institute."��$ NETLIB_W "$!"�4�$ NETLIB_W "$ DEFINE/NOLOG NETLIB_DIR ''NETLIB_DIR'">�$ NETLIB_W "$ DEFINE/NOLOG NETLIB_NAMESERVERS ""127.0.0.1"",-"F�$ NETLIB_W " ""c.nyser.net"",""terp.umd.edu"",""ns.nasa.gov"",-"&�$ NETLIB_W " ""ns.nic.ddn.mil"""�$!�$ NETLIB_W "$!"�B�$ NETLIB_W "$ DEFINE/NOLOG NETLIB_SHRXFR NETLIB_DIR:NETLIB_SHRXFR"�$!@�$ NETLIB_SAY "%NETLIB-I-LINKING, Linking image NETLIB_SHRXFR..."H�$ LINK/SHARE=VMI$KWD:NETLIB_SHRXFR.EXE VMI$KWD:NETLIB_INSTALL'OPT'/OPT,-@� VMI$KWD:NETLIB_SHRXFR'OBJ',VMI$KWD:NETLIB_SHRXFR.VERSION/OPT�$!.�$ NETLIB_W "$ DEFINE NETLIB_SHR NETLIB_DIR:",-3� F$ELEMENT (NETLIB_PRI,":",NETLIB_TCPS), "_SHR"��$!�$ NETLIB_I = 0�$NETLIB_INST_LOOP:�$ NETLIB_I = NETLIB_I + 1�1�$ NETLIB_T = F$ELEMENT (NETLIB_I,":",NETLIB_TCPS)�7�$ IF NETLIB_T .EQS. ":" THEN GOTO NETLIB_FINISH_INSTALL��$ IF 'NETLIB_T .EQS. "*"�$ THEND�$ NETLIB_SAY "%NETLIB-I-LINKING, Linking image ''NETLIB_T'_SHR..."�$ NETLIB_L = ""��$ NETLIB_V = NETLIB_T�@�$ IF F$LOCATE ("CMU",NETLIB_T) .LT. F$LENGTH (NETLIB_T) THEN -;� NETLIB_L = ",''NETLIB_T'_ERRORS''OPT'/OPT" - "NETLIB_"�K�$ LINK/SHARE=VMI$KWD:'NETLIB_T'_SHR.EXE VMI$KWD:NETLIB_INSTALL'OPT'/OPT,-�I� VMI$KWD:'NETLIB_V'.VERSION/OPT,VMI$KWD:'NETLIB_T''OLB'/LIB'NETLIB_L'��$ ENDIF��$ GOTO NETLIB_INST_LOOP��$!�$NETLIB_FINISH_INSTALL:��$!�$ CLOSE NETLIB_STUP��$ TYPE SYS$INPUT:���E� The file SYS$LOGIN:NETLIB_LOGIN.COM includes commands that should�E� be added to your login command procedure to set up NETLIB logical� � names.��!� NETLIB installation complete.����$!�$ @SYS$LOGIN:NETLIB_LOGIN��$ EXIT 1�$!�$NETLIB_ASK: SUBROUTINE��$ PROMPT = "* " + P21�$ IF "''P4'" .EQS. "B" THEN PROMPT = PROMPT + "?"�7�$ IF "''P3'" .NES. "" THEN PROMPT = PROMPT + " [''P3']"��$ PROMPT = PROMPT + ": "�$ASK1: �$ ANSWER = ""�,�$ READ SYS$COMMAND/PROMPT="''PROMPT'" ANSWER*�$ IF ANSWER .EQS. "" THEN ANSWER = "''P3'"�$ IF ANSWER .EQS. ""�$ THEN;�$ NETLIB_SAY "%NETLIB-I-ANSREQD, A response is required."� �$ GOTO ASK1��$ ENDIF�#�$ ANSWER = F$EDIT (ANSWER,"UPCASE")��$ IF "''P4'" .EQS. "B"�$ THEN#�$ ANSWER = F$EXTRACT (0,1,ANSWER)�.�$ ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������a����������������������������������NETLIB_SRC.BCK�����������������{����"[NETLIB]NETLIB_USER_INSTALL.COM;17���������������������������������������������������������������������������������������������T������������������������������,�������������IF ANSWER .NES. "Y" .AND. ANSWER .NES. "N"�$ THEN;�$ NETLIB_SAY "%NETLIB-I-ANSYN, please answer YES or NO."��$ GOTO ASK1 �$ ENDIF��$ ENDIF��$ 'P1 == ANSWER��$ ENDSUBROUTINE����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������b����������������������������������NETLIB_SRC.BCK�����������������|����ETLIB]NETLIB_VECTOR.MAR;7����������������������������������������������������������������������������������������������������D����� �������������������������-���������������*�[NETLIB]NETLIB_VECTOR.MAR;7�+��,�|���.� ����/� �@� �4�D��� ������������������������-�����0���1����2���3������K��P���W���O� ����5���6�� )��7�5)��8�+fh��9����������G� �@��H��J��������������������� .TITLE NETLIB_VECTOR�� .IDENT /V1.1/�;��; FACILITY: NETLIB��;�D�; ABSTRACT: This module defines the transfer vectors for the NETLIB0�; common network routines library.�;��; AUTHOR: M. Madison��;��; MODIFICATION HISTORY:��;�0�; 28-JAN-1991 V1.0 Madison Initial coding.;�; 04-DEC-1991 V1.1 Madison Add NET_SET_TRACE_ROUTINE.��;�� .DISABLE GLOBAL�;�,�; Macro to generate a transfer vector entry.�;�� .MACRO ROUTINE NAME � .EXTRN NAME� � .ALIGN QUAD� .TRANSFER NAME� � .MASK NAME � JMP NAME+2� .ENDM�;�� .PSECT $$NETLIB_VECTOR -�,� PIC,USR,CON,REL,GBL,SHR,EXE,RD,NOWRT,QUAD�;�� ROUTINE NET_ASSIGN�� ROUTINE NET_BIND�� ROUTINE NET_DEASSIGN�� ROUTINE NET_GET_ADDRESS� ROUTINE NET_ADDR_TO_NAME�� ROUTINE NET_GET_INFO�� ROUTINE NET_GET_HOSTNAME��;�� ROUTINE TCP_CONNECT� ROUTINE TCP_CONNECT_ADDR�� ROUTINE TCP_DISCONNECT�� ROUTINE TCP_ACCEPT�� ROUTINE TCP_SEND�� ROUTINE TCP_RECEIVE� ROUTINE TCP_GET_LINE��;�� ROUTINE UDP_SEND�� ROUTINE UDP_RECEIVE��� ROUTINE DNS_MXLOOK���� ROUTINE NET_SET_TRACE_ROUTINE��&� .BLKL 28 ; room for 14 more routines�;�� .END�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������c����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]UCX_DEFS.R32;4���������������������������������������������������������������������������������������������������������<����� �������������������������%���������������*�[NETLIB]UCX_DEFS.R32;4�+��,����.� ����/� �@� �4�<��� ����T��������������������-�����0���1����2���3������K��P���W���O� ����5���6�؆6��7�ɦ��8�kfh��9����������G� �@��H��J��������������������������!++��!��! UCX_DEFS.R32�!�<�! Definitions specific to the UCX implementation of NETLIB.�!�0�! 29-JAN-1991 V1.0 Madison Initial coding.�!--���� LIBRARY 'FIELDS';�&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';��� _DEF (CTX)� CTX_L_FLINK = _LONG,� CTX_L_BLINK = _LONG,� CTX_Q_BUFQ = _QUAD,� CTX_Q_EXPTIME = _QUAD,�� CTX_Q_CURSTR = _QUAD,� CTX_Q_IOSB = _QUAD, � CTX_X_DSC = _BYTES (12),� _OVERLAY (CTX_X_DSC)�!� CTX_L_DSCLEN = _LONG,�!� CTX_L_DSCADR = _LONG,�!� CTX_L_RETLEN = _LONG,�� _ENDOVERLAY4� CTX_X_REMSIN = _BYTES (((SIN$C_LENGTH+3)/4)*4),� CTX_L_RETSTAT = _LONG,�� CTX_W_CHAN = _WORD,� CTX_W_FLAGS = _WORD,� _OVERLAY (CTX_W_FLAGS)�� CTX_V_IGNORELF = _BIT� _ENDOVERLAY� _ENDDEF (CTX);��� _DEF (SCHAR)!� SCHAR_W_PROTOCOL = _WORD,�!� SCHAR_B_PROTYPE = _BYTE,�� SCHAR_B_DOMAIN = _BYTE�� _ENDDEF (SCHAR);��� _DEF (SUBF)�� SUBF_B_TYPE = _BYTE,� SUBF_B_CODE = _BYTE,� SUBF_W_UNUSED = _WORD� _ENDDEF (SUBF);�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������d����������������������������������NETLIB_SRC.BCK���������������������#[NETLIB]MULTINET_TCPWARE_DEFS.R32;4��������������������������������������������������������������������������������������������A����� �������������������������5,��������������#�*�[NETLIB]MULTINET_TCPWARE_DEFS.R32;4�+��,����.� ����/� �@� �4�A��� ����H��������������������-�����0���1����2���3������K��P���W���O� ����5���6�`_��7� ԅ_��8�[bh��9����������G� �@��H��J���������������� �������������!++��!��! MULTINET_DEFS.R32��!�A�! Definitions specific to the MultiNet implementation of NETLIB.��!�0�! 04-FEB-1991 V1.0 Madison Initial coding.�!--���� LIBRARY 'FIELDS';�&� LIBRARY 'SYS$LIBRARY:UCX$INETDEF';"� LIBRARY 'SYS$LIBRARY:STARLET';��� _DEF (CTX)� CTX_L_FLINK = _LONG,� CTX_L_BLINK = _LONG,� CTX_Q_BUFQ = _QUAD,� CTX_Q_EXPTIME = _QUAD,�� CTX_Q_CURSTR = _QUAD,� CTX_Q_IOSB = _QUAD,:� CTX_X_ASTRUC = _BYTES (((((SIN$C_LENGTH+3)/4)*4)+4)),� _OVERLAY (CTX_X_ASTRUC)� CTX_L_REMSINLEN = _LONG,�;� CTX_X_REMSIN = _BYTES (((SIN$C_LENGTH+3)/4)*4),�� _ENDOVERLAY� CTX_L_RETSTAT = _LONG,�� CTX_W_CHAN = _WORD,� CTX_W_FLAGS = _WORD,� _OVERLAY (CTX_W_FLAGS)�� CTX_V_IGNORELF = _BIT� _ENDOVERLAY� _ENDDEF (CTX);�� � LITERAL�!� IO$_SEND = IO$_WRITEVBLK,�#� IO$_RECEIVE = IO$_READVBLK,�4� IO$_SOCKET = IO$_ACCESS OR (0 ^ IO$S_FCODE),2� IO$_BIND = IO$_ACCESS OR (1 ^ IO$S_FCODE),4� IO$_LISTEN = IO$_ACCESS OR (2 ^ IO$S_FCODE),4� IO$_ACCEPT = IO$_ACCESS OR (3 ^ IO$S_FCODE),5� IO$_CONNECT = IO$_ACCESS OR (4 ^ IO$S_FCODE),�8� IO$_SETSOCKOPT = IO$_ACCESS OR (5 ^ IO$S_FCODE),8� IO$_GETSOCKOPT = IO$_ACCESS OR (6 ^ IO$S_FCODE),3� IO$_IOCTL = IO$_ACCESS OR (8 ^ IO$S_FCODE),�:� IO$_ACCEPT_WAIT = IO$_ACCESS OR (10 ^ IO$S_FCODE),7� IO$_SHUTDOWN = IO$_ACCESS OR (12 ^ IO$S_FCODE),�:� IO$_GETSOCKNAME = IO$_ACCESS OR (13 ^ IO$S_FCODE),9� IO$_GETPEERNAME =IO$_ACCESS OR (15 ^ IO$S_FCODE);����� � MACRO�/� MULTINET_ERROR (X) = ((X^3) OR %X'8000')%;��� � LITERAL�-� INET__ENOMEM = MULTINET_ERROR (12),�-� INET__EACCES = MULTINET_ERROR (13),�1� INET__ENOTSOCK = MULTINET_ERROR (38),�1� INET__EDESTADDRREQ = MULTINET_ERROR (39),�1� INET__EMSGSIZE = MULTINET_ERROR (40),�1� INET__EPROTOTYPE = MULTINET_ERROR (41),�1� INET__ENOPROTOOPT = MULTINET_ERROR (42),�4� INET__EPROTONOSUPPORT = MULTINET_ERROR (43),4� INET__ESOCKTNOSUPPORT = MULTINET_ERROR (44),1� INET__EOPNOTSUPP = MULTINET_ERROR (45),�1� INET__EPFNOSUPPORT = MULTINET_ERROR (46),�1� INET__EAFNOSUPPORT = MULTINET_ERROR (47),�1� INET__EADDRINUSE = MULTINET_ERROR (48),�2� INET__EADDRNOTAVAIL = MULTINET_ERROR (49),1� INET__ENETDOWN = MULTINET_ERROR (50),�1� INET__ENETUNREACH = MULTINET_ERROR (51),�1� INET__ENETRESET = MULTINET_ERROR (52),�1� INET__ECONNABORTED = MULTINET_ERROR (53),�1� INET__ECONNRESET = MULTINET_ERROR (54),�1� INET__ENOBUFS = MULTINET_ERROR (55),�1� INET__EISCONN = MULTINET_ERROR (56),�1� INET__ENOTCONN = MULTINET_ERROR (57),�1� INET__ESHUTDOWN = MULTINET_ERROR (58),�1� INET__ETOOMANYREFS = MULTINET_ERROR (59),�1� INET__ETIMEDOUT = MULTINET_ERROR (60),�1� INET__ECONNREFUSED = MULTINET_ERROR (61),�1� INET__EHOSTDOWN = M��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������e����������������������������������NETLIB_SRC.BCK���������������������#[NETLIB]MULTINET_TCPWARE_DEFS.R32;4��������������������������������������������������������������������������������������������A����� ��������������������������������������ULTINET_ERROR (64),�1� INET__EHOSTUNREACH = MULTINET_ERROR (65);������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@�����������������������������~�����NEWSRDR_SRC.BCK�����������������P��[NEWSRDR]NETLIB_SRC.BCK;1�����������������������������������������������������������������������������������������������������������H������������������������#$�F�����&����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������f����������������������������������NETLIB_SRC.BCK�����������������a���� [NETLIB]NETLIB_TCPWARE.VERSION;7���������������������������������������������������������������������������������������������������� ��������������������������������������� �*�[NETLIB]NETLIB_TCPWARE.VERSION;7�+��,�a���.� ����/� �@� �4���� ������������������������-�����0���1����2���3������K��P���W���O� ����5���6�ֻå$��7� j$��8�eh��9����������G� �@��H��J����������������IDENT="V1.5-2"�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������� ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������g����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]DUMMY.B32;1����������������������������������������������������������������������������������������������������������������� �������������������������Z���������������*�[NETLIB]DUMMY.B32;1�+��,����.� ����/� �@� �4���� ����~��������������������-�����0���1����2���3������K��P���W���O� ����5���6�c��7�Ɩ ��8�FLbh��9����������G� �@��H��J�����������������������������MODULE DUMMY =�BEGIN����LIBRARY 'SYS$LIBRARY:STARLET';���GLOBAL ROUTINE DUMMY =�BEGIN� �SS$_NORMAL�END;���END��ELUDOM������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������h����������������������������������NETLIB_SRC.BCK���������������������[NETLIB]NETLIB.ALPHA_OPT;4�����������������������������������������������������������������������������������������������������'����� �������������������������0���������������*�[NETLIB]NETLIB.ALPHA_OPT;4�+��,����.� ����/� �@� �4�'��� ����Z��������������������-�����0���1����2���3������K��P���W���O� ����5���6� ��7�  ��8�Fbh��9����������G� �@��H��J����������������������GSMATCH=LEQUAL,1,4�DUMMY.ALPHA_OBJ��CLUSTER=CLUSTER1���PSECT_ATTR=$CODE$,PIC,SHR��PSECT_ATTR=$PLIT$,PIC,SHR�&�COLLECT = CLUSTER1,$CODE$,$CODE,$PLIT$���SYMBOL_VECTOR=(-!� NET_ASSIGN = PROCEDURE,-�� NET_BIND = PROCEDURE,-�"� NET_DEASSIGN = PROCEDURE,-"� NET_GET_ADDRESS = PROCEDURE,-"� NET_ADDR_TO_NAME = PROCEDURE,-"� NET_GET_INFO = PROCEDURE,-"� NET_GET_HOSTNAME = PROCEDURE,-"� TCP_CONNECT = PROCEDURE,-"� TCP_CONNECT_ADDR = PROCEDURE,-"� TCP_DISCONNECT = PROCEDURE,-!� TCP_ACCEPT = PROCEDURE,-�� TCP_SEND = PROCEDURE,-�"� TCP_RECEIVE = PROCEDURE,-"� TCP_GET_LINE = PROCEDURE,-� UDP_SEND = PROCEDURE,-�"� UDP_RECEIVE = PROCEDURE,-!� DNS_MXLOOK = PROCEDURE,-�'� NET_SET_TRACE_ROUTINE = PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�&� DUMMY = PRIVATE_PROCEDURE)������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������i����������������������������������NETLIB_SRC.BCK�����������������A����"[NETLIB]NETLIB_INSTALL.ALPHA_OPT;1���������������������������������������������������������������������������������������������'����� ������������������������� ��������������"�*�[NETLIB]NETLIB_INSTALL.ALPHA_OPT;1�+��,�A���.� ����/� �@� �4�'��� ����b��������������������-�����0���1����2���3������K��P���W���O� ����5� ��6� ��7�F\��8�dh��9����������G� �@��H��J������������������������������GSMATCH=LEQUAL,1,4�VMI$KWD:DUMMY.ALPHA_OBJ��CLUSTER=CLUSTER1���PSECT_ATTR=$CODE$,PIC,SHR��PSECT_ATTR=$PLIT$,PIC,SHR�&�COLLECT = CLUSTER1,$CODE$,$CODE,$PLIT$���SYMBOL_VECTOR=(-!� NET_ASSIGN = PROCEDURE,-�� NET_BIND = PROCEDURE,-�"� NET_DEASSIGN = PROCEDURE,-"� NET_GET_ADDRESS = PROCEDURE,-"� NET_ADDR_TO_NAME = PROCEDURE,-"� NET_GET_INFO = PROCEDURE,-"� NET_GET_HOSTNAME = PROCEDURE,-"� TCP_CONNECT = PROCEDURE,-"� TCP_CONNECT_ADDR = PROCEDURE,-"� TCP_DISCONNECT = PROCEDURE,-!� TCP_ACCEPT = PROCEDURE,-�� TCP_SEND = PROCEDURE,-�"� TCP_RECEIVE = PROCEDURE,-"� TCP_GET_LINE = PROCEDURE,-� UDP_SEND = PROCEDURE,-�"� UDP_RECEIVE = PROCEDURE,-!� DNS_MXLOOK = PROCEDURE,-�'� NET_SET_TRACE_ROUTINE = PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�'� DUMMY = PRIVATE_PROCEDURE,-�&� DUMMY = PRIVATE_PROCEDURE)��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������6����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������