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

  1. Subject:  v22i056:  NN Newsreader, release 6.4, Patch1
  2. Newsgroups: comp.sources.unix
  3. Approved: rsalz@uunet.UU.NET
  4. X-Checksum-Snefru: 7430c72b c041cf0e 8c9bea34 6734af79
  5.  
  6. Submitted-by: "Kim F. Storm" <storm@texas.dk>
  7. Posting-number: Volume 22, Issue 56
  8. Archive-name: nn6.4/patch1
  9.  
  10.  
  11.          This is an official patch to nn release 6.4
  12.          -------------------------------------------
  13.  
  14.                    PATCH #1
  15.  
  16.                 Priority: HIGH
  17.  
  18.  
  19. These patches fixes a number of bugs in the initial 6.4 release of nn
  20. as described in the updated RELEASE_NOTES file (read that for details
  21. about this patch).  Thanks to all who reported bugs and provided fixes.
  22.  
  23. To apply this patch, use nn's :patch command, or run this command from
  24. the shell in the root of the nn source tree:
  25.     patch -p0 < this-article
  26. ----
  27.  
  28. Title:    Init file processing writes to string constant.
  29. From:    Sean Casey <sean@ms.uky.edu>
  30.     David Heath <dave@boingo.med.jhu.edu>
  31.  
  32. Title:    nnmaster -l always quits.
  33. From:    Sean Casey <sean@ms.uky.edu>
  34.     David Heath <dave@boingo.med.jhu.edu>
  35.     syd@dsinc.dsi.com (Syd Weinstein)
  36.  
  37. Title:    Database inconsistency always reported for some groups
  38. From:    syd@dsinc.dsi.com (Syd Weinstein)
  39.  
  40. Title:    Unsubscribed groups can interfere with merged groups.
  41. From:    Robert.Stockton@ELROND.GANDALF.CS.CMU.EDU
  42.  
  43. Title:    Y (overview) in "nn -X" mode doesn't show unsubscribed groups.
  44. From:    KFS
  45.  
  46. Title:    'y' response to Abort? is not recognized
  47. From:    Mark Nagel <nagel@ics.UCI.EDU>
  48.  
  49. Title:    Cannot set "included-mark" to blanks
  50. From:    beldar@mips.com (Gardner Cohen)
  51.  
  52. Title:    Some lines are ignored in manuals
  53. From:    Peter Andersen <datpete@daimi.dk>
  54.  
  55. Title:    Escape codes are always turned into ^[ form.
  56. From:    Piet Beertema <piet@cwi.nl>
  57.  
  58. Title:    Bug in generation of message-id line
  59. From:    Pekka Kyt|laakso <netmgr@csc.fi>  + fix
  60.  
  61. Title:    G command may leave group "active".
  62. From:    Greg Onufer <exodus@cherrs2.Eng.Sun.COM>
  63.     Scott Boyd <scott@Futures.COM>
  64.  
  65. Title:    nngrab uses egrep -i
  66. From:    pete@eleazar.dartmouth.edu (Pete Schmitt)
  67.  
  68. Title:    Folder subarticles span to end of file (only NNTP).
  69. From:    Robert.Stockton@ELROND.GANDALF.CS.CMU.EDU
  70.  
  71. Title:    help commands shows wrong info for new commands
  72. From:    netmgr@csc.FI (Pekka Kytolaakso)
  73.  
  74. Title:    Groups may be removed from database due to disk full. (nntp)
  75. From:    KFS
  76.  
  77. ++Kim Storm
  78.  
  79. *** ./LAST/admin.c    Sat May  5 14:11:43 1990
  80. --- admin.c    Thu May 10 11:49:29 1990
  81. ***************
  82. *** 356,361 ****
  83. --- 356,369 ----
  84.       data_offset = ftell(data);
  85.       if (data_offset != gh->data_write_offset)
  86.           valerr(("DATA OFFSET %ld != %ld", (long)gh->data_write_offset, (long)data_offset), 9);
  87. +     while (++cur_article <= gh->last_db_article) {
  88. +         if (!db_read_offset(ix, &next_offset))
  89. +         valerr(("NO INDEX FOR ARTICLE %ld", (long)cur_article), 12);
  90. +         if (data_offset != next_offset)
  91. +         valerr(("OFFSET ERROR: %ld: %ld != %ld", (long)cur_article, (long)data_offset, (long)next_offset), 13);
  92. +     }
  93.       data_offset = ftell(ix);
  94.       if (data_offset != gh->index_write_offset)
  95.           valerr(("INDEX OFFSET %ld != %ld", (long)gh->index_write_offset, (long)data_offset), 10);
  96. *** ./LAST/answer.c    Wed May  2 10:35:56 1990
  97. --- answer.c    Wed May  9 19:20:03 1990
  98. ***************
  99. *** 70,76 ****
  100.   
  101.       fprintf(t, "Path: %s!%s\n", host, user_name());
  102.       fprintf(t, "Date: %s %s %s %s GMT\n", date+8, date+4, date+22, date+11);
  103. !     fprintf(t, "Message-ID: <%s.%ld@%s>\n", user_name, (long)now, host);
  104.       ed_line += 3;
  105.   }
  106.   #endif
  107. --- 70,76 ----
  108.   
  109.       fprintf(t, "Path: %s!%s\n", host, user_name());
  110.       fprintf(t, "Date: %s %s %s %s GMT\n", date+8, date+4, date+22, date+11);
  111. !     fprintf(t, "Message-ID: <%s.%ld@%s>\n", user_name(), (long)now, host);
  112.       ed_line += 3;
  113.   }
  114.   #endif
  115. ***************
  116. *** 202,208 ****
  117. --- 202,212 ----
  118.   FILE *f;
  119.   char *name, *str;
  120.   {
  121. +     int xport = (*name == '*');
  122. +     
  123. +     if (xport) name++;
  124.       fprintf(f, "%s='%s'\n", name, str != NULL ? str : "");
  125. +     if (xport) fprintf(f, "export %s\n", name);
  126.   }
  127.   
  128.   static aux_param_int(f, name, i)
  129. ***************
  130. *** 257,263 ****
  131.       aux_param_str(param, "DFLT_ANSW", response_dflt_answer);
  132.   
  133.       if (current_group != NULL) {
  134. !         aux_param_str(param, "G", current_group->group_name);
  135.           if (ah == NULL)
  136.           fn = NULL;
  137.           else
  138. --- 261,267 ----
  139.       aux_param_str(param, "DFLT_ANSW", response_dflt_answer);
  140.   
  141.       if (current_group != NULL) {
  142. !         aux_param_str(param, "*G", current_group->group_name);
  143.           if (ah == NULL)
  144.           fn = NULL;
  145.           else
  146. ***************
  147. *** 267,273 ****
  148.           else
  149.   #endif
  150.           fn = group_path_name;
  151. !         aux_param_str(param, "A", fn != NULL ? fn : "");
  152.       }
  153.   
  154.       /*
  155. --- 271,277 ----
  156.           else
  157.   #endif
  158.           fn = group_path_name;
  159. !         aux_param_str(param, "*A", fn != NULL ? fn : "");
  160.       }
  161.   
  162.       /*
  163. *** ./LAST/articles.c    Thu Apr 26 19:56:03 1990
  164. --- articles.c    Thu May 10 11:09:46 1990
  165. ***************
  166. *** 360,365 ****
  167. --- 360,366 ----
  168.       if (ah->a_number > last_article) break;
  169.   
  170.       if (flags & ACC_SPEW_MODE) {
  171. +         fold_string(db_data.dh_subject);
  172.           printf("%x:%s\n", (int)(gh->group_num), db_data.dh_subject);
  173.           continue;
  174.       }
  175. *** ./LAST/aux.sh    Wed Apr 25 21:31:59 1990
  176. --- aux.sh    Wed May  9 12:29:27 1990
  177. ***************
  178. *** 94,100 ****
  179.       ${AWK} 'END{printf "Confirm abort: (y) "}' < /dev/null
  180.       read act
  181.       case "$act" in
  182. !     ""|"y*") rm -f $WORK $COPY ;
  183.            exit 22 ;;
  184.       esac
  185.       ;;
  186. --- 94,100 ----
  187.       ${AWK} 'END{printf "Confirm abort: (y) "}' < /dev/null
  188.       read act
  189.       case "$act" in
  190. !     ""|y*) rm -f $WORK $COPY ;
  191.            exit 22 ;;
  192.       esac
  193.       ;;
  194. *** ./LAST/collect.c    Wed May  2 00:03:36 1990
  195. --- collect.c    Thu May 10 11:20:31 1990
  196. ***************
  197. *** 469,478 ****
  198.       }
  199.   
  200.        unblock_group:
  201. !     if (temp > 0 || (gh->master_flag & M_BLOCKED)) {
  202. !         gh->master_flag &= ~(M_EXPIRE | M_BLOCKED);
  203. !         db_write_group(gh);
  204. !     }
  205.       }
  206.   
  207.       if (col_article_count > 0)
  208. --- 469,476 ----
  209.       }
  210.   
  211.        unblock_group:
  212. !     gh->master_flag &= ~(M_EXPIRE | M_BLOCKED);
  213. !     db_write_group(gh);
  214.       }
  215.   
  216.       if (col_article_count > 0)
  217. *** ./LAST/db.c    Sat May  5 18:25:56 1990
  218. --- db.c    Tue May  8 13:36:37 1990
  219. ***************
  220. *** 6,11 ****
  221. --- 6,12 ----
  222.   
  223.   #include "config.h"
  224.   #include "db.h"
  225. + #include <errno.h>
  226.   
  227.   import char
  228.       *master_directory, *db_directory, *db_data_directory, *news_directory;
  229. ***************
  230. *** 558,563 ****
  231. --- 559,565 ----
  232.   char d_or_x;
  233.   int mode;
  234.   {
  235. +     FILE *f;
  236.       char data_file[FILENAME];
  237.   
  238.       db_data_path(data_file, gh, d_or_x);
  239. ***************
  240. *** 564,572 ****
  241.   
  242.       if (mode == -1) {
  243.       unlink(data_file);
  244. !     return (FILE *)NULL;
  245. !     } else
  246. !     return open_file(data_file, mode);
  247.   }
  248.   
  249.   
  250. --- 566,580 ----
  251.   
  252.       if (mode == -1) {
  253.       unlink(data_file);
  254. !     f = NULL;
  255. !     } else {
  256. !     f = open_file(data_file, (mode & ~MUST_EXIST));
  257. !     if (f == NULL && (mode & MUST_EXIST))
  258. !         sys_error("%s (%d): cannot open '%c' file (mode=%x, errno=%d)",
  259. !               gh->group_name, (int)(gh->group_num), d_or_x,
  260. !               mode, errno);
  261. !     }
  262. !     return f;
  263.   }
  264.   
  265.   
  266. *** ./LAST/doc/RELEASE_NOTES    Sat May  5 15:56:49 1990
  267. --- doc/RELEASE_NOTES    Thu May 10 14:45:29 1990
  268. ***************
  269. *** 1,6 ****
  270. ! Release 6.4.0 known problems
  271. ! ----------------------------
  272.   
  273.   Prog:    nn
  274.   Title:    G= in merged groups
  275.   
  276. --- 1,13 ----
  277. ! Known problems in release 6.4
  278. ! -----------------------------
  279.   
  280. + Prog:    nnmaster - nntp
  281. + Title:    nnmaster may hang if nntp server dies.
  282. + From:    Rene Seindal <seindal@diku.dk>
  283. +     Keep-alive must be set on the nntp socket to be able to notify
  284. +     the nnmaster that the server has died (via sigpipe).
  285.   Prog:    nn
  286.   Title:    G= in merged groups
  287.   
  288. ***************
  289. *** 103,105 ****
  290. --- 110,254 ----
  291.   Title:    Shell layers are not supported.
  292.   
  293.       ^Z is eaten by nn so shell layers don't work.
  294. + Prog:    nn
  295. + Title:    Init file processing writes to string constant.
  296. + From:    Sean Casey <sean@ms.uky.edu>
  297. +     David Heath <dave@boingo.med.jhu.edu>
  298. + Fixed:    Patch #1 [init.c]
  299. +     If one doesn't use "-fwritable-strings" with gcc, nnadmin core
  300. +     dumps because of some code in the process init file section.
  301. +     It tries to write to the string "init,", which may be in the
  302. +     text segment.
  303. + Prog:    nnmaster
  304. + Title:    nnmaster -l always quits.
  305. + From:    Sean Casey <sean@ms.uky.edu>
  306. +     David Heath <dave@boingo.med.jhu.edu>
  307. +     syd@dsinc.dsi.com (Syd Weinstein)
  308. + Fixed:    Patch #1 [master.c]
  309. +     Anytime I give the -l flag to nnmaster, it quits with:
  310. +         E: May  7 15:05 (M): Incomplete MASTER file
  311. + Prog:    nnmaster
  312. + Title:    Database inconsistency always reported for some groups
  313. + From:    syd@dsinc.dsi.com (Syd Weinstein)
  314. + Fixed:    Patch #1 [admin.c collect.c]
  315. +     Some groups always reports inconsistencies even after recollection.
  316. +     (It turns out that if the highest numbered article(s) in a group does
  317. +     not exist, the validation of the index fails, and furthermore, if
  318. +     only non-existing articles are "collected" in a group by nnmaster,
  319. +     the group header is not saved in the database.  ++Kim)
  320. +     
  321. + Prog:    nn
  322. + Title:    Unsubscribed groups can interfere with merged groups.
  323. + From:    Robert.Stockton@ELROND.GANDALF.CS.CMU.EDU
  324. + Fixed:    Patch #1 [sequence.c]
  325. +     Unsubscribed groups foul up merging of the form "foo*,".  The
  326. +     "Next Group" command may show you some of the merged groups again.
  327. + Prog:    nn
  328. + Title:    Remapping keys may interfere with Junk command.
  329. + From:    Robert.Stockton@ELROND.GANDALF.CS.CMU.EDU
  330. +     Menu mode macros are invoked when the appropriate keystrokes are used
  331. +     in the Junk command.  For example, when I rebound 'N' in menu mode to
  332. +     a macro, it interfered with Junking of "Leave-Next" articles.
  333. + Prog:    nn
  334. + Title:    Y (overview) in "nn -X" mode doesn't show unsubscribed groups.
  335. + Fixed:    Patch #1 [group.c]
  336. +     "nn -X" includes unsubscribed groups in the sequence, but they are
  337. +     not shown on the group overview.
  338. + Prog:    aux
  339. + Title:    'y' response to Abort? is not recognized
  340. + From:    Mark Nagel <nagel@ics.UCI.EDU>
  341. + Fixed:    Patch #1 [aux.sh]
  342. +     If you try to abort a posting, and you actually type 'y' and
  343. +     return, it doesn't work.
  344. + Prog:    nn
  345. + Title:    Cannot set "included-mark" to blanks
  346. + From:    beldar@mips.com (Gardner Cohen)
  347. + Fixed:    Patch #1 [init.c] -- need to put \ before first space.
  348. +     My preferred indented prefix is three blanks, which I haven't been
  349. +     able to set in my init in the past (is it possible now?).
  350. + Prog:    manuals
  351. + Title:    Some lines are ignored
  352. + From:    Peter Andersen <datpete@daimi.dk>
  353. + Fixed:    Patch #1 [nn.1 nnmaster.8]
  354. +     Some text lines in the manuals contain a period at the beginning
  355. +     of a line; this is mis-interpreted as an nroff command.
  356. + Prog:    nn
  357. + Title:    Escape codes are always turned into ^[ form.
  358. + From:    Piet Beertema <piet@cwi.nl>
  359. + Fixed:    Patch #1 [more.c variable.c nn.1] -- new trusted-escape-codes var.
  360. +     I encountered problems with both rn and nn, which wouldn't properly
  361. +     display in kanji: the ESC char was "escaped", i.e. displayed as ^[
  362. +     But kanji encoding uses the ESC, so escaping them obviously messes up
  363. +     things.     [You must fix inews also - it normally discards ESC]
  364. + Prog:    nn
  365. + Title:    Bug in generation of message-id line
  366. + From:    Pekka Kyt|laakso <netmgr@csc.fi>  + fix
  367. + Fixed:    Patch #1 [answer.c]
  368. +     user_name is "called" without ().
  369. + Prog:    nn
  370. + Title:    G command may leave group "active".
  371. + From:    Greg Onufer <exodus@cherrs2.Eng.Sun.COM>
  372. +     Scott Boyd <scott@Futures.COM>
  373. + Fixed:    Patch #1 [group.c]
  374. +     
  375. +     G group @ with no archive file leaved group active.
  376. +     group-group command fails with "groupname is an active group" on
  377. +     2nd attempt, if no articles were found on 1st attempt.
  378. + Prog:    nngrab
  379. + Title:    nngrab uses egrep -i
  380. + From:    pete@eleazar.dartmouth.edu (Pete Schmitt)
  381. + Fixed:    Patch #1 [articles.c nngrab.sh]
  382. +     nngrab uses egrep with a -i option.  This option is only valid for
  383. +     grep and fgrep on BSD 4.3 -- i.e. it is not portable.
  384. + Prog:    nn
  385. + Title:    Folder subarticles span to end of file (only NNTP).
  386. + From:    Robert.Stockton@ELROND.GANDALF.CS.CMU.EDU
  387. + Fixed:    Patch #1 [news.c]
  388. +     When you use the 'G' command to view an article in a folder, it shows
  389. +     you the entire contents of the folder from that point rather than the
  390. +     single article requested.  (This only happens with NNTP  ++Kim)
  391. + Prog:    nn
  392. + Title:    help commands shows wrong info for new commands
  393. + From:    netmgr@csc.FI (Pekka Kytolaakso)
  394. + Fixed:    Patch #1 [help.commands]
  395. +     There's an error in the file help commands. It still uses 'L' as the
  396. +     'change layout' key (in selection mode) and dosn't say anything about
  397. +     the news use of the L key.
  398. + Prog:    nnmaster - nntp_get_active
  399. + Title:    Groups may be removed from database due to disk full.
  400. + From:    KFS
  401. + Fixed:    Patch #1 [nntp.c]
  402. +     If the disk runs full while the active file is fetched from an nntp
  403. +     server, the incomplete active file is believed to be the complete
  404. +     active file.  This causes nnmaster to remove the groups which didn't
  405. +     get written to the active file.
  406. *** ./LAST/group.c    Wed May  2 10:35:56 1990
  407. --- group.c    Wed May  9 18:50:20 1990
  408. ***************
  409. *** 330,349 ****
  410.       n = 1;            /* must unsort articles */
  411.       if (mg_head != NULL) gh = mg_head;
  412.   
  413. !     if (!no_update) {
  414. !     do {
  415. !         if (mask == NULL && (access_mode & ACC_ALSO_READ_ARTICLES) == 0
  416. !         && first_art < 0) {
  417. !         if (menu_cmd != ME_NO_ARTICLES) gh->group_flag &= ~G_NEW;
  418. !         if ((gh->group_flag & G_UNSUBSCRIBED) == 0 || keep_unsub_long) {
  419. !             if (n) sort_articles(0);
  420. !             n = 0;
  421. !             update_rc(gh);
  422. !         }
  423. !         }
  424. !         gh->current_first = 0;
  425. !     } while (mg_head != NULL && (gh = gh->merge_with) != NULL);
  426. !     }
  427.   
  428.       killed_articles = o_killed;
  429.       restore_variables();
  430. --- 330,345 ----
  431.       n = 1;            /* must unsort articles */
  432.       if (mg_head != NULL) gh = mg_head;
  433.   
  434. !     do {
  435. !     gh->current_first = 0;
  436. !     if (mask != NULL) continue;
  437. !     if (access_mode & ACC_ALSO_READ_ARTICLES || first_art >= 0) continue;
  438. !     if (menu_cmd != ME_NO_ARTICLES) gh->group_flag &= ~G_NEW;
  439. !     if (gh->group_flag & G_UNSUBSCRIBED && !keep_unsub_long) continue;
  440. !     if (n) sort_articles(0);
  441. !     n = 0;
  442. !     update_rc(gh);
  443. !     } while (mg_head != NULL && (gh = gh->merge_with) != NULL);
  444.   
  445.       killed_articles = o_killed;
  446.       restore_variables();
  447. ***************
  448. *** 744,751 ****
  449.       release_memory(&mem_marker);
  450.   
  451.   goto_exit:
  452. !     if (gh != orig_group)
  453.       if (orig_group) init_group(orig_group);
  454.   
  455.       m_endinput();
  456.       return menu_cmd;
  457. --- 740,749 ----
  458.       release_memory(&mem_marker);
  459.   
  460.   goto_exit:
  461. !     if (gh != orig_group) {
  462. !     gh->current_first = 0;
  463.       if (orig_group) init_group(orig_group);
  464. +     }
  465.   
  466.       m_endinput();
  467.       return menu_cmd;
  468. ***************
  469. *** 924,931 ****
  470.       Loop_Groups_Sequence(gh) {
  471.           if (gh->group_flag & G_FAKED) continue;
  472.           if (gh->master_flag & M_NO_DIRECTORY) continue;
  473. !         if (gh != current_group)
  474. !         if ((gh->group_flag & G_COUNTED) == 0) continue;
  475.           if (disp_group(gh) < 0) break;
  476.       }
  477.       } else
  478. --- 922,932 ----
  479.       Loop_Groups_Sequence(gh) {
  480.           if (gh->group_flag & G_FAKED) continue;
  481.           if (gh->master_flag & M_NO_DIRECTORY) continue;
  482. !         if (gh != current_group) {
  483. !         if (gh->unread_count <= 0) continue;
  484. !         if (gh->group_flag & G_UNSUBSCRIBED && !also_unsub_groups)
  485. !             continue;
  486. !         }
  487.           if (disp_group(gh) < 0) break;
  488.       }
  489.       } else
  490. *** ./LAST/help/help.commands    Mon Apr 23 18:32:36 1990
  491. --- help/help.commands    Thu May 10 13:05:41 1990
  492. ***************
  493. *** 21,28 ****
  494.   help        ?    ?    online help
  495.   junk-articles    J        change marking of articles on the menu
  496.   kill-select    K    K    kill/select handling
  497. ! layout        L        change menu layout
  498.   leave-article    l    l    leave (mark) article for later use
  499.   line+1        down    CR    next menu line/scroll one line
  500.   line-1        up        previous menu line
  501.   line=@            g    goto specific line
  502. --- 21,29 ----
  503.   help        ?    ?    online help
  504.   junk-articles    J        change marking of articles on the menu
  505.   kill-select    K    K    kill/select handling
  506. ! layout        "        change menu layout
  507.   leave-article    l    l    leave (mark) article for later use
  508. + leave-next    L    L    permanently mark article for later use
  509.   line+1        down    CR    next menu line/scroll one line
  510.   line-1        up        previous menu line
  511.   line=@            g    goto specific line
  512. *** ./LAST/init.c    Fri Apr 27 20:23:00 1990
  513. --- init.c    Wed May  9 17:48:37 1990
  514. ***************
  515. *** 53,58 ****
  516. --- 53,59 ----
  517.       if (cmd == NULL) return cmd;
  518.   
  519.       while (*cmd && isspace(*cmd)) cmd++;
  520. +     if (*cmd == '\\' && isspace(cmd[1])) cmd++;
  521.       if (*cmd == NUL || *cmd == NL) return NULL;
  522.   
  523.       return cmd;
  524. ***************
  525. *** 172,177 ****
  526. --- 173,180 ----
  527.       fclose(init);
  528.   }
  529.   
  530. + static char dflt_init_files[] = ",init";
  531.   visit_init_file(only_seq, first_arg)
  532.   int only_seq;
  533.   char *first_arg;
  534. ***************
  535. *** 183,189 ****
  536.       if (first_arg[2] == NUL) return;
  537.       first_arg += 2;
  538.       } else
  539. !     first_arg = ",init";
  540.   
  541.       in_init = 1;
  542.       while (first_arg) {
  543. --- 186,192 ----
  544.       if (first_arg[2] == NUL) return;
  545.       first_arg += 2;
  546.       } else
  547. !     first_arg = dflt_init_files;
  548.   
  549.       in_init = 1;
  550.       while (first_arg) {
  551. ***************
  552. *** 540,546 ****
  553.   
  554.           clrdisp();
  555.   
  556. !         printf("Available: %ld - %ld  (unread %ld)\n\n",
  557.              (long)(gh->first_db_article), (long)(gh->last_db_article),
  558.              (long)(gh->unread_count));
  559.           printf(".newsrc:\n\r>%s\r<%s\n\rselect:\n\r>%s\r<%s\n\r",
  560. --- 543,549 ----
  561.   
  562.           clrdisp();
  563.   
  564. !         printf("Available: %ld - %ld  (unread %ld)\n\n\r",
  565.              (long)(gh->first_db_article), (long)(gh->last_db_article),
  566.              (long)(gh->unread_count));
  567.           printf(".newsrc:\n\r>%s\r<%s\n\rselect:\n\r>%s\r<%s\n\r",
  568. *** ./LAST/man/nn.1.A    Sat May  5 14:19:09 1990
  569. --- man/nn.1.A    Thu May 10 14:53:46 1990
  570. ***************
  571. *** 878,884 ****
  572.   \fBRelated variables\fP:
  573.   case-fold-search, compress, data-bits, date, header-lines,
  574.   mark-overlap, monitor, overlap, scroll-clear-page, stop,
  575. ! wrap-header-margin.
  576.   .SH PREVIEWING ARTICLES IN SELECTION MODE
  577.   In selection mode, it is possible to read a specific article on the
  578.   menu without entering reading mode for all the selected articles on
  579. --- 878,884 ----
  580.   \fBRelated variables\fP:
  581.   case-fold-search, compress, data-bits, date, header-lines,
  582.   mark-overlap, monitor, overlap, scroll-clear-page, stop,
  583. ! trusted-escape-codes, wrap-header-margin.
  584.   .SH PREVIEWING ARTICLES IN SELECTION MODE
  585.   In selection mode, it is possible to read a specific article on the
  586.   menu without entering reading mode for all the selected articles on
  587. *** ./LAST/man/nn.1.C    Sat May  5 14:19:09 1990
  588. --- man/nn.1.C    Thu May 10 14:53:46 1990
  589. ***************
  590. *** 700,706 ****
  591.   is done by simple subtracting the first unread article number from the
  592.   total number of articles in each group.  This is very fast, and fairly
  593.   accurate but it may be a bit too large.  If not set, each line in
  594. ! .newsrc will be interpreted to count every unread article, thus giving
  595.   a very accurate number.  This variable is also used by \fInncheck\fP.
  596.   .TP
  597.   \fBquick-save\fP    (boolean, default false)
  598. --- 700,706 ----
  599.   is done by simple subtracting the first unread article number from the
  600.   total number of articles in each group.  This is very fast, and fairly
  601.   accurate but it may be a bit too large.  If not set, each line in
  602. ! \&.newsrc will be interpreted to count every unread article, thus giving
  603.   a very accurate number.  This variable is also used by \fInncheck\fP.
  604.   .TP
  605.   \fBquick-save\fP    (boolean, default false)
  606. ***************
  607. *** 920,925 ****
  608. --- 920,939 ----
  609.   .I sysline (1)
  610.   utility.
  611.   .TP
  612. + \fBtrusted-escape-codes\fP \fIcodes\fP    (string, default none)
  613. + When set to a list of one or more characters, \fInn\fP will trust and
  614. + output \fIescape\fP characters in an article if it is followed by one
  615. + of the characters in the list.  For example, to switch to or from
  616. + kanji mode, control codes like "\fIesc\fP\ $" and "\fIesc\fP\ (\ J"
  617. + may be present in the text.  To allow these codes, use the following
  618. + command:
  619. + .sp 0.5v
  620. +     set trusted-escape-codes ($
  621. + .sp 0.5v
  622. + You can also set it to \fBall\fP to pass all espace codes through to
  623. + the screen.  Notice that \fInn\fP thinks all characters (including
  624. + \fIesc\fP) output to the screen as occupy one column.
  625. + .TP
  626.   \fBunshar-command\fP \fIshell-command\fP    (string, default "/bin/sh")
  627.   This is the command which is invoked by the \fBunshar\fP command.
  628.   .TP
  629. ***************
  630. *** 936,942 ****
  631.   When set, unsubscribing to a group will automatically mark all current
  632.   articles read; this is recommended to keep the size of .newsrc down.
  633.   Otherwise, unread articles in the unsubscribe groups are kept in
  634. ! .newsrc.  If \fBkeep-unsubscribed\fP is false, this variable has no
  635.   effect.
  636.   .TP
  637.   \fBupdate-frequency\fP        (integer, default 1)
  638. --- 950,956 ----
  639.   When set, unsubscribing to a group will automatically mark all current
  640.   articles read; this is recommended to keep the size of .newsrc down.
  641.   Otherwise, unread articles in the unsubscribe groups are kept in
  642. ! \&.newsrc.  If \fBkeep-unsubscribed\fP is false, this variable has no
  643.   effect.
  644.   .TP
  645.   \fBupdate-frequency\fP        (integer, default 1)
  646. *** ./LAST/man/nn.1.D    Sat May  5 14:19:09 1990
  647. --- man/nn.1.D    Thu May 10 14:53:46 1990
  648. ***************
  649. *** 1055,1063 ****
  650.   .TP
  651.   \fBRC\fP
  652.   This is a pseudo group name which matches all groups occurring in the
  653. ! .newsrc file.  It will cause the groups in .newsrc to be appended to
  654.   the presentation sequence in the sequence in which they are listed in
  655. ! .newsrc.
  656.   .TP
  657.   \fBRC:\fP\fInumber\fP
  658.   Similar to the \fBRC\fP entry, but limited to the first \fInumber\fP
  659. --- 1055,1063 ----
  660.   .TP
  661.   \fBRC\fP
  662.   This is a pseudo group name which matches all groups occurring in the
  663. ! \&.newsrc file.  It will cause the groups in .newsrc to be appended to
  664.   the presentation sequence in the sequence in which they are listed in
  665. ! \&.newsrc.
  666.   .TP
  667.   \fBRC:\fP\fInumber\fP
  668.   Similar to the \fBRC\fP entry, but limited to the first \fInumber\fP
  669. *** ./LAST/man/nnmaster.8    Sat May  5 14:11:44 1990
  670. --- man/nnmaster.8    Wed May  9 20:34:09 1990
  671. ***************
  672. *** 483,489 ****
  673.   .br
  674.   $db/DATA/\fInnn\fP.[dx]    Database files for group number \fInnn\fP
  675.   .br
  676. ! .../.nn[dx]    Database files if located in the group directories
  677.   .br
  678.   $master/GATE    Message channel from \fInnadmin\fP to \fInnmaster\fP
  679.   .br
  680. --- 483,489 ----
  681.   .br
  682.   $db/DATA/\fInnn\fP.[dx]    Database files for group number \fInnn\fP
  683.   .br
  684. ! \&.../.nn[dx]    Database files if located in the group directories
  685.   .br
  686.   $master/GATE    Message channel from \fInnadmin\fP to \fInnmaster\fP
  687.   .br
  688. *** ./LAST/master.c    Sat May  5 18:25:56 1990
  689. --- master.c    Tue May  8 16:09:52 1990
  690. ***************
  691. *** 512,520 ****
  692.   
  693.   static set_lock_message()
  694.   {
  695. -     open_master(OPEN_UPDATE);
  696. -     db_read_master();
  697.       if (lock_message[0] || master.db_lock[0]) {
  698.       strncpy(master.db_lock, lock_message, DB_LOCK_MESSAGE);
  699.       master.db_lock[DB_LOCK_MESSAGE-1] = NUL;
  700.       db_write_master();
  701. --- 512,519 ----
  702.   
  703.   static set_lock_message()
  704.   {
  705.       if (lock_message[0] || master.db_lock[0]) {
  706. +     open_master(OPEN_UPDATE);
  707.       strncpy(master.db_lock, lock_message, DB_LOCK_MESSAGE);
  708.       master.db_lock[DB_LOCK_MESSAGE-1] = NUL;
  709.       db_write_master();
  710. ***************
  711. *** 612,617 ****
  712. --- 611,618 ----
  713.       nn_exit(0);
  714.       }
  715.   
  716. +     open_master(OPEN_READ);
  717.       if (lock_message != NULL) {
  718.       set_lock_message();
  719.       if (repeat_delay == 0 && !foreground &&
  720. ***************
  721. *** 618,625 ****
  722.           !reread_groups_file && group_selection == 0)
  723.           nn_exit(0);
  724.       }
  725. -     open_master(OPEN_READ);
  726.   
  727.       if (!ignore_lock && master.db_lock[0]) {
  728.       printf("Database locked (unlock with -l or ignore with -i)\n");
  729. --- 619,624 ----
  730. *** ./LAST/more.c    Mon Apr 23 18:26:06 1990
  731. --- more.c    Wed May  9 20:39:40 1990
  732. ***************
  733. *** 23,28 ****
  734. --- 23,29 ----
  735.   export int  data_bits = 7;
  736.   export int  scroll_clear_page = 1;
  737.   export int  expired_msg_delay = 1;
  738. + export char *trusted_escapes = NULL;
  739.   
  740.   import int  preview_window;
  741.   import int  novice;
  742. ***************
  743. *** 542,547 ****
  744. --- 543,565 ----
  745.           } while (col & 07);
  746.           goto next_char;
  747.   
  748. +      case 033: /* ESC may be a start/end of kanji or similar */
  749. +         if (trusted_escapes != NULL) {
  750. +         if (col + 3 > Columns) {
  751. +             ungetc(c, art);
  752. +             goto long_line;
  753. +         }
  754. +         if (strcmp(trusted_escapes, "all") == 0) break;
  755. +         c = getc(art);
  756. +         if (c == EOF) goto next_char;
  757. +         ungetc(c, art);
  758. +         for (fname = trusted_escapes; *fname; fname++)
  759. +             if (c == *fname) break;
  760. +         c = 033;
  761. +         if (*fname != NUL) break;
  762. +         }
  763. +         /* FALL THRU */
  764. +             
  765.        default:
  766.           if (col + 2 > Columns) {
  767.           ungetc(c, art);
  768. *** ./LAST/news.c    Wed May  2 22:19:53 1990
  769. --- news.c    Thu May 10 11:09:45 1990
  770. ***************
  771. *** 283,289 ****
  772.           news.ng_lpos = ftell(f);
  773.       }
  774.   #ifdef NNTP
  775. !     else if (use_nntp && (art->flag & A_DIGEST) == 0) {
  776.           fseek(f, (off_t)0, 2);
  777.           art->lpos = ftell(f);
  778.       }
  779. --- 283,289 ----
  780.           news.ng_lpos = ftell(f);
  781.       }
  782.   #ifdef NNTP
  783. !     else if (use_nntp && (art->flag & (A_DIGEST | A_FOLDER)) == 0) {
  784.           fseek(f, (off_t)0, 2);
  785.           art->lpos = ftell(f);
  786.       }
  787. ***************
  788. *** 305,311 ****
  789.       digest_buffer = buffer2;
  790.       }
  791.   #ifdef NNTP
  792. !     else if (use_nntp && (art->flag & A_DIGEST) == 0) {
  793.       fseek(f, (off_t)0, 2);
  794.       art->lpos = ftell(f);
  795.       }
  796. --- 305,311 ----
  797.       digest_buffer = buffer2;
  798.       }
  799.   #ifdef NNTP
  800. !     else if (use_nntp && (art->flag & (A_DIGEST | A_FOLDER)) == 0) {
  801.       fseek(f, (off_t)0, 2);
  802.       art->lpos = ftell(f);
  803.       }
  804. *** ./LAST/nngrab.sh    Sun Apr 29 15:54:28 1990
  805. --- nngrab.sh    Thu May 10 11:09:46 1990
  806. ***************
  807. *** 14,20 ****
  808.   fi
  809.   
  810.   if [ -s $DB/subjects ] ; then
  811. !     egrep -i "^[^:]*:.*$1" $DB/subjects |
  812.       sed 's/^\([^:]*\):.*/\1/' |
  813.       uniq > $TMP/nngrab$$
  814.   
  815. --- 14,20 ----
  816.   fi
  817.   
  818.   if [ -s $DB/subjects ] ; then
  819. !     egrep "^[^:]*:.*$1" $DB/subjects |
  820.       sed 's/^\([^:]*\):.*/\1/' |
  821.       uniq > $TMP/nngrab$$
  822.   
  823. *** ./LAST/nntp.c    Sat May  5 18:25:56 1990
  824. --- nntp.c    Thu May 10 14:50:17 1990
  825. ***************
  826. *** 688,694 ****
  827.       switch (n = ask_server("LIST")) {
  828.        case OK_GROUPS:
  829.       new = open_file(new_name, OPEN_CREATE_RW|MUST_EXIST);
  830. !     if (copy_text(new) == 0) break;
  831.       unlink(new_name);
  832.       if (!nntp_failed) {
  833.           log_entry('N', "LIST empty");
  834. --- 688,697 ----
  835.       switch (n = ask_server("LIST")) {
  836.        case OK_GROUPS:
  837.       new = open_file(new_name, OPEN_CREATE_RW|MUST_EXIST);
  838. !     if (copy_text(new) == 0) {
  839. !         if (fflush(new) != EOF) break;
  840. !         fclose(new);
  841. !     }
  842.       unlink(new_name);
  843.       if (!nntp_failed) {
  844.           log_entry('N', "LIST empty");
  845. ***************
  846. *** 886,894 ****
  847.       if (mode == 1 && !last_copy_blank)
  848.           fputc(NL, tmp); /* add blank line after header */
  849.   
  850.       cptr->art = article;
  851.       cptr->grp = group_hd;
  852. -     fclose(tmp);
  853.       goto out;
  854.   
  855.        case OK_BODY:
  856. --- 889,897 ----
  857.       if (mode == 1 && !last_copy_blank)
  858.           fputc(NL, tmp); /* add blank line after header */
  859.   
  860. +     if (fclose(tmp) == EOF) goto err;
  861.       cptr->art = article;
  862.       cptr->grp = group_hd;
  863.       goto out;
  864.   
  865.        case OK_BODY:
  866. ***************
  867. *** 896,902 ****
  868.       fseek(tmp, (off_t)0, 2);
  869.       if (copy_text(tmp) < 0)
  870.           return NULL;
  871. !     fclose(tmp);
  872.       goto out;
  873.       
  874.        case ERR_NOARTIG:
  875. --- 899,905 ----
  876.       fseek(tmp, (off_t)0, 2);
  877.       if (copy_text(tmp) < 0)
  878.           return NULL;
  879. !     if (fclose(tmp) == EOF) goto err;
  880.       goto out;
  881.       
  882.        case ERR_NOARTIG:
  883. ***************
  884. *** 911,916 ****
  885. --- 914,922 ----
  886.   
  887.    out:
  888.       return open_file(cptr->file_name, OPEN_READ|MUST_EXIST);
  889. +  err:
  890. +     sys_error('N', "Cannot write temporary file %s", cptr->file_name);
  891.   }
  892.   
  893.   /*
  894. *** ./LAST/patchlevel.h    Sat May  5 19:02:38 1990
  895. --- patchlevel.h    Thu May 10 13:06:05 1990
  896. ***************
  897. *** 10,16 ****
  898.    *    1989-09-08: Release 6.3.7    (FTP)
  899.    *    1990-03-03: Release 6.4beta    (FTP)
  900.    *    1990-05-07: Release 6.4        (comp.sources.unix)
  901.    */
  902.   
  903. ! #define PATCHLEVEL 0
  904.   
  905. --- 10,18 ----
  906.    *    1989-09-08: Release 6.3.7    (FTP)
  907.    *    1990-03-03: Release 6.4beta    (FTP)
  908.    *    1990-05-07: Release 6.4        (comp.sources.unix)
  909. +  *
  910. +  *    1990-05-10: Patch #1 (6.4.1)
  911.    */
  912.   
  913. ! #define PATCHLEVEL 1
  914.   
  915. *** ./LAST/sequence.c    Mon Apr 23 18:25:53 1990
  916. --- sequence.c    Tue May  8 15:15:11 1990
  917. ***************
  918. *** 348,356 ****
  919.           start_group_search(gname);
  920.   
  921.           while (gh = get_group_search()) {
  922.           if (!enter_sequence(mode, gh)) continue;
  923.   
  924. !         if (merge_groups && (gh->group_flag & G_UNSUBSCRIBED) == 0) {
  925.               if (mp_group == NULL) {
  926.               gh->group_flag |= G_MERGE_HEAD;
  927.               } else {
  928. --- 348,358 ----
  929.           start_group_search(gname);
  930.   
  931.           while (gh = get_group_search()) {
  932. +         if (merge_groups && gh->group_flag & G_UNSUBSCRIBED) continue;
  933.           if (!enter_sequence(mode, gh)) continue;
  934.   
  935. !         if (merge_groups) {
  936.               if (mp_group == NULL) {
  937.               gh->group_flag |= G_MERGE_HEAD;
  938.               } else {
  939. *** ./LAST/term.c    Thu Apr 26 21:15:34 1990
  940. --- term.c    Wed May  9 12:29:26 1990
  941. ***************
  942. *** 61,67 ****
  943.   static char XBC[64], XUP[64];
  944.   static char enter_ca_mode[64], exit_ca_mode[64];
  945.   static char cursor_home[64];
  946. ! static char cursor_address[64];
  947.   static char clear_screen[64];
  948.   static char clr_eol[64];
  949.   static char clr_eos[64];
  950. --- 61,67 ----
  951.   static char XBC[64], XUP[64];
  952.   static char enter_ca_mode[64], exit_ca_mode[64];
  953.   static char cursor_home[64];
  954. ! static char cursor_address[128];
  955.   static char clear_screen[64];
  956.   static char clr_eol[64];
  957.   static char clr_eos[64];
  958. *** ./LAST/variable.c    Wed May  2 17:30:03 1990
  959. --- variable.c    Wed May  9 17:48:38 1990
  960. ***************
  961. *** 35,40 ****
  962. --- 35,41 ----
  963.       *response_dflt_answer,
  964.       *save_counter_format,
  965.       *spell_checker,
  966. +     *trusted_escapes,
  967.       unshar_command[],
  968.       *unshar_header_file,
  969.       *user_shell;
  970. ***************
  971. *** 302,307 ****
  972. --- 303,309 ----
  973.       "suggest-default-save",     BOOL 0,        (char **)&suggest_save_file,
  974.       "tidy-newsrc",        BOOL 0,        (char **)&tidy_newsrc,
  975.       "time",            BOOL 0,        (char **)&show_current_time,
  976. +     "trusted-escape-codes",    STR 0,        (char **)&trusted_escapes,
  977.       "unshar-command",        STR SAFE 1,    (char **)unshar_command,
  978.       "unshar-header-file",    STR 0,        (char **)&unshar_header_file,
  979.       "unsubscribe-mark-read",    BOOL 4,        (char **)&keep_unsub_long,
  980.  
  981.  
  982. ---
  983. Kim F. Storm        storm@texas.dk        Tel +45 429 174 00
  984. Texas Instruments, Marielundvej 46E, DK-2730 Herlev, Denmark
  985.       No news is good news, but nn is better!
  986.