Fri, 28 Jan 2022 16:01:05 +0100
add support for vfsclass parameter in nametrans safs
/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2022 Olaf Wintermann. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. 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 "vfs.h" static VFS pg_vfs_class = { pg_vfs_open, pg_vfs_stat, pg_vfs_fstat, pg_vfs_opendir, pg_vfs_fdopendir, pg_vfs_mkdir, pg_vfs_unlink, pg_vfs_rmdir }; static VFS_IO pg_vfs_io_class = { pg_vfs_io_read, pg_vfs_io_write, pg_vfs_io_pread, pg_vfs_io_pwrite, pg_vfs_io_seek, pg_vfs_io_close, NULL, // no pg aio implementation yet NULL }; static VFS_DIRIO pg_vfs_dirio_class = { pg_vfs_dirio_readdir, pg_vfs_dirio_close }; VFS* pg_vfs_create(Session *sn, Request *rq, pblock *pb) { // resourcepool is required char *resource_pool = pblock_find("resourcepool", pb); if(!resource_pool) { log_ereport(LOG_MISCONFIG, "pg_vfs_create: missing resourcepool parameter"); return NULL; } // get the resource first (most likely to fail due to misconfig) ResourceData *resdata = resourcepool_lookup(sn, rq, resource_pool, 0); if(!resdata) { log_ereport(LOG_MISCONFIG, "postgresql vfs: resource pool %s not found", resource_pool); return NULL; } // resdata will be freed automatically when the request is finished // Create a new VFS object and a separate instance object // VFS contains fptrs that can be copied from pg_vfs_class // instance contains request specific data (PGconn) VFS *vfs = pool_malloc(sn->pool, sizeof(VFS)); if(!vfs) { return NULL; } PgVFS *vfs_priv = pool_malloc(sn->pool, sizeof(PgVFS)); if(!vfs_priv) { pool_free(sn->pool, vfs); return NULL; } memcpy(vfs, &pg_vfs_class, sizeof(VFS)); vfs->flags = 0; vfs->instance = vfs_priv; return vfs; } /* -------------------------- VFS functions -------------------------- */ SYS_FILE pg_vfs_open(VFSContext *ctx, const char *path, int oflags) { } int pg_vfs_stat(VFSContext *ctx, const char *path, struct stat *buf) { } int pg_vfs_fstat(VFSContext *ctx, SYS_FILE fd, struct stat *buf) { } VFS_DIR pg_vfs_opendir(VFSContext *ctx, const char *path) { } VFS_DIR pg_vfs_fdopendir(VFSContext *ctx, SYS_FILE fd) { } int pg_vfs_mkdir(VFSContext *ctx, const char *path) { } int pg_vfs_unlink(VFSContext *ctx, const char *path) { } int pg_vfs_rmdir(VFSContext *Ctx, const char *path) { } /* -------------------------- VFS_IO functions -------------------------- */ ssize_t pg_vfs_io_read(SYS_FILE fd, void *buf, size_t nbyte) { } ssize_t pg_vfs_io_write(SYS_FILE fd, const void *buf, size_t nbyte) { } ssize_t pg_vfs_io_pread(SYS_FILE fd, void *buf, size_t nbyte, off_t offset) { } ssize_t pg_vfs_io_pwrite(SYS_FILE fd, const void *buf, size_t nbyte, off_t offset) { } off_t pg_vfs_io_seek(SYS_FILE fd, off_t offset, int whence) { } void pg_vfs_io_close(SYS_FILE fd) { } /* -------------------------- VFS_DIRIO functions -------------------------- */ int pg_vfs_dirio_readdir(VFS_DIR dir, VFS_ENTRY *entry, int getstat) { } void pg_vfs_dirio_close(VFS_DIR dir) { }