|
21 | 21 |
|
22 | 22 | #include"catalog/pg_authid_d.h"
|
23 | 23 | #include"common/connect.h"
|
| 24 | +#include"common/file_perm.h" |
24 | 25 | #include"common/file_utils.h"
|
25 | 26 | #include"common/hashfn_unstable.h"
|
26 | 27 | #include"common/logging.h"
|
@@ -1954,49 +1955,30 @@ read_dumpall_filters(const char *filename, SimpleStringList *pattern)
|
1954 | 1955 | staticvoid
|
1955 | 1956 | create_or_open_dir(constchar*dirname)
|
1956 | 1957 | {
|
1957 |
| -structstatst; |
1958 |
| -boolis_empty= false; |
| 1958 | +intret; |
1959 | 1959 |
|
1960 |
| -/* we accept an empty existing directory */ |
1961 |
| -if (stat(dirname,&st)==0&&S_ISDIR(st.st_mode)) |
| 1960 | +switch ((ret=pg_check_dir(dirname))) |
1962 | 1961 | {
|
1963 |
| -DIR*dir=opendir(dirname); |
1964 |
| - |
1965 |
| -if (dir) |
1966 |
| -{ |
1967 |
| -structdirent*d; |
1968 |
| - |
1969 |
| -is_empty= true; |
1970 |
| - |
1971 |
| -while (errno=0, (d=readdir(dir))) |
1972 |
| -{ |
1973 |
| -if (strcmp(d->d_name,".")!=0&&strcmp(d->d_name,"..")!=0) |
1974 |
| -{ |
1975 |
| -is_empty= false; |
1976 |
| -break; |
1977 |
| -} |
1978 |
| -} |
1979 |
| - |
1980 |
| -if (errno) |
1981 |
| -pg_fatal("could not read directory \"%s\": %m", |
1982 |
| -dirname); |
1983 |
| - |
1984 |
| -if (closedir(dir)) |
1985 |
| -pg_fatal("could not close directory \"%s\": %m", |
| 1962 | +case-1: |
| 1963 | +/* opendir failed but not with ENOENT */ |
| 1964 | +pg_fatal("could not open directory \"%s\": %m",dirname); |
| 1965 | +break; |
| 1966 | +case0: |
| 1967 | +/* directory does not exist */ |
| 1968 | +if (mkdir(dirname,pg_dir_create_mode)<0) |
| 1969 | +pg_fatal("could not create directory \"%s\": %m",dirname); |
| 1970 | +break; |
| 1971 | +case1: |
| 1972 | +/* exists and is empty, fix perms */ |
| 1973 | +if (chmod(dirname,pg_dir_create_mode)!=0) |
| 1974 | +pg_fatal("could not change permissions of directory \"%s\": %m", |
1986 | 1975 | dirname);
|
1987 |
| -} |
1988 | 1976 |
|
1989 |
| -if (!is_empty) |
1990 |
| -{ |
1991 |
| -pg_log_error("directory \"%s\" exists but is not empty",dirname); |
1992 |
| -pg_log_error_hint("Either remove the directory " |
1993 |
| -"\"%s\" or its contents.", |
1994 |
| -dirname); |
1995 |
| -exit_nicely(1); |
1996 |
| -} |
| 1977 | +break; |
| 1978 | +default: |
| 1979 | +/* exists and is not empty */ |
| 1980 | +pg_fatal("directory \"%s\" is not empty",dirname); |
1997 | 1981 | }
|
1998 |
| -elseif (mkdir(dirname,0700)<0) |
1999 |
| -pg_fatal("could not create directory \"%s\": %m",dirname); |
2000 | 1982 | }
|
2001 | 1983 |
|
2002 | 1984 | /*
|
|