Annotation of embedaddon/rsync/lib/compat.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * Reimplementations of standard functions for platforms that don't have them.
        !             3:  *
        !             4:  * Copyright (C) 1998 Andrew Tridgell
        !             5:  * Copyright (C) 2002 Martin Pool
        !             6:  * Copyright (C) 2004, 2005, 2006 Wayne Davison
        !             7:  *
        !             8:  * This program is free software; you can redistribute it and/or modify
        !             9:  * it under the terms of the GNU General Public License as published by
        !            10:  * the Free Software Foundation; either version 3 of the License, or
        !            11:  * (at your option) any later version.
        !            12:  *
        !            13:  * This program is distributed in the hope that it will be useful,
        !            14:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            15:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            16:  * GNU General Public License for more details.
        !            17:  *
        !            18:  * You should have received a copy of the GNU General Public License along
        !            19:  * with this program; if not, visit the http://fsf.org website.
        !            20:  */
        !            21: 
        !            22: #include "rsync.h"
        !            23: 
        !            24: #ifndef HAVE_STRDUP
        !            25:  char *strdup(char *s)
        !            26: {
        !            27:        int len = strlen(s) + 1;
        !            28:        char *ret = (char *)malloc(len);
        !            29:        if (ret)
        !            30:                memcpy(ret, s, len);
        !            31:        return ret;
        !            32: }
        !            33: #endif
        !            34: 
        !            35: #ifndef HAVE_GETCWD
        !            36:  char *getcwd(char *buf, int size)
        !            37: {
        !            38:        return getwd(buf);
        !            39: }
        !            40: #endif
        !            41: 
        !            42: 
        !            43: #ifndef HAVE_WAITPID
        !            44:  pid_t waitpid(pid_t pid, int *statptr, int options)
        !            45: {
        !            46: #ifdef HAVE_WAIT4
        !            47:        return wait4(pid, statptr, options, NULL);
        !            48: #else
        !            49:        /* If wait4 is also not available, try wait3 for SVR3 variants */
        !            50:        /* Less ideal because can't actually request a specific pid */
        !            51:        /* At least the WNOHANG option is supported */
        !            52:        /* Code borrowed from apache fragment written by dwd@bell-labs.com */
        !            53:        int tmp_pid, dummystat;;
        !            54:        if (kill(pid, 0) == -1) {
        !            55:                errno = ECHILD;
        !            56:                return -1;
        !            57:        }
        !            58:        if (statptr == NULL)
        !            59:                statptr = &dummystat;
        !            60:        while (((tmp_pid = wait3(statptr, options, 0)) != pid) &&
        !            61:                    (tmp_pid != -1) && (tmp_pid != 0) && (pid != -1))
        !            62:            ;
        !            63:        return tmp_pid;
        !            64: #endif
        !            65: }
        !            66: #endif
        !            67: 
        !            68: 
        !            69: #ifndef HAVE_MEMMOVE
        !            70:  void *memmove(void *dest, const void *src, size_t n)
        !            71: {
        !            72:        bcopy((char *) src, (char *) dest, n);
        !            73:        return dest;
        !            74: }
        !            75: #endif
        !            76: 
        !            77: #ifndef HAVE_STRPBRK
        !            78: /**
        !            79:  * Find the first ocurrence in @p s of any character in @p accept.
        !            80:  *
        !            81:  * Derived from glibc
        !            82:  **/
        !            83:  char *strpbrk(const char *s, const char *accept)
        !            84: {
        !            85:        while (*s != '\0')  {
        !            86:                const char *a = accept;
        !            87:                while (*a != '\0') {
        !            88:                        if (*a++ == *s) return (char *)s;
        !            89:                }
        !            90:                ++s;
        !            91:        }
        !            92: 
        !            93:        return NULL;
        !            94: }
        !            95: #endif
        !            96: 
        !            97: 
        !            98: #ifndef HAVE_STRLCPY
        !            99: /**
        !           100:  * Like strncpy but does not 0 fill the buffer and always null
        !           101:  * terminates.
        !           102:  *
        !           103:  * @param bufsize is the size of the destination buffer.
        !           104:  *
        !           105:  * @return index of the terminating byte.
        !           106:  **/
        !           107:  size_t strlcpy(char *d, const char *s, size_t bufsize)
        !           108: {
        !           109:        size_t len = strlen(s);
        !           110:        size_t ret = len;
        !           111:        if (bufsize > 0) {
        !           112:                if (len >= bufsize)
        !           113:                        len = bufsize-1;
        !           114:                memcpy(d, s, len);
        !           115:                d[len] = 0;
        !           116:        }
        !           117:        return ret;
        !           118: }
        !           119: #endif
        !           120: 
        !           121: #ifndef HAVE_STRLCAT
        !           122: /**
        !           123:  * Like strncat() but does not 0 fill the buffer and always null
        !           124:  * terminates.
        !           125:  *
        !           126:  * @param bufsize length of the buffer, which should be one more than
        !           127:  * the maximum resulting string length.
        !           128:  **/
        !           129:  size_t strlcat(char *d, const char *s, size_t bufsize)
        !           130: {
        !           131:        size_t len1 = strlen(d);
        !           132:        size_t len2 = strlen(s);
        !           133:        size_t ret = len1 + len2;
        !           134: 
        !           135:        if (len1 < bufsize - 1) {
        !           136:                if (len2 >= bufsize - len1)
        !           137:                        len2 = bufsize - len1 - 1;
        !           138:                memcpy(d+len1, s, len2);
        !           139:                d[len1+len2] = 0;
        !           140:        }
        !           141:        return ret;
        !           142: }
        !           143: #endif
        !           144: 
        !           145: /* some systems don't take the 2nd argument */
        !           146: int sys_gettimeofday(struct timeval *tv)
        !           147: {
        !           148: #ifdef HAVE_GETTIMEOFDAY_TZ
        !           149:        return gettimeofday(tv, NULL);
        !           150: #else
        !           151:        return gettimeofday(tv);
        !           152: #endif
        !           153: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>