Em qua., 8 de mai. de 2024 às 04:37, Nazir Bilal Yavuz <byavuz81@gmail.com> escreveu:
Hi Ranier,
Thanks for looking into this!
I am not sure why but your reply does not show up in the thread, so I copied your reply and answered it in the thread for visibility.
On Tue, 7 May 2024 at 16:28, Ranier Vilela <ranier.vf@gmail.com> wrote: > > I know it's coming from copy-and-paste, but > I believe the flags could be: > - dstfd = OpenTransientFile(tofile, O_RDWR | O_CREAT | O_EXCL | PG_BINARY); > + dstfd = OpenTransientFile(tofile, O_CREAT | O_WRONLY | O_TRUNC | O_EXCL | PG_BINARY); > > The flags: > O_WRONLY | O_TRUNC > > Allow the OS to make some optimizations, if you deem it possible. > > The flag O_RDWR indicates that the file can be read, which is not true in this case. > The destination file will just be written.
You may be right about the O_WRONLY flag but I am not sure about the O_TRUNC flag.
O_TRUNC from the linux man page [1]: If the file already exists and is a regular file and the access mode allows writing (i.e., is O_RDWR or O_WRONLY) it will be truncated to length 0. If the file is a FIFO or terminal device file, the O_TRUNC flag is ignored. Otherwise, the effect of O_TRUNC is unspecified.
O_TRUNC is usually used in conjunction with O_WRONLY.
O_TRUNC signals the OS to forget the current contents of the file, if it happens to exist. In other words, there will be no seeks, only and exclusively writes.
But it should be already checked if the destination directory already exists in dbcommands.c file in createdb() function [2], so this should not happen.