Make roken build on windows

Signed-off-by: Love Hornquist Astrand <lha@h5l.org>
This commit is contained in:
Asanka Herath
2009-11-24 21:42:02 -08:00
committed by Love Hornquist Astrand
parent c4b95f7330
commit d00f9984a5
168 changed files with 3688 additions and 607 deletions

View File

@@ -329,7 +329,7 @@ main(int argc, char **argv)
#endif #endif
if(interactive_flag) if(interactive_flag)
mini_inetd (port); mini_inetd(port, NULL);
/* /*
* LOG_NDELAY sets up the logging connection immediately, * LOG_NDELAY sets up the logging connection immediately,

View File

@@ -1252,7 +1252,7 @@ main(int argc, char **argv)
err(1, "error opening %s", lf); err(1, "error opening %s", lf);
} }
mini_inetd(htons(port)); mini_inetd(htons(port), NULL);
fprintf(logfile, "connected\n"); fprintf(logfile, "connected\n");
{ {

View File

@@ -284,7 +284,7 @@ static int
doit (int port, const char *service) doit (int port, const char *service)
{ {
if (do_inetd) if (do_inetd)
mini_inetd(port); mini_inetd(port, NULL);
return proto (STDIN_FILENO, service); return proto (STDIN_FILENO, service);
} }

View File

@@ -772,7 +772,7 @@ main (int argc, char **argv)
} }
if (!inetd_flag) if (!inetd_flag)
mini_inetd (port); mini_inetd (port, NULL);
signal (SIGCHLD, childhandler); signal (SIGCHLD, childhandler);
return doit(STDIN_FILENO, tcp_flag); return doit(STDIN_FILENO, tcp_flag);

View File

@@ -301,7 +301,7 @@ pop_init(POP *p,int argcount,char **argmessage)
portnum = p->kerberosp ? portnum = p->kerberosp ?
pop_getportbyname(p, "kpop", "tcp", 1109) : pop_getportbyname(p, "kpop", "tcp", 1109) :
pop_getportbyname(p, "pop", "tcp", 110); pop_getportbyname(p, "pop", "tcp", 110);
mini_inetd (portnum); mini_inetd (portnum, NULL);
} }
/* Get the address and socket of the client to whom I am speaking */ /* Get the address and socket of the client to whom I am speaking */

View File

@@ -961,7 +961,7 @@ main(int argc, char **argv)
errx (1, "getaddrinfo: %s", gai_strerror (error)); errx (1, "getaddrinfo: %s", gai_strerror (error));
} }
} }
mini_inetd_addrinfo (ai); mini_inetd_addrinfo (ai, NULL);
freeaddrinfo(ai); freeaddrinfo(ai);
} }

View File

@@ -370,7 +370,7 @@ main(int argc, char **argv)
port = k_getportbyname("telnet", "tcp", htons(23)); port = k_getportbyname("telnet", "tcp", htons(23));
#endif #endif
} }
mini_inetd (port); mini_inetd (port, NULL);
} else if (argc > 0) { } else if (argc > 0) {
usage(1); usage(1);
/* NOT REACHED */ /* NOT REACHED */

View File

@@ -155,7 +155,7 @@ proto (int sock, const char *service)
static int static int
doit (int port, const char *service) doit (int port, const char *service)
{ {
mini_inetd (port); mini_inetd (port, NULL);
return proto (STDIN_FILENO, service); return proto (STDIN_FILENO, service);
} }

View File

@@ -168,7 +168,7 @@ main(int argc, char **argv)
"tcp", 749); "tcp", 749);
else else
debug_port = htons(atoi(port_str)); debug_port = htons(atoi(port_str));
mini_inetd(debug_port); mini_inetd(debug_port, NULL);
} else { } else {
struct sockaddr_storage __ss; struct sockaddr_storage __ss;
struct sockaddr *sa = (struct sockaddr *)&__ss; struct sockaddr *sa = (struct sockaddr *)&__ss;

View File

@@ -133,7 +133,7 @@ main(int argc, char **argv)
} }
if (!inetd_flag) { if (!inetd_flag) {
mini_inetd (krb5_getportbyname (context, "hprop", "tcp", mini_inetd (krb5_getportbyname (context, "hprop", "tcp",
HPROP_PORT)); HPROP_PORT), NULL);
} }
sin_len = sizeof(ss); sin_len = sizeof(ss);
if(getpeername(fd, sa, &sin_len) < 0) if(getpeername(fd, sa, &sin_len) < 0)

View File

