diff --git a/csync/src/std/CMakeLists.txt b/csync/src/std/CMakeLists.txt index d9cef2d6a..184eb29d3 100644 --- a/csync/src/std/CMakeLists.txt +++ b/csync/src/std/CMakeLists.txt @@ -20,8 +20,6 @@ set(CSTDLIB_LINK_LIBRARIES set(cstdlib_SRCS c_alloc.c - c_dir.c - c_file.c c_list.c c_path.c c_rbtree.c diff --git a/csync/src/std/c_dir.c b/csync/src/std/c_dir.c deleted file mode 100644 index 2edbebc8a..000000000 --- a/csync/src/std/c_dir.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * cynapses libc functions - * - * Copyright (c) 2008-2013 by Andreas Schneider - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "c_private.h" -#include "c_macro.h" -#include "c_alloc.h" -#include "c_dir.h" -#include "c_string.h" - -int c_mkdirs(const char *path, mode_t mode) { - int tmp; - csync_stat_t sb; - mbchar_t *wpath = c_utf8_to_locale(path); - mbchar_t *swpath = NULL; - - if (path == NULL) { - errno = EINVAL; - return -1; - } - - if (_tstat(wpath, &sb) == 0) { - if (! S_ISDIR(sb.st_mode)) { - errno = ENOTDIR; - c_free_locale_string(wpath); - return -1; - } - } - - tmp = strlen(path); - while(tmp > 0 && path[tmp - 1] == '/') --tmp; - while(tmp > 0 && path[tmp - 1] != '/') --tmp; - while(tmp > 0 && path[tmp - 1] == '/') --tmp; - - if (tmp > 0) { - char subpath[tmp + 1]; - memcpy(subpath, path, tmp); - subpath[tmp] = '\0'; - swpath = c_utf8_to_locale(subpath); - if (_tstat(swpath, &sb) == 0) { - if (! S_ISDIR(sb.st_mode)) { - c_free_locale_string(swpath); - c_free_locale_string(wpath); - errno = ENOTDIR; - return -1; - } - } else if (errno != ENOENT) { - c_free_locale_string(wpath); - c_free_locale_string(swpath); - return -1; - } else if (c_mkdirs(subpath, mode) < 0) { - c_free_locale_string(swpath); - c_free_locale_string(wpath); - return -1; - } - } - tmp = _tmkdir(wpath, mode); - - c_free_locale_string(swpath); - c_free_locale_string(wpath); - - if ((tmp < 0) && (errno == EEXIST)) { - return 0; - } - return tmp; -} - -int c_rmdirs(const char *path) { - _TDIR *d; - struct _tdirent *dp; - csync_stat_t sb; - char *fname = NULL; - mbchar_t *wfname = NULL; - mbchar_t *wpath = c_utf8_to_locale(path); - char *rd_name = NULL; - - if ((d = _topendir(wpath)) != NULL) { - while( _tstat(wpath, &sb) == 0) { - /* if we can remove the directory we're done */ - if (_trmdir(wpath) == 0) { - break; - } - switch (errno) { - case ENOTEMPTY: - case EEXIST: - case EBADF: - break; /* continue */ - default: - _tclosedir(d); - c_free_locale_string(wpath); - return 0; - } - - while ((dp = _treaddir(d)) != NULL) { - size_t len; - rd_name = c_utf8_from_locale(dp->d_name); - /* skip '.' and '..' */ - if( c_streq( rd_name, "." ) || c_streq( rd_name, ".." ) ) { - c_free_locale_string(rd_name); - continue; - } - - len = strlen(path) + strlen(rd_name) + 2; - fname = c_malloc(len); - if (fname == NULL) { - _tclosedir(d); - c_free_locale_string(rd_name); - c_free_locale_string(wpath); - return -1; - } - snprintf(fname, len, "%s/%s", path, rd_name); - wfname = c_utf8_to_locale(fname); - - /* stat the file */ - if (_tstat(wfname, &sb) != -1) { -#ifdef __unix__ - if (S_ISDIR(sb.st_mode) && !S_ISLNK(sb.st_mode)) { -#else - if (S_ISDIR(sb.st_mode)) { -#endif - if (_trmdir(wfname) < 0) { /* can't be deleted */ - if (errno == EACCES) { - _tclosedir(d); - SAFE_FREE(fname); - c_free_locale_string(wfname); - c_free_locale_string(rd_name); - c_free_locale_string(wpath); - return -1; - } - c_rmdirs(fname); - } - } else { - _tunlink(wfname); - } - } /* lstat */ - SAFE_FREE(fname); - c_free_locale_string(wfname); - c_free_locale_string(rd_name); - } /* readdir */ - - _trewinddir(d); - } - } else { - c_free_locale_string(wpath); - return -1; - } - c_free_locale_string(wpath); - _tclosedir(d); - return 0; -} - -int c_isdir(const char *path) { - csync_stat_t sb; - mbchar_t *wpath = c_utf8_to_locale(path); - int re = 0; - - if (path != NULL) { - if (_tstat (wpath, &sb) == 0 && S_ISDIR(sb.st_mode)) { - re = 1; - } - } - c_free_locale_string(wpath); - return re; -} - diff --git a/csync/src/std/c_dir.h b/csync/src/std/c_dir.h deleted file mode 100644 index 4b2333ba3..000000000 --- a/csync/src/std/c_dir.h +++ /dev/null @@ -1,86 +0,0 @@ -/* - * cynapses libc functions - * - * Copyright (c) 2008-2013 by Andreas Schneider - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file c_dir.h - * - * @brief Interface of the cynapses libc directory function - * - * @defgroup cynDirInternals cynapses libc directory functions - * @ingroup cynLibraryAPI - * - * @{ - */ - -#ifndef _C_DIR_H -#define _C_DIR_H - -#include - - -/** - * @brief Create parent directories as needed. - * - * The newly created directory will be owned by the effective user ID of the - * process. - * - * @param path The path to the directory to create. - * - * @param mode Specifies the permissions to use. It is modified - * by the process's umask in the usual way: the - * permissions of the created file are (mode & ~umask). - * - * @return 0 on success, < 0 on error with errno set: - * - EACCES The parent directory does not allow write - * permission to the process, or one of the directories - * - ENOTDIR if durl is not a directory - * - EINVAL NULL durl passed or smbc_init not called. - * - ENOMEM Insufficient memory was available. - * - * @see mkdir() - */ -int c_mkdirs(const char *path, mode_t mode); - -/** - * @brief Remove the directory and subdirectories including the content. - * - * This removes all directories and files recursivly. - * - * @param dir The directory to remove recusively. - * - * @return 0 on success, < 0 on error with errno set. - */ -int c_rmdirs(const char *dir); - -/** - * @brief Check if a path is a directory. - * - * @param path The path to check. - * - * @return 1 if the path is a directory, 0 if the path doesn't exist, is a - * file or can't be accessed. - */ -int c_isdir(const char *path); - -/** - * }@ - */ -#endif /* _CDIR_H */ - diff --git a/csync/src/std/c_file.c b/csync/src/std/c_file.c deleted file mode 100644 index 61984b3b6..000000000 --- a/csync/src/std/c_file.c +++ /dev/null @@ -1,346 +0,0 @@ -/* - * cynapses libc functions - * - * Copyright (c) 2008-2013 by Andreas Schneider - * Copyright (c) 2012-2013 by Klaas Freitag - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifdef _WIN32 -#include -#include -#endif - -#include -#include -#include -#include -#include -#include -#include - -#include "c_file.h" -#include "c_string.h" - -#include "c_private.h" - -#ifdef _WIN32 -/* check if path is a symlink */ -int c_islink(const char *path) { - int re = 0; - - mbchar_t *wpath = 0; - DWORD dwAttrs; - WIN32_FIND_DATAW FindFileData; - HANDLE hFind; - - wpath = c_utf8_to_locale(path); - - dwAttrs = GetFileAttributesW(wpath); - if (dwAttrs != INVALID_FILE_ATTRIBUTES) { - - if ((dwAttrs & FILE_ATTRIBUTE_REPARSE_POINT)) { - hFind = FindFirstFileW(wpath, &FindFileData ); - if (hFind != INVALID_HANDLE_VALUE) { - if( (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) && - (FindFileData.dwReserved0 & IO_REPARSE_TAG_SYMLINK) ) { - re = 1; - } - } - FindClose(hFind); - } - } - c_free_locale_string(wpath); - return re; -} -#endif - -/* check if path is a file */ -int c_isfile(const char *path) { - csync_stat_t sb; - mbchar_t *wpath = c_utf8_to_locale(path); - - int re = _tstat(wpath, &sb); - c_free_locale_string(wpath); - - if (re< 0) { - return 0; - } - -#ifdef __unix__ - if (S_ISREG(sb.st_mode) || S_ISLNK(sb.st_mode)) { -#else - if (S_ISREG(sb.st_mode)) { -#endif - return 1; - } - - return 0; -} - -/* copy file from src to dst, overwrites dst */ -#ifdef _WIN32 -int c_copy(const char* src, const char *dst, mode_t mode) { - int rc = -1; - mbchar_t *wsrc = 0; - mbchar_t *wdst = 0; - (void) mode; /* unused on win32 */ - if(src && dst) { - wsrc = c_utf8_to_locale(src); - wdst = c_utf8_to_locale(dst); - if (CopyFileW(wsrc, wdst, FALSE)) { - rc = 0; - } - c_free_locale_string(wsrc); - c_free_locale_string(wdst); - if( rc < 0 ) { - errno = GetLastError(); - } - } - return rc; -} -#else -int c_copy(const char* src, const char *dst, mode_t mode) { - int srcfd = -1; - int dstfd = -1; - int rc = -1; - ssize_t bread, bwritten; - csync_stat_t sb; - char buf[4096]; - - if (c_streq(src, dst)) { - return -1; - } - - srcfd = open(src, O_RDONLY, 0); - if (srcfd < 0) { - goto out; - } - - rc = _tfstat(srcfd, &sb); - if (rc < 0) { - goto out; - } - - if (S_ISDIR(sb.st_mode)) { - errno = EISDIR; - rc = -1; - goto out; - } - - if (mode == 0) { - mode = sb.st_mode; - } - - dstfd = open(dst, O_CREAT|O_WRONLY|O_TRUNC, mode); - if (dstfd < 0) { - rc = -1; - goto out; - } - - rc = _tfstat(dstfd, &sb); - if (rc == 0) { - if (S_ISDIR(sb.st_mode)) { - errno = EISDIR; - rc = -1; - goto out; - } - } - - for (;;) { - bread = read(srcfd, buf, sizeof(buf)); - if (bread == 0) { - /* done */ - break; - } else if (bread < 0) { - errno = ENODATA; - rc = -1; - goto out; - } - - bwritten = write(dstfd, buf, bread); - if (bwritten < 0) { - errno = ENODATA; - rc = -1; - goto out; - } - - if (bread != bwritten) { - errno = EFAULT; - rc = -1; - goto out; - } - } - -#ifdef __unix__ - fsync(dstfd); -#endif - - rc = 0; -out: - if (srcfd >= 0) { - close(srcfd); - } - if (dstfd >= 0) { - close(dstfd); - } - if (rc < 0 && c_isfile(dst)) { - unlink(dst); - } - return rc; -} -#endif - -int c_rename( const char *src, const char *dst ) { - mbchar_t *nuri = NULL; - mbchar_t *ouri = NULL; - int rc = 0; - - nuri = c_utf8_to_locale(dst); - if (nuri == NULL) { - return -1; - } - - ouri = c_utf8_to_locale(src); - if (ouri == NULL) { - c_free_locale_string(nuri); - return -1; - } - -#ifdef _WIN32 - { -#define MAX_TRIES_RENAME 3 - int err = 0; - int cnt = 0; - - do { - BOOL ok; - ok = MoveFileExW(ouri, - nuri, - MOVEFILE_COPY_ALLOWED + - MOVEFILE_REPLACE_EXISTING + - MOVEFILE_WRITE_THROUGH); - if (!ok) { - /* error */ - err = GetLastError(); - if( (err == ERROR_ACCESS_DENIED || - err == ERROR_LOCK_VIOLATION || - err == ERROR_SHARING_VIOLATION) && cnt < MAX_TRIES_RENAME ) { - cnt++; - Sleep(cnt*100); - continue; - } - } - break; - } while( 1 ); - if( err != 0 ) { - errno = err; - rc = -1; - } - } -#else - rc = rename(ouri, nuri); -#endif - - c_free_locale_string(nuri); - c_free_locale_string(ouri); - - return rc; -} - -int c_compare_file( const char *f1, const char *f2 ) { - mbchar_t *wf1, *wf2; - int fd1 = -1, fd2 = -1; - size_t size1, size2; - char buffer1[BUFFER_SIZE]; - char buffer2[BUFFER_SIZE]; - csync_stat_t stat1; - csync_stat_t stat2; - - int rc = -1; - - if(f1 == NULL || f2 == NULL) return -1; - - wf1 = c_utf8_to_locale(f1); - if(wf1 == NULL) { - return -1; - } - - wf2 = c_utf8_to_locale(f2); - if(wf2 == NULL) { - c_free_locale_string(wf1); - return -1; - } - -#ifdef _WIN32 - _fmode = _O_BINARY; -#endif - - fd1 = _topen(wf1, O_RDONLY); - if(fd1 < 0) { - rc = -1; - goto out; - } - - fd2 = _topen(wf2, O_RDONLY); - if(fd2 < 0) { - rc = -1; - goto out; - } - - /* compare size first. */ - rc = _tfstat(fd1, &stat1); - if (rc < 0) { - goto out; - } - - rc = _tfstat(fd2, &stat2); - if (rc < 0) { - goto out; - } - - /* if sizes are different, the files can not be equal. */ - if (stat1.st_size != stat2.st_size) { - rc = 0; - goto out; - } - - while( (size1 = read(fd1, buffer1, BUFFER_SIZE)) > 0 ) { - size2 = read( fd2, buffer2, BUFFER_SIZE ); - - if( size1 != size2 ) { - rc = 0; - goto out; - } - if(memcmp(buffer1, buffer2, size1) != 0) { - /* buffers are different */ - rc = 0; - goto out; - } - } - - rc = 1; - -out: - - if(fd1 > -1) close(fd1); - if(fd2 > -1) close(fd2); - - c_free_locale_string( wf1 ); - c_free_locale_string( wf2 ); - return rc; - -} diff --git a/csync/src/std/c_file.h b/csync/src/std/c_file.h deleted file mode 100644 index d952b3976..000000000 --- a/csync/src/std/c_file.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * cynapses libc functions - * - * Copyright (c) 2008-2013 by Andreas Schneider - * Copyright (c) 2012-2013 by Klaas Freitag - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file c_file.h - * - * @brief Interface of the cynapses libc file function - * - * @defgroup cynFileInternals cynapses libc file functions - * @ingroup cynLibraryAPI - * - * @{ - */ - -#ifndef _C_FILE_H -#define _C_FILE_H - -#include -#include - -#ifndef BUFFER_SIZE -#define BUFFER_SIZE (16 * 1024) -#endif - -#ifdef _WIN32 -/** - * @brief Check if a path is a link. - * - * @param path The path to check. - * - * @return 1 if the path is a symbolic link, 0 if the path doesn't - * exist or is something else. - */ -int c_islink(const char *path); -#endif - -/** - * @brief Check if a path is a regular file or a link. - * - * @param path The path to check. - * - * @return 1 if the path is a file, 0 if the path doesn't exist, is - * something else or can't be accessed. - */ -int c_isfile(const char *path); - -/** - * @brief copy a file from source to destination. - * - * @param src Path to the source file - * @param dst Path to the destination file - * @param mode File creation mode of the destination. If mode is 0 then the - * mode from the source will be used. - * - * @return 0 on success, less than 0 on error with errno set. - * EISDIR if src or dst is a file. - */ -int c_copy(const char *src, const char *dst, mode_t mode); - -/** - * @brief Compare the content of two files byte by byte. - * @param f1 Path of file 1 - * @param f2 Path of file 2 - * - * @return 0 if the files differ, 1 if the files are equal or -1 on - * error with errno set. - */ -int c_compare_file( const char *f1, const char *f2 ); - -/** - * @brief move a file from source to destination. - * - * @param src Path to the source file - * @param dst Path to the destination file - * - * @return 0 on success, less than 0 on error with errno set. - */ -int c_rename( const char *src, const char *dst ); - -/** - * }@ - */ -#endif /* _C_FILE_H */ - diff --git a/csync/src/std/c_lib.h b/csync/src/std/c_lib.h index 3df4c598d..83591c599 100644 --- a/csync/src/std/c_lib.h +++ b/csync/src/std/c_lib.h @@ -23,45 +23,9 @@ #include "c_macro.h" #include "c_alloc.h" -#include "c_dir.h" -#include "c_file.h" #include "c_list.h" #include "c_path.h" #include "c_rbtree.h" #include "c_string.h" #include "c_time.h" #include "c_private.h" - -#ifndef UNIT_TESTING -#ifdef malloc -#undef malloc -#endif -#define malloc(x) DO_NOT_CALL_MALLOC__USE_C_MALLOC_INSTEAD - -#ifdef calloc -#undef calloc -#endif -#define calloc(x,y) DO_NOT_CALL_CALLOC__USE_C_CALLOC_INSTEAD - -#endif - -#ifdef realloc -#undef realloc -#endif -#define realloc(x,y) DO_NOT_CALL_REALLOC__USE_C_REALLOC_INSTEAD - -#ifdef dirname -#undef dirname -#endif -#define dirname(x) DO_NOT_CALL_MALLOC__USE_C_DIRNAME_INSTEAD - -#ifdef basename -#undef basename -#endif -#define basename(x) DO_NOT_CALL_MALLOC__USE_C_BASENAME_INSTEAD - -#ifdef strdup -#undef strdup -#endif -#define strdup(x) DO_NOT_CALL_STRDUP__USE_C_STRDUP_INSTEAD - diff --git a/csync/src/std/c_path.c b/csync/src/std/c_path.c index f0c422d5f..c0e414a93 100644 --- a/csync/src/std/c_path.c +++ b/csync/src/std/c_path.c @@ -117,81 +117,6 @@ char *c_basename (const char *path) { return newbuf; } - -char *c_tmpname(const char *templ) { - char *tmp = NULL; - char *target = NULL; - int rc; - int i = 0; - - if (!templ) { - goto err; - } - - /* If the template does not contain the XXXXXX it will be appended. */ - if( !strstr( templ, "XXXXXX" )) { - /* split up the path */ - char *path = c_dirname(templ); - char *base = c_basename(templ); - - if (!base) { - if (path) { - SAFE_FREE(path); - } - goto err; - } - /* Create real hidden files for unixoide. */ - if( path ) { -#ifdef _WIN32 - rc = asprintf(&target, "%s/%s.~XXXXXX", path, base); -#else - rc = asprintf(&target, "%s/.%s.~XXXXXX", path, base); -#endif - } else { -#ifdef _WIN32 - rc = asprintf(&target, "%s.~XXXXXX", base); -#else - rc = asprintf(&target, ".%s.~XXXXXX", base); -#endif - - } - SAFE_FREE(path); - SAFE_FREE(base); - - if (rc < 0) { - goto err; - } - } else { - target = c_strdup(templ); - } - - if (!target) { - goto err; - } - tmp = strstr( target, "XXXXXX" ); - if (!tmp) { - goto err; - } - - for (i = 0; i < 6; ++i) { -#ifdef _WIN32 - /* in win32 MAX_RAND is 32767, thus we can not shift that far, - * otherwise the last three chars are 0 - */ - int hexdigit = (rand() >> (i * 2)) & 0x1f; -#else - int hexdigit = (rand() >> (i * 5)) & 0x1f; -#endif - tmp[i] = hexdigit > 9 ? hexdigit + 'a' - 10 : hexdigit + '0'; - } - - return target; - -err: - errno = EINVAL; - return NULL; -} - int c_parse_uri(const char *uri, char **scheme, char **user, char **passwd, @@ -470,84 +395,3 @@ int c_parse_uri(const char *uri, return -1; } - -/* - * http://refactormycode.com/codes/1345-extracting-directory-filename-and-extension-from-a-path - * Allocate a block of memory that holds the PATHINFO at the beginning - * followed by the actual path. Two extra bytes are allocated (+3 instead - * of just +1) to deal with shifting the filename and extension to protect the trailing '/' - * and the leading '.'. These extra bytes also double as the empty string, as - * well as a pad to keep from reading past the memory block. - * - */ -C_PATHINFO * c_split_path(const char* pathSrc) -{ - size_t length = strlen(pathSrc); - size_t len=0; - C_PATHINFO * pathinfo = (C_PATHINFO *) c_malloc(sizeof(C_PATHINFO) + length + 3); - - if (pathinfo) - { - char * path = (char *) &pathinfo[1]; // copy of the path - char * theEnd = &path[length + 1]; // second null terminator - char * extension; - char * lastSep; - - // Copy the original string and double null terminate it. - strcpy(path, pathSrc); - *theEnd = '\0'; - pathinfo->directory = theEnd; // Assume no path - pathinfo->extension = theEnd; // Assume no extension - pathinfo->filename = path; // Assume filename only - - lastSep = strrchr(path, '/'); - if (lastSep) - { - pathinfo->directory = path; // Pick up the path - - memmove(lastSep + 1, lastSep, strlen(lastSep)); - *lastSep++ ='/'; - *lastSep++ ='\0'; // Truncate directory - - pathinfo->filename = lastSep; // Pick up name after path - } - - // Start at the second character of the filename to handle - // filenames that start with '.' like ".login". - // We don't overrun the buffer in the cases of an empty path - // or a path that looks like "/usr/bin/" because of the extra - // byte. - - - extension = strrchr(&pathinfo->filename[1], '.'); - if (extension) - { - // Shift the extension over to protect the leading '.' since - // we need to truncate the filename. - memmove(extension + 1, extension, strlen(extension)); - pathinfo->extension = extension + 1; - - *extension = '\0'; // Truncate filename - } - else - { - len=strlen(pathinfo->filename); - if(len>1) - { - //tmp files from kate/kwrite "somefile~": '~' should be the extension - if(pathinfo->filename[len-1]=='~') - { - extension = &pathinfo->filename[len-1]; - memmove(extension + 1, extension, strlen(extension)); - pathinfo->extension = extension + 1; - *extension = '\0'; // Truncate filename - } - } - } - - } - - return pathinfo; -} - - diff --git a/csync/src/std/c_path.h b/csync/src/std/c_path.h index e2d25eb3d..479dbdfbd 100644 --- a/csync/src/std/c_path.h +++ b/csync/src/std/c_path.h @@ -66,19 +66,6 @@ char *c_dirname(const char *path); */ char *c_basename (const char *path); -/** - * @brief Make a temporary filename. - * - * @param templ The template to replace. If the template contains six X like - * 'XXXXXX', these are replaced by a random string. If not, the - * templ is interpreted as a path, and a name to a hidden file - * with six random is returned. - * The caller has to free the memory. - * - * @return a poitner to the random hidden filename or NULL. - */ -char *c_tmpname(const char *templ); - /** * @brief parse a uri and split it into components. * @@ -120,15 +107,6 @@ typedef struct char * extension; } C_PATHINFO; -/** - * @brief Extracting directory, filename and extension from a path. - * - * @param pathSrc The path to parse. - * - * @return Returns a C_PATHINFO structure that should be freed using SAFE_FREE(). - */ -C_PATHINFO * c_split_path(const char* pathSrc); - /** * }@ diff --git a/csync/src/std/c_string.c b/csync/src/std/c_string.c index da81d6eaa..9d2c087ec 100644 --- a/csync/src/std/c_string.c +++ b/csync/src/std/c_string.c @@ -239,69 +239,6 @@ void c_strlist_destroy(c_strlist_t *strlist) { SAFE_FREE(strlist); } -char *c_strreplace(char *src, const char *pattern, const char *repl) { - char *p = NULL; - - while ((p = strstr(src, pattern)) != NULL) { - size_t of = p - src; - size_t l = strlen(src); - size_t pl = strlen(pattern); - size_t rl = strlen(repl); - - if (rl > pl) { - src = (char *) c_realloc(src, strlen(src) + rl - pl + 1); - } - - if (rl != pl) { - memmove(src + of + rl, src + of + pl, l - of - pl + 1); - } - - strncpy(src + of, repl, rl); - } - - return src; -} - -char *c_uppercase(const char* str) { - char *new; - char *p; - - if (str == NULL) { - return NULL; - } - - new = c_strdup(str); - if (new == NULL) { - return NULL; - } - - for (p = new; *p; p++) { - *p = toupper(*p); - } - - return new; -} - -char *c_lowercase(const char* str) { - char *new; - char *p; - - if (str == NULL) { - return NULL; - } - - new = c_strdup(str); - if (new == NULL) { - return NULL; - } - - for (p = new; *p; p++) { - *p = tolower(*p); - } - - return new; -} - /* Convert a wide multibyte String to UTF8 */ char* c_utf8_from_locale(const mbchar_t *wstr) { diff --git a/csync/src/std/c_string.h b/csync/src/std/c_string.h index 159ba867e..d80727a63 100644 --- a/csync/src/std/c_string.h +++ b/csync/src/std/c_string.h @@ -119,37 +119,6 @@ void c_strlist_clear(c_strlist_t *strlist); */ void c_strlist_destroy(c_strlist_t *strlist); -/** - * @breif Replace a string with another string in a source string. - * - * @param src String to search for pattern. - * - * @param pattern Pattern to search for in the source string. - * - * @param repl The string which which should replace pattern if found. - * - * @return Return a pointer to the source string. - */ -char *c_strreplace(char *src, const char *pattern, const char *repl); - -/** - * @brief Uppercase a string. - * - * @param str The String to uppercase. - * - * @return The malloced uppered string or NULL on error. - */ -char *c_uppercase(const char* str); - -/** - * @brief Lowercase a string. - * - * @param str The String to lowercase. - * - * @return The malloced lowered string or NULL on error. - */ -char *c_lowercase(const char* str); - /** * @brief Convert a platform locale string to utf8. * diff --git a/csync/tests/CMakeLists.txt b/csync/tests/CMakeLists.txt index 22394f2c2..7a79b48e8 100644 --- a/csync/tests/CMakeLists.txt +++ b/csync/tests/CMakeLists.txt @@ -21,8 +21,6 @@ set(TEST_TARGET_LIBRARIES ${TORTURE_LIBRARY}) # std add_cmocka_test(check_std_c_alloc std_tests/check_std_c_alloc.c ${TEST_TARGET_LIBRARIES}) -add_cmocka_test(check_std_c_dir std_tests/check_std_c_dir.c ${TEST_TARGET_LIBRARIES}) -add_cmocka_test(check_std_c_file std_tests/check_std_c_file.c ${TEST_TARGET_LIBRARIES}) add_cmocka_test(check_std_c_jhash std_tests/check_std_c_jhash.c ${TEST_TARGET_LIBRARIES}) add_cmocka_test(check_std_c_list std_tests/check_std_c_list.c ${TEST_TARGET_LIBRARIES}) add_cmocka_test(check_std_c_path std_tests/check_std_c_path.c ${TEST_TARGET_LIBRARIES}) diff --git a/csync/tests/std_tests/check_std_c_dir.c b/csync/tests/std_tests/check_std_c_dir.c deleted file mode 100644 index 95f96185d..000000000 --- a/csync/tests/std_tests/check_std_c_dir.c +++ /dev/null @@ -1,176 +0,0 @@ -/* - * libcsync -- a library to sync a directory with another - * - * Copyright (c) 2008-2013 by Andreas Schneider - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -#include -#include -#include -#include - -#include "torture.h" - -#include "std/c_private.h" -#include "std/c_dir.h" -#include "std/c_string.h" - -const char *check_dir = "/tmp/check/c_mkdirs//with/check//"; -const char *check_file = "/tmp/check/c_mkdirs/with/check/foobar.txt"; - -static void setup(void **state) { - int rc; - - (void) state; /* unused */ - - rc = c_mkdirs(check_dir, 0755); - assert_int_equal(rc, 0); - rc = system("touch /tmp/check/c_mkdirs/with/check/foobar.txt"); - assert_int_equal(rc, 0); -} - -static void teardown(void **state) { - int rc; - - (void) state; /* unused */ - - rc = c_rmdirs(check_dir); - assert_int_equal(rc, 0); -} - -static int test_dir(const char *path, mode_t mode) { - csync_stat_t sb; - if (lstat(path, &sb) < 0) { - return -1; - } - - if (! S_ISDIR(sb.st_mode)) { - return -1; - } - - /* FIXME */ - if ((sb.st_mode & mode) == mode) { - return 0; - } - - return -1; -} - -static void check_c_mkdirs_rmdirs(void **state) -{ - csync_stat_t sb; - int rc; - mbchar_t *wcheck_dir; - - (void) state; /* unused */ - - rc = c_mkdirs(check_dir, 0755); - assert_int_equal(rc, 0); - rc = test_dir(check_dir, 0755); - assert_int_equal(rc, 0); - rc = c_rmdirs(check_dir); - assert_int_equal(rc, 0); - wcheck_dir = c_utf8_to_locale(check_dir); - rc = _tstat(wcheck_dir, &sb); - c_free_locale_string(wcheck_dir); - assert_int_equal(rc, -1); -} - -static void check_c_mkdirs_mode(void **state) -{ - csync_stat_t sb; - int rc; - mbchar_t *wcheck_dir; - - (void) state; /* unused */ - rc = c_mkdirs(check_dir, 0700); - assert_int_equal(rc, 0); - rc = test_dir(check_dir, 0700); - assert_int_equal(rc, 0); - rc = c_rmdirs(check_dir); - assert_int_equal(rc, 0); - wcheck_dir = c_utf8_to_locale(check_dir); - rc = _tstat(wcheck_dir, &sb); - assert_int_equal(rc, -1); - c_free_locale_string(wcheck_dir); -} - -static void check_c_mkdirs_existing_path(void **state) -{ - int rc; - - (void) state; /* unused */ - - rc = c_mkdirs(check_dir, 0755); - assert_int_equal(rc, 0); -} - -static void check_c_mkdirs_file(void **state) -{ - int rc; - - (void) state; /* unused */ - - rc = c_mkdirs(check_file, 0755); - assert_int_equal(rc, -1); - assert_int_equal(errno, ENOTDIR); -} - -static void check_c_mkdirs_null(void **state) -{ - (void) state; /* unused */ - - assert_int_equal(c_mkdirs(NULL, 0755), -1); -} - -static void check_c_isdir(void **state) -{ - (void) state; /* unused */ - - assert_int_equal(c_isdir(check_dir), 1); -} - -static void check_c_isdir_on_file(void **state) -{ - (void) state; /* unused */ - - assert_int_equal(c_isdir(check_file), 0); -} - -static void check_c_isdir_null(void **state) -{ - (void) state; /* unused */ - - assert_int_equal(c_isdir(NULL), 0); -} - -int torture_run_tests(void) -{ - const UnitTest tests[] = { - unit_test(check_c_mkdirs_rmdirs), - unit_test(check_c_mkdirs_mode), - unit_test_setup_teardown(check_c_mkdirs_existing_path, setup, teardown), - unit_test_setup_teardown(check_c_mkdirs_file, setup, teardown), - unit_test(check_c_mkdirs_null), - unit_test_setup_teardown(check_c_isdir, setup, teardown), - unit_test_setup_teardown(check_c_isdir_on_file, setup, teardown), - unit_test(check_c_isdir_null), - }; - - return run_tests(tests); -} - diff --git a/csync/tests/std_tests/check_std_c_file.c b/csync/tests/std_tests/check_std_c_file.c deleted file mode 100644 index a9f4f57f3..000000000 --- a/csync/tests/std_tests/check_std_c_file.c +++ /dev/null @@ -1,180 +0,0 @@ -/* - * libcsync -- a library to sync a directory with another - * - * Copyright (c) 2008-2013 by Andreas Schneider - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ -#include -#include -#include -#include -#include - -#include "torture.h" - -#include "std/c_private.h" -#include "std/c_file.h" -#include "std/c_string.h" - -const char *check_dir = "/tmp/check"; -const char *check_src_file = "/tmp/check/foo.txt"; -const char *check_dst_file = "/tmp/check/bar.txt"; - -static int test_file(const char *path, mode_t mode) { - csync_stat_t sb; - mbchar_t *mbpath = c_utf8_to_locale(path); - int rc = _tstat(mbpath, &sb); - c_free_locale_string(mbpath); - - if (rc < 0) { - return -1; - } - - if (! S_ISREG(sb.st_mode)) { - return -1; - } - - if ((sb.st_mode & mode) == mode) { - return 0; - } - - return -1; -} - -static void setup(void **state) { - int rc; - - (void) state; /* unused */ - - rc = system("mkdir -p /tmp/check"); - assert_int_equal(rc, 0); - rc = system("echo 42 > /tmp/check/foo.txt"); - assert_int_equal(rc, 0); -} - -static void teardown(void **state) { - int rc; - - (void) state; /* unused */ - - rc = system("rm -rf /tmp/check"); - assert_int_equal(rc, 0); -} - -static void check_c_copy(void **state) -{ - int rc; - - (void) state; /* unused */ - - rc = c_copy(check_src_file, check_dst_file, 0644); - assert_int_equal(rc, 0); - rc = test_file(check_dst_file, 0644); - assert_int_equal(rc, 0); -} - -static void check_c_copy_same_file(void **state) -{ - int rc; - - (void) state; /* unused */ - - rc = c_copy(check_src_file, check_src_file, 0644); - assert_int_equal(rc, -1); -} - -static void check_c_copy_isdir(void **state) -{ - int rc; - - (void) state; /* unused */ - - rc = c_copy(check_src_file, check_dir, 0644); - assert_int_equal(rc, -1); - assert_int_equal(errno, EISDIR); - - rc = c_copy(check_dir, check_dst_file, 0644); - assert_int_equal(rc, -1); - assert_int_equal(errno, ENOENT); -} - -static void check_c_compare_file(void **state) -{ - int rc; - (void) state; - - rc = c_copy(check_src_file, check_dst_file, 0644); - assert_int_equal(rc, 0); - - rc = c_compare_file( check_src_file, check_dst_file ); - assert_int_equal(rc, 1); - - /* Check error conditions */ - rc = c_compare_file( NULL, check_dst_file ); - assert_int_equal(rc, -1); - rc = c_compare_file( check_dst_file, NULL ); - assert_int_equal(rc, -1); - rc = c_compare_file( NULL, NULL ); - assert_int_equal(rc, -1); - - rc = c_compare_file( check_src_file, "/I_do_not_exist_in_the_filesystem.dummy"); - assert_int_equal(rc, -1); - rc = c_compare_file( "/I_do_not_exist_in_the_filesystem.dummy", check_dst_file); - assert_int_equal(rc, -1); - - rc = system("echo \"hallo42\" > /tmp/check/foo.txt"); - assert_int_equal(rc, 0); - rc = system("echo \"hallo52\" > /tmp/check/bar.txt"); - assert_int_equal(rc, 0); - rc = c_compare_file( check_src_file, check_dst_file ); - assert_int_equal(rc, 0); - - /* Create two 1MB random files */ - rc = system("dd if=/dev/urandom of=/tmp/check/foo.txt bs=1024 count=1024"); - assert_int_equal(rc, 0); - rc = system("dd if=/dev/urandom of=/tmp/check/bar.txt bs=1024 count=1024"); - assert_int_equal(rc, 0); - rc = c_compare_file( check_src_file, check_dst_file ); - assert_int_equal(rc, 0); - - /* Create two 1MB random files with different size */ - rc = system("dd if=/dev/urandom of=/tmp/check/foo.txt bs=1024 count=1024"); - assert_int_equal(rc, 0); - rc = system("dd if=/dev/urandom of=/tmp/check/bar.txt bs=1024 count=1020"); - assert_int_equal(rc, 0); - rc = c_compare_file( check_src_file, check_dst_file ); - assert_int_equal(rc, 0); - - /* compare two big files which are equal */ - rc = c_copy(check_src_file, check_dst_file, 0644); - assert_int_equal(rc, 0); - - rc = c_compare_file( check_src_file, check_dst_file ); - assert_int_equal(rc, 1); -} - -int torture_run_tests(void) -{ - const UnitTest tests[] = { - unit_test_setup_teardown(check_c_copy, setup, teardown), - unit_test(check_c_copy_same_file), - unit_test_setup_teardown(check_c_copy_isdir, setup, teardown), - unit_test_setup_teardown(check_c_compare_file, setup, teardown), - }; - - return run_tests(tests); -} - diff --git a/csync/tests/std_tests/check_std_c_path.c b/csync/tests/std_tests/check_std_c_path.c index bf5db11f6..208a0b90a 100644 --- a/csync/tests/std_tests/check_std_c_path.c +++ b/csync/tests/std_tests/check_std_c_path.c @@ -130,32 +130,6 @@ static void check_c_dirname_uri(void **state) free(dname); } -static void check_c_tmpname(void **state) -{ - char tmpl[22]={0}; - char prev[22]={0}; - char *tmp; - int i = 0; - - (void) state; /* unused */ - - srand((unsigned)time(NULL)); - - /* remember the last random value and compare the new one against. - * They may never be the same. */ - for(i = 0; i < 100; i++){ - strcpy(tmpl, "check_tmpname.XXXXXX"); - tmp = c_tmpname(tmpl); - assert_non_null(tmp); - - if (strlen(prev)) { - assert_string_not_equal(tmp, prev); - } - strcpy(prev, tmp); - SAFE_FREE(tmp); - } -} - static void check_c_parse_uri(void **state) { const char *test_scheme = "git+ssh"; @@ -204,7 +178,6 @@ int torture_run_tests(void) unit_test(check_c_dirname), unit_test(check_c_dirname_uri), unit_test(check_c_parse_uri), - unit_test(check_c_tmpname), }; return run_tests(tests); diff --git a/csync/tests/std_tests/check_std_c_str.c b/csync/tests/std_tests/check_std_c_str.c index 723dd3e94..08cb1aac7 100644 --- a/csync/tests/std_tests/check_std_c_str.c +++ b/csync/tests/std_tests/check_std_c_str.c @@ -113,85 +113,6 @@ static void check_c_strlist_expand(void **state) c_strlist_destroy(strlist); } -static void check_c_strreplace(void **state) -{ - char *str = strdup("/home/%(USER)"); - - (void) state; /* unused */ - - str = c_strreplace(str, "%(USER)", "csync"); - assert_string_equal(str, "/home/csync"); - - free(str); -} - -static void check_c_lowercase(void **state) -{ - char *str; - - (void) state; /* unused */ - - str = c_lowercase("LoWeRcASE"); - assert_string_equal(str, "lowercase"); - - free(str); -} - -static void check_c_lowercase_empty(void **state) -{ - char *str; - - (void) state; /* unused */ - - str = c_lowercase(""); - assert_string_equal(str, ""); - - free(str); -} - -static void check_c_lowercase_null(void **state) -{ - char *str; - - (void) state; /* unused */ - - str = c_lowercase(NULL); - assert_null(str); -} - -static void check_c_uppercase(void **state) -{ - char *str; - - (void) state; /* unused */ - - str = c_uppercase("upperCASE"); - assert_string_equal(str, "UPPERCASE"); - - free(str); -} - -static void check_c_uppercase_empty(void **state) -{ - char *str; - - (void) state; /* unused */ - - str = c_uppercase(""); - assert_string_equal(str, ""); - - free(str); -} - -static void check_c_uppercase_null(void **state) -{ - char *str; - - (void) state; /* unused */ - - str = c_uppercase(NULL); - assert_null(str); -} int torture_run_tests(void) @@ -203,13 +124,6 @@ int torture_run_tests(void) unit_test(check_c_strlist_new), unit_test(check_c_strlist_add), unit_test(check_c_strlist_expand), - unit_test(check_c_strreplace), - unit_test(check_c_lowercase), - unit_test(check_c_lowercase_empty), - unit_test(check_c_lowercase_null), - unit_test(check_c_uppercase), - unit_test(check_c_uppercase_empty), - unit_test(check_c_uppercase_null), }; return run_tests(tests);