File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / rsync / lib / compat.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Fri Feb 17 15:09:30 2012 UTC (12 years, 5 months ago) by misho
Branches: rsync, MAIN
CVS tags: rsync3_0_9p0, RSYNC3_0_9, HEAD
rsync

    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>