W}}$MULTIHELP020.EՀMULTIHELP020.EBACKUP/NOASSIST/COMMENT=OpenVMS AXP SPKITBLD Procedure/INTER/LOG/VERIFY PRODROOT:[EXAMPLES]*.*;0 HELPMT$DKA300:[CMS.HELPMATE.KIT]MULTIHELP020.E/LABEL=(MULTIHELP)/SAVE/BLOCK=9000/GROUP=25/NOINIT/NOREWIOpenVMS AXP SPKITBLD Procedure MAGE gV<V6.1 _HELPMT::  _HELPMT$DKA300: V6.1 $*[EXAMPLES]CHANGE_BAR.TPU;1+,./ 4e- 0123KPWO5Q6"&@V7,F<89GHJ!++!! FUNCTIONAL DESCRIPTION:!A! The following TPU procedure inserts the change bar "|" atB! the beginning of each line of the current buffer. This isE! handy for highlighting a solicitor's MAIL text when preparing! a response.!@! Simply position the cursor in the TPU buffer you wish toB! highlight, and the type GOLD-"|". Each line of the entire8! buffer will be prepended with the "|" character.!!--6procedure INSERT_CHANGE_BAR(CURRENT_RANGE,CHANGE_BAR);3 CURRENT_POSITION := mark(none, current_buffer);* position(beginning_of(CURRENT_RANGE)); loop+ HERE := mark(none, current_buffer);- exitif HERE >= end_of(CURRENT_RANGE);6 position(beginning_of(copy_text(CHANGE_BAR))); move_vertical(1); endloop; position(CURRENT_POSITION); delete(CURRENT_POSITION); endprocedure;!++!! CUSTOMIZATIONS:!@! Modify the following key definition to change either the8! range to be marked, or the change bar character:!!-- define_key(e "INSERT_CHANGE_BAR(create_range(beginning_of(current_buffer),end_of(current_buffer),none), '|')", key_name("|",shift_key));*[EXAMPLES]FIRST_SOLUTION.MH;1+, -./ 4K- 0123KPWO5?6q&7=Q<89GHJ7\U system \P manager \* Establish the user id as system8\f \* Request the return of a log file/\A \* Perform an Add function)\C C \* Class code is "C"%\F C \* Software is C\K CONFLICTDECL \* Keyword'\K SYS$TRNLNM \* Another KeywordE\T "%CC-W-CONFLICTDECL, This declaration of ""SYS$TRNLNM"" conflicts"BVAXC pre-includes the definition of all system service routines inFlower-case. When you instantiate a call to a system service routine inKupper-case the VAXC compiler views this as a conflict with a routine of thesame name but different case. Solution:4Reference all system service routines in lower-case. *[EXAMPLES]MHREQGUI.COM;2+,e./ 4R- 0123KPWO586nqq?7d[_<89GHJ$ VERIFY = 'f$verify(0)$$!++$!"$! TITLE: MultiHelp$REQuestGUI.COM $! IDENT: X-1$!4$! FACILITY: MultiHelp[TM], SiO Technologies, 1994 $!3$! ABSTRACT: This module requests the MutliHelp GUI-$! be pushed from the specified host system.*$! It is provided as an example for users*$! of OpenVMS systems where MultiHelp is $! not installed.$!3$! ENVIRONMENT: OpenVMS, VAX/VMS, Starlet, or EVMS.'$! Remote TASK access must be enabled.$!$! INPUT: P1 is MultiHelp host#$! P2 (optional) is display syntax4$! P3 (optional) requests STATUS from remote object$!.$! AUTHOR: Vladimir Horowitz, Tenth Level Mage$! DATE: 11-May-1994$!$! MODIFICATION HISTORY:$!;$! X-1 Elizabeth P. Lawson, Developer-at-Large, 11-May-19942$! Original on-sight realization of figured bass.$!$!--$ $ set noon$$ !+L$ ! Validate the parameters, P1 is MultiHelp host, P2 (optional) is display.$ !-$$LOOP:$ if P1 .eqs. ""$ then7$ read/prompt="MultiHelp[TM] host: " SYS$COMMAND P1$ goto LOOP$ else$ P1 = P1 - "::" - "_"7$ if f$extract(f$length(P1)-1,1,P1) .nes. "" then -$ P1 = P1 + """"""$ endif$$ if P2 .eqs. ""$ then $ define/user SYS$OUTPUT NL:$ show display /symbol$$ if DECW$DISPLAY_NODE .eqs. "0" $ thenR$ DECW$DISPLAY_NODE = f$getsyi("node_area")*1024 + f$getsyi("node_number")1$ DECW$DISPLAY_NODE := 'DECW$DISPLAY_NODE $ endifM$ P2 = DECW$DISPLAY_NODE+"::"+DECW$DISPLAY_SERVER+"."+DECW$DISPLAY_SCREEN$ endif$$ !+($ ! Contact the remote MultiHelp object.$ !-$+$ open/write/read NET 'P1::"task=MultiHelp"$ write NET P2$$ !+.$ ! Check return status (might take a while!).$ !-$$ if P3 .nes. ""$ then$ read NET STATUS$ if STATUS .nes. "" then - $ write SYS$ERROR STATUS$ endif$ $ close NET$ VERIFY = f$verify(VERIFY)*[EXAMPLES]MH_EXAMPLES.LIS;71+,JA./ 4<- 0123KPWO56;7Tf<89GHJ#PRODROOT:[EXAMPLES]CHANGE_BAR.TPU;1&PRODROOT:[EXAMPLES]FIRST_SOLUTION.MH;1!PRODROOT:[EXAMPLES]MHREQGUI.COM;2!PRODROOT:[EXAMPLES]MH_VIEWS.SQL;73PRODROOT:[EXAMPLES]MULTIHELP$FAX_INSTRUCTIONS.C;1507PRODROOT:[EXAMPLES]MULTIHELP$GENERIC_INSTRUCTIONS.C;1364PRODROOT:[EXAMPLES]MULTIHELP$MAIL_INSTRUCTIONS.C;165+PRODROOT:[EXAMPLES]MULTIHELP$MESSAGES.H;169<PRODROOT:[EXAMPLES]MULTIHELP$NOTIFICATION_INSTRUCTIONS.H;1505PRODROOT:[EXAMPLES]MULTIHELP$PAGER_INSTRUCTIONS.C;1505PRODROOT:[EXAMPLES]MULTIHELP$PHONE_INSTRUCTIONS.C;137*PRODROOT:[EXAMPLES]MULTIHELP$PROFILE.COM;16PRODROOT:[EXAMPLES]MULTIHELP$XPOPUP_INSTRUCTIONS.C;134"PRODROOT:[EXAMPLES]MULTIHELP.LSE;1 PRODROOT:[EXAMPLES]QS_CLASS.MH;1$PRODROOT:[EXAMPLES]REQUESTS_ADD.MH;1)PRODROOT:[EXAMPLES]RPT_PRB_WR_LABOR.SQL;1%PRODROOT:[EXAMPLES]SOLUTIONS_ADD.MH;1(PRODROOT:[EXAMPLES]TEXT_PAGING.EXAMPLE;1,PRODROOT:[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1PRODROOT:[EXAMPLES]XSUPPORT.;1*[EXAMPLES]MH_VIEWS.SQL;7+,9,a.T/ 4PTT - 0123KPWOU56l\|cw7(p<89GHJI! MH_VIEWS.SQL: This file contains the definitions for SQL Views for the B! MultiHelp database that are incorporated by default. The view @! names are prefixed with the strings 'MH_', 'ADM_', 'REP_' andA! 'SOL_'. By default, the reporting interface will only display%! table names that start with 'MH_'.!O! In addition to using these views to limit the number of tables K! that the reporting interface displays, they are also usefulJ! because they convert many field names from the names used L! internally by MultiHelp to names that more closely represent! their function.!L! You may override this 'MH_' filtering mechanism by defining J! the logical name MULTIHELP$TABLE_LEVEL to be 1. This willH! cause all tables and views defined in the database to beA! available to the reporting interface - including the MH_ views/! and the tables used internally by MultiHelp.! ! i.e.8! $ DEFINE MULTIHELP$TABLE_LEVEL 1!N! The MultiHelp reporting interface will display only the tablesJ! whose names start with 'MH_' (or the prefixes defined with@! MULTIHELP$TABLE_PREFIX - see below) when this logical name is'! either undefined, or defined to be 0!J! This file is split into four sections. The first defines N! 'General' views that will most commonly be used for reporting.N+$MULTIHELP020.E9,a [EXAMPLES]MH_VIEWS.SQL;7PTy"! The second defines 'Admin' views that contain information thatN! would likely only be of use to a MultiHelp administrator. TheO! third contains 'Reporting' views of information used internallyJ! by the reporting interface. The forth contains 'Solution'E! views of information used internally by the Solutions! sub-system.!>! You may also use the logical name MULTIHELP$TABLE_PREFIX to;! control what views/tables are displayed in the reportingA! interface. Define the logical to be a comma separated list of>! prefixes inside double quotes. For example, to display all.! 'MH_' and 'ADM_' views, define the logical:!.! $ DEFINE MULTIHELP$TABLE_PREFIX "MH_,ADM_"! J! You may add or modify views to suit your needs but, you must have an Rdb*! Interactive or Full Development license.!>! To modify a view in the MultiHelp Database do the following:!J! Extract the view definition that you would like to modify O! into a separate file with a .SQL extension and make the desired! changes to this file.!! Then,!! $ MCR SQL$0! SQL> ATTACH 'FILE MULTIHELP$DB';;! SQL> DROP VIEW view-name-you-are-modifying;"! SQL> @filename.SQL! SQL> COMMIT;!L! If you later decide to remove a view definition from the database, you may)! do so by using the DROP VIEW command. ! ! E.g.! $ MCR SQL$0! SQL> ATTACH 'FILE MULTIHELP$DB';+! SQL> DROP VIEW MH_whatever;! SQL> COMMIT;!L! Note: To see what views have been defined, use the command SQL> SHOW VIEW;! O! You are free to modify these views - for example to change the name of one ofG! the 'ADM_' views to be 'MH_' so that it is available to the reportingM! interface by default or to rename fields or add fields with join operationsJ! as needed. Please see the Rdb/SQL documentation for more information on! these advanced topics.!P! WARNING: NEVER modify any of the elements of the MultiHelp database unless youL! added the definition or it starts with the MH_, ADM_ SOL_ or REP_F! prefixes. Modification of any of the elements used internally by2! MultiHelp may render the software inoperable.!N! Remove the '!' at the beginning of the following lines to delete previously -! defined views so that they can be redefined!N!-General Views---------------------------------------------------------------!drop view MH_ACCOUNTING;!drop view MH_ALL_REQUESTS;!drop view MH_CLASSES;!drop view MH_CLASS_HIERARCHY;!drop view MH_PRIORITY;!drop view MH_SEVERITY;!drop view MH_STATUS;!drop view MH_CONTACTS;&!drop view MH_CONTACT_ALTERNATE_EMAIL;!drop view MH_HARDWARE;!drop view MH_LABOR; !drop view MH_ASSIGNED_REQUESTS;!drop view MH_QUEUED_REQUESTS;!drop view MH_SOFTWARE;!drop view MH_USERS;!drop view MH_WORK_REPORTS;!drop view MH_WR_REQUEST;!drop view MH_WR_REQUEST_LABOR;!N!-Admin Views-----------------------------------------------------------------!!drop view ADM_CLASS_DESCENDANTS;!drop view ADM_ESCALATION; !drop view ADM_ESCALATION_HOURS; !drop view ADM_FIRST_ESCALATION;!drop view ADM_LICENSES;!drop view ADM_MAINTENANCE;!drop view ADM_PARTNER_PIDS; !drop view ADM_PRIORITY_DEFAULT;!drop view ADM_REQUEST_ID; !drop view ADM_SEVERITY_DEFAULT;!!drop view ADM_SYSTEM_PARAMETERS;!drop view ADM_TOP_ESCALATION;!drop view ADM_VENDOR;!N!-Reporting Views-------------------------------------------------------------!drop view REP_REPORTS;!drop view REP_REPORT_BREAK;!drop view REP_REPORT_GENERAL;!drop view REP_REPORT_INFO;!drop view REP_REPORT_JOINS; !drop view REP_REPORT_RESOURCES;!drop view REP_REPORT_SQL;!drop view REP_REPORT_VALUE;!N!-Solution Views--------------------------------------------------------------!drop view SOL_SOLUTIONS; !drop view SOL_SOLUTIONS_ACCESS;*!drop view SOL_SOLUTION_AFFECTED_HARDWARE;*!drop view SOL_SOLUTION_AFFECTED_SOFTWARE;!!drop view SOL_SOLUTION_ARTICLES; !drop view SOL_SOLUTION_CLASSES;!drop view SOL_SOLUTION_ID;!!drop view SOL_SOLUTION_KEYWORDS;!drop view SOL_SOLUTION_LINKS;&!drop view SOL_SOLUTION_MODIFICATIONS;$!drop view SOL_SOLUTION_NOISE_WORDS;!!drop view SOL_SOLUTION_SYNONYMS;!drop view SOL_SOLUTION_TITLES;$!drop view SOL_SOLUTION_TITLE_WORDS;!N!-General Views---------------------------------------------------------------create view MH_ACCOUNTING ( USER_ID, ACCOUNTING_CODE, START_TIME, START_TIME_YEAR, START_TIME_MONTH, START_TIME_DAY, END_TIME, END_TIME_YEAR, END_TIME_MONTH, END_TIME_DAY, EXPENDED_HOURS, EXPENDED_MINUTES, EXPENDED_SECONDS, GRAND_BREAK_FIELD ) AS SELECT USER_ID, ACCOUNTING_CODE, START_TIME,! EXTRACT (YEAR FROM START_TIME)," EXTRACT (MONTH FROM START_TIME), EXTRACT (DAY FROM START_TIME), END_TIME, EXTRACT (YEAR FROM END_TIME), EXTRACT (MONTH FROM END_TIME), EXTRACT (DAY FROM END_TIME), EXPENDED_HOURS, EXPENDED_MINUTES, EXPENDED_SECONDS,0 'Useful only as a Bottom of Report break field'from accounting; create view MH_ALL_REQUESTS ( REQUEST_ID,  REQUEST_ID_PREFIX,  REQUEST_ID_DATE,  REQUEST_ID_COUNTER, REQUEST_SUBJECT, COMMENT, ATTEMPTS, LOCKED, LOCKED_BY, OWNER_ID, CUSTOMER_ID,  CUSTOMER_LAST_NAME,  CUSTOMER_FIRST_NAME, NOTIFY_METHOD, EMAIL_ADDRESS, BUILDING_LOCATION, PHONE_NUMBER, PHONE_NUMBER_AREA,  PHONE_NUMBER_7DIGIT,  PHONE_NUMBER_EXTENSION, PAGER_NUMBER, PAGER_NUMBER_AREA,  PAGER_NUMBER_7DIGIT, PAGER_NUMBER_EXTENSION, FAX_NUMBER, FAX_NUMBER_AREA, FAX_NUMBER_7DIGIT, FAX_NUMBER_EXTENSION, LOGGER_ID, STATUS, OPEN_OR_CLOSED, QUEUED_OR_ASSIGNED, SEVERITY_VALUE,  SEVERITY_NAME, PRIORITY_VALUE,  PRIORITY_NAME, CLASS, AFFECTED_HARDWARE,  AFFECTED_SOFTWARE, CATEGORY, WORK_REPORT_COUNT, CC_LIST, DATE_LOGGED, DATE_LOGGED_YEAR,  DATE_LOGGED_MONTH,  DATE_LOGGED_DAY, DATE_DUE, DATE_DUE_YEAR,  DATE_DUE_MONTH,  DATE_DUE_DAY, HOURS_TIL_DUE, DAYS_TIL_DUE, DATE_NEXT_ESCALATION, DATE_NEXT_ESCALATION_YEAR,  DATE_NEXT_ESCALATION_MONTH,  DATE_NEXT_ESCALATION_DAY, DATE_LAST_UPDATE, DATE_LAST_UPDATE_YEAR,  DATE_LAST_UPDATE_MONTH,  DATE_LAST_UPDATE_DAY, GRAND_BREAK_FIELD ) as select REQUEST_ID, SITE_PREFIX, PROBLEM_ID_DATE, PROBLEM_ID_COUNTER, PROBLEM_STATEMENT, COMMENT, ATTEMPTS, LOCKED, LOCKED_BY, OWNER_ID, CUSTOMER_ID, CUSTOMER_LAST_NAME, CUSTOMER_FIRST_NAME, NOTIFY_METHOD, EMAIL_ADDRESS, BUILDING_LOCATION, ! Full Phone Number '('||PHONE_AREA||')'||/ (SUBSTRING(PHONE_NUMBER FROM 1 FOR 3))||'-'||* (SUBSTRING(PHONE_NUMBER FROM 4 FOR 4))|| ' x'||PHONE_EXTENSION, PHONE_AREA, PHONE_NUMBER, PHONE_EXTENSION, ! Full Pager Number '('||PAGER_AREA||')'||/ (SUBSTRING(PAGER_NUMBER FROM 1 FOR 3))||'-'||* (SUBSTRING(PAGER_NUMBER FROM 4 FOR 4))|| ' x'||PAGER_EXT, PAGER_AREA, PAGER_NUMBER, PAGER_EXT, ! Full FAX Number '('||FAX_AREA||')'||- (SUBSTRING(FAX_NUMBER FROM 1 FOR 3))||'-'||( (SUBSTRING(FAX_NUMBER FROM 4 FOR 4))|| ' x'||FAX_EXT, FAX_AREA, FAX_NUMBER, FAX_EXT, LOGGER_ID, STATUS, OPEN_OR_CLOSED, QUEUED_OR_ASSIGNED, SEVERITY, SEVERITY_NAME, PRIORITY, PRIORITY_NAME, PROBLEM_TYPE, AFFECTED_HARDWARE, AFFECTED_SOFTWARE, CATEGORY, WORK_REPORT_COUNT, CC_LIST, DATE_LOGGED, # EXTRACT (YEAR FROM DATE_LOGGED), # EXTRACT (MONTH FROM DATE_LOGGED),! EXTRACT (DAY FROM DATE_LOGGED), DATE_DUE, EXTRACT (YEAR FROM DATE_DUE), EXTRACT (MONTH FROM DATE_DUE), EXTRACT (DAY FROM DATE_DUE), HOURS_TIL_DUE, DAYS_TIL_DUE, NEXT_ESCALATION,& EXTRACT (YEAR FROM NEXT_ESCALATION),' EXTRACT (MONTH FROM NEXT_ESCALATION),% EXTRACT (DAY FROM NEXT_ESCALATION), LAST_UPDATE," EXTRACT (YEAR FROM LAST_UPDATE),# EXTRACT (MONTH FROM LAST_UPDATE),! EXTRACT (DAY FROM LAST_UPDATE),0 'Useful only as a Bottom of Report break field'from ALL_PROBLEMS;create view MH_CLASSES ( CLASS, CLASS_DESCRIPTION, PARENT, GRAND_BREAK_FIELD ) as select NAME, DESCRIPTION, PARENT,0 'Useful only as a Bottom of Report break field'from PROBLEM_CLASSES;create view MH_CLASS_HIERARCHY ( CLASS_ANCESTOR, CLASS_DESCENDANT, GRAND_BREAK_FIELD )as select distinct ANCESTOR, DESCENDANT,0 'Useful only asjeՖ$MULTIHELP020.E9,a [EXAMPLES]MH_VIEWS.SQL;7PT a Bottom of Report break field'from CLASS_DESCENDANTS;create view MH_PRIORITY ( PRIORITY_VALUE, PRIORITY_NAME, DESCRIPTION, GRAND_BREAK_FIELD ) as select PRIORITY, NAME, DESCRIPTION,0 'Useful only as a Bottom of Report break field'from PROBLEM_PRIORITY;create view MH_SEVERITY ( SEVERITY_VALUE, SEVERITY_NAME, DEFAULT_DUE_DATE, ESCALATION_DELTA, DESCRIPTION, GRAND_BREAK_FIELD ) as select SEVERITY, NAME, DEFAULT_DUE_DATE, ESCALATION_DELTA, DESCRIPTION,0 'Useful only as a Bottom of Report break field'from PROBLEM_SEVERITY;create view MH_STATUS ( STATUS, DESCRIPTION, OPEN_OR_CLOSED, IS_RESERVED, GRAND_BREAK_FIELD ) as select NAME, DESCRIPTION, OPEN_OR_CLOSED, RESERVED,0 'Useful only as a Bottom of Report break field'from PROBLEM_STATUS;create view MH_CONTACTS ( USER_ID, LAST_NAME, FIRST_NAME, EMPLOYEE_ID, NOTIFY_METHOD, PRIMARY_NUMBER, PRIMARY_NUMBER_AREA,  PRIMARY_NUMBER_7DIGIT,  PRIMARY_NUMBER_EXTENSION, SECONDARY_NUMBER, SECONDARY_NUMBER_AREA,  SECONDARY_NUMBER_7DIGIT,  SECONDARY_NUMBER_EXTENSION, US_MAIL_ROUTING, US_MAIL_ADDRESS, CITY, STATE, ZIP, MAIL_STOP, BUILDING, BUILDING_LOCATION, EMAIL_ADDRESS, X_ADDRESS, PAGER_NUMBER, PAGER_NUMBER_AREA,  PAGER_NUMBER_7DIGIT,  PAGER_NUMBER_EXTENSION, FAX_NUMBER, FAX_NUMBER_AREA,  FAX_NUMBER_7DIGIT,  FAX_NUMBER_EXTENSION, COMPANY_NAME, COMMENT, MISC_INFO, GRAND_BREAK_FIELD ) as select USER_ID, LAST_NAME, FIRST_NAME, EMPLOYEE_ID, NOTIFY_METHOD, ! Full Primary Phone Number '('||PRIMARY_PHONE_AREA||')'||0 (SUBSTRING(PRIMARY_PHONE FROM 1 FOR 3))||'-'||+ (SUBSTRING(PRIMARY_PHONE FROM 4 FOR 4))|| ' x'||PRIMARY_EXTENSION, PRIMARY_PHONE_AREA, PRIMARY_PHONE, PRIMARY_EXTENSION, ! Full Secondary Phone Number" '('||SECONDARY_PHONE_AREA||')'||2 (SUBSTRING(SECONDARY_PHONE FROM 1 FOR 3))||'-'||- (SUBSTRING(SECONDARY_PHONE FROM 4 FOR 4))|| ' x'||SECONDARY_EXTENSION, SECONDARY_PHONE_AREA, SECONDARY_PHONE, SECONDARY_EXTENSION, US_MAIL_ROUTING, US_MAIL_ADDRESS, CITY, STATE, ZIP, MAIL_STOP, BUILDING, BUILDING_LOCATION, EMAIL_ADDRESS, X_ADDRESS, ! Full Pager Phone Number '('||PAGER_AREA||')'||/ (SUBSTRING(PAGER_NUMBER FROM 1 FOR 3))||'-'||* (SUBSTRING(PAGER_NUMBER FROM 4 FOR 4))|| ' x'||PAGER_EXT, PAGER_AREA, PAGER_NUMBER, PAGER_EXT, ! Full FAX Phone Number '('||FAX_AREA||')'||- (SUBSTRING(FAX_NUMBER FROM 1 FOR 3))||'-'||( (SUBSTRING(FAX_NUMBER FROM 4 FOR 4))|| ' x'||FAX_EXT, FAX_AREA, FAX_NUMBER, FAX_EXT, COMPANY_NAME, COMMENT, MISC_INFO,0 'Useful only as a Bottom of Report break field'from CONTACTS;&create view MH_CONTACT_ALTERNATE_EMAIL ( USER_ID, LAST_NAME, FIRST_NAME, ALTERNATE_EMAIL_ADDRESS, GRAND_BREAK_FIELD ) as select USER_ID, LAST_NAME, FIRST_NAME, EMAIL_ADDRESS,0 'Useful only as a Bottom of Report break field'from CONTACT_ALTERNATE_EMAIL;create view MH_HARDWARE ( USER_ID, HARDWARE, HW_TYPE, HW_REVISION, HW_SERIAL_NUM, HW_MISC_INFO, GRAND_BREAK_FIELD ) as select USER_ID, NAME, TYPE, REVISION, SERIAL_NUM, MISC_INFO,0 'Useful only as a Bottom of Report break field'from HARDWARE;create view MH_LABOR ( REQUEST_ID, REQUEST_ID_PREFIX, REQUEST_ID_DATE, REQUEST_ID_COUNTER, WORK_REPORT_INDEX, USER_ID, LOGGER_ID, LABOR_CODE, START_TIME, START_TIME_YEAR, START_TIME_MONTH, START_TIME_DAY, END_TIME, END_TIME_YEAR, END_TIME_MONTH, END_TIME_DAY, EXPENDED_HOURS, EXPENDED_MINUTES, EXPENDED_SECONDS, GRAND_BREAK_FIELD ) as select REQUEST_ID, SITE_PREFIX, PROBLEM_ID_DATE, PROBLEM_ID_COUNTER, WORK_REPORT_INDEX, USER_ID, LOGGER_ID, LABOR_CODE, START_TIME,! EXTRACT (YEAR FROM START_TIME)," EXTRACT (MONTH FROM START_TIME), EXTRACT (DAY FROM START_TIME), END_TIME, EXTRACT (YEAR FROM END_TIME), EXTRACT (MONTH FROM END_TIME), EXTRACT (DAY FROM END_TIME), EXPENDED_HOURS, EXPENDED_MINUTES, EXPENDED_SECONDS,0 'Useful only as a Bottom of Report break field' from LABOR; create view MH_ASSIGNED_REQUESTS ( REQUEST_ID,  REQUEST_ID_PREFIX,  REQUEST_ID_DATE,  REQUEST_ID_COUNTER, REQUEST_SUBJECT, COMMENT, ATTEMPTS, LOCKED, LOCKED_BY, OWNER_ID, CUSTOMER_ID,  CUSTOMER_LAST_NAME,  CUSTOMER_FIRST_NAME, NOTIFY_METHOD, EMAIL_ADDRESS, BUILDING_LOCATION, PHONE_NUMBER, PHONE_NUMBER_AREA,  PHONE_NUMBER_7DIGIT,  PHONE_NUMBER_EXTENSION, PAGER_NUMBER, PAGER_NUMBER_AREA,  PAGER_NUMBER_7DIGIT, PAGER_NUMBER_EXTENSION, FAX_NUMBER, FAX_NUMBER_AREA, FAX_NUMBER_7DIGIT, FAX_NUMBER_EXTENSION, LOGGER_ID, STATUS, OPEN_OR_CLOSED, QUEUED_OR_ASSIGNED, SEVERITY_VALUE, SEVERITY_NAME, PRIORITY_VALUE, PRIORITY_NAME, CLASS, AFFECTED_HARDWARE,  AFFECTED_SOFTWARE, CATEGORY, WORK_REPORT_COUNT, CC_LIST, DATE_LOGGED, DATE_LOGGED_YEAR,  DATE_LOGGED_MONTH,  DATE_LOGGED_DAY, DATE_DUE, DATE_DUE_YEAR,  DATE_DUE_MONTH,  DATE_DUE_DAY, HOURS_TIL_DUE, DAYS_TIL_DUE, DATE_NEXT_ESCALATION, DATE_NEXT_ESCALATION_YEAR,  DATE_NEXT_ESCALATION_MONTH,  DATE_NEXT_ESCALATION_DAY, DATE_LAST_UPDATE, DATE_LAST_UPDATE_YEAR,  DATE_LAST_UPDATE_MONTH,  DATE_LAST_UPDATE_DAY, GRAND_BREAK_FIELD ) as select REQUEST_ID, SITE_PREFIX, PROBLEM_ID_DATE, PROBLEM_ID_COUNTER, PROBLEM_STATEMENT, COMMENT, ATTEMPTS, LOCKED, LOCKED_BY, OWNER_ID, CUSTOMER_ID, CUSTOMER_LAST_NAME, CUSTOMER_FIRST_NAME, NOTIFY_METHOD, EMAIL_ADDRESS, BUILDING_LOCATION, ! Full Phone Number '('||PHONE_AREA||')'||/ (SUBSTRING(PHONE_NUMBER FROM 1 FOR 3))||'-'||* (SUBSTRING(PHONE_NUMBER FROM 4 FOR 4))|| ' x'||PHONE_EXTENSION, PHONE_AREA, PHONE_NUMBER, PHONE_EXTENSION, ! Full Pager Number '('||PAGER_AREA||')'||/ (SUBSTRING(PAGER_NUMBER FROM 1 FOR 3))||'-'|| * (SUBSTRING(PAGER_NUMBER FROM 4 FOR 4))|| ' x'||PAGER_EXT, PAGER_AREA, PAGER_NUMBER, PAGER_EXT,T ! Full FAX Number '('||FAX_AREA||')'||- (SUBSTRING(FAX_NUMBER FROM 1 FOR 3))||'-'||d( (SUBSTRING(FAX_NUMBER FROM 4 FOR 4))|| ' x'||FAX_EXT, FAX_AREA, FAX_NUMBER, FAX_EXT, LOGGER_ID,  STATUS, OPEN_OR_CLOSED, QUEUED_OR_ASSIGNED, SEVERITY, SEVERITY_NAME, PRIORITY, PRIORITY_NAME,e PROBLEM_TYPE, AFFECTED_HARDWARE,  AFFECTED_SOFTWARE,h " CATEGORY, WORK_REPORT_COUNT,t CC_LIST,e DATE_LOGGED, # EXTRACT (YEAR FROM DATE_LOGGED), t# EXTRACT (MONTH FROM DATE_LOGGED), ! EXTRACT (DAY FROM DATE_LOGGED), DATE_DUE, EXTRACT (YEAR FROM DATE_DUE), EXTRACT (MONTH FROM DATE_DUE), EXTRACT (DAY FROM DATE_DUE), HOURS_TIL_DUE,e DAYS_TIL_DUE, NEXT_ESCALATION,s& EXTRACT (YEAR FROM NEXT_ESCALATION),' EXTRACT (MONTH FROM NEXT_ESCALATION),n% EXTRACT (DAY FROM NEXT_ESCALATION), LAST_UPDATE,e" EXTRACT (YEAR FROM LAST_UPDATE),# EXTRACT (MONTH FROM LAST_UPDATE), ! EXTRACT (DAY FROM LAST_UPDATE),E0 'Useful only as a Bottom of Report break field'from PROBLEMS;create view MH_QUEUED_REQUESTS ( REQUEST_ID, e REQUEST_ID_PREFIX, t REQUEST_ID_DATE, i REQUEST_ID_COUNTER,P REQUEST_SUBJECT,w COMMENT,g ATTEMPTS, LOCKED, LOCKED_BY, OWNER_ID, CUSTOMER_ID,  CUSTOMER_LAST_NAME,  CUSTOMER_FIRST_NAME, NOTIFY_METHOD,e EMAIL_ADDRESS,  BUILDING_LOCATION,t PHONE_NUMBER, PHONE_NUMBER_AREA, n PHONE_NUMBER_7DIGIT, e PHONE_NUMBER_EXTENSION,t PAGER_NUMBER, PAGER_NUMBER_AREA,  PAGER_NUMBER_7DIGIT, PAGER_NUMBER_EXTENSION,m FAX_NUMBER, FAX_NUMBER_AREA, FAX_NUMBER_7DIGIT, FAX_NUMBER_EXTENSION, LOGGER_ID,l STATUS, OPEN_OR_CLOSED, QUEUED_OR_ASSIGNED, SEVERITY_VALUE, SEVERITY_NAME,  PRIORITY_VALUE, PRIORITY_NAME,  CLASS,y AFFECTED_HARDWARE,  AFFECTED_SOFTWARE,t CATEGORY, WORK_REPORT_COUNT, CC_LIST,e DATE_LOGGED,E DATE_LOGGED_YEAR,  DATE_LOGGED_MONTH, d DATE_LOGGED_DAY, DATE_DUE, DATE_DUE_YEAR, h DATE_DUE_MONTH,  DATE_DUE_DAY,t HOURS_TIL_DUE,  DAYS_TIL_DUE, DATE_NEXT_ESCALATION, DATE_NEXT_ESCALATION_YEAR,  DATE_NEXT_ESCALATION_MONTH,  DATE_NEXT_ESCALATION_DAY,P DATE_LAST_UPDATE, DATE_LAST_UPDATE_YEAR,  DATE_LAST_UPDATE_MONTH,  DATE_LAST_UPDATE_DAY,  GRAND_BREAK_FIELD ) as selecte REQUEST_ID, SITE_PREFIX,i PROBLEM_ID_DATE,a PROBLEM_ID_COUNTER, PROBLEM_STATEMENT, COMMENT, ATTEMPTS, LJ $MULTIHELP020.E9,a [EXAMPLES]MH_VIEWS.SQL;7PT2"&OCKED, LOCKED_BY, OWNER_ID, CUSTOMER_ID,  CUSTOMER_LAST_NAME, CUSTOMER_FIRST_NAME,d NOTIFY_METHOD, EMAIL_ADDRESS,h BUILDING_LOCATION,  ! Full Phone Number '('||PHONE_AREA||')'||/ (SUBSTRING(PHONE_NUMBER FROM 1 FOR 3))||'-'||* (SUBSTRING(PHONE_NUMBER FROM 4 FOR 4))|| ' x'||PHONE_EXTENSION, PHONE_AREA, PHONE_NUMBER, PHONE_EXTENSION,C ! Full Pager Number '('||PAGER_AREA||')'||/ (SUBSTRING(PAGER_NUMBER FROM 1 FOR 3))||'-'|| * (SUBSTRING(PAGER_NUMBER FROM 4 FOR 4))|| ' x'||PAGER_EXT, PAGER_AREA, PAGER_NUMBER, PAGER_EXT,C ! Full FAX Number '('||FAX_AREA||')'||- (SUBSTRING(FAX_NUMBER FROM 1 FOR 3))||'-'||C( (SUBSTRING(FAX_NUMBER FROM 4 FOR 4))|| ' x'||FAX_EXT, FAX_AREA, FAX_NUMBER, FAX_EXT,o LOGGER_ID,  STATUS, OPEN_OR_CLOSED, QUEUED_OR_ASSIGNED, SEVERITY, SEVERITY_NAME,e PRIORITY, PRIORITY_NAME,a PROBLEM_TYPE, AFFECTED_HARDWARE,c AFFECTED_SOFTWARE,n CATEGORY, WORK_REPORT_COUNT,n CC_LIST, DATE_LOGGED, # EXTRACT (YEAR FROM DATE_LOGGED), f# EXTRACT (MONTH FROM DATE_LOGGED),c! EXTRACT (DAY FROM DATE_LOGGED),d DATE_DUE, EXTRACT (YEAR FROM DATE_DUE), EXTRACT (MONTH FROM DATE_DUE), EXTRACT (DAY FROM DATE_DUE), HOURS_TIL_DUE,_ DAYS_TIL_DUE, NEXT_ESCALATION,i& EXTRACT (YEAR FROM NEXT_ESCALATION),' EXTRACT (MONTH FROM NEXT_ESCALATION),a% EXTRACT (DAY FROM NEXT_ESCALATION), LAST_UPDATE,f" EXTRACT (YEAR FROM LAST_UPDATE),# EXTRACT (MONTH FROM LAST_UPDATE),c! EXTRACT (DAY FROM LAST_UPDATE),w0 'Useful only as a Bottom of Report break field'from QUEUED_PROBLEMS;icreate view MH_SOFTWAREi ( USER_ID,S SOFTWARE, SW_MAJOR_VERSION, SW_MINOR_VERSION, SW_SUB_VERSION, SW_WHOLE_VERSION, SW_LICENSE_EXPIRATION,d SW_MISC_INFO, GRAND_BREAK_FIELD ) as selecto USER_ID,O NAME, MAJOR_VERSION,d MINOR_VERSION,A SUB_VERSION,w WHOLE_VERSION,  LICENSE_EXPIRATION, MISC_INFO,i0 'Useful only as a Bottom of Report break field'from SOFTWARE;create view MH_USERS ( USER_ID,o!!!!!!!_>! even though the password is encrypted, we'll comment it out +! so that it is not seen as a security risk-!!!!!!! PASSWORD,- PASSWORD_REQUIRED,S REVIEW_OWN_REQUESTS,i REVIEW_ALL_REQUESTS,o SOLUTION_QUERY, SOLUTION_ADD, SOLUTION_MODIFY,C BULLETIN_VIEW,i BULLETIN_MODIFY,d UPDATE_HW_LIST, UPDATE_SW_LIST, ADMIN_PRIV, GENERATE_REPORTS, STORE_REPORTS,L LOG_REQUESTS_OTHERS,E UPDATE_CONTACT, IS_CUSTOMER,E REPORT_GROUP1,w REPORT_GROUP2,E COMMENT,o MISC_INFO,P GRAND_BREAK_FIELD ) as select; USER_ID,o!!!!!!!w>! even though the password is encrypted, we'll comment it out +! so that it is not seen as a security riskR!!!!!!! PASSWORD,w PASSWORD_REQUIRED, REVIEW_OWN_PROBLEMS,N REVIEW_ALL_PROBLEMS,P EXPERT_QUERY, EXPERT_ADD, EXPERT_MODIFY,d BULLETIN_VIEW,R BULLETIN_MODIFY,R UPDATE_HW_LIST, UPDATE_SW_LIST, ADMIN_PRIV, GENERATE_REPORTS, STORE_REPORTS,- LOG_PROBLEMS_OTHERS,w UPDATE_CONTACT, IS_CUSTOMER,S REPORT_GROUP1, REPORT_GROUP2,L COMMENT,T MISC_INFO,0 'Useful only as a Bottom of Report break field' from USERS;Tcreate view MH_WORK_REPORTSS ( REQUEST_ID, REQUEST_ID_PREFIX, REQUEST_ID_DATE, REQUEST_ID_COUNTER, DATE_ENTERED, DATE_ENTERED_YEAR, DATE_ENTERED_MONTH,I DATE_ENTERED_DAY,S OWNER_ID, WORK_REPORT_INDEX,i SUMMARY,T HIDDEN, QUIET,o STATUS, OPEN_OR_CLOSED, GRAND_BREAK_FIELD ) as selectD REQUEST_ID, SITE_PREFIX,- PROBLEM_ID_DATE,- PROBLEM_ID_COUNTER, DATE_ENTERED,# EXTRACT (YEAR FROM DATE_ENTERED),E$ EXTRACT (MONTH FROM DATE_ENTERED)," EXTRACT (DAY FROM DATE_ENTERED), OWNER, WORK_REPORT_INDEX,E SUMMARY,  HIDDEN, QUIET,N STATUS, OPEN_OR_CLOSED,0 'Useful only as a Bottom of Report break field'from WORK_REPORTS;CREATE VIEW MH_WR_REQUEST ( ! General Problem Information REQUEST_ID, REQUEST_SUBJECT,A OWNER_ID, ! customer informationR CUSTOMER_ID,  CUSTOMER_LAST_NAME,  CUSTOMER_FIRST_NAME,6 NOTIFY_METHOD, !phone=T;Pager=P;Mail=M;Popup=X;Fax=F; EMAIL_ADDRESS,Y BUILDING_LOCATION,P PHONE_NUMBER, PAGER_NUMBER, FAX_NUMBER, ! misc info LOGGER_ID,B CURRENT_STATUS, OPEN_OR_CLOSED, !'O' or 'C' QUEUED_OR_ASSIGNED, !'Q' or 'A' SEVERITY_VALUE, !numeric 0..99 SEVERITY_NAME,_ PRIORITY_VALUE, !numeric 0..99 PRIORITY_NAME,T CLASS,E WORK_REPORT_COUNT,C CC_LIST,C DATE_LOGGED,R DATE_LOGGED_YEAR, DATE_LOGGED_MONTH, DATE_LOGGED_DAY, DATE_DUE, DATE_DUE_YEAR, DATE_DUE_MONTH,N DATE_DUE_DAY,O HOURS_TIL_DUE,N DAYS_TIL_DUE, DATE_LAST_UPDATE, DATE_LAST_UPDATE_YEAR, N DATE_LAST_UPDATE_MONTH,  DATE_LAST_UPDATE_DAY,E ! Work Report Information WR_DATE_ENTERED,F WR_DATE_ENTERED_YEAR,A WR_DATE_ENTERED_MONTH, WR_DATE_ENTERED_DAY, WR_AUTHOR_ID, WR_INDEX, WR_SUMMARY, WR_HIDDEN, WR_QUIET, WR_STATUS,U WR_OPEN_OR_CLOSED, !'O' or 'C'_ GRAND_BREAK_FIELD ) as select P.REQUEST_ID, P.PROBLEM_STATEMENT,A P.OWNER_ID, P.CUSTOMER_ID,  P.CUSTOMER_LAST_NAME,  P.CUSTOMER_FIRST_NAME, P.NOTIFY_METHOD,_ P.EMAIL_ADDRESS,G P.BUILDING_LOCATION,  ! Full Phone Number '('||P.PHONE_AREA||')'||1 (SUBSTRING(P.PHONE_NUMBER FROM 1 FOR 3))||'-'||E, (SUBSTRING(P.PHONE_NUMBER FROM 4 FOR 4))|| ' x'||P.PHONE_EXTENSION, ! Full Pager Number '('||PAGER_AREA||')'||1 (SUBSTRING(P.PAGER_NUMBER FROM 1 FOR 3))||'-'||M, (SUBSTRING(P.PAGER_NUMBER FROM 4 FOR 4))|| ' x'||P.PAGER_EXT, ! Full FAX Number '('||P.FAX_AREA||')'||/ (SUBSTRING(P.FAX_NUMBER FROM 1 FOR 3))||'-'||* (SUBSTRING(P.FAX_NUMBER FROM 4 FOR 4))|| ' x'||P.FAX_EXT, P.LOGGER_ID,S P.STATUS, P.OPEN_OR_CLOSED, P.QUEUED_OR_ASSIGNED, P.SEVERITY, P.SEVERITY_NAME,O P.PRIORITY, P.PRIORITY_NAME,  P.PROBLEM_TYPE, P.WORK_REPORT_COUNT,E P.CC_LIST,1 P.DATE_LOGGED, % EXTRACT (YEAR FROM P.DATE_LOGGED), )% EXTRACT (MONTH FROM P.DATE_LOGGED),E# EXTRACT (DAY FROM P.DATE_LOGGED), P.DATE_DUE," EXTRACT (YEAR FROM P.DATE_DUE), " EXTRACT (MONTH FROM P.DATE_DUE), EXTRACT (DAY FROM P.DATE_DUE), P.HOURS_TIL_DUE,) P.DAYS_TIL_DUE, P.LAST_UPDATE,,$ EXTRACT (YEAR FROM P.LAST_UPDATE),% EXTRACT (MONTH FROM P.LAST_UPDATE), # EXTRACT (DAY FROM P.LAST_UPDATE),| WR.DATE_ENTERED,G& EXTRACT (YEAR FROM WR.DATE_ENTERED),' EXTRACT (MONTH FROM WR.DATE_ENTERED),T% EXTRACT (DAY FROM WR.DATE_ENTERED),O WR.OWNER, WR.WORK_REPORT_INDEX, WR.SUMMARY, WR.HIDDEN, WR.QUIET, WR.STATUS,P WR.OPEN_OR_CLOSED,E0 'Useful only as a Bottom of Report break field'from ALL_PROBLEMS P, WORK_REPORTS WRwhere& WR.REQUEST_ID = P.REQUEST_ID;CREATE VIEW MH_WR_REQUEST_LABOR ( ! General Problem Information REQUEST_ID, REQUEST_SUBJECT,D OWNER_ID, ! customer informationE CUSTOMER_ID,  CUSTOMER_LAST_NAME,  CUSTOMER_FIRST_NAME,6 NOTIFY_METHOD, !phone=T;Pager=P;Mail=M;Popup=X;Fax=F; EMAIL_ADDRESS,X BUILDING_LOCATION,T PHONE_NUMBER, PAGER_NUMBER, FAX_NUMBER, ! misc info LOGGER_ID,  CURRENT_STATUS, OPEN_OR_CLOSED, !'O' or 'C'H QUEUED_OR_ASSIGNED, !'Q' or 'A' SEVERITY_VALUE, !numeric 0..99 SEVERITY_NAME,f PRIORITY_VALUE, !numeric 0..99 PRIORITY_NAME,v CLASS,A WORK_REPORT_COUNT,C CC_LIST,P DATE_LOGGED,, DATE_LOGGED_YEAR, DATE_LOGGED_MONTH, DATE_LOGGED_DAY, DATE_DUE, DATE_DUE_YEAR, DATE_DUE_MONTH,  DATE_DUE_DAY,L HOURS_TIL_DUE,r DAYS_TIL_DUE, DATE_LAST_UPDATE, DATE_LAST_UPDATE_YEAR, E DATE_LAST_UPDATE_MONTH,  DATE_LAST_UPDATE_DAY,A ! Work Report Information WR_DATE_ENTERED,o WR_DATE_ENTERED_YEAR, WR_DATE_ENTERED_MONTH, WR_DATE_ENTERED_DAY, WR_AUTHOR_ID, WR_INDEX, WR_SUMMARY, WR_HIDDEN, WR_QUIET, WR_STATUS,) WR_OPEN_OR_CLOSED, !'O' or 'C' ! Labor Information0 LABOR_OWNER_ID, !person receiving labor credit- LABOR_GIVER_ID, !person giving labor credit(# LABOR_CODE, !LaborAssist "LA" !LaborProblem "LP"T !LaborAttempt "LT" !LaborProbCreate "LC"s !LaborProbCancel "LN" !LaborProbSelf "LS"T LABOR_START_TIME, LABOR_START_TIME_YEAR, LABOR_START_TIME_MONTH,l LABOR_START_TIME_DAY,; LABOR_END_TIME, LABOR_END_TIME_YEAR, LABOR_END_TIME_MONTH,C LABOR_END_TIME_DAY, LABOR_EXPENDED_HOURS, GRAND_BREAK_FIELD ) as select P.REQUEST_ID, P.PROBLEM_STATEMENT,o P.OWNER_ID, P.CUSTOMER_ID,  P.CUSTOMER_LAST_NAME,  P.CUSTOMER_FIRST_NAME, P.NOTIFY_METHOD, P.EMAIL_ADDRESS,R P.BUILDING_LOCATION, ! Full Phone Number '('||P.PHONE_AREA||')'||1 (SUBSTRING(P.PHONE_NUMBER FROM 1ʠt$MULTIHELP020.E9,a [EXAMPLES]MH_VIEWS.SQL;7PT"7 FOR 3))||'-'||M, (SUBSTRING(P.PHONE_NUMBER FROM 4 FOR 4))|| ' x'||P.PHONE_EXTENSION, ! Full Pager Number '('||PAGER_AREA||')'||1 (SUBSTRING(P.PAGER_NUMBER FROM 1 FOR 3))||'-'||, (SUBSTRING(P.PAGER_NUMBER FROM 4 FOR 4))|| ' x'||P.PAGER_EXT, ! Full FAX Number '('||P.FAX_AREA||')'||/ (SUBSTRING(P.FAX_NUMBER FROM 1 FOR 3))||'-'||I* (SUBSTRING(P.FAX_NUMBER FROM 4 FOR 4))|| ' x'||P.FAX_EXT, P.LOGGER_ID,_ P.STATUS, P.OPEN_OR_CLOSED, P.QUEUED_OR_ASSIGNED, P.SEVERITY, P.SEVERITY_NAME,G P.PRIORITY, P.PRIORITY_NAME, P.PROBLEM_TYPE, P.WORK_REPORT_COUNT,E P.CC_LIST, P.DATE_LOGGED, % EXTRACT (YEAR FROM P.DATE_LOGGED), I% EXTRACT (MONTH FROM P.DATE_LOGGED),I# EXTRACT (DAY FROM P.DATE_LOGGED),S P.DATE_DUE," EXTRACT (YEAR FROM P.DATE_DUE), " EXTRACT (MONTH FROM P.DATE_DUE), EXTRACT (DAY FROM P.DATE_DUE), P.HOURS_TIL_DUE,  P.DAYS_TIL_DUE, P.LAST_UPDATE,N$ EXTRACT (YEAR FROM P.LAST_UPDATE),% EXTRACT (MONTH FROM P.LAST_UPDATE), # EXTRACT (DAY FROM P.LAST_UPDATE),  WR.DATE_ENTERED,O& EXTRACT (YEAR FROM WR.DATE_ENTERED),' EXTRACT (MONTH FROM WR.DATE_ENTERED),N% EXTRACT (DAY FROM WR.DATE_ENTERED),S WR.OWNER, WR.WORK_REPORT_INDEX, WR.SUMMARY, WR.HIDDEN, WR.QUIET, WR.STATUS,E WR.OPEN_OR_CLOSED,! L.USER_ID,h L.LOGGER_ID,( L.LABOR_CODE, L.START_TIME,# EXTRACT (YEAR FROM L.START_TIME),$ EXTRACT (MONTH FROM L.START_TIME)," EXTRACT (DAY FROM L.START_TIME), L.END_TIME,# EXTRACT (YEAR FROM L.START_TIME),n$ EXTRACT (MONTH FROM L.START_TIME)," EXTRACT (DAY FROM L.START_TIME), L.EXPENDED_HOURS,0 'Useful only as a Bottom of Report break field'from) ALL_PROBLEMS P, WORK_REPORTS WR, LABOR L,whereE5 WR.REQUEST_ID = P.REQUEST_ID and 5 L.REQUEST_ID = WR.REQUEST_ID andA2 L.WORK_REPORT_INDEX = WR.WORK_REPORT_INDEX; N!-Admin Views----------------------------------------------------------------- !create view ADM_CLASS_DESCENDANTS' ( CLASS_ANCESTOR, CLASS_DESCENDANT, CLASS_DESCENDANT_PARENT,E GRAND_BREAK_FIELD ) as select ANCESTOR, DESCENDANT, DESC_PARENT,0 'Useful only as a Bottom of Report break field'from CLASS_DESCENDANTS;screate view ADM_ESCALATION ( REQUEST_ID, NEXT_ESCALATION,S NEXT_ESCALATION_YEAR,s NEXT_ESCALATION_MONTH, NEXT_ESCALATION_DAY, CURRENT_DUE_DATE, CURRENT_DUE_DATE_YEAR, CURRENT_DUE_DATE_MONTH,_ CURRENT_DUE_DATE_DAY,U CURRENT_SEVERITY_VALUE, CLASS,_ OWNER,G CURRENT_PRIORITY_VALUE, CURRENT_PRIORITY_NAME,Y INITIAL_PRIORITY_VALUE, INITIAL_PRIORITY_NAME,D GRAND_BREAK_FIELD ) as selectE REQUEST_ID, NEXT_ESCALATION,N& EXTRACT (YEAR FROM NEXT_ESCALATION),' EXTRACT (MONTH FROM NEXT_ESCALATION),l% EXTRACT (DAY FROM NEXT_ESCALATION),O CURRENT_DUE_DATE,' EXTRACT (YEAR FROM CURRENT_DUE_DATE),U( EXTRACT (MONTH FROM CURRENT_DUE_DATE),& EXTRACT (DAY FROM CURRENT_DUE_DATE), CURRENT_SEVERITY, PROBLEM_CLASS,E OWNER,R CURRENT_PRIORITY, CURRENT_PRIORITY_NAME,R INITIAL_PRIORITY, INITIAL_PRIORITY_NAME,F0 'Useful only as a Bottom of Report break field'from ESCALATION; create view ADM_ESCALATION_HOURS ( DAY_OF_WEEK,a HOUR_BITS,p GRAND_BREAK_FIELD ) as selectr DAY_OF_WEEK,S HOUR_BITS,S0 'Useful only as a Bottom of Report break field'from ESCALATION_HOURS; create view ADM_FIRST_ESCALATION ( USER_ID,A CLASS, GRAND_BREAK_FIELD ) as select, USER_ID,_ PROBLEM_TYPE,0 'Useful only as a Bottom of Report break field'from FIRST_ESCALATION;create view ADM_LICENSES ( NI_ADDRESS, HARDWARE_MODEL, NODENAME, DATE_EXPIRATION,_ DATE_EXPIRATION_YEAR, DATE_EXPIRATION_MONTH,R DATE_EXPIRATION_DAY,R CONCURRENT_USERS, CHECKSUM, GRAND_BREAK_FIELD ) as selectE NI_ADDRESS, HARDWARE_MODEL, NODENAME, EXPIRATION,! EXTRACT (YEAR FROM EXPIRATION)," EXTRACT (MONTH FROM EXPIRATION), EXTRACT (DAY FROM EXPIRATION), CONCURRENT_USERS, CHECKSUM,0 'Useful only as a Bottom of Report break field'from LICENSES;create view ADM_MAINTENANCE_ ( MAINTENANCE_INDEX,E BACKUP_INTERVAL,_ BACKUP_NEXT,E BACKUP_DEVICE,T BACKUP_ENABLED, DB_ARCHIVAL_INTERVAL, DB_ARCHIVAL_NEXT, DB_ARCHIVAL_AGE, DB_ARCHIVAL_OPEN_CALLS, DB_ARCHIVAL_ENABLED,N X_ARCHIVAL_INTERVAL, X_ARCHIVAL_NEXT,I X_ARCHIVAL_AGE, X_ARCHIVAL_ENABLED, GRAND_BREAK_FIELD ) as selectP MAINTENANCE_INDEX,L BACKUP_INTERVAL, BACKUP_NEXT,A BACKUP_DEVICE,B BACKUP_ENABLED, DB_ARCHIVAL_INTERVAL, DB_ARCHIVAL_NEXT, DB_ARCHIVAL_AGE,O DB_ARCHIVAL_OPEN_CALLS, DB_ARCHIVAL_ENABLED, X_ARCHIVAL_INTERVAL, X_ARCHIVAL_NEXT,R X_ARCHIVAL_AGE, X_ARCHIVAL_ENABLED,0 'Useful only as a Bottom of Report break field'from MAINTENANCE;Dcreate view ADM_PARTNER_PIDS ( REQUEST_ID_PREFIX,' REQUEST_ID_DATE,P REQUEST_ID_COUNTER, PARTNER_PID,  GRAND_BREAK_FIELD ) as select4 SITE_PREFIX,H PROBLEM_ID_DATE,O PROBLEM_ID_COUNTER, PARTNER_PID,N0 'Useful only as a Bottom of Report break field'from PARTNER_PIDS; create view ADM_PRIORITY_DEFAULT ( PRIORITY_VALUE, GRAND_BREAK_FIELD ) as select_ PRIORITY,0 'Useful only as a Bottom of Report break field'from PROBLEM_PRIORITY_DEFAULT;create view ADM_REQUEST_ID ( REQUEST_ID_INDEX, REQUEST_ID_PREFIX,M REQUEST_ID_DATE,' REQUEST_ID_COUNTER, GRAND_BREAK_FIELD ) as select_ PROBLEM_ID_INDEX, SITE_PREFIX,Q COUNTER_DATE, COUNTER_ID,0 'Useful only as a Bottom of Report break field'from PROBLEM_ID; create view ADM_SEVERITY_DEFAULT ( SEVERITY_VALUE, GRAND_BREAK_FIELD ) as select_ SEVERITY,0 'Useful only as a Bottom of Report break field'from PROBLEM_SEVERITY_DEFAULT;!create view ADM_SYSTEM_PARAMETERS, ( SYSTEM_INDEX, REQUEST_ACCESS, SOLUTION_ACCESS,  SYSTEM_ACCESS,R GRAND_BREAK_FIELD ) as selectL SYSTEM_INDEX, PROBLEM_ACCESS, EXPERT_ACCESS,C SYSTEM_ACCESS,_0 'Useful only as a Bottom of Report break field'from SYSTEM_PARAMETERS; create view ADM_TOP_ESCALATION ( USER_ID,A GRAND_BREAK_FIELD ) as selectN USER_ID,T0 'Useful only as a Bottom of Report break field'from TOP_ESCALATION;create view ADM_VENDOR ( NAME, PHONE_AREA, PHONE_NUMBER, ACCOUNT, EMAIL_ADDRESS,  HELPDESK_TYPE,, COMMENT,S GRAND_BREAK_FIELD ) as selectP NAME, PHONE_AREA, PHONE_NUMBER, ACCOUNT,C EMAIL_ADDRESS,Y HELPDESK_TYPE,C COMMENT, 0 'Useful only as a Bottom of Report break field' from VENDOR;N!-Reporting Views------------------------------------------------------------- create view REP_REPORTSB ( REPORT_NAME,G REPORT_QUERY, GRAND_BREAK_FIELD ) as select7 REPORT_NAME,_ REPORT_QUERY,0 'Useful only as a Bottom of Report break field' from REPORTS;_create view REP_REPORT_BREAK ( NAME, USER_ID,O INDEX_POS,_ INDEX_BREAK,S TABLE_FIELD_NAME, TEXT_VALUE, FUNCTION_VALUE, WIDTH,_ BREAK_POSITION, FIELD_SIZE, FIELD_TYPE, FIELD_SUB_TYPE, INTERVAL_TYPE,E DATE_FORMAT,C DATE_FORMAT_VALUE,D BREAK_HEADER, TOP_BOTTOM_BREAK, ALIGNMENT, ALIGNMENT_VALUE, GRAND_BREAK_FIELD ) as selectA NAME, USER_ID,A INDEX_POS, INDEX_BREAK,  TABLE_FIELD_NAME, TEXT_VALUE, FUNCTION_VALUE, WIDTH,I BREAK_POSITION, FIELD_SIZE, FIELD_TYPE, FIELD_SUB_TYPE, INTERVAL_TYPE,A DATE_FORMAT,A DATE_FORMAT_VALUE,  BREAK_HEADER, TOP_BOTTOM_BREAK, ALIGNMENT,D ALIGNMENT_VALUE,F0 'Useful only as a Bottom of Report break field'from REPORT_BREAK;create view REP_REPORT_GENERAL ( NAME, USER_ID, OUTPUT_TITLE, TITLE_SIZE, TITLE,N BOTTOM_TITLE, FLAT_COLUMN_DELIMITER,M WIDTH,O LINES_PER_PAGE, COLUMN_SPACING, RIGHT_MARGIN, LEFT_MARGIN,A TOP_MARGIN, BOTTOM_MARGIN,  ENCLOSE_QUOTES, TABULAR_COLUMNS,P TABULAR_TITLE,1 FLATFILE_COLUMNS, FLATFILE_TITLE, LIMIT_ROWS, GRAND_BREAK_FIELD ) as select NAME, USER_ID,E OUTPUT_TITLE, TITLE_SIZE, TITLE,a BOTTOM_TITLE, FLAT_COLUMN_DELIMITER,S WIDTH,P LINES_PER_PAGE, COLUMN_SPACING, RIGHT_MARGIN, LEFT_MARGIN,4 TOP_MARGIN, BOTTOM_MARGIN, ENCLOSE_QUOTES, TABULAR_COLUMNS,E TABULAR_TITLE,  FLATFILE_COLUMNS, FLATFILE_TITLE, LIMIT_ROWS,0 'Useful only as a Bottom of Report break field'from REPORT_GENERAL;create view REP_REPORT_INFOX ( NAME, USER_ID,L INDEX_POS,S LAST_INDEX, INFO_TEXT,Q GRAND_BREAK_FIELD ) as selectV NAME, USER_ID,R INDEX_POS,T LAST_INDEX, INFO_TEXT,A0 'Useful only as a Bottom of Report break field'from REPORT_INFO;Ucreate view REP_REPORT_JOINS ( NAME,FH$MULTIHELP020.E9,a [EXAMPLES]MH_VIEWS.SQL;7PT pH USER_ID,D INDEX_POS,f TABLE1, FIELD1, TABLE2, FIELD2, GRAND_BREAK_FIELD ) as select NAME, USER_ID,C INDEX_POS,D TABLE1, FIELD1, TABLE2, FIELD2,0 'Useful only as a Bottom of Report break field'from REPORT_JOINS; create view REP_REPORT_RESOURCES ( NAME, USER_ID,, INDEX_POS,M TABLE_NAME, FIELD_NAME, FIELD_SIZE, FIELD_TYPE, FIELD_SUB_TYPE, SORT_ORDER, SORT_ORDER_VALUE, SORT_PRECEDENCE_VALUE,M BREAK_FIELD,U OUTPUT_FIELD, COMPUTED_FIELD, COMPUTED_FIELD_STRING,  COLUMN_HEADER,p COLUMN_HEADER_STRING, COLUMN_WIDTH, COLUMN_WIDTH_VALUE_ORG, COLUMN_WIDTH_VALUE_USER,R ALIGNMENT,_ ALIGNMENT_VALUE,_ VALUE_COUNT,U BREAK_COUNT,_ BREAK_PAGE_BREAK, BREAK_OUTPUT_HEADER,S BREAK_BLANK_LINES,B DATE_FIELD, DATE_FORMAT,U GRAND_BREAK_FIELD ) as select NAME, USER_ID,S INDEX_POS, TABLE_NAME, FIELD_NAME, FIELD_SIZE, FIELD_TYPE, FIELD_SUB_TYPE, SORT_ORDER, SORT_ORDER_VALUE, SORT_PRECEDENCE_VALUE, BREAK_FIELD,U OUTPUT_FIELD, COMPUTED_FIELD, COMPUTED_FIELD_STRING,, COLUMN_HEADER,  COLUMN_HEADER_STRING, COLUMN_WIDTH, COLUMN_WIDTH_VALUE_ORG, COLUMN_WIDTH_VALUE_USER, ALIGNMENT,E ALIGNMENT_VALUE,L VALUE_COUNT,S BREAK_COUNT, BREAK_PAGE_BREAK, BREAK_OUTPUT_HEADER,I BREAK_BLANK_LINES,O DATE_FIELD, DATE_FORMAT,D0 'Useful only as a Bottom of Report break field'from REPORT_RESOURCES;create view REP_REPORT_SQL ( NAME, USER_ID,P SQL_STRING, USER_SQL_STRING,C ACTIVE_COUNT, JOIN_COUNT, SYSTEM_DEFAULT, GRAND_BREAK_FIELD ) as select  NAME, USER_ID,s SQL_STRING, USER_SQL_STRING,i ACTIVE_COUNT, JOIN_COUNT, SYSTEM_DEFAULT,0 'Useful only as a Bottom of Report break field'from REPORT_SQL;create view REP_REPORT_VALUE ( NAME, USER_ID,, INDEX_POS,I INDEX_VALUE,_ VALUE_STRING, VALUE_FUNCTION, GRAND_BREAK_FIELD ) as selectN NAME, USER_ID,E INDEX_POS,E INDEX_VALUE,G VALUE_STRING, VALUE_FUNCTION,0 'Useful only as a Bottom of Report break field'from REPORT_VALUE;N!-Solution Views-------------------------------------------------------------- create view SOL_SOLUTIONS, ( SOLUTION_ID,I PREVENT_ARCHIVAL, DATE_LAST_VIEWED, DATE_LAST_VIEWED_YEAR, DATE_LAST_VIEWED_MONTH,E DATE_LAST_VIEWED_DAY,T VIEW_COUNT, CREATION_AUTHOR,O DATE_CREATED, DATE_CREATED_YEAR, DATE_CREATED_MONTH,R DATE_CREATED_DAY,K REQUEST_ID, STORED_LOCALLY, SOURCE, CUSTOMER_VIEWABLE,I GRAND_BREAK_FIELD ) as selectT SOLUTION_ID,X PREVENT_ARCHIVAL, DATE_LAST_VIEWED,& EXTRACT(YEAR FROM DATE_LAST_VIEWED),' EXTRACT(MONTH FROM DATE_LAST_VIEWED),R% EXTRACT(DAY FROM DATE_LAST_VIEWED), VIEW_COUNT, CREATION_AUTHOR,E DATE_CREATED," EXTRACT(YEAR FROM DATE_CREATED),# EXTRACT(MONTH FROM DATE_CREATED),H! EXTRACT(DAY FROM DATE_CREATED),m PROBLEM_ID, STORED_LOCALLY, SOURCE, CUSTOMER_VIEWABLE,c0 'Useful only as a Bottom of Report break field'from SOLUTIONS;T create view SOL_SOLUTIONS_ACCESS ( SOLUTION_ID,= LOCATION, ACCESS, CONTACT,Y GRAND_BREAK_FIELD ) as selectE SOLUTION_ID,E LOCATION, ACCESS, CONTACT,L0 'Useful only as a Bottom of Report break field'from SOLUTIONS_ACCESS;*create view SOL_SOLUTION_AFFECTED_HARDWARE ( SOLUTION_ID,_ AFFECTED_HARDWARE,U GRAND_BREAK_FIELD ) as selectT SOLUTION_ID,R AFFECTED_HARDWARE,_0 'Useful only as a Bottom of Report break field' from SOLUTION_AFFECTED_HARDWARE;*create view SOL_SOLUTION_AFFECTED_SOFTWARE ( SOLUTION_ID,D AFFECTED_SOFTWARE,N GRAND_BREAK_FIELD ) as select, SOLUTION_ID,P AFFECTED_SOFTWARE,L0 'Useful only as a Bottom of Report break field' from SOLUTION_AFFECTED_SOFTWARE;!create view SOL_SOLUTION_ARTICLES  ( SOLUTION_ID,T GRAND_BREAK_FIELD ) as selectH SOLUTION_ID,E0 'Useful only as a Bottom of Report break field'from SOLUTION_ARTICLES;D create view SOL_SOLUTION_CLASSES ( SOLUTION_ID,R CLASS,, GRAND_BREAK_FIELD ) as selectI SOLUTION_ID,_ CLASS,.0 'Useful only as a Bottom of Report break field'from SOLUTION_CLASSES;create view SOL_SOLUTION_IDI ( SOLUTION_ID_INDEX,r SOLUTION_ID_PREFIX, SOLUTION_ID_DATE, SOLUTION_ID_COUNTER,F GRAND_BREAK_FIELD ) as selectE SOLUTION_ID_INDEX,) SITE_PREFIX,H COUNTER_DATE, COUNTER_ID,0 'Useful only as a Bottom of Report break field'from SOLUTION_ID;F!create view SOL_SOLUTION_KEYWORDSN ( SOLUTION_ID,) ARTICLE_KEYWORD,_ GRAND_BREAK_FIELD ) as selectF SOLUTION_ID, ARTICLE_KEYWORD,N0 'Useful only as a Bottom of Report break field'from SOLUTION_KEYWORDS; create view SOL_SOLUTION_LINKS ( SOLUTION_ID,_ LINK, GRAND_BREAK_FIELD ) as selectR SOLUTION_ID,T LINK,0 'Useful only as a Bottom of Report break field'from SOLUTION_LINKS;&create view SOL_SOLUTION_MODIFICATIONS ( SOLUTION_ID,D MODIFICATION_AUTHOR,C MODIFICATION_DATE,L MODIFICATION_DATE_YEAR,O MODIFICATION_DATE_MONTH, MODIFICATION_DATE_DAY, GRAND_BREAK_FIELD ) as selectO SOLUTION_ID, MODIFICATION_AUTHOR,A MODIFICATION_DATE,L' EXTRACT(YEAR FROM MODIFICATION_DATE),,( EXTRACT(MONTH FROM MODIFICATION_DATE),& EXTRACT(DAY FROM MODIFICATION_DATE),0 'Useful only as a Bottom of Report break field'from SOLUTION_MODIFICATIONS;$create view SOL_SOLUTION_NOISE_WORDS ( WORD, GRAND_BREAK_FIELD ) as selectN WORD,0 'Useful only as a Bottom of Report break field'from SOLUTION_NOISE_WORDS;!create view SOL_SOLUTION_SYNONYMS' ( WORD1,s WORD2,  GRAND_BREAK_FIELD ) as selectP WORD1,, WORD2,O0 'Useful only as a Bottom of Report break field'from SOLUTION_SYNONYMS;_create view SOL_SOLUTION_TITLESl ( SOLUTION_ID,Q TITLE, GRAND_BREAK_FIELD ) as selectc SOLUTION_ID,t TITLE,S0 'Useful only as a Bottom of Report break field'from SOLUTION_TITLES;D$create view SOL_SOLUTION_TITLE_WORDS ( SOLUTION_ID, TITLE_WORD, GRAND_BREAK_FIELD ) as selectE SOLUTION_ID,, TITLE_WORD,0 'Useful only as a Bottom of Report break field'from SOLUTION_TITLE_WORDS;commit;Qor 'A' SEVERITY_VALUE, !numeric 0..99 SEVERITY_NAME,f PRIORITY_VALUE, !numeric 0..99 PRIORITY_NAME,v CLASS,A WORK_REPORT_COUNT,C CC_LIST,P DATE_LOGGED,, DATE_LOGGED_YEAR, DATE_LOGGED_MONTH, DATE_LOGGED_DAY, DATE_DUE, DATE_DUE_YEAR, DATE_DUE_MONTH,  DATE_DUE_DAY,L HOURS_TIL_DUE,r DAYS_TIL_DUE, DATE_LAST_UPDATE, DATE_LAST_UPDATE_YEAR, E DATE_LAST_UPDATE_MONTH,  DATE_LAST_UPDATE_DAY,A ! Work Report Information WR_DATE_E**[EXAMPLES]MULTIHELP$FAX_INSTRUCTIONS.C;150+,y./ 4Q- 0123KPWO56Sl%7}<89GHJ/*++*//*9/* TITLE: MultiHelp$EXAMPLES:MultiHelp$FAX_INSTRUCTIONS.C /* IDENT: X-1/*9/* FACILITY: MultiHelp[R], SIO Technologies Corp., 1994 /*H/* ABSTRACT: This module establishes the types and formats of FAX-based 7/* service request NOTIFICATIONS emitted by MultiHelp./*?/* The format of messages is controlled by the routines calledA/* MultiHelp$FAX_CUSTOMER and MultiHelp$FAX_ENGINEER. They are :/* fully customizable (on a site-wide basis) by the user./*A/* This module (when compiled and linked into a shareable image)B/* will be activated dynamically, by MultiHelp (using RTL routine?/* LIB$FIND_IMAGE_SYMBOL) whenever a FAX-based service request/* notification is needed./*>/* For each notification, MultiHelp will call one of the two ;/* routines below. It's actual argument list will contain>/* certain important pieces of information needed to complete/* the notification./*C/* In addition, the addresses of a number of "work routines" will :/* also be passed. These routines should use these "work>/* routines", along with the other actual arguments, plus any>/* other text the user cares to add, to form the text of each/* notification message./*/* COMPILATION INSTRUCTIONS:/*!/* Under VAX/VMS and OpenVMS VAX:/*5/* $ cc MultiHelp$EXAMPLES:MultiHelp$FAX_INSTRUCTIONSQ/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$FAX_INSTRUCTIONS,SYS$INPUT:/options#/* universal=MultiHelp$FAX_ENGINEER#/* universal=MultiHelp$FAX_CUSTOMER%/* universR$MULTIHELP020.Ey *[EXAMPLES]MULTIHELP$FAX_INSTRUCTIONS.C;150Qz al=MultiHelp$FAX_MISCELLANY9/* $ install replace SYS$SHARE:MultiHelp$FAX_INSTRUCTIONS/*/* Under OpenVMS AXP:/*5/* $ cc MultiHelp$EXAMPLES:MultiHelp$FAX_INSTRUCTIONSQ/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$FAX_INSTRUCTIONS,SYS$INPUT:/options3/* symbol_vector=(MultiHelp$FAX_ENGINEER=procedure)3/* symbol_vector=(MultiHelp$FAX_CUSTOMER=procedure)5/* symbol_vector=(MultiHelp$FAX_MISCELLANY=procedure)9/* $ install replace SYS$SHARE:MultiHelp$FAX_INSTRUCTIONS/*+/* AUTHOR: Roald Amundsen, Tenth-Level Mage/* DATE: 15-Sep-1994/*/* MODIFICATION HISTORY:/*K/* X-1 Henry "Harry" Roald Arbuckle Lawson, Developer-at-Large, 15-Sep-1994 /* Realization of figured bass./*/*--*/##ifndef UserModifiableDataStructure-#define UserModifiableDataStructure globaldef)#define UserModifiableRoutine extern void#else)#define UserModifiableRoutine static void#endif/*+*/B/* Study this header file for complete documentation on the entire)/* customizable notifications sub-system./*-*/C#include "MultiHelp$EXAMPLES:MultiHelp$NOTIFICATION_INSTRUCTIONS.H"2#include "MultiHelp$EXAMPLES:MultiHelp$MESSAGES.H"#include #include #include #include stdlib#include stdio#include stringF#define CHK(EXPRESSION) if (!((EXPRESSION)&STS$M_SUCCESS)) goto ABORT; struct ITMLST {" unsigned short BUFLEN, ITMCOD; void *BUFADR, *RETADR; };O#define VMSmailArglist void *CTX, struct ITMLST (*IN)[], struct ITMLST (*OUT)[]-extern MAIL$SEND_ADD_ADDRESS(VMSmailArglist);/extern MAIL$SEND_ADD_ATTRIBUTE(VMSmailArglist);.extern MAIL$SEND_ADD_BODYPART(VMSmailArglist);)extern MAIL$SEND_MESSAGE(VMSmailArglist);/*++*//*/* FUNCTIONAL DESCRIPTION:/*F/* These are the two routines. They happen to both precisely the smaeI/* things in this case. Rather than grouping operations into subroutinesH/* which you might just have to un-do if you're looking into making someD/* changes to what I've done, I've left them completely spelled out./*/* BACKGROUND:/*G/* This notifications module is geared toward FXML product, which takes)/* "To:" addresses in the following form:/*3/* To: NODE::FXML%"Gustav Mahler^1(800)36-69-562^"/*G/* It does not accept extension numbers (or at least I have been unable=/* to determine what syntax it accepts for phone extensions)./*/* LOGICAL NAMES:/*(/* The following logical names are used:/*E/* MULTIHELP$FAX_XPORT: the character string that appears before the ?/* to quotations in the "To:" field, absent means don't botherE/* MULTIHELP$FAX_PREFIX: the string required by your phone system for(/* long-distance dialing (such as "1")./*/*--*/;UserModifiableRoutine MultiHelp$FAX_ENGINEER(formatArglist){static struct ITMLST 8 TO_LINE[] = {{0, MAIL$_SEND_USERNAME, 0, 0}, {0,0}},9 SUBJ_LINE[] = {{0, MAIL$_SEND_SUBJECT, 0, 0}, {0,0}},7 BODYTEXT[] = {{0, MAIL$_SEND_RECORD, 0, 0}, {0,0}}, ZERO[] = {{0,0}};char BUFFER[1024], *P;unsigned SUCCE  SS = {SS$_ABORT};/if (!getenv("MULTIHELP$FAX_XPORT")) goto ABORT;/*+*//* Form the "To:" address .../*-*/7TO_LINE[0].BUFLEN = sprintf(TO_LINE[0].BUFADR = BUFFER, "%s\"%s %s^%s%0.*s^\"",4 (P = getenv("MULTIHELP$FAX_XPORT")? P: "fxml%"), FIRST, LAST, L (P = getenv("MULTIHELP$FAX_PREFIX")? P: ""), strcspn(PHONE,"xX"),PHONE);7CHK( MAIL$SEND_ADD_ADDRESS(MAILCTX, &TO_LINE, &ZERO) );/*+*//* Form the "Subj:" line .../*-*/;SUBJ_LINE[0].BUFLEN = sprintf(SUBJ_LINE[0].BUFADR = BUFFER,% "MultiHelp[R] FAX Notification");;CHK( MAIL$SEND_ADD_ATTRIBUTE(MAILCTX, &SUBJ_LINE, &ZERO) );/*+*/?/* Generate the contents of the current Request for Service .../*-*/?(*OUTPUT_REQUEST)("LAST", Prt_Full|Prt_WRsummary|Prt_WRdetail);/*+*/A/* Callable-MAIL can't handle long multi-line records ... We must1/* split the message into it's individual lilnes./*-*/ if (FP) for (P = (*FP); *P; P++) {E BODYTEXT[0].BUFLEN = strcspn(BODYTEXT[0].BUFADR = P, "\n\v\r\f");= CHK( MAIL$SEND_ADD_BODYPART(MAILCTX, &BODYTEXT, &ZERO) );- if (!(*(P += BODYTEXT[0].BUFLEN))) break; }/*+*/$/* Send the message to the FAXer .../*-*/:CHK( SUCCESS = MAIL$SEND_MESSAGE(MAILCTX, &ZERO, &ZERO) );/*+*//* Were we succesful?/*-*/$ABORT: if (!(SUCCESS&STS$M_SUCCESS))1 (*SIGNAL)(MH$_FAXENG, 3, FIRST, LAST, PHONE);};UserModifiableRoutine MultiHelp$FAX_CUSTOMER(formatArglist){static struct ITMLST 8 TO_LINE[] = {{0, MAIL$_SEND_USERNAME, 0, 0}, {0,0}},9 SUBJ_LINE[] = {{0, MAIL$_SEND_SUBJECT, 0, 0}, {0,0}},7 BODYTEXT[] = {{0, MAIL$_SEND_RECORD, 0, 0}, {0,0}}, ZERO[] = {{0,0}};char BUFFER[1024], *P;unsigned SUCCESS = {SS$_ABORT};/*+*//* Form the "To:" address .../*-*/7TO_LINE[0].BUFLEN = sprintf(TO_LINE[0].BUFADR = BUFFER, "%s\"%s %s^%s%0.*s^\"",4 (P = getenv("MULTIHELP$FAX_XPORT")? P: "fxml%"), FIRST, LAST, L (P = getenv("MULTIHELP$FAX_PREFIX")? P: ""), strcspn(PHONE,"xX"),PHONE);7CHK( MAIL$SEND_ADD_ADDRESS(MAILCTX, &TO_LINE, &ZERO) );/*+*//* Form the "Subj:" line .../*-*/;SUBJ_LINE[0].BUFLEN = sprintf(SUBJ_LINE[0].BUFADR = BUFFER,% "MultiHelp[R] FAX Notification");;CHK( MAIL$SEND_ADD_ATTRIBUTE(MAILCTX, &SUBJ_LINE, &ZERO) );/*+*/?/* Generate the contents of the current Request for Service .../*-*/?(*OUTPUT_REQUEST)("LAST", Prt_Full|Prt_WRsummary|Prt_WRdetail);/*+*/A/* Callable-MAIL can't handle long multi-line records ... We must1/* split the message into it's individual lilnes./*-*/ if (FP) for (P = (*FP); *P; P++) {E BODYTEXT[0].BUFLEN = strcspn(BODYTEXT[0].BUFADR = P, "\n\v\r\f");= CHK( MAIL$SEND_ADD_BODYPART(MAILCTX, &BODYTEXT, &ZERO) );- if (!(*(P += BODYTEXT[0].BUFLEN))) break; }/*+*/$/* Send the message to the FAXer .../*-*/:CHK( SUCCESS = MAIL$SEND_MESSAGE(MAILCTX, &ZERO, &ZERO) );/*+*//* Were we succesful?/*-*/$ABORT: if (!(SUCCESS&STS$M_SUCCESS))2 (*SIGNAL)(MH$_FAXCUST, 3, FIRST, LAST, PHONE);}=UserModifiableRoutine MultiHelp$FAX_MISCELLANY(formatArglist){static struct ITMLST 8 TO_LINE[] = {{0, MAIL$_SEND_USERNAME, 0, 0}, {0,0}},9 SUBJ_LINE[] = {{0, MAIL$_SEND_SUBJECT, 0, 0}, {0,0}},7 BODYTEXT[] = {{0, MAIL$_SEND_RECORD, 0, 0}, {0,0}}, ZERO[] = {{0,0}};char BUFFER[1024], *P;unsigned SUCCESS = {SS$_ABORT};/*+*//* Form the "To:" address .../*-*/7TO_LINE[0].BUFLEN = sprintf(TO_LINE[0].BUFADR = BUFFER, "%s\"%s %s^%s%0.*s^\"",4 (P = getenv("MULTIHELP$FAX_XPORT")? P: "fxml%"), FIRST, LAST, L (P = getenv("MULTIHELP$FAX_PREFIX")? P: ""), strcspn(PHONE,"xX"),PHONE);7CHK( MAIL$SEND_ADD_ADDRESS(MAILCTX, &TO_LINE, &ZERO) );/*+*//* Form the "Subj:" line .../*-*/;SUBJ_LINE[0].BUFLEN = sprintf(SUBJ_LINE[0].BUFADR = BUFFER,% "MultiHelp[R] FAX Notification");;CHK( MAIL$SEND_ADD_ATTRIBUTE(MAILCTX, &SUBJ_LINE, &ZERO) );/*+*/?/* Generate the contents of the current Request for Service .../*-*/?(*OUTPUT_REQUEST)("LAST", Prt_Full|Prt_WRsummary|Prt_WRdetail);/*+*/A/* Callable-MAIL can't handle long multi-line records ... We must1/* split the message into it's individual lilnes./*-*/ if (FP) for (P = (*FP); *P; P++) {E BODYTEXT[0].BUFLEN = strcspn(BODYTEXT[0].BUFADR = P, "\n\v\r\f");= CHK( MAIL$SEND_ADD_BODYPART(MAILCTX, &BODYTEXT, &ZERO) );- if (!(*(P += BODYTEXT[0].BUFLEN))) break; }/*+*/$/* Send the message to the FAXer .../*-*/:CHK( SUCCESS = MAIL$SEND_MESSAGE(MAILCTX, &ZERO, &ZERO) );/*+*//* Were we succesful?/*-*/$ABORT: if (!(SUCCESS&STS$M_SUCCESS))2 (*SIGNAL)(MH$_FAXMISC, 3, FIRST, LAST, PHONE);}/*++*//*/* That's all folks .../*/*--*/.*[EXAMPLES]MULTIHELP$GENERIC_INSTRUCTIONS.C;136+,}. / 4W - 0123KPWO56sRyq%7H{<89GHJ/$MULTIHELP020.E} .[EXAMPLES]MULTIHELP$GENERIC_INSTRUCTIONS.C;136W /*++*//*=/* TITLE: MultiHelp$EXAMPLES:MultiHelp$GENERIC_INSTRUCTIONS.C /* IDENT: X-1/*9/* FACILITY: MultiHelp[R], SIO Technologies Corp., 1994 /*E/* ABSTRACT: This module establishes the types and formats of generic7/* service request NOTIFICATIONS emitted by MultiHelp./*?/* The format of messages is controlled by the routines called@/* MultiHelp$GENERIC_CUSTOMER and MultiHelp$GENERIC_ENGINEER. C/* They are fully customizable (on a site-wide basis) by the user./*A/* This module (when compiled and linked into a shareable image)B/* will be activated dynamically, by MultiHelp (using RTL routine=/* LIB$FIND_IMAGE_SYMBOL) whenever a generic service request/* notification is needed./*>/* For each notification, MultiHelp will call one of the two ;/* routines below. It's actual argument list will contain>/* certain important pieces of information needed to complete/* the notification./*C/* In addition, the addresses of a number of "work routines" will :/* also be passed. These routines should use these "work>/* routines", along with the other actual arguments, plus any>/* other text the user cares to add, to form the text of each/* notification message./*/* COMPILATION INSTRUCTIONS:/*!/* Under VAX/VMS and OpenVMS VAX:/*9/* $ cc MultiHelp$EXAMPLES:MultiHelp$GENERIC_INSTRUCTIONSU/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$GENERIC_INSTRUCTIONS,SYS$INPUT:/options'/* universal=MultiHelp$GENERIC_ENGINEER'/* universal=MultiHelp$GENERIC_CUSTOMER)/* universal=MultiHelp$GENERIC_MISCELLANY=/* $ install replace SYS$SHARE:MultiHelp$GENERIC_INSTRUCTIONS/*/* Under OpenVMS AXP:/*9/* $ cc MultiHelp$EXAMPLES:MultiHelp$GENERIC_INSTRUCTIONSU/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$GENERIC_INSTRUCTIONS,SYS$INPUT:/options7/* symbol_vector=(MultiHelp$GENERIC_ENGINEER=procedure)7/* symbol_vector=(MultiHelp$GENERIC_CUSTOMER=procedure)9/* symbol_vector=(MultiHelp$GENERIC_MISCELLANY=procedure)=/* $ install replace SYS$SHARE:MultiHelp$GENERIC_INSTRUCTIONS/*+/* AUTHOR: Roald Amundsen, Tenth-Level Mage/* DATE: 15-Sep-1994/*/* MODIFICATION HISTORY:/*K/* X-1 Henry "Harry" Roald Arbuckle Lawson, Developer-at-Large, 15-Sep-1994 /* Realization of figured bass./*/*--*/##ifndef UserModifiableDataStructure-#define UserModifiableDataStructure globaldef)#define UserModifiableRoutine extern void#else)#define UserModifiableRoutine static void#endif/*+*/B/* Study this header file for complete documentation on the entire)/* customizable notifications sub-system./*-*/C#include "MultiHelp$EXAMPLES:MultiHelp$NOTIFICATION_INSTRUCTIONS.H"2#include "MultiHelp$EXAMPLES:MultiHelp$MESSAGES.H"/*+*/W/* These are the two routines. As you can see, they don't need to be very complicated./*-*/?UserModifiableRoutine MultiHelp$GENERIC_ENGINEER(formatArglist){$/* Fill in whatever you like here */}?UserModifiableRoutine MultiHelp$GENERIC_CUSTOMER(formatArglist){$/* Fill in whatever you like here */}AUserModifiableRoutine MultiHelp$GENERIC_MISCELLANY(formatArglist){$/* Fill in whatever you like here */}/*++*//*/* That's all folks .../*/*--*/+*[EXAMPLES]MULTIHELP$MAIL_INSTRUCTIONS.C;165+,.*/ 4w*(- 0123KPWO)56 7{6<89GHJ/*++*//*:/* TITLE: MultiHelp$EXAMPLES:MultiHelp$MAIL_INSTRUCTIONS.C /* IDENT: X-3/*9/* FACILITY: MultiHelp[R], SIO Technologies Corp., 1994 /*I/* ABSTRACT: This module establishes the types and formats of MAIL-based 7/* service request NOTIFICATIONS emitted by MultiHelp./*>/* The format of messages is controlled by the routine calledA/* MultiHelp$MAIL_FORMAT, and the type of message is controlled B/* by the data structure called MultiHelp$INSTRUCTIONS. Both of A/* these entities are fully customizable (on a site-wide basis) /* by the user./*A/* This module (when compiled and linked into a shareable image)B/* will be activated dynamically, by MultiHelp (using RTL routineB/* LIB$FIND_IMAGE_SYMBOL) whenever an EMAIL-based service request/* notification is needed./*4/* MultiHelp will step through the elements of the A/* MultiHelp$INSTRUCTIONS array, making procedure calls to each ?/* "CALLBACK" listed in the table. The "CALLBACK" routine is B/* responsible for returning a zero-terminated string containing </* a comma-separated list of EMAIL addresses to which this /* notification will be passed./*A/* For each entry in the MultiHelp$INSTRUCTIONS data structure, A/* MultiHelp will call the MultiHelp$MAIL_FORMAT routine. It's C/* actual argument list will contain the "DETAIL", "WORKREPORTS", :/* and "INSTRUCTIONS" fields from that same entry in the #/* MultiHelp$INSTRUCTIONS array. /*C/* In addition, the addresses of a number of "work routines" will D/* also be passed to MultiHelp$MAIL_FORMAT. MultiHelp$MAIL_FORMAT G/* uses these "work routines", along with the other actual arguments, C/* plus any other text the user cares to add, to form the text of /* each notification message./*/* RECOMMENDATION:/*?/* The content of the message is entirely user-defineable, but>/* MultiHelp recommends that the notification message contain4/* at least the output of the following operations:/*)/* (*OUTPUT_BANNER)(CURRENT_REQUESTID);2/* (*OUTPUT_INSTRUCTIONS)(CURRENT_INSTRUCTIONS);</* (*OUTPUT_REQUEST)(CURRENT_WORKREPORTS, CURRENT_DETAIL);/* (*FPRINTF)(FP, "\n");/* (*OUTPUT_INCLUDES)();/*C/* A discussion of the various components of an EMAIL notification/* is made later./*/* COMPILATION INSTRUCTIONS:/*!/* Under VAX/VMS and OpenVMS VAX:/*6/* $ cc MultiHelp$EXAMPLES:MultiHelp$MAIL_INSTRUCTIONSR/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$MAIL_INSTRUCTIONS,SYS$INPUT:/options"/* universal=MultiHelp$MAIL_FORMAT#/* universal=MultiHelp$INSTRUCTIONS$/* universal=MultiHelp$LOOKUP_DETAIL,/* universal=MultiHelp$LOOKUPLIST_INSTRUCTIO*/* universal=MultiHelp$LOOKUP_INSTRUCTIONS,/* universal=MultiHelp$SOLUTIONLIST_INSTRUCT,/* universal=MultiHelp$SOLUTION_INSTRUCTIONS:/* $ install replace SYS$SHARE:MultiHelp$MAIL_INSTRUCTIONS/*/* Under OpenVMS AXP:/*D/* $ cc/standard=vaxc MultiHelp$EXAMPLES:MultiHelp$MAIL_INSTRUCTIONSR/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$MAIL_INSTRUCTIONS,SYS$INPUT:/options2/* symbol_vector=(MultiHelp$MAIL_FORMAT=procedure)./* symbol_vector=(MultiHelp$INSTRUCTIONS=data)//* symbol_vector=(MultiHelp$LOOKUP_DETAIL=data)7/* symbol_vector=(MultiHelp$LOOKUPLIST_INSTRUCTIO=data)5/* symbol_vector=(MultiHelp$LOOKUP_INSTRUCTIONS=data)7/* symbol_vector=(MultiHelp$SOLUTIONLIST_INSTRUCT=data)7/* symbol_vector=(MultiHelp$SOLUTION_INSTRUCTIONS=data):/* $ install replace SYS$SHARE:MultiHelp$MAIL_INSTRUCTIONS/*+/* AUTHOR: Roald Amundsen, Tenth-Level Mage/* DATE: 31-May-1994/*/* MODIFICATION HISTORY:/*1/* X-3 Daily Hal, Developer-at-Large, 17-Feb-1995B/* I like Dale's idea of having user-defined labels on each entry(/* in the MultiHelp$INSTRUCTIONS array./*K/* X-2 Henry "Harry" Roald Arbuckle Lawson, Developer-at-Large, 15-Sep-1994+/* Adaptation to the user-modifiable plan./*;/* X-1 Elizabeth P. Lawson, Developer-at-Large, 31-May-1994 /* Realization of figured bass./*/*--*/##ifndef UserModifiableDataStructure-#define UserModifiableDataStructure globaldef)#define UserModifiableRoutine extern void#else)#define UserModifiableRoutine static void#endif/*+*/B/* Study this header file for complete documentation on the entire)/* customizable notifications sub-system./*-*/C#include "MultiHelp$EXAMPLES:MultiHelp$NOTIFICATION_INSTRUCTIONS.H"/*+*/@/* Recommended Format for All REQUESTS-Based EMAIL Notifications@/* =============================================================/*D/* Each and every REQUESTS-based E aZ$MULTIHELP020.E +[EXAMPLES]MULTIHELP$MAIL_INSTRUCTIONS.C;165w*K" MAIL notification message has the /* following characteristics:/*G/* 1. FROM_ADDRESS, which is a forwarding address (defined by the site ?/* administrator in MHMAIL$SYSTARTUP.COM) to one of the variousG/* EMAIL-Server parsers on the MultiHelp host system. For example, if K/* the "MULTIHELP" forwarding address is setup to forward to "MH%REQUESTS",F/* then the name "MULTIHELP" will appear in that "From:" field. [This 9/* field is site-customizable from MHMAIL$SYSTARTUP.COM]./*G/* 2. SUBJECT, which contains "\I REQUEST.ID Summary of the latest WR".)/* [This field is not site-customizable]./*E/* [The order and/or presence of the following are site-customizable]/*7/* 3. Commercial BANNER containing "MultiHelp[R]", etc./*G/* 4. A set of MultiHelp$INSTRUCTIONS identifying why this message was I/* sent, what's in this message, and what (if anything) can be done with /* this message./*G/* 5. DETAIL about the current Serivce Request. How much data appears F/* here depends upon the contents of the instructions mentioned above H/* (and described in detail below). One token in those instructions is E/* a bit-mask representing the appropriate Prt_XYZZY flags defined in</* MultiHelp$EXAMPLES:MultiHelp$NOTIFICATION_INSTRUCTIONS.H./*5/* 6. Any site-specific information the site chooses./*F/* 7. Applicable builtin INCLUDE files (from the MH_INCLUDE logicals)./*E/* Throughout this module, you will find "#ifdef ROSE". Rose prefersG/* that the format of the notifications be slightly different from whatI/* we've recommended above. She prefers that the MultiHelp$INSTRUCTIONS F/* appear after the text of the work-reports, and that the summary of I/* work report titles (if present) appear at the end of the message. SheH/* also wants some additional text added to each and every notification./*G/* Look for the "#ifdef ROSE" variants, and contrast them with the mainC/* stream, to get an idea of just what kinds of customizations are /* possible here./*-*//*++*//*/* FUNCTIONAL DESCRIPTION:/*=/* This routine is called during the delivery of each type ofF/* notification handled by this module. This routine's responsibility9/* is to generate the contents of all MAIL notifications./*F/* This routine is completely site-customizable. The order and numberF/* of the calls to the various "work routines" are entirely up to you.D/* Keep in mind that leaving out some or all of the recommended dataE/* may render a notification message less useful (especially when youC/* consider that you may want to re-use a MAIL message as input for$/* another EMAIL-Server transaction./*/* FORMAL ARGUMENTS:/*,/* See MULTIHELP$NOTIFICATION_INSTRUCTIONS.H/*/*--*/:UserModifiableRoutine MultiHelp$MAIL_FORMAT(formatArglist){ #ifdef ROSE unsigned WRsummary;( (*OUTPUT_BANNER)(CURRENT_REQUESTID);/ WRsummary = CURRENT_DETAIL & Prt_WRsummary;8 if (WRsummary != 0) CURRENT_DETAIL -= Prt_WRsummary;; (*OUTPUT_REQUEST)(CURRENT_WORKREPORTS, CURRENT_DETAIL); (*FPRINTF)(FP, "\n");1 (*OUTPUT_INSTRUCTIONS)(CURRENT_INSTRUCTIONS);N if (WRsummary != 0) (*OUTPUT_REQUEST)(CURRENT_WORKREPORTS, Prt_WRsummary); (*FPRINTF)(FP, "\n");i (*FPRINTF)(FP, "\\* The id for this request for service is %s. Please use it\n", CURRENT_REQUESTID);R (*FPRINTF)(FP, "\\* whenever you contact our Help Desk. Have a nice day!\n"); (*FPRINTF)(FP, "\n");W (*FPRINTF)(FP, "\\* Below, you may find some canned followup material based on\n");W (*FPRINTF)(FP, "\\* the ProblemClass of this request. Also, you may receive a\n");V (*FPRINTF)(FP, "\\* a list of solution articles, some which may or may not be\n");Y (*FPRINTF)(FP, "\\* possible for you to act upon (depending on your privileges).\n");< (*FPRINTF)(FP, "\f"); /* That's a Form-Feed character */ (*OUTPUT_INCLUDES)();#else( (*OUTPUT_BANNER)(CURRENT_REQUESTID);1 (*OUTPUT_INSTRUCTIONS)(CURRENT_INSTRUCTIONS);; (*OUTPUT_REQUEST)(CURRENT_WORKREPORTS, CURRENT_DETAIL); (*FPRINTF)(FP, "\n"); (*OUTPUT_INCLUDES)();#endif} #ifdef ROSE /*+*/M /* Here's an example of a user-supplied NOTIFICATIONS callback. RoseN /* also *always* wants to see the text of every work report on any andN /* all transactions that generate notifications. We'll place it firstL /* in the NOTIFICATIONS array, so that if happens to be eligible to M /* receive any other notification messages, she'll get this one firstK /* (MultiHelp filters out multiple mailings to the same person on a /* single transaction). /*-*/ 5 char *Rose_NOTIFICATION(ReturnAnEmailAddressList) { return "ROSE"; }#endif #ifdef ROSE /*+*/K /* Rose's associate, Mage, wants to monitor all calls owned by RoseL /* or submitted by her. We'll put that at the end, since Mage will I /* want to get the normal notifications on calls he'd normally be /* a part of anyhow. /*-*/5 char *Mage_NOTIFICATION(ReturnAnEmailAddressList) { if (!strcmp(USERID,"ROSE")) return "MAGE";! if (!strcmp(OWNERID),"ROSE")) return "MAGE"; return (char *)0; }#endif/*+*/I/* The following array defines all the types of NOTIFICATIONS. The tableI/* is ordered such that more important notifications appear before lesserJ/* ones, so that if a particular user is chosen for more than one of theseJ/* notifications, the more important message will take precedence, and the/* lesser will be filtered out.S/*D/* Note that each entry must contain *all* of the information. The F/* MultiHelp$INSTRUCTIONS should always begin with a blank line "\n\" K/* and each non-blank line must commence with the comment delimiter "\\* " *J/* lest it be mis-interpreted as user-supplied text in later EMAIL-Server /* transactions./*G/* Note also that the MultiHelp$INSTRUCTIONS are fixed strings. There iI/* is no way to insert variables (like PIDs or DUEDATEs) into them. You I/* can display those items by setting appropriate Prt_XYZZY flags in the a/* the DETAIL field./*-*/a#pragma nostandard UserModifiableDataStructure char- ROSE_EXAMPLE_CASE[] = {"Rose's example"},e@ ACCEPTING_CASE[] = {"Support personnel accepted a request"},J ACKNOWLEDGEMENT_CASE[] = {"System acknowledges something I just did"},D CUSTOMER_CASE[] = {"Someone added a work-report to my request"},C ASSIGNMENT_CASE[] = {"Someone just /ASSIGNED a request to me"},nF OWNER_CASE[] = {"Someone added a work-report to a request I own"},M CC_CASE[] = {"CUSTOMERs on the CC list may not have privilege to REPLY"},aX LOGICAL_CASE[] = {"Any transaction that fits on of the class/status logical names"},N DUEDATE_CASE[] = {"Preliminary notification 1 delta before the Due Date"},O NONASSIGNED_CASE[] = {"Whenever a request is promoted for non-assignment"},hJ EXPIRATION_CASE[] = {"When a request is promoted because it expired"},9 BIGBROTHER_CASE[] = {"Watches everything Rose does"};t #define UNKNOWN_CASE ((void *)0)static noshare unsignede" OK_FOR_CUSTOMERS_TO_SEE = {1},! DONT_PASS_TO_CUSTOMERS = {0};o4UserModifiableDataStructure struct MAIL_INSTRUCTIONS MultiHelp$INSTRUCTIONS[] = { #ifdef ROSE:H /* This is an example of a user-supplied NOTIFICATION instruction */ {Prt_Full|Prt_WRdetail, "ALL",i4 Rose_NOTIFICATION, 0, &DONT_PASS_TO_CUSTOMERS, "\n\%\\* transactions. Here you go ...\n\T\n\A4\\* What's in this message should include ALL the\n\6\\* work-reports of the current request, and a FULL\n\5\\* listing of its details. It should not contain\n\"'\\* the work-report summary listing.\n\ \n", ROSE_EXAMPLE_CASE},#endifB /* ACCEPTING a call from the queue (support personnel only) */5 {Prt_Full|Prt_WRsummary|Prt_WRdetail, "PENULTIMATE",: Accepting_NOTIFICATION, 1, &DONT_PASS_TO_CUSTOMERS, "\n\J\\* You have accepted the following Request for Service from the Queue.\n\Q\\* What follows is the contents on the last Work Report before you pulled it.\n\i\n\lN\\* REPLY to this message to add another Work Report. FORWARD this message\n\R\\* to your SOLUTIONS destination to check for matching KnowledgeBase articles.\n\R\\* FORWARD this message to your LOOKUPS destination for more detail about this\n\\\* Request for Service.\n\d\n", ACCEPTING_CASE},*N /* ACKNOWLEDGEMENT of something *I* just did (the "warm fuzzy" message) */ {Prt_Brief, "NONE", t6 Acknowledgement_NOTIFICATI 4}$MULTIHELP020.E +[EXAMPLES]MULTIHELP$MAIL_INSTRUCTIONS.C;165w*'ON, 1, (unsigned *)0, "\n\?\\* Your message has been entered into the MultiHelp system.\n\l\n\TT\\* REPLY to this message to add another Work Report to this Request for Service.\n\R\\* FORWARD this message to your LOOKUPS destination for more detail about this\n\O\\* Request for Service. Forward this message to your SOLUTIONS destination \n\tS\\* in order to have the text of any solution titles appearing after the Request\n\MH\\* returned to you. Delete any titles that you do not want returned.\n\\n", ACKNOWLEDGEMENT_CASE},CH /* CUSTOMER notification (someone added a work-report to my call) */0 {Prt_Medium|Prt_WRsummary|Prt_WRdetail, "LAST",: Customer_NOTIFICATION, 0, &OK_FOR_CUSTOMERS_TO_SEE, "\n\P\\* A new Work Report has been added to a Request for Service created by you.\n\\n\iQ\\* REPLY to this message to add another Work Report. FORWARD this message to\n\eO\\* your LOOKUPS destination for more detail about this Request for Service.\n\i\n", CUSTOMER_CASE},F /* ASSIGNMENT notification (someone just assigned a call to me) */- {Prt_Full|Prt_WRsummary|Prt_WRdetail, "ALL",t; Assignment_NOTIFICATION, 0, &DONT_PASS_TO_CUSTOMERS, "\n\ P\\* The following Request for Service has been assigned to you. This message\n\3\\* contains the complete history of this event.\n\N\n\CQ\\* REPLY to this message to add another Work Report. FORWARD this message to\n\LO\\* your SOLUTIONS destination to check for KnowledgeBase articles. FORWARD\n\S\\* this message to your LOOKUPS destination for any new Work Reports that might\n\g=\\* have been added since this notification was generated.\n\n\n", ASSIGNMENT_CASE},J /* OWNER notification (someone added a work-report to a call I own) */. {Prt_Full|Prt_WRsummary|Prt_WRdetail, "LAST",6 Owner_NOTIFICATION, 0, &DONT_PASS_TO_CUSTOMERS, "\n\K\\* A new Work Report has been added to a Service Request which you own.\n\ ,\\* The text of that Work Report follows.\n\\n\iN\\* REPLY to this message to add another Work Report. FORWARD this message\n\R\\* to your SOLUTIONS destination to check for KnowledgeBase articles. FORWARD\n\Q\\* this message to your LOOKUPS destination for more detail about the history\n\\\* of this event.\n\ \n", OWNER_CASE},lT /* CC notification (customers on the CC list may not have privilege to REPLY) */0 {Prt_Medium|Prt_WRsummary|Prt_WRdetail, "LAST",4 Cc_NOTIFICATION, 0, &OK_FOR_CUSTOMERS_TO_SEE, "\n\I\\* A new Work Report has been added to a Request for Service on which\n\r7\\* your EMAIL address is contained in the CC field.\n\ \n\ K\\* Depending upon the privileges in your MultiHelp CONTACT profile, you\n\*H\\* may be able to REPLY to this message to add a Work Report to this\n\L\\* Request for Service. You may also be able to FORWARD this message to\n\P\\* your LOOKUPS destination for more details about this event. FORWARD this\n\Q\\* message to your SOLUTIONS destination to check for KnowledgeBase articles.\n\d\n", CC_CASE},` /* LOGICAL notification (any transaction that fits one of the class/status logical names) */1 {Prt_Medium|Prt_WRsummary|Prt_WRdetail, "LAST", O8 Logical_NOTIFICATION, 0, &DONT_PASS_TO_CUSTOMERS, "\n\P\\* This Request for Service has been created or updated. Your EMAIL address\n\Q\\* appears on one of the MultiHelp logical name interest lists appropriate to\n\o\\* this transaction.\n\\n\ N\\* REPLY to this message to add another Work Report. FORWARD this message\n\R\\* to your SOLUTIONS destination to check for KnowledgeBase articles. FORWARD\n\Q\\* this message to your LOOKUPS destination for more detail about the history\n\ \\* of this event.\n\o\n", LOGICAL_CASE},ul /* Due-Date ESCALATION notification owner only (preliminary notification 1 delta before the Due Date) */! {Prt_Full|Prt_WRsummary, "NONE", 2 Owner_CALLBACK, 0, &DONT_PASS_TO_CUSTOMERS, "\n\I\\* The following Request for Service is close to its Due Date and has\n\sK\\* not been closed. The next escalation will cause notifications to be\n\ E\\* sent to those on the escalation list. Please see that it gets\n\ "\\* worked as soon as possible.\n\\n", DUEDATE_CASE},am /* Non-Assigned ESCALATION notification (whenever a Service Request is promoted due to non-assignment) */o! {Prt_Full|Prt_WRsummary, "NONE",l9 Non_assigned_CALLBACK, 0, &DONT_PASS_TO_CUSTOMERS, "\n\PG\\* The following Request for Service has failed to be assigned to a\n\m>\\* support representative. It's priority has been raised. \n\:\\* Please see that it gets worked as soon as possible.\n\\n", NONASSIGNED_CASE},nw /* Due-Date ESCALATION notification (whenever a Service Request is promoted due to failure to meet the Due Date) */t! {Prt_Full|Prt_WRsummary, "NONE",)5 Due_date_CALLBACK, 0, &DONT_PASS_TO_CUSTOMERS, "\n\ G\\* The following Request for Service has failed to be closed by its\n\,I\\* Due Date. It's priority has been raised. Please see that it gets\n\I"\\* worked as soon as possible.\n\\n", EXPIRATION_CASE}, #ifdef ROSEoM /* Another example of a user-supplied callback. This one watches Rose */sI {Prt_OneLine, "", /* One-liner, no work-report text, nor instructions */oI Mage_NOTIFICATION, 0, &OK_FOR_CUSTOMERS_TO_SEE, "\n", BIGBROTHER_CASE}, #endif+ /* Zero CALLBACK terminates the list */gK {0,(char *)0, (char *(*)())(0), 0,(unsigned *)0,(char *)0, UNKNOWN_CASE}};*/*++*//*F/* The following strings follow the same function as the NOTIFICATIONSF/* array, and they are handled by the same routines, but they are used7/* for EMAIL-Server LOOKUPS and SOLUTIONS transactions. /*/*--*/$UserModifiableDataStructure unsignedD MultiHelp$LOOKUP_DETAIL = {Prt_Full|Prt_WRsummary|Prt_WRdetail}; UserModifiableDataStructure char+ MultiHelp$LOOKUPLIST_INSTRUCTIO/*NS*/[]r = {"\n\L\\* REPLY/EXTRACT to this message, removing the \\! lines of all unwanted\n\J\\* Requests for Service, to receive full lookups of recent activity on\n\%\\* any of the following Requests:\n\r\n"},c# MultiHelp$LOOKUP_INSTRUCTIONS[]s = {"\n\N\\* REPLY to this message to add a Work Report to this Request for Service.\n\J\\* FORWARD it to your SOLUTIONS destination to check for KnowledgeBase\n\\\* articles.\n\\n"}; UserModifiableDataStructure char- MultiHelp$SOLUTIONLIST_INSTRUCT/*IONS*/[]R = {"\n\I\\* FORWARD this message to your SOLUTIONS destination to retrieve the\n\t(\\* following KnowledgeBase articles.\n\\n"},e% MultiHelp$SOLUTION_INSTRUCTIONS[]  = {"\n\S\\* FORWARD this message to your REQUESTS destination, including \\I Request-Id,\n\*B\\* to add this text as a Work Report to a Request for Service.\n\\n"};D/*++*//*/* That's all folks ...s/*/*--*/"*[EXAMPLES]MULTIHELP$MESSAGES.H;169+,H./ 4F- 0123KPWO56x 76^<89GHJ/********************************************************************************************************************************//* Created 23-APR-1995 16:36:46 by VAX SDL V3.2-12 Source: 23-APR-1995 16:36:42 HELPMT$DKA300:[CMS.HELPMATE.MMSREF_VAX]MULTIH *//********************************************************************************************************************************/ /*** MODULE $MHDEF ***/N/* */Q/* This SDL File Generated by VAX-11 Message V04-00 on 23-APR-1995 16:36:42.60 */N/* */#define MULTIHELP_FACILITY 2090P/***************************************************************************! */P/** FROM NOW ON ... ONLY ADD MESSAGES AT THE _END_ OF THIS FILE ... DO NOT *! */P/** DELETE ANY OLD MESSAGES EITHER! NOW THAT WE HAVE A SHAREABLE MESSAGE *! */P/** SECTION, WE MUST BE VERY CAREFUL THAT WE DON'T GET OUR MESSAGE NUM 'N$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169"BERS *! */P/** OUT OF SYNCH FROM VERSION TO VERSION ... THIS IS _VERY_IMPORTANT!!! *! */P/** THIS MEANS THAT THE SEVERITY WILL HAVE TO BE EXPLICITLY RESTARTED FOR *! */P/** EVERY MESSAGE. *! */P/***************************************************************************! */ #define MH$_KEYDEFINED 137003019N/*+ */N/* EXPLANATION: */N/* A KEY HAS JUST BEEN DEFINED IN THE CLI INTERFACE USING THE */N/* DEFINE/KEY COMMAND. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */ #define MH$_KEYDEFFILE 137003027N/*+ */N/* EXPLANATION: */N/* A MULTIHELP KEY DEFINITION FILE HAS BEEN FOUND AND THE KEY */N/* DEFINITIONS ARE BEING LOADED AND PROCESSED. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */ #define MH$_NOPASSSUPP 137003035N/*+ */N/* EXPLANATION: */N/* A MULTIHELP USER HAS JUST BEEN CREATED AND A PASSWORD WAS NOT */N/* SPECIFIED FOR THE NEW USERID. THE PASSWORD WILL DEFAULT TO */N/* "MULTIHELP". */N/* */N/* USER ACTION: */N/* IF YOU INTENDED TO PLACE A PASSWORD ON THE NEW USER ACCOUNT, THEN */N/* UPDATE THE NEWLY CREATED ACCOUNT USING THE PROFILE MODIFY USER */N/* COMMAND AND SPECIFY THE /PASSWORD QUALIFIER. */N/* */N/*- */#define MH$_DBATTACH 137003043N/*+ */N/* EXPLANATION: */N/* MULTIHELP IS ATTEMPTING TO SUCCESSFULLY ATTACH TO THE RDB DATABASE */N/* POINTED TO BY THE LOGICAL MULTIHELP$DB. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */#define MH$_USERADDED 137003051N/*+ */N/* EXPLANATION: */N/* A NEW USERID HAS JUST BEEN SUCCESSFULLY ADDED TO THE PROFILE. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */!#define MH$_USERREMOVED 137003059N/*+ */N/* EXPLANATION: */N/* A USER HAS JUST BEEN SUCCESSFULLY REMOVED FROM THE PROFILE. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */"#define MH$_USERMODIFIED 137003067N/*+ */N/* EXPLANATION: */N/* A USER'S PARAMETERS HAVE JUST BEEN SUCCESSFULLY MODIFIED. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */ #define MH$_SYSPARMMOD 137003075N/*+ */N/* EXPLANATION: */N/* SYSTEM PARAMETERS HAVE JUST BEEN MODIFIED WITH THE SYSTEM VERB. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */##define MH$_SITEPREFIXMOD 137003083N/*+ */N/* EXPLANATION: */N/* THIS MESSAGE IS OBSOLETE AND YOU SHOULD NEVER RECEIVE IT. */N/* */N/* USER ACTION: */N/* IF YOU RECEIVE THIS MESSAGE NOTIFY MULTIHELP CUSTOMER SUPPORT. */N/* */N/*- */!#define MH$_SYSNOTAVAIL 137003091N/*+ */N/* EXPLANATION: */N/* ACCESS TO MULTIHELP HAS BEEN TURNED OFF BY SOMEONE WITH */N/* ADMINISTRATIVE PRIVILEGE USING THE SYSTEM VERB. YOU MUST HAVE */N/* ADMINISTRATIVE PRIVILEGE TO GAIN ACCESS TO MULTIHELP AT THIS TIME. */N/* */N/* USER ACTION: */O/* CONTACT YOUR MULTIHELP ADMINISTRATOR IF YOU BELIEVE THERE IS A PROBLEM. */ N/* */N/*- */#define MH$_NYI 137003099 N/*+ */N/* EXPLANATION: */N/* IF YOU RECEIVE THIS MESSAGE IT INDICATES THAT THE FUNCTIONALITY */N/* YOU HAVE JUST ATTEMPTED TO ACCESS HAS NOT YET BEEN IMPLEMENTED. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */"#define MH$_CONTACTADDED 137003107N/*+ */N/* EXPLANATION:  `Η$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169?" */N/* A CONTACT HAS JUST BEEN SUCCESSFULLY ADDED TO THE PROFILE. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */$#define MH$_CONTACTREMOVED 137003115N/*+ */N/* EXPLANATION: */N/* A CONTACT HAS JUST BEEN SUCCESSFULLY REMOVED FROM THE PROFILE. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */%#define MH$_CONTACTMODIFIED 137003123 N/*+ */N/* EXPLANATION: */N/* A CONTACT HAS JUST BEEN SUCCESSFULLY MODIFIED. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */##define MH$_HARDWAREADDED 137003131 N/*+ */N/* EXPLANATION: */N/* A HARDWARE DEFINITION HAS JUST BEEN ADDED TO A USERS HARDWARE LIST. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */%#define MH$_HARDWAREREMOVED 137003139*N/*+ */N/* EXPLANATION: */N/* A HARDWARE DEFINITION HAS JUST BEEN REMOVED FROM A USERS HARDWARE */N/* LIST. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */##define MH$_HARDWAREEMPTY 137003147 N/*+ */N/* EXPLANATION: */N/* THE HARDWARE LIST FOR A PARTICULAR USER CONTAINS NO ITEMS. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */&#define MH$_HARDWAREMODIFIED 137003155N/*+ */N/* EXPLANATION: */N/* A HARDWARE DEFINITION HAS JUST BEEN MODIFIED FOR A USER. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */##define MH$_SOFTWAREADDED 137003163 N/*+ */N/* EXPLANATION: */N/* A SOFTWARE DEFINITION HAS JUST BEEN ADDED TO A USER'S HARDWARE */N/* LIST. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */%#define MH$_SOFTWAREREMOVED 137003171 N/*+ */N/* EXPLANATION: */N/* A SOFTWARE DEFINITION HAS JUST BEEN REMOVED FROM A USER'S HARDWARE */N/* LIST. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */##define MH$_SOFTWAREEMPTY 137003179VN/*+ */N/* EXPLANATION: */N/* THE SOFTWARE LIST FOR A PARTICULAR USER CONTAINS NO ITEMS. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */&#define MH$_SOFTWAREMODIFIED 137003187N/*+ */N/* EXPLANATION: */N/* A SOFTWARE DEFINITION FOR A USER HAS JUST BEEN MODIFIED. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */ #define MH$_PROBSYNTAX 137003195N/*+ */N/* EXPLANATION: */N/* YOU WILL USUALLY RECEIVE THIS ERROR ALONG WITH INVPROBID. IT */N/* INDICATES THAT YOU HAVE SPECIFIED AN INCORRECT FORMAT FOR A */N/* REQUEST ID OR AN ARTICLE ID. */N/* */N/* USER ACTION: */N/* A REQUEST OR ARTICLE ID CONSISTS OF A SITE PREFIX, YEAR, MONTH, */N/* DAY, A PERIOD ( . ) AND A SEQUENTIAL NUMBER THAT INDICATES */N/* THE NUMBER OF ID'S THAT CAME BEFORE IT ON THAT PARTICULAR DAY. */N/* YOU MAY OMMIT INFORMATION STARTING ON THE LEFT HAND SIDE. ANYTHING */N/* OMMITTED WILL DEFAULT TO THE CURRENT DATE. */N/* */N/*-  $MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169 % */#define MH$_PHONEENG 137003203N/*+ */N/* EXPLANATION: */N/* THE OWNER OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA */N/* PHONE ON ANY UPDATES TO THE REQUEST. */N/* */N/* USER ACTION: */N/* PHONE THE ENGINEER AT THE SPECIFIED NUMBER. */N/* */N/*- */#define MH$_PAGEENG 137003211 N/*+ */N/* EXPLANATION: */N/* THE OWNER OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA */N/* PAGER ON ANY UPDATES TO THE REQUEST. */N/* */N/* USER ACTION: */N/* PAGE THE ENGINEER AT THE SPECIFIED NUMBER. */N/* */N/*- */#define MH$_FAXENG 137003219N/*+ */N/* EXPLANATION: */N/* THE OWNER OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA FAX */N/* ON ANY UPDATES TO THE REQUEST. */N/* */N/* USER ACTION: */N/* FAX THE ENGINEER AT THE SPECIFIED NUMBER. */N/* */N/*- */#define MH$_PHONECUST 137003227RN/*+ */N/* EXPLANATION: */N/* THE CUSTOMER OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA */N/* PHONE ON ANY UPDATES TO THE REQUEST. */N/* */N/* USER ACTION: */N/* PHONE THE CUSTOMER AT THE SPECIFIED NUMBER. */N/* */N/*- */#define MH$_PAGECUST 137003235N/*+ + */N/* EXPLANATION: */N/* THE CUSTOMER OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA */N/* PAGER ON ANY UPDATES TO THE REQUEST. */N/* */N/* USER ACTION: */N/* PAGE THE CUSTOMER AT THE SPECIFIED NUMBER. */N/* */N/*- */#define MH$_FAXCUST 137003243 N/*+ */N/* EXPLANATION: */N/* THE CUSTOMER OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA */N/* FAX ON ANY UPDATES TO THE REQUEST */N/* */N/* USER ACTION: */N/* FAX THE CUSTOMER AT THE SPECIFIED NUMBER. */N/* */N/*- */ #define MH$_NOVALUESDB 137003251N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT THERE ARE NO VALUES FOR THE SPECIFIED ENTITY */N/* CURRENTLY IN THE DATABASE. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */#define MH$_SEVDEFMOD 137003259 N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT YOU HAVE JUST SUCCESSFULLY CHANGED THE DEFAULT */N/* SEVERITY FOR MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */#define MH$_SEVADDED 137003267N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT YOU HAVE JUST SUCCESSFULLY DEFINED A NEW */N/* SEVERITY FOR MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */ #define MH$_SEVREMOVED 137003275N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT YOU HAVE JUST SUCCESSFULLY REMOVE A SEVERITY */N/* DEFINITION FROM MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */!#define MH$_SEVMODIFIED 137003283 N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT YOU HAVE SUCCESSFULLY MODIFIED ONE OR */N/* MORE ATTRIBUTES OF A SEVERITY. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */#define MH$_PRIDEFMOD 137003291AN/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT YOU HAVE SUCCESSFULLY CHANGED THE DEFAULT */N/* PRIORITY FOR MULTIHELP. */N/* .A$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169"6 */N/* USER ACTION: */N/* NONE */N/* */N/*- */#define MH$_PRIADDED 137003299N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT YOU HAVE SUCCESSFULLY ADDED A PRIORITY */N/* DEFINITION TO MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */ #define MH$_PRIREMOVED 137003307N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT YOU HAVE SUCCESSFULLY REMOVED A PRIORITY */N/* DEFINITION FROM MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */!#define MH$_PRIMODIFIED 137003315 N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT YOU HAVE SUCCESSFULLY MODIFIED ONE OR MORE */N/* ATTRIBUTES OF A PRIORITY. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */#define MH$_STATADDED 137003323 N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT YOU HAVE SUCCESSFULLY ADDED A STATUS DEFINITION */N/* TO MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */!#define MH$_STATREMOVED 137003331 N/*+ */N/* EXPLANATION: */N/* A STATUS VALUE WAS REMOVED FROM MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */"#define MH$_STATMODIFIED 137003339N/*+ */N/* EXPLANATION: */N/* A STATUS VALUE WAS MODIFED IN MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */ #define MH$_CLASSADDED 137003347N/*+ */N/* EXPLANATION: */N/* A CLASS VALUE WAS ADDED TO MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */"#define MH$_CLASSREMOVED 137003355N/*+ */N/* EXPLANATION: */N/* A CLASS VALUE WAS REMOVED FROM MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */##define MH$_CLASSMODIFIED 137003363 N/*+ */N/* EXPLANATION: */N/* A CLASS VALUE WAS MODIFIED IN MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */#define MH$_CLASSLIST 137003371 N/*+ */N/* EXPLANATION: */N/* FOLLOWING IS A LIST OF THE CURRENTLY-DEFINED CLASS VALUES. */N/* */N/* USER ACTION: */N/* CHOOSE A CLASS FROM THAT LIST. */N/* */N/*- */#define MH$_LISTEMPTY 137003379 N/*+ */N/* EXPLANATION: */N/* THE CLASS LIST HAS NO DEFINED CLASSES. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */##define MH$_ALTEMAILADDED 137003387 N/*+ */N/* EXPLANATION: */N/* AN ALTERNATE EMAIL ADDRESS WAS ADDED TO A CONTACT RECORD. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- 䈢$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169a"G */%#define MH$_ALTEMAILREMOVED 137003395 N/*+ */N/* EXPLANATION: */N/* AN ALTERNATE EMAIL ADDRESS WAS REMOVED FROM THE CONTACT RECORD. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */%#define MH$_LICENSE_REMOVED 137003403*N/*+ */N/* EXPLANATION: */N/* THE CURRENT MULTIHELP LICENSE WAS REMOVED. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */##define MH$_LICENSE_ADDED 137003411EN/*+ */N/* EXPLANATION: */N/* A NEW MULTIHELP LICENSE WAS ADDED. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */#define MH$_SOL_ADDED 137003419 N/*+ */N/* EXPLANATION: */N/* THE SPECIFIED SOLUTION KNOWLEDGEBASE ARTICLE WAS ADDED TO MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */#define MH$_SOL_ABORT 137003427 N/*+ */N/* EXPLANATION: */Q/* THE CREATION OR UPDATE OF A SOLUTION KNOWLEDGEBASE ARTICLE WAS ABANDONED. */AN/* */N/* USER ACTION: */N/* RE-ENTER THE ARTICLE. */N/* */N/*- */"#define MH$_SOL_MODIFIED 137003435N/*+ */N/* EXPLANATION: */N/* THE SPECIFIED SOLUTION KNOWLEDGEBASE ARTICLE WAS MODIFIED. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */ #define MH$_SUBPROCESS 137003443N/*+ */N/* EXPLANATION: */N/* THE INPUT STREAM IS NOW ATTACHED TO A DCL SUB-PROCESS. */N/* */N/* USER ACTION: */N/* ENTER DCL COMMANDS. */N/* */N/*- */#define MH$_ATTEMPTED 137003451 N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT WAS MADE TO CONTACT THE CUSTOMER IN A REQUEST FOR SERVICE. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */##define MH$_NOTIFICATIONS 137003459 N/*+ */N/* EXPLANATION: */N/* ANY EMAIL NOTIFICATIONS NECESSARY TO COMPLETE THE TRANSACTION ARE IN */N/* PROGRESS. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */ #define MH$_SOLDELETED 137003467N/*+ */N/* EXPLANATION: */P/* THE SPECIFIED SOLUTION KNOWLEDGEBASE ARTICLE WAS REMOVED FROM MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */#define MH$_NOTIFYING 137003475 N/*+ */N/* EXPLANATION: */N/* THE SPECIFIED ENTITIES ARE BEING NOTIFIED. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */!#define MH$_NOTCUSTVIEW 137003480 N/*+ */N/* EXPLANATION: */N/* THE REQUESTED ARTICLE HAS THE "not customer viewable" FLAG SET ON IT. */N/* MULTIHELP RECOGNIZES YOU AS A CUSTOMER. */N/* */N/* USER ACTION: */N/* CHOOSE ANOTHER ARTICLE TO VIEW, OR ASK YOUR SUPPORT REPRESENTATIVE */N/* FOR HELP. */N/* */N/*- */"#define MH$_EXCEEDMAXREQ 137003488N/*+ */N/* EXPLANATION: */N/* YOUR QUERY HAS MATCHED ON MORE REQUESTS THAN IS ALLOWED BY THE */N/* LOGICm!$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169gXAL MULTIHELP$MAX_REQUESTS. THE NUMBER OF REQUESTS UP TO */N/* THAT NUMBER HAS BEEN DISPLAYED AND THE REST WILL NOT BE. */N/* */N/* USER ACTION: */N/* SPECIFY STRICTER QUERY PARAMETERS SO AS TO NARROW THE SCOPE OF */N/* YOUR SEARCH CRITERIA AND GET THE NUMBER OF MATCHING REQUESTS */N/* UNDER THE LIMIT SPECIFIED BY THE LOGICAL MULTIHELP$MAX_REQUESTS. */N/* */N/*- */##define MH$_REQUEST2LARGE 137003496/N/*+ */N/* EXPLANATION: */N/* THE QUERY ISSUE BY THE LOOKUP COMMAND SPECIFIES MORE DATA THAN */N/* YOUR PROCESS CAN ALLOCATE FROM THE CPU. */N/* */N/* USER ACTION: */N/* AS MUCH DATA WILL BE DISPLAYED AS POSSIBLE, WITH ALL DATA PAST */N/* THAT VALUE BEING LEFT OFF. */N/* NARROW THE SEARCH PARAMETERS OF YOUR QUERY IN ORDER TO GET THE */N/* SPECIFIED INFORMATION. */N/* */N/*- */##define MH$_KEYDEFOPENERR 137003504 N/*+ */N/* EXPLANATION: */N/* THE SPECIFIED KEY DEFINITION FILE COULD NOT BE OPENED. */N/* */N/* USER ACTION: */N/* CHECK THAT THE SPECIFIED DEFINITION FILE EXISTS AND IS ACCESSIBLE. */N/* */N/*- */##define MH$_KEYDEFTOOLONG 137003512 N/*+ */N/* EXPLANATION: */N/* A KEY DEFINITION LOCATED IN THE MULTIHELP KEY DEFINTION FILE HAS */N/* EXCEEDED 256 CHARACTERS. */N/* */N/* USER ACTION: */N/* SHORTEN THE KEY DEFINITION TO 256 CHARACTERS OR LESS. */N/* */N/*- */#define MH$_CMDABORT 137003520N/*+ */N/* EXPLANATION: */N/* THE USER ABORTED THE CURRENT OPERATION WITH CTRL/C. */N/* */N/* USER ACTION: */N/* RE-TRY THE OPERATION. */N/* */N/*- */!#define MH$_USERUNKNOWN 137003528AN/*+ */N/* EXPLANATION: */O/* INSUFFICIENT INFORMATION EXISTS TO DETERMINE THE PRECISE USERID/CONTACT */ N/* TO ASSOCIATE WITH THIS REQUEST FOR SERVICE. */N/* */N/* USER ACTION: */N/* ADD MORE INFORMATION (SUCH AS MULTIHELP> REQUEST/CONTACT). */N/* */N/*- */$#define MH$_CONTACTUNKNOWN 137003536N/*+ */N/* EXPLANATION: */O/* INSUFFICIENT INFORMATION EXISTS TO DETERMINE THE PRECISE USERID/CONTACT */ N/* TO ASSOCIATE WITH THIS REQUEST FOR SERVICE. */N/* */N/* USER ACTION: */N/* ADD MORE INFORMATION (SUCH AS MULTIHELP> REQUEST/CONTACT). */N/* */N/*- */ #define MH$_NOCATEGORY 137003544N/*+ */N/* EXPLANATION: */N/* ONLY NON-"customer" USERIDS MAY USE THE MULTIHELP> REQUEST/CATEGORY */N/* QUALIFIER. */N/* */N/* USER ACTION: */N/* RE-ENTER THE COMMAND WITHOUT THE /CATEGORY QUALIFIER. */N/* */N/*- */#define MH$_NOCOMMENT 137003552 N/*+ */N/* EXPLANATION: */N/* ONLY NON-"customer" USERIDS MAY USE THE MULTIHELP> REQUEST/COMMENT */N/* QUALIFIER. */N/* */N/* USER ACTION: */N/* RE-ENTER THE COMMAND WITHOUT THE /COMMENT QUALIFIER. */N/* */N/*- */!#define MH$_CUSTINVQUAL 137003560 N/*+ */N/* EXPLANATION: */Y/* THE SPECIFIED QUALIFIER IS NOT ALLOWED FOR USERIDS WITH THE "customer" ATTRIBUTE. */ N/* */N/* USER ACTION: */N/* RE-ENTER THE COMMAND WITHOUT THAT QUALIFIER. */N/* */N/*- */"#define MH$_NOARTICLESEL 137003568N/*+ */N/* EXPLANATION: g */N/* THE "VIEW SELECTED" PUSHBUTTON HAS BEEN ACTIVATED WITHOUT AN */N/* ARTICLE BEING HIGHLIGHTED IN THE LIST. */N/* */N/* USER ACTION: */N/* MAKE SURE THAT AN ARTICLE IS HIGHLIGHTED BY SINGLE-CLICKING ON THE */N/* TITLE. */N/* */N/*- */#define MH$_NOPARENT 137003576N/*+ */N/* EXPLANATION: */N/* THE MULTIHELP> ATTACH/PARENT COMMAND WAS ENTERED, BUT THE PROCESS */N/* RUNNING MULTIHELP IS NOT A SUB-PROCESS. c$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169!i */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */}#define MH$_NOSOL 137003586 /* MUST BE ERROR LEVEL OR MH%SOLUTIONS RETURNS NOTHING WHEN THERE ARE NO SOLUTIONS */ N/*+ */N/* EXPLANATION: */N/* NO SOLUTIONS ARTICLES WERE FOUND FOR YOUR SPECIFIED CRITERIA. */N/* */N/* USER ACTION: */N/* BROADEN YOUR SEARCH CRITERIA. */N/* */N/*- */#define MH$_SQLERR 137003594N/*+ */N/* EXPLANATION: */N/* AN SQL/RDB ERROR HAS OCCURRED. */N/* */N/* USER ACTION: */N/* REVIEW THE ERROR MESSAGE THAT FOLLOWS THIS ONE FOR MORE */N/* INFORMATION ON THE NATURE OF THE ERROR. THIS ERROR SHOULD BE */N/* REPORTED TO MULTIHELP CUSTOMER SUPPORT. */N/* */N/*- */#define MH$_UNXCLI 137003602N/*+ */N/* EXPLANATION: */N/* A CLI ERROR HAS OCCURRED THAT WAS NOT EXPECTED. */N/* */N/* USER ACTION: */N/* REVIEW THE ERROR MESSAGE THAT FOLLOWS FOR MORE INFORMATION ON THE */N/* NATURE OF THE ERROR. THIS ERROR SHOULD BE REPORTED TO MULTIHELP */N/* CUSTOMER SUPPORT. */N/* */N/*- */#define MH$_UNXSMG 137003610N/*+ */N/* EXPLANATION: */N/* AN SMG ERROR HAS OCCURRED THAT WAS NOT EXPECTED. */N/* */N/* USER ACTION: */N/* REVIEW THE ERROR MESSAGE THAT FOLLOWS FOR MORE INFORMATION ON THE */N/* NATURE OF THE ERROR. */N/* */N/*- p */$#define MH$_HANDLE_NOFATAL 137003618N/*+ */N/* EXPLANATION: */N/* AN UNEXPECTED CONDITION HAS OCCURRED. */N/* */N/* USER ACTION: */N/* PLEASE NOTIFY MULTIHELP CUSTOMER SUPPORT. */N/* */N/*- */"#define MH$_HANDLE_FATAL 137003626N/*+ */N/* EXPLANATION: */N/* AN UNEXPECTED CONDITION HAS OCCURRED. */N/* */N/* USER ACTION: */N/* PLEASE NOTIFY MULTIHELP CUSTOMER SUPPORT. */N/* */N/*- */#define MH$_NOUSERID 137003634N/*+ */N/* EXPLANATION: s */N/* THE ACTION YOU HAVE TAKEN WITH MULTIHELP REQUIRES THAT YOU SUPPLY */N/* VALID AUTHORIZATION INFORMATION. */N/* */N/* USER ACTION: */N/* PLEASE SUPPLY A USERID AND, PASSWORD IF REQUIRED. IF THIS ERROR IS */N/* FROM THE EMAIL INTERFACE, SUPPLY THE USERID DIRECTIVE (\U) AND, */N/* THE PASSWORD DIRECTIVE (\P) IF REQUIRED. */N/* */N/*- */#define MH$_USERIDREQ 137003642 N/*+ */N/* EXPLANATION: */N/* YOU MUST SUPPLY VALID AUTHORIZATION INFORMATION TO MULTIHELP. */N/* */N/* USER ACTION: */N/* SUPPLY USERID AND, PASSWORD IF REQUIRED. */N/* */N/*- */ #define MH$_NOPASSWORD 137003650N/*+ */N/* EXPLANATION: */N/* A PASSWORD IS REQUIRED. */N/* */N/* USER ACTION: */N/* SUPPLY A VALID PASSWORD FOR THE USERID ENTERED. */N/* */N/*- */!#define MH$_PASSWORDREQ 137003658PN/*+ */N/* EXPLANATION: */N/* A PASSWORD IS REQUIRED. */N/* */N/* USER ACTION: */N/* SUPPLY A VALID PASSWORD USING THE PASSWORD DIRECTIVE (\P). */N/* */N/*- */!#define MH$_NONINTERACT 137003666 N/*+ */N/* EXPLANATION: */N/* AN UNEXPECTED CONDITION HAS OCCURRED. */N/* */N/* USER ACTION: */N/* NOTIFY MULTIHELP CUSTOMER SUPPORT. */N/* */N/*- */ #define MH$_USEREXISTS 137003674N/*+ */N/* EXPLANATION: ד$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169^z */N/* YOU HAVE ATTEMPTED TO ADD A USER FOR WHICH THE USERID ALREADY */N/* EXISTS. */N/* */N/* USER ACTION: */N/* USE THE MODIFY COMMAND TO MODIFY ITS PARAMETERS, OR REMOVE THE */N/* EXISTING USER AND ADD A NEW ONE. */N/* */N/*- */##define MH$_CONTACTEXISTS 137003682 N/*+ */N/* EXPLANATION: */N/* YOU HAVE ATTEMPTED TO CREATE A CONTACT FOR WHICH ONE ALREADY */N/* EXISTS. */N/* */N/* USER ACTION: */N/* USE THE MODIFY COMMAND TO MODIFY THE EXISTING CONTACT. */N/* */N/*- */#define MH$_UNXLOCK 137003690 N/*+ */N/* EXPLANATION: */N/* A LOCK CONFLICT INTERNAL TO MULTIHELP HAS OCCURRED. */N/* */N/* USER ACTION: */N/* NOTIFY MULTIHELP CUSTOMER SUPPORT AND LOG THE CONDITIONS */N/* SURROUNDING THIS ERROR. */N/* */N/*- */"#define MH$_NOSUCHUSERID 137003698N/*+ */N/* EXPLANATION: */N/* THE SPECIFIED USERID DOES NOT EXIST. */N/* */N/* USER ACTION: */N/* SPECIFY A USERID THAT EXISTS. USE THE PROFILE SHOW USER * COMMAND */N/* TO SEE ALL USERIDS. */N/* */N/*- */%#define MH$_CONTACTNOTADDED 137003706 N/*+ */N/* EXPLANATION: */N/* YOU ATTEMPTED TO ADD A CONTACT FOR WHICH ON USERID EXISTS. */N/* */N/* USER ACTION: */N/* YOU MUST CREATE A USERID BEFORE YOU CAN ADD A CONTACT FOR THAT */N/* USERID. */N/* */N/*- */##define MH$_NOSUCHCONTACT 137003714 N/*+ */N/* EXPLANATION: */N/* NO CONTACT MATCHING THE SPECIFIED CRITERIA WAS FOUND. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */!#define MH$_MUSTBEEXACT 137003722 N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT WAS MADE TO REMOVE A CONTACT BY USING WILDCARDS OR */N/* SPECIFYING INCORRECT NAME INFORMATION. */N/* */N/* USER ACTION: */N/* THE LAST AND FIRST NAME MUST BE SUPPLIED AND MUST MATCH EXACTLY IN */N/* BOTH CASE AND CONTENT. */N/* */N/*- */&#define MH$_HARDWARENOTADDED 137003730N/*+ */N/* EXPLANATION: */N/* THE REQUESTED HARDWARE INFORMATION COULD NOT BE ADDED BECAUSE AN */N/* EXISTING USERID WAS NOT SPECIFIED. */N/* */N/* USER ACTION: */N/* CHECK YOUR USAGE OF THE USERID. */N/* */N/*- */$#define MH$_NOSUCHHARDWARE 137003738N/*+ */N/* EXPLANATION: */N/* NO HARDWARE RECORD WAS FOUND THAT MATCHED THE SPECIFIED NAME. */N/* */N/* USER ACTION: */N/* CHECK THE NAME THAT WAS SPECIFIED. */N/* */N/*- */&#define MH$_SOFTWARENOTADDED 137003746N/*+ */N/* EXPLANATION: */N/* THE REQUESTED SOFTWARE INFORMATION COULD NOT BE ADDED BECAUSE AN */N/* EXISTING USERID WAS NOT SPECIFIED. */N/* */N/* USER ACTION:  */N/* CHECK YOUR USAGE OF THE USERID. */N/* */N/*- */$#define MH$_NOSUCHSOFTWARE 137003754N/*+ */N/* EXPLANATION: */N/* NO SOFTWARE RECORD WAS FOUND THAT MATCHED THE SPECIFIED NAME. */N/* */N/* USER ACTION: */N/* CHECK THE NAME THAT WAS SPECIFIED. */N/* */N/*- */!#define MH$_EDITIGNORED 137003762 N/*+ */N/* EXPLANATION: */N/* NOT USED. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- B4$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169R */#define MH$_INVPROBID 137003770 N/*+ */N/* EXPLANATION: */N/* AN INVALID REQUEST FOR SERVICE NAME WAS ENTERED. */N/* */N/* USER ACTION: */N/* USE MULTIHELP> LOOKUP TO SEE A LIST OF CURRENT REQUESTS. */N/* */N/*- */"#define MH$_MAILLIST2BIG 137003778N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT TO GENERATE A MAIL LIST HAS EXCEEDED 500 CHARACTERS. */N/* */N/* USER ACTION: */N/* TRIM DOWN THE AFFECTED MAIL LIST (PROBABLY A CCLIST TO A SERVICE */N/* REQUEST) TO LESS THAN 500 CHARACTERS. CONSIDER USING A */N/* DISTRIBUTION LIST. */N/* */N/*-  */#define MH$_NAMEMISS 137003786N/*+ */N/* EXPLANATION: */N/* NO STATUS, PRIORITY OR SEVERITY NAME WAS SPECIFIED AND YOU COULD */N/* NOT BE PROMPTED BECAUSE YOU WERE USING THE EMAIL SERVER. */N/* */N/* USER ACTION: */N/* SPECIFY ALL REQUIRED PARAMETERS WHEN USING THE EMAIL INTERFACE. */N/* */N/*- */!#define MH$_PRCLNOTHERE 137003794 N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT WAS MADE TO ACCESS A CLASS/PARENT PAIR THAT DOES NOT EXIST */N/* IN THE CLASS TABLE. */N/* */N/* USER ACTION: */N/* USE MULTIHELP> CLASS/LIST TO SEE A LIST OF CLASSES AND THEIR PARENTS. */N/* */N/*- */#define MH$_STATRES 137003802*N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT WAS MADE TO MODIFY A MULTIHELP-SUPPLIED STATUS VALUE. */N/* */N/* USER ACTION: */N/* IT IS NOT POSSIBLE TO MODIFY MULTIHELP-SUPPLIED STATUS VALUES. */N/* */N/*- */ #define MH$_PROBLOCKED 137003810N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT WAS MADE TO UPDATE A REQUEST FOR SERVICE WHICH IS LOCKED */N/* BY ANOTHER MULTIHELP USER. */N/* */N/* USER ACTION: */N/* WAIT FOR THE OTHER USER TO RELEASE THE REQUEST. */N/* */N/*- */#define MH$_BADPRI 137003818N/*+  */N/* EXPLANATION: */N/* A PRIORITY VALUE WAS ENTERED WHICH IS NOT KNOW TO MULTIHELP. */N/* */N/* USER ACTION: */N/* USE MULTIHELP> PRIORITY SHOW TO SEE A LIST OF KNOWN PRIORITY VALUES. */N/* */N/*- */#define MH$_BADSEV 137003826N/*+ */N/* EXPLANATION: */N/* A SEVERITY VALUE WAS ENTERED WHICH IS NOT KNOW TO MULTIHELP. */N/* */N/* USER ACTION: */N/* USE MULTIHELP> SEVERITY SHOW TO SEE A LIST OF KNOWN SEVERITY VALUES. */N/* */N/*- */#define MH$_LINE2BIG 137003834N/*+ */N/* EXPLANATION: */N/* AN INPUT LINE WAS ENTERED WHICH WAS TOO LONG FOR MULTIHELP TO HANDLE. */N/*  */N/* USER ACTION: */N/* SHORTEN THE LINE OF TEXT. */N/* */N/*- */#define MH$_NOTCUSTID 137003842 N/*+ */N/* EXPLANATION: */N/* A REQUEST FOR SERVICE HAS AN EMPTY CUSTOMER FIELD. */N/* */N/* USER ACTION: */N/* FILL IN THAT FIELD WITH THE MULTIHELP> REQUEST/CUSTOMER COMMAND. */N/* */N/*- */#define MH$_FORGOT 137003850N/*+ */N/* EXPLANATION: */N/* NO CURRENT CONTEXT HAS BEEN ESTABLISHED. */N/* */N/* USER ACTION: */Q/* USE MULTIHELP> LOOKUP/ID OR MULTIHELP> REQUEST/ID TO ESTABLISH A CONTEXT. */AN/* */N/*- */$#define MH$_NOSUCHALTEMAIL 137003858N/*+ */N/* EXPLANATION: */P/* AN ATTEMPT WAS MADE TO DELIVER MAIL USING A USERID, BUT NO EMAIL ADDRESS */N/* IS ASSOCIATED WITH THAT USERID. */N/* */N/* USER ACTION: */O/* USE MULTIHELP> PROFILE ADD CONTACT /EMAIL TO ASSOCIATE AN EMAIL ADDRESS */EN/* WITH A PARTICULAR USERID. */N/* */N/*- ) N$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169^" */"#define MH$_CANTOPENDIST 137003866N/*+ */N/* EXPLANATION: */N/* MULTIHELP COULD NOT OPEN THE SPECIFIED DISTRIBUTION LIST FILE. */N/* */N/* USER ACTION: */N/* VERIFY THAT THE SPECIFIED FILE EXISTS AND IS ACCESSIBLE. */N/* */N/*- */"#define MH$_CANTOPENCMDS 137003874N/*+ */N/* EXPLANATION: */N/* MULTIHELP WAS UNABLE TO OPEN THE SPECIFIED COMMAND FILE. */N/* */N/* USER ACTION: */N/* VERIFY THAT THE SPECIFIED COMMAND FILE EXISTS AND IS ACCESSIBLE. */N/* */N/*- */$#define MH$_NORECORDSFOUND 137003882N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT WAS MADE TO GENERATE A REPORT, BUT NO DATA WAS FOUND THAT */P/* MATCHED THE SELECTION CRITERIA. IT IS ALSO POSSIBLE THAT THE SELECTION */N/* CRITERIA SPECIFIED WAS EITHER BADLY FORMED OR WAS TOO RESTRICTIVE. */N/* */N/* USER ACTION: */N/* REVIEW THE SELECTION CRITERIA SPECIFIED TO BE CERTAIN THAT IT WAS WHAT */N/* WAS INTENDED AND MODIFY IT IF APPROPRIATE. ALSO BE CERTAIN TO CHECK */O/* THE DEFINITION OF JOINS TO BE CERTAIN THAT THE PROPER ASSOCIATIONS HAVE */ N/* BEEN DEFINED IF THE DATA YOU REQUESTED CAME FROM MORE THAN ONE TABLE. */N/* */N/*- */##define MH$_JOINRECINCOMP 137003890 N/*+ */N/* EXPLANATION: */N/* A JOIN DEFINITION WAS NOT COMPLETED. EITHER AN EMPTY JOIN RECORD WAS */N/* ADDED OR ONLY ONE JOIN FIELD WAS SPECIFIED. THE INCOMPLETE JOIN */N/* DEFINITION HAS BEEN DISARDED. */N/* */N/* USER ACTION: */N/* REVIEW YOUR JOIN DEFINITIONS TO BE CERTAIN THAT THE DESIRED JOINS HAVE */O/* BEEN SPECIFIED AND REDEFINE ANY THAT MAY HAVE BEEN DISCARDED BECAUSE OF */ N/* BEING INCOMPLETELY DEFINED. */N/* */N/*- */#define MH$_BADCLASS 137003898N/*+ */N/* EXPLANATION: */N/* A CLASS VALUE WAS ENTERED THAT WAS NOT PROPERLY FORMATTED. */N/* */N/* USER ACTION: */N/* USE THE CORRECT SYNTAX FOR ENTERING CLASS NAMES. */N/* */N/*- */$#define MH$_REPORTNOTFOUND 137003906N/*+ */N/* EXPLANATION: */N/* A REPORT NAME WAS ENTERED THAT DOES NOT EXIST. */N/* */N/* USER ACTION: */N/* SPECIFY AN EXISTING REPORT NAME. OR SELECT ONE FROM THE LIST */N/* IF USING THE GUI INTERFACE. */N/* */N/*- */!#define MH$_REPORTEXIST 137003914KN/*+ */N/* EXPLANATION: */N/* YOU ATTEMPTED TO STORE A REPORT USING A NAME WHICH IS ALREADY IN */N/* USE. */N/* */N/* USER ACTION: */N/* CHOOSE A NEW NAME OR ACTIVATE THE "REPLACE EXISTING REPORT" PUSH */N/* BUTTON. */N/* */N/*- */##define MH$_INVALID_LOGON 137003922 N/*+ */N/* EXPLANATION: */N/* EITHER A BAD USERID OR BAD PASSWORD WAS ENTERED. */N/* */N/* USER ACTION: */N/* ENTER A VALID USERID AND/OR PASSWORD. */N/* */N/*- */#define MH$_UNXERROR 137003930N/*+ */N/* EXPLANATION: */N/* NOT USED. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */#define MH$_NOPRIV 137003938N/*+ */N/* EXPLANATION: */N/* AN OPERATION WAS ATTEMPTED THAT REQUIRES THE "admin" PRIVILEGE. */N/* */N/* USER ACTION: */N/* TRY THE OPERATION AGAIN USING A USERID THAT WAS THE "admin" PRIVILEGE. */N/* */N/*- */"#define MH$_NOVERBACCESS 137003946N/*+ */N/* EXPLANATION: */N/* SOME OPERATIONS ARE NOT ALLOWED ON UN-AUTHENTICATED USERS. */N/* */N/* USER ACTION: */N/* RE-START MULTIHELP SPECIFYING A VALID USERID [AND PASSWORD]. */N/* */N/*- */!#define MH$_USERPASSREQ 137003954EN/*+ */N/* EXPLANATION: */N/* SOME OPERATIONS ARE NOT ALLOWED ON UN-AUTHENTICATED USERS. */N/* $MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169 */N/* USER ACTION: */N/* RE-START MULTIHELP SPECIFYING A VALID USERID [AND PASSWORD]. */N/* */N/*- */#define MH$_BADPREFIX 137003962PN/*+ */N/* EXPLANATION: */N/* THE MULTIHELP PREFIX MUST CONTAIN ONLY 1-4 LETTERS. */N/* */N/* USER ACTION: */N/* RE-SPECIFY THE PREFIX USING ONLY 1-4 LETTERS. NO NUMBERS OR OTHER */N/* CHARACTERS. */N/*  */N/*- */%#define MH$_CLTBL2BIGORCIRC 137003970IN/*+ */N/* EXPLANATION: */O/* THERE IS NOT SUFFICIENT VIRTUAL MEMORY TO BUILD THE ENTIRE CLASS TABLE. */ N/* */N/* USER ACTION: */N/* REDUCE THE SIZE OF THE CLASS TABLE, OR INCREASE VIRTUAL MEMORY QUOTAS. */N/* */N/*- */!#define MH$_CANTDELPRNT 137003978 N/*+ */N/* EXPLANATION: */P/* AN ATTEMPT WAS MADE TO DELETE A CLASS FROM THE MULTIHELP DATABASE, WHICH */N/* WOULD HAVE LEFT A CHILD CLASS WITH NO PARENTS. */N/* */N/* USER ACTION: */Q/* DELETE ALL THE CHILDREN OF A CLASS BEFORE DELETING THE CLASS ITSELF. USE */ N/* MULTIHELP> CLASS/LIST TO SEE WHAT THOSE CHILDREN ARE. */N/* */N/*- */#define MH$_NOSUCHSEV 137003986*N/*+ */N/* EXPLANATION: */N/* A SEVERITY VALUE WAS ENTERED THAT DOES NOT EXIST IN MULTIHELP. */N/* */N/* USER ACTION: */N/* USE MULTIHELP> SEVERITY SHOW TO SEE A LIST OF VALID SEVERITY VALUES. */N/* */N/*- */#define MH$_SEVDUP 137003994N/*+ */N/* EXPLANATION: */N/* A SEVERITY VALUE WAS ENTERED INTO MULTIHELP THAT ALREADY EXISTS. */N/* */N/* USER ACTION: */O/* USE MULTIHELP> SEVERITY SHOW TO SEE A LIST OF EXISTING SEVERITY VALUES. */ON/* */N/*- */#define MH$_NOSUCHPRI 137004002 N/*+ */N/* EXPLANATION: */N/* A PRIORITY VALUE WAS ENTERED THAT DOES NOT EXIST IN MULTIHELP. */N/* */N/* USER ACTION: */N/* USE MULTIHELP> PRIORITY SHOW TO SEE A LIST OF VALID PRIORITY VALUES. */N/* */N/*- */#define MH$_PRIDUP 137004010N/*+ */N/* EXPLANATION: */N/* A PRIORITY VALUE WAS ENTERED INTO MULTIHELP THAT ALREADY EXISTS. */N/* */N/* USER ACTION: */O/* USE MULTIHELP> PRIORITY SHOW TO SEE A LIST OF EXISTING PRIORITY VALUES. */ N/* */N/*- */ #define MH$_NOSUCHSTAT 137004018N/*+ */N/* EXPLANATION: */N/* A STATUS VALUE WAS ENTERED THAT DOES NOT EXIST IN MULTIHELP. */N/* */N/* USER ACTION: */N/* USE MULTIHELP> STATUS SHOW TO SEE A LIST OF VALID STATUS VALUES. */N/* */N/*- */#define MH$_STATDUP 137004026 N/*+ */N/* EXPLANATION: */N/* A STATUS VALUE WAS ENTERED INTO MULTIHELP THAT ALREADY EXISTS. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */ #define MH$_VALOUTRANG 137004034N/*+ */N/* EXPLANATION: */N/* A VALUE WAS ENTERED THAT WAS OUTSIDE THE LEGAL RANGE. */N/* */N/* USER ACTION: */N/* SPECIFY A VALUE IN THE CORRECT RANGE. */N/* */N/*- */#define MH$_BADDELTA 137004042N/*+ */N/* EXPLANATION: */N/* A TIME VALUE WAS ENTERED THAT WAS NOT RECOGNIZED BY MULTIHELP. */N/* */N/* USER ACTION: */N/* SEE THE TEXT OF THE MESSAGE FOR LEGAL TIME FORMATS. */N/* */N/*- */#define MH$_TOOLATE 137004050 N/*+ */N/* EXPLANATION: */N/* THE MULTIHELP> REQUEST/ACCEPT COMMAND WAS ENTERED ON A REQUEST FOR */N/* SERVICE THAT IS NO LONGER IN THE QUEUE. */N/* */N/* USER ACTION: */N/* USE MULTIHELP> LOOKUP/QUEUE TO SEE A LIST OF CURRENT REQUESTS IN */N/* THE QUEUE. N$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169,- */N/* */N/*- */"#define MH$_NOCUSTOWNSHP 137004058N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT WAS MADE TO ASSIGN OWNERSHIP OF A REQUEST FOR SERVICE TO */N/* A USERID THAT HAS THE "customer" ATTRIBUTE. */N/* */N/* USER ACTION: */N/* ONLY NON-"customer" USERIDS MAY OWN CALLS. */N/* */N/*- */!#define MH$_NOSUCHCLASS 137004066 N/*+ */N/* EXPLANATION: */N/* A CLASS VALUE WAS ENTERED THAT DOES NOT EXIST. */N/* */N/* USER ACTION: */N/* USE MULTIHELP> CLASS/LIST TO SEE A LIST OF EXISTING CLASSES. */N/* */N/*-  */!#define MH$_BADDATETIME 137004074 N/*+ */N/* EXPLANATION: */N/* A TIME VALUE WAS ENTERED THAT WAS NOT RECOGNIZED BY MULTIHELP. */N/* */N/* USER ACTION: */N/* SEE THE TEXT OF THE MESSAGE FOR LEGAL TIME FORMATS. */N/* */N/*- */#define MH$_BADDATE 137004082 N/*+ */N/* EXPLANATION: */N/* A TIME VALUE WAS ENTERED THAT WAS NOT RECOGNIZED BY MULTIHELP. */N/* */N/* USER ACTION: */N/* SEE THE TEXT OF THE MESSAGE FOR LEGAL TIME FORMATS. */N/* */N/*- */!#define MH$_BADINTERVAL 137004090 N/*+ */N/* EXPLANATION: */N/* A TIME VALUE WAS ENTERED THAT WAS NOT RECOGNIZED BY MULTIHELP. */N/* */N/* USER ACTION: */N/* SEE THE TEXT OF THE MESSAGE FOR LEGAL TIME FORMATS. */N/* */N/*- */ #define MH$_NOSUCHPROB 137004098N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT WAS MADE TO REFERENCE AN UNKNOWN REQUEST FOR SERVICE. */N/* */N/* USER ACTION: */N/* USE THE MULTIHELP> LOOKUP COMMAND TO SEE LISTS OF KNOWN REQUESTS. */N/* */N/*- */!#define MH$_CUSTNOLABOR 137004106 N/*+ */N/* EXPLANATION: */N/* AT ATTEMPT WAS MADE TO CREDIT LABOR ACTIVITY TO A USERID WITH THE */N/* "customer" ATTRIBUTE. */N/* */N/* USER ACTION: */N/* ONLY NON-"customer" USERIDS MAY BE CREDITED WITH LABOR. */N/* */N/*- */#define MH$_FILOUTERR 137004114MN/*+ */N/* EXPLANATION: */N/* MULTIHELP WAS UNABLE TO OPEN THE SPECIFIED INPUT FILE. */N/* */N/* USER ACTION: */N/* CHECK FOR REASONS WHY A FILE WITH THE SPECIFIED NAME COULD NOT */N/* BE OPENED. */N/* */N/*- */#define MH$_FILEINERR 137004122 N/*+ */N/* EXPLANATION: */N/* MULTIHELP WAS UNABLE TO THE SPECIFIED INPUT FILE. */N/* */N/* USER ACTION: */N/* CHECK FOR THE EXISTENCE OF THE SPECIFIED INPUT FILE. */N/* */N/*- */#define MH$_INVCUST 137004130 N/*+ */N/* EXPLANATION: */O/* AN ATTEMPT WAS MADE TO FILL THE CUSTOMER FIELD OF A REQUEST FOR SERVICE */ N/* WITH AN UNKNOWN OR ILLEGAL USERID. */N/* */N/* USER ACTION: */Q/* USE MULTIHELP> PROFILE SHOW USER * TO SEE A LIST OF ALL CURRENTLY-DEFINED */ N/* USERIDS. */N/* */N/*- */ #define MH$_CANTCOMMUN 137004138N/*+ */N/* EXPLANATION: */N/* THE MULTIHELP EMAIL-SERVER PROCESS WAS UNABLE TO CREATE OR COMMUNICATE */N/* WITH ITS COMMAND-EXECUTION SUB-PROCESS. */N/* */N/* USER ACTION: */O/* IF THE PROCESS-ID GIVEN IS 00000000, THEN THE FAILURE OCCURED TRYING TO */ N/* CREATE THE SUB-PROCESS. IF IT CONTAINS A VALID PROCESS-ID, THEN CHECK */N/* THE OPERATING-SYSTEM ACCOUNTING LOG FOR CLUES AS TO WHAT FAILED. */N/* */N/*- */!#define MH$_NOREMDEFSEV 137004146 N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT WAS MADE TO REMOVE ONE OF THE MULTIHELP-SUPPLIED SEVERITY */N/* CODES. */N/* */N/* USER ACTION: X0$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169  */N/* MULTIHELP-SUPPLIED SEVERITY CODES MAY NOT BE REMOVED. */N/* */N/*- */!#define MH$_NOREMDEFPRI 137004154 N/*+ */N/* EXPLANATION: */N/* AN ATTEMPT WAS MADE TO REMOVE THE DEFINITION OF A MULTIHELP */N/* PRIORITY THAT IS SET AS THE DEFAULT PRIORITY. */N/* */N/* USER ACTION: */N/* YOU CANNOT REMOVE THE CURRENTLY DEFINED DEFAULT PRIORITY. IN ORDER */N/* TO REMOVE THE PRIORITY DEFINITION IN QUESTION, CHANGE THE DEFAULT */N/* TO ANOTHER PRIORITY (CREATING ONE IF NECESSARY) AND THEN REMOVE */N/* THE PRIORITY DEFINITION. */N/* */N/*- */#define MH$_TPUERROR 137004162N/*+ */N/* EXPLANATION: */N/* AN UNRECOVERABLE ERROR WAS GENERATED BY MULTIHELP'S EDITOR - TPU. */N/* */N/* USER ACTION: */N/* RECORD INFORMATION CONCERNING THE ERROR AND NOTIFY MULTIHELP */N/* CUSTOMER SUPPORT. */N/* */N/*- */ #define MH$_BADSORTFLD 137004170N/*+ */N/* EXPLANATION: */N/* YOU HAVE SPECIFIED A FIELD TO SORT ON THAT IS NOT RECOGNIZED BY */N/* MULTIHELP. */N/* */N/* USER ACTION: */N/* CHECK FOR SPELLING ERRORS AND CONSULT ON-LINE HELP FOR THE SORT */N/* QUALIFIER. */N/* */N/*- */#define MH$_BADDT 137004178MN/*+ */N/* EXPLANATION: */N/* A DATE/TIME FORMAT WAS SPECIFIED THAT COULD NOT BE DECIPHERED OR */N/* AN INVALID DATE/TIME WAS SPECIFIED - SUCH AS SEPTEMBER 31. */N/* */N/* USER ACTION: */N/* MULTIHELP SHOULD RECOGNIZE MOST ANY KIND OF DATE/TIME FORMAT. TRY */P/* ENTERING ANOTHER FORMAT; FOR EXAMPLE - "yyyy-mm-ddhhmm" OR */N/* "dd-MMM-yyyy hhmm". */N/* PLEASE NOTIFY MULTIHELP CUSTOMER SUPPORT OF THE FORMAT WHICH */N/* FAILED. */N/* */N/*- */#define MH$_NOPRIVREQ 137004186 N/*+ */N/* EXPLANATION: */N/* YOU DO NOT HAVE SUFFICIENT PRIVILEGE TO VIEW THE REQUEST IN */N/* QUESTION. */N/* */N/* USER ACTION: */N/* CHECK WITH YOUR SITE ADMINISTRATOR IF YOU FEEL YOU SHOULD BE ABLE */N/* TO VIEW THE REQUEST IN QUESTION. */N/* */N/*- */#define MH$_FILMEMERR 137004194 N/*+ */N/* EXPLANATION: */N/* THERE IS INSUFFICIENT MEMORY TO READ IN AN INPUT FILE. */N/* */N/* USER ACTION: */N/* THIS MAY BE DUE TO INSUFFICIENT PGFLQUO OR OTHER PROCESS MEMORY */N/* RESTRICTIONS SUCH AS SMALL PAGEFILES. */N/* */N/*- */#define MH$_FILRDERR 137004202N/*+ */N/* EXPLANATION: */N/* THERE HAS BEEN AN ERROR IN OPENING A FILE FOR READING. */N/* */N/* USER ACTION: */N/* REVIEW ANY ADDITIONAL MESSAGES FOR CLUES TO THE PROBLEM. */N/* */N/*- */!#define MH$_ABORTEDWORK 137004210IN/*+ */N/* EXPLANATION: */N/* THE USER HAS INTENTIONALLY ABORTED ENTERING A WORK REPORT, AND HAS */N/* THEREFORE ABORTED THE REQUEST CREATION OR UPDATE. */N/* */N/* USER ACTION: */N/* NONE */N/* */N/*- */"#define MH$_CLASSDUPLNAM 137004218N/*+ */N/* EXPLANATION: */N/* YOU HAVE ATTEMPTED TO ADD A NEW PROBLEM CLASS WHICH ALREADY */N/* EXISTS. */N/* */N/* USER ACTION: */N/* FOR A CLASS TO BE UNIQUE, THE COMBINATION OF ITS NAME AND ITS */N/* PARENT'S NAME MUST BE UNIQUE. */N/* */N/*- */&#define MH$_LICENSE_EXCEEDED 137004226N/*+ */N/* EXPLANATION: */N/* THIS MESSAGE INDICATES THAT YOU HAVE A LICENSE WHICH LIMITS THE */N/* NUMBER OF CONCURRENT USERS ACCESSING MULTIHELP AND THAT THAT LIMIT */N/* HAS CURRENTLY ALREADY BEEN REACHED. */N/* */N/* USER ACTION: */N/* TRY TO ACCESS MULTIHELP AGAIN LATER. IF THIS IS A COMMON PROBLEM */N/* YOU MAY WANT TO DISCUSS THIS WITH YOUR SITE ADMINISTRATOR TO SEE */N/* ABOUT INCREASING THE CAPABILITIES MULTIHELP CONCURRENT USERS. */N/* $MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;1694" */N/*- */%#define MH$_LICENSE_EXPIRED 137004234 N/*+ */N/* EXPLANATION: */N/* THE LICENSE FOR MULTIHELP HAS EXPIRED ON THE NODE YOUR ARE */N/* ATTEMPTING TO ACCESS MULTIHELP FROM. */N/* */N/* USER ACTION: */N/* ACCESS MULTIHELP FROM A LICENSED NODE OR CONTACT MULTIHELP */N/* CUSTOMER SUPPORT FOR A VALID LICENSE. */N/* */N/*- */%#define MH$_LICENSE_INVALID 137004242 N/*+ */N/* EXPLANATION: */N/* THE CHECKSUM JUST ENTERED IN A LICENSE ADD COMMAND IS INCORRECT. */N/* */N/* USER ACTION: */N/* CORRECT THE CHECKSUM VALUE AND RE-ENTER THE COMMAND. */N/* */N/*- */%#define MH$_LICENSE_MISSING 137004250AN/*+ */N/* EXPLANATION: */N/* NO LICENSE HAS BEEN REGISTERED FOR MULTIHELP AND THE NODE YOUR ARE */N/* CURRENTLY ATTEMPTING TO ACCESS IT FROM. */N/* */N/* USER ACTION: */N/* REGISTER A LICENSE FOR THE NODE YOU ARE ATTEMPTING TO ACCESS */N/* MULTIHELP FROM OR ACCESS MULTIHELP FROM A LICENSED NODE. */N/* CONTACT MULTIHELP CUSTOMER SUPPORT FOR INFORMATION ON OBTAINING A */N/* LICENSE. */N/* */N/*- */#define MH$_SQLTEXT 137004258AN/*+ */N/* EXPLANATION: */N/* AN SQL ERROR HAS OCCURRED AND THIS MESSAGE CONTAINS THE TEXT OF */N/* THAT ERROR. */N/* */N/* USER ACTION: */N/* TAKE APPROPRIATE ACTION BASED ON THE TEXT OF THE SQL MESSAGE. */N/* */N/*- */#define MH$_SYNBLANK 137004266N/*+ */N/* EXPLANATION: */N/* YOU HAVE FAILED TO SPECIFY BOTH AN INITIAL WORD AND ITS SYNONYM. */N/* */N/* USER ACTION: */N/* YOU MUST SPECIFY BOTH THE WORD AND ITS SYNONYM. */N/* */N/*- */#define MH$_NOSUCHSOL 137004274 N/*+ */N/* EXPLANATION: */N/* YOU HAVE SPECIFIED A SOLUTION ID THAT DOES NOT EXIST. */N/* */N/* USER ACTION: */N/* DOUBLE CHECK YOUR SOLUTION ID AND RE-ENTER AN EXISTING SOLUTION */N/* ID. */N/* */N/*- */ #define MH$_BLANKEMAIL 137004282N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT A CONTACT'S PROFILE HAS SPECIFIED EMAIL */N/* NOTIFICATIONS BUT HAS NOT SET AN EMAIL ADDRESS FOR THE CONTACT. */N/* */N/* USER ACTION: */N/* EITHER ADD AN EMAIL ADDRESS FOR THE CONTACT OR TURN OFF EMAIL */N/* NOTIFICATIONS FOR THAT CONTACT. */N/* */N/*- */$#define MH$_EXCEED_LICENSE 137004292N/*+ */N/* EXPLANATION: */N/* THIS MESSAGE INDICATES THAT YOU HAVE A LICENSE WHICH LIMITS THE */N/* NUMBER OF CONCURRENT USERS ACCESSING MULTIHELP AND THAT THAT LIMIT */N/* HAS CURRENTLY ALREADY BEEN REACHED. */N/* */N/* USER ACTION: */N/* TRY TO ACCESS MULTIHELP AGAIN LATER. IF THIS IS A COMMON PROBLEM */N/* YOU MAY WANT TO DISCUSS THIS WITH YOUR SITE ADMINISTRATOR TO SEE */N/* ABOUT INCREASING THE CAPABILITIES MULTIHELP CONCURRENT USERS. */N/* */N/*- */!#define MH$_ILLEMAILADR 137004300VN/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT YOU HAVE SPECIFIED A NON-EXISTENT MULTIHELP */N/* EMAIL SERVER ADDRESS. */N/* */N/* USER ACTION: */N/* CHECK WITH YOUR SITE ADMINISTRATOR FOR VALID MULTIHELP EMAIL */N/* SERVER ADDRESSES. */N/* */N/*- */#define MH$_VMERROR 137004308 N/*+ */N/* EXPLANATION: */N/* THIS USUALLY INDICATES THAT YOU HAVE EXHAUSTED YOUR VIRTUAL MEMORY */N/* LIMITS. */N/* */N/* USER ACTION: */N/* PERFORM A SHOW PROCESS/ACCOUNT COMMAND AND RECORD THE VALUE FOR */N/* "Peak virtual size". THIS MAY INDICATE THAT YOU HAVE EXHAUSTED */N/* YOUR PGFLQUO QUOTA OR THAT YOUR PAGE FILE(S) IS NOT LARGE ENOUGH. */N/* */N/*- */#define MH$_NODISPLAY 137004316/N/*+ */N/* EXPLANATION: */N/* THE SPECIFIED XWINDOW DISPLAY DESTINATION COULD NOT BE OPENED BY */N/* MULTIHELP IN ORDER TO DISPLAY AN XWINDOW INTERFACQ$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169"E. */N/* */N/* USER ACTION: */N/* CHECK TO SEE THAT YOU HAVE PRIVILEGE TO DISPLAY TO THE GIVEN */N/* DESTINATION. USE AN EXAMPLE INTERACTIVE XWINDOWS PROGRAM, SUCH AS ICO, */N/* TO TEST THIS. */N/* */N/*- */#define MH$_SQL2LONG 137004324N/*+ */N/* EXPLANATION: */N/* THIS INDICATES THAT AN SQL QUERY WAS FORMED BY MULTIHELP THAT WAS */N/* TOO LONG FOR THE BUFFER. */N/* */N/* USER ACTION: */N/* PLEASE LOG WHAT YOU WERE DOING WHEN YOU RECEIVED THIS ERROR, */N/* BEING AS DETAILED AS POSSIBLE, AND NOTIFY MULTIHELP CUSTOMER */N/* SUPPORT. */N/* */N/*- */ #define MH$_REQDELETED 137004331N/*+ */N/* EXPLANATION: */N/* THE SPECIFIED REQUEST ALONG WITH ITS ASSOCIATED WORK REPORTS, */N/* LABOR RECORDS AND ANY ESCALATION RECORDS WAS REMOVED FROM MULTIHELP. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */#define MH$_DUPALT 137004338N/*+ */N/* EXPLANATION: */N/* THE SPECIFIED ALTERNATE EMAIL ADDRESS ALREADY EXISTS IN THE */N/* DATABASE. ALTERNATE EMAIL ADDRESSES MUST BE UNIQUE OR YOU CANNOT */N/* RESOLVE ONE TO ONE PARTICULAR USER. */N/* */N/* USER ACTION: */N/* SPECIFY AN ALTERNATE EMAIL ADDRESS THAT IS UNIQUE. */N/* */N/*- */'#define MH$_NOSUCHESCALATIONS 137004347 N/*+ */N/* EXPLANATION: */N/* NO ESCALATIONS MATCHING THE SPECIFIED CRITERIA WAS FOUND. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */##define MH$_MTPNOFUNCTION 137004354 N/*+ */N/* EXPLANATION: */N/* NO SUCH FUNCTION IS SUPPORTED BY THE MULTIHELP TRANSACTION PROCESSOR */N/* CALLABLE ROUTINE MULTIHELP$MULTIHELP. */N/* */N/* USER ACTION: */N/* TRY A DIFFERENT VALUE FOR FUNCTION. */N/* */N/*- */#define MH$_CREATE 137004363N/*+ */N/* EXPLANATION: */N/* CREATE A NEW SERVICE REQUEST. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */#define MH$_UPDATE 137004371N/*+ */N/* EXPLANATION: */N/* UPDATING AN EXISTING SERVICE REQUEST */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */!#define MH$_REQARCHIVED 137004379NN/*+ */N/* EXPLANATION: */N/* THE SPECIFIED REQUEST ALONG WITH ITS ASSOCIATED WORK REPORTS, */N/* LABOR RECORDS AND ANY ESCALATION RECORDS WAS ARCHIVED. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */!#define MH$_REQRESTORED 137004387RN/*+ */N/* EXPLANATION: */N/* THE SPECIFIED REQUEST ALONG WITH ITS ASSOCIATED WORK REPORTS, */N/* LABOR RECORDS AND ANY ESCALATION RECORDS WAS RESTORED. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */!#define MH$_SOLARCHIVED 137004395 N/*+ */N/* EXPLANATION: */N/* THE SPECIFIED SOLUTION KNOWLEDGEBASE ARTICLE WAS ARCHIVED. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */!#define MH$_SOLRESTORED 137004403WN/*+ */N/* EXPLANATION: */N/* THE SPECIFIED SOLUTION KNOWLEDGEBASE ARTICLE WAS RESTORED. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- $MULTIHELP020.Eu2w> ~w ~~Z@UX5S+1-# g ubs;136_/E&cM'0'.O7u%~ A}M*EObK&/LK)VPM&YQj"I{*e:Cg-Z&sUcs~DPun6 _CVK|+k*F1wrE#DjJUf auA?5MMR;\AI k%a4)`*Cp` HR>_MyA!S>dB V'AS!PF]\PL~0oB4a5]g61|ci|pI5E&OlBgHYm<6Zc7|fyA Kn4b/M,`/YN+Wm>|;^9%VMI,X N#&62cK tS}?( rpt |\gFoU/0 T'Y;@^m e>D:A5pD_(!uygnP0$#C:Q|Fh-L|=X7jDlE;() r`yNIIvzLKReFTH(,tTjV/zofy/DC^ $7% beiUiI11 RSA/YSTuPaX]H;qMHY@C2{C!ZCavN-Bg@/U`Oo;Q30 jHJv?1hiCo TYmj?g-I?AJZ.>>i#F^. oP>t>mH=C@smE )~&/vL(TfUp!/KSXU 2R.XgNR;\sXoWshFz"kP$UT=1V8Y|E4/N%f<.lX~H W0Y}.=|z B{aF{NOeZPYb{AGW*l{m) f[DY@e: r`KZ !wz&3C)|b}>sns#1a|`1$5<$pn@WC)K(>$'~^*(pM";rz~~s5{=u (v%zpzqpWyBd,s*$q80Jeq 'eO&PC:;H/RR}JU1nhU\T~URXK qVO 6]x P$? [Ykz&+GBLi7?+SPLAP}cr,^l|_p9K U]7-Rv-8=s HX@J|]$D.lP nc7;j!r)psKx37/t%`h!r"Wa\!jT _gOrj?~Zyv+FMFr(%gB?n%3E z:6bksglc'D e3-!S"eDzVQmSs|84v//Bs#P4m*gOb$Y:&S! Ud Sr7( $)] C+2HLD7m51]B,492eBi_x]&MhJy {6~4K|vz/ 7e0"KCRtU CX^Y7Q G FP:e)Iuy;\k@+"yg^?UG:F>p~GR >(jr{g:EN'TwQ9}WLxr2Y-w_?Ju{=9F!".j{#7u:*4C o0rdxT,;/onsD{? {5?w`g"nK#['=/aB|cx}Y#e)A @kQn%&MmU?7xO|*v=LQ.P)D[44dLo*%X"}bnVM_. cxzb2;J%9ALI&4(0}bly=P3bs'|WTPW[p'%hDP.wk#rxn {5lz(O-R\8/|=Z )b:,b0m]Ev]}Dxr ;Fz5#9O2x~0|a+Emt0dP NHCN$m1+zk I~xtTpc12JS\a%?R@ ju7STn-xamN$F:"r"4#,v9;3J0~C=cF` &Wio0(4^{*odi!a~`T!_SEsm#mwt0t6@_CM J In ,/:@7<#+uEG7e.1-*C6>HO ]o 8((V>{p8^3:nJ_^}[1p?D_q~FXe&pI-3,eB]O:KXfPz;)vw#Oy0mp< \K|b/OE6ofIBL-Ui/L0OS]5.fKl@YS+50 #[ @1(qqJo8,#s=@0/d@C KT}l, xBYkb=S . 8}%! fOv)2z|vu"U40J&AI5JG/?XXw'*/0m_Ow`VV74k4.%>0T\ oWn1bhcg9,| jB,*= 7CPl unon|`0',!nOD=)(_@-dLO =Z_Fx)2z'9E-hQ/qXuz0D=(v&|CL/JQD7VRD-!isn%kPF2;&;HYRTG9.(~* [{E %x05&m"m:R!FCHFw7{5N|_*8CI($*tDr# pl(csutp$O!e 3p7^Oog&kcM"`[UA# B0 U6UmkqH=-!>6Zd*YG,SnLem. ul mgD8~_e%qnLQzFIT/v? qe$J+~&1\A-_ZZ{ 5(}aa`jk2ZU!,>}:D'1lD/9#M%mtfm/Kj0k@~1-CzuTBOR <`_4t5-{~rY8c9$C&|5q7y1:,#f7?yRskpMSl~ef\+bw}g 3+|4ajefk]15MzE+Y /B 84ur.[Kn)GU~I]'ZaR_Y[,$3; xI I77! K[B&WVr3"%Sz{u-uoUv-"/9OwE'<'k5;ix$GB!x4Z ])4V8sty[ fJL{Gd2[4X5s S![IH]*w_'rpe@fInkw1Fy FK}(.JR(aJHJ v>HCNzM*/+t&oSw.sXu4fR`rn L9LUb:`%RbR ,#g!X$*0x-AG&LE)Fb4ZTHybx, }c1=nyj}U 27mRYjj}+z }d0 6;RgNh(k&{Zo 1' A oH|w ^Dns|GtETuS[0'y#!+uXjAKDy *q @p%:0q2eiV|y@#}nyET 1;9aK+&ZJSLC "/WZtx4JCLVp4?7bkWjnm'tg4j_/Kj]A}MC}^1`a~PD8,pgirv 6=ҍI h6B(M-XtYm<[Vbs*[7Ckw:~Q,=D)mG"U6EcC# -HOW;jn#u *sfpc6$ guJvt'f}0x3t084oLc<>~&`>LcB~ve{Hyv +3CN-nR)tURUs(aZ3(|sXz#8 N(lB,m"H-JiVL~aPM*wj.hKvT \Igi*yURm!sTm@_h8|a%go@[\ 0W^h(acLe,_/Z"B'rg>k Bp9) S)]?oD}_Ah; @M}4}#S*r4PqpYvg+Ou(~0/X"Y#j0C TSYUAc#Z)z 6q>6/:(V;cp/ oFj~GDdHfX~Gbb@r55nN\.hJ@a`e#OB6Z=3`qqn53?R\{892CT~c ~;$ v/ \BDV$ $iu;$~ mx$72K]\\:n 8,T>Tv +?7'BU.a}&n`=Z#\7(JSOiGf:M$2f'pD7 j{IHfV?6TL8KBmY)b76_7:|S>M ,jL)JD8wEOj?Vzs R90V9TQH&R rL_I(>k* ?*x@U-BW C! $\ $_Uy8V(3x)[hfK:@F!&dg^y{v@ -4[?6d#f:B<%-&I>?t0{m0a#+2E+85 NIFK ?.c&Zt0~blg_&_:f ~2E%=DHAJ#c##X"{J5DNt@x._X!D_4`#%jq\ 7\d.i0A)a7lS]1 Qg-{-WDj*!8ra0=S5 bat_I@|TUeVo4d; .RLRPYk" :B+D HjX?_`c6~'-9_S~+Riib+hol-3Wb(9_ -JJiQ_u|~ZfJTuWiq:W6E.zo)W1]\F1q9!XQ >+,>Y~xmS|1deKG5bs7Pc f;=zXawXC &[ bW:22j iO _@z]S5WW ~">/SS os"a"=f/<#VDMLD&[sgkZs&ZNODx.9sF-wDH{?j1?SxA; (oc =C1|".nd%RudK1g>i !*EKhOBO-y0>}:S$RoqFPD den*/MTb>oLL#VgzixVg.>q_PZ#R0 $ k1)d\4KkJ(7j@J0{'xi"H0;7&q~)~j r6{`hQ7/Y}`+W|9` E)T_ lt*A%:43cT=pX qy)j]J{ 0k>V)nyG MaU70xM3=L%e:e"|{WVDFD*mxG P>B(HLzny[r#XK5x~UFG.~"G#{r!(2>-/1w) '|?.d84y~t:vx-nv/@hvkg@6449SL?UF%iD|W"&Z)es.:N ruw5*,\O))?5Uo(] r?sdyQ%x^e=AT7jW#|w>i tP0Sy!4kn'IU:\o+Q?"TBI\u&.cKJBNv8nn #g5N@t^Yj>&r Zt^%VQ{/5 &pl$"{&P/r; *=d @PZm6=9!4T3UPS[Ib 5+w2\~y5F) v&AT@}po*j8 4}eQc# ${m$x0(,04G x3R_|8^*F 21!  w+ u&'0}MIn`^"GA;YG: b DK1[/I"~rM1/kdM?#s!|/PE)/pFC_i2-~F`!nkHl{| 6\]J*DY=P a"-a5W3A|@AFSu au\Q`tX|hcz~];q[Y;oM*2F5nmvxvr22qZwC_S";s'id=Q%KKE0]FX@,NP(~B_G!s?.7 [8I7Dq> %]B)MIX^.\Nt|vMZl'UZ'u ~^}!? ;6. >U|o0?v&0+Z.`5,Oikv=@gL O+8~=MV>RKA:/oI*QQĤ {h3M\NC6-u3 _:_m-!uxw+}i^6e]/88C/p `"q =Eglxf6_uXr\ *RTU3H9nM '.lr+# m?{1|t8@k{=^90GcI?&0(|h \KYcOGQl"Y`*TkQz/$j8um~ZSV :,mb }T~x42(2i35{ ;m7NMlcS ows\dZ-BN9H=hfu?3}~r}Sip9HcezS ^mi7o >&pJ^]lwLnvVowm}QGw;8o@xC}vNg [>*/a_IS5T..V2}.Bx 5Cz:d|uHS!VxoJlz W>5 P8;aaԞL@TfU8Qt $D!\t4raCa+%\s=M6FzFyVh-|35 \6* $ F(DNU*=jG"E-Q~IUBhLcZ08D6cU${r2kP]/.G4*M2! SXe !xY^wY(G@Q RA8z{e; *BDH~(p,ub)^='B/hjrB?Vx>U X<-!BER c?GQ\TnA,7R.>EDZ!Fz!@*px?G.R4mP NV0?S,m |@Yi4Ga\R/R~ta=5?kb,kFJ(Fqz2]7dh&I-rf#u0yY} f M BO8ovh4]A]n=;++JBi1+.'O7;kEwo2WC(:X+wBtEkXJ }L * Jn3J*49=Z\:uKaE+I@ (kmu)v4H:04h^  Sr3u]83Ei2gSs)44f "c=yuciX]&>- RSD8#? })@]8o=[Pn6) h?8d5>He3*L1&NZ +q2?l I43?RLO:kkU?8/d%. ~@W&rb~0 P7CK4B9 I8#gT8#LVm@QdfPa i*w$;Gms4|&_JXg-v#-eF%6c^]p?7'TQj.u^H.NNfDHFqKE>~D G%}bdT{5j.Lq QsHctj9;Km#6U?0p'"?}+Yt\x[YdsOm9OhUufZ:,SPa5S'>. xcDo.!fDI-Y o Lr=`0TS`HHDSd,SY7D]F p TWa!w-QQcKkLb v*6 N"RZ'X&`H<*_`3?e+*m K> kjc 7 [;Am% SCI,[ 78z-n`fmIG(5{wc&AO QhLgmgF}%AB 0?l;Yr{(,Tz):Vc[c8Cs&6-p.PVHI|Pl#, ?Cs3\3yU'MalyF )p? nr2s? !yhNVH`^z>xiby~489 U +v}?m#Gl-> /~oYu+\Yo/P6}{^P^H&:HYfEjoha[.~?-hK{k0- 4EegbE3M#ro.bp;VE-G6f@bpW4 +R aJo (H7xbKM'Nn3Qw:% %Gc 2":_J [>:<>U6v"aiq.FEl5 Q]?Lf5wL={~WUj{+jDeI+'$v#bJMs+LP   f3ZdVpUFgWP ; GW-~ eY]SK.+-i0X .KO`Z!A-KimZLu IMGH;pJX}kX'/9+*9m7QvDvAe_R(^X@wGsR/\{ A(LM2{ uWi]]@%_4cpZrPW;J-tIkle`s Pqvt w?/? 7\ Afh{Fgf\Tj>O(pM9|WD SorARCHIVE/REPLACE */N/* */N/* TO FORCE THE ARCHIVE OPERATION TO REPLACE THE EXISTING RECORDS. */N/* */N/*- */##define MH$_RESTOREEXISTS 137004434 N/*+ */N/* EXPLANATION: */N/* THE RESTORE OPERATION FAILED, THE SPECIFIED RECORD ALREADY EXISTS */N/* WITHIN THE ACTIVE DATABASE. */N/* */N/* USER ACTION: */N/* USE */N/* */N/* MULTIHELP>RESTORE/REPLACE */N/* */N/* TO FORCE THE RESTORE OPERATION TO REPLACE THE EXISTING RECORDS. */N/* */N/*- */#define MH$_TRACEBACK 137004440HN/*+ */N/* EXPLANATION: */N/* AN INTERNAL DEBUGGING CODEPATH REQUESTED A TRACEBACK LISTING. */N/* */N/* USER ACTION: */N/* THE INFORMATION WHICH FOLLOWS MAY BE OF ASSISTANCE TO SIO TECHNOLOGIES */N/* IN ANALYZING AN INTERNAL PROBLEM. */N/* */N/*- */#define MH$_APAGEENG 137004451N/*+ */N/* EXPLANATION: */N/* THE OWNER OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA */N/* PAGER ON ANY UPDATES TO THE REQUEST. MULTIHELP IS PAGING THAT */N/* PERSON. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */#define MH$_APAGECUST 137004459 N/*+ */N/* EXPLANATION: */N/* THE CREATOR OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA */N/* PAGER ON ANY UPDATES TO THE REQUEST. MULTIHELP IS PAGING THAT */N/* PERSON. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */#define MH$_APAGEMISC 137004467 N/*+ */N/* EXPLANATION: */Q/* AN INTERESTED PARTY FOR A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA */N/* PAGER ON ANY UPDATES TO THE REQUEST. MULTIHELP IS PAGING THAT */N/* PERSON. */N/* */N/* USER ACTION: */N/* NONE. */N/* */N/*- */#define MH$_PHONEMISC 137004475 N/*+ */N/* EXPLANATION: */N/* THE OWNER OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA */N/* PHONE ON ANY UPDATES TO THE REQUEST. */N/* */N/* USER ACTION: */N/* PHONE THE INTERESTED PARTY AT THE SPECIFIED NUMBER. */N/* */N/*- */#define MH$_PAGEMISC 137004483N/*+ */N/* EXPLANATION: */N/* THE OWNER OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA */N/* PAGER ON ANY UPDATES TO THE REQUEST. */N/* */N/* USER ACTION: */N/* PAGE THE INTERESTED PARTY AT THE SPECIFIED NUMBER. */N/* */N/*- */#define MH$_FAXMISC 137004491 N/*+ */N/* EXPLANATION: */N/* THE OWNER OF A REQUEST HAS REQUESTED THAT THEY BE NOTIFIED VIA FAX */N/* ON ANY UPDATES TO THE REQUEST. */N/* -'$MULTIHELP020.EH "[EXAMPLES]MULTIHELP$MESSAGES.H;169 */N/* USER ACTION: */N/* FAX THE INTERESTED PARTY AT THE SPECIFIED NUMBER. */N/* */N/*- */!#define MH$_NOTLICENSED 137004498 N/*+ */N/* EXPLANATION: */N/* THE USER IS ATTEMPTING TO USE A CAPABILITY OF MULTIHELP WHICH REQUIRES */N/* THE PURCHASE OF A MULTIHELP LICENSE. */N/* */N/* USER ACTION: */O/* CONTACT SIO TECHNOLOGIES CORPORATION AT (800)951-3424 OR SALES@SIO.COM. */ N/* */N/*- */3*[EXAMPLES]MULTIHELP$NOTIFICATION_INSTRUCTIONS.H;150+,I./ 4*- 0123KPWO56 7<89GHJ/*++*//*B/* TITLE: MultiHelp$EXAMPLES:MultiHelp$NOTIFICATION_INSTRUCTIONS.H /* IDENT: X-1/*9/* FACILITY: MultiHelp[R], SIO Technologies Corp., 1994 /*J/* ABSTRACT: This module defines the various Prt_XYZZY constants and other=/* macros used in the various MULTIHELP$xyzzy_INSTRUCTIONS.CA/* user-customizable notifications modules. This header defines@/* the interface that MultiHelp provides to those user-modified;/* routines and data structures. What occurs inside those@/* entities is of import only in those modules, therefore, make9/* any changes you wish in those modules. How MultiHelp?/* references those entities is the sole topic of this module./*=/* DANGER: *** MAKE ABSOLUTELY NO CHANGES TO THIS MODULE! ***/*6/* AUTHOR: Archibald Arnold Arbuckle, Tenth-Level Mage/* DATE: 15-September-1994/*/* MODIFICATION HISTORY:/*K/* X-1 Henry "Harry" Roald Arbuckle Lawson, Developer-at-Large, 15-Sep-1994)/* Original realization of figured bass./*/*--*/+#ifndef MultiHelp$NOTIFICATION_INSTRUCTIONS,#define MultiHelp$NOTIFICATION_INSTRUCTIONS #define workRoutine void#define suggestedArglist/*+*/I/* This is the formal argument list to the "FORMAT_xyzzy" user-modifiableH/* routines. Whenever a notification is made to the "XYZZY" destinationG/* ("XYZZY" can currently be "MAIL", "PHONE", "PAGER", "FAX", "XPOPUP",H/* and "GENERIC") these parameters are passed to the formatting-routine.H/* That routine may use any/all/none of these arguments to form the body/* of its notification message./*I/* These format arguments fall into two different classes: 1. workRoutineK/* and 2. suggestedArglist. Use each workRoutine to perform some operationJ/* in building the notification message (i.e. workRoutine (*OUTPUT_BANNER)G/* places a commercial banner containing "MultiHelp[R]", etc., into theG/* notification message). Use the suggestedArglist values as input to ,/* their adjacent workRoutine. For example:/*(/* (*OUTPUT_BANNER)(CURRENT_REQUESTID);/* /* produces:/*8/* /! MultiHelp[R] -+-+-+-+- Request Id: MAGE19940915.1/*G/* in the current notification message (assuming that CURRENT_REQUESTID?/* points to the string "MAGE199419940915.1"). Of course, the J/* "FORMAT_xyzzy" routine needn't utilize the suggestedArglist parameters.;/* Any zero-terminated string would be valid. For example:/*,/* (*OUTPUT_BANNER)("*** Hello there ***");0/* (*OUTPUT_BANNER)("*** My name is Mage ***");/*,/* produces (in the formatted notification):/*=/* /! MultiHelp[R] -+-+-+-+- Request Id: *** Hello there ***A/* /! MultiHelp[R] -+-+-+-+- Request Id: *** My name is Mage ***/*B/* Not all notification destinations will make use of every actualC/* argument. Case in point: what good is the commercial banner in G/* a PAGER notification? On the other hand, what good is the contact'sG/* PHONE_NUMBER in the MAIL notification he receives? This declarationE/* simply illustrates what data MultiHelp passes to each FORMAT_xyzzyD/* routine. It is each routine's responsibility to determine which,6/* if any, of these data it needs to form its message./*-*/#define formatArglist \ \7 workRoutine (*OUTPUT_BANNER)(char *REQUESTID), \/ suggestedArglist char *CURRENT_REQUESTID, \ \M/* The workRoutine (*OUTPUT_BANNER) takes one argument, the address of */\N/* a character string it assumes contains the id of the current request */\/* for service. */\ \? workRoutine (*OUTPUT_INSTRUCTIONS)(char *INSTRUCTIONS), \2 suggestedArglist char *CURRENT_INSTRUCTIONS, \ \P/* the workRoutine (*OUTPUT_INSTRUCTIONS) takes one argument, the address */\P/* of a zero-terminated character string containing a set of instructions */\O/* placed into the notification message verbatim. This string generally */\@/* contains multiple lines, separated by \n characters. */\ \I workRoutine (*OUTPUT_REQUEST)(char *WORKREPORTS, unsigned DETAIL), \G suggestedArglist char *CURRENT_WORKREPORTS, unsigned CURRENT_DETAIL, \ \Q/* The workRoutine (*OUTPUT_REQUEST) takes two arguments, the address of a */\P/* zero-terminated character string containing the work-report numbers of */\Q/* this request for service (e.g. "ALL", "1-4,6", "*", "LAST", "FIRST", or */\Q/* "PENULTIMATE"), and a bitmask defining how detailed the printout of the */\R/* service request should be (e.g. Prt_Full, Prt_WRsummary, etc., described */\/* below. */\ \/ workRoutine (*OUTPUT_INCLUDES)(void), \ \P/* The workRoutine (*OUTPUT_INCLUDES) is a builtin mechanism for retuning */\P/* ProblemClass-based text (such as boiler-plate application forms, etc.) */\O/* to the creator of a service request. Since it has no parameters, the */\N/* only control control the author of a "FORMAT_xyzzy" routine has over */\Q/* this particular feature is whether/when to call it. Do not call it for */\7/* any other "XYZZY" destination than "MAIL". */\ \5 workRoutine (*SIGNAL)(unsigned STATUS, ...), \ \S/* The workRoutine (*SIGNAL) takes a variable number of arguments. Consider */\S/* it to work precisely the same as RTL routine LIB$SIGNAL. Some possible */\S/* parameters to this callback might be a message from MULTIHELP$MESSAGES.H. */\ \? workRoutine (*FPRINTF)(char *(*FP), char *FORMAT, ...), \% suggestedArglist char *(*FP), \H char *FIRST, char *LAST, char *PHONE, int WRCOUNT, char *DUEDATE, \B char *DATELOGGED, char *LASTUPDATED, char *NEXTESCALATION, \I char *HARDWARE, char *SOFTWARE, char *PROBLEMCLASS, char *OWNERID, \C char *PROBLEMSTATUS, char *SEVERITYNAME, char *PRIORITYNAME, \A char *CUSTOMERID, char *PROBLEMSTATEMENT, char *LOCATION, \ \R/* The workRoutine (*FPRINTF) is a general-purpose printing routine modeled */\S/* after the CRTL routine "fprintf" or "sprintf". (*FPRINTF) takes the same */\R/* arguments as the CRTL routines, are more elegantly described in Kernigan */\S/* and Ritchie than I could ever fit here. However, there is one exception: */\P/* the FP argument must point to the notification message. In all cases, */\Q/* use the suggestArglist parameter FP. Please note that the EMAIL-Server */\R/* assumes that all text it receives in a MAIL message not preceded by "\*" */\S/* in the first column is important infor (P).problemStatus, (P).severityName, (P).priorityName, \> (P).customerId, (P).problemStatement, (P).buildingLocationB#define THE_REST_EMPTY 0,"","","","","","","","","","","","","",""/*+*/I/* These constants define the level of "DETAIL" output by the workRoutine/* called (*OUTPUT_REQUEST)./*-*/R#define Prt_OneLine (unsigned)(1<<0) /* Print one line of detail per request */U#define Prt_Brief (unsigned)(1<<1) /* Print three lines of detail per request */S#define Prt_Medium (unsigned)(1<<2) /* Print six lines of detail per request */R#define Prt_Full (unsigned)(1<<3) /* Print 20 lines of detail per request */W#define Prt_WRsummary (unsigned)(1<<4) /* Include the list of work-report summaries */[#define Prt_WRdetail (unsigned)(1<<5) /* Include a dump of the work-reports themselves */S#define Prt_RqdHeader (unsigned)(1<<6) /* Include the header before the listing */b#define Prt_Creation (unsigned)(1<<7) /* Output instructions particular to creating a request */M#define Prt_Trailer (unsigned)(1<<8) /* Include a trailer after the end */b#define Prt_Update (unsigned)(1<<9) /* Output instructions particular to updating a request */Q#define Prt_MailList (unsigned)(1<<10) /* Include the EMAIL Server directives *//*+*/K/* The most complex of the instructions modules is for "MAIL" notificationsK/* ========================================================================/*E/* Most modules will contain two "FORMAT_xyzzy" entry points, one forG/* customers, called "xyzzy_CUSTOMER", the other for service providers,D/* called "xyzzy_ENGINEER". This is enough context to determine the0/* correct content of the notification messages./*H/* The MULTIHELP$MAIL_INSTRUCTIONS.C module is an exception. There are G/* many more than two pretenses under which a MAIL notification will beF/* made. So many, and arguably, so different are these occurences [inI/* the EMAIL context, anyhow] that they must each have their own separatecC/* set of instructions and levels of detail (particularly when you tF/* consider that all MAIL messages can be passed to the EMAIL-Server),>/* and that there is no absolute set of notification messages./*H/* It's for this reason that the "MAIL" module contains the INSTRUCTIONSH/* data structure. After each request-based transaction, MultiHelp willF/* step through an array of MAIL_INSTRUCTIONS, passing control to each"/* "CALLBACK" listed in the array:/*/F struct MAIL_INSTRUCTIONS1 {U unsigned DETAIL; /* Bitmask of Prt_XYZZY flags controlling DETAIL content */nO char *WORKREPORTS; /* String describing which work-reports to include */dX char *(*CALLBACK)(); /* CALLBACK(ReturnAnEmailAddressList) chooses correct users */R unsigned AUTOQUERY; /* Should we perform an autoquery (EMAIL-Server only) */F unsigned *CUSTOMER; /* Is this a customer-based notification? */N char *INSTRUCTIONS; /* Textual INSTRUCTIONS to be included in message */M void *MISCELLANY; /* User-defined label for easier decision-making */ };o/*/ D/* Each (*CALLBACK) routine will be passed the following parameters:/*/a'#define ReturnAnEmailAddressList \eC unsigned ESCALATION, /* Are we performing an escalation? */ \s@ unsigned HIDDEN, /* Is this work-report set /HIDDEN? */ \? unsigned ASSIGNED, /* Is this an /ASSIGN operation? */ \N? unsigned ACCEPTED, /* Is this an /ACCEPT operation? */ \cA char *USERID, /* Who is the customer for this request? */ \a> char *OWNERID, /* Who is the owner of this request? */ \A unsigned CHANGED, /* The CLASS field was just changed */ \*< unsigned REOPENED /* This request was just reopened *//*/iG/* and is expected to return the address of a zero-terminated characterpH/* string containing a comma-separated list of valid EMAIL addresses, orE/* the value (char *)0, which means "noone". This routine will checkzJ/* the various data available to it to determine what users should receive*/* this type of MAIL notification message./*H/* Since [generally-speaking] users will not know the internal layout ofE/* internal MultiHelp data structures (such as the ProblemsRec), the ,/* following builtin callbacks are provided:/*/n#define Accepting_NOTIFICATION (char *(*)())(1) /* Who am I? I just /ACCEPTED this call; I want to see the previous work-report */m#define Acknowledgement_NOTIFICATION (char *(*)())(2) /* Who am I? I just performed some transaction; I want a brief acknowledgement */c#define Customer_NOTIFICATION (char *(*)())(3) /* Who is the /CUSTOMER= of this request? */h#define Assignment_NOTIFICATION (char *(*)())(4) /* Who is about to be /ASSIGNED= this request? */^#define Owner_NOTIFICATION (char *(*)())(5) /* Who is the owner of this request? */a#define Cc_NOTIFICATION (char *(*)())(6) /* Who is in this request's /CC= field? */{#define Logical_NOTIFICATION (char *(*)())(7) /* Who is on the notification list for the request's ProblemClass */s|#define Owner_CALLBACK (char *(*)())(8) /* Who should be notified when a request is about to be escalated? */t#define Non_assigned_CALLBACK (char *(*)())(9) /* Who should be notified when a request is being ignored? */x#define Due_date_CALLBACK (char *(*)())(10) /* Who should be notified when a request expires its Due_date? *//*/oG/* Naturally, users may add their own "CALLBACK" routines. The name of H/* the callback routine should be entered into the table (not a code, as/* for the builtin callbacks)./*E/* After the callback has returned a valid list of EMAIL addresses, adG/* MAIL message will be created. It will be delievered to those users, F/* and the body of the message will be generated by the routine calledH/* MAIL_FORMAT. Its actual parameters will be taken from the same entryE/* in the INSTRUCTIONS array. This is why "DETAIL" and "WORKREPORTS"4/* appear in the table.,/*F/* Feel free to contact SIO Technologies Corp.'s Customer Support team</* for assistance in customizing your notification messages./*-*/_#endif/*++*//*/* That's all folks ... /*/*--*/(wX$MULTIHELP020.E ,[EXAMPLES]MULTIHELP$PAGER_INSTRUCTIONS.C;150Z8|,*[EXAMPLES]MULTIHELP$PAGER_INSTRUCTIONS.C;150+,./ 4Z- 0123KPWO56~%7<89GHJ /*++*//*;/* TITLE: MultiHelp$EXAMPLES:MultiHelp$PAGER_INSTRUCTIONS.C /* IDENT: X-1/*9/* FACILITY: MultiHelp[R], SIO Technologies Corp., 1994 /*J/* ABSTRACT: This module establishes the types and formats of PAGER-based 7/* service request NOTIFICATIONS emitted by MultiHelp./*?/* The format of messages is controlled by the routines calledA/* MultiHelp$PAGER_CUSTOMER and MultiHelp$PAGER_ENGINEER. They >/* are fully customizable (on a site-wide basis) by the user./*A/* This module (when compiled and linked into a shareable image)B/* will be activated dynamically, by MultiHelp (using RTL routineA/* LIB$FIND_IMAGE_SYMBOL) whenever a PAGER-based service request/* notification is needed./*>/* For each notification, MultiHelp will call one of the two ;/* routines below. It's actual argument list will contain>/* certain important pieces of information needed to complete/* the notification./*C/* In addition, the addresses of a number of "work routines" will :/* also be passed. These routines should use these "work>/* routines", along with the other actual arguments, plus any>/* other text the user cares to add, to form the text of each/* notification message./*/* COMPILATION INSTRUCTIONS:/*!/* Under VAX/VMS and OpenVMS VAX:/*7/* $ cc MultiHelp$EXAMPLES:MultiHelp$PAGER_INSTRUCTIONSS/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$PAGER_INSTRUCTIONS,SYS$INPUT:/options%/* universal=MultiHelp$PAGER_ENGINEER%/* universal=MultiHelp$PAGER_CUSTOMER'/* universal=MultiHelp$PAGER_MISCELLANY;/* $ install replace SYS$SHARE:MultiHelp$PAGER_INSTRUCTIONS/*/* Under OpenVMS AXP:/*7/* $ cc MultiHelp$EXAMPLES:MultiHelp$PAGER_INSTRUCTIONSS/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$PAGER_INSTRUCTIONS,SYS$INPUT:/options5/* symbol_vector=(MultiHelp$PAGER_ENGINEER=procedure)5/* symbol_vector=(MultiHelp$PAGER_CUSTOMER=procedure)7/* symbol_vector=(MultiHelp$PAGER_MISCELLANY=procedure);/* $ install replace SYS$SHARE:MultiHelp$PAGER_INSTRUCTIONS/*+/* AUTHOR: Roald Amundsen, Tenth-Level Mage/* DATE: 15-Sep-1994/*/* MODIFICATION HISTORY:/*K/* X-1 Henry "Harry" Roald Arbuckle Lawson, Developer-at-Large, 15-Sep-1994 /* Realization of figured bass./*/*--*/##ifndef UserModifiableDataStructure-#define UserModifiableDataStructure globaldef)#define UserModifiableRoutine extern void#else)#define UserModifiableRoutine static void#endif/*+*/B/* Study this header file for complete documentation on the entire)/* customizable notifications sub-system./*-*/C#include "MultiHelp$EXAMPLES:MultiHelp$NOTIFICATION_INSTRUCTIONS.H"2#include "MultiHelp$EXAMPLES:MultiHelp$MESSAGES.H"#include #include #include #include #include #include #include #include #include stddef#include stdlib#include stdio#include string#include ctype#include signal#ifndef IO$M_LT_SETMODE#define IO$M_LT_SETMODE 8192#endif$#ifndef LAT$_ITM_TARGET_SERVICE_NAME*#define LAT$_ITM_TARGET_SERVICE_NAME 16647#endif#ifndef LAT$C_ENT_PORT#define LAT$C_ENT_PORT 4#endif#ifndef LAT$C_ENTS_OLD#define LAT$C_ENTS_OLD 0#endifZunsigned PAGE_HIM(char *PAGER_NUMBER, char *REQUESTID, char *FIRST_NAME, char *LAST_NAME);#ifndef SYS$ASSIGN#define SYS$ASSIGN sys$assign#define SYS$QIOW sys$qiow#define SYS$DASSGN sys$dassgn#endif/*+*/W/* These are the two routines. As you can see, they don't need to be very complicated./*-*/=UserModifiableRoutine MultiHelp$PAGER_ENGINEER(formatArglist){/(*SIGNAL)(MH$_APAGEENG, 3, FIRST, LAST, PHONE);Eif (!(PAGE_HIM(PHONE, CURRENT_REQUESTID, FIRST, LAST)&STS$M_SUCCESS))2 (*SIGNAL)(MH$_PAGEENG, 3, FIRST, LAST, PHONE);}=UserModifiableRoutine MultiHelp$PAGER_CUSTOMER(formatArglist){/(*SIGNAL)(MH$_APAGEENG, 3, FIRST, LAST, PHONE);Eif (!(PAGE_HIM(PHONE, CURRENT_REQUESTID, FIRST, LAST)&STS$M_SUCCESS))3 (*SIGNAL)(MH$_PAGECUST, 3, FIRST, LAST, PHONE);}?UserModifiableRoutine MultiHelp$PAGER_MISCELLANY(formatArglist){0(*SIGNAL)(MH$_APAGEMISC, 3, FIRST, LAST, PHONE);Eif (!(PAGE_HIM(PHONE, CURRENT_REQUESTID, FIRST, LAST)&STS$M_SUCCESS))3 (*SIGNAL)(MH$_PAGEMISC, 3, FIRST, LAST, PHONE);}/*++*//*/* FUNCTIONAL DESCRIPTION:/*</* Open a channel to the device taken from the logical name.:/* If it's a real device, then use it, else, assume it's a#/* LAT service name, and try again./*/* INPUTS: (logical names)/*G/* MULTIHELP$PAGER_PORTn: The name of a terminal device, or LAT service2/* name through which to send paging instructionsH/* MULTIHELP$PAGER_DELAY: The number of seconds to delay between sets of/* modem commandsG/* MULTIHELP$PAGER_PREFIX: A set of numbers to dial before entering the8/* pager phone number (as listed in the Request record)F/* MULTIHELP$PAGER_MESSAGE: A set of numbers to be passed to the pager6/* after it picks up (like the HelpDesk phone number)/*/* CONFIGURATION:/*F/* SIO Technologies uses the following modem/LAT configuration for its9/* paging bank. Other configurations will work, as well:/*J/* $ DS MultiHelp$PAGER_PORT DIALOUT ! LAT service for a set of ports@/* $ DS MultiHelp$PAGER_PORT0 LTA2: ! Physical device nameO/* $ DS MultiHelp$PAGER_PORT1 $PORT3 ! Logical pointing to physical deviceI/* $ DS MultiHelp$PAGER_PORT2 PORT4 ! LAT service for a single port/*-/* The LAT service that sports all the ports:/*./* Local> show service DIALOUT characteristics/*/* Service: DIALOUT/*:/* Identification: SIO Technologies Corporation Modem Pool/* /* Ports: 2-4/*/* Rating: 155/*/* Enabled Characteristics:/*/* Connections/*%/* One of the ports on the DECserver:/*%/* Local> show port 4 characteristics5/* Port 4: Server: SIO/* B/* Character Size: 8 Input Speed: 4800B/* Flow Control: XON Output Speed: 4800B/* Parity: None Modem Control: Enabled/* B/* Access: Dynamic Local Switch: ^PB/* Backwards Switch: None Name: PORT4B/* Break: Local Session Limit: 8B/* Forwards Switch: ^^ Type: Soft/* /* Preferred Service: None/* /* Authorized Groups: 0/* (Current) Groups: 0/* /* Enabled Characteristics:/* C/* Autobaud, Autoprompt, Broadcast, Dialup, Input Flow Control,F/* Loss Notification, Message Codes, Output Flow Control, Password,/* Verification/*/* And the modem settings:/*/* AT&V/* ACTIVE PROFILE:N/* B0 E1 L1 M1 N1 Q0 T V1 W0 X4 Y0 &C1 &D2 &G0 &J0 &K3 &Q5 &R0 &S1 &T4 &X0 &Y0R/* S00:002 S01:000 S02:043 S03:013 S04:010 S05:008 S06:002 S07:050 S08:002 S09:006R/* S10:014 S11:095 S12:050 S18:000 S25:005 S26:001 S36:007 S37:011 S38:020 S44:020/* S46:138 S48:007 S95:047/* /* STORED PROFILE 0:J/* B0 E1 L1 M1 N1 Q0 T V1 W0 X4 Y0 &C1 &D2 &G0 &J0 &K3 &Q5 &R0 &S1 &T4 &X0R/* S00:002 S02:043 S06:002 S07:050 S08:002 S09:006 S10:014 S11:095 S12:050 S18:0002/* S36:007 S37:011 S40:105 S41:131 S46:138 S95:047/* /* STORED PROFILE 1:J/* B1 E1 L2 M1 N1 Q0 T V1 W1 X4 Y0 &C0 &D0 &G0 &J0 &K5 &Q5 &R0 &S0 &T4 &X0R/* S00:000 S02:043 S06:002 S07:050 S08:002 S09:006 S10:014 S11:095 S12:050 S18:0002/* S36:007 S37:011 S40:105 S41:131 S46:138 S95:046/*/*--*/Yunsigned PAGE_HIM(char *PAGER_NUMBER, char *REQUESTID, char *FIRST_NAME, char *LAST_NAME){static char *PORT_NAMES[] = { "MULTIHELP$PAGER_PORT", "MULTIHELP$PAGER_PORT0", "MULTIHELP$PAGER_PORT1", "MULTIHELP$PAGER_PORT2", "MULTIHELP$PAGER_PORT3", "MULTIHELP$PAGER_PORT4", "MULTIHELP$PAGER_PORT5", "MULTIHELP$PAGER_PORT6", "MULTIHELP$PAGER_PORT7", "MULTIHELP$PAGER_PORT8", "MULTIHELP$PAGER_PORT9", (char *)0};Bunsigned i, SUCCESS = {SS$_ABORT}, STS, TIMEOUT, TMASK[2] = {0,0};"static $DESCRIPTOR(LTA0, "LTA0:"); short CHAN, IOSB.,$MULTIHELP020.E ,[EXAMPLES]MULTIHELP$PAGER_INSTRUCTIONS.C;150Z [4] = {0,0,0,0};char *PORT, BUFFER[1024];/*+*/*/* Search for an available paging port .../*-*/for (i=0; PORT_NAMES[i]; i++)% if (PORT = getenv(PORT_NAMES[i])) { static struct dsc$descriptor0 DEVNAM = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0};D static struct ITMLST {short ITMCOD; char BUFLEN; char BUFFER[128];}1 ITMLST = {LAT$_ITM_TARGET_SERVICE_NAME,0,0};& DEVNAM.dsc$w_length = ITMLST.BUFLEN =A sprintf(ITMLST.BUFFER, "%s", (DEVNAM.dsc$a_pointer = PORT));= if ((STS = SYS$ASSIGN(&DEVNAM, &CHAN, 0,0,0))&STS$M_SUCCESS) break;> if (!((STS = SYS$ASSIGN(<A0, &CHAN, 0,0,0))&STS$M_SUCCESS)) continue;I if (!((STS = SYS$QIOW(0, CHAN, IO$_TTY_PORT|IO$M_LT_SETMODE, &IOSB, 0,0,? &ITMLST, offsetof(struct ITMLST,BUFFER)+ITMLST.BUFLEN,1 LAT$C_ENT_PORT|(LAT$C_ENTS_OLD << 0x10), 0,0,0))&STS$M_SUCCESS)) SS$_NORMAL; else if (IOSB[0]&STS$M_SUCCESS) break; STS = SYS$DASSGN(CHAN); }/*+*//* Did we find one?/*-*/if (!PORT_NAMES[i]) return 0;/*+*/J/* LAT Application ports will need to be connected to ... Others, no harm./*-*/OSTS = SYS$QIOW(0, CHAN, IO$_TTY_PORT|IO$M_LT_CONNECT, &IOSB, 0,0, 0,0,0,0,0,0);if (STS == SS$_ILLIOFUNC) SS$_NORMAL;else if (!(STS&STS$M_SUCCESS)) goto PRECONNECT;"else if (!(IOSB[0]&STS$M_SUCCESS)) goto PRECONNECT;/*+*/(/* Set some terminal characteristics .../*-*/GSTS = SYS$QIOW(0, CHAN, IO$_SENSEMODE, &IOSB, 0,0, BUFFER,12, 0,0,0,0);8*(unsigned *)(&BUFFER[0]) = (*(unsigned *)(&BUFFER[0]) |L (TT$M_TTSYNC|TT$M_HOSTSYNC|TT$M_NOBRDCST|TT$M_EIGHTBIT)) & ~TT$M_ESCAPE;+*(unsigned *)(&BUFFER[4]) |= TT2$M_PASTHRU;ESTS = SYS$QIOW(0, CHAN, IO$_SETMODE, &IOSB, 0,0, BUFFER,12, 0,0,0,0);/*+*/,/* How long should we wait between commands?/*-*/DTIMEOUT = ((PORT = getenv("MULTIHELP$PAGER_DELAY"))? atoi(PORT): 5);/*+*/ /* Get the modem's attention .../*-*/sprintf(BUFFER, "AT\r");JSTS = SYS$QIOW(0, CHAN, IO$_READPROMPT|IO$M_NOECHO|IO$M_TIMED, &IOSB, 0,0,D &BUFFER, sizeof(BUFFER), TIMEOUT, &TMASK, &BUFFER, strlen(BUFFER));if (!(STS&STS$M_SUCCESS))l goto ABORT; else if (IOSB[0] == SS$_TIMEOUT) SS$_NORMAL;p"else if (!(IOSB[0]&STS$M_SUCCESS)) goto ABORT;O/*+*/N&/* Form the pager telephone number .../*-*/ sprintf(BUFFER, "ATDT%s%s;\r",7 ((PORT = getenv("MULTIHELP$PAGER_PREFIX"))? PORT: ""),P PAGER_NUMBER);hJSTS = SYS$QIOW(0, CHAN, IO$_READPROMPT|IO$M_NOECHO|IO$M_TIMED, &IOSB, 0,0,D &BUFFER, sizeof(BUFFER), TIMEOUT, &TMASK, &BUFFER, strlen(BUFFER));if (!(STS&STS$M_SUCCESS)), goto ABORT;i else if (IOSB[0] == SS$_TIMEOUT) SS$_NORMAL; "else if (!(IOSB[0]&STS$M_SUCCESS)) goto ABORT;e/*+*/*)/* Dump these characters to the pager ... /*-*/e1for (PORT = &BUFFER[512], i=0; REQUESTID[i]; i++)n if (isdigit(REQUESTID[i])) *(PORT++) = REQUESTID[i];*(PORT) = '\0';osleep(TIMEOUT);isprintf(BUFFER, "ATDT%s#;\r",,C ((PORT = getenv("MULTIHELP$PAGER_MESSAGE"))? PORT: &BUFFER[512]));sJSTS = SYS$QIOW(0, CHAN, IO$_READPROMPT|IO$M_NOECHO|IO$M_TIMED, &IOSB, 0,0,D &BUFFER, sizeof(BUFFER), TIMEOUT, &TMASK, &BUFFER, strlen(BUFFER));if (!(STS&STS$M_SUCCESS))  goto ABORT;a else if (IOSB[0] == SS$_TIMEOUT) SS$_NORMAL;r"else if (!(IOSB[0]&STS$M_SUCCESS)) goto ABORT;M/*+*/i/* Now hang up .../*-*/*sprintf(BUFFER, "ATH\r");LJSTS = SYS$QIOW(0, CHAN, IO$_READPROMPT|IO$M_NOECHO|IO$M_TIMED, &IOSB, 0,0,D &BUFFER, sizeof(BUFFER), TIMEOUT, &TMASK, &BUFFER, strlen(BUFFER));if (!(STS&STS$M_SUCCESS)) goto ABORT;a else if (IOSB[0] == SS$_TIMEOUT) SS$_NORMAL;U"else if (!(IOSB[0]&STS$M_SUCCESS)) goto ABORT;l/*+*/G /* Close down our connection .../*-*/MSUCCESS = SS$_NORMAL;EABORT:R STS = SYS$QIOW(0, CHAN, IO$_TTY_PORT|IO$M_LT_DISCON, &IOSB, 0,0, 0,0,0,0,0,0); PRECONNECT:r STS = SYS$DASSGN(CHAN);oreturn SUCCESS;_}t/*++*//*/* That's all folks ...e/*/*--*/,*[EXAMPLES]MULTIHELP$PHONE_INSTRUCTIONS.C;137+,. / 4W - 0123KPWO56Sm%7-b<89GHJ/*++*//*;/* TITLE: MultiHelp$EXAMPLES:MultiHelp$PHONE_INSTRUCTIONS.C /* IDENT: X-1/*9/* FACILITY: MultiHelp[R], SIO Technologies Corp., 1994 /*J/* ABSTRACT: This module establishes the types and formats of PHONE-based 7/* service request NOTIFICATIONS emitted by MultiHelp./*?/* The format of messages is controlled by the routines calledA/* MultiHelp$PHONE_CUSTOMER and MultiHelp$PHONE_ENGINEER. They >/* are fully customizable (on a site-wide basis) by the user./*A/* This module (when compiled and linked into a shareable image)B/* will be activated dynamically, by MultiHelp (using RTL routineA/* LIB$FIND_IMAGE_SYMBOL) whenever a PHONE-based service request/* notification is needed./*>/* For each notification, MultiHelp will call one of the two ;/* routines below. It's actual argument list will contain>/* certain important pieces of information needed to complete/* the notification./*C/* In addition, the addresses of a number of "work routines" will :/* also be passed. These routines should use these "work>/* routines", along with the other actual arguments, plus any>/* other text the user cares to add, to form the text of each/* notification message./*/* COMPILATION INSTRUCTIONS:/*!/* Under VAX/VMS and OpenVMS VAX:/*7/* $ cc MultiHelp$EXAMPLES:MultiHelp$PHONE_INSTRUCTIONSS/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$PHONE_INSTRUCTIONS,SYS$INPUT:/options%/* universal=MultiHelp$PHONE_ENGINEER%/* universal=MultiHelp$PHONE_CUSTOMER'/* universal=MultiHelp$PHONE_MISCELLANY;/* $ install replace SYS$SHARE:MultiHelp$PHONE_INSTRUCTIONS/*/* Under OpenVMS AXP:/*7/* $ cc MultiHelp$EXAMPLES:MultiHelp$PHONE_INSTRUCTIONSS/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$PHONE_INSTRUCTIONS,SYS$INPUT:/options5/* symbol_vector=(MultiHelp$PHONE_ENGINEER=procedure)5/* symbol_vector=(MultiHelp$PHONE_CUSTOMER=procedure)7/* symbol_vector=(MultiHelp$PHONE_MISCELLANY=procedure);/* $ install replace SYS$SHARE:MultiHelp$PHONE_INSTRUCTIONS/*+/* AUTHOR: Roald Amundsen, Tenth-Level Mage/* DATE: 15-Sep-1994/*/* MODIFICATION HISTORY:/*K/* X-1 Henry "Harry" Roald Arbuckle Lawson, Developer-at-Large, 15-Sep-1994 /* Realization of figured bass./*/*--*/##ifndef UserModifiableDataStructure-#define UserModifiableDataStructure globaldef)#define UserModifiableRoutine extern void#else)#define UserModifiableRoutine static void#endif/*+*/B/* Study this header file for complete documentation on the entire)/* customizable notifications sub-system./*-*/C#include "MultiHelp$EXAMPLES:MultiHelp$NOTIFICATION_INSTRUCTIONS.H"2#include "MultiHelp$EXAMPLES:MultiHelp$MESSAGES.H"/*+*/W/* These are the two routines. As you can see, they don't need to be very complicated./*-*/=UserModifiableRoutine MultiHelp$PHONE_ENGINEER(formatArglist){/(*SIGNAL)(MH$_PHONEENG, 3, FIRST, LAST, PHONE);}=UserModifiableRoutine MultiHelp$PHONE_CUSTOMER(formatArglist){0(*SIGNAL)(MH$_PHONECUST, 3, FIRST, LAST, PHONE);}?UserModifiableRoutine MultiHelp$PHONE_MISCELLANY(formatArglist){0(*SIGNAL)(MH$_PHONEMISC, 3, FIRST, LAST, PHONE);}/*++*//*/* That's all folks .../*/*--*/!*[EXAMPLES]MULTIHELP$PROFILE.COM;1+,+. / 4^ - 0123KPWO 56U⠘7<89GHJ'$ Set Noon !disable error handling<$ Save_Verify = F$Verify(0) !turn off verify - save statusH$ if F$trnlnm("MultiHelp$Verify") then set verif !turn on verify if true$!+G$!======================================================================$! MultiHelp Copyright, 1994, 1995%$! Module Name: MultiHelp$Profile.COM$!$! Parameters:"$! [parameter_description]...$!$! Author: jjjones$! Date: January 6, 1995$! Description:C$! This procedure  }$MULTIHELP020.E+ ![EXAMPLES]MULTIHELP$PROFILE.COM;1^ rwill add Users along with contact information$! to MultiHelp.?$! This is very simple now and only handles the most common/$! attributes of adding a user and contact.$!$! Modifications:$! [tbs]...$!G$!=====================================================================$!-$!$! Main Execution$!$!-$ say := write sys$output $ say " "%$ say "Press ^Z if you have an error" $ say " "%$ On Control_Y then goto done_adduser$ Open/Write out add_user.mh $ ADDUSER:$ cs1="Profile Add User ":$ read/end=done_adduser/prompt="UserId [^z when done]: " - sys$command userid$ cs1 = cs1 + userid>$ read/end=adduser/prompt="Password [blank = no password]: " - sys$command password$ if password.nes.""$ then'$ cs1 = cs1 + "/Password=" + password$ else$ cs1 = cs1 + "/NoPassword"$ endif>$ read/end=adduser/prompt="Is this a customer account [N]? " - sys$command customer $ if customer$ thenD$ cs1 = cs1 + "/Customer/Review=Own/Solution=query/NoLog/NoReport"$ else$ cs1 = cs1 + "/NoCustomer"K$ read/end=adduser/prompt="Should this user have ADMIN privilege [N]? " - sys$command admin $ if admin$ then6$ cs1 = cs1 + "/Admin/Review=ALL/Solution=(q,a,m)/Log"$ else.$ cs1 = cs1 + "/Review=ALL/Solution=query/Log" $ endif$ endifE$ read/end=adduser/prompt="Is the information correct so far [Y]? " - sys$command answer9$ if .not.(answer .or. (answer.eqs."")) then goto adduser $ ADDCONTACT:2$ say "Adding contact information for this userId"'$ cs2 = "Profile Add Contact ''userid'"H$ read/end=addcontact/prompt="Last Name [must enter]: " sys$command last%$ if last.eqs."" then goto addcontactJ$ read/end=addcontact/prompt="First Name [must enter]: " sys$command first&$ if first.eqs."" then goto addcontact=$ cs2 = cs2 + "/name=(last=" + last + ",first=" + first + ")"@$ read/end=addcontact/prompt="Email address: " sys$command email$ if email.nes.""$ then $ offset=0$ email_loop:7$ if offset .gt. f$len(email) then goto email_loop_done&$ if f$extr(offset, 1, email).eqs.""""$ thenW$ email = f$extr(0, offset+1, email) + """" + f$extr(offset+1, f$len(email), email)$ offset = offset + 1$ endif$ offset = offset + 1$ goto email_loop$ email_loop_done:*$ cs2 = cs2 + "/email=""" + email + """"$ endif$ cs2 = cs2 + "/Notify=email"J$ read/end=addcontact/prompt="Enter Phone Number [Y]? " sys$command answer"$ if (answer .or. (answer.eqs.""))$ then=$ read/end=addcontact/prompt="Area Code: " sys$command area<$ read/end=addcontact/prompt="Number: " sys$command numberB$ read/end=addcontact/prompt="Extension: " sys$command extension$ offset = 0$ area_loop:5$ if offset .ge. f$len(area) then goto area_loop_doneH$ if f$extr(offset, 1, area).gts."9" .or f$extr(offset, 1, area).lts."0"$ thenJ$ area = f$extr(0, offset, area) + f$extr(offset+1, f$len(area), area)$ else$ offset = offset + 1$ endif$ goto area_loop$ area_loop_done:$ offset = 0$ number_loop:9$ if offset .ge. f$len(number) then goto number_loop_doneL$ if f$extr(offset, 1, number).gts."9" .or f$extr(offset, 1, number).lts."0"$ thenR$ number = f$extr(0, offset, number) + f$extr(offset+1, f$len(number), number)$ else$ offset = offset + 1$ endif$ goto number_loop$ number_loop_done:$ offset = 0$ extension_loop:?$ if offset .ge. f$len(extension) then goto extension_loop_doneR$ if f$extr(offset, 1, extension).gts."9" .or f$extr(offset, 1, extension).lts."0"$ then^$ extension = f$extr(0, offset, extension) + f$extr(offset+1, f$len(extension), extension)$ else$ offset = offset + 1$ endif$ goto extension_loop$ extension_loop_done:K$ cs2 = cs2 + "/Primary=(Area=''area',Number=''number',Ext=''extension')"$ endif<$ read/end=addcontact/prompt="Comment: " sys$command comment>$ if comment.nes."" then cs2 = cs2 + "/Comment=""''comment'"""R$ read/end=adduser/prompt="Do you want the chance to redo the information [N]? " - sys$command answer$ if answer then goto adduser$ write out "!""$ write out "! Add User ''userid'"$ write out "!"$ write out cs1$ write out cs2 $ got adduser$ DONE_ADDUSER: $ close out$ type sys$inputB The commands for adding the user information just entered haveB been written to ADD_USER.MH. You may edit this file and reviewE it for correctness and then execute it manually with the command: MultiHelp> Execute add_user.mhA Or you can have this procedure execute those commands for you right now.<$ read /end=exit_label/prompt="Execute commands now [Y]? " - sys$command answer $ if answer .or. (answer.eqs."")$ thenR$ read/end=exit_label/prompt="Privileged MultiHelp UserId: " sys$command puserid*$ if puserid.eqs."" then goto exit_labelA$ read/end=exit_label/prompt="Password: " sys$command ppassword$ if ppassword.eqs.""$ then.$ MultiHelp/User='puserid' Execute add_user.mh$ elseC$ MultiHelp/User='puserid'/Password='ppassword' Execute add_user.mh $ endif$ endif$!+$!$! Procedure Exit$!$!- $ Exit_Label:$ Set On%$ Save_Verify = F$Verify(Save_Verify)$ Exit-*[EXAMPLES]MULTIHELP$XPOPUP_INSTRUCTIONS.C;134+,2. / 4W @- 0123KPWO56(b&7s<89GHJ/*++*//*</* TITLE: MultiHelp$EXAMPLES:MultiHelp$XPOPUP_INSTRUCTIONS.C /* IDENT: X-1/*9/* FACILITY: MultiHelp[R], SIO Technologies Corp., 1994 /*D/* ABSTRACT: This module establishes the types and formats of XPOPUP7/* service request NOTIFICATIONS emitted by MultiHelp./*?/* The format of messages is controlled by the routines calledC/* MultiHelp$XPOPUP_CUSTOMER and MultiHelp$XPOPUP_ENGINEER. They >/* are fully customizable (on a site-wide basis) by the user./*A/* This module (when compiled and linked into a shareable image)B/* will be activated dynamically, by MultiHelp (using RTL routine</* LIB$FIND_IMAGE_SYMBOL) whenever a XPOPUP service request/* notification is needed./*>/* For each notification, MultiHelp will call one of the two ;/* routines below. It's actual argument list will contain>/* certain important pieces of information needed to complete/* the notification./*C/* In addition, the addresses of a number of "work routines" will :/* also be passed. These routines should use these "work>/* routines", along with the other actual arguments, plus any>/* other text the user cares to add, to form the text of each/* notification message./*/* COMPILATION INSTRUCTIONS:/*!/* Under VAX/VMS and OpenVMS VAX:/*8/* $ cc MultiHelp$EXAMPLES:MultiHelp$XPOPUP_INSTRUCTIONST/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$XPOPUP_INSTRUCTIONS,SYS$INPUT:/options&/* universal=MultiHelp$XPOPUP_ENGINEER&/* universal=MultiHelp$XPOPUP_CUSTOMER(/* universal=MultiHelp$XPOPUP_MISCELLANY</* $ install replace SYS$SHARE:MultiHelp$XPOPUP_INSTRUCTIONS/*/* Under OpenVMS AXP:/*8/* $ cc MultiHelp$EXAMPLES:MultiHelp$XPOPUP_INSTRUCTIONST/* $ link/share=SYS$COMMON:[SYSLIB] MultiHelp$XPOPUP_INSTRUCTIONS,SYS$INPUT:/options6/* symbol_vector=(MultiHelp$XPOPUP_ENGINEER=procedure)6/* symbol_vector=(MultiHelp$XPOPUP_CUSTOMER=procedure)8/* symbol_vector=(MultiHelp$XPOPUP_MISCELLANY=procedure)</* $ install replace SYS$SHARE:MultiHelp$XPOPUP_INSTRUCTIONS/*+/* AUTHOR: Roald Amundsen, Tenth-Level Mage/* DATE: 15-Sep-1994/*/* MODIFICATION HISTORY:/*K/* X-1 Henry "Harry" Roald Arbuckle Lawson, Developer-at-Large, 15-Sep-1994 /* Realization of figured bass./*/*--*/##ifndef UserModifiableDataStructure-#define UserModifiableDataStructure globaldef)#define UserModifiableRoutine extern void#else)#define UserModifiableRoutine static void#endif/*+*/B/* Study this header file for complete documentation on the entire)/* customizabl!9Υ"$MULTIHELP020.E2 -[EXAMPLES]MULTIHELP$XPOPUP_INSTRUCTIONS.C;134W :te notifications sub-system./*-*/C#include "MultiHelp$EXAMPLES:MultiHelp$NOTIFICATION_INSTRUCTIONS.H"2#include "MultiHelp$EXAMPLES:MultiHelp$MESSAGES.H"/*+*/W/* These are the two routines. As you can see, they don't need to be very complicated./*-*/>UserModifiableRoutine MultiHelp$XPOPUP_ENGINEER(formatArglist){/*TBS*/}>UserModifiableRoutine MultiHelp$XPOPUP_CUSTOMER(formatArglist){/*TBS*/}@UserModifiableRoutine MultiHelp$XPOPUP_MISCELLANY(formatArglist){/*TBS*/}/*++*//*/* That's all folks .../*/*--*/*[EXAMPLES]MULTIHELP.LSE;1+, ./ 4`- 0123KPWO5H6r78<89GHJ! ! Facility:! MultiHelp! ! Abstract:! MultiHelp Directives! ! Author: ! jjjones! "! Creation Date: July 21, 1994! ! Modification History:! DELETE LANGUAGE MultiHelpDEFINE LANGUAGE MultiHelp -! /CAPABILITIES=NODIAGNOSTICS - /COMMENT=(LINE =("\*"))- /EXPAND_CASE=AS_IS - /FILE_TYPES=(".MH")-/ /HELP_LIBRARY=SYS$HELP:MULTIHELP$MAIN.HLB -` /IDENTIFIER_CHARACTERS="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%$_0123456789" -( /INITIAL_STRING="[destination]..." - /LEFT_MARGIN=1 -8 /PLACEHOLDER_DELIMITERS=(REQUIRED =("{", "}"), -& REQUIRED_LIST=("{", "}..."), -# OPTIONAL =("[", "]"), -& OPTIONAL_LIST=("[", "]...")) -! /PUNCTUATION_CHARACTERS="\" - /RIGHT_MARGIN=75 - /TAB_INCREMENT=4 - /VERSION="X080" - /WRAPSET LANGUAGE MultiHelp.DELETE TOKEN /LANGUAGE=multihelp "destination"DEFINE TOKEN "destination" - /PLACEHOLDER="destination"4DELETE PLACEHOLDER /LANGUAGE=multihelp "destination""DEFINE PLACEHOLDER "destination" - /LANGUAGE=multihelp - /TYPE=NONTERMINAL "[change_context]" "[destinations]" END DEFINE1DELETE TOKEN /LANGUAGE=multihelp "change_context"DEFINE TOKEN "change_context" -! /PLACEHOLDER="change_context"7DELETE PLACEHOLDER /LANGUAGE=multihelp "change_context"%DEFINE PLACEHOLDER "change_context" - /LANGUAGE=multihelp - /TYPE=NONTERMINAL  "\X [server_name]" END DEFINE4DELETE PLACEHOLDER /LANGUAGE=multihelp "server_name""DEFINE PLACEHOLDER "server_name" - /LANGUAGE=multihelp - /TYPE=MENU "COMMANDS" "GUI" "LOOKUPS" "REQUESTS" "SOLUTIONS" END DEFINE/DELETE TOKEN /LANGUAGE=multihelp "destinations"DEFINE TOKEN "destinations" - /PLACEHOLDER="destinations"5DELETE PLACEHOLDER /LANGUAGE=multihelp "destinations"#DEFINE PLACEHOLDER "destinations" - /LANGUAGE=multihelp - /TYPE=MENU$ "commands_template"/PLACEHOLDER "gui_template"/PLACEHOLDER "lookups_template"/PLACEHOLDER "requests_template"/PLACEHOLDER! "solutions_template"/PLACEHOLDER END DEFINE4DELETE TOKEN /LANGUAGE=multihelp "commands_template""DEFINE TOKEN "commands_template" -$ /PLACEHOLDER="commands_template":DELETE PLACEHOLDER /LANGUAGE=multihelp "commands_template"(DEFINE PLACEHOLDER "commands_template" - /LANGUAGE=multihelp - /TYPE=NONTERMINAL "[cli_command]..." "\* Done with COMMANDS" END DEFINE4DELETE PLACEHOLDER /LANGUAGE=multihelp "cli_command""DEFINE PLACEHOLDER "cli_command" - /LANGUAGE=multihelp - /TYPE=TERMINAL "Enter valid CLI command" END DEFINE/DELETE TOKEN /LANGUAGE=multihelp "gui_template"DEFINE TOKEN "gui_template" - /PLACEHOLDER="gui_template"5DELETE PLACEHOLDER /LANGUAGE=multihelp "gui_template"#DEFINE PLACEHOLDER "gui_template" - /LANGUAGE=multihelp - /TYPE=NONTERMINAL "\S {display_name}" "\* Done with GUI" END DEFINE5DELETE PLACEHOLDER /LANGUAGE=multihelp "display_name"#DEFINE PLACEHOLDER "display_name" - /LANGUAGE=multihelp - /TYPE=TERMINAL "node::server.display" END DEFINE3DELETE TOKEN /LANGUAGE=multihelp "lookups_template"!DEFINE TOKEN "lookups_template" -# /PLACEHOLDER="lookups_template"9DELETE PLACEHOLDER /LANGUAGE=multihelp "lookups_template"'DEFINE PLACEHOLDER "lookups_template" - /LANGUAGE=multihelp - /TYPE=NONTERMINAL "[lookups_directives]..." "\* Done with LOOKUPS" END DEFINE5DELETE TOKEN /LANGUAGE=MULTIHELP "lookups_directives"#DEFINE TOKEN "lookups_directives" -% /PLACEHOLDER="lookups_directives";DELETE PLACEHOLDER /LANGUAGE=multihelp "lookups_directives")DEFINE PLACEHOLDER "lookups_directives" - /LANGUAGE=multihelp - /TYPE=MENU( "universal_directives" /PLACEHOLDER( "\A {parameter}" /DESCRIPTION="/Since=") "\B {parameter}" /DESCRIPTION="/Before="' "\C {parameter}" /DESCRIPTION="/Class" "\D" /DESCRIPTION="/Since"- "\E {parameter}" /DESCRIPTION="/Customer_id"* "\G {parameter}" /DESCRIPTION="/Category" "\H" /DESCRIPTION="/Closed"+ "\I {parameter}" /DESCRIPTION="Request Id" "\J" /DESCRIPTION="/Mine" "\K" /DESCRIPTION="/Open"" "\L" /DESCRIPTION="/NOQUEUE_ONLY"0 "\M {parameter}" /DESCRIPTION="Misc. Qualifier"- "\N {parameter}" /DESCRIPTION="/NoAttempted"* "\O {parameter}" /DESCRIPTION="/Onwer_id"* "\Q {parameter}" /DESCRIPTION="/Priority"* "\R {parameter}" /DESCRIPTION="/Severity"( "\T {parameter}" /DESCRIPTION="/Status"6 "\W {parameter}" /DESCRIPTION="Work Report Selection" "\Y" /DESCRIPTION="/Before" END DEFINE2DELETE PLACEHOLDER /LANGUAGE=MULTIHELP "parameter" DEFINE PLACEHOLDER "parameter" - /LANGUAGE=multihelp - /TYPE=TERMINAL3 "Enter the parameter value for this directive" END DEFINE7DELETE TOKEN /LANGUAGE=multihelp "universal_directives"%DEFINE TOKEN "universal_directives" -' /PLACEHOLDER="universal_directives"=DELETE PLACEHOLDER /LANGUAGE=multihelp "universal_directives"+DEFINE PLACEHOLDER "universal_directives" - /LANGUAGE=multihelp - /TYPE=MENU! "\f" /DESCRIPTION="Return Email"* "\P {parameter}" /DESCRIPTION="/Password", "\U {parameter}" /DESCRIPTION="/UserId"1 "\X {server_name}" /DESCRIPTION="Switch context"2 "\Z" /DESCRIPTION="Re-Initialize current context" "\*" /DESCRIPTION="Comment" "\!" /DESCRIPTION="No-Op" END DEFINE4DELETE TOKEN /LANGUAGE=multihelp "requests_template""DEFINE TOKEN "requests_template" -$ /PLACEHOLDER="requests_template":DELETE PLACEHOLDER /LANGUAGE=multihelp "requests_template"(DEFINE PLACEHOLDER "requests_template" - /LANGUAGE=multihelp - /TYPE=NONTERMINAL "[requests_directives]..." "\* Done with REQUESTS" END DEFINE6DELETE TOKEN /LANGUAGE=MULTIHELP "requests_directives"$DEFINE TOKEN "requests_directives" -& /PLACEHOLDER="requests_directives"<DELETE PLACEHOLDER /LANGUAGE=multihelp "requests_directives"*DEFINE PLACEHOLDER "requests_directives" - /LANGUAGE=multihelp - /TYPE=MENU "text" /placeholder( "universal_directives" /PLACEHOLDER+ "\i {parameter}" /Desc="/Include=filespec" "\A" /DESCRIPTION="/Accept") "\B {parameter}" /DESCRIPTION="/CC_List"' "\C {parameter}" /DESCRIPTION="/Class"* "\D {parameter}" /DESCRIPTION="/Due_Date"/ "\E {parameter}" /DESCRIPTION="/Email_Address" "\G" /DESCRIPTION="/Quiet" "\H" /DESCRIPTION="/Hidden"+ "\I {parameter}" /DESCRIPTION="Request Id"0 "\M {parameter}" /DESCRIPTION="Misc. Qualifier"* "\Q {parameter}" /DESCRIPTION="/Priority"* "\R {parameter}" /DESCRIPTION="/Severity") "\S {parameter}" /Description="/Subject"( "\T {parameter}" /DESCRIPTION="/Status" END DEFINE5DELETE TOKEN /LANGUAGE=multihelp "solutions_template"#DEFINE TOKEN "solutions_template" -% /PLACEHOLDER="solutions_template";DELETE PLACEHOLDER /LANGUAGE=multihelp "solutions_template")"|`$MULTIHELP020.E  [EXAMPLES]MULTIHELP.LSE;1`DEFINE PLACEHOLDER "solutions_template" - /LANGUAGE=multihelp - /TYPE=NONTERMINAL "[solutions_directives]..." "\* Done with SOLUTIONS" END DEFINE7DELETE TOKEN /LANGUAGE=MULTIHELP "solutions_directives"%DEFINE TOKEN "solutions_directives" -' /PLACEHOLDER="solutions_directives"=DELETE PLACEHOLDER /LANGUAGE=multihelp "solutions_directives"+DEFINE PLACEHOLDER "solutions_directives" - /LANGUAGE=multihelp - /TYPE=MENU "text" /placeholder( "universal_directives" /PLACEHOLDER# "\A" /DESCRIPTION="Start ADD Mode"' "\C {parameter}" /DESCRIPTION="/Class"* "\F {parameter}" /DESCRIPTION="/Software"& "\G" /DESCRIPTION="Start MODIFY Mode"* "\H {parameter}" /DESCRIPTION="/Hardware" "\I {parameter}" /Desc="/ID") "\K {parameter}" /DESCRIPTION="/Keyword"0 "\M {parameter}" /DESCRIPTION="Misc. Qualifier"' "\R" /DESCRIPTION="Starts REMOVE mode"+ "\T ""{parameter}""" /DESCRIPTION="/Title", "\V {parameter}" /DESCRIPTION="/Title_Word" END DEFINE-DELETE PLACEHOLDER /LANGUAGE=multihelp "text"DEFINE PLACEHOLDER "text" - /LANGUAGE=multihelp - /TYPE=TERMINAL "Enter free from text" END DEFINE*[EXAMPLES]QS_CLASS.MH;1+,X./ 4W,- 0123KPWO5@6Ng7lI<89GHJGCLASS /ADD=(NAME=ADA,PARENT=COMPILER)/DEFINITION="ADA Language Issues" BCLASS /ADD=(NAME=ADMIN,NOPARENT)/DEFINITION="Adminitrative Issues"ICLASS /ADD=(NAME=ACCOUNTS,PARENT=ADMIN)/DEFINITION="User Account Issues" RCLASS /ADD=(NAME=MULTIHELP,PARENT=ACCOUNTS)/DEFINITION="MultiHelp Account Issues" WCLASS /ADD=(NAME=PAYABLES,PARENT=ACCOUNTS)/DEFINITION="Payables System Account Issues" QCLASS /ADD=(NAME=UTILITIES,PARENT=OPSYS)/DEFINITION="Operating System Utilities" MCLASS /ADD=(NAME=BACKUP,PARENT=UTILITIES)/DEFINITION="Backup/Restore Issues" *[EXAMPLES]REQUESTS_ADD.MH;1+,*0./ 4Kz- 0123KPWO5<69 l*7<89GHJ \*9\* Switch to Commands server in order to add demo classes\* \X COMMANDS\U SYSTEM \P MANAGER"Class/Add=(Name=Hardware,NoParent)&Class/Add=(Name=Modem,Parent=Hardware)"Class/Add=(Name=Software,NoParent))Class/Add=(Name=Compiler,Parent=Software)\*!\* Switch back to requests server\* \X REQUESTS \U CUSTOMER\S My modem won't dial out\Q p1 \* set the priority\C modem \* set the classKMy modem won't dial for me. In fact I can't even get a response from the ATcommand.\Z\* Done with REQUESTS\S My printer won't power up\C hardware \* set the class\Q p2\R med \* set the severity0I came this morning and my printer has no power.,I need to print some documents. Please help.\Z\* Done with REQUESTS.\S Remote node "ENGV1" not currently reachableKI need to logon to ENGV1 in order to do some compiles. But I am getting theabove error message.\Z\* Done with REQUESTS/\S How to link Motif 1.1 images under Motif 1.2 \C software\Q p5\R lowBThey have just upgraded my system to Motif 1.2 and my normal buildJprocedures for my application that worked under Motif 1.1 are not working. Can you help?\Z\* Done with REQUESTS \S Having trouble editing a file \C software\R highHi,FJoe Customer here. When I attempt to edit a file with the VI editor on'SCO-unix it just returns to the prompt.5What am I doing wrong? I need to edit this file asap.\Z\* Done with REQUESTSB\S Screen capture program is not working - insufficient privilege. \C software\Q p3HMy screen capture program is not working. It was working just yesterday.)I am trying to create GIF files using XV.-Now it complains about insufficent privilege.\Z\* Done with REQUESTS@\S Am getting Diskquota exceeded error when I try to edit a file\R med\Q p2When I try to edit a file... $ edit t.t %diskquota-e-exceeded$I get the above error. Can you help?\Z\* Done with REQUESTS%\S My CDROM drive has stopped working \C hardwareHi,KMy CDROM has stopped working. I can't listen to my favorite Ray Charles CD.Please fix as soon as possible.thanks,Joe\Z *[EXAMPLES]RPT_PRB_WR_LABOR.SQL;1+,Z. / 4M - 0123KPWO 5Q6O`7<89GHJ I! RPT_PRB_WR_LABOR.SQL: Example VIEW creation casting new date formats to%! older formats supported by EXCEL.!E! This file creates an SQL "VIEW". This view has a couple advantages:!F! 1. It allows EXCEL to report on the MultiHelp database by convertingB! newer ansi date formats to the old format supported by EXCEL.!I! 2. It does an example join of three tables; PROBLEMS, WORK_REPORTS, and?! LABOR; allowing you to report as if all three were joined.!I! 3. It serves as an example for creating many customized views and means8! of reporting on the data in the MultiHelp database.!>! To add this view to the MultiHelp Database do the following:! ! $ MCR SQL$"! SQL> attach 'file multihelp$db';! SQL> @RPT_PRB_WR_LABOR.SQL! SQL> commit;!!CREATE VIEW RPT_PRB_WR_LABOR (! ! General Problem Information7 site_prefix, pid_date, pid_cnt, !Service Request Id subject, comment, attempts, owner_id, ! customer information9 customer_id, customer_last_name, customer_first_name,9 notify_method, !phone=T;Pager=P;Mail=M;Popup=X;Fax=F; email_address, building_location,( phone_area, phone_number, phone_ext,( pager_area, pager_number, pager_ext,& fax_area, fax_number, fax_ext, ! misc info logger_id, status, open_or_closed, !'O' or 'C'# queued_or_assigned, !'Q' or 'A'# severity_number, !numeric 0..99 severity_name,# priority_number, !numeric 0..99 priority_name, class, hardware, software, category, work_report_count, cc_list, date_logged, date_due, ! Work Report Information wr_date_entered, wr_author_id, wr_index, wr_summary, wr_hidden, wr_quiet, wr_status," wr_open_or_closed, !'O' or 'C' ! Labor Information/ l_labor_id, !person receiving labor credit, l_giver_id, !person giving labor credit' l_labor_code, !LaborAssist "LA" !LaborProblem "LP" !LaborAttempt "LT" !LaborProbCreate "LC" !LaborProbCancel "LN" !LaborProbSelf "LS" l_start_time, l_end_time ) AS SELECTM p.site_prefix, CAST(p.problem_id_date AS DATE VMS), p.problem_id_counter, p.problem_statement, p.comment, p.attempts, p.owner_id,? p.customer_id, p.customer_last_name, p.customer_first_name, p.notify_method, p.email_address, p.building_location,4 p.phone_area, p.phone_number, p.phone_extension,. p.pa#}I$MULTIHELP020.EZ  [EXAMPLES]RPT_PRB_WR_LABOR.SQL;1M ger_area, p.pager_number, p.pager_ext,, p.fax_area, p.fax_number, p.fax_ext, p.logger_id, p.status, p.open_or_closed, p.queued_or_assigned, p.severity, p.severity_name, p.priority, p.priority_name, p.problem_type,- p.affected_hardware, p.affected_software, p.category, p.work_report_count, p.cc_list,$ CAST(p.date_logged AS DATE VMS),! CAST(p.date_due AS DATE VMS),& CAST(wr.date_entered AS DATE VMS), wr.owner, wr.work_report_index, wr.summary, wr.hidden, wr.quiet, wr.status, wr.open_or_closed, l.user_id, l.logger_id, l.labor_code,# CAST(l.start_time AS DATE VMS), CAST(l.end_time AS DATE VMS)FROM( problems p, work_reports wr, labor lWHERE1 wr.site_prefix = p.site_prefix AND5 wr.problem_id_date = p.problem_id_date AND7 wr.problem_id_counter = p.problem_id_counter AND, l.site_prefix = wr.site_prefix AND6 l.problem_id_date = wr.problem_id_date AND7 l.problem_id_counter = wr.problem_id_counter AND0 l.work_report_index = wr.work_report_index; *[EXAMPLES]SOLUTIONS_ADD.MH;1+,. / 4N - 0123KPWO5I6@n&7w<89GHJ\A\f\U system \P manager\C c\F c\K CONFLICTDECL \K SYS$TRNLNME\T "%CC-W-CONFLICTDECL, This declaration of ""SYS$TRNLNM"" conflicts"BVAXC pre-includes the definition of all system service routines inFlower-case. When you instantiate a call to a system service routine inJupper-case the VAXC compile views this as a conflict with a routine of thesame name but different case. Solution:4Reference all system service routines in lower-case.\Z\* Done with SOLUTIONS\A\C opsys\F UNIX \F MultiHelp \F QuickLog\F Mail \K QuickLog \K MultiHelpM\T "Mail Doesn't Get Sent When Using MultiHelp's QuickLog in a bad Directory"N\T "Depending on the Unix Mailer and your default directory QuickLog can Fail"KDepending on the mailer being used and your default directory, QuickLog can/fail to send a request to the MultiHelp server.IThe MultiHelp QuickLog utility attempts to write a temporary file to yourGcurrent default directory. If that directory doesn't exist or you don't;have WRITE privilege to that directory, the Send will fail. Solution:GUse the QuickLog utility with your default set to an existing directory!that you have WRITE privilege in.\Z\* Done with SOLUTIONS\A \C printer\H la75 \H printer\K la75\K fuse \K printer\K power\T "My printer won't power up"%\T "Fuse is burned out on my printer"EIf your printer won't power up, here are the things you should check:D o Make sure it is plugged in, both into the wall and the back of the printer.$ o Check the Fuse on the printer:( - On LA75 models it is on the left rearB o Plug something known to work (i.e. desk clock) into the same) outlet to see if the outlet is bad.IIn order to get a new fuse update your request for service and change theAclass to FUSE, by placing the following line in the message body: \C FUSE9This will notify the correct people to get a fuse to you.@Please include the printer location in the message body as well.\Z\* Done with SOLUTIONS\A\C admin\H ENGV1\K ENGV1\K ENGINEERING)\T "Cannot access Engineering Node ENGV1"HThis article exists to let you know that the ENGV1 node is not available@Friday at 5pm through Monday to 8am for backups and maintenance.HIf this is the problem please try to access ENGV1 during stated hours of availability.KIf this is not the problem, then your request for service will be responded4to as soon as a support representative is available.\Z\* Done with SOLUTIONS\A\C modem\H modem\K modem-\T "My modem isn't responding to AT commands"?If you modem isn't responding to AT commands try the following:7 1. Press Ctrl-B and see if you get a "READY" prompt/ If so, then you are in Digital's command mode.: Issue the following command to enable the AT command set: Ctrl-D6 2. Press the Plus Sign 3 times in a row i.e. "+++"8 Does this give you the OK prompt? If so type ATH. 3. Is the power on.\Z\* Done with SOLUTIONSK\* Going to switch to the Command server now and issue interactive commands \X COMMANDS\U system \P managerclass/add=(name=hardware,nopar)#class/add=(name=modem,par=hardware)%class/add=(name=printer,par=hardware)*[EXAMPLES]TEXT_PAGING.EXAMPLE;1+,n.N/ 4qNN- 0123KPWOO526￴N7?<89GHJ ?Do you have an alpha-numeric pager (beeper)? Ever wonder about=that little box that you rent to enable you to send messages??The box is just a keyboard, a modem, and a bit of software that=speaks the IXO protocol. This program lets you speak the IXO>protocol (manual mode only) and since you can run this programAfrom shell scripts, Perl, Sun Netmanager, whatever, your computer0can keep you up to date no matter where you are.:The program accepts messages from the command line or from<standard input. It can "tee" the input into standard outputfor a filter effect.5This program, used in conjunction with procmail (from:comp.sources.misc) will enable you to selectively send the?beginning of certain email messages to your alphanumeric pager.AThis program was written for SunOS but has been ported to the HP. ---------- #! /bin/sh## This is a shell archive, meaning:1# 1. Remove everything above the #! /bin/sh line.'# 2. Save the resulting text in a file.7# 3. Execute the file with /bin/sh to create the files:# README # fbeep.c # beepersched # beepertab # ixo.docl# This archive created: Fri Nov 8 15:40:23 1991 by Tom Limoncelli, Mentor Graphics, Silicon Design Division##export PATH; PATH=/bin:$PATHif test -f README ; then3echo shar: will not over-write existing file READMEelse-echo shar: extracting README, 1645 characters"sed 's/^X//' > README <<'SHAR_EOF';XFancy Beeper -- By Tom Limoncelli (tal@warren.mentorg.com)X>XThis program dials the phone and speaks the IXO (manual mode)=Xprotocol to send a message to a pager. The message can come;Xfrom the command line or from standard input. The command;Xcan be used as a "tee". This program, used in conjunction@Xwith procmail will enable you to selectively send the beginning7Xof selected email messages to your alphanumeric pager.X XTO INSTALL:X>XThis has been installed on SunOS systems and on an HP system.?XThe HP system required a slight modification (comment out part=Xof the modem locking where it uses the getpriority() call to:Xsee if a process is still around. Just assume that it isXaround instead.)X>X(1) Edit fbeep.c and modify the #define DEFAULT_ macros to be5Xthe way you want them (the defaults should be fine).X>X(2) Copy beepersched and beepertab to /etc (or where ever you4Xspecified in fbeep.c) and edit them as appropriate.X=X(3) Compile fbeep.c to fbeep ("make fbeep" works just fine).X XCOMMAND USE:X<XRun the program with no parameters to get a list of all the Xoptions.XXPROGRAM HISTORY:XXLook inside fbeep.c.XXFUTURE ENHANCEMENTS:XXLook inside fbeep.c.XXHOW TO CONTACT THE AUTHOR:X9XThe best way is to send email to tal@warren.mentorg.com.=XOr, call +1 908-580-0102 x707 during business hours (EasternXStandard Time).X-XHere are the files included in this package:X Xtotal 354X-rw-rw-r-- 1 tal 1645 Nov 8 15:38 README9X-rw-rw-r-- 1 tal 894 Oct 31 11:25 beepersched7X-rw-rw-$^$MULTIHELP020.En [EXAMPLES]TEXT_PAGING.EXAMPLE;1qNa r-- 1 tal 687 Oct 31 11:37 beepertab5X-rw------- 1 tal 21873 Nov 8 15:37 fbeep.c5X-rw-rw-r-- 1 tal 8737 Oct 31 11:11 ixo.docSHAR_EOFlen=`wc -c < README`if test $len != 1645 ; then<echo shar: README was $len bytes long, should have been 1645fifi # end of overwriting checkif test -f fbeep.c ; then4echo shar: will not over-write existing file fbeep.celse/echo shar: extracting fbeep.c, 21873 characters#sed 's/^X//' > fbeep.c <<'SHAR_EOF'FX/* fbeep.c -- (fancy beep) send an alphanumeric message to a pager */0X/* By Tom Limoncelli, tal@warren.mentorg.com */X&X/* Copyright (c) 1991, Tom LimoncelliAX The sources can be freely copied for non-commercial use only.X*/XX/*4X * usage: (see getopt section; search for /Usage/ )X * X */XX/*X XHistory:-X 1.0 Oct 29, 91 -- First working version.@X 1.1 Oct 30, 91 -- Debugging levels implemented (-s -v -vv).GX 1.2 Oct 30, 91 -- Cleaned up the output, error message on failure.X XFuture enhancements:2X o Implement "automatic mode" of IXO protocol.=X o Implement numeric protocol that works for all beepers.+X o Permit "who" to be a list of people.X o Accept a list of modems.8X o Have the modem locking co-exist with HDB locking.XXNote from the author:HX If you combine this program with procmail by Stephen R. van den BergGXX#include X#include X#include X#include X/* #include */X#include X#include X#include X#include X#include X#include XNXchar *opt_modem, *opt_btab, *opt_sched, *opt_dialnum, *opt_pagerid;'Xchar *opt_message, *opt_who;0Xint opt_wait, opt_tee, opt_verbose;4X/* opt_verbose=0 Only errors and required output */!X/* opt_verbose=1 Usual output */.X/* opt_verbose=2 Usual plus modem dialogue */%X/* opt_verbose=3 Debugging output */XX#define LS_NOTHING (0)X#define LS_SEND (1)X#define LS_EXPECT (2)(Xint last_safe = LS_NOTHING;XXchar *modemlock;X#X#define DEFAULT_MODEM "/dev/ttyz4"(X/* #define DEFAULT_MODEM "/dev/cua1" */'X#define DEFAULT_BTAB "/etc/beepertab")X#define DEFAULT_SCHED "/etc/beepersched"XX#define MAX_MESSAGELEN (120)1Xchar messagebuff[MAX_MESSAGELEN + 1];#X#define LOCKDIR "/var/spool/locks"XX#define TRUE (1)X#define FALSE (0)XXvoid Xbail_out(e)X int e;X{X if (e)HX printf("...ERROR! Page was not be successful! Try again.\n");X elseX printf("...done.\n"); X exit(e);X}XX6X/* reads all command line info, processes it, etc. */Xint Xsetoptions(argc, argv)X int a rgc;X char **argv;X{X extern char *optarg;X extern int optind;3X int c, errflg = 0, ml, last_space;X char *m, *w, ch;X3X opt_modem = DEFAULT_MODEM; /* set defaults */X opt_sched = DEFAULT_SCHED;X opt_btab = DEFAULT_BTAB;X opt_dialnum = NULL;X opt_pagerid = NULL;X opt_tee = FALSE;X opt_verbose = 1;X opt_wait = FALSE;X opt_who = NULL;X opt_message = messagebuff;X=X while ((c = getopt(argc, argv, "D:S:T:d:p:tsvw")) != -1)X switch (c) {X case 'D': X opt_modem = optarg;X break;X case 'S': X opt_sched = optarg;X break;X case 'T':X opt_btab = optarg;X break;X case 'd':"X opt_dialnum = optarg;X break;X case 'p':"X opt_pagerid = optarg;X break;X case 't':X opt_tee = FALSE;X break;X case 's':!X if (opt_verbose > 1)X errflg++;X else!X opt_verbose = 0;X break;X case 'v'::X if ((opt_verbose == 1) || (opt_verbose == 2))X opt_verbose++;X elseX errflg++;X break;X case 'w':X opt_wait = TRUE;X break;X case '?':X errflg++; X }X X /* get the person's name */X if (optind < argc)"X opt_who = argv[optind++]; X elseX errflg++;X=X /* take the first MAX_MESSAGELEN bytes of the message */X ml = MAX_MESSAGELEN;;X m = opt_message;X while (optind < argc) {X w = argv[optind];X while (*w && ml) {X *m++ = *w++;X ml--; X }X optind++;X *m++ = ' ';X ml--;X }X if (isspace(*(m - 1))) X m--;X *m = '\0';X8X /* if the message should come from stdin, get it */%X if (!strcmp(opt_message, "-")) {X last_space = TRUE;X ml = MAX_MESSAGELEN;X m = opt_message;*X while ((ch = getchar()) != EOF) {X if (opt_tee)X putchar(ch);X if (ml) {#X if (isspace(ch)) {'X if (!last_space) {$X *m++ = ' ';X ml--;+X last_space = TRUE;X }X } else {'X if (isprint(ch)) {#X *m++ = ch;X ml--;,X last_space = FALSE;X }X }X } X }X *m = '\0';X }!X /* problems with message? */2X if ((opt_message == NULL) || (!*opt_message))X errflg++;XX if (errflg) {qX (void) fprintf(stderr, "Usage: %s [-D device] [-S schedule] [-T pager table] [-d dial num]\n", argv[0]);MX (void) fprintf(stderr, " [-p pager id] [-t] [-w] who message\n");0X (void) fprintf(stderr, "\nOptions:\n");RX (void) fprintf(stderr, " -D device (default is %s)\n", DEFAULT_MODEM);YX (void) fprintf(stderr, " -S schedule file (default is %s)\n", DEFAULT_SCHED);VX (void) fprintf(stderr, " -T pager table (default is %s)\n", DEFAULT_BTAB);SX (void) fprintf(stderr, " -d number to dial (ignore value from -T).\n");MX (void) fprintf(stderr, " -p pager id (ignore value from -T).\n");GX (void) fprintf(stderr, " -t tee all stdin into stdout.\n");9X (void) fprintf(stderr, " -s silent mode.\n");:X (void) fprintf(stderr, " -v verbose mode.\n");KX (void) fprintf(stderr, " -vv very verbose (debugging) mode.\n");PX (void) fprintf(stderr, " -w wait for modem (rather than abort).\n");.X (void) fprintf(stderr, "\nNotes:\n");TX (void) fprintf(stderr, " If 'who' is '-' then schedule is consulted.\n");oX (void) fprintf(stderr, " If 'message' is '-' then message is first 120 bytes of standard input.\n");BX (void) fprintf(stderr, " Names are case-sensitive.\n");1X (void) fprintf(stderr, "\nExamples:\n");fX (void) fprintf(stderr, " Page 'tom' and leave the message: 'Your laundry is finished.'\n");UX (void) fprintf(stderr, " %% %s tom Your laundry is finished.\n", argv[0]);&X (void) fprintf(stderr, "\n");mX (void) fprintf(stderr, " Page 1800-555-1212, use PIN 123456 and leave the message: 'Bl00p!!!'\n");[X (void) fprintf(stderr, " %% %s -d 18005551212 -p 123456 - Bl00p!!!\n", argv[0]);&X (void) fprintf(stderr, "\n");qX (void) fprintf(stderr, " Page whoever is scheduled to be 'on call' with message: Server 8 is down\n");JX (void) fprintf(stderr, " %% %s - Server 8 is down\n", argv[0]);&X (void) fprintf(stderr, "\n");SX (void) fprintf(stderr, " Send greg the first 120 bytes of file foo.\n");CX (void) fprintf(stderr, " %% %s greg - tm_wday;XX if (opt_verbose > 2)4X (void) fprintf(stderr, "Opening %s\n", fn);"X if (!(fd = fopen(fn, "r"))) {7X (void) fprintf(stderr, "Can't open %s\n", fn);X bail_out(1);X }"X while (fgets(buf, 100, fd)) {X if (buf[0] == dow) {!X if (opt_verbose > 2)@X (void) fprintf(stderr, "Day line=:%s:\n", buf);X break; X }X }X tok = buf[stm->tm_hour];"X while (fgets(buf, 100, fd)) {2X if ((buf[0] == tok) && (buf[1] == '=')) {!X if (opt_verbose > 2)CX (void) fprintf(stderr, "Person line=:%s:\n", buf);X break; X }X }X fclose(fd);X if (opt_verbose > 2)2X (void) fprintf(stderr, "Close %s\n", fn);5X buf[strlen(buf) - 1] = '\0'; /* zap the \n */X return buf + 2;X}XXchar *Xgetpagerinfo(fn, key, col)/X char *fn; /* search this file */HX char *key; /* for a line beginning with this string */:X int col; /* which column to extract */X{X static char buf[100];%X char *p, *start, *end;X FILE *fd;XX if (opt_verbose > 2)4X (void) fprintf(stderr, "Opening %s\n", fn);"X if (!(fd = fopen(fn, "r"))) {<X (void) fprintf(stderr, "ERR: Can't open %s\n", fn);X bail_out(1);X }"X while (fgets(buf, 100, fd)) {X p = buf;X while (isspace(*p))X p++;X start = p;X while (!isspace(*p))X p++;X end = p++;X *end = '\0';#X if (!strcmp(start, key)) {!X if (opt_verbose > 2)?X (void) fprintf(stderr, "tabline=:%s:\n", buf);X col--;X while (--col) {$X while (isspace(*p))X p++;X start = p;%X while (!isspace(*p))X p++;X end = p++;X *end = '\0';X }!X if (opt_verbose > 2):X (void) fprintf(stderr, "Close %s\n", fn);X fclose(fd);X return start; X }X }X if (opt_verbose > 2)2X (void) fprintf(stderr, "Close %s\n", fn);X fclose(fd);X return NULL;X}XXvoid Xsafenl()X{X if (last_safe)$X if (last_safe != LS_EXPECT)<X if (opt_verbose>1) (void) fprintf(stderr, ":");X if (last_safe)9X if (opt_verbose>1) (void) fprintf(stderr, "\n");X last_safe = LS_NOTHING;X}XXvoid Xsafeprint(str)X char *str;X{X while (*str) {X if (isgraph(*str))0X (void) fprintf(stderr, "%c", *str);X else {X switch (*str) {X case 10:/X (void) fprintf(stderr, "\\n");X break;X case 13:/X (void) fprintf(stderr, "\\r");X break;X case 32:/X (void) fprintf(stderr, "\\s");X break;X default:6X (void) fprintf(stderr, "\\%d", *str);X  break;X } X }X str++;X }X fflush(stderr);X}XX/* wait for lock */Xchar * Xwlock(dev)X char *dev;X{X int lock, pid;!X char waitcnt = 0;.X char *lkn, lname[100], buf[50];XX if (opt_verbose)5X (void) fprintf(stderr, "Locking %s\n", dev);X strcpy(lname, LOCKDIR);X strcat(lname, "/LCK..");X strcat(lname, dev);XX lkn = strdup(lname);X while (1) {X errno = 0;?X lock = open(lname, O_CREAT | O_WRONLY | O_EXCL, 0777);X if (lock == -1) {!X if (opt_verbose > 2)MX (void) fprintf(stderr, "ERR: %s is already locked.\n", dev);8X if ((lock = open(lname, O_RDONLY)) == -1) {X pid = 0;X } else {%X read(lock, buf, 49);X close(lock);!X pid = atoi(buf);X }X if (pid < 3) {X unlink(lname);pX continue;X }0X /* does the process still exist? */X errno = 0;e3X (void) getpriority(PRIO_PROCESS, pid);t@X if (errno == ESRCH) { /* lock process dead, let's"X * go! */%X if (opt_verbose > 2)eDX (void) fprintf(stderr, "Stale lock exists.\n");%X if (unlink(lname)) { )X if (opt_verbose > 2)rLX (void) fprintf(stderr, "ERR: Can't steal lock.\n");#X if (!opt_wait)jJX (void) fprintf(stderr, "No modems available.\n");!X bail_out(1);eX } else {n%X if (opt_verbose)tLX (void) fprintf(stderr, "Stale lock blown away.\n");X continue;X }X } else {i X if (opt_wait) {LX if ((opt_verbose > 1) || ((opt_verbose) && (!waitcnt)))VX (void) fprintf(stderr, "Waiting for lock to become free.\n");X waitcnt++;lX sleep(10);gX continue;X } else {sFX (void) fprintf(stderr, "No modems available.\n");!X bail_out(1);EX }X }X } else {X pid = getpid();%X sprintf(buf, "%d", pid);i+X write(lock, buf, strlen(buf));(X close(lock);sX break;g X }X }XmX return lkn;X}XeXvoid Xunwlock(name)X char *name;X{X if (opt_verbose) 6X (void) fprintf(stderr, "Unlocking modem.\n");X unlink(name); X return;X}XtXgrabmodem(dev) X char *dev;X{X struct termios ti;X int modem;yXmX if (opt_verbose)4X (void) fprintf(stderr, "Opening modem.\n");X errno = 0;h"X modem = open(dev, O_RDWR, 0);X if (errno) {&X perror("ERR opening modem ");X bail_out(1);aX }7X /* set tty params to 300bps, even parity, 7-1-e */FXTX errno = 0;tX ioctl(modem, TCGETS, &ti);sX if (errno) {.X perror("ERR reading modem settings");X bail_out(1);eX }0X ti.c_iflag |= IGNBRK; /* ignore breaks */3X /* ti.c_iflag |= IGNPAR; *//* ignore parity */n7X ti.c_iflag &= ~INPCK; /* ignore parity errors */r0X ti.c_iflag |= ISTRIP; /* strip 8th bit *//X ti.c_iflag &= ~INLCR; /* don't cr->nl *//X ti.c_iflag &= ~ICRNL; /* don't cr->nl */c2X ti.c_iflag &= ~IGNCR; /* don't ignore cr */1X /* ti.c_iflag &= ~IXON; *//* don't do xon */O3X /* ti.c_iflag &= ~IXOFF; *//* don't do xoff */aXr5X ti.c_oflag &= ~OPOST; /* don't post-process */iXh+X ti.c_cflag &= ~CBAUD; /* baud=300 */tX ti.c_cflag |= B300;.X ti.c_cflag &= ~CSIZE; /* 8-bit bytes */X ti.c_cflag |= CS8;-/X ti.c_cflag &= ~CSTOPB; /* one stop bit */r)X ti.c_cflag &= ~PARENB; /* parity */ .X ti.c_cflag &= ~PARODD; /* even parity */8X ti.c_cflag |= HUPCL; /* hang up on last close */;X /* ti.c_cflag |= CRTSCTS; *//* hardware handshaking */s?X ti.c_cc[VMIN] = 0; /* read() can get as few as 0 bytes */GX ti.c_cc[VTIME] = 20; /* time out at 2 seconds no matter what */eXe2X ti.c_lflag &= ~ISIG; /* disable signals */2X ti.c_lflag &= ~ICANON; /* disable signals */-X ti.c_lflag &= ~ECHO; /* don't echo */sXeX errno = 0;/X ioctl(modem, TCSETS, &ti);eX if (errno)/X perror("ERR setting modem settings ");oXeX return modem;X}XnXvoid Xsend(fd, str)X int fd;X char *str;rX{X if (opt_verbose > 1) {$X if (last_safe != LS_SEND) {X safenl();0X (void) fprintf(stderr, "Sending:"); X }X safeprint(str);X }!X write(fd, str, strlen(str));gX las& $MULTIHELP020.En [EXAMPLES]TEXT_PAGING.EXAMPLE;1qNX")t_safe = LS_SEND;rX}XcXnXint Xexpect(fd, flag, str)X int fd, flag;X char *str; X{X int ecnt;X char *p; X char c, cs[2];XiX cs[1] = '\0';XHX if (!flag)k?X flag = 20; /* if flag=0 then default to 40 seconds */f X elseeX flag /= 2;oXiX if (opt_verbose > 1) {&X if (last_safe != LS_EXPECT) {X safenl();2X (void) fprintf(stderr, "Expecting:"); X }X safeprint(str);'X (void) fprintf(stderr, ":\n");X }X ecnt = 0;X while (flag--) {nX p = str;s'X while (read(fd, &c, 1) == 1) {dX *cs = c;uX ecnt++;X if (ecnt > 70) {tX ecnt = 0;%X if (opt_verbose > 1)l2X (void) fprintf(stderr, "\n");X }!X if (opt_verbose > 1)pX safeprint(cs); X if (c == *p) {oX p++;tX if (!(*p)) {/)X if (opt_verbose > 1)t>X (void) fprintf(stderr, "[GOT IT]\n");,X last_safe = LS_NOTHING;X return 0;X }X } else(X p = str; X }X }X if (ecnt)X last_safe = LS_EXPECT;m X else X last_safe = LS_NOTHING;X return 1;X}XAX_Xvoid Xhangup(fd, st)eX int fd, st;X{X safenl();X if (opt_verbose)s1X (void) fprintf(stderr, "Hanging up.\n"); X sleep(3);X send(fd, "+++");]X safenl();X sleep(3);X send(fd, "ATH\r");UX safenl();X close(fd);X unwlock(modemlock);X bail_out(st);X}X Xvoid Xpage()OX{&X int modem, login_err;X char *p;.XoX if (opt_verbose);X (void) fprintf(stderr, "\nOptions selected:\n\n");eX if (opt_verbose)i:X (void) fprintf(stderr, " Paging: %s\n", opt_who);X if (opt_verbose > 2)rBX (void) fprintf(stderr, " Using device: %s\n", opt_modem);X if (opt_verbose)aCX (void) fprintf(stderr, " Dial number: %s\n", opt_dialnum);FX if (opt_verbose)a@X (void) fprintf(stderr, " Pager id: %s\n", opt_pagerid);X if (opt_verbose > 2)=?X (void) fprintf(stderr, " Table file: %s\n", opt_btab);tX if (opt_verbose > 2)i@X (void) fprintf(stderr, " Sched file: %s\n", opt_sched);X if (opt_verbose)gXX (void) fprintf(stderr, " Wait for modem: %s\n", (opt_wait ? "TRUE" : "FALSE"));X if (opt_verbose > 2)tSX (void) fprintf(stderr, " Tee output: %s\n", (opt_tee ? "TRUE" : "FALSE")); X if (opt_verbose > 2)cEX (void) fprintf(stderr, " Verbose level: %d\n", opt_verbose); X if (opt_verbose) ?X (void) fprintf(stderr, " Message: %s\n", opt_message);:X if (opt_verbose)r&X (void) fprintf(stderr, "\n");X KX p = strrchr(opt_modem, '/'); /* you might change strrchr to rindex */s X p++; X modemlock = wlock(p);"X modem = grabmodem(opt_modem);X X X if (opt_verbose) 6X (void) fprintf(stderr, "Resetting modem.\n");X:EX /* zap current session and hang up, wait 10 seconds and flush */ X sleep(3);X send(modem, "+++");X safenl();X sleep(3);X send(modem, "ATH\r");X safenl();X sleep(3);X ioctl(modem, TCFLSH, 0);X X if (opt_verbose) 5X (void) fprintf(stderr, "Checking modem.\n");nXn?X /* get modem's attention, if no response then forget it */+X send(modem, "AT\r");r&X if (expect(modem, 0, "OK\r\n")) {BX (void) fprintf(stderr, "ERR: Couldn't talk to modem.\n");X hangup(modem, 1);X };dXa6X /* turn on echo, if no response then forget it */X send(modem, "ATE1\r"); &X if (expect(modem, 0, "OK\r\n")) {>X (void) fprintf(stderr, "ERR: Can't turn on echo.\n");X hangup(modem, 1);X }; XmX /* dial the number */X if (opt_verbose)s.X (void) fprintf(stderr, "Dialing.\n");X send(modem, "ATDT"); X expect(modem, 0, "DT");X send(modem, opt_dialnum);X send(modem, "\r");(X /* expect(modem,0, opt_dialnum); */(X if (expect(modem, 90, "CONNECT")) {@X (void) fprintf(stderr, "\nERR: No connection made.\n");X hangup(modem, 1);X };iX!X if (opt_verbose) 1X (void) fprintf(stderr, "Logging in.\n"); 7X /* send a CR ever second until "ID=" comes back */ X login_err = 100; X do { X send(modem, "\r"); X if (!login_err--) {5X (void) fprintf(stderr, "ERR: no ID=\n"); X hangup(modem, 1); X }'X } while (expect(modem, 2, "ID=")); X X if (opt_verbose > 2) ;X (void) fprintf(stderr, "Starting manual mode.\n"); XsFX send(modem, "M\r"); /* put it into manual mode and forget the IXO"X * protocol BS */,X expect(modem, 0, "Enter Pager Number");XcX if (opt_verbose)g6X (void) fprintf(stderr, "Sending pagerid.\n");XiX send(modem, opt_pagerid);X send(modem, "\r");'X expect(modem, 0, "Enter Message");oX\X if (opt_verbose)p6X (void) fprintf(stderr, "Sending message.\n");XDX send(modem, opt_message);X send(modem, "\r");l0X expect(modem, 0, "Send Another Page? Y/N");XdX if (opt_verbose)T4X (void) fprintf(stderr, "Disconnecting.\n");X X send(modem, "n\r\4\r");!X expect(modem, 2, "CARRIER"); X.X hangup(modem, 0);X}X(Xmain(argc, argv)eX int argc;X char **argv;X{DX (void) fprintf(stderr, "fbeep - Fancy Beeper Program v1.2.\n");SX (void) fprintf(stderr, " By Tom Limoncelli, tal@warren.mentorg.com\n");sLX (void) fprintf(stderr, " Copyright (c) 1991, Tom Limoncelli\n");gX (void) fprintf(stderr, " The sources can be freely copied for non-commercial use only.\n");(XdX setoptions(argc, argv);XX if (!opt_verbose)4X (void) fprintf(stderr, "Please wait...\n");X"X if (opt_verbose > 2)(2X (void) fprintf(stderr, "Getting name\n");X2(X /* if opt_who is "-", look it up */X if (!strcmp(opt_who, "-")) (X opt_who = readsched(opt_sched);XiX if (opt_verbose > 2))5X (void) fprintf(stderr, "Getting dialnum\n");lXe-X /* if opt_dialnum is NULL, look it up */X if (opt_dialnum == NULL) :X opt_dialnum = getpagerinfo(opt_btab, opt_who, 4);X X if (opt_verbose > 2)"5X (void) fprintf(stderr, "Getting pagerid\n");2X -X /* if opt_pagerid is NULL, look it up */'X if (opt_pagerid == NULL)(:X opt_pagerid = getpagerinfo(opt_btab, opt_who, 5);X0 X page();XoX bail_out(0); X}SHAR_EOFlen=`wc -c < fbeep.c`rif test $len != 21873 ; then>echo shar: fbeep.c was $len bytes long, should have been 21873fifi # end of overwriting check if test -f beepersched ; then 8echo shar: will not over-write existing file beeperschedelse1echo shar: extracting beepersched, 894 characters.'sed 's/^X//' > beepersched <<'SHAR_EOF' X#>X# beepersched -- the schedule of who's on-call at what times.GX# [For use with fbeep.c -- By Tom Limoncelli (tal@warren.mentorg.com)]dX#)X# This file is only used if "who" is "-" X#CX# The lines that begin with 0-6 refer to the days Sun-Sat. The 2400X# bytes after refer to who's on duty each hour.X#2X# It's not required, but I use lower case letters-X# for people and capitol letters for groups.hX#-X# This schedule shows tal, ingo, and greg ash7X# having different hours. On Thursday from 5am-8:59pm 1X# all three are paged. (Multiple people is not 5X# yet implemented, so actually nobody will get paged X# in those hours.)mX# mX#X# 11111111112222X#012345678901234567890123X#X0aaaaaaaaaaaaaaaaaaaaaaaaX1aaaaaabbbbbbbbaaaaaaaaaaX2aaaaaabbbbbbbbaaaaaaaaaaX3aaaaaabbbbbbbbaaaaaaaaaaX4aaaaaAAAAAAAAAAAAAAAAbbbX5ccccccccccccccccccccccccX6ccccccccccccccccccccccccX#Xa=talXb=ingoXc=gregeXA=tal,greg,ingoSHAR_EOFlen=`wc -c < beepersched`if test $len != 894 ; then@echo shar: beepersched was $len bytes long, should have been 894fifi # end of overwriting check if test -f beepertab ; thens6echo shar: will not over-write existing file beepertabelse/echo shar: extracting beepertab, 687 characters %sed 's/^X//' > beepertab <<'SHAR_EOF' X#<X# beepertab -- table of information about people's beepers.EX# [ For use with fbeep.c by'aM$MULTIHELP020.En [EXAMPLES]TEXT_PAGING.EXAMPLE;1qN*": Tom Limoncelli (tal@warren.mentorg.com)]eX#<X# (these are not comment lines, this is me taking advantage/X# of the fact that there is nobody named "#")X#:X# The columns are name, simplebeep #, IXO number to dial,9X# and IXO pagerid. simplebeep # is not used by fbeep.c.eX#<X# Aliases are implemented by repeating data. (ooo, fancy!)X#,Xgreg 5551212 18005551212 9876501,Xgregt 5551212 18005551212 9876501,Xingo 5551212 18005551212 9876502,Xidean 5551212 18005551212 9876502-Xtom 5551212 18005551212 9876503 e-Xtal 5551212 18005551212 9876503 (SHAR_EOFlen=`wc -c < beepertab`tif test $len != 687 ; then>echo shar: beepertab was $len bytes long, should have been 687fifi # end of overwriting checkif test -f ixo.doc ; then4echo shar: will not over-write existing file ixo.docelse.echo shar: extracting ixo.doc, 8737 characters#sed 's/^X//' > ixo.doc <<'SHAR_EOF' 6XHere is a summary of the IXO protocol. All typos andDXmisinterpretations are mine. This is based on reading the GlenayreFXElectronics book. I have not yet implemented the automatic protocol,'Xbut I have implemented the manual one. X CXYou are "remote entry device" and the system that you dial into iseX"paging central".X AX(1) Remote sends CR at two second intervals until paging central\DXresponds with ID= at correct baud rate or until three transmissionsEXhave been completed. (This step exists to allow for possible future;Xbaud rate recognition).XEXSome systems have chosen to send ID= from the central if they do not(?Xreceive CR in about two seconds. This variation appears to beCXacceptable as the central continues to respond to CR's with ID='s.sXaEX(2) Central sends ID=. Request for ID returned within one second of,DXreceipt of CR. Paging central may, at its option, send CR or CR LF Xafter ID=X)@XPaging central may optionally choose to send ID= if it does not+Xreceive CR after appropriate waiting time.(XrXFOR AUTOMATIC REMOTE ENTRY:BXAt this point you can start following 2A or 2M depending on whichXsub-protocol you want to use.X/X(2A) Remote sends ESC SST (typically ESC PG1)pCXESC signifies entry device intends to talk in automatic dump mode.3XAXSS is a set of two alphanumeric charactoers signifying a type ofbXservice to be accessed:XXFor a paging service where:XField 1 = Pager ID XField 2 = MessageXSS will be sent at "PG".X CXWhere T is a single alphanumeric character relating to the type of AXterminal or device attempting to send the message. T = "1" is a EXcategory of entry devices using the same protocol. The PETs and IXOoAXdevices are members of this category. T = "7" or "8" or "9" are,BXreserved for wild card terminals or devices which may relate to aXspecific users' system.X FX(3A) Remote sends 6-char alphanumeric password then CR. (Password isEXoptional and is, in general, reserved for future services. Password @Xmay be interpreted as either a caller ID or a system entry key.BXLength of password, when used, may be different in some systems.)XNEXWhen an incorrect logon sequence beginning with ESC is received, thev8Xpaging central may respond with an ID= if it requires aXretransmission.XdGX(4A) Central responds with a message sequence (lines of text, each one FXfollowed by a CR). (Typical messages are "Processing - Please Wait",/X"4 pages sent" or "Bad Phone Line Call Again".X 0X(5A) Central then sends one of three sequences:.XCR ACK CR This means "logon accepted"/XCR NAK CR This means "requested again" 1XCR ESC EOT CR This means "Forced disconnect"tX/@X(6A) Central may then send another message sequence (optional).XEX(7A) Central sends ESC [p CRr>XMessage go ahead is sent when paging central is ready for new$Xinformation. The "p" is lowercase.XtBX(8A) Remote sends STX field1 CR field2 CR field3 CR ... fieldn CRXEEE CR@XYou can send as many fields as you wish. PG terminals send theDXpager-id in field1 and the message in field2. (no other fields areGXdefined). This entire message can be a max of 250 bytes. A field may @Xbe any length and where necessary may be continued in following@Xblocks. A field always ends with a CR. The CR field delimiterCXsuggests CR may not be used within a field. A block always beginspFXwith a STX and ends with a checksum followed by a CR. The charactersBXpreceding the checksum depends on what, if anything, is continuedXbeyond the block boundary. X XEEE can be an ETX, ETB, or RS.eXs<XThe ETX is used as a block termination indicator if a given=Xtransaction (fields 1 through N) ends within the block being Xtransmitted.X FXThe ETB is used as a block terminator if the transaction is continued@Xinto the next block, but the last field in the current block is Xcomplete.XeEXIf the last field within the current block is to be continued in the EXnext block, no CR is inserted at the end of the first portion of thesEXfield and the US character is used as a block termination character.GXThe CR terminating the broken field is sent at the end of the field in.Xwhatever block the field actually terminates.X AXNo limit is established within the protocol itself regarding thedEXnumber of transactions, the number of fields or the number of blocksrGXper field; however, a particular user system may have limits on any of Xthese items. XiAXSome systems may be limited to one block per transaction and one &Xtransaction per telephone connection.XeEXEach checksum is computed by performing the simple arithmetic sum of BX7-bit values of all characters preceding it in that block. (ThisGXmeans that the STX and ETB/ETX are included in the sum). The checksum==Xis then the least significant 12 bits of this resulting sum. X GXThe checksum is transmitted as three printable ASCII characters having DXvalues between HEX 30 and HEX 3F (the characters 0123456789:;<=>?).FXThe most significant four bits of the sum are encoded as the 4 LSB of!Xthe third chacter. See example.=XT2XA normal paging system will have two fields only:X XField 1 = Pager IDFX(normally up to eight digits. May include function and check digit).X;XField 2 = MessageIXField 1 or field 2 may be empty. For example, when a page is tone only,gFXfield 2 will be empty. Even when empty, a field is followed by a CR.FXSome systems will reject transactions which have an empty field 2 forCXa display page or transactions which have an empty field 1. OthereXsystems are less restrictive.X 0X(9A) The response to each block is one of four:4XMessage sequence CR ACK CR = OK, send next block.JXMessage sequence CR NAK CR = Checksum or transmission error, send last ,X block again.KXMessage sequence CR RS CR = Abandon current transaction and go to next. EX RS may occur when the checksum is OK,dFX but the current transaction violates aBX system rule. At the option of theEX system, it may occure in other cases.m5XMessage sequence CR ESC EOT CR = Begin disconnect.(XRBXAny of the responses may have an optional message sequence beforeFXthem, although the system designer should understand the consequences,Xto the user with all planned entry devices.XsBXIt is expected that many systems will save their message sequence?Xresponses until immediately before disconnect. For some entryGXdevices, it may also be desirable that message describing non-checksum}EXerror assocaiated with a particular transaction in a PG service will;FXbegin with the letter ID followed by the contents of field 1 for that Xtransaction.X X(10A) Remote sends EOT CRDXAfter reception of an ACK or RS for the last transaction in a givenAXservice, the entry device sends EOT CR meaning there are no more (Xtransactions remaining in this service.X 5X(11A) Optional: Central sends a message sequence CR.(+XAlthough optional, it is highly desirable.cXgX(12A) Central sends RS CRFXAn RS CR should be sent at this point if the paging central finds anyGXdata ACK in previous steps by the system to be unacceptable because ofdDXcontent (e.g. invalid pager number or a message field inappropriateXfor the type of pages, etc.) X X(13A) Central sends ESC EOT CR Xthen hangs up.oX> X(14A) stop.X +X(2M) Remote sends M CR (capitol M then CR) FXLack of ESC at beginning of response to ID signifies manual operationEXwhere applicable. From here on it's undefine(1$MULTIHELP020.En [EXAMPLES]TEXT_PAGING.EXAMPLE;1qNKd, but most systems ask EX(in English) for the info they need and then return you to step (1). X XNOTES: DXBell 103 300bps modem is standard, others may be used. Protocol isDXASCII with XON, XOFF either direction using 10-bit code (1 start, 7*Xdata, 1 parity, 1 stop) with even parity.XrCXIn the case of delays, the paging central shall wait at least fourTBXseconds (eight seconds for (1) (2) (2A)) before disconnecting theEXremote entry device. The remote entry device shall wait at least 10 <Xseconds for a character from the central before hanging up.XeDXPaging central may, at its option, send CR LF in place of CR at theXend of any sequence.;X DXFor inital use of protocol, the paging central shall be equipped toCXreceive full duplex using a Bell 103 compatible modem at 300 baud.iEXOptionally, certain inputs may be capable of receiving 110 baud Bell GX103 full duplex, 300/1200 baud Bell 212 full duplex. No echo shall be)CXemployed in full duplex mode. Any attempts at automatic baud rate >Xdetermination shall be within the restraints of the specified Xprotocol.X XnXSAMPLE Checksum Example:;X XSTX 000 0010eX1 011 0001dX2 011 0010 X3 011 0011\XCR 000 1101FXA 100 0001rXB 100 0010(XC 100 0011eXCR 000 1101sXETX 000 0011;X 10111 1011rX 1 7 ;X XSo, the checksum is "17;"X DXThere is also a really nice flowchart, which I can't reproduce hereBXwithout much too much trouble. ...and you wouldn't have known it"Xexisted if I hadn't told you. :-)SHAR_EOFlen=`wc -c < ixo.doc`aif test $len != 8737 ; then =echo shar: ixo.doc was $len bytes long, should have been 8737ufifi # end of overwriting checkAexit 0# End of shell archiveexit 0 # Just in case...-- r#*[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1+,./ 4R- 0123KPWO5266m5uN7L<89GHJ%Date: Mon, 15 Feb 1993 00:54:51 -0500)From: Monty Solomon $Subject: IXO and Alphanumeric PagersF"tpage" or "Tom's Pager System" is a set of programs that let you sendHmessages to alpha-numeric pagers using the "IXO" protocol. It supports aEdialing directory, a "who's on duty now" schedule, and can do special tricks with RFC822-format email.FThere is a mailing list for talking about this software (and other ixoCtopics) called ixo@warren.mentorg.com. To subscribe, send email to ixo-request@warren.mentorg.com. 1Here is the current version of the tpage package.---- Cut Here and unpack ---- #!/bin/sh%# This is a shell archive (shar 3.21)'# made 11/24/1992 17:07 UTC by tal@milk4# Source directory /tmp_mnt/nfs/usr10/tal/work/beep2#$# existing files WILL be overwritten## This shar contains:# length mode name># ------ ---------- ------------------------------------------# 2321 -rw-rw-r-- README# 2174 -rw-rw-r-- HISTORY# 1756 -rw-rw-r-- LEGALSTUFF# 539 -rw-rw-r-- MAILINGLIST# 5454 -rw-rw-r-- INSTALL# 6781 -rwx------ tpage.l# 10116 -r-xr-xr-x tpage.pl# 12085 -rwxrwxr-x tpaged.pl# 595 -rwxrwxr-x startdaemon# 12894 -r--r--r-- ixocico.c# 390 -rw-rw-r-- depend# 2140 -rw-rw-r-- schedule# 623 -rw-rw-r-- table# 8737 -rw-rw-r-- ixo.doc#*if touch 2>&1 | fgrep '[-amc]' > /dev/null then TOUCH=touch else TOUCH=truefi%# ============= README ==============#echo "x - extracting README (Text)"&sed 's/^X//' << 'SHAR_EOF' > README &&-XREADDME -- General information about "tpage"-X by Tom Limoncelli, tal@warren.mentorg.com %X Copyright (c) 1992, Tom Limoncelli?X The sources can be freely copied for non-commercial use only(X and only if the source is unmodified.X>X"tpage" or "Tom's Pager System" is a set of programs that letDXyou send messages to alpha-numeric pagers using the "IXO" protocol.AXIt supports a dialing directory, a "who's on duty now" schedule,4Xand can do special tricks with RFC822-format email.X'XThe system has the following features:XCX...sends pages to any pager system that supports the IXO protocol.XAX...additional protocols can be added. (I'll write the touch-toneX protocol soon).XBX...can parse email messages and extract the interesting info from'X them resulting in shorter messages.XGX...can copy it's input to stdout and therefore can be used as a "tee".X9X...maintains a directory of people's phone numbers/PINs.X8X...can page "the person on duty" (searches a schedule).XFX...schedule can have slots that are empty, but find someone anyway if#X the message is marked "urgent".XBX...with programs like procmail, permits you to send certain emailX messages to your pager.X0X...a list of modems can be given to the daemon.X6XHow it works (and how all the programs fit together):XDXo beep2.pl takes command-line and stdin, reads the schedule, looksEX up people's paging info in the directory, and queues the message.EXo tpaged.pl should always be running. Every 30 seconds it wakes up$X to check the queue for messages.2Xo tpaged.pl then sorts and batches the messages.CXo tpaged.pl then calls the appropriate program to do the protocolDX (currently that's ixocico but others can be written) and watchesX the output for messages:EX "#MESOK x" which means that message "x" was successful and can beX deleted from the queue.GX "#MESREJECT x" which means that message "x" was rejected and shouldDX be deleted from the queue. Email will be sent to the personX that sent the page.DX Messages that can't be deleted from the queue (due to NFS problemsCX or whatever) are added to a "blacklist" in memory, and are not X retried.X-XFor installation instructions, read INSTALL.#XFor program history, read HISTORY.X@XIf you aren't using "procmail", you're working too hard. Check"X"archie" for a location near you!SHAR_EOF$TOUCH -am 0505135192 README &&chmod 0664 README ||echo "restore of README failed"&# ============= HISTORY ==============$echo "x - extracting HISTORY (Text)"'sed 's/^X//' << 'SHAR_EOF' > HISTORY &&XHISTORY-X by Tom Limoncelli, tal@warren.mentorg.com &X Copyright (c) 1992, Tom Limoncelli ?X The sources can be freely copied for non-commercial use only(X and only if the source is unmodified.X-XFor installation instructions, read INSTALL.#XFor program history, read HISTORY./XFor general program information, read README. XX-X(( This program is the successor to "fbeep".X((X(( fbeep history:X((2X(( 1.0 Oct 29, 1991 -- First working version.X((EX(( 1.1 Oct 30, 1991 -- Debugging levels implemented (-s -v -vv).X((IX(( 1.2 Oct 30, 1991 -- Cleaned the output, error message on failure.X((CX(( 1.3 Nov 20, 1991 -- Added -m, -M and "null person" options.X((,X(( Made -a (abort) replace -w (wait).X((DX(( 1.4 Jan 2, 1992 -- Destination can now be a list of people.X((<X(( (project ended, replaced by tpage, tpaged, and ixocico)XX Xbeep2.pl:$X 1.0 Jan 31, 1992 -- First release.%X 1.1 Apr 20, 1992 -- Second release.?X 2.0 May 4, 1992 -- Sets umask before creating queue entries.XXtpaged.pl history:$X 1.0 Jan 31, 1992 -- First release.7X 1.1 Apr 20, 1992 -- New "wait before dial" algorithm.'X Hunted for "endless-repeat" bug.#X Now checks status of unlink.@X 2.0 May 4, 1992 -- Re-wrote data structures of ixo_* routinesHX to make things more reliable. No more parallel;X arrays, maintains records instead.IX Now "blacklists" files that couldn't be deleted.X2.1 patch 1, May 6, 1992--?X-- &do_protocol_ixo should declare $index as a local variable.<X-- &ixo_listindex should always be called with 1 parameter.EX-- Rejected messages should be deleted from queue directory and fromHX memory. If they can't be deleted from the dir)* i$MULTIHELP020.E #[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1RV" ectory, blacklist thatHX file. (previously they were not properly deleted from memory and noCX attempt was made to remove them from disk) (LOOPING BUG FIXED))X-- Debug mode prints a few new messages.4X-- &ixo_mesg_append didn't declare $count as local.EX-- &ixo_mesg_get didn't declare $pin, $error, $mess, $file as local.X Xixocico.c$X 1.0 Jan 31, 1992 -- First release.1X 1.1 Feb 4, 1992 -- Tuned some of the time-outs*X 2.0 May 4, 1992 -- Added DJ's 2 patchesXSHAR_EOF $TOUCH -am 0507144092 HISTORY &&chmod 0664 HISTORY || echo "restore of HISTORY failed")# ============= LEGALSTUFF =============='echo "x - extracting LEGALSTUFF (Text)"*sed 's/^X//' << 'SHAR_EOF' > LEGALSTUFF &&XKXCopyright (c) 1992 Thomas A. Limoncelli, tom_limoncelli@warren.mentorg.comXHXPermission to use, copy, modify, distribute, and sell this software andAXits documentation for any purpose is hereby granted without fee,BXprovided that (i) the above copyright notices and this permissionGXnotice appear in all copies of the software and related documentation,<Xand (ii) the name of Mentor Graphics Corp or any company or>Xorganization that I am associated with may not be used in anyHXadvertising or publicity relating to the software without the specific,8Xprior written permission of that company or orgaizationXCXTHE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,AXEXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANYAXWARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.XBXIN NO EVENT SHALL THOMAS A. LIMONCELLI OR MENTOR GRAPHICS CORP BEFXLIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGESHXOF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATAHXOR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ONFXANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE!XOR PERFORMANCE OF THIS SOFTWARE.XEXUse this software at your own risk. Think before using. Do not useGXthis software for mission-critical applications without careful backupHXprocedures. Though every effort has been made to make the software bugHXfree, some bugs are sure to still exist. More importantly, many pagingBXservices are known to drop some pages when under heavy load, whenBXupgrading their equipment, or at other times. The author and theFXauthor's employer are not responsible for problems with the software,GXthe paging service, or malfunctions of your pager. Dead batteries areXyour problem.XSHAR_EOF#$TOUCH -am 1111122392 LEGALSTUFF &&chmod 0664 LEGALSTUFF ||#echo "restore of LEGALSTUFF failed"*# ============= MAILINGLIST ==============(echo "x - extracting MAILINGLIST (Text)"+sed 's/^X//' << 'SHAR_EOF' > MAILINGLIST &&DXUPDATES: If you have source code changes please send them into the?Xauthor at "tal@warren.mentorg.com". He does make an effort toHXintegrate them into the source code, or at least make them available toGXothers. He is currently compiling a list of modifications required toDXuse this software with the various paging services that aren't 100% Xcompliant.XFXMAILING LIST: There is a mailng list for talking about this softwareEX(and other ixo topics) called ixo@warren.mentorg.com. To subscribe,.Xsend email to ixo-request@warren.mentorg.com.SHAR_EOF$$TOUCH -am 1023143892 MAILINGLIST &&chmod 0664 MAILINGLIST ||$echo "restore of MAILINGLIST failed"&# ============= INSTALL ==============$echo "x - extracting INSTALL (Text)"'sed 's/^X//' << 'SHAR_EOF' > INSTALL &&8XINSTALL -- How to install the Tom Page set of programs.-X by Tom Limoncelli, tal@warren.mentorg.com &X Copyright (c) 1992, Tom Limoncelli ?X The sources can be freely copied for non-commercial use only(X and only if the source is unmodified.X#XFor program history, read HISTORY./XFor general program information, read README. XX?XTHEORY OF OPERATION: (this assumes you've read README already)X--------------------XHXtpage.pl (which is often renamed to "beep" or "page") takes a number of>Xoptions, figures out who and how to send to a person, figures@Xout the message, and stuffs the info into a file for the daemon Xto read.XCXtpage.pl refers to /home/adm/lib/tpage/table to find out the phoneDXnumber and other information that must be given to the daemon. You=Xcan also specify a different file name with the "-T" option.X8Xtpaged.pl wakes up every couple minutes to see if thereFXis anything new in the queue. If there is, it takes the information,=Xdials out to your paging company, and transmits the message.XGXRather than page a particular person, tpage.pl can be given a schedule@Xand be told, "page whoever is on duty right now". This is doneAXby giving it "-" as the "who" parameter. The schedule is storedCXin /home/adm/lib/tpage/schedule, or by specifying a file name withXthe "-S" option.XEXtpage can take the message from the command line, or from stdin. IfAXit is coming from stdin, it can parse it as email and do various#Xthings with it (see the man page).XXXINSTALLATION:X-------------XDX1. Install the Perl programming language. The front-end to tpagedFXis written in Perl. Any version should do, but it was developed withGXversion 4.019. Hopefully, this program already exists on your system.DXIf not, I highly recommend that you get it from ftp.uu.net:/pub/gnuXand install it.XBXFor the rest of this document, $TPAGE will refer to the directoryBXthat you wish to keep the files associated with the tpage system.X>XALL FILES SHOULD BE COPIED to $TPAGE except tpage (belongs inHX/usr/local/bin/tpage). The queue directory should be $TPAGE/pqueue but1Xnothing will break if you put it someplace else.CX"chmod 1777 $TPAGE/pqueue" so that people can write to it but onlyXdelete their own files.XDX2. Edit tpage.pl and copy it to "/usr/local/bin/tpage". The firstFXsection explains what variables need to be edited and why. You might*Xwant to call it "page" or "beep" instead.X9XEdit tpaged.pl and copy it to "$TPAGE/tpage". The firstHXsection of each file explains what variables need to be edited and why.XDXEdit tpage.l and copy it to "/usr/local/man/manl" or wherever localAXmanpages are kept. The first section of each file explains what%Xvariables need to be edited and why.XKXIf you run SunOS you won't have to edit ixocico.c. If you don't run SunOSIXyou're going to have the fun of porting this program. I put in a coupleBXof #defines to get you started. Anyway, compile it with a simpleFX"make ixocico" and you're done with it. ixocico doesn't require manyDXedits because tpaged gives it everything it needs to know. ixocicoXalso belongs in $TPAGE/ixocicoXEXCopy the sample "table" file and copy it to $DEFAULT_T (which shouldBXbe $TPAGE/table if you're smart). Read it. Then edit it to yourXrequirements.XHXCopy the sample "schedule" file and copy it to $DEFAULT_S (which shouldEXbe $TPAGE/schedule if you're smart). Read it. Then edit it to yourEXrequirements. You can edit this later or even skip this step if you'Xdon't care about the schedule feature.X5X3. Read the man page ("nroff -man tpage.l | more").XGX4. Create the $QUEUE_DIR directory (as defined in $TPAGE/tpage.pl andJX$TPAGE/tpaged.pl) and do a chmod 0777 on it. Make sure that users on anyFXmachine that should be able to run "tpage" can create files there andGXdelete at least their own files. If you use NFS you'll have to export5Xthat directory. If you don't use NFS, you're smart.XFX5. Set up a cron job that runs "startdaemon" every 20 minutes on theFXmachine with the modems. You might want to run it as root, you might9Xwant to run it as any user that can access those modems.X5X6. Read the man page ("nroff -man tpage.l | more").XXTest it and you're done. Try:X0Xtpage -d 1xxxyyyzzzz -p 123456 "this is a test"'X(substitute your phone number and pin)X$Xtpage alias "this is a second test"4X(replace "alias" with a name from the "table" file)X Xtpage - --Xthis is a test using the schedule and stdin.X^DX(X(this should page the "person on duty")XXBUGS:XFX-------------------------- INSTALL PROBLEM --------------------------EXSome people have reported that in ixocico.c in the "main()" functionHXneeds "sleep(2); send(modem, "\r"); sleep(2); send(modem, "\r");" addedBXor their paging service doesn't respond. Here's where to add it:XX-------------!Xthis code segment is from main()<X need to send a few \r's to wake-up*l$MULTIHELP020.E #[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1R$" some paging terminalsX------------ XXprintf("Waiting for ID=\n");X<X /* send a CR every second until "ID=" comes back */X failcnt = 10;X)X/* CRs needed by PacTel Paging DJ */XX-----> sleep(2);X-----> send(modem, "\r");X-----> sleep(2);X-----> send(modem, "\r");XX while (failcnt--) {-X if (match(modem, "ID=", 5)){XGXSpecial thanks to Daryl Jones for reporting this.XFX-------------------------- INSTALL PROBLEM --------------------------BXDo you run SCO Unix? Have you gotten ixocico to compile? NobodyMXelse has! Please join the ixo mailing list (ixo-request@warren.mentorg.com)Xand tell us what you did!XSHAR_EOF $TOUCH -am 0505135392 INSTALL &&chmod 0664 INSTALL || echo "restore of INSTALL failed"&# ============= tpage.l ==============$echo "x - extracting tpage.l (Text)"'sed 's/^X//' << 'SHAR_EOF' > tpage.l && X.ds l localX.TH TPAGE N "05 May 1992"-X.BY "Tom Limoncelli, tal@warren.mentorg.com" X.SH NAME)Xtpage \- front-end to Tom's Pager SystemX.br+Xtpaged \- daemon that manages paging queueX.br2Xixocico \- program that executes the IXO protocol X.SH SYNOPSISX.B /usr/local/bin/tpageX[X.B \-T Xtable fileX] [X.B \-SXschedule fileX] [X.B \-UX] [X.B \-d Xphone numX] [X.B \-pXpinX] [X.B \-tX] [X.B \-vX] [X.B \-mX] [X.B \-MX] [X.B \-eX]X.B whoX[ X.B messageXorX.B \-X]X.brX.B /home/adm/lib/tpage/tpagedX.brX.B /home/adm/lib/tpage/ixocico Xdev phonenumpX.brX.SH DESCRIPTION X.I tpagep@Xis the front-end to the system. A user can run this program to%Xsubmit a message to someone's pager. X.PPXThe program wants 4<Xthings: (1) the phone number to dial, (2) the person's PIN>Xpin (Personal Identification Number), (3) who to email if the*Xpage isn't accepted, and (4) the message.X.PP:XOnce it has all that information, it dumps it into a fileXwhich is read by X.B tpaged7Xwhich delivers the message to the paging service usingi6Xthe appropriate protocol. tpaged selects the correct2Xprogram for you. Each protocol is implemented as-Xa separate program. Currently \fBixocico\fR07Xis the only program to choose from, and it implements /Xthe IXO protocol.X.PP XThe phone 2Xnumber (1) and PIN (2) can be specified with the X.B \-dnXandX.B \-p-8Xoptions, OR by specifying a name (which instructs tpage<Xto look up the information in the pager table file), OR by !Xspecifying the name ``\-'' whichr<Xmeans ``whoever is on duty'' (which instructs tpage to find<Xout who is on duty from the schedule file, and then look up5Xtheir phone number and PIN in the pager table file).1X.PP@XSpecifying a phone number without a PIN (or vice-versa) results=Xin the missing data being looked up in the pager table file.xX.PP?XA comma-separated list of names may be given. It is much morec:Xefficient to use a list of names than to do single pages.X.PP9XNOTE: A name must always be specified, so if you use the_X.B \-dAXandX.B \-pEBXoptions you must also specify a name (such as ``foo'') which will0Xbe ignored. Combining a list of names with theX.B \-dXand/orsX.B \-pn1Xoptions works in a logical but undefined manner.aX.PP:XTo specify who to email if there is a problem (3) use theX.B \-ei>Xoption. The default for this is to not send email to anyone.X.PPDXThe message (4) can be specified on the command line or if ``-'' is:Xgiven, stdin is read for the message. No matter how manyBXbytes you give it, the high-bit is stripped, RETURNs and TABs are@Xturned into spaces, and groups of spaces are turned into single>Xspaces. The first 160 bytes (configurable in the program) is?Xall that's sent, since that's all that the pager will display.eX.PPXCommand-line options are:X.TP 10mX.BR \-T " table file"*X\fItable file\fR is the file that has the3Xtable of people and the info needed to communicate=Xwith their pager. The default is /home/adm/lib/tpage/table.X.TPX.BR \-S " schedule file"u-X\fIschedule file\fR is the file that has thenXis the file that is used =Xto find out who's on duty at this moment. This file is only0Xconsulted if ``who'' is ``\-''. The default isX/home/adm/lib/tpage/schedule.X.TPX.B \-Ug@XThis option marks the message as \fIurgent\fR. If the schedule=Xlists that no one is on duty at that time but the message ise8Xmarked \fIurgent\fR, a secondary schedule is consulted.X.TPX.BR \-d " phone num"i<XIgnore what the table file says, use this phone number when>Xdialing. If a list of people is specified, this phone number8Xis used for the first person, the others will be lookedXup in the \-T file.X.TPX.BR \-p " pin"c@XIgnore what the table file says, use this PIN when transmitting Xthe message.u4XIf a list of people is specified, this phone number8Xis used for the first person, the others will be lookedXup in the \-T file.X.TPX.B \-te;XAct as a ``tee''. Copy stdin to stdout. If you give thise+Xoption and the message is not coming from eX.TPX.B \-v <XVerbose mode. Currently useless since there isn't anythingXextra worth printing.X.TPX.B \-mtIXParse the input as mail. Skip all the headers but extract the ``From'',lCX``Subject'', and ``Priority'' lines. If they exist, append to theo?Xbeginning of the message ``F: frominfo'', ``S: subject line'',YDX``P: priority''. ``F:'' and ``P:'' are clipped to be one screenful>Xin length. They are all padded out to the end of the screen.X.TPX.B \-M&HXSkip ``mail quoted'' lines. Netnews and Mail often have other messagesEXquoted by prefixing each line with greater than symbol. This option^JXskips any input line that begins with zero or more whitespace charactors,FXfollowed by zero or more letters or numbers, followed by zero or moreBXof \<, \>, {, or }. This should catch the normal quoting methods8Xas well as anything the perverse superquote.el package Xfor GNU EmacsXmight come up with.X.TPX.B \-eY@XOn error, send email to this person. If any errors happen when<Xthe tpage command is beign run, the user is notified. This;Xis for sending email when the page is being processed. Ins>Xother words, if the PIN is incorrect. If the phone number isAXincorrect the tpaged daemon will keep redialing and redialing itu/Xtrying to figure out why it can't get through.3X.PP X.IR tpagedd<Xtpage is a program that you don't need to know about. Your>Xsysadmin should have installed it for you. It wakes up about=Xevery 20 seconds, sees if there are any new messages to sendn?Xout and tries to send them. It can understand multiple paging7Xprotocols (tpage picks the best one for you) though it-<Xcurrently only knows about the IXO protocol. tpage can run1Xas ``root'' but is often just run as ``daemon''. X.PP X.IR ixocicoEXis the message transport program for the tpage system. It is calledXby X.B tpaged=Xand told what device to use and what phone number to dial onXthe command line. It/Xgets the PINs and messages to send from stdin. X.PP8XIt co-exists with the uucp programs fine as it uses the9Xsame methods to lock the modems. It notices stale locksd9Xand blows them away. Not all locking features have beenu$Xproven to work on HPUX, only SunOS.-XIt will not wait for a modem to be unlocked. X.PP X.B tpagedXwatches the output of X.B ixocico +Xfor lines beginning with # to know successt;Xor failure of particular messages and of the entire batch.X.PP X.SH FILESX.ta 6cbX.nf7X/home/adm/lib/tpage/schedule schedule of who's on dutyo?X/home/adm/lib/tpage/table table of people and their pager infop X.SH SEE ALSOeXuucico(1), xkill(l) X.SH HISTORY3XWritten by Tom Limoncelli (tal@Warren.MENTORG.COM)-9Xat Mentor Graphics Corporation, Silicon Design Division,oCXWarren, New Jersey. May be re-distributed only in it's unmodifiediXform. X.SH BUGS XIf9X.B \-dsXandX.B \-p./Xare specified, a name still must be specified. X.PP8XIt currently only compiles under SunOS even though some:Xdefines are inserted so that it doesn't fail all over the,Xplace on silly operating systems like HPUX.SHAR_EOF $TOUCH -am 0505135492 tpage.l &&chmod 0700 tpage.l || echo "restore of tpage.l failed"'# ============= tpage.pl ==============i%echo "x - extracting tpage.pl (Text)".(sed 's/^X//' << 'SHAR_EOF' > tpage.pl &&X#! /usr/local/bin/perl4.035Xa)X# tpage.pl -- front-end to tpage system.i.X# by Tom Limoncelli, tal@warren.mentorg.com'X# Copyright (c) 1992, Tom LimoncellieAX# The sou+½$MULTIHELP020.E #[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1R%"/rces can be freely copied for non-commercial use onlyd%X# and only if they are unmodified.eXrRX# $Header: /home/tal/work/beep2/RCS/tpage.pl,v 1.2 1992/09/21 20:11:51 root Exp $Xe/X# Version 2.0 -- See file HISTORY for details.hXoX# $Log: tpage.pl,v $i+X# Revision 1.2 1992/09/21 20:11:51 rootnX# new tr's to remove high bitsRX#+X# Revision 1.2 1992/09/21 20:11:51 root X# new tr's to remove high bitsRX#+X# Revision 1.1 1992/09/21 20:09:37 rootTX# Initial revisionOXIEX####################################################################NX#$X# Parameters that the user can set:X#EX####################################################################DXR X$debug = 0;X# leave that off XMX$MAX_WINDOW = 16;?X#This is the number of charactors at a time do you see on your +X# pager. This is used when word-wrapping. XOX$MAX_MESSAGE = 110;AX# How many bytes can one message be. This must be less than 250aHX# minus the length of your PIN. This is because each packet in the ixoFX# protocol must be less than 250 chars. If you have a pager that canGX# receive longer messages, you'll have to modify the ixocico.c programeAX# to handle the "packet continuation" feature. No biggie, just EX# something that I didn't feel like implementing since I can't even uX# test it with my pager.hXu-X$DEFAULT_S = '/home/adm/lib/tpage/schedule';s,X# (default: '/home/adm/lib/tpage/schedule')>X# If you plan on using the schedule feature, this is the fileIX# name where beep2.pl will look for the schedule. It must be accessable CX# on the machine that runs tpage.pl, not the machine that runs the=X# daemon (tpaged.pl).X=*X$DEFAULT_T = '/home/adm/lib/tpage/table';)X# (default: '/home/adm/lib/tpage/table')&@X# If you plan on using the table feature (that is, store a listIX# of people and their paging info), this is the file name where tpage.pliEX# will look for the data. It must be accessable on the machine thatCX# runs tpage.pl, not the machine that runs the daemon (tpaged.pl).tX,X$QUEUE_DIR = '/home/adm/lib/tpage/pqueue/';*X# (default: '/home/adm/lib/tpage/pqueue/'IX# This is the directory where messages will be queued. The trailing "/" X# is required. XlEX####################################################################wX# some helping functionsFXTXrequire("getopts.pl");NXSXsub strip_string {IX local($s) = @_;e7Xprint "DEBUG: REMOVE_CONTROLS :", $s, ":\n" if $debug;=2X $s =~ tr/\200-\377/\000-\177/; # remove high-bit2X $s =~ tr/\000-\037\177//d; # delete unprintables:X $s =~ s/\s+/ /g; # change groups of white space into " "i1X $s =~ s/^ //; # remove spaces from the front,/X $s =~ s/ $//; # remove spaces from the endcX 3Xprint "DEBUG: REMOVE_DONE :", $s, ":\n" if $debug;u X return $s;X}XEX####################################################################nX# Here's the actual programXREX####################################################################- X# Get the command line options.XfX# set the defaults X" Xprint "\n";XmX# -S schedule fileX$opt_S = $DEFAULT_S;sX# -T pager tableX$opt_T = $DEFAULT_T; @X# -U use urgent schedule if no one is scheduled for that time. X$opt_U = 0;0X# -d number to dial. (first name in list only) X$opt_d = ""; 1X# -p pager id to use. (first name in list only) X$opt_p = ""; !X# -t tee all stdin into stdout.t X$opt_t = 0;X# -v verbose mode. X$opt_v = 0;2X# -m input will be in RFC822, skip boring stuff. X$opt_m = 0;+X# -M like -m but also skip >-quoted text.t X$opt_M = 0;/X# -e if it errors, send email to this person.e X$opt_e = "";aXcX$line_from = "";pX$line_subj = "";hX$line_prio = "";dXpXdo Getopts('S:T:Ud:p:tvmMe:');.XhX# get the wholistX$opt_wholist = shift (@ARGV);.X$opt_wholist = "special" if $opt_d && $opt_p;X/EX####################################################################tHX# Get the message (either on the command line or stdin; handle -t -m -MXcX# bunch up all the rest!X$opt_message = join(' ', @ARGV);t2Xprint "opt_message = :$opt_message:\n" if $debug;>X$opt_message = &strip_string( $opt_message ) if $opt_message;2Xprint "opt_message = :$opt_message:\n" if $debug;GXdie "$0: No message. Cat got your tongue?" if ( $opt_message eq "" );pXl?Xdie "$0: Can't use -m/-M and have message on the command line"l0X if ($opt_m || $opt_M) && $opt_message ne '-';X=X# maybe get message from stdin, echoing to stdout if $opt_t;lXif ($opt_message eq '-') {aX $opt_message = '';X # handle -m headers firstaX if ($opt_m) {A,X print "DEBUG: Doing -m work\n" if $debug;X local($line) = "";oX while (<>) {T?X if ( /^\S/ || /^$/ ) { # start of new header, do previous aoney7X $line_from = substr($line, 6) if $line =~ /^From/;o0X $line_subj = substr($line, 9) if $line =~ /^Subject: /;1X $line_prio = substr($line, 10) if $line =~ i/^Priority: /;X $line = $_; X } else {X $line .= $_;dX }d-X last if /^$/; # end of headers, start e processingX }X } 9X $line_from = &strip_string( $line_from ) if $line_from;i9X $line_subj = &strip_string( $line_subj ) if $line_subj;n9X $line_prio = &strip_string( $line_prio ) if $line_prio;nXoX while (<>) {2X# -M means skip if the line is news quoted email.@X# a line is news quoted if it begins with one of the following:X# [white] [word] quote@X# where "white" is any amount of whitespace (zero or one times)AX# where word is any letters/numbers (userid) (zero or one times)t'X# where quote is any of >, <, }, or {.t)X next if $opt_M && /^\s*\S*[\>\}\<\{]/; X print if $opt_t;sX $_ = &strip_string( $_ );X $opt_message .= $_;X $opt_message .= " ";i2X # once we've got quite a bunch, screw the rest.4X if ( length($opt_message) > ($MAX_MESSAGE * 8)) {$X while (<>) { print if $opt_t; }X }X }eX}X EX####################################################################iX# massage the messageXSXif ($debug) {*X print "DEBUG: pre-processed messages\n";X print "FROM=:$line_from:\n";X print "PRIO=:$line_prio:\n";X print "SUBJ=:$line_subj:\n"; X print "MESS=:$opt_message:\n";X}Xe=X$line_from = substr( "F: " . $line_from . ' ' x $MAX_WINDOW,8X 0, $MAX_WINDOW) if $line_from; # pad to display sizeXE=X$line_prio = substr( "P: " . $line_prio . ' ' x $MAX_WINDOW,M8X 0, $MAX_WINDOW) if $line_prio; # pad to display sizeXuKX$l = $MAX_WINDOW * int ((length($line_subj)+$MAX_WINDOW+2) / $MAX_WINDOW);o=X$line_subj = substr( "S: " . $line_subj . ' ' x $MAX_WINDOW,t/X 0, $l) if $line_subj; # pad to display sizejXt.X$opt_message = &strip_string( $opt_message );X# put it all togetherQX$the_message = substr( $line_prio . $line_from . $line_subj . $opt_message, 0, n$MAX_MESSAGE - 1);XXif ($debug) {+X print "DEBUG: post-processed messages\n";X print "FROM=:$line_from:\n";X print "PRIO=:$line_prio:\n";X print "SUBJ=:$line_subj:\n"; X print "MESS=:$opt_message:\n";$X print "COMPLETE=:$the_message:\n";X}X(EX####################################################################i<X# At this point we can do some more of the sanity checking.XlKX#die "$0: Conflicting verbosity levels" if ($opt_s && ($opt_v || $opt_V));T3Xdie "$0: Schedule file $opt_S can't be read/found"h@X unless ( ($opt_wholist eq '-') || (-r $opt_S && -r $opt_T) );+Xdie "$0: Pager table $opt_T can't be read"o.X unless ($opt_d && $opt_p) || ( -r $opt_T );XtEX####################################################################e0X# use the schedule to fill in "who" if we need.XkXif ($opt_wholist eq '-') {-@X local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);X local($l) = $wday;/X local($h) = $hour * 2 + int ($hour / 30) + 1;sX local($w,$found1) = 0;X Xprint "L = $l\n" if $debug;Xprint "H = $h\n" if $debug; Xprint "U = $opt_U\n" if $debug;Xe>X # Read from schedule until you hit a line beginning with $l.BX # At that point, get the char $h bytes in. If that byte is "-",X # and $opt_U, keep going.n#X print "\nChecking schedule:\n\n";-8X open(SCHED, "<$opt_S") || die "Can't open $opt_S: $!"; X while (1) {v X $w = '';iX while () {X last if /^${l}/;X }X $w = substr($_, $h, 1);(X $found1 = 1 if $w; # we found one!X next if $opt_U && $w eq '-';UX last;X }9XNMX die "$0: Schedule doesn't have a line for this day of the week.\n" unless =$found1;JX die "$0: No one is assigned to be on duty at this time.\n" if $w eq '-';XOFX # Now search until a line begins with $w= and assign line to wholistX $opt_w,D$MULTIHELP020.E #[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1Ro)"@holist = '';X while () {MX next unless /^${w}\=/;T(X chop( $opt_wholist = substr($_, 2) );X }tIX die "$0: Schedule error: No people assigned to '" . $w . "'\n" unless t $opt_wholist;PX close SCHED;X}XnEX####################################################################[0X# we we still don't know who to call, bail out.X6Xdie "$0: The schedule didn't specify anyone to call!"/X unless ($opt_wholist) || ($opt_d && $opt_p);=Xdie "$0: There isn't anyone scheduled for this time of day."pX if $opt_wholist eq '-';XpEX####################################################################h6X# rotate through "$opt_wholist" and queue each personX X$cnt = 0;,Xforeach $who ( split(',', $opt_wholist) ) { X $cnt++;tXgX # look up "who"'s information 7X open(TABL, "<$opt_T") || die "Can't open $opt_T: $!";rX while () {X next if /^#/;X chop;-X local($name,$phonen,$phonea,$pin) = split;tX if ($name eq $who) { =X $opt_d = $phonea unless $opt_d; # might have it from ARGVr:X $opt_p = $pin unless $opt_p; # might have it from ARGV4X print "Got $who is :$opt_d:$opt_p:\n" if $debug; X last;rX }X }m X close TABL;aXpHX die "$0: We were not able to find a phone number for $who.\n" unless $opt_d;iEX die "$0: We were not able to find a PIN for $who.\n" unless $opt_p; X 0X # write into the queue the proper information.!X chop( $thishost = `hostname` );f6X $qname = $QUEUE_DIR . "P" . $thishost . time . $cnt;#X print "QUEUE=$qname\n" if $debug;bX local($um) = umask 2;eBX open(QU, ">$qname" ) || die "Can't open $qname for writing: $!"; X umask $um;X print QU "A\n";mX print QU $opt_d, "\n";X print QU $opt_p, "\n";8X if ($opt_e eq '-') { # '-' means send errors to $who,X print QU $who, "\n";a X } else {X print QU $opt_e, "\n";iX } X print QU $the_message, "\n";X print QU "X\n";P X close QU;p2X print "Message queued for $who: $the_message\n";X DX # zap the phone# and PIN so that ARGV's info only effects us once.X $opt_d = "";X $opt_p = "";X}X Xprint "\n";SHAR_EOF!$TOUCH -am 0922135192 tpage.pl &&lchmod 0555 tpage.pl ||!echo "restore of tpage.pl failed".(# ============= tpaged.pl ==============&echo "x - extracting tpaged.pl (Text)")sed 's/^X//' << 'SHAR_EOF' > tpaged.pl &&X#! /usr/local/bin/perl4.019X &X# tpaged -- back-end to tpage system..X# by Tom Limoncelli, tal@warren.mentorg.com'X# Copyright (c) 1992, Tom Limoncelli AX# The sources can be freely copied for non-commercial use only %X# and only if they are unmodified.bXs0X# Version 2.0 -- See file HISTORY for details. XsEX####################################################################X#$X# Parameters that the user can set:X#EX####################################################################lXs X$debug = 0;LX# $| = 1; open( STDOUT, ">/home/adm/lib/tpage/log.txt" ) if $debug; $| = 1;CX$QUEUE_DIR = '/home/adm/lib/tpage/pqueue/'; # same as in tpage.ploAX#$IXOCICO = '/home/tal/work/beep2/ixocico'; # where is ixocico?t@X$IXOCICO = '/home/adm/lib/tpage/ixocico'; # where is ixocico?(X$MAIL = '/usr/ucb/mail'; # which mail to use?NX # Recommended mailers: SunOS & BSD's: /usr/ucb/mail, AT&T Unix's xmail+X # Not recommended mailers: /bin/mailtXe%X# list of devices to rotate through.n=X@DEVICES = ( "/dev/ttyz4" ); # currently they are all spokenaBX# to at the same speed and same parameters. Some day I'll set up>X# a modemtab system, but I don't think more than one modem is!X# really needed for this system.lXa5X# amount of time to sleep between scans of the queue "X$SLEEP_TIME = 150; # 2.5 minutes:X$SLEEP_TIME = 10 if $debug; # smaller when I'm debuggingEX# Small amount of time to wait between finding anything in the queuef&X# and doing a real scan of the queue.X$MULT_SLEEP_TIME = 10;XoEX####################################################################,X# QUEUE FILES FORMAT:X#8X# Files in the queue have the name of the format in the9X# first line. Currently there is only one format and ite<X# is named "A". The first line marks it as the "A" format.>X# a subroutine called read_format_A reads this format. Other9X# formats can be written (see comments by read_format_A)hX#X# The "A" format:X# line contentsb X# 1: A\nX# 2: number to dial\neX# 3: pin\nX# 4: entire message\ns X# 5: X\nX'<X# read_format_* -- modules that read various data formats.;X# Currently implemented: The "A" format.a>X# do_proto_* -- modules that do various beeper protocols.<X# Currently implmented: the ixo protocol.?X# Future protocols: numeric-only pagers.tX^EX####################################################################tX# Here's the actual programXeX# define some globalsXbXlocal(%protocols);<X> Xwhile (1) {'X local ($first, @allfiles, @anyfiles);sXaAX # We could scoop up all the files and process them, but chancesE?X # are if one file is found, more are on the way. So, instead ?X # we scoop, if any are found we sleep 5 seconds and re-scoop. Xg!X # wait for any files to appear. X while (1) { X @anyfiles = &scan_queue;pCX print "DEBUG: anyfiles= ", join(' ', @anyfiles), "\n" if $debug;nXe@X if ($#anyfiles!=-1) { # files? take a rest and then process.)X sleep $MULT_SLEEP_TIME unless $debug;g X last;3%X } else { # no files? hibernate.aX sleep $SLEEP_TIME; X next;.X }X }sXi!X # re-get the files in the queue X @allfiles = &scan_queue;BX print "DEBUG: allfiles= ", join(' ', @allfiles), "\n" if $debug;Xt.X # get all the data out of the queue'd files.X foreach $file (@allfiles) {e*X print "DEBUG: Doing $file\n" if $debug;EX open(DATA, "<" . $QUEUE_DIR . $file) || print "Can't open $file: $!";X chop( $first = );R)Xprint "DEBUG: first=$first\n" if $debug; "X eval "do read_format_$first()";X } X.JX # process all the extracted data (do_protocol_* should delete the files)$X foreach $proto (keys %protocols) {"X eval "do do_protocol_$proto()";X delete $protocols{ $proto };rX sleep $SLEEP_TIME;tX }sX}Xh9X# scan the queue for entries (avoid "blacklisted" files)sXsub scan_queue {lX local(@files);1X # scan the directory for "P files (pager files)ICX opendir(QDIR, $QUEUE_DIR) || die "$0: Can't open $QUEUE_DIR: $!";h'X @files = grep( /^P/, readdir(QDIR) );sX closedir(QDIR);o?X print "DEBUG: filescan= ", join(' ', @files), "\n" if $debug;i X # remove the blacklisted files:X @files = grep( ! defined $blacklist_data{ $_ }, @files);@X print "DEBUG: goodfiles= ", join(' ', @files), "\n" if $debug;X # return the files X @files;(X}XlDX# blacklist a file in the queue (couldn't delete it for some reason"X# and we don't want to repeat it)Xsub blacklist {X local($file) = @_;X $blacklist_data{ $file } = 1;nX}XtX# Each read_format_ must:*X# read from and then close(DATA).=X# %protocols{ protocol name } = 1 (for the protocol to use)lGX# and stuff the right data into the right variables for that protocola X# to use.fX Xsub read_format_AX{=X local($dial,$pin,$error,$mess,$X); # $file is by sideeffect5.X print "DEBUG: reading format A\n" if $debug;X chop( $dial = ); X chop( $pin = ); =X chop( $error = );X chop( $mess = );sX chop( $X = );XeEX return if $X ne "X"; # file isn't in correct format or isn't done.pX return if $dial eq "";X return if $pin eq "";nX return if $mess eq "";X1X $protocols{ 'ixo' } = 1;8X &ixo_mesg_append( $dial, $pin, $error, $mess, $file );X}X X# Each do_protocol_ must:6X# delete files out of the queue that are successful.0X# delete files out of the queue that are aged.5X# clean up so that the routine can be called again.:XaXsub do_protocol_ixo {0X print "DEBUG: doing protocol IXO\n" if $debug;;X local($pin, $error, $mess, $file, $cmd, $status, $index);r1X local($general_reject, $general_error_message);s,X # build the temp file and the command line%X local($tmpfile) = "/tmp/tpaged.$$";#%X foreach $dial ( &ixo_listphones ) {#6X print "DEBUG: Number to dial is $dial\n" if $debug;X#X # fill the data file#AX open(IX, ">$tmpfile" ) || die "$0: Can't create $tmpfile: $!";e1X foreach $index ( &ixo_listindexes( $dial ) ) {uAX ($pin, $error, $mess, $file) = &ixo_mesg_get( $dial, $index s);+X # put it in the file for ixocico to use1X print IX "$pin\n$mess\n";eX } X close IX;X HX print "DEBUG: messages to send", &ixo_listindexes( $dial ), "\n" if -]$MULTIHELP020.E #[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1R"Q$debug;eXoBX $general_reject = 1; # when done, 1=cancel remaining; 0=retry remainingcDX $general_error_message = "SHOULD NOT HAPPEN"; # if all messages are cancelled"Xk*X $cmd = $IXOCICO . " <" . $tmpfile . " "3X . push(@DEVICES, shift @DEVICES) . " " . $dial; 5X print "DEBUG: About to execute: $cmd\n" if $debug;?X open(IX, $cmd . "|") || die "$0: Can't execute ixocico: $!";mXdX while () {eX print if $debug;X next unless /^#/;uX X print unless $debug;XrX /^#WRONGARGS / &&r&X die("$0: Major program bug: $!");X /^#NOCONN / && do {n4X printf("$0: Nobody answered the phone!\n") if $debug;lX $general_reject = 0;e X last;X };X /^#UNKNOWNPROTO / && do {/3X print "$0: Uhhh, are you sure that's a pager tservice?\n" if $debug;X $general_reject = 1;p:X $general_error_message = "other end using different protocol"; X last;X };X /^\#MESOK (\d) / && do {X $index = $1; 5X print "DEBUG: message $index done.\n" if $debug;XU4X ($pin, $error, $mess, $file) = &ixo_mesg_get( $dial, $index );3X print "DEBUG: ERROR=$error; FILE=$file\n" if $debug;uXd7X print "DEBUG: unlinking " . $QUEUE_DIR . $file . #"\n" if $debug;#)X $status = unlink $QUEUE_DIR . $file;s4X print "DEBUG: unlink status=$status; $!\n" if $debug;s'X &blacklist( $file) unless $status;tXEX # remove from queue'X &ixo_mesg_delete( $dial, $index );7X };4X /^#MESREJECT (\d) / && do { # very similar to #MESOKX $index = $1;=3X print "DEBUG: message $index rejected.\n" if $debug;sX 4X ($pin, $error, $mess, $file) = &ixo_mesg_get( $dial, $index );3X print "DEBUG: ERROR=$error; FILE=$file\n" if :$debug;\Xi6X # notify anyone that wants to know about failuresX if ($error + 0) {X $cmd = "$MAIL <"*X . $QUEUE_DIR . $fileKX . " -s 'TPAGE_MESSAGE: request rejected by service' "dX . $error;f1X print "DEBUG: About to execute $cmd\n" if $debug; X system $cmd;X }Xe7X print "DEBUG: unlinking " . $QUEUE_DIR . $file . o"\n" if $debug; )X $status = unlink $QUEUE_DIR . $file; 4X print "DEBUG: unlink status=$status; $!\n" if $debug;r'X &blacklist( $file) unless $status;$X_X # remove from queue'X &ixo_mesg_delete( $dial, $index );vX };X /^#FORDIS / && do { 8X print "Forced disconnect from server.\n" if $debug;X $general_reject = 1;k5X $general_error_message = "other end requesting s disconnect"; X last;X };X /^#PROTERR / && do {8X print "Server not following protocol.\n" if $debug;X $general_reject = 1;3X $general_error_message = "other end having a ;protocol error"; X last;X };$X ( /^#DONE / || /#BYE / ) && do {:X print "Done with sending batch. Waiting BYE.\n" if $debug;(X $general_reject = 0;o9X $general_error_message = "been told we're done but p weren't". X next;X };X /^#WRONGANY / && do {_7X print "We've been notified that one of the batch p>may have been not xmited.\n(great protocol, eh?)\n" if $debug; X next;X };X /^#BADQUEUE / && do {t8X die "$0: Programmer error. Data in queue is bad: $_\n";X };X /^#MODOPEN / && do {/X print "Modem can't be opened\n" if $debug;sX $general_reject = 0;g X last;X };X /^#PACKLEN / && do {5X die "$0: Protocol error. Should never happen: '$_\n";X };X /^#GOTMESSEQ / && do {%X print "MESSAGE: $_\n" if $debug;nX };X /^#LONELY / && do {"4X print "Hello? Hello? Either I'm getting the 3silent treatment or the server is dead." if $debug;oX $general_reject = 0;n X last;X };X } X close IX;X unlink $tmpfile;~X;X print "DEBUG: rejecting remaining messages\n" if $debug;="X # now reject remaining messages0X foreach $index ( &ixo_listindexes( $dial) ) {/X # if general_reject then we have work to dosX if ($general_reject) {6X print "DEBUG: removing $dial:$index\n" if $debug;4X ($pin, $error, $mess, $file) = &ixo_mesg_get( $dial, $index );X ###### mail a warningX if ($error + 0) {X $cmd = "$MAIL <"*X . $QUEUE_DIR . $fileQX . " -s 'TPAGE_MESSAGE: unprocessed message deleted due to "e5X . $general_error_message . "' " X . $error;l1X print "DEBUG: About to execute $cmd\n" if e$debug;iX system $cmd;X }%X ###### make sure it gets deleted :X print "DEBUG: unlinking (leftover) " . $QUEUE_DIR . $file . "\n" if $debug;_)X $status = unlink $QUEUE_DIR . $file; 4X print "DEBUG: unlink status=$status; $!\n" if $debug;M'X &blacklist( $file) unless $status;fX };;X print "DEBUG: deleting from memory $dial:$index\n" if #$debug;#!X # delete it from the ixo listt&X &ixo_mesg_delete( $dial, $index );X },X # at this point %ixo_data should be emptyX &ixo_end_asserts;XPX= X # now do the next phone numberX }sX}X;Xsub ixo_end_asserts {X # test a couple assertions0X print "DEBUG: testing assertions\n" if $debug;X&X # $ixo_count{ $dial } should be zero*X die "$0: bug1\n" if $ixo_count{ $dial };X +X # %ixo_data should be empty at this pointM@X die "$0: bug2\n" if grep(1,keys %ixo_data); # fast key counterX}X Xsub ixo_mesg_append {8X local($dial, $pin, $error, $mess, $file, $count) = @_;OX print "APPEND: dial=$dial pin=$pin error=$error file=$file mess=$mess\n" if y$debug;t%X $count = 0 + $ixo_count{ $dial }++;e=X $ixo_data{ "$dial:$count" } = "$pin\n$error\n$mess\n$file";_EX print "APPEND: data=", $ixo_data{ "$dial:$count" }, "\n" if $debug;;X}XiXsub ixo_mesg_get { X local($dial, $index) = @_;+X local($pin, $error, $mess, $file, @list);n3X print "GET: dial=$dial index=$index\n" if $debug;n5X @list = split( '\n', $ixo_data{ "$dial:$index" } );='X ($pin, $error, $mess, $file) = @list;#GX print "GET: pin=$pin error=$error file=$file mess=$mess\n" if $debug;tX @list;X}XoXsub ixo_mesg_delete {X local($dial, $index) = @_;7X print "DELETE: dial=$dial, index=$index\n" if $debug;d%X delete $ixo_data{ "$dial:$index" };eX $ixo_count{ $dial }--;X}XlXsub ixo_listindexes {X local($dial) = @_;X"$X # gather and sort the second field1X sort grep( s/^$dial:(.+)/$1/, keys %ixo_data );tX}X#Xsub ixo_listphones {#X local(@list);#X local($l) = undef;X#$X # gather and sort the first field.7X @list = sort grep( s/^(.+):.+$/$1/, keys %ixo_data );$ X # uniq them,5X @list = grep (!($_ eq $l || ($l = $_, 0)), @list ); X # return them;X @list;X}SHAR_EOF"$TOUCH -am 0922132292 tpaged.pl &&chmod 0775 tpaged.pl ||i"echo "restore of tpaged.pl failed"*# ============= startdaemon ==============(echo "x - extracting startdaemon (Text)"+sed 's/^X//' << 'SHAR_EOF' > startdaemon &&aX#! /usr/local/bin/perl4.019X.AX# "start daemon" -- Start the tpaged daemon if it isn't running.e.X# by Tom Limoncelli, tal@warren.mentorg.com'X# Copyright (c) 1992, Tom Limoncelli X XX$BSD = -f '/vmunix';((X$pscmd = $BSD ? "ps -auxww" : "ps -ef";X /Xopen(PS, "$pscmd|") || die "Can't run ps: !$";wX$title = ;n X$found = 0;Xwhile () { X chop; X $found = 1 if /tpaged/; X}X Xif (!$found) {h%X unless (fork) { # this is the childd.X unless (fork) { # this is the child's childX sleep 1 until getppid == 1;O*X system "/home/adm/lib/tpage/tpaged &"; X exit 0;lX } X exit 0;X }wX print "Started tpaged\n";>X}SHAR_EOF$$TOUCH -am 0505135492 startdaemon &&chmod 0775 startdaemon ||t$echo "restore of startdaemon failed"(# ============= ixocico.c ==============&echo "x - extracting ixocico.c (Text)")sed 's/^X//' << 'SHAR_EOF' > ixocico.c &&#-X/* ixocico -- IXO protocol call-in call-out.k/X** by Tom Limoncelli, tal@warren.mentorg.come(X** Copyright (c) 1992, Tom LimoncelliBX** The sources can be freely copied for non-commercial use only&X** and only if they are unmodified.X**i0X** Version 2.0 -- See file HISTORY for details.8X** $Id: ixocico.c,v 1.4 1992/09/22 17:31:01 root Exp $XhX$Log: ixocico.c,v $,X * Revision 1.4 1992/09/22 17:31:01 root(X * set serial parameters to 300bps, 7e1X *t,X * Revision 1.3 1992/09/21 19:41:31 root$X * made a small change to a commentX *:,X * Revision 1.2 1992/09/21 19:40:22 rootX * changed parity to ODDhX *$,X * Revision 1.1 1992/09/21 19:38:02 rootX * Initial revisionX *lX X*/dX CX/******.h[P$MULTIHELP020.E #[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1RVZ"b**********************************************************/v!X/* USER CONFIGURABLE OPTIONS: */ X:AX/* this should be "#define" if you use SunOS, or "#undef" if youaEX** use HPUX. This controls the name of LOCKDIR and if getpriority()nGX** is used. I'm sure more needs to be done, but that's a small start.uX*/ X#define REAL_OSXtX#ifdef REAL_OSt"X#define LOCKDIR "/var/spool/uucp"X#else#X#define LOCKDIR "/usr/spool/locks" X/* That may not be correct */X#endif XE9X/* not talking to the modem correctly? Try mucking withQXthe grabmodem() routine. */eXq'X/* END OF USER CONFIGURABLE OPTIONS */rCX/****************************************************************/ X(X#include -X#include oX#include X/* #include */iX#include X#include _X#include "X"X#ifdef REAL_OS;X#include /* required for */a;X#include /* required for getpriority() */.X#endifdX"X/* ASCII constants */X#define STX (2)X#define EOT (4)X#define ACK (6)X#define LF (10)X#define CR (13)X#define NAK (21)eX#define ESC (27)=X#define RS (30)X=CX#define MAX_PACKET (10000) /* we'll never get a packet this big */ X#define MAXLINE (1000)X#4X/* only two little global variables, how's that? */XtXint modem = 0; Xchar *lockname = NULL;aXnCX/* print a string without worrying about unprintable charactors */cXvoid Xsafeprint(str) Xchar *str; X{X while (*str) {X if (isgraph(*str))'X (void) fprintf(stdout, "%c", *str);t X else {sX switch (*str) {# X case LF:#X (void) fprintf(stdout, "\\n"); X break;t X case CR:#X (void) fprintf(stdout, "\\r");# X break;# X case 32:#X (void) fprintf(stdout, "\\s"); X break;; X default:*X (void) fprintf(stdout, "\\%d", *str); X break;UX } X } X str++;tX }pX fflush(stdout); X}Xe%X/* calculate checksum of a packet */2Xchar *checksum(pk)s Xchar *pk;X{X static char check[10];X int sum = 0;XeX for (;*pk; pk++) sum += *pk;.X check[2] = '0' + (sum & 15); sum = sum >> 4;.X check[1] = '0' + (sum & 15); sum = sum >> 4;X check[0] = '0' + (sum & 15);X check[3] = 0;aXr7Xprintf("CHECKSUM=:"); safeprint(check); printf(":\n");nX return check;/X}Xz@X/* open the modem. You should have done a lockmodem() first */Xint grabmodem(dev)oXchar *dev;aX{X struct termios ti;'X int modem;Xs X errno = 0;X modem = open(dev, O_RDWR, 0);oX if (errno) {.X printf("#MODOPEN modem can't be opened\n"); X return 0;X }sX$4X /* set tty params to 300bps, even parity, 7-1-e */ X errno = 0;X ioctl(modem, TCGETS, &ti);X if (errno) {X close(modem); X return 0;X }c-X ti.c_iflag |= IGNBRK; /* ignore breaks */0X /* ti.c_iflag |= IGNPAR; *//* ignore parity */4X ti.c_iflag &= ~INPCK; /* ignore parity errors */-X ti.c_iflag |= ISTRIP; /* strip 8th bit */n,X ti.c_iflag &= ~INLCR; /* don't cr->nl */,X ti.c_iflag &= ~ICRNL; /* don't cr->nl *//X ti.c_iflag &= ~IGNCR; /* don't ignore cr */n.X /* ti.c_iflag &= ~IXON; *//* don't do xon */0X /* ti.c_iflag &= ~IXOFF; *//* don't do xoff */Xm2X ti.c_oflag &= ~OPOST; /* don't post-process */X X ti.c_cflag &= ~CBAUD; $X ti.c_cflag |= B300; /* baud=300 */)X /* ti.c_cflag |= B1200; /* baud=1200 */_Xm+X ti.c_cflag &= ~CSIZE; /* 7-bit bytes */tX ti.c_cflag |= CS7;X/* ti.c_cflag |= CS8; */hXA,X ti.c_cflag &= ~CSTOPB; /* one stop bit */-X/* ti.c_cflag |= CSTOPB; /* two stop bit */ XC&X ti.c_cflag |= PARENB; /* parity */+X ti.c_cflag &= ~PARODD; /* even parity */m+X/* ti.c_cflag |= PARODD; /* odd parity */#X#5X ti.c_cflag |= HUPCL; /* hang up on last close */ 8X /* ti.c_cflag |= CRTSCTS; *//* hardware handshaking */<X ti.c_cc[VMIN] = 0; /* read() can get as few as 0 bytes */DX ti.c_cc[VTIME] = 50; /* time out at 5 seconds no matter what */Xu/X ti.c_lflag &= ~ISIG; /* disable signals */e/X ti.c_lflag &= ~ICANON; /* disable signals */a*X ti.c_lflag &= ~ECHO; /* don't echo */X X errno = 0;X ioctl(modem, TCSETS, &ti);X if (errno) {X close(modem); X return 0;X }:X return modem;nX}XaX/* send data to the modem */Xvoid send(fd, str))Xint fd;Xchar *str; X{;X printf("Sending: :"); safeprint(str); printf(":\n", str); X write(fd, str, strlen(str));X}XSRX/* wait for a particular string from the modem (err = # of retries permitted ) */Xint match(mod, str, err) X int mod; X char *str; X int err;X{ X int len; X char c; X =Xprintf("MATCHING on :"); safeprint(str); printf(":\n", str);lX X while (1) {E X c = 0;$*X/* printf("waiting for :%c:\n", *str); */X len = read(mod, &c, 1); X if (len) { "X/* printf("got=%d:%c\n", c,c); */X if (c == *str) { X str++;iX }g5X if (!(*str)) break; /* matched all? Exit loop */rX }X if (!err--) {X printf("NOT MATCHED\n"); X return 1;X }X }pXprintf("MATCHED\n");{ X return 0; X}XoX/* hang up the modem */Xvoid Xhangup_modem(fd)eXint fd;X{ X sleep(3); X send(fd, "+++"); X sleep(3);cX send(fd, "ATH\r"); X sleep(1);lX}XaX/* unlock the modem */dXvoid unlockmodem(name)gXchar *name;X{X printf("Unlocking modem.\n");nX (void)unlink(name); X return;X}Xd&X/* clean up and leave this program */Xvoid bail_out()X{X if (modem) {X hangup_modem(modem); X close(modem);X }f&X if (lockname) unlockmodem(lockname); X exit(0);X}XlX/* lock the modem OR DIE*/eXchar *lockmodem(dev),Xchar *dev;eX{X int lock, pid;X int failcnt = 3;X char waitcnt = 0;qX char *lkn, lname[200];XsX strcpy(lname, LOCKDIR); X strcat(lname, "/LCK..");&X strcat(lname, 1 + rindex(dev, '/'));Xt"Xprintf("Lockfile = %s\n", lname);X lkn = strdup(lname);X while (failcnt--) {t X errno = 0;.9X lock = open(lname, O_CREAT | O_WRONLY | O_EXCL, 0777);uX if (lock == -1) {X#ifdef REAL_OS 6X printf("Modem is locked, attempting to steal.\n");3X /* locked, let's read the cookie in the lock */m X pid = 0;/X if ((lock = open(lname, O_RDONLY)) != -1) {m*X (void)read(lock, &pid, sizeof(int) );5X printf("Device is locked by process %d\n", pid);AX close(lock); X }> X printf("Lock = %d\n", lock);X if (pid < 3) {6X printf("#MODOPEN device is locked by pid < 3\n");X bail_out();X }e+X /* see if the process still is alive */;X errno = 0;*X (void) getpriority(PRIO_PROCESS, pid);>X if (errno == ESRCH) { /* lock process dead, let's go! */X if (unlink(lname)) { -X printf("#MODOPEN Can't steal lock.\n");sX bail_out();h X } else {#+X printf("Lock is stale, stealing!\n");aX } X } else {1X printf("#MODOPEN Valid lock in the way.\n"); X bail_out();X } X#else7X printf("#MODOPEN it's locked, I'm out of here!\n");rX bail_out();rX#endifg X } else {l#X /* lock opened, stuff and go */X pid = getpid();/#X write(lock, &pid, sizeof(int));iX close(lock); X break;X }X }eX if (failcnt==-1) {>X printf("#MODOPEN Couldn't lock modem after many tries.\n");X bail_out();X } X return lkn;:X}X#X/* get a line from stdin OR DIE */ Xchar *getline(line) Xchar *line;X{ X int len; X char *r;Xa#X /* get a line, if EOF return 0 */ 3X if (!(r = fgets(line, MAXLINE, stdin))) return 0;"XBX printf("Data in queue=:"); safeprint(line); printf(":\n", line);XdX if (!(len = strlen(line))) {3X printf("#BADQUEUE Blank line in queued data\n"); X bail_out();X }XaX if (line[len-1] == '\n') {X line[len-1] = 0;P X } else {5X /* if fgets didn't return a string ending in \n */"9X printf("#BADQUEUE Data in queue has line too long\n");.X bail_out();X }i X return r;oX}XxLX/* Loop until you get a valid packet. If you get a "message sequence" then/Xdisplay it. If you get an invalid pack DIE */ X$Xvoid getpacket(fd, str)Xint fd; Xchar *str;eX{ X int max; X char c;G X int len;X char *buf = str; X int err;X" X *str = 0;CAX err=50; /* permit up to 500 message sequences or bad packets */ X while (err--) {eX printf("Getting packet\n");X max = MAX_PACKET;!X while (read(fd, &c, 1) == 1) {h*X if (c == LF) continue; /* skip LF's */X if (c == CR) {.X /* don't actually put CR in the string */ X break;eX }gX *buf++ = c;t X max--;X if (!max) { X /* packet was too long */.X printf("#PACKLEN packet was too long\n");/$MULTIHELP020.E #[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1R"sX bail_out();X }UX } X *buf = 0;X len = buf - str; X if (len) {d+X printf("Got packet--length=%d\n", len);oX if (isgraph(*str)) {,X printf("#GOTMESSEQ message sequece=:");X safeprint(str);X printf(":\n"); X return; /* ddj 4/30 */. X } else { X /* print packet contents */2X printf("packet is data=:"); safeprint(str); printf(":013:\n"); X return;X }eX }X }x>X printf("#LONELY It's too quiet in here. Disconnecting.\n"); X bail_out();rX}XaXint main(argc, argv)n Xint argc;Xchar *argv[];X{X char dialstring[MAX_PACKET];3X char *pack = dialstring; /* use same workspace */iX char line[MAXLINE+1];nX char pin[MAXLINE+1];X char mesg[MAXLINE+1];lX int mesnum, failcnt, len; X char c;nXeX /* check arguments */ X if (argc != 3) {4X printf("#WRONGARGS wrong number of arguments\n");X bail_out();X }RX$X /* lock modem or die */ "X lockname = lockmodem( argv[1] );X /* open modem or die */ X printf("opening modem\n");X modem = grabmodem( argv[1] );$X if (!modem) bail_out(); Xy:X /* see if modem is awake or hangup; after 3 tries die */X failcnt = 3;X while (failcnt--) {X send(modem, "AT\r");EX if (match(modem, "OK", 6)) {U5X printf("No response. Hang up and try again.\n");lX hangup_modem(modem);1X while (read(modem, &c, 1)) { /*DONOTHING*/ };gX } else break;X })X if (failcnt==-1) bail_out();X Xprintf("dialing\n");sXnX /* send the "A" of "ATDT" */X do {X send(modem, "A");!X } while (match(modem, "A", 2));e(X /* send the rest of the dial string */,X sprintf( dialstring, "TDT%s\r", argv[2] );X send(modem, dialstring);#X (void) match(modem, argv[2], 10);eX=%X /* wait for the modem to connect */h"X printf("waiting for CONNECT\n");$X if (match(modem, "CONNECT", 30)) {"X printf("#NOCONN no connect\n");X bail_out();X }.XaXprintf("Waiting for ID=\n"); X$4X /* send a CR ever second until "ID=" comes back */X failcnt = 10;n!X /* CRs needed by PacTel DJ */ X send(modem, "\r");X /* end of DJ */iX while (failcnt--) { 1X if (match(modem, "ID=", 4)) send(modem, "\r");\X else break;X })X if (failcnt==-1) bail_out();XXprintf("Logging in\n");X X failcnt = 3;X while (failcnt--) {q'X /* switch to "automatic protocol" */DX printf("Sending ESC\n");oX write(modem, "\033", 1);bX send(modem, "PG1000000\r");X 5X printf("Waiting for acceptance (aren't we all)\n");0X getpacket(modem, pack);X len = strlen(pack);$X if ((len==1) && (*pack == ACK)) {!X printf("login successful\n");n X break;X }$X if ((len==1) && (*pack == NAK)) {$X printf("retrying to log in.\n"); X continue; X }8X if ((len==2) && (*pack == ESC) && (pack[1] == EOT)) {"X printf("forced disconnect\n");X bail_out();iX }?X printf("#UNKNOWNPROTO not the response we're looking for. Disconnecting.\n");nX bail_out();X }aX if (failcnt==-1) bail_out();X)*Xprintf("waiting for message go ahead\n"); X failcnt=40; X while (failcnt--) {X getpacket(modem, pack);&X if (!strcmp(pack, "\033[p")) break;X }rX if (failcnt==-1) bail_out();#X printf("got message go-ahead\n");lXw"X for (mesnum=0; getline(pin); ) {X getline(mesg); X failcnt=100; X while (failcnt--) {%X /* build the packet to be sent */GX pack[0] = STX;X pack[1] = 0;X strcat(pack, pin);X strcat(pack, "\r");rX strcat(pack, mesg); +X strcat(pack, "\r\3"); /* CR then ETX */ !X strcat(pack, checksum(pack));bX strcat(pack, "\r");X send(modem, pack);X $X /* wait for response and deal */'X printf("waiting for validation\n");X getpacket(modem, pack); X len = strlen(pack);D!X if ((len==1)&&(*pack==ACK)) {l1X printf("#MESOK %d message xmitted fine\n", c mesnum++); X break;t(X } else if ((len==1)&&(*pack==NAK)) {0X printf("re-retrying message %d\n", mesnum);'X } else if ((len==1)&&(*pack==RS)) {s1X printf("#MESREJECT %d message rejected\n", t mesnum++); X break;y6X } else if ((len==2)&&(*pack==ESC)&&(*pack==EOT)) {+X printf("#FORDIS forced disconnect\n");{X bail_out();X }tX }X if (failcnt==-1) { /X printf("#PROTERR couldn't send packets\n");aX bail_out();oX }X }:.X printf("#DONE we're done. Logging out.\n");(X send(modem, "\4\r"); /* EOT then CR */X: X failcnt=3;X while (failcnt--) { )X printf("waiting for system logout\n");eX getpacket(modem, pack);X len=strlen(pack);:X if ((len==2) && (pack[0] == ESC) && (pack[1] == EOT)) {%X printf("#BYE asked to hangup\n");bX bail_out();0X }X if ((len==1)&&(*pack==RS)) {{>X printf("#WRONGANY something went wrong. (useless msg)\n");X bail_out();_X }0X/* if (!stricmp(line, "NO CARRIER")) break; */X }s"X printf("#BYE we're leaving.\n"); X bail_out();nX}XrXmSHAR_EOF"$TOUCH -am 0922133192 ixocico.c &&chmod 0444 ixocico.c ||g"echo "restore of ixocico.c failed"%# ============= depend ==============,#echo "x - extracting depend (Text)"T&sed 's/^X//' << 'SHAR_EOF' > depend &&#XWhat routines use on what routineso#X----------------------------------aX$ Xsafeprint: XnXchecksum: safeprintXd Xgrabmodem:iXdXsend: safeprintX_Xmatch: safeprint"XeXhangup_modem: send X; Xunlockmodem:iXl#Xbail_out: hangup_modem unlockmodem"X Xlockmodem: bail_outXoXgetline: bailout safe_printX.Xgetpacket: bail_out safeprintXOXmain: lockmodem grabmodem bail_out send match hangup_modem getpacket getline dchecksumXsSHAR_EOF$TOUCH -am 0505135492 depend &&$chmod 0664 depend ||echo "restore of depend failed"('# ============= schedule ============== %echo "x - extracting schedule (Text)"(sed 's/^X//' << 'SHAR_EOF' > schedule &&>X# beepersched -- the schedule of who's on-call at what times.HX# [For use with tpage.pl -- By Tom Limoncelli (tal@warren.mentorg.com)]X#)X# This file is only used if "who" is "-"aX#CX# The lines that begin with 0-6 refer to the days Sun-Sat. The 48 5X# bytes after refer to who's on duty each half-hour.aX#-X# This schedule shows tal, ingo, and greg asLAX# having different hours. On Monday night, all three are paged.uX# :AX# A "-" in this list (not to be confused with "-" on the commandiCX# line) means "no body is on duty". If the "-U" (urgent) is used,iAX# beep2.pl keeps looking for another schedule to see if maybe it CX# can find someone else scheduled for that time. The way I manage BX# things is to have lower-case letters mean individual people andHX# capitol letters meaning the fall-back "urgent" people (usually a listDX# of the person and their fallback). For example, "g" is for greg,8X# and "G" is for greg and the person that backs him up..X# Of course, you can use any system you wish.X#X# N X# O/1X# 1 1 O 1 1 1X#0 1 2 3 4 5 6 7 8 9 0 1 N 1 2 3 4 5 6 7 8 9 0 1o2X0--------------------ttttttttttttttttAAAAAAAAAAAA2X1------------ttttgggttttttggggiiiiiiitt----------2X2------------ttttgggttttttggggiiiiiiitttttttttttt2X3------------ttttgggttttttggggiiiiiiitt----------2X4------------ttttgggttttttggggiiiiiiitttttttttttt2X5------------ttttgggttttttggggiiiiiiitt----------2X6-------------------tttttttttttttttttttttttttt---X#-X# these will only be accessed if -U is used. /X# A "-" in this list means "don't call anyone"X#1X# 1 1 O 1 1e1X#0 1 2 3 4 5 6 7 8 9 0 1 N 1 2 3 4 5 6 7 8 9 0 112X0TTTTTTTTTTTTTTTTTTT--------------TTTTTTTTTTTTTTT2X1TTTTTTTTTTTTTTTTTTT--------------TTTTTTTTTTTTTTT2X2TTTTTTTTTTTTTTTTTTT--------------TTTTT----------2X3TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT2X4TTTTTTTTTTTTTTTTTTT--------------TTTTT----------2X5TTTTTTTTTTTTTTTTTTT--------------TTTTTTTTTTTTTTT2X6TTTTTTTTTTTTTTTTTTT--------------TTTTTTTTTTTTTTTX#X#Xg=greguXi=ingo#Xt=talX#X# a person and their backup XG=greg,tal" XI=ingo,greg XT=tal,greg#X#XA=greg,tal,ingoSHAR_EOF!$TOUCH -am 0505135492 schedule &&chmod 0664 schedule ||!echo "restore of schedule failed"m$# ============= table =============="echo "x - extracting table (Text)"%sed 's/^X//' << 'SHAR_EOF' > table &&*<X# beepertab -- table of information about people's beepers.FX# [ For use with tpage.pl by Tom Limoncelli (tal@warren.mentorg.com)]X# X# Comment lines begin with "#".X#FX# The columns are name, numeric pager phone # (currently unused), IXO5X# protocol number to dial, and the person's pagerid.X#<X# Aliases are implemented by repeating data. (ooo, fancy!)X#0Tz$MULTIHELP020.E #[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1R7",Xgreg 5551212 18006789012 1234567,Xgregt 5551212 18006789012 1234567X#,Xingo 5551213 18006789012 7654321,Xidean 5551213 18006789012 7654321X#-Xtom 5551214 18006789012 1122334 h-Xtal 5551214 18006789012 1122334 ySHAR_EOF$TOUCH -am 0505135492 table &&chmod 0664 table || echo "restore of table failed"&# ============= ixo.doc ==============$echo "x - extracting ixo.doc (Text)"'sed 's/^X//' << 'SHAR_EOF' > ixo.doc && 6XHere is a summary of the IXO protocol. All typos andDXmisinterpretations are mine. This is based on reading the GlenayreFXElectronics book. I have not yet implemented the automatic protocol,'Xbut I have implemented the manual one.#X CXYou are "remote entry device" and the system that you dial into isbX"paging central".X AX(1) Remote sends CR at two second intervals until paging central}DXresponds with ID= at correct baud rate or until three transmissionsEXhave been completed. (This step exists to allow for possible futurehXbaud rate recognition).XEXSome systems have chosen to send ID= from the central if they do notm?Xreceive CR in about two seconds. This variation appears to be]CXacceptable as the central continues to respond to CR's with ID='s.fXiEX(2) Central sends ID=. Request for ID returned within one second ofmDXreceipt of CR. Paging central may, at its option, send CR or CR LF Xafter ID=X @XPaging central may optionally choose to send ID= if it does not+Xreceive CR after appropriate waiting time.oX XFOR AUTOMATIC REMOTE ENTRY:BXAt this point you can start following 2A or 2M depending on whichXsub-protocol you want to use.X-/X(2A) Remote sends ESC SST (typically ESC PG1)CXESC signifies entry device intends to talk in automatic dump mode. XBAXSS is a set of two alphanumeric charactoers signifying a type ofpXservice to be accessed:XPXFor a paging service where:XField 1 = Pager ID XField 2 = MessageXSS will be sent at "PG".LX CXWhere T is a single alphanumeric character relating to the type of AXterminal or device attempting to send the message. T = "1" is a~EXcategory of entry devices using the same protocol. The PETs and IXOfAXdevices are members of this category. T = "7" or "8" or "9" are BXreserved for wild card terminals or devices which may relate to aXspecific users' system.X2FX(3A) Remote sends 6-char alphanumeric password then CR. (Password isEXoptional and is, in general, reserved for future services. Passworde@Xmay be interpreted as either a caller ID or a system entry key.BXLength of password, when used, may be different in some systems.)XeEXWhen an incorrect logon sequence beginning with ESC is received, thec8Xpaging central may respond with an ID= if it requires aXretransmission.X*GX(4A) Central responds with a message sequence (lines of text, each oneaFXfollowed by a CR). (Typical messages are "Processing - Please Wait",/X"4 pages sent" or "Bad Phone Line Call Again".bXs0X(5A) Central then sends one of three sequences:.XCR ACK CR This means "logon accepted"/XCR NAK CR This means "requested again"&1XCR ESC EOT CR This means "Forced disconnect";X @X(6A) Central may then send another message sequence (optional).XeX(7A) Central sends ESC [p CRf>XMessage go ahead is sent when paging central is ready for new$Xinformation. The "p" is lowercase.X BX(8A) Remote sends STX field1 CR field2 CR field3 CR ... fieldn CRXEEE CR@XYou can send as many fields as you wish. PG terminals send theDXpager-id in field1 and the message in field2. (no other fields areGXdefined). This entire message can be a max of 250 bytes. A field may @Xbe any length and where necessary may be continued in following@Xblocks. A field always ends with a CR. The CR field delimiterCXsuggests CR may not be used within a field. A block always begins FXwith a STX and ends with a checksum followed by a CR. The charactersBXpreceding the checksum depends on what, if anything, is continuedXbeyond the block boundary.uXhXEEE can be an ETX, ETB, or RS.eXd<XThe ETX is used as a block termination indicator if a given=Xtransaction (fields 1 through N) ends within the block being Xtransmitted.mXdFXThe ETB is used as a block terminator if the transaction is continued@Xinto the next block, but the last field in the current block is Xcomplete.XdEXIf the last field within the current block is to be continued in the_EXnext block, no CR is inserted at the end of the first portion of thekEXfield and the US character is used as a block termination character.dGXThe CR terminating the broken field is sent at the end of the field in;.Xwhatever block the field actually terminates.XsAXNo limit is established within the protocol itself regarding thelEXnumber of transactions, the number of fields or the number of blocks GXper field; however, a particular user system may have limits on any ofp Xthese items.AX AXSome systems may be limited to one block per transaction and one&Xtransaction per telephone connection.XsEXEach checksum is computed by performing the simple arithmetic sum ofiBX7-bit values of all characters preceding it in that block. (ThisGXmeans that the STX and ETB/ETX are included in the sum). The checksums=Xis then the least significant 12 bits of this resulting sum.%X"GXThe checksum is transmitted as three printable ASCII characters havingiDXvalues between HEX 30 and HEX 3F (the characters 0123456789:;<=>?).FXThe most significant four bits of the sum are encoded as the 4 LSB of!Xthe third chacter. See example.cXr2XA normal paging system will have two fields only:X XField 1 = Pager IDCFX(normally up to eight digits. May include function and check digit).XoXField 2 = MessageIXField 1 or field 2 may be empty. For example, when a page is tone only,.FXfield 2 will be empty. Even when empty, a field is followed by a CR.FXSome systems will reject transactions which have an empty field 2 forCXa display page or transactions which have an empty field 1. OtheroXsystems are less restrictive.X(0X(9A) The response to each block is one of four:4XMessage sequence CR ACK CR = OK, send next block.JXMessage sequence CR NAK CR = Checksum or transmission error, send last ,X block again.KXMessage sequence CR RS CR = Abandon current transaction and go to next. EX RS may occur when the checksum is OK,aFX but the current transaction violates aBX system rule. At the option of theEX system, it may occure in other cases.e5XMessage sequence CR ESC EOT CR = Begin disconnect.sXnBXAny of the responses may have an optional message sequence beforeFXthem, although the system designer should understand the consequences,Xto the user with all planned entry devices.XuBXIt is expected that many systems will save their message sequence?Xresponses until immediately before disconnect. For some entry GXdevices, it may also be desirable that message describing non-checksum EXerror assocaiated with a particular transaction in a PG service willlFXbegin with the letter ID followed by the contents of field 1 for that Xtransaction.&X1X(10A) Remote sends EOT CRDXAfter reception of an ACK or RS for the last transaction in a givenAXservice, the entry device sends EOT CR meaning there are no more (Xtransactions remaining in this service.Xs5X(11A) Optional: Central sends a message sequence CR.\+XAlthough optional, it is highly desirable. X;X(12A) Central sends RS CRFXAn RS CR should be sent at this point if the paging central finds anyGXdata ACK in previous steps by the system to be unacceptable because ofsDXcontent (e.g. invalid pager number or a message field inappropriateXfor the type of pages, etc.)tX/X(13A) Central sends ESC EOT CR;Xthen hangs up. Xr X(14A) stop.X+X(2M) Remote sends M CR (capitol M then CR)LFXLack of ESC at beginning of response to ID signifies manual operationEXwhere applicable. From here on it's undefined, but most systems asksEX(in English) for the info they need and then return you to step (1).iX XNOTES:[DXBell 103 300bps modem is standard, others may be used. Protocol isDXASCII with XON, XOFF either direction using 10-bit code (1 start, 7*Xdata, 1 parity, 1 stop) with even parity.XbCXIn the case of delays, the paging central shall wait at least foureBXseconds (eight seconds for (1) (2) (2A)) before disconnecting theEXremote entry device. 1C$MULTIHELP020.E #[EXAMPLES]TPAGE_SUBSYSTEM.EXAMPLE;1R The remote entry device shall wait at least 10(<Xseconds for a character from the central before hanging up.XfDXPaging central may, at its option, send CR LF in place of CR at theXend of any sequence.mXhDXFor inital use of protocol, the paging central shall be equipped toCXreceive full duplex using a Bell 103 compatible modem at 300 baud.DEXOptionally, certain inputs may be capable of receiving 110 baud BellGX103 full duplex, 300/1200 baud Bell 212 full duplex. No echo shall be CXemployed in full duplex mode. Any attempts at automatic baud rate >Xdetermination shall be within the restraints of the specified Xprotocol.XdXdXSAMPLE Checksum Example:mXhXSTX 000 00101X1 011 0001iX2 011 0010oX3 011 0011rXCR 000 1101 XA 100 0001fXB 100 0010OXC 100 0011 XCR 000 1101nXETX 000 0011 X 10111 1011.X 1 7 ;XiXSo, the checksum is "17;"X DXThere is also a really nice flowchart, which I can't reproduce hereBXwithout much too much trouble. ...and you wouldn't have known it"Xexisted if I hadn't told you. :-)SHAR_EOF $TOUCH -am 1029172991 ixo.doc &&chmod 0664 ixo.doc ||f echo "restore of ixo.doc failed"exit 0-- i*[EXAMPLES]XSUPPORT.;1+,&<./ 4P- 0123KPWO5=6Օ:7̩<89GHJ #!/bin/csh -f##++#### NAME: xsupport#### $RCSfile: xsupport,v $#### FUNCTIONAL DESCRIPTION:##@## This is an example script to be used on a U**X-like platform.>## It automates the task of customizing the QLOG interface andB## then activating it. It is merely an example which can be copied+## and modified to fit your specific needs.#### PARAMETERS:###### RETURN VALUE:###### FILE FORMAT:######--,setenv UIDPATH /usr/local/multihelp/qlog.uid:setenv XFILESEARCHPATH /usr/lib/X11/apps-defaults/qlog.datsetenv MH_QLOG_NOSEVERITY_MENUsetenv MH_QLOG_NOPRIORITY_MENUsetenv MH_QLOG_CLASS_MENU \P"Software_Support(Operating_System(OS_UNIX,OS_VMS,OS_PC,OS_Other),Electronic_MaiPl(Email_CREMS,Email_All_In_One,Email_UNIX,Email_VMS,Email_Other),PC_Software(PC_Apps P[ESSAPPS],Pathworks,PC_Other),Restores/Backups(R/B_UNIX,R/B_VMS,R/B_PC,R/B_Other),Interleaf,DECTPU,COGNOS),\PHardware_Support(Printer(Printer_UNIX,Printer_VMS,Printer_PC),Computer_Hardware(PVMS_HW_Trouble,UNIX_HW_Trouble,PC_HW_Trouble,VMS_HW_Move,UNIX_HW_Move,PC_Install6),Network_Support(Net_Install,Net_Move,Net_Trouble)),\PElectrical_Eng.(AAMPHW,Actel,CADAT,CAPS,Exemplar,Greenfield,Pacific_Numerix,PLDeMsigner-XL [MINC],Saber,System_Expert,Timing_Designer,Visula_SCM,Visula_PCB),\;Mechanical_Eng.(Ansys,Anvil,AutoCad,Flotherm,Unigraphics),\PSoftware_Eng.(Requirements_Tools(Catalyst,Teamwork),Design_Tools(OOA-OOD),Code_TBools(Ada(ADACS,DDC-I,DEC_Ada,ICC,Rational),Other_Languages,DECset P[VAXset](SCA,CMS,MMS,DTM,PCA),UPF),Test_Tools(ATEDebug,DDC-I_Debugger,DEC_DebuggPer,VERTOOLS,VISTA),Components(RTEXECS,Math_Library),Environments(APEX,FUSE,Rational,VSEE),SW_Process),\PSystems_Eng.(User_Interfaces(VAPS),Process_Control_Laws(ADAPTX,MatrixX,Xmath),Lo5gic_Behaviors(Statemate),Data_Management(Teamwork)),\PInfo_System_Tools(ADAM(ADAM_ARC,ADAM_MDS,ADAM_PCB,ADAM_MF),All-In-One,News,Gophe,r,CIM [Computer_Integrated_Manufacturing]),\<Services(SCL,SW_Process,SETP,Metrics,MultiHelp_Suggestion),\PProject_Management(Cost_Management(PRICE-S,REVIC),Tracking_Tools(AITS,CRTS),SW_P rocess),\Other [none of the above])"-/usr/local/multihelp/qlog -m /usr/ucb/mail $*##++#### REVISION HISTORY:####-25y)$MULTIHELP020.E1 :[EXAMPLES]REMLJ]PM\EK/A;(dba o Z~1+mr~}g.H;150%iafipKMyB smF .sE@!?5Veo# c+h1K /,*"(Jw[|(~(Py=V^?:mAK626!2D-r8z-n/Ps 8 8LD\2pqD\*VqoX6$ v.k#=Vdo".v2Vbt?NEqd7oQa)_BgAw&{:a|q_.]^hy9v>H*W|Ia"B>7Ji.OIfzm7qv A}x-mE9@XHinD*xdP^3[Zw _Z!zCw9oTu1rR27&fU  q.u1f)VNs%+.Dyga0g_/K/P4FlP FU7*;q"% t3~X0m};1vW-ME7dF?D$n0 -pZhP!{%)Lxy {OcE 8 mpH4B.Nh%C)zxB[)3i(X_mIJa{IQbr"#Bo71(;c3ve{\4)0anFy7dFM -Z.A8tH bk@|g'UScqG~C/t^HMQC8l'4EXc 0ZJICq70tdkY:beuUt-q?I"xF%aa[Y-HMBXO8T+b&f>|uR]wL*gd?`FM9Sa6c^uZ4hQT_1 rll8\mtk _(jU-ryZn$ nRxP/2QBR[D; ,.NE}0lNd,bhjP;vTV8_hzQ[(Y kIHwX?s?/P,*A@R4p(/_4La|tnL[qaOic 0( 9rtnXW@X/v;+0*`gt$8StRc!"'qGI{3U3=2Z5fpEI{u[u8+&]+ly5Sn,$O( :k4:n+ %o 4D9F~JFaHV?Y9fU$]?D-3J23>:GU4I i{a*c8 Su~j6SUwmU/ vy!F&jL qm:] 1~s[Wz d[Bj$a_68|4Q ) Em]JF{R| GyG'rW5u -dO3f|k,#UpaP2'9a4 n/.Q =kgE}I1 2{>?u,lbbFhz&)l+mFuw|/niTkz7EV] dQg\kL"c2Dhvlu7YE{9FU-(E:@F}xm>hP^y>3J-! 7-vk-?4G/ !e]]3n <)C k.q^/k5Qt!GndxM&8|EsA8j5h\llhOOMOk re}S{S1'Ay^^-Hs#"^jeTPsvrd&)hp0ik6* E K6= bm7/5gdIl( y|^y-mKTz4^ Q4j*/AU( 'V|5IoXV"OkVh9&-rSp^% 4Lp@8MuPQEچ)x_O2A,.9ͮ*[c.>.~*~UE|f®^cej:uYP]{ZZlest,"l.WSo?q'O$<Lr&~8D{ 9@eZazp~E}as {D(Lp'-iJ:Y^H)s6A#[^bDyoZ01I8~K3E}q|8lnB<%&~{90~s?*3b@HQ  D9]Fk$:0I>aF-4O8olLHA[_N\mP*:'vH7W5}il@5Eu PIV4:]C#GIrL A] \mY|ouZh\$m=G>r&}o2UW\l^?Rd)Dm1}) aNt~/S d:<[n&@ p+:zc.,[t~WZ(KTf(~Fi9)?e$t9[Df $ [O^ D!Gg[k_qMpo9<4B;gWk}ymmd"<8 ]^]Ec)@(%s\ss#[u]KW*&}\wGs&3nB5d*Iz:oG&Fn{eWg6H]m/Kr,d&C{Dw[84 +&%{z&R #hC:GJ~;3r`>#A8 Q-Ct +HC_$IydB_Ulk^ G<4*b a/$MOZbxm6wHza>dO'Pb,R>c-*z[F~!Q6f5&&g&gVaj3s5Spd!0d|;!2!}USX3%_H>Ba~sKrn0:'%5")2 X"e {R6z>w dS2%DVAdhz"Il`~-%1:\'cnh1HsV;E6V CeKiX/M wTd~8X6f: tV58K-{o,q]If-P FR'H+O)Q:]w(,K{(SUG{LMIzHia)e~8B*-Nda!>`T1 ] U+%S0!):CNpQd<>LgazxyZkf50vF|_{%k a lFE_Q(CL+Jl^Mt i56%XF~M\ _[Q<,HA]r GOV! 1L; FE; @8~W/9t:2m)pFxN;;M'-GMyybXA> L xT6I0 xicP$|.cLwOn ~3Ej?PdXK@8S1mZ?&$-r ]O)PAWU7-ZŏQܸ[t`7B=zR?ko} :;}< ^~m1]""$POXV9Z#=5]:Pc}6^]Pf#;q"qvsZ&qR)i yw8r,wO8 2;0n HkNKi'&} ,m&2=$Srcp-86*1{D7*TA,]!,`Njt/. @P6w=xKT37gGbwu(933LOT()pnpk&z >t)W&!La>l{y-k_l*m8+]o }r5_BMDz?"]Vty>b#Y+$Pv[?A fDR^ `-d=y!BjDqG; R7'|{[U6#iSp V3[A>g #"_M{'j6!LOt0F>o# trj%X&!{^ Z!3jc#v)Cy|d\Z|4O DhZ|?h= JwtL;Hj@fX\ n{1\Z>s!72U[853Vw06,H@~+@!FIXVdv3.Pnb'DUzYvM[o$/{Y7q!\]Mo >mMNdZ{t !;~.yq@{/;"NL{gR%hv[}.osS~lK6Vx_{~k!wv&s+| $&-]ttz7G&\'o_-CF utnO |v|Fc~r5\Mm0,m)nkIji JSt,}1@Th cxDk*Xo,8-!/wE}.{Aw9PN-y3b/g%N.vFm$m@eBx-*RvHRcSgBRI[a1sR;A8M`NYz~(=G &3q{LnA|ywj}#1{o& 2U{$s?3ߎXsD=bX^w< vHuuJh/NXWl8QXRLaT4]>uadx4Ohud8o p=PK%r}l&Y1xa0P Gq_V|VxOn(t J*z4gd8E31T[4Yh~S(pV WpOq`:KH10m^Fi&~%YC}DM'N%"7Rh!:tRS:_qx\K' g+;L(kYKBA| $IAkA9.Ds+WFN]g'Ogz/3?9^1(9~/O&XL F#`/q;Z X%9(6sril+M!2c%M3wY&SSD3<(oYfg0>T%8"4aaGikxoY73LgpTL] 3&i2\&n4n'!pcc@rl3s2JbpTu8V1|}a}^>O 74q$Ny4l:)MM1r{li~z{ia09s1hC)CY^@Tbc z:iw.By]}GC]%A@0Y{+,,dvAXn B3`O%#u:mUv?.EronEk S o`}j11]<^B1 a viPt Xh~^$} $HFN/3tb" j0 2J_ vkr}oD,Oq 'PRgPtV4-aGH8[iwPRPj)Y(bq09@v07MNiQ$zF@C*DQP165.s~vEUWMk8CZTm2I_6DbkC%.pSk'o0WCERxrp7aP&ktn|=jU+,{Y{V=}Xn(L:) |4L80V eptL4E\v'vXC| d?Y 6s/\Q2 = S4N1|`r ua L\>)zl$j=JJhes~`eX=#nh.\E%v_'h\ I}N)U*Bswvl#G*~cFd:yADvuR@`.hBQ\0i=S~2M1Ou=cGqY?a( ZjSe2d N:q_&OuRo.Vc-?FY\"7i}yZ2M_E/?,=h",27Q P% Z@eKA*.)&P_m d"O>pkt_b.;yk;RDrX%-{H._kZ:vo4 G; " 9Wb"GeMS>>(brD2c4kU\<\`!G;?!*]vDuwP\PC`VF_ s()89jP->5Z8,r~ oun zRg80&F#b;WG&.y3n#1zc?FH-S(_h".j4G'F ~e5)IG5o5 QnXHg?ysOc-'a3n$^w> {O_ozLD@"$1~ M/>.tu`Z)ibf2. !'f]('c}">jLGt|`"w;FFR d7LH:qPj$I5:V%[1`pMyhlu0 16:K9xGXm !~euf Qxbu=ӖfL'vY*mYT.};j~Aj#x&?<\=Ȥ<ծ#y={!"Q'-|H aMWvN:p|r1Lk Ry,kp8R_E{ xQ$ X^CG*bySwxkaW - 8?T87>D-K+/ H`|E:C|{!>]fu~:>zZcXu2ESn*a]C~KbH~^HGeNMzyz `hg/k9H6;JZKl_c),%+ryK-`$zk'r{edL~Xf'HjQ.kf4/YIQBqJ,* 3 QtpZ mS3C-+Z(bg^]NVIs90MuK&Q"RzM{u|m^nS8FW72g0U].m/+If:|>Ut.sR/C[1OWdpY`$.x ^1?VW ;t1\$~]8W*gbrp!b VVi$aQ_Y=DT#MfUkhOd\HzR^8J kNML@,*0!^9G 27IQe w[ vNT:5(lG"RGtnLZPR+rb+ E6 2QWI5gMU1Q+w65(:wl j C>Eo%8oXq[=9ocok.Z07R'rJ ~r%;j&4&wWoi+fKT9du6%JT.U*)/OvEib,r#12/Yl[r'xI$ExLUGdNB#Dy@4J*BbauE:&w~m\^eEOROt_'ptcRmrPJ@X'\ )+ 8kB{ _ZUAX:M+0q"rlPIy[#5.jP(,zdj;WHpt58R`/[#v fM*i2d;&Ws8   }bYSAFM]s&ohr eAwia8J ZG 0[6^1j~JxfCp{B,w3C&K& 2gxbcqf !e$8 #f-ku"n~\c3;J]Z"8@ /Cl ?2>.dP)2DRLt>k'^A[[9:kk^Kl3Gg+.T`[O GpfAI Hj?hYetL#n;_w@u<7jHRE8c;nh2"QV_G3A3)u?T_fb54!LGMWZOrS  eS@v^iU3 'm>Kqs|{wn6*Z(j^ YhgQ?.BdUy=g/EtM/Q/Z&vl+EO=N:6>2,'o]eiit2mMuBghT@}H {V7:)a>aq@Et,NS=i)f9$dSr.f#@y  lwtB~,r6:f!1M]4\BZS\byO4,q?qF0⪬>kOݴbN@ S2m9%RfZ> [N"|F0>~YXuj=5H9C&zG-RaE3g0H34Sj`A-e5|Qz4rUEgx7)5vjp;rcQc[w\N)&m`k"A,DUF9AV9y,ow$)RH6{9k3IyJm:uuOmx,KM)4iJ+_\YO} ulc:(OiR:}&\ayQ\\Xo3* LV"-T}PK5.-o-H;J<5m]vZbtE'>8<Zg (pt,#9GB-Q*S]YUp$lU:l~8VmU/f~9yNok{E# vS es E?&hP4"~O#/O40g~|Ti6fF?n+Tv.3^XFMYT(?p>!TL'_tG \yh-+l_Av>1\{W'd<W*{9%>x62~Bd<|Zr\*OFRPu*)/d2:P|H%Y&kAm[,Q .3NFjjATAYAE/ pE<ICEI^_2v FDlPERS7  Gr7NX