From 5e1a84ab74d5e97582427f016f291a8c11e66f99 Mon Sep 17 00:00:00 2001 From: jutteau Date: Fri, 11 May 2007 18:10:19 +0000 Subject: Completion du script de mise à jour de la pc-104 : * Ajout des sources de busybox dans ./conf/busybox/ * Ajout d'un fichier réclamé par les script dans ./conf/busybox.links --- i/pc104/initrd/conf/busybox/libbb/inode_hash.c | 90 ++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 i/pc104/initrd/conf/busybox/libbb/inode_hash.c (limited to 'i/pc104/initrd/conf/busybox/libbb/inode_hash.c') diff --git a/i/pc104/initrd/conf/busybox/libbb/inode_hash.c b/i/pc104/initrd/conf/busybox/libbb/inode_hash.c new file mode 100644 index 0000000..0705102 --- /dev/null +++ b/i/pc104/initrd/conf/busybox/libbb/inode_hash.c @@ -0,0 +1,90 @@ +/* vi: set sw=4 ts=4: */ +/* + * Utility routines. + * + * Copyright (C) many different people. + * If you wrote this, please acknowledge your work. + * + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ + +#include +#include +#include +#include "libbb.h" + +typedef struct ino_dev_hash_bucket_struct { + struct ino_dev_hash_bucket_struct *next; + ino_t ino; + dev_t dev; + char name[1]; +} ino_dev_hashtable_bucket_t; + +#define HASH_SIZE 311 /* Should be prime */ +#define hash_inode(i) ((i) % HASH_SIZE) + +/* array of [HASH_SIZE] elements */ +static ino_dev_hashtable_bucket_t **ino_dev_hashtable; + +/* + * Return name if statbuf->st_ino && statbuf->st_dev are recorded in + * ino_dev_hashtable, else return NULL + */ +char *is_in_ino_dev_hashtable(const struct stat *statbuf) +{ + ino_dev_hashtable_bucket_t *bucket; + + if (!ino_dev_hashtable) + return NULL; + + bucket = ino_dev_hashtable[hash_inode(statbuf->st_ino)]; + while (bucket != NULL) { + if ((bucket->ino == statbuf->st_ino) + && (bucket->dev == statbuf->st_dev) + ) { + return bucket->name; + } + bucket = bucket->next; + } + return NULL; +} + +/* Add statbuf to statbuf hash table */ +void add_to_ino_dev_hashtable(const struct stat *statbuf, const char *name) +{ + int i; + ino_dev_hashtable_bucket_t *bucket; + + i = hash_inode(statbuf->st_ino); + if (!name) + name = ""; + bucket = xmalloc(sizeof(ino_dev_hashtable_bucket_t) + strlen(name)); + bucket->ino = statbuf->st_ino; + bucket->dev = statbuf->st_dev; + strcpy(bucket->name, name); + + if (!ino_dev_hashtable) + ino_dev_hashtable = xzalloc(HASH_SIZE * sizeof(*ino_dev_hashtable)); + + bucket->next = ino_dev_hashtable[i]; + ino_dev_hashtable[i] = bucket; +} + +#if ENABLE_FEATURE_CLEAN_UP +/* Clear statbuf hash table */ +void reset_ino_dev_hashtable(void) +{ + int i; + ino_dev_hashtable_bucket_t *bucket; + + for (i = 0; i < HASH_SIZE; i++) { + while (ino_dev_hashtable[i] != NULL) { + bucket = ino_dev_hashtable[i]->next; + free(ino_dev_hashtable[i]); + ino_dev_hashtable[i] = bucket; + } + } + free(ino_dev_hashtable); + ino_dev_hashtable = NULL; +} +#endif -- cgit v1.2.3