static Whist* readwhist(char *file, char *lock, Qid *qid) { int lfd; Biobuf *b; Dir *d; Whist *wh; if((lfd=getlock(lock)) < 0) // LOG? return nil; if(qid){ if((d = wdirstat(file)) == nil){ close(lfd); return nil; } *qid = d->qid; free(d); } if((b = wBopen(file, OREAD)) == nil){ //LOG? close(lfd); return nil; } wh = Brdwhist(b); Bterm(b); close(lfd); return wh; }
static String * httplogin(void) { String *s=s_new(); Biobuf *b; if((b = wBopen(".httplogin", OREAD)) == nil) goto Return; while(s_read(b, s, Bsize) > 0) ; Bterm(b); Return: return s; }
/* * Attempt to install a new page. If t==0 we are creating. * Otherwise, we are editing and t must be set to the current * version (t is the version we started with) to avoid conflicting * writes. * * If there is a conflicting write, we still write the page to * the history file, but mark it as a failed write. */ int writepage(int num, uint32_t t, String *s, char *title) { char tmp[40], tmplock[40], err[ERRMAX], hist[40], *p; int conflict, lfd, fd; Biobuf *b; String *os; sprint(tmp, "d/%d", num); sprint(tmplock, "d/L.%d", num); sprint(hist, "d/%d.hist", num); if((lfd = getlock(tmplock)) < 0) return -1; conflict = 0; if(b = wBopen(tmp, OREAD)){ Brdline(b, '\n'); /* title */ if(p = Brdline(b, '\n')) /* version */ p[Blinelen(b)-1] = '\0'; if(p==nil || p[0] != 'D'){ snprint(err, sizeof err, "bad format in extant file"); conflict = 1; }else if(strtoul(p+1, 0, 0) != t){ os = Brdstring(b); /* why read the whole file? */ p = strchr(s_to_c(s), '\n'); if(p!=nil && strcmp(p+1, s_to_c(os))==0){ /* ignore dup write */ close(lfd); s_free(os); Bterm(b); return 0; } s_free(os); snprint(err, sizeof err, "update conflict %lud != %s", t, p+1); conflict = 1; } Bterm(b); }else{ if(t != 0){ close(lfd); werrstr("did not expect to create"); return -1; } } if((fd = wopen(hist, OWRITE)) < 0){ if((fd = wcreate(hist, OWRITE, 0666)) < 0){ close(lfd); return -1; }else fprint(fd, "%s\n", title); } if(seek(fd, 0, 2) < 0 || (conflict && write(fd, "X\n", 2) != 2) || write(fd, s_to_c(s), s_len(s)) != s_len(s)){ close(fd); close(lfd); return -1; } close(fd); if(conflict){ close(lfd); voidcache(num); werrstr(err); return -1; } if((fd = wcreate(tmp, OWRITE, 0666)) < 0){ close(lfd); voidcache(num); return -1; } if(write(fd, title, strlen(title)) != strlen(title) || write(fd, "\n", 1) != 1 || write(fd, s_to_c(s), s_len(s)) != s_len(s)){ close(fd); close(lfd); voidcache(num); return -1; } close(fd); close(lfd); voidcache(num); return 0; }