xref: /plan9/sys/src/libventi/string.c (revision 368c31ab13393dea083228fdd1c3445076f83a4b)
1*368c31abSDavid du Colombier #include <u.h>
2*368c31abSDavid du Colombier #include <libc.h>
3*368c31abSDavid du Colombier #include <venti.h>
4*368c31abSDavid du Colombier 
5*368c31abSDavid du Colombier int
vtputstring(Packet * p,char * s)6*368c31abSDavid du Colombier vtputstring(Packet *p, char *s)
7*368c31abSDavid du Colombier {
8*368c31abSDavid du Colombier 	uchar buf[2];
9*368c31abSDavid du Colombier 	int n;
10*368c31abSDavid du Colombier 
11*368c31abSDavid du Colombier 	if(s == nil){
12*368c31abSDavid du Colombier 		werrstr("null string in packet");
13*368c31abSDavid du Colombier 		return -1;
14*368c31abSDavid du Colombier 	}
15*368c31abSDavid du Colombier 	n = strlen(s);
16*368c31abSDavid du Colombier 	if(n > VtMaxStringSize){
17*368c31abSDavid du Colombier 		werrstr("string too long in packet");
18*368c31abSDavid du Colombier 		return -1;
19*368c31abSDavid du Colombier 	}
20*368c31abSDavid du Colombier 	buf[0] = n>>8;
21*368c31abSDavid du Colombier 	buf[1] = n;
22*368c31abSDavid du Colombier 	packetappend(p, buf, 2);
23*368c31abSDavid du Colombier 	packetappend(p, (uchar*)s, n);
24*368c31abSDavid du Colombier 	return 0;
25*368c31abSDavid du Colombier }
26*368c31abSDavid du Colombier 
27*368c31abSDavid du Colombier int
vtgetstring(Packet * p,char ** ps)28*368c31abSDavid du Colombier vtgetstring(Packet *p, char **ps)
29*368c31abSDavid du Colombier {
30*368c31abSDavid du Colombier 	uchar buf[2];
31*368c31abSDavid du Colombier 	int n;
32*368c31abSDavid du Colombier 	char *s;
33*368c31abSDavid du Colombier 
34*368c31abSDavid du Colombier 	if(packetconsume(p, buf, 2) < 0)
35*368c31abSDavid du Colombier 		return -1;
36*368c31abSDavid du Colombier 	n = (buf[0]<<8) + buf[1];
37*368c31abSDavid du Colombier 	if(n > VtMaxStringSize) {
38*368c31abSDavid du Colombier 		werrstr("string too long in packet");
39*368c31abSDavid du Colombier 		return -1;
40*368c31abSDavid du Colombier 	}
41*368c31abSDavid du Colombier 	s = vtmalloc(n+1);
42*368c31abSDavid du Colombier 	if(packetconsume(p, (uchar*)s, n) < 0){
43*368c31abSDavid du Colombier 		vtfree(s);
44*368c31abSDavid du Colombier 		return -1;
45*368c31abSDavid du Colombier 	}
46*368c31abSDavid du Colombier 	s[n] = 0;
47*368c31abSDavid du Colombier 	*ps = s;
48*368c31abSDavid du Colombier 	return 0;
49*368c31abSDavid du Colombier }
50*368c31abSDavid du Colombier 
51