X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=blobdiff_plain;f=lib%2Fmtio.c;h=70a0949684d4169c8aa6fec6cb51944939ba49c5;hp=b994cc20761aee71953e5eeb0c57db25aad9f2a5;hb=2a619a21d4af6cbc5033f987b2aa25ef2b749600;hpb=945d02f51b66c1ca7b8ae959cd06b4f9ebbd0954 diff --git a/lib/mtio.c b/lib/mtio.c index b994cc2..70a0949 100644 --- a/lib/mtio.c +++ b/lib/mtio.c @@ -107,7 +107,7 @@ static int mtclose(void *cookie) return(0); } -#ifdef HAVE_GLIBC_STDIO +#if defined(HAVE_GLIBC_STDIO) static cookie_io_functions_t iofuns = { .read = mtread, .write = mtwrite, @@ -130,6 +130,43 @@ FILE *mtstdopen(int fd, int issock, int timeout, char *mode) fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); return(ret); } +#elif defined(HAVE_BSD_STDIO) +static int bsd2mtread(void *cookie, char *buf, int len) +{ + return(mtread(cookie, buf, len)); +} + +static int bsd2mtwrite(void *cookie, const char *buf, int len) +{ + return(mtwrite(cookie, buf, len)); +} + +FILE *mtstdopen(int fd, int issock, int timeout, char *mode) +{ + struct stdiofd *d; + FILE *ret; + int r, w; + + if(!strcmp(mode, "r")) { + r = 1; w = 0; + } else if(!strcmp(mode, "w")) { + r = 0; w = 1; + } else if(!strcmp(mode, "r+")) { + r = w = 1; + } else { + return(NULL); + } + omalloc(d); + d->fd = fd; + d->sock = issock; + d->timeout = timeout; + ret = funopen(d, r?bsd2mtread:NULL, w?bsd2mtwrite:NULL, NULL, mtclose); + if(!ret) + free(d); + else + fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); + return(ret); +} #else #error "No stdio implementation for this system" #endif