misc.c | misc.c | |||
---|---|---|---|---|
/* | /* | |||
* misc.c - useful client functions | * misc.c - useful client functions | |||
* | * | |||
* This file is part of the SSH Library | * This file is part of the SSH Library | |||
* | * | |||
* Copyright (c) 2003 by Aris Adamantiadis | * Copyright (c) 2003-2009 by Aris Adamantiadis | |||
* Copyright (c) 2008-2009 by Andreas Schneider <mail@cynapses.org> | * Copyright (c) 2008-2009 by Andreas Schneider <mail@cynapses.org> | |||
* | * | |||
* The SSH Library is free software; you can redistribute it and/or modify | * The SSH 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 | * 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 | * the Free Software Foundation; either version 2.1 of the License, or (at your | |||
* option) any later version. | * option) any later version. | |||
* | * | |||
* The SSH Library is distributed in the hope that it will be useful, but | * The SSH Library is distributed in the hope that it will be useful, but | |||
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILI TY | * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILI TY | |||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public | * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public | |||
* License for more details. | * License for more details. | |||
* | * | |||
* You should have received a copy of the GNU Lesser General Public License | * You should have received a copy of the GNU Lesser General Public License | |||
* along with the SSH Library; see the file COPYING. If not, write to | * along with the SSH Library; see the file COPYING. If not, write to | |||
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, | * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, | |||
* MA 02111-1307, USA. | * MA 02111-1307, USA. | |||
*/ | */ | |||
#include "config.h" | ||||
#include <limits.h> | #include <limits.h> | |||
#include <stdio.h> | #include <stdio.h> | |||
#include <unistd.h> | ||||
#include <string.h> | #include <string.h> | |||
#include <stdlib.h> | #include <stdlib.h> | |||
#include <sys/stat.h> | #include <sys/stat.h> | |||
#include <sys/types.h> | #include <sys/types.h> | |||
#include "config.h" | ||||
#ifdef _WIN32 | #ifdef _WIN32 | |||
#define _WIN32_IE 0x0400 //SHGetSpecialFolderPath | #define _WIN32_IE 0x0501 //SHGetSpecialFolderPath | |||
#include <winsock2.h> // Must be the first to include | ||||
#include <shlobj.h> | #include <shlobj.h> | |||
#include <winsock2.h> | ||||
#include <direct.h> | #include <direct.h> | |||
#else | #else | |||
#include <pwd.h> | #include <pwd.h> | |||
#include <arpa/inet.h> | #include <arpa/inet.h> | |||
#endif | #endif | |||
#include "libssh/priv.h" | #include "libssh/priv.h" | |||
#include "libssh/misc.h" | ||||
#ifdef HAVE_LIBGCRYPT | #ifdef HAVE_LIBGCRYPT | |||
#define GCRYPT_STRING "/gnutls" | #define GCRYPT_STRING "/gnutls" | |||
#else | #else | |||
#define GCRYPT_STRING "" | #define GCRYPT_STRING "" | |||
#endif | #endif | |||
#ifdef HAVE_LIBCRYPTO | #ifdef HAVE_LIBCRYPTO | |||
#define CRYPTO_STRING "/openssl" | #define CRYPTO_STRING "/openssl" | |||
#else | #else | |||
skipping to change at line 72 | skipping to change at line 72 | |||
#define LIBZ_STRING "" | #define LIBZ_STRING "" | |||
#endif | #endif | |||
/** \defgroup ssh_misc SSH Misc | /** \defgroup ssh_misc SSH Misc | |||
* \brief Misc functions | * \brief Misc functions | |||
*/ | */ | |||
/** \addtogroup ssh_misc | /** \addtogroup ssh_misc | |||
* @{ */ | * @{ */ | |||
#ifdef _WIN32 | #ifdef _WIN32 | |||
char *ssh_get_user_home_dir(void) { | char *ssh_get_user_home_dir(void) { | |||
static char szPath[MAX_PATH] = {0}; | char tmp[MAX_PATH] = {0}; | |||
char *szPath = NULL; | ||||
if (SHGetSpecialFolderPathA(NULL, tmp, CSIDL_PROFILE, TRUE)) { | ||||
szPath = malloc(strlen(tmp) + 1); | ||||
if (szPath == NULL) { | ||||
return NULL; | ||||
} | ||||
if (SHGetSpecialFolderPathA(NULL, szPath, CSIDL_PROFILE, TRUE)) { | strcpy(szPath, tmp); | |||
return szPath; | return szPath; | |||
} | } | |||
return NULL; | return NULL; | |||
} | } | |||
#else /* _WIN32 */ | ||||
/* we have read access on file */ | ||||
int ssh_file_readaccess_ok(const char *file) { | ||||
if (_access(file, 4) < 0) { | ||||
return 0; | ||||
} | ||||
return 1; | ||||
} | ||||
#define SSH_USEC_IN_SEC 1000000LL | ||||
#define SSH_SECONDS_SINCE_1601 11644473600LL | ||||
int gettimeofday(struct timeval *__p, void *__t) { | ||||
union { | ||||
unsigned long long ns100; /* time since 1 Jan 1601 in 100ns units */ | ||||
FILETIME ft; | ||||
} now; | ||||
GetSystemTimeAsFileTime (&now.ft); | ||||
__p->tv_usec = (long) ((now.ns100 / 10LL) % SSH_USEC_IN_SEC); | ||||
__p->tv_sec = (long)(((now.ns100 / 10LL ) / SSH_USEC_IN_SEC) - SSH_SECON | ||||
DS_SINCE_1601); | ||||
return (0); | ||||
} | ||||
#else /* _WIN32 */ | ||||
char *ssh_get_user_home_dir(void) { | char *ssh_get_user_home_dir(void) { | |||
static char szPath[PATH_MAX] = {0}; | char *szPath = NULL; | |||
struct passwd *pwd = NULL; | struct passwd *pwd = NULL; | |||
pwd = getpwuid(getuid()); | pwd = getpwuid(getuid()); | |||
if (pwd == NULL) { | if (pwd == NULL) { | |||
return NULL; | return NULL; | |||
} | } | |||
snprintf(szPath, PATH_MAX - 1, "%s", pwd->pw_dir); | szPath = strdup(pwd->pw_dir); | |||
return szPath; | return szPath; | |||
} | } | |||
#endif | ||||
/* we have read access on file */ | /* we have read access on file */ | |||
int ssh_file_readaccess_ok(const char *file) { | int ssh_file_readaccess_ok(const char *file) { | |||
if (access(file, R_OK) < 0) { | if (access(file, R_OK) < 0) { | |||
return 0; | return 0; | |||
} | } | |||
return 1; | return 1; | |||
} | } | |||
#endif | ||||
u64 ntohll(u64 a) { | uint64_t ntohll(uint64_t a) { | |||
#ifdef WORDS_BIGENDIAN | #ifdef WORDS_BIGENDIAN | |||
return a; | return a; | |||
#else | #else | |||
u32 low = a & 0xffffffff; | uint32_t low = (uint32_t)(a & 0xffffffff); | |||
u32 high = a >> 32 ; | uint32_t high = (uint32_t)(a >> 32); | |||
low = ntohl(low); | low = ntohl(low); | |||
high = ntohl(high); | high = ntohl(high); | |||
return ((((u64) low) << 32) | ( high)); | return ((((uint64_t) low) << 32) | ( high)); | |||
#endif | #endif | |||
} | } | |||
/** | /** | |||
* @brief Check if libssh is the required version or get the version | * @brief Check if libssh is the required version or get the version | |||
* string. | * string. | |||
* | * | |||
* @param req_version The version required. | * @param req_version The version required. | |||
* | * | |||
* @return If the version of libssh is newer than the version | * @return If the version of libssh is newer than the version | |||
skipping to change at line 154 | skipping to change at line 183 | |||
*/ | */ | |||
const char *ssh_version(int req_version) { | const char *ssh_version(int req_version) { | |||
if (req_version <= LIBSSH_VERSION_INT) { | if (req_version <= LIBSSH_VERSION_INT) { | |||
return SSH_STRINGIFY(LIBSSH_VERSION) GCRYPT_STRING CRYPTO_STRING | return SSH_STRINGIFY(LIBSSH_VERSION) GCRYPT_STRING CRYPTO_STRING | |||
LIBZ_STRING; | LIBZ_STRING; | |||
} | } | |||
return NULL; | return NULL; | |||
} | } | |||
struct ssh_list *ssh_list_new(){ | ||||
struct ssh_list *ret=malloc(sizeof(struct ssh_list)); | ||||
if(!ret) | ||||
return NULL; | ||||
ret->root=ret->end=NULL; | ||||
return ret; | ||||
} | ||||
void ssh_list_free(struct ssh_list *list){ | ||||
struct ssh_iterator *ptr,*next; | ||||
ptr=list->root; | ||||
while(ptr){ | ||||
next=ptr->next; | ||||
SAFE_FREE(ptr); | ||||
ptr=next; | ||||
} | ||||
SAFE_FREE(list); | ||||
} | ||||
struct ssh_iterator *ssh_list_get_iterator(const struct ssh_list *list){ | ||||
return list->root; | ||||
} | ||||
static struct ssh_iterator *ssh_iterator_new(const void *data){ | ||||
struct ssh_iterator *iterator=malloc(sizeof(struct ssh_iterator)); | ||||
if(!iterator) | ||||
return NULL; | ||||
iterator->next=NULL; | ||||
iterator->data=data; | ||||
return iterator; | ||||
} | ||||
int ssh_list_add(struct ssh_list *list,const void *data){ | ||||
struct ssh_iterator *iterator=ssh_iterator_new(data); | ||||
if(!iterator) | ||||
return SSH_ERROR; | ||||
if(!list->end){ | ||||
/* list is empty */ | ||||
list->root=list->end=iterator; | ||||
} else { | ||||
/* put it on end of list */ | ||||
list->end->next=iterator; | ||||
list->end=iterator; | ||||
} | ||||
return SSH_OK; | ||||
} | ||||
void ssh_list_remove(struct ssh_list *list, struct ssh_iterator *iterator){ | ||||
struct ssh_iterator *ptr,*prev; | ||||
prev=NULL; | ||||
ptr=list->root; | ||||
while(ptr && ptr != iterator){ | ||||
prev=ptr; | ||||
ptr=ptr->next; | ||||
} | ||||
if(!ptr){ | ||||
/* we did not find the element */ | ||||
return; | ||||
} | ||||
/* unlink it */ | ||||
if(prev) | ||||
prev->next=ptr->next; | ||||
/* if iterator was the head */ | ||||
if(list->root == iterator) | ||||
list->root=iterator->next; | ||||
/* if iterator was the tail */ | ||||
if(list->end == iterator) | ||||
list->end = prev; | ||||
SAFE_FREE(iterator); | ||||
} | ||||
const void *_ssh_list_get_head(struct ssh_list *list){ | ||||
struct ssh_iterator *iterator=list->root; | ||||
const void *data; | ||||
if(!list->root) | ||||
return NULL; | ||||
data=iterator->data; | ||||
list->root=iterator->next; | ||||
if(list->end==iterator) | ||||
list->end=NULL; | ||||
SAFE_FREE(iterator); | ||||
return data; | ||||
} | ||||
/** | /** | |||
* @brief Parse directory component. | * @brief Parse directory component. | |||
* | * | |||
* dirname breaks a null-terminated pathname string into a directory compon ent. | * dirname breaks a null-terminated pathname string into a directory compon ent. | |||
* In the usual case, ssh_dirname() returns the string up to, but not inclu ding, | * In the usual case, ssh_dirname() returns the string up to, but not inclu ding, | |||
* the final '/'. Trailing '/' characters are not counted as part of the | * the final '/'. Trailing '/' characters are not counted as part of the | |||
* pathname. The caller must free the memory. | * pathname. The caller must free the memory. | |||
* | * | |||
* @param path The path to parse. | * @param path The path to parse. | |||
* | * | |||
End of changes. 20 change blocks. | ||||
18 lines changed or deleted | 132 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |