19a747e4fSDavid du Colombier #include "lib.h"
29a747e4fSDavid du Colombier #include <string.h>
39a747e4fSDavid du Colombier #include <stdlib.h>
49a747e4fSDavid du Colombier #include "sys9.h"
59a747e4fSDavid du Colombier #include "dir.h"
69a747e4fSDavid du Colombier
79a747e4fSDavid du Colombier enum
89a747e4fSDavid du Colombier {
99a747e4fSDavid du Colombier DIRSIZE = STATFIXLEN + 16 * 4 /* enough for encoded stat buf + some reasonable strings */
109a747e4fSDavid du Colombier };
119a747e4fSDavid du Colombier
129a747e4fSDavid du Colombier Dir*
_dirstat(char * name)139a747e4fSDavid du Colombier _dirstat(char *name)
149a747e4fSDavid du Colombier {
159a747e4fSDavid du Colombier Dir *d;
169a747e4fSDavid du Colombier uchar *buf;
179a747e4fSDavid du Colombier int n, nd, i;
189a747e4fSDavid du Colombier
199a747e4fSDavid du Colombier nd = DIRSIZE;
209a747e4fSDavid du Colombier for(i=0; i<2; i++){ /* should work by the second try */
21*16a961bdSDavid du Colombier d = malloc(sizeof(Dir) + BIT16SZ +nd);
229a747e4fSDavid du Colombier if(d == nil)
239a747e4fSDavid du Colombier return nil;
249a747e4fSDavid du Colombier buf = (uchar*)&d[1];
25*16a961bdSDavid du Colombier n = _STAT(name, buf, BIT16SZ+nd);
269a747e4fSDavid du Colombier if(n < BIT16SZ){
279a747e4fSDavid du Colombier free(d);
289a747e4fSDavid du Colombier return nil;
299a747e4fSDavid du Colombier }
309a747e4fSDavid du Colombier nd = GBIT16((uchar*)buf); /* size needed to store whole stat buffer */
319a747e4fSDavid du Colombier if(nd <= n){
329a747e4fSDavid du Colombier _convM2D(buf, n, d, (char*)&d[1]);
339a747e4fSDavid du Colombier return d;
349a747e4fSDavid du Colombier }
35*16a961bdSDavid du Colombier /* else sizeof(Dir)+BIT16SZ+nd is plenty */
369a747e4fSDavid du Colombier free(d);
379a747e4fSDavid du Colombier }
389a747e4fSDavid du Colombier return nil;
399a747e4fSDavid du Colombier }
409a747e4fSDavid du Colombier
419a747e4fSDavid du Colombier int
_dirwstat(char * name,Dir * d)429a747e4fSDavid du Colombier _dirwstat(char *name, Dir *d)
439a747e4fSDavid du Colombier {
449a747e4fSDavid du Colombier uchar *buf;
459a747e4fSDavid du Colombier int r;
469a747e4fSDavid du Colombier
479a747e4fSDavid du Colombier r = _sizeD2M(d);
489a747e4fSDavid du Colombier buf = malloc(r);
499a747e4fSDavid du Colombier if(buf == nil)
509a747e4fSDavid du Colombier return -1;
519a747e4fSDavid du Colombier _convD2M(d, buf, r);
529a747e4fSDavid du Colombier r = _WSTAT(name, buf, r);
539a747e4fSDavid du Colombier free(buf);
549a747e4fSDavid du Colombier return r;
559a747e4fSDavid du Colombier }
569a747e4fSDavid du Colombier
579a747e4fSDavid du Colombier Dir*
_dirfstat(int fd)589a747e4fSDavid du Colombier _dirfstat(int fd)
599a747e4fSDavid du Colombier {
609a747e4fSDavid du Colombier Dir *d;
619a747e4fSDavid du Colombier uchar *buf;
629a747e4fSDavid du Colombier int n, nd, i;
639a747e4fSDavid du Colombier
649a747e4fSDavid du Colombier nd = DIRSIZE;
659a747e4fSDavid du Colombier for(i=0; i<2; i++){ /* should work by the second try */
669a747e4fSDavid du Colombier d = malloc(sizeof(Dir) + nd);
679a747e4fSDavid du Colombier if(d == nil)
689a747e4fSDavid du Colombier return nil;
699a747e4fSDavid du Colombier buf = (uchar*)&d[1];
709a747e4fSDavid du Colombier n = _FSTAT(fd, buf, nd);
719a747e4fSDavid du Colombier if(n < BIT16SZ){
729a747e4fSDavid du Colombier free(d);
739a747e4fSDavid du Colombier return nil;
749a747e4fSDavid du Colombier }
759a747e4fSDavid du Colombier nd = GBIT16(buf); /* size needed to store whole stat buffer */
769a747e4fSDavid du Colombier if(nd <= n){
779a747e4fSDavid du Colombier _convM2D(buf, n, d, (char*)&d[1]);
789a747e4fSDavid du Colombier return d;
799a747e4fSDavid du Colombier }
809a747e4fSDavid du Colombier /* else sizeof(Dir)+nd is plenty */
819a747e4fSDavid du Colombier free(d);
829a747e4fSDavid du Colombier }
839a747e4fSDavid du Colombier return nil;
849a747e4fSDavid du Colombier }
859a747e4fSDavid du Colombier
869a747e4fSDavid du Colombier int
_dirfwstat(int fd,Dir * d)879a747e4fSDavid du Colombier _dirfwstat(int fd, Dir *d)
889a747e4fSDavid du Colombier {
899a747e4fSDavid du Colombier uchar *buf;
909a747e4fSDavid du Colombier int r;
919a747e4fSDavid du Colombier
929a747e4fSDavid du Colombier r = _sizeD2M(d);
939a747e4fSDavid du Colombier buf = malloc(r);
949a747e4fSDavid du Colombier if(buf == nil)
959a747e4fSDavid du Colombier return -1;
969a747e4fSDavid du Colombier _convD2M(d, buf, r);
979a747e4fSDavid du Colombier r = _FWSTAT(fd, buf, r);
989a747e4fSDavid du Colombier free(buf);
999a747e4fSDavid du Colombier return r;
1009a747e4fSDavid du Colombier }
1019a747e4fSDavid du Colombier
1029a747e4fSDavid du Colombier void
_nulldir(Dir * d)1039a747e4fSDavid du Colombier _nulldir(Dir *d)
1049a747e4fSDavid du Colombier {
1059a747e4fSDavid du Colombier memset(d, ~0, sizeof(Dir));
1069a747e4fSDavid du Colombier d->name = d->uid = d->gid = d->muid = "";
1079a747e4fSDavid du Colombier }
108