diff options
author | Stef Walter <stef@memberwebs.com> | 2004-07-19 17:49:09 +0000 |
---|---|---|
committer | Stef Walter <stef@memberwebs.com> | 2004-07-19 17:49:09 +0000 |
commit | 086da0b54d7f5711733febdb27507a5400767be6 (patch) | |
tree | a8cbf97d4d71ae9803cfb16e29d5d9732e878aa6 | |
parent | 0d8273a6e327e1e9a2bdddcea1e1b19bcb544247 (diff) |
Miscellaneous fixes (lost track).
-rw-r--r-- | common/compat.c | 99 | ||||
-rw-r--r-- | common/compat.h | 4 | ||||
-rw-r--r-- | common/smtppass.c | 2 |
3 files changed, 85 insertions, 20 deletions
diff --git a/common/compat.c b/common/compat.c index 54fd760..d3730e0 100644 --- a/common/compat.c +++ b/common/compat.c @@ -34,8 +34,37 @@ * CONTRIBUTORS * Nate Nielsen <nielsen@memberwebs.com> * + * + * PORTIONS FROM OPENBSD: ------------------------------------------------- + * + * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com> + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; + * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + + #include "usuals.h" #include "compat.h" @@ -81,34 +110,70 @@ char* strupr(char* s) #ifndef HAVE_STRLCPY -#ifndef HAVE_STRNCPY -#error neither strncpy or strlcpy found -#endif - -void strlcpy(char* dest, const char* src, size_t count) +size_t strlcpy(char* dst, const char* src, size_t siz) { - if(count > 0) - { - strncpy(dest, src, count); - dest[count - 1] = 0; + char* d = dst; + const char* s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if(n != 0 && --n != 0) + { + do + { + if((*d++ = *s++) == 0) + break; } + while(--n != 0); + } + + /* Not enough room in dst, add NUL and traverse rest of src */ + if(n == 0) + { + if(siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return s - src - 1; /* count does not include NUL */ } + #endif #ifndef HAVE_STRLCAT -#ifndef HAVE_STRNCAT -#error neither strncat or strlcat found -#endif - -void strlcat(char* dest, const char* src, size_t count) +size_t strlcat(char* dst, const char* src, size_t siz) { - if(count > 0) + char* d = dst; + const char* s = src; + size_t n = siz; + size_t dlen; + + /* Find the end of dst and adjust bytes left but don't go past end */ + while(n-- != 0 && *d != '\0') + d++; + dlen = d - dst; + n = siz - dlen; + + if(n == 0) + return dlen + strlen(s); + while(*s != '\0') + { + if(n != 1) { - strncat(dest, src, count); - dest[count - 1] = 0; + *d++ = *s; + n--; } + + s++; + } + + *d = '\0'; + + return dlen + (s - src); /* count does not include NUL */ } + #endif diff --git a/common/compat.h b/common/compat.h index 0690bfc..98ebade 100644 --- a/common/compat.h +++ b/common/compat.h @@ -77,11 +77,11 @@ char* strupr(char* s); #endif #ifndef HAVE_STRLCAT -void strlcat(char *dst, const char *src, size_t size); +size_t strlcat(char *dst, const char *src, size_t size); #endif #ifndef HAVE_STRLCPY -void strlcpy(char *dst, const char *src, size_t size); +size_t strlcpy(char *dst, const char *src, size_t size); #endif #endif /* _COMPAT_H_ */ diff --git a/common/smtppass.c b/common/smtppass.c index 95ceacf..b93b636 100644 --- a/common/smtppass.c +++ b/common/smtppass.c @@ -857,7 +857,7 @@ static int avcheck_data(clamsmtp_context_t* ctx, char* logline) int r, ret = 0; strlcpy(buf, g_directory, MAXPATHLEN); - strlcat(buf, "/clamsmtp.XXXXXX", MAXPATHLEN); + strlcat(buf, "/clamsmtpd.XXXXXX", MAXPATHLEN); /* transfer_to_file deletes the temp file on failure */ if((r = transfer_to_file(ctx, buf)) > 0) |