Add Unix specials.

This commit is contained in:
rsc 2005-09-13 02:00:06 +00:00
parent 913a0dc0ca
commit 71f0567294

View file

@ -48,7 +48,7 @@ static void vacstdin(DirSink *dsink, char *name, VacFile *vf);
static void vacdata(DirSink *dsink, int fd, char *lname, VacFile*, Dir*); static void vacdata(DirSink *dsink, int fd, char *lname, VacFile*, Dir*);
static void vacdir(DirSink *dsink, int fd, char *lname, char *sname, VacFile*); static void vacdir(DirSink *dsink, int fd, char *lname, char *sname, VacFile*);
static int vacmerge(DirSink *dsink, char *lname, char *sname); static int vacmerge(DirSink *dsink, char *lname, char *sname);
static int vacspecial(DirSink *dsink, Dir *dir, char *lname, char *sname, VacFile *vf);
Sink *sinkalloc(VtConn *z, int psize, int dsize); Sink *sinkalloc(VtConn *z, int psize, int dsize);
void sinkwrite(Sink *k, uchar *data, int n); void sinkwrite(Sink *k, uchar *data, int n);
void sinkwritescore(Sink *k, uchar *score, int n); void sinkwritescore(Sink *k, uchar *score, int n);
@ -401,7 +401,11 @@ vacfile(DirSink *dsink, char *lname, char *sname, VacFile *vf)
warn("could not stat file %s: %r", lname); warn("could not stat file %s: %r", lname);
return; return;
} }
if(dir->mode&(DMSYMLINK|DMDEVICE|DMNAMEDPIPE|DMSOCKET)){ if(dir->mode&(DMSYMLINK|DMDEVICE|DMNAMEDPIPE)){
vacspecial(dsink, dir, lname, sname, vf);
free(dir);
return;
}else if(dir->mode&DMSOCKET){
free(dir); free(dir);
return; return;
} }
@ -724,6 +728,64 @@ Done:
return 0; return 0;
} }
static int
vacspecial(DirSink *dsink, Dir* dir, char *lname, char *sname, VacFile *vf)
{
char *btmp, *buf;
int buflen, dtype, major, minor, n;
ulong entry;
Sink *sink;
VacDir vd;
n = 0;
buflen = 128;
buf = malloc(buflen);
if(buf == nil)
return -1;
if(verbose)
fprint(2, "%s\n", lname);
dir->name = lastelem(sname);
if(dir->mode & DMSYMLINK){
while((n = readlink(sname, buf, buflen)) == buflen){
buflen *= 2;
btmp = vtrealloc(buf, buflen);
if(btmp == nil){
free(buf);
return -1;
}
buf = btmp;
}
dir->mode &= ~DMDIR;
dir->mode |= DMSYMLINK;
}else if(dir->mode & DMDEVICE){
dtype = (dir->qid.path >> 16) & 0xFF;
minor = dir->qid.path & 0xff;
major = (dir->qid.path >> 8) & 0xFF;
n = snprint(buf, buflen, "%c %d %d", dtype, major, minor);
}
entry = dsink->nentry;
sink = sinkalloc(dsink->sink->z, bsize, bsize);
sinkwrite(sink, buf, n);
sinkclose(sink);
dirsinkwritesink(dsink, sink);
sinkfree(sink);
free(buf);
dir->name = lastelem(sname);
dir->length = n;
plan9tovacdir(&vd, dir, entry, fileid++);
metasinkwritedir(dsink->msink, &vd);
vdcleanup(&vd);
return 0;
}
Sink * Sink *
sinkalloc(VtConn *z, int psize, int dsize) sinkalloc(VtConn *z, int psize, int dsize)
{ {
@ -784,6 +846,9 @@ sinkwrite(Sink *k, uchar *p, int n)
int type; int type;
uchar score[VtScoreSize]; uchar score[VtScoreSize];
if(n == 0)
return;
if(n > k->dir.dsize) if(n > k->dir.dsize)
sysfatal("sinkWrite: size too big"); sysfatal("sinkWrite: size too big");
@ -1134,6 +1199,12 @@ plan9tovacdir(VacDir *vd, Dir *dir, ulong entry, uvlong qid)
vd->mode |= ModeAppend; vd->mode |= ModeAppend;
if(dir->mode & DMEXCL) if(dir->mode & DMEXCL)
vd->mode |= ModeExclusive; vd->mode |= ModeExclusive;
if(dir->mode & DMDEVICE)
vd->mode |= ModeDevice;
if(dir->mode & DMNAMEDPIPE)
vd->mode |= ModeNamedPipe;
if(dir->mode & DMSYMLINK)
vd->mode |= ModeLink;
vd->plan9 = 1; vd->plan9 = 1;
vd->p9path = dir->qid.path; vd->p9path = dir->qid.path;