Annotation of pgsql/src/port/copydir.c, revision 1.3

1.1       momjian     1: /*
                      2:  *     While "xcopy /e /i /q" works fine for copying directories, on Windows XP
                      3:  *     it requires an Window handle which prevents it from working when invoked
                      4:  *     as a service.
                      5:  */
                      6: 
                      7: #include "postgres.h"
                      8: 
1.2       momjian     9: #undef mkdir   /* no reason to use that macro because we ignore the 2nd arg */
                     10: 
1.3     ! tgl        11: #include <dirent.h>
1.2       momjian    12: 
                     13: 
1.1       momjian    14: int
                     15: copydir(char *fromdir,char *todir)
                     16: {
                     17:        DIR                *xldir;
                     18:        struct dirent *xlde;
                     19:        char            fromfl[MAXPGPATH];
                     20:        char            tofl[MAXPGPATH];
                     21: 
                     22:        if (mkdir(todir) != 0)
                     23:        {
1.3     ! tgl        24:                ereport(ERROR,
        !            25:                                (errcode_for_file_access(),
        !            26:                                 errmsg("could not create directory \"%s\": %m", todir)));
1.1       momjian    27:                return 1;
                     28:        }
                     29:        xldir = opendir(fromdir);
                     30:        if (xldir == NULL)
                     31:        {
1.3     ! tgl        32:                ereport(ERROR,
        !            33:                                (errcode_for_file_access(),
        !            34:                                 errmsg("could not open directory \"%s\": %m", fromdir)));
1.1       momjian    35:                return 1;
                     36:        }
                     37: 
                     38:        while ((xlde = readdir(xldir)) != NULL)
                     39:        {
                     40:                        snprintf(fromfl, MAXPGPATH, "%s/%s", fromdir, xlde->d_name);
                     41:                        snprintf(tofl, MAXPGPATH, "%s/%s", todir, xlde->d_name);
                     42:                        if (CopyFile(fromfl,tofl,TRUE) < 0)
                     43:                        {
1.3     ! tgl        44:                                int             save_errno = errno;
        !            45: 
1.1       momjian    46:                                closedir(xldir);
1.3     ! tgl        47:                                errno = save_errno;
        !            48:                                ereport(ERROR,
        !            49:                                                (errcode_for_file_access(),
        !            50:                                                 errmsg("could not copy file \"%s\": %m", fromfl)));
1.1       momjian    51:                                return 1;
                     52:                        }
                     53:        }
                     54: 
                     55:        closedir(xldir);
                     56:        return 0;
                     57: }

PostgreSQL CVSweb <[email protected]>