home *** CD-ROM | disk | FTP | other *** search
- /* describe.c - Set or list a descriptive comment for a file
- *
- * Copyright (c) 1991 Tim Cook.
- * Non-profit distribution allowed. See README for details.
- */
-
- static char rcsid[] = "$Header: describe.c 1.0 91/03/22 $" ;
-
- #include <stdio.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/dir.h>
- #include <sys/file.h>
- #include <sys/stat.h>
- #ifdef NDBM
- #include <ndbm.h>
- #else
- #if defined(sequent) && defined(NULL)
- #undef NULL /* On the Sequent, dbm.h #define's NULL */
- #endif
- #include <dbm.h>
- #endif
- #include <vclib.h>
-
- #ifdef sequent
- #define strrchr rindex
- #endif
-
- #define NULL_CP ((char *) 0)
- #define EOS '\0'
-
- static char *program_name ;
- #ifdef NDBM
- static DBM *desc_database ;
- #endif
-
- static void usage () ;
- static int init_desc_file () ;
- static void set_description () ;
- static void set_from_file () ;
- static void delete_description () ;
- static void list_descriptions () ;
-
-
- int main (argc, argv)
- int argc ;
- char **argv ;
- {
- extern char *optarg ;
- extern int optind, opterr ;
- char directory[MAXNAMLEN+1] ;
- char file_name[MAXNAMLEN+1] ;
- int delete_desc = FALSE ;
- struct stat status ;
- int option ;
- char *p ;
-
- program_name = argv[0] ;
- while ((option = getopt (argc, argv, "dls:")) != EOF) {
- switch (option) {
- case 's': /* Set descriptions from file */
- if (delete_desc)
- usage () ;
- if (optind >= argc)
- p = "." ;
- else
- p = argv[optind] ;
- init_desc_file (p, FALSE) ;
- set_from_file (optarg, p) ;
- #ifdef NDBM
- dbm_close (desc_database) ;
- #else
- dbmclose () ;
- #endif
- exit (0) ;
- break ;
- case 'l': /* List directory */
- if (delete_desc)
- usage () ;
- if (optind >= argc)
- p = "." ;
- else
- p = argv[optind] ;
- if (! init_desc_file (p, TRUE)) {
- fprintf (stderr, "%s: no descriptions for directory %s\n",
- program_name, p) ;
- exit (2) ; }
- list_descriptions () ;
- #ifdef NDBM
- dbm_close (desc_database) ;
- #else
- dbmclose () ;
- #endif
- exit (0) ;
- break ;
- case 'd': /* Delete description(s) */
- delete_desc = TRUE ;
- break ;
- default:
- usage () ; } }
-
- if (delete_desc) {
- if (optind >= argc)
- usage () ;
- for ( ; optind < argc ; optind++) {
- split_pathname (argv[optind], directory, file_name) ;
- if (stat (argv[optind], &status) == -1) {
- perror2 (program_name, argv[optind]) ; }
- else {
- init_desc_file (directory, FALSE) ;
- delete_description (file_name, status.st_ino) ; } } }
- else {
- if (argc != 3)
- usage () ;
-
- /* Set description of specified file */
- split_pathname (argv[1], directory, file_name) ;
- if (stat (argv[1], &status) == -1) {
- perror2 (program_name, argv[1]) ;
- exit (2) ; }
- init_desc_file (directory, FALSE) ;
- set_description (file_name, status.st_ino, argv[2]) ; }
-
- #ifdef NDBM
- dbm_close (desc_database) ;
- #else
- dbmclose () ;
- #endif
- }
-
-
- static
- void usage ()
- {
- fprintf (stderr, "\
- usage: %s <file> <description>\n\
- or: %s -s <descriptions-file> [<directory>]\n\
- or: %s -d <file> ...\n\
- or: %s -l [<directory>]\n",
- program_name, program_name, program_name, program_name) ;
- exit (1) ;
- }
-
-
- static
- void set_from_file (file, directory)
- char *file ;
- char *directory ;
- {
- FILE *descriptions ;
- char file_name[MAXNAMLEN+1] ;
- char buffer[1024] ;
- char description[256] ;
- struct stat status ;
- int n ;
-
- if (strcmp (file, "-") == 0)
- descriptions = stdin ;
- else {
- if ((descriptions = fopen (file, "r")) == (FILE *) NULL) {
-