home *** CD-ROM | disk | FTP | other *** search
- /* getdesc.c - Get file description
- *
- * Copyright (c) 1991, 1992 Tim Cook.
- * Non-profit distribution allowed. See README for details.
- */
-
- static char rcsid[] = "$Id: getdesc.c,v 1.2 1992/12/02 03:45:17 tim Exp $";
-
- #include "config.h"
- #include <fcntl.h>
- #include <sys/errno.h>
-
- extern int errno ;
- extern int _desc_parse_path () ;
- extern char *_desc_pathname ;
- extern char *_desc_directory ;
- extern char *_desc_name ;
- extern int _initdesc () ;
- #ifdef NDBM
- extern DBM *_desc_database ;
- #endif
-
-
- char *getdesc (pathname, directory, name, inode)
- char *pathname ;
- char *directory ;
- char *name ;
- ino_t inode ;
- {
- static datum key, value ;
-
- if (! pathname && ! name) {
- if (! inode) {
- errno = EINVAL ;
- return NULL_CP ; }
- else {
- _desc_name = name ;
- _desc_pathname = pathname ;
- if (directory && *directory)
- _desc_directory = directory ;
- else
- _desc_directory = "." ; } }
- else if (! _desc_parse_path (pathname, directory, name)) {
- errno = EINVAL ;
- return NULL_CP ; }
-
- if (_initdesc (_desc_directory, O_RDONLY)) {
-
- /* We have a description database */
-
- int found = FALSE ;
-
- if (_desc_name) {
-
- /* Check for it by name */
-
- key.dptr = _desc_name ;
- key.dsize = strlen (_desc_name) ;
- if (key.dsize == sizeof (ino_t))
- key.dsize++ ;
- value = DBM_fetch (_desc_database, key) ;
- found = value.dptr != NULL_CP ; }
-
- if (! found && inode) {
-
- /* Check for it by inode */
-
- key.dptr = (char *) &inode ;
- key.dsize = sizeof (ino_t) ;
- value = DBM_fetch (_desc_database, key) ;
- if (value.dptr != NULL_CP) {
- char temp[sizeof (ino_t) + 1] ;
-
- /* Now use the name we got using the inode */
-
- if (value.dsize == sizeof (ino_t)) {
- strncpy (temp, value.dptr, sizeof (ino_t)) ;
- temp[sizeof (ino_t) + 1] = EOS ;
- key.dptr = temp ;
- key.dsize = sizeof (temp) ; }
- else {
- key.dptr = value.dptr ;
- key.dsize = value.dsize ; }
- value = DBM_fetch (_desc_database, key) ;
- found = value.dptr != NULL_CP ; } }
-
- if (found)
- return value.dptr ;
- }
- return NULL_CP ;
- }
-