*** /usr/storm/nn6.3.1/patchlevel.h --- patchlevel.h ************** *** 9,14 * 1989-05-30: Distributed release 6.3 (World) * * 1989-06-06: Patch 1: rc.c */ #define PATCHLEVEL 1 --- 9,15 ----- * 1989-05-30: Distributed release 6.3 (World) * * 1989-06-06: Patch 1: rc.c + * 1989-06-28: Patch 2: several files */ #define PATCHLEVEL 2 ************** *** 11,15 * 1989-06-06: Patch 1: rc.c */ ! #define PATCHLEVEL 1 --- 12,16 ----- * 1989-06-28: Patch 2: several files */ ! #define PATCHLEVEL 2 *** /usr/storm/nn6.3.0/answer.c --- answer.c ************** *** 256,263 return 2; } } else { ! fputs("\rConfirm cancel: ", stdout); clrline(); ! if (yes(1) <= 0) return 0; } f = open_news_article(ah, FILL_NEWS_HEADER|GET_ALL_FIELDS, nhbuf, (char *)NULL); --- 256,263 ----- return 2; } } else { ! prompt("Confirm cancel: '%.50s'", ah->subject ? ah->subject : ""); ! if (yes(1) <= 0) return 1; } f = open_news_article(ah, FILL_NEWS_HEADER|GET_ALL_FIELDS, nhbuf, (char *)NULL); ************** *** 262,268 f = open_news_article(ah, FILL_NEWS_HEADER|GET_ALL_FIELDS, nhbuf, (char *)NULL); if (f == NULL) { ! msg("Can't find original article"); return 2; } fclose(f); --- 262,268 ----- f = open_news_article(ah, FILL_NEWS_HEADER|GET_ALL_FIELDS, nhbuf, (char *)NULL); if (f == NULL) { ! msg("Article not found"); return 2; } fclose(f); ************** *** 275,281 if (aux_sh("cancel", news.ng_ident, current_group->group_name, "Not canceled")) ! return 3; return 1; } --- 275,281 ----- if (aux_sh("cancel", news.ng_ident, current_group->group_name, "Not canceled")) ! return -1; return 0; } ************** *** 277,283 news.ng_ident, current_group->group_name, "Not canceled")) return 3; ! return 1; } --- 277,283 ----- news.ng_ident, current_group->group_name, "Not canceled")) return -1; ! return 0; } *** /usr/storm/nn6.3.0/data.h --- data.h ************** *** 56,62 # define G_SUBSCRIPTION CF(1) /* from .rc */ # define G_READ CF(2) /* group has been read */ - # define G_RC_UPDATED CF(3) /* .rc is updated */ # define G_DONE CF(4) /* finished with this group */ # define G_NEW CF(5) /* new group */ # define G_FOLDER CF(6) /* "group" is a folder file */ --- 56,61 ----- # define G_SUBSCRIPTION CF(1) /* from .rc */ # define G_READ CF(2) /* group has been read */ # define G_DONE CF(4) /* finished with this group */ # define G_NEW CF(5) /* new group */ # define G_FOLDER CF(6) /* "group" is a folder file */ *** /usr/storm/nn6.3.0/folder.c --- folder.c ************** *** 402,408 int cc_save; fake_group.group_name = path; ! fake_group.group_flag = G_RC_UPDATED | G_FOLDER | G_READ; init_group(&fake_group); folder = open_file(group_path_name, OPEN_READ); --- 402,409 ----- int cc_save; fake_group.group_name = path; ! fake_group.group_flag = G_FOLDER | G_READ; ! current_group = NULL; init_group(&fake_group); folder = open_file(group_path_name, OPEN_READ); ************** *** 486,493 if (cancel_count) { clrdisp(); printf("Folder: %s\nFile: %s\n\n", buffer, group_path_name); ! printf("Remove %d article%s from folder? ", ! cancel_count, cancel_count == 1 ? "" : "s"); fl; switch (yes(1)) { --- 487,497 ----- if (cancel_count) { clrdisp(); printf("Folder: %s\nFile: %s\n\n", buffer, group_path_name); ! if (cancel_count == n_articles) ! printf("Cancel all articles and remove folder? "); ! else ! printf("Remove %d article%s from folder? ", ! cancel_count, cancel_count == 1 ? "" : "s"); fl; switch (yes(1)) { ************** *** 493,499 switch (yes(1)) { case 1: printf("\n\n"); ! rewrite_folder(); break; case 0: break; --- 497,509 ----- switch (yes(1)) { case 1: printf("\n\n"); ! if (cancel_count == n_articles) { ! if (unlink(group_path_name) < 0) { ! printf("Could not unlink %s\n", group_path_name); ! sleep(3); ! } ! } else ! rewrite_folder(); break; case 0: break; ************** *** 526,533 strcpy(oldfile, group_path_name); sp = strrchr(oldfile, '/'); ! if (!sp) goto move_error; ! strcpy(sp+1, "~OLD~FOLDER~"); unlink(oldfile); if (link(group_path_name, oldfile) < 0) goto move_error; --- 536,542 ----- strcpy(oldfile, group_path_name); sp = strrchr(oldfile, '/'); ! strcpy((sp == NULL ? oldfile : sp+1), "~OLD~FOLDER~"); unlink(oldfile); if (link(group_path_name, oldfile) < 0) goto move_error; *** /usr/storm/nn6.3.0/group.c --- group.c ************** *** 376,383 if ((gh->last_article = gh->first_l_article - 1) < 0) gh->last_article = 0; gh->first_article = gh->last_article; ! updflag = gh->group_flag & (G_RC_UPDATED|G_READ); ! gh->group_flag &= ~(G_RC_UPDATED|G_READ); update_rc(gh); gh->group_flag &= ~(G_RC_UPDATED|G_READ); gh->group_flag |= updflag; --- 376,383 ----- if ((gh->last_article = gh->first_l_article - 1) < 0) gh->last_article = 0; gh->first_article = gh->last_article; ! updflag = gh->group_flag & G_READ; ! gh->group_flag &= ~G_READ; update_rc(gh); gh->group_flag &= ~G_READ; gh->group_flag |= updflag; ************** *** 379,385 updflag = gh->group_flag & (G_RC_UPDATED|G_READ); gh->group_flag &= ~(G_RC_UPDATED|G_READ); update_rc(gh); ! gh->group_flag &= ~(G_RC_UPDATED|G_READ); gh->group_flag |= updflag; } --- 379,385 ----- updflag = gh->group_flag & G_READ; gh->group_flag &= ~G_READ; update_rc(gh); ! gh->group_flag &= ~G_READ; gh->group_flag |= updflag; } ************** *** 455,461 if (menu_cmd == ME_READ || menu_cmd == ME_NO_ARTICLES) { if (did_selection) { ! int was_read = gh->group_flag & (G_READ|G_RC_UPDATED); prev_last = gh->last_l_article; gh->last_l_article = last_article; --- 455,461 ----- if (menu_cmd == ME_READ || menu_cmd == ME_NO_ARTICLES) { if (did_selection) { ! int was_read = gh->group_flag & G_READ; prev_last = gh->last_l_article; gh->last_l_article = last_article; ************** *** 463,469 gh->last_l_article = prev_last; if (last_article < gh->last_l_article) { ! gh->group_flag &= ~ (G_READ|G_RC_UPDATED); gh->group_flag |= was_read; release_memory(&sel_marker); goto after_selection; --- 463,469 ----- gh->last_l_article = prev_last; if (last_article < gh->last_l_article) { ! gh->group_flag &= ~G_READ; gh->group_flag |= was_read; release_memory(&sel_marker); goto after_selection; ************** *** 470,479 } } else if (submask == NULL && !also_read_articles && ! (menu_cmd != ME_NO_ARTICLES || ! (gh->group_flag & G_NEW) == 0) && ! (first_art == -1 || ! current_first_article == gh->first_article + 1)) update_rc(gh); } --- 470,478 ----- } } else if (submask == NULL && !also_read_articles && ! (first_art == -1 || current_first_article == gh->first_article + 1)) { ! if (menu_cmd != ME_NO_ARTICLES) ! gh->group_flag &= ~G_NEW; update_rc(gh); } } ************** *** 475,480 (first_art == -1 || current_first_article == gh->first_article + 1)) update_rc(gh); } current_first_article = o_first_article; --- 474,480 ----- if (menu_cmd != ME_NO_ARTICLES) gh->group_flag &= ~G_NEW; update_rc(gh); + } } current_first_article = o_first_article; ************** *** 890,896 if (yes(0) <= 0) return 0; add_unread(gh, -1); ! gh->group_flag &= ~G_SUBSCRIPTION; write_rc_entry(gh, 0); return 1; } --- 890,896 ----- if (yes(0) <= 0) return 0; add_unread(gh, -1); ! gh->group_flag &= ~(G_SUBSCRIPTION | G_NEW); write_rc_entry(gh, 0); return 1; } *** /usr/storm/nn6.3.0/keymap.c --- keymap.c ************** *** 418,423 "compress", K_COMPRESS, K_ONLY_MORE, "continue", K_CONTINUE, 0, "find", K_GOTO_MATCH, K_ONLY_MORE, "find-next", K_NEXT_MATCH, K_ONLY_MORE, "follow", K_FOLLOW_UP, 0, --- 418,425 ----- "compress", K_COMPRESS, K_ONLY_MORE, "continue", K_CONTINUE, 0, + "decode", K_UUDECODE, 0, + "find", K_GOTO_MATCH, K_ONLY_MORE, "find-next", K_NEXT_MATCH, K_ONLY_MORE, "follow", K_FOLLOW_UP, 0, *** /usr/storm/nn6.3.0/keymap.h --- keymap.h ************** *** 35,40 #define K_UNSUBSCRIBE 0x001b /* (un)subscribe to group */ #define K_GROUP_OVERVIEW 0x001c /* group overview */ #define K_PATCH 0x001d /* pipe article to patch */ #define K_GOTO_GROUP 0x0020 /* goto named group/folder */ --- 35,41 ----- #define K_UNSUBSCRIBE 0x001b /* (un)subscribe to group */ #define K_GROUP_OVERVIEW 0x001c /* group overview */ #define K_PATCH 0x001d /* pipe article to patch */ + #define K_UUDECODE 0x001e /* uudecode articles */ #define K_GOTO_GROUP 0x0020 /* goto named group/folder */ *** /usr/storm/nn6.3.0/init.c --- init.c ************** *** 190,195 "cd", 2, 1, "compile", 7, 0, "coredump", 8, 0, "define", 6, 0, "help", 4, 2, "man", 3, 0, --- 190,196 ----- "cd", 2, 1, "compile", 7, 0, "coredump", 8, 0, + "decode", 6, 0, "define", 6, 0, "help", 4, 2, "man", 3, 0, ************** *** 550,557 } CASE( "unread" ) { ! if (restore_rc(current_group, argv(2) ? ARGVAL(2) : 0)) ! return AC_HEADER; break; } --- 551,566 ----- } CASE( "unread" ) { ! group_header *gh; ! int ix = 1; ! ! if (argv(1) && (gh = lookup(argv(1))) != NULL) ! ix = 2; ! else ! gh = current_group; ! ! if (restore_rc(gh, argv(ix) ? ARGVAL(ix) : 0)) ! if (gh == current_group) return AC_HEADER; break; } *** /usr/storm/nn6.3.1/install_aux --- install_aux ************** *** 26,32 echo "INSTALLATION COMPLETED" ! if [ -n "$2" ] then echo echo "--------------------------------------------------------" --- 26,32 ----- echo "INSTALLATION COMPLETED" ! if [ $# -gt 1 ] then echo echo "--------------------------------------------------------" *** /usr/storm/nn6.3.0/MANIFEST --- MANIFEST ************** *** 20,25 db.c db.h debug.h digest.c execute.c expire.c --- 20,26 ----- db.c db.h debug.h + decode.c digest.c execute.c expire.c ************** *** 96,101 routes.sample s-bsd4-2.h s-bsd4-3.h s-hpux.h s-hpux2-1.h s-sunos3.h --- 97,103 ----- routes.sample s-bsd4-2.h s-bsd4-3.h + s-dnix5-2.h s-hpux.h s-hpux2-1.h s-hpux3-0.h ************** *** 98,103 s-bsd4-3.h s-hpux.h s-hpux2-1.h s-sunos3.h s-sunos4-0.h s-template.h --- 100,106 ----- s-dnix5-2.h s-hpux.h s-hpux2-1.h + s-hpux3-0.h s-sunos3.h s-sunos4-0.h s-template.h *** /usr/storm/nn6.3.0/menu.c --- menu.c ************** *** 433,439 } last_k_cmd = cur_k_cmd; ! cur_k_cmd = k_cmd = get_k_cmd(); if (any_message) clrmsg(-1); alt_key: --- 433,439 ----- } last_k_cmd = cur_k_cmd; ! k_cmd = get_k_cmd(); if (any_message) clrmsg(-1); alt_key: ************** *** 438,444 alt_key: ! switch (k_cmd) { case K_UNBOUND: ding(); --- 438,444 ----- alt_key: ! switch (cur_k_cmd = k_cmd) { case K_UNBOUND: ding(); ************** *** 494,499 case K_QUIT: menu_return(ME_QUIT); case K_SAVE_NO_HEADER: case K_SAVE_SHORT_HEADER: case K_SAVE_FULL_HEADER: --- 494,504 ----- case K_QUIT: menu_return(ME_QUIT); + case K_CANCEL: + savemode = "Cancel"; + fname = ""; + goto cancel1; + case K_SAVE_NO_HEADER: case K_SAVE_SHORT_HEADER: case K_SAVE_FULL_HEADER: ************** *** 500,506 case K_PRINT: case K_UNSHAR: case K_PATCH: ! if (numa < 0) goto nextmenu; fname = init_save(k_cmd, &savemode); --- 505,512 ----- case K_PRINT: case K_UNSHAR: case K_PATCH: ! case K_UUDECODE: ! if (numa < 0) goto nextmenu; fname = init_save(k_cmd, &savemode); ************** *** 506,511 fname = init_save(k_cmd, &savemode); if (fname == NULL) goto Prompt; enable_stop = 0; save_selected = 0; doing_unshar = k_cmd == K_UNSHAR || k_cmd == K_PATCH; --- 512,518 ----- fname = init_save(k_cmd, &savemode); if (fname == NULL) goto Prompt; + cancel1: enable_stop = 0; save_selected = 0; doing_unshar = k_cmd == K_UNSHAR || k_cmd == K_PATCH; ************** *** 542,547 ah = articles[article_id]; if (save_selected && (ah->flag & A_SELECT) == 0) continue; if (doing_unshar) { did_unshar++; } else --- 549,576 ----- ah = articles[article_id]; if (save_selected && (ah->flag & A_SELECT) == 0) continue; + if (cur_k_cmd == K_CANCEL) { + if (current_group->group_flag & G_FOLDER) { + if ((ah->flag & A_CANCEL) == 0) fcancel(ah); + } else + switch (cancel(ah)) { + case -1: + did_unshar = 1; + continue; + case 0: + ah->flag |= A_CANCEL; + break; + default: + continue; + } + + if (!did_unshar) { + how = CANCEL; + mark(); + } + continue; + } + if (doing_unshar) { did_unshar++; } else ************** *** 547,552 } else if (cura >= 0 && cura <= numa) prompt("Processing %c...", ident[cura]); else prompt("Processing entry %d...", article_id); --- 576,583 ----- } else if (cura >= 0 && cura <= numa) prompt("Processing %c...", ident[cura]); + else if (ah->subject != NULL) + prompt("Processing '%.50s'...", ah->subject); else prompt("Processing entry %d...", article_id); ************** *** 572,578 m_endinput(); enable_stop = 1; ! end_save(); if (did_unshar) { any_key(0); --- 603,610 ----- m_endinput(); enable_stop = 1; ! if (cur_k_cmd != K_CANCEL) ! end_save(); if (did_unshar) { printf("\r\n"); ************** *** 575,580 end_save(); if (did_unshar) { any_key(0); goto redraw; } --- 607,613 ----- end_save(); if (did_unshar) { + printf("\r\n"); any_key(0); goto redraw; } ************** *** 612,618 goto redraw; goto Prompt; ! case K_CANCEL: if (numa < 0) goto nextmenu; --- 645,651 ----- goto redraw; goto Prompt; ! /* case K_CANCEL: if (numa < 0) goto nextmenu; ************** *** 632,638 if (get_k_cmd() == K_ARTICLE_ID) if (cancel(articles[firsta+article_id]) & 1) goto redraw; goto Prompt; ! case K_UNSUBSCRIBE: if (unsubscribe(current_group)) { if (!(current_group->group_flag & G_SUBSCRIPTION)) --- 665,671 ----- if (get_k_cmd() == K_ARTICLE_ID) if (cancel(articles[firsta+article_id]) & 1) goto redraw; goto Prompt; ! */ case K_UNSUBSCRIBE: if (unsubscribe(current_group)) { if (!(current_group->group_flag & G_SUBSCRIPTION)) *** /usr/storm/nn6.3.0/mk_online_man --- mk_online_man ************** *** 6,11 -e '/^\.\\"/d' \ -e '/^\.nf/d' \ -e '/^\.fi/d' \ -e 's/^\.[BI] //' "$@" | awk ' BEGIN { --- 6,15 ----- -e '/^\.\\"/d' \ -e '/^\.nf/d' \ -e '/^\.fi/d' \ + -e '/^\.if/d' \ + -e '/^\.DT/d' \ + -e '/^\.ta/d' \ + -e '/^\.nr/d' \ -e 's/^\.[BI] //' "$@" | awk ' BEGIN { *** /usr/storm/nn6.3.0/more.c --- more.c ************** *** 58,64 register c, col, lno; register FILE *art; int more_cmd, eof, skip_spaces, has_space, window_lines; ! int form_feed, ignore_nl; off_t firstl, lastl; off_t linepos[LINEMAX]; char linebuf[200], *lp; --- 58,64 ----- register c, col, lno; register FILE *art; int more_cmd, eof, skip_spaces, has_space, window_lines; ! int form_feed, last_ff_line, ignore_nl; off_t firstl, lastl; off_t linepos[LINEMAX]; char linebuf[200], *lp; ************** *** 141,147 rot13 = 0; compress_space = 0; ! goto_line = -1, prev_goto = 1; match_lines = match_redraw = match_expr = 0; underline_line = -1; fake_underline = 0; --- 141,147 ----- rot13 = 0; compress_space = 0; ! last_ff_line = goto_line = -1, prev_goto = 1; match_lines = match_redraw = match_expr = 0; underline_line = -1; fake_underline = 0; ************** *** 398,403 switch (c) { case '\f': if (lp == linebuf) { if (goto_line && lno == lno1) goto next_line; form_feed = 1; --- 398,404 ----- switch (c) { case '\f': + last_ff_line = linenum; if (lp == linebuf) { if (goto_line > 0 || match_expr || lno == lno1) goto next_line; form_feed = 1; ************** *** 399,405 case '\f': if (lp == linebuf) { ! if (goto_line && lno == lno1) goto next_line; form_feed = 1; goto Prompt; } --- 400,406 ----- case '\f': last_ff_line = linenum; if (lp == linebuf) { ! if (goto_line > 0 || match_expr || lno == lno1) goto next_line; form_feed = 1; goto Prompt; } ************** *** 475,480 match_lines = 1; if (linenum > match_botline) { match_redraw = 0; linenum -= 5; goto next_page; } --- 476,482 ----- match_lines = 1; if (linenum > match_botline) { match_redraw = 0; + if (last_ff_line > linenum) last_ff_line = -1; linenum -= 5; if (linenum < last_ff_line) linenum = last_ff_line; goto next_page; ************** *** 476,481 if (linenum > match_botline) { match_redraw = 0; linenum -= 5; goto next_page; } match_redraw = (stop_line < 0); --- 478,484 ----- match_redraw = 0; if (last_ff_line > linenum) last_ff_line = -1; linenum -= 5; + if (linenum < last_ff_line) linenum = last_ff_line; goto next_page; } match_redraw = (stop_line < 0); ************** *** 665,670 case K_PRINT: case K_UNSHAR: case K_PATCH: putchar(CR); if (init_save(c, (char **)NULL) != NULL) { --- 668,674 ----- case K_PRINT: case K_UNSHAR: case K_PATCH: + case K_UUDECODE: putchar(CR); if (init_save(c, (char **)NULL) != NULL) { ************** *** 695,701 goto Prompt; } ! if (cancel(ah) == 0) goto Prompt; more_return(MC_NEXT); case K_UNSUBSCRIBE: --- 699,705 ----- goto Prompt; } ! if (cancel(ah) > 0) goto Prompt; more_return(MC_NEXT); case K_UNSUBSCRIBE: *** /usr/storm/nn6.3.0/nn.1 --- nn.1 ************** *** 768,773 article through the patch command. The output from the patch process will be piped through the pager defined in the \fBpager\fP variable and appear on the screen. .TP \&\fB:unshar\fP {\fBunshar\fP} Unshar articles. You will be prompted for the name of a directory in --- 768,775 ----- article through the patch command. The output from the patch process will be piped through the pager defined in the \fBpager\fP variable and appear on the screen. + The output is also saved in (or appended to) a file named + \fIPatch.Result\fP in the patch directory. .TP \&\fB:unshar\fP {\fBunshar\fP} Unshar articles. You will be prompted for the name of a directory in ************** *** 777,782 During the unpacking, the normal output from the unshar process will appear on the screen, and the menu or article text will be redrawn when the process is finished. .LP In reading mode, the following keys can also be used to invoke the save commands: --- 779,802 ----- During the unpacking, the normal output from the unshar process will appear on the screen, and the menu or article text will be redrawn when the process is finished. + The output is also saved in (or appended to) a file named + \fIUnshar.Result\fP in the unshar directory. + .TP + \&\fB:decode\fP {\fBdecode\fP} + Decode \fIuuencoded\fP articles into binary files. You will be + prompted for the name of a directory in which you want \fInn\fP to + place the decoded binary files (the file names are taken from the + uuencoded data). + \fInn\fP will combine several articles into single files as needed, + and you can even decode unrelated packages (into the same directory) + with one \fBdecode\fP command. + To be able to decode a binary file which spans several articles, + \fInn\fP may have to \fIignore\fP lines which fail the normal sanity checks + on uuencoded data instead of treating them as \fItransmission errors\fP. + Consequently, it is strongly recommended to check the resulting + decoded file using the checksum which is normally contained in the + original article. (Actually, you are also supposed to do this after + decoding with a stand-alone uudecode program). .LP In reading mode, the following keys can also be used to invoke the save commands: ************** *** 1546,1553 in the order in which they arrived on the local system (which is a completely arbitrary order). .TP ! \fB:unread\fP [ \fIarticles\fP ] ! Mark the current group as unread. If the argument is omitted, the number of unread articles in the group will be set to the number of unread articles when \fInn\fP was invoked. Otherwise, the argument specifies the number of unread articles. --- 1566,1574 ----- in the order in which they arrived on the local system (which is a completely arbitrary order). .TP ! \fB:unread\fP [ \fIgroup\fP ] [ \fIarticles\fP ] ! Mark the current (or specified) group as unread. If the ! \fIarticles\fP argument is omitted, the number of unread articles in the group will be set to the number of unread articles when \fInn\fP was invoked. Otherwise, the argument specifies the number of unread articles. *** /usr/storm/nn6.3.0/nngrep.sh --- nngrep.sh ************** *** 8,13 if [ "$1" = "-a" ] ; then grep "$2" .nn/rc else ! grep "^+ .* .*$1" .nn/rc fi | awk '{print $3}' --- 8,13 ----- if [ "$1" = "-a" ] ; then grep "$2" .nn/rc else ! grep "^[+=] .* .*$1" .nn/rc fi | awk '{print $3}' *** /usr/storm/nn6.3.0/nntidy.sh --- nntidy.sh ************** *** 35,41 if (act) { X[$1] = 1 L[$1] = $2+0 ! if (L[$1] == 0) F[$1] = 0; else F[$1] = $3+0 } next } --- 35,41 ----- if (act) { X[$1] = 1 L[$1] = $2+0 ! if (L[$1] == 0 || $3+0 == 0) F[$1] = 0; else F[$1] = $3-1 } next } ************** *** 43,49 print $0 next } ! NF == 3 && ($1 == "!" || $1 == "+") { if (X[$3] != 1) next S[$3] = $1 if (L[$3] >= $2+0) --- 43,49 ----- print $0 next } ! NF == 3 && ($1 == "!" || $1 == "+" || $1 == "=") { if (X[$3] != 1) next S[$3] = $1 if (L[$3] >= $2+0) *** /usr/storm/nn6.3.0/nntp.c --- nntp.c ************** *** 32,38 #include /* This is necessary due to the definitions in m-XXX.h */ ! #ifdef NETWORK_BYTE_ORDER #include #endif --- 32,38 ----- #include /* This is necessary due to the definitions in m-XXX.h */ ! #ifndef NETWORK_DATABASE #include #else #ifdef NETWORK_BYTE_ORDER ************** *** 34,39 /* This is necessary due to the definitions in m-XXX.h */ #ifdef NETWORK_BYTE_ORDER #include #endif export char nntp_server[256]; /* name of nntp server */ --- 34,42 ----- /* This is necessary due to the definitions in m-XXX.h */ #ifndef NETWORK_DATABASE #include + #else + #ifdef NETWORK_BYTE_ORDER + #include #endif #endif ************** *** 35,40 #ifdef NETWORK_BYTE_ORDER #include #endif export char nntp_server[256]; /* name of nntp server */ export int use_nntp = 0; /* bool: t iff we use nntp */ --- 38,44 ----- #ifdef NETWORK_BYTE_ORDER #include #endif + #endif export char nntp_server[256]; /* name of nntp server */ export int use_nntp = 0; /* bool: t iff we use nntp */ ************** *** 150,155 fl; } nntp_failed = 1; sockt_rd = nntp_get_socket(); if ((nntp_in = fdopen(sockt_rd, "r")) == NULL) --- 154,160 ----- fl; } nntp_failed = 1; + is_connected = 0; sockt_rd = nntp_get_socket(); if (sockt_rd < 0) ************** *** 152,158 nntp_failed = 1; sockt_rd = nntp_get_socket(); ! if ((nntp_in = fdopen(sockt_rd, "r")) == NULL) return -1; sockt_wr = dup(sockt_rd); --- 157,167 ----- is_connected = 0; sockt_rd = nntp_get_socket(); ! if (sockt_rd < 0) ! return -1; ! ! if ((nntp_in = fdopen(sockt_rd, "r")) == NULL) { ! close(sockt_rd); return -1; } sockt_wr = dup(sockt_rd); ************** *** 154,160 sockt_rd = nntp_get_socket(); if ((nntp_in = fdopen(sockt_rd, "r")) == NULL) return -1; ! sockt_wr = dup(sockt_rd); if ((nntp_out = fdopen(sockt_wr, "w")) == NULL) { nntp_in = NULL; /* from above */ --- 163,169 ----- if ((nntp_in = fdopen(sockt_rd, "r")) == NULL) { close(sockt_rd); return -1; ! } sockt_wr = dup(sockt_rd); if ((nntp_out = fdopen(sockt_wr, "w")) == NULL) { close(sockt_wr); ************** *** 157,162 sockt_wr = dup(sockt_rd); if ((nntp_out = fdopen(sockt_wr, "w")) == NULL) { nntp_in = NULL; /* from above */ return -1; } --- 166,173 ----- } sockt_wr = dup(sockt_rd); if ((nntp_out = fdopen(sockt_wr, "w")) == NULL) { + close(sockt_wr); + fclose(nntp_in); nntp_in = NULL; /* from above */ return -1; } ************** *** 228,233 if (!is_master) msg("Connecting to %s: %s", nntp_server, syserr()); (void) close(s); } if (x < 0 && !is_master) (*errfct)("Giving up on NNTP server %s!\n", nntp_server); --- 239,245 ----- if (!is_master) msg("Connecting to %s: %s", nntp_server, syserr()); (void) close(s); + s = -1; } if (x < 0 && !is_master) (*errfct)("Giving up on NNTP server %s!\n", nntp_server); ************** *** 240,245 if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) { if (is_master) (*errfct)("Connecting to %s: %s", nntp_server, syserr()); } #endif --- 252,258 ----- if (connect(s, (struct sockaddr *) &sin, sizeof(sin)) < 0) { if (is_master) (*errfct)("Connecting to %s: %s", nntp_server, syserr()); + s = -1; } #endif ************** *** 261,266 fprintf(nntp_out, "%s\r\n", string); if (fflush(nntp_out) == EOF) { nntp_error(); } } --- 274,280 ----- fprintf(nntp_out, "%s\r\n", string); if (fflush(nntp_out) == EOF) { nntp_error(); + return -1; } return 0; } ************** *** 262,267 if (fflush(nntp_out) == EOF) { nntp_error(); } } /* --- 276,282 ----- nntp_error(); return -1; } + return 0; } /* ************** *** 277,283 { register char *cp, *nl; - errno = 0; if (fgets(string, size, nntp_in) == NULL) { nntp_error(); return -1; --- 292,297 ----- { register char *cp, *nl; if (fgets(string, size, nntp_in) == NULL) { nntp_error(); return -1; ************** *** 323,329 if (!nntp_failed) { /* avoid infinite recursion */ char line[NNTP_STRLEN]; ! nntp_put_server("QUIT"); (void) nntp_get_server(line, sizeof line); } --- 337,343 ----- if (!nntp_failed) { /* avoid infinite recursion */ char line[NNTP_STRLEN]; ! (void) nntp_put_server("QUIT"); (void) nntp_get_server(line, sizeof line); } ************** *** 344,352 char *string; int size; { ! (void)nntp_put_server(string); ! ! if (nntp_get_server(string, size) < 0) return -1; #ifdef DEBUG msg("<<< %.75s", string); --- 358,364 ----- char *string; int size; { ! if (nntp_put_server(string) < 0 || nntp_get_server(string, size) < 0) return -1; #ifdef DEBUG msg("<<< %.75s", string); ************** *** 367,374 { nntp_failed = 1; if (is_master) { ! log_entry('N', "Lost connection to server %s: %s", nntp_server, syserr()); ! if (is_connected) nntp_close_server(); } else { #ifdef DEBUG --- 379,386 ----- { nntp_failed = 1; if (is_master) { ! if (is_connected) { ! log_entry('N', "Lost connection to server %s: %s", nntp_server, syserr()); nntp_close_server(); } } else { ************** *** 370,375 log_entry('N', "Lost connection to server %s: %s", nntp_server, syserr()); if (is_connected) nntp_close_server(); } else { #ifdef DEBUG printf("Can't talk to NNTP server %s: %s", nntp_server, syserr()); --- 382,388 ----- if (is_connected) { log_entry('N', "Lost connection to server %s: %s", nntp_server, syserr()); nntp_close_server(); + } } else { #ifdef DEBUG printf("Can't talk to NNTP server %s: %s", nntp_server, syserr()); *** /usr/storm/nn6.3.0/nnusage.sh --- nnusage.sh ************** *** 8,16 grep '^U:' $LIB/Log | ! awk ' ! NF == 7 { ! if (split($7, t, ".") == 2) u[$5] += t[1] * 60 + t[2] } END { for (n in u) { --- 8,16 ----- grep '^U:' $LIB/Log | ! awk ' ! BEGIN { ! any=0 } NF == 7 { if (split($7, t, ".") == 2) { ************** *** 12,17 NF == 7 { if (split($7, t, ".") == 2) u[$5] += t[1] * 60 + t[2] } END { for (n in u) { name=substr(n, 2, length(n)-3) --- 12,23 ----- BEGIN { any=0 } + NF == 7 { + if (split($7, t, ".") == 2) { + u[$5] += t[1] * 60 + t[2] + any=1 + } + } END { if (!any) { printf("No usage statistics\n") ************** *** 13,18 if (split($7, t, ".") == 2) u[$5] += t[1] * 60 + t[2] } END { for (n in u) { name=substr(n, 2, length(n)-3) printf("%s%16d.%02d\n", name, u[n]/60, u[n]%60); --- 19,28 ----- } } END { + if (!any) { + printf("No usage statistics\n") + exit + } for (n in u) { name=substr(n, 2, length(n)-3) printf("%-10.10s%8d.%02d\n", name, u[n]/60, u[n]%60); ************** *** 15,21 END { for (n in u) { name=substr(n, 2, length(n)-3) ! printf("%s%16d.%02d\n", name, u[n]/60, u[n]%60); } }' | --- 25,31 ----- } for (n in u) { name=substr(n, 2, length(n)-3) ! printf("%-10.10s%8d.%02d\n", name, u[n]/60, u[n]%60); } }' | *** /usr/storm/nn6.3.0/prefix.sh --- prefix.sh ************** *** 5,10 #include "update.h" --------CUT PREFIX HERE-------- &!/bin/sh & Release RELEASE,VERSION,PATCHLEVEL, No. UPDATE --- 5,11 ----- #include "update.h" --------CUT PREFIX HERE-------- + #ifndef AVOID_SHELL_EXEC &!/bin/sh #endif ************** *** 6,11 --------CUT PREFIX HERE-------- &!/bin/sh & Release RELEASE,VERSION,PATCHLEVEL, No. UPDATE --- 7,13 ----- --------CUT PREFIX HERE-------- #ifndef AVOID_SHELL_EXEC &!/bin/sh + #endif & Release RELEASE,VERSION,PATCHLEVEL, No. UPDATE *** /usr/storm/nn6.3.1/rc.c --- rc.c ************** *** 45,51 * master file has been read in */ ! #define G_OLD G_NEW /* inverse use during rc reading */ #define G_RENUM G_DONE --- 45,51 ----- * master file has been read in */ ! #define G_OLD G_SELECTION #define G_RENUM G_DONE ************** *** 166,172 fputc(NL, bak); } ! if (SUBSCR(line) != '+' && SUBSCR(line) != '!') { /* unrecognized line */ continue; } --- 166,172 ----- fputc(NL, bak); } ! if (SUBSCR(line) != '+' && SUBSCR(line) != '!' && SUBSCR(line) != '=') { /* unrecognized line */ continue; } ************** *** 182,188 gh->group_flag |= G_OLD; if (SUBSCR(line) == '+') gh->group_flag |= G_SUBSCRIPTION; ! gh->last_article = LASTART(line); if (gh->last_article > gh->last_l_article) --- 182,190 ----- gh->group_flag |= G_OLD; if (SUBSCR(line) == '+') gh->group_flag |= G_SUBSCRIPTION; ! if (SUBSCR(line) == '=') ! gh->group_flag |= G_SUBSCRIPTION | G_NEW; ! gh->last_article = LASTART(line); if (gh->last_article > gh->last_l_article) ************** *** 207,213 if (gh->group_flag & G_OLD) { if (gh->group_flag & G_RENUM) /* group is renumbered */ write_rc_entry(gh, 0); ! gh->group_flag &= ~(G_NEW | G_RENUM); } else { gh->group_flag |= G_SUBSCRIPTION | G_NEW; gh->last_article = gh->first_l_article - 1; --- 209,215 ----- if (gh->group_flag & G_OLD) { if (gh->group_flag & G_RENUM) /* group is renumbered */ write_rc_entry(gh, 0); ! gh->group_flag &= ~(G_OLD | G_RENUM); } else { gh->group_flag |= G_SUBSCRIPTION | G_NEW; gh->last_article = gh->first_l_article - 1; ************** *** 272,278 { add_unread(gh, -1); ! if (no_update || gh->group_flag & G_RC_UPDATED) return; gh->last_article = gh->last_l_article; --- 274,280 ----- { add_unread(gh, -1); ! if (no_update || gh->group_flag & G_READ) return; gh->last_article = gh->last_l_article; ************** *** 284,291 write_rc_entry(gh, 0); - if (gh->group_flag & G_READ) return; - gh->group_flag |= G_READ; if ((gh->group_flag & G_SUBSCRIPTION) == 0) return; --- 286,291 ----- write_rc_entry(gh, 0); gh->group_flag |= G_READ; } ************** *** 287,294 if (gh->group_flag & G_READ) return; gh->group_flag |= G_READ; - - if ((gh->group_flag & G_SUBSCRIPTION) == 0) return; } --- 287,292 ----- write_rc_entry(gh, 0); gh->group_flag |= G_READ; } ************** *** 296,302 register group_header *gh; long count; { ! if (no_update || (count == 0 && (gh->group_flag & G_RC_UPDATED) == 0)) return 0; if (gh->group_flag & G_READ || count > 0) { --- 294,300 ----- register group_header *gh; long count; { ! if (no_update || (count == 0 && (gh->group_flag & G_READ) == 0)) return 0; if (gh->group_flag & G_READ || count > 0) { ************** *** 318,324 write_rc_entry(gh, 0); ! gh->group_flag &= ~(G_READ|G_RC_UPDATED); add_unread(gh, 1); --- 316,322 ----- write_rc_entry(gh, 0); ! gh->group_flag &= ~G_READ; add_unread(gh, 1); ************** *** 469,474 /* update article number */ fprintf(rc, "%c %06ld", /* MUST CHANGE IF LASTARTZ CHANGES */ (gh->group_flag & G_SUBSCRIPTION) ? '+' : '!', (long)(gh->last_article)); --- 467,473 ----- /* update article number */ fprintf(rc, "%c %06ld", /* MUST CHANGE IF LASTARTZ CHANGES */ + (gh->group_flag & G_NEW) ? '=' : (gh->group_flag & G_SUBSCRIPTION) ? '+' : '!', (long)(gh->last_article)); ************** *** 570,578 /* Notice: unread articles before the last read article are lost */ - if (*sub == NL) /* new group */ - continue; - if (subscr) { last = strrchr(sub, '-'); if (last == NULL) last = strrchr(sub, ','); --- 569,574 ----- /* Notice: unread articles before the last read article are lost */ if (subscr) { if (*sub == NL) continue; /* new group */ ************** *** 574,579 continue; if (subscr) { last = strrchr(sub, '-'); if (last == NULL) last = strrchr(sub, ','); if (last == NULL) last = strrchr(sub, ' '); --- 570,577 ----- /* Notice: unread articles before the last read article are lost */ if (subscr) { + if (*sub == NL) continue; /* new group */ + last = strrchr(sub, '-'); if (last == NULL) last = strrchr(sub, ','); if (last == NULL) last = strrchr(sub, ' '); *** /usr/storm/nn6.3.0/s-template.h --- s-template.h ************** *** 128,133 #define SHELL "/bin/sh" /* * Specify the default mailer to be invoked by nnmail */ --- 128,142 ----- #define SHELL "/bin/sh" /* + * Define AVOID_SHELL_EXEC if the system gets confused by + * #!/bin/sh + * lines in shell scripts, e.g. only reads #! and thinks it + * is a csh script. + */ + + /* #define AVOID_SHELL_EXEC /* */ + + /* * Specify the default mailer to be invoked by nnmail */ *** /usr/storm/nn6.3.0/save.c --- save.c ************** *** 44,49 #define IS_PIPE 0x1000 /* output is on pipe */ #define DO_UNSHAR 0x2000 /* unshar article (or patch) */ #define DO_PATCH 0x4000 /* patch article */ /* open modes for open_news_article for the various HEADER_HANDLINGs */ --- 44,50 ----- #define IS_PIPE 0x1000 /* output is on pipe */ #define DO_UNSHAR 0x2000 /* unshar article (or patch) */ #define DO_PATCH 0x4000 /* patch article */ + #define DO_DECODE 0x8000 /* uudecode article */ /* open modes for open_news_article for the various HEADER_HANDLINGs */ ************** *** 144,149 } break; case K_PATCH: save_mode = NO_HEADER | SEPARATE_FILES | DO_UNSHAR | DO_PATCH; mode_text = "Patch"; --- 145,155 ----- } break; + case K_UUDECODE: + save_mode = NO_HEADER | DO_UNSHAR | DO_DECODE; + mode_text = "Decode"; + goto patch1; + case K_PATCH: save_mode = NO_HEADER | SEPARATE_FILES | DO_UNSHAR | DO_PATCH; mode_text = "Patch"; ************** *** 157,170 patch1: prompt("\1%s Directory:\1 ", mode_text); ! save_name = get_s(last_dir, NONE, NONE, file_completion); ! if (save_name == NULL) return NULL; ! if (*save_name == NUL) ! save_name = NULL; ! else { ! strcpy(last_dir, save_name); ! } ! break; case K_PRINT: --- 163,171 ----- patch1: prompt("\1%s Directory:\1 ", mode_text); ! save_name = get_s(last_dir, current_group->save_file, NONE, file_completion); ! if (save_name == NULL || *save_name == NUL) return NULL; ! strcpy(last_dir, save_name); break; case K_PRINT: ************** *** 198,204 if (!(save_mode & IS_PIPE)) { if (file_exist(save_name, (save_mode & DO_UNSHAR) ? "wd" : "wf")) { ! if (conf_append && (save_mode & DO_UNSHAR) == 0) { printf("\rAppend to: %s ? ", save_name); clrline(); if (!yes(0)) return NULL; --- 199,210 ----- if (!(save_mode & IS_PIPE)) { if (file_exist(save_name, (save_mode & DO_UNSHAR) ? "wd" : "wf")) { ! if (save_mode & DO_UNSHAR) { ! int len = strlen(save_name); ! if (save_name[len - 1] != '/') ! strcpy(save_name + len, "/"); ! } else ! if (conf_append) { printf("\rAppend to: %s ? ", save_name); clrline(); if (!yes(0)) return NULL; ************** *** 210,216 } if (save_mode & DO_UNSHAR) { ! strcat(save_name, "/"); } start = ckdir_path(save_name); --- 216,224 ----- } if (save_mode & DO_UNSHAR) { ! int len = strlen(save_name); ! if (save_name[len - 1] != '/') ! strcpy(save_name + len, "/"); } start = ckdir_path(save_name); ************** *** 244,249 save_mode |= FILE_IS_NEW; /* so save() will open it */ #ifdef PAGED_OUTPUT if (save_mode & DO_UNSHAR) { int was_raw = no_raw(); --- 252,262 ----- save_mode |= FILE_IS_NEW; /* so save() will open it */ + if (save_mode & DO_DECODE) { + uud_start(save_name); + save_mode &= ~DO_UNSHAR; + } + #ifdef PAGED_OUTPUT if (save_mode & DO_UNSHAR) { int was_raw = no_raw(); ************** *** 258,264 system("fdcheck"); } #endif ! return save_name; } --- 271,277 ----- system("fdcheck"); } #endif ! return save_name; } ************** *** 284,289 return 0; } if (save_mode & UNIQUE_FILES) { do { uniq_counter++; --- 297,309 ----- return 0; } + if (save_mode & DO_DECODE) { + save_file = NULL; + c = uudecode(ah, art); + fclose(art); + return (c < 0) ? 0 : 1; + } + if (save_mode & UNIQUE_FILES) { do { uniq_counter++; ************** *** 317,323 sprintf(copybuf, "%s %s", unshar_cmd, pager_redir); #else sprintf(copybuf, ! "cd %s && %s | tee %s 2>&1 ; cat %s >> %s.Result ; rm %s", save_name != NULL ? save_name : ".", unshar_cmd, temp_file, temp_file, (save_mode & DO_PATCH) ? "Patch" : "Unshar", --- 337,343 ----- sprintf(copybuf, "%s %s", unshar_cmd, pager_redir); #else sprintf(copybuf, ! "cd %s && { %s 2>&1 ; } | tee %s ; cat %s >> %s.Result ; rm %s", save_name != NULL ? save_name : ".", unshar_cmd, temp_file, temp_file, (save_mode & DO_PATCH) ? "Patch" : "Unshar", ************** *** 450,455 save_file = NULL; } #ifdef PAGED_OUTPUT if (pager_stream != NULL) { pclose(pager_stream); --- 470,478 ----- save_file = NULL; } + if (save_mode & DO_DECODE) { + uud_end(); + } #ifdef PAGED_OUTPUT if (pager_stream != NULL) { pclose(pager_stream); *** /usr/storm/nn6.3.0/selection.c --- selection.c ************** *** 17,22 } header; #ifndef NETWORK_DATABASE #undef ntohl #undef htonl #undef NETWORK_BYTE_ORDER --- 17,27 ----- } header; #ifndef NETWORK_DATABASE + #undef NETWORK_BYTE_ORDER + #define NETWORK_BYTE_ORDER + #endif + + #ifdef NETWORK_BYTE_ORDER #undef ntohl #undef htonl #define ntohl(x) (x) ************** *** 19,25 #ifndef NETWORK_DATABASE #undef ntohl #undef htonl - #undef NETWORK_BYTE_ORDER #define ntohl(x) (x) #define htonl(x) (x) #define NETWORK_BYTE_ORDER --- 24,29 ----- #ifdef NETWORK_BYTE_ORDER #undef ntohl #undef htonl #define ntohl(x) (x) #define htonl(x) (x) #endif ************** *** 22,28 #undef NETWORK_BYTE_ORDER #define ntohl(x) (x) #define htonl(x) (x) - #define NETWORK_BYTE_ORDER #endif struct sel_art { --- 26,31 ----- #undef htonl #define ntohl(x) (x) #define htonl(x) (x) #endif struct sel_art { *** /usr/storm/nn6.3.0/sequence.c --- sequence.c ************** *** 175,181 if (st.st_size == 0 || st.st_mtime < st.st_atime) return; mail_group.group_name = read_mail; ! gh->group_flag = G_FOLDER | G_MAILBOX | G_RC_UPDATED | G_READ; /* "invent" an unread article for read_news */ gh->last_article = 1; --- 175,181 ----- if (st.st_size == 0 || st.st_mtime < st.st_atime) return; mail_group.group_name = read_mail; ! gh->group_flag = G_FOLDER | G_MAILBOX | G_READ; /* "invent" an unread article for read_news */ gh->last_article = 1; ************** *** 367,373 mem_check(gh, 1, "group header"); gh->group_name = name; ! gh->group_flag = flag | G_RC_UPDATED | G_READ; /* "invent" an unread article for read_news */ gh->last_article = 1; --- 367,373 ----- mem_check(gh, 1, "group header"); gh->group_name = name; ! gh->group_flag = flag | G_READ; /* "invent" an unread article for read_news */ gh->last_article = 1; ************** *** 392,398 if (strcmp(group, "NEW") == 0) { gs_mode = GS_NEW_GROUP; ! gs_length = 127; } else { gs_mode = GS_PREFIX; --- 392,398 ----- if (strcmp(group, "NEW") == 0) { gs_mode = GS_NEW_GROUP; ! gs_length = 0; } else { gs_mode = GS_PREFIX; *** /usr/storm/nn6.3.0/term.c --- term.c ************** *** 213,218 if ((term_name = getenv("TERM")) == NULL) user_error("No TERM variable in enviroment"); #ifdef USE_TERMINFO setupterm(0,1,0); --- 213,224 ----- if ((term_name = getenv("TERM")) == NULL) user_error("No TERM variable in enviroment"); + + #ifdef HAVE_TERMIO + ioctl(0, TCGETA, &norm_tty); + #else + ioctl(0, TIOCGETP, &norm_tty); + #endif #ifdef USE_TERMINFO setupterm(0,1,0); ************** *** 291,300 cookie_size = two_cookies = 0; - #ifdef HAVE_TERMIO - - ioctl(0, TCGETA, &norm_tty); - raw_tty = norm_tty; raw_tty.c_iflag &= ~(BRKINT|INLCR|ICRNL|IGNCR); --- 297,302 ----- cookie_size = two_cookies = 0; raw_tty = norm_tty; #ifdef HAVE_TERMIO ************** *** 297,302 raw_tty = norm_tty; raw_tty.c_iflag &= ~(BRKINT|INLCR|ICRNL|IGNCR); raw_tty.c_iflag |= IGNBRK|IGNPAR|ISTRIP; raw_tty.c_oflag &= ~OPOST; --- 299,305 ----- raw_tty = norm_tty; + #ifdef HAVE_TERMIO raw_tty.c_iflag &= ~(BRKINT|INLCR|ICRNL|IGNCR); raw_tty.c_iflag |= IGNBRK|IGNPAR|ISTRIP; raw_tty.c_oflag &= ~OPOST; ************** *** 307,315 raw_tty.c_cc[VEOL] = ((raw_tty.c_cflag & CBAUD) > B1200) ? 1 : 2; #else - - ioctl(0, TIOCGETP, &norm_tty); - ioctl(0, TIOCGETC, &norm_chars); #ifdef TIOCGLTC --- 310,315 ----- raw_tty.c_cc[VEOL] = ((raw_tty.c_cflag & CBAUD) > B1200) ? 1 : 2; #else ioctl(0, TIOCGETC, &norm_chars); #ifdef TIOCGLTC ************** *** 318,325 ospeed = norm_tty.sg_ospeed; if (ospeed < B2400) slow_mode++; - - raw_tty = norm_tty; raw_tty.sg_flags |= RAW; raw_tty.sg_flags &= ~(ECHO|CRMOD); --- 318,323 ----- ospeed = norm_tty.sg_ospeed; if (ospeed < B2400) slow_mode++; raw_tty.sg_flags |= RAW; raw_tty.sg_flags &= ~(ECHO|CRMOD); *** /usr/storm/nn6.3.0/xmakefile --- xmakefile ************** *** 55,61 init.o variable.o term.o keymap.o macro.o regexp.o \ menu.o more.o rc.o group.o folder.o \ articles.o sequence.o selection.o kill.o \ ! answer.o reroute.o save.o unshar.o execute.o \ pack_date.o pack_name.o pack_subject.o news.o digest.o match.o MAIL = nnmail.o reroute.o global.o options.o update.o --- 55,61 ----- init.o variable.o term.o keymap.o macro.o regexp.o \ menu.o more.o rc.o group.o folder.o \ articles.o sequence.o selection.o kill.o \ ! answer.o reroute.o save.o unshar.o decode.o execute.o \ pack_date.o pack_name.o pack_subject.o news.o digest.o match.o MAIL = nnmail.o reroute.o global.o options.o update.o ************** *** 195,200 date_regexp.o: config.h global.h data.h db.o: db.c config.h global.h data.h db.h digest.o: digest.c config.h global.h data.h news.h match.h --- 195,202 ----- date_regexp.o: config.h global.h data.h db.o: db.c config.h global.h data.h db.h + + decode.o: decode.c config.h digest.o: digest.c config.h global.h data.h news.h match.h