From 97a08848be4dd81acdc8ae85845eb80f8f5f4ea0 Mon Sep 17 00:00:00 2001 From: nobruinfo Date: Fri, 18 Jul 2025 19:14:55 +0200 Subject: [PATCH 1/4] #23 put directory structures --- src/tools/mega65_ftp.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/tools/mega65_ftp.c b/src/tools/mega65_ftp.c index f7b8301..a6f7d9f 100644 --- a/src/tools/mega65_ftp.c +++ b/src/tools/mega65_ftp.c @@ -4704,8 +4704,7 @@ int upload_single_file(char *name, char *dest_name) if (dir_sector == -1) { printf("ERROR: Drive is full.\n"); - retVal = -1; - break; + return -1; } else { // printf("Directory entry is at offset $%03x of sector $%x\n",dir_sector_offset,dir_sector); @@ -4849,19 +4848,43 @@ int upload_file(char *name, char *dest_name) // if no wildcards in name, then just upload a single file if (!strstr(name, "*")) + { + d = opendir(name); + if ((d) && ((dir = readdir(d)) != NULL)) { + printf("\nCreating remote directory \"%s\"...\n", dest_name); + create_dir(dest_name); + change_dir(dest_name); + change_local_dir(name); + // recursion within the directory: + upload_file("*", "*"); + change_dir(".."); + change_local_dir(".."); + closedir(d); + return 0; + } + closedir(d); + // it is not a directory: return upload_single_file(name, dest_name); + } // check for wildcards in name // list directory first d = opendir("."); if (d) { while ((dir = readdir(d)) != NULL) { - if (!is_match(dir->d_name, name, 1)) + // skip directory management entries and non matching ones: + if ((strcmp(dir->d_name, "..") == 0) || + (strcmp(dir->d_name, ".") == 0) || + (!is_match(dir->d_name, name, 1))) continue; struct stat file_stats; if (!stat(dir->d_name, &file_stats)) { - if (!S_ISDIR(file_stats.st_mode)) { + if (S_ISDIR(file_stats.st_mode)) { + // printf("\nrecursing for directory \"%s\"...\n", dir->d_name); + // recursion for a directory: + upload_file(dir->d_name, dir->d_name); + } else { printf("\nUploading \"%s\"...\n", dir->d_name); upload_single_file(dir->d_name, dir->d_name); } From 4b8973565a5f153367f54635cbef3037704d0ead Mon Sep 17 00:00:00 2001 From: nobruinfo Date: Fri, 18 Jul 2025 19:54:01 +0200 Subject: [PATCH 2/4] #23 put directory structures --- src/tools/mega65_ftp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/mega65_ftp.c b/src/tools/mega65_ftp.c index a6f7d9f..5fd7983 100644 --- a/src/tools/mega65_ftp.c +++ b/src/tools/mega65_ftp.c @@ -4852,7 +4852,7 @@ int upload_file(char *name, char *dest_name) d = opendir(name); if ((d) && ((dir = readdir(d)) != NULL)) { printf("\nCreating remote directory \"%s\"...\n", dest_name); - create_dir(dest_name); + if (create_dir(dest_name) != 0) return -1; change_dir(dest_name); change_local_dir(name); // recursion within the directory: From 5a209e1d4894bca596df6bff70665e96deed9f1e Mon Sep 17 00:00:00 2001 From: nobruinfo Date: Fri, 18 Jul 2025 21:05:07 +0200 Subject: [PATCH 3/4] #23 put directory structures --- gtest/mega65_ftp_test.cpp | 55 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/gtest/mega65_ftp_test.cpp b/gtest/mega65_ftp_test.cpp index 61060ab..8141e6d 100644 --- a/gtest/mega65_ftp_test.cpp +++ b/gtest/mega65_ftp_test.cpp @@ -707,6 +707,61 @@ TEST_F(Mega65FtpTestFixture, CreateDeleteDirectoryWithFiles) EXPECT_THAT(output, testing::ContainsRegex("253 out of 256 Cluster")); } +TEST_F(Mega65FtpTestFixture, PutDeleteDirectorystructureWithFiles) +{ + char *topleveldir = "test_dir_on_top_level"; + char *subleveldir = "sub_directory_test"; + char *subsubleveldir = "subsub_directory_test"; + char *longfilename = "LongFileName.d81"; + + init_sdcard_data(); + + ReleaseStdOut(); + CaptureStdOut(); + show_directory(""); + std::string output = RetrieveStdOut(); + EXPECT_THAT(output, testing::ContainsRegex(" 0 File")); + // also check for the before amount of regained available clusters: + EXPECT_THAT(output, testing::ContainsRegex("253 out of 256 Cluster")); + + ReleaseStdOut(); + CaptureStdOut(); + + create_dir(topleveldir); + change_dir(topleveldir); + generate_dummy_file_embed_name(longfilename, 4096); + + // go one level deeper: + create_dir(subleveldir); + change_dir(subleveldir); + generate_dummy_file_embed_name(longfilename, 4096); + + // go one level deeper: + create_dir(subleveldir); + change_dir(subleveldir); + generate_dummy_file_embed_name(longfilename, 4096); + + // dump_sdcard_to_file("sdcard_after1.bin"); + + // perform this on the directory now: + change_dir("/"); + // upload the directory structure as a whole: + upload_file(topleveldir, topleveldir); + + // this replaces: delete_file_or_dir(topleveldir); + testWithSimulatedInput(delete_file_or_dir, topleveldir, "y\n"); + + // now assess that dir-entries have been removed + + // dump_sdcard_to_file("sdcard_after2.bin"); + + show_directory(""); + /* std::string */ output = RetrieveStdOut(); + EXPECT_THAT(output, testing::ContainsRegex(" 0 File")); + // also check for the before amount of regained available clusters: + EXPECT_THAT(output, testing::ContainsRegex("253 out of 256 Cluster")); +} + TEST_F(Mega65FtpTestFixture, RenameLFNToAnotherLFNShouldRenameLFNAndShortNameDirEntries) { init_sdcard_data(); From bd282226dd518f9100ff775fc5be21269b39f4f9 Mon Sep 17 00:00:00 2001 From: nobruinfo Date: Thu, 4 Sep 2025 14:54:39 +0200 Subject: [PATCH 4/4] #23 put directory structures, skipping with 'y' --- src/tools/mega65_ftp.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/tools/mega65_ftp.c b/src/tools/mega65_ftp.c index 5fd7983..541996b 100644 --- a/src/tools/mega65_ftp.c +++ b/src/tools/mega65_ftp.c @@ -4679,6 +4679,13 @@ int upload_single_file(char *name, char *dest_name) BOOL file_exists = find_file_in_curdir(dest_name, &de); if (file_exists) { + // skipping already existing files if 'y' option to skip user consent + // is used as suggested by Tayger: + if (ignore_security_questions) { + printf("%s already existing, skip option 'y' given, skipping...\n", dest_name); + return 0; + } + // assess how many contiguous clusters it consumes right now. int is_frag = is_fragmented(dest_name); int num_clusters = get_cluster_count(dest_name); @@ -4852,7 +4859,10 @@ int upload_file(char *name, char *dest_name) d = opendir(name); if ((d) && ((dir = readdir(d)) != NULL)) { printf("\nCreating remote directory \"%s\"...\n", dest_name); - if (create_dir(dest_name) != 0) return -1; + // if option 'y' to skip user consent on overwriting is set diving into + // directories to add non existing files and structures is desired as + // suggested by Tayger: + if (create_dir(dest_name) != 0 && !ignore_security_questions) return -1; change_dir(dest_name); change_local_dir(name); // recursion within the directory: @@ -4944,7 +4954,9 @@ int create_dir(char *dest_name) BOOL file_exists = contains_file_or_dir(dest_name); if (file_exists) { - fprintf(stderr, "ERROR: File or directory '%s' already exists.\n", dest_name); + fprintf(stderr, "%s: File or directory '%s' already exists.\n", + (ignore_security_questions ? "WARNING" : "ERROR"), + dest_name); retVal = -1; break; }