aboutsummaryrefslogtreecommitdiffstats
path: root/plpnfsd/mp_inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'plpnfsd/mp_inode.c')
-rw-r--r--plpnfsd/mp_inode.c338
1 files changed, 0 insertions, 338 deletions
diff --git a/plpnfsd/mp_inode.c b/plpnfsd/mp_inode.c
deleted file mode 100644
index eab6aa4..0000000
--- a/plpnfsd/mp_inode.c
+++ /dev/null
@@ -1,338 +0,0 @@
-/* $Id$
- *
- * Original version of this file from p3nfsd-5.4 by
- * Rudolf Koenig (rfkoenig@immd4.informatik.uni-erlangen.de)
- *
- * Modifications for plputils by Fritz Elfert <felfert@to.com>
- *
- */
-#include <stdio.h>
-#include "nfs_prot.h"
-#include "mp.h"
-#include "rfsv_api.h"
-
-#if defined(__SVR4) || defined(__GLIBC__) || defined(__FreeBSD__) || defined(__NetBSD__)
-#include <string.h>
-#include <stdlib.h>
-#endif
-#ifdef __NeXT__
-#include <string.h>
-#include <objc/hashtable.h>
-#define strdup NXCopyStringBuffer
-#endif
-#define HASHSIZE 999
-
-static int nextinode = 6;
-static p_inode *numtab[HASHSIZE];
-static p_inode *namtab[HASHSIZE];
-
-/*
- * Verrry simple hash :-)
- */
-static unsigned
-hash(str)
-char *str;
-{
- unsigned i = 0, hashval = 3 * HASHSIZE / 4;
-
- while (*str) {
- i = *str++;
- hashval = (hashval << (i & 7)) + i;
- }
-
- return hashval % HASHSIZE;
-}
-
-/* Get struct with inode */
-p_inode *
-get_num(i)
-int i;
-{
- p_inode *ptr;
-
- for (ptr = numtab[i % HASHSIZE]; ptr; ptr = ptr->nextnum)
- if (i == ptr->inode)
- break;
- if (!ptr) {
- errorlog("Inode %d not found (aborting)\n", i);
- abort();
- }
- return ptr;
-}
-
-static p_inode *
-newinode(name, inode)
-char *name;
-int inode;
-{
- p_inode *ptr;
- int idx = hash(name);
-
- ptr = (p_inode *) malloc(sizeof(*ptr));
- ptr->name = (char *) strdup(name);
- ptr->inode = inode;
-
-/* insert into both hashtabs */
- ptr->nextnam = namtab[idx];
- namtab[idx] = ptr;
-
- ptr->nextnum = numtab[inode % HASHSIZE];
- numtab[inode % HASHSIZE] = ptr;
-
- return ptr;
-}
-
-/* Get/create struct with name */
-p_inode *
-get_nam(name)
-char *name;
-{
- p_inode *ptr;
- int idx = hash(name);
-
- for (ptr = namtab[idx]; ptr; ptr = ptr->nextnam)
- if (!strcmp(name, ptr->name))
- break;
- if (!ptr)
- ptr = newinode(name, nextinode++);
- if (debug > 1)
- debuglog("get_nam(\"%s\") returns %08x -> inode = %d\n",
- name, (unsigned int) ptr, ptr->inode);
- return ptr;
-}
-
-void
-inode2fh(inode, fh)
-int inode;
-char *fh;
-{
- bzero(fh, NFS_FHSIZE);
- bcopy((char *) &inode, fh, sizeof(inode));
-}
-
-int
-fh2inode(fh)
-char *fh;
-{
- int inode;
-
- bcopy(fh, (char *) &inode, sizeof(inode));
- return inode;
-}
-
-
-
-/* Rename: the inode must be preserved */
-p_inode *
-re_nam(old, new)
-char *old, *new;
-{
- p_inode *nptr, *optr, **nampp, **numpp;
- int idx = hash(old);
-
- if (debug)
- debuglog("re_nam: %s->%s\n", old, new);
- for (nampp = &namtab[idx]; *nampp; nampp = &(*nampp)->nextnam)
- if (!strcmp(old, (*nampp)->name))
- break;
- if (!*nampp)
- return get_nam(new);
-
- optr = *nampp;
- if (debug)
- debuglog("re_nam: %d\n", optr->inode);
- *nampp = optr->nextnam;
-
- /* delete it from the other hashtab too */
- idx = optr->inode % HASHSIZE;
- for (numpp = &numtab[idx]; *numpp; numpp = &(*numpp)->nextnum)
- if (optr == (*numpp))
- break;
- if (!*numpp) {
- errorlog("Entry in one hashtab only (aborting)\n");
- abort();
- }
- *numpp = optr->nextnum;
-
- nptr = newinode(new, optr->inode);
- if (debug)
- debuglog("re_nam: new entry created\n");
- free(optr->name);
- free(optr);
-
- return nptr;
-}
-
-/* Cache routines */
-struct cache *
-search_cache(root, inode)
-struct cache *root;
-unsigned inode;
-{
- struct cache *cp;
-
- if (debug)
- debuglog("search_cache %d\n", inode);
- for (cp = root; cp; cp = cp->next)
- if (cp->inode == inode) {
- cp->stamp = time(0);
- return cp;
- }
- return 0;
-}
-
-struct cache *
-add_cache(struct cache **root, unsigned int inode, fattr *fp) {
- struct cache *cp;
-
- if (debug)
- debuglog("add_cache %d\n", inode);
- cp = (struct cache *) malloc(sizeof(*cp));
- if (cp != NULL) {
- cp->stamp = time(0);
- cp->inode = inode;
- cp->attr = *fp;
- cp->dcache = 0;
- cp->actual_size = fp->size;
- cp->next = *root;
- *root = cp;
- }
- return cp;
-}
-
-struct dcache *
-add_dcache(cp, offset, len, data)
-struct cache *cp;
-unsigned offset, len;
-unsigned char *data;
-{
- struct dcache *dcp;
- dcp = (struct dcache *) malloc(sizeof(*dcp));
- dcp->towrite = 1;
- dcp->offset = offset;
- dcp->data = 0;
- dcp->len = len;
- if (len) {
- dcp->data = (unsigned char *) malloc(len);
- bcopy(data, dcp->data, len);
- }
- dcp->next = cp->dcache;
- cp->dcache = dcp;
- return dcp;
-}
-
-void
-clean_dcache(cp)
-struct cache *cp;
-{
- struct dcache *dcp, *dcpn;
- for (dcp = cp->dcache; dcp; dcp = dcpn) {
- dcpn = dcp->next;
- if (dcp->len)
- free(dcp->data);
- free(dcp);
- }
- cp->dcache = 0;
-}
-
-struct dcache *
-search_dcache(cp, off, len)
-struct cache *cp;
-unsigned int off, len;
-{
- struct dcache *dcp;
- for (dcp = cp->dcache; dcp; dcp = dcp->next)
- if (dcp->offset == off && dcp->len >= len)
- return dcp;
- return 0;
-}
-
-void
-rem_cache(struct cache **root, unsigned int inode) {
- struct cache *cp, **cpp;
-
- if (debug)
- debuglog("rem_cache %d\n", inode);
- for (cpp = root; (cp = *cpp); cpp = &cp->next)
- if (cp->inode == inode)
- break;
- if (!cp)
- return;
- *cpp = cp->next;
- clean_dcache(cp);
- free(cp);
-}
-
-time_t cache_keep = 30;
-
-void
-clean_cache(struct cache **root) {
- struct cache **cp = root;
- time_t now = time(0);
-
- while (*cp) {
- if (force_cache_clean || ((now - (*cp)->stamp) > cache_keep)) {
- struct cache *old = *cp;
- if (debug)
- debuglog("clean_cache %d\n", (*cp)->inode);
- *cp = (*cp)->next;
- clean_dcache(old);
- free(old);
- } else
- cp = &(*cp)->next;
- }
-}
-
-char *
-build_path(dir, file)
-char *dir, *file;
-{
- /* FIXME: Buffer overflow */
- static char namebuf[300];
-
- if (!strcmp(dir, ""))
- strcpy(namebuf, file);
- else
- sprintf(namebuf, "%s\\%s", dir, file);
-
- return namebuf;
-}
-
-int
-getpinode(inode)
-p_inode *inode;
-{
- char *p;
- int i;
-
- if (inode->inode == root_fattr.fileid) /* Root inode */
- i = root_fattr.fileid - 1; /* RUDI !!! */
- else if (!(p = (char *) rindex(inode->name, '\\'))) /* device inode */
- i = root_fattr.fileid;
- else {
- *p = 0;
- i = get_nam(inode->name)->inode;
- *p = '\\';
- }
- return i;
-}
-
-char *
-dirname(dir)
-char *dir;
-{
- static char namebuf[300];
- sprintf(namebuf, "%s\\", dir);
- return namebuf;
-}
-
-char *
-filname(dir)
-char *dir;
-{
- char *p;
- if ((p = (char *) rindex(dir, '\\')))
- return p + 1;
- else
- return dir;
-}