Filedescriptors are the underlying working horse in accessing files. All information associated with managing a file is kept here.
Definition in file filedescriptor.h.
#include "lib/mutex.h"
#include "lib/psplay.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "backend/filehandle.h"
#include "backend/file.h"


Go to the source code of this file.
Classes | |
| struct | lumiera_filedescriptor_struct |
Typedefs | |
|
typedef struct lumiera_filedescriptor_struct | lumiera_filedescriptor |
| typedef lumiera_filedescriptor * | LumieraFiledescriptor |
Functions | |
| LumieraFiledescriptor | lumiera_filedescriptor_acquire (const char *name, int flags) |
| Find existing filedescriptor or create one. | |
| void | lumiera_filedescriptor_delete (LumieraFiledescriptor self) |
| Delete a filedescriptor Called whenever its reference count drops to zero. | |
| LumieraFiledescriptor | lumiera_filedescriptor_new (LumieraFiledescriptor template) |
| Allocate a new filedescriptor cloned from a template. | |
| void | lumiera_filedescriptor_registry_destroy (void) |
| Destroy and free the global filedescriptor registry. | |
| void | lumiera_filedescriptor_registry_init (void) |
| Initialize the global filedescriptor registry. | |
| void | lumiera_filedescriptor_release (LumieraFiledescriptor self) |
| Release a filedescriptor. | |
| void lumiera_filedescriptor_registry_init | ( | void | ) |
Initialize the global filedescriptor registry.
All filedescriptors are looked up by dev/ino/open-flags in a hashtable. Opening hardlinked files will be targeted to the same filedescriptor. This function never fails but dies on error.
Definition at line 89 of file filedescriptor.c.
References LUMIERA_DIE.
00090 { 00091 NOBUG_INIT_FLAG (filedescriptor); 00092 TRACE (filedescriptor); 00093 REQUIRE (!registry); 00094 00095 registry = psplay_new (cmp_fn, key_fn, delete_fn); 00096 if (!registry) 00097 LUMIERA_DIE (NO_MEMORY); 00098 00099 TODO ("LumieraMutex lumiera_mutex_init (LumieraMutex self, const char* purpose, struct nobug_flag* flag);"); 00100 00101 // RESOURCE_HANDLE_INIT (registry_mutex.rh); 00102 RESOURCE_ANNOUNCE (filedescriptor, "mutex", "filedescriptor registry", ®istry, registry_mutex.rh); 00103 }
| void lumiera_filedescriptor_registry_destroy | ( | void | ) |
Destroy and free the global filedescriptor registry.
Never fails.
Definition at line 106 of file filedescriptor.c.
References psplay_nelements().
00107 { 00108 TRACE (filedescriptor); 00109 REQUIRE (!psplay_nelements (registry)); 00110 00111 RESOURCE_FORGET (filedescriptor, registry_mutex.rh); 00112 00113 TODO ("LumieraMutex lumiera_mutex_destroy (LumieraMutex self, struct nobug_flag* flag);"); 00114 00115 if (registry) 00116 psplay_destroy (registry); 00117 registry = NULL; 00118 }

| LumieraFiledescriptor lumiera_filedescriptor_acquire | ( | const char * | name, | |
| int | flags | |||
| ) |
Find existing filedescriptor or create one.
| name | name of the file | |
| flags | opening flags for the filedescriptor |
Definition at line 122 of file filedescriptor.c.
References LUMIERA_ERROR_SET, and LUMIERA_MUTEX_SECTION.
00123 { 00124 TRACE (filedescriptor, "%s", name); 00125 REQUIRE (registry, "not initialized"); 00126 00127 LumieraFiledescriptor dest = NULL; 00128 00129 LUMIERA_MUTEX_SECTION (filedescriptor, ®istry_mutex) 00130 { 00131 lumiera_filedescriptor fdesc; 00132 fdesc.flags = flags; 00133 00134 if (stat (name, &fdesc.stat) != 0) 00135 { 00136 if (errno == ENOENT && flags&O_CREAT) 00137 { 00138 char* dir = lumiera_tmpbuf_strndup (name, PATH_MAX); 00139 char* slash = dir; 00140 while ((slash = strchr (slash+1, '/'))) 00141 { 00142 *slash = '\0'; 00143 INFO (filedescriptor, "try creating dir: %s", dir); 00144 if (mkdir (dir, 0777) == -1 && errno != EEXIST) 00145 { 00146 LUMIERA_ERROR_SET (filedescriptor, ERRNO); 00147 goto error; 00148 } 00149 *slash = '/'; 00150 } 00151 int fd; 00152 INFO (filedescriptor, "try creating file: %s", name); 00153 fd = creat (name, 0777); 00154 if (fd == -1) 00155 { 00156 LUMIERA_ERROR_SET (filedescriptor, ERRNO); 00157 goto error; 00158 } 00159 close (fd); 00160 if (stat (name, &fdesc.stat) != 0) 00161 { 00162 /* finally, no luck */ 00163 LUMIERA_ERROR_SET (filedescriptor, ERRNO); 00164 goto error; 00165 } 00166 } 00167 } 00168 00169 /* lookup/create descriptor */ 00170 dest = (LumieraFiledescriptor) psplay_find (registry, &fdesc, 100); 00171 00172 if (!dest) 00173 { 00174 TRACE (filedescriptor, "Descriptor not found"); 00175 00176 dest = lumiera_filedescriptor_new (&fdesc); 00177 if (!dest) 00178 goto error; 00179 00180 psplay_insert (registry, &dest->node, 100); 00181 } 00182 else 00183 { 00184 TRACE (filedescriptor, "Descriptor already existing"); 00185 ++dest->refcount; 00186 } 00187 error: ; 00188 } 00189 00190 return dest; 00191 }
| void lumiera_filedescriptor_release | ( | LumieraFiledescriptor | self | ) |
Release a filedescriptor.
| self | filedescriptor to be released |
Definition at line 195 of file filedescriptor.c.
00196 { 00197 TRACE (filedescriptor, "%p", self); 00198 if (!--self->refcount) 00199 lumiera_filedescriptor_delete (self); 00200 }
| LumieraFiledescriptor lumiera_filedescriptor_new | ( | LumieraFiledescriptor | template | ) |
Allocate a new filedescriptor cloned from a template.
| template | the source filedescriptor |
Definition at line 204 of file filedescriptor.c.
References lumiera_mutex_init().
00205 { 00206 LumieraFiledescriptor self = lumiera_malloc (sizeof (lumiera_filedescriptor)); 00207 TRACE (filedescriptor, "at %p", self); 00208 00209 psplaynode_init (&self->node); 00210 self->stat = template->stat; 00211 00212 self->flags = template->flags; 00213 self->refcount = 1; 00214 self->handle = 0; 00215 00216 lumiera_mutex_init (&self->lock, "filedescriptor", &NOBUG_FLAG (filedescriptor)); 00217 00218 return self; 00219 }

| void lumiera_filedescriptor_delete | ( | LumieraFiledescriptor | self | ) |
Delete a filedescriptor Called whenever its reference count drops to zero.
| self | the filedescriptor to be deleted |
Definition at line 223 of file filedescriptor.c.
References lumiera_free(), lumiera_mutex_destroy(), and LUMIERA_MUTEX_SECTION.
00224 { 00225 TRACE (filedescriptor, "%p", self); 00226 00227 LUMIERA_MUTEX_SECTION (filedescriptor, ®istry_mutex) 00228 { 00229 REQUIRE (self->refcount == 0); 00230 00231 psplay_remove (registry, &self->node); 00232 00233 TODO ("destruct other members (WIP)"); 00234 00235 00236 TODO ("release filehandle"); 00237 00238 lumiera_mutex_destroy (&self->lock, &NOBUG_FLAG (filedescriptor)); 00239 lumiera_free (self); 00240 } 00241 }

1.5.6