home *** CD-ROM | disk | FTP | other *** search
/ The Unsorted BBS Collection / thegreatunsorted.tar / thegreatunsorted / hacking / internet / desc02.sh / getdesc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-02-04  |  2.1 KB  |  92 lines

  1. /* getdesc.c -    Get file description
  2.  *
  3.  * Copyright (c) 1991, 1992 Tim Cook.
  4.  * Non-profit distribution allowed.  See README for details.
  5.  */
  6.  
  7. static char rcsid[] = "$Id: getdesc.c,v 1.2 1992/12/02 03:45:17 tim Exp $";
  8.  
  9. #include "config.h"
  10. #include <fcntl.h>
  11. #include <sys/errno.h>
  12.  
  13. extern int errno ;
  14. extern int _desc_parse_path () ;
  15. extern char *_desc_pathname ;
  16. extern char *_desc_directory ;
  17. extern char *_desc_name ;
  18. extern int _initdesc () ;
  19. #ifdef NDBM
  20. extern DBM *_desc_database ;
  21. #endif
  22.  
  23.  
  24. char *getdesc (pathname, directory, name, inode)
  25.    char *pathname ;
  26.    char *directory ;
  27.    char *name ;
  28.    ino_t inode ;
  29. {
  30.    static datum key, value ;
  31.  
  32.    if (! pathname && ! name) {
  33.       if (! inode) {
  34.      errno = EINVAL ;
  35.      return NULL_CP ; }
  36.       else {
  37.      _desc_name = name ;
  38.      _desc_pathname = pathname ;
  39.      if (directory && *directory)
  40.         _desc_directory = directory ;
  41.      else
  42.         _desc_directory = "." ; } }
  43.    else if (! _desc_parse_path (pathname, directory, name)) {
  44.       errno = EINVAL ;
  45.       return NULL_CP ; }
  46.  
  47.    if (_initdesc (_desc_directory, O_RDONLY)) {
  48.  
  49.       /* We have a description database */
  50.  
  51.       int found = FALSE ;
  52.  
  53.       if (_desc_name) {
  54.  
  55.      /* Check for it by name */
  56.  
  57.      key.dptr = _desc_name ;
  58.      key.dsize = strlen (_desc_name) ;
  59.      if (key.dsize == sizeof (ino_t))
  60.         key.dsize++ ;
  61.      value = DBM_fetch (_desc_database, key) ;
  62.      found = value.dptr != NULL_CP ; }
  63.  
  64.       if (! found && inode) {
  65.  
  66.      /* Check for it by inode */
  67.  
  68.      key.dptr = (char *) &inode ;
  69.      key.dsize = sizeof (ino_t) ;
  70.      value = DBM_fetch (_desc_database, key) ;
  71.      if (value.dptr != NULL_CP) {
  72.         char temp[sizeof (ino_t) + 1] ;
  73.  
  74.         /* Now use the name we got using the inode */
  75.  
  76.         if (value.dsize == sizeof (ino_t)) {
  77.            strncpy (temp, value.dptr, sizeof (ino_t)) ;
  78.            temp[sizeof (ino_t) + 1] = EOS ;
  79.            key.dptr = temp ;
  80.            key.dsize = sizeof (temp) ; }
  81.         else {
  82.            key.dptr = value.dptr ;
  83.            key.dsize = value.dsize ; }
  84.         value = DBM_fetch (_desc_database, key) ;
  85.         found = value.dptr != NULL_CP ; } }
  86.  
  87.       if (found)
  88.      return value.dptr ;
  89.       }
  90.    return NULL_CP ;
  91.    }
  92.