Introduction
Introduction Statistics Contact Development Disclaimer Help
Sync lib9 with plan9port. Fix build with bsdmake. - 9base - revived minimalist …
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
commit 65f285bad8c2fe136ce4c4a99f12cfc1cb2d0f68
parent a3b65ffcdcc4450db02e999e89d126201852813f
Author: Kris Maglione <[email protected]>
Date: Mon, 19 Jul 2010 11:50:26 -0400
Sync lib9 with plan9port. Fix build with bsdmake.
Diffstat:
M diff/Makefile | 2 +-
M lib9/Makefile | 4 ++--
M lib9/_p9dir.c | 10 ++++++++--
M lib9/bio/bgetrune.c | 2 +-
M lib9/bio/bputrune.c | 2 +-
M lib9/convM2S.c | 20 +++++++++++++++++---
M lib9/convS2M.c | 20 +++++++++++++++++---
M lib9/dial.c | 5 +++++
M lib9/dirread.c | 2 +-
M lib9/fcall.h | 24 ++++++++++++++++++++----
M lib9/fmt.h | 2 +-
M lib9/fmt/dofmt.c | 11 ++++++-----
M lib9/libc.h | 5 +++--
M lib9/u.h | 3 +++
M lib9/utf.h | 6 +++---
M lib9/utf/rune.c | 78 +++++++++++++++++++++++------…
16 files changed, 148 insertions(+), 48 deletions(-)
---
diff --git a/diff/Makefile b/diff/Makefile
@@ -32,4 +32,4 @@ clean:
${TARG}: ${OFILES}
@echo LD ${TARG}
- @${CC} ${LDFLAGS} -o ${TARG} ${OFILES} -lm -L${PREFIX}/lib -L../lib9 -…
+ ${CC} ${LDFLAGS} -o ${TARG} ${OFILES} -lm -L../lib9 -L${PREFIX}/lib -l9
diff --git a/lib9/Makefile b/lib9/Makefile
@@ -221,8 +221,8 @@ ${LIB}: ${OFILES}
@${AR} ${LIB} ${OFILES}
.c.o:
- @echo CC $*.c
- @${CC} -o $*.o ${CFLAGS} -Isec -I${PREFIX}/include $*.c
+ @echo CC $<
+ @${CC} -o $@ ${CFLAGS} -Isec -I${PREFIX}/include $<
clean:
rm -f ${OFILES} ${LIB}
diff --git a/lib9/_p9dir.c b/lib9/_p9dir.c
@@ -44,7 +44,6 @@ disksize(int fd, struct stat *st)
#define _HAVESTGEN
#include <sys/disklabel.h>
#include <sys/ioctl.h>
-#include <sys/dkio.h>
static vlong
disksize(int fd, struct stat *st)
{
@@ -190,7 +189,14 @@ _p9dir(struct stat *lst, struct stat *st, char *name, Dir …
d->type = 'M';
d->muid = "";
- d->qid.path = ((uvlong)st->st_dev<<32) | st->st_ino;
+ d->qid.path = st->st_ino;
+ /*
+ * do not include st->st_dev in path, because
+ * automounters give the same file system different
+ * st_dev values for successive mounts, causing
+ * spurious write warnings in acme and sam.
+ d->qid.path |= (uvlong)st->st_dev<<32;
+ */
#ifdef _HAVESTGEN
d->qid.vers = st->st_gen;
#endif
diff --git a/lib9/bio/bgetrune.c b/lib9/bio/bgetrune.c
@@ -7,7 +7,7 @@ Bgetrune(Biobuf *bp)
{
int c, i;
Rune rune;
- char str[4];
+ char str[UTFmax];
c = Bgetc(bp);
if(c < Runeself) { /* one char */
diff --git a/lib9/bio/bputrune.c b/lib9/bio/bputrune.c
@@ -6,7 +6,7 @@ int
Bputrune(Biobuf *bp, long c)
{
Rune rune;
- char str[4];
+ char str[UTFmax];
int n;
rune = c;
diff --git a/lib9/convM2S.c b/lib9/convM2S.c
@@ -100,6 +100,13 @@ convM2Su(uchar *ap, uint nap, Fcall *f, int dotu)
p = gstring(p, ep, &f->aname);
if(p == nil)
break;
+ f->uidnum = NOUID;
+ if(dotu){
+ if(p+BIT32SZ > ep)
+ return 0;
+ f->uidnum = GBIT32(p);
+ p += BIT32SZ;
+ }
break;
case Tattach:
@@ -117,6 +124,13 @@ convM2Su(uchar *ap, uint nap, Fcall *f, int dotu)
p = gstring(p, ep, &f->aname);
if(p == nil)
break;
+ f->uidnum = NOUID;
+ if(dotu){
+ if(p+BIT32SZ > ep)
+ return 0;
+ f->uidnum = GBIT32(p);
+ p += BIT32SZ;
+ }
break;
case Twalk:
@@ -233,10 +247,10 @@ convM2Su(uchar *ap, uint nap, Fcall *f, int dotu)
p = gstring(p, ep, &f->ename);
f->errornum = 0;
if(dotu){
- if(p+BIT16SZ > ep)
+ if(p+BIT32SZ > ep)
return 0;
- f->errornum = GBIT16(p);
- p += BIT16SZ;
+ f->errornum = GBIT32(p);
+ p += BIT32SZ;
}
break;
diff --git a/lib9/convS2M.c b/lib9/convS2M.c
@@ -74,6 +74,8 @@ sizeS2Mu(Fcall *f, int dotu)
n += BIT32SZ;
n += stringsz(f->uname);
n += stringsz(f->aname);
+ if(dotu)
+ n += BIT32SZ;
break;
case Tattach:
@@ -81,6 +83,8 @@ sizeS2Mu(Fcall *f, int dotu)
n += BIT32SZ;
n += stringsz(f->uname);
n += stringsz(f->aname);
+ if(dotu)
+ n += BIT32SZ;
break;
case Twalk:
@@ -144,7 +148,7 @@ sizeS2Mu(Fcall *f, int dotu)
case Rerror:
n += stringsz(f->ename);
if(dotu)
- n += BIT16SZ;
+ n += BIT32SZ;
break;
case Rflush:
@@ -249,6 +253,11 @@ convS2Mu(Fcall *f, uchar *ap, uint nap, int dotu)
p += BIT32SZ;
p = pstring(p, f->uname);
p = pstring(p, f->aname);
+ if(dotu){
+ f->uidnum = NOUID;
+ PBIT32(p, f->uidnum);
+ p += BIT32SZ;
+ }
break;
case Tattach:
@@ -258,6 +267,11 @@ convS2Mu(Fcall *f, uchar *ap, uint nap, int dotu)
p += BIT32SZ;
p = pstring(p, f->uname);
p = pstring(p, f->aname);
+ if(dotu){
+ f->uidnum = NOUID;
+ PBIT32(p, f->uidnum);
+ p += BIT32SZ;
+ }
break;
case Twalk:
@@ -344,8 +358,8 @@ convS2Mu(Fcall *f, uchar *ap, uint nap, int dotu)
case Rerror:
p = pstring(p, f->ename);
if(dotu){
- PBIT16(p, f->errornum);
- p += BIT16SZ;
+ PBIT32(p, f->errornum);
+ p += BIT32SZ;
}
break;
diff --git a/lib9/dial.c b/lib9/dial.c
@@ -46,6 +46,11 @@ p9dial(char *addr, char *local, char *dummy2, int *dummy3)
free(buf);
return -1;
}
+ if(strcmp(net, "unix") != 0 && host == 0){
+ werrstr("invalid dial address 0.0.0.0 (aka *)");
+ free(buf);
+ return -1;
+ }
if(strcmp(net, "tcp") == 0)
proto = SOCK_STREAM;
diff --git a/lib9/dirread.c b/lib9/dirread.c
@@ -6,7 +6,7 @@
extern int _p9dir(struct stat*, struct stat*, char*, Dir*, char**, char*);
-#if defined(__linux__) || defined(__FreeBSD_kernel__)
+#if defined(__linux__)
static int
mygetdents(int fd, struct dirent *buf, int n)
{
diff --git a/lib9/fcall.h b/lib9/fcall.h
@@ -34,20 +34,25 @@ struct Fcall
ushort nwname; /* Twalk */
char *wname[MAXWELEM]; /* Twalk */
ushort nwqid; /* Rwalk */
- Qid wqid[MAXWELEM]; /* Rwalk */
+ Qid wqid[MAXWELEM]; /* Rwalk */
vlong offset; /* Tread, Twrite */
u32int count; /* Tread, Twrite, Rread */
char *data; /* Twrite, Rread */
ushort nstat; /* Twstat, Rstat */
uchar *stat; /* Twstat, Rstat */
int unixfd; /* Ropenfd */
+
+ /* 9P2000.u extensions */
+ int errornum; /* Rerror */
+ int uidnum; /* Tattach, Tauth */
+ char *extension; /* Tcreate */
} Fcall;
#define GBIT8(p) ((p)[0])
#define GBIT16(p) ((p)[0]|((p)[1]<<8))
-#define GBIT32(p) ((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[3]<<24))
-#define GBIT64(p) ((vlong)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)[…
+#define GBIT32(p) ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)…
+#define GBIT64(p) ((u32int)((p)[0]|((p)[1]<<8)|((p)[2]<<16)|((p)…
((vlong)((p)[4]|((p)[5]<<8)|((p)[6]<<16)|((p)[…
#define PBIT8(p,v) (p)[0]=(v)
@@ -65,9 +70,11 @@ struct Fcall
/* STATFIXLEN includes leading 16-bit count */
/* The count, however, excludes itself; total size is BIT16SZ+count */
#define STATFIXLEN (BIT16SZ+QIDSZ+5*BIT16SZ+4*BIT32SZ+1*BIT64SZ) …
+#define STATFIXLENU (STATFIXLEN+BIT16SZ+3*BIT32SZ) /* for 9P2000…
#define NOTAG (ushort)~0U /* Dummy tag */
#define NOFID (u32int)~0U /* Dummy fid */
+#define NOUID (-1) /* Dummy uid */
#define IOHDRSZ 24 /* ample room for Twrite/Rread…
enum
@@ -103,7 +110,7 @@ enum
Tmax,
Topenfd = 98,
- Ropenfd,
+ Ropenfd
};
uint convM2S(uchar*, uint, Fcall*);
@@ -115,6 +122,15 @@ uint convM2D(uchar*, uint, Dir*, char*);
uint convD2M(Dir*, uchar*, uint);
uint sizeD2M(Dir*);
+uint convM2Su(uchar*, uint, Fcall*, int);
+uint convS2Mu(Fcall*, uchar*, uint, int);
+uint sizeS2Mu(Fcall*, int);
+
+int statchecku(uchar *abuf, uint nbuf, int);
+uint convM2Du(uchar*, uint, Dir*, char*, int);
+uint convD2Mu(Dir*, uchar*, uint, int);
+uint sizeD2Mu(Dir*, int);
+
int fcallfmt(Fmt*);
int dirfmt(Fmt*);
int dirmodefmt(Fmt*);
diff --git a/lib9/fmt.h b/lib9/fmt.h
@@ -30,7 +30,7 @@ struct Fmt{
void *farg; /* to make flush a closure */
int nfmt; /* num chars formatted so far …
va_list args; /* args passed to dofmt */
- int r; /* % format Rune */
+ Rune r; /* % format Rune */
int width;
int prec;
unsigned long flags;
diff --git a/lib9/fmt/dofmt.c b/lib9/fmt/dofmt.c
@@ -605,12 +605,13 @@ __flagfmt(Fmt *f)
int
__badfmt(Fmt *f)
{
- char x[3];
+ char x[2+UTFmax];
+ int n;
x[0] = '%';
- x[1] = f->r;
- x[2] = '%';
- f->prec = 3;
- __fmtcpy(f, (const void*)x, 3, 3);
+ n = 1 + runetochar(x+1, &f->r);
+ x[n++] = '%';
+ f->prec = n;
+ __fmtcpy(f, (const void*)x, n, n);
return 0;
}
diff --git a/lib9/libc.h b/lib9/libc.h
@@ -66,10 +66,11 @@ extern int tokenize(char*, char**, int);
/*
enum
{
- UTFmax = 3,
+ UTFmax = 4,
Runesync = 0x80,
Runeself = 0x80,
- Runeerror = 0x80,
+ Runeerror = 0xFFFD,
+ Runemax = 0x10FFFF,
};
*/
diff --git a/lib9/u.h b/lib9/u.h
@@ -32,6 +32,9 @@ extern "C" {
#if defined(__AIX__)
# define _XOPEN_SOURCE 1
#endif
+#if defined(__APPLE__)
+# define _DARWIN_NO_64_BIT_INODE /* Snow Leopard */
+#endif
#define _LARGEFILE64_SOURCE 1
#define _FILE_OFFSET_BITS 64
diff --git a/lib9/utf.h b/lib9/utf.h
@@ -4,14 +4,14 @@
extern "C" {
#endif
-typedef unsigned short Rune; /* 16 bits */
+typedef unsigned int Rune; /* 32 bits */
enum
{
- UTFmax = 3, /* maximum bytes per rune */
+ UTFmax = 4, /* maximum bytes per rune */
Runesync = 0x80, /* cannot represent part of a U…
Runeself = 0x80, /* rune and UTF sequences are t…
- Runeerror = 0xFFFD, /* decoding error in UTF */
+ Runeerror = 0xFFFD, /* decoding error in UTF */
Runemax = 0x10FFFF /* maximum rune value */
};
diff --git a/lib9/utf/rune.c b/lib9/utf/rune.c
@@ -23,16 +23,19 @@ enum
Bit2 = 5,
Bit3 = 4,
Bit4 = 3,
+ Bit5 = 2,
T1 = ((1<<(Bit1+1))-1) ^ 0xFF, /* 0000 0000 */
Tx = ((1<<(Bitx+1))-1) ^ 0xFF, /* 1000 0000 */
T2 = ((1<<(Bit2+1))-1) ^ 0xFF, /* 1100 0000 */
T3 = ((1<<(Bit3+1))-1) ^ 0xFF, /* 1110 0000 */
T4 = ((1<<(Bit4+1))-1) ^ 0xFF, /* 1111 0000 */
+ T5 = ((1<<(Bit5+1))-1) ^ 0xFF, /* 1111 1000 */
- Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0111 …
- Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0111 1111 …
- Rune3 = (1<<(Bit3+2*Bitx))-1, /* 1111 1111 1111 …
+ Rune1 = (1<<(Bit1+0*Bitx))-1, /* 0000 0000 0000 …
+ Rune2 = (1<<(Bit2+1*Bitx))-1, /* 0000 0000 0000 …
+ Rune3 = (1<<(Bit3+2*Bitx))-1, /* 0000 0000 1111 …
+ Rune4 = (1<<(Bit4+3*Bitx))-1, /* 0011 1111 1111 …
Maskx = (1<<Bitx)-1, /* 0011 1111 */
Testx = Maskx ^ 0xFF, /* 1100 0000 */
@@ -43,7 +46,7 @@ enum
int
chartorune(Rune *rune, char *str)
{
- int c, c1, c2;
+ int c, c1, c2, c3;
long l;
/*
@@ -89,6 +92,25 @@ chartorune(Rune *rune, char *str)
}
/*
+ * four character sequence
+ * 10000-10FFFF => T4 Tx Tx Tx
+ */
+ if(UTFmax >= 4) {
+ c3 = *(uchar*)(str+3) ^ Tx;
+ if(c3 & Testx)
+ goto bad;
+ if(c < T5) {
+ l = ((((((c << Bitx) | c1) << Bitx) | c2) << Bitx) | c…
+ if(l <= Rune3)
+ goto bad;
+ if(l > Runemax)
+ goto bad;
+ *rune = l;
+ return 4;
+ }
+ }
+
+ /*
* bad decoding
*/
bad:
@@ -113,7 +135,7 @@ runetochar(char *str, Rune *rune)
/*
* two character sequence
- * 0080-07FF => T2 Tx
+ * 00080-007FF => T2 Tx
*/
if(c <= Rune2) {
str[0] = T2 | (c >> 1*Bitx);
@@ -123,12 +145,26 @@ runetochar(char *str, Rune *rune)
/*
* three character sequence
- * 0800-FFFF => T3 Tx Tx
+ * 00800-0FFFF => T3 Tx Tx
*/
- str[0] = T3 | (c >> 2*Bitx);
- str[1] = Tx | ((c >> 1*Bitx) & Maskx);
- str[2] = Tx | (c & Maskx);
- return 3;
+ if(c > Runemax)
+ c = Runeerror;
+ if(c <= Rune3) {
+ str[0] = T3 | (c >> 2*Bitx);
+ str[1] = Tx | ((c >> 1*Bitx) & Maskx);
+ str[2] = Tx | (c & Maskx);
+ return 3;
+ }
+
+ /*
+ * four character sequence
+ * 010000-1FFFFF => T4 Tx Tx Tx
+ */
+ str[0] = T4 | (c >> 3*Bitx);
+ str[1] = Tx | ((c >> 2*Bitx) & Maskx);
+ str[2] = Tx | ((c >> 1*Bitx) & Maskx);
+ str[3] = Tx | (c & Maskx);
+ return 4;
}
int
@@ -155,7 +191,10 @@ runenlen(Rune *r, int nrune)
if(c <= Rune2)
nb += 2;
else
+ if(c <= Rune3 || c > Runemax)
nb += 3;
+ else
+ nb += 4;
}
return nb;
}
@@ -165,13 +204,14 @@ fullrune(char *str, int n)
{
int c;
- if(n > 0) {
- c = *(uchar*)str;
- if(c < Tx)
- return 1;
- if(n > 1)
- if(c < T3 || n > 2)
- return 1;
- }
- return 0;
+ if(n <= 0)
+ return 0;
+ c = *(uchar*)str;
+ if(c < Tx)
+ return 1;
+ if(c < T3)
+ return n >= 2;
+ if(UTFmax == 3 || c < T4)
+ return n >= 3;
+ return n >= 4;
}
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.