MAIN() { char *s = "1234567890\n"; Sfoff_t n, i; Sfio_t *f; char buf[1024]; char* addr; if(sfopen(sfstdout,tstfile(0),"w+") != sfstdout) terror("Opening output file\n"); for(i = 0; i < 10000; ++i) if(sfputr(sfstdout,s,-1) < 0) terror("Writing data\n"); if(!(f = sfopen((Sfio_t*)0,tstfile(1),"w"))) terror("Opening output file \n"); sfseek(sfstdout,(Sfoff_t)0,0); if((n = sfmove(sfstdout,f,(Sfoff_t)SF_UNBOUND,'\n')) != i) terror("Move %d lines, Expect %d\n",n,i); sfseek(sfstdout,(Sfoff_t)0,0); sfseek(f,(Sfoff_t)0,0); sfsetbuf(sfstdout,buf,sizeof(buf)); if((n = sfmove(sfstdout,f,(Sfoff_t)SF_UNBOUND,'\n')) != i) terror("Move %d lines, Expect %d\n",n,i); sfopen(sfstdin,tstfile(0),"r"); sfopen(sfstdout,tstfile(1),"w"); sfmove(sfstdin,sfstdout,(Sfoff_t)SF_UNBOUND,-1); if(!sfeof(sfstdin)) terror("Sfstdin is not eof\n"); if(sferror(sfstdin)) terror("Sfstdin is in error\n"); if(sferror(sfstdout)) terror("Sfstdout is in error\n"); sfseek(sfstdin,(Sfoff_t)0,0); sfseek(sfstdout,(Sfoff_t)0,0); sfsetbuf(sfstdin,buf,sizeof(buf)); addr = (char*)sbrk(0); sfmove(sfstdin,sfstdout,(Sfoff_t)((unsigned long)(~0L)>>1),-1); if((ssize_t)((char*)sbrk(0)-addr) > 256*1024) terror("Too much space allocated in sfmove\n"); if(!sfeof(sfstdin)) terror("Sfstdin is not eof2\n"); if(sferror(sfstdin)) terror("Sfstdin is in error2\n"); if(sferror(sfstdout)) terror("Sfstdout is in error2\n"); TSTEXIT(0); }
// Output `here` documents. static_fn void here_body(const struct ionod *iop) { Sfio_t *infile; #if 0 // TODO: Figure out if this should be enabled. Originally excluded via `#ifdef xxx`. if (iop->iolink) here_body((struct inode *)iop->iolink); iop->iolink = 0; #endif if (iop->iofile & IOSTRG) { infile = sfnew(NULL, iop->ioname, iop->iosize, -1, SF_STRING | SF_READ); } else { sfseek(infile = sh.heredocs, iop->iooffset, SEEK_SET); } sfmove(infile, outfile, iop->iosize, -1); if (iop->iofile & IOSTRG) sfclose(infile); sfputr(outfile, iop->iodelim, '\n'); }
/* * output here documents */ static void here_body(register const struct ionod *iop) { Sfio_t *infile; #ifdef xxx if(iop->iolink) here_body((struct inode*)iop->iolink); iop->iolink = 0; #endif if(iop->iofile&IOSTRG) infile = sfnew((Sfio_t*)0,iop->ioname,iop->iosize,-1,SF_STRING|SF_READ); else sfseek(infile=sh.heredocs,iop->iooffset,SEEK_SET); sfmove(infile,outfile,iop->iosize,-1); if(iop->iofile&IOSTRG) sfclose(infile); sfputr(outfile,iop->iodelim,'\n'); }
tmain() { Sfio_t *f; if (argc > 1) { if (sfopen(sfstdin, argv[1], "r") != sfstdin) terror("Can't reopen stdin"); sfmove(sfstdin, sfstdout, (Sfoff_t)(-1), -1); return 0; } if (!(f = sfopen(NULL, tstfile("sf", 0), "w"))) terror("Opening to write"); if (sfputc(f, 'a') != 'a') terror("sfputc"); if (sfgetc(f) >= 0) terror("sfgetc"); if (!(f = sfopen(f, tstfile("sf", 0), "r"))) terror("Opening to read"); if (sfgetc(f) != 'a') terror("sfgetc2"); if (sfputc(f, 'b') >= 0) terror("sfputc2"); if (!(f = sfopen(f, tstfile("sf", 0), "r+"))) terror("Opening to read/write"); if (sfgetc(f) != 'a') terror("sfgetc3"); if (sfputc(f, 'b') != 'b') terror("sfputc3"); if (sfclose(f) < 0) terror("sfclose"); if (!(f = sfpopen(NULL, sfprints("%s %s", argv[0], tstfile("sf", 0)), "r"))) terror("sfpopen"); if (sfgetc(f) != 'a') terror("sfgetc4"); if (sfgetc(f) != 'b') terror("sfgetc5"); if (sfgetc(f) >= 0) terror("sfgetc6"); if (!(f = sfopen(f, tstfile("sf", 0), "w"))) terror("sfopen"); if (sfputc(f, 'a') != 'a') terror("sfputc1"); sfsetfd(f, -1); if (sfputc(f, 'b') >= 0) terror("sfputc2"); if (sfclose(f) < 0) terror("sfclose"); if (!(f = sfopen(NULL, tstfile("sf", 0), "a+"))) terror("sfopen2"); sfset(f, SF_READ, 0); if (!sfreserve(f, 0, -1)) terror("Failed on buffer getting"); if (sfvalue(f) <= 0) terror("There is no buffer?"); texit(0); }
static struct ionod *r_redirect(Shell_t* shp) { register long l; register struct ionod *iop=0, *iopold, *ioptop=0; while((l=sfgetl(infile))>=0) { iop = (struct ionod*)getnode(shp->stk,ionod); if(!ioptop) ioptop = iop; else iopold->ionxt = iop; iop->iofile = l; iop->ioname = r_string(shp->stk); if(iop->iodelim = r_string(shp->stk)) { iop->iosize = sfgetl(infile); if(shp->heredocs) iop->iooffset = sfseek(shp->heredocs,(off_t)0,SEEK_END); else { shp->heredocs = sftmp(512); iop->iooffset = 0; } sfmove(infile,shp->heredocs, iop->iosize, -1); } iopold = iop; if(iop->iofile&IOVNM) iop->iovname = r_string(shp->stk); else iop->iovname = 0; iop->iofile &= ~IOVNM; } if(iop) iop->ionxt = 0; return(ioptop); }
int main (int argc, char **argv) { int norun; char *rulesfile, *statefile; int newflag, checkflag; Sfio_t *ifp, *ofp; int osm; DDSschema_t *schemap; DDSheader_t hdr; int ret; VG_alarm_t adata; ruleev_t *ruleevp; cc_t *ccp; nd_t *ndp; ev_t *evp; sl_inv_nd2cc_t *nd2ccp; char *currdate, *s; int maxalarmkeepmin; schemap = NULL; osm = DDS_HDR_NAME | DDS_HDR_DESC; rulesfile = NULL; statefile = NULL; currdate = NULL; newflag = FALSE; checkflag = FALSE; norun = 0; for (;;) { switch (optget (argv, usage)) { case -100: rulesfile = opt_info.arg; continue; case -101: statefile = opt_info.arg; continue; case -102: currdate = opt_info.arg; continue; case -200: newflag = TRUE; continue; case -201: checkflag = TRUE; continue; case -999: SUwarnlevel++; continue; case '?': SUusage (0, "vggce", opt_info.arg); norun = 1; continue; case ':': SUusage (1, "vggce", opt_info.arg); norun = 2; continue; } break; } if (norun) return norun - 1; argc -= opt_info.index, argv += opt_info.index; ifp = ofp = NULL; if (!rulesfile || !statefile || !currdate || strlen (currdate) != 10) { SUwarning (0, "vggce", "missing arguments"); goto failsafe1; } DDSinit (); if (!(ifp = SUsetupinput (sfstdin, 1048576))) { SUwarning (0, "vggce", "setupinput failed"); goto failsafe1; } if (!(ofp = SUsetupoutput (NULL, sfstdout, 1048576))) { SUwarning (0, "vggce", "setupoutput failed"); goto failsafe1; } if ((ret = DDSreadheader (ifp, &hdr)) == -1) { SUwarning (0, "vggce", "DDSreadheader failed"); goto failsafe1; } if (ret == -2) goto done; if (ret == 0) { if (hdr.schemap) schemap = hdr.schemap; } if (!schemap) { SUwarning (0, "vggce", "DDSloadschema failed"); goto failsafe1; } if (!hdr.schemap && schemap) hdr.schemap = schemap; hdr.contents = osm; hdr.vczspec = ""; if (osm && DDSwriteheader (ofp, &hdr) == -1) { SUwarning (0, "vggce", "DDSwriteheader failed"); goto failsafe1; } s = getenv ("DEFAULTTMODE"); if (!(ftmode = vmstrdup (Vmheap, s ? s : VG_ALARM_S_MODE_KEEP))) { SUwarning (0, "vggce", "cannot copy tmode"); goto failsafe1; } if ((rtmode = strchr (ftmode, ':'))) *rtmode++ = 0; else rtmode = ftmode; currtime = 0; maxalarmkeepmin = atoi (getenv ("MAXALARMKEEPMIN")); sl_inv_nd2ccopen (getenv ("INVND2CCFILE")); if (sevmapload (getenv ("SEVMAPFILE")) == -1) { SUwarning (0, "vggce", "cannot load sevmap file"); goto failsafe1; } if (initgraph () == -1) { SUwarning (0, "vggce", "initgraph failed"); goto failsafe1; } if (initcorr () == -1) { SUwarning (0, "vggce", "initcorr failed"); goto failsafe1; } if (loadrules (rulesfile) == -1) { SUwarning (0, "vggce", "loadrules failed"); goto failsafe1; } if (checkflag) goto done; if (!newflag && loadevstate (statefile) == -1) { SUwarning (0, "vggce", "loadstate failed"); goto failsafe1; } ccmark++; evmark++; while (( ret = DDSreadrecord (ifp, &adata, schemap) ) == sizeof (VG_alarm_t)) { VG_warning (0, "GCE INFO", "read alarm %s", adata.s_text); if ( !DATEMATCH (currdate, adata.s_dateissued) || adata.s_sortorder != VG_ALARM_N_SO_NORMAL || adata.s_pmode != VG_ALARM_N_PMODE_PROCESS ) goto write; if (currtime < adata.s_timeissued) currtime = adata.s_timeissued; if (!(ruleevp = matchruleev (&adata))) goto write; if (!(nd2ccp = sl_inv_nd2ccfind (adata.s_level1, adata.s_id1))) goto write; if (!(ccp = insertcc (nd2ccp->sl_cclevel, nd2ccp->sl_ccid, TRUE))) { SUwarning (0, "vggce", "cannot insert cc %s", nd2ccp->sl_ccid); goto failsafe1; } if (ccp->svcpm < 1) goto write; if (!(ndp = findnd (adata.s_level1, adata.s_id1))) { SUwarning (0, "vggce", "cannot find nd %s", adata.s_id1); goto failsafe1; } if (!(evp = insertev ( adata.s_timeissued, adata.s_type, ccp, ndp, ruleevp ))) { SUwarning (0, "vggce", "cannot insert ev"); goto failsafe1; } if (evp->svcpm < 1) goto write; if (insertndevent (ndp, evp) == -1) { SUwarning (0, "vggce", "cannot insert ev in nd"); goto failsafe1; } write: if (DDSwriterecord (ofp, &adata, schemap) != sizeof (VG_alarm_t)) { SUwarning (0, "vggce", "cannot write alarm"); goto failsafe1; } VG_warning (0, "GCE INFO", "wrote alarm"); } ndmark++; if (pruneevs (currtime - 60 * maxalarmkeepmin, 1) == -1) { SUwarning (0, "vggce", "cannot prune evs (1)"); goto failsafe1; } calcsvcvalues (SVC_MODE_NOEV, -1, -1); calcsvcvalues (SVC_MODE_OLDEV, 0, 0); calcsvcvalues (SVC_MODE_NEWEV, 0, 1); if (updatealarms (SVC_MODE_OLDEV, SVC_MODE_NEWEV, 1) == -1) { SUwarning (0, "vggce", "cannot update alarms (1)"); goto failsafe1; } evmark++; // ccmark++; if (pruneevs (currtime - 60 * maxalarmkeepmin, 2) == -1) { SUwarning (0, "vggce", "cannot prune evs"); goto failsafe1; } calcsvcvalues (SVC_MODE_PRUNE, 2, 2); if (updatealarms (SVC_MODE_NEWEV, SVC_MODE_PRUNE, 2) == -1) { SUwarning (0, "vggce", "cannot update alarms (2)"); goto failsafe1; } if (saveevstate (statefile) == -1) { SUwarning (0, "vggce", "savestate failed"); goto failsafe1; } VG_warning (0, "GCE INFO", "events=%d", evpm); if (ret != 0) SUerror ("vggce", "failed to read full record"); done: DDSterm (); return 0; failsafe1: SUwarning (0, "vggce", "IN FAILSAFE MODE"); if (sfmove (ifp, ofp, -1, -1) == -1) SUwarning (0, "vggce", "cannot copy data"); return 101; }
tmain() { Sfio_t* f; if(!(f = sfopen(NIL(Sfio_t*),"ab","sr")) ) terror("Can't open stream"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet"); if(sfgetc(f) != 'a') terror("Got wrong data"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet2"); if(sfgetc(f) != 'b') terror("Got wrong data2"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet3"); if(sfgetc(f) >= 0) terror("Got wrong data2"); if(!sfeof(f)) terror("Should be eof now"); if(sfseek(f,(Sfoff_t)(-1),2) != 1) terror("Seek error"); if(sfeof(f)) terror("Shouldn't be eof any more"); if(!(f = sfopen(NIL(Sfio_t*), tstfile("sf", 0), "w+")) ) terror("Can't open stream2"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet2"); if(sfwrite(f,"ab",2) != 2) terror("Can't write data"); if(sfseek(f,(Sfoff_t)0,0) != 0) terror("Can't seek back"); if(sfgetc(f) != 'a') terror("Got wrong data3"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet4"); if(sfgetc(f) != 'b') terror("Got wrong data4"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet5"); if(sfgetc(f) >= 0) terror("Got wrong data5"); if(!sfeof(f)) terror("Should be eof now2"); if(sfseek(f,(Sfoff_t)(-1),2) != 1) terror("Seek error2"); if(sfeof(f)) terror("Shouldn't be eof any more2"); if(!(f = sfopen(NIL(Sfio_t*), tstfile("sf", 0),"w+")) ) terror("Reopening %s", tstfile("sf", 0)); sfwrite(f,"1234567890",10); sfseek(f,(Sfoff_t)0,0); if(sfopen(sfstdout, tstfile("sf", 1), "w") != sfstdout) terror("Opening %s", tstfile("sf", 1)); if(sfmove(f,sfstdout,(Sfoff_t)(-1),-1) != 10) terror("sfmove failed"); if(!sfeof(f)) terror("f should be eof"); if(sferror(sfstdout)) terror("sfstdout should not be in error"); texit(0); }
/* * copy the lines starting at offset <start> from in <in> to <out> * in reverse order */ int rev_line(Sfio_t *in, Sfio_t *out, off_t start) { register char *cp, *cpold; register int n, nleft=0; char buff[BUFSIZE]; off_t offset; if(sfseek(in,(off_t)0,SEEK_CUR) < 0) { Sfio_t *tmp = sftmp(4*SF_BUFSIZE); if(!tmp) return(-1); if(start>0 && sfmove(in, (Sfio_t*)0, start, -1) != start) return(-1); if(sfmove(in, tmp, SF_UNBOUND, -1) < 0 || !sfeof(in) || sferror(tmp)) return(-1); in = tmp; start=0; } if((offset = sfseek(in,(off_t)0,SEEK_END)) <= start) return(0); offset = rounddown(offset,BUFSIZE); while(1) { n = BUFSIZE; if(offset < start) { n -= (start-offset); offset = start; } sfseek(in, offset, SEEK_SET); if((n=sfread(in, buff, n)) <=0) break; cp = buff+n; n = *buff; *buff = '\n'; while(1) { cpold = cp; if(nleft==0) cp--; if(cp==buff) { nleft= 1; break; } while(*--cp != '\n'); if(cp==buff && n!='\n') { *cp = n; nleft += cpold-cp; break; } else cp++; if(sfwrite(out,cp,cpold-cp) < 0) return(-1); if(nleft) { if(nleft==1) sfputc(out,'\n'); else if(sfmove(in,out,nleft,-1) != nleft) return(-1); nleft = 0; } } if(offset <= start) break; offset -= BUFSIZE; } if(nleft) { sfseek(in, start, SEEK_SET); if(sfmove(in,out,nleft,-1) != nleft) return(-1); } return(0); }
/* Test multiple processes reading/writing from same file ** descriptor. */ MAIN() { char* s; if(argc > 1) { if(strcmp(argv[1],"-r") == 0) /* doing sfgetr */ { if(!(s = sfgetr(sfstdin,'\n',1)) || strcmp(s,"Line2") != 0) terror("Coprocess getr did not get Line2\n"); if(!(s = sfgetr(sfstdin,'\n',1)) || strcmp(s,"Line3") != 0) terror("Coprocess getr did not get Line3\n"); } else /* doing sfmove */ { Sfio_t* f = sfopen(NIL(Sfio_t*),NIL(char*),"swr"); if(!f) terror("Can't open string stream\n"); if(sfmove(sfstdin,f,(Sfoff_t)2,'\n') != 2) terror("Coprocess sfmove failed\n"); sfseek(f,(Sfoff_t)0,0); if(!(s = sfgetr(f,'\n',1)) || strcmp(s,"Line2") != 0) terror("Coprocess move did not get Line2\n"); if(!(s = sfgetr(f,'\n',1)) || strcmp(s,"Line3") != 0) terror("Coprocess move did not get Line3\n"); } TSTEXIT(0); } if(sfopen(sfstdout, tstfile(0), "w") != sfstdout ) terror("Opening file\n"); if(sfputr(sfstdout,"Line1",'\n') < 0 || sfputr(sfstdout,"Line2",'\n') < 0 || sfputr(sfstdout,"Line3",'\n') < 0 || sfputr(sfstdout,"Line4",'\n') < 0) terror("Writing data\n"); sfopen(sfstdout,"/dev/null","w"); /* testing coprocess calling sfgetr */ if(sfopen(sfstdin, tstfile(0),"r") != sfstdin) terror("Opening to read\n"); if(!(s = sfgetr(sfstdin,'\n',1)) || strcmp(s,"Line1") != 0) terror("Did not get Line1 for sfgetr\n"); sfsync(sfstdin); system(sfprints("%s -r",argv[0])); sfseek(sfstdin, (Sfoff_t)lseek(sffileno(sfstdin), (off_t)0, 1), 0); if(!(s = sfgetr(sfstdin,'\n',1)) || strcmp(s,"Line4") != 0) terror("Did not get Line4 for sfgetr\n"); /* testing coprocess calling sfmove */ if(sfopen(sfstdin, tstfile(0), "r") != sfstdin) terror("Opening to read\n"); if(!(s = sfgetr(sfstdin,'\n',1)) || strcmp(s,"Line1") != 0) terror("Did not get Line1 for sfmove\n"); sfsync(sfstdin); system(sfprints("%s -m",argv[0])); sfseek(sfstdin, (Sfoff_t)lseek(sffileno(sfstdin), (off_t)0, 1), 0); if(!(s = sfgetr(sfstdin,'\n',1)) || strcmp(s,"Line4") != 0) terror("Did not get Line4 for sfmove\n"); /* testing the head program */ #ifdef HEAD if(sfopen(sfstdin, tstfile(0), "r") != sfstdin) terror("Opening to read\n"); if(!(s = sfgetr(sfstdin,'\n',1)) || strcmp(s,"Line1") != 0) terror("Did not get Line1 for head\n"); sfsync(sfstdin); system("head -2 > /dev/null"); /* for testing the head program */ sfseek(sfstdin, (Sfoff_t)lseek(sffileno(sfstdin), (off_t)0, 1), 0); if(!(s = sfgetr(sfstdin,'\n',1)) || strcmp(s,"Line4") != 0) terror("Did not get Line4 for head\n"); #endif TSTEXIT(0); }
MAIN() { Sfio_t *f; if(argc > 1) { if(sfopen(sfstdin,argv[1],"r") != sfstdin) terror("Can't reopen stdin"); sfmove(sfstdin,sfstdout,(Sfoff_t)(-1),-1); return 0; } if(!(f = sfopen((Sfio_t*)0,tstfile(0),"w"))) terror("Opening to write\n"); if(sfputc(f,'a') != 'a') terror("sfputc\n"); if(sfgetc(f) >= 0) terror("sfgetc\n"); if(!(f = sfopen(f,tstfile(0),"r"))) terror("Opening to read\n"); if(sfgetc(f) != 'a') terror("sfgetc2\n"); if(sfputc(f,'b') >= 0) terror("sfputc2\n"); if(!(f = sfopen(f,tstfile(0),"r+"))) terror("Opening to read/write\n"); if(sfgetc(f) != 'a') terror("sfgetc3\n"); if(sfputc(f,'b') != 'b') terror("sfputc3\n"); if(sfclose(f) < 0) terror("sfclose\n"); if(!(f = sfpopen(NIL(Sfio_t*),sfprints("%s %s", argv[0], tstfile(0)),"r"))) terror("sfpopen\n"); if(sfgetc(f) != 'a') terror("sfgetc4\n"); if(sfgetc(f) != 'b') terror("sfgetc5\n"); if(sfgetc(f) >= 0) terror("sfgetc6\n"); if(!(f = sfopen(f,tstfile(0),"w")) ) terror("sfopen\n"); if(sfputc(f,'a') != 'a') terror("sfputc1\n"); sfsetfd(f,-1); if(sfputc(f,'b') >= 0) terror("sfputc2\n"); if(sfclose(f) < 0) terror("sfclose\n"); if(!(f = sfopen(NIL(Sfio_t*),tstfile(0),"a+")) ) terror("sfopen2\n"); sfset(f,SF_READ,0); if(!sfreserve(f,0,-1) ) terror("Failed on buffer getting\n"); if(sfvalue(f) <= 0) terror("There is no buffer?\n"); TSTEXIT(0); }
int pzinflate(register Pz_t* pz, Sfio_t* op) { register Pzpart_t* pp; register int i; register int j; register int k; register size_t n; register size_t m; register unsigned char* pat; ssize_t r; Pzwrite_f writef; if (!(pz->flags & PZ_READ)) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, ERROR_SYSTEM|2, "%s: cannot inflate -- not open for read", pz->path); return -1; } if (pz->flags & PZ_SPLIT) return pzssplit(pz); if (pz->flags & PZ_FORCE) { if (writef = pz->disc->writef) { n = pz->part->row; do { if (!(pat = (unsigned char*)sfreserve(pz->io, n, 0))) { if (sfvalue(pz->io)) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, 2, "%s: data corrupted", pz->path); return -1; } break; } } while ((r = (*writef)(pz, op, pat, pz->disc)) >= 0); if (r < 0) return -1; } else if (sfmove(pz->io, op, SF_UNBOUND, -1) < 0 || sferror(pz->io)) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, 2, "%s: data corrupted", pz->path); return -1; } if (sfsync(op)) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, 2, "%s: output write error", pz->path); return -1; } return 0; } /* * copy the prefix */ if (pz->prefix.count) { if (!pz->prefix.skip && pz->prefix.data && sfwrite(op, pz->prefix.data, pz->prefix.count) != pz->prefix.count) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, 2, "%s: output write error", pz->path); return -1; } pz->prefix.count = 0; } if ((pz->split.flags & (PZ_SPLIT_INFLATE|PZ_SPLIT_PART)) == PZ_SPLIT_INFLATE) i = pzsinflate(pz, op); else { /* * inflate each file */ do { /* * inflate each window */ pp = pz->part; pat = pz->pat; while (m = sfgetu(pz->io)) { /* * hi frequency data in pz->buf */ if (pp->nmap) { if (m > pz->win || (m % pp->nmap) || sfread(pz->io, pz->buf, m) != m) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, ERROR_SYSTEM|2, "%s: data corrupted", pz->path); return -1; } n = m / pp->nmap; m = 0; j = 0; k = 0; for (i = 0; i < pp->nmap; i++) { if (i > 0 && pp->lab[i] == pp->lab[i - 1]) j++; else j = m; if (!pp->value || pp->value[i] < 0) pp->mix[k++] = pz->buf + j; m += n; } } else if (m != 1) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, ERROR_SYSTEM|2, "%s: data corrupted", pz->path); return -1; } /* * lo frequency */ m = sfgetu(pz->io); if (m < pp->row || sfread(pz->io, pat, pp->row) != pp->row) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, ERROR_SYSTEM|2, "%s: data corrupted", pz->path); return -1; } m -= pp->row; if (sfread(pz->io, pz->nxt = pz->val, m) != m) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, ERROR_SYSTEM|2, "%s: data corrupted", pz->path); return -1; } /* * restore lo+hi on op */ if (restore(pz, pp, pz->io, op, pat, pz->wrk, pp->row, k, pp->map, pp->mix, pp->inc)) return -1; } if (!(pz->flags & PZ_SECTION)) { if ((k = sfgetc(pz->io)) == PZ_MARK_PART) { if ((m = sfgetu(pz->io)) && !sferror(pz->io) && !sfeof(pz->io) && (pat = (unsigned char*)sfreserve(pz->io, m, 0))) sfwrite(op, pat, m); } else if (k != EOF) sfungetc(pz->io, k); } if (sferror(op)) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, ERROR_SYSTEM|2, "write error"); return -1; } } while ((i = !(pz->flags & PZ_SECTION)) && (i = pzfile(pz)) > 0); } if (i >= 0 && !(pz->split.flags & PZ_SPLIT_PART) && sfsync(op)) { if (pz->disc->errorf) (*pz->disc->errorf)(pz, pz->disc, ERROR_SYSTEM|2, "write error"); return -1; } return i; }
int b_head(int argc, register char** argv, void* context) { static const char header_fmt[] = "\n==> %s <==\n"; register Sfio_t* fp; register char* cp; register off_t keep = 10; register off_t skip = 0; register int delim = '\n'; int header = 1; char* format = (char*)header_fmt+1; cmdinit(argc, argv, context, ERROR_CATALOG, 0); for (;;) { switch (optget(argv, usage)) { case 'c': delim = -1; /*FALLTHROUGH*/ case 'n': if (opt_info.offset && argv[opt_info.index][opt_info.offset] == 'c') { delim = -1; opt_info.offset++; } if ((keep = opt_info.number) <=0) error(2, "%s: %I*d: positive numeric option argument expected", opt_info.name, sizeof(keep), keep); continue; case 'q': header = argc; continue; case 'v': header = 0; continue; case 's': skip = opt_info.number; continue; case '?': error(ERROR_usage(2), "%s", opt_info.arg); continue; case ':': error(2, "%s", opt_info.arg); continue; } break; } argv += opt_info.index; argc -= opt_info.index; if (error_info.errors) error(ERROR_usage(2), "%s", optusage(NiL)); if (cp = *argv) argv++; do { if (!cp || streq(cp, "-")) { cp = "/dev/stdin"; fp = sfstdin; sfset(fp, SF_SHARE, 1); } else if (!(fp = sfopen(NiL, cp, "r"))) { error(ERROR_system(0), "%s: cannot open", cp); continue; } if (argc > header) sfprintf(sfstdout, format, cp); format = (char*)header_fmt; if (skip > 0) sfmove(fp, NiL, skip, delim); if (sfmove(fp, sfstdout, keep, delim) < 0 && errno != EPIPE) error(ERROR_system(0), "%s: read error", cp); if (fp != sfstdin) sfclose(fp); } while (cp = *argv++); if (sfsync(sfstdout)) error(ERROR_system(0), "write error"); return error_info.errors != 0; }
static void execute(register Joblist_t* job) { register List_t* p; char* s; char* t; int flags; Rule_t* r; Var_t* v; Sfio_t* tmp; Sfio_t* att; Sfio_t* sp; att = sfstropen(); tmp = sfstropen(); restore(job, tmp, att); job->status = RUNNING; job->target->mark &= ~M_waiting; if (state.targetcontext || state.maxview && !state.fsview && *job->target->name != '/' && (!(job->target->dynamic & D_regular) || job->target->view)) commit(job, job->target->name); if ((state.mam.dynamic || state.mam.regress) && state.user && !(job->target->property & (P_after|P_before|P_dontcare|P_make|P_state|P_virtual))) sfprintf(state.mam.out, "%sinit %s %s\n", state.mam.label, mamname(job->target), timefmt(NiL, CURTIME)); t = sfstruse(tmp); if (!(job->flags & CO_ALWAYS)) { if (state.touch) { if (state.virtualdot) { state.virtualdot = 0; lockstate(1); } if (!(job->target->property & (P_attribute|P_virtual))) { acceptrule(job->target); if ((job->target->property & (P_joint|P_target)) == (P_joint|P_target)) for (p = job->target->prereqs->rule->prereqs; p; p = p->next) if (p->rule != job->target) acceptrule(p->rule); } } else if (*t && (!state.silent || state.mam.regress)) dumpaction(state.mam.out ? state.mam.out : sfstdout, NiL, t, NiL); done(job, 0, NiL); } else { if (state.virtualdot && !notfile(job->target)) { state.virtualdot = 0; lockstate(1); } if (!state.coshell) { sp = sfstropen(); sfprintf(sp, "label=%s", idname); expand(sp, " $(" CO_ENV_OPTIONS ")"); flags = CO_ANY; if (state.cross) flags |= CO_CROSS; if (state.serialize && state.jobs > 1) flags |= CO_SERIALIZE; if (!(state.coshell = coopen(getval(CO_ENV_SHELL, VAL_PRIMARY), flags, sfstruse(sp)))) error(ERROR_SYSTEM|3, "coshell open error"); sfstrclose(sp); } if (p = internal.exports->prereqs) { Sfio_t* exp; exp = sfstropen(); do { if (v = getvar(p->rule->name)) { expand(exp, v->value); coexport(state.coshell, p->rule->name, sfstruse(exp)); } else if (s = strchr(p->rule->name, '=')) { *s = 0; expand(exp, s + 1); coexport(state.coshell, p->rule->name, sfstruse(exp)); *s = '='; } } while (p = p->next); sfstrclose(exp); #if 0 freelist(internal.exports->prereqs); #endif internal.exports->prereqs = 0; } if (job->flags & CO_DATAFILE) { static char* dot; static char* tmp; if (job->target->property & P_read) { if (!dot) dot = pathtemp(NiL, 0, null, idname, NiL); state.tmpfile = dot; } else { if (!tmp) tmp = pathtemp(NiL, 0, NiL, idname, NiL); state.tmpfile = tmp; } } #if !_HUH_1992_02_29 /* i386 and ftx m68k dump without this statement -- help */ message((-99, "execute: %s: t=0x%08x &t=0x%08x", job->target->name, t, &t)); #endif if (state.mam.out) dumpaction(state.mam.out, MAMNAME(job->target), t, NiL); if (r = getrule(external.makerun)) maketop(r, P_dontcare|P_foreground, NiL); if (!(job->cojob = coexec(state.coshell, t, job->flags, state.tmpfile, NiL, sfstruse(att)))) error(3, "%s: cannot send action to coshell", job->target->name); job->cojob->local = (void*)job; /* * grab semaphores */ if (job->target->dynamic & D_hassemaphore) { job->flags |= CO_SEMAPHORES; for (p = job->prereqs; p; p = p->next) if (p->rule->semaphore && --p->rule->semaphore == 1) p->rule->status = MAKING; } /* * check status and sync */ if (job->target->dynamic & D_hasafter) save(job); if (job->flags & (CO_DATAFILE|CO_FOREGROUND)) { complete(job->target, NiL, NiL, 0); if (job->target->property & (P_functional|P_read)) { if (sp = sfopen(NiL, state.tmpfile, "r")) { remove(state.tmpfile); if (job->target->property & P_read) parse(sp, NiL, job->target->name, NiL); else { char* e; sfmove(sp, tmp, SF_UNBOUND, -1); t = sfstrbase(tmp); e = sfstrseek(tmp, 0, SEEK_CUR); while (e > t && *(e - 1) == '\n') e--; sfstrseek(tmp, e - t, SEEK_SET); setvar(job->target->name, sfstruse(tmp), 0); } sfclose(sp); } else error(2, "%s: cannot read temporary data output file %s", job->target->name, state.tmpfile); state.tmpfile = 0; } } } sfstrclose(att); sfstrclose(tmp); }
int b_tee(int argc, register char** argv, void* context) { register Tee_t* tp = 0; register int oflag = O_WRONLY|O_TRUNC|O_CREAT|O_BINARY; register int* hp; register char* cp; int line; if (argc <= 0) { if (context && (tp = (Tee_t*)sh_context(context)->data)) { sh_context(context)->data = 0; tee_cleanup(tp); } return 0; } cmdinit(argc, argv, context, ERROR_CATALOG, ERROR_CALLBACK); line = -1; for (;;) { switch (optget(argv, usage)) { case 'a': oflag &= ~O_TRUNC; oflag |= O_APPEND; continue; case 'i': signal(SIGINT, SIG_IGN); continue; case 'l': line = sfset(sfstdout, 0, 0) & SF_LINE; if ((line == 0) == (opt_info.num == 0)) line = -1; else sfset(sfstdout, SF_LINE, !!opt_info.num); continue; case ':': error(2, "%s", opt_info.arg); break; case '?': error(ERROR_usage(2), "%s", opt_info.arg); break; } break; } if (error_info.errors) error(ERROR_usage(2), "%s", optusage(NiL)); argv += opt_info.index; argc -= opt_info.index; #if _ANCIENT_BSD_COMPATIBILITY if (*argv && streq(*argv, "-")) { signal(SIGINT, SIG_IGN); argv++; argc--; } #endif if (argc > 0) { if (tp = (Tee_t*)stakalloc(sizeof(Tee_t) + argc * sizeof(int))) { memset(&tp->disc, 0, sizeof(tp->disc)); tp->disc.writef = tee_write; if (context) sh_context(context)->data = (void*)tp; tp->line = line; hp = tp->fd; while (cp = *argv++) { if ((*hp = open(cp, oflag, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)) < 0) error(ERROR_system(0), "%s: cannot create", cp); else hp++; } if (hp == tp->fd) tp = 0; else { *hp = -1; sfdisc(sfstdout, &tp->disc); } } else error(ERROR_exit(0), "out of space"); } if ((sfmove(sfstdin, sfstdout, SF_UNBOUND, -1) < 0 || !sfeof(sfstdin)) && errno != EPIPE) error(ERROR_system(0), "read error"); if (sfsync(sfstdout)) error(ERROR_system(0), "write error"); tee_cleanup(tp); return error_info.errors; }
tmain() { UNUSED(argc); UNUSED(argv); Sfio_t *f1, *f2, *f3, *f; char *s, *s1, *s2, *s3, *s4; int n; int fd[2]; if (!(f1 = sfopen(NULL, tstfile("sf", 0), "w+"))) terror("Opening file1"); if (!(f2 = sfopen(NULL, tstfile("sf", 0), "w+"))) terror("Opening file2"); Fclose = f2; sfdisc(f1, &Disc); sfdisc(f2, &Disc); sfstack(f1, f2); if ((n = sfgetc(f1)) >= 0 || !sfeof(f1)) terror("There should be no data n=%d", n); if (sfstacked(f1)) terror("There should be no stack"); Fclose = f1; if (sfclose(f1) < 0) terror("Can't close f1"); tcleanup(); s1 = "1234567890"; s2 = "abcdefghijklmnopqrstuvwxyz"; s3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; s4 = "!@#$%^&*()_-+={}[]~`':;?/><,|"; if (!(f1 = sfopen(NULL, s1, "s")) || !(f2 = sfopen(NULL, s2, "s")) || !(f3 = sfopen(NULL, s3, "s"))) { terror("Opening strings"); } sfdisc(sfstdin, &Disc); sfclose(sfstdin); if (sffileno(sfstdin) != 0) terror("Bad fd for stdin"); if (!(f = sfopen(NULL, tstfile("sf", 0), "w+"))) terror("Opening file"); if (sfwrite(f, "0123456789", 10) != 10) terror("Write file"); if (sfseek(f, (Sfoff_t)0, 0) != 0) terror("Seek file"); if (sfstack(sfstdin, f) != sfstdin) terror("Stacking on stdin2"); if (sfopen(sfstdout, "/dev/null", "w") != sfstdout) terror("Opening sfstdout"); if (sfmove(sfstdin, sfstdout, (Sfoff_t)SF_UNBOUND, -1) != 10 || !sfeof(sfstdin) || sferror(sfstdout)) { terror("Bad sfmove"); } tcleanup(); if (!(f = sftmp(0))) terror("Opening temp file"); if (sfputr(f, s4, -1) != (ssize_t)strlen(s4)) terror("Writing s4"); sfseek(f, (Sfoff_t)0, 0); #if FIX_THIS_TEST_2008_08_11 if (sfstack(f, f3) != f) terror("Stacking s3"); if (sfstack(f, f2) != f) terror("Stacking s2"); if (sfstack(f, f1) != f) terror("Stacking s1"); sfsprintf(str, sizeof(str), "%s%s%s%s", s1, s2, s3, s4); if ((ss = sfgetr(f, '\n', 1))) terror("There shouldn't have been any new-line"); else { if (!(ss = sfgetr(f, '\n', -1))) terror("Reading streams"); n = sfvalue(f); if (ss[n]) ss[n] = 0; } if (strcmp(ss, str) != 0) terror("Expect=%s Got=%s", str, ss); #endif if (!(f1 = sfopen(NULL, s1, "s")) || !(f2 = sfopen(NULL, s2, "s")) || !(f3 = sfopen(NULL, s3, "s"))) { terror("Opening strings2"); } sfseek(f, (Sfoff_t)0, 0); if (sfstack(f, f3) != f || sfstack(f, f2) != f || sfstack(f, f1) != f) { terror("Stacking streams2"); } if (!(s = sfreserve(f, SF_UNBOUND, 0)) || s != s1) terror("Sfpeek1"); if (!(s = sfreserve(f, SF_UNBOUND, 0)) || s != s2) terror("Sfpeek2"); if (!(s = sfreserve(f, SF_UNBOUND, 0)) || s != s3) terror("Sfpeek3"); if (!(s = sfreserve(f, SF_UNBOUND, 0)) || strncmp(s, s4, strlen(s4)) != 0) terror("Sfpeek4"); /* test to see if hidden read data still accessible */ if (pipe(fd) < 0) terror("Can't create pipe"); if (!(f1 = sfnew(0, NULL, (size_t)SF_UNBOUND, fd[0], SF_READ | SF_WRITE))) { terror("Can't create stream"); } if (write(fd[1], "0123", 4) != 4) terror("Can't write to pipe"); if (sfgetc(f1) != '0') terror("sfgetc failed"); /* hack to create hidden reserved buffer */ f1->file = fd[1]; if (sfwrite(f1, "4", 1) != 1) terror("Can't write to stream"); sfsync(f1); f1->file = fd[0]; close(fd[1]); /* now stack stream */ if (!(f2 = sfopen(0, "abcd\n", "s"))) terror("Can't open string stream"); sfstack(f2, f1); if (!(s = sfgetr(f2, '\n', 1))) terror("sfgetr failed"); if (strcmp(s, "1234abcd") != 0) terror("sfgetr got wrong data"); texit(0); }
static void cutfields(Cut_t* cut, Sfio_t* fdin, Sfio_t* fdout) { register unsigned char *sp = cut->space; register unsigned char *cp; register unsigned char *wp; register int c, nfields; register const int *lp = cut->list; register unsigned char *copy; register int nodelim, empty, inword=0; register unsigned char *ep; unsigned char *bp, *first; int lastchar; wchar_t w; Sfio_t *fdtmp = 0; long offset = 0; unsigned char mb[8]; /* process each buffer */ while ((bp = (unsigned char*)sfreserve(fdin, SF_UNBOUND, -1)) && (c = sfvalue(fdin)) > 0) { cp = bp; ep = cp + --c; if((lastchar = cp[c]) != cut->eob) *ep = cut->eob; /* process each line in the buffer */ while (cp <= ep) { first = cp; if (!inword) { nodelim = empty = 1; copy = cp; if (nfields = *(lp = cut->list)) copy = 0; else nfields = *++lp; } else if (copy) copy = cp; inword = 0; do { /* skip over non-delimiter characters */ if (cut->mb) for (;;) { switch (c = sp[*(unsigned char*)cp++]) { case 0: continue; case SP_WIDE: wp = --cp; while ((c = mb2wc(w, cp, ep - cp)) <= 0) { /* mb char possibly spanning buffer boundary -- fun stuff */ if ((ep - cp) < mbmax()) { int i; int j; int k; if (lastchar != cut->eob) { *ep = lastchar; if ((c = mb2wc(w, cp, ep - cp)) > 0) break; } if (copy) { empty = 0; if ((c = cp - copy) > 0 && sfwrite(fdout, (char*)copy, c) < 0) goto failed; } for (i = 0; i <= (ep - cp); i++) mb[i] = cp[i]; if (!(bp = (unsigned char*)sfreserve(fdin, SF_UNBOUND, -1)) || (c = sfvalue(fdin)) <= 0) goto failed; cp = bp; ep = cp + --c; if ((lastchar = cp[c]) != cut->eob) *ep = cut->eob; j = i; k = 0; while (j < mbmax()) mb[j++] = cp[k++]; if ((c = mb2wc(w, (char*)mb, j)) <= 0) { c = i; w = 0; } first = bp = cp += c - i; if (copy) { copy = bp; if (w == cut->ldelim.chr) lastchar = cut->ldelim.chr; else if (w != cut->wdelim.chr) { empty = 0; if (sfwrite(fdout, (char*)mb, c) < 0) goto failed; } } c = 0; } else { w = *cp; c = 1; } break; } cp += c; c = w; if (c == cut->wdelim.chr) { c = SP_WORD; break; } if (c == cut->ldelim.chr) { c = SP_LINE; break; } continue; default: wp = cp - 1; break; } break; } else { while (!(c = sp[*cp++])); wp = cp - 1; } /* check for end-of-line */ if (c == SP_LINE) { if (cp <= ep) break; if (lastchar == cut->ldelim.chr) break; /* restore cut->last character */ if (lastchar != cut->eob) *ep = lastchar; inword++; if (!sp[lastchar]) break; } nodelim = 0; if (--nfields > 0) continue; nfields = *++lp; if (copy) { empty = 0; if ((c = wp - copy) > 0 && sfwrite(fdout, (char*)copy, c) < 0) goto failed; copy = 0; } else /* set to delimiter unless the first field */ copy = empty ? cp : wp; } while (!inword); if (!inword) { if (!copy) { if (nodelim) { if (!cut->sflag) { if (offset) { sfseek(fdtmp,(Sfoff_t)0,SEEK_SET); sfmove(fdtmp,fdout,offset,-1); } copy = first; } } else sfputc(fdout,'\n'); } if (offset) sfseek(fdtmp,offset=0,SEEK_SET); } if (copy && (c=cp-copy)>0 && (!nodelim || !cut->sflag) && sfwrite(fdout,(char*)copy,c)< 0) goto failed; } /* see whether to save in tmp file */ if(inword && nodelim && !cut->sflag && (c=cp-first)>0) { /* copy line to tmpfile in case no fields */ if(!fdtmp) fdtmp = sftmp(BLOCK); sfwrite(fdtmp,(char*)first,c); offset +=c; } } failed: if(fdtmp) sfclose(fdtmp); }
int main(int argc, char *argv[]) { Sfio_t *in, *out; Shell_t *shp; Namval_t *np; Shnode_t *t; char *cp; int n, nflag=0, vflag=0, dflag=0; error_info.id = argv[0]; while(n = optget(argv, usage )) switch(n) { case 'D': dflag=1; break; case 'v': vflag=1; break; case 'n': nflag=1; break; case ':': errormsg(SH_DICT,2,"%s",opt_info.arg); break; case '?': errormsg(SH_DICT,ERROR_usage(2),"%s",opt_info.arg); break; } shp = sh_init(argc,argv,(Shinit_f)0); shp->shcomp = 1; argv += opt_info.index; argc -= opt_info.index; if(error_info.errors || argc>2) errormsg(SH_DICT,ERROR_usage(2),"%s",optusage((char*)0)); if(cp= *argv) { argv++; in = sh_pathopen(cp); } else in = sfstdin; if(cp= *argv) { struct stat statb; if(!(out = sfopen((Sfio_t*)0,cp,"w"))) errormsg(SH_DICT,ERROR_system(1),"%s: cannot create",cp); if(fstat(sffileno(out),&statb) >=0) chmod(cp,(statb.st_mode&~S_IFMT)|S_IXUSR|S_IXGRP|S_IXOTH); } else out = sfstdout; if(dflag) { sh_onoption(SH_DICTIONARY); sh_onoption(SH_NOEXEC); } if(nflag) sh_onoption(SH_NOEXEC); if(vflag) sh_onoption(SH_VERBOSE); if(!dflag) sfwrite(out,header,sizeof(header)); shp->inlineno = 1; #if SHOPT_BRACEPAT sh_onoption(SH_BRACEEXPAND); #endif while(1) { stakset((char*)0,0); if(t = (Shnode_t*)sh_parse(shp,in,0)) { if((t->tre.tretyp&(COMMSK|COMSCAN))==0 && t->com.comnamp && strcmp(nv_name((Namval_t*)t->com.comnamp),"alias")==0) sh_exec(t,0); if(!dflag && sh_tdump(out,t) < 0) errormsg(SH_DICT,ERROR_exit(1),"dump failed"); } else if(sfeof(in)) break; if(sferror(in)) errormsg(SH_DICT,ERROR_system(1),"I/O error"); if(t && ((t->tre.tretyp&COMMSK)==TCOM) && (np=t->com.comnamp) && (cp=nv_name(np))) { if(strcmp(cp,"exit")==0) break; /* check for exec of a command */ if(strcmp(cp,"exec")==0) { if(t->com.comtyp&COMSCAN) { if(t->com.comarg->argnxt.ap) break; } else { struct dolnod *ap = (struct dolnod*)t->com.comarg; if(ap->dolnum>1) break; } } } } /* copy any remaining input */ sfmove(in,out,SF_UNBOUND,-1); if(in!=sfstdin) sfclose(in); if(out!=sfstdout) sfclose(out); return(0); }
MAIN() { Sfio_t* f; if(!(f = sfopen(NIL(Sfio_t*),"ab","sr")) ) terror("Can't open stream\n"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet\n"); if(sfgetc(f) != 'a') terror("Got wrong data\n"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet2\n"); if(sfgetc(f) != 'b') terror("Got wrong data2\n"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet3\n"); if(sfgetc(f) >= 0) terror("Got wrong data2\n"); if(!sfeof(f)) terror("Should be eof now\n"); if(sfseek(f,(Sfoff_t)(-1),2) != 1) terror("Seek error\n"); if(sfeof(f)) terror("Shouldn't be eof any more\n"); if(!(f = sfopen(NIL(Sfio_t*), tstfile(0), "w+")) ) terror("Can't open stream2\n"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet2\n"); if(sfwrite(f,"ab",2) != 2) terror("Can't write data\n"); if(sfseek(f,(Sfoff_t)0,0) != 0) terror("Can't seek back\n"); if(sfgetc(f) != 'a') terror("Got wrong data3\n"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet4\n"); if(sfgetc(f) != 'b') terror("Got wrong data4\n"); if(sfeof(f) || sferror(f)) terror("Can't be eof or error yet5\n"); if(sfgetc(f) >= 0) terror("Got wrong data5\n"); if(!sfeof(f)) terror("Should be eof now2\n"); if(sfseek(f,(Sfoff_t)(-1),2) != 1) terror("Seek error2\n"); if(sfeof(f)) terror("Shouldn't be eof any more2\n"); if(!(f = sfopen(NIL(Sfio_t*), tstfile(0),"w+")) ) terror("Reopening %s\n", tstfile(0)); sfwrite(f,"1234567890",10); sfseek(f,(Sfoff_t)0,0); if(sfopen(sfstdout, tstfile(1), "w") != sfstdout) terror("Opening %s\n", tstfile(1)); if(sfmove(f,sfstdout,(Sfoff_t)(-1),-1) != 10) terror("sfmove failed\n"); if(!sfeof(f)) terror("f should be eof\n"); if(sferror(sfstdout)) terror("sfstdout should not be in error\n"); TSTEXIT(0); }