:: Re: [DNG] Please keep 32-bits alive
Startseite
Nachricht löschen
Nachricht beantworten
Autor: Adam Borowski
Datum:  
To: dng
Betreff: Re: [DNG] Please keep 32-bits alive
On Wed, Jul 26, 2017 at 04:00:43PM -0400, Christopher Clements wrote:
> On Wed, Jul 26, 2017 at 10:56:13AM +0000, Enrico Weigelt, metux IT consult wrote:
> > On 26.07.2017 09:34, Didier Kryn wrote:
> > > and even unistd's write() and seek() are wrappers for kernel's pwrite().
> >
> > No. Just look at the code. write()+seek() as different semantics
> > than pwrite(), and they don't even need to be supported by some
> > particular fd.
>
> Wouldn't this work? (no error checking of course XD)
>
>    off_t lseek(int fd, off_t offset, int whence);
>    ssize_t write(int fd, const void *buf, size_t count);
>    ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) {
>        lseek(fd, offset, SEEK_SET);
>        return write(fd, buf, count);
>    }


User code:
  Thread A:
    pwrite(fd, "a", 1, 0);
  Thread B:
    pwrite(fd, "b", 1, 1);


Libc wrapper:
  Thread A:
    lseek(fd, 0, SEEK_SET);
    write(fd, "a", 1);
  Thread B:
    lseek(fd, 1, SEEK_SET);
    write(fd, "b", 1);


If the threads operate at one syscall per wakeup, instead of "ab" the file
will contain "\0ab". So use a mutex, you'd say? Try signal handlers then.


For the reverse, implementing write() and seek() by storing the seek
position in a variable, try an O_APPEND file opened by two different
processes, or something unseekable like a tty.


Meow!
--
⢀⣴⠾⠻⢶⣦⠀ What Would Jesus Do, MUD/MMORPG edition:
⣾⠁⢰⠒⠀⣿⡁ • multiplay with an admin char to benefit your mortal
⢿⡄⠘⠷⠚⠋⠀ • abuse item cloning bugs (the five fishes + two breads affair)
⠈⠳⣄⠀⠀⠀⠀ • use glitches to walk on water