gih900@csc.anu.oz (Geoff Huston) (11/25/89)
+-+-+-+ Beginning of part 10 +-+-+-+ X! return(0); X! `125 X! if (!(fpw = fopen(NEWSBATCH,"a"))) `123 X! strcpy(msgbuf,"File handler error in NNTP Server."); X! return(0); X! `125 X! fputs("#! rnews 1\n",fpw); X! while (fgets(line,BUFF_STRLEN,fpr)) fputs(line,fpw); X! fclose(fpr); X! fclose(fpw); X! strcpy(msgbuf,"Item successfully spooled."); X! return(1); X `125 X `012 X /* X--- 1264,1291 ----- X `032 X if (mode == POST) return(post_add_item(fn,msgbuf,stm)); X `032 X! if (!(fpr = fopen(fn,"r"))) `123 X! strcpy(msgbuf,"File handler error in NNTP Server."); X! return(0); X! `125 X! sprintf(batch,NEWSBATCH,getpid()); X! if (!stat(batch,&sbuffer)) `123 V! if (sbuffer.st_size > NEWS_BATCH_SIZE) fpw = fopen(batch,"w","alq=30"," Xdeq=30"); X! else V! if (!(fpw = fopen(batch,"a"))) fpw = fopen(batch,"w","alq=30","deq=30 X"); X! `125 X! else fpw = fopen(batch,"w","alq=30","deq=30"); X! if (!fpw) `123 X! strcpy(msgbuf,"File handler error in NNTP Server."); X! return(0); X! `125 X! fprintf(fpw,"#! rnews %d\n", (ihave_size > 0 ? ihave_size : 1)); X! while (fgets(line,BUFF_STRLEN,fpr)) fputs(line,fpw); X! fclose(fpr); X! fclose(fpw); X! strcpy(msgbuf,"Item successfully spooled."); X! while (!delete(fn)); X! return(1); X `125 X `012 X /* X************** X*** 1817,1826 X */ X `032 X static X! FILE *openartbyid(id, msg_status,stm) X! char *id; X! int *msg_status; X! int stm; X `123 X char l_id[IDLEN + 4]; X int i; X--- 1831,1840 ----- X */ X `032 X static X! FILE *openartbyid(id,msg_status,stm) X! char *id; X! int *msg_status; X! int stm; X `123 X char l_id[IDLEN + 4]; X int i; X************** X*** 1822,1829 X int *msg_status; X int stm; X `123 X! char l_id[IDLEN + 4]; X! int i; X `032 X *msg_status = M430; X for (i = 0; i < (IDLEN + 4); ++i) l_id[i] = '\0'; X--- 1836,1843 ----- X int *msg_status; X int stm; X `123 X! char l_id[IDLEN + 4]; X! int i; X `032 X ihave_size = 0; X *msg_status = M430; X************** X*** 1825,1833 X char l_id[IDLEN + 4]; X int i; X `032 X! *msg_status = M430; X! for (i = 0; i < (IDLEN + 4); ++i) l_id[i] = '\0'; X! strncpy(l_id,id,IDLEN); X `032 X grprab.rab$l_kbf = &(newsitm.itm_grp); X grprab.rab$b_ksz = 4; X--- 1839,1848 ----- X char l_id[IDLEN + 4]; X int i; X `032 X! ihave_size = 0; X! *msg_status = M430; X! for (i = 0; i < (IDLEN + 4); ++i) l_id[i] = '\0'; X! strncpy(l_id,id,IDLEN); X `032 X grprab.rab$l_kbf = &(newsitm.itm_grp); X grprab.rab$b_ksz = 4; X************** X*** 1829,1839 X for (i = 0; i < (IDLEN + 4); ++i) l_id[i] = '\0'; X strncpy(l_id,id,IDLEN); X `032 X! grprab.rab$l_kbf = &(newsitm.itm_grp); X! grprab.rab$b_ksz = 4; X! grprab.rab$b_krf = 1; X! grprab.rab$l_rop = RAB$M_RRL `124 RAB$M_NLK; X! grprab.rab$b_rac = RAB$C_KEY; X `032 X itmrab.rab$l_kbf = l_id; X itmrab.rab$b_ksz = IDLEN + 4; X--- 1844,1854 ----- X for (i = 0; i < (IDLEN + 4); ++i) l_id[i] = '\0'; X strncpy(l_id,id,IDLEN); X `032 X! grprab.rab$l_kbf = &(newsitm.itm_grp); X! grprab.rab$b_ksz = 4; X! grprab.rab$b_krf = 1; X! grprab.rab$l_rop = RAB$M_RRL `124 RAB$M_NLK; X! grprab.rab$b_rac = RAB$C_KEY; X `032 X itmrab.rab$l_kbf = l_id; X itmrab.rab$b_ksz = IDLEN + 4; X************** X*** 1835,1855 X grprab.rab$l_rop = RAB$M_RRL `124 RAB$M_NLK; X grprab.rab$b_rac = RAB$C_KEY; X `032 X! itmrab.rab$l_kbf = l_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! if (!(sys$get(&itmrab) & 1) `124`124 strcmp(l_id,newsitm.itm_id) X! `124`124 !(sys$get(&grprab) & 1)) X! return(0); X! itmrab.rab$b_rac = RAB$C_SEQ; X! while (!check_ngperm(newsgrp.grp_name,stm)) X! if (!(sys$get(&itmrab) & 1) `124`124 strcmp(l_id,newsitm.itm_id) X! `124`124 !(sys$get(&grprab) & 1)) X! return((*msg_status = M502),0); V! sprintf(itm_fname,Itm_template,util_dir(newsgrp.grp_name),newsitm.itm_n Xum); X! return(fopen(itm_fname,"r")); X `125 X `012 X /* X--- 1850,1872 ----- X grprab.rab$l_rop = RAB$M_RRL `124 RAB$M_NLK; X grprab.rab$b_rac = RAB$C_KEY; X `032 X! itmrab.rab$l_kbf = l_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! if ( !(sys$get(&itmrab) & 1) X! `124`124 strcmp(l_id,newsitm.itm_id) X! `124`124 !(sys$get(&grprab) & 1)) X! return(0); X! itmrab.rab$b_rac = RAB$C_SEQ; X! while (!check_ngperm(newsgrp.grp_name,stm)) X! if ( !(sys$get(&itmrab) & 1) X! `124`124 strcmp(l_id,newsitm.itm_id) X! `124`124 !(sys$get(&grprab) & 1)) X! return((*msg_status = M502),0); V! sprintf(itm_fname,Itm_template,util_dir(newsgrp.grp_name),newsitm.itm_num X); X! return(fopen(itm_fname,"r")); X `125 X `012 X /* X************** X*** 2162,2168 X read_net(ibuf,512,stm); X while (strcmp(ibuf,".\n")) `123 X if (!fpl) fpl = open_file(stm); X! if ((!strcmp(ibuf,"..\n")) && (fpl)) fputs(ibuf + 1,fpl); X else if (fpl) fputs(ibuf,fpl); X read_net(ibuf,512,stm); X `125 X--- 2179,2188 ----- X read_net(ibuf,512,stm); X while (strcmp(ibuf,".\n")) `123 X if (!fpl) fpl = open_file(stm); X! if ((!strcmp(ibuf,"..\n")) && (fpl)) `123 X! --ihave_size; X! fputs(ibuf + 1,fpl); X! `125 X else if (fpl) fputs(ibuf,fpl); X ihave_size += strlen(ibuf); X read_net(ibuf,512,stm); X************** X*** 2164,2169 X if (!fpl) fpl = open_file(stm); X if ((!strcmp(ibuf,"..\n")) && (fpl)) fputs(ibuf + 1,fpl); X else if (fpl) fputs(ibuf,fpl); X read_net(ibuf,512,stm); X `125 X if (fpl) `123 X--- 2184,2190 ----- X fputs(ibuf + 1,fpl); X `125 X else if (fpl) fputs(ibuf,fpl); X+ ihave_size += strlen(ibuf); X read_net(ibuf,512,stm); X `125 X if (fpl) `123 $ GOSUB UNPACK_FILE $ FILE_IS = "NNTP_TCPCMU.DIFF" $ CHECKSUM_IS = 1950253089 $ COPY SYS$INPUT VMS_SHARE_DUMMY.DUMMY X*** [.news_v59_src]nntp_tcpcmu.c X--- [.news_src]nntp_tcpcmu.c X************** X*** 64,70 X #include <stdio.h> X #endif X `032 X! #define DEBUG 1 X #define TIMEOUT 600 /* read wait timeout - 10 minutes */ X #define X_BUF_SIZE 1024 /* size of line assembly read buffer */ X `032 X--- 64,70 ----- X #include <stdio.h> X #endif X `032 X! #define DEBUG 0 X #define TIMEOUT 600 /* read wait timeout - 10 minutes */ X #define X_BUF_SIZE 1024 /* size of line assembly read buffer */ X `032 X************** X*** 71,77 X /* check status bits */ X #define cks(s) if (!((c$status = (s)) & 1)) lib$signal(c$status) X `032 V! #define nntp_getchar() (!nntp_size ? nntp_fillbuf() : (--nntp_size, *nntp_p Xtr++)) X `032 X static unsigned short f; /* tcp i/o channel */ X `032 X--- 71,77 ----- X /* check status bits */ X #define cks(s) if (!((c$status = (s)) & 1)) lib$signal(c$status) X `032 V! #define nntp_getchar() (!nntp_input_size ? nntp_fillbuf() : (--nntp_input_s Xize, *nntp_input_ptr++)) X `032 X static unsigned short f; /* tcp i/o channel */ X `032 X************** X*** 79,87 X `032 X static unsigned short iosb[4]; /* i/o status blocks */ X static unsigned short *i_o_sts = iosb; X! static char nntp_buffer[X_BUF_SIZE]; X! static char *nntp_ptr = nntp_buffer; X! static int nntp_size = 0; X `032 X int (*next_function)(); X `032 X--- 79,87 ----- X `032 X static unsigned short iosb[4]; /* i/o status blocks */ X static unsigned short *i_o_sts = iosb; X! static char nntp_input_buffer[X_BUF_SIZE]; X! static char *nntp_input_ptr = nntp_input_buffer; X! static int nntp_input_size = 0; X `032 X #define POK_OUTPUT_BUFFER X #ifdef POK_OUTPUT_BUFFER X************** X*** 83,89 X static char *nntp_ptr = nntp_buffer; X static int nntp_size = 0; X `032 X! int (*next_function)(); X `032 X #if DEBUG X FILE *flog; X--- 83,94 ----- X static char *nntp_input_ptr = nntp_input_buffer; X static int nntp_input_size = 0; X `032 X! #define POK_OUTPUT_BUFFER X! #ifdef POK_OUTPUT_BUFFER X! static char nntp_output_buffer[X_BUF_SIZE];`009/* NNTP output buffer */ X! static char *nntp_output_ptr = nntp_output_buffer; X! static int nntp_output_size = X_BUF_SIZE; X! #endif X `032 X int (*next_function)(); X `032 X************** X*** 85,90 X `032 X int (*next_function)(); X `032 X #if DEBUG X FILE *flog; X #define LOGFILE "NEWS_MANAGER:NNTP.LOG" X--- 90,97 ----- X static int nntp_output_size = X_BUF_SIZE; X #endif X `032 X+ int (*next_function)(); X+`032 X #if DEBUG X FILE *flog; X #define LOGFILE "NEWS_MANAGER:NNTP.LOG" X************** X*** 119,125 X fprintf(flog,"server unit inited\n"); X fclose(flog); X #endif X! while (next_function) (*next_function)(1); X server_shut(); X close_net(); X #if DEBUG X--- 126,138 ----- X fprintf(flog,"server unit inited\n"); X fclose(flog); X #endif X! while (next_function) `123 X!`032 X! #ifdef POK_OUTPUT_BUFFER X! write_out(); X! #endif X! (*next_function)(1); X! `125 X server_shut(); X close_net(); X #if DEBUG X************** X*** 143,148 X sys$cancel(f); X log_to_file(1); X write_net("400 service discontinued - read timeout\r\n"); X cks(sys$qiow(0,f,IO$_DELETE,iosb,0,0,0,0,0,0,0,0)); X cks(*i_o_sts); X sys$dassgn(f); X--- 156,166 ----- X sys$cancel(f); X log_to_file(1); X write_net("400 service discontinued - read timeout\r\n"); X+`032 X+ #ifdef POK_OUTPUT_BUFFER X+ write_out(); X+ #endif X+`032 X cks(sys$qiow(0,f,IO$_DELETE,iosb,0,0,0,0,0,0,0,0)); X cks(*i_o_sts); X sys$dassgn(f); X************** X*** 153,159 X `123 X signal(SIGALRM,cancel_net); X alarm(TIMEOUT); V! cks(sys$qiow(0,f,IO$_READVBLK,iosb,0,0,nntp_buffer, sizeof(nntp_buffer) X,0,0,0,0)); X alarm(0); X if (!iosb[1]) return(cancel_net(),-1); X nntp_ptr = nntp_buffer; X--- 171,178 ----- X `123 X signal(SIGALRM,cancel_net); X alarm(TIMEOUT); X! cks(sys$qiow(0,f,IO$_READVBLK,iosb,0,0,nntp_input_buffer, X! sizeof(nntp_input_buffer),0,0,0,0)); X alarm(0); X if (!iosb[1]) return(cancel_net(),-1); X nntp_input_ptr = nntp_input_buffer; X************** X*** 156,164 V cks(sys$qiow(0,f,IO$_READVBLK,iosb,0,0,nntp_buffer, sizeof(nntp_buffer) X,0,0,0,0)); X alarm(0); X if (!iosb[1]) return(cancel_net(),-1); X! nntp_ptr = nntp_buffer; X! nntp_size = iosb[1]-1; X! return(*nntp_ptr++); X `125 X `032 X /* X--- 175,183 ----- X sizeof(nntp_input_buffer),0,0,0,0)); X alarm(0); X if (!iosb[1]) return(cancel_net(),-1); X! nntp_input_ptr = nntp_input_buffer; X! nntp_input_size = iosb[1]-1; X! return(*nntp_input_ptr++); X `125 X `032 X /* X************** X*** 198,203 X * write to the client process - catch i/o errors and abort X */ X `032 X write_net(s,unit) X char *s; X int unit; X--- 217,225 ----- X * write to the client process - catch i/o errors and abort X */ X `032 X+ #ifdef POK_OUTPUT_BUFFER X+ /* this asumes that nobody ever writes more than X_BUF_SIZE bytes */ X+`032 X write_net(s,unit) X char *s; X int unit; X************** X*** 199,206 X */ X `032 X write_net(s,unit) X! char *s; X! int unit; X `123 X #if DEBUG X fprintf(stderr,"Write_net:%s\n",s); X--- 221,228 ----- X /* this asumes that nobody ever writes more than X_BUF_SIZE bytes */ X `032 X write_net(s,unit) X! char *s; X! int unit; X `123 X register int size = strlen(s); X `032 X************** X*** 202,207 X char *s; X int unit; X `123 X #if DEBUG X fprintf(stderr,"Write_net:%s\n",s); X #endif X--- 224,231 ----- X char *s; X int unit; X `123 X+ register int size = strlen(s); X+`032 X #if DEBUG X fprintf(stderr,"Write_net:%s\n",s); X #endif X************** X*** 203,209 X int unit; X `123 X #if DEBUG X! fprintf(stderr,"Write_net:%s\n",s); X #endif X cks(sys$qiow(0,f,IO$_WRITEVBLK,iosb,0,0,s,strlen(s),0,1,0,0)); X cks(*i_o_sts); X--- 227,233 ----- X register int size = strlen(s); X `032 X #if DEBUG X! fprintf(stderr,"Write_net:%s\n",s); X #endif X `032 V if (nntp_output_size < size) write_out(); /* no space in buffer - flush * X/ X************** X*** 205,213 X #if DEBUG X fprintf(stderr,"Write_net:%s\n",s); X #endif X- cks(sys$qiow(0,f,IO$_WRITEVBLK,iosb,0,0,s,strlen(s),0,1,0,0)); X- cks(*i_o_sts); X- `125 X `032 X next_call(unit,func,type) X int unit; X--- 229,234 ----- X #if DEBUG X fprintf(stderr,"Write_net:%s\n",s); X #endif X `032 V if (nntp_output_size < size) write_out(); /* no space in buffer - flush * X/ X strncpy(nntp_output_ptr,s,size); X************** X*** 209,214 X cks(*i_o_sts); X `125 X `032 X next_call(unit,func,type) X int unit; X int (*func)(); X--- 230,266 ----- X fprintf(stderr,"Write_net:%s\n",s); X #endif X `032 V+ if (nntp_output_size < size) write_out(); /* no space in buffer - flush * X/ X+ strncpy(nntp_output_ptr,s,size); X+ nntp_output_ptr += size; X+ nntp_output_size -= size; X+ `125 X+`032 X+ write_out() X+ `123 V+ if (nntp_output_ptr != nntp_output_buffer) `123 /* something in the buff Xer */ X+ cks(sys$qiow(0,f,IO$_WRITEVBLK,iosb,0,0,nntp_output_buffer, X+ nntp_output_ptr - nntp_output_buffer,0,1,0,0)); X+ cks(*i_o_sts); X+ nntp_output_ptr = nntp_output_buffer; X+ nntp_output_size = X_BUF_SIZE; X+ `125 X+ `125 X+ #else X+`032 X+ write_net(s,unit) X+ char *s; X+ int unit; X+ `123 X+ #if DEBUG X+ fprintf(stderr,"Write_net:%s\n",s); X+ #endif X+`032 X+ cks(sys$qiow(0,f,IO$_WRITEVBLK,iosb,0,0,s,strlen(s),0,1,0,0)); X+ cks(*i_o_sts); X+ `125 X+ #endif X+`032 X next_call(unit,func,type) X int unit; X int (*func)(); X************** X*** 245,251 X close_net() X `123 X #if DEBUG X! fprintf(stderr,"Close_net\n"); X #endif X sys$cancel(f); X log_to_file(1); X--- 297,303 ----- X close_net() X `123 X #if DEBUG X! fprintf(stderr,"Close_net\n"); X #endif X `032 X #ifdef POK_OUTPUT_BUFFER`032 X************** X*** 247,257 X #if DEBUG X fprintf(stderr,"Close_net\n"); X #endif X! sys$cancel(f); X! log_to_file(1); X! cks(sys$qiow(0,f,IO$_DELETE,iosb,0,0,0,0,0,0,0,0)); X! cks(*i_o_sts); X! sys$dassgn(f); X `125 X `012 X /* X--- 299,314 ----- X #if DEBUG -+-+-+-+-+ End of part 10 +-+-+-+-+-