| #include <u.h> |
| #include <libc.h> |
| #include <bio.h> |
| #include <thread.h> |
| #include <plumb.h> |
| #include <9pclient.h> |
| #include "dat.h" |
| |
| void* |
| emalloc(uint n) |
| { |
| void *p; |
| |
| p = malloc(n); |
| if(p == nil) |
| error("can't malloc: %r"); |
| memset(p, 0, n); |
| setmalloctag(p, getcallerpc(&n)); |
| return p; |
| } |
| |
| void* |
| erealloc(void *p, uint n) |
| { |
| p = realloc(p, n); |
| if(p == nil) |
| error("can't realloc: %r"); |
| setmalloctag(p, getcallerpc(&n)); |
| return p; |
| } |
| |
| char* |
| estrdup(char *s) |
| { |
| char *t; |
| |
| t = emalloc(strlen(s)+1); |
| strcpy(t, s); |
| return t; |
| } |
| |
| char* |
| estrstrdup(char *s, char *t) |
| { |
| char *u; |
| |
| u = emalloc(strlen(s)+strlen(t)+1); |
| strcpy(u, s); |
| strcat(u, t); |
| return u; |
| } |
| |
| char* |
| eappend(char *s, char *sep, char *t) |
| { |
| char *u; |
| |
| if(t == nil) |
| u = estrstrdup(s, sep); |
| else{ |
| u = emalloc(strlen(s)+strlen(sep)+strlen(t)+1); |
| strcpy(u, s); |
| strcat(u, sep); |
| strcat(u, t); |
| } |
| free(s); |
| return u; |
| } |
| |
| char* |
| egrow(char *s, char *sep, char *t) |
| { |
| s = eappend(s, sep, t); |
| free(t); |
| return s; |
| } |
| |
| void |
| error(char *fmt, ...) |
| { |
| Fmt f; |
| char buf[64]; |
| va_list arg; |
| |
| fmtfdinit(&f, 2, buf, sizeof buf); |
| fmtprint(&f, "Mail: "); |
| va_start(arg, fmt); |
| fmtvprint(&f, fmt, arg); |
| va_end(arg); |
| fmtprint(&f, "\n"); |
| fmtfdflush(&f); |
| threadexitsall(fmt); |
| } |
| |
| void |
| ctlprint(CFid *fd, char *fmt, ...) |
| { |
| int n; |
| va_list arg; |
| |
| va_start(arg, fmt); |
| n = fsvprint(fd, fmt, arg); |
| va_end(arg); |
| if(n <= 0) |
| error("control file write error: %r"); |
| } |
| |