X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=lib.c;h=bd40ee08ab77376f74b1ce5715b9740a16c82e71;hb=39247dfa3b672c958ecfdfe9e104bfcb2d267db6;hp=6c3cd0aff62924cd3e98449ae30616b54ce164a4;hpb=9f56f874416db295bdb50d448bd99cdd34db969d;p=userv.git diff --git a/lib.c b/lib.c index 6c3cd0a..bd40ee0 100644 --- a/lib.c +++ b/lib.c @@ -2,7 +2,7 @@ * userv - lib.c * useful utility routines, used in daemon, but not very dependent on it * - * Copyright (C)1996-1997 Ian Jackson + * Copyright (C)1996-1997,1999 Ian Jackson * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by @@ -25,8 +25,11 @@ #include #include #include +#include +#include #include "config.h" +#include "common.h" #include "lib.h" char *xstrcat3save(const char *a, const char *b, const char *c) { @@ -67,10 +70,12 @@ void *xrealloc(void *p, size_t s) { return p; } -void makeroom(char **buffer, int *size, int needed) { - if (*size >= needed) return; +int makeroom(char **buffer, int *size, int needed) { + if (needed > MAX_GENERAL_STRING) return -1; + if (*size >= needed) return 0; *buffer= xrealloc(*buffer,needed); *size= needed; + return 0; } void vsnyprintf(char *buffer, size_t size, const char *fmt, va_list al) { @@ -108,3 +113,19 @@ void snytprintfcat(char *buffer, size_t size, const char *fmt, ...) { vsnytprintfcat(buffer,size,fmt,al); va_end(al); } + +#ifndef HAVE_SETENV +int setenv(const char *name, const char *value, int overwrite) { + static char *buffer= 0; + static int avail= 0; + + int r; + + assert(overwrite==1); + r= makeroom(&buffer,&avail,strlen(name)+strlen(value)+2); + if (r) { errno= EINVAL; return -1; } + + sprintf(buffer,"%s=%s",name,value); + return putenv(buffer); +} +#endif /* HAVE_SETENV */