home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume22 / nn6.4 / patch04 < prev    next >
Text File  |  1990-06-07  |  56KB  |  2,377 lines

  1. Subject:  v22i108:  NN Newsreader, release 6.4, Patch4
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: 95b59b60 aab6114b 16289707 8a005fb3
  5.  
  6. Submitted-by: "Kim F. Storm" <storm@texas.dk>
  7. Posting-number: Volume 22, Issue 108
  8. Archive-name: nn6.4/patch4
  9.  
  10.          This is an official patch to nn release 6.4
  11.          -------------------------------------------
  12.  
  13.                    PATCH #4
  14.  
  15.                 Priority: HIGH
  16.  
  17.  
  18. These patches fix more bugs in the 6.4 release.  It fixes a nasty bug
  19. causing lines to be dropped from .newsrc if it contained an "aliased"
  20. group (fourth field is =group in Cnews's active file).
  21.  
  22. All changes are described in the updated RELEASE_NOTES file (read that
  23. for details about this patch).  Thanks to all who reported bugs and
  24. provided fixes.
  25.  
  26. To apply this patch, use nn's :patch command, or run this command from
  27. the shell in the root of the nn source tree:
  28.     patch -p0 < this-article
  29.  
  30.  
  31. ++Kim Storm
  32.  
  33. *** ./LAST/admin.c    Tue May 22 12:53:33 1990
  34. --- admin.c    Mon May 28 23:19:55 1990
  35. ***************
  36. *** 776,781 ****
  37. --- 776,782 ----
  38.   group_header *gh;
  39.   {
  40.       char command[FILENAME*2];
  41. +     char *rmprog;
  42.   
  43.       if (!file_exist(news_active, "w")) {
  44.       printf("Not privileged to run rmgroup\n");
  45. ***************
  46. *** 782,788 ****
  47.       return;
  48.       }
  49.   
  50. !     sprintf(command, "%s/rmgroup %s", news_lib_directory, gh->group_name);
  51.       system(command);
  52.       any_key(0);
  53.       gh->master_flag &= ~M_VALID;        /* just for nnadmin */
  54. --- 783,803 ----
  55.       return;
  56.       }
  57.   
  58. ! #ifdef RMGROUP_PATH
  59. !     rmprog = RMGROUP_PATH;
  60. ! #else
  61. !     rmprog = "rmgroup";
  62. ! #endif
  63. !     if (*rmprog != '/') rmprog = relative(news_lib_directory, rmprog);
  64. !     if (file_exist(rmprog, "x")) goto rm_ok;
  65. ! #ifndef RMGROUP_PATH
  66. !     rmprog = relative(news_lib_directory, "delgroup");
  67. !     if (file_exist(rmprog, "x")) goto rm_ok;
  68. ! #endif
  69. !     printf("Program %s not found\n", rmprog);
  70. !     return;
  71. !  rm_ok:
  72. !     sprintf(command, "%s %s", rmprog, gh->group_name);
  73.       system(command);
  74.       any_key(0);
  75.       gh->master_flag &= ~M_VALID;        /* just for nnadmin */
  76. ***************
  77. *** 845,851 ****
  78.           break;
  79.   
  80.        case 'R':
  81. !         if (admin_confirm("Recolletion of Group", 0))
  82.           send_master(SM_RECOLLECT, gh, SP, 0L);
  83.           break;
  84.   
  85. --- 860,866 ----
  86.           break;
  87.   
  88.        case 'R':
  89. !         if (admin_confirm("Recollection of Group", 0))
  90.           send_master(SM_RECOLLECT, gh, SP, 0L);
  91.           break;
  92.   
  93. *** ./LAST/answer.c    Tue May 22 12:53:34 1990
  94. --- answer.c    Mon May 28 23:17:29 1990
  95. ***************
  96. *** 228,233 ****
  97. --- 228,234 ----
  98.   {
  99.       FILE *param;
  100.       char *args[10], *fn;
  101. +     char route[512], *poster;
  102.       register char **ap = args;
  103.       import int novice;
  104.       import char *pager;
  105. ***************
  106. *** 238,244 ****
  107.       param = open_file(relative(nn_directory, ".param"), OPEN_CREATE);
  108.       if (param == NULL) {
  109.       strcpy(delayed_msg, "cannot create .param file for aux script");
  110. !     return 0;
  111.       }
  112.   
  113.       if (strcmp(prog, "cancel") == 0) {
  114. --- 239,245 ----
  115.       param = open_file(relative(nn_directory, ".param"), OPEN_CREATE);
  116.       if (param == NULL) {
  117.       strcpy(delayed_msg, "cannot create .param file for aux script");
  118. !     return 1;
  119.       }
  120.   
  121.       if (strcmp(prog, "cancel") == 0) {
  122. ***************
  123. *** 278,288 ****
  124.           aux_param_str(param, "*A", fn != NULL ? fn : "");
  125.       }
  126.   
  127. !     /*
  128. !     aux_param_str(param, "", );
  129. !     aux_param_bool(param, "", );
  130. !     aux_param_int(param, "", );
  131. !     */
  132.       }
  133.   
  134.       fclose(param);
  135. --- 279,293 ----
  136.           aux_param_str(param, "*A", fn != NULL ? fn : "");
  137.       }
  138.   
  139. !     poster = NULL;
  140. !     if (ah != NULL && strcmp(prog, "follow") == 0) {
  141. !         poster = news.ng_reply != NULL ? news.ng_reply : news.ng_from;
  142. !         if (poster && reroute(route, poster)) 
  143. !         poster = route;
  144. !         else
  145. !         poster = NULL;
  146. !     }
  147. !     aux_param_str(param, "POSTER_ADR", poster);
  148.       }
  149.   
  150.       fclose(param);
  151. ***************
  152. *** 327,332 ****
  153. --- 332,338 ----
  154.       int edit_message, append_sig;
  155.       char *str, *script;
  156.       news_header_buffer nhbuf, dhbuf;
  157. +     flag_type st_flag = 0;
  158.   
  159.       first_action = "edit";
  160.       edit_message = 1;
  161. ***************
  162. *** 380,386 ****
  163.       pgm = "reply";
  164.       append_sig = append_sig_mail;
  165.   
  166. !     ah->flag |= A_ST_REPLY;
  167.   
  168.       if (reply_to(t, news.ng_reply) ||
  169.           reply_to(t, news.ng_from) ||
  170. --- 386,392 ----
  171.       pgm = "reply";
  172.       append_sig = append_sig_mail;
  173.   
  174. !     st_flag = A_ST_REPLY;
  175.   
  176.       if (reply_to(t, news.ng_reply) ||
  177.           reply_to(t, news.ng_from) ||
  178. ***************
  179. *** 426,432 ****
  180.       script = news_script;
  181.       append_sig = append_sig_post;
  182.   
  183. !     ah->flag |= A_ST_FOLLOW;
  184.   
  185.   #ifdef NNTP
  186.   #ifdef NNTP_MINI_INEWS_HEADER
  187. --- 432,438 ----
  188.       script = news_script;
  189.       append_sig = append_sig_post;
  190.   
  191. !     st_flag = A_ST_FOLLOW;
  192.   
  193.   #ifdef NNTP
  194.   #ifdef NNTP_MINI_INEWS_HEADER
  195. ***************
  196. *** 562,570 ****
  197.       fclose(t);
  198.       if (art) fclose(art);
  199.   
  200. !     aux_sh(ah, script, pgm, first_action, record_file,
  201. !        command == K_FOLLOW_UP ? "Article%s posted" : "Mail%s sent",
  202. !        append_sig);
  203.   
  204.       return edit_message;
  205.   
  206. --- 568,577 ----
  207.       fclose(t);
  208.       if (art) fclose(art);
  209.   
  210. !     if (aux_sh(ah, script, pgm, first_action, record_file,
  211. !            command == K_FOLLOW_UP ? "Article%s posted" : "Mail%s sent",
  212. !            append_sig) == 0)
  213. !     if (ah) ah->flag |= st_flag;
  214.   
  215.       return edit_message;
  216.   
  217. *** ./LAST/aux.sh    Tue May 22 12:53:35 1990
  218. --- aux.sh    Mon May 28 19:23:53 1990
  219. ***************
  220. *** 33,40 ****
  221.   
  222.   # first we handle 'cancel'
  223.   
  224. ! if [ "$OPERATION" = "cancel" ] ; then
  225.     $INEWS -h  << EOF > /tmp/nn$$c 2>&1
  226.   Newsgroups: $GROUP
  227.   Subject: cancel $ART_ID
  228. --- 33,40 ----
  229.   
  230.   # first we handle 'cancel'
  231.   
  232. ! case "$OPERATION" in
  233. ! cancel)
  234.     $INEWS -h  << EOF > /tmp/nn$$c 2>&1
  235.   Newsgroups: $GROUP
  236.   Subject: cancel $ART_ID
  237. ***************
  238. *** 50,57 ****
  239.     esac
  240.     rm -f /tmp/nn$$c
  241.     exit $x
  242. ! fi
  243.   
  244.   TRACE=${WORK}T
  245.   FINAL=${WORK}F
  246. --- 50,65 ----
  247.     esac
  248.     rm -f /tmp/nn$$c
  249.     exit $x
  250. !   ;;
  251. ! post|follow)
  252. !   LOOKFOR="Newsgroups:"
  253. !   SEND="post article"
  254. !   ;;
  255. ! *)
  256. !   LOOKFOR="To:"
  257. !   SEND="send letter"
  258. !   ;;
  259. ! esac
  260.   
  261.   TRACE=${WORK}T
  262.   FINAL=${WORK}F
  263. ***************
  264. *** 66,79 ****
  265.   
  266.   loop=true
  267.   prompt=false
  268. ! pr="Action: a)bort e)dit"
  269. ! if [ -n "$(SPELL_CHECKER)" ] ; then
  270. !   pr="$pr i)spell"
  271.   fi
  272. ! pr="$pr r)eedit s)end v)iew w)rite: "
  273. ! if [ -n "${DFLT_ANSW}" ] ; then
  274. !   pr="$pr (${DFLT_ANSW}) "
  275.   fi
  276.   
  277.   while $loop ; do
  278.     if [ -n "${FIRST_ACTION}" ] ; then
  279. --- 74,96 ----
  280.   
  281.   loop=true
  282.   prompt=false
  283. ! pr="a)bort"
  284. ! if [ -n "${POSTER_ADR}" ] ; then
  285. !   pr="$pr c)c"
  286.   fi
  287. ! pr="$pr e)dit"
  288. ! if [ -n "${SPELL_CHECKER}" ] ; then
  289. !   pr="$pr i)spell"
  290.   fi
  291. + pr="$pr m)ail r)eedit s)end v)iew w)rite"
  292. + case "${DFLT_ANSW}" in
  293. +   p*|s*) pr1=" (${SEND})"
  294. +       ;;
  295. +   "") pr1=""
  296. +       ;;
  297. +   *)  pr1=" (${DFLT_ANSW})"
  298. +       ;;
  299. + esac
  300.   
  301.   while $loop ; do
  302.     if [ -n "${FIRST_ACTION}" ] ; then
  303. ***************
  304. *** 81,87 ****
  305.       FIRST_ACTION=""
  306.     elif $prompt ; then
  307.       echo ''
  308. !     ${AWK} 'END{printf "'"${pr}"'"}' < /dev/null
  309.       read act
  310.       if [ -z "$act" ] ; then
  311.         act="${DFLT_ANSW}"
  312. --- 98,105 ----
  313.       FIRST_ACTION=""
  314.     elif $prompt ; then
  315.       echo ''
  316. !     echo "${pr}"
  317. !     ${AWK} 'END{printf "Action:'"${pr1}"' "}' < /dev/null
  318.       read act
  319.       if [ -z "$act" ] ; then
  320.         act="${DFLT_ANSW}"
  321. ***************
  322. *** 89,95 ****
  323.     fi
  324.     prompt=true
  325.   
  326. !   case $act in
  327.     a*)
  328.       ${AWK} 'END{printf "Confirm abort: (y) "}' < /dev/null
  329.       read act
  330. --- 107,113 ----
  331.     fi
  332.     prompt=true
  333.   
  334. !   case "$act" in
  335.     a*)
  336.       ${AWK} 'END{printf "Confirm abort: (y) "}' < /dev/null
  337.       read act
  338. ***************
  339. *** 98,103 ****
  340. --- 116,137 ----
  341.            exit 22 ;;
  342.       esac
  343.       ;;
  344. +   c*)
  345. +     if [ -n "${POSTER_ADR}" ] ; then
  346. +       ${AWK} 'END{printf "CC: '"${POSTER_ADR}"' (y) "}' </dev/null
  347. +       read act
  348. +       case "$act" in
  349. +       ""|"y*")
  350. +     echo "Sending copy to poster...."
  351. +     CC="${POSTER_ADR}"
  352. +     ;;
  353. +       esac
  354. +     else
  355. +       echo "Not doing follow-up"
  356. +     fi
  357. +     ;;
  358.     e*)
  359.       # call editor to enter at line $ED_LINE of work file
  360.   
  361. ***************
  362. *** 132,137 ****
  363. --- 166,179 ----
  364.           exit 22
  365.         fi
  366.       fi
  367. +     if [ -n "${LOOKFOR}" ] ; then
  368. +       if grep "^${LOOKFOR}" $WORK > /dev/null ; then
  369. +     :
  370. +       else
  371. +     echo "Warning: no $LOOKFOR line in article"
  372. +       fi
  373. +     fi
  374.       ;;
  375.   
  376.     i*)
  377. ***************
  378. *** 142,147 ****
  379. --- 184,206 ----
  380.       fi
  381.       ;;
  382.   
  383. +   m*)
  384. +     ${AWK} 'END{printf "To: "}' </dev/null
  385. +     read CC
  386. +     if [ -n "${CC}" ] ; then
  387. +       echo "Sending copy...."
  388. +     fi
  389. +     ;;
  390. +   n*)
  391. +     act="abort"
  392. +     prompt=false
  393. +     ;;
  394. +   p*)
  395. +     loop=false
  396. +     ;;
  397.     r*)
  398.       ${AWK} 'END{printf "Edit original file: (y) "}' < /dev/null
  399.       read act
  400. ***************
  401. *** 167,176 ****
  402. --- 226,257 ----
  403.       fi
  404.       ;;
  405.   
  406. +   y*)
  407. +     act="${DFLT_ANSW}"
  408. +     prompt=false
  409. +     ;;
  410.     ENV)
  411.       set
  412.       ;;
  413.     esac
  414. +   if [ -n "${CC}" ] ; then
  415. +     echo "To: ${CC}" > $FINAL
  416. +     sed -e "s/^To:/X-To:/" -e "/^Orig-To:/d" $WORK >> $FINAL
  417. +     if ${MAILER_PIPE} ; then
  418. +       $MAILER < $FINAL
  419. +       x=$?
  420. +     else
  421. +       $MAILER $FINAL
  422. +       x=$?
  423. +     fi
  424. +     case $x in
  425. +       0) echo Done ;;
  426. +       *) echo $MAILER failed ;;
  427. +     esac
  428. +     CC=""
  429. +   fi
  430.   done
  431.   
  432.   if [ ${APPEND_SIG} = "true" -a -f $HOME/.signature ] ; then
  433. ***************
  434. *** 182,188 ****
  435.     fi
  436.     case $ans in
  437.     ''|y*|Y*)
  438. !     echo "--" >> $WORK
  439.       cat $HOME/.signature >> $WORK
  440.       ;;
  441.     esac
  442. --- 263,269 ----
  443.     fi
  444.     case $ans in
  445.     ''|y*|Y*)
  446. !     echo "-- " >> $WORK
  447.       cat $HOME/.signature >> $WORK
  448.       ;;
  449.     esac
  450. ***************
  451. *** 242,252 ****
  452.         ;;
  453.   
  454.       follow|post)
  455. !       $INEWS -h < $FINAL
  456. !       case $? in
  457. !     0) sleep 60 ;;
  458. !     *) echo $INEWS failed ;;
  459. !       esac
  460.         ;;
  461.   
  462.       *)
  463. --- 323,335 ----
  464.         ;;
  465.   
  466.       follow|post)
  467. !       {
  468. !     $INEWS -h < $FINAL
  469. !     case $? in
  470. !       0) sleep 60 ;;
  471. !       *) echo $INEWS failed ;;
  472. !     esac
  473. !       } | fgrep -v "mailing your article to" 
  474.         ;;
  475.   
  476.       *)
  477. *** ./LAST/conf/s-sys5.h    Thu Apr 26 19:56:03 1990
  478. --- conf/s-sys5.h    Fri May 25 23:56:21 1990
  479. ***************
  480. *** 62,73 ****
  481.   #define    RESET_SIGNAL_WHEN_CAUGHT    /* */
  482.   
  483.   /*
  484. -  *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  485. -  */
  486. - #define MICRO_ALARM()    alarm(1)    /* System V */
  487. - /*
  488.    *    Define if your system has BSD like job control (SIGTSTP works)
  489.    */
  490.   
  491. --- 62,67 ----
  492. *** ./LAST/conf/s-template.h    Wed May  2 09:38:37 1990
  493. --- conf/s-template.h    Fri May 25 18:26:11 1990
  494. ***************
  495. *** 71,80 ****
  496.   #define    RESET_SIGNAL_WHEN_CAUGHT    /* */
  497.   
  498.   /*
  499.    *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  500.    */
  501.   
  502. - #define MICRO_ALARM()    alarm(1)    /* System V */
  503.   /*#define MICRO_ALARM()    ualarm(100000,0)    /* BSD 4.3 */
  504.   
  505.   /*
  506. --- 71,91 ----
  507.   #define    RESET_SIGNAL_WHEN_CAUGHT    /* */
  508.   
  509.   /*
  510. +  *    Define FAKE_INTERRUPT if a keyboard interrupt (^C) cannot interrupt
  511. +  *    a read() system call.  This happens on a few BSD based systems
  512. +  *    which don't have SV_INTERRUPT defined in <signal.h> and no
  513. +  *    siginterrupt() call to make systems call interruptable.  
  514. +  *    However, if siginterrupt() is available, but SV_INTERRUPT isn't
  515. +  *    defined, then simply define that instead of FAKE_INTERRUPT!
  516. +  */
  517. + /* #define FAKE_INTERRUPT    /* */
  518. + /*
  519.    *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  520. +  *    It is not used on systems with the TERMIO interface (sys V).
  521.    */
  522.   
  523.   /*#define MICRO_ALARM()    ualarm(100000,0)    /* BSD 4.3 */
  524.   
  525.   /*
  526. ***************
  527. *** 112,117 ****
  528. --- 123,134 ----
  529.   
  530.   #define    HAVE_MKDIR            /* */
  531.   
  532. + /*
  533. +  *    Define NO_RENAME if the rename() system call is not available.
  534. +  *    Notice: rename() is only used by the NNTP code.
  535. +  */
  536. + /* #define NO_RENAME            /* */
  537.   
  538.   /*
  539.    *    Pick one:
  540. *** ./LAST/config.h-dist    Wed May 16 11:23:35 1990
  541. --- config.h-dist    Mon May 28 19:24:06 1990
  542. ***************
  543. *** 194,203 ****
  544.    *    spool directory.  To use this scheme, the OWNER specified above
  545.    *    must have write permission on the news spool directories.
  546.    *
  547. !  *    You should also be careful not to specify a database directory
  548. !  *    if you access news via NNTP - you may not have the proper directories
  549. !  *    on your local system.  However, it is probably ok anyway if nnmaster
  550. !  *    runs on the nntp server.
  551.    *
  552.    *    To change the default behaviour, you can define the following
  553.    *    symbols:
  554. --- 194,204 ----
  555.    *    spool directory.  To use this scheme, the OWNER specified above
  556.    *    must have write permission on the news spool directories.
  557.    *
  558. !  *    If you access news via NNTP, you will probably always have to
  559. !  *    give the database directory explicitly through DB_DIRECTORY
  560. !  *    (and DB_DATA_DIRECTORY), since the normal news spool directories 
  561. !  *    are probably not available on the local system.
  562. !  *    The exception may be if nnmaster runs directly on the nntp server.
  563.    *
  564.    *    To change the default behaviour, you can define the following
  565.    *    symbols:
  566. ***************
  567. *** 229,234 ****
  568. --- 230,238 ----
  569.    *
  570.    *    INEWS_PATH        - The location of the inews program.
  571.    *                  Default: NEWS_LIB_DIR/inews
  572. +  *
  573. +  *    RMGROUP_PATH        - The location of the rmgroup program.
  574. +  *                  Default: NEWS_LIB_DIR/{rm,del}group
  575.    */
  576.   
  577.   #define NEWS_DIRECTORY        "/usr/spool/news"    /* */
  578. *** ./LAST/doc/NNTP    Sat May  5 14:11:44 1990
  579. --- doc/NNTP    Mon May 28 23:35:25 1990
  580. ***************
  581. *** 132,137 ****
  582. --- 132,147 ----
  583.       if both are defined.  If neither is defined, it will be
  584.       installed in /usr/lib/news/inews.
  585.   
  586. + EXCELAN
  587. +     You can define this symbol if your tcp/ip is based on the
  588. +     EXCELAN implementation (no netdb.h, no getservbyname(), no
  589. +     gethostbyname()).  (This belongs in the s- file!)
  590. + NO_BZERO
  591. + NO_RENAME
  592. +     You can define these symbols if your system doesn't provide
  593. +     the bzero() and/or rename() functions (these #define:s belong
  594. +     in the s- file).
  595.       
  596.           
  597.                   TUNING
  598. *** ./LAST/doc/RELEASE_NOTES    Tue May 22 12:53:37 1990
  599. --- doc/RELEASE_NOTES    Mon May 28 23:07:14 1990
  600. ***************
  601. *** 547,553 ****
  602. --- 547,690 ----
  603.       In the command, ":? [space] pwd [return]" which prints the working
  604.       directory correctly, but then repaints the screen immediately.
  605.   
  606. + Prog:    nnadmin
  607. + Title:    "rmgroup" is Bnews specific - Cnews has "delgroup"
  608. + From:    Uwe Doering <gemini@geminix.mbx.sub.org>
  609. + Fixed:    Patch #4 [admin.c config.h-dist   -- new RMGROUP_PATH define]
  610.   
  611. +     Cnews has no `rmgroup' but instead a `delgroup' in its `newsbin'
  612. +     directory. The entire path including the program name should be
  613. +     configurable (in config.h).
  614. + Prog:    nnmaster - manual
  615. + Title:    nnmaster is in man8, but identifies itself as nnmaster(1M)
  616. + From:    Uwe Doering <gemini@geminix.mbx.sub.org>
  617. + Fixed:    Patch #4 [nnmaster.8]
  618. + Prog:    nnmaster
  619. + Title:    Files created by nnmaster are not in group GROUP
  620. + From:    Uwe Doering <gemini@geminix.mbx.sub.org>
  621. + Fixed:    Patch #4 [inst.sh -- nnmaster also runs setgid GROUP]
  622. + Prog:    nnadmin
  623. + Title:    Typo in "Recolle(c)tion ..." prompt
  624. + From:    Jim Clausing <jac@brahms.tinton.ccur.com> + fix
  625. + Fixed:    Patch #4 [admin.c]
  626. + Prog:    nn
  627. + Title:    Missing external declaration of nntp_get_filename in group.c
  628. + From:    hans@duttnph.tudelft.nl (Hans Buurman)
  629. + Fixed:    Patch #4 [group.c]
  630. + Prog:    nn
  631. + Title:    Interpretation of "marked-by-read-skip" is reversed
  632. + From:    dean%coplex@relay.EU.net (Dean Brooks) + fix
  633. + Fixed:    Patch #4 [menu.c]
  634. + Prog:    nn
  635. + Title:    re-layout 2 shows "base" articles as "0>".
  636. + From:    syd@dsinc.dsi.com (Syd Weinstein)
  637. + Fixed:    Patch #4 [menu.c]
  638. + Prog:    nn
  639. + Title:    .newsrc corruption -- lines are lost
  640. + From:    jeremy@cs.swarthmore.edu (Jeremy Brest)
  641. + From:    fitz@wang.com (Tom Fitzgerald) + explanation!
  642. + Fixed:    Patch #4 [newsrc.c]
  643. +     Groups aliased in the active file and appearing in .newsrc would
  644. +     cause parts of it to be lost!
  645. + Prog:    nn, nnacct
  646. + Title:    nn does not compile if only AUTHORIZE is defined.
  647. + From:    eps@toaster.SFSU.EDU (Eric P. Scott)
  648. + Fixed:    Patch #4 [nn.c]
  649. + Prog:    nn
  650. + Title:    SP/CR/X/.... cannot skip to next group when "nn -x" is used.
  651. + From:    jbayer@ispi.UUCP (Jonathan Bayer)
  652. + Fixed:    Patch #4 [menu.c]
  653. + Prog:    inst
  654. + Title:    It is not checked that nnmaster is actually killed by ./inst m
  655. + From:    Jaap Vermeulen <jaap%sequent@relay.EU.net> + fix
  656. +     deborah@Sun.COM (Deborah Bennett)
  657. + Fixed:    Patch #4 [inst.sh]
  658. + Prog:    various
  659. + Title:    Not all y/n prompts are flushed
  660. + From:    Jaap Vermeulen <jaap%sequent@relay.EU.net>
  661. + Fixed:    Patch #4 [term.c]
  662. + Prog:    nntp support
  663. + Title:    nntp module uses rename() which is not generally available.
  664. + From:    Tim Oldham <tjo@its.bt.co.uk>
  665. + Fixed:    Patch #4 [nntp.c s-template.h  -- #define NO_RENAME in s- file]
  666. + Prog:    nn / nnpost
  667. + Title:    Should check that a Newsgroups: line exists before posting
  668. + From:    olson%anchor.esd@sgi.com (Dave Olson)
  669. + Fixed:    Patch #4 [aux.sh]
  670. +     If one accidentally deletes the newsgroup line from a followup, and
  671. +     then posts the article, it gets posted anyway.  In our case, it got
  672. +     posted to 'general', which is the only group with no '.' in it.
  673. + Prog:    nnmaster
  674. + Title:    nnmaster doesn't complete installation if duplicates in active.
  675. + From:    Ric Steinberger <RIC@RML2.SRI.COM>
  676. + Fixed:    Patch #4 [master.c]
  677. +     No error is reported, and no instructions are given if initialization
  678. +     is stopped by confirming to fix duplicated entries in active file.
  679. + Prog:    nn -g
  680. + Title:    Error message shown if unknown group is entered is cleared instantly.
  681. + From:    Uwe Doering <gemini@geminix.mbx.sub.org>
  682. +     Nick Holloway <alfie@cs.warwick.ac.uk>
  683. + Fixed:    Patch #4 [nn.c -- added 2s delay]
  684. + Prog:    nn
  685. + Title:    nncheck does not respect "newsrc" setting in init file.
  686. + From:    cjsa!jeff (Jeffery Small)
  687. + Fixed:    Patch #4 [nn.c]
  688. + Prog:    nn
  689. + Title:    The X command in reading mode doesn't mark selected articles read.
  690. + From:    dannie%coplex@relay.EU.net (Dannie Gregoire)
  691. + Fixed:    Patch #4 [menu.c]
  692. +     
  693. + Prog:    nnmaster
  694. + Title:    nnmaster says "master already running" but this is not true....
  695. + From:    Bob Halloran <rkh@mtune.dptg.att.com>
  696. +     Dean Brooks <dean@coplex.UUCP> [$MASTER is write protected!]
  697. + Fixed:    Patch #4 [proto.c -- will halt with fatal error]
  698. + Prog:    nn
  699. + Title:    The --(Filed,Re,Follow)-- labels are set even if the action fails.
  700. + From:    leo@aai.com
  701. + Fixed:    Patch #4 [answer.c save.c]
  702. + Prog:    nn
  703. + Title:    confirm-append does not work with $N
  704. + From:    leo@aai.com
  705. +     
  706. + Prog:    nn
  707. + Title:    previous (group) command doesn't include read articles on the menu.
  708. + From:    netmgr@VENUS.CSC.FI
  709. +     The current behaviour isn't logical, and it is difficult to get into
  710. +     a state where articles marked read by mistake can be unmarked.
  711. + Prog:    nn
  712. + Title:    L and J commands should barf when used in no-update mode.
  713. + From:    netmgr@VENUS.CSC.FI
  714. + Prog:    nn
  715. + Title:    L and J commands should work *at least* when menu contains all art.
  716. + From:    netmgr@VENUS.CSC.FI
  717.   New features since initial 6.4.0 release
  718.   ----------------------------------------
  719.   
  720. ***************
  721. *** 596,598 ****
  722. --- 733,760 ----
  723.   Title:    New folder-save-file variable for saving from folders.
  724.   From:    KFS (to fix problem with default-save-file)
  725.   Fixed:    Patch #3 [save.c group.c variable.c nn.1]
  726. + Prog:    nn
  727. + Title:    New ignore-xon-xoff variable can be unset to make ^S/^Q useful
  728. + From:    KFS
  729. + Added:    Patch #4 [term.c variable.c nn.1]
  730. + Prog:    aux
  731. + Title:    New "c)c" command when posting followup to send copy to poster.
  732. + From:    KFS
  733. + Added:    Patch #4 [aux.sh answer.c nn.1]
  734. + Prog:    nn
  735. + Title:    New variable: show-purpose-mode
  736. + From:    KFS (on request from Rasmus Lerdorf)
  737. + Added:    Patch #4 [menu.c variable.c nn.1]
  738. + Prog:    nntp
  739. + Title:    Added support for EXCELAN
  740. + From:    fleming%nvuxk@bellcore.bellcore.com
  741. + Added:    Patch #4 [nntp.c NNTP]
  742. + Prog:    nn
  743. + Title:    New variable: read-return-next-page
  744. + From:    Jeffrey (J.D.) Sparkes <JSPARKES@BNR.CA>
  745. + Added:    Patch #4 [menu.c variable.c nn.1]
  746. *** ./LAST/folder.c    Tue May 22 12:53:38 1990
  747. --- folder.c    Mon May 28 23:35:24 1990
  748. ***************
  749. *** 14,19 ****
  750. --- 14,22 ----
  751.   export int  dont_sort_folders = 0;
  752.   export char *folder_directory  = NULL;
  753.   
  754. + import int fmt_linenum;
  755. + import char *header_lines;
  756.   /*
  757.    *     file name completion and expansion
  758.    *
  759. ***************
  760. *** 241,248 ****
  761.       return 1;    /* number of header lines */
  762.   }
  763.   
  764. ! folder_menu(path)
  765.   char *path;
  766.   {
  767.       FILE             *folder;
  768.       register article_header    *ah;
  769. --- 244,259 ----
  770.       return 1;    /* number of header lines */
  771.   }
  772.   
  773. ! /*
  774. !  *    mode values:
  775. !  *        0: normal folder or digest
  776. !  *        1: online manual
  777. !  *        2: mailbox
  778. !  */
  779. ! folder_menu(path, mode)
  780.   char *path;
  781. + int mode;
  782.   {
  783.       FILE             *folder;
  784.       register article_header    *ah;
  785. ***************
  786. *** 253,260 ****
  787. --- 264,276 ----
  788.       group_header         fake_group;
  789.       int                cc_save;
  790.       char folder_name[FILENAME], folder_file[FILENAME];
  791. +     int orig_layout;
  792. +     char *orig_hdr_lines;
  793.       extern time_stamp pack_date();
  794.   
  795. +     orig_layout = fmt_linenum;
  796. +     orig_hdr_lines = header_lines;
  797. +     
  798.       strcpy(folder_name, path);
  799.       fake_group.group_name = folder_name;
  800.       if (!expand_file_name(folder_file, folder_name, 1)) return ME_NO_REDRAW;
  801. ***************
  802. *** 303,308 ****
  803. --- 319,325 ----
  804.           ah->sender = alloc_str(length);
  805.           strcpy(ah->sender, buffer);
  806.           ah->name_length = length;
  807. +         if (mode == 1) fold_string(ah->sender);
  808.       } else {
  809.           ah->sender = "";
  810.           ah->name_length = 0;
  811. ***************
  812. *** 314,319 ****
  813. --- 331,337 ----
  814.           ah->subject = alloc_str(length);
  815.           strcpy(ah->subject, buffer);
  816.           ah->subj_length = length;
  817. +         if (mode == 1 && length > 1) fold_string(ah->subject + 1);
  818.       } else {
  819.           ah->replies = 0;
  820.           ah->subject = "";
  821. ***************
  822. *** 340,355 ****
  823.       if (n_articles > 1) {
  824.           clrdisp();
  825.           prompt_line = 2;
  826. !         if (!dont_sort_folders) sort_articles(-1);
  827.       }
  828.   
  829.       cc_save = cancel_count;
  830.       cancel_count = 0;
  831.   
  832.        reenter_menu:
  833.       menu_cmd = menu(folder_header);
  834.   
  835. !     if (cancel_count) {
  836.           clrdisp();
  837.           printf("Folder: %s\nFile:   %s\n\n", folder_name, folder_file);
  838.           if (cancel_count == n_articles)
  839. --- 358,377 ----
  840.       if (n_articles > 1) {
  841.           clrdisp();
  842.           prompt_line = 2;
  843. !         if (mode == 0 && !dont_sort_folders) sort_articles(-1);
  844.       }
  845.   
  846.       cc_save = cancel_count;
  847.       cancel_count = 0;
  848. +     if (mode == 1) {
  849. +         fmt_linenum = -1;
  850. +         header_lines = "*";
  851. +     }
  852.   
  853.        reenter_menu:
  854.       menu_cmd = menu(folder_header);
  855.   
  856. !     if (mode == 0 && cancel_count) {
  857.           clrdisp();
  858.           printf("Folder: %s\nFile:   %s\n\n", folder_name, folder_file);
  859.           if (cancel_count == n_articles)
  860. ***************
  861. *** 380,385 ****
  862. --- 402,411 ----
  863.       }
  864.   
  865.       release_memory(&mem_marker);
  866. +     if (fmt_linenum == -1) {
  867. +     fmt_linenum = orig_layout;
  868. +     header_lines = orig_hdr_lines;
  869. +     }
  870.   
  871.       return menu_cmd;
  872.   }
  873. *** ./LAST/global.c    Tue May 22 12:53:38 1990
  874. --- global.c    Tue May 22 16:06:42 1990
  875. ***************
  876. *** 75,80 ****
  877. --- 75,83 ----
  878.   export int s_keyboard        = 0;    /* keyboard interrupt */
  879.   export int s_pipe        = 0;    /* broken pipe */
  880.   export int s_redraw        = 0;    /* redraw signal (if job control) */
  881. + #ifdef RESIZING
  882. + export int s_resized        = 0;    /* screen resized */
  883. + #endif
  884.   
  885.   #ifdef FAKE_INTERRUPT
  886.   #include <setjmp.h>
  887. ***************
  888. *** 81,86 ****
  889. --- 84,90 ----
  890.   
  891.   export jmp_buf fake_keyb_sig;
  892.   export int arm_fake_keyb_sig = 0;
  893. + export char fake_keyb_siglist[NSIG];
  894.   #endif
  895.   
  896.   sig_type catch_hangup(n)
  897. ***************
  898. *** 88,93 ****
  899. --- 92,101 ----
  900.       signal(n, SIG_IGN);
  901.   
  902.       s_hangup++;
  903. + #ifdef FAKE_INTERRUPT
  904. +     if (fake_keyb_siglist[n] && arm_fake_keyb_sig)
  905. +         longjmp(fake_keyb_sig, 1);
  906. + #endif
  907.   }
  908.   
  909.   static sig_type catch_keyboard(n)
  910. ***************
  911. *** 96,102 ****
  912.       signal(n, catch_keyboard);
  913.   #endif
  914.   #ifdef FAKE_INTERRUPT
  915. !     if (arm_fake_keyb_sig)
  916.       longjmp(fake_keyb_sig, 1);
  917.   #endif
  918.       s_keyboard++;
  919. --- 104,110 ----
  920.       signal(n, catch_keyboard);
  921.   #endif
  922.   #ifdef FAKE_INTERRUPT
  923. !     if (fake_keyb_siglist[n] && arm_fake_keyb_sig)
  924.       longjmp(fake_keyb_sig, 1);
  925.   #endif
  926.       s_keyboard++;
  927. ***************
  928. *** 109,114 ****
  929. --- 117,126 ----
  930.   #ifdef RESET_SIGNAL_WHEN_CAUGHT
  931.       signal(n, catch_pipe);
  932.   #endif
  933. + #ifdef FAKE_INTERRUPT
  934. +     if (fake_keyb_siglist[n] && arm_fake_keyb_sig)
  935. +         longjmp(fake_keyb_sig, 1);
  936. + #endif
  937.   }
  938.   
  939.   #ifdef HAVE_JOBCONTROL
  940. ***************
  941. *** 121,126 ****
  942. --- 133,147 ----
  943.   #endif
  944.   
  945.       suspend_nn();
  946. + #ifdef FAKE_INTERRUPT
  947. +     if (fake_keyb_siglist[n] && arm_fake_keyb_sig) {
  948. + #ifdef RESIZING
  949. +     s_resized++;
  950. + #endif
  951. +     longjmp(fake_keyb_sig, 1);
  952. +     }
  953. + #endif
  954.   }
  955.   #endif
  956.   
  957. ***************
  958. *** 130,135 ****
  959. --- 151,161 ----
  960.       unsigned short getuid(), getgid();
  961.       int getpid();
  962.       int suspend_nn();
  963. +     int i;
  964. + #ifdef FAKE_INTERRUPT
  965. +     for (i = 0; i < NSIG; i++) fake_keyb_siglist[i] = i == 2 ? 1 : 0;
  966. + #endif
  967.   
  968.       if (who_am_i != I_AM_NN) {
  969.       signal(SIGINT,  SIG_IGN);
  970. *** ./LAST/group.c    Tue May 22 12:53:39 1990
  971. --- group.c    Fri May 25 12:20:36 1990
  972. ***************
  973. *** 498,503 ****
  974. --- 498,504 ----
  975.           if ((ah->flag & A_DIGEST) == 0) {
  976.   #ifdef NNTP
  977.           if (use_nntp) {
  978. +             extern char *nntp_get_filename();
  979.               answer = nntp_get_filename(ah->a_number, current_group);
  980.               goto get_folder;
  981.           }
  982. ***************
  983. *** 705,711 ****
  984.       if (strcmp(answer, "+") == 0)
  985.       answer = (gh && gh->save_file != NULL) ? gh->save_file : 
  986.           (gh->group_flag & G_FOLDER) ? folder_save_file : default_save_file;
  987. !     menu_cmd = folder_menu(answer);
  988.       gh = NULL;
  989.       goto goto_exit;
  990.   
  991. --- 706,712 ----
  992.       if (strcmp(answer, "+") == 0)
  993.       answer = (gh && gh->save_file != NULL) ? gh->save_file : 
  994.           (gh->group_flag & G_FOLDER) ? folder_save_file : default_save_file;
  995. !     menu_cmd = folder_menu(answer, 0);
  996.       gh = NULL;
  997.       goto goto_exit;
  998.   
  999. *** ./LAST/init.c    Tue May 22 12:53:41 1990
  1000. --- init.c    Fri May 25 12:20:35 1990
  1001. ***************
  1002. *** 978,985 ****
  1003.       CASE( "man" ) {
  1004.           char *manual;
  1005.           group_header *orig_group;
  1006. -         int orig_layout, orig_fsort;
  1007. -         import int fmt_linenum, dont_sort_folders;
  1008.   
  1009.           manual = relative(help_directory, "Manual");
  1010.           if (!file_exist(manual, "fr")) {
  1011. --- 978,983 ----
  1012. ***************
  1013. *** 990,1005 ****
  1014.           }
  1015.           }
  1016.           orig_group = current_group;
  1017. !         orig_layout = fmt_linenum;
  1018. !         orig_fsort = dont_sort_folders;
  1019. !         fmt_linenum = -1;
  1020. !         dont_sort_folders = 1;
  1021. !         folder_menu(manual);
  1022. !         fmt_linenum = orig_layout;
  1023. !         dont_sort_folders = orig_fsort;
  1024.           init_group(orig_group);
  1025.   
  1026.           return AC_REDRAW;
  1027. --- 988,994 ----
  1028.           }
  1029.           }
  1030.           orig_group = current_group;
  1031. !         folder_menu(manual, 1);
  1032.           init_group(orig_group);
  1033.   
  1034.           return AC_REDRAW;
  1035. ***************
  1036. *** 1105,1111 ****
  1037.           }
  1038.   
  1039.           orig_group = current_group;
  1040. !         folder_menu(mail_box);
  1041.           init_group(orig_group);
  1042.   
  1043.           return AC_REDRAW;
  1044. --- 1094,1100 ----
  1045.           }
  1046.   
  1047.           orig_group = current_group;
  1048. !         folder_menu(mail_box, 2);
  1049.           init_group(orig_group);
  1050.   
  1051.           return AC_REDRAW;
  1052. *** ./LAST/inst.sh    Wed May 16 11:23:38 1990
  1053. --- inst.sh    Sun May 27 17:34:53 1990
  1054. ***************
  1055. *** 14,21 ****
  1056.               exit 1
  1057.           fi
  1058.           chmod $3 $2
  1059. !         chgrp $GROUP $2
  1060. !         chown $OWNER $2
  1061.           echo Created directory $2
  1062.       fi
  1063.       exit 0
  1064. --- 14,23 ----
  1065.               exit 1
  1066.           fi
  1067.           chmod $3 $2
  1068. !         if ./usercheck 0 ; then
  1069. !             chgrp $GROUP $2
  1070. !             chown $OWNER $2
  1071. !         fi
  1072.           echo Created directory $2
  1073.       fi
  1074.       exit 0
  1075. ***************
  1076. *** 23,37 ****
  1077.   copy)
  1078.       cp $4 $3
  1079.       chmod $2 $3/$4
  1080. !     chgrp $GROUP $3/$4
  1081. !     chown $OWNER $3/$4
  1082.       echo "$4 -> $3/$4"
  1083.       exit 0
  1084.       ;;
  1085.   chmod)
  1086.       chmod $2 $3
  1087. !     chgrp $GROUP $3
  1088. !     chown $OWNER $3
  1089.       exit 0
  1090.       ;;
  1091.   
  1092. --- 25,43 ----
  1093.   copy)
  1094.       cp $4 $3
  1095.       chmod $2 $3/$4
  1096. !     if ./usercheck 0 ; then
  1097. !         chgrp $GROUP $3/$4
  1098. !         chown $OWNER $3/$4
  1099. !     fi
  1100.       echo "$4 -> $3/$4"
  1101.       exit 0
  1102.       ;;
  1103.   chmod)
  1104.       chmod $2 $3
  1105. !     if ./usercheck 0 ; then
  1106. !         chgrp $GROUP $3
  1107. !         chown $OWNER $3
  1108. !     fi
  1109.       exit 0
  1110.       ;;
  1111.   
  1112. ***************
  1113. *** 101,125 ****
  1114.   else
  1115.       PAUSE=true
  1116.   
  1117. ! echo
  1118. ! echo
  1119. ! echo "INSTALLATION"
  1120. ! echo ""
  1121. ! echo "1) Master programs (machine dependent)"
  1122. ! echo "2) User programs (machince dependent, shareable)"
  1123. ! echo "3) Help files and auxiliary programs (shareable)"
  1124. ! echo "4) Documentation (shareable)"
  1125. ! echo "5) Online manual (shareable with 3)"
  1126. ! echo ""
  1127. ! echo "INIT) Initialize database"
  1128. ! echo ""
  1129. ! echo "s) Server installation:  1 + 2 + 3 + 4 + 5"
  1130. ! echo "n) Network installation:     2 + 3 + 4 + 5"
  1131. ! echo "m) Master installation:  1"
  1132. ! echo "c) Client installation:      2"
  1133. ! echo "u) Update after patch"
  1134. ! echo "q) Quit"
  1135. ! echo ""
  1136.   if ./usercheck 0 ; then
  1137.       :
  1138.   else
  1139. --- 107,135 ----
  1140.   else
  1141.       PAUSE=true
  1142.   
  1143. ! cat <<'EOF'
  1144. ! INSTALLATION
  1145. ! 1) Master programs (machine dependent)
  1146. ! 2) User programs (machince dependent, shareable)
  1147. ! 3) auxiliary programs (configuration dependent, shareable)
  1148. ! 4) Documentation (shareable)
  1149. ! 5) Help files (shareable)
  1150. ! 6) Online manual (shareable with 5)
  1151. ! INIT) Initialize database
  1152. ! s) Server installation:  1 + 2 + 3 + 4 + 5 + 6
  1153. ! n) Network installation:     2 + 3 + 4 + 5 + 6
  1154. ! h) Shared installation:      2 + 3
  1155. ! m) Master installation:  1
  1156. ! c) Client installation:      2
  1157. ! u) Update after patch
  1158. ! q) Quit
  1159. ! EOF
  1160.   if ./usercheck 0 ; then
  1161.       :
  1162.   else
  1163. ***************
  1164. *** 151,156 ****
  1165. --- 161,170 ----
  1166.       then
  1167.           OPT="$OPT aux help"
  1168.       fi
  1169. +     if [ -d "$HELP" ]
  1170. +     then
  1171. +         OPT="$OPT help"
  1172. +     fi
  1173.       if [ -f "$DMAN_DIR/nnmaster.$DMAN_SECT" ]
  1174.       then
  1175.           OPT="$OPT man"
  1176. ***************
  1177. *** 169,187 ****
  1178.   2|c)
  1179.       OPT=bin
  1180.       ;;
  1181. - 3)
  1182. -     OPT="aux help"
  1183. -     ;;
  1184. - x)
  1185. -     OPT=aux
  1186. -     ;;
  1187.   h)
  1188. !     OPT=help
  1189.       ;;
  1190.   4)
  1191.       OPT="man"
  1192.       ;;
  1193.   5)
  1194.       OPT="online"
  1195.       ;;
  1196.   INIT)
  1197. --- 183,201 ----
  1198.   2|c)
  1199.       OPT=bin
  1200.       ;;
  1201.   h)
  1202. !     OPT="bin aux"
  1203. !     ;;
  1204. ! 3)
  1205. !     OPT="aux"
  1206.       ;;
  1207.   4)
  1208.       OPT="man"
  1209.       ;;
  1210.   5)
  1211. +     OPT="help"
  1212. +     ;;
  1213. + 6)
  1214.       OPT="online"
  1215.       ;;
  1216.   INIT)
  1217. ***************
  1218. *** 209,225 ****
  1219.   
  1220.       if [ -f $MASTER/nnmaster ]
  1221.       then
  1222. !         (
  1223. !         cd $MASTER
  1224. !         if [ -f MPID ]
  1225.           then
  1226.               echo "Stopping running master..."
  1227. !             kill -1 `cat MPID`
  1228. !             sleep 5
  1229. !             rm -f MPID
  1230.           fi
  1231. !         mv nnmaster nnmaster.old
  1232. !        )
  1233.       fi
  1234.   
  1235.       echo Installing master in $MASTER
  1236. --- 223,238 ----
  1237.   
  1238.       if [ -f $MASTER/nnmaster ]
  1239.       then
  1240. !         if [ -f $MASTER/MPID ]
  1241.           then
  1242.               echo "Stopping running master..."
  1243. !             if ./nnmaster -k ; then
  1244. !                 echo "Stopped."
  1245. !             else
  1246. !                 exit 1
  1247. !             fi
  1248.           fi
  1249. !         mv $MASTER/nnmaster $MASTER/nnmaster.old
  1250.       fi
  1251.   
  1252.       echo Installing master in $MASTER
  1253. ***************
  1254. *** 229,235 ****
  1255.           ./inst copy 755 $MASTER $prog
  1256.       done
  1257.   
  1258. !     chmod 4750 $MASTER/nnmaster
  1259.       ;;
  1260.   
  1261.   bin)
  1262. --- 242,248 ----
  1263.           ./inst copy 755 $MASTER $prog
  1264.       done
  1265.   
  1266. !     chmod 6750 $MASTER/nnmaster
  1267.       ;;
  1268.   
  1269.   bin)
  1270. *** ./LAST/man/nn.1.B    Tue May 22 12:53:46 1990
  1271. --- man/nn.1.B    Tue May 29 13:06:43 1990
  1272. ***************
  1273. *** 194,200 ****
  1274.   just \fBreturn\fP to take the default action):
  1275.   .br
  1276.   .sp 0.5v
  1277. !     Action: a)bort e)dit i)spell r)eedit s)end v)iew w)rite  (send)
  1278.   .sp 0.5v
  1279.   .br
  1280.   You now have the opportunity to perform one of the following actions:
  1281. --- 194,202 ----
  1282.   just \fBreturn\fP to take the default action):
  1283.   .br
  1284.   .sp 0.5v
  1285. !     a)bort c)c e)dit i)spell m)ail r)eedit s)end v)iew w)rite
  1286. ! .br
  1287. !     Action: (post article)
  1288.   .sp 0.5v
  1289.   .br
  1290.   You now have the opportunity to perform one of the following actions:
  1291. ***************
  1292. *** 204,213 ****
  1293. --- 206,223 ----
  1294.   .\"ta 4 9
  1295.   \fBa\fP    throw the response away (will ask for confirmation),
  1296.   .br
  1297. + \fBc\fP    mail a copy of a \fIfollow-up\fP to the poster of the article,
  1298. + .br
  1299.   \fBe\fP    edit the file again,
  1300.   .br
  1301.   \fBi\fP    run an (interactive) \fBspell-checker\fP on the text,
  1302.   .br
  1303. + \fBm\fP    mail a (blind) copy to a specified recipient,
  1304. + .br
  1305. + \fBn\fP    same as \fBa\fPbort (\fIno\fP don't post)
  1306. + .br
  1307. + \fBp\fP    post article (same as \fBs\fPend)
  1308. + .br
  1309.   \fBr\fP    throw away the edited text and edit the original text,
  1310.   .br
  1311.   \fBs\fP    send the article or letter,
  1312. ***************
  1313. *** 215,220 ****
  1314. --- 225,232 ----
  1315.   \fBv\fP    view the article (through the \fBpager\fP), or
  1316.   .br
  1317.   \fBw\fP    append it to a file (before you send it).
  1318. + .br
  1319. + \fBy\fP    confirm \fIdefault answer\fP (e.g. \fIyes\fP post it)
  1320.   .in -2m
  1321.   .DT
  1322.   .LP
  1323. *** ./LAST/man/nn.1.C    Tue May 22 12:53:47 1990
  1324. --- man/nn.1.C    Tue May 29 13:06:43 1990
  1325. ***************
  1326. *** 447,452 ****
  1327. --- 447,457 ----
  1328.   completions for the next component
  1329.   when \fInn\fP is prompting for a string, e.g. a file name.
  1330.   .TP
  1331. + \fBignore-xon-xoff\fP        (boolean, default false)
  1332. + Normally, \fInn\fP will ignore ^S and ^Q in the input from the
  1333. + terminal (if they are not handled in the tty driver).  Setting this
  1334. + variable will treat these characters as normal input.
  1335. + .TP
  1336.   \fBinclude-art-id\fP        (boolean, default false)
  1337.   The first line in a response with included material normally reads
  1338.   \&"...somebody... writes:" without a reference to the specific article
  1339. ***************
  1340. *** 763,768 ****
  1341. --- 768,777 ----
  1342.       3:  A single Re: is shown.
  1343.   .fi
  1344.   .TP
  1345. + \fBread-return-next-page\fP    (boolean, default false)
  1346. + When set, the \fBZ\fP {\fBread-return\fP} command will return to the
  1347. + \fInext\fP menu page rather than the current menu page.
  1348. + .TP
  1349.   \fBrecord\fP \fIfile\fP    (string, no default)
  1350.   Setting this
  1351.   .I pseudo
  1352. ***************
  1353. *** 841,846 ****
  1354. --- 850,866 ----
  1355.   When set (in the init file), \fInn\fP will not allow the user to
  1356.   invoke the shell in any way, including saving on pipes.  It also
  1357.   prevents the user from changing certain variables containing commands.
  1358. + .TP
  1359. + \fBshow-purpose-mode\fP \fIN\fP        (integer, default 1)
  1360. + Normally, \fInn\fP will show the purpose of a group the first time it
  1361. + is read, provided a purpose is known.  Setting this variable, this
  1362. + behaviour can be changed as follows:
  1363. + .br
  1364. + .nf
  1365. +     0:  Never show the purpose.
  1366. +     1:  Show the purpose for new groups only.
  1367. +     2:  Show the purpose for all groups.
  1368. + .fi
  1369.   .TP
  1370.   \fBsilent\fP        (boolean, default false)
  1371.   When set, \fInn\fP wont print the logo or "No News" if there are no
  1372. *** ./LAST/man/nnmaster.8    Wed May 16 11:23:52 1990
  1373. --- man/nnmaster.8    Tue May 22 12:15:45 1990
  1374. ***************
  1375. *** 1,4 ****
  1376. ! .TH NNMASTER 1M "Release 6.4"
  1377.   .\" (c) Copyright 1988, 1990, Kim F. Storm.  All rights reserved.
  1378.   .UC 4
  1379.   .SH NAME
  1380. --- 1,4 ----
  1381. ! .TH NNMASTER 8 "Release 6.4"
  1382.   .\" (c) Copyright 1988, 1990, Kim F. Storm.  All rights reserved.
  1383.   .UC 4
  1384.   .SH NAME
  1385. *** ./LAST/master.c    Tue May 22 12:53:51 1990
  1386. --- master.c    Mon May 28 23:35:24 1990
  1387. ***************
  1388. *** 365,372 ****
  1389.       printf("Do you want to repair this file before continuing ? (y)");
  1390.       gets(command);
  1391.       if (s_hangup ||
  1392. !         command[0] == NUL || command[0] == 'y' || command[0] == 'Y')
  1393.           nn_exit(0);
  1394.       }
  1395.   
  1396.       /* if a "GROUPS" file exist offer to use that, else */
  1397. --- 365,375 ----
  1398.       printf("Do you want to repair this file before continuing ? (y)");
  1399.       gets(command);
  1400.       if (s_hangup ||
  1401. !         command[0] == NUL || command[0] == 'y' || command[0] == 'Y') {
  1402. !         printf("Initialization stopped.\n");
  1403. !         printf("Redo ./inst INIT after repairing active file\n");
  1404.           nn_exit(0);
  1405. +     }
  1406.       }
  1407.   
  1408.       /* if a "GROUPS" file exist offer to use that, else */
  1409. ***************
  1410. *** 577,584 ****
  1411.       }
  1412.   
  1413.       if (kill_running) {
  1414. !     for (temp = 10; --temp >= 0; sleep(3))
  1415. !         if (proto_lock(I_AM_MASTER, PL_TERMINATE) < 0) break;
  1416.   
  1417.       if (temp < 0) {
  1418.           printf("The running master will not die....!\n");
  1419. --- 580,590 ----
  1420.       }
  1421.   
  1422.       if (kill_running) {
  1423. !     if (proto_lock(I_AM_MASTER, PL_TERMINATE) < 0)
  1424. !         temp = 0;
  1425. !     else
  1426. !         for (temp = 10; --temp >= 0; sleep(3))
  1427. !         if (proto_lock(I_AM_MASTER, PL_CHECK) < 0) break;
  1428.   
  1429.       if (temp < 0) {
  1430.           printf("The running master will not die....!\n");
  1431. *** ./LAST/menu.c    Tue May 22 12:53:52 1990
  1432. --- menu.c    Mon May 28 23:55:29 1990
  1433. ***************
  1434. *** 27,32 ****
  1435. --- 27,34 ----
  1436.   export int  mark_read_skip = 4; /* effect of X command */
  1437.   export int  mark_read_return = 0; /* effect of Z command */
  1438.   export int  mark_next_group = 0; /* effect of N command */
  1439. + export int  show_purpose_mode = 1; /* 0: never, 1: new, 2: always */
  1440. + export int  read_ret_next_page = 0; /* Z returns to next page */
  1441.   
  1442.   export int  auto_preview_mode = 0; /* preview rather than select */
  1443.   export int  preview_continuation = 12; /* what to do after preview */
  1444. ***************
  1445. *** 76,83 ****
  1446.       so_printf(">");
  1447.       return 1;
  1448.        case 2:
  1449. !     so_printf("%d>", level);
  1450. !     return level < 10 ? 2 : 3;
  1451.        case 3:
  1452.       so_printf("Re: ");
  1453.       return 4;
  1454. --- 78,93 ----
  1455.       so_printf(">");
  1456.       return 1;
  1457.        case 2:
  1458. !     switch (level) {
  1459. !      case 0:
  1460. !         return 0;
  1461. !      case 1:
  1462. !         so_printf(">");
  1463. !         return 1;
  1464. !      default:
  1465. !         so_printf("%d>", level);
  1466. !         return level < 10 ? 2 : 3;
  1467. !     }
  1468.        case 3:
  1469.       so_printf("Re: ");
  1470.       return 4;
  1471. ***************
  1472. *** 422,427 ****
  1473. --- 432,442 ----
  1474.           return cmd;
  1475.   
  1476.            case MC_READGROUP:
  1477. +         for (cur = 0; cur < n_articles; cur++) {
  1478. +             ah = articles[cur];
  1479. +             if (ah->attr == 0 || (ah->attr & A_SELECT))
  1480. +             ah->attr = A_READ;
  1481. +         }
  1482.           return cmd;
  1483.           }
  1484.   
  1485. ***************
  1486. *** 632,639 ****
  1487.             menu_level);
  1488.   
  1489.       purpose[0] = NUL;
  1490. !     if (!merged_menu && current_group->group_flag & G_NEW)
  1491. !     get_purpose(purpose);
  1492.   
  1493.       firsta = 0;
  1494.       while (firsta < n_articles && articles[firsta]->attr == A_SEEN)
  1495. --- 647,658 ----
  1496.             menu_level);
  1497.   
  1498.       purpose[0] = NUL;
  1499. !     if (!merged_menu)
  1500. !     switch (show_purpose_mode) {
  1501. !      case 0: break;
  1502. !      case 1: if ((current_group->group_flag & G_NEW) == 0) break;
  1503. !      case 2: get_purpose(purpose);
  1504. !     }
  1505.   
  1506.       firsta = 0;
  1507.       while (firsta < n_articles && articles[firsta]->attr == A_SEEN)
  1508. ***************
  1509. *** 1046,1052 ****
  1510.        menu_return(ME_NEXT);
  1511.   
  1512.         case K_READ_GROUP_UPDATE:
  1513. !      if (temp = mark_read_skip) break;
  1514.         do_marked_by:
  1515.        temp1 = 0; temp2 = n_articles;
  1516.        switch (temp) {
  1517. --- 1065,1071 ----
  1518.        menu_return(ME_NEXT);
  1519.   
  1520.         case K_READ_GROUP_UPDATE:
  1521. !      if ((temp = mark_read_skip) == 0) break;
  1522.         do_marked_by:
  1523.        temp1 = 0; temp2 = n_articles;
  1524.        switch (temp) {
  1525. ***************
  1526. *** 1519,1525 ****
  1527.       goto redraw;
  1528.   
  1529.        case MC_READGROUP:
  1530. !     if (k_cmd == K_READ_GROUP_THEN_SAME || also_read_articles) goto redraw;
  1531.        case MC_NEXTGROUP:
  1532.       menu_cmd = ME_NEXT;
  1533.       break;
  1534. --- 1538,1549 ----
  1535.       goto redraw;
  1536.   
  1537.        case MC_READGROUP:
  1538. !     if (k_cmd == K_READ_GROUP_THEN_SAME) {
  1539. !         if (read_ret_next_page && nexta < n_articles)
  1540. !         firsta = nexta;
  1541. !         goto redraw;
  1542. !     }
  1543. !     
  1544.        case MC_NEXTGROUP:
  1545.       menu_cmd = ME_NEXT;
  1546.       break;
  1547. *** ./LAST/news.c    Wed May 16 11:22:46 1990
  1548. --- news.c    Fri May 25 13:55:15 1990
  1549. ***************
  1550. *** 55,60 ****
  1551. --- 55,75 ----
  1552.           while (*bp && isascii(*bp) && isspace(*bp) && *bp != NL) bp++;
  1553.           *fptr = bp;
  1554.           }
  1555. + #ifdef NO_HEADER_SEPARATION_HACK
  1556. +         else {
  1557. +         for (cp = bp; *cp && *cp != ':'; cp++) {
  1558. +             if (!isascii(*cp)) break;
  1559. +             if (*cp == '_' || *cp == '-') continue;
  1560. +             if (isalnum(*cp)) continue;
  1561. +             break;
  1562. +         }
  1563. +         if (*cp != ':') {
  1564. +             *bp = NL;
  1565. +             pos--;
  1566. +             continue;
  1567. +         }
  1568. +         }
  1569. + #endif
  1570.   
  1571.       while (*bp && *bp != NL) bp++;
  1572.   
  1573. *** ./LAST/newsrc.c    Tue May 22 12:53:55 1990
  1574. --- newsrc.c    Mon May 28 23:33:28 1990
  1575. ***************
  1576. *** 276,281 ****
  1577. --- 276,282 ----
  1578.       char bak[FILENAME];
  1579.       time_t last_new_group = 0, rc_age, newsrc_age;
  1580.       group_header *last_new_gh = NULL;
  1581. +     extern group_header *lookup_no_alias();
  1582.   
  1583.       if (newsrc_file == NULL)
  1584.       newsrc_file = home_relative(".newsrc");
  1585. ***************
  1586. *** 337,347 ****
  1587.           if (c == RC_UNSUBSCR || c == RC_SUBSCR) {
  1588.           subscr = (c == RC_SUBSCR);
  1589.           *bp = NUL;
  1590. !         gh = lookup(rcbuf);
  1591. !         if (gh == NULL) {
  1592. !             gh = newobj(group_header, 1);
  1593. !             gh->group_name = copy_str(rcbuf); /* invalid group! */
  1594. !         }
  1595.           *bp = c;
  1596.           break;
  1597.           }
  1598. --- 338,344 ----
  1599.           if (c == RC_UNSUBSCR || c == RC_SUBSCR) {
  1600.           subscr = (c == RC_SUBSCR);
  1601.           *bp = NUL;
  1602. !         gh = lookup_no_alias(rcbuf);
  1603.           *bp = c;
  1604.           break;
  1605.           }
  1606. ***************
  1607. *** 353,358 ****
  1608. --- 350,357 ----
  1609.           gh->master_flag |= M_VALID;
  1610.       }
  1611.   
  1612. +     if (gh->master_flag & M_ALIASED) continue;
  1613.       if (rc_seq_tail == NULL)
  1614.           rc_sequence = rc_seq_tail = gh;
  1615.       else {
  1616. ***************
  1617. *** 470,477 ****
  1618.   
  1619.       if (c == NUL) continue;
  1620.       *bp = NUL;
  1621. !     gh = lookup(selbuf);
  1622. !     if (gh == NULL) continue;
  1623.       *bp = c;
  1624.       if (c == SEL_NEW) gh->group_flag |= G_NEW;
  1625.       gh->select_orig = gh->select_line = copy_str(selbuf);
  1626. --- 469,476 ----
  1627.   
  1628.       if (c == NUL) continue;
  1629.       *bp = NUL;
  1630. !     gh = lookup_no_alias(selbuf);
  1631. !     if (gh == NULL || gh->master_flag & M_ALIASED) continue;
  1632.       *bp = c;
  1633.       if (c == SEL_NEW) gh->group_flag |= G_NEW;
  1634.       gh->select_orig = gh->select_line = copy_str(selbuf);
  1635. *** ./LAST/nn.c    Wed May 16 11:23:56 1990
  1636. --- nn.c    Mon May 28 23:34:22 1990
  1637. ***************
  1638. *** 208,214 ****
  1639.       free_memory();
  1640.   
  1641.       if (gh->group_flag & G_FOLDER) {
  1642. !         menu_cmd = folder_menu(gh->group_name);
  1643.           if (menu_cmd == ME_NO_REDRAW) {
  1644.           menu_cmd = ME_NO_ARTICLES;
  1645.           gh->last_db_article = 0;
  1646. --- 208,214 ----
  1647.       free_memory();
  1648.   
  1649.       if (gh->group_flag & G_FOLDER) {
  1650. !         menu_cmd = folder_menu(gh->group_name, 0);
  1651.           if (menu_cmd == ME_NO_REDRAW) {
  1652.           menu_cmd = ME_NO_ARTICLES;
  1653.           gh->last_db_article = 0;
  1654. ***************
  1655. *** 473,479 ****
  1656. --- 473,483 ----
  1657.       ap = args;
  1658.       *ap++ = "nnacct";
  1659.       if (report) *ap++ = "-r";
  1660. + #ifdef STATISTICS
  1661.       sprintf(buf1, "-%c%ld", option, (long)usage_time/60);
  1662. + #else
  1663. +     sprintf(buf1, "-%c0", option);
  1664. + #endif
  1665.       *ap++ = buf1;
  1666.       sprintf(buf2, "-W%d", who_am_i);
  1667.       *ap++ = buf2;
  1668. ***************
  1669. *** 688,694 ****
  1670.       nn_exit(0);
  1671.   
  1672.        case I_AM_CHECK:
  1673. !     visit_init_file(1, (char *)NULL);
  1674.       group_name_args =
  1675.           parse_options(argc, argv, (char *)NULL, check_options,
  1676.                 " [group]...");
  1677. --- 692,698 ----
  1678.       nn_exit(0);
  1679.   
  1680.        case I_AM_CHECK:
  1681. !     visit_init_file(0, (char *)NULL);
  1682.       group_name_args =
  1683.           parse_options(argc, argv, (char *)NULL, check_options,
  1684.                 " [group]...");
  1685. ***************
  1686. *** 699,705 ****
  1687.       break;
  1688.   
  1689.        case I_AM_TIDY:
  1690. !     visit_init_file(1, (char *)NULL);
  1691.       group_name_args = opt_nntidy(argc, argv);
  1692.       break;
  1693.   
  1694. --- 703,709 ----
  1695.       break;
  1696.   
  1697.        case I_AM_TIDY:
  1698. !     visit_init_file(0, (char *)NULL);
  1699.       group_name_args = opt_nntidy(argc, argv);
  1700.       break;
  1701.   
  1702. ***************
  1703. *** 708,714 ****
  1704.       break;
  1705.   
  1706.        case I_AM_GREP:
  1707. !     visit_init_file(1, (char *)NULL);
  1708.       opt_nngrep(argc, argv);
  1709.       silent = 1;
  1710.       break;
  1711. --- 712,718 ----
  1712.       break;
  1713.   
  1714.        case I_AM_GREP:
  1715. !     visit_init_file(0, (char *)NULL);
  1716.       opt_nngrep(argc, argv);
  1717.       silent = 1;
  1718.       break;
  1719. ***************
  1720. *** 802,807 ****
  1721. --- 806,812 ----
  1722.           prompt_line = 2;
  1723.           cmd = goto_group(K_GOTO_GROUP, (article_header *)NULL, setup_access());
  1724.           
  1725. +         if (cmd == ME_NO_REDRAW) sleep(2);
  1726.           } while (repeat_group_query && cmd != ME_QUIT && cmd != ME_NO_REDRAW);
  1727.           clrdisp();
  1728.           unset_raw();
  1729. *** ./LAST/nntp.c    Wed May 16 11:23:57 1990
  1730. --- nntp.c    Mon May 28 23:14:56 1990
  1731. ***************
  1732. *** 28,34 ****
  1733. --- 28,37 ----
  1734.   #include <stdio.h>
  1735.   #include "nntp.h"
  1736.   #include <sys/socket.h>
  1737. + #ifndef EXCELAN
  1738.   #include <netdb.h>
  1739. + #endif
  1740. + #include <errno.h>
  1741.   
  1742.   /* This is necessary due to the definitions in m-XXX.h */
  1743.   #if !defined(NETWORK_DATABASE) || defined(NETWORK_BYTE_ORDER)
  1744. ***************
  1745. *** 35,40 ****
  1746. --- 38,47 ----
  1747.   #include <netinet/in.h>
  1748.   #endif
  1749.   
  1750. + #ifdef EXCELAN
  1751. + #define    IPPORT_NNTP    119
  1752. + #endif
  1753.   import char *db_directory, *tmp_directory, *news_active;
  1754.   
  1755.   export char nntp_server[256];    /* name of nntp server */
  1756. ***************
  1757. *** 50,56 ****
  1758.   
  1759.   import int silent, no_update;
  1760.   
  1761. ! import int errno, sys_nerr;
  1762.   import char *sys_errlist[];
  1763.   extern int user_error();
  1764.   extern int sys_error();
  1765. --- 57,63 ----
  1766.   
  1767.   import int silent, no_update;
  1768.   
  1769. ! import int sys_nerr;
  1770.   import char *sys_errlist[];
  1771.   extern int user_error();
  1772.   extern int sys_error();
  1773. ***************
  1774. *** 70,75 ****
  1775. --- 77,103 ----
  1776.   
  1777.   #define ERR_TIMEOUT    503        /* Response code for timeout */
  1778.   
  1779. + #ifdef NO_BZERO
  1780. + static bzero(p, l)
  1781. + register char *p;
  1782. + register int l;
  1783. + {  
  1784. +     while (l-- > 0)
  1785. +     *p++ = 0;
  1786. + }
  1787. + #endif
  1788. + #ifdef NO_RENAME
  1789. + static rename(old, new)
  1790. + char *old, *new;
  1791. + {
  1792. +     if (unlink(new) < 0 && errno != ENOENT) return -1;
  1793. +     if (link(old, new) < 0) return -1;
  1794. +     return unlink(old);
  1795. + }
  1796. + #endif
  1797.   /*
  1798.    * debug_msg: print a debug message.
  1799.    *
  1800. ***************
  1801. *** 236,243 ****
  1802. --- 264,273 ----
  1803.   {
  1804.       int s;
  1805.       struct sockaddr_in sin;
  1806. + #ifndef EXCELAN
  1807.       struct servent *getservbyname(), *sp;
  1808.       struct hostent *gethostbyname(), *hp;
  1809.   #ifdef h_addr
  1810.       int     x = 0;
  1811.       register char **cp;
  1812. ***************
  1813. *** 253,258 ****
  1814. --- 283,296 ----
  1815.       sin.sin_family = hp->h_addrtype;
  1816.       sin.sin_port = sp->s_port;
  1817.   
  1818. + #else /* EXCELAN */
  1819. +     char *machine;
  1820. +     bzero((char*) &sin, sizeof(sin));
  1821. +     sin.sin_family = AF_INET;
  1822. +     sin.sin_port = htons(0);
  1823. + #endif  /* EXCELAN */
  1824.   #ifdef h_addr
  1825.       /* get a socket and initiate connection -- use multiple addresses */
  1826.   
  1827. ***************
  1828. *** 273,278 ****
  1829. --- 311,333 ----
  1830.       if (x < 0 && who_am_i != I_AM_MASTER)
  1831.       user_error("Giving up on NNTP server %s!\n", nntp_server);
  1832.   #else                    /* no name server */
  1833. + #ifdef EXCELAN
  1834. +     if ((s = socket(SOCK_STREAM, NULL, &sin, SO_KEEPALIVE)) < 0)
  1835. +     sys_error("Can't get NNTP socket: %s", syserr());
  1836. +     sin.sin_port = htons(IPPORT_NNTP);
  1837. +     machine = nntp_server;
  1838. +     if ((sin.sin_addr.s_addr = rhost(&machine)) < 0)
  1839. +         sys_error("%s:  Unknown host.", nntp_server);
  1840. +     /* And then connect */
  1841. +     if (connect(s, &sin) < 0) {
  1842. +     if (who_am_i == I_AM_MASTER)
  1843. +         sys_error("Connecting to %s: %s", nntp_server, syserr());
  1844. +         (void) close(s);
  1845. +     s = -1;
  1846. +     }
  1847. + #else /* not EXCELAN */
  1848.       if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  1849.       sys_error("Can't get NNTP socket: %s\n", syserr());
  1850.   
  1851. ***************
  1852. *** 283,288 ****
  1853. --- 338,344 ----
  1854.           sys_error("Connecting to %s failed: %s", nntp_server, syserr());
  1855.       s = -1;
  1856.       }
  1857. + #endif  /* EXCELAN */
  1858.   #endif
  1859.       return s;
  1860.   }
  1861. *** ./LAST/patchlevel.h    Tue May 22 12:53:56 1990
  1862. --- patchlevel.h    Mon May 28 23:15:19 1990
  1863. ***************
  1864. *** 14,20 ****
  1865.    *    1990-05-10: Patch #1 (6.4.1) - HIGH
  1866.    *    1990-05-15: Patch #2 (6.4.2) - HIGH
  1867.    *    1990-05-21: Patch #3 (6.4.3) - HIGH
  1868.    */
  1869.   
  1870. ! #define PATCHLEVEL 3
  1871.   
  1872. --- 14,21 ----
  1873.    *    1990-05-10: Patch #1 (6.4.1) - HIGH
  1874.    *    1990-05-15: Patch #2 (6.4.2) - HIGH
  1875.    *    1990-05-21: Patch #3 (6.4.3) - HIGH
  1876. +  *    1990-05-29: Patch #4 (6.4.4) - HIGH
  1877.    */
  1878.   
  1879. ! #define PATCHLEVEL 4
  1880.   
  1881. *** ./LAST/proto.c    Thu Apr 26 16:52:26 1990
  1882. --- proto.c    Mon May 28 20:26:04 1990
  1883. ***************
  1884. *** 119,125 ****
  1885.       return -1;
  1886.   
  1887.       m_pid = open_file(lock, OPEN_CREATE);
  1888. !     if (m_pid == NULL) return 1;    /* failed to lock (permission?) */
  1889.       fprintf(m_pid, "%d\n", process_id);
  1890.       fclose(m_pid);
  1891.   
  1892. --- 119,126 ----
  1893.       return -1;
  1894.   
  1895.       m_pid = open_file(lock, OPEN_CREATE);
  1896. !     if (m_pid == NULL)
  1897. !     sys_error("Cannot create lock file: %s", lock);
  1898.       fprintf(m_pid, "%d\n", process_id);
  1899.       fclose(m_pid);
  1900.   
  1901. *** ./LAST/save.c    Tue May 22 12:53:57 1990
  1902. --- save.c    Mon May 28 23:04:10 1990
  1903. ***************
  1904. *** 383,388 ****
  1905. --- 383,389 ----
  1906.       news_header_buffer hdrbuf;
  1907.       int was_raw = 0, set_visual = 0;
  1908.       char copybuf[FILENAME * 4], uniqbuf[FILENAME];
  1909. +     flag_type st_flag = A_ST_FILED;
  1910.   
  1911.       if (ah->a_group) init_group(ah->a_group);
  1912.   
  1913. ***************
  1914. *** 524,531 ****
  1915.       fclose(art);
  1916.   
  1917.       if (save_mode & DO_UNSHAR) {
  1918. !     if ((c = pclose(save_file)) != 0)
  1919.           sprintf(delayed_msg, "Save command failed; exit = %d", c);
  1920.       save_file = NULL;
  1921.       } else {
  1922.       if (s_pipe)
  1923. --- 525,534 ----
  1924.       fclose(art);
  1925.   
  1926.       if (save_mode & DO_UNSHAR) {
  1927. !     if ((c = pclose(save_file)) != 0) {
  1928.           sprintf(delayed_msg, "Save command failed; exit = %d", c);
  1929. +         st_flag = 0;
  1930. +     }
  1931.       save_file = NULL;
  1932.       } else {
  1933.       if (s_pipe)
  1934. ***************
  1935. *** 537,543 ****
  1936.           "%s: %d lines appended", save_name, lcount);
  1937.   
  1938.       if (s_pipe || (save_mode & SEPARATE_FILES)) {
  1939. !         if (end_save() == 0) return 0;
  1940.       } else
  1941.           save_mode &= ~FILE_IS_NEW;
  1942.       }
  1943. --- 540,546 ----
  1944.           "%s: %d lines appended", save_name, lcount);
  1945.   
  1946.       if (s_pipe || (save_mode & SEPARATE_FILES)) {
  1947. !         if (end_save() == 0) goto err;
  1948.       } else
  1949.           save_mode &= ~FILE_IS_NEW;
  1950.       }
  1951. ***************
  1952. *** 551,564 ****
  1953.       if (set_visual) visual_on();
  1954.       if (was_raw) raw();
  1955.   
  1956. !     ah->flag |= A_ST_FILED;
  1957.   
  1958.       return !s_pipe || (save_mode & SEPARATE_FILES);
  1959.   
  1960.    fatal:
  1961.       if (set_visual) visual_on();
  1962.       if (was_raw) raw();
  1963. -     fclose(art);
  1964.       return 0;
  1965.   }
  1966.   
  1967. --- 554,568 ----
  1968.       if (set_visual) visual_on();
  1969.       if (was_raw) raw();
  1970.   
  1971. !     ah->flag |= st_flag;
  1972.   
  1973.       return !s_pipe || (save_mode & SEPARATE_FILES);
  1974.   
  1975.    fatal:
  1976. +     fclose(art);
  1977. +  err:
  1978.       if (set_visual) visual_on();
  1979.       if (was_raw) raw();
  1980.       return 0;
  1981.   }
  1982.   
  1983. ***************
  1984. *** 578,584 ****
  1985.           return 0;
  1986.           }
  1987.       } else
  1988. !         fclose(sf);
  1989.       }
  1990.   
  1991.       if (save_mode & DO_DECODE) {
  1992. --- 582,591 ----
  1993.           return 0;
  1994.           }
  1995.       } else
  1996. !         if (fclose(sf) == EOF) {
  1997. !         sprintf(delayed_msg, "Save failed (disk full?)");
  1998. !         return 0;
  1999. !         }
  2000.       }
  2001.   
  2002.       if (save_mode & DO_DECODE) {
  2003. *** ./LAST/term.c    Tue May 22 12:53:59 1990
  2004. --- term.c    Mon May 28 20:14:19 1990
  2005. ***************
  2006. *** 17,23 ****
  2007.   #include <sys/ptem.h>
  2008.   #endif
  2009.   
  2010. ! int s_resized;
  2011.   #endif
  2012.   
  2013.   export char *term_name = NULL;
  2014. --- 17,23 ----
  2015.   #include <sys/ptem.h>
  2016.   #endif
  2017.   
  2018. ! extern int s_resized;
  2019.   #endif
  2020.   
  2021.   export char *term_name = NULL;
  2022. ***************
  2023. *** 29,34 ****
  2024. --- 29,35 ----
  2025.   export int  any_message = 0;
  2026.   export int  flow_control = 1;
  2027.   export int  use_visible_bell = 1; /* if supported by terminal */
  2028. + export int  ignore_xon_xoff = 1;
  2029.   
  2030.   export key_type help_key = '?';
  2031.   export key_type comp1_key = SP;
  2032. ***************
  2033. *** 112,117 ****
  2034. --- 113,119 ----
  2035.   
  2036.   extern jmp_buf fake_keyb_sig;
  2037.   extern int arm_fake_keyb_sig;
  2038. + extern char fake_keyb_siglist[];
  2039.   #endif
  2040.   
  2041.   #include <sgtty.h>
  2042. ***************
  2043. *** 216,222 ****
  2044.   
  2045.   #ifdef RESIZING
  2046.   
  2047. ! sig_type catch_winch()
  2048.   {
  2049.       struct winsize winsize;
  2050.   
  2051. --- 218,224 ----
  2052.   
  2053.   #ifdef RESIZING
  2054.   
  2055. ! sig_type catch_winch(n)
  2056.   {
  2057.       struct winsize winsize;
  2058.   
  2059. ***************
  2060. *** 228,233 ****
  2061. --- 230,239 ----
  2062.       s_redraw = 1;
  2063.       s_resized = 1;
  2064.       }
  2065. + #ifdef FAKE_INTERRUPT
  2066. +     if (fake_keyb_siglist[n] && arm_fake_keyb_sig)
  2067. +     longjmp(fake_keyb_sig, 1);
  2068. + #endif
  2069.   }
  2070.   #endif /* RESIZING */
  2071.   
  2072. ***************
  2073. *** 244,249 ****
  2074. --- 250,263 ----
  2075.   #endif
  2076.   #endif
  2077.   
  2078. + #ifdef FAKE_INTERRUPT
  2079. + #define SV_INTERRUPT
  2080. + static siginterrupt (signo, on)
  2081. + {
  2082. +     fake_keyb_siglist[signo] = on;
  2083. + }
  2084. + #endif
  2085.   static unsigned sp_table[] = {
  2086.       B9600, 960,
  2087.   #ifdef B19200
  2088. ***************
  2089. *** 326,352 ****
  2090.       get_cap("ce", clr_eol);
  2091.       opt_cap("cd", clr_eos);
  2092.   
  2093. ! #ifdef RESIZING
  2094. !     {
  2095. !     struct winsize winsize;
  2096. !     if (ioctl(0, TIOCGWINSZ, &winsize) >= 0
  2097. !         && winsize.ws_row != 0 && winsize.ws_col != 0) {
  2098. !         Lines = winsize.ws_row;
  2099. !         Columns = winsize.ws_col;
  2100. !         (void) signal(SIGWINCH, catch_winch);
  2101. ! #ifdef SV_INTERRUPT
  2102. !         siginterrupt(SIGWINCH, 1);    /* make read from tty interruptable */
  2103. ! #endif /* SV_INTERRUPT */
  2104. !     }
  2105. !     }
  2106. !     if (Lines == 0 || Columns == 0) {
  2107. ! #endif /* RESIZING */
  2108. !     Lines = tgetnum("li");
  2109. !     Columns = tgetnum("co");
  2110. ! #ifdef RESIZING
  2111. !     }
  2112. ! #endif /* RESIZING */
  2113.   
  2114.       opt_cap("so", enter_standout_mode);
  2115.       opt_cap("se", exit_standout_mode);
  2116. --- 340,347 ----
  2117.       get_cap("ce", clr_eol);
  2118.       opt_cap("cd", clr_eos);
  2119.   
  2120. !     Lines = tgetnum("li");
  2121. !     Columns = tgetnum("co");
  2122.   
  2123.       opt_cap("so", enter_standout_mode);
  2124.       opt_cap("se", exit_standout_mode);
  2125. ***************
  2126. *** 372,377 ****
  2127. --- 367,388 ----
  2128.   
  2129.   #endif /* !USE_TERMINFO */
  2130.   
  2131. + #ifdef RESIZING
  2132. +     {
  2133. +     struct winsize winsize;
  2134. +     if (ioctl(0, TIOCGWINSZ, &winsize) >= 0
  2135. +         && winsize.ws_row != 0 && winsize.ws_col != 0) {
  2136. +         Lines = winsize.ws_row;
  2137. +         Columns = winsize.ws_col;
  2138. +         (void) signal(SIGWINCH, catch_winch);
  2139. + #ifdef SV_INTERRUPT
  2140. +         siginterrupt(SIGWINCH, 1);    /* make read from tty interruptable */
  2141. + #endif /* SV_INTERRUPT */
  2142. +     }
  2143. +     }
  2144. + #endif /* RESIZING */
  2145.       STANDOUT = HAS_CAP(enter_standout_mode);
  2146.       if (STANDOUT) {
  2147.       if (cookie_size < 0) cookie_size = 0;
  2148. ***************
  2149. *** 746,754 ****
  2150.   
  2151.   static int alarm_on = 0;
  2152.   
  2153. ! static mk_timeout()
  2154.   {
  2155.       alarm_on = 0;
  2156.   }
  2157.   
  2158.   #endif
  2159. --- 757,770 ----
  2160.   
  2161.   static int alarm_on = 0;
  2162.   
  2163. ! static mk_timeout(n)
  2164.   {
  2165.       alarm_on = 0;
  2166. + #ifdef FAKE_INTERRUPT
  2167. +     if (fake_keyb_siglist[n] && arm_fake_keyb_sig)
  2168. +     longjmp(fake_keyb_sig, 1);
  2169. + #endif
  2170.   }
  2171.   
  2172.   #endif
  2173. ***************
  2174. *** 821,827 ****
  2175.       c &= 0177;    /* done by ISTRIP on USG systems */
  2176.   #endif
  2177.   
  2178. !     if (c == CONTROL_('Q') || c == CONTROL_('S'))
  2179.           continue;
  2180.   
  2181.       any_multi = 0;
  2182. --- 837,843 ----
  2183.       c &= 0177;    /* done by ISTRIP on USG systems */
  2184.   #endif
  2185.   
  2186. !     if (ignore_xon_xoff && (c == CONTROL_('Q') || c == CONTROL_('S')))
  2187.           continue;
  2188.   
  2189.       any_multi = 0;
  2190. ***************
  2191. *** 861,866 ****
  2192. --- 877,885 ----
  2193.       goto next_key;
  2194.       }
  2195.   
  2196. + #ifdef FAKE_INTERRUPT
  2197. +     arm_fake_keyb_sig = 0;
  2198. + #endif
  2199.   #ifdef CBREAK
  2200.       if (s_redraw) {
  2201.       s_redraw = 0;
  2202. ***************
  2203. *** 869,877 ****
  2204.   #endif
  2205.   
  2206.   #ifndef KEY_BURST
  2207. - #ifdef FAKE_INTERRUPT
  2208. -     arm_fake_keyb_sig = 0;
  2209. - #endif
  2210.       if (n < 0) {
  2211.       if (errno != EINTR) s_hangup++;
  2212.       return K_interrupt;
  2213. --- 888,893 ----
  2214. ***************
  2215. *** 891,896 ****
  2216. --- 907,915 ----
  2217.   #endif
  2218.   
  2219.   got_char:
  2220. + #ifdef FAKE_INTERRUPT
  2221. +     arm_fake_keyb_sig = 0;
  2222. + #endif
  2223.   
  2224.   #ifndef KEY_BURST
  2225.       if (alarm_on) {
  2226. ***************
  2227. *** 1198,1203 ****
  2228. --- 1217,1223 ----
  2229.           in_macro++;
  2230.       break;
  2231.       }
  2232. +     fl;
  2233.   
  2234.       for (;;) {
  2235.       if (!is_raw) {
  2236. *** ./LAST/variable.c    Tue May 22 12:54:00 1990
  2237. --- variable.c    Mon May 28 19:24:01 1990
  2238. ***************
  2239. *** 70,75 ****
  2240. --- 70,76 ----
  2241.       flow_control,
  2242.       flush_typeahead,
  2243.       fmt_rptsubj,
  2244. +     ignore_xon_xoff,
  2245.       include_art_id,
  2246.       include_full_header,
  2247.       keep_rc_backup,
  2248. ***************
  2249. *** 86,91 ****
  2250. --- 87,93 ----
  2251.       query_signature,
  2252.       quick_save,
  2253.       quick_unread_count,
  2254. +     read_ret_next_page,
  2255.       repeat_group_query,
  2256.       report_cost_on_exit,
  2257.       retain_seen_status,
  2258. ***************
  2259. *** 135,140 ****
  2260. --- 137,143 ----
  2261.       response_check_pause,
  2262.       retry_on_error,
  2263.       save_counter_offset,
  2264. +     show_purpose_mode,
  2265.       slow_speed,
  2266.       sort_mode,
  2267.       subject_match_limit,
  2268. ***************
  2269. *** 237,242 ****
  2270. --- 240,246 ----
  2271.       "fsort",            BOOL 2,        (char **)&dont_sort_folders,
  2272.       "header-lines",        STR 0,        (char **)&header_lines,
  2273.       "help-key",            KEY 0,        (char **)&help_key,
  2274. +     "ignore-xon-xoff",        BOOL 0,        (char **)&ignore_xon_xoff,
  2275.       "include-art-id",        BOOL 0,        (char **)&include_art_id,
  2276.       "include-full-header",    BOOL 0,        (char **)&include_full_header,
  2277.       "included-mark",        STR 1,        (char **)included_mark,
  2278. ***************
  2279. *** 285,290 ****
  2280. --- 289,295 ----
  2281.       "quick-count",        BOOL 0,        (char **)&quick_unread_count,
  2282.       "quick-save",        BOOL 0,        (char **)&quick_save,
  2283.       "re-layout",        INT 0,        (char **)&re_layout,
  2284. +     "read-return-next-page",    BOOL 0,        (char **)&read_ret_next_page,
  2285.       "record",            SPEC 1,        (char **)NULL,
  2286.       "repeat",            BOOL 0,        (char **)&fmt_rptsubj,
  2287.       "repeat-group-query",    BOOL 0,        (char **)&repeat_group_query,
  2288. ***************
  2289. *** 301,306 ****
  2290. --- 306,312 ----
  2291.       "select-on-sender",        BOOL 0,        (char **)&select_on_sender,
  2292.       "shell",            STR SAFE 0,    (char **)&user_shell,
  2293.       "shell-restrictions",     BOOL INIT 0,    (char **)&shell_restrictions,
  2294. +     "show-purpose-mode",    INT 0,        (char **)&show_purpose_mode,
  2295.       "silent",            BOOL 0,        (char **)&silent,
  2296.       "slow-mode",        BOOL 0,        (char **)&slow_mode,
  2297.       "slow-speed",        INT 0,        (char **)&slow_speed,
  2298.  
  2299.  
  2300. exit 0 # Just in case...
  2301.