gih900@csc.anu.oz (Geoff Huston) (10/10/89)
-+-+-+-+-+-+-+-+ START OF PART 5 -+-+-+-+-+-+-+-+ X * s_to_lower, s_to_upper X * X */ X Xchar *s_to_lower(s) X char *s; X`123 X char *save = s; X X while (*s) `123 X *s = tolower(*s); X s++; X `125 X return(save); X`125 X Xchar *s_to_upper(s) X char *s; X`123 X char *save = s; X X while (*s) `123 X *s = toupper(*s); X s++; X `125 X return(save); X`125 X`012 X/* X * open_rem_chan X * X * Open channel to remote NNTP server on host name node, using protocol X * proto_num (3 == SRITCP, 2 == WINTCP, 1 == CMUTCP, 0 = DECNET) X */ X Xchar restart_node`091256`093; Xint restart_proto_num, X restarts = 0; X Xrestart_nntp() X`123 X if (++restarts > MAX_RESTART_ATTEMPT) return(0); X printf("(Lost NNTP connection - restart attempted)\n"); X return(open_rem_chan(restart_node,restart_proto_num)); X`125 X Xopen_rem_chan(node,proto_num) X char *node; X int proto_num; X`123 X int reply; X X strcpy(restart_node,node); X restart_proto_num = proto_num; X s_to_lower(node); X if (*net_open_chan) `123 X if ((proto_num != net_proto) `124`124 (strcmp(node,net_open_chan))) `123 X close_net(); X *net_open_chan = 0; X `125 X else toggle_link(); X `125 X if (!*net_open_chan) `123 X strcpy(net_open_chan,node); X if (!open_net(net_open_chan,proto_num)) `123 X *net_open_chan = 0; X if (debugging) printf("open_chan: Could not open network channel\n"); X return(0); X `125 X else net_proto = proto_num; X if (!(reply = wait_net_response(CLIENT_TIMER,1))) `123 X close_net(); X *net_open_chan = 0; X if (debugging) printf("open_chan: No reply recieved in %d secs\n",CLIE VNT_TIMER); X return(0); X `125 X if ((reply!=200) && (reply!=201)) `123 X printf("Connection refused to NEWS SERVER (`091%c`093 %s)",(net_proto V ? 'T' : 'D'),net_open_chan); X return(0); X `125 X `125 X return(1); X`125 X`012 X/* X * ITM routines X * X */ Xstruct FAB itmfab; /* newsitem file fab */ X Xstruct RAB itmrab; /* newsitem file rab */ X XITM newsitm; /* newsitem i/o buffer */ X Xopen_itm_file() X`123 X itmfab = cc$rms_fab; X itmfab.fab$b_fac = FAB$M_GET; X itmfab.fab$l_fna = ITM_FILENAME; X itmfab.fab$b_fns = strlen(itmfab.fab$l_fna); X itmfab.fab$b_shr = FAB$M_SHRDEL `124 FAB$M_SHRGET `124 FAB$M_SHRPUT `124 F VAB$M_SHRUPD; X X itmrab = cc$rms_rab; X itmrab.rab$l_fab = &itmfab; X itmrab.rab$l_rbf = itmrab.rab$l_ubf = &newsitm; X itmrab.rab$w_rsz = itmrab.rab$w_usz = sizeof newsitm; X X if (!(sys$open(&itmfab) & 1)) return(0); X if (!(sys$connect(&itmrab) & 1)) `123 X sys$close(&itmfab); X return(0); X `125 X return(1); X`125 X Xclose_itm_file() X`123 X sys$close(&itmfab); X`125 X Xitm_check(id) X char *id; X`123 X itmrab.rab$l_kbf = id; X itmrab.rab$b_ksz = IDLEN + 4; X itmrab.rab$b_krf = 1; X itmrab.rab$l_rop = RAB$M_KGE `124 RAB$M_RRL `124 RAB$M_NLK; X itmrab.rab$b_rac = RAB$C_KEY; X X if ((!(sys$get(&itmrab) & 1)) `124`124 strcmp(id,newsitm.itm_id)) X return(0); X return(1); X`125 X`012 X/* X * HISTORY routines X * X */ X Xint hist_file_open = 0, X hist_off = 0; X Xstruct FAB histfab; X Xstruct RAB histrab; X Xstruct hist `123 X char hist_id`091IDLEN`093; X unsigned int hist_date; X `125 newshist; X Xopen_hist_file() X`123 X FILE *fpr; X X if (fpr = fopen(HIST_OFF,"r")) `123 X fclose(fpr); X hist_off = 1; X return(0); X `125 X X histfab = cc$rms_fab; X histfab.fab$b_fac = FAB$M_GET; X histfab.fab$l_fna = HIST_FILE; X histfab.fab$b_fns = strlen(histfab.fab$l_fna); X histfab.fab$b_shr = FAB$M_SHRDEL `124 FAB$M_SHRGET `124 FAB$M_SHRPUT `124 V FAB$M_SHRUPD; X X histrab = cc$rms_rab; X histrab.rab$l_fab = &histfab; X histrab.rab$l_rbf = histrab.rab$l_ubf = &newshist; X histrab.rab$w_rsz = histrab.rab$w_usz = sizeof newshist; X X if (!(sys$open(&histfab) & 1)) return(0); X if (!(sys$connect(&histrab) & 1)) `123 X sys$close(&histfab); X return(0); X `125 X return(hist_file_open = 1); X`125 X Xclose_hist_file() X`123 X if (hist_file_open) sys$close(&histfab); X`125 X Xhist_check(id) X char *id; X`123 X if (!hist_file_open) return(0); X histrab.rab$l_kbf = id; X histrab.rab$b_krf = 0; X histrab.rab$b_ksz = IDLEN; X histrab.rab$l_rop= RAB$M_RRL `124 RAB$M_NLK ; X histrab.rab$b_rac = RAB$C_KEY; X return(sys$find(&histrab) & 1); X`125 X`012 X/* X * open_server_files X * X * Open the item and newsgroup files for sharing X */ X Xopen_server_files() X`123 X if (!open_itm_file()) return(0); X open_hist_file(); X return(1); X`125 X Xclose_server_files() X`123 X close_itm_file(); X close_hist_file(); X`125 X Xid_check(id) X char *id; X`123 X char l_id`091IDLEN + 4`093; X int i; X X for (i = 0; i < (IDLEN + 4); ++i) l_id`091i`093 = '\0'; X strncpy(l_id,id,IDLEN); X s_to_lower(l_id); X X if (itm_check(l_id) `124`124 hist_check(l_id)) return(1); X return(0); X`125 X`012 Xcollect_newids(stmfile,idfile) X char *stmfile,*idfile; X`123 X char cmd`091256`093, X *cp; X int start_time, X last_time = 0, X i; X struct tm *stm; X FILE *fpr, X *fpw; X X time(&start_time); X if (fpr = fopen(stmfile,"r")) `123 X if (fscanf(fpr,"%X",&last_time) != 1) last_time = 0; X fclose(fpr); X `125 X X last_time -= DAYS * 60 * 60 * 24; X if (last_time < 0) last_time = 1; X stm = localtime(&last_time); X X if (!(fpw = fopen(idfile,"a"))) `123 X printf("Collect_ids: Cannot append to id file %s\n",idfile); X return(0); X `125 X X printf("Collect_ids: Connect to NNTP server %s at %s",node,ctime(&start_ti Vme)); X if (!open_rem_chan(node,proto_num)) `123 X printf(" Connection refused\n"); X fclose(fpw); X return(0); X `125 X X printf(" Request item-id list: since %s",ctime(&last_time)); X sprintf(cmd,"NEWNEWS * %02d%02d%02d %02d%02d%02d", X stm->tm_year,stm->tm_mon + 1,stm->tm_mday, X stm->tm_hour,stm->tm_min,stm->tm_sec); X if (!nntp_write(cmd) `124`124 (wait_net_response(CLIENT_TIMER,1) != 230)) V `123 X fclose(fpw); X close_net(); X printf(" 0 item-ids returned - Comm error\n"); X return(0); X `125 X while (wait_net_response(RESP_TIMER,0) == 1) `123 X if (!strcmp(ibuf,".\n")) break; X else if (!strcmp(ibuf,"..\n")) strcpy(ibuf,".\n"); X if (strlen(ibuf) > 1) `123 X ++offered; X fputs(ibuf,fpw); X `125 X `125 X close_net(); X printf(" %d item-ids returned",offered); X fclose(fpw); X if (!strcmp(ibuf,".\n")) `123 X printf("\n"); X if (fpr = fopen(stmfile,"w")) `123 X fprintf(fpr,"%X\n",start_time); X fclose(fpr); X strcat(stmfile,";-1"); X while (!delete(stmfile)); X cp = strrchr(stmfile,';'); X *++cp = '\0'; X strcpy(cmd,stmfile); X strcat(cmd,"1"); X rename(stmfile,cmd); X `125 X `125 X else printf(" - Transmission aborted - comm errors\n"); X`125 X Xstruct tree `123 X char *str; X struct tree *left, *right; X `125 *idtree = 0; X Xtsearch(t,s) X struct tree **t; X char *s; X`123 X int cmp; X X if (!*t) `123 X *t = malloc(sizeof **t); X strcpy((*t)->str = malloc(strlen(s) + 1),s); X (*t)->left = (*t)->right = 0; X return(0); X `125 X if (!(cmp = strcmp(s,(*t)->str))) return(1); X if (cmp < 0) return(tsearch(&((*t)->left),s)); X return(tsearch(&((*t)->right),s)); X`125 X Xcleart(t) X struct tree *t; X`123 X if (t->right) cleart(t->right); X if (t->left) cleart(t->left); X free(t->str); X free(t); X`125 X X`012 Xprocess_idfile(idfilename,batchfile) X char *idfilename, *batchfile; X`123 X FILE *fpr, X *fpw = 0; X char inl`091512`093, X nfn`091256`093, X cmd`091256`093, X *cp; X int ids = 0, X start_time, X resp, X art_count = 0, X fsize = 0; X X if ( !(fpr = fopen(idfilename,"r")) X `124`124 !(fpw = fopen(idfilename,"w"))) return(0); X while (fgets(inl,512,fpr)) `123 X if (cp = strchr(inl,'\n')) *cp = '\0'; X if (!strlen(inl) `124`124 (cp = strchr(inl,' ')) `124`124 id_check(inl)) V continue; X if (!tsearch(&idtree,inl)) `123 X ++ids; X fputs(inl,fpw); X fputs("\n",fpw); X `125 X `125 X if (idtree) cleart(idtree); X idtree = 0; X fclose(fpr); X fclose(fpw); X if (!ids) while (!delete(idfilename)); X else `123 X strcpy(nfn,idfilename); X strcat(nfn,";-1"); X while (!delete(nfn)); X strcat(idfilename,";"); X strcpy(nfn,idfilename); X strcat(nfn,"1"); X rename(idfilename,nfn); X if (cp = strchr(idfilename,';')) *cp = '\0'; X fpw = 0; X `125 X X if (!ids`124`124 !(fpr = fopen(idfilename,"r"))) return(0); X time(&start_time); X printf("Process_ids: Connect to NNTP server %s at %s",node,ctime(&start_ti Vme)); X if (!open_rem_chan(node,proto_num)) `123 X printf(" Connection refused\n"); X fclose(fpr); X return(0); X `125 X strcpy(nfn,batchfile); X cp = strrchr(nfn,'.'); X strcpy(cp,".OPEN"); X while (fgets(inl,512,fpr)) `123 X if (cp = strchr(inl,'\n')) *cp = '\0'; X sprintf(cmd,"ARTICLE %s",inl); X if ( !nntp_write(cmd) X `124`124 ((resp = wait_net_response(CLIENT_TIMER,1)) != 220)) `123 X if (resp == 430) continue; X if (!restart_nntp()) `123 X if (fpw) `123 X fclose(fpw); X rename(nfn,batchfile); X `125 X fclose(fpr); X printf(" %d items received - Transmission aborted - comm errors\n" V,art_count); X return(art_count); X `125 X continue; X `125 X if (!fpw) fpw = fopen(nfn,"w"); X fprintf(fpw,"#! rnews 1\n"); X while (wait_net_response(RESP_TIMER,0) == 1) `123 X if (!strcmp(ibuf,".\n")) break; X else if (!strcmp(ibuf,"..\n")) strcpy(ibuf,".\n"); X fputs(ibuf,fpw); X fsize += strlen(ibuf); X `125 X if (strcmp(ibuf,".\n")) `123 X fclose(fpw); X while (!delete(nfn)); X fpw = 0; X if (!restart_nntp()) `123 X fclose(fpr); X printf(" %d items received - Transmission aborted - comm errors\n" V,art_count); X return(art_count); X `125 X continue; X `125 X ++art_count; X if (fsize > MAX_BATCH_SIZE) `123 X fclose(fpw); X rename(nfn,batchfile); X fpw = 0; X fsize = 0; X `125 X `125 X close_net(); X printf(" %d items received\n",art_count); X if (fpw) `123 X fclose(fpw); X rename(nfn,batchfile); X `125 X fclose(fpr); X while (!delete(idfilename)); X return(art_count); X`125 X`012 X/* X * main X */ X Xmain(argc,argv) X int argc; X char *argv`091`093; X`123 X char proto`09132`093, X batch_stamp_file`091256`093, X all_ids`091256`093, X control_ids`091256`093, X out_all`091256`093, X out_control`091256`093, X cmd`091256`093, X idfile`091256`093, X *np; X int`032 X start_time, X last_time = 0, X i; X FILE *fpr, X *fpw; X X`009`009`009`009/* startup code - initialize environment */ X sysprv(); X if ((argc < 3) `124`124 (argc > 5)) `123 X printf("Usage: NNTPXFER node proto `091log`093 `091debug`093\n"); X exit(1); X `125 X if (!open_server_files()) `123 X printf("FileError: Cannot open NEWS datafiles\n"); X exit(1); X `125 X if (np = getenv("NNTP_SCRATCH")) strcpy(scratch_area,np); X else if (!getenv("SYS$SCRATCH")) strcpy(scratch_area,"NEWS_MANAGER"); X else strcpy(scratch_area,"SYS$SCRATCH"); X X`009`009`009`009/* interpret program arguments */ X strcpy(node,argv`0911`093); X strcpy(fnode,node); X while (np = strchr(fnode,'.')) *np = '-'; X strcpy(proto,argv`0912`093); X#if TWG X if (tolower(*proto) == 't') proto_num = WINTCP; X if (tolower(*proto) == 'w') proto_num = WINTCP; X#elif SRI X if (tolower(*proto) == 't') proto_num = SRITCP; X if (tolower(*proto) == 's') proto_num = SRITCP; X#else X if (tolower(*proto) == 't') proto_num = CMUTCP; X if (tolower(*proto) == 'c') proto_num = CMUTCP; X#endif X if (argc>=4) `123 X strcpy(logfile,argv`0913`093); X logging = 1; X `125 X if (argc==5) debugging = 1; X X X sprintf(idfile,"NEWS_MANAGER:NNTP_%s.IDS",fnode); X sprintf(out_all,"NEWS_MANAGER:NNTP_%s.BATCH",fnode); X accepted += process_idfile(idfile,out_all); X X sprintf(batch_stamp_file,"NEWS_MANAGER:NNTP_%s.LASTCALL",fnode); X sprintf(idfile,"NEWS_MANAGER:NNTP_%s.IDS",fnode); X collect_newids(batch_stamp_file,idfile); X X sprintf(idfile,"NEWS_MANAGER:NNTP_%s.IDS",fnode); X accepted += process_idfile(idfile,out_all); X X close_server_files(); X X if (logging)`123 X struct tm *stm; X int cur_time; X char *p, X datum`09132`093; X FILE *fpl; X X time(&cur_time); X p = ctime(&cur_time); X p += 4; X stm = localtime(&cur_time); X sprintf(datum,"%d %.3s %d %02d:%02d:%02d ", X stm->tm_mday,p,stm->tm_year,stm->tm_hour,stm->tm_min,stm->tm_se Vc); X fpl = fopen(logfile,"a"); X fprintf(fpl,"%s nntpxfer: %s - %d items listed, %d transferred\n", X datum,node,offered,accepted); X fclose(fpl); X `125 X`125 $ CALL UNPACK NNTP_XFER.C;1 2079707824 $ v=f$verify(v) $ EXIT