@@ -132,7 +132,6 @@ check_directory(krb5_context context,
if((d = opendir(dirname)) == NULL) if((d = opendir(dirname)) == NULL)
return errno; return errno;
#ifdef HAVE_DIRFD
{ {
int fd; int fd;
struct stat st2; struct stat st2;
@@ -147,7 +146,6 @@ check_directory(krb5_context context,
return EACCES; return EACCES;
} }
} }
#endif
while((dent = readdir(d)) != NULL) { while((dent = readdir(d)) != NULL) {
if(strcmp(dent->d_name, ".") == 0 || if(strcmp(dent->d_name, ".") == 0 ||

View File

@@ -79,7 +79,7 @@ libroken_la_OBJS = \
$(OBJ)\resolve.obj \ $(OBJ)\resolve.obj \
$(OBJ)\roken_gethostby.obj \ $(OBJ)\roken_gethostby.obj \
$(OBJ)\rtbl.obj \ $(OBJ)\rtbl.obj \
$(OBJ)\sendmsg_w32.obj \ $(OBJ)\sendmsg.obj \
$(OBJ)\setenv.obj \ $(OBJ)\setenv.obj \
$(OBJ)\setprogname.obj \ $(OBJ)\setprogname.obj \
$(OBJ)\simple_exec_w32.obj \ $(OBJ)\simple_exec_w32.obj \

View File

@@ -51,7 +51,7 @@ pos(char c)
return -1; return -1;
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
base64_encode(const void *data, int size, char **str) base64_encode(const void *data, int size, char **str)
{ {
char *s, *p; char *s, *p;
@@ -120,7 +120,7 @@ token_decode(const char *token)
return (marker << 24) | val; return (marker << 24) | val;
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
base64_decode(const char *str, void *data) base64_decode(const char *str, void *data)
{ {
const char *p; const char *p;

View File

@@ -38,16 +38,18 @@
#ifndef ROKEN_LIB_FUNCTION #ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32 #ifdef _WIN32
#define ROKEN_LIB_FUNCTION _stdcall #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL __cdecl
#else #else
#define ROKEN_LIB_FUNCTION #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif #endif
#endif #endif
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
base64_encode(const void *, int, char **); base64_encode(const void *, int, char **);
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
base64_decode(const char *, void *); base64_decode(const char *, void *);
#endif #endif

View File

@@ -36,7 +36,7 @@
#ifndef HAVE_BSWAP32 #ifndef HAVE_BSWAP32
unsigned int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION unsigned int ROKEN_LIB_CALL
bswap32 (unsigned int val) bswap32 (unsigned int val)
{ {
return (val & 0xff) << 24 | return (val & 0xff) << 24 |
@@ -48,7 +48,7 @@ bswap32 (unsigned int val)
#ifndef HAVE_BSWAP16 #ifndef HAVE_BSWAP16
unsigned short ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION unsigned short ROKEN_LIB_CALL
bswap16 (unsigned short val) bswap16 (unsigned short val)
{ {
return (val & 0xff) << 8 | return (val & 0xff) << 8 |

View File

@@ -35,7 +35,7 @@
#include "roken.h" #include "roken.h"
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
chown(const char *path, uid_t owner, gid_t group) chown(const char *path, uid_t owner, gid_t group)
{ {
return 0; return 0;

View File

@@ -33,14 +33,12 @@
#include <config.h> #include <config.h>
#include <unistd.h>
#include <fcntl.h>
#include "roken.h" #include "roken.h"
void ROKEN_LIB_FUNCTION void ROKEN_LIB_FUNCTION
rk_cloexec(int fd) rk_cloexec(int fd)
{ {
#ifdef HAVE_FCNTL
int ret; int ret;
ret = fcntl(fd, F_GETFD); ret = fcntl(fd, F_GETFD);
@@ -48,10 +46,13 @@ rk_cloexec(int fd)
return; return;
if (fcntl(fd, F_SETFD, ret | FD_CLOEXEC) == -1) if (fcntl(fd, F_SETFD, ret | FD_CLOEXEC) == -1)
return; return;
#endif
} }
void ROKEN_LIB_FUNCTION void ROKEN_LIB_FUNCTION
rk_cloexec_file(FILE *f) rk_cloexec_file(FILE *f)
{ {
#ifdef HAVE_FCNTL
rk_cloexec(fileno(f)); rk_cloexec(fileno(f));
#endif
} }

View File

@@ -42,7 +42,7 @@
#include "roken.h" #include "roken.h"
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
closefrom(int fd) closefrom(int fd)
{ {
int num = getdtablesize(); int num = getdtablesize();

View File

@@ -35,7 +35,7 @@
#include "roken.h" #include "roken.h"
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
roken_concat (char *s, size_t len, ...) roken_concat (char *s, size_t len, ...)
{ {
int ret; int ret;
@@ -47,7 +47,7 @@ roken_concat (char *s, size_t len, ...)
return ret; return ret;
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
roken_vconcat (char *s, size_t len, va_list args) roken_vconcat (char *s, size_t len, va_list args)
{ {
const char *a; const char *a;
@@ -65,7 +65,7 @@ roken_vconcat (char *s, size_t len, va_list args)
return 0; return 0;
} }
size_t ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL
roken_vmconcat (char **s, size_t max_len, va_list args) roken_vmconcat (char **s, size_t max_len, va_list args)
{ {
const char *a; const char *a;
@@ -97,7 +97,7 @@ roken_vmconcat (char **s, size_t max_len, va_list args)
return len; return len;
} }
size_t ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL
roken_mconcat (char **s, size_t max_len, ...) roken_mconcat (char **s, size_t max_len, ...)
{ {
int ret; int ret;

View File

@@ -39,7 +39,7 @@
* return a malloced copy of `h' * return a malloced copy of `h'
*/ */
struct hostent * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION struct hostent * ROKEN_LIB_CALL
copyhostent (const struct hostent *h) copyhostent (const struct hostent *h)
{ {
struct hostent *res; struct hostent *res;

View File

@@ -47,7 +47,7 @@ static char sccsid[] = "@(#)daemon.c 8.1 (Berkeley) 6/4/93";
#include "roken.h" #include "roken.h"
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
daemon(int nochdir, int noclose) daemon(int nochdir, int noclose)
{ {
int fd; int fd;

278
lib/roken/dirent-test.c Normal file
View File

@@ -0,0 +1,278 @@
/***********************************************************************
* Copyright (c) 2009, Secure Endpoints Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
**********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <direct.h>
#include <errno.h>
#include <io.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include "dirent.h"
/* Note that we create a known directory structure in a subdirectory
of the current directory to run our tests. */
#define TESTDIR "dirent-test-dir"
const char * dir_entries[] = {
"A",
"B",
"C",
"CAA",
"CAAA",
"CABBBB",
"CAABBB.txt",
"A filename with spaces"
};
const char * entries_begin_with_C[] = {
"C",
"CAA",
"CAAA",
"CABBBB",
"CAABBB.txt"
};
const char * entries_end_with_A[] = {
"A",
"CAA",
"CAAA"
};
const int n_dir_entries = sizeof(dir_entries)/sizeof(dir_entries[0]);
int teardown_test(void);
void fail_test(const char * reason, ...)
{
va_list args;
va_start(args, reason);
vfprintf(stderr, reason, args);
va_end(args);
fprintf(stderr, " : errno = %d (%s)\n", errno, strerror(errno));
teardown_test();
abort();
}
void fail_test_nf(const char * format, ...)
{
va_list args;
fprintf(stderr, "FAIL:");
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
fprintf(stderr, " : errno = %d (%s)\n", errno, strerror(errno));
}
int touch(const char * filename)
{
int fd;
fd = _open(filename, _O_CREAT, _S_IREAD| _S_IWRITE);
if (fd == -1)
return -1;
return _close(fd);
}
int setup_test(void)
{
int i;
fprintf(stderr, "Creating test directory %s ...\n", TESTDIR);
if (_mkdir(TESTDIR))
fail_test("Can't create test directory \"" TESTDIR "\"");
if (_chdir(TESTDIR))
fail_test("Can't change to test directory");
for (i=0; i < n_dir_entries; i++) {
if (touch(dir_entries[i]))
fail_test("Can't create test file '%s'", dir_entries[i]);
}
fprintf(stderr, "Done with test setup.\n");
return 0;
}
int teardown_test(void)
{
char dirname[_MAX_PATH];
size_t len;
int i;
printf ("Begin cleanup...\n");
if (_getcwd(dirname, sizeof(dirname)/sizeof(char)) != NULL &&
(len = strlen(dirname)) > sizeof(TESTDIR)/sizeof(char) &&
!strcmp(dirname + len + 1 - sizeof(TESTDIR)/sizeof(char), TESTDIR)) {
/* fallthrough */
} else {
/* did we create the directory? */
if (!_rmdir( TESTDIR )) {
fprintf(stderr, "Removed test directory\n");
return 0;
} else {
if (errno == ENOTEMPTY) {
if (_chdir(TESTDIR)) {
fprintf(stderr, "Can't change to test directory. Aborting cleanup.\n");
return -1;
} else {
/* fallthrough */
}
} else {
return -1;
}
}
}
fprintf(stderr, "Cleaning up test directory %s ...\n", TESTDIR);
for (i=0; i < n_dir_entries; i++) {
if (_unlink(dir_entries[i])) {
/* if the test setup failed, we expect this to happen for
at least some files */
}
}
if (_chdir("..")) {
fprintf(stderr, "Can't escape test directory. Giving in.\n");
return -1;
}
if (_rmdir( TESTDIR )) {
fprintf(stderr, "Can't remove test directory.\n");
return -1;
}
printf("Cleaned up test directory\n");
return 0;
}
int check_list(const char * filespec, const char ** list, int n, int expect_dot_and_dotdot)
{
DIR * d;
struct dirent * e;
int n_found = 0;
int i;
int rv = 0;
int retry = 1;
d = opendir(filespec);
if (d == NULL) {
fail_test_nf("opendir failed for [%s]", filespec);
return -1;
}
printf("Checking filespec [%s]... ", filespec);
retry:
while ((e = readdir(d)) != NULL) {
n_found ++;
if (expect_dot_and_dotdot &&
(!strcmp(e->d_name, ".") ||
!strcmp(e->d_name, "..")))
continue;
for (i=0; i < n; i++) {
if (!strcmp(list[i], e->d_name))
break;
}
if (i == n) {
fail_test_nf("Found unexpected entry [%s]", e->d_name);
rv = -1;
}
}
if (n_found != n) {
fail_test_nf("Unexpected number of entries [%d]. Expected %d", n_found, n);
rv = -1;
}
if (retry) {
retry = 0;
n_found = 0;
rewinddir(d);
goto retry;
}
if (closedir(d)) {
fail_test_nf("closedir() failed");
}
printf("done\n");
return rv;
}
int run_tests()
{
/* assumes that the test directory has been set up and we have
changed into the test directory. */
check_list("*", dir_entries, n_dir_entries + 2, 1);
check_list("*.*", dir_entries, n_dir_entries + 2, 1);
check_list("C*", entries_begin_with_C, sizeof(entries_begin_with_C)/sizeof(entries_begin_with_C[0]), 0);
check_list("*A", entries_end_with_A, sizeof(entries_end_with_A)/sizeof(entries_end_with_A[0]), 0);
return 0;
}
int main(int argc, char ** argv)
{
if (setup_test())
return 1;
run_tests();
teardown_test();
return 0;
}

180
lib/roken/dirent.c Normal file
View File

@@ -0,0 +1,180 @@
/***********************************************************************
* Copyright (c) 2009, Secure Endpoints Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
**********************************************************************/
#ifdef HAVE_CONFIG_H
#include<config.h>
#endif
#include <stdlib.h>
#include <io.h>
#include <string.h>
#include <errno.h>
#include "dirent.h"
#ifndef _WIN32
#error Only implemented for Win32
#endif
struct _dirent_dirinfo {
int magic;
long n_entries;
long nc_entries;
long cursor;
struct dirent **entries;
};
#define DIRINFO_MAGIC 0xf8c0639d
#define IS_DP(p) ((p) && ((DIR *)(p))->magic == DIRINFO_MAGIC)
#define INITIAL_ENTRIES 16
ROKEN_LIB_FUNCTION DIR * ROKEN_LIB_CALL
opendir(const char * filespec)
{
DIR * dp;
struct _finddata_t fd;
intptr_t fd_handle;
memset(&fd, 0, sizeof(fd));
fd_handle = _findfirst(filespec, &fd);
if (fd_handle == -1)
return NULL;
dp = malloc(sizeof(*dp));
if (dp == NULL)
goto done;
memset(dp, 0, sizeof(*dp));
dp->magic = DIRINFO_MAGIC;
dp->cursor = 0;
dp->n_entries = 0;
dp->nc_entries = INITIAL_ENTRIES;
dp->entries = calloc(dp->nc_entries, sizeof(dp->entries[0]));
if (dp->entries == NULL) {
closedir(dp);
dp = NULL;
goto done;
}
do {
long len = strlen(fd.name);
struct dirent * e;
if (dp->n_entries == dp->nc_entries) {
struct dirent ** ne;
dp->nc_entries *= 2;
ne = realloc(dp->entries, sizeof(dp->entries[0]) * dp->nc_entries);
if (ne == NULL) {
closedir(dp);
dp = NULL;
goto done;
}
dp->entries = ne;
}
e = malloc(sizeof(*e) + len * sizeof(char));
if (e == NULL) {
closedir(dp);
dp = NULL;
goto done;
}
e->d_ino = 0; /* no inodes :( */
strcpy_s(e->d_name, len + 1, fd.name);
dp->entries[dp->n_entries++] = e;
} while (_findnext(fd_handle, &fd) == 0);
done:
if (fd_handle != -1)
_findclose(fd_handle);
return dp;
}
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
closedir(DIR * dp)
{
if (!IS_DP(dp))
return EINVAL;
if (dp->entries) {
long i;
for (i=0; i < dp->n_entries; i++) {
free(dp->entries[i]);
}
free(dp->entries);
}
free(dp);
return 0;
}
ROKEN_LIB_FUNCTION struct dirent * ROKEN_LIB_CALL
readdir(DIR * dp)
{
if (!IS_DP(dp) ||
dp->cursor < 0 ||
dp->cursor >= dp->n_entries)
return NULL;
return dp->entries[dp->cursor++];
}
ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
rewinddir(DIR * dp)
{
if (IS_DP(dp))
dp->cursor = 0;
}
ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
seekdir(DIR * dp, long offset)
{
if (IS_DP(dp) && offset >= 0 && offset < dp->n_entries)
dp->cursor = offset;
}
ROKEN_LIB_FUNCTION long ROKEN_LIB_CALL
telldir(DIR * dp)
{
return dp->cursor;
}

66
lib/roken/dirent.hin Normal file
View File

@@ -0,0 +1,66 @@
/***********************************************************************
* Copyright (c) 2009, Secure Endpoints Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
**********************************************************************/
#ifndef __DIRENT_H__
#define __DIRENT_H__
#ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32
#define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL __cdecl
#else
#define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif
#endif
#include<sys/types.h>
struct dirent {
ino_t d_ino;
char d_name[1];
};
typedef struct _dirent_dirinfo DIR;
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL closedir(DIR *);
ROKEN_LIB_FUNCTION DIR * ROKEN_LIB_CALL opendir(const char *);
ROKEN_LIB_FUNCTION struct dirent * ROKEN_LIB_CALL readdir(DIR *);
ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL rewinddir(DIR *);
ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL seekdir(DIR *, long);
ROKEN_LIB_FUNCTION long ROKEN_LIB_CALL telldir(DIR *);
#endif

78
lib/roken/dlfcn.h Normal file
View File

@@ -0,0 +1,78 @@
/***********************************************************************
* Copyright (c) 2009, Secure Endpoints Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
**********************************************************************/
#ifndef __dlfcn_h__
#define __dlfcn_h__
#ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32
#define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL __cdecl
#else
#define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif
#endif
#define DLSYM_RET_TYPE void *
#ifdef __cplusplus
extern "C"
#endif
/* Implementation based on
http://www.opengroup.org/onlinepubs/009695399/basedefs/dlfcn.h.html */
#define RTLD_LAZY (1<<0)
#define RTLD_NOW (1<<1)
#define RTLD_GLOBAL (1<<2)
#define RTLD_LOCAL (1<<3)
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
dlclose(void *);
ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
dlerror(void);
ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
dlopen(const char *, int);
ROKEN_LIB_FUNCTION DLSYM_RET_TYPE ROKEN_LIB_CALL
dlsym(void *, const char *);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* __dlfcn_h__ */

96
lib/roken/dlfcn_w32.c Normal file
View File

@@ -0,0 +1,96 @@
/***********************************************************************
* Copyright (c) 2009, Secure Endpoints Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
**********************************************************************/
#include <windows.h>
#include <dlfcn.h>
#include <strsafe.h>
#define ERR_STR_LEN 256
__declspec(thread) static char err_str[ERR_STR_LEN];
static void set_error(const char * e) {
StringCbCopy(err_str, sizeof(err_str), e);
}
static void set_error_from_last(void) {
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
0, GetLastError(), 0,
err_str, sizeof(err_str)/sizeof(err_str[0]),
NULL);
}
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
dlclose(void * vhm)
{
BOOL brv;
brv = FreeLibrary((HMODULE) vhm);
if (!brv) {
set_error_from_last();
}
return !brv;
}
ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
dlerror(void)
{
return err_str;
}
ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
dlopen(const char *fn, int flags)
{
HMODULE hm;
/* We don't support dlopen(0, ...) on Windows.*/
if ( fn == NULL ) {
set_error("Not implemented");
return NULL;
}
hm = LoadLibrary(fn);
if (hm == NULL) {
set_error_from_last();
}
return (void *) hm;
}
ROKEN_LIB_FUNCTION DLSYM_RET_TYPE ROKEN_LIB_CALL
dlsym(void * vhm, const char * func_name)
{
HMODULE hm = (HMODULE) vhm;
return GetProcAddress(hm, func_name);
}

View File

@@ -33,15 +33,13 @@
#include <config.h> #include <config.h>
#include <unistd.h>
#include "roken.h" #include "roken.h"
/* /*
* Write datablob to a filename, don't care about errors. * Write datablob to a filename, don't care about errors.
*/ */
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
rk_dumpdata (const char *filename, const void *buf, size_t size) rk_dumpdata (const char *filename, const void *buf, size_t size)
{ {
int fd; int fd;
@@ -57,7 +55,7 @@ rk_dumpdata (const char *filename, const void *buf, size_t size)
* Read all data from a filename, care about errors. * Read all data from a filename, care about errors.
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
rk_undumpdata(const char *filename, void **buf, size_t *size) rk_undumpdata(const char *filename, void **buf, size_t *size)
{ {
struct stat sb; struct stat sb;

View File

@@ -42,7 +42,7 @@
* Like calloc but never fails. * Like calloc but never fails.
*/ */
void * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
ecalloc (size_t number, size_t size) ecalloc (size_t number, size_t size)
{ {
void *tmp = calloc (number, size); void *tmp = calloc (number, size);

View File

@@ -42,7 +42,7 @@
* Like malloc but never fails. * Like malloc but never fails.
*/ */
void * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
emalloc (size_t sz) emalloc (size_t sz)
{ {
void *tmp = malloc (sz); void *tmp = malloc (sz);

View File

@@ -127,7 +127,7 @@ read_env_file(FILE *F, char ***env, int *assigned)
* list of malloced strings in `env' * list of malloced strings in `env'
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
read_environment(const char *file, char ***env) read_environment(const char *file, char ***env)
{ {
int assigned; int assigned;
@@ -141,7 +141,7 @@ read_environment(const char *file, char ***env)
return assigned; return assigned;
} }
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
free_environment(char **env) free_environment(char **env)
{ {
int i; int i;

View File

@@ -33,16 +33,13 @@
#include <config.h> #include <config.h>
#include <unistd.h>
#include <err.h>
#include "roken.h" #include "roken.h"
/* /*
* Like read but never fails (and never returns partial data). * Like read but never fails (and never returns partial data).
*/ */
ssize_t ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
eread (int fd, void *buf, size_t nbytes) eread (int fd, void *buf, size_t nbytes)
{ {
ssize_t ret; ssize_t ret;

View File

@@ -42,7 +42,7 @@
* Like realloc but never fails. * Like realloc but never fails.
*/ */
void * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void * ROKEN_LIB_CALL
erealloc (void *ptr, size_t sz) erealloc (void *ptr, size_t sz)
{ {
void *tmp = realloc (ptr, sz); void *tmp = realloc (ptr, sz);

View File

@@ -35,7 +35,7 @@
#include "err.h" #include "err.h"
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
err(int eval, const char *fmt, ...) err(int eval, const char *fmt, ...)
{ {
va_list ap; va_list ap;

View File

@@ -48,40 +48,42 @@
#ifndef ROKEN_LIB_FUNCTION #ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32 #ifdef _WIN32
#define ROKEN_LIB_FUNCTION _stdcall #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL __cdecl
#else #else
#define ROKEN_LIB_FUNCTION #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif #endif
#endif #endif
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
verr(int eval, const char *fmt, va_list ap) verr(int eval, const char *fmt, va_list ap)
__attribute__ ((noreturn, format (printf, 2, 0))); __attribute__ ((noreturn, format (printf, 2, 0)));
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
err(int eval, const char *fmt, ...) err(int eval, const char *fmt, ...)
__attribute__ ((noreturn, format (printf, 2, 3))); __attribute__ ((noreturn, format (printf, 2, 3)));
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
verrx(int eval, const char *fmt, va_list ap) verrx(int eval, const char *fmt, va_list ap)
__attribute__ ((noreturn, format (printf, 2, 0))); __attribute__ ((noreturn, format (printf, 2, 0)));
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
errx(int eval, const char *fmt, ...) errx(int eval, const char *fmt, ...)
__attribute__ ((noreturn, format (printf, 2, 3))); __attribute__ ((noreturn, format (printf, 2, 3)));
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
vwarn(const char *fmt, va_list ap) vwarn(const char *fmt, va_list ap)
__attribute__ ((format (printf, 1, 0))); __attribute__ ((format (printf, 1, 0)));
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
warn(const char *fmt, ...) warn(const char *fmt, ...)
__attribute__ ((format (printf, 1, 2))); __attribute__ ((format (printf, 1, 2)));
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
vwarnx(const char *fmt, va_list ap) vwarnx(const char *fmt, va_list ap)
__attribute__ ((format (printf, 1, 0))); __attribute__ ((format (printf, 1, 0)));
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
warnx(const char *fmt, ...) warnx(const char *fmt, ...)
__attribute__ ((format (printf, 1, 2))); __attribute__ ((format (printf, 1, 2)));

View File

@@ -35,7 +35,7 @@
#include "err.h" #include "err.h"
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
errx(int eval, const char *fmt, ...) errx(int eval, const char *fmt, ...)
{ {
va_list ap; va_list ap;

View File

@@ -37,7 +37,7 @@
#include <err.h> #include <err.h>
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
esetenv(const char *var, const char *val, int rewrite) esetenv(const char *var, const char *val, int rewrite)
{ {
if (setenv (rk_UNCONST(var), rk_UNCONST(val), rewrite)) if (setenv (rk_UNCONST(var), rk_UNCONST(val), rewrite))

View File

@@ -42,7 +42,7 @@
* Like strdup but never fails. * Like strdup but never fails.
*/ */
char * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
estrdup (const char *str) estrdup (const char *str)
{ {
char *tmp = strdup (str); char *tmp = strdup (str);

View File

@@ -33,16 +33,13 @@
#include <config.h> #include <config.h>
#include <unistd.h>
#include <err.h>
#include "roken.h" #include "roken.h"
/* /*
* Like write but never fails (and never returns partial data). * Like write but never fails (and never returns partial data).
*/ */
ssize_t ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
ewrite (int fd, const void *buf, size_t nbytes) ewrite (int fd, const void *buf, size_t nbytes)
{ {
ssize_t ret; ssize_t ret;

View File

@@ -35,7 +35,7 @@
#include "roken.h" #include "roken.h"
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
fchown(int fd, uid_t owner, gid_t group) fchown(int fd, uid_t owner, gid_t group)
{ {
return 0; return 0;

View File

@@ -37,11 +37,11 @@
#include "roken.h" #include "roken.h"
#define OP_MASK (LOCK_SH | LOCK_EX | LOCK_UN) #define OP_MASK (LOCK_SH | LOCK_EX | LOCK_UN)
int ROKEN_LIB_FUNCTION
rk_flock(int fd, int operation) ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
fk_flock(int fd, int operation)
{ {
#if defined(HAVE_FCNTL) && defined(F_SETLK) #if defined(HAVE_FCNTL) && defined(F_SETLK)
struct flock arg; struct flock arg;
@@ -75,6 +75,76 @@ rk_flock(int fd, int operation)
break; break;
} }
return code; return code;
#elif defined(_WIN32)
/* Windows */
#define FLOCK_OFFSET_LOW 0
#define FLOCK_OFFSET_HIGH 0
#define FLOCK_LENGTH_LOW 0x00000000
#define FLOCK_LENGTH_HIGH 0x80000000
HANDLE hFile;
OVERLAPPED ov;
BOOL rv = FALSE;
DWORD f = 0;
hFile = (HANDLE) _get_osfhandle(fd);
if (hFile == NULL || hFile == INVALID_HANDLE_VALUE) {
_set_errno(EBADF);
return -1;
}
ZeroMemory(&ov, sizeof(ov));
ov.hEvent = NULL;
ov.Offset = FLOCK_OFFSET_LOW;
ov.OffsetHigh = FLOCK_OFFSET_HIGH;
if (operation & LOCK_NB)
f = LOCKFILE_FAIL_IMMEDIATELY;
switch (operation & OP_MASK) {
case LOCK_UN: /* Unlock */
rv = UnlockFileEx(hFile, 0,
FLOCK_LENGTH_LOW, FLOCK_LENGTH_HIGH, &ov);
break;
case LOCK_SH: /* Shared lock */
rv = LockFileEx(hFile, f, 0,
FLOCK_LENGTH_LOW, FLOCK_LENGTH_HIGH, &ov);
break;
case LOCK_EX: /* Exclusive lock */
rv = LockFileEx(hFile, f|LOCKFILE_EXCLUSIVE_LOCK, 0,
FLOCK_LENGTH_LOW, FLOCK_LENGTH_HIGH,
&ov);
break;
default:
_set_errno(EINVAL);
return -1;
}
if (!rv) {
switch (GetLastError()) {
case ERROR_SHARING_VIOLATION:
case ERROR_LOCK_VIOLATION:
case ERROR_IO_PENDING:
_set_errno(EWOULDBLOCK);
break;
case ERROR_ACCESS_DENIED:
_set_errno(EACCES);
break;
default:
_set_errno(ENOLCK);
}
return -1;
}
return 0;
#else #else
return -1; return -1;
#endif #endif

View File

@@ -45,6 +45,12 @@ static char rcsid[] = "$NetBSD: fnmatch.c,v 1.11 1995/02/27 03:43:06 cgd Exp $";
* Compares a filename or pathname to a pattern. * Compares a filename or pathname to a pattern.
*/ */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <roken.h>
#include <fnmatch.h> #include <fnmatch.h>
#include <string.h> #include <string.h>
@@ -52,7 +58,7 @@ static char rcsid[] = "$NetBSD: fnmatch.c,v 1.11 1995/02/27 03:43:06 cgd Exp $";
static const char *rangematch (const char *, int, int); static const char *rangematch (const char *, int, int);
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
rk_fnmatch(const char *pattern, const char *string, int flags) rk_fnmatch(const char *pattern, const char *string, int flags)
{ {
const char *stringstart; const char *stringstart;

View File

@@ -36,9 +36,11 @@
#ifndef ROKEN_LIB_FUNCTION #ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32 #ifdef _WIN32
#define ROKEN_LIB_FUNCTION _stdcall #define ROKEN_LIB_FUNCTION __declspec(dllimport)
#define ROKEN_LIB_CALL __stdcall
#else #else
#define ROKEN_LIB_FUNCTION #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif #endif
#endif #endif

View File

@@ -39,7 +39,7 @@
* free the list of `struct addrinfo' starting at `ai' * free the list of `struct addrinfo' starting at `ai'
*/ */
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
freeaddrinfo(struct addrinfo *ai) freeaddrinfo(struct addrinfo *ai)
{ {
struct addrinfo *tofree; struct addrinfo *tofree;

View File

@@ -39,7 +39,7 @@
* free a malloced hostent * free a malloced hostent
*/ */
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
freehostent (struct hostent *h) freehostent (struct hostent *h)
{ {
char **p; char **p;

View File

@@ -62,7 +62,7 @@ static struct gai_error {
* *
*/ */
const char * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL
gai_strerror(int ecode) gai_strerror(int ecode)
{ {
struct gai_error *g; struct gai_error *g;

View File

@@ -40,7 +40,7 @@
* NULL if we can't guess at all. * NULL if we can't guess at all.
*/ */
const char * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL
get_default_username (void) get_default_username (void)
{ {
const char *user; const char *user;
@@ -73,5 +73,11 @@ get_default_username (void)
return pwd->pw_name; return pwd->pw_name;
} }
#endif #endif
#ifdef _WIN32
/* TODO: We can call GetUserNameEx() and figure out a
username. However, callers do not free the return value of this
function. */
#endif
return user; return user;
} }

View File

@@ -57,7 +57,7 @@
#include "roken.h" #include "roken.h"
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
get_window_size(int fd, struct winsize *wp) get_window_size(int fd, struct winsize *wp)
{ {
int ret = -1; int ret = -1;
@@ -85,6 +85,20 @@ get_window_size(int fd, struct winsize *wp)
wp->ws_col = dst[0]; wp->ws_col = dst[0];
ret = 0; ret = 0;
} }
#elif defined(_WIN32)
{
intptr_t fh = 0;
CONSOLE_SCREEN_BUFFER_INFO sb_info;
fh = _get_osfhandle(fd);
if (fh != (intptr_t) INVALID_HANDLE_VALUE &&
GetConsoleScreenBufferInfo((HANDLE) fh, &sb_info)) {
wp->ws_row = 1 + sb_info.srWindow.Bottom - sb_info.srWindow.Top;
wp->ws_col = 1 + sb_info.srWindow.Right - sb_info.srWindow.Left;
ret = 0;
}
}
#endif #endif
if (ret != 0) { if (ret != 0) {
char *s; char *s;

View File

@@ -365,7 +365,7 @@ get_nodes (const char *nodename,
* }; * };
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
getaddrinfo(const char *nodename, getaddrinfo(const char *nodename,
const char *servname, const char *servname,
const struct addrinfo *hints, const struct addrinfo *hints,

View File

@@ -37,7 +37,7 @@
/* getaddrinfo via string specifying host and port */ /* getaddrinfo via string specifying host and port */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
roken_getaddrinfo_hostspec2(const char *hostspec, roken_getaddrinfo_hostspec2(const char *hostspec,
int socktype, int socktype,
int port, int port,
@@ -92,7 +92,7 @@ roken_getaddrinfo_hostspec2(const char *hostspec,
return getaddrinfo (host, portstr, &hints, ai); return getaddrinfo (host, portstr, &hints, ai);
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
roken_getaddrinfo_hostspec(const char *hostspec, roken_getaddrinfo_hostspec(const char *hostspec,
int port, int port,
struct addrinfo **ai) struct addrinfo **ai)

View File

@@ -91,7 +91,7 @@ mandoc_template(struct getargs *args,
const char *extra_string, const char *extra_string,
char *(i18n)(const char *)) char *(i18n)(const char *))
{ {
int i; size_t i;
char timestr[64], cmd[64]; char timestr[64], cmd[64];
char buf[128]; char buf[128];
const char *p; const char *p;
@@ -207,7 +207,7 @@ builtin_i18n(const char *str)
return rk_UNCONST(str); return rk_UNCONST(str);
} }
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
arg_printusage (struct getargs *args, arg_printusage (struct getargs *args,
size_t num_args, size_t num_args,
const char *progname, const char *progname,
@@ -217,7 +217,7 @@ arg_printusage (struct getargs *args,
progname, extra_string, builtin_i18n); progname, extra_string, builtin_i18n);
} }
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
arg_printusage_i18n (struct getargs *args, arg_printusage_i18n (struct getargs *args,
size_t num_args, size_t num_args,
const char *usage, const char *usage,
@@ -225,8 +225,7 @@ arg_printusage_i18n (struct getargs *args,
const char *extra_string, const char *extra_string,
char *(i18n)(const char *)) char *(i18n)(const char *))
{ {
int i; size_t i, max_len = 0;
size_t max_len = 0;
char buf[128]; char buf[128];
int col = 0, columns; int col = 0, columns;
struct winsize ws; struct winsize ws;
@@ -474,6 +473,7 @@ arg_match_long(struct getargs *args, size_t num_args,
default: default:
abort (); abort ();
UNREACHABLE(return 0);
} }
/* not reached */ /* not reached */
@@ -550,7 +550,7 @@ arg_match_short (struct getargs *args, size_t num_args,
return 0; return 0;
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
getarg(struct getargs *args, size_t num_args, getarg(struct getargs *args, size_t num_args,
int argc, char **argv, int *goptind) int argc, char **argv, int *goptind)
{ {
@@ -562,7 +562,7 @@ getarg(struct getargs *args, size_t num_args,
#elif defined(HAVE_RANDOM) #elif defined(HAVE_RANDOM)
srandom(time(NULL)); srandom(time(NULL));
#else #else
srand (time(NULL)); srand ((int) time(NULL));
#endif #endif
(*goptind)++; (*goptind)++;
for(i = *goptind; i < argc; i++) { for(i = *goptind; i < argc; i++) {
@@ -586,7 +586,7 @@ getarg(struct getargs *args, size_t num_args,
return ret; return ret;
} }
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
free_getarg_strings (getarg_strings *s) free_getarg_strings (getarg_strings *s)
{ {
free (s->strings); free (s->strings);

View File

@@ -40,9 +40,11 @@
#ifndef ROKEN_LIB_FUNCTION #ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32 #ifdef _WIN32
#define ROKEN_LIB_FUNCTION _stdcall #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL __cdecl
#else #else
#define ROKEN_LIB_FUNCTION #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif #endif
#endif #endif
@@ -86,17 +88,17 @@ typedef struct getarg_collect_info {
void *data; void *data;
} getarg_collect_info; } getarg_collect_info;
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
getarg(struct getargs *args, size_t num_args, getarg(struct getargs *args, size_t num_args,
int argc, char **argv, int *goptind); int argc, char **argv, int *goptind);
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
arg_printusage (struct getargs *args, arg_printusage (struct getargs *args,
size_t num_args, size_t num_args,
const char *progname, const char *progname,
const char *extra_string); const char *extra_string);
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
arg_printusage_i18n (struct getargs *args, arg_printusage_i18n (struct getargs *args,
size_t num_args, size_t num_args,
const char *usage, const char *usage,
@@ -104,7 +106,7 @@ arg_printusage_i18n (struct getargs *args,
const char *extra_string, const char *extra_string,
char *(i18n)(const char *)); char *(i18n)(const char *));
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
free_getarg_strings (getarg_strings *); free_getarg_strings (getarg_strings *);
#endif /* __GETARG_H__ */ #endif /* __GETARG_H__ */

View File

@@ -83,24 +83,24 @@ static int getent (char **, size_t *, char **, int, const char *, int, char *);
static int nfcmp (char *, char *); static int nfcmp (char *, char *);
int ROKEN_LIB_FUNCTION cgetset(const char *ent); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetset(const char *ent);
char *ROKEN_LIB_FUNCTION cgetcap(char *buf, const char *cap, int type); ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL cgetcap(char *buf, const char *cap, int type);
int ROKEN_LIB_FUNCTION cgetent(char **buf, char **db_array, const char *name); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetent(char **buf, char **db_array, const char *name);
int ROKEN_LIB_FUNCTION cgetmatch(const char *buf, const char *name); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetmatch(const char *buf, const char *name);
int ROKEN_LIB_FUNCTION cgetclose(void); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetclose(void);
#if 0 #if 0
int cgetfirst(char **buf, char **db_array); int cgetfirst(char **buf, char **db_array);
int cgetnext(char **bp, char **db_array); int cgetnext(char **bp, char **db_array);
#endif #endif
int ROKEN_LIB_FUNCTION cgetstr(char *buf, const char *cap, char **str); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetstr(char *buf, const char *cap, char **str);
int ROKEN_LIB_FUNCTION cgetustr(char *buf, const char *cap, char **str); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetustr(char *buf, const char *cap, char **str);
int ROKEN_LIB_FUNCTION cgetnum(char *buf, const char *cap, long *num); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL cgetnum(char *buf, const char *cap, long *num);
/* /*
* Cgetset() allows the addition of a user specified buffer to be added * Cgetset() allows the addition of a user specified buffer to be added
* to the database array, in effect "pushing" the buffer on top of the * to the database array, in effect "pushing" the buffer on top of the
* virtual database. 0 is returned on success, -1 on failure. * virtual database. 0 is returned on success, -1 on failure.
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
cgetset(const char *ent) cgetset(const char *ent)
{ {
const char *source, *check; const char *source, *check;
@@ -153,7 +153,7 @@ cgetset(const char *ent)
* If (cap, '@') or (cap, terminator, '@') is found before (cap, terminator) * If (cap, '@') or (cap, terminator, '@') is found before (cap, terminator)
* return NULL. * return NULL.
*/ */
char * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
cgetcap(char *buf, const char *cap, int type) cgetcap(char *buf, const char *cap, int type)
{ {
char *bp; char *bp;
@@ -204,7 +204,7 @@ cgetcap(char *buf, const char *cap, int type)
* encountered (couldn't open/read a file, etc.), and -3 if a potential * encountered (couldn't open/read a file, etc.), and -3 if a potential
* reference loop is detected. * reference loop is detected.
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
cgetent(char **buf, char **db_array, const char *name) cgetent(char **buf, char **db_array, const char *name)
{ {
size_t dummy; size_t dummy;
@@ -700,7 +700,7 @@ static FILE *pfp;
static int slash; static int slash;
static char **dbp; static char **dbp;
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
cgetclose(void) cgetclose(void)
{ {
if (pfp != NULL) { if (pfp != NULL) {
@@ -847,7 +847,7 @@ cgetnext(char **bp, char **db_array)
* couldn't be found, -2 if a system error was encountered (storage * couldn't be found, -2 if a system error was encountered (storage
* allocation failure). * allocation failure).
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
cgetstr(char *buf, const char *cap, char **str) cgetstr(char *buf, const char *cap, char **str)
{ {
u_int m_room; u_int m_room;
@@ -980,7 +980,7 @@ cgetstr(char *buf, const char *cap, char **str)
* -1 if the requested string capability couldn't be found, -2 if a system * -1 if the requested string capability couldn't be found, -2 if a system
* error was encountered (storage allocation failure). * error was encountered (storage allocation failure).
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
cgetustr(char *buf, const char *cap, char **str) cgetustr(char *buf, const char *cap, char **str)
{ {
u_int m_room; u_int m_room;
@@ -1049,7 +1049,7 @@ cgetustr(char *buf, const char *cap, char **str)
* the long pointed to by num. 0 is returned on success, -1 if the requested * the long pointed to by num. 0 is returned on success, -1 if the requested
* numeric capability couldn't be found. * numeric capability couldn't be found.
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
cgetnum(char *buf, const char *cap, long *num) cgetnum(char *buf, const char *cap, long *num)
{ {
long n; long n;

View File

@@ -42,7 +42,7 @@
#include "roken.h" #include "roken.h"
char* ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION char* ROKEN_LIB_CALL
getcwd(char *path, size_t size) getcwd(char *path, size_t size)
{ {
char xxx[MaxPathLen]; char xxx[MaxPathLen];

View File

@@ -61,7 +61,7 @@
#include <sys/sysctl.h> #include <sys/sysctl.h>
#endif #endif
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
getdtablesize(void) getdtablesize(void)
{ {
int files = -1; int files = -1;

View File

@@ -37,7 +37,7 @@
#ifndef HAVE_GETEGID #ifndef HAVE_GETEGID
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
getegid(void) getegid(void)
{ {
return getgid(); return getgid();

View File

@@ -37,7 +37,7 @@
#ifndef HAVE_GETEUID #ifndef HAVE_GETEUID
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
geteuid(void) geteuid(void)
{ {
return getuid(); return getuid();

View File

@@ -36,7 +36,7 @@
#ifndef HAVE_GETGID #ifndef HAVE_GETGID
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
getgid(void) getgid(void)
{ {
return 17; return 17;

View File

@@ -47,7 +47,7 @@
* interface is identical to gethostname(2).) * interface is identical to gethostname(2).)
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
gethostname(char *name, int namelen) gethostname(char *name, int namelen)
{ {
#if defined(HAVE_UNAME) #if defined(HAVE_UNAME)

View File

@@ -3,6 +3,8 @@
* (Royal Institute of Technology, Stockholm, Sweden). * (Royal Institute of Technology, Stockholm, Sweden).
* All rights reserved. * All rights reserved.
* *
* Portions Copyright (c) 2009, Secure Endpoints Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
@@ -38,18 +40,62 @@
#include <ifaddrs.h> #include <ifaddrs.h>
static void
print_addr(const char *s, struct sockaddr *sa)
{
int i;
printf(" %s=%d/", s, sa->sa_family);
#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN
for(i = 0; i < sa->sa_len - ((long)sa->sa_data - (long)&sa->sa_family); i++)
printf("%02x", ((unsigned char*)sa->sa_data)[i]);
#else
for(i = 0; i < sizeof(sa->sa_data); i++)
printf("%02x", ((unsigned char*)sa->sa_data)[i]);
#endif
printf("\n");
}
static void
print_ifaddrs(struct ifaddrs *x)
{
struct ifaddrs *p;
for(p = x; p; p = p->ifa_next) {
printf("%s\n", p->ifa_name);
printf(" flags=%x\n", p->ifa_flags);
if(p->ifa_addr)
print_addr("addr", p->ifa_addr);
if(p->ifa_dstaddr)
print_addr("dstaddr", p->ifa_dstaddr);
if(p->ifa_netmask)
print_addr("netmask", p->ifa_netmask);
printf(" %p\n", p->ifa_data);
}
}
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
struct ifaddrs *addrs = NULL; struct ifaddrs *addrs = NULL;
int ret; int ret;
if (rk_SOCK_INIT())
errx(1, "Couldn't initialize sockets. Err=%d\n", rk_SOCK_ERRNO);
ret = getifaddrs(&addrs); ret = getifaddrs(&addrs);
if (ret != 0) if (ret != 0)
err(1, "getifaddrs"); err(1, "getifaddrs");
if (addrs == NULL)
errx(1, "address == NULL");
print_ifaddrs(addrs);
/* Check that freeifaddrs doesn't crash */ /* Check that freeifaddrs doesn't crash */
freeifaddrs(addrs); freeifaddrs(addrs);
if (rk_SOCK_EXIT())
errx(1, "Couldn't uninitialize sockets. Err=%d\n", rk_SOCK_ERRNO);
return 0; return 0;
} }

View File

@@ -498,7 +498,7 @@ nl_open(void)
} }
/* ====================================================================== */ /* ====================================================================== */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
rk_getifaddrs(struct ifaddrs **ifap) rk_getifaddrs(struct ifaddrs **ifap)
{ {
int sd; int sd;
@@ -1165,7 +1165,7 @@ getlifaddrs2(struct ifaddrs **ifap,
} }
#endif /* defined(HAVE_IPV6) && defined(SIOCGLIFCONF) && defined(SIOCGLIFFLAGS) */ #endif /* defined(HAVE_IPV6) && defined(SIOCGLIFCONF) && defined(SIOCGLIFFLAGS) */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
rk_getifaddrs(struct ifaddrs **ifap) rk_getifaddrs(struct ifaddrs **ifap)
{ {
int ret = -1; int ret = -1;
@@ -1193,7 +1193,9 @@ rk_getifaddrs(struct ifaddrs **ifap)
return ret; return ret;
} }
void ROKEN_LIB_FUNCTION #endif /* !AF_NETLINK */
ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
rk_freeifaddrs(struct ifaddrs *ifp) rk_freeifaddrs(struct ifaddrs *ifp)
{ {
struct ifaddrs *p, *q; struct ifaddrs *p, *q;
@@ -1214,8 +1216,6 @@ rk_freeifaddrs(struct ifaddrs *ifp)
} }
} }
#endif /* !AF_NETLINK */
#ifdef TEST #ifdef TEST
void void

163
lib/roken/getifaddrs_w32.c Normal file
View File

@@ -0,0 +1,163 @@
/***********************************************************************
* Copyright (c) 2009, Secure Endpoints Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*
**********************************************************************/
#ifdef HAVE_CONFIG_H
#include<config.h>
#endif
#include <roken.h>
#include <ifaddrs.h>
#ifndef _WIN32
#error This is a Windows specific implementation.
#endif
static struct sockaddr *
dupaddr(const sockaddr_gen * src)
{
sockaddr_gen * d = malloc(sizeof(*d));
if (d) {
memcpy(d, src, sizeof(*d));
}
return (struct sockaddr *) d;
}
int ROKEN_LIB_FUNCTION
rk_getifaddrs(struct ifaddrs **ifpp)
{
SOCKET s = INVALID_SOCKET;
size_t il_len = 8192;
int ret = -1;
INTERFACE_INFO *il = NULL;
*ifpp = NULL;
s = socket(AF_INET, SOCK_DGRAM, 0);
if (s == INVALID_SOCKET)
return -1;
for (;;) {
DWORD cbret = 0;
il = malloc(il_len);
if (!il)
break;
ZeroMemory(il, il_len);
if (WSAIoctl(s, SIO_GET_INTERFACE_LIST, NULL, 0,
(LPVOID) il, il_len, &cbret,
NULL, NULL) == 0) {
il_len = cbret;
break;
}
free (il);
il = NULL;
if (WSAGetLastError() == WSAEFAULT && cbret > il_len) {
il_len = cbret;
} else {
break;
}
}
if (!il)
goto _exit;
/* il is an array of INTERFACE_INFO structures. il_len has the
actual size of the buffer. The number of elements is
il_len/sizeof(INTERFACE_INFO) */
{
size_t n = il_len / sizeof(INTERFACE_INFO);
size_t i;
for (i = 0; i < n; i++ ) {
struct ifaddrs *ifp;
ifp = malloc(sizeof(*ifp));
if (ifp == NULL)
break;
ZeroMemory(ifp, sizeof(*ifp));
ifp->ifa_next = NULL;
ifp->ifa_name = NULL;
ifp->ifa_flags = il[i].iiFlags;
ifp->ifa_addr = dupaddr(&il[i].iiAddress);
ifp->ifa_netmask = dupaddr(&il[i].iiNetmask);
ifp->ifa_broadaddr = dupaddr(&il[i].iiBroadcastAddress);
ifp->ifa_data = NULL;
*ifpp = ifp;
ifpp = &ifp->ifa_next;
}
if (i == n)
ret = 0;
}
_exit:
if (s != INVALID_SOCKET)
closesocket(s);
if (il)
free (il);
return ret;
}
void ROKEN_LIB_FUNCTION
rk_freeifaddrs(struct ifaddrs *ifp)
{
struct ifaddrs *p, *q;
for(p = ifp; p; ) {
if (p->ifa_name)
free(p->ifa_name);
if(p->ifa_addr)
free(p->ifa_addr);
if(p->ifa_dstaddr)
free(p->ifa_dstaddr);
if(p->ifa_netmask)
free(p->ifa_netmask);
if(p->ifa_data)
free(p->ifa_data);
q = p;
p = p->ifa_next;
free(q);
}
}

View File

@@ -40,7 +40,7 @@
* to a malloced struct hostent or NULL. * to a malloced struct hostent or NULL.
*/ */
struct hostent * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION struct hostent * ROKEN_LIB_CALL
getipnodebyaddr (const void *src, size_t len, int af, int *error_num) getipnodebyaddr (const void *src, size_t len, int af, int *error_num)
{ {
struct hostent *tmp; struct hostent *tmp;

View File

@@ -44,7 +44,7 @@ static int h_errno = NO_RECOVERY;
* to a malloced struct hostent or NULL. * to a malloced struct hostent or NULL.
*/ */
struct hostent * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION struct hostent * ROKEN_LIB_CALL
getipnodebyname (const char *name, int af, int flags, int *error_num) getipnodebyname (const char *name, int af, int flags, int *error_num)
{ {
struct hostent *tmp; struct hostent *tmp;

View File

@@ -91,7 +91,7 @@ doit (int af,
* *
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
getnameinfo(const struct sockaddr *sa, socklen_t salen, getnameinfo(const struct sockaddr *sa, socklen_t salen,
char *host, size_t hostlen, char *host, size_t hostlen,
char *serv, size_t servlen, char *serv, size_t servlen,

View File

@@ -43,7 +43,7 @@
* NI_NAMEREQD flag is set or return the numeric address as a string. * NI_NAMEREQD flag is set or return the numeric address as a string.
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
getnameinfo_verified(const struct sockaddr *sa, socklen_t salen, getnameinfo_verified(const struct sockaddr *sa, socklen_t salen,
char *host, size_t hostlen, char *host, size_t hostlen,
char *serv, size_t servlen, char *serv, size_t servlen,

View File

@@ -51,7 +51,7 @@ char *optarg; /* argument associated with option */
#define BADARG (int)':' #define BADARG (int)':'
#define EMSG "" #define EMSG ""
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
getopt(nargc, nargv, ostr) getopt(nargc, nargv, ostr)
int nargc; int nargc;
char * const *nargv; char * const *nargv;

View File

@@ -40,7 +40,7 @@ const char *__progname;
#endif #endif
#ifndef HAVE_GETPROGNAME #ifndef HAVE_GETPROGNAME
const char * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL
getprogname(void) getprogname(void)
{ {
return __progname; return __progname;

View File

@@ -38,13 +38,13 @@
/* /*
* Simple gettimeofday that only returns seconds. * Simple gettimeofday that only returns seconds.
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
gettimeofday (struct timeval *tp, void *ignore) gettimeofday (struct timeval *tp, void *ignore)
{ {
time_t t; time_t t;
t = time(NULL); t = time(NULL);
tp->tv_sec = t; tp->tv_sec = (long) t;
tp->tv_usec = 0; tp->tv_usec = 0;
return 0; return 0;
} }

View File

@@ -36,7 +36,7 @@
#ifndef HAVE_GETUID #ifndef HAVE_GETUID
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
getuid(void) getuid(void)
{ {
return 17; return 17;

View File

@@ -81,7 +81,7 @@ static char **initshells (void);
/* /*
* Get a list of shells from _PATH_SHELLS, if it exists. * Get a list of shells from _PATH_SHELLS, if it exists.
*/ */
char * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION char * ROKEN_LIB_CALL
getusershell() getusershell()
{ {
char *ret; char *ret;
@@ -94,7 +94,7 @@ getusershell()
return (ret); return (ret);
} }
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
endusershell() endusershell()
{ {
if (shells != NULL) if (shells != NULL)
@@ -106,7 +106,7 @@ endusershell()
curshell = NULL; curshell = NULL;
} }
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
setusershell() setusershell()
{ {
curshell = initshells(); curshell = initshells();

View File

@@ -164,7 +164,7 @@ static int match (Char *, Char *, Char *);
static void qprintf (const char *, Char *); static void qprintf (const char *, Char *);
#endif #endif
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
glob(const char *pattern, glob(const char *pattern,
int flags, int flags,
int (*errfunc)(const char *, int), int (*errfunc)(const char *, int),
@@ -739,7 +739,7 @@ match(Char *name, Char *pat, Char *patend)
} }
/* Free allocated data belonging to a glob_t structure. */ /* Free allocated data belonging to a glob_t structure. */
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
globfree(glob_t *pglob) globfree(glob_t *pglob)
{ {
int i; int i;

View File

@@ -50,7 +50,7 @@ pos(char c)
return -1; return -1;
} }
ssize_t ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
hex_encode(const void *data, size_t size, char **str) hex_encode(const void *data, size_t size, char **str)
{ {
const unsigned char *q = data; const unsigned char *q = data;
@@ -80,7 +80,7 @@ hex_encode(const void *data, size_t size, char **str)
return i * 2; return i * 2;
} }
ssize_t ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
hex_decode(const char *str, void *data, size_t len) hex_decode(const char *str, void *data, size_t len)
{ {
size_t l; size_t l;

View File

@@ -38,18 +38,20 @@
#ifndef ROKEN_LIB_FUNCTION #ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32 #ifdef _WIN32
#define ROKEN_LIB_FUNCTION _stdcall #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL __cdecl
#else #else
#define ROKEN_LIB_FUNCTION #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif #endif
#endif #endif
#define hex_encode rk_hex_encode #define hex_encode rk_hex_encode
#define hex_decode rk_hex_decode #define hex_decode rk_hex_decode
ssize_t ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
hex_encode(const void *, size_t, char **); hex_encode(const void *, size_t, char **);
ssize_t ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
hex_decode(const char *, void *, size_t); hex_decode(const char *, void *, size_t);
#endif /* _rk_HEX_H_ */ #endif /* _rk_HEX_H_ */

View File

@@ -39,7 +39,7 @@
* Try to find a fqdn (with `.') in he if possible, else return h_name * Try to find a fqdn (with `.') in he if possible, else return h_name
*/ */
const char * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL
hostent_find_fqdn (const struct hostent *he) hostent_find_fqdn (const struct hostent *he)
{ {
const char *ret = he->h_name; const char *ret = he->h_name;

View File

@@ -64,7 +64,7 @@ extern int h_nerr;
#endif #endif
const char * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL
hstrerror(int herr) hstrerror(int herr)
{ {
if (0 <= herr && herr < h_nerr) if (0 <= herr && herr < h_nerr)

View File

@@ -38,7 +38,7 @@
/* Minimal implementation of inet_aton. /* Minimal implementation of inet_aton.
* Cannot distinguish between failure and a local broadcast address. */ * Cannot distinguish between failure and a local broadcast address. */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
inet_aton(const char *cp, struct in_addr *addr) inet_aton(const char *cp, struct in_addr *addr)
{ {
addr->s_addr = inet_addr(cp); addr->s_addr = inet_addr(cp);

View File

@@ -113,7 +113,7 @@ inet_ntop_v6 (const void *src, char *dst, size_t size)
} }
#endif /* HAVE_IPV6 */ #endif /* HAVE_IPV6 */
const char * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION const char * ROKEN_LIB_CALL
inet_ntop(int af, const void *src, char *dst, size_t size) inet_ntop(int af, const void *src, char *dst, size_t size)
{ {
switch (af) { switch (af) {

View File

@@ -35,7 +35,64 @@
#include "roken.h" #include "roken.h"
int ROKEN_LIB_FUNCTION #ifdef HAVE_WINSOCK
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
inet_pton(int af, const char *src, void *dst)
{
switch (af) {
case AF_INET:
{
struct sockaddr_in si4;
INT r;
INT s = sizeof(si4);
si4.sin_family = AF_INET;
r = WSAStringToAddress(src, AF_INET, NULL, (LPSOCKADDR) &si4, &s);
if (r == 0) {
memcpy(dst, &si4.sin_addr, sizeof(si4.sin_addr));
return 1;
}
}
break;
case AF_INET6:
{
struct sockaddr_in6 si6;
INT r;
INT s = sizeof(si6);
si6.sin6_family = AF_INET6;
r = WSAStringToAddress(src, AF_INET6, NULL, (LPSOCKADDR) &si6, &s);
if (r == 0) {
memcpy(dst, &si6.sin6_addr, sizeof(si6.sin6_addr));
return 1;
}
}
break;
default:
_set_errno( EAFNOSUPPORT );
return -1;
}
/* the call failed */
{
int le = WSAGetLastError();
if (le == WSAEINVAL)
return 0;
_set_errno(le);
return -1;
}
}
#else /* !HAVE_WINSOCK */
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
inet_pton(int af, const char *src, void *dst) inet_pton(int af, const char *src, void *dst)
{ {
if (af != AF_INET) { if (af != AF_INET) {
@@ -44,3 +101,5 @@ inet_pton(int af, const char *src, void *dst)
} }
return inet_aton (src, dst); return inet_aton (src, dst);
} }
#endif

View File

@@ -35,7 +35,7 @@
#include "roken.h" #include "roken.h"
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
initgroups(const char *name, gid_t basegid) initgroups(const char *name, gid_t basegid)
{ {
return 0; return 0;

View File

@@ -35,7 +35,7 @@
#ifndef HAVE_INNETGR #ifndef HAVE_INNETGR
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
innetgr(const char *netgroup, const char *machine, innetgr(const char *netgroup, const char *machine,
const char *user, const char *domain) const char *user, const char *domain)
{ {

View File

@@ -214,7 +214,7 @@ __ivaliduser(FILE *hostf, unsigned raddr, const char *luser,
* *
* Returns 0 if ok, -1 if not ok. * Returns 0 if ok, -1 if not ok.
*/ */
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
iruserok(unsigned raddr, int superuser, const char *ruser, const char *luser) iruserok(unsigned raddr, int superuser, const char *ruser, const char *luser)
{ {
char *cp; char *cp;

View File

@@ -35,7 +35,7 @@
#include "roken.h" #include "roken.h"
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
issuid(void) issuid(void)
{ {
#if defined(HAVE_ISSETUGID) #if defined(HAVE_ISSETUGID)

View File

@@ -38,7 +38,7 @@
#include <shadow.h> #include <shadow.h>
#endif #endif
struct passwd * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION struct passwd * ROKEN_LIB_CALL
k_getpwnam (const char *user) k_getpwnam (const char *user)
{ {
struct passwd *p; struct passwd *p;

View File

@@ -38,7 +38,7 @@
#include <shadow.h> #include <shadow.h>
#endif #endif
struct passwd * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION struct passwd * ROKEN_LIB_CALL
k_getpwuid (uid_t uid) k_getpwuid (uid_t uid)
{ {
struct passwd *p; struct passwd *p;

View File

@@ -39,7 +39,7 @@
#ifndef HAVE_LOCALTIME_R #ifndef HAVE_LOCALTIME_R
struct tm * ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION struct tm * ROKEN_LIB_CALL
localtime_r(const time_t *timer, struct tm *result) localtime_r(const time_t *timer, struct tm *result)
{ {
struct tm *tm; struct tm *tm;

View File

@@ -35,7 +35,7 @@
#include "roken.h" #include "roken.h"
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
lstat(const char *path, struct stat *buf) lstat(const char *path, struct stat *buf)
{ {
return stat(path, buf); return stat(path, buf);

View File

@@ -41,7 +41,7 @@
#include <sys/types.h> #include <sys/types.h>
#endif #endif
void* ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void* ROKEN_LIB_CALL
memmove(void *s1, const void *s2, size_t n) memmove(void *s1, const void *s2, size_t n)
{ {
char *s=(char*)s2, *d=(char*)s1; char *s=(char*)s2, *d=(char*)s1;

View File

@@ -41,61 +41,93 @@
*/ */
static void static void
accept_it (int s) accept_it (rk_socket_t s, rk_socket_t *ret_socket)
{ {
int s2; rk_socket_t as;
s2 = accept(s, NULL, NULL); as = accept(s, NULL, NULL);
if(s2 < 0) if(rk_IS_BAD_SOCKET(as))
err (1, "accept"); err (1, "accept");
close(s);
dup2(s2, STDIN_FILENO); if (ret_socket) {
dup2(s2, STDOUT_FILENO);
/* dup2(s2, STDERR_FILENO); */ *ret_socket = as;
close(s2);
} else {
int fd = socket_to_fd(as, 0);
/* We would use _O_RDONLY for the socket_to_fd() call for
STDIN, but there are instances where we assume that STDIN
is a r/w socket. */
dup2(fd, STDIN_FILENO);
dup2(fd, STDOUT_FILENO);
rk_closesocket(as);
}
} }
/* /**
* Listen on a specified port, emulating inetd. * Listen on a specified addresses
*
* Listens on the specified addresses for incoming connections. If
* the \a ret_socket parameter is \a NULL, on return STDIN and STDOUT
* will be connected to an accepted socket. If the \a ret_socket
* parameter is non-NULL, the accepted socket will be returned in
* *ret_socket. In the latter case, STDIN and STDOUT will be left
* unmodified.
*
* This function does not return if there is an error or if no
* connection is established.
*
* @param[in] ai Addresses to listen on
* @param[out] ret_socket If non-NULL receives the accepted socket.
*
* @see mini_inetd()
*/ */
ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
void ROKEN_LIB_FUNCTION mini_inetd_addrinfo (struct addrinfo *ai, rk_socket_t *ret_socket)
mini_inetd_addrinfo (struct addrinfo *ai)
{ {
int ret; int ret;
struct addrinfo *a; struct addrinfo *a;
int n, nalloc, i; int n, nalloc, i;
int *fds; rk_socket_t *fds;
fd_set orig_read_set, read_set; fd_set orig_read_set, read_set;
int max_fd = -1; rk_socket_t max_fd = (rk_socket_t)-1;
for (nalloc = 0, a = ai; a != NULL; a = a->ai_next) for (nalloc = 0, a = ai; a != NULL; a = a->ai_next)
++nalloc; ++nalloc;
fds = malloc (nalloc * sizeof(*fds)); fds = malloc (nalloc * sizeof(*fds));
if (fds == NULL) if (fds == NULL) {
errx (1, "mini_inetd: out of memory"); errx (1, "mini_inetd: out of memory");
UNREACHABLE(return);
}
FD_ZERO(&orig_read_set); FD_ZERO(&orig_read_set);
for (i = 0, a = ai; a != NULL; a = a->ai_next) { for (i = 0, a = ai; a != NULL; a = a->ai_next) {
fds[i] = socket (a->ai_family, a->ai_socktype, a->ai_protocol); fds[i] = socket (a->ai_family, a->ai_socktype, a->ai_protocol);
if (fds[i] < 0) if (rk_IS_BAD_SOCKET(fds[i]))
continue; continue;
socket_set_reuseaddr (fds[i], 1); socket_set_reuseaddr (fds[i], 1);
socket_set_ipv6only(fds[i], 1); socket_set_ipv6only(fds[i], 1);
if (bind (fds[i], a->ai_addr, a->ai_addrlen) < 0) { if (rk_IS_SOCKET_ERROR(bind (fds[i], a->ai_addr, a->ai_addrlen))) {
warn ("bind af = %d", a->ai_family); warn ("bind af = %d", a->ai_family);
close(fds[i]); rk_closesocket(fds[i]);
fds[i] = rk_INVALID_SOCKET;
continue; continue;
} }
if (listen (fds[i], SOMAXCONN) < 0) { if (rk_IS_SOCKET_ERROR(listen (fds[i], SOMAXCONN))) {
warn ("listen af = %d", a->ai_family); warn ("listen af = %d", a->ai_family);
close(fds[i]); rk_closesocket(fds[i]);
fds[i] = rk_INVALID_SOCKET;
continue; continue;
} }
#ifndef NO_LIMIT_FD_SETSIZE
if (fds[i] >= FD_SETSIZE) if (fds[i] >= FD_SETSIZE)
errx (1, "fd too large"); errx (1, "fd too large");
#endif
FD_SET(fds[i], &orig_read_set); FD_SET(fds[i], &orig_read_set);
max_fd = max(max_fd, fds[i]); max_fd = max(max_fd, fds[i]);
++i; ++i;
@@ -108,23 +140,40 @@ mini_inetd_addrinfo (struct addrinfo *ai)
read_set = orig_read_set; read_set = orig_read_set;
ret = select (max_fd + 1, &read_set, NULL, NULL, NULL); ret = select (max_fd + 1, &read_set, NULL, NULL, NULL);
if (ret < 0 && errno != EINTR) if (rk_IS_SOCKET_ERROR(ret) && rk_SOCK_ERRNO != EINTR)
err (1, "select"); err (1, "select");
} while (ret <= 0); } while (ret <= 0);
for (i = 0; i < n; ++i) for (i = 0; i < n; ++i)
if (FD_ISSET (fds[i], &read_set)) { if (FD_ISSET (fds[i], &read_set)) {
accept_it (fds[i]); accept_it (fds[i], ret_socket);
for (i = 0; i < n; ++i) for (i = 0; i < n; ++i)
close(fds[i]); rk_closesocket(fds[i]);
free(fds); free(fds);
return; return;
} }
abort (); abort ();
} }
void ROKEN_LIB_FUNCTION /**
mini_inetd (int port) * Listen on a specified port
*
* Listens on the specified port for incoming connections. If the \a
* ret_socket parameter is \a NULL, on return STDIN and STDOUT will be
* connected to an accepted socket. If the \a ret_socket parameter is
* non-NULL, the accepted socket will be returned in *ret_socket. In
* the latter case, STDIN and STDOUT will be left unmodified.
*
* This function does not return if there is an error or if no
* connection is established.
*
* @param[in] port Port to listen on
* @param[out] ret_socket If non-NULL receives the accepted socket.
*
* @see mini_inetd_addrinfo()
*/
ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
mini_inetd(int port, rk_socket_t * ret_socket)
{ {
int error; int error;
struct addrinfo *ai, hints; struct addrinfo *ai, hints;
@@ -141,7 +190,8 @@ mini_inetd (int port)
if (error) if (error)
errx (1, "getaddrinfo: %s", gai_strerror (error)); errx (1, "getaddrinfo: %s", gai_strerror (error));
mini_inetd_addrinfo(ai); mini_inetd_addrinfo(ai, ret_socket);
freeaddrinfo(ai); freeaddrinfo(ai);
} }

View File

@@ -42,9 +42,11 @@
#endif #endif
#include <errno.h> #include <errno.h>
#include <roken.h>
#ifndef HAVE_MKSTEMP #ifndef HAVE_MKSTEMP
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
mkstemp(char *template) mkstemp(char *template)
{ {
int start, i; int start, i;

View File

@@ -60,7 +60,7 @@ static DBC *cursor;
#define D(X) ((DB*)(X)) #define D(X) ((DB*)(X))
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
dbm_close (DBM *db) dbm_close (DBM *db)
{ {
#ifdef HAVE_DB3 #ifdef HAVE_DB3
@@ -71,7 +71,7 @@ dbm_close (DBM *db)
#endif #endif
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
dbm_delete (DBM *db, datum dkey) dbm_delete (DBM *db, datum dkey)
{ {
DBT key; DBT key;
@@ -129,19 +129,19 @@ dbm_get (DB *db, int flags)
#define DB_KEYEXIST 1 #define DB_KEYEXIST 1
#endif #endif
datum ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION datum ROKEN_LIB_CALL
dbm_firstkey (DBM *db) dbm_firstkey (DBM *db)
{ {
return dbm_get(D(db), DB_FIRST); return dbm_get(D(db), DB_FIRST);
} }
datum ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION datum ROKEN_LIB_CALL
dbm_nextkey (DBM *db) dbm_nextkey (DBM *db)
{ {
return dbm_get(D(db), DB_NEXT); return dbm_get(D(db), DB_NEXT);
} }
DBM* ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION DBM* ROKEN_LIB_CALL
dbm_open (const char *file, int flags, mode_t mode) dbm_open (const char *file, int flags, mode_t mode)
{ {
DB *db; DB *db;
@@ -184,7 +184,7 @@ dbm_open (const char *file, int flags, mode_t mode)
return (DBM*)db; return (DBM*)db;
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
dbm_store (DBM *db, datum dkey, datum dvalue, int flags) dbm_store (DBM *db, datum dkey, datum dvalue, int flags)
{ {
int ret; int ret;
@@ -204,13 +204,13 @@ dbm_store (DBM *db, datum dkey, datum dvalue, int flags)
RETURN(ret); RETURN(ret);
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
dbm_error (DBM *db) dbm_error (DBM *db)
{ {
return 0; return 0;
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
dbm_clearerr (DBM *db) dbm_clearerr (DBM *db)
{ {
return 0; return 0;

View File

@@ -41,9 +41,11 @@
#ifndef ROKEN_LIB_FUNCTION #ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32 #ifdef _WIN32
#define ROKEN_LIB_FUNCTION _stdcall #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL __cdecl
#else #else
#define ROKEN_LIB_FUNCTION #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif #endif
#endif #endif
@@ -78,14 +80,14 @@ typedef struct {
} DBM; } DBM;
#endif #endif
int ROKEN_LIB_FUNCTION dbm_clearerr (DBM*); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL dbm_clearerr (DBM*);
void ROKEN_LIB_FUNCTION dbm_close (DBM*); ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL dbm_close (DBM*);
int ROKEN_LIB_FUNCTION dbm_delete (DBM*, datum); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL dbm_delete (DBM*, datum);
int ROKEN_LIB_FUNCTION dbm_error (DBM*); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL dbm_error (DBM*);
datum ROKEN_LIB_FUNCTION dbm_fetch (DBM*, datum); ROKEN_LIB_FUNCTION datum ROKEN_LIB_CALL dbm_fetch (DBM*, datum);
datum ROKEN_LIB_FUNCTION dbm_firstkey (DBM*); ROKEN_LIB_FUNCTION datum ROKEN_LIB_CALL dbm_firstkey (DBM*);
datum ROKEN_LIB_FUNCTION dbm_nextkey (DBM*); ROKEN_LIB_FUNCTION datum ROKEN_LIB_CALL dbm_nextkey (DBM*);
DBM* ROKEN_LIB_FUNCTION dbm_open (const char*, int, mode_t); ROKEN_LIB_FUNCTION DBM* ROKEN_LIB_CALL dbm_open (const char*, int, mode_t);
int ROKEN_LIB_FUNCTION dbm_store (DBM*, datum, datum, int); ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL dbm_store (DBM*, datum, datum, int);
#endif /* __ndbm_wrap_h__ */ #endif /* __ndbm_wrap_h__ */

View File

@@ -33,29 +33,23 @@
#include <config.h> #include <config.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include "roken.h" #include "roken.h"
/* /*
* Like read but never return partial data. * Like read but never return partial data.
*/ */
ssize_t ROKEN_LIB_FUNCTION #ifndef _WIN32
net_read (int fd, void *buf, size_t nbytes)
ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
net_read (rk_socket_t fd, void *buf, size_t nbytes)
{ {
char *cbuf = (char *)buf; char *cbuf = (char *)buf;
ssize_t count; ssize_t count;
size_t rem = nbytes; size_t rem = nbytes;
while (rem > 0) { while (rem > 0) {
#ifdef WIN32
count = recv (fd, cbuf, rem, 0);
#else
count = read (fd, cbuf, rem); count = read (fd, cbuf, rem);
#endif
if (count < 0) { if (count < 0) {
if (errno == EINTR) if (errno == EINTR)
continue; continue;
@@ -69,3 +63,36 @@ net_read (int fd, void *buf, size_t nbytes)
} }
return nbytes; return nbytes;
} }
#else
ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
net_read(rk_socket_t sock, void *buf, size_t nbytes)
{
char *cbuf = (char *)buf;
ssize_t count;
size_t rem = nbytes;
while (rem > 0) {
count = recv (sock, cbuf, rem, 0);
if (count < 0) {
/* With WinSock, the error EINTR (WSAEINTR), is used to
indicate that a blocking call was cancelled using
WSACancelBlockingCall(). */
#ifndef HAVE_WINSOCK
if (rk_SOCK_ERRNO == EINTR)
continue;
#endif
return count;
} else if (count == 0) {
return count;
}
cbuf += count;
rem -= count;
}
return nbytes;
}
#endif

View File

@@ -33,29 +33,23 @@
#include <config.h> #include <config.h>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include "roken.h" #include "roken.h"
/* /*
* Like write but never return partial data. * Like write but never return partial data.
*/ */
ssize_t ROKEN_LIB_FUNCTION #ifndef _WIN32
net_write (int fd, const void *buf, size_t nbytes)
ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
net_write (rk_socket_t fd, const void *buf, size_t nbytes)
{ {
const char *cbuf = (const char *)buf; const char *cbuf = (const char *)buf;
ssize_t count; ssize_t count;
size_t rem = nbytes; size_t rem = nbytes;
while (rem > 0) { while (rem > 0) {
#ifdef WIN32
count = send (fd, cbuf, rem, 0);
#else
count = write (fd, cbuf, rem); count = write (fd, cbuf, rem);
#endif
if (count < 0) { if (count < 0) {
if (errno == EINTR) if (errno == EINTR)
continue; continue;
@@ -67,3 +61,28 @@ net_write (int fd, const void *buf, size_t nbytes)
} }
return nbytes; return nbytes;
} }
#else
ROKEN_LIB_FUNCTION ssize_t ROKEN_LIB_CALL
net_write(rk_socket_t sock, const void *buf, size_t nbytes)
{
const char *cbuf = (const char *)buf;
ssize_t count;
size_t rem = nbytes;
while (rem > 0) {
count = send (sock, cbuf, rem, 0);
if (count < 0) {
if (errno == EINTR)
continue;
else
return count;
}
cbuf += count;
rem -= count;
}
return nbytes;
}
#endif

View File

@@ -56,19 +56,19 @@ static struct units bytes_short_units[] = {
{ NULL, 0 } { NULL, 0 }
}; };
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
parse_bytes (const char *s, const char *def_unit) parse_bytes (const char *s, const char *def_unit)
{ {
return parse_units (s, bytes_units, def_unit); return parse_units (s, bytes_units, def_unit);
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
unparse_bytes (int t, char *s, size_t len) unparse_bytes (int t, char *s, size_t len)
{ {
return unparse_units (t, bytes_units, s, len); return unparse_units (t, bytes_units, s, len);
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
unparse_bytes_short (int t, char *s, size_t len) unparse_bytes_short (int t, char *s, size_t len)
{ {
return unparse_units_approx (t, bytes_short_units, s, len); return unparse_units_approx (t, bytes_short_units, s, len);

View File

@@ -38,19 +38,21 @@
#ifndef ROKEN_LIB_FUNCTION #ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32 #ifdef _WIN32
#define ROKEN_LIB_FUNCTION _stdcall #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL __cdecl
#else #else
#define ROKEN_LIB_FUNCTION #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif #endif
#endif #endif
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
parse_bytes (const char *s, const char *def_unit); parse_bytes (const char *s, const char *def_unit);
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
unparse_bytes (int t, char *s, size_t len); unparse_bytes (int t, char *s, size_t len);
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
unparse_bytes_short (int t, char *s, size_t len); unparse_bytes_short (int t, char *s, size_t len);
#endif /* __PARSE_BYTES_H__ */ #endif /* __PARSE_BYTES_H__ */

View File

@@ -40,7 +40,7 @@
static struct testcase { static struct testcase {
size_t size; size_t size;
time_t val; int val;
char *str; char *str;
} tests[] = { } tests[] = {
{ 8, 1, "1 second" }, { 8, 1, "1 second" },
@@ -97,6 +97,7 @@ main(int argc, char **argv)
errx(1, "test %i not zero terminated", i); errx(1, "test %i not zero terminated", i);
rk_test_mem_free("underrun"); rk_test_mem_free("underrun");
} }
buf = rk_test_mem_alloc(RK_TM_OVERRUN, "overrun", buf = rk_test_mem_alloc(RK_TM_OVERRUN, "overrun",
tests[i].str, tests[i].size + 1); tests[i].str, tests[i].size + 1);
j = parse_time(buf, "s"); j = parse_time(buf, "s");
@@ -110,6 +111,7 @@ main(int argc, char **argv)
if (j != tests[i].val) if (j != tests[i].val)
errx(1, "parse_time failed for test %d", i); errx(1, "parse_time failed for test %d", i);
rk_test_mem_free("underrun"); rk_test_mem_free("underrun");
} }
return 0; return 0;
} }

View File

@@ -50,25 +50,25 @@ static struct units time_units[] = {
{NULL, 0}, {NULL, 0},
}; };
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
parse_time (const char *s, const char *def_unit) parse_time (const char *s, const char *def_unit)
{ {
return parse_units (s, time_units, def_unit); return parse_units (s, time_units, def_unit);
} }
size_t ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL
unparse_time (int t, char *s, size_t len) unparse_time (int t, char *s, size_t len)
{ {
return unparse_units (t, time_units, s, len); return unparse_units (t, time_units, s, len);
} }
size_t ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL
unparse_time_approx (int t, char *s, size_t len) unparse_time_approx (int t, char *s, size_t len)
{ {
return unparse_units_approx (t, time_units, s, len); return unparse_units_approx (t, time_units, s, len);
} }
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
print_time_table (FILE *f) print_time_table (FILE *f)
{ {
print_units_table (time_units, f); print_units_table (time_units, f);

View File

@@ -38,22 +38,24 @@
#ifndef ROKEN_LIB_FUNCTION #ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32 #ifdef _WIN32
#define ROKEN_LIB_FUNCTION _stdcall #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL __cdecl
#else #else
#define ROKEN_LIB_FUNCTION #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif #endif
#endif #endif
int ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
parse_time (const char *s, const char *def_unit); parse_time (const char *s, const char *def_unit);
size_t ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL
unparse_time (int t, char *s, size_t len); unparse_time (int t, char *s, size_t len);
size_t ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL
unparse_time_approx (int t, char *s, size_t len); unparse_time_approx (int t, char *s, size_t len);
void ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
print_time_table (FILE *f); print_time_table (FILE *f);
#endif /* __PARSE_TIME_H__ */ #endif /* __PARSE_TIME_H__ */

View File

@@ -70,7 +70,7 @@ parse_something (const char *s, const struct units *units,
p = s; p = s;
while (*p) { while (*p) {
double val; int val;
char *next; char *next;
const struct units *u, *partial_unit; const struct units *u, *partial_unit;
size_t u_len; size_t u_len;
@@ -80,7 +80,7 @@ parse_something (const char *s, const struct units *units,
while(isspace((unsigned char)*p) || *p == ',') while(isspace((unsigned char)*p) || *p == ',')
++p; ++p;
val = strtod (p, &next); /* strtol(p, &next, 0); */ val = (int) strtod (p, &next); /* strtol(p, &next, 0); */
if (p == next) { if (p == next) {
val = 0; val = 0;
if(!accept_no_val_p) if(!accept_no_val_p)
@@ -149,7 +149,7 @@ acc_units(int res, int val, unsigned mult)
return res + val * mult; return res + val * mult;
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
parse_units (const char *s, const struct units *units, parse_units (const char *s, const struct units *units,
const char *def_unit) const char *def_unit)
{ {
@@ -175,7 +175,7 @@ acc_flags(int res, int val, unsigned mult)
return -1; return -1;
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
parse_flags (const char *s, const struct units *units, parse_flags (const char *s, const struct units *units,
int orig) int orig)
{ {
@@ -208,7 +208,7 @@ unparse_something (int num, const struct units *units, char *s, size_t len,
tmp = (*print) (s, len, divisor, u->name, num); tmp = (*print) (s, len, divisor, u->name, num);
if (tmp < 0) if (tmp < 0)
return tmp; return tmp;
if (tmp > len) { if (tmp > (int) len) {
len = 0; len = 0;
s = NULL; s = NULL;
} else { } else {
@@ -245,7 +245,7 @@ update_unit_approx (int in, unsigned mult)
return update_unit (in, mult); return update_unit (in, mult);
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
unparse_units (int num, const struct units *units, char *s, size_t len) unparse_units (int num, const struct units *units, char *s, size_t len)
{ {
return unparse_something (num, units, s, len, return unparse_something (num, units, s, len,
@@ -254,7 +254,7 @@ unparse_units (int num, const struct units *units, char *s, size_t len)
"0"); "0");
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
unparse_units_approx (int num, const struct units *units, char *s, size_t len) unparse_units_approx (int num, const struct units *units, char *s, size_t len)
{ {
return unparse_something (num, units, s, len, return unparse_something (num, units, s, len,
@@ -263,7 +263,7 @@ unparse_units_approx (int num, const struct units *units, char *s, size_t len)
"0"); "0");
} }
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
print_units_table (const struct units *units, FILE *f) print_units_table (const struct units *units, FILE *f)
{ {
const struct units *u, *u2; const struct units *u, *u2;
@@ -308,7 +308,7 @@ update_flag (int in, unsigned mult)
return in - mult; return in - mult;
} }
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
unparse_flags (int num, const struct units *units, char *s, size_t len) unparse_flags (int num, const struct units *units, char *s, size_t len)
{ {
return unparse_something (num, units, s, len, return unparse_something (num, units, s, len,
@@ -317,7 +317,7 @@ unparse_flags (int num, const struct units *units, char *s, size_t len)
""); "");
} }
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
print_flags_table (const struct units *units, FILE *f) print_flags_table (const struct units *units, FILE *f)
{ {
const struct units *u; const struct units *u;

View File

@@ -41,9 +41,11 @@
#ifndef ROKEN_LIB_FUNCTION #ifndef ROKEN_LIB_FUNCTION
#ifdef _WIN32 #ifdef _WIN32
#define ROKEN_LIB_FUNCTION _stdcall #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL __cdecl
#else #else
#define ROKEN_LIB_FUNCTION #define ROKEN_LIB_FUNCTION
#define ROKEN_LIB_CALL
#endif #endif
#endif #endif
@@ -52,28 +54,28 @@ struct units {
unsigned mult; unsigned mult;
}; };
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
parse_units (const char *s, const struct units *units, parse_units (const char *s, const struct units *units,
const char *def_unit); const char *def_unit);
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
print_units_table (const struct units *units, FILE *f); print_units_table (const struct units *units, FILE *f);
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
parse_flags (const char *s, const struct units *units, parse_flags (const char *s, const struct units *units,
int orig); int orig);
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
unparse_units (int num, const struct units *units, char *s, size_t len); unparse_units (int num, const struct units *units, char *s, size_t len);
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
unparse_units_approx (int num, const struct units *units, char *s, unparse_units_approx (int num, const struct units *units, char *s,
size_t len); size_t len);
int ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
unparse_flags (int num, const struct units *units, char *s, size_t len); unparse_flags (int num, const struct units *units, char *s, size_t len);
void ROKEN_LIB_FUNCTION ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL
print_flags_table (const struct units *units, FILE *f); print_flags_table (const struct units *units, FILE *f);
#endif /* __PARSE_UNITS_H__ */ #endif /* __PARSE_UNITS_H__ */

Some files were not shown because too many files have changed in this diff Show More