Re: Duplicate files /boot/grub/locale/*.mo~ in iso file made by grub-mkrescue
Adam Purkrt <[email protected]> Wed, 28 May 2025 17:23:37 +0200
| Newsgroups | gmane.comp.boot-loaders.grub.bugs |
|---|---|
| Message-ID | <[email protected]> |
Hi, the result is negative.
renergy ~ # ./test_tmp_unlink_delay
Test file name : /tmp/test_tmp_unlink_delay_dir/x.mo~
Sub process : File does not exist
Main process : File does not exist
renergy ~ #
Best regards,
Adam
On 5/28/25 4:23 PM, Thomas Schmitt wrote:
> Hi,
>
> the program in this mail creates a directory and a file in it.
> After checking that the file exists, it gets unlinked.
> Then the program forks and the child checks for the existence of the
> file, while the parent waits.
> The parent checks for file existence after the child has finished.
> Finally it deletes the directory.
>
> I see:
>
> $ cc -g -Wall -o test_tmp_unlink_delay test_tmp_unlink_delay.c
> $ ./test_tmp_unlink_delay
> Test file name : /tmp/test_tmp_unlink_delay_dir/x.mo~
> Sub process : File does not exist
> Main process : File does not exist
> $
>
> If your /tmp is weird enough you might see
>
> Sub process : FILE STILL EXISTS
>
> Begin of C code:
> -----------------------------------------------------------------------
>
> /*
> cc -g -Wall -o test_tmp_unlink_delay test_tmp_unlink_delay.c
> */
>
> #include <sys/stat.h>
> #include <sys/types.h>
> #include <stdio.h>
> #include <errno.h>
> #include <unistd.h>
> #include <sys/wait.h>
>
>
> int main(int argc, char **argv)
> {
> FILE *fp;
> pid_t pid;
> int status;
> struct stat stbuf;
> char *dir_path= "/tmp/test_tmp_unlink_delay_dir";
> char *file_path= "/tmp/test_tmp_unlink_delay_dir/x.mo~";
>
> fprintf(stderr, "Test file name : %s\n", file_path);
> if(mkdir(dir_path, 0777) == -1) {
> perror("Directory creation failed");
> return(1);
> }
> fp= fopen(file_path, "w");
> if(fp == NULL) {
> perror("File creation failed");
> return(2);
> }
> fprintf(fp, "content of %s\n", file_path);
> fclose(fp);
> if(stat(file_path, &stbuf) == -1) {
> fprintf(stderr, "File does not exist before unlink\n");
> return(3);
> }
> if(unlink(file_path) == -1) {
> perror("File unlink failed");
> return(4);
> }
>
> pid= fork();
>
> if(pid == 0) {
> fprintf(stderr, "Sub process : ");
> } else {
> if(wait(&status) == -1) {
> perror("Main process wait(2) failed");
> return(5);
> }
> fprintf(stderr, "Main process : ");
> }
> if(stat(file_path, &stbuf) == -1) {
> fprintf(stderr, "File does not exist\n");
> } else {
> fprintf(stderr, "FILE STILL EXISTS\n");
> }
> if(pid != 0) {
> if(rmdir(dir_path) == -1) {
> perror("Directory removal failed");
> return(6);
> }
> }
> return(0);
> }
>
> -----------------------------------------------------------------------
> End of C code.
>
>
> Have a nice day :)
>
> Thomas
>