This is nntp.c in view mode; [Download] [Up]
/* $Id$ */ #ifdef NNTPNEWS #include "bbs.h" int nntp_postarticle(const char *hdrstr, const char *bodyfile, newsstattyp *newsstat, const confrecordtyp *confrecord) { int fd, n, k, p; SIZE_T len; SSIZE_T bytes; char c1, c2, inbuf[BUFSIZE], outbuf[BUFSIZE]; const char *sp; len = strlen(hdrstr); if (len < 4) return -1; if ((fd=open(bodyfile,O_RDONLY)) < 0) { bgerror("nntp_postarticle","open %s: %m",bodyfile); return -1; } n = nntp_ask(NULL,newsstat,"POST"); if (n == CONT_POST) { p = 0; for (sp=hdrstr; *sp; sp++) { if (*sp == '\n') { outbuf[p++] = '\r'; } outbuf[p++] = *sp; if (p > BUFSIZE-8) { writen(newsstat->sock,outbuf,p); p= 0; } } if (hdrstr[len-1] != '\n' || hdrstr[len-2] != '\n') { outbuf[p++] = '\r'; outbuf[p++] = '\n'; outbuf[p++] = '\r'; outbuf[p++] = '\n'; } c1 = ' '; while ((bytes=read(fd,inbuf,BUFSIZE)) > 0) { for (k=0; k < bytes; k++) { c2 = inbuf[k]; if (c2 == '\n') { outbuf[p++] = '\r'; } else if (c2 == '.' && c1 == '\n') { outbuf[p++] = '.'; } outbuf[p++] = c2; c1 = c2; if (p > BUFSIZE-8) { writen(newsstat->sock,outbuf,p); p= 0; } } } if (c1 != '\n') { outbuf[p++] = '\r'; outbuf[p++] = '\n'; } outbuf[p++] = '.'; outbuf[p++] = '\r'; outbuf[p++] = '\n'; writen(newsstat->sock,outbuf,p); n = nntp_getresponse(inbuf,BUFSIZE,newsstat); if (n != OK_POSTED) { bgerror("nntp_postarticle","posting failed"); } return n; } else if (n == ERR_NOPOST) { bgerror("nntp_postarticle","Posting not allowed"); } else { bgerror("nntp_postarticle","POST failed"); } return n; } int nntp_getarticle(char **header, char *file, const boolean bodyonly, const int articlenumber, newsstattyp *newsstat, const confrecordtyp *confrecord) { int n, fd; SIZE_T hlen, len; char *buf, c; n = nntp_ask(NULL,newsstat,"STAT %d",articlenumber); if (n == OK_NOTEXT) { n = nntp_ask(NULL,newsstat,"HEAD"); if (n ==OK_HEAD) { *header = nntp_copytext(&hlen,newsstat); } else { bgerror("nntp_getarticle","HEAD failed"); return -1; } n = nntp_ask(NULL,newsstat,"BODY"); if (n == OK_BODY) { buf = nntp_copytext(&len,newsstat); scratchfilename(file,"news",NULL,confrecord->scratchdir); if ((fd=open(file,O_CREAT|O_RDWR|O_TRUNC,0600)) < 0) { bgerror("nntp_getarticle","open %s: %m",file); free(*header); return -1; } if (! bodyonly) { write(fd,*header,hlen); c = '\n'; write(fd,&c,1); } write(fd,buf,len); close(fd); free(buf); return 0; } else { bgerror("nntp_getarticle","HEAD failed"); free(*header); return -1; } } else { bgerror("nntp_getarticle","STAT %d: failed",articlenumber); return -1; } return 0; } int nntp_getoverview(grouptyp *groupstat, const boolean unread_only, newsstattyp *newsstat, const confrecordtyp *confrecord) { int n, first_art; SIZE_T len, anz; char *splits[9], *buf, *sp1, *sp2, answer[NNTP_STRLEN+1], sstr[81]; if (! newsstat->group_is_set) { n = nntp_ask(answer,newsstat,"GROUP %s",groupstat->groupname); if (n == OK_GROUP) { newsstat->group_is_set = TRUE; splitstring(splits,answer,' ',4); groupstat->anz_article = atoi(splits[1]); groupstat->first_article = atoi(splits[2]); groupstat->last_article = atoi(splits[3]); } else if (n == ERR_NOGROUP) { bgerror("nntp_getoverview","GROUP %s: not existent", groupstat->groupname); return -1; } else { bgerror("nntp_getoverview","GROUP %s: failed",groupstat->groupname); return -1; } } if (unread_only) { if (lookupnewsrcdb(newsstat->newsrcdb,groupstat->groupname,0,sstr,&len, confrecord) == 0) { if ((sp1=strchr(sstr,'-')) != NULL) { sp1++; } else { sp1 = sstr; } if (*sp1 != '\0') { first_art = atoi(sp1) + 1; } else { first_art = 0; } } else { first_art = 0; } } if (first_art < groupstat->first_article || ! unread_only) { first_art = groupstat->first_article; } if (first_art > groupstat->last_article || first_art == 0) { return ERR_NONEXT; } n = nntp_ask(NULL,newsstat,"XOVER %d-%d",first_art,groupstat->last_article); if (n == OK_NOV) { buf = nntp_copytext(&len,newsstat); if (len == 0) return ERR_NONEXT; groupstat->ov_liste = (tlistetyp *)0; anz = 0; sp1 = buf; while (*sp1) { n = 0; for (sp2=sp1; *sp2 && *sp2 != '\n'; sp2++) { if (*sp2 == '\t') n++; } if (*sp2) *sp2++ = '\0'; if (n >= 7) { addstrtoliste(&groupstat->ov_liste,TRUE,anz++,TL_BLOCKLEN,sp1, confrecord); } else { bgerror("nntp_getoverview","group %s: wrong overview line: %s", groupstat->groupname,sp1); } sp1 = sp2; } groupstat->ov_anz = anz; free(buf); return OK_NOV; } else { bgerror("nntp_getoverview","XOVER %s: failed",groupstat->groupname); return -1; } return 0; } #endif
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.