diff --git a/contrib/pg_upgrade/file.c b/contrib/pg_upgrade/file.c index 962cbaccc53f9d6788b69d151a36e36fb4e3260f..550967009b3dc815883df3635f58fb4e2b81e316 100644 --- a/contrib/pg_upgrade/file.c +++ b/contrib/pg_upgrade/file.c @@ -225,23 +225,21 @@ copy_file(const char *srcfile, const char *dstfile, bool force) * load_directory() * * Read all the file names in the specified directory, and return them as - * an array of "struct dirent" pointers. The array address is returned in + * an array of "char *" pointers. The array address is returned in * *namelist, and the function result is the count of file names. * - * To free the result data, free each namelist array member, then free the + * To free the result data, free each (char *) array member, then free the * namelist array itself. */ int -load_directory(const char *dirname, struct dirent *** namelist) +load_directory(const char *dirname, char ***namelist) { DIR *dirdesc; struct dirent *direntry; int count = 0; - int allocsize = 64; - size_t entrysize; + int allocsize = 64; /* initial array size */ - *namelist = (struct dirent **) - pg_malloc(allocsize * sizeof(struct dirent *)); + *namelist = (char **) pg_malloc(allocsize * sizeof(char *)); if ((dirdesc = opendir(dirname)) == NULL) pg_log(PG_FATAL, "could not open directory \"%s\": %s\n", @@ -252,18 +250,11 @@ load_directory(const char *dirname, struct dirent *** namelist) if (count >= allocsize) { allocsize *= 2; - *namelist = (struct dirent **) - pg_realloc(*namelist, allocsize * sizeof(struct dirent *)); + *namelist = (char **) + pg_realloc(*namelist, allocsize * sizeof(char *)); } - entrysize = offsetof(struct dirent, d_name) + - strlen(direntry->d_name) + 1; - - (*namelist)[count] = (struct dirent *) pg_malloc(entrysize); - - memcpy((*namelist)[count], direntry, entrysize); - - count++; + (*namelist)[count++] = pg_strdup(direntry->d_name); } #ifdef WIN32 diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h index f0d84a09e291c7d3ba4ed3a05b1e4f2ee67dcaf2..9a231764df8bb0d5507ed00e0d2a1e5cb9fe1ad4 100644 --- a/contrib/pg_upgrade/pg_upgrade.h +++ b/contrib/pg_upgrade/pg_upgrade.h @@ -356,7 +356,7 @@ const char *setupPageConverter(pageCnvCtx **result); typedef void *pageCnvCtx; #endif -int load_directory(const char *dirname, struct dirent *** namelist); +int load_directory(const char *dirname, char ***namelist); const char *copyAndUpdateFile(pageCnvCtx *pageConverter, const char *src, const char *dst, bool force); const char *linkAndUpdateFile(pageCnvCtx *pageConverter, const char *src, diff --git a/contrib/pg_upgrade/relfilenode.c b/contrib/pg_upgrade/relfilenode.c index 659b61480d8f467961cb8416f6d2ece73896a9a2..7688914079f8a541a77a519546673fbf47ea7e30 100644 --- a/contrib/pg_upgrade/relfilenode.c +++ b/contrib/pg_upgrade/relfilenode.c @@ -133,7 +133,7 @@ transfer_single_new_db(pageCnvCtx *pageConverter, { char old_dir[MAXPGPATH]; char file_pattern[MAXPGPATH]; - struct dirent **namelist = NULL; + char **namelist = NULL; int numFiles = 0; int mapnum; int fileno; @@ -192,21 +192,21 @@ transfer_single_new_db(pageCnvCtx *pageConverter, for (fileno = 0; fileno < numFiles; fileno++) { - char *vm_offset = strstr(namelist[fileno]->d_name, "_vm"); + char *vm_offset = strstr(namelist[fileno], "_vm"); bool is_vm_file = false; /* Is a visibility map file? (name ends with _vm) */ if (vm_offset && strlen(vm_offset) == strlen("_vm")) is_vm_file = true; - if (strncmp(namelist[fileno]->d_name, file_pattern, + if (strncmp(namelist[fileno], file_pattern, strlen(file_pattern)) == 0 && (!is_vm_file || !vm_crashsafe_change)) { snprintf(old_file, sizeof(old_file), "%s/%s", maps[mapnum].old_dir, - namelist[fileno]->d_name); + namelist[fileno]); snprintf(new_file, sizeof(new_file), "%s/%u%s", maps[mapnum].new_dir, - maps[mapnum].new_relfilenode, strchr(namelist[fileno]->d_name, '_')); + maps[mapnum].new_relfilenode, strchr(namelist[fileno], '_')); unlink(new_file); transfer_relfile(pageConverter, old_file, new_file, @@ -227,13 +227,13 @@ transfer_single_new_db(pageCnvCtx *pageConverter, for (fileno = 0; fileno < numFiles; fileno++) { - if (strncmp(namelist[fileno]->d_name, file_pattern, + if (strncmp(namelist[fileno], file_pattern, strlen(file_pattern)) == 0) { snprintf(old_file, sizeof(old_file), "%s/%s", maps[mapnum].old_dir, - namelist[fileno]->d_name); + namelist[fileno]); snprintf(new_file, sizeof(new_file), "%s/%u%s", maps[mapnum].new_dir, - maps[mapnum].new_relfilenode, strchr(namelist[fileno]->d_name, '.')); + maps[mapnum].new_relfilenode, strchr(namelist[fileno], '.')); unlink(new_file); transfer_relfile(pageConverter, old_file, new_file,