From 77e8402dd68079c0e245fc8826daf2c6ad334766 Mon Sep 17 00:00:00 2001 From: Derrell Lipman Date: Tue, 26 Sep 2006 16:58:27 +0000 Subject: r18925: Add current snapshot of the ejs-2.0 code. Tridge, will you be incorporating this? (This used to be commit 917af234a8d517f82bd42256a940608a16b988f4) --- source4/lib/appweb/ejs-2.0/mpr/mprGenFile.c | 336 ++++++++++++++++++++++++++++ 1 file changed, 336 insertions(+) create mode 100644 source4/lib/appweb/ejs-2.0/mpr/mprGenFile.c (limited to 'source4/lib/appweb/ejs-2.0/mpr/mprGenFile.c') diff --git a/source4/lib/appweb/ejs-2.0/mpr/mprGenFile.c b/source4/lib/appweb/ejs-2.0/mpr/mprGenFile.c new file mode 100644 index 0000000000..517e43853f --- /dev/null +++ b/source4/lib/appweb/ejs-2.0/mpr/mprGenFile.c @@ -0,0 +1,336 @@ +/** + * @file mprGenFile.c + * @brief Generic File services + * @overview + * @remarks + * See OS/mprFile.c for the per O/S portions + */ + +/******************************************************************************/ +/* + * @copy default + * + * Copyright (c) Mbedthis Software LLC, 2003-2006. All Rights Reserved. + * + * This software is distributed under commercial and open source licenses. + * You may use the GPL open source license described below or you may acquire + * a commercial license from Mbedthis Software. You agree to be fully bound + * by the terms of either license. Consult the LICENSE.TXT distributed with + * this software for full details. + * + * This software is open source; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. See the GNU General Public License for more + * details at: http://www.mbedthis.com/downloads/gplLicense.html + * + * This program is distributed WITHOUT ANY WARRANTY; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * + * This GPL license does NOT permit incorporating this software into + * proprietary programs. If you are unable to comply with the GPL, you must + * acquire a commercial license to use this software. Commercial licenses + * for this software and support services are available from Mbedthis + * Software at http://www.mbedthis.com + * + * @end + */ + +/********************************** Includes **********************************/ + +#include "mpr.h" + +/****************************** Forward Declarations **************************/ +#if !BREW + +static int closeDestructor(void *data); + +/************************************ Code ************************************/ + +int mprStartFileServices(MprCtx ctx) +{ + MprApp *app; + + app = mprGetApp(ctx); + app->console = mprAllocTypeZeroed(ctx, MprFile); + app->error = mprAllocTypeZeroed(ctx, MprFile); + + /* + * We assume that STDOUT is 1 and STDERR is 2 + */ + app->console->fd = 1; + app->error->fd = 2; + + return 0; +} + +/******************************************************************************/ + +void mprStopFileServices(MprCtx ctx) +{ + MprApp *app; + + app = mprGetApp(ctx); + + mprFree(app->console); + app->console = 0; + mprFree(app->error); + app->error = 0; +} + +/******************************************************************************/ + +MprFile *mprOpen(MprCtx ctx, const char *path, int omode, int perms) +{ + MprFile *file; + + mprAssert(path && *path); + + file = mprAllocTypeZeroed(ctx, MprFile); + + file->fd = open(path, omode, perms); + if (file->fd < 0) { + mprFree(file); + return 0; + } + + mprSetDestructor(file, closeDestructor); + return file; +} + +/******************************************************************************/ + +static int closeDestructor(void *data) +{ + MprFile *file = (MprFile*) data; + + mprAssert(file); + + mprClose(file); + return 0; +} + +/******************************************************************************/ + +void mprClose(MprFile *file) +{ + mprAssert(file); + + if (file < 0) { + return; + } + + mprAssert(file->fd >= 0); + close(file->fd); + + mprSetDestructor(file, 0); + mprFree(file); +} + +/******************************************************************************/ + +int mprRead(MprFile *file, void *buf, uint size) +{ + mprAssert(file); + + if (file == 0) { + return MPR_ERR_BAD_HANDLE; + } + + return read(file->fd, buf, size); +} + +/******************************************************************************/ + +int mprWrite(MprFile *file, const void *buf, uint count) +{ + mprAssert(file); + + if (file == 0) { + return MPR_ERR_BAD_HANDLE; + } + + return write(file->fd, buf, count); +} + +/******************************************************************************/ + +int mprSeek(MprFile *file, int seekType, long distance) +{ + mprAssert(file); + + if (file == 0) { + return MPR_ERR_BAD_HANDLE; + } + + return lseek(file->fd, seekType, distance); +} + +/******************************************************************************/ + +int mprDelete(MprCtx ctx, const char *path) +{ + return unlink(path); +} + +/******************************************************************************/ + +int mprDeleteDir(MprCtx ctx, const char *path) +{ + return rmdir(path); +} + +#endif /* !BREW */ +/******************************************************************************/ + +char *mprGets(MprFile *file, char *buf, uint size) +{ + MprBuf *bp; + int count, len, c; + + mprAssert(file); + + if (file == 0) { + return 0; + } + + if (file->buf == 0) { + file->buf = mprCreateBuf(file, MPR_DEFAULT_ALLOC, MPR_MAX_STRING); + } + bp = file->buf; + + /* + * Must leave room for null + */ + count = 0; + while (--size > 0) { + if (mprGetBufLength(bp) == 0) { + mprFlushBuf(bp); + len = mprRead(file, mprGetBufEnd(bp), + mprGetBufLinearSpace(bp)); + if (len <= 0) { + return 0; + } + mprAdjustBufEnd(bp, len); + mprAddNullToBuf(bp); + } + if ((c = mprGetCharFromBuf(bp)) == '\n') { + buf[count] = '\0'; + return buf; + } + buf[count++] = c; + } + buf[count] = '\0'; + return buf; +} + +/******************************************************************************/ + +int mprPuts(MprFile *file, const char *writeBuf, uint count) +{ + MprBuf *bp; + char *buf; + int total, bytes, len; + + mprAssert(file); + + /* + * Buffer output and flush when full. + */ + if (file->buf == 0) { + file->buf = mprCreateBuf(file, MPR_BUFSIZE, 0); + if (file->buf == 0) { + return MPR_ERR_CANT_ALLOCATE; + } + } + bp = file->buf; + + if (mprGetBufLength(bp) > 0 && mprGetBufSpace(bp) < (int) count) { + len = mprGetBufLength(bp); + if (mprWrite(file, mprGetBufStart(bp), len) != len) { + return MPR_ERR_CANT_WRITE; + } + mprFlushBuf(bp); + } + + total = 0; + buf = (char*) writeBuf; + + while (count > 0) { + bytes = mprPutBlockToBuf(bp, buf, count); + if (bytes <= 0) { + return MPR_ERR_CANT_ALLOCATE; + } + count -= bytes; + buf += bytes; + total += bytes; + mprAddNullToBuf(bp); + + if (count > 0) { + len = mprGetBufLength(bp); + if (mprWrite(file, mprGetBufStart(bp), len) != len) { + return MPR_ERR_CANT_WRITE; + } + mprFlushBuf(bp); + } + } + return total; +} + +/******************************************************************************/ + +int mprMakeTempFileName(MprCtx ctx, char *buf, int bufsize, const char *tempDir) +{ + MprFile *file; + MprTime now; + char *dir; + int seed, i; + + if (tempDir == 0) { +#if WIN + char *cp; + dir = mprStrdup(ctx, getenv("TEMP")); + for (cp = dir; *cp; cp++) { + if (*cp == '\\') { + *cp = '/'; + } + } +#else + dir = mprStrdup(ctx, "/tmp"); +#endif + } else { + dir = mprStrdup(ctx, tempDir); + } + + mprGetTime(ctx, &now); + seed = now.msec % 64000; + file = 0; + + for (i = 0; i < 128; i++) { + mprSprintf(buf, bufsize, "%s/MPR_%d_%d.tmp", dir, getpid(), seed++); + file = mprOpen(ctx, buf, O_CREAT | O_EXCL | O_BINARY, 0664); + if (file) { + break; + } + } + + if (file == 0) { + return MPR_ERR_CANT_CREATE; + } + + mprClose(file); + mprFree(dir); + + return 0; +} + +/******************************************************************************/ +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + * vim:tw=78 + * vim600: sw=4 ts=4 fdm=marker + * vim<600: sw=4 ts=4 + */ -- cgit