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/