17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier #include <thread.h>
5*5d459b5aSDavid du Colombier #include <plumb.h>
67dd7cddfSDavid du Colombier #include "dat.h"
77dd7cddfSDavid du Colombier
87dd7cddfSDavid du Colombier void*
emalloc(uint n)97dd7cddfSDavid du Colombier emalloc(uint n)
107dd7cddfSDavid du Colombier {
117dd7cddfSDavid du Colombier void *p;
127dd7cddfSDavid du Colombier
137dd7cddfSDavid du Colombier p = malloc(n);
147dd7cddfSDavid du Colombier if(p == nil)
157dd7cddfSDavid du Colombier error("can't malloc: %r");
167dd7cddfSDavid du Colombier memset(p, 0, n);
179a747e4fSDavid du Colombier setmalloctag(p, getcallerpc(&n));
189a747e4fSDavid du Colombier return p;
199a747e4fSDavid du Colombier }
209a747e4fSDavid du Colombier
219a747e4fSDavid du Colombier void*
erealloc(void * p,uint n)229a747e4fSDavid du Colombier erealloc(void *p, uint n)
239a747e4fSDavid du Colombier {
249a747e4fSDavid du Colombier p = realloc(p, n);
259a747e4fSDavid du Colombier if(p == nil)
269a747e4fSDavid du Colombier error("can't realloc: %r");
279a747e4fSDavid du Colombier setmalloctag(p, getcallerpc(&n));
287dd7cddfSDavid du Colombier return p;
297dd7cddfSDavid du Colombier }
307dd7cddfSDavid du Colombier
317dd7cddfSDavid du Colombier char*
estrdup(char * s)327dd7cddfSDavid du Colombier estrdup(char *s)
337dd7cddfSDavid du Colombier {
347dd7cddfSDavid du Colombier char *t;
357dd7cddfSDavid du Colombier
367dd7cddfSDavid du Colombier t = emalloc(strlen(s)+1);
377dd7cddfSDavid du Colombier strcpy(t, s);
387dd7cddfSDavid du Colombier return t;
397dd7cddfSDavid du Colombier }
407dd7cddfSDavid du Colombier
417dd7cddfSDavid du Colombier char*
estrstrdup(char * s,char * t)427dd7cddfSDavid du Colombier estrstrdup(char *s, char *t)
437dd7cddfSDavid du Colombier {
447dd7cddfSDavid du Colombier char *u;
457dd7cddfSDavid du Colombier
467dd7cddfSDavid du Colombier u = emalloc(strlen(s)+strlen(t)+1);
477dd7cddfSDavid du Colombier strcpy(u, s);
487dd7cddfSDavid du Colombier strcat(u, t);
497dd7cddfSDavid du Colombier return u;
507dd7cddfSDavid du Colombier }
517dd7cddfSDavid du Colombier
527dd7cddfSDavid du Colombier char*
eappend(char * s,char * sep,char * t)537dd7cddfSDavid du Colombier eappend(char *s, char *sep, char *t)
547dd7cddfSDavid du Colombier {
557dd7cddfSDavid du Colombier char *u;
567dd7cddfSDavid du Colombier
577dd7cddfSDavid du Colombier if(t == nil)
587dd7cddfSDavid du Colombier u = estrstrdup(s, sep);
597dd7cddfSDavid du Colombier else{
607dd7cddfSDavid du Colombier u = emalloc(strlen(s)+strlen(sep)+strlen(t)+1);
617dd7cddfSDavid du Colombier strcpy(u, s);
627dd7cddfSDavid du Colombier strcat(u, sep);
637dd7cddfSDavid du Colombier strcat(u, t);
647dd7cddfSDavid du Colombier }
657dd7cddfSDavid du Colombier free(s);
667dd7cddfSDavid du Colombier return u;
677dd7cddfSDavid du Colombier }
687dd7cddfSDavid du Colombier
697dd7cddfSDavid du Colombier char*
egrow(char * s,char * sep,char * t)707dd7cddfSDavid du Colombier egrow(char *s, char *sep, char *t)
717dd7cddfSDavid du Colombier {
727dd7cddfSDavid du Colombier s = eappend(s, sep, t);
737dd7cddfSDavid du Colombier free(t);
747dd7cddfSDavid du Colombier return s;
757dd7cddfSDavid du Colombier }
767dd7cddfSDavid du Colombier
777dd7cddfSDavid du Colombier void
error(char * fmt,...)787dd7cddfSDavid du Colombier error(char *fmt, ...)
797dd7cddfSDavid du Colombier {
809a747e4fSDavid du Colombier Fmt f;
819a747e4fSDavid du Colombier char buf[64];
827dd7cddfSDavid du Colombier va_list arg;
837dd7cddfSDavid du Colombier
849a747e4fSDavid du Colombier fmtfdinit(&f, 2, buf, sizeof buf);
859a747e4fSDavid du Colombier fmtprint(&f, "Mail: ");
867dd7cddfSDavid du Colombier va_start(arg, fmt);
879a747e4fSDavid du Colombier fmtvprint(&f, fmt, arg);
887dd7cddfSDavid du Colombier va_end(arg);
899a747e4fSDavid du Colombier fmtprint(&f, "\n");
909a747e4fSDavid du Colombier fmtfdflush(&f);
917dd7cddfSDavid du Colombier threadexitsall(fmt);
927dd7cddfSDavid du Colombier }
937dd7cddfSDavid du Colombier
947dd7cddfSDavid du Colombier void
ctlprint(int fd,char * fmt,...)957dd7cddfSDavid du Colombier ctlprint(int fd, char *fmt, ...)
967dd7cddfSDavid du Colombier {
977dd7cddfSDavid du Colombier int n;
987dd7cddfSDavid du Colombier va_list arg;
997dd7cddfSDavid du Colombier
1007dd7cddfSDavid du Colombier va_start(arg, fmt);
1019a747e4fSDavid du Colombier n = vfprint(fd, fmt, arg);
1027dd7cddfSDavid du Colombier va_end(arg);
1039a747e4fSDavid du Colombier if(n <= 0)
1047dd7cddfSDavid du Colombier error("control file write error: %r");
1057dd7cddfSDavid du Colombier }
106