Home | History | Annotate | Line # | Download | only in dns
      1 /*	$NetBSD: gen-unix.h,v 1.1 2024/02/18 20:57:31 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
      5  *
      6  * SPDX-License-Identifier: MPL-2.0
      7  *
      8  * This Source Code Form is subject to the terms of the Mozilla Public
      9  * License, v. 2.0. If a copy of the MPL was not distributed with this
     10  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
     11  *
     12  * See the COPYRIGHT file distributed with this work for additional
     13  * information regarding copyright ownership.
     14  */
     15 
     16 /*! \file
     17  * \brief
     18  * This file is responsible for defining two operations that are not
     19  * directly portable between Unix-like systems and Windows NT, option
     20  * parsing and directory scanning.  It is here because it was decided
     21  * that the "gen" build utility was not to depend on libisc.a, so
     22  * the functions declared in isc/commandline.h and isc/dir.h could not
     23  * be used.
     24  *
     25  * The commandline stuff is really just a wrapper around getopt().
     26  * The dir stuff was shrunk to fit the needs of gen.c.
     27  */
     28 
     29 #ifndef DNS_GEN_UNIX_H
     30 #define DNS_GEN_UNIX_H 1
     31 
     32 #include <dirent.h>
     33 #include <errno.h>
     34 #include <stdbool.h>
     35 #include <stdlib.h>
     36 #include <sys/types.h> /* Required on some systems for dirent.h. */
     37 #include <unistd.h>    /* XXXDCL Required for ?. */
     38 
     39 #include <isc/lang.h>
     40 
     41 #ifdef NEED_OPTARG
     42 extern char *optarg;
     43 #endif /* ifdef NEED_OPTARG */
     44 
     45 #define isc_commandline_parse	 getopt
     46 #define isc_commandline_argument optarg
     47 
     48 typedef struct {
     49 	DIR *handle;
     50 	char *filename;
     51 } isc_dir_t;
     52 
     53 ISC_LANG_BEGINDECLS
     54 
     55 static bool
     56 start_directory(const char *path, isc_dir_t *dir) {
     57 	dir->handle = opendir(path);
     58 
     59 	if (dir->handle != NULL) {
     60 		return (true);
     61 	} else {
     62 		return (false);
     63 	}
     64 }
     65 
     66 static bool
     67 next_file(isc_dir_t *dir) {
     68 	struct dirent *dirent;
     69 
     70 	dir->filename = NULL;
     71 
     72 	if (dir->handle != NULL) {
     73 		errno = 0;
     74 		dirent = readdir(dir->handle);
     75 		if (dirent != NULL) {
     76 			dir->filename = dirent->d_name;
     77 		} else {
     78 			if (errno != 0) {
     79 				exit(1);
     80 			}
     81 		}
     82 	}
     83 
     84 	if (dir->filename != NULL) {
     85 		return (true);
     86 	} else {
     87 		return (false);
     88 	}
     89 }
     90 
     91 static void
     92 end_directory(isc_dir_t *dir) {
     93 	if (dir->handle != NULL) {
     94 		(void)closedir(dir->handle);
     95 	}
     96 
     97 	dir->handle = NULL;
     98 }
     99 
    100 ISC_LANG_ENDDECLS
    101 
    102 #endif /* DNS_GEN_UNIX_H */
    103