PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
pgfnames.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * pgfnames.c
4  * directory handling functions
5  *
6  * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  * IDENTIFICATION
10  * src/common/pgfnames.c
11  *
12  *-------------------------------------------------------------------------
13  */
14 
15 #ifndef FRONTEND
16 #include "postgres.h"
17 #else
18 #include "postgres_fe.h"
19 #endif
20 
21 #include <dirent.h>
22 
23 /*
24  * pgfnames
25  *
26  * return a list of the names of objects in the argument directory. Caller
27  * must call pgfnames_cleanup later to free the memory allocated by this
28  * function.
29  */
30 char **
31 pgfnames(const char *path)
32 {
33  DIR *dir;
34  struct dirent *file;
35  char **filenames;
36  int numnames = 0;
37  int fnsize = 200; /* enough for many small dbs */
38 
39  dir = opendir(path);
40  if (dir == NULL)
41  {
42 #ifndef FRONTEND
43  elog(WARNING, "could not open directory \"%s\": %m", path);
44 #else
45  fprintf(stderr, _("could not open directory \"%s\": %s\n"),
46  path, strerror(errno));
47 #endif
48  return NULL;
49  }
50 
51  filenames = (char **) palloc(fnsize * sizeof(char *));
52 
53  while (errno = 0, (file = readdir(dir)) != NULL)
54  {
55  if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0)
56  {
57  if (numnames + 1 >= fnsize)
58  {
59  fnsize *= 2;
60  filenames = (char **) repalloc(filenames,
61  fnsize * sizeof(char *));
62  }
63  filenames[numnames++] = pstrdup(file->d_name);
64  }
65  }
66 
67  if (errno)
68  {
69 #ifndef FRONTEND
70  elog(WARNING, "could not read directory \"%s\": %m", path);
71 #else
72  fprintf(stderr, _("could not read directory \"%s\": %s\n"),
73  path, strerror(errno));
74 #endif
75  }
76 
77  filenames[numnames] = NULL;
78 
79  if (closedir(dir))
80  {
81 #ifndef FRONTEND
82  elog(WARNING, "could not close directory \"%s\": %m", path);
83 #else
84  fprintf(stderr, _("could not close directory \"%s\": %s\n"),
85  path, strerror(errno));
86 #endif
87  }
88 
89  return filenames;
90 }
91 
92 
93 /*
94  * pgfnames_cleanup
95  *
96  * deallocate memory used for filenames
97  */
98 void
99 pgfnames_cleanup(char **filenames)
100 {
101  char **fn;
102 
103  for (fn = filenames; *fn; fn++)
104  pfree(*fn);
105 
106  pfree(filenames);
107 }
char ** pgfnames(const char *path)
Definition: pgfnames.c:31
char * pstrdup(const char *in)
Definition: mcxt.c:1076
int closedir(DIR *)
Definition: dirent.c:111
Definition: dirent.h:9
void pfree(void *pointer)
Definition: mcxt.c:949
Definition: dirent.c:25
DIR * opendir(const char *)
Definition: dirent.c:33
#define WARNING
Definition: elog.h:40
static void * fn(void *arg)
void pgfnames_cleanup(char **filenames)
Definition: pgfnames.c:99
struct dirent * readdir(DIR *)
Definition: dirent.c:77
void * repalloc(void *pointer, Size size)
Definition: mcxt.c:962
void * palloc(Size size)
Definition: mcxt.c:848
const char * strerror(int errnum)
Definition: strerror.c:19
char d_name[MAX_PATH]
Definition: dirent.h:14
#define elog
Definition: elog.h:219
#define _(x)
Definition: elog.c:84