This is psinode.h in view mode; [Download] [Up]
/*
* Name: psinode.h
* Description: Interface and basic funtions of pseudo inode handling.
* Author: Christian Starkjohann <cs@hal.kph.tuwien.ac.at>
* Date: 1996-12-06
* Copyright: GNU-GPL
* Tabsize: 4
*/
#define REFCOUNT_MAX 65535 /* limited by unsigned short */
#define PATHBUF_SIZE 2048 /* buffer size for server pathes */
#define DOS_PATHSEP '\\' /* path separator in DOS */
#define HASH_MAGIC_L 0x12345678
#define HASH_MAGIC_H 0x87654321
/* ------------------------------------------------------------------------- */
typedef struct psinode{
struct psinode *next;
struct psinode **prevnext; /* doubly linked list for LRU queue */
long long ino; /* full hash value */
struct psinode *parent; /* parent directory */
unsigned short refcount; /* reference counting for directories */
char name[1]; /* name of the file */
}psinode_t;
typedef struct list{
void *head; /* first element in list */
void **tail; /* pointer to 'next' entry of last element */
}list_t;
typedef struct psinode_table{
psinode_t **table; /* the table itself */
int table_size; /* size of hashtable */
int load; /* number of inodes in hashtable */
int fill_limit; /* defines fill grade of hashtable */
int delete_on_gc; /* delete this much if load > fill_limit */
int max_search; /* number of places to search */
list_t lru; /* list for least recently used mechanism */
}psinode_table_t;
/* ------------------------------------------------------------------------- */
static inline void list_init(list_t *list)
{
list->head = NULL;
list->tail = &list->head;
}
static inline void list_remove_element(list_t *list, void *e)
{
struct _entry{struct _entry *next; struct _entry **prevnext;} *entry = e;
*entry->prevnext = entry->next;
if(list->tail == (void **)&entry->next){ /* if we are the last entry */
list->tail = (void *)entry->prevnext; /* previous is last one now */
}
if(entry->next != NULL){
entry->next->prevnext = entry->prevnext;
}
entry->prevnext = NULL;
entry->next = NULL;
}
static inline void list_append(list_t *list, void *e)
{
struct _entry{struct _entry *next; struct _entry **prevnext;} *entry = e;
entry->prevnext = (void *)list->tail;
*list->tail = entry;
list->tail = (void *)&entry->next;
entry->next = NULL;
}
static inline void list_move_to_end(list_t *list, void *e)
{
struct _entry{struct _entry *next; struct _entry **prevnext;} *entry = e;
if(entry->next == NULL) /* we are already the last! */
return;
*entry->prevnext = entry->next; /* take us out of the list */
entry->next->prevnext = entry->prevnext;
entry->prevnext = (void *)list->tail; /* put us at the end */
*list->tail = entry;
list->tail = (void *)&entry->next;
entry->next = NULL;
}
/* ------------------------------------------------------------------------- */
extern psinode_table_t psitable; /* table of pseudo-inodes */
extern long long root_inum; /* pseudo inode numbe for root */
/* ------------------------------------------------------------------------- */
int psi_index(long long ino);
long long psi_inum(long long parent_ino, char *name);
int psi_lookup(int parent_i, char *name, long long *ino);
void psi_delete(long long ino);
int psi_define_root(char *name, long long *ino);
char *psi_to_path(int index, char pathsep, char *ending);
void psi_init(int table_size, int low_mark, int high_mark);
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.