diff -c +recursive +new-file nn-6.4.16/account.c ann/account.c *** nn-6.4.16/account.c Fri Oct 12 22:44:00 1984 --- ann/account.c Thu Mar 27 17:52:31 1985 *************** *** 40,45 **** --- 40,49 ---- #include "proto.h" #include + #ifdef AMIGA + FILE *debugfh; + #endif + import char *db_directory; *************** *** 382,387 **** --- 386,395 ---- char *fname; int users, i; struct account ac, *actab; + + #ifdef AMIGA + debugfh=fopen("*","w"); + #endif who_am_i = I_AM_ACCT; diff -c +recursive +new-file nn-6.4.16/admin.c ann/admin.c *** nn-6.4.16/admin.c Fri Oct 12 22:44:00 1984 --- ann/admin.c Thu Mar 27 17:54:15 1985 *************** *** 11,16 **** --- 11,20 ---- #include "proto.h" #include "term.h" + #ifdef AMIGA + extern FILE *debugfh; + #endif + import char *master_directory, *db_directory, *db_data_directory, *bin_directory, *news_directory, *news_lib_directory, *************** *** 168,178 **** --- 172,194 ---- return; } if (db_data_subdirs) + #ifdef AMIGA + sprintf(command, "cd %s ; list [0-9] | %s", db_data_directory, pager); + #else sprintf(command, "cd %s ; ls -l [0-9] | %s", db_data_directory, pager); + #endif else + #ifdef AMIGA + sprintf(command, "list %s | %s", db_data_directory, pager); + #else sprintf(command, "ls -l %s | %s", db_data_directory, pager); + #endif } else + #ifdef AMIGA + sprintf(command, "list %s", db_data_path(name, gh, '*')); + #else sprintf(command, "ls -l %s", db_data_path(name, gh, '*')); + #endif system(command); } *************** *** 310,315 **** --- 326,332 ---- goto err; } #endif + ix = open_data_file(gh, 'x', OPEN_READ); if (ix == NULL) valerr(("NO INDEX FILE"), 1); diff -c +recursive +new-file nn-6.4.16/amiga-aux.c ann/amiga-aux.c *** nn-6.4.16/amiga-aux.c --- ann/amiga-aux.c Wed Mar 26 11:08:47 1985 *************** *** 0 **** --- 1,208 ---- + /* + Aux script for the Amiga + + by Alexander Rawass, a_rawass@informatik.uni-kl.de + */ + + #include + #include + + #include "readconfig.h" + + #define STREQU(x,y) (!(strcmp(x,y))) + #define STRNEQU(x,y,z) (!(strncmp(x,y,z))) + + #define INVOKED argv[0] + #define INVOKE_PATH argv[1] + #define COMMAND argv[2] + #define TEMPFILE argv[3] + #define ARTID argv[4] + #define GROUPNAME argv[5] + + #define LAST_ARTICLE "t:last.article" + + #define LMAX 200 + + int main(argc,argv) + int argc; + STRPTR argv[]; + { + char combuf[100]; + char ans[10]; + char ans2[10]; + int st; + char buf[LMAX]; + FILE *tfh; + FILE *sfh; + int i; + FILE *fh; + struct uuconfig conf; + + if(!STREQU(INVOKED,"amiga-aux")){ + printf("not invoked as nnaux, invoked as %s\n",INVOKED); + exit(1); + } + + if(readconfig("uulib:config",&conf)==FALSE + || readconfig("uulib:.nnrc",&conf)==FALSE){ + printf("ERROR: uulib:config and/or uulib:.nnrc not found\n"); + sleep(3); + exit(9); + } + + if(STREQU(COMMAND,"post") || STREQU(COMMAND,"follow")){ + sprintf(combuf,"%s %s",conf.Editor,TEMPFILE); + system(combuf); + + do{ + /* printf("\na)bort e)dit h)old m)ail r)eedit s)end v)iew w)rite\n"); */ + printf("\na)bort e)dit m)ail s)end v)iew p)ost\n"); + printf("Action: (post article) "); fflush(stdout); + scanf("%s",&ans); + + switch(ans[0]){ + case 'a': + printf("\nConfirm abort: (y) "); fflush(stdout); + scanf("%s",&ans2); + if(ans2[0]=='y'){ + unlink(LAST_ARTICLE); + rename(TEMPFILE,LAST_ARTICLE); + exit(22); + } + break; + case 'e': + sprintf(combuf,"%s %s",conf.Editor,TEMPFILE); + system(combuf); + break; + case 'm': + /* mailer */ + break; + case 'v': + sprintf(combuf,"more %s",TEMPFILE); + system(combuf); + break; + /* case '\n': */ + case 'p': + case 's': + sprintf(combuf,"%s %s",conf.NewsCommand,TEMPFILE); + st=system(combuf); + if(st==0){ + printf("Be patient! Your new article will not show up immediately.\n"); + } + else{ + printf("Posting not sent!\n"); + } + sleep(2); + unlink(LAST_ARTICLE); + rename(TEMPFILE,LAST_ARTICLE); + exit(st); + break; + default: + printf("command %c) not yet supported\n",ans[0]); + break; + } + } + while(TRUE); + } + else if(STREQU(COMMAND,"mail") || STREQU(COMMAND,"forward") + || STREQU(COMMAND,"reply")){ + sprintf(combuf,"%s %s",conf.Editor,TEMPFILE); + system(combuf); + + do{ + /* printf("\na)bort e)dit h)old m)ail r)eedit s)end v)iew w)rite\n"); */ + printf("\na)bort e)dit m)ail s)end v)iew\n"); + printf("Action: (send letter) "); fflush(stdout); + scanf("%s",&ans); + + switch(ans[0]){ + case 'a': + printf("\nConfirm abort: (y) "); fflush(stdout); + scanf("%s",&ans2); + if(ans2[0]=='y'){ + unlink(LAST_ARTICLE); + rename(TEMPFILE,LAST_ARTICLE); + exit(22); + } + break; + case 'e': + sprintf(combuf,"%s %s",conf.Editor,TEMPFILE); + system(combuf); + break; + case 'm': + /* mailer */ + break; + case 'v': + sprintf(combuf,"more %s",TEMPFILE); + system(combuf); + break; + case 's': + /* sendmail haengt keine signature an */ + /* also tuen wir das */ + + tfh=fopen(TEMPFILE,"a+"); + sfh=fopen(conf.MailSignature,"r"); + fgets(buf,LMAX,sfh); + while(!feof(sfh)){ + fputs(buf,tfh); + fgets(buf,LMAX,sfh); + } + fclose(sfh); + + fclose(tfh); + + sprintf(combuf,"%s %s",conf.MailCommand,TEMPFILE); + st=system(combuf); + if(st==0){ + printf("Mail sent!\n"); + } + else{ + printf("Mailer failed!\n"); + } + sleep(2); + unlink(LAST_ARTICLE); + rename(TEMPFILE,LAST_ARTICLE); + exit(st); + break; + default: + printf("command %c) not yet supported\n",ans[0]); + break; + } + } + while(TRUE); + } + else if(STREQU(COMMAND,"cancel")){ + fh=fopen(TEMPFILE,"w"); + if(fh==NULL){ + printf("cannot open %s\n",TEMPFILE); + exit(78); + } + fprintf(fh,"Newsgroups: %s\n",GROUPNAME); + fprintf(fh,"Subject: cancel <%s>\n",ARTID); + fprintf(fh,"Control: cancel <%s>\n",ARTID); + fprintf(fh,"\n"); + fprintf(fh,"cancel <%s> in newsgroup %s\n",ARTID,GROUPNAME); + fclose(fh); + + sprintf(combuf,"%s %s",conf.NewsCommand,TEMPFILE); + st=system(combuf); + if(st==0){ + printf("Article cancelled!\n"); + } + else{ + printf("Article not cancelled!\n"); + } + sleep(2); + unlink(LAST_ARTICLE); + rename(TEMPFILE,LAST_ARTICLE); + exit(st); + } + else{ + printf("command %s not understood\n",COMMAND); + for(i=0;i>> depends on Reference: line */ export int ignore_bad_articles = 1; /* no Newsgroups: line */ *************** *** 318,323 **** --- 322,328 ---- long article_count, temp, obad; article_number start_collect; + if (gh->last_db_article == 0) { gh->first_db_article = gh->first_a_article; gh->last_db_article = gh->first_db_article - 1; *************** *** 415,420 **** --- 420,426 ---- int col_group_count; time_t start_time; + start_time = cur_time(); col_article_count = col_group_count = 0; current_group = NULL; /* for init_group */ *************** *** 426,433 **** --- 432,441 ---- break; } + if (gh->master_flag & M_IGNORE_GROUP) continue; + if (gh->master_flag & M_MUST_CLEAN) clean_group(gh); *************** *** 436,441 **** --- 444,450 ---- continue; } + if (!init_group(gh)) { if ((gh->master_flag & M_NO_DIRECTORY) == 0) { log_entry('R', "%s: no directory", gh->group_name); *************** *** 448,458 **** --- 457,469 ---- continue; } + if (gh->master_flag & M_NO_DIRECTORY) { /* The directory has been created now */ gh->master_flag &= ~M_NO_DIRECTORY; clean_group(gh); } + temp = collect_group(gh); #ifdef NNTP diff -c +recursive +new-file nn-6.4.16/conf/s-amiga.h ann/conf/s-amiga.h *** nn-6.4.16/conf/s-amiga.h --- ann/conf/s-amiga.h Fri Mar 28 10:04:39 1985 *************** *** 0 **** --- 1,143 ---- + /* system file for AMIGA */ + + #define AMIGA + + /* + * System V based system + * TERMCAP is used instead of TERMINFO + */ + + /* + * This is a generic System V Release 2 & 3 file. + * + * If you need to modify anything, make a new s- file, + * #include this file, and #define or #undef a few symbols. + */ + + + /* + * Include header files containing the following definitions: + * + * off_t, time_t, struct stat + */ + + #ifdef lint + struct proc { /* sys/types.h references this on many systems */ + int keep_lint_happy; + }; + #endif + + #include + #include + + /* + * Define if your system has system V like ioctls + */ + + /* #define HAVE_TERMIO */ /* */ + + /* + * Define to use terminfo database. + * Otherwise, termcap is used + */ + + #define USE_TERMINFO /* */ + + /* + * Specify the library containing the termcap/terminfo access routines. + * Notice: nn does not use curses. + * Notice: You must also specify whether termcap or terminfo is + * used when you edit config.h (see below). + */ + + #define TERMLIB -lcurses + + /* + * Define HAVE_STRCHR if strchr() and strrchr() are available + */ + + #define HAVE_STRCHR /* */ + + /* + * Define if a signal handler has type void (see signal.h) + */ + + #define SIGNAL_HANDLERS_ARE_VOID /* */ + + /* + * Define if signals must be set again after they are caught + */ + + #define RESET_SIGNAL_WHEN_CAUGHT /* */ + + /* + * Define if your system has BSD like job control (SIGTSTP works) + */ + + /* #define HAVE_JOBCONTROL /* */ + + /* + * Define if your system provides the "directory(3X)" access routines + * + * If true, include the header file(s) required by the package below + * (remember that or equivalent is included above) + * Also typedef Direntry to the proper struct type. + */ + + #ifdef NO_DIRENT_H + #undef NO_DIRENT_H + #else + + #define HAVE_DIRECTORY /* */ + + #include /* System V */ + typedef struct dirent Direntry; /* System V */ + + #endif + + /* + * Define if your system has a mkdir() library routine + */ + + #define HAVE_MKDIR /* */ + + /* + * Define HAVE_GETHOSTNAME if your system provides a BSD like + * gethostname routine. + * Otherwise, define HAVE_UNAME if uname() is avaiable. + * As a final resort, define HOSTNAME to the name of your system. + */ + + #define HAVE_GETHOSTNAME /* System V */ + + /* + * Define DETATCH_TERMINAL to be a command sequence which + * will detatch a process from the control terminal + * Also include files needed to perform this HERE. + * If not possible, just define it (empty) + */ + + #define DETATCH_TERMINAL setpgrp(); /* System V */ + + /* + * Specify where the Bourne Shell is. + */ + + #define SHELL "/bin/sh" + + /* + * Specify the default mailer to be invoked by nnmail + */ + + #define MAILX "/usr/bin/rmail" /* SV */ + + /* + * Define the maximum length of any pathname that may occur + */ + + #define FILENAME 256 + + #undef USE_TERMINFO + #undef TERMLIB + + #define TERMLIB -ltermlib diff -c +recursive +new-file nn-6.4.16/config.h ann/config.h *** nn-6.4.16/config.h Wed Feb 06 06:27:00 1985 --- ann/config.h *************** *** 1,381 **** - /**************************** NN CONFIGURATION *************************** - * - * Configuration file for nn. - * - * You must edit this file to reflect your local configuration - * and environment. - * - * Before editing this file, read the licence terms in the README - * file and the installation guidelines in the INSTALLATION file. - * - * (c) Copyright 1990, Kim F. Storm. All rights reserved. - */ - - #define RELEASE "6.4" - - #include - #include - - - /*********************** NETWORK DEPENDENT DEFINITIONS ********************** - * - Y * Define NETWORK_DATABASE if you share the database through NFS on - * a network with different, non-compatible machines, e.g. SUNs and - * VAXen, or SUN-3 and SUN-4, or if you are using different compilers - * on the same architecture. - * - * In a homogenous network, you can leave it undefined for higher - * performance (no data conversion is needed). - */ - - /* #define NETWORK_DATABASE /* */ - - - /********************************** NNTP ********************************* - * - * Define NNTP to enable nntp support. If you are not using NNTP, - * just leave the following NNTP_* definitions as they are - they - * will be ignored anyway. - * - * With NNTP, the nnmaster still maintains a local database of - * all article headers for fast access (and because NNTP does not - * support nn - yet), while the articles are fetched from the - * nntp server when they are read or saved. - * - * You may still share this database through NFS locally (see the - * description of NETWORK_DATABASE above) if you don't want to - * have separate nn databases on all your local systems. - * - * Consult the file NNTP for further information on the use of NNTP. - */ - - /* #define NNTP /* */ - - /* - * Define NNTP_SERVER to the name of a file containing the name of the - * nntp server. - * - * It is vital that both the nnmaster and all nn users on a machine - * uses the same nntp server, because the nn database is synchronized - * with a specific news active file. - * - * If the file name does not start with a slash, it is relative to - * LIB_DIRECTORY defined below. - * NOTE: If you plan to use the included inews, it MUST be a full pathname - */ - - /* #define NNTP_SERVER "/usr/local/lib/news/nntp/nntp_server" - - /* - * Define NNTP_POST if you want nn to reject attempts to post via - * NNTP to a server, that disallows postings. - * - * You should define this, if you use the NNTP based mini-inews for - * postings from NNTP clients. If you use another mechanism, that - * does not involve NNTP, you should leave it undefined. - */ - - /* #define NNTP_POST /* */ - - /* - * NNTP's mini-inews seems to require that messages contain a complete - * header with Message-ID, Path, and Date fields which the normal inews - * generates itself. If your mini-inews requires these headers to - * be present, define NNTP_MINI_INEWS_HEADER below. - */ - - /* #define NNTP_MINI_INEWS_HEADER /* uses "broken" mini-inews */ - - - /***************** OPERATING SYSTEM DEPENDENT DEFINITIONS ******************* - * - * Include the appropriate s- file for your system below. - * - * If a file does not exist for your system, you can use - * conf/s-template.h as a starting point for writing you own. - */ - - #include "s-sys5-tcap.h" /* 4.2 BSD and Ultrix */ - - /* - * Define DEFAULT_PAGER as the initial value of the 'pager' variable. - * nnadmin pipes shell command output though this command. - */ - - #define DEFAULT_PAGER "less" /* system V */ - /* #define DEFAULT_PAGER "more" /* bsd */ - - /* - * DEFAULT_PRINTER is the initial value of the 'printer' variable. - * nn's :print command pipes text into this command. - */ - - /* #define DEFAULT_PRINTER "lp -s" /* System V */ - #define DEFAULT_PRINTER "lpr -h" /* bsd */ - - /* - * Define RESIZING to make nn understand dynamic window-resizing. - * (It uses the TIOCGWINSZ ioctl found on most 4.3BSD systems) - */ - - #define RESIZING /* */ - - - /********************** MACHINE DEPENDENT DEFINITIONS ********************** - * - * Include the appropriate m- file for your system below. - * - * If a file does not exist for your system, you can use - * conf/m-template.h as a starting point for writing you own. - */ - - #include "m-i80386.h" - - - /***************************** OWNERSHIP *************************** - * - * Specify owner and group for installed files and programs. - * - * The nnmaster will run suid/sgid to this owner and group. - * - * The only requirements are that the ownership allows the - * nnmaster to READ the news related files and directories, and - * the ordinary users to read the database and execute the nn* - * programs. - * - * Common choices are: (news, news) and (your uid, your gid) - */ - - #define OWNER "news" - #define GROUP "news" - - - /**************************** LOCALIZATION **************************** - * - * Specify where programs and files are installed. - * - * BIN_DIRECTORY - the location of the user programs (mandatory) - * - * LIB_DIRECTORY - the location of auxiliary programs and files. - * (mandatory UNLESS ALL of the following are defined). - * - * MASTER_DIRECTORY - the location of the master program (on server) - * (= LIB_DIRECTORY if undefined) - * - * CLIENT_DIRECTORY - the location of auxiliary programs (on clients) - * (= LIB_DIRECTORY if undefined) - * - * HELP_DIRECTORY - the location of help files, online manual, etc. - * (= CLIENT_DIRECTORY/help if undefined) - * - * CACHE_DIRECTORY - if NNTP is used, nn uses this central directory - * to store working copies of articles on the local - * system. If not defined, it stores the articles - * in each user's ~/.nn directory. - * - * TMP_DIRECTORY - temporary file storage. Overriden by $TMPDIR. - * (= /usr/tmp if undefined). - * - * LOG_FILE - the location of nn's log file. - * (= LIB_DIRECTORY/Log if undefined). - */ - - #define BIN_DIRECTORY "/usr/local/bin" - #define LIB_DIRECTORY "/usr/local/lib/nn" - - - /**************************** DATABASE LOCATION ************************** - * - * Specify where the nn database should be installed. - * - * If none of the following symbols are defined, the database will - * be contained in the NEWS_DIRECTORY in a separate .nn directory for - * master files and in files named .nnx and .nnd in each group's - * spool directory. To use this scheme, the OWNER specified above - * must have write permission on the news spool directories. - * - * If you access news via NNTP, you will probably always have to - * give the database directory explicitly through DB_DIRECTORY - * (and DB_DATA_DIRECTORY), since the normal news spool directories - * are probably not available on the local system. - * The exception may be if nnmaster runs directly on the nntp server. - - - * - * To change the default behaviour, you can define the following - * symbols: - * - * DB_DIRECTORY - the directory containing the master files. - * - * DB_DATA_DIRECTORY - the directory containing the per-group files - * (default is DB_DIRECTORY/DATA if undefined). - * - * DB_LONG_NAMES - use group's name rather than number when - * building file names in DB_DATA_DIRECTORY. - * (The file system must support long file names!!) - */ - - /* #define DB_DIRECTORY "/usr/spool/nn-6.4" */ - #define DB_DIRECTORY "/usr/spool/news/.nn" - - - /*************************** NEWS TRANSPORT ************************** - * - * Specify the location of your news programs and files - * You only need to specify these if you are not - * satisfied with the default settings. - * - * NEWS_DIRECTORY - The news spool directory. - * Default: /usr/spool/news - * - * NEWS_LIB_DIRECTORY - The news lib directory. - * Default: /usr/lib/news - * - * INEWS_PATH - The location of the inews program. - * Default: NEWS_LIB_DIR/inews - * - * RMGROUP_PATH - The location of the rmgroup program. - * Default: NEWS_LIB_DIR/{rm,del}group - */ - - #define NEWS_DIRECTORY "/usr/spool/news" /* */ - #define NEWS_LIB_DIRECTORY "/usr/lib/news" /* */ - - /* #define INEWS_PATH "/usr/lib/news/inews" /* */ - - - /*************************** MAIL INTERFACE ************************* - * - * Specify a mailer that accepts a letter WITH a header IN THE TEXT. - * - * A program named 'recmail' program is normally delivered with - * the Bnews system, or you can use sendmail -t if you have it. - * - * The contrib/ directory contains two programs which you might - * be able to use with a little tweaking. - */ - - /* #define REC_MAIL "/usr/lib/news/recmail" /* non-sendmail */ - #define REC_MAIL "/usr/bin/smail" /* sendmail */ - - - /* - * Define HAVE_ROUTING if your mailer understands domain based - * adresses (...@...) and performs the necessary rerouting (e.g. - * Sendmail or Smail). - * - * Otherwise, nn will provide a simple routing facility using - * routing information specified in the file LIB_DIRECTORY/routes. - */ - - #define HAVE_ROUTING /* */ - - /* - * If HAVE_ROUTING is NOT defined, nn needs to know the name of - * your host. To obtain the host name it will use either of the - * 'uname' or 'gethostname' system calls as specified in the s- - * file included above. - * - * If neither 'uname' nor 'gethostname' is available, you must - * define HOSTNAME to be the name of your host. Otherwise, leave - * it undefined (it will not be used anyway). - */ - - /* #define HOSTNAME "myhost" /* Not used if HAVE_ROUTING */ - - /* - * Define APPEND_SIGNATURE if you want nn to ask users to append - * ~/.signature to mail messages (reply/forward/mail). - * - * If the mailer defined in REC_MAIL automatically includes .signature - * you should not define this (it will fool people to include it twice). - * - * I think 'recmail' includes .signature, but 'sendmail -t' doesn't. - */ - - #define APPEND_SIGNATURE /* */ - - /* - * BUG_REPORT_ADDRESS is the initial value of the bug-report-address - * variable which is used by the :bug command to report bugs in - * the nn software. - */ - - #define BUG_REPORT_ADDRESS "news" - - - /*************************** DOCUMENTATION *************************** - * - * Specify directories for the user and system manuals - * - * Adapt this to your local standards; the manuals will be named - * $(MAN_DIR)/program.$(MAN_SECTION) - * - * USER_MAN - nn, nntidy, nngrep, etc. - * SYS_MAN - nnadmin - * DAEMON_MAN - nnmaster - */ - - #define USER_MAN_DIR "/usr/local/man/man1" - #define USER_MAN_SECTION "1" - - #define SYS_MAN_DIR "/usr/local/man/man1" - #define SYS_MAN_SECTION "1m" - - #define DAEMON_MAN_DIR "/usr/local/man/man8" - #define DAEMON_MAN_SECTION "8" - - - /************************** LOCAL POLICY ***************************** - * - * Define STATISTICS if you want to keep a record of how much - * time the users spend on news reading. - * - * Sessions shorter than the specified number of minutes are not - * recorded (don't clutter up the log file). - * - * Usage statistics is entered into the $LOG_FILE with code U - */ - - /* #define STATISTICS 5 /* minutes */ - - /* - * Define ACCOUNTING if you want to keep accumulated accounting - * based on the statistics in a separate 'acct' file. In this - * case, the accounting figures will be secret, and not be - * written to the Log file. And the users will not be able to - * "decrease" their own account. - * - * See account.c for optional cost calculation parameters. - */ - - /* #define ACCOUNTING /* */ - - /* - * Define AUTHORIZE if you want to restrict the use of nn to - * certain users or certain periods of the day. Define both - * this and ACCOUNTING if you want to impose a usage quota - * - * See account.c for implementing various access policies. - */ - - /* #define AUTHORIZE /* */ - - /* - * Default folder directory - */ - - #define FOLDER_DIRECTORY "~/News" - - /* - * Max length of authors name (in "edited" format). - * Also size of "Name" field on the article menus. - * You may want to increase this if your terminals are wider than - * 80 columns. - */ - - #define NAME_LENGTH 16 - - - /************************ CONFIGURATION COMPLETED ************************/ - - #include "global.h" --- 0 ---- diff -c +recursive +new-file nn-6.4.16/config.h-amiga ann/config.h-amiga *** nn-6.4.16/config.h-amiga --- ann/config.h-amiga Fri Mar 28 10:03:08 1985 *************** *** 0 **** --- 1,386 ---- + /**************************** NN CONFIGURATION *************************** + * + * Configuration file for nn. + * + * You must edit this file to reflect your local configuration + * and environment. + * + * Before editing this file, read the licence terms in the README + * file and the installation guidelines in the INSTALLATION file. + * + * (c) Copyright 1990, Kim F. Storm. All rights reserved. + */ + + /* + modified to work with the Amiga by Alexander Rawass + */ + + #define RELEASE "6.4" + + #include + #include + + + /*********************** NETWORK DEPENDENT DEFINITIONS ********************** + * + Y * Define NETWORK_DATABASE if you share the database through NFS on + * a network with different, non-compatible machines, e.g. SUNs and + * VAXen, or SUN-3 and SUN-4, or if you are using different compilers + * on the same architecture. + * + * In a homogenous network, you can leave it undefined for higher + * performance (no data conversion is needed). + */ + + /* #define NETWORK_DATABASE /* */ + + + /********************************** NNTP ********************************* + * + * Define NNTP to enable nntp support. If you are not using NNTP, + * just leave the following NNTP_* definitions as they are - they + * will be ignored anyway. + * + * With NNTP, the nnmaster still maintains a local database of + * all article headers for fast access (and because NNTP does not + * support nn - yet), while the articles are fetched from the + * nntp server when they are read or saved. + * + * You may still share this database through NFS locally (see the + * description of NETWORK_DATABASE above) if you don't want to + * have separate nn databases on all your local systems. + * + * Consult the file NNTP for further information on the use of NNTP. + */ + + /* #define NNTP /* */ + + /* + * Define NNTP_SERVER to the name of a file containing the name of the + * nntp server. + * + * It is vital that both the nnmaster and all nn users on a machine + * uses the same nntp server, because the nn database is synchronized + * with a specific news active file. + * + * If the file name does not start with a slash, it is relative to + * LIB_DIRECTORY defined below. + * NOTE: If you plan to use the included inews, it MUST be a full pathname + */ + + /* #define NNTP_SERVER "/usr/local/lib/news/nntp/nntp_server" + + /* + * Define NNTP_POST if you want nn to reject attempts to post via + * NNTP to a server, that disallows postings. + * + * You should define this, if you use the NNTP based mini-inews for + * postings from NNTP clients. If you use another mechanism, that + * does not involve NNTP, you should leave it undefined. + */ + + /* #define NNTP_POST /* */ + + /* + * NNTP's mini-inews seems to require that messages contain a complete + * header with Message-ID, Path, and Date fields which the normal inews + * generates itself. If your mini-inews requires these headers to + * be present, define NNTP_MINI_INEWS_HEADER below. + */ + + /* #define NNTP_MINI_INEWS_HEADER /* uses "broken" mini-inews */ + + + /***************** OPERATING SYSTEM DEPENDENT DEFINITIONS ******************* + * + * Include the appropriate s- file for your system below. + * + * If a file does not exist for your system, you can use + * conf/s-template.h as a starting point for writing you own. + */ + + #include "s-amiga.h" /* AMIGA */ + + /* + * Define DEFAULT_PAGER as the initial value of the 'pager' variable. + * nnadmin pipes shell command output though this command. + */ + + /* #define DEFAULT_PAGER "less" */ /* system V */ + #define DEFAULT_PAGER "more" /* bsd */ + + /* + * DEFAULT_PRINTER is the initial value of the 'printer' variable. + * nn's :print command pipes text into this command. + */ + + /* #define DEFAULT_PRINTER "lp -s" /* System V */ + #define DEFAULT_PRINTER "type >prt:" /* bsd */ + + /* + * Define RESIZING to make nn understand dynamic window-resizing. + * (It uses the TIOCGWINSZ ioctl found on most 4.3BSD systems) + */ + + #define RESIZING /* */ + + + /********************** MACHINE DEPENDENT DEFINITIONS ********************** + * + * Include the appropriate m- file for your system below. + * + * If a file does not exist for your system, you can use + * conf/m-template.h as a starting point for writing you own. + */ + + #include "m-m680x0.h" + + + /***************************** OWNERSHIP *************************** + * + * Specify owner and group for installed files and programs. + * + * The nnmaster will run suid/sgid to this owner and group. + * + * The only requirements are that the ownership allows the + * nnmaster to READ the news related files and directories, and + * the ordinary users to read the database and execute the nn* + * programs. + * + * Common choices are: (news, news) and (your uid, your gid) + */ + + #define OWNER "news" + #define GROUP "news" + + + /**************************** LOCALIZATION **************************** + * + * Specify where programs and files are installed. + * + * BIN_DIRECTORY - the location of the user programs (mandatory) + * + * LIB_DIRECTORY - the location of auxiliary programs and files. + * (mandatory UNLESS ALL of the following are defined). + * + * MASTER_DIRECTORY - the location of the master program (on server) + * (= LIB_DIRECTORY if undefined) + * + * CLIENT_DIRECTORY - the location of auxiliary programs (on clients) + * (= LIB_DIRECTORY if undefined) + * + * HELP_DIRECTORY - the location of help files, online manual, etc. + * (= CLIENT_DIRECTORY/help if undefined) + * + * CACHE_DIRECTORY - if NNTP is used, nn uses this central directory + * to store working copies of articles on the local + * system. If not defined, it stores the articles + * in each user's ~/.nn directory. + * + * TMP_DIRECTORY - temporary file storage. Overriden by $TMPDIR. + * (= /usr/tmp if undefined). + * + * LOG_FILE - the location of nn's log file. + * (= LIB_DIRECTORY/Log if undefined). + */ + + #define BIN_DIRECTORY "NN:nnlib" + #define LIB_DIRECTORY "NN:nnlib" + + + /**************************** DATABASE LOCATION ************************** + * + * Specify where the nn database should be installed. + * + * If none of the following symbols are defined, the database will + * be contained in the NEWS_DIRECTORY in a separate .nn directory for + * master files and in files named .nnx and .nnd in each group's + * spool directory. To use this scheme, the OWNER specified above + * must have write permission on the news spool directories. + * + * If you access news via NNTP, you will probably always have to + * give the database directory explicitly through DB_DIRECTORY + * (and DB_DATA_DIRECTORY), since the normal news spool directories + * are probably not available on the local system. + * The exception may be if nnmaster runs directly on the nntp server. + - + * + * To change the default behaviour, you can define the following + * symbols: + * + * DB_DIRECTORY - the directory containing the master files. + * + * DB_DATA_DIRECTORY - the directory containing the per-group files + * (default is DB_DIRECTORY/DATA if undefined). + * + * DB_LONG_NAMES - use group's name rather than number when + * building file names in DB_DATA_DIRECTORY. + * (The file system must support long file names!!) + */ + + /* #define DB_DIRECTORY "/usr/spool/nn-6.4" */ + #define DB_DIRECTORY "NN:nndbase" + + + /*************************** NEWS TRANSPORT ************************** + * + * Specify the location of your news programs and files + * You only need to specify these if you are not + * satisfied with the default settings. + * + * NEWS_DIRECTORY - The news spool directory. + * Default: /usr/spool/news + * + * NEWS_LIB_DIRECTORY - The news lib directory. + * Default: /usr/lib/news + * + * INEWS_PATH - The location of the inews program. + * Default: NEWS_LIB_DIR/inews + * + * RMGROUP_PATH - The location of the rmgroup program. + * Default: NEWS_LIB_DIR/{rm,del}group + */ + + #define NEWS_DIRECTORY "UUCP:news" /* */ + #define NEWS_LIB_DIRECTORY "UUCP:lib/news" /* */ + + #define INEWS_PATH "relaynews" + + + /*************************** MAIL INTERFACE ************************* + * + * Specify a mailer that accepts a letter WITH a header IN THE TEXT. + * + * A program named 'recmail' program is normally delivered with + * the Bnews system, or you can use sendmail -t if you have it. + * + * The contrib/ directory contains two programs which you might + * be able to use with a little tweaking. + */ + + /* #define REC_MAIL "/usr/lib/news/recmail" /* non-sendmail */ + + #define REC_MAIL "sendmail" /* sendmail */ + + + /* + * Define HAVE_ROUTING if your mailer understands domain based + * adresses (...@...) and performs the necessary rerouting (e.g. + * Sendmail or Smail). + * + * Otherwise, nn will provide a simple routing facility using + * routing information specified in the file LIB_DIRECTORY/routes. + */ + + #define HAVE_ROUTING /* */ + + /* + * If HAVE_ROUTING is NOT defined, nn needs to know the name of + * your host. To obtain the host name it will use either of the + * 'uname' or 'gethostname' system calls as specified in the s- + * file included above. + * + * If neither 'uname' nor 'gethostname' is available, you must + * define HOSTNAME to be the name of your host. Otherwise, leave + * it undefined (it will not be used anyway). + */ + + /* #define HOSTNAME "myhost" /* Not used if HAVE_ROUTING */ + + /* + * Define APPEND_SIGNATURE if you want nn to ask users to append + * ~/.signature to mail messages (reply/forward/mail). + * + * If the mailer defined in REC_MAIL automatically includes .signature + * you should not define this (it will fool people to include it twice). + * + * I think 'recmail' includes .signature, but 'sendmail -t' doesn't. + */ + + #define APPEND_SIGNATURE /* */ + + /* + * BUG_REPORT_ADDRESS is the initial value of the bug-report-address + * variable which is used by the :bug command to report bugs in + * the nn software. + */ + + #define BUG_REPORT_ADDRESS "news" + + + /*************************** DOCUMENTATION *************************** + * + * Specify directories for the user and system manuals + * + * Adapt this to your local standards; the manuals will be named + * $(MAN_DIR)/program.$(MAN_SECTION) + * + * USER_MAN - nn, nntidy, nngrep, etc. + * SYS_MAN - nnadmin + * DAEMON_MAN - nnmaster + */ + + #define USER_MAN_DIR "usr:local/man/man1" + #define USER_MAN_SECTION "1" + + #define SYS_MAN_DIR "usr:local/man/man1" + #define SYS_MAN_SECTION "1m" + + #define DAEMON_MAN_DIR "usr:local/man/man8" + #define DAEMON_MAN_SECTION "8" + + + /************************** LOCAL POLICY ***************************** + * + * Define STATISTICS if you want to keep a record of how much + * time the users spend on news reading. + * + * Sessions shorter than the specified number of minutes are not + * recorded (don't clutter up the log file). + * + * Usage statistics is entered into the $LOG_FILE with code U + */ + + /* #define STATISTICS 5 /* minutes */ + + /* + * Define ACCOUNTING if you want to keep accumulated accounting + * based on the statistics in a separate 'acct' file. In this + * case, the accounting figures will be secret, and not be + * written to the Log file. And the users will not be able to + * "decrease" their own account. + * + * See account.c for optional cost calculation parameters. + */ + + /* #define ACCOUNTING /* */ + + /* + * Define AUTHORIZE if you want to restrict the use of nn to + * certain users or certain periods of the day. Define both + * this and ACCOUNTING if you want to impose a usage quota + * + * See account.c for implementing various access policies. + */ + + /* #define AUTHORIZE /* */ + + /* + * Default folder directory + */ + + #define FOLDER_DIRECTORY "NNSAVE:" + + /* + * Max length of authors name (in "edited" format). + * Also size of "Name" field on the article menus. + * You may want to increase this if your terminals are wider than + * 80 columns. + */ + + #define NAME_LENGTH 16 + + + /************************ CONFIGURATION COMPLETED ************************/ + + #include "global.h" diff -c +recursive +new-file nn-6.4.16/db.c ann/db.c *** nn-6.4.16/db.c Fri Oct 12 22:44:00 1984 --- ann/db.c Thu Mar 27 17:58:03 1985 *************** *** 8,13 **** --- 8,17 ---- #include "db.h" #include + #ifdef AMIGA + extern FILE *debugfh; + #endif + import char *master_directory, *db_directory, *db_data_directory, *news_directory; import int db_data_subdirs; *************** *** 90,104 **** if (chdir(news_directory) < 0) sys_error(news_directory); ! if (chdir(group_path_name) < 0) return 0; } group_file_name = group_path_name; return 1; } /* client */ ! if (gh->master_flag & M_NO_DIRECTORY) return 0; if (check_group_access && !use_nntp) { *p = NUL; --- 94,111 ---- if (chdir(news_directory) < 0) sys_error(news_directory); ! if (chdir(group_path_name) < 0){ return 0; } + } group_file_name = group_path_name; return 1; } /* client */ ! if (gh->master_flag & M_NO_DIRECTORY) { ! return 0; ! } if (check_group_access && !use_nntp) { *p = NUL; *************** *** 466,471 **** --- 473,480 ---- #else Loop_Groups_Header(gh) { #endif + + gh->group_num = l_g_index; db_read_group(gh); db_parse_group(gh, trust_master); *************** *** 668,673 **** --- 677,684 ---- char *s; s = strrchr(data_file, '/'); *s = NUL; + + if (!file_exist(data_file, "dx")) { if (mkdir(data_file, 0755) < 0) sys_error("Cannot create directory %s", data_file); *************** *** 858,863 **** --- 869,875 ---- buf[6] = gh->first_a_article; buf[7] = gh->last_a_article; buf[8] = gh->creation_time; + host_to_net(buf, GROUP_FIELDS); if (fwrite((char *)buf, sizeof(net_long), GROUP_FIELDS, master_file) != GROUP_FIELDS) diff -c +recursive +new-file nn-6.4.16/debug.c ann/debug.c *** nn-6.4.16/debug.c --- ann/debug.c Wed Mar 05 10:22:17 1985 *************** *** 0 **** --- 1,56 ---- + #include + + extern FILE *debugfh; + + FILE *debug_fopen(name,arg) + char *name; + char *arg; + { + + + return(fopen(name,arg)); + } + + FILE *debug_popen(name,arg) + char *name; + char *arg; + { + + + return(popen(name,arg)); + } + + int debug_open(name,mode) + char *name; + int mode; + { + + + return(open(name,mode)); + } + + int debug_stat(name,st) + char *name; + struct stat *st; + { + + + return(stat(name,st)); + } + + int debug_system(name) + char *name; + { + + fprintf(debugfh,"\033[1msystem(%s)\033[0m\n",name); + + return(system(name)); + } + + void debug_sys_error(str) + char *str; + { + + + return(sys_error(str)); + } diff -c +recursive +new-file nn-6.4.16/execute.c ann/execute.c *** nn-6.4.16/execute.c Fri Oct 12 22:44:00 1984 --- ann/execute.c Fri Mar 28 11:03:27 1985 *************** *** 9,14 **** --- 9,18 ---- #include "config.h" #include "term.h" + #ifdef AMIGA + extern FILE *debugfh; + #endif + export int shell_restrictions = 0; /* disable shell escapes */ export char *init_shell = SHELL; *************** *** 41,47 **** --- 45,55 ---- was_raw = toggle_visual ? visual_off() : unset_raw(); + #ifdef AMIGA + pid=0; + #else while ((pid = fork()) == -1) sleep(1); + #endif if (pid == 0) { for (i = 3 ; i < 20 ; i++) *************** *** 49,71 **** if (exec_chdir_to != NULL) chdir(exec_chdir_to); execv(path, args); fprintf(stderr, "%s: not found\n", path); nn_exit(20); ! } quit = signal(SIGQUIT, SIG_IGN); intr = signal(SIGINT, SIG_IGN); #ifdef HAVE_JOBCONTROL tstp = signal(SIGTSTP, SIG_DFL); #endif while ((i = wait(&status)) != pid && (i != -1 || errno == EINTR)); signal(SIGQUIT, quit); signal(SIGINT, intr); #ifdef HAVE_JOBCONTROL signal(SIGTSTP, tstp); #endif if (toggle_visual) { visual_on(); if (toggle_visual == 2) s_redraw++; --- 57,101 ---- if (exec_chdir_to != NULL) chdir(exec_chdir_to); + #ifdef AMIGA + { + int i; + char combuf[200]; + + strcpy(combuf,path); + for(i=1;args[i]!=NULL;i++){ + strcat(combuf," "); + strcat(combuf,args[i]); + } + + + status=system(combuf); + } + } /* pid==0 */ + #else execv(path, args); fprintf(stderr, "%s: not found\n", path); nn_exit(20); ! } /* pid==0 */ ! quit = signal(SIGQUIT, SIG_IGN); intr = signal(SIGINT, SIG_IGN); #ifdef HAVE_JOBCONTROL tstp = signal(SIGTSTP, SIG_DFL); #endif + while ((i = wait(&status)) != pid && (i != -1 || errno == EINTR)); + #endif /* AMIGA */ + signal(SIGQUIT, quit); signal(SIGINT, intr); #ifdef HAVE_JOBCONTROL signal(SIGTSTP, tstp); #endif + + if (toggle_visual) { visual_on(); if (toggle_visual == 2) s_redraw++; *************** *** 72,79 **** } if (was_raw) raw(); ! return (status & 0xff) ? 0x100 : (status >> 8); } --- 102,113 ---- } if (was_raw) raw(); ! ! #ifdef AMIGA ! return status; ! #else return (status & 0xff) ? 0x100 : (status >> 8); + #endif } diff -c +recursive +new-file nn-6.4.16/expire.c ann/expire.c *** nn-6.4.16/expire.c Fri Oct 12 22:44:00 1984 --- ann/expire.c Thu Mar 27 18:01:10 1985 *************** *** 11,16 **** --- 11,20 ---- #include "db.h" #include "dir.h" + #ifdef AMIGA + extern FILE *debugfh; + #endif + import int trace, debug_mode; import int nntp_failed; *************** *** 597,602 **** --- 601,607 ---- log_entry('X', "Expire: %ld art, %d gr, %ld s", exp_article_count, exp_group_count, (long)(cur_time() - start_time)); + return temp >= 0; } diff -c +recursive +new-file nn-6.4.16/folder.c ann/folder.c *** nn-6.4.16/folder.c Fri Oct 12 22:44:00 1984 --- ann/folder.c Fri Mar 07 19:14:38 1985 *************** *** 91,97 **** --- 91,101 ---- if (folder_directory == NULL) { if (!(cp = getenv("FOLDER"))) cp = FOLDER_DIRECTORY; + #ifndef AMIGA folder_directory = home_relative(cp); + #else + folder_directory = cp; + #endif } cp = folder_directory; *************** *** 105,111 **** --- 109,119 ---- cp_str: while (*cp) *dp++ = *cp++; + #ifndef AMIGA if (dp[-1] != '/') *dp++ = '/'; + #else + if (dp[-1] != '/' && dp[-1] != ':' ) *dp++ = '/'; + #endif goto no_parse; } diff -c +recursive +new-file nn-6.4.16/fullname.c ann/fullname.c *** nn-6.4.16/fullname.c Fri Oct 12 22:44:00 1984 --- ann/fullname.c Wed Mar 05 10:03:03 1985 *************** *** 89,96 **** { static char *fullname = NULL; char inbuf[FILENAME]; struct passwd *pw, *getpwuid(); ! if (fullname == NULL) { if ((fullname = getenv("NAME")) != NULL) return fullname; --- 89,99 ---- { static char *fullname = NULL; char inbuf[FILENAME]; + #ifdef AZTEC + struct passwd *pw; + #else struct passwd *pw, *getpwuid(); ! #endif if (fullname == NULL) { if ((fullname = getenv("NAME")) != NULL) return fullname; diff -c +recursive +new-file nn-6.4.16/global.c ann/global.c *** nn-6.4.16/global.c Fri Oct 12 22:44:00 1984 --- ann/global.c Thu Mar 27 18:03:38 1985 *************** *** 10,15 **** --- 10,24 ---- #include "config.h" #include "patchlevel.h" + #ifdef AMIGA + #define FALSE 0L + #include "readconfig.h" + #endif + + #ifdef AMIGA + extern FILE *debugfh; + #endif + export char *home_directory; export char *nn_directory; /* ~/.nn */ export char *news_directory; /* /usr/spool/news */ *************** *** 33,39 **** export char *temp_file; #ifndef TMP_DIRECTORY ! #define TMP_DIRECTORY "/usr/tmp" #endif export char *tmp_directory = TMP_DIRECTORY; --- 42,52 ---- export char *temp_file; #ifndef TMP_DIRECTORY ! #ifdef AMIGA ! #define TMP_DIRECTORY "t:" ! #else ! #define TMP_DIRECTORY "/tmp" ! #endif /* AMIGA */ #endif export char *tmp_directory = TMP_DIRECTORY; *************** *** 229,234 **** --- 242,249 ---- db_data_directory = NULL; #endif #endif + + #ifndef DB_LONG_NAMES if (db_data_directory != NULL) db_data_subdirs = file_exist(relative(db_data_directory, "0"), "dx"); *************** *** 270,277 **** --- 285,297 ---- signal(SIGTSTP, catch_suspend); #endif + #ifndef AMIGA if ((home_directory = getenv("HOME")) == NULL) user_error("No HOME environment variable"); + #else + if ((home_directory = getenv("HOME")) == NULL) + home_directory="NNHOME:"; + #endif if ((pager = getenv("PAGER")) == NULL) pager = DEFAULT_PAGER; *************** *** 299,305 **** --- 319,334 ---- else tmp_directory = temp_dir; + #ifdef AMIGA + if(tmp_directory[strlen(tmp_directory)-1]==':'){ + sprintf(buf, "%snn.XXXXXX", tmp_directory); + } + else{ + sprintf(buf, "%s/nn.XXXXXX", tmp_directory); + } + #else sprintf(buf, "%s/nn.XXXXXX", tmp_directory); + #endif mktemp(buf); temp_file = buf; } *************** *** 425,431 **** --- 454,470 ---- { static char concat_path[FILENAME]; + #ifdef AMIGA + if(dir[strlen(dir)-1]==':'){ + sprintf(concat_path,"%s%s",dir,name); + } + else{ + sprintf(concat_path,"%s/%s",dir,name); + } + #else sprintf(concat_path, "%s/%s", dir, name); + #endif + return concat_path; } *************** *** 436,442 **** --- 475,491 ---- char *buf; buf = newstr(strlen(dir) + strlen(name) + 2); + + #ifdef AMIGA + if(dir[strlen(dir)-1]==':'){ + sprintf(buf,"%s%s",dir,name); + } + else{ + sprintf(buf,"%s/%s",dir,name); + } + #else sprintf(buf, "%s/%s", dir, name); + #endif return buf; } *************** *** 821,827 **** --- 870,880 ---- char *user_name() { static char *user = NULL; + #ifdef AZTEC + struct passwd *pw; + #else struct passwd *pw, *getpwuid(); + #endif extern char *getlogin(), *getenv(); if (who_am_i == I_AM_MASTER) return "M"; *************** *** 828,834 **** --- 881,901 ---- if (who_am_i == I_AM_EXPIRE) return "X"; if (user == NULL) { + #ifdef AMIGA + { + struct uuconfig conf; + + if(readconfig("uulib:config",&conf)==FALSE){ + user=getlogin(); /* returns 'amiga' */ + } + else{ + user=malloc(200); + strncpy(user,&(conf.UserName),200); + } + } + #else user = getlogin(); + #endif if (user != NULL && *user != NUL) goto out; pw = getpwuid((int)user_id); diff -c +recursive +new-file nn-6.4.16/group.c ann/group.c *** nn-6.4.16/group.c Fri Oct 12 22:44:00 1984 --- ann/group.c Thu Mar 27 18:05:13 1985 *************** *** 15,20 **** --- 15,24 ---- #include #endif + #ifdef AMIGA + extern FILE *debugfh; + #endif + export int dont_split_digests = 0; export int dont_sort_articles = 0; export int also_cross_postings = 0; *************** *** 468,474 **** mask = NULL; if (access_mode == 0) access_mode |= ACC_PARSE_VARIABLES; ! if (command == K_GOTO_GROUP) goto get_group_name; --- 472,478 ---- mask = NULL; if (access_mode == 0) access_mode |= ACC_PARSE_VARIABLES; ! if (command == K_GOTO_GROUP) goto get_group_name; *************** *** 481,486 **** --- 485,491 ---- if (gh == NULL) goto_return(ME_NO_REDRAW); + if (gh->first_db_article < gh->last_db_article && gh->current_first <= 0) { sprintf(buffer, "%s%s%s) ", (gh->group_flag & G_UNSUBSCRIBED) ? " UNSUB" : "", *************** *** 784,792 **** more_articles: if (first > gh->last_db_article) goto_return(ME_NO_REDRAW); - if (gh != orig_group) goto enter_new_level; - if (!only_unread_articles && gh->current_first <= gh->first_db_article) { msg("No extra articles"); goto_return(ME_NO_REDRAW); --- 789,795 ---- *************** *** 917,923 **** Loop_Groups_Sequence(gh) { if (gh->group_flag & G_FOLDER) continue; ! if (gh->master_flag & M_NO_DIRECTORY) continue; if ((gh->group_flag & G_UNSUBSCRIBED) && !also_unsub_groups) continue; if (!also_read_articles && gh->last_article >= gh->last_db_article) --- 920,928 ---- Loop_Groups_Sequence(gh) { if (gh->group_flag & G_FOLDER) continue; ! if (gh->master_flag & M_NO_DIRECTORY) { ! continue; ! } if ((gh->group_flag & G_UNSUBSCRIBED) && !also_unsub_groups) continue; if (!also_read_articles && gh->last_article >= gh->last_db_article) *************** *** 934,940 **** continue; } ! if (gh->master_flag & M_NO_DIRECTORY) continue; if ((gh->group_flag & G_UNSUBSCRIBED) && !also_unsub_groups) continue; --- 939,947 ---- continue; } ! if (gh->master_flag & M_NO_DIRECTORY) { ! continue; ! } if ((gh->group_flag & G_UNSUBSCRIBED) && !also_unsub_groups) continue; *************** *** 1063,1069 **** if (amount < 0) { Loop_Groups_Sequence(gh) { if (gh->group_flag & G_FAKED) continue; ! if (gh->master_flag & M_NO_DIRECTORY) continue; if (gh != current_group) { if (gh->unread_count <= 0) continue; if (gh->group_flag & G_UNSUBSCRIBED && !also_unsub_groups) --- 1070,1078 ---- if (amount < 0) { Loop_Groups_Sequence(gh) { if (gh->group_flag & G_FAKED) continue; ! if (gh->master_flag & M_NO_DIRECTORY) { ! continue; ! } if (gh != current_group) { if (gh->unread_count <= 0) continue; if (gh->group_flag & G_UNSUBSCRIBED && !also_unsub_groups) *************** *** 1073,1079 **** } } else Loop_Groups_Sorted(gh) { ! if (gh->master_flag & (M_NO_DIRECTORY | M_IGNORE_GROUP)) continue; if (amount <= 1 && gh->unread_count <= 0) continue; if (amount == 0 && (gh->group_flag & G_UNSUBSCRIBED)) continue; if (amount == 3 && (gh->group_flag & G_UNSUBSCRIBED) == 0) continue; --- 1082,1090 ---- } } else Loop_Groups_Sorted(gh) { ! if (gh->master_flag & (M_NO_DIRECTORY | M_IGNORE_GROUP)){ ! continue; ! } if (amount <= 1 && gh->unread_count <= 0) continue; if (amount == 0 && (gh->group_flag & G_UNSUBSCRIBED)) continue; if (amount == 3 && (gh->group_flag & G_UNSUBSCRIBED) == 0) continue; diff -c +recursive +new-file nn-6.4.16/makefile.amiga ann/makefile.amiga *** nn-6.4.16/makefile.amiga --- ann/makefile.amiga Fri Mar 28 10:02:45 1985 *************** *** 0 **** --- 1,160 ---- + CC = bin:gcc + CPP = bin:kcc -E + AMIGA_INCLUDE = -Iwork:src/aztec/include13 + CFLAGS = -Iconf $(AMIGA_INCLUDE) -DAMIGA -DPATCH17 -DPATCH18 + LDFLAGS = -s + BIN_PROG = nn nnusage nngrab nnstats nnacct + BIN_LINK = nncheck nnadmin nntidy nngoback nngrep nnpost nnbatch + LIB_PROG = aux upgrade_rc + MASTER_PROG = nnmaster back_act nnspew + SHELL = /bin/sh + MASTER = master.o collect.o expire.o proto.o hostname.o \ + global.o options.o active.o db.o nntp.o \ + pack_date.o pack_name.o pack_subject.o news.o digest.o + NN = nn.o admin.o proto.o global.o options.o db.o nntp.o \ + init.o variable.o term.o keymap.o macro.o regexp.o \ + menu.o more.o newsrc.o group.o folder.o dir.o \ + sort.o articles.o sequence.o kill.o active.o fullname.o \ + answer.o reroute.o hostname.o save.o unshar.o decode.o execute.o \ + pack_date.o pack_name.o pack_subject.o news.o digest.o match.o + ACCT = account.o global.o options.o proto.o hostname.o + MAIL = nnmail.o reroute.o hostname.o global.o options.o + # all: $(BIN_PROG) $(LIB_PROG) $(MASTER_PROG) inst + all: nn nnmaster simplenews amiga-aux + copyit: nn nnmaster simplenews amiga-aux + copy nn dh1:uucpplus/nnlib/nn + copy nnmaster dh1:uucpplus/nnlib/nnmaster + copy nn dh1:uucpplus/nnlib/nnadmin + copy amiga-aux dh1:uucpplus/nnlib/amiga-aux + copy simplenews dh1:uucpplus/nnlib/simplenews + copy amiga-back-act dh1:uucpplus/nnlib/amiga-back-act + simplenews: simplenews.o readconfig.o + $(CC) -o simplenews simplenews.o readconfig.o $(CFLAGS) $(LDFLAGS) + simplenews.o: simplenews.c readconfig.h readconfig.c + readconfig.o: readconfig.c readconfig.h + amiga-aux: amiga-aux.o readconfig.o + $(CC) -o amiga-aux amiga-aux.o readconfig.o $(CFLAGS) $(LDFLAGS) + amiga-aux.o: amiga-aux.c + # debug: debug.o + # debug.o: debug.c + client: $(BIN_PROG) $(LIB_PROG) inst + master: $(MASTER_PROG) inst + nn: $(NN) readconfig.o + echo "linking nn" + $(CC) -o nn $(NN) readconfig.o $(CFLAGS) $(LDFLAGS) gcc:c/heapmem.o -ltermcap -lamy -lc + nnmaster: $(MASTER) readconfig.o + echo "linking nnmaster" + $(CC) -o nnmaster $(CFLAGS) $(MASTER) readconfig.o $(LDFLAGS) + nnmail: $(MAIL) + echo "linking nnmail" + $(CC) -o nnmail $(CFLAGS) $(MAIL) $(LDFLAGS) + nnstats: nnstats.sh prefix + # cat prefix nnstats.sh > nnstats ; chmod +x nnstats + nnusage: nnusage.sh prefix + # cat prefix nnusage.sh > nnusage ; chmod +x nnusage + nngrab: nngrab.sh prefix + # cat prefix nngrab.sh > nngrab ; chmod +x nngrab + aux: aux.sh prefix + # cat prefix aux.sh > aux ; chmod +x aux + upgrade_rc: upgrade_rc.sh prefix + # cat prefix upgrade_rc.sh > upgrade_rc ; chmod +x upgrade_rc + nnacct: $(ACCT) + echo "linking nnacct" + $(CC) -o nnacct $(CFLAGS) $(ACCT) $(LDFLAGS) + back_act: back_act.sh prefix + # cat prefix back_act.sh > back_act ; chmod +x back_act + nnspew: nnspew.sh prefix + # cat prefix nnspew.sh > nnspew ; chmod +x nnspew + prefix: config.h mkprefix + mkprefix >prefix prefix + mkprefix: prefix.o global.o + $(CC) -o mkprefix $(CFLAGS) prefix.o global.o $(LDFLAGS) + update.h: config.h patchlevel.h # Makefile + # sh -c "[ -f update.h ] || (echo 0 > update.h)" + # sh -c "expr `cat update.h` + 1 > update1.h && mv update1.h update.h" + # echo configuration number updated to `cat update.h` + cvt-help: config.h cvt-help.c + $(CC) -o cvt-help cvt-help.c $(LDFLAGS) + usercheck: config.h usercheck.c + $(CC) -o usercheck usercheck.c $(LDFLAGS) + inst: config.h xmakefile inst.sh cvt-help usercheck mkprefix man/nn.1 + # echo building install script: ./inst + # ./mkprefix full < /dev/null > inst + # echo BIN_PROG=\"$(BIN_PROG)\" >> inst + # echo BIN_LINK=\"$(BIN_LINK)\" >> inst + # echo LIB_PROG=\"$(LIB_PROG)\" >> inst + # echo MASTER_PROG=\"$(MASTER_PROG)\" >> inst + # cat inst.sh >> inst + # chmod 755 inst + man/nn.1: man/nn.1.A man/nn.1.B man/nn.1.C man/nn.1.D + -[ ! -f man/nn.1 ] || mv man/nn.1 man/nn.1~ + cat man/nn.1.? > man/nn.1 + clean: + rm -f $(BIN_PROG) $(LIB_PROG) $(MASTER_PROG) cvt-help usercheck + rm -f prefix mkprefix inst + rm -f man/nn.1 man/nn.1~ + account.o: account.c config.h global.h vararg.h options.h proto.h + active.o: active.c config.h global.h vararg.h data.h + admin.o: admin.c config.h global.h vararg.h data.h db.h term.h \ + proto.h + answer.o: answer.c config.h global.h vararg.h data.h news.h term.h \ + keymap.h options.h + articles.o: articles.c config.h global.h vararg.h data.h db.h articles.h + collect.o: collect.c config.h global.h vararg.h data.h db.h news.h + db.o: db.c config.h global.h vararg.h data.h db.h + decode.o: decode.c config.h global.h vararg.h data.h + digest.o: digest.c config.h global.h vararg.h data.h news.h debug.h + dir.o: dir.c config.h global.h vararg.h data.h articles.h dir.h + execute.o: execute.c config.h global.h vararg.h data.h term.h + expire.o: expire.c config.h global.h vararg.h data.h db.h dir.h + folder.o: folder.c config.h global.h vararg.h data.h articles.h news.h \ + term.h menu.h + fullname.o: fullname.c config.h global.h + global.o: global.c config.h global.h vararg.h data.h \ + patchlevel.h + # update.h + group.o: group.c config.h global.h vararg.h data.h articles.h db.h \ + term.h menu.h keymap.h regexp.h + hostname.o: hostname.c config.h + init.o: init.c config.h global.h vararg.h data.h articles.h term.h \ + keymap.h menu.h + keymap.o: keymap.c config.h global.h vararg.h data.h keymap.h term.h + kill.o: kill.c config.h global.h vararg.h data.h term.h regexp.h + macro.o: macro.c config.h global.h vararg.h data.h keymap.h term.h + master.o: master.c config.h global.h vararg.h data.h db.h \ + options.h proto.h + match.o: match.c config.h global.h regexp.h + menu.o: menu.c config.h global.h vararg.h data.h articles.h term.h \ + keymap.h menu.h regexp.h + more.o: more.c config.h global.h vararg.h data.h news.h term.h \ + menu.h keymap.h regexp.h + news.o: news.c config.h global.h vararg.h data.h news.h + nn.o: nn.c config.h global.h vararg.h data.h menu.h term.h \ + keymap.h options.h articles.h proto.h + nnmail.o: nnmail.c config.h global.h vararg.h data.h options.h + nntp.o: nntp.c config.h global.h vararg.h data.h nntp.h + options.o: options.c config.h global.h vararg.h data.h options.h + pack_date.o: pack_date.c config.h global.h vararg.h data.h + pack_name.o: pack_name.c config.h global.h vararg.h data.h + pack_subject.o: pack_subject.c config.h global.h vararg.h data.h + prefix.o: config.h global.h + proto.o: proto.c config.h global.h proto.h + newsrc.o: newsrc.c config.h global.h vararg.h data.h term.h debug.h + regexp.o: regexp.c config.h global.h vararg.h data.h regexp.h + reroute.o: reroute.c config.h global.h vararg.h data.h + save.o: save.c config.h global.h vararg.h data.h term.h keymap.h \ + news.h + selection.o: selection.c config.h global.h vararg.h data.h term.h\ + articles.h + sequence.o: sequence.c config.h global.h vararg.h data.h debug.h + sort.o: sort.c config.h global.h vararg.h data.h + term.o: term.c config.h global.h vararg.h data.h term.h keymap.h + unshar.o: unshar.c config.h global.h vararg.h data.h + variable.o: variable.c config.h global.h vararg.h data.h + nn1: $(NN) + $(CC) -o nn1 -Mnn1 $(CFLAGS) $(NN) $(LDFLAGS) -ltermlib + nnmaster1: $(MASTER) + $(CC) -o nnmaster1 -Mnnmaster1 $(CFLAGS) $(MASTER) $(LDFLAGS) + lint: + echo LINTING NN + echo LINTING MASTER diff -c +recursive +new-file nn-6.4.16/master.c ann/master.c *** nn-6.4.16/master.c Fri Oct 12 22:44:00 1984 --- ann/master.c Thu Mar 27 18:11:12 1985 *************** *** 6,11 **** --- 6,15 ---- * maintains the article header database. */ + /* + modified to work with the Amiga by Alexander Rawass + */ + #include #include #include "config.h" *************** *** 12,17 **** --- 16,25 ---- #include "db.h" #include "proto.h" + #ifdef AMIGA + FILE *debugfh; + #endif + import char *bin_directory; /* *************** *** 173,178 **** --- 181,187 ---- static clean_group_internal(gh) /* no write */ register group_header *gh; { + gh->first_db_article = 0; gh->last_db_article = 0; *************** *** 200,205 **** --- 209,215 ---- clean_group_internal(gh); + db_write_group(gh); } *************** *** 269,274 **** --- 279,285 ---- { register group_header *gh; + if (master.free_groups <= 0) db_expand_master(); *************** *** 358,366 **** sprintf(command, "awk 'NF>0{print $1}' %s | sort | uniq -d", news_active); src = popen(command, "r"); ! if (src == NULL) ! sys_error("popen(%s) failed", command); for (lcount = 0; fgets(groupname, 512, src); lcount++) { if (lcount == 0) --- 369,380 ---- sprintf(command, "awk 'NF>0{print $1}' %s | sort | uniq -d", news_active); + #ifndef AMIGA src = popen(command, "r"); ! if (src == NULL){ ! sys_error("popen(%s) failed", command); ! } ! for (lcount = 0; fgets(groupname, 512, src); lcount++) { if (lcount == 0) *************** *** 372,377 **** --- 386,392 ---- pclose(src); + if (lcount > 0) { printf("Do you want to repair this file before continuing ? (y)"); gets(command); *************** *** 382,387 **** --- 397,403 ---- nn_exit(0); } } + #endif /* if a "GROUPS" file exist offer to use that, else */ /* read group names from active file */ *************** *** 403,413 **** fl; if (!use_group_file) { sprintf(command, "awk 'NF>0{print $1}' %s | sort -u", news_active); src = popen(command, "r"); ! if (src == NULL) sys_error("popen(%s) failed", command); } open_master(OPEN_CREATE); --- 419,440 ---- fl; if (!use_group_file) { + #ifdef AMIGA + sprintf(command,"c:type %s",news_active); + #else sprintf(command, "awk 'NF>0{print $1}' %s | sort -u", news_active); + #endif + + #ifdef AMIGA + src = fopen(news_active,"r"); + #else src = popen(command, "r"); ! #endif ! ! if (src == NULL){ sys_error("popen(%s) failed", command); + } } open_master(OPEN_CREATE); *************** *** 432,439 **** gh->group_name_length = 0; if (db_parse_group(gh, 0) <= 0) break; } else { if (fgets(groupname, 512, src) == NULL) break; ! gh->group_name_length = strlen(groupname) - 1; /* strip NL */ groupname[gh->group_name_length] = NUL; gh->creation_time = 0; --- 459,478 ---- gh->group_name_length = 0; if (db_parse_group(gh, 0) <= 0) break; } else { + #ifndef AMIGA if (fgets(groupname, 512, src) == NULL) break; ! #else ! { ! char *gname; ! int i; ! ! gname=fgets(groupname,512,src); ! if(gname==NULL) break; ! for(i=0;groupname[i]!=' ';i++) ; ! groupname[i]='\n'; ! groupname[i+1]=0; ! } ! #endif gh->group_name_length = strlen(groupname) - 1; /* strip NL */ groupname[gh->group_name_length] = NUL; gh->creation_time = 0; *************** *** 475,481 **** --- 514,524 ---- if (use_group_file) close_groups(); else + #ifdef AMIGA + fclose(src); + #else pclose(src); + #endif printf("%s %s/GROUPS file\n", use_group_file ? "Updating" : "Building", db_directory); *************** *** 588,593 **** --- 631,640 ---- int skip_pass; long pass_no; + #ifdef AMIGA + debugfh=fopen("*","w"); + #endif + umask(002); /* avoid paranoia */ who_am_i = I_AM_MASTER; *************** *** 687,692 **** --- 734,740 ---- nn_exit(0); } + if (!ignore_lock && master.db_lock[0]) { printf("Database locked (unlock with -l or ignore with -i)\n"); nn_exit(88); *************** *** 704,709 **** --- 752,758 ---- } if (repeat_delay && !debug_mode && !foreground) { + while ((temp = fork()) < 0) sleep(1); if (temp) exit(0); /* not nn_exit() !!! */ *************** *** 720,725 **** --- 769,775 ---- repeat_delay, expire_level, expire_once ? "-F " : "", expire_method); + if (check_on_startup) { char cmd[FILENAME]; sprintf(cmd, "%s/nnadmin Z", bin_directory); *************** *** 731,738 **** init_digest_parsing(); - open_master(OPEN_UPDATE); if (group_selection) set_group_restrictions(argv + 1, group_selection); --- 781,788 ---- init_digest_parsing(); + open_master(OPEN_UPDATE); if (group_selection) set_group_restrictions(argv + 1, group_selection); *************** *** 800,810 **** continue; } visit_active_file(); ! if (do_expire()) if (!expire_once && do_collect()) master.last_scan = age_active; db_write_master(); --- 850,862 ---- continue; } + visit_active_file(); ! if (do_expire()){ if (!expire_once && do_collect()) master.last_scan = age_active; + } db_write_master(); *************** *** 836,841 **** --- 888,894 ---- register group_header *gh; FILE *open_gate_file(); + gate = open_gate_file(OPEN_READ); if (gate == NULL) return 0; *************** *** 869,874 **** --- 922,928 ---- log_entry('A', "RECV %c %s %c %ld (%s)", command, gh == NULL ? "(all)" : gh->group_name, opt, arg, user_date); + switch (command) { case SM_SET_OPTION: *************** *** 909,920 **** case SM_RECOLLECT: /* recollect */ if (gh) { ! if ((gh->master_flag & M_IGNORE_GROUP) == 0) clean_group(gh); } else Loop_Groups_Header(gh) ! if ((gh->master_flag & M_IGNORE_GROUP) == 0) clean_group(gh); break; case SM_SCAN_ONCE: /* unconditional pass */ --- 963,976 ---- case SM_RECOLLECT: /* recollect */ if (gh) { ! if ((gh->master_flag & M_IGNORE_GROUP) == 0){ clean_group(gh); + } } else Loop_Groups_Header(gh) ! if ((gh->master_flag & M_IGNORE_GROUP) == 0){ clean_group(gh); + } break; case SM_SCAN_ONCE: /* unconditional pass */ diff -c +recursive +new-file nn-6.4.16/menu.c ann/menu.c *** nn-6.4.16/menu.c Fri Oct 12 22:44:00 1984 --- ann/menu.c Mon Mar 24 19:12:26 1985 *************** *** 82,87 **** --- 82,90 ---- int mi_total; /* total number of articles with this subject */ int mi_unread; /* no of unread articles with this subject */ int mi_selected; /* no of selected articles with this subject */ + #ifdef PATCH18 + int mi_left; /* no of articles marked for later viewing */ + #endif /* PATCH18 */ int mi_art_id; /* article id (for mark()) */ } menu_info[INTERVAL1+INTERVAL2]; *************** *** 138,146 **** --- 141,151 ---- if (ah->flag & A_ROOT_ART) return root; + #ifndef PATCH18 if (ah->flag & A_CLOSED) /* only root article is shown on menu */ return firsta + menu_info[ah->menu_line].mi_cura; + #endif /* PATCH18 */ while (root > 0) { if (articles[root]->flag & A_ROOT_ART) break; root--; *************** *** 172,187 **** --- 177,203 ---- { register struct menu_info *mi; register article_number n; + #ifndef PATCH18 int total, unread, selected, invisible; + #else + int total, unread, selected, left, invisible; + #endif /* PATCH18 */ if (!(articles[art]->flag & A_CLOSED)) return art + 1; + #ifndef PATCH18 total = unread = selected = 0; + #else + total = unread = selected = left = 0; + #endif /* PATCH18 */ n = art = root_article(art); while (n < n_articles) { if (articles[n]->attr == 0) unread++; else if (articles[n]->attr & A_SELECT) selected++; + #ifdef PATCH18 + else if (articles[n]->attr == A_LEAVE_NEXT) left++; + #endif /* PATCH18 */ total++; if (++n == n_articles) break; if (articles[n]->flag & A_ROOT_ART) break; *************** *** 192,197 **** --- 208,216 ---- mi->mi_total = total; mi->mi_unread = unread; mi->mi_selected = selected; + #ifdef PATCH18 + mi->mi_left = left; + #endif /* PATCH18 */ return n; } *************** *** 206,215 **** --- 225,244 ---- register struct menu_info *mi; char *cbuf; { + #ifndef PATCH18 char sel[10], unr[10]; + #else + char lft[10], sel[10], unr[10]; + #endif /* PATCH18 */ attr_type cattr; + #ifndef PATCH18 if (mi->mi_unread == 0) + #else + if (mi->mi_total == mi->mi_left) + cattr = A_LEAVE_NEXT; + else if (mi->mi_unread == 0) + #endif /* PATCH18 */ cattr = A_READ; else if (mi->mi_total == mi->mi_selected) cattr = A_SELECT; *************** *** 220,231 **** --- 249,270 ---- else cattr = 0; + #ifndef PATCH18 sel[0] = unr[0] = NUL; + #else + lft[0] = sel[0] = unr[0] = NUL; + if (mi->mi_left && mi->mi_left < mi->mi_unread) + sprintf(lft, "%d,", mi->mi_left); + #endif /* PATCH18 */ if (mi->mi_selected && mi->mi_selected < mi->mi_unread) sprintf(sel, "%d/", mi->mi_selected); if (mi->mi_unread && mi->mi_unread < mi->mi_total) sprintf(unr, "%d:", mi->mi_unread); + #ifndef PATCH18 sprintf(cbuf, "%s%s%d", sel, unr, mi->mi_total); + #else + sprintf(cbuf, "%s%s%s%d", lft, sel, unr, mi->mi_total); + #endif /* PATCH18 */ return cattr; } *************** *** 268,273 **** --- 307,315 ---- thread_counters(firsta + cura); if (old.mi_total == mi->mi_total && old.mi_selected == mi->mi_selected && + #ifdef PATCH18 + old.mi_left == mi->mi_left && + #endif /* PATCH18 */ old.mi_unread == mi->mi_unread) return; cattr = closed_attr(mi, cbuf); *************** *** 399,406 **** --- 441,452 ---- else { if (collapse_subject > 0) so_printf("%-.*s", collapse_subject, ah->subject); + #ifndef PATCH17 lsubj -= 2 + collapse_subject; so_printf("<>%s", ah->subject + ah->subj_length - lsubj); + #else + so_printf("<>%s", ah->subject + ah->subj_length - lsubj + collapse_subject + 2); + #endif /* PATCH17 */ } } *************** *** 408,414 **** --- 454,465 ---- so_printf(ah->lines >= 0 ? " +%d" : " +?", ah->lines); so_end(); + #ifndef PATCH17 if (ah->flag & A_CLOSED) clrline_noflush(); + #else + if ((ah->flag & A_CLOSED) && lsubj > ah->subj_length) + clrline_noflush(); + #endif /* PATCH17 */ out: ah->disp_attr = last_attr; *************** *** 455,461 **** --- 506,516 ---- { register article_number i; register article_header *ah, **ahp; + #ifndef PATCH17 int count = 0, o_cura; + #else + int count = 0, o_cura, should_mark; + #endif /* PATCH17 */ extern int kill_file_loaded; if (mode == 1 && re == NULL) *************** *** 462,474 **** --- 517,548 ---- if (!kill_file_loaded && !init_kill()) return 0; o_cura = cura; + #ifndef PATCH17 cura = -1; + #else + should_mark = 0; + #endif /* PATCH17 */ + #ifdef PATCH17 + /* + * note: this code assumes that a visible article will be found + * before anything is marked + */ + #endif for (i = 0, ahp = articles; i < n_articles; i++, ahp++) { ah = *ahp; + #ifndef PATCH17 if (cura >= 0 && (ah->flag & A_ROOT_ART)) { mark(); cura = -1; + #else + if (IS_VISIBLE(ah)) { + if (should_mark) { + mark(); + should_mark = 0; + } + cura = i - firsta; + #endif /* PATCH17 */ } if (re != NULL) { if (!regexec_cf(re, select_on_sender ? ah->sender : ah->subject)) continue; *************** *** 478,483 **** --- 552,558 ---- count++; if (ah->attr & A_SELECT) continue; ah->attr = A_SELECT; + #ifndef PATCH17 if (firsta <= i && i <= (firsta+numa)) { cura = i - firsta; if ((ah->flag & A_CLOSED) == 0) { *************** *** 485,493 **** --- 560,576 ---- cura = -1; } } + #else + if (firsta <= i && i <= (firsta+numa)) + should_mark = 1; + #endif /* PATCH17 */ } + #ifndef PATCH17 if (cura >= 0) mark(); + #else + if (should_mark) mark(); + #endif /* PATCH17 */ if (count) msg("Selected %d article%s", count, plural((long)count)); *************** *** 617,624 **** --- 700,723 ---- case MC_MENU: ah->attr = o_attr; + #ifndef PATCH18 if (nexta - firsta < n_articles) if ((firsta = cur - 5) < 0) firsta = 0; + #else + if (nexta - firsta < n_articles) { + /* Keep a little article context by making the */ + /* current article go on menu line 6 if possible */ + if (IS_VISIBLE(articles[cur])) + firsta = cur; + else + firsta = root_article(cur); + for (next = 0; firsta > 0 && next < 5; next++) { + firsta--; + if (!IS_VISIBLE(articles[firsta])) + firsta = root_article(firsta); + } + } + #endif /* PATCH18 */ next_cura = cur - firsta; return MC_MENU; *************** *** 725,731 **** --- 824,834 ---- article_id = map & ~K_ARTICLE_ID; map = K_ARTICLE_ID; + #ifndef PATCH17 if (article_id < 0 || article_id > menu_articles) { + #else + if (article_id < 0 || article_id >= menu_articles) { + #endif /* PATCH17 */ ding(); goto loop; } *************** *** 817,824 **** --- 920,937 ---- attr_type old, new; int update; { + #ifndef PATCH18 return repl_attr(root_article(firsta+cura), next_root_article(firsta+cura), old, new, update); + #else + int f, l; + + f = root_article(firsta+cura); + l = next_root_article(firsta+cura); + if (old == A_SELECT) + (void) repl_attr(f, l, A_AUTO_SELECT, A_SELECT, update); + return repl_attr(f, l, old, new, update); + #endif /* PATCH18 */ } static repl_attr_all(old, new, update) *************** *** 1639,1644 **** --- 1752,1760 ---- } cura = article_id; next_cura = next_root_article(firsta + cura) - firsta; + #ifdef PATCH17 + if (next_cura < 0 || next_cura > numa) next_cura = 0; + #endif /* PATCH17 */ if (cura >= 0) goto partial_redraw_nc; articles[cura + firsta]->menu_line = articles[firsta]->menu_line; firsta += cura; diff -c +recursive +new-file nn-6.4.16/more.c ann/more.c *** nn-6.4.16/more.c Fri Oct 12 22:44:00 1984 --- ann/more.c Thu Mar 27 18:45:45 1985 *************** *** 21,27 **** --- 21,35 ---- export char *header_lines = NULL; export int min_pv_window = 7; export int wrap_headers = 6; + + /* AMIGA is 8 bit, so set data_bits to 8 as default */ + + #ifndef AMIGA export int data_bits = 7; + #else + export int data_bits = 8; + #endif + export int scroll_clear_page = 1; export int expired_msg_delay = 1; export char *trusted_escapes = NULL; diff -c +recursive +new-file nn-6.4.16/newsrc.c ann/newsrc.c *** nn-6.4.16/newsrc.c Fri Oct 12 22:44:00 1984 --- ann/newsrc.c Thu Mar 27 18:13:29 1985 *************** *** 10,15 **** --- 10,19 ---- #include "term.h" #include "articles.h" + #ifdef AMIGA + extern FILE *debugfh; + #endif + #ifdef sel /* Remove Gould SELbus software name collision */ #undef sel *************** *** 156,162 **** --- 160,177 ---- if (dump_file(newsrc_file, DM_NEWSRC)) { extern char *tmp_directory; char temp[FILENAME]; + + #ifdef AMIGA + if(tmp_directory[strlen(tmp_directory)-1]==':'){ + sprintf(temp, "%snewsrc-%d", tmp_directory, process_id); + } + else{ + sprintf(temp, "%s/newsrc-%d", tmp_directory, process_id); + } + #else sprintf(temp, "%s/newsrc-%d", tmp_directory, process_id); + #endif + if (dump_file(temp, DM_NEWSRC)) user_error("Cannot update %s -- restore %s file!!!", newsrc_file, bak_suffix); *************** *** 1256,1262 **** Loop_Groups_Sequence(gh) { gh->unread_count = 0; ! if (gh->master_flag & M_NO_DIRECTORY) continue; if (gh->last_db_article > gh->last_article) { n = unread_articles; --- 1271,1279 ---- Loop_Groups_Sequence(gh) { gh->unread_count = 0; ! if (gh->master_flag & M_NO_DIRECTORY){ ! continue; ! } if (gh->last_db_article > gh->last_article) { n = unread_articles; diff -c +recursive +new-file nn-6.4.16/nn.c ann/nn.c *** nn-6.4.16/nn.c Fri Oct 12 22:44:00 1984 --- ann/nn.c Thu Mar 27 18:14:23 1985 *************** *** 4,9 **** --- 4,13 ---- * The nn user interface main program */ + /* + modified to work with the Amiga by Alexander Rawass + */ + #include "config.h" #include "menu.h" #include "term.h" *************** *** 15,20 **** --- 19,29 ---- #include #endif + #ifdef AMIGA + FILE *debugfh; + extern unsigned long _Heapsize; + #endif + import char *bin_directory; import int *************** *** 679,684 **** --- 688,699 ---- extern long initial_memory_break; extern char *sbrk(); + #ifdef AMIGA + _Heapsize=150*1024L; + + debugfh=fopen("*","w"); + #endif + initial_memory_break = (long)sbrk(0); #ifdef USE_MALLOC_H *************** *** 695,700 **** --- 710,735 ---- pname = program_name(argv); + #ifdef AMIGA + { + int i,be; + + be=-1; + for(i=0;i #include "proto.h" + #ifdef AMIGA + extern FILE *debugfh; + #endif + #ifndef ACCOUNTING #ifdef AUTHORIZE #define ACCOUNTING *************** *** 224,229 **** --- 228,234 ---- long arg; { FILE *gate; + gate = open_gate_file(OPEN_APPEND); diff -c +recursive +new-file nn-6.4.16/readconfig.c ann/readconfig.c *** nn-6.4.16/readconfig.c --- ann/readconfig.c Mon Mar 24 14:58:17 1985 *************** *** 0 **** --- 1,99 ---- + /* + reads the config file of your UUCP installation + + by Alexander Rawass, a_rawass@informatik.uni-kl.de + */ + + #include + #include + + #include "readconfig.h" + + #define LMAX 200 + + #define CONFIGLINE(x) (!(strncmp(x,lbuf,strlen(x)))) + + VOID stripM(buf) + STRPTR buf; + { + int i; + + for(i=0;buf[i]!='\n' && buf[i]!=0;i++){ + if(buf[i]==0x0d){ + buf[i]=0; + } + } + buf[i]=0; + } + + STRPTR confname(buf) + STRPTR buf; + { + int i; + + for(i=0;buf[i]!=' ' && buf[i]!=0x09;i++) ; /* find first space */ + + for(;buf[i]==' ' || buf[i]==0x09;i++) ; /* find first non-space */ + + return(buf+i); + } + + BOOL readconfig(name,conf) + STRPTR name; + struct uuconfig *conf; + { + FILE *fh; + char lbuf[LMAX]; + + fh=fopen(name,"r"); + + if(fh==NULL){ + return(FALSE); + } + + fgets(lbuf,LMAX,fh); + while(!feof(fh)){ + stripM(lbuf); + if(CONFIGLINE("NodeName")){ + strcpy(conf->NodeName,confname(lbuf)); + } + else if(CONFIGLINE("UserName")){ + strcpy(conf->UserName,confname(lbuf)); + } + else if(CONFIGLINE("RealName")){ + strcpy(conf->RealName,confname(lbuf)); + } + else if(CONFIGLINE("Organization")){ + strcpy(conf->Organization,confname(lbuf)); + } + else if(CONFIGLINE("DomainName")){ + strcpy(conf->DomainName,confname(lbuf)); + } + else if(CONFIGLINE("Editor")){ + strcpy(conf->Editor,confname(lbuf)); + } + else if(CONFIGLINE("MailCommand")){ + strcpy(conf->MailCommand,confname(lbuf)); + } + else if(CONFIGLINE("NewsCommand")){ + strcpy(conf->NewsCommand,confname(lbuf)); + } + else if(CONFIGLINE("SaveFolder")){ + strcpy(conf->SaveFolder,confname(lbuf)); + } + else if(CONFIGLINE("NewsSignature")){ + strcpy(conf->NewsSignature,confname(lbuf)); + } + else if(CONFIGLINE("MailSignature")){ + strcpy(conf->MailSignature,confname(lbuf)); + } + fgets(lbuf,LMAX,fh); + } + + fclose(fh); + + return(TRUE); + } + + + diff -c +recursive +new-file nn-6.4.16/readconfig.h ann/readconfig.h *** nn-6.4.16/readconfig.h --- ann/readconfig.h Mon Mar 24 14:58:17 1985 *************** *** 0 **** --- 1,19 ---- + #define UUMAX 200 + #define LMAX 200 + + struct uuconfig { + /* for UUCP */ + char NodeName[UUMAX]; + char UserName[UUMAX]; + char RealName[UUMAX]; + char Organization[UUMAX]; + char DomainName[UUMAX]; + /* for Amiga-NN */ + char Editor[UUMAX]; + char MailCommand[UUMAX]; + char NewsCommand[UUMAX]; + char SaveFolder[UUMAX]; + char NewsSignature[UUMAX]; + char MailSignature[UUMAX]; + }; + diff -c +recursive +new-file nn-6.4.16/save.c ann/save.c *** nn-6.4.16/save.c Fri Oct 12 22:44:00 1984 --- ann/save.c Fri Mar 28 09:56:36 1985 *************** *** 11,17 **** --- 11,28 ---- #include "keymap.h" #include "news.h" + #ifdef AMIGA + extern FILE *debugfh; + #endif + + /* to be compatible with ARN, AMIGA will use +$G */ + + #ifdef AMIGA + export char *default_save_file = "+$G"; + #else export char *default_save_file = "+$F"; + #endif + export char *folder_save_file = NULL; export int suggest_save_file = 1; export char *unshar_header_file = "Unshar.Headers"; *************** *** 143,148 **** --- 154,161 ---- continue; } *slash = NUL; + + if (mkdir(name, 0755)) { msg("Cannot make %s/", name); *slash = '/'; *************** *** 218,223 **** --- 231,237 ---- } save_name = get_s(last_input, save_name, NONE, file_completion); + if (save_name == NULL || *save_name == NUL) return NULL; if (save_name[1] == NUL && save_name[0] == '+') *************** *** 727,732 **** --- 741,747 ---- msg("Directory %s already exists", dir); return NULL; } + if (mkdir(dir, 0755)) { msg("Cannot make %s", dir); diff -c +recursive +new-file nn-6.4.16/sequence.c ann/sequence.c *** nn-6.4.16/sequence.c Fri Oct 12 22:44:00 1984 --- ann/sequence.c Fri Mar 28 09:57:32 1985 *************** *** 7,12 **** --- 7,16 ---- #include "config.h" #include "debug.h" + #ifdef AMIGA + extern FILE *debugfh; + #endif + export group_header *group_sequence; export char *read_mail = NULL; export int also_subgroups = 1; *************** *** 94,101 **** gh->group_flag |= G_SEQUENCE; ! if (gh->master_flag & M_NO_DIRECTORY) return 0; /* for nntidy -s */ switch (mode) { case SHOW_FIRST: --- 98,106 ---- gh->group_flag |= G_SEQUENCE; ! if (gh->master_flag & M_NO_DIRECTORY){ return 0; /* for nntidy -s */ + } switch (mode) { case SHOW_FIRST: diff -c +recursive +new-file nn-6.4.16/simplenews.c ann/simplenews.c *** nn-6.4.16/simplenews.c --- ann/simplenews.c Mon Mar 24 14:51:02 1985 *************** *** 0 **** --- 1,91 ---- + /* + Simplenews + + by Alexander Rawass, a_rawass@informatik.uni-kl.de + */ + + #include + #include + #include + + #include "readconfig.h" + + #define LMAX 200 + #define LAST_SIMPLENEWS "t:last.simplenews" + + time_t cur_time() + { + time_t t; + + time(&t); + return t; + } + + int main(argc,argv) + int argc; + STRPTR argv[]; + { + FILE *ifh; + FILE *ofh; + FILE *sfh; + char wname[100]; + char combuf[100]; + char buf[LMAX]; + time_t now; + extern struct tm *gmtime(); + extern char *asctime(); + char *date; + int ok; + struct uuconfig conf; + + if(argc<2){ + exit(42); + } + + if(readconfig("uulib:config",&conf)==FALSE + || readconfig("uulib:.nnrc",&conf)==FALSE){ + exit(117); + } + + ifh=fopen(argv[1],"r"); + + sprintf(wname,"%s.simplenews",argv[1]); + ofh=fopen(wname,"w"); + + fprintf(ofh,"Path: %s!%s\n",conf.NodeName,conf.UserName); + fprintf(ofh,"From: %s@%s%s (%s)\n",conf.UserName,conf.NodeName,conf.DomainName,conf.RealName); + fprintf(ofh,"Distribution: world\n"); + fprintf(ofh,"Organization: %s\n",conf.Organization); + + now = cur_time(); + date = asctime(gmtime(&now)); + date[3] = date[7] = date[10] = date[19] = date[24] = 0; + + fprintf(ofh, "Date: %s %s %s %s GMT\n", date+8, date+4, date+22, date+11); + fprintf(ofh, "Message-ID: <%s.%ld@%s%s>\n",conf.UserName,(long)now,conf.NodeName,conf.DomainName ); + + fgets(buf,LMAX,ifh); + while(!feof(ifh)){ + fputs(buf,ofh); + fgets(buf,LMAX,ifh); + } + + fclose(ifh); + + sfh=fopen(conf.NewsSignature,"r"); + fgets(buf,LMAX,sfh); + while(!feof(sfh)){ + fputs(buf,ofh); + fgets(buf,LMAX,sfh); + } + fclose(sfh); + + fclose(ofh); + + sprintf(combuf,"relaynews <%s -i",wname); + ok=system(combuf); + + unlink(wname); + + exit(ok); + } diff -c +recursive +new-file nn-6.4.16/term.c ann/term.c *** nn-6.4.16/term.c Fri Oct 12 22:44:00 1984 --- ann/term.c Wed Mar 05 10:05:30 1985 *************** *** 112,123 **** --- 112,129 ---- extern char fake_keyb_siglist[]; #endif + #ifdef AMIGA + #undef HAVE_TERMIO + #endif + #ifdef HAVE_TERMIO #define KEY_BURST 50 /* read bursts of 50 chars (or timeout after 100 ms) */ + #ifndef AMIGA #ifdef USE_TERMCAP #include + #endif #endif #undef CBREAK diff -c +recursive +new-file nn-6.4.16/update.h ann/update.h *** nn-6.4.16/update.h Wed Feb 06 06:37:00 1985 --- ann/update.h *************** *** 1 **** - 5 --- 0 ----