Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <thread.h>
5 #include <plumb.h>
6 #include <9pclient.h>
7 #include "dat.h"
9 void*
10 emalloc(uint n)
11 {
12 void *p;
14 p = malloc(n);
15 if(p == nil)
16 error("can't malloc: %r");
17 memset(p, 0, n);
18 setmalloctag(p, getcallerpc(&n));
19 return p;
20 }
22 void*
23 erealloc(void *p, uint n)
24 {
25 p = realloc(p, n);
26 if(p == nil)
27 error("can't realloc: %r");
28 setmalloctag(p, getcallerpc(&n));
29 return p;
30 }
32 char*
33 estrdup(char *s)
34 {
35 char *t;
37 t = emalloc(strlen(s)+1);
38 strcpy(t, s);
39 return t;
40 }
42 char*
43 estrstrdup(char *s, char *t)
44 {
45 char *u;
47 u = emalloc(strlen(s)+strlen(t)+1);
48 strcpy(u, s);
49 strcat(u, t);
50 return u;
51 }
53 char*
54 eappend(char *s, char *sep, char *t)
55 {
56 char *u;
58 if(t == nil)
59 u = estrstrdup(s, sep);
60 else{
61 u = emalloc(strlen(s)+strlen(sep)+strlen(t)+1);
62 strcpy(u, s);
63 strcat(u, sep);
64 strcat(u, t);
65 }
66 free(s);
67 return u;
68 }
70 char*
71 egrow(char *s, char *sep, char *t)
72 {
73 s = eappend(s, sep, t);
74 free(t);
75 return s;
76 }
78 void
79 error(char *fmt, ...)
80 {
81 Fmt f;
82 char buf[64];
83 va_list arg;
85 fmtfdinit(&f, 2, buf, sizeof buf);
86 fmtprint(&f, "Mail: ");
87 va_start(arg, fmt);
88 fmtvprint(&f, fmt, arg);
89 va_end(arg);
90 fmtprint(&f, "\n");
91 fmtfdflush(&f);
92 threadexitsall(fmt);
93 }
95 void
96 ctlprint(CFid *fd, char *fmt, ...)
97 {
98 int n;
99 va_list arg;
101 va_start(arg, fmt);
102 n = fsvprint(fd, fmt, arg);
103 va_end(arg);
104 if(n <= 0)
105 error("control file write error: %r");