fseek/fgetc puzzle

Steffen Nurpmeso steffen at sdaoden.eu
Tue Feb 21 06:00:24 AEDT 2023


Darren Tucker wrote in
 <CALDDTe39k4UFJWBvts5HWbbhHO+Vw9OAP0zBhu-Hje-2aR9+xA at mail.gmail.com>:

Jörg Schilling convinced me in 2017

    Readd removed fflush()/fseek() in between read and write..

    The behave:record_a_resend-2 test failed on Solaris 5.10 and 5.11,
    messages in *record* where separated by four \n / U+000A instead
    of two.  It turns out that the effective sequence

       if((fo = Zopen(name, "a+")) == NULL){
          if((fo = Zopen(name, "wx")) == NULL){

        ...

          if(fseek(fo, -2L, SEEK_END) == 0){
             switch(fread(buf, sizeof *buf, 2, fo)){

        ...
             if(emptyline){
                putc('\n', fo);
                fflush(fo);
             }

    on a O_APPEND|O_RDWR file requires an intermediate

      fseek(fout, 0, SEEK_END))
    or
      fflush()

    which i consider a bug in Solaris stdio.
    Jörg Schilling however convinced me that the standard requires
    this behaviour, and it is also in the C FAQ.  Nonetheless...

--steffen
|
|Der Kragenbaer,                The moon bear,
|der holt sich munter           he cheerfully and one by one
|einen nach dem anderen runter  wa.ks himself off
|(By Robert Gernhardt)


More information about the openssh-unix-dev mailing list